summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGard Spreemann <gard.spreemann@epfl.ch>2018-08-20 21:03:51 +0200
committerGard Spreemann <gard.spreemann@epfl.ch>2018-08-20 21:03:51 +0200
commit4c1b1727ab44a773d27b090463ac6db957267136 (patch)
tree53520f77b9e88998181b2bb8c368302aaa5fea3c
parentf8b9be92615662a1f9559608930559138f9c1fd8 (diff)
parent657f73321f04d5d1c4cec8085ec43a73633b96af (diff)
Merge branch 'master' into gspr/mpi
-rw-r--r--geom_bottleneck/CMakeLists.txt3
-rw-r--r--geom_bottleneck/example/bottleneck_dist.cpp25
-rw-r--r--geom_bottleneck/include/basic_defs_bt.h802
-rw-r--r--geom_bottleneck/include/bottleneck.h155
-rw-r--r--geom_bottleneck/include/bottleneck_detail.h71
-rw-r--r--geom_bottleneck/include/bottleneck_detail.hpp1225
-rw-r--r--geom_bottleneck/include/bound_match.h2
-rw-r--r--geom_bottleneck/include/bound_match.hpp786
-rw-r--r--geom_bottleneck/include/catch/catch.hpp11545
-rw-r--r--geom_bottleneck/include/diagram_reader.h217
-rw-r--r--geom_bottleneck/include/dnn/local/kd-tree.hpp6
-rw-r--r--geom_bottleneck/include/neighb_oracle.h2
-rw-r--r--geom_bottleneck/tests/data/test_001_A1
-rw-r--r--geom_bottleneck/tests/data/test_001_B1
-rw-r--r--geom_bottleneck/tests/data/test_002_A1
-rw-r--r--geom_bottleneck/tests/data/test_002_B1
-rw-r--r--geom_bottleneck/tests/data/test_003_A2
-rw-r--r--geom_bottleneck/tests/data/test_003_B2
-rw-r--r--geom_bottleneck/tests/data/test_004_A2
-rw-r--r--geom_bottleneck/tests/data/test_004_B3
-rw-r--r--geom_bottleneck/tests/data/test_005_A6
-rw-r--r--geom_bottleneck/tests/data/test_005_B6
-rw-r--r--geom_bottleneck/tests/data/test_006_A7
-rw-r--r--geom_bottleneck/tests/data/test_006_B7
-rw-r--r--geom_bottleneck/tests/data/test_007_A0
-rw-r--r--geom_bottleneck/tests/data/test_007_B0
-rw-r--r--geom_bottleneck/tests/data/test_008_A1
-rw-r--r--geom_bottleneck/tests/data/test_008_B1
-rw-r--r--geom_bottleneck/tests/data/test_009_A1
-rw-r--r--geom_bottleneck/tests/data/test_009_B1
-rw-r--r--geom_bottleneck/tests/data/test_010_A100
-rw-r--r--geom_bottleneck/tests/data/test_010_B100
-rw-r--r--geom_bottleneck/tests/data/test_011_A200
-rw-r--r--geom_bottleneck/tests/data/test_011_B200
-rw-r--r--geom_bottleneck/tests/data/test_012_A5000
-rw-r--r--geom_bottleneck/tests/data/test_012_B5000
-rw-r--r--geom_bottleneck/tests/data/test_013_A5
-rw-r--r--geom_bottleneck/tests/data/test_013_B5
-rw-r--r--geom_bottleneck/tests/data/test_014_A1
-rw-r--r--geom_bottleneck/tests/data/test_014_B1
-rw-r--r--geom_bottleneck/tests/data/test_015_A1
-rw-r--r--geom_bottleneck/tests/data/test_015_B1
-rw-r--r--geom_bottleneck/tests/data/test_016_A220
-rw-r--r--geom_bottleneck/tests/data/test_016_B193
-rw-r--r--geom_bottleneck/tests/data/test_100_A2
-rw-r--r--geom_bottleneck/tests/data/test_100_B2
-rw-r--r--geom_bottleneck/tests/data/test_101_A2
-rw-r--r--geom_bottleneck/tests/data/test_101_B2
-rw-r--r--geom_bottleneck/tests/data/test_102_A2
-rw-r--r--geom_bottleneck/tests/data/test_102_B2
-rw-r--r--geom_bottleneck/tests/data/test_103_A2
-rw-r--r--geom_bottleneck/tests/data/test_103_B2
-rw-r--r--geom_bottleneck/tests/data/test_104_A2
-rw-r--r--geom_bottleneck/tests/data/test_104_B2
-rw-r--r--geom_bottleneck/tests/data/test_105_A2
-rw-r--r--geom_bottleneck/tests/data/test_105_B2
-rw-r--r--geom_bottleneck/tests/data/test_106_A2
-rw-r--r--geom_bottleneck/tests/data/test_106_B2
-rw-r--r--geom_bottleneck/tests/data/test_107_A2
-rw-r--r--geom_bottleneck/tests/data/test_107_B2
-rw-r--r--geom_bottleneck/tests/data/test_108_A2
-rw-r--r--geom_bottleneck/tests/data/test_108_B2
-rw-r--r--geom_bottleneck/tests/data/test_109_A2
-rw-r--r--geom_bottleneck/tests/data/test_109_B2
-rw-r--r--geom_bottleneck/tests/data/test_110_A2
-rw-r--r--geom_bottleneck/tests/data/test_110_B2
-rw-r--r--geom_bottleneck/tests/data/test_111_A2
-rw-r--r--geom_bottleneck/tests/data/test_111_B2
-rw-r--r--geom_bottleneck/tests/data/test_112_A2
-rw-r--r--geom_bottleneck/tests/data/test_112_B2
-rw-r--r--geom_bottleneck/tests/data/test_113_A2
-rw-r--r--geom_bottleneck/tests/data/test_113_B2
-rw-r--r--geom_bottleneck/tests/data/test_114_A2
-rw-r--r--geom_bottleneck/tests/data/test_114_B2
-rw-r--r--geom_bottleneck/tests/data/test_115_A2
-rw-r--r--geom_bottleneck/tests/data/test_115_B2
-rw-r--r--geom_bottleneck/tests/data/test_116_A2
-rw-r--r--geom_bottleneck/tests/data/test_116_B2
-rw-r--r--geom_bottleneck/tests/data/test_117_A2
-rw-r--r--geom_bottleneck/tests/data/test_117_B2
-rw-r--r--geom_bottleneck/tests/data/test_118_A2
-rw-r--r--geom_bottleneck/tests/data/test_118_B2
-rw-r--r--geom_bottleneck/tests/data/test_119_A2
-rw-r--r--geom_bottleneck/tests/data/test_119_B2
-rw-r--r--geom_bottleneck/tests/data/test_120_A3
-rw-r--r--geom_bottleneck/tests/data/test_120_B3
-rw-r--r--geom_bottleneck/tests/data/test_121_A3
-rw-r--r--geom_bottleneck/tests/data/test_121_B3
-rw-r--r--geom_bottleneck/tests/data/test_122_A3
-rw-r--r--geom_bottleneck/tests/data/test_122_B3
-rw-r--r--geom_bottleneck/tests/data/test_123_A3
-rw-r--r--geom_bottleneck/tests/data/test_123_B3
-rw-r--r--geom_bottleneck/tests/data/test_124_A3
-rw-r--r--geom_bottleneck/tests/data/test_124_B3
-rw-r--r--geom_bottleneck/tests/data/test_125_A3
-rw-r--r--geom_bottleneck/tests/data/test_125_B3
-rw-r--r--geom_bottleneck/tests/data/test_126_A3
-rw-r--r--geom_bottleneck/tests/data/test_126_B3
-rw-r--r--geom_bottleneck/tests/data/test_127_A3
-rw-r--r--geom_bottleneck/tests/data/test_127_B3
-rw-r--r--geom_bottleneck/tests/data/test_128_A3
-rw-r--r--geom_bottleneck/tests/data/test_128_B3
-rw-r--r--geom_bottleneck/tests/data/test_129_A3
-rw-r--r--geom_bottleneck/tests/data/test_129_B3
-rw-r--r--geom_bottleneck/tests/data/test_130_A3
-rw-r--r--geom_bottleneck/tests/data/test_130_B3
-rw-r--r--geom_bottleneck/tests/data/test_131_A3
-rw-r--r--geom_bottleneck/tests/data/test_131_B3
-rw-r--r--geom_bottleneck/tests/data/test_132_A3
-rw-r--r--geom_bottleneck/tests/data/test_132_B3
-rw-r--r--geom_bottleneck/tests/data/test_133_A3
-rw-r--r--geom_bottleneck/tests/data/test_133_B3
-rw-r--r--geom_bottleneck/tests/data/test_134_A3
-rw-r--r--geom_bottleneck/tests/data/test_134_B3
-rw-r--r--geom_bottleneck/tests/data/test_135_A3
-rw-r--r--geom_bottleneck/tests/data/test_135_B3
-rw-r--r--geom_bottleneck/tests/data/test_136_A3
-rw-r--r--geom_bottleneck/tests/data/test_136_B3
-rw-r--r--geom_bottleneck/tests/data/test_137_A3
-rw-r--r--geom_bottleneck/tests/data/test_137_B3
-rw-r--r--geom_bottleneck/tests/data/test_138_A3
-rw-r--r--geom_bottleneck/tests/data/test_138_B3
-rw-r--r--geom_bottleneck/tests/data/test_139_A3
-rw-r--r--geom_bottleneck/tests/data/test_139_B3
-rw-r--r--geom_bottleneck/tests/data/test_140_A4
-rw-r--r--geom_bottleneck/tests/data/test_140_B4
-rw-r--r--geom_bottleneck/tests/data/test_141_A4
-rw-r--r--geom_bottleneck/tests/data/test_141_B4
-rw-r--r--geom_bottleneck/tests/data/test_142_A4
-rw-r--r--geom_bottleneck/tests/data/test_142_B4
-rw-r--r--geom_bottleneck/tests/data/test_143_A4
-rw-r--r--geom_bottleneck/tests/data/test_143_B4
-rw-r--r--geom_bottleneck/tests/data/test_144_A4
-rw-r--r--geom_bottleneck/tests/data/test_144_B4
-rw-r--r--geom_bottleneck/tests/data/test_145_A4
-rw-r--r--geom_bottleneck/tests/data/test_145_B4
-rw-r--r--geom_bottleneck/tests/data/test_146_A4
-rw-r--r--geom_bottleneck/tests/data/test_146_B4
-rw-r--r--geom_bottleneck/tests/data/test_147_A4
-rw-r--r--geom_bottleneck/tests/data/test_147_B4
-rw-r--r--geom_bottleneck/tests/data/test_148_A4
-rw-r--r--geom_bottleneck/tests/data/test_148_B4
-rw-r--r--geom_bottleneck/tests/data/test_149_A4
-rw-r--r--geom_bottleneck/tests/data/test_149_B4
-rw-r--r--geom_bottleneck/tests/data/test_150_A4
-rw-r--r--geom_bottleneck/tests/data/test_150_B4
-rw-r--r--geom_bottleneck/tests/data/test_151_A4
-rw-r--r--geom_bottleneck/tests/data/test_151_B4
-rw-r--r--geom_bottleneck/tests/data/test_152_A4
-rw-r--r--geom_bottleneck/tests/data/test_152_B4
-rw-r--r--geom_bottleneck/tests/data/test_153_A4
-rw-r--r--geom_bottleneck/tests/data/test_153_B4
-rw-r--r--geom_bottleneck/tests/data/test_154_A4
-rw-r--r--geom_bottleneck/tests/data/test_154_B4
-rw-r--r--geom_bottleneck/tests/data/test_155_A4
-rw-r--r--geom_bottleneck/tests/data/test_155_B4
-rw-r--r--geom_bottleneck/tests/data/test_156_A4
-rw-r--r--geom_bottleneck/tests/data/test_156_B4
-rw-r--r--geom_bottleneck/tests/data/test_157_A4
-rw-r--r--geom_bottleneck/tests/data/test_157_B4
-rw-r--r--geom_bottleneck/tests/data/test_158_A4
-rw-r--r--geom_bottleneck/tests/data/test_158_B4
-rw-r--r--geom_bottleneck/tests/data/test_159_A4
-rw-r--r--geom_bottleneck/tests/data/test_159_B4
-rw-r--r--geom_bottleneck/tests/data/test_160_A5
-rw-r--r--geom_bottleneck/tests/data/test_160_B5
-rw-r--r--geom_bottleneck/tests/data/test_161_A5
-rw-r--r--geom_bottleneck/tests/data/test_161_B5
-rw-r--r--geom_bottleneck/tests/data/test_162_A5
-rw-r--r--geom_bottleneck/tests/data/test_162_B5
-rw-r--r--geom_bottleneck/tests/data/test_163_A5
-rw-r--r--geom_bottleneck/tests/data/test_163_B5
-rw-r--r--geom_bottleneck/tests/data/test_164_A5
-rw-r--r--geom_bottleneck/tests/data/test_164_B5
-rw-r--r--geom_bottleneck/tests/data/test_165_A5
-rw-r--r--geom_bottleneck/tests/data/test_165_B5
-rw-r--r--geom_bottleneck/tests/data/test_166_A5
-rw-r--r--geom_bottleneck/tests/data/test_166_B5
-rw-r--r--geom_bottleneck/tests/data/test_167_A5
-rw-r--r--geom_bottleneck/tests/data/test_167_B5
-rw-r--r--geom_bottleneck/tests/data/test_168_A5
-rw-r--r--geom_bottleneck/tests/data/test_168_B5
-rw-r--r--geom_bottleneck/tests/data/test_169_A5
-rw-r--r--geom_bottleneck/tests/data/test_169_B5
-rw-r--r--geom_bottleneck/tests/data/test_170_A5
-rw-r--r--geom_bottleneck/tests/data/test_170_B5
-rw-r--r--geom_bottleneck/tests/data/test_171_A5
-rw-r--r--geom_bottleneck/tests/data/test_171_B5
-rw-r--r--geom_bottleneck/tests/data/test_172_A5
-rw-r--r--geom_bottleneck/tests/data/test_172_B5
-rw-r--r--geom_bottleneck/tests/data/test_173_A5
-rw-r--r--geom_bottleneck/tests/data/test_173_B5
-rw-r--r--geom_bottleneck/tests/data/test_174_A5
-rw-r--r--geom_bottleneck/tests/data/test_174_B5
-rw-r--r--geom_bottleneck/tests/data/test_175_A5
-rw-r--r--geom_bottleneck/tests/data/test_175_B5
-rw-r--r--geom_bottleneck/tests/data/test_176_A5
-rw-r--r--geom_bottleneck/tests/data/test_176_B5
-rw-r--r--geom_bottleneck/tests/data/test_177_A5
-rw-r--r--geom_bottleneck/tests/data/test_177_B5
-rw-r--r--geom_bottleneck/tests/data/test_178_A5
-rw-r--r--geom_bottleneck/tests/data/test_178_B5
-rw-r--r--geom_bottleneck/tests/data/test_179_A5
-rw-r--r--geom_bottleneck/tests/data/test_179_B5
-rw-r--r--geom_bottleneck/tests/data/test_180_A6
-rw-r--r--geom_bottleneck/tests/data/test_180_B6
-rw-r--r--geom_bottleneck/tests/data/test_181_A6
-rw-r--r--geom_bottleneck/tests/data/test_181_B6
-rw-r--r--geom_bottleneck/tests/data/test_182_A6
-rw-r--r--geom_bottleneck/tests/data/test_182_B6
-rw-r--r--geom_bottleneck/tests/data/test_183_A6
-rw-r--r--geom_bottleneck/tests/data/test_183_B6
-rw-r--r--geom_bottleneck/tests/data/test_184_A6
-rw-r--r--geom_bottleneck/tests/data/test_184_B6
-rw-r--r--geom_bottleneck/tests/data/test_185_A6
-rw-r--r--geom_bottleneck/tests/data/test_185_B6
-rw-r--r--geom_bottleneck/tests/data/test_186_A6
-rw-r--r--geom_bottleneck/tests/data/test_186_B6
-rw-r--r--geom_bottleneck/tests/data/test_187_A6
-rw-r--r--geom_bottleneck/tests/data/test_187_B6
-rw-r--r--geom_bottleneck/tests/data/test_188_A6
-rw-r--r--geom_bottleneck/tests/data/test_188_B6
-rw-r--r--geom_bottleneck/tests/data/test_189_A6
-rw-r--r--geom_bottleneck/tests/data/test_189_B6
-rw-r--r--geom_bottleneck/tests/data/test_190_A6
-rw-r--r--geom_bottleneck/tests/data/test_190_B6
-rw-r--r--geom_bottleneck/tests/data/test_191_A6
-rw-r--r--geom_bottleneck/tests/data/test_191_B6
-rw-r--r--geom_bottleneck/tests/data/test_192_A6
-rw-r--r--geom_bottleneck/tests/data/test_192_B6
-rw-r--r--geom_bottleneck/tests/data/test_193_A6
-rw-r--r--geom_bottleneck/tests/data/test_193_B6
-rw-r--r--geom_bottleneck/tests/data/test_194_A6
-rw-r--r--geom_bottleneck/tests/data/test_194_B6
-rw-r--r--geom_bottleneck/tests/data/test_195_A6
-rw-r--r--geom_bottleneck/tests/data/test_195_B6
-rw-r--r--geom_bottleneck/tests/data/test_196_A6
-rw-r--r--geom_bottleneck/tests/data/test_196_B6
-rw-r--r--geom_bottleneck/tests/data/test_197_A6
-rw-r--r--geom_bottleneck/tests/data/test_197_B6
-rw-r--r--geom_bottleneck/tests/data/test_198_A6
-rw-r--r--geom_bottleneck/tests/data/test_198_B6
-rw-r--r--geom_bottleneck/tests/data/test_199_A6
-rw-r--r--geom_bottleneck/tests/data/test_199_B6
-rw-r--r--geom_bottleneck/tests/data/test_200_A7
-rw-r--r--geom_bottleneck/tests/data/test_200_B7
-rw-r--r--geom_bottleneck/tests/data/test_201_A7
-rw-r--r--geom_bottleneck/tests/data/test_201_B7
-rw-r--r--geom_bottleneck/tests/data/test_202_A7
-rw-r--r--geom_bottleneck/tests/data/test_202_B7
-rw-r--r--geom_bottleneck/tests/data/test_203_A7
-rw-r--r--geom_bottleneck/tests/data/test_203_B7
-rw-r--r--geom_bottleneck/tests/data/test_204_A7
-rw-r--r--geom_bottleneck/tests/data/test_204_B7
-rw-r--r--geom_bottleneck/tests/data/test_205_A7
-rw-r--r--geom_bottleneck/tests/data/test_205_B7
-rw-r--r--geom_bottleneck/tests/data/test_206_A7
-rw-r--r--geom_bottleneck/tests/data/test_206_B7
-rw-r--r--geom_bottleneck/tests/data/test_207_A7
-rw-r--r--geom_bottleneck/tests/data/test_207_B7
-rw-r--r--geom_bottleneck/tests/data/test_208_A7
-rw-r--r--geom_bottleneck/tests/data/test_208_B7
-rw-r--r--geom_bottleneck/tests/data/test_209_A7
-rw-r--r--geom_bottleneck/tests/data/test_209_B7
-rw-r--r--geom_bottleneck/tests/data/test_210_A7
-rw-r--r--geom_bottleneck/tests/data/test_210_B7
-rw-r--r--geom_bottleneck/tests/data/test_211_A7
-rw-r--r--geom_bottleneck/tests/data/test_211_B7
-rw-r--r--geom_bottleneck/tests/data/test_212_A7
-rw-r--r--geom_bottleneck/tests/data/test_212_B7
-rw-r--r--geom_bottleneck/tests/data/test_213_A7
-rw-r--r--geom_bottleneck/tests/data/test_213_B7
-rw-r--r--geom_bottleneck/tests/data/test_214_A7
-rw-r--r--geom_bottleneck/tests/data/test_214_B7
-rw-r--r--geom_bottleneck/tests/data/test_215_A7
-rw-r--r--geom_bottleneck/tests/data/test_215_B7
-rw-r--r--geom_bottleneck/tests/data/test_216_A7
-rw-r--r--geom_bottleneck/tests/data/test_216_B7
-rw-r--r--geom_bottleneck/tests/data/test_217_A7
-rw-r--r--geom_bottleneck/tests/data/test_217_B7
-rw-r--r--geom_bottleneck/tests/data/test_218_A7
-rw-r--r--geom_bottleneck/tests/data/test_218_B7
-rw-r--r--geom_bottleneck/tests/data/test_219_A7
-rw-r--r--geom_bottleneck/tests/data/test_219_B7
-rw-r--r--geom_bottleneck/tests/data/test_220_A8
-rw-r--r--geom_bottleneck/tests/data/test_220_B8
-rw-r--r--geom_bottleneck/tests/data/test_221_A8
-rw-r--r--geom_bottleneck/tests/data/test_221_B8
-rw-r--r--geom_bottleneck/tests/data/test_222_A8
-rw-r--r--geom_bottleneck/tests/data/test_222_B8
-rw-r--r--geom_bottleneck/tests/data/test_223_A8
-rw-r--r--geom_bottleneck/tests/data/test_223_B8
-rw-r--r--geom_bottleneck/tests/data/test_224_A8
-rw-r--r--geom_bottleneck/tests/data/test_224_B8
-rw-r--r--geom_bottleneck/tests/data/test_225_A8
-rw-r--r--geom_bottleneck/tests/data/test_225_B8
-rw-r--r--geom_bottleneck/tests/data/test_226_A8
-rw-r--r--geom_bottleneck/tests/data/test_226_B8
-rw-r--r--geom_bottleneck/tests/data/test_227_A8
-rw-r--r--geom_bottleneck/tests/data/test_227_B8
-rw-r--r--geom_bottleneck/tests/data/test_228_A8
-rw-r--r--geom_bottleneck/tests/data/test_228_B8
-rw-r--r--geom_bottleneck/tests/data/test_229_A8
-rw-r--r--geom_bottleneck/tests/data/test_229_B8
-rw-r--r--geom_bottleneck/tests/data/test_230_A8
-rw-r--r--geom_bottleneck/tests/data/test_230_B8
-rw-r--r--geom_bottleneck/tests/data/test_231_A8
-rw-r--r--geom_bottleneck/tests/data/test_231_B8
-rw-r--r--geom_bottleneck/tests/data/test_232_A8
-rw-r--r--geom_bottleneck/tests/data/test_232_B8
-rw-r--r--geom_bottleneck/tests/data/test_233_A8
-rw-r--r--geom_bottleneck/tests/data/test_233_B8
-rw-r--r--geom_bottleneck/tests/data/test_234_A8
-rw-r--r--geom_bottleneck/tests/data/test_234_B8
-rw-r--r--geom_bottleneck/tests/data/test_235_A8
-rw-r--r--geom_bottleneck/tests/data/test_235_B8
-rw-r--r--geom_bottleneck/tests/data/test_236_A8
-rw-r--r--geom_bottleneck/tests/data/test_236_B8
-rw-r--r--geom_bottleneck/tests/data/test_237_A8
-rw-r--r--geom_bottleneck/tests/data/test_237_B8
-rw-r--r--geom_bottleneck/tests/data/test_238_A8
-rw-r--r--geom_bottleneck/tests/data/test_238_B8
-rw-r--r--geom_bottleneck/tests/data/test_239_A8
-rw-r--r--geom_bottleneck/tests/data/test_239_B8
-rw-r--r--geom_bottleneck/tests/data/test_240_A9
-rw-r--r--geom_bottleneck/tests/data/test_240_B9
-rw-r--r--geom_bottleneck/tests/data/test_241_A9
-rw-r--r--geom_bottleneck/tests/data/test_241_B9
-rw-r--r--geom_bottleneck/tests/data/test_242_A9
-rw-r--r--geom_bottleneck/tests/data/test_242_B9
-rw-r--r--geom_bottleneck/tests/data/test_243_A9
-rw-r--r--geom_bottleneck/tests/data/test_243_B9
-rw-r--r--geom_bottleneck/tests/data/test_244_A9
-rw-r--r--geom_bottleneck/tests/data/test_244_B9
-rw-r--r--geom_bottleneck/tests/data/test_245_A9
-rw-r--r--geom_bottleneck/tests/data/test_245_B9
-rw-r--r--geom_bottleneck/tests/data/test_246_A9
-rw-r--r--geom_bottleneck/tests/data/test_246_B9
-rw-r--r--geom_bottleneck/tests/data/test_247_A9
-rw-r--r--geom_bottleneck/tests/data/test_247_B9
-rw-r--r--geom_bottleneck/tests/data/test_248_A9
-rw-r--r--geom_bottleneck/tests/data/test_248_B9
-rw-r--r--geom_bottleneck/tests/data/test_249_A9
-rw-r--r--geom_bottleneck/tests/data/test_249_B9
-rw-r--r--geom_bottleneck/tests/data/test_250_A9
-rw-r--r--geom_bottleneck/tests/data/test_250_B9
-rw-r--r--geom_bottleneck/tests/data/test_251_A9
-rw-r--r--geom_bottleneck/tests/data/test_251_B9
-rw-r--r--geom_bottleneck/tests/data/test_252_A9
-rw-r--r--geom_bottleneck/tests/data/test_252_B9
-rw-r--r--geom_bottleneck/tests/data/test_253_A9
-rw-r--r--geom_bottleneck/tests/data/test_253_B9
-rw-r--r--geom_bottleneck/tests/data/test_254_A9
-rw-r--r--geom_bottleneck/tests/data/test_254_B9
-rw-r--r--geom_bottleneck/tests/data/test_255_A9
-rw-r--r--geom_bottleneck/tests/data/test_255_B9
-rw-r--r--geom_bottleneck/tests/data/test_256_A9
-rw-r--r--geom_bottleneck/tests/data/test_256_B9
-rw-r--r--geom_bottleneck/tests/data/test_257_A9
-rw-r--r--geom_bottleneck/tests/data/test_257_B9
-rw-r--r--geom_bottleneck/tests/data/test_258_A9
-rw-r--r--geom_bottleneck/tests/data/test_258_B9
-rw-r--r--geom_bottleneck/tests/data/test_259_A9
-rw-r--r--geom_bottleneck/tests/data/test_259_B9
-rw-r--r--geom_bottleneck/tests/data/test_260_A10
-rw-r--r--geom_bottleneck/tests/data/test_260_B10
-rw-r--r--geom_bottleneck/tests/data/test_261_A10
-rw-r--r--geom_bottleneck/tests/data/test_261_B10
-rw-r--r--geom_bottleneck/tests/data/test_262_A10
-rw-r--r--geom_bottleneck/tests/data/test_262_B10
-rw-r--r--geom_bottleneck/tests/data/test_263_A10
-rw-r--r--geom_bottleneck/tests/data/test_263_B10
-rw-r--r--geom_bottleneck/tests/data/test_264_A10
-rw-r--r--geom_bottleneck/tests/data/test_264_B10
-rw-r--r--geom_bottleneck/tests/data/test_265_A10
-rw-r--r--geom_bottleneck/tests/data/test_265_B10
-rw-r--r--geom_bottleneck/tests/data/test_266_A10
-rw-r--r--geom_bottleneck/tests/data/test_266_B10
-rw-r--r--geom_bottleneck/tests/data/test_267_A10
-rw-r--r--geom_bottleneck/tests/data/test_267_B10
-rw-r--r--geom_bottleneck/tests/data/test_268_A10
-rw-r--r--geom_bottleneck/tests/data/test_268_B10
-rw-r--r--geom_bottleneck/tests/data/test_269_A10
-rw-r--r--geom_bottleneck/tests/data/test_269_B10
-rw-r--r--geom_bottleneck/tests/data/test_270_A10
-rw-r--r--geom_bottleneck/tests/data/test_270_B10
-rw-r--r--geom_bottleneck/tests/data/test_271_A10
-rw-r--r--geom_bottleneck/tests/data/test_271_B10
-rw-r--r--geom_bottleneck/tests/data/test_272_A10
-rw-r--r--geom_bottleneck/tests/data/test_272_B10
-rw-r--r--geom_bottleneck/tests/data/test_273_A10
-rw-r--r--geom_bottleneck/tests/data/test_273_B10
-rw-r--r--geom_bottleneck/tests/data/test_274_A10
-rw-r--r--geom_bottleneck/tests/data/test_274_B10
-rw-r--r--geom_bottleneck/tests/data/test_275_A10
-rw-r--r--geom_bottleneck/tests/data/test_275_B10
-rw-r--r--geom_bottleneck/tests/data/test_276_A10
-rw-r--r--geom_bottleneck/tests/data/test_276_B10
-rw-r--r--geom_bottleneck/tests/data/test_277_A10
-rw-r--r--geom_bottleneck/tests/data/test_277_B10
-rw-r--r--geom_bottleneck/tests/data/test_278_A10
-rw-r--r--geom_bottleneck/tests/data/test_278_B10
-rw-r--r--geom_bottleneck/tests/data/test_279_A10
-rw-r--r--geom_bottleneck/tests/data/test_279_B10
-rw-r--r--geom_bottleneck/tests/data/test_280_A20
-rw-r--r--geom_bottleneck/tests/data/test_280_B20
-rw-r--r--geom_bottleneck/tests/data/test_281_A20
-rw-r--r--geom_bottleneck/tests/data/test_281_B20
-rw-r--r--geom_bottleneck/tests/data/test_282_A20
-rw-r--r--geom_bottleneck/tests/data/test_282_B20
-rw-r--r--geom_bottleneck/tests/data/test_283_A20
-rw-r--r--geom_bottleneck/tests/data/test_283_B20
-rw-r--r--geom_bottleneck/tests/data/test_284_A20
-rw-r--r--geom_bottleneck/tests/data/test_284_B20
-rw-r--r--geom_bottleneck/tests/data/test_285_A20
-rw-r--r--geom_bottleneck/tests/data/test_285_B20
-rw-r--r--geom_bottleneck/tests/data/test_286_A20
-rw-r--r--geom_bottleneck/tests/data/test_286_B20
-rw-r--r--geom_bottleneck/tests/data/test_287_A20
-rw-r--r--geom_bottleneck/tests/data/test_287_B20
-rw-r--r--geom_bottleneck/tests/data/test_288_A20
-rw-r--r--geom_bottleneck/tests/data/test_288_B20
-rw-r--r--geom_bottleneck/tests/data/test_289_A20
-rw-r--r--geom_bottleneck/tests/data/test_289_B20
-rw-r--r--geom_bottleneck/tests/data/test_290_A20
-rw-r--r--geom_bottleneck/tests/data/test_290_B20
-rw-r--r--geom_bottleneck/tests/data/test_291_A20
-rw-r--r--geom_bottleneck/tests/data/test_291_B20
-rw-r--r--geom_bottleneck/tests/data/test_292_A20
-rw-r--r--geom_bottleneck/tests/data/test_292_B20
-rw-r--r--geom_bottleneck/tests/data/test_293_A20
-rw-r--r--geom_bottleneck/tests/data/test_293_B20
-rw-r--r--geom_bottleneck/tests/data/test_294_A20
-rw-r--r--geom_bottleneck/tests/data/test_294_B20
-rw-r--r--geom_bottleneck/tests/data/test_295_A20
-rw-r--r--geom_bottleneck/tests/data/test_295_B20
-rw-r--r--geom_bottleneck/tests/data/test_296_A20
-rw-r--r--geom_bottleneck/tests/data/test_296_B20
-rw-r--r--geom_bottleneck/tests/data/test_297_A20
-rw-r--r--geom_bottleneck/tests/data/test_297_B20
-rw-r--r--geom_bottleneck/tests/data/test_298_A20
-rw-r--r--geom_bottleneck/tests/data/test_298_B20
-rw-r--r--geom_bottleneck/tests/data/test_299_A20
-rw-r--r--geom_bottleneck/tests/data/test_299_B20
-rw-r--r--geom_bottleneck/tests/data/test_300_A30
-rw-r--r--geom_bottleneck/tests/data/test_300_B30
-rw-r--r--geom_bottleneck/tests/data/test_301_A30
-rw-r--r--geom_bottleneck/tests/data/test_301_B30
-rw-r--r--geom_bottleneck/tests/data/test_302_A30
-rw-r--r--geom_bottleneck/tests/data/test_302_B30
-rw-r--r--geom_bottleneck/tests/data/test_303_A30
-rw-r--r--geom_bottleneck/tests/data/test_303_B30
-rw-r--r--geom_bottleneck/tests/data/test_304_A30
-rw-r--r--geom_bottleneck/tests/data/test_304_B30
-rw-r--r--geom_bottleneck/tests/data/test_305_A30
-rw-r--r--geom_bottleneck/tests/data/test_305_B30
-rw-r--r--geom_bottleneck/tests/data/test_306_A30
-rw-r--r--geom_bottleneck/tests/data/test_306_B30
-rw-r--r--geom_bottleneck/tests/data/test_307_A30
-rw-r--r--geom_bottleneck/tests/data/test_307_B30
-rw-r--r--geom_bottleneck/tests/data/test_308_A30
-rw-r--r--geom_bottleneck/tests/data/test_308_B30
-rw-r--r--geom_bottleneck/tests/data/test_309_A30
-rw-r--r--geom_bottleneck/tests/data/test_309_B30
-rw-r--r--geom_bottleneck/tests/data/test_310_A30
-rw-r--r--geom_bottleneck/tests/data/test_310_B30
-rw-r--r--geom_bottleneck/tests/data/test_311_A30
-rw-r--r--geom_bottleneck/tests/data/test_311_B30
-rw-r--r--geom_bottleneck/tests/data/test_312_A30
-rw-r--r--geom_bottleneck/tests/data/test_312_B30
-rw-r--r--geom_bottleneck/tests/data/test_313_A30
-rw-r--r--geom_bottleneck/tests/data/test_313_B30
-rw-r--r--geom_bottleneck/tests/data/test_314_A30
-rw-r--r--geom_bottleneck/tests/data/test_314_B30
-rw-r--r--geom_bottleneck/tests/data/test_315_A30
-rw-r--r--geom_bottleneck/tests/data/test_315_B30
-rw-r--r--geom_bottleneck/tests/data/test_316_A30
-rw-r--r--geom_bottleneck/tests/data/test_316_B30
-rw-r--r--geom_bottleneck/tests/data/test_317_A30
-rw-r--r--geom_bottleneck/tests/data/test_317_B30
-rw-r--r--geom_bottleneck/tests/data/test_318_A30
-rw-r--r--geom_bottleneck/tests/data/test_318_B30
-rw-r--r--geom_bottleneck/tests/data/test_319_A30
-rw-r--r--geom_bottleneck/tests/data/test_319_B30
-rw-r--r--geom_bottleneck/tests/data/test_320_A50
-rw-r--r--geom_bottleneck/tests/data/test_320_B50
-rw-r--r--geom_bottleneck/tests/data/test_321_A50
-rw-r--r--geom_bottleneck/tests/data/test_321_B50
-rw-r--r--geom_bottleneck/tests/data/test_322_A50
-rw-r--r--geom_bottleneck/tests/data/test_322_B50
-rw-r--r--geom_bottleneck/tests/data/test_323_A50
-rw-r--r--geom_bottleneck/tests/data/test_323_B50
-rw-r--r--geom_bottleneck/tests/data/test_324_A50
-rw-r--r--geom_bottleneck/tests/data/test_324_B50
-rw-r--r--geom_bottleneck/tests/data/test_325_A50
-rw-r--r--geom_bottleneck/tests/data/test_325_B50
-rw-r--r--geom_bottleneck/tests/data/test_326_A50
-rw-r--r--geom_bottleneck/tests/data/test_326_B50
-rw-r--r--geom_bottleneck/tests/data/test_327_A50
-rw-r--r--geom_bottleneck/tests/data/test_327_B50
-rw-r--r--geom_bottleneck/tests/data/test_328_A50
-rw-r--r--geom_bottleneck/tests/data/test_328_B50
-rw-r--r--geom_bottleneck/tests/data/test_329_A50
-rw-r--r--geom_bottleneck/tests/data/test_329_B50
-rw-r--r--geom_bottleneck/tests/data/test_330_A50
-rw-r--r--geom_bottleneck/tests/data/test_330_B50
-rw-r--r--geom_bottleneck/tests/data/test_331_A50
-rw-r--r--geom_bottleneck/tests/data/test_331_B50
-rw-r--r--geom_bottleneck/tests/data/test_332_A50
-rw-r--r--geom_bottleneck/tests/data/test_332_B50
-rw-r--r--geom_bottleneck/tests/data/test_333_A50
-rw-r--r--geom_bottleneck/tests/data/test_333_B50
-rw-r--r--geom_bottleneck/tests/data/test_334_A50
-rw-r--r--geom_bottleneck/tests/data/test_334_B50
-rw-r--r--geom_bottleneck/tests/data/test_335_A50
-rw-r--r--geom_bottleneck/tests/data/test_335_B50
-rw-r--r--geom_bottleneck/tests/data/test_336_A50
-rw-r--r--geom_bottleneck/tests/data/test_336_B50
-rw-r--r--geom_bottleneck/tests/data/test_337_A50
-rw-r--r--geom_bottleneck/tests/data/test_337_B50
-rw-r--r--geom_bottleneck/tests/data/test_338_A50
-rw-r--r--geom_bottleneck/tests/data/test_338_B50
-rw-r--r--geom_bottleneck/tests/data/test_339_A50
-rw-r--r--geom_bottleneck/tests/data/test_339_B50
-rw-r--r--geom_bottleneck/tests/data/test_340_A100
-rw-r--r--geom_bottleneck/tests/data/test_340_B100
-rw-r--r--geom_bottleneck/tests/data/test_341_A100
-rw-r--r--geom_bottleneck/tests/data/test_341_B100
-rw-r--r--geom_bottleneck/tests/data/test_342_A100
-rw-r--r--geom_bottleneck/tests/data/test_342_B100
-rw-r--r--geom_bottleneck/tests/data/test_343_A100
-rw-r--r--geom_bottleneck/tests/data/test_343_B100
-rw-r--r--geom_bottleneck/tests/data/test_344_A100
-rw-r--r--geom_bottleneck/tests/data/test_344_B100
-rw-r--r--geom_bottleneck/tests/data/test_345_A100
-rw-r--r--geom_bottleneck/tests/data/test_345_B100
-rw-r--r--geom_bottleneck/tests/data/test_346_A100
-rw-r--r--geom_bottleneck/tests/data/test_346_B100
-rw-r--r--geom_bottleneck/tests/data/test_347_A100
-rw-r--r--geom_bottleneck/tests/data/test_347_B100
-rw-r--r--geom_bottleneck/tests/data/test_348_A100
-rw-r--r--geom_bottleneck/tests/data/test_348_B100
-rw-r--r--geom_bottleneck/tests/data/test_349_A100
-rw-r--r--geom_bottleneck/tests/data/test_349_B100
-rw-r--r--geom_bottleneck/tests/data/test_350_A100
-rw-r--r--geom_bottleneck/tests/data/test_350_B100
-rw-r--r--geom_bottleneck/tests/data/test_351_A100
-rw-r--r--geom_bottleneck/tests/data/test_351_B100
-rw-r--r--geom_bottleneck/tests/data/test_352_A100
-rw-r--r--geom_bottleneck/tests/data/test_352_B100
-rw-r--r--geom_bottleneck/tests/data/test_353_A100
-rw-r--r--geom_bottleneck/tests/data/test_353_B100
-rw-r--r--geom_bottleneck/tests/data/test_354_A100
-rw-r--r--geom_bottleneck/tests/data/test_354_B100
-rw-r--r--geom_bottleneck/tests/data/test_355_A100
-rw-r--r--geom_bottleneck/tests/data/test_355_B100
-rw-r--r--geom_bottleneck/tests/data/test_356_A100
-rw-r--r--geom_bottleneck/tests/data/test_356_B100
-rw-r--r--geom_bottleneck/tests/data/test_357_A100
-rw-r--r--geom_bottleneck/tests/data/test_357_B100
-rw-r--r--geom_bottleneck/tests/data/test_358_A100
-rw-r--r--geom_bottleneck/tests/data/test_358_B100
-rw-r--r--geom_bottleneck/tests/data/test_359_A100
-rw-r--r--geom_bottleneck/tests/data/test_359_B100
-rw-r--r--geom_bottleneck/tests/data/test_360_A2
-rw-r--r--geom_bottleneck/tests/data/test_360_B2
-rw-r--r--geom_bottleneck/tests/data/test_361_A2
-rw-r--r--geom_bottleneck/tests/data/test_361_B2
-rw-r--r--geom_bottleneck/tests/data/test_362_A2
-rw-r--r--geom_bottleneck/tests/data/test_362_B2
-rw-r--r--geom_bottleneck/tests/data/test_363_A2
-rw-r--r--geom_bottleneck/tests/data/test_363_B2
-rw-r--r--geom_bottleneck/tests/data/test_364_A2
-rw-r--r--geom_bottleneck/tests/data/test_364_B2
-rw-r--r--geom_bottleneck/tests/data/test_365_A2
-rw-r--r--geom_bottleneck/tests/data/test_365_B2
-rw-r--r--geom_bottleneck/tests/data/test_366_A2
-rw-r--r--geom_bottleneck/tests/data/test_366_B2
-rw-r--r--geom_bottleneck/tests/data/test_367_A2
-rw-r--r--geom_bottleneck/tests/data/test_367_B2
-rw-r--r--geom_bottleneck/tests/data/test_368_A2
-rw-r--r--geom_bottleneck/tests/data/test_368_B2
-rw-r--r--geom_bottleneck/tests/data/test_369_A2
-rw-r--r--geom_bottleneck/tests/data/test_369_B2
-rw-r--r--geom_bottleneck/tests/data/test_370_A2
-rw-r--r--geom_bottleneck/tests/data/test_370_B2
-rw-r--r--geom_bottleneck/tests/data/test_371_A2
-rw-r--r--geom_bottleneck/tests/data/test_371_B2
-rw-r--r--geom_bottleneck/tests/data/test_372_A2
-rw-r--r--geom_bottleneck/tests/data/test_372_B2
-rw-r--r--geom_bottleneck/tests/data/test_373_A2
-rw-r--r--geom_bottleneck/tests/data/test_373_B2
-rw-r--r--geom_bottleneck/tests/data/test_374_A2
-rw-r--r--geom_bottleneck/tests/data/test_374_B2
-rw-r--r--geom_bottleneck/tests/data/test_375_A2
-rw-r--r--geom_bottleneck/tests/data/test_375_B2
-rw-r--r--geom_bottleneck/tests/data/test_376_A2
-rw-r--r--geom_bottleneck/tests/data/test_376_B2
-rw-r--r--geom_bottleneck/tests/data/test_377_A2
-rw-r--r--geom_bottleneck/tests/data/test_377_B2
-rw-r--r--geom_bottleneck/tests/data/test_378_A2
-rw-r--r--geom_bottleneck/tests/data/test_378_B2
-rw-r--r--geom_bottleneck/tests/data/test_379_A2
-rw-r--r--geom_bottleneck/tests/data/test_379_B2
-rw-r--r--geom_bottleneck/tests/data/test_380_A3
-rw-r--r--geom_bottleneck/tests/data/test_380_B3
-rw-r--r--geom_bottleneck/tests/data/test_381_A3
-rw-r--r--geom_bottleneck/tests/data/test_381_B3
-rw-r--r--geom_bottleneck/tests/data/test_382_A3
-rw-r--r--geom_bottleneck/tests/data/test_382_B3
-rw-r--r--geom_bottleneck/tests/data/test_383_A3
-rw-r--r--geom_bottleneck/tests/data/test_383_B3
-rw-r--r--geom_bottleneck/tests/data/test_384_A3
-rw-r--r--geom_bottleneck/tests/data/test_384_B3
-rw-r--r--geom_bottleneck/tests/data/test_385_A3
-rw-r--r--geom_bottleneck/tests/data/test_385_B3
-rw-r--r--geom_bottleneck/tests/data/test_386_A3
-rw-r--r--geom_bottleneck/tests/data/test_386_B3
-rw-r--r--geom_bottleneck/tests/data/test_387_A3
-rw-r--r--geom_bottleneck/tests/data/test_387_B3
-rw-r--r--geom_bottleneck/tests/data/test_388_A3
-rw-r--r--geom_bottleneck/tests/data/test_388_B3
-rw-r--r--geom_bottleneck/tests/data/test_389_A3
-rw-r--r--geom_bottleneck/tests/data/test_389_B3
-rw-r--r--geom_bottleneck/tests/data/test_390_A3
-rw-r--r--geom_bottleneck/tests/data/test_390_B3
-rw-r--r--geom_bottleneck/tests/data/test_391_A3
-rw-r--r--geom_bottleneck/tests/data/test_391_B3
-rw-r--r--geom_bottleneck/tests/data/test_392_A3
-rw-r--r--geom_bottleneck/tests/data/test_392_B3
-rw-r--r--geom_bottleneck/tests/data/test_393_A3
-rw-r--r--geom_bottleneck/tests/data/test_393_B3
-rw-r--r--geom_bottleneck/tests/data/test_394_A3
-rw-r--r--geom_bottleneck/tests/data/test_394_B3
-rw-r--r--geom_bottleneck/tests/data/test_395_A3
-rw-r--r--geom_bottleneck/tests/data/test_395_B3
-rw-r--r--geom_bottleneck/tests/data/test_396_A3
-rw-r--r--geom_bottleneck/tests/data/test_396_B3
-rw-r--r--geom_bottleneck/tests/data/test_397_A3
-rw-r--r--geom_bottleneck/tests/data/test_397_B3
-rw-r--r--geom_bottleneck/tests/data/test_398_A3
-rw-r--r--geom_bottleneck/tests/data/test_398_B3
-rw-r--r--geom_bottleneck/tests/data/test_399_A3
-rw-r--r--geom_bottleneck/tests/data/test_399_B3
-rw-r--r--geom_bottleneck/tests/data/test_400_A4
-rw-r--r--geom_bottleneck/tests/data/test_400_B4
-rw-r--r--geom_bottleneck/tests/data/test_401_A4
-rw-r--r--geom_bottleneck/tests/data/test_401_B4
-rw-r--r--geom_bottleneck/tests/data/test_402_A4
-rw-r--r--geom_bottleneck/tests/data/test_402_B4
-rw-r--r--geom_bottleneck/tests/data/test_403_A4
-rw-r--r--geom_bottleneck/tests/data/test_403_B4
-rw-r--r--geom_bottleneck/tests/data/test_404_A4
-rw-r--r--geom_bottleneck/tests/data/test_404_B4
-rw-r--r--geom_bottleneck/tests/data/test_405_A4
-rw-r--r--geom_bottleneck/tests/data/test_405_B4
-rw-r--r--geom_bottleneck/tests/data/test_406_A4
-rw-r--r--geom_bottleneck/tests/data/test_406_B4
-rw-r--r--geom_bottleneck/tests/data/test_407_A4
-rw-r--r--geom_bottleneck/tests/data/test_407_B4
-rw-r--r--geom_bottleneck/tests/data/test_408_A4
-rw-r--r--geom_bottleneck/tests/data/test_408_B4
-rw-r--r--geom_bottleneck/tests/data/test_409_A4
-rw-r--r--geom_bottleneck/tests/data/test_409_B4
-rw-r--r--geom_bottleneck/tests/data/test_410_A4
-rw-r--r--geom_bottleneck/tests/data/test_410_B4
-rw-r--r--geom_bottleneck/tests/data/test_411_A4
-rw-r--r--geom_bottleneck/tests/data/test_411_B4
-rw-r--r--geom_bottleneck/tests/data/test_412_A4
-rw-r--r--geom_bottleneck/tests/data/test_412_B4
-rw-r--r--geom_bottleneck/tests/data/test_413_A4
-rw-r--r--geom_bottleneck/tests/data/test_413_B4
-rw-r--r--geom_bottleneck/tests/data/test_414_A4
-rw-r--r--geom_bottleneck/tests/data/test_414_B4
-rw-r--r--geom_bottleneck/tests/data/test_415_A4
-rw-r--r--geom_bottleneck/tests/data/test_415_B4
-rw-r--r--geom_bottleneck/tests/data/test_416_A4
-rw-r--r--geom_bottleneck/tests/data/test_416_B4
-rw-r--r--geom_bottleneck/tests/data/test_417_A4
-rw-r--r--geom_bottleneck/tests/data/test_417_B4
-rw-r--r--geom_bottleneck/tests/data/test_418_A4
-rw-r--r--geom_bottleneck/tests/data/test_418_B4
-rw-r--r--geom_bottleneck/tests/data/test_419_A4
-rw-r--r--geom_bottleneck/tests/data/test_419_B4
-rw-r--r--geom_bottleneck/tests/data/test_420_A5
-rw-r--r--geom_bottleneck/tests/data/test_420_B5
-rw-r--r--geom_bottleneck/tests/data/test_421_A5
-rw-r--r--geom_bottleneck/tests/data/test_421_B5
-rw-r--r--geom_bottleneck/tests/data/test_422_A5
-rw-r--r--geom_bottleneck/tests/data/test_422_B5
-rw-r--r--geom_bottleneck/tests/data/test_423_A5
-rw-r--r--geom_bottleneck/tests/data/test_423_B5
-rw-r--r--geom_bottleneck/tests/data/test_424_A5
-rw-r--r--geom_bottleneck/tests/data/test_424_B5
-rw-r--r--geom_bottleneck/tests/data/test_425_A5
-rw-r--r--geom_bottleneck/tests/data/test_425_B5
-rw-r--r--geom_bottleneck/tests/data/test_426_A5
-rw-r--r--geom_bottleneck/tests/data/test_426_B5
-rw-r--r--geom_bottleneck/tests/data/test_427_A5
-rw-r--r--geom_bottleneck/tests/data/test_427_B5
-rw-r--r--geom_bottleneck/tests/data/test_428_A5
-rw-r--r--geom_bottleneck/tests/data/test_428_B5
-rw-r--r--geom_bottleneck/tests/data/test_429_A5
-rw-r--r--geom_bottleneck/tests/data/test_429_B5
-rw-r--r--geom_bottleneck/tests/data/test_430_A5
-rw-r--r--geom_bottleneck/tests/data/test_430_B5
-rw-r--r--geom_bottleneck/tests/data/test_431_A5
-rw-r--r--geom_bottleneck/tests/data/test_431_B5
-rw-r--r--geom_bottleneck/tests/data/test_432_A5
-rw-r--r--geom_bottleneck/tests/data/test_432_B5
-rw-r--r--geom_bottleneck/tests/data/test_433_A5
-rw-r--r--geom_bottleneck/tests/data/test_433_B5
-rw-r--r--geom_bottleneck/tests/data/test_434_A5
-rw-r--r--geom_bottleneck/tests/data/test_434_B5
-rw-r--r--geom_bottleneck/tests/data/test_435_A5
-rw-r--r--geom_bottleneck/tests/data/test_435_B5
-rw-r--r--geom_bottleneck/tests/data/test_436_A5
-rw-r--r--geom_bottleneck/tests/data/test_436_B5
-rw-r--r--geom_bottleneck/tests/data/test_437_A5
-rw-r--r--geom_bottleneck/tests/data/test_437_B5
-rw-r--r--geom_bottleneck/tests/data/test_438_A5
-rw-r--r--geom_bottleneck/tests/data/test_438_B5
-rw-r--r--geom_bottleneck/tests/data/test_439_A5
-rw-r--r--geom_bottleneck/tests/data/test_439_B5
-rw-r--r--geom_bottleneck/tests/data/test_440_A6
-rw-r--r--geom_bottleneck/tests/data/test_440_B6
-rw-r--r--geom_bottleneck/tests/data/test_441_A6
-rw-r--r--geom_bottleneck/tests/data/test_441_B6
-rw-r--r--geom_bottleneck/tests/data/test_442_A6
-rw-r--r--geom_bottleneck/tests/data/test_442_B6
-rw-r--r--geom_bottleneck/tests/data/test_443_A6
-rw-r--r--geom_bottleneck/tests/data/test_443_B6
-rw-r--r--geom_bottleneck/tests/data/test_444_A6
-rw-r--r--geom_bottleneck/tests/data/test_444_B6
-rw-r--r--geom_bottleneck/tests/data/test_445_A6
-rw-r--r--geom_bottleneck/tests/data/test_445_B6
-rw-r--r--geom_bottleneck/tests/data/test_446_A6
-rw-r--r--geom_bottleneck/tests/data/test_446_B6
-rw-r--r--geom_bottleneck/tests/data/test_447_A6
-rw-r--r--geom_bottleneck/tests/data/test_447_B6
-rw-r--r--geom_bottleneck/tests/data/test_448_A6
-rw-r--r--geom_bottleneck/tests/data/test_448_B6
-rw-r--r--geom_bottleneck/tests/data/test_449_A6
-rw-r--r--geom_bottleneck/tests/data/test_449_B6
-rw-r--r--geom_bottleneck/tests/data/test_450_A6
-rw-r--r--geom_bottleneck/tests/data/test_450_B6
-rw-r--r--geom_bottleneck/tests/data/test_451_A6
-rw-r--r--geom_bottleneck/tests/data/test_451_B6
-rw-r--r--geom_bottleneck/tests/data/test_452_A6
-rw-r--r--geom_bottleneck/tests/data/test_452_B6
-rw-r--r--geom_bottleneck/tests/data/test_453_A6
-rw-r--r--geom_bottleneck/tests/data/test_453_B6
-rw-r--r--geom_bottleneck/tests/data/test_454_A6
-rw-r--r--geom_bottleneck/tests/data/test_454_B6
-rw-r--r--geom_bottleneck/tests/data/test_455_A6
-rw-r--r--geom_bottleneck/tests/data/test_455_B6
-rw-r--r--geom_bottleneck/tests/data/test_456_A6
-rw-r--r--geom_bottleneck/tests/data/test_456_B6
-rw-r--r--geom_bottleneck/tests/data/test_457_A6
-rw-r--r--geom_bottleneck/tests/data/test_457_B6
-rw-r--r--geom_bottleneck/tests/data/test_458_A6
-rw-r--r--geom_bottleneck/tests/data/test_458_B6
-rw-r--r--geom_bottleneck/tests/data/test_459_A6
-rw-r--r--geom_bottleneck/tests/data/test_459_B6
-rw-r--r--geom_bottleneck/tests/data/test_460_A7
-rw-r--r--geom_bottleneck/tests/data/test_460_B7
-rw-r--r--geom_bottleneck/tests/data/test_461_A7
-rw-r--r--geom_bottleneck/tests/data/test_461_B7
-rw-r--r--geom_bottleneck/tests/data/test_462_A7
-rw-r--r--geom_bottleneck/tests/data/test_462_B7
-rw-r--r--geom_bottleneck/tests/data/test_463_A7
-rw-r--r--geom_bottleneck/tests/data/test_463_B7
-rw-r--r--geom_bottleneck/tests/data/test_464_A7
-rw-r--r--geom_bottleneck/tests/data/test_464_B7
-rw-r--r--geom_bottleneck/tests/data/test_465_A7
-rw-r--r--geom_bottleneck/tests/data/test_465_B7
-rw-r--r--geom_bottleneck/tests/data/test_466_A7
-rw-r--r--geom_bottleneck/tests/data/test_466_B7
-rw-r--r--geom_bottleneck/tests/data/test_467_A7
-rw-r--r--geom_bottleneck/tests/data/test_467_B7
-rw-r--r--geom_bottleneck/tests/data/test_468_A7
-rw-r--r--geom_bottleneck/tests/data/test_468_B7
-rw-r--r--geom_bottleneck/tests/data/test_469_A7
-rw-r--r--geom_bottleneck/tests/data/test_469_B7
-rw-r--r--geom_bottleneck/tests/data/test_470_A7
-rw-r--r--geom_bottleneck/tests/data/test_470_B7
-rw-r--r--geom_bottleneck/tests/data/test_471_A7
-rw-r--r--geom_bottleneck/tests/data/test_471_B7
-rw-r--r--geom_bottleneck/tests/data/test_472_A7
-rw-r--r--geom_bottleneck/tests/data/test_472_B7
-rw-r--r--geom_bottleneck/tests/data/test_473_A7
-rw-r--r--geom_bottleneck/tests/data/test_473_B7
-rw-r--r--geom_bottleneck/tests/data/test_474_A7
-rw-r--r--geom_bottleneck/tests/data/test_474_B7
-rw-r--r--geom_bottleneck/tests/data/test_475_A7
-rw-r--r--geom_bottleneck/tests/data/test_475_B7
-rw-r--r--geom_bottleneck/tests/data/test_476_A7
-rw-r--r--geom_bottleneck/tests/data/test_476_B7
-rw-r--r--geom_bottleneck/tests/data/test_477_A7
-rw-r--r--geom_bottleneck/tests/data/test_477_B7
-rw-r--r--geom_bottleneck/tests/data/test_478_A7
-rw-r--r--geom_bottleneck/tests/data/test_478_B7
-rw-r--r--geom_bottleneck/tests/data/test_479_A7
-rw-r--r--geom_bottleneck/tests/data/test_479_B7
-rw-r--r--geom_bottleneck/tests/data/test_480_A8
-rw-r--r--geom_bottleneck/tests/data/test_480_B8
-rw-r--r--geom_bottleneck/tests/data/test_481_A8
-rw-r--r--geom_bottleneck/tests/data/test_481_B8
-rw-r--r--geom_bottleneck/tests/data/test_482_A8
-rw-r--r--geom_bottleneck/tests/data/test_482_B8
-rw-r--r--geom_bottleneck/tests/data/test_483_A8
-rw-r--r--geom_bottleneck/tests/data/test_483_B8
-rw-r--r--geom_bottleneck/tests/data/test_484_A8
-rw-r--r--geom_bottleneck/tests/data/test_484_B8
-rw-r--r--geom_bottleneck/tests/data/test_485_A8
-rw-r--r--geom_bottleneck/tests/data/test_485_B8
-rw-r--r--geom_bottleneck/tests/data/test_486_A8
-rw-r--r--geom_bottleneck/tests/data/test_486_B8
-rw-r--r--geom_bottleneck/tests/data/test_487_A8
-rw-r--r--geom_bottleneck/tests/data/test_487_B8
-rw-r--r--geom_bottleneck/tests/data/test_488_A8
-rw-r--r--geom_bottleneck/tests/data/test_488_B8
-rw-r--r--geom_bottleneck/tests/data/test_489_A8
-rw-r--r--geom_bottleneck/tests/data/test_489_B8
-rw-r--r--geom_bottleneck/tests/data/test_490_A8
-rw-r--r--geom_bottleneck/tests/data/test_490_B8
-rw-r--r--geom_bottleneck/tests/data/test_491_A8
-rw-r--r--geom_bottleneck/tests/data/test_491_B8
-rw-r--r--geom_bottleneck/tests/data/test_492_A8
-rw-r--r--geom_bottleneck/tests/data/test_492_B8
-rw-r--r--geom_bottleneck/tests/data/test_493_A8
-rw-r--r--geom_bottleneck/tests/data/test_493_B8
-rw-r--r--geom_bottleneck/tests/data/test_494_A8
-rw-r--r--geom_bottleneck/tests/data/test_494_B8
-rw-r--r--geom_bottleneck/tests/data/test_495_A8
-rw-r--r--geom_bottleneck/tests/data/test_495_B8
-rw-r--r--geom_bottleneck/tests/data/test_496_A8
-rw-r--r--geom_bottleneck/tests/data/test_496_B8
-rw-r--r--geom_bottleneck/tests/data/test_497_A8
-rw-r--r--geom_bottleneck/tests/data/test_497_B8
-rw-r--r--geom_bottleneck/tests/data/test_498_A8
-rw-r--r--geom_bottleneck/tests/data/test_498_B8
-rw-r--r--geom_bottleneck/tests/data/test_499_A8
-rw-r--r--geom_bottleneck/tests/data/test_499_B8
-rw-r--r--geom_bottleneck/tests/data/test_500_A9
-rw-r--r--geom_bottleneck/tests/data/test_500_B9
-rw-r--r--geom_bottleneck/tests/data/test_501_A9
-rw-r--r--geom_bottleneck/tests/data/test_501_B9
-rw-r--r--geom_bottleneck/tests/data/test_502_A9
-rw-r--r--geom_bottleneck/tests/data/test_502_B9
-rw-r--r--geom_bottleneck/tests/data/test_503_A9
-rw-r--r--geom_bottleneck/tests/data/test_503_B9
-rw-r--r--geom_bottleneck/tests/data/test_504_A9
-rw-r--r--geom_bottleneck/tests/data/test_504_B9
-rw-r--r--geom_bottleneck/tests/data/test_505_A9
-rw-r--r--geom_bottleneck/tests/data/test_505_B9
-rw-r--r--geom_bottleneck/tests/data/test_506_A9
-rw-r--r--geom_bottleneck/tests/data/test_506_B9
-rw-r--r--geom_bottleneck/tests/data/test_507_A9
-rw-r--r--geom_bottleneck/tests/data/test_507_B9
-rw-r--r--geom_bottleneck/tests/data/test_508_A9
-rw-r--r--geom_bottleneck/tests/data/test_508_B9
-rw-r--r--geom_bottleneck/tests/data/test_509_A9
-rw-r--r--geom_bottleneck/tests/data/test_509_B9
-rw-r--r--geom_bottleneck/tests/data/test_510_A9
-rw-r--r--geom_bottleneck/tests/data/test_510_B9
-rw-r--r--geom_bottleneck/tests/data/test_511_A9
-rw-r--r--geom_bottleneck/tests/data/test_511_B9
-rw-r--r--geom_bottleneck/tests/data/test_512_A9
-rw-r--r--geom_bottleneck/tests/data/test_512_B9
-rw-r--r--geom_bottleneck/tests/data/test_513_A9
-rw-r--r--geom_bottleneck/tests/data/test_513_B9
-rw-r--r--geom_bottleneck/tests/data/test_514_A9
-rw-r--r--geom_bottleneck/tests/data/test_514_B9
-rw-r--r--geom_bottleneck/tests/data/test_515_A9
-rw-r--r--geom_bottleneck/tests/data/test_515_B9
-rw-r--r--geom_bottleneck/tests/data/test_516_A9
-rw-r--r--geom_bottleneck/tests/data/test_516_B9
-rw-r--r--geom_bottleneck/tests/data/test_517_A9
-rw-r--r--geom_bottleneck/tests/data/test_517_B9
-rw-r--r--geom_bottleneck/tests/data/test_518_A9
-rw-r--r--geom_bottleneck/tests/data/test_518_B9
-rw-r--r--geom_bottleneck/tests/data/test_519_A9
-rw-r--r--geom_bottleneck/tests/data/test_519_B9
-rw-r--r--geom_bottleneck/tests/data/test_520_A10
-rw-r--r--geom_bottleneck/tests/data/test_520_B10
-rw-r--r--geom_bottleneck/tests/data/test_521_A10
-rw-r--r--geom_bottleneck/tests/data/test_521_B10
-rw-r--r--geom_bottleneck/tests/data/test_522_A10
-rw-r--r--geom_bottleneck/tests/data/test_522_B10
-rw-r--r--geom_bottleneck/tests/data/test_523_A10
-rw-r--r--geom_bottleneck/tests/data/test_523_B10
-rw-r--r--geom_bottleneck/tests/data/test_524_A10
-rw-r--r--geom_bottleneck/tests/data/test_524_B10
-rw-r--r--geom_bottleneck/tests/data/test_525_A10
-rw-r--r--geom_bottleneck/tests/data/test_525_B10
-rw-r--r--geom_bottleneck/tests/data/test_526_A10
-rw-r--r--geom_bottleneck/tests/data/test_526_B10
-rw-r--r--geom_bottleneck/tests/data/test_527_A10
-rw-r--r--geom_bottleneck/tests/data/test_527_B10
-rw-r--r--geom_bottleneck/tests/data/test_528_A10
-rw-r--r--geom_bottleneck/tests/data/test_528_B10
-rw-r--r--geom_bottleneck/tests/data/test_529_A10
-rw-r--r--geom_bottleneck/tests/data/test_529_B10
-rw-r--r--geom_bottleneck/tests/data/test_530_A10
-rw-r--r--geom_bottleneck/tests/data/test_530_B10
-rw-r--r--geom_bottleneck/tests/data/test_531_A10
-rw-r--r--geom_bottleneck/tests/data/test_531_B10
-rw-r--r--geom_bottleneck/tests/data/test_532_A10
-rw-r--r--geom_bottleneck/tests/data/test_532_B10
-rw-r--r--geom_bottleneck/tests/data/test_533_A10
-rw-r--r--geom_bottleneck/tests/data/test_533_B10
-rw-r--r--geom_bottleneck/tests/data/test_534_A10
-rw-r--r--geom_bottleneck/tests/data/test_534_B10
-rw-r--r--geom_bottleneck/tests/data/test_535_A10
-rw-r--r--geom_bottleneck/tests/data/test_535_B10
-rw-r--r--geom_bottleneck/tests/data/test_536_A10
-rw-r--r--geom_bottleneck/tests/data/test_536_B10
-rw-r--r--geom_bottleneck/tests/data/test_537_A10
-rw-r--r--geom_bottleneck/tests/data/test_537_B10
-rw-r--r--geom_bottleneck/tests/data/test_538_A10
-rw-r--r--geom_bottleneck/tests/data/test_538_B10
-rw-r--r--geom_bottleneck/tests/data/test_539_A10
-rw-r--r--geom_bottleneck/tests/data/test_539_B10
-rw-r--r--geom_bottleneck/tests/data/test_540_A20
-rw-r--r--geom_bottleneck/tests/data/test_540_B20
-rw-r--r--geom_bottleneck/tests/data/test_541_A20
-rw-r--r--geom_bottleneck/tests/data/test_541_B20
-rw-r--r--geom_bottleneck/tests/data/test_542_A20
-rw-r--r--geom_bottleneck/tests/data/test_542_B20
-rw-r--r--geom_bottleneck/tests/data/test_543_A20
-rw-r--r--geom_bottleneck/tests/data/test_543_B20
-rw-r--r--geom_bottleneck/tests/data/test_544_A20
-rw-r--r--geom_bottleneck/tests/data/test_544_B20
-rw-r--r--geom_bottleneck/tests/data/test_545_A20
-rw-r--r--geom_bottleneck/tests/data/test_545_B20
-rw-r--r--geom_bottleneck/tests/data/test_546_A20
-rw-r--r--geom_bottleneck/tests/data/test_546_B20
-rw-r--r--geom_bottleneck/tests/data/test_547_A20
-rw-r--r--geom_bottleneck/tests/data/test_547_B20
-rw-r--r--geom_bottleneck/tests/data/test_548_A20
-rw-r--r--geom_bottleneck/tests/data/test_548_B20
-rw-r--r--geom_bottleneck/tests/data/test_549_A20
-rw-r--r--geom_bottleneck/tests/data/test_549_B20
-rw-r--r--geom_bottleneck/tests/data/test_550_A20
-rw-r--r--geom_bottleneck/tests/data/test_550_B20
-rw-r--r--geom_bottleneck/tests/data/test_551_A20
-rw-r--r--geom_bottleneck/tests/data/test_551_B20
-rw-r--r--geom_bottleneck/tests/data/test_552_A20
-rw-r--r--geom_bottleneck/tests/data/test_552_B20
-rw-r--r--geom_bottleneck/tests/data/test_553_A20
-rw-r--r--geom_bottleneck/tests/data/test_553_B20
-rw-r--r--geom_bottleneck/tests/data/test_554_A20
-rw-r--r--geom_bottleneck/tests/data/test_554_B20
-rw-r--r--geom_bottleneck/tests/data/test_555_A20
-rw-r--r--geom_bottleneck/tests/data/test_555_B20
-rw-r--r--geom_bottleneck/tests/data/test_556_A20
-rw-r--r--geom_bottleneck/tests/data/test_556_B20
-rw-r--r--geom_bottleneck/tests/data/test_557_A20
-rw-r--r--geom_bottleneck/tests/data/test_557_B20
-rw-r--r--geom_bottleneck/tests/data/test_558_A20
-rw-r--r--geom_bottleneck/tests/data/test_558_B20
-rw-r--r--geom_bottleneck/tests/data/test_559_A20
-rw-r--r--geom_bottleneck/tests/data/test_559_B20
-rw-r--r--geom_bottleneck/tests/data/test_560_A30
-rw-r--r--geom_bottleneck/tests/data/test_560_B30
-rw-r--r--geom_bottleneck/tests/data/test_561_A30
-rw-r--r--geom_bottleneck/tests/data/test_561_B30
-rw-r--r--geom_bottleneck/tests/data/test_562_A30
-rw-r--r--geom_bottleneck/tests/data/test_562_B30
-rw-r--r--geom_bottleneck/tests/data/test_563_A30
-rw-r--r--geom_bottleneck/tests/data/test_563_B30
-rw-r--r--geom_bottleneck/tests/data/test_564_A30
-rw-r--r--geom_bottleneck/tests/data/test_564_B30
-rw-r--r--geom_bottleneck/tests/data/test_565_A30
-rw-r--r--geom_bottleneck/tests/data/test_565_B30
-rw-r--r--geom_bottleneck/tests/data/test_566_A30
-rw-r--r--geom_bottleneck/tests/data/test_566_B30
-rw-r--r--geom_bottleneck/tests/data/test_567_A30
-rw-r--r--geom_bottleneck/tests/data/test_567_B30
-rw-r--r--geom_bottleneck/tests/data/test_568_A30
-rw-r--r--geom_bottleneck/tests/data/test_568_B30
-rw-r--r--geom_bottleneck/tests/data/test_569_A30
-rw-r--r--geom_bottleneck/tests/data/test_569_B30
-rw-r--r--geom_bottleneck/tests/data/test_570_A30
-rw-r--r--geom_bottleneck/tests/data/test_570_B30
-rw-r--r--geom_bottleneck/tests/data/test_571_A30
-rw-r--r--geom_bottleneck/tests/data/test_571_B30
-rw-r--r--geom_bottleneck/tests/data/test_572_A30
-rw-r--r--geom_bottleneck/tests/data/test_572_B30
-rw-r--r--geom_bottleneck/tests/data/test_573_A30
-rw-r--r--geom_bottleneck/tests/data/test_573_B30
-rw-r--r--geom_bottleneck/tests/data/test_574_A30
-rw-r--r--geom_bottleneck/tests/data/test_574_B30
-rw-r--r--geom_bottleneck/tests/data/test_575_A30
-rw-r--r--geom_bottleneck/tests/data/test_575_B30
-rw-r--r--geom_bottleneck/tests/data/test_576_A30
-rw-r--r--geom_bottleneck/tests/data/test_576_B30
-rw-r--r--geom_bottleneck/tests/data/test_577_A30
-rw-r--r--geom_bottleneck/tests/data/test_577_B30
-rw-r--r--geom_bottleneck/tests/data/test_578_A30
-rw-r--r--geom_bottleneck/tests/data/test_578_B30
-rw-r--r--geom_bottleneck/tests/data/test_579_A30
-rw-r--r--geom_bottleneck/tests/data/test_579_B30
-rw-r--r--geom_bottleneck/tests/data/test_580_A50
-rw-r--r--geom_bottleneck/tests/data/test_580_B50
-rw-r--r--geom_bottleneck/tests/data/test_581_A50
-rw-r--r--geom_bottleneck/tests/data/test_581_B50
-rw-r--r--geom_bottleneck/tests/data/test_582_A50
-rw-r--r--geom_bottleneck/tests/data/test_582_B50
-rw-r--r--geom_bottleneck/tests/data/test_583_A50
-rw-r--r--geom_bottleneck/tests/data/test_583_B50
-rw-r--r--geom_bottleneck/tests/data/test_584_A50
-rw-r--r--geom_bottleneck/tests/data/test_584_B50
-rw-r--r--geom_bottleneck/tests/data/test_585_A50
-rw-r--r--geom_bottleneck/tests/data/test_585_B50
-rw-r--r--geom_bottleneck/tests/data/test_586_A50
-rw-r--r--geom_bottleneck/tests/data/test_586_B50
-rw-r--r--geom_bottleneck/tests/data/test_587_A50
-rw-r--r--geom_bottleneck/tests/data/test_587_B50
-rw-r--r--geom_bottleneck/tests/data/test_588_A50
-rw-r--r--geom_bottleneck/tests/data/test_588_B50
-rw-r--r--geom_bottleneck/tests/data/test_589_A50
-rw-r--r--geom_bottleneck/tests/data/test_589_B50
-rw-r--r--geom_bottleneck/tests/data/test_590_A50
-rw-r--r--geom_bottleneck/tests/data/test_590_B50
-rw-r--r--geom_bottleneck/tests/data/test_591_A50
-rw-r--r--geom_bottleneck/tests/data/test_591_B50
-rw-r--r--geom_bottleneck/tests/data/test_592_A50
-rw-r--r--geom_bottleneck/tests/data/test_592_B50
-rw-r--r--geom_bottleneck/tests/data/test_593_A50
-rw-r--r--geom_bottleneck/tests/data/test_593_B50
-rw-r--r--geom_bottleneck/tests/data/test_594_A50
-rw-r--r--geom_bottleneck/tests/data/test_594_B50
-rw-r--r--geom_bottleneck/tests/data/test_595_A50
-rw-r--r--geom_bottleneck/tests/data/test_595_B50
-rw-r--r--geom_bottleneck/tests/data/test_596_A50
-rw-r--r--geom_bottleneck/tests/data/test_596_B50
-rw-r--r--geom_bottleneck/tests/data/test_597_A50
-rw-r--r--geom_bottleneck/tests/data/test_597_B50
-rw-r--r--geom_bottleneck/tests/data/test_598_A50
-rw-r--r--geom_bottleneck/tests/data/test_598_B50
-rw-r--r--geom_bottleneck/tests/data/test_599_A50
-rw-r--r--geom_bottleneck/tests/data/test_599_B50
-rw-r--r--geom_bottleneck/tests/data/test_600_A100
-rw-r--r--geom_bottleneck/tests/data/test_600_B100
-rw-r--r--geom_bottleneck/tests/data/test_601_A100
-rw-r--r--geom_bottleneck/tests/data/test_601_B100
-rw-r--r--geom_bottleneck/tests/data/test_602_A100
-rw-r--r--geom_bottleneck/tests/data/test_602_B100
-rw-r--r--geom_bottleneck/tests/data/test_603_A100
-rw-r--r--geom_bottleneck/tests/data/test_603_B100
-rw-r--r--geom_bottleneck/tests/data/test_604_A100
-rw-r--r--geom_bottleneck/tests/data/test_604_B100
-rw-r--r--geom_bottleneck/tests/data/test_605_A100
-rw-r--r--geom_bottleneck/tests/data/test_605_B100
-rw-r--r--geom_bottleneck/tests/data/test_606_A100
-rw-r--r--geom_bottleneck/tests/data/test_606_B100
-rw-r--r--geom_bottleneck/tests/data/test_607_A100
-rw-r--r--geom_bottleneck/tests/data/test_607_B100
-rw-r--r--geom_bottleneck/tests/data/test_608_A100
-rw-r--r--geom_bottleneck/tests/data/test_608_B100
-rw-r--r--geom_bottleneck/tests/data/test_609_A100
-rw-r--r--geom_bottleneck/tests/data/test_609_B100
-rw-r--r--geom_bottleneck/tests/data/test_610_A100
-rw-r--r--geom_bottleneck/tests/data/test_610_B100
-rw-r--r--geom_bottleneck/tests/data/test_611_A100
-rw-r--r--geom_bottleneck/tests/data/test_611_B100
-rw-r--r--geom_bottleneck/tests/data/test_612_A100
-rw-r--r--geom_bottleneck/tests/data/test_612_B100
-rw-r--r--geom_bottleneck/tests/data/test_613_A100
-rw-r--r--geom_bottleneck/tests/data/test_613_B100
-rw-r--r--geom_bottleneck/tests/data/test_614_A100
-rw-r--r--geom_bottleneck/tests/data/test_614_B100
-rw-r--r--geom_bottleneck/tests/data/test_615_A100
-rw-r--r--geom_bottleneck/tests/data/test_615_B100
-rw-r--r--geom_bottleneck/tests/data/test_616_A100
-rw-r--r--geom_bottleneck/tests/data/test_616_B100
-rw-r--r--geom_bottleneck/tests/data/test_617_A100
-rw-r--r--geom_bottleneck/tests/data/test_617_B100
-rw-r--r--geom_bottleneck/tests/data/test_618_A100
-rw-r--r--geom_bottleneck/tests/data/test_618_B100
-rw-r--r--geom_bottleneck/tests/data/test_619_A100
-rw-r--r--geom_bottleneck/tests/data/test_619_B100
-rw-r--r--geom_bottleneck/tests/data/test_620_A2
-rw-r--r--geom_bottleneck/tests/data/test_620_B2
-rw-r--r--geom_bottleneck/tests/data/test_621_A2
-rw-r--r--geom_bottleneck/tests/data/test_621_B2
-rw-r--r--geom_bottleneck/tests/data/test_622_A2
-rw-r--r--geom_bottleneck/tests/data/test_622_B2
-rw-r--r--geom_bottleneck/tests/data/test_623_A2
-rw-r--r--geom_bottleneck/tests/data/test_623_B2
-rw-r--r--geom_bottleneck/tests/data/test_624_A2
-rw-r--r--geom_bottleneck/tests/data/test_624_B2
-rw-r--r--geom_bottleneck/tests/data/test_625_A2
-rw-r--r--geom_bottleneck/tests/data/test_625_B2
-rw-r--r--geom_bottleneck/tests/data/test_626_A2
-rw-r--r--geom_bottleneck/tests/data/test_626_B2
-rw-r--r--geom_bottleneck/tests/data/test_627_A2
-rw-r--r--geom_bottleneck/tests/data/test_627_B2
-rw-r--r--geom_bottleneck/tests/data/test_628_A2
-rw-r--r--geom_bottleneck/tests/data/test_628_B2
-rw-r--r--geom_bottleneck/tests/data/test_629_A2
-rw-r--r--geom_bottleneck/tests/data/test_629_B2
-rw-r--r--geom_bottleneck/tests/data/test_630_A2
-rw-r--r--geom_bottleneck/tests/data/test_630_B2
-rw-r--r--geom_bottleneck/tests/data/test_631_A2
-rw-r--r--geom_bottleneck/tests/data/test_631_B2
-rw-r--r--geom_bottleneck/tests/data/test_632_A2
-rw-r--r--geom_bottleneck/tests/data/test_632_B2
-rw-r--r--geom_bottleneck/tests/data/test_633_A2
-rw-r--r--geom_bottleneck/tests/data/test_633_B2
-rw-r--r--geom_bottleneck/tests/data/test_634_A2
-rw-r--r--geom_bottleneck/tests/data/test_634_B2
-rw-r--r--geom_bottleneck/tests/data/test_635_A2
-rw-r--r--geom_bottleneck/tests/data/test_635_B2
-rw-r--r--geom_bottleneck/tests/data/test_636_A2
-rw-r--r--geom_bottleneck/tests/data/test_636_B2
-rw-r--r--geom_bottleneck/tests/data/test_637_A2
-rw-r--r--geom_bottleneck/tests/data/test_637_B2
-rw-r--r--geom_bottleneck/tests/data/test_638_A2
-rw-r--r--geom_bottleneck/tests/data/test_638_B2
-rw-r--r--geom_bottleneck/tests/data/test_639_A2
-rw-r--r--geom_bottleneck/tests/data/test_639_B2
-rw-r--r--geom_bottleneck/tests/data/test_640_A3
-rw-r--r--geom_bottleneck/tests/data/test_640_B3
-rw-r--r--geom_bottleneck/tests/data/test_641_A3
-rw-r--r--geom_bottleneck/tests/data/test_641_B3
-rw-r--r--geom_bottleneck/tests/data/test_642_A3
-rw-r--r--geom_bottleneck/tests/data/test_642_B3
-rw-r--r--geom_bottleneck/tests/data/test_643_A3
-rw-r--r--geom_bottleneck/tests/data/test_643_B3
-rw-r--r--geom_bottleneck/tests/data/test_644_A3
-rw-r--r--geom_bottleneck/tests/data/test_644_B3
-rw-r--r--geom_bottleneck/tests/data/test_645_A3
-rw-r--r--geom_bottleneck/tests/data/test_645_B3
-rw-r--r--geom_bottleneck/tests/data/test_646_A3
-rw-r--r--geom_bottleneck/tests/data/test_646_B3
-rw-r--r--geom_bottleneck/tests/data/test_647_A3
-rw-r--r--geom_bottleneck/tests/data/test_647_B3
-rw-r--r--geom_bottleneck/tests/data/test_648_A3
-rw-r--r--geom_bottleneck/tests/data/test_648_B3
-rw-r--r--geom_bottleneck/tests/data/test_649_A3
-rw-r--r--geom_bottleneck/tests/data/test_649_B3
-rw-r--r--geom_bottleneck/tests/data/test_650_A3
-rw-r--r--geom_bottleneck/tests/data/test_650_B3
-rw-r--r--geom_bottleneck/tests/data/test_651_A3
-rw-r--r--geom_bottleneck/tests/data/test_651_B3
-rw-r--r--geom_bottleneck/tests/data/test_652_A3
-rw-r--r--geom_bottleneck/tests/data/test_652_B3
-rw-r--r--geom_bottleneck/tests/data/test_653_A3
-rw-r--r--geom_bottleneck/tests/data/test_653_B3
-rw-r--r--geom_bottleneck/tests/data/test_654_A3
-rw-r--r--geom_bottleneck/tests/data/test_654_B3
-rw-r--r--geom_bottleneck/tests/data/test_655_A3
-rw-r--r--geom_bottleneck/tests/data/test_655_B3
-rw-r--r--geom_bottleneck/tests/data/test_656_A3
-rw-r--r--geom_bottleneck/tests/data/test_656_B3
-rw-r--r--geom_bottleneck/tests/data/test_657_A3
-rw-r--r--geom_bottleneck/tests/data/test_657_B3
-rw-r--r--geom_bottleneck/tests/data/test_658_A3
-rw-r--r--geom_bottleneck/tests/data/test_658_B3
-rw-r--r--geom_bottleneck/tests/data/test_659_A3
-rw-r--r--geom_bottleneck/tests/data/test_659_B3
-rw-r--r--geom_bottleneck/tests/data/test_660_A4
-rw-r--r--geom_bottleneck/tests/data/test_660_B4
-rw-r--r--geom_bottleneck/tests/data/test_661_A4
-rw-r--r--geom_bottleneck/tests/data/test_661_B4
-rw-r--r--geom_bottleneck/tests/data/test_662_A4
-rw-r--r--geom_bottleneck/tests/data/test_662_B4
-rw-r--r--geom_bottleneck/tests/data/test_663_A4
-rw-r--r--geom_bottleneck/tests/data/test_663_B4
-rw-r--r--geom_bottleneck/tests/data/test_664_A4
-rw-r--r--geom_bottleneck/tests/data/test_664_B4
-rw-r--r--geom_bottleneck/tests/data/test_665_A4
-rw-r--r--geom_bottleneck/tests/data/test_665_B4
-rw-r--r--geom_bottleneck/tests/data/test_666_A4
-rw-r--r--geom_bottleneck/tests/data/test_666_B4
-rw-r--r--geom_bottleneck/tests/data/test_667_A4
-rw-r--r--geom_bottleneck/tests/data/test_667_B4
-rw-r--r--geom_bottleneck/tests/data/test_668_A4
-rw-r--r--geom_bottleneck/tests/data/test_668_B4
-rw-r--r--geom_bottleneck/tests/data/test_669_A4
-rw-r--r--geom_bottleneck/tests/data/test_669_B4
-rw-r--r--geom_bottleneck/tests/data/test_670_A4
-rw-r--r--geom_bottleneck/tests/data/test_670_B4
-rw-r--r--geom_bottleneck/tests/data/test_671_A4
-rw-r--r--geom_bottleneck/tests/data/test_671_B4
-rw-r--r--geom_bottleneck/tests/data/test_672_A4
-rw-r--r--geom_bottleneck/tests/data/test_672_B4
-rw-r--r--geom_bottleneck/tests/data/test_673_A4
-rw-r--r--geom_bottleneck/tests/data/test_673_B4
-rw-r--r--geom_bottleneck/tests/data/test_674_A4
-rw-r--r--geom_bottleneck/tests/data/test_674_B4
-rw-r--r--geom_bottleneck/tests/data/test_675_A4
-rw-r--r--geom_bottleneck/tests/data/test_675_B4
-rw-r--r--geom_bottleneck/tests/data/test_676_A4
-rw-r--r--geom_bottleneck/tests/data/test_676_B4
-rw-r--r--geom_bottleneck/tests/data/test_677_A4
-rw-r--r--geom_bottleneck/tests/data/test_677_B4
-rw-r--r--geom_bottleneck/tests/data/test_678_A4
-rw-r--r--geom_bottleneck/tests/data/test_678_B4
-rw-r--r--geom_bottleneck/tests/data/test_679_A4
-rw-r--r--geom_bottleneck/tests/data/test_679_B4
-rw-r--r--geom_bottleneck/tests/data/test_680_A5
-rw-r--r--geom_bottleneck/tests/data/test_680_B5
-rw-r--r--geom_bottleneck/tests/data/test_681_A5
-rw-r--r--geom_bottleneck/tests/data/test_681_B5
-rw-r--r--geom_bottleneck/tests/data/test_682_A5
-rw-r--r--geom_bottleneck/tests/data/test_682_B5
-rw-r--r--geom_bottleneck/tests/data/test_683_A5
-rw-r--r--geom_bottleneck/tests/data/test_683_B5
-rw-r--r--geom_bottleneck/tests/data/test_684_A5
-rw-r--r--geom_bottleneck/tests/data/test_684_B5
-rw-r--r--geom_bottleneck/tests/data/test_685_A5
-rw-r--r--geom_bottleneck/tests/data/test_685_B5
-rw-r--r--geom_bottleneck/tests/data/test_686_A5
-rw-r--r--geom_bottleneck/tests/data/test_686_B5
-rw-r--r--geom_bottleneck/tests/data/test_687_A5
-rw-r--r--geom_bottleneck/tests/data/test_687_B5
-rw-r--r--geom_bottleneck/tests/data/test_688_A5
-rw-r--r--geom_bottleneck/tests/data/test_688_B5
-rw-r--r--geom_bottleneck/tests/data/test_689_A5
-rw-r--r--geom_bottleneck/tests/data/test_689_B5
-rw-r--r--geom_bottleneck/tests/data/test_690_A5
-rw-r--r--geom_bottleneck/tests/data/test_690_B5
-rw-r--r--geom_bottleneck/tests/data/test_691_A5
-rw-r--r--geom_bottleneck/tests/data/test_691_B5
-rw-r--r--geom_bottleneck/tests/data/test_692_A5
-rw-r--r--geom_bottleneck/tests/data/test_692_B5
-rw-r--r--geom_bottleneck/tests/data/test_693_A5
-rw-r--r--geom_bottleneck/tests/data/test_693_B5
-rw-r--r--geom_bottleneck/tests/data/test_694_A5
-rw-r--r--geom_bottleneck/tests/data/test_694_B5
-rw-r--r--geom_bottleneck/tests/data/test_695_A5
-rw-r--r--geom_bottleneck/tests/data/test_695_B5
-rw-r--r--geom_bottleneck/tests/data/test_696_A5
-rw-r--r--geom_bottleneck/tests/data/test_696_B5
-rw-r--r--geom_bottleneck/tests/data/test_697_A5
-rw-r--r--geom_bottleneck/tests/data/test_697_B5
-rw-r--r--geom_bottleneck/tests/data/test_698_A5
-rw-r--r--geom_bottleneck/tests/data/test_698_B5
-rw-r--r--geom_bottleneck/tests/data/test_699_A5
-rw-r--r--geom_bottleneck/tests/data/test_699_B5
-rw-r--r--geom_bottleneck/tests/data/test_700_A6
-rw-r--r--geom_bottleneck/tests/data/test_700_B6
-rw-r--r--geom_bottleneck/tests/data/test_701_A6
-rw-r--r--geom_bottleneck/tests/data/test_701_B6
-rw-r--r--geom_bottleneck/tests/data/test_702_A6
-rw-r--r--geom_bottleneck/tests/data/test_702_B6
-rw-r--r--geom_bottleneck/tests/data/test_703_A6
-rw-r--r--geom_bottleneck/tests/data/test_703_B6
-rw-r--r--geom_bottleneck/tests/data/test_704_A6
-rw-r--r--geom_bottleneck/tests/data/test_704_B6
-rw-r--r--geom_bottleneck/tests/data/test_705_A6
-rw-r--r--geom_bottleneck/tests/data/test_705_B6
-rw-r--r--geom_bottleneck/tests/data/test_706_A6
-rw-r--r--geom_bottleneck/tests/data/test_706_B6
-rw-r--r--geom_bottleneck/tests/data/test_707_A6
-rw-r--r--geom_bottleneck/tests/data/test_707_B6
-rw-r--r--geom_bottleneck/tests/data/test_708_A6
-rw-r--r--geom_bottleneck/tests/data/test_708_B6
-rw-r--r--geom_bottleneck/tests/data/test_709_A6
-rw-r--r--geom_bottleneck/tests/data/test_709_B6
-rw-r--r--geom_bottleneck/tests/data/test_710_A6
-rw-r--r--geom_bottleneck/tests/data/test_710_B6
-rw-r--r--geom_bottleneck/tests/data/test_711_A6
-rw-r--r--geom_bottleneck/tests/data/test_711_B6
-rw-r--r--geom_bottleneck/tests/data/test_712_A6
-rw-r--r--geom_bottleneck/tests/data/test_712_B6
-rw-r--r--geom_bottleneck/tests/data/test_713_A6
-rw-r--r--geom_bottleneck/tests/data/test_713_B6
-rw-r--r--geom_bottleneck/tests/data/test_714_A6
-rw-r--r--geom_bottleneck/tests/data/test_714_B6
-rw-r--r--geom_bottleneck/tests/data/test_715_A6
-rw-r--r--geom_bottleneck/tests/data/test_715_B6
-rw-r--r--geom_bottleneck/tests/data/test_716_A6
-rw-r--r--geom_bottleneck/tests/data/test_716_B6
-rw-r--r--geom_bottleneck/tests/data/test_717_A6
-rw-r--r--geom_bottleneck/tests/data/test_717_B6
-rw-r--r--geom_bottleneck/tests/data/test_718_A6
-rw-r--r--geom_bottleneck/tests/data/test_718_B6
-rw-r--r--geom_bottleneck/tests/data/test_719_A6
-rw-r--r--geom_bottleneck/tests/data/test_719_B6
-rw-r--r--geom_bottleneck/tests/data/test_720_A7
-rw-r--r--geom_bottleneck/tests/data/test_720_B7
-rw-r--r--geom_bottleneck/tests/data/test_721_A7
-rw-r--r--geom_bottleneck/tests/data/test_721_B7
-rw-r--r--geom_bottleneck/tests/data/test_722_A7
-rw-r--r--geom_bottleneck/tests/data/test_722_B7
-rw-r--r--geom_bottleneck/tests/data/test_723_A7
-rw-r--r--geom_bottleneck/tests/data/test_723_B7
-rw-r--r--geom_bottleneck/tests/data/test_724_A7
-rw-r--r--geom_bottleneck/tests/data/test_724_B7
-rw-r--r--geom_bottleneck/tests/data/test_725_A7
-rw-r--r--geom_bottleneck/tests/data/test_725_B7
-rw-r--r--geom_bottleneck/tests/data/test_726_A7
-rw-r--r--geom_bottleneck/tests/data/test_726_B7
-rw-r--r--geom_bottleneck/tests/data/test_727_A7
-rw-r--r--geom_bottleneck/tests/data/test_727_B7
-rw-r--r--geom_bottleneck/tests/data/test_728_A7
-rw-r--r--geom_bottleneck/tests/data/test_728_B7
-rw-r--r--geom_bottleneck/tests/data/test_729_A7
-rw-r--r--geom_bottleneck/tests/data/test_729_B7
-rw-r--r--geom_bottleneck/tests/data/test_730_A7
-rw-r--r--geom_bottleneck/tests/data/test_730_B7
-rw-r--r--geom_bottleneck/tests/data/test_731_A7
-rw-r--r--geom_bottleneck/tests/data/test_731_B7
-rw-r--r--geom_bottleneck/tests/data/test_732_A7
-rw-r--r--geom_bottleneck/tests/data/test_732_B7
-rw-r--r--geom_bottleneck/tests/data/test_733_A7
-rw-r--r--geom_bottleneck/tests/data/test_733_B7
-rw-r--r--geom_bottleneck/tests/data/test_734_A7
-rw-r--r--geom_bottleneck/tests/data/test_734_B7
-rw-r--r--geom_bottleneck/tests/data/test_735_A7
-rw-r--r--geom_bottleneck/tests/data/test_735_B7
-rw-r--r--geom_bottleneck/tests/data/test_736_A7
-rw-r--r--geom_bottleneck/tests/data/test_736_B7
-rw-r--r--geom_bottleneck/tests/data/test_737_A7
-rw-r--r--geom_bottleneck/tests/data/test_737_B7
-rw-r--r--geom_bottleneck/tests/data/test_738_A7
-rw-r--r--geom_bottleneck/tests/data/test_738_B7
-rw-r--r--geom_bottleneck/tests/data/test_739_A7
-rw-r--r--geom_bottleneck/tests/data/test_739_B7
-rw-r--r--geom_bottleneck/tests/data/test_740_A8
-rw-r--r--geom_bottleneck/tests/data/test_740_B8
-rw-r--r--geom_bottleneck/tests/data/test_741_A8
-rw-r--r--geom_bottleneck/tests/data/test_741_B8
-rw-r--r--geom_bottleneck/tests/data/test_742_A8
-rw-r--r--geom_bottleneck/tests/data/test_742_B8
-rw-r--r--geom_bottleneck/tests/data/test_743_A8
-rw-r--r--geom_bottleneck/tests/data/test_743_B8
-rw-r--r--geom_bottleneck/tests/data/test_744_A8
-rw-r--r--geom_bottleneck/tests/data/test_744_B8
-rw-r--r--geom_bottleneck/tests/data/test_745_A8
-rw-r--r--geom_bottleneck/tests/data/test_745_B8
-rw-r--r--geom_bottleneck/tests/data/test_746_A8
-rw-r--r--geom_bottleneck/tests/data/test_746_B8
-rw-r--r--geom_bottleneck/tests/data/test_747_A8
-rw-r--r--geom_bottleneck/tests/data/test_747_B8
-rw-r--r--geom_bottleneck/tests/data/test_748_A8
-rw-r--r--geom_bottleneck/tests/data/test_748_B8
-rw-r--r--geom_bottleneck/tests/data/test_749_A8
-rw-r--r--geom_bottleneck/tests/data/test_749_B8
-rw-r--r--geom_bottleneck/tests/data/test_750_A8
-rw-r--r--geom_bottleneck/tests/data/test_750_B8
-rw-r--r--geom_bottleneck/tests/data/test_751_A8
-rw-r--r--geom_bottleneck/tests/data/test_751_B8
-rw-r--r--geom_bottleneck/tests/data/test_752_A8
-rw-r--r--geom_bottleneck/tests/data/test_752_B8
-rw-r--r--geom_bottleneck/tests/data/test_753_A8
-rw-r--r--geom_bottleneck/tests/data/test_753_B8
-rw-r--r--geom_bottleneck/tests/data/test_754_A8
-rw-r--r--geom_bottleneck/tests/data/test_754_B8
-rw-r--r--geom_bottleneck/tests/data/test_755_A8
-rw-r--r--geom_bottleneck/tests/data/test_755_B8
-rw-r--r--geom_bottleneck/tests/data/test_756_A8
-rw-r--r--geom_bottleneck/tests/data/test_756_B8
-rw-r--r--geom_bottleneck/tests/data/test_757_A8
-rw-r--r--geom_bottleneck/tests/data/test_757_B8
-rw-r--r--geom_bottleneck/tests/data/test_758_A8
-rw-r--r--geom_bottleneck/tests/data/test_758_B8
-rw-r--r--geom_bottleneck/tests/data/test_759_A8
-rw-r--r--geom_bottleneck/tests/data/test_759_B8
-rw-r--r--geom_bottleneck/tests/data/test_760_A9
-rw-r--r--geom_bottleneck/tests/data/test_760_B9
-rw-r--r--geom_bottleneck/tests/data/test_761_A9
-rw-r--r--geom_bottleneck/tests/data/test_761_B9
-rw-r--r--geom_bottleneck/tests/data/test_762_A9
-rw-r--r--geom_bottleneck/tests/data/test_762_B9
-rw-r--r--geom_bottleneck/tests/data/test_763_A9
-rw-r--r--geom_bottleneck/tests/data/test_763_B9
-rw-r--r--geom_bottleneck/tests/data/test_764_A9
-rw-r--r--geom_bottleneck/tests/data/test_764_B9
-rw-r--r--geom_bottleneck/tests/data/test_765_A9
-rw-r--r--geom_bottleneck/tests/data/test_765_B9
-rw-r--r--geom_bottleneck/tests/data/test_766_A9
-rw-r--r--geom_bottleneck/tests/data/test_766_B9
-rw-r--r--geom_bottleneck/tests/data/test_767_A9
-rw-r--r--geom_bottleneck/tests/data/test_767_B9
-rw-r--r--geom_bottleneck/tests/data/test_768_A9
-rw-r--r--geom_bottleneck/tests/data/test_768_B9
-rw-r--r--geom_bottleneck/tests/data/test_769_A9
-rw-r--r--geom_bottleneck/tests/data/test_769_B9
-rw-r--r--geom_bottleneck/tests/data/test_770_A9
-rw-r--r--geom_bottleneck/tests/data/test_770_B9
-rw-r--r--geom_bottleneck/tests/data/test_771_A9
-rw-r--r--geom_bottleneck/tests/data/test_771_B9
-rw-r--r--geom_bottleneck/tests/data/test_772_A9
-rw-r--r--geom_bottleneck/tests/data/test_772_B9
-rw-r--r--geom_bottleneck/tests/data/test_773_A9
-rw-r--r--geom_bottleneck/tests/data/test_773_B9
-rw-r--r--geom_bottleneck/tests/data/test_774_A9
-rw-r--r--geom_bottleneck/tests/data/test_774_B9
-rw-r--r--geom_bottleneck/tests/data/test_775_A9
-rw-r--r--geom_bottleneck/tests/data/test_775_B9
-rw-r--r--geom_bottleneck/tests/data/test_776_A9
-rw-r--r--geom_bottleneck/tests/data/test_776_B9
-rw-r--r--geom_bottleneck/tests/data/test_777_A9
-rw-r--r--geom_bottleneck/tests/data/test_777_B9
-rw-r--r--geom_bottleneck/tests/data/test_778_A9
-rw-r--r--geom_bottleneck/tests/data/test_778_B9
-rw-r--r--geom_bottleneck/tests/data/test_779_A9
-rw-r--r--geom_bottleneck/tests/data/test_779_B9
-rw-r--r--geom_bottleneck/tests/data/test_780_A10
-rw-r--r--geom_bottleneck/tests/data/test_780_B10
-rw-r--r--geom_bottleneck/tests/data/test_781_A10
-rw-r--r--geom_bottleneck/tests/data/test_781_B10
-rw-r--r--geom_bottleneck/tests/data/test_782_A10
-rw-r--r--geom_bottleneck/tests/data/test_782_B10
-rw-r--r--geom_bottleneck/tests/data/test_783_A10
-rw-r--r--geom_bottleneck/tests/data/test_783_B10
-rw-r--r--geom_bottleneck/tests/data/test_784_A10
-rw-r--r--geom_bottleneck/tests/data/test_784_B10
-rw-r--r--geom_bottleneck/tests/data/test_785_A10
-rw-r--r--geom_bottleneck/tests/data/test_785_B10
-rw-r--r--geom_bottleneck/tests/data/test_786_A10
-rw-r--r--geom_bottleneck/tests/data/test_786_B10
-rw-r--r--geom_bottleneck/tests/data/test_787_A10
-rw-r--r--geom_bottleneck/tests/data/test_787_B10
-rw-r--r--geom_bottleneck/tests/data/test_788_A10
-rw-r--r--geom_bottleneck/tests/data/test_788_B10
-rw-r--r--geom_bottleneck/tests/data/test_789_A10
-rw-r--r--geom_bottleneck/tests/data/test_789_B10
-rw-r--r--geom_bottleneck/tests/data/test_790_A10
-rw-r--r--geom_bottleneck/tests/data/test_790_B10
-rw-r--r--geom_bottleneck/tests/data/test_791_A10
-rw-r--r--geom_bottleneck/tests/data/test_791_B10
-rw-r--r--geom_bottleneck/tests/data/test_792_A10
-rw-r--r--geom_bottleneck/tests/data/test_792_B10
-rw-r--r--geom_bottleneck/tests/data/test_793_A10
-rw-r--r--geom_bottleneck/tests/data/test_793_B10
-rw-r--r--geom_bottleneck/tests/data/test_794_A10
-rw-r--r--geom_bottleneck/tests/data/test_794_B10
-rw-r--r--geom_bottleneck/tests/data/test_795_A10
-rw-r--r--geom_bottleneck/tests/data/test_795_B10
-rw-r--r--geom_bottleneck/tests/data/test_796_A10
-rw-r--r--geom_bottleneck/tests/data/test_796_B10
-rw-r--r--geom_bottleneck/tests/data/test_797_A10
-rw-r--r--geom_bottleneck/tests/data/test_797_B10
-rw-r--r--geom_bottleneck/tests/data/test_798_A10
-rw-r--r--geom_bottleneck/tests/data/test_798_B10
-rw-r--r--geom_bottleneck/tests/data/test_799_A10
-rw-r--r--geom_bottleneck/tests/data/test_799_B10
-rw-r--r--geom_bottleneck/tests/data/test_800_A20
-rw-r--r--geom_bottleneck/tests/data/test_800_B20
-rw-r--r--geom_bottleneck/tests/data/test_801_A20
-rw-r--r--geom_bottleneck/tests/data/test_801_B20
-rw-r--r--geom_bottleneck/tests/data/test_802_A20
-rw-r--r--geom_bottleneck/tests/data/test_802_B20
-rw-r--r--geom_bottleneck/tests/data/test_803_A20
-rw-r--r--geom_bottleneck/tests/data/test_803_B20
-rw-r--r--geom_bottleneck/tests/data/test_804_A20
-rw-r--r--geom_bottleneck/tests/data/test_804_B20
-rw-r--r--geom_bottleneck/tests/data/test_805_A20
-rw-r--r--geom_bottleneck/tests/data/test_805_B20
-rw-r--r--geom_bottleneck/tests/data/test_806_A20
-rw-r--r--geom_bottleneck/tests/data/test_806_B20
-rw-r--r--geom_bottleneck/tests/data/test_807_A20
-rw-r--r--geom_bottleneck/tests/data/test_807_B20
-rw-r--r--geom_bottleneck/tests/data/test_808_A20
-rw-r--r--geom_bottleneck/tests/data/test_808_B20
-rw-r--r--geom_bottleneck/tests/data/test_809_A20
-rw-r--r--geom_bottleneck/tests/data/test_809_B20
-rw-r--r--geom_bottleneck/tests/data/test_810_A20
-rw-r--r--geom_bottleneck/tests/data/test_810_B20
-rw-r--r--geom_bottleneck/tests/data/test_811_A20
-rw-r--r--geom_bottleneck/tests/data/test_811_B20
-rw-r--r--geom_bottleneck/tests/data/test_812_A20
-rw-r--r--geom_bottleneck/tests/data/test_812_B20
-rw-r--r--geom_bottleneck/tests/data/test_813_A20
-rw-r--r--geom_bottleneck/tests/data/test_813_B20
-rw-r--r--geom_bottleneck/tests/data/test_814_A20
-rw-r--r--geom_bottleneck/tests/data/test_814_B20
-rw-r--r--geom_bottleneck/tests/data/test_815_A20
-rw-r--r--geom_bottleneck/tests/data/test_815_B20
-rw-r--r--geom_bottleneck/tests/data/test_816_A20
-rw-r--r--geom_bottleneck/tests/data/test_816_B20
-rw-r--r--geom_bottleneck/tests/data/test_817_A20
-rw-r--r--geom_bottleneck/tests/data/test_817_B20
-rw-r--r--geom_bottleneck/tests/data/test_818_A20
-rw-r--r--geom_bottleneck/tests/data/test_818_B20
-rw-r--r--geom_bottleneck/tests/data/test_819_A20
-rw-r--r--geom_bottleneck/tests/data/test_819_B20
-rw-r--r--geom_bottleneck/tests/data/test_820_A30
-rw-r--r--geom_bottleneck/tests/data/test_820_B30
-rw-r--r--geom_bottleneck/tests/data/test_821_A30
-rw-r--r--geom_bottleneck/tests/data/test_821_B30
-rw-r--r--geom_bottleneck/tests/data/test_822_A30
-rw-r--r--geom_bottleneck/tests/data/test_822_B30
-rw-r--r--geom_bottleneck/tests/data/test_823_A30
-rw-r--r--geom_bottleneck/tests/data/test_823_B30
-rw-r--r--geom_bottleneck/tests/data/test_824_A30
-rw-r--r--geom_bottleneck/tests/data/test_824_B30
-rw-r--r--geom_bottleneck/tests/data/test_825_A30
-rw-r--r--geom_bottleneck/tests/data/test_825_B30
-rw-r--r--geom_bottleneck/tests/data/test_826_A30
-rw-r--r--geom_bottleneck/tests/data/test_826_B30
-rw-r--r--geom_bottleneck/tests/data/test_827_A30
-rw-r--r--geom_bottleneck/tests/data/test_827_B30
-rw-r--r--geom_bottleneck/tests/data/test_828_A30
-rw-r--r--geom_bottleneck/tests/data/test_828_B30
-rw-r--r--geom_bottleneck/tests/data/test_829_A30
-rw-r--r--geom_bottleneck/tests/data/test_829_B30
-rw-r--r--geom_bottleneck/tests/data/test_830_A30
-rw-r--r--geom_bottleneck/tests/data/test_830_B30
-rw-r--r--geom_bottleneck/tests/data/test_831_A30
-rw-r--r--geom_bottleneck/tests/data/test_831_B30
-rw-r--r--geom_bottleneck/tests/data/test_832_A30
-rw-r--r--geom_bottleneck/tests/data/test_832_B30
-rw-r--r--geom_bottleneck/tests/data/test_833_A30
-rw-r--r--geom_bottleneck/tests/data/test_833_B30
-rw-r--r--geom_bottleneck/tests/data/test_834_A30
-rw-r--r--geom_bottleneck/tests/data/test_834_B30
-rw-r--r--geom_bottleneck/tests/data/test_835_A30
-rw-r--r--geom_bottleneck/tests/data/test_835_B30
-rw-r--r--geom_bottleneck/tests/data/test_836_A30
-rw-r--r--geom_bottleneck/tests/data/test_836_B30
-rw-r--r--geom_bottleneck/tests/data/test_837_A30
-rw-r--r--geom_bottleneck/tests/data/test_837_B30
-rw-r--r--geom_bottleneck/tests/data/test_838_A30
-rw-r--r--geom_bottleneck/tests/data/test_838_B30
-rw-r--r--geom_bottleneck/tests/data/test_839_A30
-rw-r--r--geom_bottleneck/tests/data/test_839_B30
-rw-r--r--geom_bottleneck/tests/data/test_840_A50
-rw-r--r--geom_bottleneck/tests/data/test_840_B50
-rw-r--r--geom_bottleneck/tests/data/test_841_A50
-rw-r--r--geom_bottleneck/tests/data/test_841_B50
-rw-r--r--geom_bottleneck/tests/data/test_842_A50
-rw-r--r--geom_bottleneck/tests/data/test_842_B50
-rw-r--r--geom_bottleneck/tests/data/test_843_A50
-rw-r--r--geom_bottleneck/tests/data/test_843_B50
-rw-r--r--geom_bottleneck/tests/data/test_844_A50
-rw-r--r--geom_bottleneck/tests/data/test_844_B50
-rw-r--r--geom_bottleneck/tests/data/test_845_A50
-rw-r--r--geom_bottleneck/tests/data/test_845_B50
-rw-r--r--geom_bottleneck/tests/data/test_846_A50
-rw-r--r--geom_bottleneck/tests/data/test_846_B50
-rw-r--r--geom_bottleneck/tests/data/test_847_A50
-rw-r--r--geom_bottleneck/tests/data/test_847_B50
-rw-r--r--geom_bottleneck/tests/data/test_848_A50
-rw-r--r--geom_bottleneck/tests/data/test_848_B50
-rw-r--r--geom_bottleneck/tests/data/test_849_A50
-rw-r--r--geom_bottleneck/tests/data/test_849_B50
-rw-r--r--geom_bottleneck/tests/data/test_850_A50
-rw-r--r--geom_bottleneck/tests/data/test_850_B50
-rw-r--r--geom_bottleneck/tests/data/test_851_A50
-rw-r--r--geom_bottleneck/tests/data/test_851_B50
-rw-r--r--geom_bottleneck/tests/data/test_852_A50
-rw-r--r--geom_bottleneck/tests/data/test_852_B50
-rw-r--r--geom_bottleneck/tests/data/test_853_A50
-rw-r--r--geom_bottleneck/tests/data/test_853_B50
-rw-r--r--geom_bottleneck/tests/data/test_854_A50
-rw-r--r--geom_bottleneck/tests/data/test_854_B50
-rw-r--r--geom_bottleneck/tests/data/test_855_A50
-rw-r--r--geom_bottleneck/tests/data/test_855_B50
-rw-r--r--geom_bottleneck/tests/data/test_856_A50
-rw-r--r--geom_bottleneck/tests/data/test_856_B50
-rw-r--r--geom_bottleneck/tests/data/test_857_A50
-rw-r--r--geom_bottleneck/tests/data/test_857_B50
-rw-r--r--geom_bottleneck/tests/data/test_858_A50
-rw-r--r--geom_bottleneck/tests/data/test_858_B50
-rw-r--r--geom_bottleneck/tests/data/test_859_A50
-rw-r--r--geom_bottleneck/tests/data/test_859_B50
-rw-r--r--geom_bottleneck/tests/data/test_860_A100
-rw-r--r--geom_bottleneck/tests/data/test_860_B100
-rw-r--r--geom_bottleneck/tests/data/test_861_A100
-rw-r--r--geom_bottleneck/tests/data/test_861_B100
-rw-r--r--geom_bottleneck/tests/data/test_862_A100
-rw-r--r--geom_bottleneck/tests/data/test_862_B100
-rw-r--r--geom_bottleneck/tests/data/test_863_A100
-rw-r--r--geom_bottleneck/tests/data/test_863_B100
-rw-r--r--geom_bottleneck/tests/data/test_864_A100
-rw-r--r--geom_bottleneck/tests/data/test_864_B100
-rw-r--r--geom_bottleneck/tests/data/test_865_A100
-rw-r--r--geom_bottleneck/tests/data/test_865_B100
-rw-r--r--geom_bottleneck/tests/data/test_866_A100
-rw-r--r--geom_bottleneck/tests/data/test_866_B100
-rw-r--r--geom_bottleneck/tests/data/test_867_A100
-rw-r--r--geom_bottleneck/tests/data/test_867_B100
-rw-r--r--geom_bottleneck/tests/data/test_868_A100
-rw-r--r--geom_bottleneck/tests/data/test_868_B100
-rw-r--r--geom_bottleneck/tests/data/test_869_A100
-rw-r--r--geom_bottleneck/tests/data/test_869_B100
-rw-r--r--geom_bottleneck/tests/data/test_870_A100
-rw-r--r--geom_bottleneck/tests/data/test_870_B100
-rw-r--r--geom_bottleneck/tests/data/test_871_A100
-rw-r--r--geom_bottleneck/tests/data/test_871_B100
-rw-r--r--geom_bottleneck/tests/data/test_872_A100
-rw-r--r--geom_bottleneck/tests/data/test_872_B100
-rw-r--r--geom_bottleneck/tests/data/test_873_A100
-rw-r--r--geom_bottleneck/tests/data/test_873_B100
-rw-r--r--geom_bottleneck/tests/data/test_874_A100
-rw-r--r--geom_bottleneck/tests/data/test_874_B100
-rw-r--r--geom_bottleneck/tests/data/test_875_A100
-rw-r--r--geom_bottleneck/tests/data/test_875_B100
-rw-r--r--geom_bottleneck/tests/data/test_876_A100
-rw-r--r--geom_bottleneck/tests/data/test_876_B100
-rw-r--r--geom_bottleneck/tests/data/test_877_A100
-rw-r--r--geom_bottleneck/tests/data/test_877_B100
-rw-r--r--geom_bottleneck/tests/data/test_878_A100
-rw-r--r--geom_bottleneck/tests/data/test_878_B100
-rw-r--r--geom_bottleneck/tests/data/test_879_A100
-rw-r--r--geom_bottleneck/tests/data/test_879_B100
-rw-r--r--geom_bottleneck/tests/data/test_list.txt792
-rw-r--r--geom_bottleneck/tests/data/test_list.txt.bak792
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_100_A100
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_100_A.pd.diphabin0 -> 2424 bytes
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_100_B100
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_100_B.pd.diphabin0 -> 2424 bytes
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_200_A200
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_200_B200
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_5000_A5000
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_5000_B5000
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_5_A5
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_5_A.pd.diphabin0 -> 144 bytes
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_5_B5
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_5_B.pd.diphabin0 -> 144 bytes
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_diag1_A1
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_diag1_A.pd.diphabin0 -> 48 bytes
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_diag1_B1
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_diag1_B.pd.diphabin0 -> 48 bytes
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_diag2_A1
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_diag2_A.pd.diphabin0 -> 48 bytes
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_diag2_B1
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_diag2_B.pd.diphabin0 -> 48 bytes
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_diag3_A220
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_diag3_A.pd.diphabin0 -> 5304 bytes
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_diag3_B193
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_diag3_B.pd.diphabin0 -> 4656 bytes
-rw-r--r--geom_bottleneck/tests/data/ws_tests/test_list.txt21
-rw-r--r--geom_bottleneck/tests/test_hera_bottleneck.cpp611
-rw-r--r--geom_bottleneck/tests/tests_main.cpp3
-rw-r--r--geom_matching/wasserstein/CMakeLists.txt8
-rw-r--r--geom_matching/wasserstein/example/wasserstein_dist_point_cloud.cpp2
-rw-r--r--geom_matching/wasserstein/include/auction_oracle_kdtree_pure_geom.hpp17
-rw-r--r--geom_matching/wasserstein/include/auction_oracle_kdtree_restricted.hpp8
-rw-r--r--geom_matching/wasserstein/include/auction_runner_gs.hpp17
-rw-r--r--geom_matching/wasserstein/include/auction_runner_jac.hpp10
-rw-r--r--geom_matching/wasserstein/include/basic_defs_ws.h47
-rw-r--r--geom_matching/wasserstein/include/basic_defs_ws.hpp18
-rw-r--r--geom_matching/wasserstein/include/diagonal_heap.h2
-rw-r--r--geom_matching/wasserstein/include/diagram_reader.h32
-rw-r--r--geom_matching/wasserstein/include/dnn/geometry/euclidean-dynamic.h24
-rw-r--r--geom_matching/wasserstein/include/dnn/local/kd-tree.hpp2
-rw-r--r--geom_matching/wasserstein/include/hera_infinity.h22
-rw-r--r--geom_matching/wasserstein/include/wasserstein.h14
-rw-r--r--geom_matching/wasserstein/include/wasserstein_pure_geom.hpp5
-rw-r--r--geom_matching/wasserstein/tests/test_hera_wasserstein.cpp53
-rw-r--r--geom_matching/wasserstein/tests/test_hera_wasserstein_pure_geom.cpp111
-rw-r--r--geom_matching/wasserstein/tests/tests_reader.h67
1651 files changed, 68350 insertions, 1744 deletions
diff --git a/geom_bottleneck/CMakeLists.txt b/geom_bottleneck/CMakeLists.txt
index 62dc2f2..7a820ac 100644
--- a/geom_bottleneck/CMakeLists.txt
+++ b/geom_bottleneck/CMakeLists.txt
@@ -33,3 +33,6 @@ set (libraries ${libraries} ${CMAKE_THREAD_LIBS_INIT})
add_executable(bottleneck_dist ${CMAKE_CURRENT_SOURCE_DIR}/example/bottleneck_dist.cpp ${WS_HEADERS})
target_link_libraries(bottleneck_dist PUBLIC ${libraries})
+
+add_executable(bottleneck_test ${CMAKE_CURRENT_SOURCE_DIR}/tests/tests_main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_hera_bottleneck.cpp)
+target_link_libraries(bottleneck_test PUBLIC ${libraries})
diff --git a/geom_bottleneck/example/bottleneck_dist.cpp b/geom_bottleneck/example/bottleneck_dist.cpp
index b66e7bc..8966789 100644
--- a/geom_bottleneck/example/bottleneck_dist.cpp
+++ b/geom_bottleneck/example/bottleneck_dist.cpp
@@ -48,35 +48,27 @@ int main(int argc, char* argv[])
PairVector diagramA, diagramB;
int decPrecision { 0 };
- if (!hera::bt::readDiagramPointSet(argv[1], diagramA, decPrecision)) {
+ if (!hera::readDiagramPointSet(argv[1], diagramA, decPrecision)) {
std::exit(1);
}
- if (!hera::bt::readDiagramPointSet(argv[2], diagramB, decPrecision)) {
+ if (!hera::readDiagramPointSet(argv[2], diagramB, decPrecision)) {
std::exit(1);
}
double res;
+ hera::bt::MatchingEdge<double> e;
if (argc >= 4) {
// the third parameter is epsilon,
// return approximate distance (faster)
double delta = atof(argv[3]);
if (delta > 0.0) {
if (useSamplingHeur && diagramA.size() > heurThreshold && diagramB.size() > heurThreshold) {
-#ifdef VERBOSE_BOTTLENECK
- std::cout << "using sampling heuristic" << std::endl;
-#endif
res = hera::bottleneckDistApproxHeur(diagramA, diagramB, delta);
} else {
-#ifdef VERBOSE_BOTTLENECK
- std::cout << "NOT using sampling heuristic" << std::endl;
-#endif
- res = hera::bottleneckDistApprox(diagramA, diagramB, delta);
+ res = hera::bottleneckDistApprox(diagramA, diagramB, delta, e, true);
}
} else if (delta == 0.0) {
-#ifdef VERBOSE_BOTTLENECK
- std::cout << "NOT using sampling heuristic, computing EXACT answer" << std::endl;
-#endif
res = hera::bottleneckDistExact(diagramA, diagramB, decPrecision);
} else {
std::cerr << "The third parameter (relative error) must be positive!" << std::endl;
@@ -84,13 +76,12 @@ int main(int argc, char* argv[])
}
} else {
// only filenames have been supplied, return exact distance
-#ifdef VERBOSE_BOTTLENECK
- std::cout << "NOT using sampling heuristic, computing EXACT answer" << std::endl;
-#endif
- res = hera::bottleneckDistExact(diagramA, diagramB, decPrecision);
+ res = hera::bottleneckDistExact(diagramA, diagramB, decPrecision, e, true);
+
}
std::cout << std::setprecision(15) << res << std::endl;
-
+ //std::cout << "Longest edge " << e.first.get_user_id() << " <-> " << e.second.get_user_id() << std::endl;
+ //std::cout << "Longest edge " << e.first << " <-> " << e.second << std::endl;
// Alternative could be to construct DiagramPointSet
// using the constructor with iterators.
// May be useful if the same diagram is used multiple times
diff --git a/geom_bottleneck/include/basic_defs_bt.h b/geom_bottleneck/include/basic_defs_bt.h
index ad09986..172e0f7 100644
--- a/geom_bottleneck/include/basic_defs_bt.h
+++ b/geom_bottleneck/include/basic_defs_bt.h
@@ -33,6 +33,7 @@ derivative works thereof, in binary and source code form.
#include <ciso646>
#endif
+#include <utility>
#include <vector>
#include <stdexcept>
#include <math.h>
@@ -45,431 +46,524 @@ derivative works thereof, in binary and source code form.
#include "def_debug_bt.h"
#ifndef FOR_R_TDA
-#include <iostream>
-#endif
-namespace hera {
-namespace bt {
+#include <iostream>
-typedef int IdType;
-constexpr IdType MinValidId = 10;
+#endif
-template<class Real = double>
-struct Point {
- Real x, y;
+namespace hera {
- bool operator==(const Point<Real> &other) const
+ template<class Real = double>
+ Real get_infinity()
{
- return ((this->x == other.x) and (this->y == other.y));
+ return Real(-1.0);
}
- bool operator!=(const Point<Real> &other) const
- {
- return !(*this == other);
- }
+ namespace bt {
+
+
+ typedef int IdType;
+ constexpr IdType MinValidId = 10;
+
+ template<class Real = double>
+ struct Point
+ {
+ Real x, y;
+
+ bool operator==(const Point<Real>& other) const
+ {
+ return ((this->x == other.x) and (this->y == other.y));
+ }
+
+ bool operator!=(const Point<Real>& other) const
+ {
+ return !(*this == other);
+ }
- Point(Real ax, Real ay) : x(ax), y(ay) {}
+ Point(Real ax, Real ay) :
+ x(ax), y(ay)
+ {}
- Point() : x(0.0), y(0.0) {}
+ Point() :
+ x(0.0), y(0.0)
+ {}
#ifndef FOR_R_TDA
- template<class R>
- friend std::ostream& operator<<(std::ostream& output, const Point<R>& p)
- {
- output << "(" << p.x << ", " << p.y << ")";
- return output;
- }
+ template<class R>
+ friend std::ostream& operator<<(std::ostream& output, const Point<R>& p)
+ {
+ output << "(" << p.x << ", " << p.y << ")";
+ return output;
+ }
#endif
-};
-
-template<class Real = double>
-struct DiagramPoint {
- // Points above the diagonal have type NORMAL
- // Projections onto the diagonal have type DIAG
- // for DIAG points only x-coordinate is relevant
- // to-do: add getters/setters, checks in constructors, etc
- enum Type {
- NORMAL, DIAG
- };
- // data members
-private:
- Real x, y;
-public:
- Type type;
- IdType id;
-
- // operators, constructors
- bool operator==(const DiagramPoint<Real> &other) const
- {
- // compare by id only
- assert(this->id >= MinValidId);
- assert(other.id >= MinValidId);
- bool areEqual{ this->id == other.id };
- assert(!areEqual or ((this->x == other.x) and (this->y == other.y) and (this->type == other.type)));
- return areEqual;
- }
+ };
+
+ template<class Real = double>
+ struct DiagramPoint
+ {
+ // Points above the diagonal have type NORMAL
+ // Projections onto the diagonal have type DIAG
+ // for DIAG points only x-coordinate is relevant
+ // to-do: add getters/setters, checks in constructors, etc
+ enum Type
+ {
+ NORMAL, DIAG
+ };
+ // data members
+ private:
+ Real x, y;
+ public:
+ Type type;
+ IdType id;
+ IdType user_id;
+
+ // operators, constructors
+ bool operator==(const DiagramPoint<Real>& other) const
+ {
+ // compare by id only
+ assert(this->id >= MinValidId);
+ assert(other.id >= MinValidId);
+ bool areEqual { this->id == other.id };
+ assert(!areEqual or ((this->x == other.x) and (this->y == other.y) and (this->type == other.type)));
+ return areEqual;
+ }
- bool operator!=(const DiagramPoint &other) const
- {
- return !(*this == other);
- }
+ bool operator!=(const DiagramPoint& other) const
+ {
+ return !(*this == other);
+ }
- DiagramPoint(Real _x, Real _y, Type _type, IdType _id) :
- x(_x),
- y(_y),
- type(_type),
- id(_id)
- {
- if ( _y == _x and _type != DIAG)
- throw std::runtime_error("Point on the main diagonal must have DIAG type");
+ DiagramPoint() :
+ x(0.0),
+ y(0.0),
+ type(DiagramPoint::DIAG),
+ id(MinValidId - 1),
+ user_id(-1)
+ {
+ }
- }
+ DiagramPoint(Real _x, Real _y, Type _type, IdType _id, IdType _user_id) :
+ x(_x),
+ y(_y),
+ type(_type),
+ id(_id),
+ user_id(_user_id)
+ {
+ if (_y == _x and _type != DIAG) {
+ throw std::runtime_error("Point on the main diagonal must have DIAG type");
+ }
+ }
- bool isDiagonal(void) const { return type == DIAG; }
- bool isNormal(void) const { return type == NORMAL; }
+ bool isDiagonal() const
+ { return type == DIAG; }
- Real inline getRealX() const // return the x-coord
- {
- return x;
- }
+ bool isNormal() const
+ { return type == NORMAL; }
- Real inline getRealY() const // return the y-coord
- {
- return y;
- }
+ bool isInfinity() const
+ {
+ return x == std::numeric_limits<Real>::infinity() or
+ x == -std::numeric_limits<Real>::infinity() or
+ y == std::numeric_limits<Real>::infinity() or
+ y == -std::numeric_limits<Real>::infinity();
+ }
+
+ Real inline getRealX() const // return the x-coord
+ {
+ return x;
+ }
+
+ Real inline getRealY() const // return the y-coord
+ {
+ return y;
+ }
+
+ IdType inline get_user_id() const
+ {
+ if (isNormal())
+ return user_id;
+ else
+ return -1;
+ }
+
+ Real inline get_persistence(const Real internal_p = get_infinity()) const
+ {
+ if (isDiagonal())
+ return 0.0;
+ Real pers = fabs(y - x) / 2;
+ if (internal_p == get_infinity()) {
+ return pers;
+ } else if (internal_p == 1.0) {
+ return 2 * pers;
+ } else {
+ return std::pow(static_cast<Real>(2), static_cast<Real>(1) / internal_p);
+ }
+ }
#ifndef FOR_R_TDA
- template<class R>
- friend std::ostream& operator<<(std::ostream& output, const DiagramPoint<R>& p)
- {
- if ( p.isDiagonal() ) {
- output << "(" << p.x << ", " << p.y << ", " << 0.5 * (p.x + p.y) << ", " << p.id << " DIAG )";
- } else {
- output << "(" << p.x << ", " << p.y << ", " << p.id << " NORMAL)";
- }
- return output;
- }
+
+ friend std::ostream& operator<<(std::ostream& output, const DiagramPoint& p)
+ {
+ if (p.isDiagonal()) {
+ output << "(" << p.x << ", " << p.y << ", " << 0.5 * (p.x + p.y) << ", " << p.id << " DIAG )";
+ } else {
+ output << "(" << p.x << ", " << p.y << ", " << p.id << " NORMAL)";
+ }
+ return output;
+ }
#endif
+ };
+
+ template<class Real>
+ using MatchingEdge = std::pair<DiagramPoint<Real>, DiagramPoint<Real>>;
+
+ // compute l-inf distance between two diagram points
+ template<class Real>
+ inline Real distLInf(const DiagramPoint<Real>& a, const DiagramPoint<Real>& b)
+ {
+ if (a.isDiagonal() and b.isDiagonal()) {
+ // distance between points on the diagonal is 0
+ return 0.0;
+ }
+ // otherwise distance is a usual l-inf distance
+ return std::max(fabs(a.getRealX() - b.getRealX()), fabs(a.getRealY() - b.getRealY()));
+ }
-};
+ // this function works with points at infinity as well
+ // not needed in actual computation, since these points are processed
+ // separately, but is useful in tests
+ template<class Real>
+ inline Real dist_l_inf_slow(const DiagramPoint<Real>& a, const DiagramPoint<Real>& b)
+ {
+ if (a.isDiagonal() and b.isDiagonal()) {
+ // distance between points on the diagonal is 0
+ return 0.0;
+ }
+ // otherwise distance is a usual l-inf distance
+ //
+ Real dx = (a.getRealX() == b.getRealX()) ? 0.0 : fabs(a.getRealX() - b.getRealX());
+ Real dy = (a.getRealY() == b.getRealY()) ? 0.0 : fabs(a.getRealY() - b.getRealY());
+ Real result = std::max(dx, dy);
+ if (std::isnan(result))
+ result = std::numeric_limits<Real>::infinity();
+ return result;
+ }
-// compute l-inf distance between two diagram points
-template<class Real>
-Real distLInf(const DiagramPoint<Real>& a, const DiagramPoint<Real>& b)
-{
- if ( a.isDiagonal() and b.isDiagonal() ) {
- // distance between points on the diagonal is 0
- return 0.0;
- }
- // otherwise distance is a usual l-inf distance
- return std::max(fabs(a.getRealX() - b.getRealX()), fabs(a.getRealY() - b.getRealY()));
-}
-
-
-template <class T>
-inline void hash_combine(std::size_t & seed, const T & v)
-{
- std::hash<T> hasher;
- seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
-}
-
-//template<class Real = double>
-//struct PointHash {
-// size_t operator()(const Point<Real> &p) const
-// {
-// size_t seed = 0;
-// hash_combine(seed, p.x);
-// hash_combine(seed, p.y);
-// return seed;
-// }
-//};
-
-template<class Real = double>
-struct DiagramPointHash {
- size_t operator()(const DiagramPoint<Real> &p) const
- {
- assert(p.id >= MinValidId);
- return std::hash<int>()(p.id);
- }
-};
-template<class Real = double>
-Real distLInf(const DiagramPoint<Real> &a, const DiagramPoint<Real> &b);
-//template<class Real = double>
-//typedef std::unordered_set<Point, PointHash> PointSet;
-template<class Real_ = double>
-class DiagramPointSet;
+ template<class Real = double>
+ inline Real get_infinity()
+ {
+ return Real(-1.0);
+ }
+
+ template<class T>
+ inline void hash_combine(std::size_t& seed, const T& v)
+ {
+ std::hash<T> hasher;
+ seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
+ }
-template<class Real>
-void addProjections(DiagramPointSet<Real> &A, DiagramPointSet<Real> &B);
+ template<class Real = double>
+ struct DiagramPointHash
+ {
+ size_t operator()(const DiagramPoint<Real>& p) const
+ {
+ assert(p.id >= MinValidId);
+ return std::hash<int>()(p.id);
+ }
+ };
-template<class Real_>
-class DiagramPointSet {
-public:
+ template<class Real = double>
+ Real distLInf(const DiagramPoint<Real>& a, const DiagramPoint<Real>& b);
- using Real = Real_;
- using DgmPoint = DiagramPoint<Real>;
- using DgmPointHash = DiagramPointHash<Real>;
- using const_iterator = typename std::unordered_set<DgmPoint, DgmPointHash>::const_iterator;
- using iterator = typename std::unordered_set<DgmPoint, DgmPointHash>::iterator;
+ //template<class Real = double>
+ //typedef std::unordered_set<Point, PointHash> PointSet;
+ template<class Real_ = double>
+ class DiagramPointSet;
-private:
+ template<class Real>
+ void addProjections(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B);
- bool isLinked { false };
- IdType maxId { MinValidId + 1 };
- std::unordered_set<DgmPoint, DgmPointHash> points;
+ template<class Real_>
+ class DiagramPointSet
+ {
+ public:
-public:
+ using Real = Real_;
+ using DgmPoint = DiagramPoint<Real>;
+ using DgmPointHash = DiagramPointHash<Real>;
+ using const_iterator = typename std::unordered_set<DgmPoint, DgmPointHash>::const_iterator;
+ using iterator = typename std::unordered_set<DgmPoint, DgmPointHash>::iterator;
- void insert(const DgmPoint& p)
- {
- points.insert(p);
- if (p.id > maxId) {
- maxId = p.id + 1;
- }
- }
+ private:
- void erase(const DgmPoint& p, bool doCheck = true)
- {
- // if doCheck, erasing non-existing elements causes assert
- auto it = points.find(p);
- if (it != points.end()) {
- points.erase(it);
- } else {
- assert(!doCheck);
- }
- }
+ bool isLinked { false };
+ IdType maxId { MinValidId + 1 };
+ std::unordered_set<DgmPoint, DgmPointHash> points;
+ public:
- void erase(const const_iterator it)
- {
- points.erase(it);
- }
+ void insert(const DgmPoint& p)
+ {
+ points.insert(p);
+ if (p.id > maxId) {
+ maxId = p.id + 1;
+ }
+ }
- void removeDiagonalPoints()
- {
- if (isLinked) {
- auto ptIter = points.begin();
- while(ptIter != points.end()) {
- if (ptIter->isDiagonal()) {
- ptIter = points.erase(ptIter);
+ void erase(const DgmPoint& p, bool doCheck = true)
+ {
+ // if doCheck, erasing non-existing elements causes assert
+ auto it = points.find(p);
+ if (it != points.end()) {
+ points.erase(it);
} else {
- ptIter++;
+ assert(!doCheck);
}
}
- isLinked = false;
- }
- }
- size_t size() const
- {
- return points.size();
- }
- void reserve(const size_t newSize)
- {
- points.reserve(newSize);
- }
+ void erase(const const_iterator it)
+ {
+ points.erase(it);
+ }
- void clear()
- {
- points.clear();
- }
+ void removeDiagonalPoints()
+ {
+ if (isLinked) {
+ auto ptIter = points.begin();
+ while (ptIter != points.end()) {
+ if (ptIter->isDiagonal()) {
+ ptIter = points.erase(ptIter);
+ } else {
+ ptIter++;
+ }
+ }
+ isLinked = false;
+ }
+ }
- bool empty() const
- {
- return points.empty();
- }
+ size_t size() const
+ {
+ return points.size();
+ }
- bool hasElement(const DgmPoint &p) const
- {
- return points.find(p) != points.end();
- }
+ void reserve(const size_t newSize)
+ {
+ points.reserve(newSize);
+ }
- iterator find(const DgmPoint &p)
- {
- return points.find(p);
- }
+ void clear()
+ {
+ points.clear();
+ }
- iterator begin()
- {
- return points.begin();
- }
+ bool empty() const
+ {
+ return points.empty();
+ }
- iterator end()
- {
- return points.end();
- }
+ bool hasElement(const DgmPoint& p) const
+ {
+ return points.find(p) != points.end();
+ }
- const_iterator find(const DgmPoint &p) const
- {
- return points.find(p);
- }
+ iterator find(const DgmPoint& p)
+ {
+ return points.find(p);
+ }
- const_iterator cbegin() const
- {
- return points.cbegin();
- }
+ iterator begin()
+ {
+ return points.begin();
+ }
- const_iterator cend() const
- {
- return points.cend();
- }
+ iterator end()
+ {
+ return points.end();
+ }
+
+ const_iterator cbegin() const
+ {
+ return points.cbegin();
+ }
+
+ const_iterator cend() const
+ {
+ return points.cend();
+ }
+
+
+ const_iterator find(const DgmPoint& p) const
+ {
+ return points.find(p);
+ }
#ifndef FOR_R_TDA
- template<class R>
- friend std::ostream& operator<<(std::ostream& output, const DiagramPointSet<R>& ps)
- {
- output << "{ ";
- for(auto pit = ps.cbegin(); pit != ps.cend(); ++pit) {
- output << *pit << ", ";
- }
- output << "\b\b }";
- return output;
- }
-#endif
- friend void addProjections<Real_>(DiagramPointSet<Real_>& A, DiagramPointSet<Real_>& B);
+ friend std::ostream& operator<<(std::ostream& output, const DiagramPointSet& ps)
+ {
+ output << "{ ";
+ for (auto pit = ps.cbegin(); pit != ps.cend(); ++pit) {
+ output << *pit << ", ";
+ }
+ output << "\b\b }";
+ return output;
+ }
- template<class PairIterator>
- void fillIn(PairIterator begin_iter, PairIterator end_iter)
- {
- isLinked = false;
- clear();
- IdType uniqueId = MinValidId + 1;
- for (auto iter = begin_iter; iter != end_iter; ++iter) {
- insert(DgmPoint(iter->first, iter->second, DgmPoint::NORMAL, uniqueId++));
- }
- }
+#endif
- template<class PointContainer>
- void fillIn(const PointContainer& dgm_cont)
- {
- using Traits = DiagramTraits<PointContainer>;
- isLinked = false;
- clear();
- IdType uniqueId = MinValidId + 1;
- for (const auto& pt : dgm_cont) {
- Real x = Traits::get_x(pt);
- Real y = Traits::get_y(pt);
- insert(DgmPoint(x, y, DgmPoint::NORMAL, uniqueId++));
- }
- }
+ friend void addProjections<Real_>(DiagramPointSet<Real_>& A, DiagramPointSet<Real_>& B);
+
+ template<class PairIterator>
+ void fillIn(PairIterator begin_iter, PairIterator end_iter)
+ {
+ isLinked = false;
+ clear();
+ IdType uniqueId = MinValidId + 1;
+ IdType user_id = 0;
+ for (auto iter = begin_iter; iter != end_iter; ++iter) {
+ insert(DgmPoint(iter->first, iter->second, DgmPoint::NORMAL, uniqueId++, user_id++));
+ }
+ }
+ template<class PointContainer>
+ void fillIn(const PointContainer& dgm_cont)
+ {
+ using Traits = DiagramTraits<PointContainer>;
+ isLinked = false;
+ clear();
+ IdType uniqueId = MinValidId + 1;
+ IdType user_id = 0;
+ for (const auto& pt : dgm_cont) {
+ Real x = Traits::get_x(pt);
+ Real y = Traits::get_y(pt);
+ insert(DgmPoint(x, y, DgmPoint::NORMAL, uniqueId++, user_id++));
+ }
+ }
- // ctor from range
- template<class PairIterator>
- DiagramPointSet(PairIterator begin_iter, PairIterator end_iter)
- {
- fillIn(begin_iter, end_iter);
- }
- // ctor from container, uses DiagramTraits
- template<class PointContainer>
- DiagramPointSet(const PointContainer& dgm)
- {
- fillIn(dgm);
- }
+ // ctor from range
+ template<class PairIterator>
+ DiagramPointSet(PairIterator begin_iter, PairIterator end_iter)
+ {
+ fillIn(begin_iter, end_iter);
+ }
+ // ctor from container, uses DiagramTraits
+ template<class PointContainer>
+ DiagramPointSet(const PointContainer& dgm)
+ {
+ fillIn(dgm);
+ }
- // default ctor, empty diagram
- DiagramPointSet(IdType minId = MinValidId + 1) : maxId(minId + 1) {};
- IdType nextId() { return maxId + 1; }
+ // default ctor, empty diagram
+ DiagramPointSet(IdType minId = MinValidId + 1) :
+ maxId(minId + 1)
+ {};
-}; // DiagramPointSet
+ IdType nextId()
+ { return maxId + 1; }
+ }; // DiagramPointSet
-template<class Real, class DiagPointContainer>
-Real getFurthestDistance3Approx(DiagPointContainer& A, DiagPointContainer& B) {
- Real result{0.0};
- DiagramPoint<Real> begA = *(A.begin());
- DiagramPoint<Real> optB = *(B.begin());
- for (const auto &pointB : B) {
- if (distLInf(begA, pointB) > result) {
- result = distLInf(begA, pointB);
- optB = pointB;
- }
- }
- for (const auto &pointA : A) {
- if (distLInf(pointA, optB) > result) {
- result = distLInf(pointA, optB);
- }
- }
- return result;
-}
-
-// preprocess diagrams A and B by adding projections onto diagonal of points of
-// A to B and vice versa. NB: ids of points will be changed!
-template<class Real_>
-void addProjections(DiagramPointSet<Real_>& A, DiagramPointSet<Real_>& B)
-{
-
- using Real = Real_;
- using DgmPoint = DiagramPoint<Real>;
- using DgmPointSet = DiagramPointSet<Real>;
-
- IdType uniqueId {MinValidId + 1};
- DgmPointSet newA, newB;
-
- // copy normal points from A to newA
- // add projections to newB
- for(auto& pA : A) {
- if (pA.isNormal()) {
- DgmPoint dpA {pA.getRealX(), pA.getRealY(), DgmPoint::NORMAL, uniqueId++};
- DgmPoint dpB {(pA.getRealX() +pA.getRealY())/2, (pA.getRealX() +pA.getRealY())/2, DgmPoint::DIAG, uniqueId++};
- newA.insert(dpA);
- newB.insert(dpB);
+
+ template<class Real, class DiagPointContainer>
+ Real getFurthestDistance3Approx(DiagPointContainer& A, DiagPointContainer& B)
+ {
+ Real result { 0.0 };
+ DiagramPoint<Real> begA = *(A.begin());
+ DiagramPoint<Real> optB = *(B.begin());
+ for (const auto& pointB : B) {
+ if (distLInf(begA, pointB) > result) {
+ result = distLInf(begA, pointB);
+ optB = pointB;
+ }
+ }
+ for (const auto& pointA : A) {
+ if (distLInf(pointA, optB) > result) {
+ result = distLInf(pointA, optB);
+ }
+ }
+ return result;
}
- }
- for(auto& pB : B) {
- if (pB.isNormal()) {
- DgmPoint dpB {pB.getRealX(), pB.getRealY(), DgmPoint::NORMAL, uniqueId++};
- DgmPoint dpA {(pB.getRealX() +pB.getRealY())/2, (pB.getRealX() +pB.getRealY())/2, DgmPoint::DIAG, uniqueId++};
- newB.insert(dpB);
- newA.insert(dpA);
+ // preprocess diagrams A and B by adding projections onto diagonal of points of
+ // A to B and vice versa. Also removes points at infinity!
+ // NB: ids of points will be changed!
+ template<class Real_>
+ void addProjections(DiagramPointSet<Real_>& A, DiagramPointSet<Real_>& B)
+ {
+
+ using Real = Real_;
+ using DgmPoint = DiagramPoint<Real>;
+ using DgmPointSet = DiagramPointSet<Real>;
+
+ IdType uniqueId { MinValidId + 1 };
+ DgmPointSet newA, newB;
+
+ // copy normal points from A to newA
+ // add projections to newB
+ for (auto& pA : A) {
+ if (pA.isNormal() and not pA.isInfinity()) {
+ // add pA's projection to B
+ DgmPoint dpA { pA.getRealX(), pA.getRealY(), DgmPoint::NORMAL, uniqueId++, pA.get_user_id() };
+ DgmPoint dpB { (pA.getRealX() + pA.getRealY()) / 2, (pA.getRealX() + pA.getRealY()) / 2,
+ DgmPoint::DIAG, uniqueId++, -1 };
+ newA.insert(dpA);
+ newB.insert(dpB);
+ }
+ }
+
+ for (auto& pB : B) {
+ if (pB.isNormal() and not pB.isInfinity()) {
+ // add pB's projection to A
+ DgmPoint dpB { pB.getRealX(), pB.getRealY(), DgmPoint::NORMAL, uniqueId++, pB.get_user_id() };
+ DgmPoint dpA { (pB.getRealX() + pB.getRealY()) / 2, (pB.getRealX() + pB.getRealY()) / 2,
+ DgmPoint::DIAG, uniqueId++, -1 };
+ newB.insert(dpB);
+ newA.insert(dpA);
+ }
+ }
+
+ A = newA;
+ B = newB;
+ A.isLinked = true;
+ B.isLinked = true;
}
- }
- A = newA;
- B = newB;
- A.isLinked = true;
- B.isLinked = true;
-}
-
-
-//#ifndef FOR_R_TDA
-
-//template<class Real>
-//std::ostream& operator<<(std::ostream& output, const DiagramPoint<Real>& p)
-//{
-// if ( p.isDiagonal() ) {
-// output << "(" << p.x << ", " << p.y << ", " << 0.5 * (p.x + p.y) << ", " << p.id << " DIAG )";
-// } else {
-// output << "(" << p.x << ", " << p.y << ", " << p.id << " NORMAL)";
-// }
-// return output;
-//}
-
-//template<class Real>
-//std::ostream& operator<<(std::ostream& output, const DiagramPointSet<Real>& ps)
-//{
-// output << "{ ";
-// for(auto pit = ps.cbegin(); pit != ps.cend(); ++pit) {
-// output << *pit << ", ";
-// }
-// output << "\b\b }";
-// return output;
-//}
-//#endif // FOR_R_TDA
-
-
-} // end namespace bt
+ //#ifndef FOR_R_TDA
+
+ //template<class Real>
+ //std::ostream& operator<<(std::ostream& output, const DiagramPoint<Real>& p)
+ //{
+ // if ( p.isDiagonal() ) {
+ // output << "(" << p.x << ", " << p.y << ", " << 0.5 * (p.x + p.y) << ", " << p.id << " DIAG )";
+ // } else {
+ // output << "(" << p.x << ", " << p.y << ", " << p.id << " NORMAL)";
+ // }
+ // return output;
+ //}
+
+ //template<class Real>
+ //std::ostream& operator<<(std::ostream& output, const DiagramPointSet<Real>& ps)
+ //{
+ // output << "{ ";
+ // for(auto pit = ps.cbegin(); pit != ps.cend(); ++pit) {
+ // output << *pit << ", ";
+ // }
+ // output << "\b\b }";
+ // return output;
+ //}
+ //#endif // FOR_R_TDA
+
+
+ } // end namespace bt
} // end namespace hera
#endif // HERA_BASIC_DEFS_BT_H
diff --git a/geom_bottleneck/include/bottleneck.h b/geom_bottleneck/include/bottleneck.h
index d0d82b6..64da2c8 100644
--- a/geom_bottleneck/include/bottleneck.h
+++ b/geom_bottleneck/include/bottleneck.h
@@ -43,73 +43,110 @@ derivative works thereof, in binary and source code form.
#include "bound_match.h"
namespace hera {
+ // internal_p defines cost function on edges (use hera::get_infinity(),
+ // if you want to explicitly refer to l_inf, but that's default value
+ // delta is relative error, default is 1 percent
+ template<class Real = double>
+ struct BottleneckParams
+ {
+ Real internal_p { hera::get_infinity() };
+ Real delta { 0.01 };
+ };
+
+ // functions taking containers as input
+ // template parameter PairContainer must be a container of pairs of real
+ // numbers (pair.first = x-coordinate, pair.second = y-coordinate)
+ // PairContainer class must support iteration of the form
+ // for(it = pairContainer.begin(); it != pairContainer.end(); ++it)
+
+ // all functions in this header are wrappers around
+ // functions from hera::bt namespace
+
+ // get exact bottleneck distance,
+ template<class PairContainer>
+ typename DiagramTraits<PairContainer>::RealType
+ bottleneckDistExact(PairContainer& dgm_A, PairContainer& dgm_B, const int decPrecision,
+ hera::bt::MatchingEdge<typename DiagramTraits<PairContainer>::RealType>& longest_edge,
+ bool compute_longest_edge = true)
+ {
+ using Real = typename DiagramTraits<PairContainer>::RealType;
+ hera::bt::DiagramPointSet<Real> a(dgm_A);
+ hera::bt::DiagramPointSet<Real> b(dgm_B);
+ return hera::bt::bottleneckDistExact(a, b, decPrecision, longest_edge, compute_longest_edge);
+ }
+
+ template<class PairContainer>
+ typename DiagramTraits<PairContainer>::RealType
+ bottleneckDistExact(PairContainer& dgm_A, PairContainer& dgm_B, const int decPrecision)
+ {
+ using Real = typename DiagramTraits<PairContainer>::RealType;
+ hera::bt::MatchingEdge<Real> longest_edge;
+ return bottleneckDistExact(dgm_A, dgm_B, decPrecision, longest_edge, false);
+ }
+
+
+ template<class PairContainer>
+ typename DiagramTraits<PairContainer>::RealType
+ bottleneckDistExact(PairContainer& dgm_A, PairContainer& dgm_B)
+ {
+ int dec_precision = 14;
+ return bottleneckDistExact(dgm_A, dgm_B, dec_precision);
+ }
-// functions taking containers as input
-// template parameter PairContainer must be a container of pairs of real
-// numbers (pair.first = x-coordinate, pair.second = y-coordinate)
-// PairContainer class must support iteration of the form
-// for(it = pairContainer.begin(); it != pairContainer.end(); ++it)
-
-
-// get exact bottleneck distance,
-template<class PairContainer>
-typename DiagramTraits<PairContainer>::RealType
-bottleneckDistExact(PairContainer& dgm_A, PairContainer& dgm_B)
-{
- using Real = typename DiagramTraits<PairContainer>::RealType;
- hera::bt::DiagramPointSet<Real> a(dgm_A);
- hera::bt::DiagramPointSet<Real> b(dgm_B);
- return hera::bt::bottleneckDistExact<Real>(a, b, 14);
-}
-
-// get exact bottleneck distance,
-template<class PairContainer>
-typename DiagramTraits<PairContainer>::RealType
-bottleneckDistExact(PairContainer& dgm_A, PairContainer& dgm_B, const int decPrecision)
-{
- using Real = typename DiagramTraits<PairContainer>::RealType;
- hera::bt::DiagramPointSet<Real> a(dgm_A);
- hera::bt::DiagramPointSet<Real> b(dgm_B);
- return hera::bt::bottleneckDistExact(a, b, decPrecision);
-}
// return the interval (distMin, distMax) such that:
// a) actual bottleneck distance between A and B is contained in the interval
// b) if the interval is not (0,0), then (distMax - distMin) / distMin < delta
-template<class PairContainer>
-std::pair<typename DiagramTraits<PairContainer>::RealType, typename DiagramTraits<PairContainer>::RealType>
-bottleneckDistApproxInterval(PairContainer& dgm_A, PairContainer& dgm_B, const typename DiagramTraits<PairContainer>::RealType delta)
-{
- using Real = typename DiagramTraits<PairContainer>::RealType;
- hera::bt::DiagramPointSet<Real> a(dgm_A);
- hera::bt::DiagramPointSet<Real> b(dgm_B);
- return hera::bt::bottleneckDistApproxInterval(a, b, delta);
-}
-
-
-template<class PairContainer>
-typename DiagramTraits<PairContainer>::RealType
-bottleneckDistApproxHeur(PairContainer& dgm_A, PairContainer& dgm_B, const typename DiagramTraits<PairContainer>::RealType delta)
-{
- using Real = typename DiagramTraits<PairContainer>::RealType;
- hera::bt::DiagramPointSet<Real> a(dgm_A);
- hera::bt::DiagramPointSet<Real> b(dgm_B);
- std::pair<Real, Real> resPair = hera::bt::bottleneckDistApproxIntervalHeur(a, b, delta);
- return resPair.second;
-}
-
+ template<class PairContainer>
+ std::pair<typename DiagramTraits<PairContainer>::RealType, typename DiagramTraits<PairContainer>::RealType>
+ bottleneckDistApproxInterval(PairContainer& dgm_A, PairContainer& dgm_B,
+ const typename DiagramTraits<PairContainer>::RealType delta)
+ {
+ using Real = typename DiagramTraits<PairContainer>::RealType;
+ hera::bt::DiagramPointSet<Real> a(dgm_A);
+ hera::bt::DiagramPointSet<Real> b(dgm_B);
+ return hera::bt::bottleneckDistApproxInterval(a, b, delta);
+ }
+
+// use sampling heuristic: discard most of the points with small persistency
+// to get a good initial approximation of the bottleneck distance
+ template<class PairContainer>
+ typename DiagramTraits<PairContainer>::RealType
+ bottleneckDistApproxHeur(PairContainer& dgm_A, PairContainer& dgm_B,
+ const typename DiagramTraits<PairContainer>::RealType delta)
+ {
+ using Real = typename DiagramTraits<PairContainer>::RealType;
+ hera::bt::DiagramPointSet<Real> a(dgm_A);
+ hera::bt::DiagramPointSet<Real> b(dgm_B);
+ std::pair<Real, Real> resPair = hera::bt::bottleneckDistApproxIntervalHeur(a, b, delta);
+ return resPair.second;
+ }
// get approximate distance,
// see bottleneckDistApproxInterval
-template<class PairContainer>
-typename DiagramTraits<PairContainer>::RealType
-bottleneckDistApprox(PairContainer& A, PairContainer& B, const typename DiagramTraits<PairContainer>::RealType delta)
-{
- using Real = typename DiagramTraits<PairContainer>::RealType;
- hera::bt::DiagramPointSet<Real> a(A.begin(), A.end());
- hera::bt::DiagramPointSet<Real> b(B.begin(), B.end());
- return hera::bt::bottleneckDistApprox(a, b, delta);
-}
+ template<class PairContainer>
+ typename DiagramTraits<PairContainer>::RealType
+ bottleneckDistApprox(PairContainer& A, PairContainer& B,
+ const typename DiagramTraits<PairContainer>::RealType delta,
+ hera::bt::MatchingEdge<typename DiagramTraits<PairContainer>::RealType>& longest_edge,
+ bool compute_longest_edge = true)
+ {
+ using Real = typename DiagramTraits<PairContainer>::RealType;
+ hera::bt::DiagramPointSet<Real> a(A.begin(), A.end());
+ hera::bt::DiagramPointSet<Real> b(B.begin(), B.end());
+ return hera::bt::bottleneckDistApprox(a, b, delta, longest_edge, compute_longest_edge);
+ }
+
+ template<class PairContainer>
+ typename DiagramTraits<PairContainer>::RealType
+ bottleneckDistApprox(PairContainer& A, PairContainer& B,
+ const typename DiagramTraits<PairContainer>::RealType delta)
+ {
+ using Real = typename DiagramTraits<PairContainer>::RealType;
+ hera::bt::MatchingEdge<Real> longest_edge;
+ return hera::bottleneckDistApprox(A, B, delta, longest_edge, false);
+ }
+
} // end namespace hera
diff --git a/geom_bottleneck/include/bottleneck_detail.h b/geom_bottleneck/include/bottleneck_detail.h
index 27c3c5d..7241c9a 100644
--- a/geom_bottleneck/include/bottleneck_detail.h
+++ b/geom_bottleneck/include/bottleneck_detail.h
@@ -43,39 +43,44 @@ derivative works thereof, in binary and source code form.
namespace hera {
-namespace bt {
-
-
-
-// functions taking DiagramPointSet as input.
-// ATTENTION: parameters A and B (diagrams) will be changed after the call
-// (projections added).
-
-// return the interval (distMin, distMax) such that:
-// a) actual bottleneck distance between A and B is contained in the interval
-// b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon
-template<class Real>
-std::pair<Real, Real> bottleneckDistApproxInterval(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, const Real epsilon);
-
-
-// heuristic (sample diagram to estimate the distance)
-template<class Real>
-std::pair<Real, Real> bottleneckDistApproxIntervalHeur(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, const Real epsilon);
-
-// get approximate distance,
-// see bottleneckDistApproxInterval
-template<class Real>
-Real bottleneckDistApprox(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, const Real epsilon);
-
-// get exact bottleneck distance,
-template<class Real>
-Real bottleneckDistExact(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, const int decPrecision);
-
-// get exact bottleneck distance,
-template<class Real>
-Real bottleneckDistExact(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B);
-
-} // end namespace bt
+ namespace bt {
+
+ // functions taking DiagramPointSet as input.
+ // ATTENTION: parameters A and B (diagrams) will be changed after the call
+ // (projections added).
+
+ // return the interval (distMin, distMax) such that:
+ // a) actual bottleneck distance between A and B is contained in the interval
+ // b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon
+ template<class Real>
+ std::pair<Real, Real> bottleneckDistApproxInterval(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B,
+ const Real epsilon, MatchingEdge<Real>& longest_edge,
+ bool compute_longest_edge = false);
+
+
+ // heuristic (sample diagram to estimate the distance)
+ template<class Real>
+ std::pair<Real, Real>
+ bottleneckDistApproxIntervalHeur(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, const Real epsilon,
+ bool compute_longest_edge = false);
+
+ // get approximate distance,
+ // see bottleneckDistApproxInterval
+ template<class Real>
+ Real bottleneckDistApprox(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, const Real epsilon,
+ MatchingEdge<Real>& longest_edge, bool compute_longest_edge = false);
+
+ // get exact bottleneck distance,
+ template<class Real>
+ Real bottleneckDistExact(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, const int decPrecision,
+ MatchingEdge<Real>& longest_edge, bool compute_longest_edge = false);
+
+ // get exact bottleneck distance,
+ template<class Real>
+ Real bottleneckDistExact(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, MatchingEdge<Real>& longest_edge,
+ bool compute_longest_edge = false);
+
+ } // end namespace bt
} // end namespace hera
diff --git a/geom_bottleneck/include/bottleneck_detail.hpp b/geom_bottleneck/include/bottleneck_detail.hpp
index 64c6696..8f51d07 100644
--- a/geom_bottleneck/include/bottleneck_detail.hpp
+++ b/geom_bottleneck/include/bottleneck_detail.hpp
@@ -40,746 +40,597 @@ derivative works thereof, in binary and source code form.
#include <sstream>
#include <string>
#include <cctype>
+#include <set>
#include "bottleneck_detail.h"
namespace hera {
-namespace bt {
-
-// return the interval (distMin, distMax) such that:
-// a) actual bottleneck distance between A and B is contained in the interval
-// b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon
-template<class Real>
-std::pair<Real, Real> bottleneckDistApproxInterval(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, const Real epsilon)
-{
- // empty diagrams are not considered as error
- if (A.empty() and B.empty())
- return std::make_pair(0.0, 0.0);
-
- // link diagrams A and B by adding projections
- addProjections(A, B);
-
- // TODO: think about that!
- // we need one threshold for checking if the distance is 0,
- // another one for the oracle!
- constexpr Real epsThreshold { 1.0e-10 };
- std::pair<Real, Real> result { 0.0, 0.0 };
- bool useRangeSearch { true };
- // construct an oracle
- BoundMatchOracle<Real> oracle(A, B, epsThreshold, useRangeSearch);
- // check for distance = 0
- if (oracle.isMatchLess(2*epsThreshold)) {
- return result;
- }
- // get a 3-approximation of maximal distance between A and B
- // as a starting value for probe distance
- Real distProbe { getFurthestDistance3Approx<Real, DiagramPointSet<Real>>(A, B) };
- // aliases for result components
- Real& distMin {result.first};
- Real& distMax {result.second};
-
- if ( oracle.isMatchLess(distProbe) ) {
- // distProbe is an upper bound,
- // find lower bound with binary search
- do {
- distMax = distProbe;
- distProbe /= 2.0;
- } while (oracle.isMatchLess(distProbe));
- distMin = distProbe;
- } else {
- // distProbe is a lower bound,
- // find upper bound with exponential search
- do {
- distMin = distProbe;
- distProbe *= 2.0;
- } while (!oracle.isMatchLess(distProbe));
- distMax = distProbe;
- }
- // bounds are found, perform binary search
- //std::cout << "Bounds found, distMin = " << distMin << ", distMax = " << distMax << ", ratio = " << ( distMax - distMin ) / distMin << std::endl ;
- distProbe = ( distMin + distMax ) / 2.0;
- while ( ( distMax - distMin ) / distMin >= epsilon ) {
- if (oracle.isMatchLess(distProbe)) {
- distMax = distProbe;
- } else {
- distMin = distProbe;
- }
- distProbe = ( distMin + distMax ) / 2.0;
- }
- return result;
-}
-
-template<class Real>
-void sampleDiagramForHeur(const DiagramPointSet<Real>& dgmIn, DiagramPointSet<Real>& dgmOut)
-{
-#ifdef VERBOSE_BOTTLENECK
- std::cout << "Entered sampleDiagramForHeur, dgmIn.size = " << dgmIn.size() << std::endl;
-#endif
- struct pair_hash {
- std::size_t operator()(const std::pair<Real, Real> p) const
+ namespace bt {
+
+ template<class Real>
+ void binarySearch(const Real epsilon,
+ std::pair<Real, Real>& result,
+ BoundMatchOracle <Real>& oracle,
+ const Real infinityCost,
+ bool isResultInitializedCorrectly,
+ const Real distProbeInit)
{
- return std::hash<Real>()(p.first) ^ std::hash<Real>()(p.second);
- }
- };
- std::unordered_map<std::pair<Real, Real>, int, pair_hash> m;
- for(auto ptIter = dgmIn.cbegin(); ptIter != dgmIn.cend(); ++ptIter) {
- if (ptIter->isNormal()) {
- m[std::make_pair(ptIter->getRealX(), ptIter->getRealY())]++;
- }
- }
-#ifdef VERBOSE_BOTTLENECK
- std::cout << "map filled in, m.size = " << m.size() << std::endl;
-#endif
- if (m.size() < 2) {
- dgmOut = dgmIn;
- return;
- }
- std::vector<int> v;
- for(const auto& ptQtyPair : m) {
- v.push_back(ptQtyPair.second);
- }
-#ifdef VERBOSE_BOTTLENECK
- std::cout << "v filled in, v.size = " << v.size() << std::endl;
-#endif
- std::sort(v.begin(), v.end());
-#ifdef VERBOSE_BOTTLENECK
- std::cout << "v sorted" << std::endl;
-#endif
- int maxLeap = v[1] - v[0];
- int cutVal = v[0];
- for(int i = 1; i < static_cast<int>(v.size())- 1; ++i) {
- int currLeap = v[i+1] - v[i];
- if (currLeap > maxLeap) {
- maxLeap = currLeap;
- cutVal = v[i];
- }
- }
-#ifdef VERBOSE_BOTTLENECK
- std::cout << "cutVal found, cutVal = " << cutVal << std::endl;
-#endif
- std::vector<std::pair<Real, Real>> vv;
- // keep points whose multiplicites are at most cutVal
- // quick-and-dirty: fill in vv with copies of each point
- // to construct DiagramPointSet from it later
- for(const auto& ptQty : m) {
- if (ptQty.second < cutVal) {
- for(int i = 0; i < ptQty.second; ++i) {
- vv.push_back(std::make_pair(ptQty.first.first, ptQty.first.second));
+ // aliases for result components
+ Real& distMin = result.first;
+ Real& distMax = result.second;
+
+ distMin = std::max(distMin, infinityCost);
+ distMax = std::max(distMax, infinityCost);
+
+ Real distProbe;
+
+ if (not isResultInitializedCorrectly) {
+ distProbe = distProbeInit;
+ if (oracle.isMatchLess(distProbe)) {
+ // distProbe is an upper bound,
+ // find lower bound with binary search
+ do {
+ distMax = distProbe;
+ distProbe /= 2.0;
+ } while (oracle.isMatchLess(distProbe));
+ distMin = distProbe;
+ } else {
+ // distProbe is a lower bound,
+ // find upper bound with exponential search
+ do {
+ distMin = distProbe;
+ distProbe *= 2.0;
+ } while (!oracle.isMatchLess(distProbe));
+ distMax = distProbe;
+ }
}
- }
- }
-#ifdef VERBOSE_BOTTLENECK
- std::cout << "vv filled in, vv.size = " << v.size() << std::endl;
-#endif
- dgmOut.clear();
- dgmOut = DiagramPointSet<Real>(vv.begin(), vv.end());
-#ifdef VERBOSE_BOTTLENECK
- std::cout << "dgmOut filled in, dgmOut.size = " << dgmOut.size() << std::endl;
-#endif
-}
-
-
-// return the interval (distMin, distMax) such that:
-// a) actual bottleneck distance between A and B is contained in the interval
-// b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon
-template<class Real>
-std::pair<Real, Real> bottleneckDistApproxIntervalWithInitial(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, const Real epsilon, const std::pair<Real, Real> initialGuess)
-{
- // empty diagrams are not considered as error
- if (A.empty() and B.empty())
- return std::make_pair(0.0, 0.0);
-
- // link diagrams A and B by adding projections
- addProjections(A, B);
-
- constexpr Real epsThreshold { 1.0e-10 };
- std::pair<Real, Real> result { 0.0, 0.0 };
- bool useRangeSearch { true };
- // construct an oracle
- BoundMatchOracle<Real> oracle(A, B, epsThreshold, useRangeSearch);
- Real& distMin {result.first};
- Real& distMax {result.second};
-
- // initialize search interval from initialGuess
- distMin = initialGuess.first;
- distMax = initialGuess.second;
-
- assert(distMin <= distMax);
-
- // make sure that distMin is a lower bound
- while(oracle.isMatchLess(distMin)) {
- // distMin is in fact an upper bound, so assign it to distMax
- distMax = distMin;
- // and decrease distMin by 5 %
- distMin = 0.95 * distMin;
- }
-
- // make sure that distMax is an upper bound
- while(not oracle.isMatchLess(distMax)) {
- // distMax is in fact a lower bound, so assign it to distMin
- distMin = distMax;
- // and increase distMax by 5 %
- distMax = 1.05 * distMax;
- }
-
- // bounds are found, perform binary search
- //std::cout << "Bounds found, distMin = " << distMin << ", distMax = " << distMax << ", ratio = " << ( distMax - distMin ) / distMin << std::endl ;
- Real distProbe = ( distMin + distMax ) / 2.0;
- while ( ( distMax - distMin ) / distMin >= epsilon ) {
- if (oracle.isMatchLess(distProbe)) {
- distMax = distProbe;
- } else {
- distMin = distProbe;
- }
- distProbe = ( distMin + distMax ) / 2.0;
- }
- return result;
-}
-
-// return the interval (distMin, distMax) such that:
-// a) actual bottleneck distance between A and B is contained in the interval
-// b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon
-// use heuristic: initial estimate on sampled diagrams
-template<class Real>
-std::pair<Real, Real> bottleneckDistApproxIntervalHeur(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, const Real epsilon)
-{
- // empty diagrams are not considered as error
- if (A.empty() and B.empty())
- return std::make_pair(0.0, 0.0);
-
- DiagramPointSet<Real> sampledA, sampledB;
- sampleDiagramForHeur(A, sampledA);
- sampleDiagramForHeur(B, sampledB);
-#ifdef VERBOSE_BOTTLENECK
- std::cout << "A : " << A.size() << ", sampled: " << sampledA.size() << std::endl;
- std::cout << "B : " << B.size() << ", sampled: " << sampledB.size() << std::endl;
-#endif
- std::pair<Real, Real> initGuess = bottleneckDistApproxInterval(sampledA, sampledB, epsilon);
-#ifdef VERBOSE_BOTTLENECK
- std::cout << "initial guess with sampling: " << initGuess.first << ", " << initGuess.second << std::endl;
- std::cout << "running on the original diagrams" << std::endl;
-#endif
- return bottleneckDistApproxIntervalWithInitial<Real>(A, B, epsilon, initGuess);
-}
-
-
-
-// get approximate distance,
-// see bottleneckDistApproxInterval
-template<class Real>
-Real bottleneckDistApprox(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, const Real epsilon)
-{
- auto interval = bottleneckDistApproxInterval<Real>(A, B, epsilon);
- return interval.second;
-}
-
-
-template<class Real>
-Real bottleneckDistExactFromSortedPwDist(DiagramPointSet<Real>&A, DiagramPointSet<Real>& B, std::vector<Real>& pairwiseDist, const int decPrecision)
-{
- //for(size_t k = 0; k < pairwiseDist.size(); ++k) {
- //std::cout << "pairwiseDist[" << k << "] = " << std::setprecision(15) << pairwiseDist[k] << std::endl;
- //}
- // trivial case: we have only one candidate
- if (pairwiseDist.size() == 1)
- return pairwiseDist[0];
-
- bool useRangeSearch = true;
- Real distEpsilon = std::numeric_limits<Real>::max();
- Real diffThreshold = 0.1;
- for(int k = 0; k < decPrecision; ++k) {
- diffThreshold /= 10.0;
- }
- for(size_t k = 0; k < pairwiseDist.size() - 2; ++k) {
- auto diff = pairwiseDist[k+1]- pairwiseDist[k];
- //std::cout << "diff = " << diff << ", pairwiseDist[k] = " << pairwiseDist[k] << std::endl;
- if ( diff > diffThreshold and diff < distEpsilon ) {
- distEpsilon = diff;
- }
- }
- distEpsilon /= 3.0;
- //std::cout << "decPrecision = " << decPrecision << ", distEpsilon = " << distEpsilon << std::endl;
-
- BoundMatchOracle<Real> oracle(A, B, distEpsilon, useRangeSearch);
- // binary search
- size_t iterNum {0};
- size_t idxMin {0}, idxMax {pairwiseDist.size() - 1};
- size_t idxMid;
- while(idxMax > idxMin) {
- idxMid = static_cast<size_t>(floor(idxMin + idxMax) / 2.0);
- //std::cout << "while begin: min = " << idxMin << ", idxMax = " << idxMax << ", idxMid = " << idxMid << ", testing d = " << std::setprecision(15) << pairwiseDist[idxMid] << std::endl;
- iterNum++;
- // not A[imid] < dist <=> A[imid] >= dist <=> A[imid[ >= dist + eps
- if (oracle.isMatchLess(pairwiseDist[idxMid] + distEpsilon / 2.0)) {
- //std::cout << "isMatchLess = true" << std::endl;
- idxMax = idxMid;
- } else {
- //std::cout << "isMatchLess = false " << std::endl;
- idxMin = idxMid + 1;
- }
- //std::cout << "while end: idxMin = " << idxMin << ", idxMax = " << idxMax << ", idxMid = " << idxMid << std::endl;
- }
- idxMid = static_cast<size_t>(floor(idxMin + idxMax) / 2.0);
- return pairwiseDist[idxMid];
-}
-
-
-template<class Real>
-Real bottleneckDistExact(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B)
-{
- return bottleneckDistExact(A, B, 14);
-}
-
-template<class Real>
-Real bottleneckDistExact(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, const int decPrecision)
-{
- using DgmPoint = DiagramPoint<Real>;
-
- constexpr Real epsilon = 0.001;
- auto interval = bottleneckDistApproxInterval(A, B, epsilon);
- const Real delta = 0.50001 * (interval.second - interval.first);
- const Real approxDist = 0.5 * ( interval.first + interval.second);
- const Real minDist = interval.first;
- const Real maxDist = interval.second;
- //std::cout << std::setprecision(15) << "minDist = " << minDist << ", maxDist = " << maxDist << std::endl;
- if ( delta == 0 ) {
- return interval.first;
- }
- // copy points from A to a vector
- // todo: get rid of this?
- std::vector<DgmPoint> pointsA;
- pointsA.reserve(A.size());
- for(const auto& ptA : A) {
- pointsA.push_back(ptA);
- }
-
- //std::vector<Real> killdist;
- //for(auto pta : a) {
- //for(auto ptb : b) {
- //if ( distlinf(pta, ptb) > mindist and distlinf(pta, ptb) < maxdist) {
- //killdist.push_back(distlinf(pta, ptb));
- //std::cout << pta << ", " << ptb << std::endl;
- //}
- //}
- //}
- //std::sort(killdist.begin(), killdist.end());
- //for(auto d : killdist) {
- //std::cout << d << std::endl;
- //}
- //std::cout << "*************" << std::endl;
-
- // in this vector we store the distances between the points
- // that are candidates to realize
- std::vector<Real> pairwiseDist;
- {
- // vector to store centers of vertical stripes
- // two for each point in A and the id of the corresponding point
- std::vector<std::pair<Real, DgmPoint>> xCentersVec;
- xCentersVec.reserve(2 * pointsA.size());
- for(auto ptA : pointsA) {
- xCentersVec.push_back(std::make_pair(ptA.getRealX() - approxDist, ptA));
- xCentersVec.push_back(std::make_pair(ptA.getRealX() + approxDist, ptA));
- }
- // lambda to compare pairs <coordinate, id> w.r.t coordinate
- auto compLambda = [](std::pair<Real, DgmPoint> a, std::pair<Real, DgmPoint> b)
- { return a.first < b.first; };
-
- std::sort(xCentersVec.begin(), xCentersVec.end(), compLambda);
- //std::cout << "xCentersVec.size = " << xCentersVec.size() << std::endl;
- //for(auto p = xCentersVec.begin(); p!= xCentersVec.end(); ++p) {
- //if (p->second.id == 200) {
- //std::cout << "index of 200: " << p - xCentersVec.begin() << std::endl;
- //}
- //}
- //std::vector<DgmPoint>
- // todo: sort points in B, reduce search range in lower and upper bounds
- for(auto ptB : B) {
- // iterator to the first stripe such that ptB lies to the left
- // from its right boundary (x_B <= x_j + \delta iff x_j >= x_B - \delta
- auto itStart = std::lower_bound(xCentersVec.begin(),
- xCentersVec.end(),
- std::make_pair(ptB.getRealX() - delta, ptB),
- compLambda);
- //if (ptB.id == 236) {
- //std::cout << itStart - xCentersVec.begin() << std::endl;
- //}
-
- for(auto iterA = itStart; iterA < xCentersVec.end(); ++iterA) {
- //if (ptB.id == 236) {
- //std::cout << "consider " << iterA->second << std::endl;
- //}
- if ( ptB.getRealX() < iterA->first - delta) {
- // from that moment x_B >= x_j - delta
- // is violated: x_B no longer lies to right from the left
- // boundary of current stripe
- //if (ptB.id == 236) {
- //std::cout << "break" << std::endl;
- //}
+ // bounds are correct , perform binary search
+ distProbe = (distMin + distMax) / 2.0;
+ while ((distMax - distMin) / distMin >= epsilon) {
+
+ if (distMax < infinityCost) {
+ distMin = infinityCost;
+ distMax = infinityCost;
break;
}
- // we're here => ptB lies in vertical stripe,
- // check if distance fits into the interval we've found
- Real pwDist = distLInf(iterA->second, ptB);
- //if (ptB.id == 236) {
- //std::cout << pwDist << std::endl;
- //}
- //std::cout << 1000*minDist << " <= " << 1000*pwDist << " <= " << 1000*maxDist << std::endl;
- if (pwDist >= minDist and pwDist <= maxDist) {
- pairwiseDist.push_back(pwDist);
+
+ if (oracle.isMatchLess(distProbe)) {
+ distMax = distProbe;
+ } else {
+ distMin = distProbe;
}
+
+ distProbe = (distMin + distMax) / 2.0;
}
+
+ distMin = std::max(distMin, infinityCost);
+ distMax = std::max(distMax, infinityCost);
}
- }
-
- {
- // for y
- // vector to store centers of vertical stripes
- // two for each point in A and the id of the corresponding point
- std::vector<std::pair<Real, DgmPoint>> yCentersVec;
- yCentersVec.reserve(2 * pointsA.size());
- for(auto ptA : pointsA) {
- yCentersVec.push_back(std::make_pair(ptA.getRealY() - approxDist, ptA));
- yCentersVec.push_back(std::make_pair(ptA.getRealY() + approxDist, ptA));
- }
- // lambda to compare pairs <coordinate, id> w.r.t coordinate
- auto compLambda = [](std::pair<Real, DgmPoint> a, std::pair<Real, DgmPoint> b)
- { return a.first < b.first; };
- std::sort(yCentersVec.begin(), yCentersVec.end(), compLambda);
+ // template<class Real>
+ // inline Real getOneDimensionalCost(std::vector<Real>& set_A, std::vector<Real>& set_B)
+ // {
+ // if (set_A.size() != set_B.size()) {
+ // return std::numeric_limits<Real>::infinity();
+ // }
+ //
+ // if (set_A.empty()) {
+ // return Real(0.0);
+ // }
+ //
+ // std::sort(set_A.begin(), set_A.end());
+ // std::sort(set_B.begin(), set_B.end());
+ //
+ // Real result = 0.0;
+ // for (size_t i = 0; i < set_A.size(); ++i) {
+ // result = std::max(result, (std::fabs(set_A[i] - set_B[i])));
+ // }
+ //
+ // return result;
+ // }
+
+
+ template<class Real>
+ struct CostEdgePair
+ {
+ Real cost;
+ typename hera::bt::MatchingEdge<Real> edge;
+ };
+
+ template<class Real>
+ using CoordPointPair = std::pair<Real, typename hera::bt::DiagramPoint<Real>>;
- // std::cout << "Sorted vector of y-centers:" << std::endl;
- //for(auto coordPtPair : yCentersVec) {
- //std::cout << coordPtPair.first << ", id = " << coordPtPair.second.id << std::endl;
- //}
- /*std::cout << "End of sorted vector of y-centers:" << std::endl;*/
+ template<class Real>
+ using CoordPointVector = std::vector<typename hera::bt::CoordPointPair<Real>>;
- //std::vector<DgmPoint>
- // todo: sort points in B, reduce search range in lower and upper bounds
- for(auto ptB : B) {
- auto itStart = std::lower_bound(yCentersVec.begin(),
- yCentersVec.end(),
- std::make_pair(ptB.getRealY() - delta, ptB),
- compLambda);
+ template<class Real>
+ struct CoordPointPairComparator
+ {
+ bool operator()(const CoordPointPair<Real>& a, const CoordPointPair<Real>& b) const
+ {
+ return a.first < b.first or (a.first == b.first and a.second.id < b.second.id);
+ };
+ };
+
+ template<class Real>
+ inline typename hera::bt::CostEdgePair<Real>
+ getOneDimensionalCost(typename hera::bt::CoordPointVector<Real>& set_A,
+ typename hera::bt::CoordPointVector<Real>& set_B)
+ {
+ using MatchingEdgeR = hera::bt::MatchingEdge<Real>;
+ using CostEdgePairR = CostEdgePair<Real>;
+ if (set_A.size() != set_B.size()) {
+ return CostEdgePairR { std::numeric_limits<Real>::infinity(), MatchingEdgeR() };
+ }
- for(auto iterA = itStart; iterA < yCentersVec.end(); ++iterA) {
- if ( ptB.getRealY() < iterA->first - delta) {
- break;
- }
- Real pwDist = distLInf(iterA->second, ptB);
- //std::cout << 1000*minDist << " <= " << 1000*pwDist << " <= " << 1000*maxDist << std::endl;
- if (pwDist >= minDist and pwDist <= maxDist) {
- pairwiseDist.push_back(pwDist);
+ if (set_A.empty()) {
+ return CostEdgePairR { Real(0.0), MatchingEdgeR() };
+ }
+
+ std::sort(set_A.begin(), set_A.end(), CoordPointPairComparator<Real>());
+ std::sort(set_B.begin(), set_B.end(), CoordPointPairComparator<Real>());
+
+ CostEdgePairR result { -1.0, MatchingEdgeR() };
+
+ for (size_t i = 0; i < set_A.size(); ++i) {
+ Real curr_cost = std::fabs(set_A[i].first - set_B[i].first);
+ if (curr_cost > result.cost) {
+ result.cost = curr_cost;
+ result.edge = MatchingEdgeR(set_A[i].second, set_B[i].second);
}
}
+ return result;
}
- }
-
- //std::cout << "pairwiseDist.size = " << pairwiseDist.size() << " out of " << A.size() * A.size() << std::endl;
- std::sort(pairwiseDist.begin(), pairwiseDist.end());
- //for(auto ddd : pairwiseDist) {
- //std::cout << std::setprecision(15) << ddd << std::endl;
- //}
-
- return bottleneckDistExactFromSortedPwDist(A, B, pairwiseDist, decPrecision);
-}
-
-template<class Real>
-Real bottleneckDistSlow(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B)
-{
- using DistVerticesPair = std::pair<Real, std::pair<size_t, size_t>>;
-
- // use range search when building the layer graph
- bool useRangeSearch { true };
- // find maximum of min. distances for each point,
- // use this value as lower bound for bottleneck distance
- bool useHeurMinIdx { true };
-
- // find matching in a greedy manner to
- // get an upper bound for a bottleneck distance
- bool useHeurGreedyMatching { false };
-
- // use successive multiplication of idxMin with 2 to get idxMax
- bool goUpToFindIdxMax { false };
- //
- goUpToFindIdxMax = goUpToFindIdxMax and !useHeurGreedyMatching;
-
- if (!useHeurGreedyMatching) {
- long int N = 3 * (A.size() / 2 ) * (B.size() / 2);
- std::vector<Real> pairwiseDist;
- pairwiseDist.reserve(N);
- Real maxMinDist {0.0};
- for(auto& p_A : A) {
- Real minDist { std::numeric_limits<Real>::max() };
- for(auto& p_B : B) {
- if (p_A.isNormal() or p_B.isNormal()) {
- Real d = distLInf(p_A, p_B);
- pairwiseDist.push_back(d);
- if (useHeurMinIdx and p_A.isNormal()) {
- if (d < minDist)
- minDist = d;
- }
+
+
+ template<class Real>
+ inline CostEdgePair<Real> getInfinityCost(const DiagramPointSet <Real>& A, const DiagramPointSet <Real>& B,
+ bool compute_longest_edge = false)
+ {
+ using CostEdgePairR = CostEdgePair<Real>;
+ using CoordPointVectorR = CoordPointVector<Real>;
+
+ CoordPointVectorR x_plus_A, x_minus_A, y_plus_A, y_minus_A;
+ CoordPointVectorR x_plus_B, x_minus_B, y_plus_B, y_minus_B;
+
+ for (auto iter_A = A.cbegin(); iter_A != A.cend(); ++iter_A) {
+ Real x = iter_A->getRealX();
+ Real y = iter_A->getRealY();
+ if (x == std::numeric_limits<Real>::infinity()) {
+ y_plus_A.emplace_back(y, *iter_A);
+ } else if (x == -std::numeric_limits<Real>::infinity()) {
+ y_minus_A.emplace_back(y, *iter_A);
+ } else if (y == std::numeric_limits<Real>::infinity()) {
+ x_plus_A.emplace_back(x, *iter_A);
+ } else if (y == -std::numeric_limits<Real>::infinity()) {
+ x_minus_A.emplace_back(x, *iter_A);
}
}
- if (useHeurMinIdx and p_A.isNormal() and minDist > maxMinDist) {
- maxMinDist = minDist;
+
+ for (auto iter_B = B.cbegin(); iter_B != B.cend(); ++iter_B) {
+ Real x = iter_B->getRealX();
+ Real y = iter_B->getRealY();
+ if (x == std::numeric_limits<Real>::infinity()) {
+ y_plus_B.emplace_back(y, *iter_B);
+ } else if (x == -std::numeric_limits<Real>::infinity()) {
+ y_minus_B.emplace_back(y, *iter_B);
+ } else if (y == std::numeric_limits<Real>::infinity()) {
+ x_plus_B.emplace_back(x, *iter_B);
+ } else if (y == -std::numeric_limits<Real>::infinity()) {
+ x_minus_B.emplace_back(x, *iter_B);
+ }
}
- }
- std::sort(pairwiseDist.begin(), pairwiseDist.end());
+ CostEdgePairR result = getOneDimensionalCost(x_plus_A, x_plus_B);
- Real distEpsilon = std::numeric_limits<Real>::max();
- for(size_t k = 0; k < pairwiseDist.size() - 2; ++k) {
- auto diff = pairwiseDist[k+1]- pairwiseDist[k];
- if ( diff > 1.0e-10 and diff < distEpsilon ) {
- distEpsilon = diff;
+ CostEdgePairR next_cost_edge = getOneDimensionalCost(x_minus_A, x_minus_B);
+ if (next_cost_edge.cost > result.cost) {
+ result = next_cost_edge;
}
- }
- distEpsilon /= 3.0;
-
- BoundMatchOracle<Real> oracle(A, B, distEpsilon, useRangeSearch);
- // binary search
- size_t iterNum {0};
- size_t idxMin {0}, idxMax {pairwiseDist.size() - 1};
- if (useHeurMinIdx) {
- auto maxMinIter = std::equal_range(pairwiseDist.begin(), pairwiseDist.end(), maxMinDist);
- assert(maxMinIter.first != pairwiseDist.end());
- idxMin = maxMinIter.first - pairwiseDist.begin();
- //std::cout << "maxMinDist = " << maxMinDist << ", idxMin = " << idxMin << ", d = " << pairwiseDist[idxMin] << std::endl;
- }
- if (goUpToFindIdxMax) {
- if ( pairwiseDist.size() == 1) {
- return pairwiseDist[0];
+ next_cost_edge = getOneDimensionalCost(y_plus_A, y_plus_B);
+ if (next_cost_edge.cost > result.cost) {
+ result = next_cost_edge;
}
- idxMax = std::max<size_t>(idxMin, 1);
- while (!oracle.isMatchLess(pairwiseDist[idxMax])) {
- //std::cout << "entered while" << std::endl;
- idxMin = idxMax;
- if (2*idxMax > pairwiseDist.size() -1) {
- idxMax = pairwiseDist.size() - 1;
- break;
- } else {
- idxMax *= 2;
- }
+ next_cost_edge = getOneDimensionalCost(y_minus_A, y_minus_B);
+ if (next_cost_edge.cost > result.cost) {
+ result = next_cost_edge;
}
- //std::cout << "size = " << pairwiseDist.size() << ", idxMax = " << idxMax << ", pw[max] = " << pairwiseDist[idxMax] << std::endl;
+
+ return result;
}
- size_t idxMid { (idxMin + idxMax) / 2 };
- while(idxMax > idxMin) {
- iterNum++;
- if (oracle.isMatchLess(pairwiseDist[idxMid])) {
- idxMax = idxMid;
+ // return the interval (distMin, distMax) such that:
+ // a) actual bottleneck distance between A and B is contained in the interval
+ // b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon
+ template<class Real>
+ inline std::pair<Real, Real>
+ bottleneckDistApproxInterval(DiagramPointSet<Real>& A, DiagramPointSet<Real>& B, const Real epsilon,
+ MatchingEdge<Real>& edge, bool compute_longest_edge)
+ {
+ using MatchingEdgeR = MatchingEdge<Real>;
+ using CostEdgePairR = CostEdgePair<Real>;
+
+ edge = MatchingEdgeR();
+ // empty diagrams are not considered as error
+ if (A.empty() and B.empty()) {
+ return std::make_pair(0.0, 0.0);
+ }
+
+ CostEdgePairR inf_cost_edge = getInfinityCost(A, B, true);
+
+ Real infinity_cost = inf_cost_edge.cost;
+ if (infinity_cost == std::numeric_limits<Real>::infinity()) {
+ return std::make_pair(infinity_cost, infinity_cost);
} else {
- if (idxMax - idxMin == 1)
- idxMin++;
- else
- idxMin = idxMid;
+ edge = inf_cost_edge.edge;
+ }
+
+ // link diagrams A and B by adding projections
+ addProjections(A, B);
+
+ // TODO: think about that!
+ // we need one threshold for checking if the distance is 0,
+ // another one for the oracle!
+ constexpr Real epsThreshold { 1.0e-10 };
+ std::pair<Real, Real> result { 0.0, 0.0 };
+ bool useRangeSearch { true };
+ // construct an oracle
+ BoundMatchOracle<Real> oracle(A, B, epsThreshold, useRangeSearch);
+ // check for distance = 0
+ if (oracle.isMatchLess(2 * epsThreshold)) {
+ if (infinity_cost > epsThreshold) {
+ result.first = infinity_cost;
+ result.second = infinity_cost;
+ edge = inf_cost_edge.edge;
+ }
+ return result;
}
- idxMid = (idxMin + idxMax) / 2;
+ // get a 3-approximation of maximal distance between A and B
+ // as a starting value for probe distance
+ Real distProbe { getFurthestDistance3Approx<Real, DiagramPointSet<Real>>(A, B) };
+ binarySearch(epsilon, result, oracle, infinity_cost, false, distProbe);
+ // to compute longest edge a perfect matching is needed
+ if (compute_longest_edge and result.first > infinity_cost) {
+ oracle.isMatchLess(result.second);
+ edge = oracle.get_longest_edge();
+ }
+ return result;
}
- return pairwiseDist[idxMid];
- } else {
- // with greeedy matching
- long int N = A.size() * B.size();
- std::vector<DistVerticesPair> pairwiseDist;
- pairwiseDist.reserve(N);
- Real maxMinDist {0.0};
- size_t idxA{0}, idxB{0};
- for(auto p_A : A) {
- Real minDist { std::numeric_limits<Real>::max() };
- idxB = 0;
- for(auto p_B : B) {
- Real d = distLInf(p_A, p_B);
- pairwiseDist.push_back( std::make_pair(d, std::make_pair(idxA, idxB) ) );
- if (useHeurMinIdx and p_A.isNormal()) {
- if (d < minDist)
- minDist = d;
+
+ template<class Real>
+ void sampleDiagramForHeur(const DiagramPointSet <Real>& dgmIn, DiagramPointSet <Real>& dgmOut)
+ {
+ struct pair_hash
+ {
+ std::size_t operator()(const std::pair<Real, Real> p) const
+ {
+ return std::hash<Real>()(p.first) ^ std::hash<Real>()(p.second);
+ }
+ };
+ std::unordered_map<std::pair<Real, Real>, int, pair_hash> m;
+ for (auto ptIter = dgmIn.cbegin(); ptIter != dgmIn.cend(); ++ptIter) {
+ if (ptIter->isNormal() and not ptIter->isInfinity()) {
+ m[std::make_pair(ptIter->getRealX(), ptIter->getRealY())]++;
+ }
+ }
+ if (m.size() < 2) {
+ dgmOut = dgmIn;
+ return;
+ }
+ std::vector<int> v;
+ for (const auto& ptQtyPair : m) {
+ v.push_back(ptQtyPair.second);
+ }
+ std::sort(v.begin(), v.end());
+ int maxLeap = v[1] - v[0];
+ int cutVal = v[0];
+ for (int i = 1; i < static_cast<int>(v.size()) - 1; ++i) {
+ int currLeap = v[i + 1] - v[i];
+ if (currLeap > maxLeap) {
+ maxLeap = currLeap;
+ cutVal = v[i];
}
- idxB++;
}
- if (useHeurMinIdx and p_A.isNormal() and minDist > maxMinDist) {
- maxMinDist = minDist;
+ std::vector<std::pair<Real, Real>> vv;
+ // keep points whose multiplicites are at most cutVal
+ // quick-and-dirty: fill in vv with copies of each point
+ // to construct DiagramPointSet from it later
+ for (const auto& ptQty : m) {
+ if (ptQty.second < cutVal) {
+ for (int i = 0; i < ptQty.second; ++i) {
+ vv.push_back(std::make_pair(ptQty.first.first, ptQty.first.second));
+ }
+ }
}
- idxA++;
+ dgmOut.clear();
+ dgmOut = DiagramPointSet<Real>(vv.begin(), vv.end());
}
- auto compLambda = [](DistVerticesPair a, DistVerticesPair b)
- { return a.first < b.first;};
- std::sort(pairwiseDist.begin(),
- pairwiseDist.end(),
- compLambda);
+ // return the interval (distMin, distMax) such that:
+ // a) actual bottleneck distance between A and B is contained in the interval
+ // b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon
+ template<class Real>
+ std::pair<Real, Real>
+ bottleneckDistApproxIntervalWithInitial(DiagramPointSet <Real>& A, DiagramPointSet <Real>& B,
+ const Real epsilon,
+ const std::pair<Real, Real> initialGuess,
+ const Real infinity_cost,
+ MatchingEdge <Real>& longest_edge,
+ bool compute_longest_edge = false)
+ {
+ // empty diagrams are not considered as error
+ if (A.empty() and B.empty()) {
+ return std::make_pair(0.0, 0.0);
+ }
+
+ // link diagrams A and B by adding projections
+ addProjections(A, B);
+
+ constexpr Real epsThreshold { 1.0e-10 };
+ std::pair<Real, Real> result { 0.0, 0.0 };
+ bool useRangeSearch { true };
+ // construct an oracle
+ BoundMatchOracle<Real> oracle(A, B, epsThreshold, useRangeSearch);
+
+ Real& distMin { result.first };
+ Real& distMax { result.second };
- Real distEpsilon = std::numeric_limits<Real>::max();
- for(size_t k = 0; k < pairwiseDist.size() - 2; ++k) {
- auto diff = pairwiseDist[k+1].first - pairwiseDist[k].first;
- if ( diff > 1.0e-10 and diff < distEpsilon ) {
- distEpsilon = diff;
+ // initialize search interval from initialGuess
+ distMin = initialGuess.first;
+ distMax = initialGuess.second;
+
+ assert(distMin <= distMax);
+
+ // make sure that distMin is a lower bound
+ while (oracle.isMatchLess(distMin)) {
+ // distMin is in fact an upper bound, so assign it to distMax
+ distMax = distMin;
+ // and decrease distMin by 5 %
+ distMin = 0.95 * distMin;
}
- }
- distEpsilon /= 3.0;
-
- BoundMatchOracle<Real> oracle(A, B, distEpsilon, useRangeSearch);
-
- // construct greedy matching
- size_t numVert { A.size() };
- size_t numMatched { 0 };
- std::unordered_set<size_t> aTobMatched, bToaMatched;
- aTobMatched.reserve(numVert);
- bToaMatched.reserve(numVert);
- size_t distVecIdx {0};
- while( numMatched < numVert) {
- auto vertPair = pairwiseDist[distVecIdx++].second;
- //std::cout << "distVecIdx = " << distVecIdx << ", matched: " << numMatched << " out of " << numVert << std::endl;
- //std::cout << "vertex A idx = " << vertPair.first << ", B idx: " << vertPair.second << " out of " << numVert << std::endl;
- if ( aTobMatched.count(vertPair.first) == 0 and
- bToaMatched.count(vertPair.second) == 0 ) {
- aTobMatched.insert(vertPair.first);
- bToaMatched.insert(vertPair.second);
- numMatched++;
+
+ // make sure that distMax is an upper bound
+ while (not oracle.isMatchLess(distMax)) {
+ // distMax is in fact a lower bound, so assign it to distMin
+ distMin = distMax;
+ // and increase distMax by 5 %
+ distMax = 1.05 * distMax;
}
- }
- size_t idxMax = distVecIdx-1;
- //std::cout << "idxMax = " << idxMax << ", size = " << pairwiseDist.size() << std::endl;
- // binary search
- size_t iterNum {0};
- size_t idxMin {0};
- if (useHeurMinIdx) {
- auto maxMinIter = std::equal_range(pairwiseDist.begin(),
- pairwiseDist.end(),
- std::make_pair(maxMinDist, std::make_pair(0,0)),
- compLambda);
- assert(maxMinIter.first != pairwiseDist.end());
- idxMin = maxMinIter.first - pairwiseDist.begin();
- //std::cout << "maxMinDist = " << maxMinDist << ", idxMin = " << idxMin << ", d = " << pairwiseDist[idxMin].first << std::endl;
- }
- size_t idxMid { (idxMin + idxMax) / 2 };
- while(idxMax > idxMin) {
- iterNum++;
- if (oracle.isMatchLess(pairwiseDist[idxMid].first)) {
- idxMax = idxMid;
- } else {
- if (idxMax - idxMin == 1)
- idxMin++;
- else
- idxMin = idxMid;
+
+ // bounds are found, perform binary search
+ Real distProbe = (distMin + distMax) / 2.0;
+ binarySearch(epsilon, result, oracle, infinity_cost, true, distProbe);
+ if (compute_longest_edge) {
+ longest_edge = oracle.get_longest_edge();
}
- idxMid = (idxMin + idxMax) / 2;
+ return result;
}
- return pairwiseDist[idxMid].first;
- }
- // stats
- /*
- // count number of edges
- // pairwiseDist is sorted, add edges of the same length
- int edgeNumber {idxMid};
- while(pairwiseDist[edgeNumber + 1] == pairwiseDist[edgeNumber])
- edgeNumber++;
- // add edges between diagonal points
- edgeNumber += N / 3;
- // output stats
- std::cout << idxMid << "\t" << N;
- std::cout << "\t" << iterNum;
- std::cout << "\t" << A.size() + B.size();
- std::cout << "\t" << edgeNumber << "\t";
- std::cout << (Real)(edgeNumber) / (Real)(A.size() + B.size()) << std::endl;
- */
-}
-
-// wrappers
-template<class Real>
-bool readDiagramPointSet(const std::string& fname, std::vector<std::pair<Real, Real>>& result)
-{
- int decPrecision;
- return readDiagramPointSet(fname.c_str(), result, decPrecision);
-}
-
-template<class Real>
-bool readDiagramPointSet(const char* fname, std::vector<std::pair<Real, Real>>& result)
-{
- int decPrecision;
- return readDiagramPointSet(fname, result, decPrecision);
-}
-
-template<class Real>
-bool readDiagramPointSet(const std::string& fname, std::vector<std::pair<Real, Real>>& result, int& decPrecision)
-{
- return readDiagramPointSet(fname.c_str(), result, decPrecision);
-}
-
-// reading function
-template<class Real>
-bool readDiagramPointSet(const char* fname, std::vector<std::pair<Real, Real>>& result, int& decPrecision)
-{
- size_t lineNumber { 0 };
- result.clear();
- std::ifstream f(fname);
- if (!f.good()) {
-#ifndef FOR_R_TDA
- std::cerr << "Cannot open file " << fname << std::endl;
-#endif
- return false;
- }
- std::string line;
- while(std::getline(f, line)) {
- lineNumber++;
- // process comments: remove everything after hash
- auto hashPos = line.find_first_of("#", 0);
- if( std::string::npos != hashPos) {
- line = std::string(line.begin(), line.begin() + hashPos);
- }
- if (line.empty()) {
- continue;
+
+ // return the interval (distMin, distMax) such that:
+ // a) actual bottleneck distance between A and B is contained in the interval
+ // b) if the interval is not (0,0), then (distMax - distMin) / distMin < epsilon
+ // use heuristic: initial estimate on sampled diagrams
+ template<class Real>
+ std::pair<Real, Real>
+ bottleneckDistApproxIntervalHeur(DiagramPointSet <Real>& A, DiagramPointSet <Real>& B, const Real epsilon,
+ MatchingEdge <Real>& longest_edge)
+ {
+ // empty diagrams are not considered as error
+ if (A.empty() and B.empty()) {
+ return std::make_pair(0.0, 0.0);
+ }
+
+ Real infinity_cost = getInfinityCost(A, B);
+ if (infinity_cost == std::numeric_limits<Real>::infinity()) {
+ return std::make_pair(infinity_cost, infinity_cost);
+ }
+
+ DiagramPointSet<Real> sampledA, sampledB;
+ sampleDiagramForHeur(A, sampledA);
+ sampleDiagramForHeur(B, sampledB);
+
+ std::pair<Real, Real> initGuess = bottleneckDistApproxInterval(sampledA, sampledB, epsilon);
+
+ initGuess.first = std::max(initGuess.first, infinity_cost);
+ initGuess.second = std::max(initGuess.second, infinity_cost);
+
+ return bottleneckDistApproxIntervalWithInitial<Real>(A, B, epsilon, initGuess, infinity_cost, longest_edge);
}
- // trim whitespaces
- auto whiteSpaceFront = std::find_if_not(line.begin(),line.end(),isspace);
- auto whiteSpaceBack = std::find_if_not(line.rbegin(),line.rend(),isspace).base();
- if (whiteSpaceBack <= whiteSpaceFront) {
- // line consists of spaces only - move to the next line
- continue;
+
+
+ // get approximate distance,
+ // see bottleneckDistApproxInterval
+ template<class Real>
+ Real bottleneckDistApprox(DiagramPointSet <Real>& A, DiagramPointSet <Real>& B, const Real epsilon,
+ MatchingEdge <Real>& longest_edge, bool compute_longest_edge)
+ {
+ auto interval = bottleneckDistApproxInterval<Real>(A, B, epsilon, longest_edge, compute_longest_edge);
+ return interval.second;
}
- line = std::string(whiteSpaceFront,whiteSpaceBack);
- bool fracPart = false;
- int currDecPrecision = 0;
- for(auto c : line) {
- if (c == '.') {
- fracPart = true;
- } else if (fracPart) {
- if (isdigit(c)) {
- currDecPrecision++;
+
+
+ template<class Real>
+ Real bottleneckDistExactFromSortedPwDist(DiagramPointSet <Real>& A, DiagramPointSet <Real>& B,
+ const std::vector<Real>& pairwiseDist,
+ const int decPrecision, MatchingEdge <Real>& longest_edge,
+ bool compute_longest_edge = false)
+ {
+ // trivial case: we have only one candidate
+ if (pairwiseDist.size() == 1) {
+ return pairwiseDist[0];
+ }
+
+ bool useRangeSearch = true;
+ Real distEpsilon = std::numeric_limits<Real>::max();
+ Real diffThreshold = 0.1;
+ for (int k = 0; k < decPrecision; ++k) {
+ diffThreshold /= 10;
+ }
+ for (size_t k = 0; k < pairwiseDist.size() - 2; ++k) {
+ auto diff = pairwiseDist[k + 1] - pairwiseDist[k];
+ if (diff > diffThreshold and diff < distEpsilon) {
+ distEpsilon = diff;
+ }
+ }
+ distEpsilon = std::min(diffThreshold, distEpsilon / 3);
+
+ BoundMatchOracle<Real> oracle(A, B, distEpsilon, useRangeSearch);
+ // binary search
+ size_t iterNum { 0 };
+ size_t idxMin { 0 }, idxMax { pairwiseDist.size() - 1 };
+ size_t idxMid;
+ while (idxMax > idxMin) {
+ idxMid = static_cast<size_t>(floor(idxMin + idxMax) / 2);
+ iterNum++;
+ // not A[imid] < dist <=> A[imid] >= dist <=> A[imid[ >= dist + eps
+ if (oracle.isMatchLess(pairwiseDist[idxMid] + distEpsilon / 2)) {
+ idxMax = idxMid;
} else {
- fracPart = false;
- if (currDecPrecision > decPrecision)
- decPrecision = currDecPrecision;
- currDecPrecision = 0;
+ idxMin = idxMid + 1;
}
}
+ idxMid = static_cast<size_t>(floor(idxMin + idxMax) / 2);
+ Real result = pairwiseDist[idxMid];
+ if (compute_longest_edge) {
+ oracle.isMatchLess(result + distEpsilon / 2);
+ longest_edge = oracle.get_longest_edge();
+ }
+ return result;
}
- Real x, y;
- std::istringstream iss(line);
- if (not(iss >> x >> y)) {
-#ifndef FOR_R_TDA
- std::cerr << "Error in file " << fname << ", line number " << lineNumber << ": cannot parse \"" << line << "\"" << std::endl;
-#endif
- return false;
+
+
+ template<class Real>
+ Real
+ bottleneckDistExact(DiagramPointSet <Real>& A, DiagramPointSet <Real>& B, MatchingEdge <Real>& longest_edge,
+ bool compute_longest_edge)
+ {
+ return bottleneckDistExact(A, B, 14, longest_edge, compute_longest_edge);
}
- if ( x != y ) {
- result.push_back(std::make_pair(x,y));
- } else {
-#ifndef FOR_R_TDA
-#ifndef VERBOSE_BOTTLENECK
- std::cerr << "Warning: in file " << fname << ", line number " << lineNumber << ", zero persistence point ignored: \"" << line << "\"" << std::endl;
-#endif
-#endif
+
+ template<class Real>
+ Real bottleneckDistExact(DiagramPointSet <Real>& A, DiagramPointSet <Real>& B, const int decPrecision,
+ MatchingEdge <Real>& longest_edge, bool compute_longest_edge)
+ {
+ using DgmPoint = DiagramPoint<Real>;
+
+ constexpr Real epsilon = 0.001;
+ auto interval = bottleneckDistApproxInterval(A, B, epsilon, longest_edge, true);
+ // if the longest edge is on infinity, the answer is already exact
+ // this will be detected here and all the code after if
+ // may assume that the longest edge is on finite points
+ if (interval.first == interval.second) {
+ return interval.first;
+ }
+ const Real delta = 0.50001 * (interval.second - interval.first);
+ const Real approxDist = 0.5 * (interval.first + interval.second);
+ const Real minDist = interval.first;
+ const Real maxDist = interval.second;
+ if (delta == 0) {
+ return interval.first;
+ }
+ // copy points from A to a vector
+ // todo: get rid of this?
+ std::vector<DgmPoint> pointsA;
+ pointsA.reserve(A.size());
+ for (const auto& ptA : A) {
+ pointsA.push_back(ptA);
+ }
+
+ // in this vector we store the distances between the points
+ // that are candidates to realize
+ std::set<Real> pairwiseDist;
+ {
+ // vector to store centers of vertical stripes
+ // two for each point in A and the id of the corresponding point
+ std::vector<std::pair<Real, DgmPoint>> xCentersVec;
+ xCentersVec.reserve(2 * pointsA.size());
+ for (auto ptA : pointsA) {
+ xCentersVec.push_back(std::make_pair(ptA.getRealX() - approxDist, ptA));
+ xCentersVec.push_back(std::make_pair(ptA.getRealX() + approxDist, ptA));
+ }
+ // lambda to compare pairs <coordinate, id> w.r.t coordinate
+ auto compLambda = [](std::pair<Real, DgmPoint> a, std::pair<Real, DgmPoint> b) {
+ return a.first < b.first;
+ };
+
+ std::sort(xCentersVec.begin(), xCentersVec.end(), compLambda);
+ // todo: sort points in B, reduce search range in lower and upper bounds
+ for (auto ptB : B) {
+ // iterator to the first stripe such that ptB lies to the left
+ // from its right boundary (x_B <= x_j + \delta iff x_j >= x_B - \delta
+ auto itStart = std::lower_bound(xCentersVec.begin(),
+ xCentersVec.end(),
+ std::make_pair(ptB.getRealX() - delta, ptB),
+ compLambda);
+
+ for (auto iterA = itStart; iterA < xCentersVec.end(); ++iterA) {
+ if (ptB.getRealX() < iterA->first - delta) {
+ // from that moment x_B >= x_j - delta
+ // is violated: x_B no longer lies to right from the left
+ // boundary of current stripe
+ break;
+ }
+ // we're here => ptB lies in vertical stripe,
+ // check if distance fits into the interval we've found
+ Real pwDist = distLInf(iterA->second, ptB);
+ if (pwDist >= minDist and pwDist <= maxDist) {
+ pairwiseDist.insert(pwDist);
+ }
+ }
+ }
+ }
+
+ {
+ // for y
+ // vector to store centers of vertical stripes
+ // two for each point in A and the id of the corresponding point
+ std::vector<std::pair<Real, DgmPoint>> yCentersVec;
+ yCentersVec.reserve(2 * pointsA.size());
+ for (auto ptA : pointsA) {
+ yCentersVec.push_back(std::make_pair(ptA.getRealY() - approxDist, ptA));
+ yCentersVec.push_back(std::make_pair(ptA.getRealY() + approxDist, ptA));
+ }
+ // lambda to compare pairs <coordinate, id> w.r.t coordinate
+ auto compLambda = [](std::pair<Real, DgmPoint> a, std::pair<Real, DgmPoint> b) {
+ return a.first < b.first;
+ };
+
+ std::sort(yCentersVec.begin(), yCentersVec.end(), compLambda);
+
+ // todo: sort points in B, reduce search range in lower and upper bounds
+ for (auto ptB : B) {
+ auto itStart = std::lower_bound(yCentersVec.begin(),
+ yCentersVec.end(),
+ std::make_pair(ptB.getRealY() - delta, ptB),
+ compLambda);
+
+
+ for (auto iterA = itStart; iterA < yCentersVec.end(); ++iterA) {
+ if (ptB.getRealY() < iterA->first - delta) {
+ break;
+ }
+ Real pwDist = distLInf(iterA->second, ptB);
+ if (pwDist >= minDist and pwDist <= maxDist) {
+ pairwiseDist.insert(pwDist);
+ }
+ }
+ }
+ }
+
+ std::vector<Real> pw_dists;
+ pw_dists.reserve(pairwiseDist.size());
+ for(Real d : pairwiseDist) {
+ pw_dists.push_back(d);
+ }
+
+ return bottleneckDistExactFromSortedPwDist(A, B, pw_dists, decPrecision, longest_edge,
+ compute_longest_edge);
}
- }
- f.close();
- return true;
-}
-} // end namespace bt
+ } // end namespace bt
} // end namespace hera
#endif // HERA_BOTTLENECK_HPP
diff --git a/geom_bottleneck/include/bound_match.h b/geom_bottleneck/include/bound_match.h
index 770c7df..99543f9 100644
--- a/geom_bottleneck/include/bound_match.h
+++ b/geom_bottleneck/include/bound_match.h
@@ -56,6 +56,7 @@ public:
bool getMatchedVertex(const DgmPoint& p, DgmPoint& result) const;
bool isPerfect() const;
void trimMatching(const Real newThreshold);
+ MatchingEdge<Real> get_longest_edge() const;
#ifndef FOR_R_TDA
template<class R>
friend std::ostream& operator<<(std::ostream& output, const Matching<R>& m);
@@ -82,6 +83,7 @@ public:
BoundMatchOracle(DgmPointSet psA, DgmPointSet psB, Real dEps, bool useRS = true);
bool isMatchLess(Real r);
bool buildMatchingForThreshold(const Real r);
+ MatchingEdge<Real> get_longest_edge() const { return M.get_longest_edge(); }
private:
DgmPointSet A, B;
Matching<Real> M;
diff --git a/geom_bottleneck/include/bound_match.hpp b/geom_bottleneck/include/bound_match.hpp
index 221bd0f..b95628f 100644
--- a/geom_bottleneck/include/bound_match.hpp
+++ b/geom_bottleneck/include/bound_match.hpp
@@ -45,429 +45,467 @@ derivative works thereof, in binary and source code form.
#endif
#ifndef FOR_R_TDA
+
#include <iostream>
+
#endif
-namespace hera{
-namespace bt {
+namespace hera {
+ namespace bt {
#ifndef FOR_R_TDA
-template<class Real>
-std::ostream& operator<<(std::ostream& output, const Matching<Real>& m)
-{
- output << "Matching: " << m.AToB.size() << " pairs (";
- if (!m.isPerfect()) {
- output << "not";
- }
- output << " perfect)" << std::endl;
- for(auto atob : m.AToB) {
- output << atob.first << " <-> " << atob.second << " distance: " << distLInf(atob.first, atob.second) << std::endl;
- }
- return output;
-}
+
+ template<class Real>
+ std::ostream& operator<<(std::ostream& output, const Matching <Real>& m)
+ {
+ output << "Matching: " << m.AToB.size() << " pairs (";
+ if (!m.isPerfect()) {
+ output << "not";
+ }
+ output << " perfect)" << std::endl;
+ for (auto atob : m.AToB) {
+ output << atob.first << " <-> " << atob.second << " distance: " << distLInf(atob.first, atob.second)
+ << std::endl;
+ }
+ return output;
+ }
+
#endif
-template<class R>
-void Matching<R>::sanityCheck() const
-{
+ template<class R>
+ void Matching<R>::sanityCheck() const
+ {
#ifdef DEBUG_MATCHING
- assert( AToB.size() == BToA.size() );
- for(auto aToBPair : AToB) {
- auto bToAPair = BToA.find(aToBPair.second);
- assert(bToAPair != BToA.end());
- assert( aToBPair.first == bToAPair->second);
- }
+ assert( AToB.size() == BToA.size() );
+ for(auto aToBPair : AToB) {
+ auto bToAPair = BToA.find(aToBPair.second);
+ assert(bToAPair != BToA.end());
+ assert( aToBPair.first == bToAPair->second);
+ }
#endif
-}
-
-template<class R>
-bool Matching<R>::isPerfect() const
-{
- return AToB.size() == A.size();
-}
-
-template<class R>
-void Matching<R>::matchVertices(const DgmPoint& pA, const DgmPoint& pB)
-{
- assert(A.hasElement(pA));
- assert(B.hasElement(pB));
- AToB.erase(pA);
- AToB.insert( {{ pA, pB }} );
- BToA.erase(pB);
- BToA.insert( {{ pB, pA }} );
-}
-
-template<class R>
-bool Matching<R>::getMatchedVertex(const DgmPoint& p, DgmPoint& result) const
-{
- sanityCheck();
- auto inA = AToB.find(p);
- if (inA != AToB.end()) {
- result = inA->second;
- return true;
- } else {
- auto inB = BToA.find(p);
- if (inB != BToA.end()) {
- result = inB->second;
- return true;
}
- }
- return false;
-}
-
-
-template<class R>
-void Matching<R>::checkAugPath(const Path& augPath) const
-{
- assert(augPath.size() % 2 == 0);
- for(size_t idx = 0; idx < augPath.size(); ++idx) {
- bool mustBeExposed { idx == 0 or idx == augPath.size() - 1 };
- if (isExposed(augPath[idx]) != mustBeExposed) {
+
+ template<class R>
+ bool Matching<R>::isPerfect() const
+ {
+ return AToB.size() == A.size();
+ }
+
+ template<class R>
+ void Matching<R>::matchVertices(const DgmPoint& pA, const DgmPoint& pB)
+ {
+ assert(A.hasElement(pA));
+ assert(B.hasElement(pB));
+ AToB.erase(pA);
+ AToB.insert({{ pA, pB }});
+ BToA.erase(pB);
+ BToA.insert({{ pB, pA }});
+ }
+
+ template<class R>
+ bool Matching<R>::getMatchedVertex(const DgmPoint& p, DgmPoint& result) const
+ {
+ sanityCheck();
+ auto inA = AToB.find(p);
+ if (inA != AToB.end()) {
+ result = inA->second;
+ return true;
+ } else {
+ auto inB = BToA.find(p);
+ if (inB != BToA.end()) {
+ result = inB->second;
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ template<class R>
+ void Matching<R>::checkAugPath(const Path& augPath) const
+ {
+ assert(augPath.size() % 2 == 0);
+ for (size_t idx = 0; idx < augPath.size(); ++idx) {
+ bool mustBeExposed { idx == 0 or idx == augPath.size() - 1 };
+ if (isExposed(augPath[idx]) != mustBeExposed) {
#ifndef FOR_R_TDA
- std::cerr << "mustBeExposed = " << mustBeExposed << ", idx = " << idx << ", point " << augPath[idx] << std::endl;
+ std::cerr << "mustBeExposed = " << mustBeExposed << ", idx = " << idx << ", point " << augPath[idx]
+ << std::endl;
#endif
+ }
+ assert(isExposed(augPath[idx]) == mustBeExposed);
+ DgmPoint matchedVertex;
+ if (idx % 2 == 0) {
+ assert(A.hasElement(augPath[idx]));
+ if (not mustBeExposed) {
+ getMatchedVertex(augPath[idx], matchedVertex);
+ assert(matchedVertex == augPath[idx - 1]);
+ }
+ } else {
+ assert(B.hasElement(augPath[idx]));
+ if (not mustBeExposed) {
+ getMatchedVertex(augPath[idx], matchedVertex);
+ assert(matchedVertex == augPath[idx + 1]);
+ }
+ }
+ }
}
- assert( isExposed(augPath[idx]) == mustBeExposed );
- DgmPoint matchedVertex {0.0, 0.0, DgmPoint::DIAG, 1};
- if ( idx % 2 == 0 ) {
- assert( A.hasElement(augPath[idx]));
- if (not mustBeExposed) {
- getMatchedVertex(augPath[idx], matchedVertex);
- assert(matchedVertex == augPath[idx - 1]);
+
+ // use augmenting path to increase
+ // the size of the matching
+ template<class R>
+ void Matching<R>::increase(const Path& augPath)
+ {
+ sanityCheck();
+ // check that augPath is an augmenting path
+ checkAugPath(augPath);
+ for (size_t idx = 0; idx < augPath.size() - 1; idx += 2) {
+ matchVertices(augPath[idx], augPath[idx + 1]);
}
- } else {
- assert( B.hasElement(augPath[idx]));
- if (not mustBeExposed) {
- getMatchedVertex(augPath[idx], matchedVertex);
- assert(matchedVertex == augPath[idx + 1]);
+ sanityCheck();
+ }
+
+ template<class R>
+ DiagramPointSet <R> Matching<R>::getExposedVertices(bool forA) const
+ {
+ sanityCheck();
+ DgmPointSet result;
+ const DgmPointSet* setToSearch { forA ? &A : &B };
+ const std::unordered_map<DgmPoint, DgmPoint, DgmPointHash>* mapToSearch { forA ? &AToB : &BToA };
+ for (auto it = setToSearch->cbegin(); it != setToSearch->cend(); ++it) {
+ if (mapToSearch->find((*it)) == mapToSearch->cend()) {
+ result.insert((*it));
+ }
}
+ return result;
}
- }
-}
-
-// use augmenting path to increase
-// the size of the matching
-template<class R>
-void Matching<R>::increase(const Path& augPath)
-{
- sanityCheck();
- // check that augPath is an augmenting path
- checkAugPath(augPath);
- for(size_t idx = 0; idx < augPath.size() - 1; idx += 2) {
- matchVertices( augPath[idx], augPath[idx + 1]);
- }
- sanityCheck();
-}
-
-template<class R>
-DiagramPointSet<R> Matching<R>::getExposedVertices(bool forA) const
-{
- sanityCheck();
- DgmPointSet result;
- const DgmPointSet* setToSearch { forA ? &A : &B };
- const std::unordered_map<DgmPoint, DgmPoint, DgmPointHash>* mapToSearch { forA ? &AToB : &BToA };
- for(auto it = setToSearch->cbegin(); it != setToSearch->cend(); ++it) {
- if (mapToSearch->find((*it)) == mapToSearch->cend()) {
- result.insert((*it));
+
+ template<class R>
+ void Matching<R>::getAllAdjacentVertices(const DgmPointSet& setIn,
+ DgmPointSet& setOut,
+ bool forA) const
+ {
+ sanityCheck();
+ //bool isDebug {false};
+ setOut.clear();
+ const std::unordered_map<DgmPoint, DgmPoint, DgmPointHash>* m;
+ m = (forA) ? &BToA : &AToB;
+ for (auto pit = setIn.cbegin(); pit != setIn.cend(); ++pit) {
+ auto findRes = m->find(*pit);
+ if (findRes != m->cend()) {
+ setOut.insert((*findRes).second);
+ }
+ }
+ sanityCheck();
}
- }
- return result;
-}
-
-template<class R>
-void Matching<R>::getAllAdjacentVertices(const DgmPointSet& setIn,
- DgmPointSet& setOut,
- bool forA) const
-{
- sanityCheck();
- //bool isDebug {false};
- setOut.clear();
- const std::unordered_map<DgmPoint, DgmPoint, DgmPointHash>* m;
- m = ( forA ) ? &BToA : &AToB;
- for(auto pit = setIn.cbegin(); pit != setIn.cend(); ++pit) {
- auto findRes = m->find(*pit);
- if (findRes != m->cend()) {
- setOut.insert((*findRes).second);
+
+ template<class R>
+ bool Matching<R>::isExposed(const DgmPoint& p) const
+ {
+ return (AToB.find(p) == AToB.end()) && (BToA.find(p) == BToA.end());
}
- }
- sanityCheck();
-}
-
-template<class R>
-bool Matching<R>::isExposed(const DgmPoint& p) const
-{
- return ( AToB.find(p) == AToB.end() ) && ( BToA.find(p) == BToA.end() );
-}
-
-// remove all edges whose length is > newThreshold
-template<class R>
-void Matching<R>::trimMatching(const R newThreshold)
-{
- //bool isDebug { false };
- sanityCheck();
- for(auto aToBIter = AToB.begin(); aToBIter != AToB.end(); ) {
- if ( distLInf(aToBIter->first, aToBIter->second) > newThreshold ) {
- // remove edge from AToB and BToA
- BToA.erase(aToBIter->second);
- aToBIter = AToB.erase(aToBIter);
- } else {
- aToBIter++;
+
+ // remove all edges whose length is > newThreshold
+ template<class R>
+ void Matching<R>::trimMatching(const R newThreshold)
+ {
+ //bool isDebug { false };
+ sanityCheck();
+ for (auto aToBIter = AToB.begin(); aToBIter != AToB.end();) {
+ if (distLInf(aToBIter->first, aToBIter->second) > newThreshold) {
+ // remove edge from AToB and BToA
+ BToA.erase(aToBIter->second);
+ aToBIter = AToB.erase(aToBIter);
+ } else {
+ aToBIter++;
+ }
+ }
+ sanityCheck();
+ }
+
+ template<class R>
+ MatchingEdge <R> Matching<R>::get_longest_edge() const
+ {
+ R max_dist = -1.0;
+ MatchingEdge<R> edge;
+ for (const auto& x : AToB) {
+ //std::cout << "max_dist = " << max_dist << std::endl;
+ //std::cout << "distance = " << distLInf(x.first, x.second) << std::endl;
+
+ // for now skew edges may appear in the matching
+ // but they should not be returned to user
+ // if currrent edge is a skew edge, there must another edge
+ // with the same cost
+ R curr_dist;
+ if (x.first.isDiagonal() and x.second.isNormal()) {
+ curr_dist = x.second.get_persistence(hera::get_infinity());
+ } else if (x.first.isNormal() and x.second.isDiagonal()) {
+ curr_dist = x.first.get_persistence(hera::get_infinity());
+ } else {
+ curr_dist = distLInf(x.first, x.second);
+ }
+ if (max_dist < curr_dist) {
+ max_dist = curr_dist;
+ edge = x;
+ //std::cout << "updated max_dist = " << max_dist << std::endl;
+ //std::cout << "updated edge = " << x.first << " <-> " << x.second << std::endl;
+ }
+ }
+ return edge;
+ }
+
+ // ------- BoundMatchOracle --------------
+
+ template<class R, class NO>
+ BoundMatchOracle<R, NO>::BoundMatchOracle(DgmPointSet psA, DgmPointSet psB,
+ Real dEps, bool useRS) :
+ A(psA), B(psB), M(A, B), distEpsilon(dEps), useRangeSearch(useRS), prevQueryValue(0.0)
+ {
+ neighbOracle = std::unique_ptr<NeighbOracle>(new NeighbOracle(psB, 0, distEpsilon));
}
- }
- sanityCheck();
-}
-
-// ------- BoundMatchOracle --------------
-
-template<class R, class NO>
-BoundMatchOracle<R, NO>::BoundMatchOracle(DgmPointSet psA, DgmPointSet psB,
- Real dEps, bool useRS) :
- A(psA), B(psB), M(A, B), distEpsilon(dEps), useRangeSearch(useRS), prevQueryValue(0.0)
-{
- neighbOracle = std::unique_ptr<NeighbOracle>(new NeighbOracle(psB, 0, distEpsilon));
-}
-
-template<class R, class NO>
-bool BoundMatchOracle<R, NO>::isMatchLess(Real r)
-{
+
+ template<class R, class NO>
+ bool BoundMatchOracle<R, NO>::isMatchLess(Real r)
+ {
#ifdef VERBOSE_BOTTLENECK
- std::chrono::high_resolution_clock hrClock;
- std::chrono::time_point<std::chrono::high_resolution_clock> startMoment;
- startMoment = hrClock.now();
+ std::chrono::high_resolution_clock hrClock;
+ std::chrono::time_point<std::chrono::high_resolution_clock> startMoment;
+ startMoment = hrClock.now();
#endif
- bool result = buildMatchingForThreshold(r);
+ bool result = buildMatchingForThreshold(r);
#ifdef VERBOSE_BOTTLENECK
- auto endMoment = hrClock.now();
- std::chrono::duration<double, std::milli> iterTime = endMoment - startMoment;
- std::cout << "isMatchLess for r = " << r << " finished in " << std::chrono::duration<double, std::milli>(iterTime).count() << " ms." << std::endl;
+ auto endMoment = hrClock.now();
+ std::chrono::duration<double, std::milli> iterTime = endMoment - startMoment;
+ std::cout << "isMatchLess for r = " << r << " finished in " << std::chrono::duration<double, std::milli>(iterTime).count() << " ms." << std::endl;
#endif
- return result;
-
-}
-
-
-template<class R, class NO>
-void BoundMatchOracle<R, NO>::removeFromLayer(const DgmPoint& p, const int layerIdx) {
- //bool isDebug {false};
- layerGraph[layerIdx].erase(p);
- if (layerOracles[layerIdx]) {
- layerOracles[layerIdx]->deletePoint(p);
- }
-}
-
-// return true, if there exists an augmenting path from startVertex
-// in this case the path is returned in result.
-// startVertex must be an exposed vertex from L_1 (layer[0])
-template<class R, class NO>
-bool BoundMatchOracle<R, NO>::buildAugmentingPath(const DgmPoint startVertex, Path& result)
-{
- //bool isDebug {false};
- DgmPoint prevVertexA = startVertex;
- result.clear();
- result.push_back(startVertex);
- size_t evenLayerIdx {1};
- while ( evenLayerIdx < layerGraph.size() ) {
- //for(size_t evenLayerIdx = 1; evenLayerIdx < layerGraph.size(); evenLayerIdx += 2) {
- DgmPoint nextVertexB{0.0, 0.0, DgmPoint::DIAG, 1}; // next vertex from even layer
- bool neighbFound = layerOracles[evenLayerIdx]->getNeighbour(prevVertexA, nextVertexB);
- if (neighbFound) {
- result.push_back(nextVertexB);
- if ( layerGraph.size() == evenLayerIdx + 1) {
- break;
- } else {
- // nextVertexB must be matched with some vertex from the next odd
- // layer
- DgmPoint nextVertexA {0.0, 0.0, DgmPoint::DIAG, 1};
- if (!M.getMatchedVertex(nextVertexB, nextVertexA)) {
+ return result;
+
+ }
+
+
+ template<class R, class NO>
+ void BoundMatchOracle<R, NO>::removeFromLayer(const DgmPoint& p, const int layerIdx)
+ {
+ //bool isDebug {false};
+ layerGraph[layerIdx].erase(p);
+ if (layerOracles[layerIdx]) {
+ layerOracles[layerIdx]->deletePoint(p);
+ }
+ }
+
+ // return true, if there exists an augmenting path from startVertex
+ // in this case the path is returned in result.
+ // startVertex must be an exposed vertex from L_1 (layer[0])
+ template<class R, class NO>
+ bool BoundMatchOracle<R, NO>::buildAugmentingPath(const DgmPoint startVertex, Path& result)
+ {
+ //bool isDebug {false};
+ DgmPoint prevVertexA = startVertex;
+ result.clear();
+ result.push_back(startVertex);
+ size_t evenLayerIdx { 1 };
+ while (evenLayerIdx < layerGraph.size()) {
+ //for(size_t evenLayerIdx = 1; evenLayerIdx < layerGraph.size(); evenLayerIdx += 2) {
+ DgmPoint nextVertexB; // next vertex from even layer
+ bool neighbFound = layerOracles[evenLayerIdx]->getNeighbour(prevVertexA, nextVertexB);
+ if (neighbFound) {
+ result.push_back(nextVertexB);
+ if (layerGraph.size() == evenLayerIdx + 1) {
+ break;
+ } else {
+ // nextVertexB must be matched with some vertex from the next odd
+ // layer
+ DgmPoint nextVertexA;
+ if (!M.getMatchedVertex(nextVertexB, nextVertexA)) {
#ifndef FOR_R_TDA
- std::cerr << "Vertices in even layers must be matched! Unmatched: ";
- std::cerr << nextVertexB << std::endl;
- std::cerr << evenLayerIdx << "; " << layerGraph.size() << std::endl;
+ std::cerr << "Vertices in even layers must be matched! Unmatched: ";
+ std::cerr << nextVertexB << std::endl;
+ std::cerr << evenLayerIdx << "; " << layerGraph.size() << std::endl;
#endif
- throw std::runtime_error("Unmatched vertex in even layer");
+ throw std::runtime_error("Unmatched vertex in even layer");
+ } else {
+ assert(!(nextVertexA.getRealX() == 0 and nextVertexA.getRealY() == 0));
+ result.push_back(nextVertexA);
+ prevVertexA = nextVertexA;
+ evenLayerIdx += 2;
+ continue;
+ }
+ }
} else {
- assert( ! (nextVertexA.getRealX() == 0 and nextVertexA.getRealY() == 0) );
- result.push_back(nextVertexA);
- prevVertexA = nextVertexA;
- evenLayerIdx += 2;
- continue;
+ // prevVertexA has no neighbours in the next layer,
+ // backtrack
+ if (evenLayerIdx == 1) {
+ // startVertex is not connected to any vertices
+ // in the next layer, augm. path doesn't exist
+ removeFromLayer(startVertex, 0);
+ return false;
+ } else {
+ assert(evenLayerIdx >= 3);
+ assert(result.size() % 2 == 1);
+ result.pop_back();
+ DgmPoint prevVertexB = result.back();
+ result.pop_back();
+ removeFromLayer(prevVertexA, evenLayerIdx - 1);
+ removeFromLayer(prevVertexB, evenLayerIdx - 2);
+ // we should proceed from the previous odd layer
+ assert(result.size() >= 1);
+ prevVertexA = result.back();
+ evenLayerIdx -= 2;
+ continue;
+ }
}
+ } // finished iterating over all layers
+ // remove all vertices in the augmenting paths
+ // the corresponding layers
+ for (size_t layerIdx = 0; layerIdx < result.size(); ++layerIdx) {
+ removeFromLayer(result[layerIdx], layerIdx);
}
- } else {
- // prevVertexA has no neighbours in the next layer,
- // backtrack
- if (evenLayerIdx == 1) {
- // startVertex is not connected to any vertices
- // in the next layer, augm. path doesn't exist
- removeFromLayer(startVertex, 0);
- return false;
- } else {
- assert(evenLayerIdx >= 3);
- assert(result.size() % 2 == 1);
- result.pop_back();
- DgmPoint prevVertexB = result.back();
- result.pop_back();
- removeFromLayer(prevVertexA, evenLayerIdx-1);
- removeFromLayer(prevVertexB, evenLayerIdx-2);
- // we should proceed from the previous odd layer
- assert(result.size() >= 1);
- prevVertexA = result.back();
- evenLayerIdx -= 2;
- continue;
- }
+ return true;
}
- } // finished iterating over all layers
- // remove all vertices in the augmenting paths
- // the corresponding layers
- for(size_t layerIdx = 0; layerIdx < result.size(); ++layerIdx) {
- removeFromLayer(result[layerIdx], layerIdx);
- }
- return true;
-}
-
-
-
-
-template<class R, class NO>
-bool BoundMatchOracle<R, NO>::buildMatchingForThreshold(const Real r)
-{
- //bool isDebug {false};
- if (prevQueryValue > r) {
- M.trimMatching(r);
- }
- prevQueryValue = r;
- while(true) {
- buildLayerGraph(r);
- if (augPathExist) {
- std::vector<Path> augmentingPaths;
- DgmPointSet copyLG0;
- for(DgmPoint p : layerGraph[0]) {
- copyLG0.insert(p);
- }
- for(DgmPoint exposedVertex : copyLG0) {
- Path augPath;
- if (buildAugmentingPath(exposedVertex, augPath)) {
- augmentingPaths.push_back(augPath);
- }
+
+
+ template<class R, class NO>
+ bool BoundMatchOracle<R, NO>::buildMatchingForThreshold(const Real r)
+ {
+ //bool isDebug {false};
+ if (prevQueryValue > r) {
+ M.trimMatching(r);
}
- if (augmentingPaths.empty()) {
+ prevQueryValue = r;
+ while (true) {
+ buildLayerGraph(r);
+ if (augPathExist) {
+ std::vector<Path> augmentingPaths;
+ DgmPointSet copyLG0;
+ for (DgmPoint p : layerGraph[0]) {
+ copyLG0.insert(p);
+ }
+ for (DgmPoint exposedVertex : copyLG0) {
+ Path augPath;
+ if (buildAugmentingPath(exposedVertex, augPath)) {
+ augmentingPaths.push_back(augPath);
+ }
+ }
+ if (augmentingPaths.empty()) {
#ifndef FOR_R_TDA
- std::cerr << "augmenting paths must exist, but were not found!" << std::endl;
+ std::cerr << "augmenting paths must exist, but were not found!" << std::endl;
#endif
- throw std::runtime_error("bad epsilon?");
- }
- // swap all augmenting paths with matching to increase it
- for(auto& augPath : augmentingPaths ) {
- M.increase(augPath);
+ throw std::runtime_error("bad epsilon?");
+ }
+ // swap all augmenting paths with matching to increase it
+ for (auto& augPath : augmentingPaths) {
+ M.increase(augPath);
+ }
+ } else {
+ return M.isPerfect();
+ }
}
- } else {
- return M.isPerfect();
}
- }
-}
-template<class R, class NO>
-void BoundMatchOracle<R, NO>::printLayerGraph(void)
-{
+ template<class R, class NO>
+ void BoundMatchOracle<R, NO>::printLayerGraph(void)
+ {
#ifdef DEBUG_BOUND_MATCH
- for(auto& layer : layerGraph) {
- std::cout << "{ ";
- for(auto& p : layer) {
- std::cout << p << "; ";
- }
- std::cout << "\b\b }" << std::endl;
- }
+ for(auto& layer : layerGraph) {
+ std::cout << "{ ";
+ for(auto& p : layer) {
+ std::cout << p << "; ";
+ }
+ std::cout << "\b\b }" << std::endl;
+ }
#endif
-}
+ }
-template<class R, class NO>
-void BoundMatchOracle<R, NO>::buildLayerGraph(Real r)
-{
+ template<class R, class NO>
+ void BoundMatchOracle<R, NO>::buildLayerGraph(Real r)
+ {
#ifdef VERBOSE_BOTTLENECK
- std::cout << "Entered buildLayerGraph, r = " << r << std::endl;
+ std::cout << "Entered buildLayerGraph, r = " << r << std::endl;
#endif
- layerGraph.clear();
- DgmPointSet L1 = M.getExposedVertices();
- layerGraph.push_back(L1);
- neighbOracle->rebuild(B, r);
- size_t k = 0;
- DgmPointSet layerNextEven;
- DgmPointSet layerNextOdd;
- bool exposedVerticesFound {false};
- while(true) {
- layerNextEven.clear();
- for( auto p : layerGraph[k]) {
- bool neighbFound;
- DgmPoint neighbour {0.0, 0.0, DgmPoint::DIAG, 1};
- if (useRangeSearch) {
- std::vector<DgmPoint> neighbVec;
- neighbOracle->getAllNeighbours(p, neighbVec);
- neighbFound = !neighbVec.empty();
- for(auto& neighbPt : neighbVec) {
- layerNextEven.insert(neighbPt);
- if (!exposedVerticesFound and M.isExposed(neighbPt))
- exposedVerticesFound = true;
- }
- } else {
- while(true) {
- neighbFound = neighbOracle->getNeighbour(p, neighbour);
- if (neighbFound) {
- layerNextEven.insert(neighbour);
- neighbOracle->deletePoint(neighbour);
- if ((!exposedVerticesFound) && M.isExposed(neighbour)) {
- exposedVerticesFound = true;
+ layerGraph.clear();
+ DgmPointSet L1 = M.getExposedVertices();
+ layerGraph.push_back(L1);
+ neighbOracle->rebuild(B, r);
+ size_t k = 0;
+ DgmPointSet layerNextEven;
+ DgmPointSet layerNextOdd;
+ bool exposedVerticesFound { false };
+ while (true) {
+ layerNextEven.clear();
+ for (auto p : layerGraph[k]) {
+ bool neighbFound;
+ //DgmPoint neighbour {0.0, 0.0, DgmPoint::DIAG, 1};
+ DgmPoint neighbour;
+ if (useRangeSearch) {
+ std::vector<DgmPoint> neighbVec;
+ neighbOracle->getAllNeighbours(p, neighbVec);
+ neighbFound = !neighbVec.empty();
+ for (auto& neighbPt : neighbVec) {
+ layerNextEven.insert(neighbPt);
+ if (!exposedVerticesFound and M.isExposed(neighbPt)) {
+ exposedVerticesFound = true;
+ }
}
} else {
- break;
+ while (true) {
+ neighbFound = neighbOracle->getNeighbour(p, neighbour);
+ if (neighbFound) {
+ layerNextEven.insert(neighbour);
+ neighbOracle->deletePoint(neighbour);
+ if ((!exposedVerticesFound) && M.isExposed(neighbour)) {
+ exposedVerticesFound = true;
+ }
+ } else {
+ break;
+ }
+ }
+ } // without range search
+ } // all vertices from previous odd layer processed
+ if (layerNextEven.empty()) {
+ augPathExist = false;
+ break;
+ }
+ if (exposedVerticesFound) {
+ for (auto it = layerNextEven.cbegin(); it != layerNextEven.cend();) {
+ if (!M.isExposed(*it)) {
+ layerNextEven.erase(it++);
+ } else {
+ ++it;
+ }
+
}
+ layerGraph.push_back(layerNextEven);
+ augPathExist = true;
+ break;
}
- } // without range search
- } // all vertices from previous odd layer processed
- if (layerNextEven.empty()) {
- augPathExist = false;
- break;
+ layerGraph.push_back(layerNextEven);
+ M.getAllAdjacentVertices(layerNextEven, layerNextOdd);
+ layerGraph.push_back(layerNextOdd);
+ k += 2;
+ }
+ buildLayerOracles(r);
+ printLayerGraph();
}
- if (exposedVerticesFound) {
- for(auto it = layerNextEven.cbegin(); it != layerNextEven.cend(); ) {
- if ( ! M.isExposed(*it) ) {
- layerNextEven.erase(it++);
+
+ // create geometric oracles for each even layer
+ // odd layers have NULL in layerOracles
+ template<class R, class NO>
+ void BoundMatchOracle<R, NO>::buildLayerOracles(Real r)
+ {
+ //bool isDebug {false};
+ // free previously constructed oracles
+ layerOracles.clear();
+ for (size_t layerIdx = 0; layerIdx < layerGraph.size(); ++layerIdx) {
+ if (layerIdx % 2 == 1) {
+ // even layer, build actual oracle
+ layerOracles.emplace_back(new NeighbOracle(layerGraph[layerIdx], r, distEpsilon));
} else {
- ++it;
+ // odd layer
+ layerOracles.emplace_back(nullptr);
}
-
}
- layerGraph.push_back(layerNextEven);
- augPathExist = true;
- break;
- }
- layerGraph.push_back(layerNextEven);
- M.getAllAdjacentVertices(layerNextEven, layerNextOdd);
- layerGraph.push_back(layerNextOdd);
- k += 2;
- }
- buildLayerOracles(r);
- printLayerGraph();
- }
-
-// create geometric oracles for each even layer
-// odd layers have NULL in layerOracles
-template<class R, class NO>
-void BoundMatchOracle<R, NO>::buildLayerOracles(Real r)
-{
- //bool isDebug {false};
- // free previously constructed oracles
- layerOracles.clear();
- for(size_t layerIdx = 0; layerIdx < layerGraph.size(); ++layerIdx) {
- if (layerIdx % 2 == 1) {
- // even layer, build actual oracle
- layerOracles.emplace_back(new NeighbOracle(layerGraph[layerIdx], r, distEpsilon));
- } else {
- // odd layer
- layerOracles.emplace_back(nullptr);
}
- }
-}
-} // end namespace bt
+ } // end namespace bt
} // end namespace hera
#endif // HERA_BOUND_MATCH_HPP
diff --git a/geom_bottleneck/include/catch/catch.hpp b/geom_bottleneck/include/catch/catch.hpp
new file mode 100644
index 0000000..f7681f4
--- /dev/null
+++ b/geom_bottleneck/include/catch/catch.hpp
@@ -0,0 +1,11545 @@
+/*
+ * Catch v1.9.6
+ * Generated: 2017-06-27 12:19:54.557875
+ * ----------------------------------------------------------
+ * This file has been merged from multiple headers. Please don't edit it directly
+ * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See accompanying
+ * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
+#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
+
+#define TWOBLUECUBES_CATCH_HPP_INCLUDED
+
+#ifdef __clang__
+# pragma clang system_header
+#elif defined __GNUC__
+# pragma GCC system_header
+#endif
+
+// #included from: internal/catch_suppress_warnings.h
+
+#ifdef __clang__
+# ifdef __ICC // icpc defines the __clang__ macro
+# pragma warning(push)
+# pragma warning(disable: 161 1682)
+# else // __ICC
+# pragma clang diagnostic ignored "-Wglobal-constructors"
+# pragma clang diagnostic ignored "-Wvariadic-macros"
+# pragma clang diagnostic ignored "-Wc99-extensions"
+# pragma clang diagnostic ignored "-Wunused-variable"
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wpadded"
+# pragma clang diagnostic ignored "-Wc++98-compat"
+# pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
+# pragma clang diagnostic ignored "-Wswitch-enum"
+# pragma clang diagnostic ignored "-Wcovered-switch-default"
+# endif
+#elif defined __GNUC__
+# pragma GCC diagnostic ignored "-Wvariadic-macros"
+# pragma GCC diagnostic ignored "-Wunused-variable"
+# pragma GCC diagnostic ignored "-Wparentheses"
+
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wpadded"
+#endif
+#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER)
+# define CATCH_IMPL
+#endif
+
+#ifdef CATCH_IMPL
+# ifndef CLARA_CONFIG_MAIN
+# define CLARA_CONFIG_MAIN_NOT_DEFINED
+# define CLARA_CONFIG_MAIN
+# endif
+#endif
+
+// #included from: internal/catch_notimplemented_exception.h
+#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED
+
+// #included from: catch_common.h
+#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED
+
+// #included from: catch_compiler_capabilities.h
+#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED
+
+// Detect a number of compiler features - mostly C++11/14 conformance - by compiler
+// The following features are defined:
+//
+// CATCH_CONFIG_CPP11_NULLPTR : is nullptr supported?
+// CATCH_CONFIG_CPP11_NOEXCEPT : is noexcept supported?
+// CATCH_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods
+// CATCH_CONFIG_CPP11_IS_ENUM : std::is_enum is supported?
+// CATCH_CONFIG_CPP11_TUPLE : std::tuple is supported
+// CATCH_CONFIG_CPP11_LONG_LONG : is long long supported?
+// CATCH_CONFIG_CPP11_OVERRIDE : is override supported?
+// CATCH_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr)
+// CATCH_CONFIG_CPP11_SHUFFLE : is std::shuffle supported?
+// CATCH_CONFIG_CPP11_TYPE_TRAITS : are type_traits and enable_if supported?
+
+// CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported?
+
+// CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported?
+// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported?
+// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported?
+// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported?
+// ****************
+// Note to maintainers: if new toggles are added please document them
+// in configuration.md, too
+// ****************
+
+// In general each macro has a _NO_<feature name> form
+// (e.g. CATCH_CONFIG_CPP11_NO_NULLPTR) which disables the feature.
+// Many features, at point of detection, define an _INTERNAL_ macro, so they
+// can be combined, en-mass, with the _NO_ forms later.
+
+// All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11
+
+#ifdef __cplusplus
+
+# if __cplusplus >= 201103L
+# define CATCH_CPP11_OR_GREATER
+# endif
+
+# if __cplusplus >= 201402L
+# define CATCH_CPP14_OR_GREATER
+# endif
+
+#endif
+
+#ifdef __clang__
+
+# if __has_feature(cxx_nullptr)
+# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
+# endif
+
+# if __has_feature(cxx_noexcept)
+# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
+# endif
+
+# if defined(CATCH_CPP11_OR_GREATER)
+# define CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
+ _Pragma( "clang diagnostic push" ) \
+ _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" )
+# define CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
+ _Pragma( "clang diagnostic pop" )
+
+# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
+ _Pragma( "clang diagnostic push" ) \
+ _Pragma( "clang diagnostic ignored \"-Wparentheses\"" )
+# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \
+ _Pragma( "clang diagnostic pop" )
+# endif
+
+#endif // __clang__
+
+////////////////////////////////////////////////////////////////////////////////
+// We know some environments not to support full POSIX signals
+#if defined(__CYGWIN__) || defined(__QNX__)
+
+# if !defined(CATCH_CONFIG_POSIX_SIGNALS)
+# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS
+# endif
+
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+// Cygwin
+#ifdef __CYGWIN__
+
+// Required for some versions of Cygwin to declare gettimeofday
+// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin
+# define _BSD_SOURCE
+
+#endif // __CYGWIN__
+
+////////////////////////////////////////////////////////////////////////////////
+// Borland
+#ifdef __BORLANDC__
+
+#endif // __BORLANDC__
+
+////////////////////////////////////////////////////////////////////////////////
+// EDG
+#ifdef __EDG_VERSION__
+
+#endif // __EDG_VERSION__
+
+////////////////////////////////////////////////////////////////////////////////
+// Digital Mars
+#ifdef __DMC__
+
+#endif // __DMC__
+
+////////////////////////////////////////////////////////////////////////////////
+// GCC
+#ifdef __GNUC__
+
+# if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__)
+# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
+# endif
+
+// - otherwise more recent versions define __cplusplus >= 201103L
+// and will get picked up below
+
+#endif // __GNUC__
+
+////////////////////////////////////////////////////////////////////////////////
+// Visual C++
+#ifdef _MSC_VER
+
+#define CATCH_INTERNAL_CONFIG_WINDOWS_SEH
+
+#if (_MSC_VER >= 1600)
+# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
+# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR
+#endif
+
+#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015))
+#define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
+#define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
+#define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE
+#define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS
+#endif
+
+#endif // _MSC_VER
+
+////////////////////////////////////////////////////////////////////////////////
+
+// Use variadic macros if the compiler supports them
+#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \
+ ( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \
+ ( defined __GNUC__ && __GNUC__ >= 3 ) || \
+ ( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L )
+
+#define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS
+
+#endif
+
+// Use __COUNTER__ if the compiler supports it
+#if ( defined _MSC_VER && _MSC_VER >= 1300 ) || \
+ ( defined __GNUC__ && ( __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3 )) ) || \
+ ( defined __clang__ && __clang_major__ >= 3 )
+
+#define CATCH_INTERNAL_CONFIG_COUNTER
+
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+// C++ language feature support
+
+// catch all support for C++11
+#if defined(CATCH_CPP11_OR_GREATER)
+
+# if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR)
+# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
+# endif
+
+# ifndef CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
+# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
+# endif
+
+# ifndef CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
+# define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
+# endif
+
+# ifndef CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM
+# define CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM
+# endif
+
+# ifndef CATCH_INTERNAL_CONFIG_CPP11_TUPLE
+# define CATCH_INTERNAL_CONFIG_CPP11_TUPLE
+# endif
+
+# ifndef CATCH_INTERNAL_CONFIG_VARIADIC_MACROS
+# define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS
+# endif
+
+# if !defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG)
+# define CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG
+# endif
+
+# if !defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE)
+# define CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE
+# endif
+# if !defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR)
+# define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR
+# endif
+# if !defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE)
+# define CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE
+# endif
+# if !defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS)
+# define CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS
+# endif
+
+#endif // __cplusplus >= 201103L
+
+// Now set the actual defines based on the above + anything the user has configured
+#if defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NO_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_NO_CPP11)
+# define CATCH_CONFIG_CPP11_NULLPTR
+#endif
+#if defined(CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_NO_CPP11)
+# define CATCH_CONFIG_CPP11_NOEXCEPT
+#endif
+#if defined(CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_NO_CPP11)
+# define CATCH_CONFIG_CPP11_GENERATED_METHODS
+#endif
+#if defined(CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_NO_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_NO_CPP11)
+# define CATCH_CONFIG_CPP11_IS_ENUM
+#endif
+#if defined(CATCH_INTERNAL_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_CPP11_NO_TUPLE) && !defined(CATCH_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_NO_CPP11)
+# define CATCH_CONFIG_CPP11_TUPLE
+#endif
+#if defined(CATCH_INTERNAL_CONFIG_VARIADIC_MACROS) && !defined(CATCH_CONFIG_NO_VARIADIC_MACROS) && !defined(CATCH_CONFIG_VARIADIC_MACROS)
+# define CATCH_CONFIG_VARIADIC_MACROS
+#endif
+#if defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_NO_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_CPP11)
+# define CATCH_CONFIG_CPP11_LONG_LONG
+#endif
+#if defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_NO_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_CPP11)
+# define CATCH_CONFIG_CPP11_OVERRIDE
+#endif
+#if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11)
+# define CATCH_CONFIG_CPP11_UNIQUE_PTR
+#endif
+// Use of __COUNTER__ is suppressed if __JETBRAINS_IDE__ is #defined (meaning we're being parsed by a JetBrains IDE for
+// analytics) because, at time of writing, __COUNTER__ is not properly handled by it.
+// This does not affect compilation
+#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) && !defined(__JETBRAINS_IDE__)
+# define CATCH_CONFIG_COUNTER
+#endif
+#if defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_NO_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_NO_CPP11)
+# define CATCH_CONFIG_CPP11_SHUFFLE
+#endif
+# if defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_NO_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_NO_CPP11)
+# define CATCH_CONFIG_CPP11_TYPE_TRAITS
+# endif
+#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH)
+# define CATCH_CONFIG_WINDOWS_SEH
+#endif
+// This is set by default, because we assume that unix compilers are posix-signal-compatible by default.
+#if !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS)
+# define CATCH_CONFIG_POSIX_SIGNALS
+#endif
+
+#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)
+# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS
+# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS
+#endif
+#if !defined(CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS)
+# define CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS
+# define CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
+#endif
+
+// noexcept support:
+#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT)
+# define CATCH_NOEXCEPT noexcept
+# define CATCH_NOEXCEPT_IS(x) noexcept(x)
+#else
+# define CATCH_NOEXCEPT throw()
+# define CATCH_NOEXCEPT_IS(x)
+#endif
+
+// nullptr support
+#ifdef CATCH_CONFIG_CPP11_NULLPTR
+# define CATCH_NULL nullptr
+#else
+# define CATCH_NULL NULL
+#endif
+
+// override support
+#ifdef CATCH_CONFIG_CPP11_OVERRIDE
+# define CATCH_OVERRIDE override
+#else
+# define CATCH_OVERRIDE
+#endif
+
+// unique_ptr support
+#ifdef CATCH_CONFIG_CPP11_UNIQUE_PTR
+# define CATCH_AUTO_PTR( T ) std::unique_ptr<T>
+#else
+# define CATCH_AUTO_PTR( T ) std::auto_ptr<T>
+#endif
+
+#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line
+#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )
+#ifdef CATCH_CONFIG_COUNTER
+# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ )
+#else
+# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )
+#endif
+
+#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr
+#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr )
+
+#include <sstream>
+#include <algorithm>
+
+namespace Catch {
+
+ struct IConfig;
+
+ struct CaseSensitive { enum Choice {
+ Yes,
+ No
+ }; };
+
+ class NonCopyable {
+#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
+ NonCopyable( NonCopyable const& ) = delete;
+ NonCopyable( NonCopyable && ) = delete;
+ NonCopyable& operator = ( NonCopyable const& ) = delete;
+ NonCopyable& operator = ( NonCopyable && ) = delete;
+#else
+ NonCopyable( NonCopyable const& info );
+ NonCopyable& operator = ( NonCopyable const& );
+#endif
+
+ protected:
+ NonCopyable() {}
+ virtual ~NonCopyable();
+ };
+
+ class SafeBool {
+ public:
+ typedef void (SafeBool::*type)() const;
+
+ static type makeSafe( bool value ) {
+ return value ? &SafeBool::trueValue : 0;
+ }
+ private:
+ void trueValue() const {}
+ };
+
+ template<typename ContainerT>
+ inline void deleteAll( ContainerT& container ) {
+ typename ContainerT::const_iterator it = container.begin();
+ typename ContainerT::const_iterator itEnd = container.end();
+ for(; it != itEnd; ++it )
+ delete *it;
+ }
+ template<typename AssociativeContainerT>
+ inline void deleteAllValues( AssociativeContainerT& container ) {
+ typename AssociativeContainerT::const_iterator it = container.begin();
+ typename AssociativeContainerT::const_iterator itEnd = container.end();
+ for(; it != itEnd; ++it )
+ delete it->second;
+ }
+
+ bool startsWith( std::string const& s, std::string const& prefix );
+ bool startsWith( std::string const& s, char prefix );
+ bool endsWith( std::string const& s, std::string const& suffix );
+ bool endsWith( std::string const& s, char suffix );
+ bool contains( std::string const& s, std::string const& infix );
+ void toLowerInPlace( std::string& s );
+ std::string toLower( std::string const& s );
+ std::string trim( std::string const& str );
+ bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis );
+
+ struct pluralise {
+ pluralise( std::size_t count, std::string const& label );
+
+ friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser );
+
+ std::size_t m_count;
+ std::string m_label;
+ };
+
+ struct SourceLineInfo {
+
+ SourceLineInfo();
+ SourceLineInfo( char const* _file, std::size_t _line );
+# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
+ SourceLineInfo(SourceLineInfo const& other) = default;
+ SourceLineInfo( SourceLineInfo && ) = default;
+ SourceLineInfo& operator = ( SourceLineInfo const& ) = default;
+ SourceLineInfo& operator = ( SourceLineInfo && ) = default;
+# endif
+ bool empty() const;
+ bool operator == ( SourceLineInfo const& other ) const;
+ bool operator < ( SourceLineInfo const& other ) const;
+
+ char const* file;
+ std::size_t line;
+ };
+
+ std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info );
+
+ // This is just here to avoid compiler warnings with macro constants and boolean literals
+ inline bool isTrue( bool value ){ return value; }
+ inline bool alwaysTrue() { return true; }
+ inline bool alwaysFalse() { return false; }
+
+ void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo );
+
+ void seedRng( IConfig const& config );
+ unsigned int rngSeed();
+
+ // Use this in variadic streaming macros to allow
+ // >> +StreamEndStop
+ // as well as
+ // >> stuff +StreamEndStop
+ struct StreamEndStop {
+ std::string operator+() {
+ return std::string();
+ }
+ };
+ template<typename T>
+ T const& operator + ( T const& value, StreamEndStop ) {
+ return value;
+ }
+}
+
+#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) )
+#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO );
+
+namespace Catch {
+
+ class NotImplementedException : public std::exception
+ {
+ public:
+ NotImplementedException( SourceLineInfo const& lineInfo );
+ NotImplementedException( NotImplementedException const& ) {}
+
+ virtual ~NotImplementedException() CATCH_NOEXCEPT {}
+
+ virtual const char* what() const CATCH_NOEXCEPT;
+
+ private:
+ std::string m_what;
+ SourceLineInfo m_lineInfo;
+ };
+
+} // end namespace Catch
+
+///////////////////////////////////////////////////////////////////////////////
+#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException( CATCH_INTERNAL_LINEINFO )
+
+// #included from: internal/catch_context.h
+#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED
+
+// #included from: catch_interfaces_generators.h
+#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ struct IGeneratorInfo {
+ virtual ~IGeneratorInfo();
+ virtual bool moveNext() = 0;
+ virtual std::size_t getCurrentIndex() const = 0;
+ };
+
+ struct IGeneratorsForTest {
+ virtual ~IGeneratorsForTest();
+
+ virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0;
+ virtual bool moveNext() = 0;
+ };
+
+ IGeneratorsForTest* createGeneratorsForTest();
+
+} // end namespace Catch
+
+// #included from: catch_ptr.hpp
+#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+namespace Catch {
+
+ // An intrusive reference counting smart pointer.
+ // T must implement addRef() and release() methods
+ // typically implementing the IShared interface
+ template<typename T>
+ class Ptr {
+ public:
+ Ptr() : m_p( CATCH_NULL ){}
+ Ptr( T* p ) : m_p( p ){
+ if( m_p )
+ m_p->addRef();
+ }
+ Ptr( Ptr const& other ) : m_p( other.m_p ){
+ if( m_p )
+ m_p->addRef();
+ }
+ ~Ptr(){
+ if( m_p )
+ m_p->release();
+ }
+ void reset() {
+ if( m_p )
+ m_p->release();
+ m_p = CATCH_NULL;
+ }
+ Ptr& operator = ( T* p ){
+ Ptr temp( p );
+ swap( temp );
+ return *this;
+ }
+ Ptr& operator = ( Ptr const& other ){
+ Ptr temp( other );
+ swap( temp );
+ return *this;
+ }
+ void swap( Ptr& other ) { std::swap( m_p, other.m_p ); }
+ T* get() const{ return m_p; }
+ T& operator*() const { return *m_p; }
+ T* operator->() const { return m_p; }
+ bool operator !() const { return m_p == CATCH_NULL; }
+ operator SafeBool::type() const { return SafeBool::makeSafe( m_p != CATCH_NULL ); }
+
+ private:
+ T* m_p;
+ };
+
+ struct IShared : NonCopyable {
+ virtual ~IShared();
+ virtual void addRef() const = 0;
+ virtual void release() const = 0;
+ };
+
+ template<typename T = IShared>
+ struct SharedImpl : T {
+
+ SharedImpl() : m_rc( 0 ){}
+
+ virtual void addRef() const {
+ ++m_rc;
+ }
+ virtual void release() const {
+ if( --m_rc == 0 )
+ delete this;
+ }
+
+ mutable unsigned int m_rc;
+ };
+
+} // end namespace Catch
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+namespace Catch {
+
+ class TestCase;
+ class Stream;
+ struct IResultCapture;
+ struct IRunner;
+ struct IGeneratorsForTest;
+ struct IConfig;
+
+ struct IContext
+ {
+ virtual ~IContext();
+
+ virtual IResultCapture* getResultCapture() = 0;
+ virtual IRunner* getRunner() = 0;
+ virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0;
+ virtual bool advanceGeneratorsForCurrentTest() = 0;
+ virtual Ptr<IConfig const> getConfig() const = 0;
+ };
+
+ struct IMutableContext : IContext
+ {
+ virtual ~IMutableContext();
+ virtual void setResultCapture( IResultCapture* resultCapture ) = 0;
+ virtual void setRunner( IRunner* runner ) = 0;
+ virtual void setConfig( Ptr<IConfig const> const& config ) = 0;
+ };
+
+ IContext& getCurrentContext();
+ IMutableContext& getCurrentMutableContext();
+ void cleanUpContext();
+ Stream createStream( std::string const& streamName );
+
+}
+
+// #included from: internal/catch_test_registry.hpp
+#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED
+
+// #included from: catch_interfaces_testcase.h
+#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED
+
+#include <vector>
+
+namespace Catch {
+
+ class TestSpec;
+
+ struct ITestCase : IShared {
+ virtual void invoke () const = 0;
+ protected:
+ virtual ~ITestCase();
+ };
+
+ class TestCase;
+ struct IConfig;
+
+ struct ITestCaseRegistry {
+ virtual ~ITestCaseRegistry();
+ virtual std::vector<TestCase> const& getAllTests() const = 0;
+ virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const = 0;
+ };
+
+ bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config );
+ std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config );
+ std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config );
+
+}
+
+namespace Catch {
+
+template<typename C>
+class MethodTestCase : public SharedImpl<ITestCase> {
+
+public:
+ MethodTestCase( void (C::*method)() ) : m_method( method ) {}
+
+ virtual void invoke() const {
+ C obj;
+ (obj.*m_method)();
+ }
+
+private:
+ virtual ~MethodTestCase() {}
+
+ void (C::*m_method)();
+};
+
+typedef void(*TestFunction)();
+
+struct NameAndDesc {
+ NameAndDesc( const char* _name = "", const char* _description= "" )
+ : name( _name ), description( _description )
+ {}
+
+ const char* name;
+ const char* description;
+};
+
+void registerTestCase
+ ( ITestCase* testCase,
+ char const* className,
+ NameAndDesc const& nameAndDesc,
+ SourceLineInfo const& lineInfo );
+
+struct AutoReg {
+
+ AutoReg
+ ( TestFunction function,
+ SourceLineInfo const& lineInfo,
+ NameAndDesc const& nameAndDesc );
+
+ template<typename C>
+ AutoReg
+ ( void (C::*method)(),
+ char const* className,
+ NameAndDesc const& nameAndDesc,
+ SourceLineInfo const& lineInfo ) {
+
+ registerTestCase
+ ( new MethodTestCase<C>( method ),
+ className,
+ nameAndDesc,
+ lineInfo );
+ }
+
+ ~AutoReg();
+
+private:
+ AutoReg( AutoReg const& );
+ void operator= ( AutoReg const& );
+};
+
+void registerTestCaseFunction
+ ( TestFunction function,
+ SourceLineInfo const& lineInfo,
+ NameAndDesc const& nameAndDesc );
+
+} // end namespace Catch
+
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \
+ static void TestName(); \
+ CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
+ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); } \
+ CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
+ static void TestName()
+ #define INTERNAL_CATCH_TESTCASE( ... ) \
+ INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ )
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \
+ CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
+ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } \
+ CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\
+ CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
+ namespace{ \
+ struct TestName : ClassName{ \
+ void test(); \
+ }; \
+ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \
+ } \
+ CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
+ void TestName::test()
+ #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \
+ INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ )
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \
+ CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
+ Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); \
+ CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
+
+#else
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \
+ static void TestName(); \
+ CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
+ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\
+ CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
+ static void TestName()
+ #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
+ INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), Name, Desc )
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \
+ CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
+ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } \
+ CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\
+ CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
+ namespace{ \
+ struct TestCaseName : ClassName{ \
+ void test(); \
+ }; \
+ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \
+ } \
+ CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
+ void TestCaseName::test()
+ #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\
+ INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, TestName, Desc )
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \
+ CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
+ Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); \
+ CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
+
+#endif
+
+// #included from: internal/catch_capture.hpp
+#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED
+
+// #included from: catch_result_builder.h
+#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED
+
+// #included from: catch_result_type.h
+#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED
+
+namespace Catch {
+
+ // ResultWas::OfType enum
+ struct ResultWas { enum OfType {
+ Unknown = -1,
+ Ok = 0,
+ Info = 1,
+ Warning = 2,
+
+ FailureBit = 0x10,
+
+ ExpressionFailed = FailureBit | 1,
+ ExplicitFailure = FailureBit | 2,
+
+ Exception = 0x100 | FailureBit,
+
+ ThrewException = Exception | 1,
+ DidntThrowException = Exception | 2,
+
+ FatalErrorCondition = 0x200 | FailureBit
+
+ }; };
+
+ inline bool isOk( ResultWas::OfType resultType ) {
+ return ( resultType & ResultWas::FailureBit ) == 0;
+ }
+ inline bool isJustInfo( int flags ) {
+ return flags == ResultWas::Info;
+ }
+
+ // ResultDisposition::Flags enum
+ struct ResultDisposition { enum Flags {
+ Normal = 0x01,
+
+ ContinueOnFailure = 0x02, // Failures fail test, but execution continues
+ FalseTest = 0x04, // Prefix expression with !
+ SuppressFail = 0x08 // Failures are reported but do not fail the test
+ }; };
+
+ inline ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) {
+ return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) );
+ }
+
+ inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; }
+ inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; }
+ inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; }
+
+} // end namespace Catch
+
+// #included from: catch_assertionresult.h
+#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison;
+
+ struct DecomposedExpression
+ {
+ virtual ~DecomposedExpression() {}
+ virtual bool isBinaryExpression() const {
+ return false;
+ }
+ virtual void reconstructExpression( std::string& dest ) const = 0;
+
+ // Only simple binary comparisons can be decomposed.
+ // If more complex check is required then wrap sub-expressions in parentheses.
+ template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( T const& );
+ template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( T const& );
+ template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( T const& );
+ template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( T const& );
+ template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator % ( T const& );
+ template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator && ( T const& );
+ template<typename T> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator || ( T const& );
+
+ private:
+ DecomposedExpression& operator = (DecomposedExpression const&);
+ };
+
+ struct AssertionInfo
+ {
+ AssertionInfo() {}
+ AssertionInfo( char const * _macroName,
+ SourceLineInfo const& _lineInfo,
+ char const * _capturedExpression,
+ ResultDisposition::Flags _resultDisposition,
+ char const * _secondArg = "");
+
+ char const * macroName;
+ SourceLineInfo lineInfo;
+ char const * capturedExpression;
+ ResultDisposition::Flags resultDisposition;
+ char const * secondArg;
+ };
+
+ struct AssertionResultData
+ {
+ AssertionResultData() : decomposedExpression( CATCH_NULL )
+ , resultType( ResultWas::Unknown )
+ , negated( false )
+ , parenthesized( false ) {}
+
+ void negate( bool parenthesize ) {
+ negated = !negated;
+ parenthesized = parenthesize;
+ if( resultType == ResultWas::Ok )
+ resultType = ResultWas::ExpressionFailed;
+ else if( resultType == ResultWas::ExpressionFailed )
+ resultType = ResultWas::Ok;
+ }
+
+ std::string const& reconstructExpression() const {
+ if( decomposedExpression != CATCH_NULL ) {
+ decomposedExpression->reconstructExpression( reconstructedExpression );
+ if( parenthesized ) {
+ reconstructedExpression.insert( 0, 1, '(' );
+ reconstructedExpression.append( 1, ')' );
+ }
+ if( negated ) {
+ reconstructedExpression.insert( 0, 1, '!' );
+ }
+ decomposedExpression = CATCH_NULL;
+ }
+ return reconstructedExpression;
+ }
+
+ mutable DecomposedExpression const* decomposedExpression;
+ mutable std::string reconstructedExpression;
+ std::string message;
+ ResultWas::OfType resultType;
+ bool negated;
+ bool parenthesized;
+ };
+
+ class AssertionResult {
+ public:
+ AssertionResult();
+ AssertionResult( AssertionInfo const& info, AssertionResultData const& data );
+ ~AssertionResult();
+# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
+ AssertionResult( AssertionResult const& ) = default;
+ AssertionResult( AssertionResult && ) = default;
+ AssertionResult& operator = ( AssertionResult const& ) = default;
+ AssertionResult& operator = ( AssertionResult && ) = default;
+# endif
+
+ bool isOk() const;
+ bool succeeded() const;
+ ResultWas::OfType getResultType() const;
+ bool hasExpression() const;
+ bool hasMessage() const;
+ std::string getExpression() const;
+ std::string getExpressionInMacro() const;
+ bool hasExpandedExpression() const;
+ std::string getExpandedExpression() const;
+ std::string getMessage() const;
+ SourceLineInfo getSourceInfo() const;
+ std::string getTestMacroName() const;
+ void discardDecomposedExpression() const;
+ void expandDecomposedExpression() const;
+
+ protected:
+ AssertionInfo m_info;
+ AssertionResultData m_resultData;
+ };
+
+} // end namespace Catch
+
+// #included from: catch_matchers.hpp
+#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED
+
+namespace Catch {
+namespace Matchers {
+ namespace Impl {
+
+ template<typename ArgT> struct MatchAllOf;
+ template<typename ArgT> struct MatchAnyOf;
+ template<typename ArgT> struct MatchNotOf;
+
+ class MatcherUntypedBase {
+ public:
+ std::string toString() const {
+ if( m_cachedToString.empty() )
+ m_cachedToString = describe();
+ return m_cachedToString;
+ }
+
+ protected:
+ virtual ~MatcherUntypedBase();
+ virtual std::string describe() const = 0;
+ mutable std::string m_cachedToString;
+ private:
+ MatcherUntypedBase& operator = ( MatcherUntypedBase const& );
+ };
+
+ template<typename ObjectT>
+ struct MatcherMethod {
+ virtual bool match( ObjectT const& arg ) const = 0;
+ };
+ template<typename PtrT>
+ struct MatcherMethod<PtrT*> {
+ virtual bool match( PtrT* arg ) const = 0;
+ };
+
+ template<typename ObjectT, typename ComparatorT = ObjectT>
+ struct MatcherBase : MatcherUntypedBase, MatcherMethod<ObjectT> {
+
+ MatchAllOf<ComparatorT> operator && ( MatcherBase const& other ) const;
+ MatchAnyOf<ComparatorT> operator || ( MatcherBase const& other ) const;
+ MatchNotOf<ComparatorT> operator ! () const;
+ };
+
+ template<typename ArgT>
+ struct MatchAllOf : MatcherBase<ArgT> {
+ virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE {
+ for( std::size_t i = 0; i < m_matchers.size(); ++i ) {
+ if (!m_matchers[i]->match(arg))
+ return false;
+ }
+ return true;
+ }
+ virtual std::string describe() const CATCH_OVERRIDE {
+ std::string description;
+ description.reserve( 4 + m_matchers.size()*32 );
+ description += "( ";
+ for( std::size_t i = 0; i < m_matchers.size(); ++i ) {
+ if( i != 0 )
+ description += " and ";
+ description += m_matchers[i]->toString();
+ }
+ description += " )";
+ return description;
+ }
+
+ MatchAllOf<ArgT>& operator && ( MatcherBase<ArgT> const& other ) {
+ m_matchers.push_back( &other );
+ return *this;
+ }
+
+ std::vector<MatcherBase<ArgT> const*> m_matchers;
+ };
+ template<typename ArgT>
+ struct MatchAnyOf : MatcherBase<ArgT> {
+
+ virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE {
+ for( std::size_t i = 0; i < m_matchers.size(); ++i ) {
+ if (m_matchers[i]->match(arg))
+ return true;
+ }
+ return false;
+ }
+ virtual std::string describe() const CATCH_OVERRIDE {
+ std::string description;
+ description.reserve( 4 + m_matchers.size()*32 );
+ description += "( ";
+ for( std::size_t i = 0; i < m_matchers.size(); ++i ) {
+ if( i != 0 )
+ description += " or ";
+ description += m_matchers[i]->toString();
+ }
+ description += " )";
+ return description;
+ }
+
+ MatchAnyOf<ArgT>& operator || ( MatcherBase<ArgT> const& other ) {
+ m_matchers.push_back( &other );
+ return *this;
+ }
+
+ std::vector<MatcherBase<ArgT> const*> m_matchers;
+ };
+
+ template<typename ArgT>
+ struct MatchNotOf : MatcherBase<ArgT> {
+
+ MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {}
+
+ virtual bool match( ArgT const& arg ) const CATCH_OVERRIDE {
+ return !m_underlyingMatcher.match( arg );
+ }
+
+ virtual std::string describe() const CATCH_OVERRIDE {
+ return "not " + m_underlyingMatcher.toString();
+ }
+ MatcherBase<ArgT> const& m_underlyingMatcher;
+ };
+
+ template<typename ObjectT, typename ComparatorT>
+ MatchAllOf<ComparatorT> MatcherBase<ObjectT, ComparatorT>::operator && ( MatcherBase const& other ) const {
+ return MatchAllOf<ComparatorT>() && *this && other;
+ }
+ template<typename ObjectT, typename ComparatorT>
+ MatchAnyOf<ComparatorT> MatcherBase<ObjectT, ComparatorT>::operator || ( MatcherBase const& other ) const {
+ return MatchAnyOf<ComparatorT>() || *this || other;
+ }
+ template<typename ObjectT, typename ComparatorT>
+ MatchNotOf<ComparatorT> MatcherBase<ObjectT, ComparatorT>::operator ! () const {
+ return MatchNotOf<ComparatorT>( *this );
+ }
+
+ } // namespace Impl
+
+ // The following functions create the actual matcher objects.
+ // This allows the types to be inferred
+ // - deprecated: prefer ||, && and !
+ template<typename T>
+ inline Impl::MatchNotOf<T> Not( Impl::MatcherBase<T> const& underlyingMatcher ) {
+ return Impl::MatchNotOf<T>( underlyingMatcher );
+ }
+ template<typename T>
+ inline Impl::MatchAllOf<T> AllOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2 ) {
+ return Impl::MatchAllOf<T>() && m1 && m2;
+ }
+ template<typename T>
+ inline Impl::MatchAllOf<T> AllOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2, Impl::MatcherBase<T> const& m3 ) {
+ return Impl::MatchAllOf<T>() && m1 && m2 && m3;
+ }
+ template<typename T>
+ inline Impl::MatchAnyOf<T> AnyOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2 ) {
+ return Impl::MatchAnyOf<T>() || m1 || m2;
+ }
+ template<typename T>
+ inline Impl::MatchAnyOf<T> AnyOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2, Impl::MatcherBase<T> const& m3 ) {
+ return Impl::MatchAnyOf<T>() || m1 || m2 || m3;
+ }
+
+} // namespace Matchers
+
+using namespace Matchers;
+using Matchers::Impl::MatcherBase;
+
+} // namespace Catch
+
+namespace Catch {
+
+ struct TestFailureException{};
+
+ template<typename T> class ExpressionLhs;
+
+ struct CopyableStream {
+ CopyableStream() {}
+ CopyableStream( CopyableStream const& other ) {
+ oss << other.oss.str();
+ }
+ CopyableStream& operator=( CopyableStream const& other ) {
+ oss.str(std::string());
+ oss << other.oss.str();
+ return *this;
+ }
+ std::ostringstream oss;
+ };
+
+ class ResultBuilder : public DecomposedExpression {
+ public:
+ ResultBuilder( char const* macroName,
+ SourceLineInfo const& lineInfo,
+ char const* capturedExpression,
+ ResultDisposition::Flags resultDisposition,
+ char const* secondArg = "" );
+ ~ResultBuilder();
+
+ template<typename T>
+ ExpressionLhs<T const&> operator <= ( T const& operand );
+ ExpressionLhs<bool> operator <= ( bool value );
+
+ template<typename T>
+ ResultBuilder& operator << ( T const& value ) {
+ m_stream().oss << value;
+ return *this;
+ }
+
+ ResultBuilder& setResultType( ResultWas::OfType result );
+ ResultBuilder& setResultType( bool result );
+
+ void endExpression( DecomposedExpression const& expr );
+
+ virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE;
+
+ AssertionResult build() const;
+ AssertionResult build( DecomposedExpression const& expr ) const;
+
+ void useActiveException( ResultDisposition::Flags resultDisposition = ResultDisposition::Normal );
+ void captureResult( ResultWas::OfType resultType );
+ void captureExpression();
+ void captureExpectedException( std::string const& expectedMessage );
+ void captureExpectedException( Matchers::Impl::MatcherBase<std::string> const& matcher );
+ void handleResult( AssertionResult const& result );
+ void react();
+ bool shouldDebugBreak() const;
+ bool allowThrows() const;
+
+ template<typename ArgT, typename MatcherT>
+ void captureMatch( ArgT const& arg, MatcherT const& matcher, char const* matcherString );
+
+ void setExceptionGuard();
+ void unsetExceptionGuard();
+
+ private:
+ AssertionInfo m_assertionInfo;
+ AssertionResultData m_data;
+
+ static CopyableStream &m_stream()
+ {
+ static CopyableStream s;
+ return s;
+ }
+
+ bool m_shouldDebugBreak;
+ bool m_shouldThrow;
+ bool m_guardException;
+ };
+
+} // namespace Catch
+
+// Include after due to circular dependency:
+// #included from: catch_expression_lhs.hpp
+#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED
+
+// #included from: catch_evaluate.hpp
+#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4389) // '==' : signed/unsigned mismatch
+#pragma warning(disable:4312) // Converting int to T* using reinterpret_cast (issue on x64 platform)
+#endif
+
+#include <cstddef>
+
+namespace Catch {
+namespace Internal {
+
+ enum Operator {
+ IsEqualTo,
+ IsNotEqualTo,
+ IsLessThan,
+ IsGreaterThan,
+ IsLessThanOrEqualTo,
+ IsGreaterThanOrEqualTo
+ };
+
+ template<Operator Op> struct OperatorTraits { static const char* getName(){ return "*error*"; } };
+ template<> struct OperatorTraits<IsEqualTo> { static const char* getName(){ return "=="; } };
+ template<> struct OperatorTraits<IsNotEqualTo> { static const char* getName(){ return "!="; } };
+ template<> struct OperatorTraits<IsLessThan> { static const char* getName(){ return "<"; } };
+ template<> struct OperatorTraits<IsGreaterThan> { static const char* getName(){ return ">"; } };
+ template<> struct OperatorTraits<IsLessThanOrEqualTo> { static const char* getName(){ return "<="; } };
+ template<> struct OperatorTraits<IsGreaterThanOrEqualTo>{ static const char* getName(){ return ">="; } };
+
+ template<typename T>
+ inline T& opCast(T const& t) { return const_cast<T&>(t); }
+
+// nullptr_t support based on pull request #154 from Konstantin Baumann
+#ifdef CATCH_CONFIG_CPP11_NULLPTR
+ inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; }
+#endif // CATCH_CONFIG_CPP11_NULLPTR
+
+ // So the compare overloads can be operator agnostic we convey the operator as a template
+ // enum, which is used to specialise an Evaluator for doing the comparison.
+ template<typename T1, typename T2, Operator Op>
+ class Evaluator{};
+
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsEqualTo> {
+ static bool evaluate( T1 const& lhs, T2 const& rhs) {
+ return bool( opCast( lhs ) == opCast( rhs ) );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsNotEqualTo> {
+ static bool evaluate( T1 const& lhs, T2 const& rhs ) {
+ return bool( opCast( lhs ) != opCast( rhs ) );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsLessThan> {
+ static bool evaluate( T1 const& lhs, T2 const& rhs ) {
+ return bool( opCast( lhs ) < opCast( rhs ) );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsGreaterThan> {
+ static bool evaluate( T1 const& lhs, T2 const& rhs ) {
+ return bool( opCast( lhs ) > opCast( rhs ) );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsGreaterThanOrEqualTo> {
+ static bool evaluate( T1 const& lhs, T2 const& rhs ) {
+ return bool( opCast( lhs ) >= opCast( rhs ) );
+ }
+ };
+ template<typename T1, typename T2>
+ struct Evaluator<T1, T2, IsLessThanOrEqualTo> {
+ static bool evaluate( T1 const& lhs, T2 const& rhs ) {
+ return bool( opCast( lhs ) <= opCast( rhs ) );
+ }
+ };
+
+ template<Operator Op, typename T1, typename T2>
+ bool applyEvaluator( T1 const& lhs, T2 const& rhs ) {
+ return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );
+ }
+
+ // This level of indirection allows us to specialise for integer types
+ // to avoid signed/ unsigned warnings
+
+ // "base" overload
+ template<Operator Op, typename T1, typename T2>
+ bool compare( T1 const& lhs, T2 const& rhs ) {
+ return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );
+ }
+
+ // unsigned X to int
+ template<Operator Op> bool compare( unsigned int lhs, int rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );
+ }
+ template<Operator Op> bool compare( unsigned long lhs, int rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );
+ }
+ template<Operator Op> bool compare( unsigned char lhs, int rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned int>( rhs ) );
+ }
+
+ // unsigned X to long
+ template<Operator Op> bool compare( unsigned int lhs, long rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );
+ }
+ template<Operator Op> bool compare( unsigned long lhs, long rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );
+ }
+ template<Operator Op> bool compare( unsigned char lhs, long rhs ) {
+ return applyEvaluator<Op>( lhs, static_cast<unsigned long>( rhs ) );
+ }
+
+ // int to unsigned X
+ template<Operator Op> bool compare( int lhs, unsigned int rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( int lhs, unsigned long rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( int lhs, unsigned char rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned int>( lhs ), rhs );
+ }
+
+ // long to unsigned X
+ template<Operator Op> bool compare( long lhs, unsigned int rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( long lhs, unsigned long rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( long lhs, unsigned char rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
+ }
+
+ // pointer to long (when comparing against NULL)
+ template<Operator Op, typename T> bool compare( long lhs, T* rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs );
+ }
+ template<Operator Op, typename T> bool compare( T* lhs, long rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );
+ }
+
+ // pointer to int (when comparing against NULL)
+ template<Operator Op, typename T> bool compare( int lhs, T* rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs );
+ }
+ template<Operator Op, typename T> bool compare( T* lhs, int rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );
+ }
+
+#ifdef CATCH_CONFIG_CPP11_LONG_LONG
+ // long long to unsigned X
+ template<Operator Op> bool compare( long long lhs, unsigned int rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( long long lhs, unsigned long rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( long long lhs, unsigned long long rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( long long lhs, unsigned char rhs ) {
+ return applyEvaluator<Op>( static_cast<unsigned long>( lhs ), rhs );
+ }
+
+ // unsigned long long to X
+ template<Operator Op> bool compare( unsigned long long lhs, int rhs ) {
+ return applyEvaluator<Op>( static_cast<long>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( unsigned long long lhs, long rhs ) {
+ return applyEvaluator<Op>( static_cast<long>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( unsigned long long lhs, long long rhs ) {
+ return applyEvaluator<Op>( static_cast<long>( lhs ), rhs );
+ }
+ template<Operator Op> bool compare( unsigned long long lhs, char rhs ) {
+ return applyEvaluator<Op>( static_cast<long>( lhs ), rhs );
+ }
+
+ // pointer to long long (when comparing against NULL)
+ template<Operator Op, typename T> bool compare( long long lhs, T* rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( reinterpret_cast<T*>( lhs ), rhs );
+ }
+ template<Operator Op, typename T> bool compare( T* lhs, long long rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );
+ }
+#endif // CATCH_CONFIG_CPP11_LONG_LONG
+
+#ifdef CATCH_CONFIG_CPP11_NULLPTR
+ // pointer to nullptr_t (when comparing against nullptr)
+ template<Operator Op, typename T> bool compare( std::nullptr_t, T* rhs ) {
+ return Evaluator<T*, T*, Op>::evaluate( nullptr, rhs );
+ }
+ template<Operator Op, typename T> bool compare( T* lhs, std::nullptr_t ) {
+ return Evaluator<T*, T*, Op>::evaluate( lhs, nullptr );
+ }
+#endif // CATCH_CONFIG_CPP11_NULLPTR
+
+} // end of namespace Internal
+} // end of namespace Catch
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+// #included from: catch_tostring.h
+#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED
+
+#include <sstream>
+#include <iomanip>
+#include <limits>
+#include <vector>
+#include <cstddef>
+
+#ifdef __OBJC__
+// #included from: catch_objc_arc.hpp
+#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED
+
+#import <Foundation/Foundation.h>
+
+#ifdef __has_feature
+#define CATCH_ARC_ENABLED __has_feature(objc_arc)
+#else
+#define CATCH_ARC_ENABLED 0
+#endif
+
+void arcSafeRelease( NSObject* obj );
+id performOptionalSelector( id obj, SEL sel );
+
+#if !CATCH_ARC_ENABLED
+inline void arcSafeRelease( NSObject* obj ) {
+ [obj release];
+}
+inline id performOptionalSelector( id obj, SEL sel ) {
+ if( [obj respondsToSelector: sel] )
+ return [obj performSelector: sel];
+ return nil;
+}
+#define CATCH_UNSAFE_UNRETAINED
+#define CATCH_ARC_STRONG
+#else
+inline void arcSafeRelease( NSObject* ){}
+inline id performOptionalSelector( id obj, SEL sel ) {
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
+#endif
+ if( [obj respondsToSelector: sel] )
+ return [obj performSelector: sel];
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+ return nil;
+}
+#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained
+#define CATCH_ARC_STRONG __strong
+#endif
+
+#endif
+
+#ifdef CATCH_CONFIG_CPP11_TUPLE
+#include <tuple>
+#endif
+
+#ifdef CATCH_CONFIG_CPP11_IS_ENUM
+#include <type_traits>
+#endif
+
+namespace Catch {
+
+// Why we're here.
+template<typename T>
+std::string toString( T const& value );
+
+// Built in overloads
+
+std::string toString( std::string const& value );
+std::string toString( std::wstring const& value );
+std::string toString( const char* const value );
+std::string toString( char* const value );
+std::string toString( const wchar_t* const value );
+std::string toString( wchar_t* const value );
+std::string toString( int value );
+std::string toString( unsigned long value );
+std::string toString( unsigned int value );
+std::string toString( const double value );
+std::string toString( const float value );
+std::string toString( bool value );
+std::string toString( char value );
+std::string toString( signed char value );
+std::string toString( unsigned char value );
+
+#ifdef CATCH_CONFIG_CPP11_LONG_LONG
+std::string toString( long long value );
+std::string toString( unsigned long long value );
+#endif
+
+#ifdef CATCH_CONFIG_CPP11_NULLPTR
+std::string toString( std::nullptr_t );
+#endif
+
+#ifdef __OBJC__
+ std::string toString( NSString const * const& nsstring );
+ std::string toString( NSString * CATCH_ARC_STRONG & nsstring );
+ std::string toString( NSObject* const& nsObject );
+#endif
+
+namespace Detail {
+
+ extern const std::string unprintableString;
+
+ #if !defined(CATCH_CONFIG_CPP11_STREAM_INSERTABLE_CHECK)
+ struct BorgType {
+ template<typename T> BorgType( T const& );
+ };
+
+ struct TrueType { char sizer[1]; };
+ struct FalseType { char sizer[2]; };
+
+ TrueType& testStreamable( std::ostream& );
+ FalseType testStreamable( FalseType );
+
+ FalseType operator<<( std::ostream const&, BorgType const& );
+
+ template<typename T>
+ struct IsStreamInsertable {
+ static std::ostream &s;
+ static T const&t;
+ enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) };
+ };
+#else
+ template<typename T>
+ class IsStreamInsertable {
+ template<typename SS, typename TT>
+ static auto test(int)
+ -> decltype( std::declval<SS&>() << std::declval<TT>(), std::true_type() );
+
+ template<typename, typename>
+ static auto test(...) -> std::false_type;
+
+ public:
+ static const bool value = decltype(test<std::ostream,const T&>(0))::value;
+ };
+#endif
+
+#if defined(CATCH_CONFIG_CPP11_IS_ENUM)
+ template<typename T,
+ bool IsEnum = std::is_enum<T>::value
+ >
+ struct EnumStringMaker
+ {
+ static std::string convert( T const& ) { return unprintableString; }
+ };
+
+ template<typename T>
+ struct EnumStringMaker<T,true>
+ {
+ static std::string convert( T const& v )
+ {
+ return ::Catch::toString(
+ static_cast<typename std::underlying_type<T>::type>(v)
+ );
+ }
+ };
+#endif
+ template<bool C>
+ struct StringMakerBase {
+#if defined(CATCH_CONFIG_CPP11_IS_ENUM)
+ template<typename T>
+ static std::string convert( T const& v )
+ {
+ return EnumStringMaker<T>::convert( v );
+ }
+#else
+ template<typename T>
+ static std::string convert( T const& ) { return unprintableString; }
+#endif
+ };
+
+ template<>
+ struct StringMakerBase<true> {
+ template<typename T>
+ static std::string convert( T const& _value ) {
+ std::ostringstream oss;
+ oss << _value;
+ return oss.str();
+ }
+ };
+
+ std::string rawMemoryToString( const void *object, std::size_t size );
+
+ template<typename T>
+ inline std::string rawMemoryToString( const T& object ) {
+ return rawMemoryToString( &object, sizeof(object) );
+ }
+
+} // end namespace Detail
+
+template<typename T>
+struct StringMaker :
+ Detail::StringMakerBase<Detail::IsStreamInsertable<T>::value> {};
+
+template<typename T>
+struct StringMaker<T*> {
+ template<typename U>
+ static std::string convert( U* p ) {
+ if( !p )
+ return "NULL";
+ else
+ return Detail::rawMemoryToString( p );
+ }
+};
+
+template<typename R, typename C>
+struct StringMaker<R C::*> {
+ static std::string convert( R C::* p ) {
+ if( !p )
+ return "NULL";
+ else
+ return Detail::rawMemoryToString( p );
+ }
+};
+
+namespace Detail {
+ template<typename InputIterator>
+ std::string rangeToString( InputIterator first, InputIterator last );
+}
+
+//template<typename T, typename Allocator>
+//struct StringMaker<std::vector<T, Allocator> > {
+// static std::string convert( std::vector<T,Allocator> const& v ) {
+// return Detail::rangeToString( v.begin(), v.end() );
+// }
+//};
+
+template<typename T, typename Allocator>
+std::string toString( std::vector<T,Allocator> const& v ) {
+ return Detail::rangeToString( v.begin(), v.end() );
+}
+
+#ifdef CATCH_CONFIG_CPP11_TUPLE
+
+// toString for tuples
+namespace TupleDetail {
+ template<
+ typename Tuple,
+ std::size_t N = 0,
+ bool = (N < std::tuple_size<Tuple>::value)
+ >
+ struct ElementPrinter {
+ static void print( const Tuple& tuple, std::ostream& os )
+ {
+ os << ( N ? ", " : " " )
+ << Catch::toString(std::get<N>(tuple));
+ ElementPrinter<Tuple,N+1>::print(tuple,os);
+ }
+ };
+
+ template<
+ typename Tuple,
+ std::size_t N
+ >
+ struct ElementPrinter<Tuple,N,false> {
+ static void print( const Tuple&, std::ostream& ) {}
+ };
+
+}
+
+template<typename ...Types>
+struct StringMaker<std::tuple<Types...>> {
+
+ static std::string convert( const std::tuple<Types...>& tuple )
+ {
+ std::ostringstream os;
+ os << '{';
+ TupleDetail::ElementPrinter<std::tuple<Types...>>::print( tuple, os );
+ os << " }";
+ return os.str();
+ }
+};
+#endif // CATCH_CONFIG_CPP11_TUPLE
+
+namespace Detail {
+ template<typename T>
+ std::string makeString( T const& value ) {
+ return StringMaker<T>::convert( value );
+ }
+} // end namespace Detail
+
+/// \brief converts any type to a string
+///
+/// The default template forwards on to ostringstream - except when an
+/// ostringstream overload does not exist - in which case it attempts to detect
+/// that and writes {?}.
+/// Overload (not specialise) this template for custom typs that you don't want
+/// to provide an ostream overload for.
+template<typename T>
+std::string toString( T const& value ) {
+ return StringMaker<T>::convert( value );
+}
+
+ namespace Detail {
+ template<typename InputIterator>
+ std::string rangeToString( InputIterator first, InputIterator last ) {
+ std::ostringstream oss;
+ oss << "{ ";
+ if( first != last ) {
+ oss << Catch::toString( *first );
+ for( ++first ; first != last ; ++first )
+ oss << ", " << Catch::toString( *first );
+ }
+ oss << " }";
+ return oss.str();
+ }
+}
+
+} // end namespace Catch
+
+namespace Catch {
+
+template<typename LhsT, Internal::Operator Op, typename RhsT>
+class BinaryExpression;
+
+template<typename ArgT, typename MatcherT>
+class MatchExpression;
+
+// Wraps the LHS of an expression and overloads comparison operators
+// for also capturing those and RHS (if any)
+template<typename T>
+class ExpressionLhs : public DecomposedExpression {
+public:
+ ExpressionLhs( ResultBuilder& rb, T lhs ) : m_rb( rb ), m_lhs( lhs ), m_truthy(false) {}
+
+ ExpressionLhs& operator = ( const ExpressionLhs& );
+
+ template<typename RhsT>
+ BinaryExpression<T, Internal::IsEqualTo, RhsT const&>
+ operator == ( RhsT const& rhs ) {
+ return captureExpression<Internal::IsEqualTo>( rhs );
+ }
+
+ template<typename RhsT>
+ BinaryExpression<T, Internal::IsNotEqualTo, RhsT const&>
+ operator != ( RhsT const& rhs ) {
+ return captureExpression<Internal::IsNotEqualTo>( rhs );
+ }
+
+ template<typename RhsT>
+ BinaryExpression<T, Internal::IsLessThan, RhsT const&>
+ operator < ( RhsT const& rhs ) {
+ return captureExpression<Internal::IsLessThan>( rhs );
+ }
+
+ template<typename RhsT>
+ BinaryExpression<T, Internal::IsGreaterThan, RhsT const&>
+ operator > ( RhsT const& rhs ) {
+ return captureExpression<Internal::IsGreaterThan>( rhs );
+ }
+
+ template<typename RhsT>
+ BinaryExpression<T, Internal::IsLessThanOrEqualTo, RhsT const&>
+ operator <= ( RhsT const& rhs ) {
+ return captureExpression<Internal::IsLessThanOrEqualTo>( rhs );
+ }
+
+ template<typename RhsT>
+ BinaryExpression<T, Internal::IsGreaterThanOrEqualTo, RhsT const&>
+ operator >= ( RhsT const& rhs ) {
+ return captureExpression<Internal::IsGreaterThanOrEqualTo>( rhs );
+ }
+
+ BinaryExpression<T, Internal::IsEqualTo, bool> operator == ( bool rhs ) {
+ return captureExpression<Internal::IsEqualTo>( rhs );
+ }
+
+ BinaryExpression<T, Internal::IsNotEqualTo, bool> operator != ( bool rhs ) {
+ return captureExpression<Internal::IsNotEqualTo>( rhs );
+ }
+
+ void endExpression() {
+ m_truthy = m_lhs ? true : false;
+ m_rb
+ .setResultType( m_truthy )
+ .endExpression( *this );
+ }
+
+ virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE {
+ dest = Catch::toString( m_lhs );
+ }
+
+private:
+ template<Internal::Operator Op, typename RhsT>
+ BinaryExpression<T, Op, RhsT&> captureExpression( RhsT& rhs ) const {
+ return BinaryExpression<T, Op, RhsT&>( m_rb, m_lhs, rhs );
+ }
+
+ template<Internal::Operator Op>
+ BinaryExpression<T, Op, bool> captureExpression( bool rhs ) const {
+ return BinaryExpression<T, Op, bool>( m_rb, m_lhs, rhs );
+ }
+
+private:
+ ResultBuilder& m_rb;
+ T m_lhs;
+ bool m_truthy;
+};
+
+template<typename LhsT, Internal::Operator Op, typename RhsT>
+class BinaryExpression : public DecomposedExpression {
+public:
+ BinaryExpression( ResultBuilder& rb, LhsT lhs, RhsT rhs )
+ : m_rb( rb ), m_lhs( lhs ), m_rhs( rhs ) {}
+
+ BinaryExpression& operator = ( BinaryExpression& );
+
+ void endExpression() const {
+ m_rb
+ .setResultType( Internal::compare<Op>( m_lhs, m_rhs ) )
+ .endExpression( *this );
+ }
+
+ virtual bool isBinaryExpression() const CATCH_OVERRIDE {
+ return true;
+ }
+
+ virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE {
+ std::string lhs = Catch::toString( m_lhs );
+ std::string rhs = Catch::toString( m_rhs );
+ char delim = lhs.size() + rhs.size() < 40 &&
+ lhs.find('\n') == std::string::npos &&
+ rhs.find('\n') == std::string::npos ? ' ' : '\n';
+ dest.reserve( 7 + lhs.size() + rhs.size() );
+ // 2 for spaces around operator
+ // 2 for operator
+ // 2 for parentheses (conditionally added later)
+ // 1 for negation (conditionally added later)
+ dest = lhs;
+ dest += delim;
+ dest += Internal::OperatorTraits<Op>::getName();
+ dest += delim;
+ dest += rhs;
+ }
+
+private:
+ ResultBuilder& m_rb;
+ LhsT m_lhs;
+ RhsT m_rhs;
+};
+
+template<typename ArgT, typename MatcherT>
+class MatchExpression : public DecomposedExpression {
+public:
+ MatchExpression( ArgT arg, MatcherT matcher, char const* matcherString )
+ : m_arg( arg ), m_matcher( matcher ), m_matcherString( matcherString ) {}
+
+ virtual bool isBinaryExpression() const CATCH_OVERRIDE {
+ return true;
+ }
+
+ virtual void reconstructExpression( std::string& dest ) const CATCH_OVERRIDE {
+ std::string matcherAsString = m_matcher.toString();
+ dest = Catch::toString( m_arg );
+ dest += ' ';
+ if( matcherAsString == Detail::unprintableString )
+ dest += m_matcherString;
+ else
+ dest += matcherAsString;
+ }
+
+private:
+ ArgT m_arg;
+ MatcherT m_matcher;
+ char const* m_matcherString;
+};
+
+} // end namespace Catch
+
+
+namespace Catch {
+
+ template<typename T>
+ inline ExpressionLhs<T const&> ResultBuilder::operator <= ( T const& operand ) {
+ return ExpressionLhs<T const&>( *this, operand );
+ }
+
+ inline ExpressionLhs<bool> ResultBuilder::operator <= ( bool value ) {
+ return ExpressionLhs<bool>( *this, value );
+ }
+
+ template<typename ArgT, typename MatcherT>
+ inline void ResultBuilder::captureMatch( ArgT const& arg, MatcherT const& matcher,
+ char const* matcherString ) {
+ MatchExpression<ArgT const&, MatcherT const&> expr( arg, matcher, matcherString );
+ setResultType( matcher.match( arg ) );
+ endExpression( expr );
+ }
+
+} // namespace Catch
+
+// #included from: catch_message.h
+#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ struct MessageInfo {
+ MessageInfo( std::string const& _macroName,
+ SourceLineInfo const& _lineInfo,
+ ResultWas::OfType _type );
+
+ std::string macroName;
+ SourceLineInfo lineInfo;
+ ResultWas::OfType type;
+ std::string message;
+ unsigned int sequence;
+
+ bool operator == ( MessageInfo const& other ) const {
+ return sequence == other.sequence;
+ }
+ bool operator < ( MessageInfo const& other ) const {
+ return sequence < other.sequence;
+ }
+ private:
+ static unsigned int globalCount;
+ };
+
+ struct MessageBuilder {
+ MessageBuilder( std::string const& macroName,
+ SourceLineInfo const& lineInfo,
+ ResultWas::OfType type )
+ : m_info( macroName, lineInfo, type )
+ {}
+
+ template<typename T>
+ MessageBuilder& operator << ( T const& value ) {
+ m_stream << value;
+ return *this;
+ }
+
+ MessageInfo m_info;
+ std::ostringstream m_stream;
+ };
+
+ class ScopedMessage {
+ public:
+ ScopedMessage( MessageBuilder const& builder );
+ ScopedMessage( ScopedMessage const& other );
+ ~ScopedMessage();
+
+ MessageInfo m_info;
+ };
+
+} // end namespace Catch
+
+// #included from: catch_interfaces_capture.h
+#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ class TestCase;
+ class AssertionResult;
+ struct AssertionInfo;
+ struct SectionInfo;
+ struct SectionEndInfo;
+ struct MessageInfo;
+ class ScopedMessageBuilder;
+ struct Counts;
+
+ struct IResultCapture {
+
+ virtual ~IResultCapture();
+
+ virtual void assertionEnded( AssertionResult const& result ) = 0;
+ virtual bool sectionStarted( SectionInfo const& sectionInfo,
+ Counts& assertions ) = 0;
+ virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0;
+ virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0;
+ virtual void pushScopedMessage( MessageInfo const& message ) = 0;
+ virtual void popScopedMessage( MessageInfo const& message ) = 0;
+
+ virtual std::string getCurrentTestName() const = 0;
+ virtual const AssertionResult* getLastResult() const = 0;
+
+ virtual void exceptionEarlyReported() = 0;
+
+ virtual void handleFatalErrorCondition( std::string const& message ) = 0;
+ };
+
+ IResultCapture& getResultCapture();
+}
+
+// #included from: catch_debugger.h
+#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED
+
+// #included from: catch_platform.h
+#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED
+
+#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
+# define CATCH_PLATFORM_MAC
+#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
+# define CATCH_PLATFORM_IPHONE
+#elif defined(linux) || defined(__linux) || defined(__linux__)
+# define CATCH_PLATFORM_LINUX
+#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER)
+# define CATCH_PLATFORM_WINDOWS
+# if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX)
+# define CATCH_DEFINES_NOMINMAX
+# endif
+# if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN)
+# define CATCH_DEFINES_WIN32_LEAN_AND_MEAN
+# endif
+#endif
+
+#include <string>
+
+namespace Catch{
+
+ bool isDebuggerActive();
+ void writeToDebugConsole( std::string const& text );
+}
+
+#ifdef CATCH_PLATFORM_MAC
+
+ // The following code snippet based on:
+ // http://cocoawithlove.com/2008/03/break-into-debugger.html
+ #if defined(__ppc64__) || defined(__ppc__)
+ #define CATCH_TRAP() \
+ __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \
+ : : : "memory","r0","r3","r4" )
+ #else
+ #define CATCH_TRAP() __asm__("int $3\n" : : )
+ #endif
+
+#elif defined(CATCH_PLATFORM_LINUX)
+ // If we can use inline assembler, do it because this allows us to break
+ // directly at the location of the failing check instead of breaking inside
+ // raise() called from it, i.e. one stack frame below.
+ #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))
+ #define CATCH_TRAP() asm volatile ("int $3")
+ #else // Fall back to the generic way.
+ #include <signal.h>
+
+ #define CATCH_TRAP() raise(SIGTRAP)
+ #endif
+#elif defined(_MSC_VER)
+ #define CATCH_TRAP() __debugbreak()
+#elif defined(__MINGW32__)
+ extern "C" __declspec(dllimport) void __stdcall DebugBreak();
+ #define CATCH_TRAP() DebugBreak()
+#endif
+
+#ifdef CATCH_TRAP
+ #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { CATCH_TRAP(); }
+#else
+ #define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue();
+#endif
+
+// #included from: catch_interfaces_runner.h
+#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED
+
+namespace Catch {
+ class TestCase;
+
+ struct IRunner {
+ virtual ~IRunner();
+ virtual bool aborting() const = 0;
+ };
+}
+
+#if defined(CATCH_CONFIG_FAST_COMPILE)
+///////////////////////////////////////////////////////////////////////////////
+// We can speedup compilation significantly by breaking into debugger lower in
+// the callstack, because then we don't have to expand CATCH_BREAK_INTO_DEBUGGER
+// macro in each assertion
+#define INTERNAL_CATCH_REACT( resultBuilder ) \
+ resultBuilder.react();
+
+///////////////////////////////////////////////////////////////////////////////
+// Another way to speed-up compilation is to omit local try-catch for REQUIRE*
+// macros.
+// This can potentially cause false negative, if the test code catches
+// the exception before it propagates back up to the runner.
+#define INTERNAL_CATCH_TEST_NO_TRY( macroName, resultDisposition, expr ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
+ __catchResult.setExceptionGuard(); \
+ CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
+ ( __catchResult <= expr ).endExpression(); \
+ CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \
+ __catchResult.unsetExceptionGuard(); \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::isTrue( false && static_cast<bool>( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look
+// The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&.
+
+#define INTERNAL_CHECK_THAT_NO_TRY( macroName, matcher, resultDisposition, arg ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \
+ __catchResult.setExceptionGuard(); \
+ __catchResult.captureMatch( arg, matcher, #matcher ); \
+ __catchResult.unsetExceptionGuard(); \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::alwaysFalse() )
+
+#else
+///////////////////////////////////////////////////////////////////////////////
+// In the event of a failure works out if the debugger needs to be invoked
+// and/or an exception thrown and takes appropriate action.
+// This needs to be done as a macro so the debugger will stop in the user
+// source code rather than in Catch library code
+#define INTERNAL_CATCH_REACT( resultBuilder ) \
+ if( resultBuilder.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \
+ resultBuilder.react();
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
+ try { \
+ CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
+ ( __catchResult <= expr ).endExpression(); \
+ CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \
+ } \
+ catch( ... ) { \
+ __catchResult.useActiveException( resultDisposition ); \
+ } \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::isTrue( false && static_cast<bool>( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look
+ // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&.
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_IF( macroName, resultDisposition, expr ) \
+ INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \
+ if( Catch::getResultCapture().getLastResult()->succeeded() )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, expr ) \
+ INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \
+ if( !Catch::getResultCapture().getLastResult()->succeeded() )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, expr ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
+ try { \
+ static_cast<void>(expr); \
+ __catchResult.captureResult( Catch::ResultWas::Ok ); \
+ } \
+ catch( ... ) { \
+ __catchResult.useActiveException( resultDisposition ); \
+ } \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::alwaysFalse() )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_THROWS( macroName, resultDisposition, matcher, expr ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition, #matcher ); \
+ if( __catchResult.allowThrows() ) \
+ try { \
+ static_cast<void>(expr); \
+ __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \
+ } \
+ catch( ... ) { \
+ __catchResult.captureExpectedException( matcher ); \
+ } \
+ else \
+ __catchResult.captureResult( Catch::ResultWas::Ok ); \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::alwaysFalse() )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr ", " #exceptionType, resultDisposition ); \
+ if( __catchResult.allowThrows() ) \
+ try { \
+ static_cast<void>(expr); \
+ __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \
+ } \
+ catch( exceptionType ) { \
+ __catchResult.captureResult( Catch::ResultWas::Ok ); \
+ } \
+ catch( ... ) { \
+ __catchResult.useActiveException( resultDisposition ); \
+ } \
+ else \
+ __catchResult.captureResult( Catch::ResultWas::Ok ); \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::alwaysFalse() )
+
+///////////////////////////////////////////////////////////////////////////////
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+ #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \
+ __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \
+ __catchResult.captureResult( messageType ); \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::alwaysFalse() )
+#else
+ #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, log ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \
+ __catchResult << log + ::Catch::StreamEndStop(); \
+ __catchResult.captureResult( messageType ); \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::alwaysFalse() )
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_INFO( macroName, log ) \
+ Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) = Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log;
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \
+ do { \
+ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \
+ try { \
+ __catchResult.captureMatch( arg, matcher, #matcher ); \
+ } catch( ... ) { \
+ __catchResult.useActiveException( resultDisposition | Catch::ResultDisposition::ContinueOnFailure ); \
+ } \
+ INTERNAL_CATCH_REACT( __catchResult ) \
+ } while( Catch::alwaysFalse() )
+
+// #included from: internal/catch_section.h
+#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED
+
+// #included from: catch_section_info.h
+#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED
+
+// #included from: catch_totals.hpp
+#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED
+
+#include <cstddef>
+
+namespace Catch {
+
+ struct Counts {
+ Counts() : passed( 0 ), failed( 0 ), failedButOk( 0 ) {}
+
+ Counts operator - ( Counts const& other ) const {
+ Counts diff;
+ diff.passed = passed - other.passed;
+ diff.failed = failed - other.failed;
+ diff.failedButOk = failedButOk - other.failedButOk;
+ return diff;
+ }
+ Counts& operator += ( Counts const& other ) {
+ passed += other.passed;
+ failed += other.failed;
+ failedButOk += other.failedButOk;
+ return *this;
+ }
+
+ std::size_t total() const {
+ return passed + failed + failedButOk;
+ }
+ bool allPassed() const {
+ return failed == 0 && failedButOk == 0;
+ }
+ bool allOk() const {
+ return failed == 0;
+ }
+
+ std::size_t passed;
+ std::size_t failed;
+ std::size_t failedButOk;
+ };
+
+ struct Totals {
+
+ Totals operator - ( Totals const& other ) const {
+ Totals diff;
+ diff.assertions = assertions - other.assertions;
+ diff.testCases = testCases - other.testCases;
+ return diff;
+ }
+
+ Totals delta( Totals const& prevTotals ) const {
+ Totals diff = *this - prevTotals;
+ if( diff.assertions.failed > 0 )
+ ++diff.testCases.failed;
+ else if( diff.assertions.failedButOk > 0 )
+ ++diff.testCases.failedButOk;
+ else
+ ++diff.testCases.passed;
+ return diff;
+ }
+
+ Totals& operator += ( Totals const& other ) {
+ assertions += other.assertions;
+ testCases += other.testCases;
+ return *this;
+ }
+
+ Counts assertions;
+ Counts testCases;
+ };
+}
+
+#include <string>
+
+namespace Catch {
+
+ struct SectionInfo {
+ SectionInfo
+ ( SourceLineInfo const& _lineInfo,
+ std::string const& _name,
+ std::string const& _description = std::string() );
+
+ std::string name;
+ std::string description;
+ SourceLineInfo lineInfo;
+ };
+
+ struct SectionEndInfo {
+ SectionEndInfo( SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds )
+ : sectionInfo( _sectionInfo ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds )
+ {}
+
+ SectionInfo sectionInfo;
+ Counts prevAssertions;
+ double durationInSeconds;
+ };
+
+} // end namespace Catch
+
+// #included from: catch_timer.h
+#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED
+
+#ifdef _MSC_VER
+
+namespace Catch {
+ typedef unsigned long long UInt64;
+}
+#else
+#include <stdint.h>
+namespace Catch {
+ typedef uint64_t UInt64;
+}
+#endif
+
+namespace Catch {
+ class Timer {
+ public:
+ Timer() : m_ticks( 0 ) {}
+ void start();
+ unsigned int getElapsedMicroseconds() const;
+ unsigned int getElapsedMilliseconds() const;
+ double getElapsedSeconds() const;
+
+ private:
+ UInt64 m_ticks;
+ };
+
+} // namespace Catch
+
+#include <string>
+
+namespace Catch {
+
+ class Section : NonCopyable {
+ public:
+ Section( SectionInfo const& info );
+ ~Section();
+
+ // This indicates whether the section should be executed or not
+ operator bool() const;
+
+ private:
+ SectionInfo m_info;
+
+ std::string m_name;
+ Counts m_assertions;
+ bool m_sectionIncluded;
+ Timer m_timer;
+ };
+
+} // end namespace Catch
+
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+ #define INTERNAL_CATCH_SECTION( ... ) \
+ if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) )
+#else
+ #define INTERNAL_CATCH_SECTION( name, desc ) \
+ if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, name, desc ) )
+#endif
+
+// #included from: internal/catch_generators.hpp
+#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED
+
+#include <vector>
+#include <string>
+#include <stdlib.h>
+
+namespace Catch {
+
+template<typename T>
+struct IGenerator {
+ virtual ~IGenerator() {}
+ virtual T getValue( std::size_t index ) const = 0;
+ virtual std::size_t size () const = 0;
+};
+
+template<typename T>
+class BetweenGenerator : public IGenerator<T> {
+public:
+ BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){}
+
+ virtual T getValue( std::size_t index ) const {
+ return m_from+static_cast<int>( index );
+ }
+
+ virtual std::size_t size() const {
+ return static_cast<std::size_t>( 1+m_to-m_from );
+ }
+
+private:
+
+ T m_from;
+ T m_to;
+};
+
+template<typename T>
+class ValuesGenerator : public IGenerator<T> {
+public:
+ ValuesGenerator(){}
+
+ void add( T value ) {
+ m_values.push_back( value );
+ }
+
+ virtual T getValue( std::size_t index ) const {
+ return m_values[index];
+ }
+
+ virtual std::size_t size() const {
+ return m_values.size();
+ }
+
+private:
+ std::vector<T> m_values;
+};
+
+template<typename T>
+class CompositeGenerator {
+public:
+ CompositeGenerator() : m_totalSize( 0 ) {}
+
+ // *** Move semantics, similar to auto_ptr ***
+ CompositeGenerator( CompositeGenerator& other )
+ : m_fileInfo( other.m_fileInfo ),
+ m_totalSize( 0 )
+ {
+ move( other );
+ }
+
+ CompositeGenerator& setFileInfo( const char* fileInfo ) {
+ m_fileInfo = fileInfo;
+ return *this;
+ }
+
+ ~CompositeGenerator() {
+ deleteAll( m_composed );
+ }
+
+ operator T () const {
+ size_t overallIndex = getCurrentContext().getGeneratorIndex( m_fileInfo, m_totalSize );
+
+ typename std::vector<const IGenerator<T>*>::const_iterator it = m_composed.begin();
+ typename std::vector<const IGenerator<T>*>::const_iterator itEnd = m_composed.end();
+ for( size_t index = 0; it != itEnd; ++it )
+ {
+ const IGenerator<T>* generator = *it;
+ if( overallIndex >= index && overallIndex < index + generator->size() )
+ {
+ return generator->getValue( overallIndex-index );
+ }
+ index += generator->size();
+ }
+ CATCH_INTERNAL_ERROR( "Indexed past end of generated range" );
+ return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so
+ }
+
+ void add( const IGenerator<T>* generator ) {
+ m_totalSize += generator->size();
+ m_composed.push_back( generator );
+ }
+
+ CompositeGenerator& then( CompositeGenerator& other ) {
+ move( other );
+ return *this;
+ }
+
+ CompositeGenerator& then( T value ) {
+ ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
+ valuesGen->add( value );
+ add( valuesGen );
+ return *this;
+ }
+
+private:
+
+ void move( CompositeGenerator& other ) {
+ m_composed.insert( m_composed.end(), other.m_composed.begin(), other.m_composed.end() );
+ m_totalSize += other.m_totalSize;
+ other.m_composed.clear();
+ }
+
+ std::vector<const IGenerator<T>*> m_composed;
+ std::string m_fileInfo;
+ size_t m_totalSize;
+};
+
+namespace Generators
+{
+ template<typename T>
+ CompositeGenerator<T> between( T from, T to ) {
+ CompositeGenerator<T> generators;
+ generators.add( new BetweenGenerator<T>( from, to ) );
+ return generators;
+ }
+
+ template<typename T>
+ CompositeGenerator<T> values( T val1, T val2 ) {
+ CompositeGenerator<T> generators;
+ ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
+ valuesGen->add( val1 );
+ valuesGen->add( val2 );
+ generators.add( valuesGen );
+ return generators;
+ }
+
+ template<typename T>
+ CompositeGenerator<T> values( T val1, T val2, T val3 ){
+ CompositeGenerator<T> generators;
+ ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
+ valuesGen->add( val1 );
+ valuesGen->add( val2 );
+ valuesGen->add( val3 );
+ generators.add( valuesGen );
+ return generators;
+ }
+
+ template<typename T>
+ CompositeGenerator<T> values( T val1, T val2, T val3, T val4 ) {
+ CompositeGenerator<T> generators;
+ ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
+ valuesGen->add( val1 );
+ valuesGen->add( val2 );
+ valuesGen->add( val3 );
+ valuesGen->add( val4 );
+ generators.add( valuesGen );
+ return generators;
+ }
+
+} // end namespace Generators
+
+using namespace Generators;
+
+} // end namespace Catch
+
+#define INTERNAL_CATCH_LINESTR2( line ) #line
+#define INTERNAL_CATCH_LINESTR( line ) INTERNAL_CATCH_LINESTR2( line )
+
+#define INTERNAL_CATCH_GENERATE( expr ) expr.setFileInfo( __FILE__ "(" INTERNAL_CATCH_LINESTR( __LINE__ ) ")" )
+
+// #included from: internal/catch_interfaces_exception.h
+#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED
+
+#include <string>
+#include <vector>
+
+// #included from: catch_interfaces_registry_hub.h
+#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ class TestCase;
+ struct ITestCaseRegistry;
+ struct IExceptionTranslatorRegistry;
+ struct IExceptionTranslator;
+ struct IReporterRegistry;
+ struct IReporterFactory;
+ struct ITagAliasRegistry;
+
+ struct IRegistryHub {
+ virtual ~IRegistryHub();
+
+ virtual IReporterRegistry const& getReporterRegistry() const = 0;
+ virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0;
+ virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0;
+
+ virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0;
+ };
+
+ struct IMutableRegistryHub {
+ virtual ~IMutableRegistryHub();
+ virtual void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) = 0;
+ virtual void registerListener( Ptr<IReporterFactory> const& factory ) = 0;
+ virtual void registerTest( TestCase const& testInfo ) = 0;
+ virtual void registerTranslator( const IExceptionTranslator* translator ) = 0;
+ virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) = 0;
+ };
+
+ IRegistryHub& getRegistryHub();
+ IMutableRegistryHub& getMutableRegistryHub();
+ void cleanUp();
+ std::string translateActiveException();
+
+}
+
+namespace Catch {
+
+ typedef std::string(*exceptionTranslateFunction)();
+
+ struct IExceptionTranslator;
+ typedef std::vector<const IExceptionTranslator*> ExceptionTranslators;
+
+ struct IExceptionTranslator {
+ virtual ~IExceptionTranslator();
+ virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0;
+ };
+
+ struct IExceptionTranslatorRegistry {
+ virtual ~IExceptionTranslatorRegistry();
+
+ virtual std::string translateActiveException() const = 0;
+ };
+
+ class ExceptionTranslatorRegistrar {
+ template<typename T>
+ class ExceptionTranslator : public IExceptionTranslator {
+ public:
+
+ ExceptionTranslator( std::string(*translateFunction)( T& ) )
+ : m_translateFunction( translateFunction )
+ {}
+
+ virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const CATCH_OVERRIDE {
+ try {
+ if( it == itEnd )
+ throw;
+ else
+ return (*it)->translate( it+1, itEnd );
+ }
+ catch( T& ex ) {
+ return m_translateFunction( ex );
+ }
+ }
+
+ protected:
+ std::string(*m_translateFunction)( T& );
+ };
+
+ public:
+ template<typename T>
+ ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) {
+ getMutableRegistryHub().registerTranslator
+ ( new ExceptionTranslator<T>( translateFunction ) );
+ }
+ };
+}
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \
+ static std::string translatorName( signature ); \
+ namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\
+ static std::string translatorName( signature )
+
+#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )
+
+// #included from: internal/catch_approx.hpp
+#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED
+
+#include <cmath>
+#include <limits>
+
+#if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS)
+#include <type_traits>
+#endif
+
+namespace Catch {
+namespace Detail {
+
+ class Approx {
+ public:
+ explicit Approx ( double value )
+ : m_epsilon( std::numeric_limits<float>::epsilon()*100 ),
+ m_margin( 0.0 ),
+ m_scale( 1.0 ),
+ m_value( value )
+ {}
+
+ Approx( Approx const& other )
+ : m_epsilon( other.m_epsilon ),
+ m_margin( other.m_margin ),
+ m_scale( other.m_scale ),
+ m_value( other.m_value )
+ {}
+
+ static Approx custom() {
+ return Approx( 0 );
+ }
+
+#if defined(CATCH_CONFIG_CPP11_TYPE_TRAITS)
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ Approx operator()( T value ) {
+ Approx approx( static_cast<double>(value) );
+ approx.epsilon( m_epsilon );
+ approx.margin( m_margin );
+ approx.scale( m_scale );
+ return approx;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ explicit Approx( T value ): Approx(static_cast<double>(value))
+ {}
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator == ( const T& lhs, Approx const& rhs ) {
+ // Thanks to Richard Harris for his help refining this formula
+ auto lhs_v = double(lhs);
+ bool relativeOK = std::fabs(lhs_v - rhs.m_value) < rhs.m_epsilon * (rhs.m_scale + (std::max)(std::fabs(lhs_v), std::fabs(rhs.m_value)));
+ if (relativeOK) {
+ return true;
+ }
+ return std::fabs(lhs_v - rhs.m_value) < rhs.m_margin;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator == ( Approx const& lhs, const T& rhs ) {
+ return operator==( rhs, lhs );
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator != ( T lhs, Approx const& rhs ) {
+ return !operator==( lhs, rhs );
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator != ( Approx const& lhs, T rhs ) {
+ return !operator==( rhs, lhs );
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator <= ( T lhs, Approx const& rhs ) {
+ return double(lhs) < rhs.m_value || lhs == rhs;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator <= ( Approx const& lhs, T rhs ) {
+ return lhs.m_value < double(rhs) || lhs == rhs;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator >= ( T lhs, Approx const& rhs ) {
+ return double(lhs) > rhs.m_value || lhs == rhs;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator >= ( Approx const& lhs, T rhs ) {
+ return lhs.m_value > double(rhs) || lhs == rhs;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ Approx& epsilon( T newEpsilon ) {
+ m_epsilon = double(newEpsilon);
+ return *this;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ Approx& margin( T newMargin ) {
+ m_margin = double(newMargin);
+ return *this;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ Approx& scale( T newScale ) {
+ m_scale = double(newScale);
+ return *this;
+ }
+
+#else
+
+ Approx operator()( double value ) {
+ Approx approx( value );
+ approx.epsilon( m_epsilon );
+ approx.margin( m_margin );
+ approx.scale( m_scale );
+ return approx;
+ }
+
+ friend bool operator == ( double lhs, Approx const& rhs ) {
+ // Thanks to Richard Harris for his help refining this formula
+ bool relativeOK = std::fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( std::fabs(lhs), std::fabs(rhs.m_value) ) );
+ if (relativeOK) {
+ return true;
+ }
+ return std::fabs(lhs - rhs.m_value) < rhs.m_margin;
+ }
+
+ friend bool operator == ( Approx const& lhs, double rhs ) {
+ return operator==( rhs, lhs );
+ }
+
+ friend bool operator != ( double lhs, Approx const& rhs ) {
+ return !operator==( lhs, rhs );
+ }
+
+ friend bool operator != ( Approx const& lhs, double rhs ) {
+ return !operator==( rhs, lhs );
+ }
+
+ friend bool operator <= ( double lhs, Approx const& rhs ) {
+ return lhs < rhs.m_value || lhs == rhs;
+ }
+
+ friend bool operator <= ( Approx const& lhs, double rhs ) {
+ return lhs.m_value < rhs || lhs == rhs;
+ }
+
+ friend bool operator >= ( double lhs, Approx const& rhs ) {
+ return lhs > rhs.m_value || lhs == rhs;
+ }
+
+ friend bool operator >= ( Approx const& lhs, double rhs ) {
+ return lhs.m_value > rhs || lhs == rhs;
+ }
+
+ Approx& epsilon( double newEpsilon ) {
+ m_epsilon = newEpsilon;
+ return *this;
+ }
+
+ Approx& margin( double newMargin ) {
+ m_margin = newMargin;
+ return *this;
+ }
+
+ Approx& scale( double newScale ) {
+ m_scale = newScale;
+ return *this;
+ }
+#endif
+
+ std::string toString() const {
+ std::ostringstream oss;
+ oss << "Approx( " << Catch::toString( m_value ) << " )";
+ return oss.str();
+ }
+
+ private:
+ double m_epsilon;
+ double m_margin;
+ double m_scale;
+ double m_value;
+ };
+}
+
+template<>
+inline std::string toString<Detail::Approx>( Detail::Approx const& value ) {
+ return value.toString();
+}
+
+} // end namespace Catch
+
+// #included from: internal/catch_matchers_string.h
+#define TWOBLUECUBES_CATCH_MATCHERS_STRING_H_INCLUDED
+
+namespace Catch {
+namespace Matchers {
+
+ namespace StdString {
+
+ struct CasedString
+ {
+ CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity );
+ std::string adjustString( std::string const& str ) const;
+ std::string caseSensitivitySuffix() const;
+
+ CaseSensitive::Choice m_caseSensitivity;
+ std::string m_str;
+ };
+
+ struct StringMatcherBase : MatcherBase<std::string> {
+ StringMatcherBase( std::string const& operation, CasedString const& comparator );
+ virtual std::string describe() const CATCH_OVERRIDE;
+
+ CasedString m_comparator;
+ std::string m_operation;
+ };
+
+ struct EqualsMatcher : StringMatcherBase {
+ EqualsMatcher( CasedString const& comparator );
+ virtual bool match( std::string const& source ) const CATCH_OVERRIDE;
+ };
+ struct ContainsMatcher : StringMatcherBase {
+ ContainsMatcher( CasedString const& comparator );
+ virtual bool match( std::string const& source ) const CATCH_OVERRIDE;
+ };
+ struct StartsWithMatcher : StringMatcherBase {
+ StartsWithMatcher( CasedString const& comparator );
+ virtual bool match( std::string const& source ) const CATCH_OVERRIDE;
+ };
+ struct EndsWithMatcher : StringMatcherBase {
+ EndsWithMatcher( CasedString const& comparator );
+ virtual bool match( std::string const& source ) const CATCH_OVERRIDE;
+ };
+
+ } // namespace StdString
+
+ // The following functions create the actual matcher objects.
+ // This allows the types to be inferred
+
+ StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );
+ StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );
+ StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );
+ StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );
+
+} // namespace Matchers
+} // namespace Catch
+
+// #included from: internal/catch_matchers_vector.h
+#define TWOBLUECUBES_CATCH_MATCHERS_VECTOR_H_INCLUDED
+
+namespace Catch {
+namespace Matchers {
+
+ namespace Vector {
+
+ template<typename T>
+ struct ContainsElementMatcher : MatcherBase<std::vector<T>, T> {
+
+ ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {}
+
+ bool match(std::vector<T> const &v) const CATCH_OVERRIDE {
+ return std::find(v.begin(), v.end(), m_comparator) != v.end();
+ }
+
+ virtual std::string describe() const CATCH_OVERRIDE {
+ return "Contains: " + Catch::toString( m_comparator );
+ }
+
+ T const& m_comparator;
+ };
+
+ template<typename T>
+ struct ContainsMatcher : MatcherBase<std::vector<T>, std::vector<T> > {
+
+ ContainsMatcher(std::vector<T> const &comparator) : m_comparator( comparator ) {}
+
+ bool match(std::vector<T> const &v) const CATCH_OVERRIDE {
+ // !TBD: see note in EqualsMatcher
+ if (m_comparator.size() > v.size())
+ return false;
+ for (size_t i = 0; i < m_comparator.size(); ++i)
+ if (std::find(v.begin(), v.end(), m_comparator[i]) == v.end())
+ return false;
+ return true;
+ }
+ virtual std::string describe() const CATCH_OVERRIDE {
+ return "Contains: " + Catch::toString( m_comparator );
+ }
+
+ std::vector<T> const& m_comparator;
+ };
+
+ template<typename T>
+ struct EqualsMatcher : MatcherBase<std::vector<T>, std::vector<T> > {
+
+ EqualsMatcher(std::vector<T> const &comparator) : m_comparator( comparator ) {}
+
+ bool match(std::vector<T> const &v) const CATCH_OVERRIDE {
+ // !TBD: This currently works if all elements can be compared using !=
+ // - a more general approach would be via a compare template that defaults
+ // to using !=. but could be specialised for, e.g. std::vector<T> etc
+ // - then just call that directly
+ if (m_comparator.size() != v.size())
+ return false;
+ for (size_t i = 0; i < v.size(); ++i)
+ if (m_comparator[i] != v[i])
+ return false;
+ return true;
+ }
+ virtual std::string describe() const CATCH_OVERRIDE {
+ return "Equals: " + Catch::toString( m_comparator );
+ }
+ std::vector<T> const& m_comparator;
+ };
+
+ } // namespace Vector
+
+ // The following functions create the actual matcher objects.
+ // This allows the types to be inferred
+
+ template<typename T>
+ Vector::ContainsMatcher<T> Contains( std::vector<T> const& comparator ) {
+ return Vector::ContainsMatcher<T>( comparator );
+ }
+
+ template<typename T>
+ Vector::ContainsElementMatcher<T> VectorContains( T const& comparator ) {
+ return Vector::ContainsElementMatcher<T>( comparator );
+ }
+
+ template<typename T>
+ Vector::EqualsMatcher<T> Equals( std::vector<T> const& comparator ) {
+ return Vector::EqualsMatcher<T>( comparator );
+ }
+
+} // namespace Matchers
+} // namespace Catch
+
+// #included from: internal/catch_interfaces_tag_alias_registry.h
+#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED
+
+// #included from: catch_tag_alias.h
+#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED
+
+#include <string>
+
+namespace Catch {
+
+ struct TagAlias {
+ TagAlias( std::string const& _tag, SourceLineInfo _lineInfo ) : tag( _tag ), lineInfo( _lineInfo ) {}
+
+ std::string tag;
+ SourceLineInfo lineInfo;
+ };
+
+ struct RegistrarForTagAliases {
+ RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo );
+ };
+
+} // end namespace Catch
+
+#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); }
+// #included from: catch_option.hpp
+#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED
+
+namespace Catch {
+
+ // An optional type
+ template<typename T>
+ class Option {
+ public:
+ Option() : nullableValue( CATCH_NULL ) {}
+ Option( T const& _value )
+ : nullableValue( new( storage ) T( _value ) )
+ {}
+ Option( Option const& _other )
+ : nullableValue( _other ? new( storage ) T( *_other ) : CATCH_NULL )
+ {}
+
+ ~Option() {
+ reset();
+ }
+
+ Option& operator= ( Option const& _other ) {
+ if( &_other != this ) {
+ reset();
+ if( _other )
+ nullableValue = new( storage ) T( *_other );
+ }
+ return *this;
+ }
+ Option& operator = ( T const& _value ) {
+ reset();
+ nullableValue = new( storage ) T( _value );
+ return *this;
+ }
+
+ void reset() {
+ if( nullableValue )
+ nullableValue->~T();
+ nullableValue = CATCH_NULL;
+ }
+
+ T& operator*() { return *nullableValue; }
+ T const& operator*() const { return *nullableValue; }
+ T* operator->() { return nullableValue; }
+ const T* operator->() const { return nullableValue; }
+
+ T valueOr( T const& defaultValue ) const {
+ return nullableValue ? *nullableValue : defaultValue;
+ }
+
+ bool some() const { return nullableValue != CATCH_NULL; }
+ bool none() const { return nullableValue == CATCH_NULL; }
+
+ bool operator !() const { return nullableValue == CATCH_NULL; }
+ operator SafeBool::type() const {
+ return SafeBool::makeSafe( some() );
+ }
+
+ private:
+ T *nullableValue;
+ union {
+ char storage[sizeof(T)];
+
+ // These are here to force alignment for the storage
+ long double dummy1;
+ void (*dummy2)();
+ long double dummy3;
+#ifdef CATCH_CONFIG_CPP11_LONG_LONG
+ long long dummy4;
+#endif
+ };
+ };
+
+} // end namespace Catch
+
+namespace Catch {
+
+ struct ITagAliasRegistry {
+ virtual ~ITagAliasRegistry();
+ virtual Option<TagAlias> find( std::string const& alias ) const = 0;
+ virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0;
+
+ static ITagAliasRegistry const& get();
+ };
+
+} // end namespace Catch
+
+// These files are included here so the single_include script doesn't put them
+// in the conditionally compiled sections
+// #included from: internal/catch_test_case_info.h
+#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED
+
+#include <string>
+#include <set>
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+namespace Catch {
+
+ struct ITestCase;
+
+ struct TestCaseInfo {
+ enum SpecialProperties{
+ None = 0,
+ IsHidden = 1 << 1,
+ ShouldFail = 1 << 2,
+ MayFail = 1 << 3,
+ Throws = 1 << 4,
+ NonPortable = 1 << 5
+ };
+
+ TestCaseInfo( std::string const& _name,
+ std::string const& _className,
+ std::string const& _description,
+ std::set<std::string> const& _tags,
+ SourceLineInfo const& _lineInfo );
+
+ TestCaseInfo( TestCaseInfo const& other );
+
+ friend void setTags( TestCaseInfo& testCaseInfo, std::set<std::string> const& tags );
+
+ bool isHidden() const;
+ bool throws() const;
+ bool okToFail() const;
+ bool expectedToFail() const;
+
+ std::string name;
+ std::string className;
+ std::string description;
+ std::set<std::string> tags;
+ std::set<std::string> lcaseTags;
+ std::string tagsAsString;
+ SourceLineInfo lineInfo;
+ SpecialProperties properties;
+ };
+
+ class TestCase : public TestCaseInfo {
+ public:
+
+ TestCase( ITestCase* testCase, TestCaseInfo const& info );
+ TestCase( TestCase const& other );
+
+ TestCase withName( std::string const& _newName ) const;
+
+ void invoke() const;
+
+ TestCaseInfo const& getTestCaseInfo() const;
+
+ void swap( TestCase& other );
+ bool operator == ( TestCase const& other ) const;
+ bool operator < ( TestCase const& other ) const;
+ TestCase& operator = ( TestCase const& other );
+
+ private:
+ Ptr<ITestCase> test;
+ };
+
+ TestCase makeTestCase( ITestCase* testCase,
+ std::string const& className,
+ std::string const& name,
+ std::string const& description,
+ SourceLineInfo const& lineInfo );
+}
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+
+#ifdef __OBJC__
+// #included from: internal/catch_objc.hpp
+#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED
+
+#import <objc/runtime.h>
+
+#include <string>
+
+// NB. Any general catch headers included here must be included
+// in catch.hpp first to make sure they are included by the single
+// header for non obj-usage
+
+///////////////////////////////////////////////////////////////////////////////
+// This protocol is really only here for (self) documenting purposes, since
+// all its methods are optional.
+@protocol OcFixture
+
+@optional
+
+-(void) setUp;
+-(void) tearDown;
+
+@end
+
+namespace Catch {
+
+ class OcMethod : public SharedImpl<ITestCase> {
+
+ public:
+ OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {}
+
+ virtual void invoke() const {
+ id obj = [[m_cls alloc] init];
+
+ performOptionalSelector( obj, @selector(setUp) );
+ performOptionalSelector( obj, m_sel );
+ performOptionalSelector( obj, @selector(tearDown) );
+
+ arcSafeRelease( obj );
+ }
+ private:
+ virtual ~OcMethod() {}
+
+ Class m_cls;
+ SEL m_sel;
+ };
+
+ namespace Detail{
+
+ inline std::string getAnnotation( Class cls,
+ std::string const& annotationName,
+ std::string const& testCaseName ) {
+ NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()];
+ SEL sel = NSSelectorFromString( selStr );
+ arcSafeRelease( selStr );
+ id value = performOptionalSelector( cls, sel );
+ if( value )
+ return [(NSString*)value UTF8String];
+ return "";
+ }
+ }
+
+ inline size_t registerTestMethods() {
+ size_t noTestMethods = 0;
+ int noClasses = objc_getClassList( CATCH_NULL, 0 );
+
+ Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses);
+ objc_getClassList( classes, noClasses );
+
+ for( int c = 0; c < noClasses; c++ ) {
+ Class cls = classes[c];
+ {
+ u_int count;
+ Method* methods = class_copyMethodList( cls, &count );
+ for( u_int m = 0; m < count ; m++ ) {
+ SEL selector = method_getName(methods[m]);
+ std::string methodName = sel_getName(selector);
+ if( startsWith( methodName, "Catch_TestCase_" ) ) {
+ std::string testCaseName = methodName.substr( 15 );
+ std::string name = Detail::getAnnotation( cls, "Name", testCaseName );
+ std::string desc = Detail::getAnnotation( cls, "Description", testCaseName );
+ const char* className = class_getName( cls );
+
+ getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) );
+ noTestMethods++;
+ }
+ }
+ free(methods);
+ }
+ }
+ return noTestMethods;
+ }
+
+ namespace Matchers {
+ namespace Impl {
+ namespace NSStringMatchers {
+
+ struct StringHolder : MatcherBase<NSString*>{
+ StringHolder( NSString* substr ) : m_substr( [substr copy] ){}
+ StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){}
+ StringHolder() {
+ arcSafeRelease( m_substr );
+ }
+
+ virtual bool match( NSString* arg ) const CATCH_OVERRIDE {
+ return false;
+ }
+
+ NSString* m_substr;
+ };
+
+ struct Equals : StringHolder {
+ Equals( NSString* substr ) : StringHolder( substr ){}
+
+ virtual bool match( NSString* str ) const CATCH_OVERRIDE {
+ return (str != nil || m_substr == nil ) &&
+ [str isEqualToString:m_substr];
+ }
+
+ virtual std::string describe() const CATCH_OVERRIDE {
+ return "equals string: " + Catch::toString( m_substr );
+ }
+ };
+
+ struct Contains : StringHolder {
+ Contains( NSString* substr ) : StringHolder( substr ){}
+
+ virtual bool match( NSString* str ) const {
+ return (str != nil || m_substr == nil ) &&
+ [str rangeOfString:m_substr].location != NSNotFound;
+ }
+
+ virtual std::string describe() const CATCH_OVERRIDE {
+ return "contains string: " + Catch::toString( m_substr );
+ }
+ };
+
+ struct StartsWith : StringHolder {
+ StartsWith( NSString* substr ) : StringHolder( substr ){}
+
+ virtual bool match( NSString* str ) const {
+ return (str != nil || m_substr == nil ) &&
+ [str rangeOfString:m_substr].location == 0;
+ }
+
+ virtual std::string describe() const CATCH_OVERRIDE {
+ return "starts with: " + Catch::toString( m_substr );
+ }
+ };
+ struct EndsWith : StringHolder {
+ EndsWith( NSString* substr ) : StringHolder( substr ){}
+
+ virtual bool match( NSString* str ) const {
+ return (str != nil || m_substr == nil ) &&
+ [str rangeOfString:m_substr].location == [str length] - [m_substr length];
+ }
+
+ virtual std::string describe() const CATCH_OVERRIDE {
+ return "ends with: " + Catch::toString( m_substr );
+ }
+ };
+
+ } // namespace NSStringMatchers
+ } // namespace Impl
+
+ inline Impl::NSStringMatchers::Equals
+ Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); }
+
+ inline Impl::NSStringMatchers::Contains
+ Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); }
+
+ inline Impl::NSStringMatchers::StartsWith
+ StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); }
+
+ inline Impl::NSStringMatchers::EndsWith
+ EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); }
+
+ } // namespace Matchers
+
+ using namespace Matchers;
+
+} // namespace Catch
+
+///////////////////////////////////////////////////////////////////////////////
+#define OC_TEST_CASE( name, desc )\
++(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \
+{\
+return @ name; \
+}\
++(NSString*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \
+{ \
+return @ desc; \
+} \
+-(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test )
+
+#endif
+
+#ifdef CATCH_IMPL
+
+// !TBD: Move the leak detector code into a separate header
+#ifdef CATCH_CONFIG_WINDOWS_CRTDBG
+#include <crtdbg.h>
+class LeakDetector {
+public:
+ LeakDetector() {
+ int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
+ flag |= _CRTDBG_LEAK_CHECK_DF;
+ flag |= _CRTDBG_ALLOC_MEM_DF;
+ _CrtSetDbgFlag(flag);
+ _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+ _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
+ // Change this to leaking allocation's number to break there
+ _CrtSetBreakAlloc(-1);
+ }
+};
+#else
+class LeakDetector {};
+#endif
+
+LeakDetector leakDetector;
+
+// #included from: internal/catch_impl.hpp
+#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED
+
+// Collect all the implementation files together here
+// These are the equivalent of what would usually be cpp files
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wweak-vtables"
+#endif
+
+// #included from: ../catch_session.hpp
+#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED
+
+// #included from: internal/catch_commandline.hpp
+#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED
+
+// #included from: catch_config.hpp
+#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED
+
+// #included from: catch_test_spec_parser.hpp
+#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+// #included from: catch_test_spec.hpp
+#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+// #included from: catch_wildcard_pattern.hpp
+#define TWOBLUECUBES_CATCH_WILDCARD_PATTERN_HPP_INCLUDED
+
+#include <stdexcept>
+
+namespace Catch
+{
+ class WildcardPattern {
+ enum WildcardPosition {
+ NoWildcard = 0,
+ WildcardAtStart = 1,
+ WildcardAtEnd = 2,
+ WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd
+ };
+
+ public:
+
+ WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity )
+ : m_caseSensitivity( caseSensitivity ),
+ m_wildcard( NoWildcard ),
+ m_pattern( adjustCase( pattern ) )
+ {
+ if( startsWith( m_pattern, '*' ) ) {
+ m_pattern = m_pattern.substr( 1 );
+ m_wildcard = WildcardAtStart;
+ }
+ if( endsWith( m_pattern, '*' ) ) {
+ m_pattern = m_pattern.substr( 0, m_pattern.size()-1 );
+ m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtEnd );
+ }
+ }
+ virtual ~WildcardPattern();
+ virtual bool matches( std::string const& str ) const {
+ switch( m_wildcard ) {
+ case NoWildcard:
+ return m_pattern == adjustCase( str );
+ case WildcardAtStart:
+ return endsWith( adjustCase( str ), m_pattern );
+ case WildcardAtEnd:
+ return startsWith( adjustCase( str ), m_pattern );
+ case WildcardAtBothEnds:
+ return contains( adjustCase( str ), m_pattern );
+ }
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunreachable-code"
+#endif
+ throw std::logic_error( "Unknown enum" );
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+ }
+ private:
+ std::string adjustCase( std::string const& str ) const {
+ return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str;
+ }
+ CaseSensitive::Choice m_caseSensitivity;
+ WildcardPosition m_wildcard;
+ std::string m_pattern;
+ };
+}
+
+#include <string>
+#include <vector>
+
+namespace Catch {
+
+ class TestSpec {
+ struct Pattern : SharedImpl<> {
+ virtual ~Pattern();
+ virtual bool matches( TestCaseInfo const& testCase ) const = 0;
+ };
+ class NamePattern : public Pattern {
+ public:
+ NamePattern( std::string const& name )
+ : m_wildcardPattern( toLower( name ), CaseSensitive::No )
+ {}
+ virtual ~NamePattern();
+ virtual bool matches( TestCaseInfo const& testCase ) const {
+ return m_wildcardPattern.matches( toLower( testCase.name ) );
+ }
+ private:
+ WildcardPattern m_wildcardPattern;
+ };
+
+ class TagPattern : public Pattern {
+ public:
+ TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {}
+ virtual ~TagPattern();
+ virtual bool matches( TestCaseInfo const& testCase ) const {
+ return testCase.lcaseTags.find( m_tag ) != testCase.lcaseTags.end();
+ }
+ private:
+ std::string m_tag;
+ };
+
+ class ExcludedPattern : public Pattern {
+ public:
+ ExcludedPattern( Ptr<Pattern> const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {}
+ virtual ~ExcludedPattern();
+ virtual bool matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); }
+ private:
+ Ptr<Pattern> m_underlyingPattern;
+ };
+
+ struct Filter {
+ std::vector<Ptr<Pattern> > m_patterns;
+
+ bool matches( TestCaseInfo const& testCase ) const {
+ // All patterns in a filter must match for the filter to be a match
+ for( std::vector<Ptr<Pattern> >::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it ) {
+ if( !(*it)->matches( testCase ) )
+ return false;
+ }
+ return true;
+ }
+ };
+
+ public:
+ bool hasFilters() const {
+ return !m_filters.empty();
+ }
+ bool matches( TestCaseInfo const& testCase ) const {
+ // A TestSpec matches if any filter matches
+ for( std::vector<Filter>::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it )
+ if( it->matches( testCase ) )
+ return true;
+ return false;
+ }
+
+ private:
+ std::vector<Filter> m_filters;
+
+ friend class TestSpecParser;
+ };
+}
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+namespace Catch {
+
+ class TestSpecParser {
+ enum Mode{ None, Name, QuotedName, Tag, EscapedName };
+ Mode m_mode;
+ bool m_exclusion;
+ std::size_t m_start, m_pos;
+ std::string m_arg;
+ std::vector<std::size_t> m_escapeChars;
+ TestSpec::Filter m_currentFilter;
+ TestSpec m_testSpec;
+ ITagAliasRegistry const* m_tagAliases;
+
+ public:
+ TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {}
+
+ TestSpecParser& parse( std::string const& arg ) {
+ m_mode = None;
+ m_exclusion = false;
+ m_start = std::string::npos;
+ m_arg = m_tagAliases->expandAliases( arg );
+ m_escapeChars.clear();
+ for( m_pos = 0; m_pos < m_arg.size(); ++m_pos )
+ visitChar( m_arg[m_pos] );
+ if( m_mode == Name )
+ addPattern<TestSpec::NamePattern>();
+ return *this;
+ }
+ TestSpec testSpec() {
+ addFilter();
+ return m_testSpec;
+ }
+ private:
+ void visitChar( char c ) {
+ if( m_mode == None ) {
+ switch( c ) {
+ case ' ': return;
+ case '~': m_exclusion = true; return;
+ case '[': return startNewMode( Tag, ++m_pos );
+ case '"': return startNewMode( QuotedName, ++m_pos );
+ case '\\': return escape();
+ default: startNewMode( Name, m_pos ); break;
+ }
+ }
+ if( m_mode == Name ) {
+ if( c == ',' ) {
+ addPattern<TestSpec::NamePattern>();
+ addFilter();
+ }
+ else if( c == '[' ) {
+ if( subString() == "exclude:" )
+ m_exclusion = true;
+ else
+ addPattern<TestSpec::NamePattern>();
+ startNewMode( Tag, ++m_pos );
+ }
+ else if( c == '\\' )
+ escape();
+ }
+ else if( m_mode == EscapedName )
+ m_mode = Name;
+ else if( m_mode == QuotedName && c == '"' )
+ addPattern<TestSpec::NamePattern>();
+ else if( m_mode == Tag && c == ']' )
+ addPattern<TestSpec::TagPattern>();
+ }
+ void startNewMode( Mode mode, std::size_t start ) {
+ m_mode = mode;
+ m_start = start;
+ }
+ void escape() {
+ if( m_mode == None )
+ m_start = m_pos;
+ m_mode = EscapedName;
+ m_escapeChars.push_back( m_pos );
+ }
+ std::string subString() const { return m_arg.substr( m_start, m_pos - m_start ); }
+ template<typename T>
+ void addPattern() {
+ std::string token = subString();
+ for( size_t i = 0; i < m_escapeChars.size(); ++i )
+ token = token.substr( 0, m_escapeChars[i]-m_start-i ) + token.substr( m_escapeChars[i]-m_start-i+1 );
+ m_escapeChars.clear();
+ if( startsWith( token, "exclude:" ) ) {
+ m_exclusion = true;
+ token = token.substr( 8 );
+ }
+ if( !token.empty() ) {
+ Ptr<TestSpec::Pattern> pattern = new T( token );
+ if( m_exclusion )
+ pattern = new TestSpec::ExcludedPattern( pattern );
+ m_currentFilter.m_patterns.push_back( pattern );
+ }
+ m_exclusion = false;
+ m_mode = None;
+ }
+ void addFilter() {
+ if( !m_currentFilter.m_patterns.empty() ) {
+ m_testSpec.m_filters.push_back( m_currentFilter );
+ m_currentFilter = TestSpec::Filter();
+ }
+ }
+ };
+ inline TestSpec parseTestSpec( std::string const& arg ) {
+ return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec();
+ }
+
+} // namespace Catch
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+// #included from: catch_interfaces_config.h
+#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED
+
+#include <iosfwd>
+#include <string>
+#include <vector>
+
+namespace Catch {
+
+ struct Verbosity { enum Level {
+ NoOutput = 0,
+ Quiet,
+ Normal
+ }; };
+
+ struct WarnAbout { enum What {
+ Nothing = 0x00,
+ NoAssertions = 0x01
+ }; };
+
+ struct ShowDurations { enum OrNot {
+ DefaultForReporter,
+ Always,
+ Never
+ }; };
+ struct RunTests { enum InWhatOrder {
+ InDeclarationOrder,
+ InLexicographicalOrder,
+ InRandomOrder
+ }; };
+ struct UseColour { enum YesOrNo {
+ Auto,
+ Yes,
+ No
+ }; };
+
+ class TestSpec;
+
+ struct IConfig : IShared {
+
+ virtual ~IConfig();
+
+ virtual bool allowThrows() const = 0;
+ virtual std::ostream& stream() const = 0;
+ virtual std::string name() const = 0;
+ virtual bool includeSuccessfulResults() const = 0;
+ virtual bool shouldDebugBreak() const = 0;
+ virtual bool warnAboutMissingAssertions() const = 0;
+ virtual int abortAfter() const = 0;
+ virtual bool showInvisibles() const = 0;
+ virtual ShowDurations::OrNot showDurations() const = 0;
+ virtual TestSpec const& testSpec() const = 0;
+ virtual RunTests::InWhatOrder runOrder() const = 0;
+ virtual unsigned int rngSeed() const = 0;
+ virtual UseColour::YesOrNo useColour() const = 0;
+ virtual std::vector<std::string> const& getSectionsToRun() const = 0;
+
+ };
+}
+
+// #included from: catch_stream.h
+#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED
+
+// #included from: catch_streambuf.h
+#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED
+
+#include <streambuf>
+
+namespace Catch {
+
+ class StreamBufBase : public std::streambuf {
+ public:
+ virtual ~StreamBufBase() CATCH_NOEXCEPT;
+ };
+}
+
+#include <streambuf>
+#include <ostream>
+#include <fstream>
+#include <memory>
+
+namespace Catch {
+
+ std::ostream& cout();
+ std::ostream& cerr();
+
+ struct IStream {
+ virtual ~IStream() CATCH_NOEXCEPT;
+ virtual std::ostream& stream() const = 0;
+ };
+
+ class FileStream : public IStream {
+ mutable std::ofstream m_ofs;
+ public:
+ FileStream( std::string const& filename );
+ virtual ~FileStream() CATCH_NOEXCEPT;
+ public: // IStream
+ virtual std::ostream& stream() const CATCH_OVERRIDE;
+ };
+
+ class CoutStream : public IStream {
+ mutable std::ostream m_os;
+ public:
+ CoutStream();
+ virtual ~CoutStream() CATCH_NOEXCEPT;
+
+ public: // IStream
+ virtual std::ostream& stream() const CATCH_OVERRIDE;
+ };
+
+ class DebugOutStream : public IStream {
+ CATCH_AUTO_PTR( StreamBufBase ) m_streamBuf;
+ mutable std::ostream m_os;
+ public:
+ DebugOutStream();
+ virtual ~DebugOutStream() CATCH_NOEXCEPT;
+
+ public: // IStream
+ virtual std::ostream& stream() const CATCH_OVERRIDE;
+ };
+}
+
+#include <memory>
+#include <vector>
+#include <string>
+#include <stdexcept>
+
+#ifndef CATCH_CONFIG_CONSOLE_WIDTH
+#define CATCH_CONFIG_CONSOLE_WIDTH 80
+#endif
+
+namespace Catch {
+
+ struct ConfigData {
+
+ ConfigData()
+ : listTests( false ),
+ listTags( false ),
+ listReporters( false ),
+ listTestNamesOnly( false ),
+ listExtraInfo( false ),
+ showSuccessfulTests( false ),
+ shouldDebugBreak( false ),
+ noThrow( false ),
+ showHelp( false ),
+ showInvisibles( false ),
+ filenamesAsTags( false ),
+ abortAfter( -1 ),
+ rngSeed( 0 ),
+ verbosity( Verbosity::Normal ),
+ warnings( WarnAbout::Nothing ),
+ showDurations( ShowDurations::DefaultForReporter ),
+ runOrder( RunTests::InDeclarationOrder ),
+ useColour( UseColour::Auto )
+ {}
+
+ bool listTests;
+ bool listTags;
+ bool listReporters;
+ bool listTestNamesOnly;
+ bool listExtraInfo;
+
+ bool showSuccessfulTests;
+ bool shouldDebugBreak;
+ bool noThrow;
+ bool showHelp;
+ bool showInvisibles;
+ bool filenamesAsTags;
+
+ int abortAfter;
+ unsigned int rngSeed;
+
+ Verbosity::Level verbosity;
+ WarnAbout::What warnings;
+ ShowDurations::OrNot showDurations;
+ RunTests::InWhatOrder runOrder;
+ UseColour::YesOrNo useColour;
+
+ std::string outputFilename;
+ std::string name;
+ std::string processName;
+
+ std::vector<std::string> reporterNames;
+ std::vector<std::string> testsOrTags;
+ std::vector<std::string> sectionsToRun;
+ };
+
+ class Config : public SharedImpl<IConfig> {
+ private:
+ Config( Config const& other );
+ Config& operator = ( Config const& other );
+ virtual void dummy();
+ public:
+
+ Config()
+ {}
+
+ Config( ConfigData const& data )
+ : m_data( data ),
+ m_stream( openStream() )
+ {
+ if( !data.testsOrTags.empty() ) {
+ TestSpecParser parser( ITagAliasRegistry::get() );
+ for( std::size_t i = 0; i < data.testsOrTags.size(); ++i )
+ parser.parse( data.testsOrTags[i] );
+ m_testSpec = parser.testSpec();
+ }
+ }
+
+ virtual ~Config() {}
+
+ std::string const& getFilename() const {
+ return m_data.outputFilename ;
+ }
+
+ bool listTests() const { return m_data.listTests; }
+ bool listTestNamesOnly() const { return m_data.listTestNamesOnly; }
+ bool listTags() const { return m_data.listTags; }
+ bool listReporters() const { return m_data.listReporters; }
+ bool listExtraInfo() const { return m_data.listExtraInfo; }
+
+ std::string getProcessName() const { return m_data.processName; }
+
+ std::vector<std::string> const& getReporterNames() const { return m_data.reporterNames; }
+ std::vector<std::string> const& getSectionsToRun() const CATCH_OVERRIDE { return m_data.sectionsToRun; }
+
+ virtual TestSpec const& testSpec() const CATCH_OVERRIDE { return m_testSpec; }
+
+ bool showHelp() const { return m_data.showHelp; }
+
+ // IConfig interface
+ virtual bool allowThrows() const CATCH_OVERRIDE { return !m_data.noThrow; }
+ virtual std::ostream& stream() const CATCH_OVERRIDE { return m_stream->stream(); }
+ virtual std::string name() const CATCH_OVERRIDE { return m_data.name.empty() ? m_data.processName : m_data.name; }
+ virtual bool includeSuccessfulResults() const CATCH_OVERRIDE { return m_data.showSuccessfulTests; }
+ virtual bool warnAboutMissingAssertions() const CATCH_OVERRIDE { return m_data.warnings & WarnAbout::NoAssertions; }
+ virtual ShowDurations::OrNot showDurations() const CATCH_OVERRIDE { return m_data.showDurations; }
+ virtual RunTests::InWhatOrder runOrder() const CATCH_OVERRIDE { return m_data.runOrder; }
+ virtual unsigned int rngSeed() const CATCH_OVERRIDE { return m_data.rngSeed; }
+ virtual UseColour::YesOrNo useColour() const CATCH_OVERRIDE { return m_data.useColour; }
+ virtual bool shouldDebugBreak() const CATCH_OVERRIDE { return m_data.shouldDebugBreak; }
+ virtual int abortAfter() const CATCH_OVERRIDE { return m_data.abortAfter; }
+ virtual bool showInvisibles() const CATCH_OVERRIDE { return m_data.showInvisibles; }
+
+ private:
+
+ IStream const* openStream() {
+ if( m_data.outputFilename.empty() )
+ return new CoutStream();
+ else if( m_data.outputFilename[0] == '%' ) {
+ if( m_data.outputFilename == "%debug" )
+ return new DebugOutStream();
+ else
+ throw std::domain_error( "Unrecognised stream: " + m_data.outputFilename );
+ }
+ else
+ return new FileStream( m_data.outputFilename );
+ }
+ ConfigData m_data;
+
+ CATCH_AUTO_PTR( IStream const ) m_stream;
+ TestSpec m_testSpec;
+ };
+
+} // end namespace Catch
+
+// #included from: catch_clara.h
+#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED
+
+// Use Catch's value for console width (store Clara's off to the side, if present)
+#ifdef CLARA_CONFIG_CONSOLE_WIDTH
+#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH
+#undef CLARA_CONFIG_CONSOLE_WIDTH
+#endif
+#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH
+
+// Declare Clara inside the Catch namespace
+#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch {
+// #included from: ../external/clara.h
+
+// Version 0.0.2.4
+
+// Only use header guard if we are not using an outer namespace
+#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE)
+
+#ifndef STITCH_CLARA_OPEN_NAMESPACE
+#define TWOBLUECUBES_CLARA_H_INCLUDED
+#define STITCH_CLARA_OPEN_NAMESPACE
+#define STITCH_CLARA_CLOSE_NAMESPACE
+#else
+#define STITCH_CLARA_CLOSE_NAMESPACE }
+#endif
+
+#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE
+
+// ----------- #included from tbc_text_format.h -----------
+
+// Only use header guard if we are not using an outer namespace
+#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE)
+#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+#define TBC_TEXT_FORMAT_H_INCLUDED
+#endif
+
+#include <string>
+#include <vector>
+#include <sstream>
+#include <algorithm>
+#include <cctype>
+
+// Use optional outer namespace
+#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE {
+#endif
+
+namespace Tbc {
+
+#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH
+ const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH;
+#else
+ const unsigned int consoleWidth = 80;
+#endif
+
+ struct TextAttributes {
+ TextAttributes()
+ : initialIndent( std::string::npos ),
+ indent( 0 ),
+ width( consoleWidth-1 ),
+ tabChar( '\t' )
+ {}
+
+ TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; }
+ TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; }
+ TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; }
+ TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; }
+
+ std::size_t initialIndent; // indent of first line, or npos
+ std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos
+ std::size_t width; // maximum width of text, including indent. Longer text will wrap
+ char tabChar; // If this char is seen the indent is changed to current pos
+ };
+
+ class Text {
+ public:
+ Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() )
+ : attr( _attr )
+ {
+ std::string wrappableChars = " [({.,/|\\-";
+ std::size_t indent = _attr.initialIndent != std::string::npos
+ ? _attr.initialIndent
+ : _attr.indent;
+ std::string remainder = _str;
+
+ while( !remainder.empty() ) {
+ if( lines.size() >= 1000 ) {
+ lines.push_back( "... message truncated due to excessive size" );
+ return;
+ }
+ std::size_t tabPos = std::string::npos;
+ std::size_t width = (std::min)( remainder.size(), _attr.width - indent );
+ std::size_t pos = remainder.find_first_of( '\n' );
+ if( pos <= width ) {
+ width = pos;
+ }
+ pos = remainder.find_last_of( _attr.tabChar, width );
+ if( pos != std::string::npos ) {
+ tabPos = pos;
+ if( remainder[width] == '\n' )
+ width--;
+ remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 );
+ }
+
+ if( width == remainder.size() ) {
+ spliceLine( indent, remainder, width );
+ }
+ else if( remainder[width] == '\n' ) {
+ spliceLine( indent, remainder, width );
+ if( width <= 1 || remainder.size() != 1 )
+ remainder = remainder.substr( 1 );
+ indent = _attr.indent;
+ }
+ else {
+ pos = remainder.find_last_of( wrappableChars, width );
+ if( pos != std::string::npos && pos > 0 ) {
+ spliceLine( indent, remainder, pos );
+ if( remainder[0] == ' ' )
+ remainder = remainder.substr( 1 );
+ }
+ else {
+ spliceLine( indent, remainder, width-1 );
+ lines.back() += "-";
+ }
+ if( lines.size() == 1 )
+ indent = _attr.indent;
+ if( tabPos != std::string::npos )
+ indent += tabPos;
+ }
+ }
+ }
+
+ void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) {
+ lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) );
+ _remainder = _remainder.substr( _pos );
+ }
+
+ typedef std::vector<std::string>::const_iterator const_iterator;
+
+ const_iterator begin() const { return lines.begin(); }
+ const_iterator end() const { return lines.end(); }
+ std::string const& last() const { return lines.back(); }
+ std::size_t size() const { return lines.size(); }
+ std::string const& operator[]( std::size_t _index ) const { return lines[_index]; }
+ std::string toString() const {
+ std::ostringstream oss;
+ oss << *this;
+ return oss.str();
+ }
+
+ inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) {
+ for( Text::const_iterator it = _text.begin(), itEnd = _text.end();
+ it != itEnd; ++it ) {
+ if( it != _text.begin() )
+ _stream << "\n";
+ _stream << *it;
+ }
+ return _stream;
+ }
+
+ private:
+ std::string str;
+ TextAttributes attr;
+ std::vector<std::string> lines;
+ };
+
+} // end namespace Tbc
+
+#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+} // end outer namespace
+#endif
+
+#endif // TBC_TEXT_FORMAT_H_INCLUDED
+
+// ----------- end of #include from tbc_text_format.h -----------
+// ........... back in clara.h
+
+#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE
+
+// ----------- #included from clara_compilers.h -----------
+
+#ifndef TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED
+#define TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED
+
+// Detect a number of compiler features - mostly C++11/14 conformance - by compiler
+// The following features are defined:
+//
+// CLARA_CONFIG_CPP11_NULLPTR : is nullptr supported?
+// CLARA_CONFIG_CPP11_NOEXCEPT : is noexcept supported?
+// CLARA_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods
+// CLARA_CONFIG_CPP11_OVERRIDE : is override supported?
+// CLARA_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr)
+
+// CLARA_CONFIG_CPP11_OR_GREATER : Is C++11 supported?
+
+// CLARA_CONFIG_VARIADIC_MACROS : are variadic macros supported?
+
+// In general each macro has a _NO_<feature name> form
+// (e.g. CLARA_CONFIG_CPP11_NO_NULLPTR) which disables the feature.
+// Many features, at point of detection, define an _INTERNAL_ macro, so they
+// can be combined, en-mass, with the _NO_ forms later.
+
+// All the C++11 features can be disabled with CLARA_CONFIG_NO_CPP11
+
+#ifdef __clang__
+
+#if __has_feature(cxx_nullptr)
+#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR
+#endif
+
+#if __has_feature(cxx_noexcept)
+#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT
+#endif
+
+#endif // __clang__
+
+////////////////////////////////////////////////////////////////////////////////
+// GCC
+#ifdef __GNUC__
+
+#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__)
+#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR
+#endif
+
+// - otherwise more recent versions define __cplusplus >= 201103L
+// and will get picked up below
+
+#endif // __GNUC__
+
+////////////////////////////////////////////////////////////////////////////////
+// Visual C++
+#ifdef _MSC_VER
+
+#if (_MSC_VER >= 1600)
+#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR
+#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR
+#endif
+
+#if (_MSC_VER >= 1900 ) // (VC++ 13 (VS2015))
+#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT
+#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
+#endif
+
+#endif // _MSC_VER
+
+////////////////////////////////////////////////////////////////////////////////
+// C++ language feature support
+
+// catch all support for C++11
+#if defined(__cplusplus) && __cplusplus >= 201103L
+
+#define CLARA_CPP11_OR_GREATER
+
+#if !defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR)
+#define CLARA_INTERNAL_CONFIG_CPP11_NULLPTR
+#endif
+
+#ifndef CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT
+#define CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT
+#endif
+
+#ifndef CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
+#define CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
+#endif
+
+#if !defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE)
+#define CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE
+#endif
+#if !defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR)
+#define CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR
+#endif
+
+#endif // __cplusplus >= 201103L
+
+// Now set the actual defines based on the above + anything the user has configured
+#if defined(CLARA_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NO_NULLPTR) && !defined(CLARA_CONFIG_CPP11_NULLPTR) && !defined(CLARA_CONFIG_NO_CPP11)
+#define CLARA_CONFIG_CPP11_NULLPTR
+#endif
+#if defined(CLARA_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_CONFIG_NO_CPP11)
+#define CLARA_CONFIG_CPP11_NOEXCEPT
+#endif
+#if defined(CLARA_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CLARA_CONFIG_CPP11_GENERATED_METHODS) && !defined(CLARA_CONFIG_NO_CPP11)
+#define CLARA_CONFIG_CPP11_GENERATED_METHODS
+#endif
+#if defined(CLARA_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_OVERRIDE) && !defined(CLARA_CONFIG_CPP11_OVERRIDE) && !defined(CLARA_CONFIG_NO_CPP11)
+#define CLARA_CONFIG_CPP11_OVERRIDE
+#endif
+#if defined(CLARA_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_UNIQUE_PTR) && !defined(CLARA_CONFIG_CPP11_UNIQUE_PTR) && !defined(CLARA_CONFIG_NO_CPP11)
+#define CLARA_CONFIG_CPP11_UNIQUE_PTR
+#endif
+
+// noexcept support:
+#if defined(CLARA_CONFIG_CPP11_NOEXCEPT) && !defined(CLARA_NOEXCEPT)
+#define CLARA_NOEXCEPT noexcept
+# define CLARA_NOEXCEPT_IS(x) noexcept(x)
+#else
+#define CLARA_NOEXCEPT throw()
+# define CLARA_NOEXCEPT_IS(x)
+#endif
+
+// nullptr support
+#ifdef CLARA_CONFIG_CPP11_NULLPTR
+#define CLARA_NULL nullptr
+#else
+#define CLARA_NULL NULL
+#endif
+
+// override support
+#ifdef CLARA_CONFIG_CPP11_OVERRIDE
+#define CLARA_OVERRIDE override
+#else
+#define CLARA_OVERRIDE
+#endif
+
+// unique_ptr support
+#ifdef CLARA_CONFIG_CPP11_UNIQUE_PTR
+# define CLARA_AUTO_PTR( T ) std::unique_ptr<T>
+#else
+# define CLARA_AUTO_PTR( T ) std::auto_ptr<T>
+#endif
+
+#endif // TWOBLUECUBES_CLARA_COMPILERS_H_INCLUDED
+
+// ----------- end of #include from clara_compilers.h -----------
+// ........... back in clara.h
+
+#include <map>
+#include <stdexcept>
+#include <memory>
+
+#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER)
+#define CLARA_PLATFORM_WINDOWS
+#endif
+
+// Use optional outer namespace
+#ifdef STITCH_CLARA_OPEN_NAMESPACE
+STITCH_CLARA_OPEN_NAMESPACE
+#endif
+
+namespace Clara {
+
+ struct UnpositionalTag {};
+
+ extern UnpositionalTag _;
+
+#ifdef CLARA_CONFIG_MAIN
+ UnpositionalTag _;
+#endif
+
+ namespace Detail {
+
+#ifdef CLARA_CONSOLE_WIDTH
+ const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH;
+#else
+ const unsigned int consoleWidth = 80;
+#endif
+
+ using namespace Tbc;
+
+ inline bool startsWith( std::string const& str, std::string const& prefix ) {
+ return str.size() >= prefix.size() && str.substr( 0, prefix.size() ) == prefix;
+ }
+
+ template<typename T> struct RemoveConstRef{ typedef T type; };
+ template<typename T> struct RemoveConstRef<T&>{ typedef T type; };
+ template<typename T> struct RemoveConstRef<T const&>{ typedef T type; };
+ template<typename T> struct RemoveConstRef<T const>{ typedef T type; };
+
+ template<typename T> struct IsBool { static const bool value = false; };
+ template<> struct IsBool<bool> { static const bool value = true; };
+
+ template<typename T>
+ void convertInto( std::string const& _source, T& _dest ) {
+ std::stringstream ss;
+ ss << _source;
+ ss >> _dest;
+ if( ss.fail() )
+ throw std::runtime_error( "Unable to convert " + _source + " to destination type" );
+ }
+ inline void convertInto( std::string const& _source, std::string& _dest ) {
+ _dest = _source;
+ }
+ char toLowerCh(char c) {
+ return static_cast<char>( std::tolower( c ) );
+ }
+ inline void convertInto( std::string const& _source, bool& _dest ) {
+ std::string sourceLC = _source;
+ std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), toLowerCh );
+ if( sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" )
+ _dest = true;
+ else if( sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" )
+ _dest = false;
+ else
+ throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" );
+ }
+
+ template<typename ConfigT>
+ struct IArgFunction {
+ virtual ~IArgFunction() {}
+#ifdef CLARA_CONFIG_CPP11_GENERATED_METHODS
+ IArgFunction() = default;
+ IArgFunction( IArgFunction const& ) = default;
+#endif
+ virtual void set( ConfigT& config, std::string const& value ) const = 0;
+ virtual bool takesArg() const = 0;
+ virtual IArgFunction* clone() const = 0;
+ };
+
+ template<typename ConfigT>
+ class BoundArgFunction {
+ public:
+ BoundArgFunction() : functionObj( CLARA_NULL ) {}
+ BoundArgFunction( IArgFunction<ConfigT>* _functionObj ) : functionObj( _functionObj ) {}
+ BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj ? other.functionObj->clone() : CLARA_NULL ) {}
+ BoundArgFunction& operator = ( BoundArgFunction const& other ) {
+ IArgFunction<ConfigT>* newFunctionObj = other.functionObj ? other.functionObj->clone() : CLARA_NULL;
+ delete functionObj;
+ functionObj = newFunctionObj;
+ return *this;
+ }
+ ~BoundArgFunction() { delete functionObj; }
+
+ void set( ConfigT& config, std::string const& value ) const {
+ functionObj->set( config, value );
+ }
+ bool takesArg() const { return functionObj->takesArg(); }
+
+ bool isSet() const {
+ return functionObj != CLARA_NULL;
+ }
+ private:
+ IArgFunction<ConfigT>* functionObj;
+ };
+
+ template<typename C>
+ struct NullBinder : IArgFunction<C>{
+ virtual void set( C&, std::string const& ) const {}
+ virtual bool takesArg() const { return true; }
+ virtual IArgFunction<C>* clone() const { return new NullBinder( *this ); }
+ };
+
+ template<typename C, typename M>
+ struct BoundDataMember : IArgFunction<C>{
+ BoundDataMember( M C::* _member ) : member( _member ) {}
+ virtual void set( C& p, std::string const& stringValue ) const {
+ convertInto( stringValue, p.*member );
+ }
+ virtual bool takesArg() const { return !IsBool<M>::value; }
+ virtual IArgFunction<C>* clone() const { return new BoundDataMember( *this ); }
+ M C::* member;
+ };
+ template<typename C, typename M>
+ struct BoundUnaryMethod : IArgFunction<C>{
+ BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {}
+ virtual void set( C& p, std::string const& stringValue ) const {
+ typename RemoveConstRef<M>::type value;
+ convertInto( stringValue, value );
+ (p.*member)( value );
+ }
+ virtual bool takesArg() const { return !IsBool<M>::value; }
+ virtual IArgFunction<C>* clone() const { return new BoundUnaryMethod( *this ); }
+ void (C::*member)( M );
+ };
+ template<typename C>
+ struct BoundNullaryMethod : IArgFunction<C>{
+ BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {}
+ virtual void set( C& p, std::string const& stringValue ) const {
+ bool value;
+ convertInto( stringValue, value );
+ if( value )
+ (p.*member)();
+ }
+ virtual bool takesArg() const { return false; }
+ virtual IArgFunction<C>* clone() const { return new BoundNullaryMethod( *this ); }
+ void (C::*member)();
+ };
+
+ template<typename C>
+ struct BoundUnaryFunction : IArgFunction<C>{
+ BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {}
+ virtual void set( C& obj, std::string const& stringValue ) const {
+ bool value;
+ convertInto( stringValue, value );
+ if( value )
+ function( obj );
+ }
+ virtual bool takesArg() const { return false; }
+ virtual IArgFunction<C>* clone() const { return new BoundUnaryFunction( *this ); }
+ void (*function)( C& );
+ };
+
+ template<typename C, typename T>
+ struct BoundBinaryFunction : IArgFunction<C>{
+ BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {}
+ virtual void set( C& obj, std::string const& stringValue ) const {
+ typename RemoveConstRef<T>::type value;
+ convertInto( stringValue, value );
+ function( obj, value );
+ }
+ virtual bool takesArg() const { return !IsBool<T>::value; }
+ virtual IArgFunction<C>* clone() const { return new BoundBinaryFunction( *this ); }
+ void (*function)( C&, T );
+ };
+
+ } // namespace Detail
+
+ inline std::vector<std::string> argsToVector( int argc, char const* const* const argv ) {
+ std::vector<std::string> args( static_cast<std::size_t>( argc ) );
+ for( std::size_t i = 0; i < static_cast<std::size_t>( argc ); ++i )
+ args[i] = argv[i];
+
+ return args;
+ }
+
+ class Parser {
+ enum Mode { None, MaybeShortOpt, SlashOpt, ShortOpt, LongOpt, Positional };
+ Mode mode;
+ std::size_t from;
+ bool inQuotes;
+ public:
+
+ struct Token {
+ enum Type { Positional, ShortOpt, LongOpt };
+ Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {}
+ Type type;
+ std::string data;
+ };
+
+ Parser() : mode( None ), from( 0 ), inQuotes( false ){}
+
+ void parseIntoTokens( std::vector<std::string> const& args, std::vector<Token>& tokens ) {
+ const std::string doubleDash = "--";
+ for( std::size_t i = 1; i < args.size() && args[i] != doubleDash; ++i )
+ parseIntoTokens( args[i], tokens);
+ }
+
+ void parseIntoTokens( std::string const& arg, std::vector<Token>& tokens ) {
+ for( std::size_t i = 0; i < arg.size(); ++i ) {
+ char c = arg[i];
+ if( c == '"' )
+ inQuotes = !inQuotes;
+ mode = handleMode( i, c, arg, tokens );
+ }
+ mode = handleMode( arg.size(), '\0', arg, tokens );
+ }
+ Mode handleMode( std::size_t i, char c, std::string const& arg, std::vector<Token>& tokens ) {
+ switch( mode ) {
+ case None: return handleNone( i, c );
+ case MaybeShortOpt: return handleMaybeShortOpt( i, c );
+ case ShortOpt:
+ case LongOpt:
+ case SlashOpt: return handleOpt( i, c, arg, tokens );
+ case Positional: return handlePositional( i, c, arg, tokens );
+ default: throw std::logic_error( "Unknown mode" );
+ }
+ }
+
+ Mode handleNone( std::size_t i, char c ) {
+ if( inQuotes ) {
+ from = i;
+ return Positional;
+ }
+ switch( c ) {
+ case '-': return MaybeShortOpt;
+#ifdef CLARA_PLATFORM_WINDOWS
+ case '/': from = i+1; return SlashOpt;
+#endif
+ default: from = i; return Positional;
+ }
+ }
+ Mode handleMaybeShortOpt( std::size_t i, char c ) {
+ switch( c ) {
+ case '-': from = i+1; return LongOpt;
+ default: from = i; return ShortOpt;
+ }
+ }
+
+ Mode handleOpt( std::size_t i, char c, std::string const& arg, std::vector<Token>& tokens ) {
+ if( std::string( ":=\0", 3 ).find( c ) == std::string::npos )
+ return mode;
+
+ std::string optName = arg.substr( from, i-from );
+ if( mode == ShortOpt )
+ for( std::size_t j = 0; j < optName.size(); ++j )
+ tokens.push_back( Token( Token::ShortOpt, optName.substr( j, 1 ) ) );
+ else if( mode == SlashOpt && optName.size() == 1 )
+ tokens.push_back( Token( Token::ShortOpt, optName ) );
+ else
+ tokens.push_back( Token( Token::LongOpt, optName ) );
+ return None;
+ }
+ Mode handlePositional( std::size_t i, char c, std::string const& arg, std::vector<Token>& tokens ) {
+ if( inQuotes || std::string( "\0", 1 ).find( c ) == std::string::npos )
+ return mode;
+
+ std::string data = arg.substr( from, i-from );
+ tokens.push_back( Token( Token::Positional, data ) );
+ return None;
+ }
+ };
+
+ template<typename ConfigT>
+ struct CommonArgProperties {
+ CommonArgProperties() {}
+ CommonArgProperties( Detail::BoundArgFunction<ConfigT> const& _boundField ) : boundField( _boundField ) {}
+
+ Detail::BoundArgFunction<ConfigT> boundField;
+ std::string description;
+ std::string detail;
+ std::string placeholder; // Only value if boundField takes an arg
+
+ bool takesArg() const {
+ return !placeholder.empty();
+ }
+ void validate() const {
+ if( !boundField.isSet() )
+ throw std::logic_error( "option not bound" );
+ }
+ };
+ struct OptionArgProperties {
+ std::vector<std::string> shortNames;
+ std::string longName;
+
+ bool hasShortName( std::string const& shortName ) const {
+ return std::find( shortNames.begin(), shortNames.end(), shortName ) != shortNames.end();
+ }
+ bool hasLongName( std::string const& _longName ) const {
+ return _longName == longName;
+ }
+ };
+ struct PositionalArgProperties {
+ PositionalArgProperties() : position( -1 ) {}
+ int position; // -1 means non-positional (floating)
+
+ bool isFixedPositional() const {
+ return position != -1;
+ }
+ };
+
+ template<typename ConfigT>
+ class CommandLine {
+
+ struct Arg : CommonArgProperties<ConfigT>, OptionArgProperties, PositionalArgProperties {
+ Arg() {}
+ Arg( Detail::BoundArgFunction<ConfigT> const& _boundField ) : CommonArgProperties<ConfigT>( _boundField ) {}
+
+ using CommonArgProperties<ConfigT>::placeholder; // !TBD
+
+ std::string dbgName() const {
+ if( !longName.empty() )
+ return "--" + longName;
+ if( !shortNames.empty() )
+ return "-" + shortNames[0];
+ return "positional args";
+ }
+ std::string commands() const {
+ std::ostringstream oss;
+ bool first = true;
+ std::vector<std::string>::const_iterator it = shortNames.begin(), itEnd = shortNames.end();
+ for(; it != itEnd; ++it ) {
+ if( first )
+ first = false;
+ else
+ oss << ", ";
+ oss << "-" << *it;
+ }
+ if( !longName.empty() ) {
+ if( !first )
+ oss << ", ";
+ oss << "--" << longName;
+ }
+ if( !placeholder.empty() )
+ oss << " <" << placeholder << ">";
+ return oss.str();
+ }
+ };
+
+ typedef CLARA_AUTO_PTR( Arg ) ArgAutoPtr;
+
+ friend void addOptName( Arg& arg, std::string const& optName )
+ {
+ if( optName.empty() )
+ return;
+ if( Detail::startsWith( optName, "--" ) ) {
+ if( !arg.longName.empty() )
+ throw std::logic_error( "Only one long opt may be specified. '"
+ + arg.longName
+ + "' already specified, now attempting to add '"
+ + optName + "'" );
+ arg.longName = optName.substr( 2 );
+ }
+ else if( Detail::startsWith( optName, "-" ) )
+ arg.shortNames.push_back( optName.substr( 1 ) );
+ else
+ throw std::logic_error( "option must begin with - or --. Option was: '" + optName + "'" );
+ }
+ friend void setPositionalArg( Arg& arg, int position )
+ {
+ arg.position = position;
+ }
+
+ class ArgBuilder {
+ public:
+ ArgBuilder( Arg* arg ) : m_arg( arg ) {}
+
+ // Bind a non-boolean data member (requires placeholder string)
+ template<typename C, typename M>
+ void bind( M C::* field, std::string const& placeholder ) {
+ m_arg->boundField = new Detail::BoundDataMember<C,M>( field );
+ m_arg->placeholder = placeholder;
+ }
+ // Bind a boolean data member (no placeholder required)
+ template<typename C>
+ void bind( bool C::* field ) {
+ m_arg->boundField = new Detail::BoundDataMember<C,bool>( field );
+ }
+
+ // Bind a method taking a single, non-boolean argument (requires a placeholder string)
+ template<typename C, typename M>
+ void bind( void (C::* unaryMethod)( M ), std::string const& placeholder ) {
+ m_arg->boundField = new Detail::BoundUnaryMethod<C,M>( unaryMethod );
+ m_arg->placeholder = placeholder;
+ }
+
+ // Bind a method taking a single, boolean argument (no placeholder string required)
+ template<typename C>
+ void bind( void (C::* unaryMethod)( bool ) ) {
+ m_arg->boundField = new Detail::BoundUnaryMethod<C,bool>( unaryMethod );
+ }
+
+ // Bind a method that takes no arguments (will be called if opt is present)
+ template<typename C>
+ void bind( void (C::* nullaryMethod)() ) {
+ m_arg->boundField = new Detail::BoundNullaryMethod<C>( nullaryMethod );
+ }
+
+ // Bind a free function taking a single argument - the object to operate on (no placeholder string required)
+ template<typename C>
+ void bind( void (* unaryFunction)( C& ) ) {
+ m_arg->boundField = new Detail::BoundUnaryFunction<C>( unaryFunction );
+ }
+
+ // Bind a free function taking a single argument - the object to operate on (requires a placeholder string)
+ template<typename C, typename T>
+ void bind( void (* binaryFunction)( C&, T ), std::string const& placeholder ) {
+ m_arg->boundField = new Detail::BoundBinaryFunction<C, T>( binaryFunction );
+ m_arg->placeholder = placeholder;
+ }
+
+ ArgBuilder& describe( std::string const& description ) {
+ m_arg->description = description;
+ return *this;
+ }
+ ArgBuilder& detail( std::string const& detail ) {
+ m_arg->detail = detail;
+ return *this;
+ }
+
+ protected:
+ Arg* m_arg;
+ };
+
+ class OptBuilder : public ArgBuilder {
+ public:
+ OptBuilder( Arg* arg ) : ArgBuilder( arg ) {}
+ OptBuilder( OptBuilder& other ) : ArgBuilder( other ) {}
+
+ OptBuilder& operator[]( std::string const& optName ) {
+ addOptName( *ArgBuilder::m_arg, optName );
+ return *this;
+ }
+ };
+
+ public:
+
+ CommandLine()
+ : m_boundProcessName( new Detail::NullBinder<ConfigT>() ),
+ m_highestSpecifiedArgPosition( 0 ),
+ m_throwOnUnrecognisedTokens( false )
+ {}
+ CommandLine( CommandLine const& other )
+ : m_boundProcessName( other.m_boundProcessName ),
+ m_options ( other.m_options ),
+ m_positionalArgs( other.m_positionalArgs ),
+ m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition ),
+ m_throwOnUnrecognisedTokens( other.m_throwOnUnrecognisedTokens )
+ {
+ if( other.m_floatingArg.get() )
+ m_floatingArg.reset( new Arg( *other.m_floatingArg ) );
+ }
+
+ CommandLine& setThrowOnUnrecognisedTokens( bool shouldThrow = true ) {
+ m_throwOnUnrecognisedTokens = shouldThrow;
+ return *this;
+ }
+
+ OptBuilder operator[]( std::string const& optName ) {
+ m_options.push_back( Arg() );
+ addOptName( m_options.back(), optName );
+ OptBuilder builder( &m_options.back() );
+ return builder;
+ }
+
+ ArgBuilder operator[]( int position ) {
+ m_positionalArgs.insert( std::make_pair( position, Arg() ) );
+ if( position > m_highestSpecifiedArgPosition )
+ m_highestSpecifiedArgPosition = position;
+ setPositionalArg( m_positionalArgs[position], position );
+ ArgBuilder builder( &m_positionalArgs[position] );
+ return builder;
+ }
+
+ // Invoke this with the _ instance
+ ArgBuilder operator[]( UnpositionalTag ) {
+ if( m_floatingArg.get() )
+ throw std::logic_error( "Only one unpositional argument can be added" );
+ m_floatingArg.reset( new Arg() );
+ ArgBuilder builder( m_floatingArg.get() );
+ return builder;
+ }
+
+ template<typename C, typename M>
+ void bindProcessName( M C::* field ) {
+ m_boundProcessName = new Detail::BoundDataMember<C,M>( field );
+ }
+ template<typename C, typename M>
+ void bindProcessName( void (C::*_unaryMethod)( M ) ) {
+ m_boundProcessName = new Detail::BoundUnaryMethod<C,M>( _unaryMethod );
+ }
+
+ void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth ) const {
+ typename std::vector<Arg>::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it;
+ std::size_t maxWidth = 0;
+ for( it = itBegin; it != itEnd; ++it )
+ maxWidth = (std::max)( maxWidth, it->commands().size() );
+
+ for( it = itBegin; it != itEnd; ++it ) {
+ Detail::Text usage( it->commands(), Detail::TextAttributes()
+ .setWidth( maxWidth+indent )
+ .setIndent( indent ) );
+ Detail::Text desc( it->description, Detail::TextAttributes()
+ .setWidth( width - maxWidth - 3 ) );
+
+ for( std::size_t i = 0; i < (std::max)( usage.size(), desc.size() ); ++i ) {
+ std::string usageCol = i < usage.size() ? usage[i] : "";
+ os << usageCol;
+
+ if( i < desc.size() && !desc[i].empty() )
+ os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' )
+ << desc[i];
+ os << "\n";
+ }
+ }
+ }
+ std::string optUsage() const {
+ std::ostringstream oss;
+ optUsage( oss );
+ return oss.str();
+ }
+
+ void argSynopsis( std::ostream& os ) const {
+ for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) {
+ if( i > 1 )
+ os << " ";
+ typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( i );
+ if( it != m_positionalArgs.end() )
+ os << "<" << it->second.placeholder << ">";
+ else if( m_floatingArg.get() )
+ os << "<" << m_floatingArg->placeholder << ">";
+ else
+ throw std::logic_error( "non consecutive positional arguments with no floating args" );
+ }
+ // !TBD No indication of mandatory args
+ if( m_floatingArg.get() ) {
+ if( m_highestSpecifiedArgPosition > 1 )
+ os << " ";
+ os << "[<" << m_floatingArg->placeholder << "> ...]";
+ }
+ }
+ std::string argSynopsis() const {
+ std::ostringstream oss;
+ argSynopsis( oss );
+ return oss.str();
+ }
+
+ void usage( std::ostream& os, std::string const& procName ) const {
+ validate();
+ os << "usage:\n " << procName << " ";
+ argSynopsis( os );
+ if( !m_options.empty() ) {
+ os << " [options]\n\nwhere options are: \n";
+ optUsage( os, 2 );
+ }
+ os << "\n";
+ }
+ std::string usage( std::string const& procName ) const {
+ std::ostringstream oss;
+ usage( oss, procName );
+ return oss.str();
+ }
+
+ ConfigT parse( std::vector<std::string> const& args ) const {
+ ConfigT config;
+ parseInto( args, config );
+ return config;
+ }
+
+ std::vector<Parser::Token> parseInto( std::vector<std::string> const& args, ConfigT& config ) const {
+ std::string processName = args.empty() ? std::string() : args[0];
+ std::size_t lastSlash = processName.find_last_of( "/\\" );
+ if( lastSlash != std::string::npos )
+ processName = processName.substr( lastSlash+1 );
+ m_boundProcessName.set( config, processName );
+ std::vector<Parser::Token> tokens;
+ Parser parser;
+ parser.parseIntoTokens( args, tokens );
+ return populate( tokens, config );
+ }
+
+ std::vector<Parser::Token> populate( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
+ validate();
+ std::vector<Parser::Token> unusedTokens = populateOptions( tokens, config );
+ unusedTokens = populateFixedArgs( unusedTokens, config );
+ unusedTokens = populateFloatingArgs( unusedTokens, config );
+ return unusedTokens;
+ }
+
+ std::vector<Parser::Token> populateOptions( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
+ std::vector<Parser::Token> unusedTokens;
+ std::vector<std::string> errors;
+ for( std::size_t i = 0; i < tokens.size(); ++i ) {
+ Parser::Token const& token = tokens[i];
+ typename std::vector<Arg>::const_iterator it = m_options.begin(), itEnd = m_options.end();
+ for(; it != itEnd; ++it ) {
+ Arg const& arg = *it;
+
+ try {
+ if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) ||
+ ( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) {
+ if( arg.takesArg() ) {
+ if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional )
+ errors.push_back( "Expected argument to option: " + token.data );
+ else
+ arg.boundField.set( config, tokens[++i].data );
+ }
+ else {
+ arg.boundField.set( config, "true" );
+ }
+ break;
+ }
+ }
+ catch( std::exception& ex ) {
+ errors.push_back( std::string( ex.what() ) + "\n- while parsing: (" + arg.commands() + ")" );
+ }
+ }
+ if( it == itEnd ) {
+ if( token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens )
+ unusedTokens.push_back( token );
+ else if( errors.empty() && m_throwOnUnrecognisedTokens )
+ errors.push_back( "unrecognised option: " + token.data );
+ }
+ }
+ if( !errors.empty() ) {
+ std::ostringstream oss;
+ for( std::vector<std::string>::const_iterator it = errors.begin(), itEnd = errors.end();
+ it != itEnd;
+ ++it ) {
+ if( it != errors.begin() )
+ oss << "\n";
+ oss << *it;
+ }
+ throw std::runtime_error( oss.str() );
+ }
+ return unusedTokens;
+ }
+ std::vector<Parser::Token> populateFixedArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
+ std::vector<Parser::Token> unusedTokens;
+ int position = 1;
+ for( std::size_t i = 0; i < tokens.size(); ++i ) {
+ Parser::Token const& token = tokens[i];
+ typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( position );
+ if( it != m_positionalArgs.end() )
+ it->second.boundField.set( config, token.data );
+ else
+ unusedTokens.push_back( token );
+ if( token.type == Parser::Token::Positional )
+ position++;
+ }
+ return unusedTokens;
+ }
+ std::vector<Parser::Token> populateFloatingArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
+ if( !m_floatingArg.get() )
+ return tokens;
+ std::vector<Parser::Token> unusedTokens;
+ for( std::size_t i = 0; i < tokens.size(); ++i ) {
+ Parser::Token const& token = tokens[i];
+ if( token.type == Parser::Token::Positional )
+ m_floatingArg->boundField.set( config, token.data );
+ else
+ unusedTokens.push_back( token );
+ }
+ return unusedTokens;
+ }
+
+ void validate() const
+ {
+ if( m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get() )
+ throw std::logic_error( "No options or arguments specified" );
+
+ for( typename std::vector<Arg>::const_iterator it = m_options.begin(),
+ itEnd = m_options.end();
+ it != itEnd; ++it )
+ it->validate();
+ }
+
+ private:
+ Detail::BoundArgFunction<ConfigT> m_boundProcessName;
+ std::vector<Arg> m_options;
+ std::map<int, Arg> m_positionalArgs;
+ ArgAutoPtr m_floatingArg;
+ int m_highestSpecifiedArgPosition;
+ bool m_throwOnUnrecognisedTokens;
+ };
+
+} // end namespace Clara
+
+STITCH_CLARA_CLOSE_NAMESPACE
+#undef STITCH_CLARA_OPEN_NAMESPACE
+#undef STITCH_CLARA_CLOSE_NAMESPACE
+
+#endif // TWOBLUECUBES_CLARA_H_INCLUDED
+#undef STITCH_CLARA_OPEN_NAMESPACE
+
+// Restore Clara's value for console width, if present
+#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
+#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
+#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
+#endif
+
+#include <fstream>
+#include <ctime>
+
+namespace Catch {
+
+ inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; }
+ inline void abortAfterX( ConfigData& config, int x ) {
+ if( x < 1 )
+ throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" );
+ config.abortAfter = x;
+ }
+ inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); }
+ inline void addSectionToRun( ConfigData& config, std::string const& sectionName ) { config.sectionsToRun.push_back( sectionName ); }
+ inline void addReporterName( ConfigData& config, std::string const& _reporterName ) { config.reporterNames.push_back( _reporterName ); }
+
+ inline void addWarning( ConfigData& config, std::string const& _warning ) {
+ if( _warning == "NoAssertions" )
+ config.warnings = static_cast<WarnAbout::What>( config.warnings | WarnAbout::NoAssertions );
+ else
+ throw std::runtime_error( "Unrecognised warning: '" + _warning + '\'' );
+ }
+ inline void setOrder( ConfigData& config, std::string const& order ) {
+ if( startsWith( "declared", order ) )
+ config.runOrder = RunTests::InDeclarationOrder;
+ else if( startsWith( "lexical", order ) )
+ config.runOrder = RunTests::InLexicographicalOrder;
+ else if( startsWith( "random", order ) )
+ config.runOrder = RunTests::InRandomOrder;
+ else
+ throw std::runtime_error( "Unrecognised ordering: '" + order + '\'' );
+ }
+ inline void setRngSeed( ConfigData& config, std::string const& seed ) {
+ if( seed == "time" ) {
+ config.rngSeed = static_cast<unsigned int>( std::time(0) );
+ }
+ else {
+ std::stringstream ss;
+ ss << seed;
+ ss >> config.rngSeed;
+ if( ss.fail() )
+ throw std::runtime_error( "Argument to --rng-seed should be the word 'time' or a number" );
+ }
+ }
+ inline void setVerbosity( ConfigData& config, int level ) {
+ // !TBD: accept strings?
+ config.verbosity = static_cast<Verbosity::Level>( level );
+ }
+ inline void setShowDurations( ConfigData& config, bool _showDurations ) {
+ config.showDurations = _showDurations
+ ? ShowDurations::Always
+ : ShowDurations::Never;
+ }
+ inline void setUseColour( ConfigData& config, std::string const& value ) {
+ std::string mode = toLower( value );
+
+ if( mode == "yes" )
+ config.useColour = UseColour::Yes;
+ else if( mode == "no" )
+ config.useColour = UseColour::No;
+ else if( mode == "auto" )
+ config.useColour = UseColour::Auto;
+ else
+ throw std::runtime_error( "colour mode must be one of: auto, yes or no" );
+ }
+ inline void forceColour( ConfigData& config ) {
+ config.useColour = UseColour::Yes;
+ }
+ inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) {
+ std::ifstream f( _filename.c_str() );
+ if( !f.is_open() )
+ throw std::domain_error( "Unable to load input file: " + _filename );
+
+ std::string line;
+ while( std::getline( f, line ) ) {
+ line = trim(line);
+ if( !line.empty() && !startsWith( line, '#' ) ) {
+ if( !startsWith( line, '"' ) )
+ line = '"' + line + '"';
+ addTestOrTags( config, line + ',' );
+ }
+ }
+ }
+
+ inline Clara::CommandLine<ConfigData> makeCommandLineParser() {
+
+ using namespace Clara;
+ CommandLine<ConfigData> cli;
+
+ cli.bindProcessName( &ConfigData::processName );
+
+ cli["-?"]["-h"]["--help"]
+ .describe( "display usage information" )
+ .bind( &ConfigData::showHelp );
+
+ cli["-l"]["--list-tests"]
+ .describe( "list all/matching test cases" )
+ .bind( &ConfigData::listTests );
+
+ cli["-t"]["--list-tags"]
+ .describe( "list all/matching tags" )
+ .bind( &ConfigData::listTags );
+
+ cli["-s"]["--success"]
+ .describe( "include successful tests in output" )
+ .bind( &ConfigData::showSuccessfulTests );
+
+ cli["-b"]["--break"]
+ .describe( "break into debugger on failure" )
+ .bind( &ConfigData::shouldDebugBreak );
+
+ cli["-e"]["--nothrow"]
+ .describe( "skip exception tests" )
+ .bind( &ConfigData::noThrow );
+
+ cli["-i"]["--invisibles"]
+ .describe( "show invisibles (tabs, newlines)" )
+ .bind( &ConfigData::showInvisibles );
+
+ cli["-o"]["--out"]
+ .describe( "output filename" )
+ .bind( &ConfigData::outputFilename, "filename" );
+
+ cli["-r"]["--reporter"]
+// .placeholder( "name[:filename]" )
+ .describe( "reporter to use (defaults to console)" )
+ .bind( &addReporterName, "name" );
+
+ cli["-n"]["--name"]
+ .describe( "suite name" )
+ .bind( &ConfigData::name, "name" );
+
+ cli["-a"]["--abort"]
+ .describe( "abort at first failure" )
+ .bind( &abortAfterFirst );
+
+ cli["-x"]["--abortx"]
+ .describe( "abort after x failures" )
+ .bind( &abortAfterX, "no. failures" );
+
+ cli["-w"]["--warn"]
+ .describe( "enable warnings" )
+ .bind( &addWarning, "warning name" );
+
+// - needs updating if reinstated
+// cli.into( &setVerbosity )
+// .describe( "level of verbosity (0=no output)" )
+// .shortOpt( "v")
+// .longOpt( "verbosity" )
+// .placeholder( "level" );
+
+ cli[_]
+ .describe( "which test or tests to use" )
+ .bind( &addTestOrTags, "test name, pattern or tags" );
+
+ cli["-d"]["--durations"]
+ .describe( "show test durations" )
+ .bind( &setShowDurations, "yes|no" );
+
+ cli["-f"]["--input-file"]
+ .describe( "load test names to run from a file" )
+ .bind( &loadTestNamesFromFile, "filename" );
+
+ cli["-#"]["--filenames-as-tags"]
+ .describe( "adds a tag for the filename" )
+ .bind( &ConfigData::filenamesAsTags );
+
+ cli["-c"]["--section"]
+ .describe( "specify section to run" )
+ .bind( &addSectionToRun, "section name" );
+
+ // Less common commands which don't have a short form
+ cli["--list-test-names-only"]
+ .describe( "list all/matching test cases names only" )
+ .bind( &ConfigData::listTestNamesOnly );
+
+ cli["--list-extra-info"]
+ .describe( "list all/matching test cases with more info" )
+ .bind( &ConfigData::listExtraInfo );
+
+ cli["--list-reporters"]
+ .describe( "list all reporters" )
+ .bind( &ConfigData::listReporters );
+
+ cli["--order"]
+ .describe( "test case order (defaults to decl)" )
+ .bind( &setOrder, "decl|lex|rand" );
+
+ cli["--rng-seed"]
+ .describe( "set a specific seed for random numbers" )
+ .bind( &setRngSeed, "'time'|number" );
+
+ cli["--force-colour"]
+ .describe( "force colourised output (deprecated)" )
+ .bind( &forceColour );
+
+ cli["--use-colour"]
+ .describe( "should output be colourised" )
+ .bind( &setUseColour, "yes|no" );
+
+ return cli;
+ }
+
+} // end namespace Catch
+
+// #included from: internal/catch_list.hpp
+#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED
+
+// #included from: catch_text.h
+#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED
+
+#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH
+
+#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch
+// #included from: ../external/tbc_text_format.h
+// Only use header guard if we are not using an outer namespace
+#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED
+# ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
+# define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
+# endif
+# else
+# define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED
+# endif
+#endif
+#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
+#include <string>
+#include <vector>
+#include <sstream>
+
+// Use optional outer namespace
+#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE {
+#endif
+
+namespace Tbc {
+
+#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH
+ const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH;
+#else
+ const unsigned int consoleWidth = 80;
+#endif
+
+ struct TextAttributes {
+ TextAttributes()
+ : initialIndent( std::string::npos ),
+ indent( 0 ),
+ width( consoleWidth-1 )
+ {}
+
+ TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; }
+ TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; }
+ TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; }
+
+ std::size_t initialIndent; // indent of first line, or npos
+ std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos
+ std::size_t width; // maximum width of text, including indent. Longer text will wrap
+ };
+
+ class Text {
+ public:
+ Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() )
+ : attr( _attr )
+ {
+ const std::string wrappableBeforeChars = "[({<\t";
+ const std::string wrappableAfterChars = "])}>-,./|\\";
+ const std::string wrappableInsteadOfChars = " \n\r";
+ std::string indent = _attr.initialIndent != std::string::npos
+ ? std::string( _attr.initialIndent, ' ' )
+ : std::string( _attr.indent, ' ' );
+
+ typedef std::string::const_iterator iterator;
+ iterator it = _str.begin();
+ const iterator strEnd = _str.end();
+
+ while( it != strEnd ) {
+
+ if( lines.size() >= 1000 ) {
+ lines.push_back( "... message truncated due to excessive size" );
+ return;
+ }
+
+ std::string suffix;
+ std::size_t width = (std::min)( static_cast<size_t>( strEnd-it ), _attr.width-static_cast<size_t>( indent.size() ) );
+ iterator itEnd = it+width;
+ iterator itNext = _str.end();
+
+ iterator itNewLine = std::find( it, itEnd, '\n' );
+ if( itNewLine != itEnd )
+ itEnd = itNewLine;
+
+ if( itEnd != strEnd ) {
+ bool foundWrapPoint = false;
+ iterator findIt = itEnd;
+ do {
+ if( wrappableAfterChars.find( *findIt ) != std::string::npos && findIt != itEnd ) {
+ itEnd = findIt+1;
+ itNext = findIt+1;
+ foundWrapPoint = true;
+ }
+ else if( findIt > it && wrappableBeforeChars.find( *findIt ) != std::string::npos ) {
+ itEnd = findIt;
+ itNext = findIt;
+ foundWrapPoint = true;
+ }
+ else if( wrappableInsteadOfChars.find( *findIt ) != std::string::npos ) {
+ itNext = findIt+1;
+ itEnd = findIt;
+ foundWrapPoint = true;
+ }
+ if( findIt == it )
+ break;
+ else
+ --findIt;
+ }
+ while( !foundWrapPoint );
+
+ if( !foundWrapPoint ) {
+ // No good wrap char, so we'll break mid word and add a hyphen
+ --itEnd;
+ itNext = itEnd;
+ suffix = "-";
+ }
+ else {
+ while( itEnd > it && wrappableInsteadOfChars.find( *(itEnd-1) ) != std::string::npos )
+ --itEnd;
+ }
+ }
+ lines.push_back( indent + std::string( it, itEnd ) + suffix );
+
+ if( indent.size() != _attr.indent )
+ indent = std::string( _attr.indent, ' ' );
+ it = itNext;
+ }
+ }
+
+ typedef std::vector<std::string>::const_iterator const_iterator;
+
+ const_iterator begin() const { return lines.begin(); }
+ const_iterator end() const { return lines.end(); }
+ std::string const& last() const { return lines.back(); }
+ std::size_t size() const { return lines.size(); }
+ std::string const& operator[]( std::size_t _index ) const { return lines[_index]; }
+ std::string toString() const {
+ std::ostringstream oss;
+ oss << *this;
+ return oss.str();
+ }
+
+ inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) {
+ for( Text::const_iterator it = _text.begin(), itEnd = _text.end();
+ it != itEnd; ++it ) {
+ if( it != _text.begin() )
+ _stream << "\n";
+ _stream << *it;
+ }
+ return _stream;
+ }
+
+ private:
+ std::string str;
+ TextAttributes attr;
+ std::vector<std::string> lines;
+ };
+
+} // end namespace Tbc
+
+#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+} // end outer namespace
+#endif
+
+#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
+#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
+
+namespace Catch {
+ using Tbc::Text;
+ using Tbc::TextAttributes;
+}
+
+// #included from: catch_console_colour.hpp
+#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED
+
+namespace Catch {
+
+ struct Colour {
+ enum Code {
+ None = 0,
+
+ White,
+ Red,
+ Green,
+ Blue,
+ Cyan,
+ Yellow,
+ Grey,
+
+ Bright = 0x10,
+
+ BrightRed = Bright | Red,
+ BrightGreen = Bright | Green,
+ LightGrey = Bright | Grey,
+ BrightWhite = Bright | White,
+
+ // By intention
+ FileName = LightGrey,
+ Warning = Yellow,
+ ResultError = BrightRed,
+ ResultSuccess = BrightGreen,
+ ResultExpectedFailure = Warning,
+
+ Error = BrightRed,
+ Success = Green,
+
+ OriginalExpression = Cyan,
+ ReconstructedExpression = Yellow,
+
+ SecondaryText = LightGrey,
+ Headers = White
+ };
+
+ // Use constructed object for RAII guard
+ Colour( Code _colourCode );
+ Colour( Colour const& other );
+ ~Colour();
+
+ // Use static method for one-shot changes
+ static void use( Code _colourCode );
+
+ private:
+ bool m_moved;
+ };
+
+ inline std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; }
+
+} // end namespace Catch
+
+// #included from: catch_interfaces_reporter.h
+#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED
+
+#include <string>
+#include <ostream>
+#include <map>
+
+namespace Catch
+{
+ struct ReporterConfig {
+ explicit ReporterConfig( Ptr<IConfig const> const& _fullConfig )
+ : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {}
+
+ ReporterConfig( Ptr<IConfig const> const& _fullConfig, std::ostream& _stream )
+ : m_stream( &_stream ), m_fullConfig( _fullConfig ) {}
+
+ std::ostream& stream() const { return *m_stream; }
+ Ptr<IConfig const> fullConfig() const { return m_fullConfig; }
+
+ private:
+ std::ostream* m_stream;
+ Ptr<IConfig const> m_fullConfig;
+ };
+
+ struct ReporterPreferences {
+ ReporterPreferences()
+ : shouldRedirectStdOut( false )
+ {}
+
+ bool shouldRedirectStdOut;
+ };
+
+ template<typename T>
+ struct LazyStat : Option<T> {
+ LazyStat() : used( false ) {}
+ LazyStat& operator=( T const& _value ) {
+ Option<T>::operator=( _value );
+ used = false;
+ return *this;
+ }
+ void reset() {
+ Option<T>::reset();
+ used = false;
+ }
+ bool used;
+ };
+
+ struct TestRunInfo {
+ TestRunInfo( std::string const& _name ) : name( _name ) {}
+ std::string name;
+ };
+ struct GroupInfo {
+ GroupInfo( std::string const& _name,
+ std::size_t _groupIndex,
+ std::size_t _groupsCount )
+ : name( _name ),
+ groupIndex( _groupIndex ),
+ groupsCounts( _groupsCount )
+ {}
+
+ std::string name;
+ std::size_t groupIndex;
+ std::size_t groupsCounts;
+ };
+
+ struct AssertionStats {
+ AssertionStats( AssertionResult const& _assertionResult,
+ std::vector<MessageInfo> const& _infoMessages,
+ Totals const& _totals )
+ : assertionResult( _assertionResult ),
+ infoMessages( _infoMessages ),
+ totals( _totals )
+ {
+ if( assertionResult.hasMessage() ) {
+ // Copy message into messages list.
+ // !TBD This should have been done earlier, somewhere
+ MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() );
+ builder << assertionResult.getMessage();
+ builder.m_info.message = builder.m_stream.str();
+
+ infoMessages.push_back( builder.m_info );
+ }
+ }
+ virtual ~AssertionStats();
+
+# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
+ AssertionStats( AssertionStats const& ) = default;
+ AssertionStats( AssertionStats && ) = default;
+ AssertionStats& operator = ( AssertionStats const& ) = default;
+ AssertionStats& operator = ( AssertionStats && ) = default;
+# endif
+
+ AssertionResult assertionResult;
+ std::vector<MessageInfo> infoMessages;
+ Totals totals;
+ };
+
+ struct SectionStats {
+ SectionStats( SectionInfo const& _sectionInfo,
+ Counts const& _assertions,
+ double _durationInSeconds,
+ bool _missingAssertions )
+ : sectionInfo( _sectionInfo ),
+ assertions( _assertions ),
+ durationInSeconds( _durationInSeconds ),
+ missingAssertions( _missingAssertions )
+ {}
+ virtual ~SectionStats();
+# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
+ SectionStats( SectionStats const& ) = default;
+ SectionStats( SectionStats && ) = default;
+ SectionStats& operator = ( SectionStats const& ) = default;
+ SectionStats& operator = ( SectionStats && ) = default;
+# endif
+
+ SectionInfo sectionInfo;
+ Counts assertions;
+ double durationInSeconds;
+ bool missingAssertions;
+ };
+
+ struct TestCaseStats {
+ TestCaseStats( TestCaseInfo const& _testInfo,
+ Totals const& _totals,
+ std::string const& _stdOut,
+ std::string const& _stdErr,
+ bool _aborting )
+ : testInfo( _testInfo ),
+ totals( _totals ),
+ stdOut( _stdOut ),
+ stdErr( _stdErr ),
+ aborting( _aborting )
+ {}
+ virtual ~TestCaseStats();
+
+# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
+ TestCaseStats( TestCaseStats const& ) = default;
+ TestCaseStats( TestCaseStats && ) = default;
+ TestCaseStats& operator = ( TestCaseStats const& ) = default;
+ TestCaseStats& operator = ( TestCaseStats && ) = default;
+# endif
+
+ TestCaseInfo testInfo;
+ Totals totals;
+ std::string stdOut;
+ std::string stdErr;
+ bool aborting;
+ };
+
+ struct TestGroupStats {
+ TestGroupStats( GroupInfo const& _groupInfo,
+ Totals const& _totals,
+ bool _aborting )
+ : groupInfo( _groupInfo ),
+ totals( _totals ),
+ aborting( _aborting )
+ {}
+ TestGroupStats( GroupInfo const& _groupInfo )
+ : groupInfo( _groupInfo ),
+ aborting( false )
+ {}
+ virtual ~TestGroupStats();
+
+# ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
+ TestGroupStats( TestGroupStats const& ) = default;
+ TestGroupStats( TestGroupStats && ) = default;
+ TestGroupStats& operator = ( TestGroupStats const& ) = default;
+ TestGroupStats& operator = ( TestGroupStats && ) = default;
+# endif
+
+ GroupInfo groupInfo;
+ Totals totals;
+ bool aborting;
+ };
+
+ struct TestRunStats {
+ TestRunStats( TestRunInfo const& _runInfo,
+ Totals const& _totals,
+ bool _aborting )
+ : runInfo( _runInfo ),
+ totals( _totals ),
+ aborting( _aborting )
+ {}
+ virtual ~TestRunStats();
+
+# ifndef CATCH_CONFIG_CPP11_GENERATED_METHODS
+ TestRunStats( TestRunStats const& _other )
+ : runInfo( _other.runInfo ),
+ totals( _other.totals ),
+ aborting( _other.aborting )
+ {}
+# else
+ TestRunStats( TestRunStats const& ) = default;
+ TestRunStats( TestRunStats && ) = default;
+ TestRunStats& operator = ( TestRunStats const& ) = default;
+ TestRunStats& operator = ( TestRunStats && ) = default;
+# endif
+
+ TestRunInfo runInfo;
+ Totals totals;
+ bool aborting;
+ };
+
+ class MultipleReporters;
+
+ struct IStreamingReporter : IShared {
+ virtual ~IStreamingReporter();
+
+ // Implementing class must also provide the following static method:
+ // static std::string getDescription();
+
+ virtual ReporterPreferences getPreferences() const = 0;
+
+ virtual void noMatchingTestCases( std::string const& spec ) = 0;
+
+ virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0;
+ virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0;
+
+ virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0;
+ virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0;
+
+ virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0;
+
+ // The return value indicates if the messages buffer should be cleared:
+ virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0;
+
+ virtual void sectionEnded( SectionStats const& sectionStats ) = 0;
+ virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0;
+ virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0;
+ virtual void testRunEnded( TestRunStats const& testRunStats ) = 0;
+
+ virtual void skipTest( TestCaseInfo const& testInfo ) = 0;
+
+ virtual MultipleReporters* tryAsMulti() { return CATCH_NULL; }
+ };
+
+ struct IReporterFactory : IShared {
+ virtual ~IReporterFactory();
+ virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0;
+ virtual std::string getDescription() const = 0;
+ };
+
+ struct IReporterRegistry {
+ typedef std::map<std::string, Ptr<IReporterFactory> > FactoryMap;
+ typedef std::vector<Ptr<IReporterFactory> > Listeners;
+
+ virtual ~IReporterRegistry();
+ virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig const> const& config ) const = 0;
+ virtual FactoryMap const& getFactories() const = 0;
+ virtual Listeners const& getListeners() const = 0;
+ };
+
+ Ptr<IStreamingReporter> addReporter( Ptr<IStreamingReporter> const& existingReporter, Ptr<IStreamingReporter> const& additionalReporter );
+
+}
+
+#include <limits>
+#include <algorithm>
+
+namespace Catch {
+
+ inline std::size_t listTests( Config const& config ) {
+
+ TestSpec testSpec = config.testSpec();
+ if( config.testSpec().hasFilters() )
+ Catch::cout() << "Matching test cases:\n";
+ else {
+ Catch::cout() << "All available test cases:\n";
+ testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec();
+ }
+
+ std::size_t matchedTests = 0;
+ TextAttributes nameAttr, descAttr, tagsAttr;
+ nameAttr.setInitialIndent( 2 ).setIndent( 4 );
+ descAttr.setIndent( 4 );
+ tagsAttr.setIndent( 6 );
+
+ std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
+ for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
+ it != itEnd;
+ ++it ) {
+ matchedTests++;
+ TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
+ Colour::Code colour = testCaseInfo.isHidden()
+ ? Colour::SecondaryText
+ : Colour::None;
+ Colour colourGuard( colour );
+
+ Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl;
+ if( config.listExtraInfo() ) {
+ Catch::cout() << " " << testCaseInfo.lineInfo << std::endl;
+ std::string description = testCaseInfo.description;
+ if( description.empty() )
+ description = "(NO DESCRIPTION)";
+ Catch::cout() << Text( description, descAttr ) << std::endl;
+ }
+ if( !testCaseInfo.tags.empty() )
+ Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl;
+ }
+
+ if( !config.testSpec().hasFilters() )
+ Catch::cout() << pluralise( matchedTests, "test case" ) << '\n' << std::endl;
+ else
+ Catch::cout() << pluralise( matchedTests, "matching test case" ) << '\n' << std::endl;
+ return matchedTests;
+ }
+
+ inline std::size_t listTestsNamesOnly( Config const& config ) {
+ TestSpec testSpec = config.testSpec();
+ if( !config.testSpec().hasFilters() )
+ testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec();
+ std::size_t matchedTests = 0;
+ std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
+ for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
+ it != itEnd;
+ ++it ) {
+ matchedTests++;
+ TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
+ if( startsWith( testCaseInfo.name, '#' ) )
+ Catch::cout() << '"' << testCaseInfo.name << '"';
+ else
+ Catch::cout() << testCaseInfo.name;
+ if ( config.listExtraInfo() )
+ Catch::cout() << "\t@" << testCaseInfo.lineInfo;
+ Catch::cout() << std::endl;
+ }
+ return matchedTests;
+ }
+
+ struct TagInfo {
+ TagInfo() : count ( 0 ) {}
+ void add( std::string const& spelling ) {
+ ++count;
+ spellings.insert( spelling );
+ }
+ std::string all() const {
+ std::string out;
+ for( std::set<std::string>::const_iterator it = spellings.begin(), itEnd = spellings.end();
+ it != itEnd;
+ ++it )
+ out += "[" + *it + "]";
+ return out;
+ }
+ std::set<std::string> spellings;
+ std::size_t count;
+ };
+
+ inline std::size_t listTags( Config const& config ) {
+ TestSpec testSpec = config.testSpec();
+ if( config.testSpec().hasFilters() )
+ Catch::cout() << "Tags for matching test cases:\n";
+ else {
+ Catch::cout() << "All available tags:\n";
+ testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "*" ).testSpec();
+ }
+
+ std::map<std::string, TagInfo> tagCounts;
+
+ std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
+ for( std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
+ it != itEnd;
+ ++it ) {
+ for( std::set<std::string>::const_iterator tagIt = it->getTestCaseInfo().tags.begin(),
+ tagItEnd = it->getTestCaseInfo().tags.end();
+ tagIt != tagItEnd;
+ ++tagIt ) {
+ std::string tagName = *tagIt;
+ std::string lcaseTagName = toLower( tagName );
+ std::map<std::string, TagInfo>::iterator countIt = tagCounts.find( lcaseTagName );
+ if( countIt == tagCounts.end() )
+ countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first;
+ countIt->second.add( tagName );
+ }
+ }
+
+ for( std::map<std::string, TagInfo>::const_iterator countIt = tagCounts.begin(),
+ countItEnd = tagCounts.end();
+ countIt != countItEnd;
+ ++countIt ) {
+ std::ostringstream oss;
+ oss << " " << std::setw(2) << countIt->second.count << " ";
+ Text wrapper( countIt->second.all(), TextAttributes()
+ .setInitialIndent( 0 )
+ .setIndent( oss.str().size() )
+ .setWidth( CATCH_CONFIG_CONSOLE_WIDTH-10 ) );
+ Catch::cout() << oss.str() << wrapper << '\n';
+ }
+ Catch::cout() << pluralise( tagCounts.size(), "tag" ) << '\n' << std::endl;
+ return tagCounts.size();
+ }
+
+ inline std::size_t listReporters( Config const& /*config*/ ) {
+ Catch::cout() << "Available reporters:\n";
+ IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();
+ IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it;
+ std::size_t maxNameLen = 0;
+ for(it = itBegin; it != itEnd; ++it )
+ maxNameLen = (std::max)( maxNameLen, it->first.size() );
+
+ for(it = itBegin; it != itEnd; ++it ) {
+ Text wrapper( it->second->getDescription(), TextAttributes()
+ .setInitialIndent( 0 )
+ .setIndent( 7+maxNameLen )
+ .setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) );
+ Catch::cout() << " "
+ << it->first
+ << ':'
+ << std::string( maxNameLen - it->first.size() + 2, ' ' )
+ << wrapper << '\n';
+ }
+ Catch::cout() << std::endl;
+ return factories.size();
+ }
+
+ inline Option<std::size_t> list( Config const& config ) {
+ Option<std::size_t> listedCount;
+ if( config.listTests() || ( config.listExtraInfo() && !config.listTestNamesOnly() ) )
+ listedCount = listedCount.valueOr(0) + listTests( config );
+ if( config.listTestNamesOnly() )
+ listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config );
+ if( config.listTags() )
+ listedCount = listedCount.valueOr(0) + listTags( config );
+ if( config.listReporters() )
+ listedCount = listedCount.valueOr(0) + listReporters( config );
+ return listedCount;
+ }
+
+} // end namespace Catch
+
+// #included from: internal/catch_run_context.hpp
+#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED
+
+// #included from: catch_test_case_tracker.hpp
+#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED
+
+#include <algorithm>
+#include <string>
+#include <assert.h>
+#include <vector>
+#include <stdexcept>
+
+CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS
+
+namespace Catch {
+namespace TestCaseTracking {
+
+ struct NameAndLocation {
+ std::string name;
+ SourceLineInfo location;
+
+ NameAndLocation( std::string const& _name, SourceLineInfo const& _location )
+ : name( _name ),
+ location( _location )
+ {}
+ };
+
+ struct ITracker : SharedImpl<> {
+ virtual ~ITracker();
+
+ // static queries
+ virtual NameAndLocation const& nameAndLocation() const = 0;
+
+ // dynamic queries
+ virtual bool isComplete() const = 0; // Successfully completed or failed
+ virtual bool isSuccessfullyCompleted() const = 0;
+ virtual bool isOpen() const = 0; // Started but not complete
+ virtual bool hasChildren() const = 0;
+
+ virtual ITracker& parent() = 0;
+
+ // actions
+ virtual void close() = 0; // Successfully complete
+ virtual void fail() = 0;
+ virtual void markAsNeedingAnotherRun() = 0;
+
+ virtual void addChild( Ptr<ITracker> const& child ) = 0;
+ virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) = 0;
+ virtual void openChild() = 0;
+
+ // Debug/ checking
+ virtual bool isSectionTracker() const = 0;
+ virtual bool isIndexTracker() const = 0;
+ };
+
+ class TrackerContext {
+
+ enum RunState {
+ NotStarted,
+ Executing,
+ CompletedCycle
+ };
+
+ Ptr<ITracker> m_rootTracker;
+ ITracker* m_currentTracker;
+ RunState m_runState;
+
+ public:
+
+ static TrackerContext& instance() {
+ static TrackerContext s_instance;
+ return s_instance;
+ }
+
+ TrackerContext()
+ : m_currentTracker( CATCH_NULL ),
+ m_runState( NotStarted )
+ {}
+
+ ITracker& startRun();
+
+ void endRun() {
+ m_rootTracker.reset();
+ m_currentTracker = CATCH_NULL;
+ m_runState = NotStarted;
+ }
+
+ void startCycle() {
+ m_currentTracker = m_rootTracker.get();
+ m_runState = Executing;
+ }
+ void completeCycle() {
+ m_runState = CompletedCycle;
+ }
+
+ bool completedCycle() const {
+ return m_runState == CompletedCycle;
+ }
+ ITracker& currentTracker() {
+ return *m_currentTracker;
+ }
+ void setCurrentTracker( ITracker* tracker ) {
+ m_currentTracker = tracker;
+ }
+ };
+
+ class TrackerBase : public ITracker {
+ protected:
+ enum CycleState {
+ NotStarted,
+ Executing,
+ ExecutingChildren,
+ NeedsAnotherRun,
+ CompletedSuccessfully,
+ Failed
+ };
+ class TrackerHasName {
+ NameAndLocation m_nameAndLocation;
+ public:
+ TrackerHasName( NameAndLocation const& nameAndLocation ) : m_nameAndLocation( nameAndLocation ) {}
+ bool operator ()( Ptr<ITracker> const& tracker ) {
+ return
+ tracker->nameAndLocation().name == m_nameAndLocation.name &&
+ tracker->nameAndLocation().location == m_nameAndLocation.location;
+ }
+ };
+ typedef std::vector<Ptr<ITracker> > Children;
+ NameAndLocation m_nameAndLocation;
+ TrackerContext& m_ctx;
+ ITracker* m_parent;
+ Children m_children;
+ CycleState m_runState;
+ public:
+ TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent )
+ : m_nameAndLocation( nameAndLocation ),
+ m_ctx( ctx ),
+ m_parent( parent ),
+ m_runState( NotStarted )
+ {}
+ virtual ~TrackerBase();
+
+ virtual NameAndLocation const& nameAndLocation() const CATCH_OVERRIDE {
+ return m_nameAndLocation;
+ }
+ virtual bool isComplete() const CATCH_OVERRIDE {
+ return m_runState == CompletedSuccessfully || m_runState == Failed;
+ }
+ virtual bool isSuccessfullyCompleted() const CATCH_OVERRIDE {
+ return m_runState == CompletedSuccessfully;
+ }
+ virtual bool isOpen() const CATCH_OVERRIDE {
+ return m_runState != NotStarted && !isComplete();
+ }
+ virtual bool hasChildren() const CATCH_OVERRIDE {
+ return !m_children.empty();
+ }
+
+ virtual void addChild( Ptr<ITracker> const& child ) CATCH_OVERRIDE {
+ m_children.push_back( child );
+ }
+
+ virtual ITracker* findChild( NameAndLocation const& nameAndLocation ) CATCH_OVERRIDE {
+ Children::const_iterator it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( nameAndLocation ) );
+ return( it != m_children.end() )
+ ? it->get()
+ : CATCH_NULL;
+ }
+ virtual ITracker& parent() CATCH_OVERRIDE {
+ assert( m_parent ); // Should always be non-null except for root
+ return *m_parent;
+ }
+
+ virtual void openChild() CATCH_OVERRIDE {
+ if( m_runState != ExecutingChildren ) {
+ m_runState = ExecutingChildren;
+ if( m_parent )
+ m_parent->openChild();
+ }
+ }
+
+ virtual bool isSectionTracker() const CATCH_OVERRIDE { return false; }
+ virtual bool isIndexTracker() const CATCH_OVERRIDE { return false; }
+
+ void open() {
+ m_runState = Executing;
+ moveToThis();
+ if( m_parent )
+ m_parent->openChild();
+ }
+
+ virtual void close() CATCH_OVERRIDE {
+
+ // Close any still open children (e.g. generators)
+ while( &m_ctx.currentTracker() != this )
+ m_ctx.currentTracker().close();
+
+ switch( m_runState ) {
+ case NotStarted:
+ case CompletedSuccessfully:
+ case Failed:
+ throw std::logic_error( "Illogical state" );
+
+ case NeedsAnotherRun:
+ break;;
+
+ case Executing:
+ m_runState = CompletedSuccessfully;
+ break;
+ case ExecutingChildren:
+ if( m_children.empty() || m_children.back()->isComplete() )
+ m_runState = CompletedSuccessfully;
+ break;
+
+ default:
+ throw std::logic_error( "Unexpected state" );
+ }
+ moveToParent();
+ m_ctx.completeCycle();
+ }
+ virtual void fail() CATCH_OVERRIDE {
+ m_runState = Failed;
+ if( m_parent )
+ m_parent->markAsNeedingAnotherRun();
+ moveToParent();
+ m_ctx.completeCycle();
+ }
+ virtual void markAsNeedingAnotherRun() CATCH_OVERRIDE {
+ m_runState = NeedsAnotherRun;
+ }
+ private:
+ void moveToParent() {
+ assert( m_parent );
+ m_ctx.setCurrentTracker( m_parent );
+ }
+ void moveToThis() {
+ m_ctx.setCurrentTracker( this );
+ }
+ };
+
+ class SectionTracker : public TrackerBase {
+ std::vector<std::string> m_filters;
+ public:
+ SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent )
+ : TrackerBase( nameAndLocation, ctx, parent )
+ {
+ if( parent ) {
+ while( !parent->isSectionTracker() )
+ parent = &parent->parent();
+
+ SectionTracker& parentSection = static_cast<SectionTracker&>( *parent );
+ addNextFilters( parentSection.m_filters );
+ }
+ }
+ virtual ~SectionTracker();
+
+ virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; }
+
+ static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) {
+ SectionTracker* section = CATCH_NULL;
+
+ ITracker& currentTracker = ctx.currentTracker();
+ if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) {
+ assert( childTracker );
+ assert( childTracker->isSectionTracker() );
+ section = static_cast<SectionTracker*>( childTracker );
+ }
+ else {
+ section = new SectionTracker( nameAndLocation, ctx, &currentTracker );
+ currentTracker.addChild( section );
+ }
+ if( !ctx.completedCycle() )
+ section->tryOpen();
+ return *section;
+ }
+
+ void tryOpen() {
+ if( !isComplete() && (m_filters.empty() || m_filters[0].empty() || m_filters[0] == m_nameAndLocation.name ) )
+ open();
+ }
+
+ void addInitialFilters( std::vector<std::string> const& filters ) {
+ if( !filters.empty() ) {
+ m_filters.push_back(""); // Root - should never be consulted
+ m_filters.push_back(""); // Test Case - not a section filter
+ m_filters.insert( m_filters.end(), filters.begin(), filters.end() );
+ }
+ }
+ void addNextFilters( std::vector<std::string> const& filters ) {
+ if( filters.size() > 1 )
+ m_filters.insert( m_filters.end(), ++filters.begin(), filters.end() );
+ }
+ };
+
+ class IndexTracker : public TrackerBase {
+ int m_size;
+ int m_index;
+ public:
+ IndexTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent, int size )
+ : TrackerBase( nameAndLocation, ctx, parent ),
+ m_size( size ),
+ m_index( -1 )
+ {}
+ virtual ~IndexTracker();
+
+ virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; }
+
+ static IndexTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation, int size ) {
+ IndexTracker* tracker = CATCH_NULL;
+
+ ITracker& currentTracker = ctx.currentTracker();
+ if( ITracker* childTracker = currentTracker.findChild( nameAndLocation ) ) {
+ assert( childTracker );
+ assert( childTracker->isIndexTracker() );
+ tracker = static_cast<IndexTracker*>( childTracker );
+ }
+ else {
+ tracker = new IndexTracker( nameAndLocation, ctx, &currentTracker, size );
+ currentTracker.addChild( tracker );
+ }
+
+ if( !ctx.completedCycle() && !tracker->isComplete() ) {
+ if( tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun )
+ tracker->moveNext();
+ tracker->open();
+ }
+
+ return *tracker;
+ }
+
+ int index() const { return m_index; }
+
+ void moveNext() {
+ m_index++;
+ m_children.clear();
+ }
+
+ virtual void close() CATCH_OVERRIDE {
+ TrackerBase::close();
+ if( m_runState == CompletedSuccessfully && m_index < m_size-1 )
+ m_runState = Executing;
+ }
+ };
+
+ inline ITracker& TrackerContext::startRun() {
+ m_rootTracker = new SectionTracker( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, CATCH_NULL );
+ m_currentTracker = CATCH_NULL;
+ m_runState = Executing;
+ return *m_rootTracker;
+ }
+
+} // namespace TestCaseTracking
+
+using TestCaseTracking::ITracker;
+using TestCaseTracking::TrackerContext;
+using TestCaseTracking::SectionTracker;
+using TestCaseTracking::IndexTracker;
+
+} // namespace Catch
+
+CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
+
+// #included from: catch_fatal_condition.hpp
+#define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED
+
+namespace Catch {
+
+ // Report the error condition
+ inline void reportFatal( std::string const& message ) {
+ IContext& context = Catch::getCurrentContext();
+ IResultCapture* resultCapture = context.getResultCapture();
+ resultCapture->handleFatalErrorCondition( message );
+ }
+
+} // namespace Catch
+
+#if defined ( CATCH_PLATFORM_WINDOWS ) /////////////////////////////////////////
+// #included from: catch_windows_h_proxy.h
+
+#define TWOBLUECUBES_CATCH_WINDOWS_H_PROXY_H_INCLUDED
+
+#ifdef CATCH_DEFINES_NOMINMAX
+# define NOMINMAX
+#endif
+#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+#endif
+
+#ifdef __AFXDLL
+#include <AfxWin.h>
+#else
+#include <windows.h>
+#endif
+
+#ifdef CATCH_DEFINES_NOMINMAX
+# undef NOMINMAX
+#endif
+#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN
+# undef WIN32_LEAN_AND_MEAN
+#endif
+
+
+# if !defined ( CATCH_CONFIG_WINDOWS_SEH )
+
+namespace Catch {
+ struct FatalConditionHandler {
+ void reset() {}
+ };
+}
+
+# else // CATCH_CONFIG_WINDOWS_SEH is defined
+
+namespace Catch {
+
+ struct SignalDefs { DWORD id; const char* name; };
+ extern SignalDefs signalDefs[];
+ // There is no 1-1 mapping between signals and windows exceptions.
+ // Windows can easily distinguish between SO and SigSegV,
+ // but SigInt, SigTerm, etc are handled differently.
+ SignalDefs signalDefs[] = {
+ { EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL - Illegal instruction signal" },
+ { EXCEPTION_STACK_OVERFLOW, "SIGSEGV - Stack overflow" },
+ { EXCEPTION_ACCESS_VIOLATION, "SIGSEGV - Segmentation violation signal" },
+ { EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error" },
+ };
+
+ struct FatalConditionHandler {
+
+ static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) {
+ for (int i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) {
+ if (ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) {
+ reportFatal(signalDefs[i].name);
+ }
+ }
+ // If its not an exception we care about, pass it along.
+ // This stops us from eating debugger breaks etc.
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+
+ FatalConditionHandler() {
+ isSet = true;
+ // 32k seems enough for Catch to handle stack overflow,
+ // but the value was found experimentally, so there is no strong guarantee
+ guaranteeSize = 32 * 1024;
+ exceptionHandlerHandle = CATCH_NULL;
+ // Register as first handler in current chain
+ exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException);
+ // Pass in guarantee size to be filled
+ SetThreadStackGuarantee(&guaranteeSize);
+ }
+
+ static void reset() {
+ if (isSet) {
+ // Unregister handler and restore the old guarantee
+ RemoveVectoredExceptionHandler(exceptionHandlerHandle);
+ SetThreadStackGuarantee(&guaranteeSize);
+ exceptionHandlerHandle = CATCH_NULL;
+ isSet = false;
+ }
+ }
+
+ ~FatalConditionHandler() {
+ reset();
+ }
+ private:
+ static bool isSet;
+ static ULONG guaranteeSize;
+ static PVOID exceptionHandlerHandle;
+ };
+
+ bool FatalConditionHandler::isSet = false;
+ ULONG FatalConditionHandler::guaranteeSize = 0;
+ PVOID FatalConditionHandler::exceptionHandlerHandle = CATCH_NULL;
+
+} // namespace Catch
+
+# endif // CATCH_CONFIG_WINDOWS_SEH
+
+#else // Not Windows - assumed to be POSIX compatible //////////////////////////
+
+# if !defined(CATCH_CONFIG_POSIX_SIGNALS)
+
+namespace Catch {
+ struct FatalConditionHandler {
+ void reset() {}
+ };
+}
+
+# else // CATCH_CONFIG_POSIX_SIGNALS is defined
+
+#include <signal.h>
+
+namespace Catch {
+
+ struct SignalDefs {
+ int id;
+ const char* name;
+ };
+ extern SignalDefs signalDefs[];
+ SignalDefs signalDefs[] = {
+ { SIGINT, "SIGINT - Terminal interrupt signal" },
+ { SIGILL, "SIGILL - Illegal instruction signal" },
+ { SIGFPE, "SIGFPE - Floating point error signal" },
+ { SIGSEGV, "SIGSEGV - Segmentation violation signal" },
+ { SIGTERM, "SIGTERM - Termination request signal" },
+ { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" }
+ };
+
+ struct FatalConditionHandler {
+
+ static bool isSet;
+ static struct sigaction oldSigActions [sizeof(signalDefs)/sizeof(SignalDefs)];
+ static stack_t oldSigStack;
+ static char altStackMem[SIGSTKSZ];
+
+ static void handleSignal( int sig ) {
+ std::string name = "<unknown signal>";
+ for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) {
+ SignalDefs &def = signalDefs[i];
+ if (sig == def.id) {
+ name = def.name;
+ break;
+ }
+ }
+ reset();
+ reportFatal(name);
+ raise( sig );
+ }
+
+ FatalConditionHandler() {
+ isSet = true;
+ stack_t sigStack;
+ sigStack.ss_sp = altStackMem;
+ sigStack.ss_size = SIGSTKSZ;
+ sigStack.ss_flags = 0;
+ sigaltstack(&sigStack, &oldSigStack);
+ struct sigaction sa = { 0 };
+
+ sa.sa_handler = handleSignal;
+ sa.sa_flags = SA_ONSTACK;
+ for (std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i) {
+ sigaction(signalDefs[i].id, &sa, &oldSigActions[i]);
+ }
+ }
+
+ ~FatalConditionHandler() {
+ reset();
+ }
+ static void reset() {
+ if( isSet ) {
+ // Set signals back to previous values -- hopefully nobody overwrote them in the meantime
+ for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) {
+ sigaction(signalDefs[i].id, &oldSigActions[i], CATCH_NULL);
+ }
+ // Return the old stack
+ sigaltstack(&oldSigStack, CATCH_NULL);
+ isSet = false;
+ }
+ }
+ };
+
+ bool FatalConditionHandler::isSet = false;
+ struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {};
+ stack_t FatalConditionHandler::oldSigStack = {};
+ char FatalConditionHandler::altStackMem[SIGSTKSZ] = {};
+
+} // namespace Catch
+
+# endif // CATCH_CONFIG_POSIX_SIGNALS
+
+#endif // not Windows
+
+#include <set>
+#include <string>
+
+namespace Catch {
+
+ class StreamRedirect {
+
+ public:
+ StreamRedirect( std::ostream& stream, std::string& targetString )
+ : m_stream( stream ),
+ m_prevBuf( stream.rdbuf() ),
+ m_targetString( targetString )
+ {
+ stream.rdbuf( m_oss.rdbuf() );
+ }
+
+ ~StreamRedirect() {
+ m_targetString += m_oss.str();
+ m_stream.rdbuf( m_prevBuf );
+ }
+
+ private:
+ std::ostream& m_stream;
+ std::streambuf* m_prevBuf;
+ std::ostringstream m_oss;
+ std::string& m_targetString;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class RunContext : public IResultCapture, public IRunner {
+
+ RunContext( RunContext const& );
+ void operator =( RunContext const& );
+
+ public:
+
+ explicit RunContext( Ptr<IConfig const> const& _config, Ptr<IStreamingReporter> const& reporter )
+ : m_runInfo( _config->name() ),
+ m_context( getCurrentMutableContext() ),
+ m_activeTestCase( CATCH_NULL ),
+ m_config( _config ),
+ m_reporter( reporter ),
+ m_shouldReportUnexpected ( true )
+ {
+ m_context.setRunner( this );
+ m_context.setConfig( m_config );
+ m_context.setResultCapture( this );
+ m_reporter->testRunStarting( m_runInfo );
+ }
+
+ virtual ~RunContext() {
+ m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) );
+ }
+
+ void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) {
+ m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) );
+ }
+ void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) {
+ m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) );
+ }
+
+ Totals runTest( TestCase const& testCase ) {
+ Totals prevTotals = m_totals;
+
+ std::string redirectedCout;
+ std::string redirectedCerr;
+
+ TestCaseInfo testInfo = testCase.getTestCaseInfo();
+
+ m_reporter->testCaseStarting( testInfo );
+
+ m_activeTestCase = &testCase;
+
+ do {
+ ITracker& rootTracker = m_trackerContext.startRun();
+ assert( rootTracker.isSectionTracker() );
+ static_cast<SectionTracker&>( rootTracker ).addInitialFilters( m_config->getSectionsToRun() );
+ do {
+ m_trackerContext.startCycle();
+ m_testCaseTracker = &SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( testInfo.name, testInfo.lineInfo ) );
+ runCurrentTest( redirectedCout, redirectedCerr );
+ }
+ while( !m_testCaseTracker->isSuccessfullyCompleted() && !aborting() );
+ }
+ // !TBD: deprecated - this will be replaced by indexed trackers
+ while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() );
+
+ Totals deltaTotals = m_totals.delta( prevTotals );
+ if( testInfo.expectedToFail() && deltaTotals.testCases.passed > 0 ) {
+ deltaTotals.assertions.failed++;
+ deltaTotals.testCases.passed--;
+ deltaTotals.testCases.failed++;
+ }
+ m_totals.testCases += deltaTotals.testCases;
+ m_reporter->testCaseEnded( TestCaseStats( testInfo,
+ deltaTotals,
+ redirectedCout,
+ redirectedCerr,
+ aborting() ) );
+
+ m_activeTestCase = CATCH_NULL;
+ m_testCaseTracker = CATCH_NULL;
+
+ return deltaTotals;
+ }
+
+ Ptr<IConfig const> config() const {
+ return m_config;
+ }
+
+ private: // IResultCapture
+
+ virtual void assertionEnded( AssertionResult const& result ) {
+ if( result.getResultType() == ResultWas::Ok ) {
+ m_totals.assertions.passed++;
+ }
+ else if( !result.isOk() ) {
+ m_totals.assertions.failed++;
+ }
+
+ // We have no use for the return value (whether messages should be cleared), because messages were made scoped
+ // and should be let to clear themselves out.
+ static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals)));
+
+ // Reset working state
+ m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition );
+ m_lastResult = result;
+ }
+
+ virtual bool sectionStarted (
+ SectionInfo const& sectionInfo,
+ Counts& assertions
+ )
+ {
+ ITracker& sectionTracker = SectionTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( sectionInfo.name, sectionInfo.lineInfo ) );
+ if( !sectionTracker.isOpen() )
+ return false;
+ m_activeSections.push_back( &sectionTracker );
+
+ m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo;
+
+ m_reporter->sectionStarting( sectionInfo );
+
+ assertions = m_totals.assertions;
+
+ return true;
+ }
+ bool testForMissingAssertions( Counts& assertions ) {
+ if( assertions.total() != 0 )
+ return false;
+ if( !m_config->warnAboutMissingAssertions() )
+ return false;
+ if( m_trackerContext.currentTracker().hasChildren() )
+ return false;
+ m_totals.assertions.failed++;
+ assertions.failed++;
+ return true;
+ }
+
+ virtual void sectionEnded( SectionEndInfo const& endInfo ) {
+ Counts assertions = m_totals.assertions - endInfo.prevAssertions;
+ bool missingAssertions = testForMissingAssertions( assertions );
+
+ if( !m_activeSections.empty() ) {
+ m_activeSections.back()->close();
+ m_activeSections.pop_back();
+ }
+
+ m_reporter->sectionEnded( SectionStats( endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions ) );
+ m_messages.clear();
+ }
+
+ virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) {
+ if( m_unfinishedSections.empty() )
+ m_activeSections.back()->fail();
+ else
+ m_activeSections.back()->close();
+ m_activeSections.pop_back();
+
+ m_unfinishedSections.push_back( endInfo );
+ }
+
+ virtual void pushScopedMessage( MessageInfo const& message ) {
+ m_messages.push_back( message );
+ }
+
+ virtual void popScopedMessage( MessageInfo const& message ) {
+ m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), message ), m_messages.end() );
+ }
+
+ virtual std::string getCurrentTestName() const {
+ return m_activeTestCase
+ ? m_activeTestCase->getTestCaseInfo().name
+ : std::string();
+ }
+
+ virtual const AssertionResult* getLastResult() const {
+ return &m_lastResult;
+ }
+
+ virtual void exceptionEarlyReported() {
+ m_shouldReportUnexpected = false;
+ }
+
+ virtual void handleFatalErrorCondition( std::string const& message ) {
+ // Don't rebuild the result -- the stringification itself can cause more fatal errors
+ // Instead, fake a result data.
+ AssertionResultData tempResult;
+ tempResult.resultType = ResultWas::FatalErrorCondition;
+ tempResult.message = message;
+ AssertionResult result(m_lastAssertionInfo, tempResult);
+
+ getResultCapture().assertionEnded(result);
+
+ handleUnfinishedSections();
+
+ // Recreate section for test case (as we will lose the one that was in scope)
+ TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
+ SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description );
+
+ Counts assertions;
+ assertions.failed = 1;
+ SectionStats testCaseSectionStats( testCaseSection, assertions, 0, false );
+ m_reporter->sectionEnded( testCaseSectionStats );
+
+ TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo();
+
+ Totals deltaTotals;
+ deltaTotals.testCases.failed = 1;
+ m_reporter->testCaseEnded( TestCaseStats( testInfo,
+ deltaTotals,
+ std::string(),
+ std::string(),
+ false ) );
+ m_totals.testCases.failed++;
+ testGroupEnded( std::string(), m_totals, 1, 1 );
+ m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, false ) );
+ }
+
+ public:
+ // !TBD We need to do this another way!
+ bool aborting() const {
+ return m_totals.assertions.failed == static_cast<std::size_t>( m_config->abortAfter() );
+ }
+
+ private:
+
+ void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) {
+ TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
+ SectionInfo testCaseSection( testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description );
+ m_reporter->sectionStarting( testCaseSection );
+ Counts prevAssertions = m_totals.assertions;
+ double duration = 0;
+ m_shouldReportUnexpected = true;
+ try {
+ m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal );
+
+ seedRng( *m_config );
+
+ Timer timer;
+ timer.start();
+ if( m_reporter->getPreferences().shouldRedirectStdOut ) {
+ StreamRedirect coutRedir( Catch::cout(), redirectedCout );
+ StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr );
+ invokeActiveTestCase();
+ }
+ else {
+ invokeActiveTestCase();
+ }
+ duration = timer.getElapsedSeconds();
+ }
+ catch( TestFailureException& ) {
+ // This just means the test was aborted due to failure
+ }
+ catch(...) {
+ // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under REQUIRE assertions
+ // are reported without translation at the point of origin.
+ if (m_shouldReportUnexpected) {
+ makeUnexpectedResultBuilder().useActiveException();
+ }
+ }
+ m_testCaseTracker->close();
+ handleUnfinishedSections();
+ m_messages.clear();
+
+ Counts assertions = m_totals.assertions - prevAssertions;
+ bool missingAssertions = testForMissingAssertions( assertions );
+
+ if( testCaseInfo.okToFail() ) {
+ std::swap( assertions.failedButOk, assertions.failed );
+ m_totals.assertions.failed -= assertions.failedButOk;
+ m_totals.assertions.failedButOk += assertions.failedButOk;
+ }
+
+ SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions );
+ m_reporter->sectionEnded( testCaseSectionStats );
+ }
+
+ void invokeActiveTestCase() {
+ FatalConditionHandler fatalConditionHandler; // Handle signals
+ m_activeTestCase->invoke();
+ fatalConditionHandler.reset();
+ }
+
+ private:
+
+ ResultBuilder makeUnexpectedResultBuilder() const {
+ return ResultBuilder( m_lastAssertionInfo.macroName,
+ m_lastAssertionInfo.lineInfo,
+ m_lastAssertionInfo.capturedExpression,
+ m_lastAssertionInfo.resultDisposition );
+ }
+
+ void handleUnfinishedSections() {
+ // If sections ended prematurely due to an exception we stored their
+ // infos here so we can tear them down outside the unwind process.
+ for( std::vector<SectionEndInfo>::const_reverse_iterator it = m_unfinishedSections.rbegin(),
+ itEnd = m_unfinishedSections.rend();
+ it != itEnd;
+ ++it )
+ sectionEnded( *it );
+ m_unfinishedSections.clear();
+ }
+
+ TestRunInfo m_runInfo;
+ IMutableContext& m_context;
+ TestCase const* m_activeTestCase;
+ ITracker* m_testCaseTracker;
+ ITracker* m_currentSectionTracker;
+ AssertionResult m_lastResult;
+
+ Ptr<IConfig const> m_config;
+ Totals m_totals;
+ Ptr<IStreamingReporter> m_reporter;
+ std::vector<MessageInfo> m_messages;
+ AssertionInfo m_lastAssertionInfo;
+ std::vector<SectionEndInfo> m_unfinishedSections;
+ std::vector<ITracker*> m_activeSections;
+ TrackerContext m_trackerContext;
+ bool m_shouldReportUnexpected;
+ };
+
+ IResultCapture& getResultCapture() {
+ if( IResultCapture* capture = getCurrentContext().getResultCapture() )
+ return *capture;
+ else
+ throw std::logic_error( "No result capture instance" );
+ }
+
+} // end namespace Catch
+
+// #included from: internal/catch_version.h
+#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED
+
+namespace Catch {
+
+ // Versioning information
+ struct Version {
+ Version( unsigned int _majorVersion,
+ unsigned int _minorVersion,
+ unsigned int _patchNumber,
+ char const * const _branchName,
+ unsigned int _buildNumber );
+
+ unsigned int const majorVersion;
+ unsigned int const minorVersion;
+ unsigned int const patchNumber;
+
+ // buildNumber is only used if branchName is not null
+ char const * const branchName;
+ unsigned int const buildNumber;
+
+ friend std::ostream& operator << ( std::ostream& os, Version const& version );
+
+ private:
+ void operator=( Version const& );
+ };
+
+ inline Version libraryVersion();
+}
+
+#include <fstream>
+#include <stdlib.h>
+#include <limits>
+
+namespace Catch {
+
+ Ptr<IStreamingReporter> createReporter( std::string const& reporterName, Ptr<Config> const& config ) {
+ Ptr<IStreamingReporter> reporter = getRegistryHub().getReporterRegistry().create( reporterName, config.get() );
+ if( !reporter ) {
+ std::ostringstream oss;
+ oss << "No reporter registered with name: '" << reporterName << "'";
+ throw std::domain_error( oss.str() );
+ }
+ return reporter;
+ }
+
+ Ptr<IStreamingReporter> makeReporter( Ptr<Config> const& config ) {
+ std::vector<std::string> reporters = config->getReporterNames();
+ if( reporters.empty() )
+ reporters.push_back( "console" );
+
+ Ptr<IStreamingReporter> reporter;
+ for( std::vector<std::string>::const_iterator it = reporters.begin(), itEnd = reporters.end();
+ it != itEnd;
+ ++it )
+ reporter = addReporter( reporter, createReporter( *it, config ) );
+ return reporter;
+ }
+ Ptr<IStreamingReporter> addListeners( Ptr<IConfig const> const& config, Ptr<IStreamingReporter> reporters ) {
+ IReporterRegistry::Listeners listeners = getRegistryHub().getReporterRegistry().getListeners();
+ for( IReporterRegistry::Listeners::const_iterator it = listeners.begin(), itEnd = listeners.end();
+ it != itEnd;
+ ++it )
+ reporters = addReporter(reporters, (*it)->create( ReporterConfig( config ) ) );
+ return reporters;
+ }
+
+ Totals runTests( Ptr<Config> const& config ) {
+
+ Ptr<IConfig const> iconfig = config.get();
+
+ Ptr<IStreamingReporter> reporter = makeReporter( config );
+ reporter = addListeners( iconfig, reporter );
+
+ RunContext context( iconfig, reporter );
+
+ Totals totals;
+
+ context.testGroupStarting( config->name(), 1, 1 );
+
+ TestSpec testSpec = config->testSpec();
+ if( !testSpec.hasFilters() )
+ testSpec = TestSpecParser( ITagAliasRegistry::get() ).parse( "~[.]" ).testSpec(); // All not hidden tests
+
+ std::vector<TestCase> const& allTestCases = getAllTestCasesSorted( *iconfig );
+ for( std::vector<TestCase>::const_iterator it = allTestCases.begin(), itEnd = allTestCases.end();
+ it != itEnd;
+ ++it ) {
+ if( !context.aborting() && matchTest( *it, testSpec, *iconfig ) )
+ totals += context.runTest( *it );
+ else
+ reporter->skipTest( *it );
+ }
+
+ context.testGroupEnded( iconfig->name(), totals, 1, 1 );
+ return totals;
+ }
+
+ void applyFilenamesAsTags( IConfig const& config ) {
+ std::vector<TestCase> const& tests = getAllTestCasesSorted( config );
+ for(std::size_t i = 0; i < tests.size(); ++i ) {
+ TestCase& test = const_cast<TestCase&>( tests[i] );
+ std::set<std::string> tags = test.tags;
+
+ std::string filename = test.lineInfo.file;
+ std::string::size_type lastSlash = filename.find_last_of( "\\/" );
+ if( lastSlash != std::string::npos )
+ filename = filename.substr( lastSlash+1 );
+
+ std::string::size_type lastDot = filename.find_last_of( "." );
+ if( lastDot != std::string::npos )
+ filename = filename.substr( 0, lastDot );
+
+ tags.insert( "#" + filename );
+ setTags( test, tags );
+ }
+ }
+
+ class Session : NonCopyable {
+ static bool alreadyInstantiated;
+
+ public:
+
+ struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; };
+
+ Session()
+ : m_cli( makeCommandLineParser() ) {
+ if( alreadyInstantiated ) {
+ std::string msg = "Only one instance of Catch::Session can ever be used";
+ Catch::cerr() << msg << std::endl;
+ throw std::logic_error( msg );
+ }
+ alreadyInstantiated = true;
+ }
+ ~Session() {
+ Catch::cleanUp();
+ }
+
+ void showHelp( std::string const& processName ) {
+ Catch::cout() << "\nCatch v" << libraryVersion() << "\n";
+
+ m_cli.usage( Catch::cout(), processName );
+ Catch::cout() << "For more detail usage please see the project docs\n" << std::endl;
+ }
+
+ int applyCommandLine( int argc, char const* const* const argv, OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) {
+ try {
+ m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail );
+ m_unusedTokens = m_cli.parseInto( Clara::argsToVector( argc, argv ), m_configData );
+ if( m_configData.showHelp )
+ showHelp( m_configData.processName );
+ m_config.reset();
+ }
+ catch( std::exception& ex ) {
+ {
+ Colour colourGuard( Colour::Red );
+ Catch::cerr()
+ << "\nError(s) in input:\n"
+ << Text( ex.what(), TextAttributes().setIndent(2) )
+ << "\n\n";
+ }
+ m_cli.usage( Catch::cout(), m_configData.processName );
+ return (std::numeric_limits<int>::max)();
+ }
+ return 0;
+ }
+
+ void useConfigData( ConfigData const& _configData ) {
+ m_configData = _configData;
+ m_config.reset();
+ }
+
+ int run( int argc, char const* const* const argv ) {
+
+ int returnCode = applyCommandLine( argc, argv );
+ if( returnCode == 0 )
+ returnCode = run();
+ return returnCode;
+ }
+
+ #if defined(WIN32) && defined(UNICODE)
+ int run( int argc, wchar_t const* const* const argv ) {
+
+ char **utf8Argv = new char *[ argc ];
+
+ for ( int i = 0; i < argc; ++i ) {
+ int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, NULL, 0, NULL, NULL );
+
+ utf8Argv[ i ] = new char[ bufSize ];
+
+ WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, NULL, NULL );
+ }
+
+ int returnCode = applyCommandLine( argc, utf8Argv );
+ if( returnCode == 0 )
+ returnCode = run();
+
+ for ( int i = 0; i < argc; ++i )
+ delete [] utf8Argv[ i ];
+
+ delete [] utf8Argv;
+
+ return returnCode;
+ }
+ #endif
+
+ int run() {
+ if( m_configData.showHelp )
+ return 0;
+
+ try
+ {
+ config(); // Force config to be constructed
+
+ seedRng( *m_config );
+
+ if( m_configData.filenamesAsTags )
+ applyFilenamesAsTags( *m_config );
+
+ // Handle list request
+ if( Option<std::size_t> listed = list( config() ) )
+ return static_cast<int>( *listed );
+
+ return static_cast<int>( runTests( m_config ).assertions.failed );
+ }
+ catch( std::exception& ex ) {
+ Catch::cerr() << ex.what() << std::endl;
+ return (std::numeric_limits<int>::max)();
+ }
+ }
+
+ Clara::CommandLine<ConfigData> const& cli() const {
+ return m_cli;
+ }
+ std::vector<Clara::Parser::Token> const& unusedTokens() const {
+ return m_unusedTokens;
+ }
+ ConfigData& configData() {
+ return m_configData;
+ }
+ Config& config() {
+ if( !m_config )
+ m_config = new Config( m_configData );
+ return *m_config;
+ }
+ private:
+ Clara::CommandLine<ConfigData> m_cli;
+ std::vector<Clara::Parser::Token> m_unusedTokens;
+ ConfigData m_configData;
+ Ptr<Config> m_config;
+ };
+
+ bool Session::alreadyInstantiated = false;
+
+} // end namespace Catch
+
+// #included from: catch_registry_hub.hpp
+#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED
+
+// #included from: catch_test_case_registry_impl.hpp
+#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED
+
+#include <vector>
+#include <set>
+#include <sstream>
+#include <algorithm>
+
+namespace Catch {
+
+ struct RandomNumberGenerator {
+ typedef std::ptrdiff_t result_type;
+
+ result_type operator()( result_type n ) const { return std::rand() % n; }
+
+#ifdef CATCH_CONFIG_CPP11_SHUFFLE
+ static constexpr result_type min() { return 0; }
+ static constexpr result_type max() { return 1000000; }
+ result_type operator()() const { return std::rand() % max(); }
+#endif
+ template<typename V>
+ static void shuffle( V& vector ) {
+ RandomNumberGenerator rng;
+#ifdef CATCH_CONFIG_CPP11_SHUFFLE
+ std::shuffle( vector.begin(), vector.end(), rng );
+#else
+ std::random_shuffle( vector.begin(), vector.end(), rng );
+#endif
+ }
+ };
+
+ inline std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) {
+
+ std::vector<TestCase> sorted = unsortedTestCases;
+
+ switch( config.runOrder() ) {
+ case RunTests::InLexicographicalOrder:
+ std::sort( sorted.begin(), sorted.end() );
+ break;
+ case RunTests::InRandomOrder:
+ {
+ seedRng( config );
+ RandomNumberGenerator::shuffle( sorted );
+ }
+ break;
+ case RunTests::InDeclarationOrder:
+ // already in declaration order
+ break;
+ }
+ return sorted;
+ }
+ bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) {
+ return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() );
+ }
+
+ void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions ) {
+ std::set<TestCase> seenFunctions;
+ for( std::vector<TestCase>::const_iterator it = functions.begin(), itEnd = functions.end();
+ it != itEnd;
+ ++it ) {
+ std::pair<std::set<TestCase>::const_iterator, bool> prev = seenFunctions.insert( *it );
+ if( !prev.second ) {
+ std::ostringstream ss;
+
+ ss << Colour( Colour::Red )
+ << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n"
+ << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << '\n'
+ << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl;
+
+ throw std::runtime_error(ss.str());
+ }
+ }
+ }
+
+ std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ) {
+ std::vector<TestCase> filtered;
+ filtered.reserve( testCases.size() );
+ for( std::vector<TestCase>::const_iterator it = testCases.begin(), itEnd = testCases.end();
+ it != itEnd;
+ ++it )
+ if( matchTest( *it, testSpec, config ) )
+ filtered.push_back( *it );
+ return filtered;
+ }
+ std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ) {
+ return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config );
+ }
+
+ class TestRegistry : public ITestCaseRegistry {
+ public:
+ TestRegistry()
+ : m_currentSortOrder( RunTests::InDeclarationOrder ),
+ m_unnamedCount( 0 )
+ {}
+ virtual ~TestRegistry();
+
+ virtual void registerTest( TestCase const& testCase ) {
+ std::string name = testCase.getTestCaseInfo().name;
+ if( name.empty() ) {
+ std::ostringstream oss;
+ oss << "Anonymous test case " << ++m_unnamedCount;
+ return registerTest( testCase.withName( oss.str() ) );
+ }
+ m_functions.push_back( testCase );
+ }
+
+ virtual std::vector<TestCase> const& getAllTests() const {
+ return m_functions;
+ }
+ virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const {
+ if( m_sortedFunctions.empty() )
+ enforceNoDuplicateTestCases( m_functions );
+
+ if( m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) {
+ m_sortedFunctions = sortTests( config, m_functions );
+ m_currentSortOrder = config.runOrder();
+ }
+ return m_sortedFunctions;
+ }
+
+ private:
+ std::vector<TestCase> m_functions;
+ mutable RunTests::InWhatOrder m_currentSortOrder;
+ mutable std::vector<TestCase> m_sortedFunctions;
+ size_t m_unnamedCount;
+ std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class FreeFunctionTestCase : public SharedImpl<ITestCase> {
+ public:
+
+ FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {}
+
+ virtual void invoke() const {
+ m_fun();
+ }
+
+ private:
+ virtual ~FreeFunctionTestCase();
+
+ TestFunction m_fun;
+ };
+
+ inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) {
+ std::string className = classOrQualifiedMethodName;
+ if( startsWith( className, '&' ) )
+ {
+ std::size_t lastColons = className.rfind( "::" );
+ std::size_t penultimateColons = className.rfind( "::", lastColons-1 );
+ if( penultimateColons == std::string::npos )
+ penultimateColons = 1;
+ className = className.substr( penultimateColons, lastColons-penultimateColons );
+ }
+ return className;
+ }
+
+ void registerTestCase
+ ( ITestCase* testCase,
+ char const* classOrQualifiedMethodName,
+ NameAndDesc const& nameAndDesc,
+ SourceLineInfo const& lineInfo ) {
+
+ getMutableRegistryHub().registerTest
+ ( makeTestCase
+ ( testCase,
+ extractClassName( classOrQualifiedMethodName ),
+ nameAndDesc.name,
+ nameAndDesc.description,
+ lineInfo ) );
+ }
+ void registerTestCaseFunction
+ ( TestFunction function,
+ SourceLineInfo const& lineInfo,
+ NameAndDesc const& nameAndDesc ) {
+ registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo );
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ AutoReg::AutoReg
+ ( TestFunction function,
+ SourceLineInfo const& lineInfo,
+ NameAndDesc const& nameAndDesc ) {
+ registerTestCaseFunction( function, lineInfo, nameAndDesc );
+ }
+
+ AutoReg::~AutoReg() {}
+
+} // end namespace Catch
+
+// #included from: catch_reporter_registry.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED
+
+#include <map>
+
+namespace Catch {
+
+ class ReporterRegistry : public IReporterRegistry {
+
+ public:
+
+ virtual ~ReporterRegistry() CATCH_OVERRIDE {}
+
+ virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig const> const& config ) const CATCH_OVERRIDE {
+ FactoryMap::const_iterator it = m_factories.find( name );
+ if( it == m_factories.end() )
+ return CATCH_NULL;
+ return it->second->create( ReporterConfig( config ) );
+ }
+
+ void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) {
+ m_factories.insert( std::make_pair( name, factory ) );
+ }
+ void registerListener( Ptr<IReporterFactory> const& factory ) {
+ m_listeners.push_back( factory );
+ }
+
+ virtual FactoryMap const& getFactories() const CATCH_OVERRIDE {
+ return m_factories;
+ }
+ virtual Listeners const& getListeners() const CATCH_OVERRIDE {
+ return m_listeners;
+ }
+
+ private:
+ FactoryMap m_factories;
+ Listeners m_listeners;
+ };
+}
+
+// #included from: catch_exception_translator_registry.hpp
+#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED
+
+#ifdef __OBJC__
+#import "Foundation/Foundation.h"
+#endif
+
+namespace Catch {
+
+ class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry {
+ public:
+ ~ExceptionTranslatorRegistry() {
+ deleteAll( m_translators );
+ }
+
+ virtual void registerTranslator( const IExceptionTranslator* translator ) {
+ m_translators.push_back( translator );
+ }
+
+ virtual std::string translateActiveException() const {
+ try {
+#ifdef __OBJC__
+ // In Objective-C try objective-c exceptions first
+ @try {
+ return tryTranslators();
+ }
+ @catch (NSException *exception) {
+ return Catch::toString( [exception description] );
+ }
+#else
+ return tryTranslators();
+#endif
+ }
+ catch( TestFailureException& ) {
+ throw;
+ }
+ catch( std::exception& ex ) {
+ return ex.what();
+ }
+ catch( std::string& msg ) {
+ return msg;
+ }
+ catch( const char* msg ) {
+ return msg;
+ }
+ catch(...) {
+ return "Unknown exception";
+ }
+ }
+
+ std::string tryTranslators() const {
+ if( m_translators.empty() )
+ throw;
+ else
+ return m_translators[0]->translate( m_translators.begin()+1, m_translators.end() );
+ }
+
+ private:
+ std::vector<const IExceptionTranslator*> m_translators;
+ };
+}
+
+// #included from: catch_tag_alias_registry.h
+#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED
+
+#include <map>
+
+namespace Catch {
+
+ class TagAliasRegistry : public ITagAliasRegistry {
+ public:
+ virtual ~TagAliasRegistry();
+ virtual Option<TagAlias> find( std::string const& alias ) const;
+ virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const;
+ void add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo );
+
+ private:
+ std::map<std::string, TagAlias> m_registry;
+ };
+
+} // end namespace Catch
+
+namespace Catch {
+
+ namespace {
+
+ class RegistryHub : public IRegistryHub, public IMutableRegistryHub {
+
+ RegistryHub( RegistryHub const& );
+ void operator=( RegistryHub const& );
+
+ public: // IRegistryHub
+ RegistryHub() {
+ }
+ virtual IReporterRegistry const& getReporterRegistry() const CATCH_OVERRIDE {
+ return m_reporterRegistry;
+ }
+ virtual ITestCaseRegistry const& getTestCaseRegistry() const CATCH_OVERRIDE {
+ return m_testCaseRegistry;
+ }
+ virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() CATCH_OVERRIDE {
+ return m_exceptionTranslatorRegistry;
+ }
+ virtual ITagAliasRegistry const& getTagAliasRegistry() const CATCH_OVERRIDE {
+ return m_tagAliasRegistry;
+ }
+
+ public: // IMutableRegistryHub
+ virtual void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) CATCH_OVERRIDE {
+ m_reporterRegistry.registerReporter( name, factory );
+ }
+ virtual void registerListener( Ptr<IReporterFactory> const& factory ) CATCH_OVERRIDE {
+ m_reporterRegistry.registerListener( factory );
+ }
+ virtual void registerTest( TestCase const& testInfo ) CATCH_OVERRIDE {
+ m_testCaseRegistry.registerTest( testInfo );
+ }
+ virtual void registerTranslator( const IExceptionTranslator* translator ) CATCH_OVERRIDE {
+ m_exceptionTranslatorRegistry.registerTranslator( translator );
+ }
+ virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) CATCH_OVERRIDE {
+ m_tagAliasRegistry.add( alias, tag, lineInfo );
+ }
+
+ private:
+ TestRegistry m_testCaseRegistry;
+ ReporterRegistry m_reporterRegistry;
+ ExceptionTranslatorRegistry m_exceptionTranslatorRegistry;
+ TagAliasRegistry m_tagAliasRegistry;
+ };
+
+ // Single, global, instance
+ inline RegistryHub*& getTheRegistryHub() {
+ static RegistryHub* theRegistryHub = CATCH_NULL;
+ if( !theRegistryHub )
+ theRegistryHub = new RegistryHub();
+ return theRegistryHub;
+ }
+ }
+
+ IRegistryHub& getRegistryHub() {
+ return *getTheRegistryHub();
+ }
+ IMutableRegistryHub& getMutableRegistryHub() {
+ return *getTheRegistryHub();
+ }
+ void cleanUp() {
+ delete getTheRegistryHub();
+ getTheRegistryHub() = CATCH_NULL;
+ cleanUpContext();
+ }
+ std::string translateActiveException() {
+ return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException();
+ }
+
+} // end namespace Catch
+
+// #included from: catch_notimplemented_exception.hpp
+#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED
+
+#include <sstream>
+
+namespace Catch {
+
+ NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo )
+ : m_lineInfo( lineInfo ) {
+ std::ostringstream oss;
+ oss << lineInfo << ": function ";
+ oss << "not implemented";
+ m_what = oss.str();
+ }
+
+ const char* NotImplementedException::what() const CATCH_NOEXCEPT {
+ return m_what.c_str();
+ }
+
+} // end namespace Catch
+
+// #included from: catch_context_impl.hpp
+#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED
+
+// #included from: catch_stream.hpp
+#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED
+
+#include <stdexcept>
+#include <cstdio>
+#include <iostream>
+
+namespace Catch {
+
+ template<typename WriterF, size_t bufferSize=256>
+ class StreamBufImpl : public StreamBufBase {
+ char data[bufferSize];
+ WriterF m_writer;
+
+ public:
+ StreamBufImpl() {
+ setp( data, data + sizeof(data) );
+ }
+
+ ~StreamBufImpl() CATCH_NOEXCEPT {
+ sync();
+ }
+
+ private:
+ int overflow( int c ) {
+ sync();
+
+ if( c != EOF ) {
+ if( pbase() == epptr() )
+ m_writer( std::string( 1, static_cast<char>( c ) ) );
+ else
+ sputc( static_cast<char>( c ) );
+ }
+ return 0;
+ }
+
+ int sync() {
+ if( pbase() != pptr() ) {
+ m_writer( std::string( pbase(), static_cast<std::string::size_type>( pptr() - pbase() ) ) );
+ setp( pbase(), epptr() );
+ }
+ return 0;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ FileStream::FileStream( std::string const& filename ) {
+ m_ofs.open( filename.c_str() );
+ if( m_ofs.fail() ) {
+ std::ostringstream oss;
+ oss << "Unable to open file: '" << filename << '\'';
+ throw std::domain_error( oss.str() );
+ }
+ }
+
+ std::ostream& FileStream::stream() const {
+ return m_ofs;
+ }
+
+ struct OutputDebugWriter {
+
+ void operator()( std::string const&str ) {
+ writeToDebugConsole( str );
+ }
+ };
+
+ DebugOutStream::DebugOutStream()
+ : m_streamBuf( new StreamBufImpl<OutputDebugWriter>() ),
+ m_os( m_streamBuf.get() )
+ {}
+
+ std::ostream& DebugOutStream::stream() const {
+ return m_os;
+ }
+
+ // Store the streambuf from cout up-front because
+ // cout may get redirected when running tests
+ CoutStream::CoutStream()
+ : m_os( Catch::cout().rdbuf() )
+ {}
+
+ std::ostream& CoutStream::stream() const {
+ return m_os;
+ }
+
+#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions
+ std::ostream& cout() {
+ return std::cout;
+ }
+ std::ostream& cerr() {
+ return std::cerr;
+ }
+#endif
+}
+
+namespace Catch {
+
+ class Context : public IMutableContext {
+
+ Context() : m_config( CATCH_NULL ), m_runner( CATCH_NULL ), m_resultCapture( CATCH_NULL ) {}
+ Context( Context const& );
+ void operator=( Context const& );
+
+ public:
+ virtual ~Context() {
+ deleteAllValues( m_generatorsByTestName );
+ }
+
+ public: // IContext
+ virtual IResultCapture* getResultCapture() {
+ return m_resultCapture;
+ }
+ virtual IRunner* getRunner() {
+ return m_runner;
+ }
+ virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) {
+ return getGeneratorsForCurrentTest()
+ .getGeneratorInfo( fileInfo, totalSize )
+ .getCurrentIndex();
+ }
+ virtual bool advanceGeneratorsForCurrentTest() {
+ IGeneratorsForTest* generators = findGeneratorsForCurrentTest();
+ return generators && generators->moveNext();
+ }
+
+ virtual Ptr<IConfig const> getConfig() const {
+ return m_config;
+ }
+
+ public: // IMutableContext
+ virtual void setResultCapture( IResultCapture* resultCapture ) {
+ m_resultCapture = resultCapture;
+ }
+ virtual void setRunner( IRunner* runner ) {
+ m_runner = runner;
+ }
+ virtual void setConfig( Ptr<IConfig const> const& config ) {
+ m_config = config;
+ }
+
+ friend IMutableContext& getCurrentMutableContext();
+
+ private:
+ IGeneratorsForTest* findGeneratorsForCurrentTest() {
+ std::string testName = getResultCapture()->getCurrentTestName();
+
+ std::map<std::string, IGeneratorsForTest*>::const_iterator it =
+ m_generatorsByTestName.find( testName );
+ return it != m_generatorsByTestName.end()
+ ? it->second
+ : CATCH_NULL;
+ }
+
+ IGeneratorsForTest& getGeneratorsForCurrentTest() {
+ IGeneratorsForTest* generators = findGeneratorsForCurrentTest();
+ if( !generators ) {
+ std::string testName = getResultCapture()->getCurrentTestName();
+ generators = createGeneratorsForTest();
+ m_generatorsByTestName.insert( std::make_pair( testName, generators ) );
+ }
+ return *generators;
+ }
+
+ private:
+ Ptr<IConfig const> m_config;
+ IRunner* m_runner;
+ IResultCapture* m_resultCapture;
+ std::map<std::string, IGeneratorsForTest*> m_generatorsByTestName;
+ };
+
+ namespace {
+ Context* currentContext = CATCH_NULL;
+ }
+ IMutableContext& getCurrentMutableContext() {
+ if( !currentContext )
+ currentContext = new Context();
+ return *currentContext;
+ }
+ IContext& getCurrentContext() {
+ return getCurrentMutableContext();
+ }
+
+ void cleanUpContext() {
+ delete currentContext;
+ currentContext = CATCH_NULL;
+ }
+}
+
+// #included from: catch_console_colour_impl.hpp
+#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED
+
+// #included from: catch_errno_guard.hpp
+#define TWOBLUECUBES_CATCH_ERRNO_GUARD_HPP_INCLUDED
+
+#include <cerrno>
+
+namespace Catch {
+
+ class ErrnoGuard {
+ public:
+ ErrnoGuard():m_oldErrno(errno){}
+ ~ErrnoGuard() { errno = m_oldErrno; }
+ private:
+ int m_oldErrno;
+ };
+
+}
+
+namespace Catch {
+ namespace {
+
+ struct IColourImpl {
+ virtual ~IColourImpl() {}
+ virtual void use( Colour::Code _colourCode ) = 0;
+ };
+
+ struct NoColourImpl : IColourImpl {
+ void use( Colour::Code ) {}
+
+ static IColourImpl* instance() {
+ static NoColourImpl s_instance;
+ return &s_instance;
+ }
+ };
+
+ } // anon namespace
+} // namespace Catch
+
+#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI )
+# ifdef CATCH_PLATFORM_WINDOWS
+# define CATCH_CONFIG_COLOUR_WINDOWS
+# else
+# define CATCH_CONFIG_COLOUR_ANSI
+# endif
+#endif
+
+#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) /////////////////////////////////////////
+
+namespace Catch {
+namespace {
+
+ class Win32ColourImpl : public IColourImpl {
+ public:
+ Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) )
+ {
+ CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
+ GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo );
+ originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY );
+ originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
+ }
+
+ virtual void use( Colour::Code _colourCode ) {
+ switch( _colourCode ) {
+ case Colour::None: return setTextAttribute( originalForegroundAttributes );
+ case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );
+ case Colour::Red: return setTextAttribute( FOREGROUND_RED );
+ case Colour::Green: return setTextAttribute( FOREGROUND_GREEN );
+ case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE );
+ case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN );
+ case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN );
+ case Colour::Grey: return setTextAttribute( 0 );
+
+ case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY );
+ case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED );
+ case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN );
+ case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );
+
+ case Colour::Bright: throw std::logic_error( "not a colour" );
+ }
+ }
+
+ private:
+ void setTextAttribute( WORD _textAttribute ) {
+ SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes );
+ }
+ HANDLE stdoutHandle;
+ WORD originalForegroundAttributes;
+ WORD originalBackgroundAttributes;
+ };
+
+ IColourImpl* platformColourInstance() {
+ static Win32ColourImpl s_instance;
+
+ Ptr<IConfig const> config = getCurrentContext().getConfig();
+ UseColour::YesOrNo colourMode = config
+ ? config->useColour()
+ : UseColour::Auto;
+ if( colourMode == UseColour::Auto )
+ colourMode = !isDebuggerActive()
+ ? UseColour::Yes
+ : UseColour::No;
+ return colourMode == UseColour::Yes
+ ? &s_instance
+ : NoColourImpl::instance();
+ }
+
+} // end anon namespace
+} // end namespace Catch
+
+#elif defined( CATCH_CONFIG_COLOUR_ANSI ) //////////////////////////////////////
+
+#include <unistd.h>
+
+namespace Catch {
+namespace {
+
+ // use POSIX/ ANSI console terminal codes
+ // Thanks to Adam Strzelecki for original contribution
+ // (http://github.com/nanoant)
+ // https://github.com/philsquared/Catch/pull/131
+ class PosixColourImpl : public IColourImpl {
+ public:
+ virtual void use( Colour::Code _colourCode ) {
+ switch( _colourCode ) {
+ case Colour::None:
+ case Colour::White: return setColour( "[0m" );
+ case Colour::Red: return setColour( "[0;31m" );
+ case Colour::Green: return setColour( "[0;32m" );
+ case Colour::Blue: return setColour( "[0;34m" );
+ case Colour::Cyan: return setColour( "[0;36m" );
+ case Colour::Yellow: return setColour( "[0;33m" );
+ case Colour::Grey: return setColour( "[1;30m" );
+
+ case Colour::LightGrey: return setColour( "[0;37m" );
+ case Colour::BrightRed: return setColour( "[1;31m" );
+ case Colour::BrightGreen: return setColour( "[1;32m" );
+ case Colour::BrightWhite: return setColour( "[1;37m" );
+
+ case Colour::Bright: throw std::logic_error( "not a colour" );
+ }
+ }
+ static IColourImpl* instance() {
+ static PosixColourImpl s_instance;
+ return &s_instance;
+ }
+
+ private:
+ void setColour( const char* _escapeCode ) {
+ Catch::cout() << '\033' << _escapeCode;
+ }
+ };
+
+ IColourImpl* platformColourInstance() {
+ ErrnoGuard guard;
+ Ptr<IConfig const> config = getCurrentContext().getConfig();
+ UseColour::YesOrNo colourMode = config
+ ? config->useColour()
+ : UseColour::Auto;
+ if( colourMode == UseColour::Auto )
+ colourMode = (!isDebuggerActive() && isatty(STDOUT_FILENO) )
+ ? UseColour::Yes
+ : UseColour::No;
+ return colourMode == UseColour::Yes
+ ? PosixColourImpl::instance()
+ : NoColourImpl::instance();
+ }
+
+} // end anon namespace
+} // end namespace Catch
+
+#else // not Windows or ANSI ///////////////////////////////////////////////
+
+namespace Catch {
+
+ static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); }
+
+} // end namespace Catch
+
+#endif // Windows/ ANSI/ None
+
+namespace Catch {
+
+ Colour::Colour( Code _colourCode ) : m_moved( false ) { use( _colourCode ); }
+ Colour::Colour( Colour const& _other ) : m_moved( false ) { const_cast<Colour&>( _other ).m_moved = true; }
+ Colour::~Colour(){ if( !m_moved ) use( None ); }
+
+ void Colour::use( Code _colourCode ) {
+ static IColourImpl* impl = platformColourInstance();
+ impl->use( _colourCode );
+ }
+
+} // end namespace Catch
+
+// #included from: catch_generators_impl.hpp
+#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED
+
+#include <vector>
+#include <string>
+#include <map>
+
+namespace Catch {
+
+ struct GeneratorInfo : IGeneratorInfo {
+
+ GeneratorInfo( std::size_t size )
+ : m_size( size ),
+ m_currentIndex( 0 )
+ {}
+
+ bool moveNext() {
+ if( ++m_currentIndex == m_size ) {
+ m_currentIndex = 0;
+ return false;
+ }
+ return true;
+ }
+
+ std::size_t getCurrentIndex() const {
+ return m_currentIndex;
+ }
+
+ std::size_t m_size;
+ std::size_t m_currentIndex;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class GeneratorsForTest : public IGeneratorsForTest {
+
+ public:
+ ~GeneratorsForTest() {
+ deleteAll( m_generatorsInOrder );
+ }
+
+ IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) {
+ std::map<std::string, IGeneratorInfo*>::const_iterator it = m_generatorsByName.find( fileInfo );
+ if( it == m_generatorsByName.end() ) {
+ IGeneratorInfo* info = new GeneratorInfo( size );
+ m_generatorsByName.insert( std::make_pair( fileInfo, info ) );
+ m_generatorsInOrder.push_back( info );
+ return *info;
+ }
+ return *it->second;
+ }
+
+ bool moveNext() {
+ std::vector<IGeneratorInfo*>::const_iterator it = m_generatorsInOrder.begin();
+ std::vector<IGeneratorInfo*>::const_iterator itEnd = m_generatorsInOrder.end();
+ for(; it != itEnd; ++it ) {
+ if( (*it)->moveNext() )
+ return true;
+ }
+ return false;
+ }
+
+ private:
+ std::map<std::string, IGeneratorInfo*> m_generatorsByName;
+ std::vector<IGeneratorInfo*> m_generatorsInOrder;
+ };
+
+ IGeneratorsForTest* createGeneratorsForTest()
+ {
+ return new GeneratorsForTest();
+ }
+
+} // end namespace Catch
+
+// #included from: catch_assertionresult.hpp
+#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED
+
+namespace Catch {
+
+ AssertionInfo::AssertionInfo( char const * _macroName,
+ SourceLineInfo const& _lineInfo,
+ char const * _capturedExpression,
+ ResultDisposition::Flags _resultDisposition,
+ char const * _secondArg)
+ : macroName( _macroName ),
+ lineInfo( _lineInfo ),
+ capturedExpression( _capturedExpression ),
+ resultDisposition( _resultDisposition ),
+ secondArg( _secondArg )
+ {}
+
+ AssertionResult::AssertionResult() {}
+
+ AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data )
+ : m_info( info ),
+ m_resultData( data )
+ {}
+
+ AssertionResult::~AssertionResult() {}
+
+ // Result was a success
+ bool AssertionResult::succeeded() const {
+ return Catch::isOk( m_resultData.resultType );
+ }
+
+ // Result was a success, or failure is suppressed
+ bool AssertionResult::isOk() const {
+ return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition );
+ }
+
+ ResultWas::OfType AssertionResult::getResultType() const {
+ return m_resultData.resultType;
+ }
+
+ bool AssertionResult::hasExpression() const {
+ return m_info.capturedExpression[0] != 0;
+ }
+
+ bool AssertionResult::hasMessage() const {
+ return !m_resultData.message.empty();
+ }
+
+ std::string capturedExpressionWithSecondArgument( char const * capturedExpression, char const * secondArg ) {
+ return (secondArg[0] == 0 || secondArg[0] == '"' && secondArg[1] == '"')
+ ? capturedExpression
+ : std::string(capturedExpression) + ", " + secondArg;
+ }
+
+ std::string AssertionResult::getExpression() const {
+ if( isFalseTest( m_info.resultDisposition ) )
+ return '!' + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg);
+ else
+ return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg);
+ }
+ std::string AssertionResult::getExpressionInMacro() const {
+ if( m_info.macroName[0] == 0 )
+ return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg);
+ else
+ return std::string(m_info.macroName) + "( " + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg) + " )";
+ }
+
+ bool AssertionResult::hasExpandedExpression() const {
+ return hasExpression() && getExpandedExpression() != getExpression();
+ }
+
+ std::string AssertionResult::getExpandedExpression() const {
+ return m_resultData.reconstructExpression();
+ }
+
+ std::string AssertionResult::getMessage() const {
+ return m_resultData.message;
+ }
+ SourceLineInfo AssertionResult::getSourceInfo() const {
+ return m_info.lineInfo;
+ }
+
+ std::string AssertionResult::getTestMacroName() const {
+ return m_info.macroName;
+ }
+
+ void AssertionResult::discardDecomposedExpression() const {
+ m_resultData.decomposedExpression = CATCH_NULL;
+ }
+
+ void AssertionResult::expandDecomposedExpression() const {
+ m_resultData.reconstructExpression();
+ }
+
+} // end namespace Catch
+
+// #included from: catch_test_case_info.hpp
+#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED
+
+#include <cctype>
+
+namespace Catch {
+
+ inline TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) {
+ if( startsWith( tag, '.' ) ||
+ tag == "hide" ||
+ tag == "!hide" )
+ return TestCaseInfo::IsHidden;
+ else if( tag == "!throws" )
+ return TestCaseInfo::Throws;
+ else if( tag == "!shouldfail" )
+ return TestCaseInfo::ShouldFail;
+ else if( tag == "!mayfail" )
+ return TestCaseInfo::MayFail;
+ else if( tag == "!nonportable" )
+ return TestCaseInfo::NonPortable;
+ else
+ return TestCaseInfo::None;
+ }
+ inline bool isReservedTag( std::string const& tag ) {
+ return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( tag[0] );
+ }
+ inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) {
+ if( isReservedTag( tag ) ) {
+ std::ostringstream ss;
+ ss << Colour(Colour::Red)
+ << "Tag name [" << tag << "] not allowed.\n"
+ << "Tag names starting with non alpha-numeric characters are reserved\n"
+ << Colour(Colour::FileName)
+ << _lineInfo << '\n';
+ throw std::runtime_error(ss.str());
+ }
+ }
+
+ TestCase makeTestCase( ITestCase* _testCase,
+ std::string const& _className,
+ std::string const& _name,
+ std::string const& _descOrTags,
+ SourceLineInfo const& _lineInfo )
+ {
+ bool isHidden( startsWith( _name, "./" ) ); // Legacy support
+
+ // Parse out tags
+ std::set<std::string> tags;
+ std::string desc, tag;
+ bool inTag = false;
+ for( std::size_t i = 0; i < _descOrTags.size(); ++i ) {
+ char c = _descOrTags[i];
+ if( !inTag ) {
+ if( c == '[' )
+ inTag = true;
+ else
+ desc += c;
+ }
+ else {
+ if( c == ']' ) {
+ TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag );
+ if( prop == TestCaseInfo::IsHidden )
+ isHidden = true;
+ else if( prop == TestCaseInfo::None )
+ enforceNotReservedTag( tag, _lineInfo );
+
+ tags.insert( tag );
+ tag.clear();
+ inTag = false;
+ }
+ else
+ tag += c;
+ }
+ }
+ if( isHidden ) {
+ tags.insert( "hide" );
+ tags.insert( "." );
+ }
+
+ TestCaseInfo info( _name, _className, desc, tags, _lineInfo );
+ return TestCase( _testCase, info );
+ }
+
+ void setTags( TestCaseInfo& testCaseInfo, std::set<std::string> const& tags )
+ {
+ testCaseInfo.tags = tags;
+ testCaseInfo.lcaseTags.clear();
+
+ std::ostringstream oss;
+ for( std::set<std::string>::const_iterator it = tags.begin(), itEnd = tags.end(); it != itEnd; ++it ) {
+ oss << '[' << *it << ']';
+ std::string lcaseTag = toLower( *it );
+ testCaseInfo.properties = static_cast<TestCaseInfo::SpecialProperties>( testCaseInfo.properties | parseSpecialTag( lcaseTag ) );
+ testCaseInfo.lcaseTags.insert( lcaseTag );
+ }
+ testCaseInfo.tagsAsString = oss.str();
+ }
+
+ TestCaseInfo::TestCaseInfo( std::string const& _name,
+ std::string const& _className,
+ std::string const& _description,
+ std::set<std::string> const& _tags,
+ SourceLineInfo const& _lineInfo )
+ : name( _name ),
+ className( _className ),
+ description( _description ),
+ lineInfo( _lineInfo ),
+ properties( None )
+ {
+ setTags( *this, _tags );
+ }
+
+ TestCaseInfo::TestCaseInfo( TestCaseInfo const& other )
+ : name( other.name ),
+ className( other.className ),
+ description( other.description ),
+ tags( other.tags ),
+ lcaseTags( other.lcaseTags ),
+ tagsAsString( other.tagsAsString ),
+ lineInfo( other.lineInfo ),
+ properties( other.properties )
+ {}
+
+ bool TestCaseInfo::isHidden() const {
+ return ( properties & IsHidden ) != 0;
+ }
+ bool TestCaseInfo::throws() const {
+ return ( properties & Throws ) != 0;
+ }
+ bool TestCaseInfo::okToFail() const {
+ return ( properties & (ShouldFail | MayFail ) ) != 0;
+ }
+ bool TestCaseInfo::expectedToFail() const {
+ return ( properties & (ShouldFail ) ) != 0;
+ }
+
+ TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {}
+
+ TestCase::TestCase( TestCase const& other )
+ : TestCaseInfo( other ),
+ test( other.test )
+ {}
+
+ TestCase TestCase::withName( std::string const& _newName ) const {
+ TestCase other( *this );
+ other.name = _newName;
+ return other;
+ }
+
+ void TestCase::swap( TestCase& other ) {
+ test.swap( other.test );
+ name.swap( other.name );
+ className.swap( other.className );
+ description.swap( other.description );
+ tags.swap( other.tags );
+ lcaseTags.swap( other.lcaseTags );
+ tagsAsString.swap( other.tagsAsString );
+ std::swap( TestCaseInfo::properties, static_cast<TestCaseInfo&>( other ).properties );
+ std::swap( lineInfo, other.lineInfo );
+ }
+
+ void TestCase::invoke() const {
+ test->invoke();
+ }
+
+ bool TestCase::operator == ( TestCase const& other ) const {
+ return test.get() == other.test.get() &&
+ name == other.name &&
+ className == other.className;
+ }
+
+ bool TestCase::operator < ( TestCase const& other ) const {
+ return name < other.name;
+ }
+ TestCase& TestCase::operator = ( TestCase const& other ) {
+ TestCase temp( other );
+ swap( temp );
+ return *this;
+ }
+
+ TestCaseInfo const& TestCase::getTestCaseInfo() const
+ {
+ return *this;
+ }
+
+} // end namespace Catch
+
+// #included from: catch_version.hpp
+#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED
+
+namespace Catch {
+
+ Version::Version
+ ( unsigned int _majorVersion,
+ unsigned int _minorVersion,
+ unsigned int _patchNumber,
+ char const * const _branchName,
+ unsigned int _buildNumber )
+ : majorVersion( _majorVersion ),
+ minorVersion( _minorVersion ),
+ patchNumber( _patchNumber ),
+ branchName( _branchName ),
+ buildNumber( _buildNumber )
+ {}
+
+ std::ostream& operator << ( std::ostream& os, Version const& version ) {
+ os << version.majorVersion << '.'
+ << version.minorVersion << '.'
+ << version.patchNumber;
+ // branchName is never null -> 0th char is \0 if it is empty
+ if (version.branchName[0]) {
+ os << '-' << version.branchName
+ << '.' << version.buildNumber;
+ }
+ return os;
+ }
+
+ inline Version libraryVersion() {
+ static Version version( 1, 9, 6, "", 0 );
+ return version;
+ }
+
+}
+
+// #included from: catch_message.hpp
+#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED
+
+namespace Catch {
+
+ MessageInfo::MessageInfo( std::string const& _macroName,
+ SourceLineInfo const& _lineInfo,
+ ResultWas::OfType _type )
+ : macroName( _macroName ),
+ lineInfo( _lineInfo ),
+ type( _type ),
+ sequence( ++globalCount )
+ {}
+
+ // This may need protecting if threading support is added
+ unsigned int MessageInfo::globalCount = 0;
+
+ ////////////////////////////////////////////////////////////////////////////
+
+ ScopedMessage::ScopedMessage( MessageBuilder const& builder )
+ : m_info( builder.m_info )
+ {
+ m_info.message = builder.m_stream.str();
+ getResultCapture().pushScopedMessage( m_info );
+ }
+ ScopedMessage::ScopedMessage( ScopedMessage const& other )
+ : m_info( other.m_info )
+ {}
+
+ ScopedMessage::~ScopedMessage() {
+ if ( !std::uncaught_exception() ){
+ getResultCapture().popScopedMessage(m_info);
+ }
+ }
+
+} // end namespace Catch
+
+// #included from: catch_legacy_reporter_adapter.hpp
+#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED
+
+// #included from: catch_legacy_reporter_adapter.h
+#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED
+
+namespace Catch
+{
+ // Deprecated
+ struct IReporter : IShared {
+ virtual ~IReporter();
+
+ virtual bool shouldRedirectStdout() const = 0;
+
+ virtual void StartTesting() = 0;
+ virtual void EndTesting( Totals const& totals ) = 0;
+ virtual void StartGroup( std::string const& groupName ) = 0;
+ virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0;
+ virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0;
+ virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0;
+ virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0;
+ virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0;
+ virtual void NoAssertionsInSection( std::string const& sectionName ) = 0;
+ virtual void NoAssertionsInTestCase( std::string const& testName ) = 0;
+ virtual void Aborted() = 0;
+ virtual void Result( AssertionResult const& result ) = 0;
+ };
+
+ class LegacyReporterAdapter : public SharedImpl<IStreamingReporter>
+ {
+ public:
+ LegacyReporterAdapter( Ptr<IReporter> const& legacyReporter );
+ virtual ~LegacyReporterAdapter();
+
+ virtual ReporterPreferences getPreferences() const;
+ virtual void noMatchingTestCases( std::string const& );
+ virtual void testRunStarting( TestRunInfo const& );
+ virtual void testGroupStarting( GroupInfo const& groupInfo );
+ virtual void testCaseStarting( TestCaseInfo const& testInfo );
+ virtual void sectionStarting( SectionInfo const& sectionInfo );
+ virtual void assertionStarting( AssertionInfo const& );
+ virtual bool assertionEnded( AssertionStats const& assertionStats );
+ virtual void sectionEnded( SectionStats const& sectionStats );
+ virtual void testCaseEnded( TestCaseStats const& testCaseStats );
+ virtual void testGroupEnded( TestGroupStats const& testGroupStats );
+ virtual void testRunEnded( TestRunStats const& testRunStats );
+ virtual void skipTest( TestCaseInfo const& );
+
+ private:
+ Ptr<IReporter> m_legacyReporter;
+ };
+}
+
+namespace Catch
+{
+ LegacyReporterAdapter::LegacyReporterAdapter( Ptr<IReporter> const& legacyReporter )
+ : m_legacyReporter( legacyReporter )
+ {}
+ LegacyReporterAdapter::~LegacyReporterAdapter() {}
+
+ ReporterPreferences LegacyReporterAdapter::getPreferences() const {
+ ReporterPreferences prefs;
+ prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout();
+ return prefs;
+ }
+
+ void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {}
+ void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) {
+ m_legacyReporter->StartTesting();
+ }
+ void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) {
+ m_legacyReporter->StartGroup( groupInfo.name );
+ }
+ void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) {
+ m_legacyReporter->StartTestCase( testInfo );
+ }
+ void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) {
+ m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description );
+ }
+ void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) {
+ // Not on legacy interface
+ }
+
+ bool LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) {
+ if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) {
+ for( std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end();
+ it != itEnd;
+ ++it ) {
+ if( it->type == ResultWas::Info ) {
+ ResultBuilder rb( it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal );
+ rb << it->message;
+ rb.setResultType( ResultWas::Info );
+ AssertionResult result = rb.build();
+ m_legacyReporter->Result( result );
+ }
+ }
+ }
+ m_legacyReporter->Result( assertionStats.assertionResult );
+ return true;
+ }
+ void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) {
+ if( sectionStats.missingAssertions )
+ m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name );
+ m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions );
+ }
+ void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) {
+ m_legacyReporter->EndTestCase
+ ( testCaseStats.testInfo,
+ testCaseStats.totals,
+ testCaseStats.stdOut,
+ testCaseStats.stdErr );
+ }
+ void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) {
+ if( testGroupStats.aborting )
+ m_legacyReporter->Aborted();
+ m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals );
+ }
+ void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) {
+ m_legacyReporter->EndTesting( testRunStats.totals );
+ }
+ void LegacyReporterAdapter::skipTest( TestCaseInfo const& ) {
+ }
+}
+
+// #included from: catch_timer.hpp
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wc++11-long-long"
+#endif
+
+#ifdef CATCH_PLATFORM_WINDOWS
+
+#else
+
+#include <sys/time.h>
+
+#endif
+
+namespace Catch {
+
+ namespace {
+#ifdef CATCH_PLATFORM_WINDOWS
+ UInt64 getCurrentTicks() {
+ static UInt64 hz=0, hzo=0;
+ if (!hz) {
+ QueryPerformanceFrequency( reinterpret_cast<LARGE_INTEGER*>( &hz ) );
+ QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER*>( &hzo ) );
+ }
+ UInt64 t;
+ QueryPerformanceCounter( reinterpret_cast<LARGE_INTEGER*>( &t ) );
+ return ((t-hzo)*1000000)/hz;
+ }
+#else
+ UInt64 getCurrentTicks() {
+ timeval t;
+ gettimeofday(&t,CATCH_NULL);
+ return static_cast<UInt64>( t.tv_sec ) * 1000000ull + static_cast<UInt64>( t.tv_usec );
+ }
+#endif
+ }
+
+ void Timer::start() {
+ m_ticks = getCurrentTicks();
+ }
+ unsigned int Timer::getElapsedMicroseconds() const {
+ return static_cast<unsigned int>(getCurrentTicks() - m_ticks);
+ }
+ unsigned int Timer::getElapsedMilliseconds() const {
+ return static_cast<unsigned int>(getElapsedMicroseconds()/1000);
+ }
+ double Timer::getElapsedSeconds() const {
+ return getElapsedMicroseconds()/1000000.0;
+ }
+
+} // namespace Catch
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+// #included from: catch_common.hpp
+#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED
+
+#include <cstring>
+#include <cctype>
+
+namespace Catch {
+
+ bool startsWith( std::string const& s, std::string const& prefix ) {
+ return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin());
+ }
+ bool startsWith( std::string const& s, char prefix ) {
+ return !s.empty() && s[0] == prefix;
+ }
+ bool endsWith( std::string const& s, std::string const& suffix ) {
+ return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin());
+ }
+ bool endsWith( std::string const& s, char suffix ) {
+ return !s.empty() && s[s.size()-1] == suffix;
+ }
+ bool contains( std::string const& s, std::string const& infix ) {
+ return s.find( infix ) != std::string::npos;
+ }
+ char toLowerCh(char c) {
+ return static_cast<char>( std::tolower( c ) );
+ }
+ void toLowerInPlace( std::string& s ) {
+ std::transform( s.begin(), s.end(), s.begin(), toLowerCh );
+ }
+ std::string toLower( std::string const& s ) {
+ std::string lc = s;
+ toLowerInPlace( lc );
+ return lc;
+ }
+ std::string trim( std::string const& str ) {
+ static char const* whitespaceChars = "\n\r\t ";
+ std::string::size_type start = str.find_first_not_of( whitespaceChars );
+ std::string::size_type end = str.find_last_not_of( whitespaceChars );
+
+ return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string();
+ }
+
+ bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) {
+ bool replaced = false;
+ std::size_t i = str.find( replaceThis );
+ while( i != std::string::npos ) {
+ replaced = true;
+ str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() );
+ if( i < str.size()-withThis.size() )
+ i = str.find( replaceThis, i+withThis.size() );
+ else
+ i = std::string::npos;
+ }
+ return replaced;
+ }
+
+ pluralise::pluralise( std::size_t count, std::string const& label )
+ : m_count( count ),
+ m_label( label )
+ {}
+
+ std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) {
+ os << pluraliser.m_count << ' ' << pluraliser.m_label;
+ if( pluraliser.m_count != 1 )
+ os << 's';
+ return os;
+ }
+
+ SourceLineInfo::SourceLineInfo() : file(""), line( 0 ){}
+ SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line )
+ : file( _file ),
+ line( _line )
+ {}
+ bool SourceLineInfo::empty() const {
+ return file[0] == '\0';
+ }
+ bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const {
+ return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0);
+ }
+ bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const {
+ return line < other.line || ( line == other.line && (std::strcmp(file, other.file) < 0));
+ }
+
+ void seedRng( IConfig const& config ) {
+ if( config.rngSeed() != 0 )
+ std::srand( config.rngSeed() );
+ }
+ unsigned int rngSeed() {
+ return getCurrentContext().getConfig()->rngSeed();
+ }
+
+ std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) {
+#ifndef __GNUG__
+ os << info.file << '(' << info.line << ')';
+#else
+ os << info.file << ':' << info.line;
+#endif
+ return os;
+ }
+
+ void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) {
+ std::ostringstream oss;
+ oss << locationInfo << ": Internal Catch error: '" << message << '\'';
+ if( alwaysTrue() )
+ throw std::logic_error( oss.str() );
+ }
+}
+
+// #included from: catch_section.hpp
+#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED
+
+namespace Catch {
+
+ SectionInfo::SectionInfo
+ ( SourceLineInfo const& _lineInfo,
+ std::string const& _name,
+ std::string const& _description )
+ : name( _name ),
+ description( _description ),
+ lineInfo( _lineInfo )
+ {}
+
+ Section::Section( SectionInfo const& info )
+ : m_info( info ),
+ m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) )
+ {
+ m_timer.start();
+ }
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4996) // std::uncaught_exception is deprecated in C++17
+#endif
+ Section::~Section() {
+ if( m_sectionIncluded ) {
+ SectionEndInfo endInfo( m_info, m_assertions, m_timer.getElapsedSeconds() );
+ if( std::uncaught_exception() )
+ getResultCapture().sectionEndedEarly( endInfo );
+ else
+ getResultCapture().sectionEnded( endInfo );
+ }
+ }
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
+
+ // This indicates whether the section should be executed or not
+ Section::operator bool() const {
+ return m_sectionIncluded;
+ }
+
+} // end namespace Catch
+
+// #included from: catch_debugger.hpp
+#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED
+
+#ifdef CATCH_PLATFORM_MAC
+
+ #include <assert.h>
+ #include <stdbool.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+ #include <sys/sysctl.h>
+
+ namespace Catch{
+
+ // The following function is taken directly from the following technical note:
+ // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html
+
+ // Returns true if the current process is being debugged (either
+ // running under the debugger or has a debugger attached post facto).
+ bool isDebuggerActive(){
+
+ int mib[4];
+ struct kinfo_proc info;
+ size_t size;
+
+ // Initialize the flags so that, if sysctl fails for some bizarre
+ // reason, we get a predictable result.
+
+ info.kp_proc.p_flag = 0;
+
+ // Initialize mib, which tells sysctl the info we want, in this case
+ // we're looking for information about a specific process ID.
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PID;
+ mib[3] = getpid();
+
+ // Call sysctl.
+
+ size = sizeof(info);
+ if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, CATCH_NULL, 0) != 0 ) {
+ Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl;
+ return false;
+ }
+
+ // We're being debugged if the P_TRACED flag is set.
+
+ return ( (info.kp_proc.p_flag & P_TRACED) != 0 );
+ }
+ } // namespace Catch
+
+#elif defined(CATCH_PLATFORM_LINUX)
+ #include <fstream>
+ #include <string>
+
+ namespace Catch{
+ // The standard POSIX way of detecting a debugger is to attempt to
+ // ptrace() the process, but this needs to be done from a child and not
+ // this process itself to still allow attaching to this process later
+ // if wanted, so is rather heavy. Under Linux we have the PID of the
+ // "debugger" (which doesn't need to be gdb, of course, it could also
+ // be strace, for example) in /proc/$PID/status, so just get it from
+ // there instead.
+ bool isDebuggerActive(){
+ // Libstdc++ has a bug, where std::ifstream sets errno to 0
+ // This way our users can properly assert over errno values
+ ErrnoGuard guard;
+ std::ifstream in("/proc/self/status");
+ for( std::string line; std::getline(in, line); ) {
+ static const int PREFIX_LEN = 11;
+ if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) {
+ // We're traced if the PID is not 0 and no other PID starts
+ // with 0 digit, so it's enough to check for just a single
+ // character.
+ return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0';
+ }
+ }
+
+ return false;
+ }
+ } // namespace Catch
+#elif defined(_MSC_VER)
+ extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
+ namespace Catch {
+ bool isDebuggerActive() {
+ return IsDebuggerPresent() != 0;
+ }
+ }
+#elif defined(__MINGW32__)
+ extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
+ namespace Catch {
+ bool isDebuggerActive() {
+ return IsDebuggerPresent() != 0;
+ }
+ }
+#else
+ namespace Catch {
+ inline bool isDebuggerActive() { return false; }
+ }
+#endif // Platform
+
+#ifdef CATCH_PLATFORM_WINDOWS
+
+ namespace Catch {
+ void writeToDebugConsole( std::string const& text ) {
+ ::OutputDebugStringA( text.c_str() );
+ }
+ }
+#else
+ namespace Catch {
+ void writeToDebugConsole( std::string const& text ) {
+ // !TBD: Need a version for Mac/ XCode and other IDEs
+ Catch::cout() << text;
+ }
+ }
+#endif // Platform
+
+// #included from: catch_tostring.hpp
+#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED
+
+namespace Catch {
+
+namespace Detail {
+
+ const std::string unprintableString = "{?}";
+
+ namespace {
+ const int hexThreshold = 255;
+
+ struct Endianness {
+ enum Arch { Big, Little };
+
+ static Arch which() {
+ union _{
+ int asInt;
+ char asChar[sizeof (int)];
+ } u;
+
+ u.asInt = 1;
+ return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little;
+ }
+ };
+ }
+
+ std::string rawMemoryToString( const void *object, std::size_t size )
+ {
+ // Reverse order for little endian architectures
+ int i = 0, end = static_cast<int>( size ), inc = 1;
+ if( Endianness::which() == Endianness::Little ) {
+ i = end-1;
+ end = inc = -1;
+ }
+
+ unsigned char const *bytes = static_cast<unsigned char const *>(object);
+ std::ostringstream os;
+ os << "0x" << std::setfill('0') << std::hex;
+ for( ; i != end; i += inc )
+ os << std::setw(2) << static_cast<unsigned>(bytes[i]);
+ return os.str();
+ }
+}
+
+std::string toString( std::string const& value ) {
+ std::string s = value;
+ if( getCurrentContext().getConfig()->showInvisibles() ) {
+ for(size_t i = 0; i < s.size(); ++i ) {
+ std::string subs;
+ switch( s[i] ) {
+ case '\n': subs = "\\n"; break;
+ case '\t': subs = "\\t"; break;
+ default: break;
+ }
+ if( !subs.empty() ) {
+ s = s.substr( 0, i ) + subs + s.substr( i+1 );
+ ++i;
+ }
+ }
+ }
+ return '"' + s + '"';
+}
+std::string toString( std::wstring const& value ) {
+
+ std::string s;
+ s.reserve( value.size() );
+ for(size_t i = 0; i < value.size(); ++i )
+ s += value[i] <= 0xff ? static_cast<char>( value[i] ) : '?';
+ return Catch::toString( s );
+}
+
+std::string toString( const char* const value ) {
+ return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" );
+}
+
+std::string toString( char* const value ) {
+ return Catch::toString( static_cast<const char*>( value ) );
+}
+
+std::string toString( const wchar_t* const value )
+{
+ return value ? Catch::toString( std::wstring(value) ) : std::string( "{null string}" );
+}
+
+std::string toString( wchar_t* const value )
+{
+ return Catch::toString( static_cast<const wchar_t*>( value ) );
+}
+
+std::string toString( int value ) {
+ std::ostringstream oss;
+ oss << value;
+ if( value > Detail::hexThreshold )
+ oss << " (0x" << std::hex << value << ')';
+ return oss.str();
+}
+
+std::string toString( unsigned long value ) {
+ std::ostringstream oss;
+ oss << value;
+ if( value > Detail::hexThreshold )
+ oss << " (0x" << std::hex << value << ')';
+ return oss.str();
+}
+
+std::string toString( unsigned int value ) {
+ return Catch::toString( static_cast<unsigned long>( value ) );
+}
+
+template<typename T>
+std::string fpToString( T value, int precision ) {
+ std::ostringstream oss;
+ oss << std::setprecision( precision )
+ << std::fixed
+ << value;
+ std::string d = oss.str();
+ std::size_t i = d.find_last_not_of( '0' );
+ if( i != std::string::npos && i != d.size()-1 ) {
+ if( d[i] == '.' )
+ i++;
+ d = d.substr( 0, i+1 );
+ }
+ return d;
+}
+
+std::string toString( const double value ) {
+ return fpToString( value, 10 );
+}
+std::string toString( const float value ) {
+ return fpToString( value, 5 ) + 'f';
+}
+
+std::string toString( bool value ) {
+ return value ? "true" : "false";
+}
+
+std::string toString( char value ) {
+ if ( value == '\r' )
+ return "'\\r'";
+ if ( value == '\f' )
+ return "'\\f'";
+ if ( value == '\n' )
+ return "'\\n'";
+ if ( value == '\t' )
+ return "'\\t'";
+ if ( '\0' <= value && value < ' ' )
+ return toString( static_cast<unsigned int>( value ) );
+ char chstr[] = "' '";
+ chstr[1] = value;
+ return chstr;
+}
+
+std::string toString( signed char value ) {
+ return toString( static_cast<char>( value ) );
+}
+
+std::string toString( unsigned char value ) {
+ return toString( static_cast<char>( value ) );
+}
+
+#ifdef CATCH_CONFIG_CPP11_LONG_LONG
+std::string toString( long long value ) {
+ std::ostringstream oss;
+ oss << value;
+ if( value > Detail::hexThreshold )
+ oss << " (0x" << std::hex << value << ')';
+ return oss.str();
+}
+std::string toString( unsigned long long value ) {
+ std::ostringstream oss;
+ oss << value;
+ if( value > Detail::hexThreshold )
+ oss << " (0x" << std::hex << value << ')';
+ return oss.str();
+}
+#endif
+
+#ifdef CATCH_CONFIG_CPP11_NULLPTR
+std::string toString( std::nullptr_t ) {
+ return "nullptr";
+}
+#endif
+
+#ifdef __OBJC__
+ std::string toString( NSString const * const& nsstring ) {
+ if( !nsstring )
+ return "nil";
+ return "@" + toString([nsstring UTF8String]);
+ }
+ std::string toString( NSString * CATCH_ARC_STRONG & nsstring ) {
+ if( !nsstring )
+ return "nil";
+ return "@" + toString([nsstring UTF8String]);
+ }
+ std::string toString( NSObject* const& nsObject ) {
+ return toString( [nsObject description] );
+ }
+#endif
+
+} // end namespace Catch
+
+// #included from: catch_result_builder.hpp
+#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED
+
+namespace Catch {
+
+ ResultBuilder::ResultBuilder( char const* macroName,
+ SourceLineInfo const& lineInfo,
+ char const* capturedExpression,
+ ResultDisposition::Flags resultDisposition,
+ char const* secondArg )
+ : m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition, secondArg ),
+ m_shouldDebugBreak( false ),
+ m_shouldThrow( false ),
+ m_guardException( false )
+ {
+ m_stream().oss.str("");
+ }
+
+ ResultBuilder::~ResultBuilder() {
+#if defined(CATCH_CONFIG_FAST_COMPILE)
+ if ( m_guardException ) {
+ m_stream().oss << "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE";
+ captureResult( ResultWas::ThrewException );
+ getCurrentContext().getResultCapture()->exceptionEarlyReported();
+ }
+#endif
+ }
+
+ ResultBuilder& ResultBuilder::setResultType( ResultWas::OfType result ) {
+ m_data.resultType = result;
+ return *this;
+ }
+ ResultBuilder& ResultBuilder::setResultType( bool result ) {
+ m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed;
+ return *this;
+ }
+
+ void ResultBuilder::endExpression( DecomposedExpression const& expr ) {
+ AssertionResult result = build( expr );
+ handleResult( result );
+ }
+
+ void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) {
+ m_assertionInfo.resultDisposition = resultDisposition;
+ m_stream().oss << Catch::translateActiveException();
+ captureResult( ResultWas::ThrewException );
+ }
+
+ void ResultBuilder::captureResult( ResultWas::OfType resultType ) {
+ setResultType( resultType );
+ captureExpression();
+ }
+
+ void ResultBuilder::captureExpectedException( std::string const& expectedMessage ) {
+ if( expectedMessage.empty() )
+ captureExpectedException( Matchers::Impl::MatchAllOf<std::string>() );
+ else
+ captureExpectedException( Matchers::Equals( expectedMessage ) );
+ }
+
+ void ResultBuilder::captureExpectedException( Matchers::Impl::MatcherBase<std::string> const& matcher ) {
+
+ assert( !isFalseTest( m_assertionInfo.resultDisposition ) );
+ AssertionResultData data = m_data;
+ data.resultType = ResultWas::Ok;
+ data.reconstructedExpression = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg);
+
+ std::string actualMessage = Catch::translateActiveException();
+ if( !matcher.match( actualMessage ) ) {
+ data.resultType = ResultWas::ExpressionFailed;
+ data.reconstructedExpression = actualMessage;
+ }
+ AssertionResult result( m_assertionInfo, data );
+ handleResult( result );
+ }
+
+ void ResultBuilder::captureExpression() {
+ AssertionResult result = build();
+ handleResult( result );
+ }
+
+ void ResultBuilder::handleResult( AssertionResult const& result )
+ {
+ getResultCapture().assertionEnded( result );
+
+ if( !result.isOk() ) {
+ if( getCurrentContext().getConfig()->shouldDebugBreak() )
+ m_shouldDebugBreak = true;
+ if( getCurrentContext().getRunner()->aborting() || (m_assertionInfo.resultDisposition & ResultDisposition::Normal) )
+ m_shouldThrow = true;
+ }
+ }
+
+ void ResultBuilder::react() {
+#if defined(CATCH_CONFIG_FAST_COMPILE)
+ if (m_shouldDebugBreak) {
+ ///////////////////////////////////////////////////////////////////
+ // To inspect the state during test, you need to go one level up the callstack
+ // To go back to the test and change execution, jump over the throw statement
+ ///////////////////////////////////////////////////////////////////
+ CATCH_BREAK_INTO_DEBUGGER();
+ }
+#endif
+ if( m_shouldThrow )
+ throw Catch::TestFailureException();
+ }
+
+ bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; }
+ bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); }
+
+ AssertionResult ResultBuilder::build() const
+ {
+ return build( *this );
+ }
+
+ // CAVEAT: The returned AssertionResult stores a pointer to the argument expr,
+ // a temporary DecomposedExpression, which in turn holds references to
+ // operands, possibly temporary as well.
+ // It should immediately be passed to handleResult; if the expression
+ // needs to be reported, its string expansion must be composed before
+ // the temporaries are destroyed.
+ AssertionResult ResultBuilder::build( DecomposedExpression const& expr ) const
+ {
+ assert( m_data.resultType != ResultWas::Unknown );
+ AssertionResultData data = m_data;
+
+ // Flip bool results if FalseTest flag is set
+ if( isFalseTest( m_assertionInfo.resultDisposition ) ) {
+ data.negate( expr.isBinaryExpression() );
+ }
+
+ data.message = m_stream().oss.str();
+ data.decomposedExpression = &expr; // for lazy reconstruction
+ return AssertionResult( m_assertionInfo, data );
+ }
+
+ void ResultBuilder::reconstructExpression( std::string& dest ) const {
+ dest = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg);
+ }
+
+ void ResultBuilder::setExceptionGuard() {
+ m_guardException = true;
+ }
+ void ResultBuilder::unsetExceptionGuard() {
+ m_guardException = false;
+ }
+
+} // end namespace Catch
+
+// #included from: catch_tag_alias_registry.hpp
+#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED
+
+namespace Catch {
+
+ TagAliasRegistry::~TagAliasRegistry() {}
+
+ Option<TagAlias> TagAliasRegistry::find( std::string const& alias ) const {
+ std::map<std::string, TagAlias>::const_iterator it = m_registry.find( alias );
+ if( it != m_registry.end() )
+ return it->second;
+ else
+ return Option<TagAlias>();
+ }
+
+ std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const {
+ std::string expandedTestSpec = unexpandedTestSpec;
+ for( std::map<std::string, TagAlias>::const_iterator it = m_registry.begin(), itEnd = m_registry.end();
+ it != itEnd;
+ ++it ) {
+ std::size_t pos = expandedTestSpec.find( it->first );
+ if( pos != std::string::npos ) {
+ expandedTestSpec = expandedTestSpec.substr( 0, pos ) +
+ it->second.tag +
+ expandedTestSpec.substr( pos + it->first.size() );
+ }
+ }
+ return expandedTestSpec;
+ }
+
+ void TagAliasRegistry::add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) {
+
+ if( !startsWith( alias, "[@" ) || !endsWith( alias, ']' ) ) {
+ std::ostringstream oss;
+ oss << Colour( Colour::Red )
+ << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n"
+ << Colour( Colour::FileName )
+ << lineInfo << '\n';
+ throw std::domain_error( oss.str().c_str() );
+ }
+ if( !m_registry.insert( std::make_pair( alias, TagAlias( tag, lineInfo ) ) ).second ) {
+ std::ostringstream oss;
+ oss << Colour( Colour::Red )
+ << "error: tag alias, \"" << alias << "\" already registered.\n"
+ << "\tFirst seen at "
+ << Colour( Colour::Red ) << find(alias)->lineInfo << '\n'
+ << Colour( Colour::Red ) << "\tRedefined at "
+ << Colour( Colour::FileName) << lineInfo << '\n';
+ throw std::domain_error( oss.str().c_str() );
+ }
+ }
+
+ ITagAliasRegistry::~ITagAliasRegistry() {}
+
+ ITagAliasRegistry const& ITagAliasRegistry::get() {
+ return getRegistryHub().getTagAliasRegistry();
+ }
+
+ RegistrarForTagAliases::RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ) {
+ getMutableRegistryHub().registerTagAlias( alias, tag, lineInfo );
+ }
+
+} // end namespace Catch
+
+// #included from: catch_matchers_string.hpp
+
+namespace Catch {
+namespace Matchers {
+
+ namespace StdString {
+
+ CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity )
+ : m_caseSensitivity( caseSensitivity ),
+ m_str( adjustString( str ) )
+ {}
+ std::string CasedString::adjustString( std::string const& str ) const {
+ return m_caseSensitivity == CaseSensitive::No
+ ? toLower( str )
+ : str;
+ }
+ std::string CasedString::caseSensitivitySuffix() const {
+ return m_caseSensitivity == CaseSensitive::No
+ ? " (case insensitive)"
+ : std::string();
+ }
+
+ StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator )
+ : m_comparator( comparator ),
+ m_operation( operation ) {
+ }
+
+ std::string StringMatcherBase::describe() const {
+ std::string description;
+ description.reserve(5 + m_operation.size() + m_comparator.m_str.size() +
+ m_comparator.caseSensitivitySuffix().size());
+ description += m_operation;
+ description += ": \"";
+ description += m_comparator.m_str;
+ description += "\"";
+ description += m_comparator.caseSensitivitySuffix();
+ return description;
+ }
+
+ EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( "equals", comparator ) {}
+
+ bool EqualsMatcher::match( std::string const& source ) const {
+ return m_comparator.adjustString( source ) == m_comparator.m_str;
+ }
+
+ ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( "contains", comparator ) {}
+
+ bool ContainsMatcher::match( std::string const& source ) const {
+ return contains( m_comparator.adjustString( source ), m_comparator.m_str );
+ }
+
+ StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "starts with", comparator ) {}
+
+ bool StartsWithMatcher::match( std::string const& source ) const {
+ return startsWith( m_comparator.adjustString( source ), m_comparator.m_str );
+ }
+
+ EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "ends with", comparator ) {}
+
+ bool EndsWithMatcher::match( std::string const& source ) const {
+ return endsWith( m_comparator.adjustString( source ), m_comparator.m_str );
+ }
+
+ } // namespace StdString
+
+ StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) {
+ return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) );
+ }
+ StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) {
+ return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) );
+ }
+ StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) {
+ return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) );
+ }
+ StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) {
+ return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) );
+ }
+
+} // namespace Matchers
+} // namespace Catch
+// #included from: ../reporters/catch_reporter_multi.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_MULTI_HPP_INCLUDED
+
+namespace Catch {
+
+class MultipleReporters : public SharedImpl<IStreamingReporter> {
+ typedef std::vector<Ptr<IStreamingReporter> > Reporters;
+ Reporters m_reporters;
+
+public:
+ void add( Ptr<IStreamingReporter> const& reporter ) {
+ m_reporters.push_back( reporter );
+ }
+
+public: // IStreamingReporter
+
+ virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE {
+ return m_reporters[0]->getPreferences();
+ }
+
+ virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE {
+ for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
+ it != itEnd;
+ ++it )
+ (*it)->noMatchingTestCases( spec );
+ }
+
+ virtual void testRunStarting( TestRunInfo const& testRunInfo ) CATCH_OVERRIDE {
+ for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
+ it != itEnd;
+ ++it )
+ (*it)->testRunStarting( testRunInfo );
+ }
+
+ virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE {
+ for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
+ it != itEnd;
+ ++it )
+ (*it)->testGroupStarting( groupInfo );
+ }
+
+ virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE {
+ for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
+ it != itEnd;
+ ++it )
+ (*it)->testCaseStarting( testInfo );
+ }
+
+ virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE {
+ for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
+ it != itEnd;
+ ++it )
+ (*it)->sectionStarting( sectionInfo );
+ }
+
+ virtual void assertionStarting( AssertionInfo const& assertionInfo ) CATCH_OVERRIDE {
+ for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
+ it != itEnd;
+ ++it )
+ (*it)->assertionStarting( assertionInfo );
+ }
+
+ // The return value indicates if the messages buffer should be cleared:
+ virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE {
+ bool clearBuffer = false;
+ for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
+ it != itEnd;
+ ++it )
+ clearBuffer |= (*it)->assertionEnded( assertionStats );
+ return clearBuffer;
+ }
+
+ virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE {
+ for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
+ it != itEnd;
+ ++it )
+ (*it)->sectionEnded( sectionStats );
+ }
+
+ virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE {
+ for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
+ it != itEnd;
+ ++it )
+ (*it)->testCaseEnded( testCaseStats );
+ }
+
+ virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE {
+ for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
+ it != itEnd;
+ ++it )
+ (*it)->testGroupEnded( testGroupStats );
+ }
+
+ virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE {
+ for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
+ it != itEnd;
+ ++it )
+ (*it)->testRunEnded( testRunStats );
+ }
+
+ virtual void skipTest( TestCaseInfo const& testInfo ) CATCH_OVERRIDE {
+ for( Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
+ it != itEnd;
+ ++it )
+ (*it)->skipTest( testInfo );
+ }
+
+ virtual MultipleReporters* tryAsMulti() CATCH_OVERRIDE {
+ return this;
+ }
+
+};
+
+Ptr<IStreamingReporter> addReporter( Ptr<IStreamingReporter> const& existingReporter, Ptr<IStreamingReporter> const& additionalReporter ) {
+ Ptr<IStreamingReporter> resultingReporter;
+
+ if( existingReporter ) {
+ MultipleReporters* multi = existingReporter->tryAsMulti();
+ if( !multi ) {
+ multi = new MultipleReporters;
+ resultingReporter = Ptr<IStreamingReporter>( multi );
+ if( existingReporter )
+ multi->add( existingReporter );
+ }
+ else
+ resultingReporter = existingReporter;
+ multi->add( additionalReporter );
+ }
+ else
+ resultingReporter = additionalReporter;
+
+ return resultingReporter;
+}
+
+} // end namespace Catch
+
+// #included from: ../reporters/catch_reporter_xml.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED
+
+// #included from: catch_reporter_bases.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED
+
+#include <cstring>
+#include <cfloat>
+#include <cstdio>
+#include <assert.h>
+
+namespace Catch {
+
+ namespace {
+ // Because formatting using c++ streams is stateful, drop down to C is required
+ // Alternatively we could use stringstream, but its performance is... not good.
+ std::string getFormattedDuration( double duration ) {
+ // Max exponent + 1 is required to represent the whole part
+ // + 1 for decimal point
+ // + 3 for the 3 decimal places
+ // + 1 for null terminator
+ const size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1;
+ char buffer[maxDoubleSize];
+
+ // Save previous errno, to prevent sprintf from overwriting it
+ ErrnoGuard guard;
+#ifdef _MSC_VER
+ sprintf_s(buffer, "%.3f", duration);
+#else
+ sprintf(buffer, "%.3f", duration);
+#endif
+ return std::string(buffer);
+ }
+ }
+
+ struct StreamingReporterBase : SharedImpl<IStreamingReporter> {
+
+ StreamingReporterBase( ReporterConfig const& _config )
+ : m_config( _config.fullConfig() ),
+ stream( _config.stream() )
+ {
+ m_reporterPrefs.shouldRedirectStdOut = false;
+ }
+
+ virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE {
+ return m_reporterPrefs;
+ }
+
+ virtual ~StreamingReporterBase() CATCH_OVERRIDE;
+
+ virtual void noMatchingTestCases( std::string const& ) CATCH_OVERRIDE {}
+
+ virtual void testRunStarting( TestRunInfo const& _testRunInfo ) CATCH_OVERRIDE {
+ currentTestRunInfo = _testRunInfo;
+ }
+ virtual void testGroupStarting( GroupInfo const& _groupInfo ) CATCH_OVERRIDE {
+ currentGroupInfo = _groupInfo;
+ }
+
+ virtual void testCaseStarting( TestCaseInfo const& _testInfo ) CATCH_OVERRIDE {
+ currentTestCaseInfo = _testInfo;
+ }
+ virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE {
+ m_sectionStack.push_back( _sectionInfo );
+ }
+
+ virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) CATCH_OVERRIDE {
+ m_sectionStack.pop_back();
+ }
+ virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) CATCH_OVERRIDE {
+ currentTestCaseInfo.reset();
+ }
+ virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) CATCH_OVERRIDE {
+ currentGroupInfo.reset();
+ }
+ virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) CATCH_OVERRIDE {
+ currentTestCaseInfo.reset();
+ currentGroupInfo.reset();
+ currentTestRunInfo.reset();
+ }
+
+ virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {
+ // Don't do anything with this by default.
+ // It can optionally be overridden in the derived class.
+ }
+
+ Ptr<IConfig const> m_config;
+ std::ostream& stream;
+
+ LazyStat<TestRunInfo> currentTestRunInfo;
+ LazyStat<GroupInfo> currentGroupInfo;
+ LazyStat<TestCaseInfo> currentTestCaseInfo;
+
+ std::vector<SectionInfo> m_sectionStack;
+ ReporterPreferences m_reporterPrefs;
+ };
+
+ struct CumulativeReporterBase : SharedImpl<IStreamingReporter> {
+ template<typename T, typename ChildNodeT>
+ struct Node : SharedImpl<> {
+ explicit Node( T const& _value ) : value( _value ) {}
+ virtual ~Node() {}
+
+ typedef std::vector<Ptr<ChildNodeT> > ChildNodes;
+ T value;
+ ChildNodes children;
+ };
+ struct SectionNode : SharedImpl<> {
+ explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {}
+ virtual ~SectionNode();
+
+ bool operator == ( SectionNode const& other ) const {
+ return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo;
+ }
+ bool operator == ( Ptr<SectionNode> const& other ) const {
+ return operator==( *other );
+ }
+
+ SectionStats stats;
+ typedef std::vector<Ptr<SectionNode> > ChildSections;
+ typedef std::vector<AssertionStats> Assertions;
+ ChildSections childSections;
+ Assertions assertions;
+ std::string stdOut;
+ std::string stdErr;
+ };
+
+ struct BySectionInfo {
+ BySectionInfo( SectionInfo const& other ) : m_other( other ) {}
+ BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {}
+ bool operator() ( Ptr<SectionNode> const& node ) const {
+ return node->stats.sectionInfo.lineInfo == m_other.lineInfo;
+ }
+ private:
+ void operator=( BySectionInfo const& );
+ SectionInfo const& m_other;
+ };
+
+ typedef Node<TestCaseStats, SectionNode> TestCaseNode;
+ typedef Node<TestGroupStats, TestCaseNode> TestGroupNode;
+ typedef Node<TestRunStats, TestGroupNode> TestRunNode;
+
+ CumulativeReporterBase( ReporterConfig const& _config )
+ : m_config( _config.fullConfig() ),
+ stream( _config.stream() )
+ {
+ m_reporterPrefs.shouldRedirectStdOut = false;
+ }
+ ~CumulativeReporterBase();
+
+ virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE {
+ return m_reporterPrefs;
+ }
+
+ virtual void testRunStarting( TestRunInfo const& ) CATCH_OVERRIDE {}
+ virtual void testGroupStarting( GroupInfo const& ) CATCH_OVERRIDE {}
+
+ virtual void testCaseStarting( TestCaseInfo const& ) CATCH_OVERRIDE {}
+
+ virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE {
+ SectionStats incompleteStats( sectionInfo, Counts(), 0, false );
+ Ptr<SectionNode> node;
+ if( m_sectionStack.empty() ) {
+ if( !m_rootSection )
+ m_rootSection = new SectionNode( incompleteStats );
+ node = m_rootSection;
+ }
+ else {
+ SectionNode& parentNode = *m_sectionStack.back();
+ SectionNode::ChildSections::const_iterator it =
+ std::find_if( parentNode.childSections.begin(),
+ parentNode.childSections.end(),
+ BySectionInfo( sectionInfo ) );
+ if( it == parentNode.childSections.end() ) {
+ node = new SectionNode( incompleteStats );
+ parentNode.childSections.push_back( node );
+ }
+ else
+ node = *it;
+ }
+ m_sectionStack.push_back( node );
+ m_deepestSection = node;
+ }
+
+ virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {}
+
+ virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE {
+ assert( !m_sectionStack.empty() );
+ SectionNode& sectionNode = *m_sectionStack.back();
+ sectionNode.assertions.push_back( assertionStats );
+ // AssertionResult holds a pointer to a temporary DecomposedExpression,
+ // which getExpandedExpression() calls to build the expression string.
+ // Our section stack copy of the assertionResult will likely outlive the
+ // temporary, so it must be expanded or discarded now to avoid calling
+ // a destroyed object later.
+ prepareExpandedExpression( sectionNode.assertions.back().assertionResult );
+ return true;
+ }
+ virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE {
+ assert( !m_sectionStack.empty() );
+ SectionNode& node = *m_sectionStack.back();
+ node.stats = sectionStats;
+ m_sectionStack.pop_back();
+ }
+ virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE {
+ Ptr<TestCaseNode> node = new TestCaseNode( testCaseStats );
+ assert( m_sectionStack.size() == 0 );
+ node->children.push_back( m_rootSection );
+ m_testCases.push_back( node );
+ m_rootSection.reset();
+
+ assert( m_deepestSection );
+ m_deepestSection->stdOut = testCaseStats.stdOut;
+ m_deepestSection->stdErr = testCaseStats.stdErr;
+ }
+ virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE {
+ Ptr<TestGroupNode> node = new TestGroupNode( testGroupStats );
+ node->children.swap( m_testCases );
+ m_testGroups.push_back( node );
+ }
+ virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE {
+ Ptr<TestRunNode> node = new TestRunNode( testRunStats );
+ node->children.swap( m_testGroups );
+ m_testRuns.push_back( node );
+ testRunEndedCumulative();
+ }
+ virtual void testRunEndedCumulative() = 0;
+
+ virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {}
+
+ virtual void prepareExpandedExpression( AssertionResult& result ) const {
+ if( result.isOk() )
+ result.discardDecomposedExpression();
+ else
+ result.expandDecomposedExpression();
+ }
+
+ Ptr<IConfig const> m_config;
+ std::ostream& stream;
+ std::vector<AssertionStats> m_assertions;
+ std::vector<std::vector<Ptr<SectionNode> > > m_sections;
+ std::vector<Ptr<TestCaseNode> > m_testCases;
+ std::vector<Ptr<TestGroupNode> > m_testGroups;
+
+ std::vector<Ptr<TestRunNode> > m_testRuns;
+
+ Ptr<SectionNode> m_rootSection;
+ Ptr<SectionNode> m_deepestSection;
+ std::vector<Ptr<SectionNode> > m_sectionStack;
+ ReporterPreferences m_reporterPrefs;
+
+ };
+
+ template<char C>
+ char const* getLineOfChars() {
+ static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0};
+ if( !*line ) {
+ std::memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 );
+ line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0;
+ }
+ return line;
+ }
+
+ struct TestEventListenerBase : StreamingReporterBase {
+ TestEventListenerBase( ReporterConfig const& _config )
+ : StreamingReporterBase( _config )
+ {}
+
+ virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {}
+ virtual bool assertionEnded( AssertionStats const& ) CATCH_OVERRIDE {
+ return false;
+ }
+ };
+
+} // end namespace Catch
+
+// #included from: ../internal/catch_reporter_registrars.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED
+
+namespace Catch {
+
+ template<typename T>
+ class LegacyReporterRegistrar {
+
+ class ReporterFactory : public IReporterFactory {
+ virtual IStreamingReporter* create( ReporterConfig const& config ) const {
+ return new LegacyReporterAdapter( new T( config ) );
+ }
+
+ virtual std::string getDescription() const {
+ return T::getDescription();
+ }
+ };
+
+ public:
+
+ LegacyReporterRegistrar( std::string const& name ) {
+ getMutableRegistryHub().registerReporter( name, new ReporterFactory() );
+ }
+ };
+
+ template<typename T>
+ class ReporterRegistrar {
+
+ class ReporterFactory : public SharedImpl<IReporterFactory> {
+
+ // *** Please Note ***:
+ // - If you end up here looking at a compiler error because it's trying to register
+ // your custom reporter class be aware that the native reporter interface has changed
+ // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via
+ // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter.
+ // However please consider updating to the new interface as the old one is now
+ // deprecated and will probably be removed quite soon!
+ // Please contact me via github if you have any questions at all about this.
+ // In fact, ideally, please contact me anyway to let me know you've hit this - as I have
+ // no idea who is actually using custom reporters at all (possibly no-one!).
+ // The new interface is designed to minimise exposure to interface changes in the future.
+ virtual IStreamingReporter* create( ReporterConfig const& config ) const {
+ return new T( config );
+ }
+
+ virtual std::string getDescription() const {
+ return T::getDescription();
+ }
+ };
+
+ public:
+
+ ReporterRegistrar( std::string const& name ) {
+ getMutableRegistryHub().registerReporter( name, new ReporterFactory() );
+ }
+ };
+
+ template<typename T>
+ class ListenerRegistrar {
+
+ class ListenerFactory : public SharedImpl<IReporterFactory> {
+
+ virtual IStreamingReporter* create( ReporterConfig const& config ) const {
+ return new T( config );
+ }
+ virtual std::string getDescription() const {
+ return std::string();
+ }
+ };
+
+ public:
+
+ ListenerRegistrar() {
+ getMutableRegistryHub().registerListener( new ListenerFactory() );
+ }
+ };
+}
+
+#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \
+ namespace{ Catch::LegacyReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); }
+
+#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \
+ namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); }
+
+// Deprecated - use the form without INTERNAL_
+#define INTERNAL_CATCH_REGISTER_LISTENER( listenerType ) \
+ namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; }
+
+#define CATCH_REGISTER_LISTENER( listenerType ) \
+ namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; }
+
+// #included from: ../internal/catch_xmlwriter.hpp
+#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED
+
+#include <sstream>
+#include <string>
+#include <vector>
+#include <iomanip>
+
+namespace Catch {
+
+ class XmlEncode {
+ public:
+ enum ForWhat { ForTextNodes, ForAttributes };
+
+ XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes )
+ : m_str( str ),
+ m_forWhat( forWhat )
+ {}
+
+ void encodeTo( std::ostream& os ) const {
+
+ // Apostrophe escaping not necessary if we always use " to write attributes
+ // (see: http://www.w3.org/TR/xml/#syntax)
+
+ for( std::size_t i = 0; i < m_str.size(); ++ i ) {
+ char c = m_str[i];
+ switch( c ) {
+ case '<': os << "&lt;"; break;
+ case '&': os << "&amp;"; break;
+
+ case '>':
+ // See: http://www.w3.org/TR/xml/#syntax
+ if( i > 2 && m_str[i-1] == ']' && m_str[i-2] == ']' )
+ os << "&gt;";
+ else
+ os << c;
+ break;
+
+ case '\"':
+ if( m_forWhat == ForAttributes )
+ os << "&quot;";
+ else
+ os << c;
+ break;
+
+ default:
+ // Escape control chars - based on contribution by @espenalb in PR #465 and
+ // by @mrpi PR #588
+ if ( ( c >= 0 && c < '\x09' ) || ( c > '\x0D' && c < '\x20') || c=='\x7F' ) {
+ // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0
+ os << "\\x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2)
+ << static_cast<int>( c );
+ }
+ else
+ os << c;
+ }
+ }
+ }
+
+ friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) {
+ xmlEncode.encodeTo( os );
+ return os;
+ }
+
+ private:
+ std::string m_str;
+ ForWhat m_forWhat;
+ };
+
+ class XmlWriter {
+ public:
+
+ class ScopedElement {
+ public:
+ ScopedElement( XmlWriter* writer )
+ : m_writer( writer )
+ {}
+
+ ScopedElement( ScopedElement const& other )
+ : m_writer( other.m_writer ){
+ other.m_writer = CATCH_NULL;
+ }
+
+ ~ScopedElement() {
+ if( m_writer )
+ m_writer->endElement();
+ }
+
+ ScopedElement& writeText( std::string const& text, bool indent = true ) {
+ m_writer->writeText( text, indent );
+ return *this;
+ }
+
+ template<typename T>
+ ScopedElement& writeAttribute( std::string const& name, T const& attribute ) {
+ m_writer->writeAttribute( name, attribute );
+ return *this;
+ }
+
+ private:
+ mutable XmlWriter* m_writer;
+ };
+
+ XmlWriter()
+ : m_tagIsOpen( false ),
+ m_needsNewline( false ),
+ m_os( Catch::cout() )
+ {
+ writeDeclaration();
+ }
+
+ XmlWriter( std::ostream& os )
+ : m_tagIsOpen( false ),
+ m_needsNewline( false ),
+ m_os( os )
+ {
+ writeDeclaration();
+ }
+
+ ~XmlWriter() {
+ while( !m_tags.empty() )
+ endElement();
+ }
+
+ XmlWriter& startElement( std::string const& name ) {
+ ensureTagClosed();
+ newlineIfNecessary();
+ m_os << m_indent << '<' << name;
+ m_tags.push_back( name );
+ m_indent += " ";
+ m_tagIsOpen = true;
+ return *this;
+ }
+
+ ScopedElement scopedElement( std::string const& name ) {
+ ScopedElement scoped( this );
+ startElement( name );
+ return scoped;
+ }
+
+ XmlWriter& endElement() {
+ newlineIfNecessary();
+ m_indent = m_indent.substr( 0, m_indent.size()-2 );
+ if( m_tagIsOpen ) {
+ m_os << "/>";
+ m_tagIsOpen = false;
+ }
+ else {
+ m_os << m_indent << "</" << m_tags.back() << ">";
+ }
+ m_os << std::endl;
+ m_tags.pop_back();
+ return *this;
+ }
+
+ XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) {
+ if( !name.empty() && !attribute.empty() )
+ m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"';
+ return *this;
+ }
+
+ XmlWriter& writeAttribute( std::string const& name, bool attribute ) {
+ m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"';
+ return *this;
+ }
+
+ template<typename T>
+ XmlWriter& writeAttribute( std::string const& name, T const& attribute ) {
+ std::ostringstream oss;
+ oss << attribute;
+ return writeAttribute( name, oss.str() );
+ }
+
+ XmlWriter& writeText( std::string const& text, bool indent = true ) {
+ if( !text.empty() ){
+ bool tagWasOpen = m_tagIsOpen;
+ ensureTagClosed();
+ if( tagWasOpen && indent )
+ m_os << m_indent;
+ m_os << XmlEncode( text );
+ m_needsNewline = true;
+ }
+ return *this;
+ }
+
+ XmlWriter& writeComment( std::string const& text ) {
+ ensureTagClosed();
+ m_os << m_indent << "<!--" << text << "-->";
+ m_needsNewline = true;
+ return *this;
+ }
+
+ void writeStylesheetRef( std::string const& url ) {
+ m_os << "<?xml-stylesheet type=\"text/xsl\" href=\"" << url << "\"?>\n";
+ }
+
+ XmlWriter& writeBlankLine() {
+ ensureTagClosed();
+ m_os << '\n';
+ return *this;
+ }
+
+ void ensureTagClosed() {
+ if( m_tagIsOpen ) {
+ m_os << ">" << std::endl;
+ m_tagIsOpen = false;
+ }
+ }
+
+ private:
+ XmlWriter( XmlWriter const& );
+ void operator=( XmlWriter const& );
+
+ void writeDeclaration() {
+ m_os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ }
+
+ void newlineIfNecessary() {
+ if( m_needsNewline ) {
+ m_os << std::endl;
+ m_needsNewline = false;
+ }
+ }
+
+ bool m_tagIsOpen;
+ bool m_needsNewline;
+ std::vector<std::string> m_tags;
+ std::string m_indent;
+ std::ostream& m_os;
+ };
+
+}
+
+namespace Catch {
+ class XmlReporter : public StreamingReporterBase {
+ public:
+ XmlReporter( ReporterConfig const& _config )
+ : StreamingReporterBase( _config ),
+ m_xml(_config.stream()),
+ m_sectionDepth( 0 )
+ {
+ m_reporterPrefs.shouldRedirectStdOut = true;
+ }
+
+ virtual ~XmlReporter() CATCH_OVERRIDE;
+
+ static std::string getDescription() {
+ return "Reports test results as an XML document";
+ }
+
+ virtual std::string getStylesheetRef() const {
+ return std::string();
+ }
+
+ void writeSourceInfo( SourceLineInfo const& sourceInfo ) {
+ m_xml
+ .writeAttribute( "filename", sourceInfo.file )
+ .writeAttribute( "line", sourceInfo.line );
+ }
+
+ public: // StreamingReporterBase
+
+ virtual void noMatchingTestCases( std::string const& s ) CATCH_OVERRIDE {
+ StreamingReporterBase::noMatchingTestCases( s );
+ }
+
+ virtual void testRunStarting( TestRunInfo const& testInfo ) CATCH_OVERRIDE {
+ StreamingReporterBase::testRunStarting( testInfo );
+ std::string stylesheetRef = getStylesheetRef();
+ if( !stylesheetRef.empty() )
+ m_xml.writeStylesheetRef( stylesheetRef );
+ m_xml.startElement( "Catch" );
+ if( !m_config->name().empty() )
+ m_xml.writeAttribute( "name", m_config->name() );
+ }
+
+ virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE {
+ StreamingReporterBase::testGroupStarting( groupInfo );
+ m_xml.startElement( "Group" )
+ .writeAttribute( "name", groupInfo.name );
+ }
+
+ virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE {
+ StreamingReporterBase::testCaseStarting(testInfo);
+ m_xml.startElement( "TestCase" )
+ .writeAttribute( "name", trim( testInfo.name ) )
+ .writeAttribute( "description", testInfo.description )
+ .writeAttribute( "tags", testInfo.tagsAsString );
+
+ writeSourceInfo( testInfo.lineInfo );
+
+ if ( m_config->showDurations() == ShowDurations::Always )
+ m_testCaseTimer.start();
+ m_xml.ensureTagClosed();
+ }
+
+ virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE {
+ StreamingReporterBase::sectionStarting( sectionInfo );
+ if( m_sectionDepth++ > 0 ) {
+ m_xml.startElement( "Section" )
+ .writeAttribute( "name", trim( sectionInfo.name ) )
+ .writeAttribute( "description", sectionInfo.description );
+ writeSourceInfo( sectionInfo.lineInfo );
+ m_xml.ensureTagClosed();
+ }
+ }
+
+ virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { }
+
+ virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE {
+
+ AssertionResult const& result = assertionStats.assertionResult;
+
+ bool includeResults = m_config->includeSuccessfulResults() || !result.isOk();
+
+ if( includeResults ) {
+ // Print any info messages in <Info> tags.
+ for( std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end();
+ it != itEnd;
+ ++it ) {
+ if( it->type == ResultWas::Info ) {
+ m_xml.scopedElement( "Info" )
+ .writeText( it->message );
+ } else if ( it->type == ResultWas::Warning ) {
+ m_xml.scopedElement( "Warning" )
+ .writeText( it->message );
+ }
+ }
+ }
+
+ // Drop out if result was successful but we're not printing them.
+ if( !includeResults && result.getResultType() != ResultWas::Warning )
+ return true;
+
+ // Print the expression if there is one.
+ if( result.hasExpression() ) {
+ m_xml.startElement( "Expression" )
+ .writeAttribute( "success", result.succeeded() )
+ .writeAttribute( "type", result.getTestMacroName() );
+
+ writeSourceInfo( result.getSourceInfo() );
+
+ m_xml.scopedElement( "Original" )
+ .writeText( result.getExpression() );
+ m_xml.scopedElement( "Expanded" )
+ .writeText( result.getExpandedExpression() );
+ }
+
+ // And... Print a result applicable to each result type.
+ switch( result.getResultType() ) {
+ case ResultWas::ThrewException:
+ m_xml.startElement( "Exception" );
+ writeSourceInfo( result.getSourceInfo() );
+ m_xml.writeText( result.getMessage() );
+ m_xml.endElement();
+ break;
+ case ResultWas::FatalErrorCondition:
+ m_xml.startElement( "FatalErrorCondition" );
+ writeSourceInfo( result.getSourceInfo() );
+ m_xml.writeText( result.getMessage() );
+ m_xml.endElement();
+ break;
+ case ResultWas::Info:
+ m_xml.scopedElement( "Info" )
+ .writeText( result.getMessage() );
+ break;
+ case ResultWas::Warning:
+ // Warning will already have been written
+ break;
+ case ResultWas::ExplicitFailure:
+ m_xml.startElement( "Failure" );
+ writeSourceInfo( result.getSourceInfo() );
+ m_xml.writeText( result.getMessage() );
+ m_xml.endElement();
+ break;
+ default:
+ break;
+ }
+
+ if( result.hasExpression() )
+ m_xml.endElement();
+
+ return true;
+ }
+
+ virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE {
+ StreamingReporterBase::sectionEnded( sectionStats );
+ if( --m_sectionDepth > 0 ) {
+ XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" );
+ e.writeAttribute( "successes", sectionStats.assertions.passed );
+ e.writeAttribute( "failures", sectionStats.assertions.failed );
+ e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk );
+
+ if ( m_config->showDurations() == ShowDurations::Always )
+ e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds );
+
+ m_xml.endElement();
+ }
+ }
+
+ virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE {
+ StreamingReporterBase::testCaseEnded( testCaseStats );
+ XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" );
+ e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() );
+
+ if ( m_config->showDurations() == ShowDurations::Always )
+ e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() );
+
+ if( !testCaseStats.stdOut.empty() )
+ m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), false );
+ if( !testCaseStats.stdErr.empty() )
+ m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), false );
+
+ m_xml.endElement();
+ }
+
+ virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE {
+ StreamingReporterBase::testGroupEnded( testGroupStats );
+ // TODO: Check testGroupStats.aborting and act accordingly.
+ m_xml.scopedElement( "OverallResults" )
+ .writeAttribute( "successes", testGroupStats.totals.assertions.passed )
+ .writeAttribute( "failures", testGroupStats.totals.assertions.failed )
+ .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk );
+ m_xml.endElement();
+ }
+
+ virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE {
+ StreamingReporterBase::testRunEnded( testRunStats );
+ m_xml.scopedElement( "OverallResults" )
+ .writeAttribute( "successes", testRunStats.totals.assertions.passed )
+ .writeAttribute( "failures", testRunStats.totals.assertions.failed )
+ .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk );
+ m_xml.endElement();
+ }
+
+ private:
+ Timer m_testCaseTimer;
+ XmlWriter m_xml;
+ int m_sectionDepth;
+ };
+
+ INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter )
+
+} // end namespace Catch
+
+// #included from: ../reporters/catch_reporter_junit.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED
+
+#include <assert.h>
+
+namespace Catch {
+
+ namespace {
+ std::string getCurrentTimestamp() {
+ // Beware, this is not reentrant because of backward compatibility issues
+ // Also, UTC only, again because of backward compatibility (%z is C++11)
+ time_t rawtime;
+ std::time(&rawtime);
+ const size_t timeStampSize = sizeof("2017-01-16T17:06:45Z");
+
+#ifdef _MSC_VER
+ std::tm timeInfo = {};
+ gmtime_s(&timeInfo, &rawtime);
+#else
+ std::tm* timeInfo;
+ timeInfo = std::gmtime(&rawtime);
+#endif
+
+ char timeStamp[timeStampSize];
+ const char * const fmt = "%Y-%m-%dT%H:%M:%SZ";
+
+#ifdef _MSC_VER
+ std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
+#else
+ std::strftime(timeStamp, timeStampSize, fmt, timeInfo);
+#endif
+ return std::string(timeStamp);
+ }
+
+ }
+
+ class JunitReporter : public CumulativeReporterBase {
+ public:
+ JunitReporter( ReporterConfig const& _config )
+ : CumulativeReporterBase( _config ),
+ xml( _config.stream() ),
+ m_okToFail( false )
+ {
+ m_reporterPrefs.shouldRedirectStdOut = true;
+ }
+
+ virtual ~JunitReporter() CATCH_OVERRIDE;
+
+ static std::string getDescription() {
+ return "Reports test results in an XML format that looks like Ant's junitreport target";
+ }
+
+ virtual void noMatchingTestCases( std::string const& /*spec*/ ) CATCH_OVERRIDE {}
+
+ virtual void testRunStarting( TestRunInfo const& runInfo ) CATCH_OVERRIDE {
+ CumulativeReporterBase::testRunStarting( runInfo );
+ xml.startElement( "testsuites" );
+ }
+
+ virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE {
+ suiteTimer.start();
+ stdOutForSuite.str("");
+ stdErrForSuite.str("");
+ unexpectedExceptions = 0;
+ CumulativeReporterBase::testGroupStarting( groupInfo );
+ }
+
+ virtual void testCaseStarting( TestCaseInfo const& testCaseInfo ) CATCH_OVERRIDE {
+ m_okToFail = testCaseInfo.okToFail();
+ }
+ virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE {
+ if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException && !m_okToFail )
+ unexpectedExceptions++;
+ return CumulativeReporterBase::assertionEnded( assertionStats );
+ }
+
+ virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE {
+ stdOutForSuite << testCaseStats.stdOut;
+ stdErrForSuite << testCaseStats.stdErr;
+ CumulativeReporterBase::testCaseEnded( testCaseStats );
+ }
+
+ virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE {
+ double suiteTime = suiteTimer.getElapsedSeconds();
+ CumulativeReporterBase::testGroupEnded( testGroupStats );
+ writeGroup( *m_testGroups.back(), suiteTime );
+ }
+
+ virtual void testRunEndedCumulative() CATCH_OVERRIDE {
+ xml.endElement();
+ }
+
+ void writeGroup( TestGroupNode const& groupNode, double suiteTime ) {
+ XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" );
+ TestGroupStats const& stats = groupNode.value;
+ xml.writeAttribute( "name", stats.groupInfo.name );
+ xml.writeAttribute( "errors", unexpectedExceptions );
+ xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions );
+ xml.writeAttribute( "tests", stats.totals.assertions.total() );
+ xml.writeAttribute( "hostname", "tbd" ); // !TBD
+ if( m_config->showDurations() == ShowDurations::Never )
+ xml.writeAttribute( "time", "" );
+ else
+ xml.writeAttribute( "time", suiteTime );
+ xml.writeAttribute( "timestamp", getCurrentTimestamp() );
+
+ // Write test cases
+ for( TestGroupNode::ChildNodes::const_iterator
+ it = groupNode.children.begin(), itEnd = groupNode.children.end();
+ it != itEnd;
+ ++it )
+ writeTestCase( **it );
+
+ xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false );
+ xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false );
+ }
+
+ void writeTestCase( TestCaseNode const& testCaseNode ) {
+ TestCaseStats const& stats = testCaseNode.value;
+
+ // All test cases have exactly one section - which represents the
+ // test case itself. That section may have 0-n nested sections
+ assert( testCaseNode.children.size() == 1 );
+ SectionNode const& rootSection = *testCaseNode.children.front();
+
+ std::string className = stats.testInfo.className;
+
+ if( className.empty() ) {
+ if( rootSection.childSections.empty() )
+ className = "global";
+ }
+ writeSection( className, "", rootSection );
+ }
+
+ void writeSection( std::string const& className,
+ std::string const& rootName,
+ SectionNode const& sectionNode ) {
+ std::string name = trim( sectionNode.stats.sectionInfo.name );
+ if( !rootName.empty() )
+ name = rootName + '/' + name;
+
+ if( !sectionNode.assertions.empty() ||
+ !sectionNode.stdOut.empty() ||
+ !sectionNode.stdErr.empty() ) {
+ XmlWriter::ScopedElement e = xml.scopedElement( "testcase" );
+ if( className.empty() ) {
+ xml.writeAttribute( "classname", name );
+ xml.writeAttribute( "name", "root" );
+ }
+ else {
+ xml.writeAttribute( "classname", className );
+ xml.writeAttribute( "name", name );
+ }
+ xml.writeAttribute( "time", Catch::toString( sectionNode.stats.durationInSeconds ) );
+
+ writeAssertions( sectionNode );
+
+ if( !sectionNode.stdOut.empty() )
+ xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false );
+ if( !sectionNode.stdErr.empty() )
+ xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false );
+ }
+ for( SectionNode::ChildSections::const_iterator
+ it = sectionNode.childSections.begin(),
+ itEnd = sectionNode.childSections.end();
+ it != itEnd;
+ ++it )
+ if( className.empty() )
+ writeSection( name, "", **it );
+ else
+ writeSection( className, name, **it );
+ }
+
+ void writeAssertions( SectionNode const& sectionNode ) {
+ for( SectionNode::Assertions::const_iterator
+ it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end();
+ it != itEnd;
+ ++it )
+ writeAssertion( *it );
+ }
+ void writeAssertion( AssertionStats const& stats ) {
+ AssertionResult const& result = stats.assertionResult;
+ if( !result.isOk() ) {
+ std::string elementName;
+ switch( result.getResultType() ) {
+ case ResultWas::ThrewException:
+ case ResultWas::FatalErrorCondition:
+ elementName = "error";
+ break;
+ case ResultWas::ExplicitFailure:
+ elementName = "failure";
+ break;
+ case ResultWas::ExpressionFailed:
+ elementName = "failure";
+ break;
+ case ResultWas::DidntThrowException:
+ elementName = "failure";
+ break;
+
+ // We should never see these here:
+ case ResultWas::Info:
+ case ResultWas::Warning:
+ case ResultWas::Ok:
+ case ResultWas::Unknown:
+ case ResultWas::FailureBit:
+ case ResultWas::Exception:
+ elementName = "internalError";
+ break;
+ }
+
+ XmlWriter::ScopedElement e = xml.scopedElement( elementName );
+
+ xml.writeAttribute( "message", result.getExpandedExpression() );
+ xml.writeAttribute( "type", result.getTestMacroName() );
+
+ std::ostringstream oss;
+ if( !result.getMessage().empty() )
+ oss << result.getMessage() << '\n';
+ for( std::vector<MessageInfo>::const_iterator
+ it = stats.infoMessages.begin(),
+ itEnd = stats.infoMessages.end();
+ it != itEnd;
+ ++it )
+ if( it->type == ResultWas::Info )
+ oss << it->message << '\n';
+
+ oss << "at " << result.getSourceInfo();
+ xml.writeText( oss.str(), false );
+ }
+ }
+
+ XmlWriter xml;
+ Timer suiteTimer;
+ std::ostringstream stdOutForSuite;
+ std::ostringstream stdErrForSuite;
+ unsigned int unexpectedExceptions;
+ bool m_okToFail;
+ };
+
+ INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter )
+
+} // end namespace Catch
+
+// #included from: ../reporters/catch_reporter_console.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED
+
+#include <cfloat>
+#include <cstdio>
+
+namespace Catch {
+
+ struct ConsoleReporter : StreamingReporterBase {
+ ConsoleReporter( ReporterConfig const& _config )
+ : StreamingReporterBase( _config ),
+ m_headerPrinted( false )
+ {}
+
+ virtual ~ConsoleReporter() CATCH_OVERRIDE;
+ static std::string getDescription() {
+ return "Reports test results as plain lines of text";
+ }
+
+ virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE {
+ stream << "No test cases matched '" << spec << '\'' << std::endl;
+ }
+
+ virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {
+ }
+
+ virtual bool assertionEnded( AssertionStats const& _assertionStats ) CATCH_OVERRIDE {
+ AssertionResult const& result = _assertionStats.assertionResult;
+
+ bool includeResults = m_config->includeSuccessfulResults() || !result.isOk();
+
+ // Drop out if result was successful but we're not printing them.
+ if( !includeResults && result.getResultType() != ResultWas::Warning )
+ return false;
+
+ lazyPrint();
+
+ AssertionPrinter printer( stream, _assertionStats, includeResults );
+ printer.print();
+ stream << std::endl;
+ return true;
+ }
+
+ virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE {
+ m_headerPrinted = false;
+ StreamingReporterBase::sectionStarting( _sectionInfo );
+ }
+ virtual void sectionEnded( SectionStats const& _sectionStats ) CATCH_OVERRIDE {
+ if( _sectionStats.missingAssertions ) {
+ lazyPrint();
+ Colour colour( Colour::ResultError );
+ if( m_sectionStack.size() > 1 )
+ stream << "\nNo assertions in section";
+ else
+ stream << "\nNo assertions in test case";
+ stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl;
+ }
+ if( m_config->showDurations() == ShowDurations::Always ) {
+ stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl;
+ }
+ if( m_headerPrinted ) {
+ m_headerPrinted = false;
+ }
+ StreamingReporterBase::sectionEnded( _sectionStats );
+ }
+
+ virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) CATCH_OVERRIDE {
+ StreamingReporterBase::testCaseEnded( _testCaseStats );
+ m_headerPrinted = false;
+ }
+ virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) CATCH_OVERRIDE {
+ if( currentGroupInfo.used ) {
+ printSummaryDivider();
+ stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n";
+ printTotals( _testGroupStats.totals );
+ stream << '\n' << std::endl;
+ }
+ StreamingReporterBase::testGroupEnded( _testGroupStats );
+ }
+ virtual void testRunEnded( TestRunStats const& _testRunStats ) CATCH_OVERRIDE {
+ printTotalsDivider( _testRunStats.totals );
+ printTotals( _testRunStats.totals );
+ stream << std::endl;
+ StreamingReporterBase::testRunEnded( _testRunStats );
+ }
+
+ private:
+
+ class AssertionPrinter {
+ void operator= ( AssertionPrinter const& );
+ public:
+ AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages )
+ : stream( _stream ),
+ stats( _stats ),
+ result( _stats.assertionResult ),
+ colour( Colour::None ),
+ message( result.getMessage() ),
+ messages( _stats.infoMessages ),
+ printInfoMessages( _printInfoMessages )
+ {
+ switch( result.getResultType() ) {
+ case ResultWas::Ok:
+ colour = Colour::Success;
+ passOrFail = "PASSED";
+ //if( result.hasMessage() )
+ if( _stats.infoMessages.size() == 1 )
+ messageLabel = "with message";
+ if( _stats.infoMessages.size() > 1 )
+ messageLabel = "with messages";
+ break;
+ case ResultWas::ExpressionFailed:
+ if( result.isOk() ) {
+ colour = Colour::Success;
+ passOrFail = "FAILED - but was ok";
+ }
+ else {
+ colour = Colour::Error;
+ passOrFail = "FAILED";
+ }
+ if( _stats.infoMessages.size() == 1 )
+ messageLabel = "with message";
+ if( _stats.infoMessages.size() > 1 )
+ messageLabel = "with messages";
+ break;
+ case ResultWas::ThrewException:
+ colour = Colour::Error;
+ passOrFail = "FAILED";
+ messageLabel = "due to unexpected exception with ";
+ if (_stats.infoMessages.size() == 1)
+ messageLabel += "message";
+ if (_stats.infoMessages.size() > 1)
+ messageLabel += "messages";
+ break;
+ case ResultWas::FatalErrorCondition:
+ colour = Colour::Error;
+ passOrFail = "FAILED";
+ messageLabel = "due to a fatal error condition";
+ break;
+ case ResultWas::DidntThrowException:
+ colour = Colour::Error;
+ passOrFail = "FAILED";
+ messageLabel = "because no exception was thrown where one was expected";
+ break;
+ case ResultWas::Info:
+ messageLabel = "info";
+ break;
+ case ResultWas::Warning:
+ messageLabel = "warning";
+ break;
+ case ResultWas::ExplicitFailure:
+ passOrFail = "FAILED";
+ colour = Colour::Error;
+ if( _stats.infoMessages.size() == 1 )
+ messageLabel = "explicitly with message";
+ if( _stats.infoMessages.size() > 1 )
+ messageLabel = "explicitly with messages";
+ break;
+ // These cases are here to prevent compiler warnings
+ case ResultWas::Unknown:
+ case ResultWas::FailureBit:
+ case ResultWas::Exception:
+ passOrFail = "** internal error **";
+ colour = Colour::Error;
+ break;
+ }
+ }
+
+ void print() const {
+ printSourceInfo();
+ if( stats.totals.assertions.total() > 0 ) {
+ if( result.isOk() )
+ stream << '\n';
+ printResultType();
+ printOriginalExpression();
+ printReconstructedExpression();
+ }
+ else {
+ stream << '\n';
+ }
+ printMessage();
+ }
+
+ private:
+ void printResultType() const {
+ if( !passOrFail.empty() ) {
+ Colour colourGuard( colour );
+ stream << passOrFail << ":\n";
+ }
+ }
+ void printOriginalExpression() const {
+ if( result.hasExpression() ) {
+ Colour colourGuard( Colour::OriginalExpression );
+ stream << " ";
+ stream << result.getExpressionInMacro();
+ stream << '\n';
+ }
+ }
+ void printReconstructedExpression() const {
+ if( result.hasExpandedExpression() ) {
+ stream << "with expansion:\n";
+ Colour colourGuard( Colour::ReconstructedExpression );
+ stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << '\n';
+ }
+ }
+ void printMessage() const {
+ if( !messageLabel.empty() )
+ stream << messageLabel << ':' << '\n';
+ for( std::vector<MessageInfo>::const_iterator it = messages.begin(), itEnd = messages.end();
+ it != itEnd;
+ ++it ) {
+ // If this assertion is a warning ignore any INFO messages
+ if( printInfoMessages || it->type != ResultWas::Info )
+ stream << Text( it->message, TextAttributes().setIndent(2) ) << '\n';
+ }
+ }
+ void printSourceInfo() const {
+ Colour colourGuard( Colour::FileName );
+ stream << result.getSourceInfo() << ": ";
+ }
+
+ std::ostream& stream;
+ AssertionStats const& stats;
+ AssertionResult const& result;
+ Colour::Code colour;
+ std::string passOrFail;
+ std::string messageLabel;
+ std::string message;
+ std::vector<MessageInfo> messages;
+ bool printInfoMessages;
+ };
+
+ void lazyPrint() {
+
+ if( !currentTestRunInfo.used )
+ lazyPrintRunInfo();
+ if( !currentGroupInfo.used )
+ lazyPrintGroupInfo();
+
+ if( !m_headerPrinted ) {
+ printTestCaseAndSectionHeader();
+ m_headerPrinted = true;
+ }
+ }
+ void lazyPrintRunInfo() {
+ stream << '\n' << getLineOfChars<'~'>() << '\n';
+ Colour colour( Colour::SecondaryText );
+ stream << currentTestRunInfo->name
+ << " is a Catch v" << libraryVersion() << " host application.\n"
+ << "Run with -? for options\n\n";
+
+ if( m_config->rngSeed() != 0 )
+ stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n";
+
+ currentTestRunInfo.used = true;
+ }
+ void lazyPrintGroupInfo() {
+ if( !currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1 ) {
+ printClosedHeader( "Group: " + currentGroupInfo->name );
+ currentGroupInfo.used = true;
+ }
+ }
+ void printTestCaseAndSectionHeader() {
+ assert( !m_sectionStack.empty() );
+ printOpenHeader( currentTestCaseInfo->name );
+
+ if( m_sectionStack.size() > 1 ) {
+ Colour colourGuard( Colour::Headers );
+
+ std::vector<SectionInfo>::const_iterator
+ it = m_sectionStack.begin()+1, // Skip first section (test case)
+ itEnd = m_sectionStack.end();
+ for( ; it != itEnd; ++it )
+ printHeaderString( it->name, 2 );
+ }
+
+ SourceLineInfo lineInfo = m_sectionStack.back().lineInfo;
+
+ if( !lineInfo.empty() ){
+ stream << getLineOfChars<'-'>() << '\n';
+ Colour colourGuard( Colour::FileName );
+ stream << lineInfo << '\n';
+ }
+ stream << getLineOfChars<'.'>() << '\n' << std::endl;
+ }
+
+ void printClosedHeader( std::string const& _name ) {
+ printOpenHeader( _name );
+ stream << getLineOfChars<'.'>() << '\n';
+ }
+ void printOpenHeader( std::string const& _name ) {
+ stream << getLineOfChars<'-'>() << '\n';
+ {
+ Colour colourGuard( Colour::Headers );
+ printHeaderString( _name );
+ }
+ }
+
+ // if string has a : in first line will set indent to follow it on
+ // subsequent lines
+ void printHeaderString( std::string const& _string, std::size_t indent = 0 ) {
+ std::size_t i = _string.find( ": " );
+ if( i != std::string::npos )
+ i+=2;
+ else
+ i = 0;
+ stream << Text( _string, TextAttributes()
+ .setIndent( indent+i)
+ .setInitialIndent( indent ) ) << '\n';
+ }
+
+ struct SummaryColumn {
+
+ SummaryColumn( std::string const& _label, Colour::Code _colour )
+ : label( _label ),
+ colour( _colour )
+ {}
+ SummaryColumn addRow( std::size_t count ) {
+ std::ostringstream oss;
+ oss << count;
+ std::string row = oss.str();
+ for( std::vector<std::string>::iterator it = rows.begin(); it != rows.end(); ++it ) {
+ while( it->size() < row.size() )
+ *it = ' ' + *it;
+ while( it->size() > row.size() )
+ row = ' ' + row;
+ }
+ rows.push_back( row );
+ return *this;
+ }
+
+ std::string label;
+ Colour::Code colour;
+ std::vector<std::string> rows;
+
+ };
+
+ void printTotals( Totals const& totals ) {
+ if( totals.testCases.total() == 0 ) {
+ stream << Colour( Colour::Warning ) << "No tests ran\n";
+ }
+ else if( totals.assertions.total() > 0 && totals.testCases.allPassed() ) {
+ stream << Colour( Colour::ResultSuccess ) << "All tests passed";
+ stream << " ("
+ << pluralise( totals.assertions.passed, "assertion" ) << " in "
+ << pluralise( totals.testCases.passed, "test case" ) << ')'
+ << '\n';
+ }
+ else {
+
+ std::vector<SummaryColumn> columns;
+ columns.push_back( SummaryColumn( "", Colour::None )
+ .addRow( totals.testCases.total() )
+ .addRow( totals.assertions.total() ) );
+ columns.push_back( SummaryColumn( "passed", Colour::Success )
+ .addRow( totals.testCases.passed )
+ .addRow( totals.assertions.passed ) );
+ columns.push_back( SummaryColumn( "failed", Colour::ResultError )
+ .addRow( totals.testCases.failed )
+ .addRow( totals.assertions.failed ) );
+ columns.push_back( SummaryColumn( "failed as expected", Colour::ResultExpectedFailure )
+ .addRow( totals.testCases.failedButOk )
+ .addRow( totals.assertions.failedButOk ) );
+
+ printSummaryRow( "test cases", columns, 0 );
+ printSummaryRow( "assertions", columns, 1 );
+ }
+ }
+ void printSummaryRow( std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row ) {
+ for( std::vector<SummaryColumn>::const_iterator it = cols.begin(); it != cols.end(); ++it ) {
+ std::string value = it->rows[row];
+ if( it->label.empty() ) {
+ stream << label << ": ";
+ if( value != "0" )
+ stream << value;
+ else
+ stream << Colour( Colour::Warning ) << "- none -";
+ }
+ else if( value != "0" ) {
+ stream << Colour( Colour::LightGrey ) << " | ";
+ stream << Colour( it->colour )
+ << value << ' ' << it->label;
+ }
+ }
+ stream << '\n';
+ }
+
+ static std::size_t makeRatio( std::size_t number, std::size_t total ) {
+ std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number/ total : 0;
+ return ( ratio == 0 && number > 0 ) ? 1 : ratio;
+ }
+ static std::size_t& findMax( std::size_t& i, std::size_t& j, std::size_t& k ) {
+ if( i > j && i > k )
+ return i;
+ else if( j > k )
+ return j;
+ else
+ return k;
+ }
+
+ void printTotalsDivider( Totals const& totals ) {
+ if( totals.testCases.total() > 0 ) {
+ std::size_t failedRatio = makeRatio( totals.testCases.failed, totals.testCases.total() );
+ std::size_t failedButOkRatio = makeRatio( totals.testCases.failedButOk, totals.testCases.total() );
+ std::size_t passedRatio = makeRatio( totals.testCases.passed, totals.testCases.total() );
+ while( failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH-1 )
+ findMax( failedRatio, failedButOkRatio, passedRatio )++;
+ while( failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH-1 )
+ findMax( failedRatio, failedButOkRatio, passedRatio )--;
+
+ stream << Colour( Colour::Error ) << std::string( failedRatio, '=' );
+ stream << Colour( Colour::ResultExpectedFailure ) << std::string( failedButOkRatio, '=' );
+ if( totals.testCases.allPassed() )
+ stream << Colour( Colour::ResultSuccess ) << std::string( passedRatio, '=' );
+ else
+ stream << Colour( Colour::Success ) << std::string( passedRatio, '=' );
+ }
+ else {
+ stream << Colour( Colour::Warning ) << std::string( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' );
+ }
+ stream << '\n';
+ }
+ void printSummaryDivider() {
+ stream << getLineOfChars<'-'>() << '\n';
+ }
+
+ private:
+ bool m_headerPrinted;
+ };
+
+ INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter )
+
+} // end namespace Catch
+
+// #included from: ../reporters/catch_reporter_compact.hpp
+#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED
+
+namespace Catch {
+
+ struct CompactReporter : StreamingReporterBase {
+
+ CompactReporter( ReporterConfig const& _config )
+ : StreamingReporterBase( _config )
+ {}
+
+ virtual ~CompactReporter();
+
+ static std::string getDescription() {
+ return "Reports test results on a single line, suitable for IDEs";
+ }
+
+ virtual ReporterPreferences getPreferences() const {
+ ReporterPreferences prefs;
+ prefs.shouldRedirectStdOut = false;
+ return prefs;
+ }
+
+ virtual void noMatchingTestCases( std::string const& spec ) {
+ stream << "No test cases matched '" << spec << '\'' << std::endl;
+ }
+
+ virtual void assertionStarting( AssertionInfo const& ) {}
+
+ virtual bool assertionEnded( AssertionStats const& _assertionStats ) {
+ AssertionResult const& result = _assertionStats.assertionResult;
+
+ bool printInfoMessages = true;
+
+ // Drop out if result was successful and we're not printing those
+ if( !m_config->includeSuccessfulResults() && result.isOk() ) {
+ if( result.getResultType() != ResultWas::Warning )
+ return false;
+ printInfoMessages = false;
+ }
+
+ AssertionPrinter printer( stream, _assertionStats, printInfoMessages );
+ printer.print();
+
+ stream << std::endl;
+ return true;
+ }
+
+ virtual void sectionEnded(SectionStats const& _sectionStats) CATCH_OVERRIDE {
+ if (m_config->showDurations() == ShowDurations::Always) {
+ stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl;
+ }
+ }
+
+ virtual void testRunEnded( TestRunStats const& _testRunStats ) {
+ printTotals( _testRunStats.totals );
+ stream << '\n' << std::endl;
+ StreamingReporterBase::testRunEnded( _testRunStats );
+ }
+
+ private:
+ class AssertionPrinter {
+ void operator= ( AssertionPrinter const& );
+ public:
+ AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages )
+ : stream( _stream )
+ , stats( _stats )
+ , result( _stats.assertionResult )
+ , messages( _stats.infoMessages )
+ , itMessage( _stats.infoMessages.begin() )
+ , printInfoMessages( _printInfoMessages )
+ {}
+
+ void print() {
+ printSourceInfo();
+
+ itMessage = messages.begin();
+
+ switch( result.getResultType() ) {
+ case ResultWas::Ok:
+ printResultType( Colour::ResultSuccess, passedString() );
+ printOriginalExpression();
+ printReconstructedExpression();
+ if ( ! result.hasExpression() )
+ printRemainingMessages( Colour::None );
+ else
+ printRemainingMessages();
+ break;
+ case ResultWas::ExpressionFailed:
+ if( result.isOk() )
+ printResultType( Colour::ResultSuccess, failedString() + std::string( " - but was ok" ) );
+ else
+ printResultType( Colour::Error, failedString() );
+ printOriginalExpression();
+ printReconstructedExpression();
+ printRemainingMessages();
+ break;
+ case ResultWas::ThrewException:
+ printResultType( Colour::Error, failedString() );
+ printIssue( "unexpected exception with message:" );
+ printMessage();
+ printExpressionWas();
+ printRemainingMessages();
+ break;
+ case ResultWas::FatalErrorCondition:
+ printResultType( Colour::Error, failedString() );
+ printIssue( "fatal error condition with message:" );
+ printMessage();
+ printExpressionWas();
+ printRemainingMessages();
+ break;
+ case ResultWas::DidntThrowException:
+ printResultType( Colour::Error, failedString() );
+ printIssue( "expected exception, got none" );
+ printExpressionWas();
+ printRemainingMessages();
+ break;
+ case ResultWas::Info:
+ printResultType( Colour::None, "info" );
+ printMessage();
+ printRemainingMessages();
+ break;
+ case ResultWas::Warning:
+ printResultType( Colour::None, "warning" );
+ printMessage();
+ printRemainingMessages();
+ break;
+ case ResultWas::ExplicitFailure:
+ printResultType( Colour::Error, failedString() );
+ printIssue( "explicitly" );
+ printRemainingMessages( Colour::None );
+ break;
+ // These cases are here to prevent compiler warnings
+ case ResultWas::Unknown:
+ case ResultWas::FailureBit:
+ case ResultWas::Exception:
+ printResultType( Colour::Error, "** internal error **" );
+ break;
+ }
+ }
+
+ private:
+ // Colour::LightGrey
+
+ static Colour::Code dimColour() { return Colour::FileName; }
+
+#ifdef CATCH_PLATFORM_MAC
+ static const char* failedString() { return "FAILED"; }
+ static const char* passedString() { return "PASSED"; }
+#else
+ static const char* failedString() { return "failed"; }
+ static const char* passedString() { return "passed"; }
+#endif
+
+ void printSourceInfo() const {
+ Colour colourGuard( Colour::FileName );
+ stream << result.getSourceInfo() << ':';
+ }
+
+ void printResultType( Colour::Code colour, std::string const& passOrFail ) const {
+ if( !passOrFail.empty() ) {
+ {
+ Colour colourGuard( colour );
+ stream << ' ' << passOrFail;
+ }
+ stream << ':';
+ }
+ }
+
+ void printIssue( std::string const& issue ) const {
+ stream << ' ' << issue;
+ }
+
+ void printExpressionWas() {
+ if( result.hasExpression() ) {
+ stream << ';';
+ {
+ Colour colour( dimColour() );
+ stream << " expression was:";
+ }
+ printOriginalExpression();
+ }
+ }
+
+ void printOriginalExpression() const {
+ if( result.hasExpression() ) {
+ stream << ' ' << result.getExpression();
+ }
+ }
+
+ void printReconstructedExpression() const {
+ if( result.hasExpandedExpression() ) {
+ {
+ Colour colour( dimColour() );
+ stream << " for: ";
+ }
+ stream << result.getExpandedExpression();
+ }
+ }
+
+ void printMessage() {
+ if ( itMessage != messages.end() ) {
+ stream << " '" << itMessage->message << '\'';
+ ++itMessage;
+ }
+ }
+
+ void printRemainingMessages( Colour::Code colour = dimColour() ) {
+ if ( itMessage == messages.end() )
+ return;
+
+ // using messages.end() directly yields compilation error:
+ std::vector<MessageInfo>::const_iterator itEnd = messages.end();
+ const std::size_t N = static_cast<std::size_t>( std::distance( itMessage, itEnd ) );
+
+ {
+ Colour colourGuard( colour );
+ stream << " with " << pluralise( N, "message" ) << ':';
+ }
+
+ for(; itMessage != itEnd; ) {
+ // If this assertion is a warning ignore any INFO messages
+ if( printInfoMessages || itMessage->type != ResultWas::Info ) {
+ stream << " '" << itMessage->message << '\'';
+ if ( ++itMessage != itEnd ) {
+ Colour colourGuard( dimColour() );
+ stream << " and";
+ }
+ }
+ }
+ }
+
+ private:
+ std::ostream& stream;
+ AssertionStats const& stats;
+ AssertionResult const& result;
+ std::vector<MessageInfo> messages;
+ std::vector<MessageInfo>::const_iterator itMessage;
+ bool printInfoMessages;
+ };
+
+ // Colour, message variants:
+ // - white: No tests ran.
+ // - red: Failed [both/all] N test cases, failed [both/all] M assertions.
+ // - white: Passed [both/all] N test cases (no assertions).
+ // - red: Failed N tests cases, failed M assertions.
+ // - green: Passed [both/all] N tests cases with M assertions.
+
+ std::string bothOrAll( std::size_t count ) const {
+ return count == 1 ? std::string() : count == 2 ? "both " : "all " ;
+ }
+
+ void printTotals( const Totals& totals ) const {
+ if( totals.testCases.total() == 0 ) {
+ stream << "No tests ran.";
+ }
+ else if( totals.testCases.failed == totals.testCases.total() ) {
+ Colour colour( Colour::ResultError );
+ const std::string qualify_assertions_failed =
+ totals.assertions.failed == totals.assertions.total() ?
+ bothOrAll( totals.assertions.failed ) : std::string();
+ stream <<
+ "Failed " << bothOrAll( totals.testCases.failed )
+ << pluralise( totals.testCases.failed, "test case" ) << ", "
+ "failed " << qualify_assertions_failed <<
+ pluralise( totals.assertions.failed, "assertion" ) << '.';
+ }
+ else if( totals.assertions.total() == 0 ) {
+ stream <<
+ "Passed " << bothOrAll( totals.testCases.total() )
+ << pluralise( totals.testCases.total(), "test case" )
+ << " (no assertions).";
+ }
+ else if( totals.assertions.failed ) {
+ Colour colour( Colour::ResultError );
+ stream <<
+ "Failed " << pluralise( totals.testCases.failed, "test case" ) << ", "
+ "failed " << pluralise( totals.assertions.failed, "assertion" ) << '.';
+ }
+ else {
+ Colour colour( Colour::ResultSuccess );
+ stream <<
+ "Passed " << bothOrAll( totals.testCases.passed )
+ << pluralise( totals.testCases.passed, "test case" ) <<
+ " with " << pluralise( totals.assertions.passed, "assertion" ) << '.';
+ }
+ }
+ };
+
+ INTERNAL_CATCH_REGISTER_REPORTER( "compact", CompactReporter )
+
+} // end namespace Catch
+
+namespace Catch {
+ // These are all here to avoid warnings about not having any out of line
+ // virtual methods
+ NonCopyable::~NonCopyable() {}
+ IShared::~IShared() {}
+ IStream::~IStream() CATCH_NOEXCEPT {}
+ FileStream::~FileStream() CATCH_NOEXCEPT {}
+ CoutStream::~CoutStream() CATCH_NOEXCEPT {}
+ DebugOutStream::~DebugOutStream() CATCH_NOEXCEPT {}
+ StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {}
+ IContext::~IContext() {}
+ IResultCapture::~IResultCapture() {}
+ ITestCase::~ITestCase() {}
+ ITestCaseRegistry::~ITestCaseRegistry() {}
+ IRegistryHub::~IRegistryHub() {}
+ IMutableRegistryHub::~IMutableRegistryHub() {}
+ IExceptionTranslator::~IExceptionTranslator() {}
+ IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {}
+ IReporter::~IReporter() {}
+ IReporterFactory::~IReporterFactory() {}
+ IReporterRegistry::~IReporterRegistry() {}
+ IStreamingReporter::~IStreamingReporter() {}
+ AssertionStats::~AssertionStats() {}
+ SectionStats::~SectionStats() {}
+ TestCaseStats::~TestCaseStats() {}
+ TestGroupStats::~TestGroupStats() {}
+ TestRunStats::~TestRunStats() {}
+ CumulativeReporterBase::SectionNode::~SectionNode() {}
+ CumulativeReporterBase::~CumulativeReporterBase() {}
+
+ StreamingReporterBase::~StreamingReporterBase() {}
+ ConsoleReporter::~ConsoleReporter() {}
+ CompactReporter::~CompactReporter() {}
+ IRunner::~IRunner() {}
+ IMutableContext::~IMutableContext() {}
+ IConfig::~IConfig() {}
+ XmlReporter::~XmlReporter() {}
+ JunitReporter::~JunitReporter() {}
+ TestRegistry::~TestRegistry() {}
+ FreeFunctionTestCase::~FreeFunctionTestCase() {}
+ IGeneratorInfo::~IGeneratorInfo() {}
+ IGeneratorsForTest::~IGeneratorsForTest() {}
+ WildcardPattern::~WildcardPattern() {}
+ TestSpec::Pattern::~Pattern() {}
+ TestSpec::NamePattern::~NamePattern() {}
+ TestSpec::TagPattern::~TagPattern() {}
+ TestSpec::ExcludedPattern::~ExcludedPattern() {}
+ Matchers::Impl::MatcherUntypedBase::~MatcherUntypedBase() {}
+
+ void Config::dummy() {}
+
+ namespace TestCaseTracking {
+ ITracker::~ITracker() {}
+ TrackerBase::~TrackerBase() {}
+ SectionTracker::~SectionTracker() {}
+ IndexTracker::~IndexTracker() {}
+ }
+}
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+#endif
+
+#ifdef CATCH_CONFIG_MAIN
+// #included from: internal/catch_default_main.hpp
+#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED
+
+#ifndef __OBJC__
+
+#if defined(WIN32) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN)
+// Standard C/C++ Win32 Unicode wmain entry point
+extern "C" int wmain (int argc, wchar_t * argv[], wchar_t * []) {
+#else
+// Standard C/C++ main entry point
+int main (int argc, char * argv[]) {
+#endif
+
+ int result = Catch::Session().run( argc, argv );
+ return ( result < 0xff ? result : 0xff );
+}
+
+#else // __OBJC__
+
+// Objective-C entry point
+int main (int argc, char * const argv[]) {
+#if !CATCH_ARC_ENABLED
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+#endif
+
+ Catch::registerTestMethods();
+ int result = Catch::Session().run( argc, (char* const*)argv );
+
+#if !CATCH_ARC_ENABLED
+ [pool drain];
+#endif
+
+ return ( result < 0xff ? result : 0xff );
+}
+
+#endif // __OBJC__
+
+#endif
+
+#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED
+# undef CLARA_CONFIG_MAIN
+#endif
+
+//////
+
+// If this config identifier is defined then all CATCH macros are prefixed with CATCH_
+#ifdef CATCH_CONFIG_PREFIX_ALL
+
+#if defined(CATCH_CONFIG_FAST_COMPILE)
+#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, expr )
+#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr )
+#else
+#define CATCH_REQUIRE( expr ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, expr )
+#define CATCH_REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr )
+#endif
+
+#define CATCH_REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", expr )
+#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr )
+#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr )
+#define CATCH_REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, expr )
+
+#define CATCH_CHECK( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK", Catch::ResultDisposition::ContinueOnFailure, expr )
+#define CATCH_CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, expr )
+#define CATCH_CHECKED_IF( expr ) INTERNAL_CATCH_IF( "CATCH_CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, expr )
+#define CATCH_CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( "CATCH_CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, expr )
+#define CATCH_CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( "CATCH_CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, expr )
+
+#define CATCH_CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", expr )
+#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr )
+#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr )
+#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, expr )
+
+#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg )
+
+#if defined(CATCH_CONFIG_FAST_COMPILE)
+#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg )
+#else
+#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg )
+#endif
+
+#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg )
+#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )
+#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg )
+#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << Catch::toString(msg) )
+#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << Catch::toString(msg) )
+
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+ #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
+ #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
+ #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
+ #define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )
+ #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
+ #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ )
+ #define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+ #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#else
+ #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
+ #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description )
+ #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
+ #define CATCH_REGISTER_TEST_CASE( function, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( function, name, description )
+ #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
+ #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, msg )
+ #define CATCH_FAIL_CHECK( msg ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, msg )
+ #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, msg )
+#endif
+#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" )
+
+#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
+#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType )
+
+#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
+
+// "BDD-style" convenience wrappers
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ )
+#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ )
+#else
+#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags )
+#define CATCH_SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags )
+#endif
+#define CATCH_GIVEN( desc ) CATCH_SECTION( std::string( "Given: ") + desc, "" )
+#define CATCH_WHEN( desc ) CATCH_SECTION( std::string( " When: ") + desc, "" )
+#define CATCH_AND_WHEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" )
+#define CATCH_THEN( desc ) CATCH_SECTION( std::string( " Then: ") + desc, "" )
+#define CATCH_AND_THEN( desc ) CATCH_SECTION( std::string( " And: ") + desc, "" )
+
+// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required
+#else
+
+#if defined(CATCH_CONFIG_FAST_COMPILE)
+#define REQUIRE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE", Catch::ResultDisposition::Normal, expr )
+#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST_NO_TRY( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr )
+
+#else
+#define REQUIRE( expr ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, expr )
+#define REQUIRE_FALSE( expr ) INTERNAL_CATCH_TEST( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, expr )
+#endif
+
+#define REQUIRE_THROWS( expr ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", expr )
+#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr )
+#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr )
+#define REQUIRE_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, expr )
+
+#define CHECK( expr ) INTERNAL_CATCH_TEST( "CHECK", Catch::ResultDisposition::ContinueOnFailure, expr )
+#define CHECK_FALSE( expr ) INTERNAL_CATCH_TEST( "CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, expr )
+#define CHECKED_IF( expr ) INTERNAL_CATCH_IF( "CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, expr )
+#define CHECKED_ELSE( expr ) INTERNAL_CATCH_ELSE( "CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, expr )
+#define CHECK_NOFAIL( expr ) INTERNAL_CATCH_TEST( "CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, expr )
+
+#define CHECK_THROWS( expr ) INTERNAL_CATCH_THROWS( "CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", expr )
+#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr )
+#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr )
+#define CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, expr )
+
+#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg )
+
+#if defined(CATCH_CONFIG_FAST_COMPILE)
+#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT_NO_TRY( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg )
+#else
+#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg )
+#endif
+
+#define INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg )
+#define WARN( msg ) INTERNAL_CATCH_MSG( "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )
+#define SCOPED_INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg )
+#define CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << Catch::toString(msg) )
+#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << Catch::toString(msg) )
+
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
+#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
+#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )
+#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
+#define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ )
+#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#else
+#define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
+ #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description )
+ #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
+ #define REGISTER_TEST_CASE( method, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( method, name, description )
+ #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
+ #define FAIL( msg ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, msg )
+ #define FAIL_CHECK( msg ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, msg )
+ #define SUCCEED( msg ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, msg )
+#endif
+#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" )
+
+#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
+#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType )
+
+#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
+
+#endif
+
+#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature )
+
+// "BDD-style" convenience wrappers
+#ifdef CATCH_CONFIG_VARIADIC_MACROS
+#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ )
+#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ )
+#else
+#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags )
+#define SCENARIO_METHOD( className, name, tags ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " name, tags )
+#endif
+#define GIVEN( desc ) SECTION( std::string(" Given: ") + desc, "" )
+#define WHEN( desc ) SECTION( std::string(" When: ") + desc, "" )
+#define AND_WHEN( desc ) SECTION( std::string("And when: ") + desc, "" )
+#define THEN( desc ) SECTION( std::string(" Then: ") + desc, "" )
+#define AND_THEN( desc ) SECTION( std::string(" And: ") + desc, "" )
+
+using Catch::Detail::Approx;
+
+// #included from: internal/catch_reenable_warnings.h
+
+#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED
+
+#ifdef __clang__
+# ifdef __ICC // icpc defines the __clang__ macro
+# pragma warning(pop)
+# else
+# pragma clang diagnostic pop
+# endif
+#elif defined __GNUC__
+# pragma GCC diagnostic pop
+#endif
+
+#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
+
diff --git a/geom_bottleneck/include/diagram_reader.h b/geom_bottleneck/include/diagram_reader.h
index 5bf106d..08d9e2b 100644
--- a/geom_bottleneck/include/diagram_reader.h
+++ b/geom_bottleneck/include/diagram_reader.h
@@ -1,5 +1,4 @@
/*
-
Copyright (c) 2015, M. Kerber, D. Morozov, A. Nigmetov
All rights reserved.
@@ -39,101 +38,159 @@ derivative works thereof, in binary and source code form.
#include <cctype>
namespace hera {
+
+// cannot choose stod, stof or stold based on RealType,
+// lazy solution: partial specialization
+ template<class RealType = double>
+ inline RealType parse_real_from_str(const std::string& s);
+
+ template <>
+ inline double parse_real_from_str<double>(const std::string& s)
+ {
+ return std::stod(s);
+ }
+
+
+ template <>
+ inline long double parse_real_from_str<long double>(const std::string& s)
+ {
+ return std::stold(s);
+ }
+
+
+ template <>
+ inline float parse_real_from_str<float>(const std::string& s)
+ {
+ return std::stof(s);
+ }
+
+
+ template<class RealType>
+ inline RealType parse_real_from_str(const std::string& s)
+ {
+ static_assert(sizeof(RealType) != sizeof(RealType), "Must be specialized for each type you want to use, see above");
+ }
+
// fill in result with points from file fname
// return false if file can't be opened
// or error occurred while reading
// decPrecision is the maximal decimal precision in the input,
// it is zero if all coordinates in the input are integers
-template<class RealType_ = double, class ContType_ = std::vector<std::pair<RealType_, RealType_>>>
-bool readDiagramPointSet(const char* fname, ContType_& result, int& decPrecision)
-{
- size_t lineNumber { 0 };
- result.clear();
- std::ifstream f(fname);
- if (!f.good()) {
+
+ template<class RealType_ = double, class ContType_ = std::vector<std::pair<RealType_, RealType_>>>
+ inline bool readDiagramPointSet(const char* fname, ContType_& result, int& decPrecision)
+ {
+ using RealType = RealType_;
+
+ size_t lineNumber { 0 };
+ result.clear();
+ std::ifstream f(fname);
+ if (!f.good()) {
#ifndef FOR_R_TDA
- std::cerr << "Cannot open file " << fname << std::endl;
+ std::cerr << "Cannot open file " << fname << std::endl;
#endif
- return false;
- }
- std::string line;
- while(std::getline(f, line)) {
- lineNumber++;
- // process comments: remove everything after hash
- auto hashPos = line.find_first_of("#", 0);
- if( std::string::npos != hashPos) {
- line = std::string(line.begin(), line.begin() + hashPos);
- }
- if (line.empty()) {
- continue;
- }
- // trim whitespaces
- auto whiteSpaceFront = std::find_if_not(line.begin(),line.end(),isspace);
- auto whiteSpaceBack = std::find_if_not(line.rbegin(),line.rend(),isspace).base();
- if (whiteSpaceBack <= whiteSpaceFront) {
- // line consists of spaces only - move to the next line
- continue;
+ return false;
}
- line = std::string(whiteSpaceFront,whiteSpaceBack);
- bool fracPart = false;
- int currDecPrecision = 0;
- for(auto c : line) {
- if (c == '.') {
- fracPart = true;
- } else if (fracPart) {
- if (isdigit(c)) {
- currDecPrecision++;
+ std::locale loc;
+ std::string line;
+ while(std::getline(f, line)) {
+ lineNumber++;
+ // process comments: remove everything after hash
+ auto hashPos = line.find_first_of("#", 0);
+ if( std::string::npos != hashPos) {
+ line = std::string(line.begin(), line.begin() + hashPos);
+ }
+ if (line.empty()) {
+ continue;
+ }
+ // trim whitespaces
+ auto whiteSpaceFront = std::find_if_not(line.begin(),line.end(),isspace);
+ auto whiteSpaceBack = std::find_if_not(line.rbegin(),line.rend(),isspace).base();
+ if (whiteSpaceBack <= whiteSpaceFront) {
+ // line consists of spaces only - move to the next line
+ continue;
+ }
+ line = std::string(whiteSpaceFront,whiteSpaceBack);
+
+ // transform line to lower case
+ // to parse Infinity
+ for(auto& c : line) {
+ c = std::tolower(c, loc);
+ }
+
+ bool fracPart = false;
+ int currDecPrecision = 0;
+ for(auto c : line) {
+ if (c == '.') {
+ fracPart = true;
+ } else if (fracPart) {
+ if (isdigit(c)) {
+ currDecPrecision++;
+ } else {
+ fracPart = false;
+ if (currDecPrecision > decPrecision)
+ decPrecision = currDecPrecision;
+ currDecPrecision = 0;
+ }
+ }
+ }
+
+ RealType x, y;
+ std::string str_x, str_y;
+ std::istringstream iss(line);
+ try {
+ iss >> str_x >> str_y;
+
+ x = parse_real_from_str<RealType>(str_x);
+ y = parse_real_from_str<RealType>(str_y);
+
+ if (x != y) {
+ result.push_back(std::make_pair(x, y));
} else {
- fracPart = false;
- if (currDecPrecision > decPrecision)
- decPrecision = currDecPrecision;
- currDecPrecision = 0;
+#ifndef FOR_R_TDA
+ std::cerr << "Warning: point with 0 persistence ignored in " << fname << ":" << lineNumber << "\n";
+#endif
}
}
- }
- RealType_ x, y;
- std::istringstream iss(line);
- if (not(iss >> x >> y)) {
+ catch (const std::invalid_argument& e) {
#ifndef FOR_R_TDA
- std::cerr << "Error in file " << fname << ", line number " << lineNumber << ": cannot parse \"" << line << "\"" << std::endl;
+ std::cerr << "Error in file " << fname << ", line number " << lineNumber << ": cannot parse \"" << line << "\"" << std::endl;
#endif
- return false;
- }
- if ( x != y ) {
- result.push_back(std::make_pair(x,y));
- } else {
-#ifdef VERBOSE_BOTTLENECK
- std::cerr << "Warning: in file " << fname << ", line number " << lineNumber << ", zero persistence point ignored: \"" << line << "\"" << std::endl;
+ return false;
+ }
+ catch (const std::out_of_range&) {
+#ifndef FOR_R_TDA
+ std::cerr << "Error while reading file " << fname << ", line number " << lineNumber << ": value too large in \"" << line << "\"" << std::endl;
#endif
+ return false;
+ }
}
+ f.close();
+ return true;
+ }
+
+ // wrappers
+ template<class RealType_ = double, class ContType_ = std::vector<std::pair<RealType_, RealType_>>>
+ inline bool readDiagramPointSet(const std::string& fname, ContType_& result, int& decPrecision)
+ {
+ return readDiagramPointSet<RealType_, ContType_>(fname.c_str(), result, decPrecision);
+ }
+
+ // these two functions are now just wrappers for the previous ones,
+ // in case someone needs them; decPrecision is ignored
+ template<class RealType_ = double, class ContType_ = std::vector<std::pair<RealType_, RealType_>>>
+ inline bool readDiagramPointSet(const char* fname, ContType_& result)
+ {
+ int decPrecision;
+ return readDiagramPointSet<RealType_, ContType_>(fname, result, decPrecision);
+ }
+
+ template<class RealType_ = double, class ContType_ = std::vector<std::pair<RealType_, RealType_>>>
+ inline bool readDiagramPointSet(const std::string& fname, ContType_& result)
+ {
+ int decPrecision;
+ return readDiagramPointSet<RealType_, ContType_>(fname.c_str(), result, decPrecision);
}
- f.close();
- return true;
-}
-
-
-// wrappers
-template<class RealType_ = double, class ContType_ = std::vector<std::pair<RealType_, RealType_>>>
-bool readDiagramPointSet(const std::string& fname, ContType_& result, int& decPrecision)
-{
- return readDiagramPointSet<RealType_, ContType_>(fname.c_str(), result, decPrecision);
-}
-
-// these two functions are now just wrappers for the previous ones,
-// in case someone needs them; decPrecision is ignored
-template<class RealType_ = double, class ContType_ = std::vector<std::pair<RealType_, RealType_>>>
-bool readDiagramPointSet(const char* fname, ContType_& result)
-{
- int decPrecision;
- return readDiagramPointSet<RealType_, ContType_>(fname, result, decPrecision);
-}
-
-template<class RealType_ = double, class ContType_ = std::vector<std::pair<RealType_, RealType_>>>
-bool readDiagramPointSet(const std::string& fname, ContType_& result)
-{
- int decPrecision;
- return readDiagramPointSet<RealType_, ContType_>(fname.c_str(), result, decPrecision);
-}
} // end namespace hera
#endif // HERA_DIAGRAM_READER_H
diff --git a/geom_bottleneck/include/dnn/local/kd-tree.hpp b/geom_bottleneck/include/dnn/local/kd-tree.hpp
index 249fa55..5b84eb0 100644
--- a/geom_bottleneck/include/dnn/local/kd-tree.hpp
+++ b/geom_bottleneck/include/dnn/local/kd-tree.hpp
@@ -106,11 +106,11 @@ hera::bt::dnn::KDTree<T>::OrderTree
size_t next_i = (i + 1) % traits.dimension();
// Replace with a size condition instead?
- if (b < m - 1)
+ if (m - b > 1)
q.push(KDTreeNode(b, m, im, next_i));
else if (b < m)
tree->parents_[im - 1] = im;
- if (e > m + 2)
+ if (e - m > 2)
q.push(KDTreeNode(m+1, e, im, next_i));
else if (e > m + 1)
tree->parents_[im + 1] = im;
@@ -210,7 +210,7 @@ void hera::bt::dnn::KDTree<T>::search(PointHandle q, ResultsFunctor& rf) const
DistanceType diffToWasserPower = (diff > 0 ? 1.0 : -1.0) * fabs(diff);
size_t lm = m + 1 + (e - (m+1))/2 - tree_.begin();
- if ( subtree_n_elems[lm] > 0 ) {
+ if ( e > m + 1 and subtree_n_elems[lm] > 0 ) {
if (e > m + 1 && diffToWasserPower >= -D) {
nodes.push(KDTreeNode(m+1, e, i));
}
diff --git a/geom_bottleneck/include/neighb_oracle.h b/geom_bottleneck/include/neighb_oracle.h
index c3751b3..91ebc0e 100644
--- a/geom_bottleneck/include/neighb_oracle.h
+++ b/geom_bottleneck/include/neighb_oracle.h
@@ -179,7 +179,7 @@ public:
// store normal items in kd-tree
for(const auto& g : allPoints) {
if (true) {
- kdtreeItems[trueIdx] = dnnItemIdx;
+ kdtreeItems.push_back(dnnItemIdx);
// index of items is id of dnn-point
DnnPoint p(trueIdx);
p[0] = g.getRealX();
diff --git a/geom_bottleneck/tests/data/test_001_A b/geom_bottleneck/tests/data/test_001_A
new file mode 100644
index 0000000..8d04f96
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_001_A
@@ -0,0 +1 @@
+1 2
diff --git a/geom_bottleneck/tests/data/test_001_B b/geom_bottleneck/tests/data/test_001_B
new file mode 100644
index 0000000..9290688
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_001_B
@@ -0,0 +1 @@
+4 6
diff --git a/geom_bottleneck/tests/data/test_002_A b/geom_bottleneck/tests/data/test_002_A
new file mode 100644
index 0000000..8d04f96
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_002_A
@@ -0,0 +1 @@
+1 2
diff --git a/geom_bottleneck/tests/data/test_002_B b/geom_bottleneck/tests/data/test_002_B
new file mode 100644
index 0000000..a4cec9b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_002_B
@@ -0,0 +1 @@
+1.1 2.2
diff --git a/geom_bottleneck/tests/data/test_003_A b/geom_bottleneck/tests/data/test_003_A
new file mode 100644
index 0000000..fdf0acd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_003_A
@@ -0,0 +1,2 @@
+1 2
+2 inf
diff --git a/geom_bottleneck/tests/data/test_003_B b/geom_bottleneck/tests/data/test_003_B
new file mode 100644
index 0000000..ac429f9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_003_B
@@ -0,0 +1,2 @@
+1.1 2.2
+4 inf
diff --git a/geom_bottleneck/tests/data/test_004_A b/geom_bottleneck/tests/data/test_004_A
new file mode 100644
index 0000000..fdf0acd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_004_A
@@ -0,0 +1,2 @@
+1 2
+2 inf
diff --git a/geom_bottleneck/tests/data/test_004_B b/geom_bottleneck/tests/data/test_004_B
new file mode 100644
index 0000000..5769823
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_004_B
@@ -0,0 +1,3 @@
+1.1 2.2
+4 inf
+4 inf
diff --git a/geom_bottleneck/tests/data/test_005_A b/geom_bottleneck/tests/data/test_005_A
new file mode 100644
index 0000000..e28367d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_005_A
@@ -0,0 +1,6 @@
+1 2
+2 inf
+3 inf
+10 inf
+inf 21
+inf 44
diff --git a/geom_bottleneck/tests/data/test_005_B b/geom_bottleneck/tests/data/test_005_B
new file mode 100644
index 0000000..7f6032b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_005_B
@@ -0,0 +1,6 @@
+1.1 2.2
+4 inf
+4 inf
+12 inf
+inf 20
+inf 40
diff --git a/geom_bottleneck/tests/data/test_006_A b/geom_bottleneck/tests/data/test_006_A
new file mode 100644
index 0000000..b5184a5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_006_A
@@ -0,0 +1,7 @@
+1 2
+2 inf
+3 inf
+10 inf
+inf 21
+inf 44
+1 34
diff --git a/geom_bottleneck/tests/data/test_006_B b/geom_bottleneck/tests/data/test_006_B
new file mode 100644
index 0000000..0d07369
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_006_B
@@ -0,0 +1,7 @@
+2 40
+1.1 2.2
+4 inf
+4 inf
+12 inf
+inf 20
+inf 40
diff --git a/geom_bottleneck/tests/data/test_007_A b/geom_bottleneck/tests/data/test_007_A
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_007_A
diff --git a/geom_bottleneck/tests/data/test_007_B b/geom_bottleneck/tests/data/test_007_B
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_007_B
diff --git a/geom_bottleneck/tests/data/test_008_A b/geom_bottleneck/tests/data/test_008_A
new file mode 100644
index 0000000..50b3df6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_008_A
@@ -0,0 +1 @@
+0 1.1
diff --git a/geom_bottleneck/tests/data/test_008_B b/geom_bottleneck/tests/data/test_008_B
new file mode 100644
index 0000000..1935b11
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_008_B
@@ -0,0 +1 @@
+0 0.1
diff --git a/geom_bottleneck/tests/data/test_009_A b/geom_bottleneck/tests/data/test_009_A
new file mode 100644
index 0000000..a1b859e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_009_A
@@ -0,0 +1 @@
+1.1 0
diff --git a/geom_bottleneck/tests/data/test_009_B b/geom_bottleneck/tests/data/test_009_B
new file mode 100644
index 0000000..b5befbc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_009_B
@@ -0,0 +1 @@
+0.1 0
diff --git a/geom_bottleneck/tests/data/test_010_A b/geom_bottleneck/tests/data/test_010_A
new file mode 100644
index 0000000..8d126f0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_010_A
@@ -0,0 +1,100 @@
+7.50638 7.78005
+0.991758 2.12178
+5.18481 6.61702
+6.14703 7.08581
+4.09936 4.83024
+3.79915 4.51283
+3.17645 3.75321
+0.61305 0.998622
+0.445643 1.13781
+6.38205 6.53669
+5.96392 6.44093
+7.21047 7.26005
+0.6703 1.26593
+0.529933 1.7027
+7.92495 8.83023
+2.1382 2.71695
+3.79209 4.5197
+5.23354 5.82214
+-0.395097 2.18831
+3.22028 3.88648
+5.56262 5.79949
+8.39623 9.37185
+2.7452 3.84539
+9.5022 10.2414
+1.01374 1.40504
+3.2029 3.89559
+7.61236 8.28485
+6.4371 6.909
+4.45616 5.35067
+1.57802 1.77895
+6.5991 7.76339
+6.66729 6.71714
+6.11898 6.57121
+2.60663 4.36396
+-0.259613 1.17683
+7.72857 9.48862
+4.68398 5.51521
+4.87447 5.4233
+6.86301 6.88244
+4.17814 4.25886
+8.70558 9.72902
+4.40873 4.57389
+6.1824 7.05049
+7.97557 8.79739
+8.52591 8.6985
+5.15336 5.27796
+9.70144 9.77031
+0.561778 1.39045
+9.32553 10.2456
+7.01495 7.74521
+6.83355 7.28255
+1.96721 3.01504
+5.78411 7.59464
+5.64012 6.10721
+3.7249 5.17086
+4.33297 5.91657
+7.11793 7.2545
+5.109 6.76878
+3.02787 3.04077
+0.999365 2.05566
+8.81392 8.9086
+6.20106 6.78943
+6.7987 7.05794
+0.438805 0.449602
+8.71793 9.79853
+-0.150282 0.51997
+5.72257 5.93156
+5.71098 6.09535
+9.0378 9.45942
+0.534987 0.872885
+7.72276 8.57754
+9.26069 9.40289
+4.148 4.80519
+1.04579 3.18109
+0.259767 0.93215
+0.250608 0.511569
+4.88108 5.62239
+4.6731 5.3348
+7.84979 7.93545
+0.912521 1.48142
+4.82553 5.38108
+6.02179 7.61665
+3.85848 6.39418
+5.10754 6.02118
+1.71956 1.86238
+6.47336 6.74034
+-0.0371018 0.212738
+3.97259 4.15465
+2.17413 3.20188
+4.49098 6.09812
+6.62445 7.84196
+6.57541 7.432
+6.81052 9.6653
+3.67502 4.69734
+3.92378 4.14743
+5.93127 6.46154
+0.63424 0.705454
+7.60129 9.23263
+4.23064 4.74575
+0.397705 1.24458
diff --git a/geom_bottleneck/tests/data/test_010_B b/geom_bottleneck/tests/data/test_010_B
new file mode 100644
index 0000000..852799d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_010_B
@@ -0,0 +1,100 @@
+5.8232 6.36308
+2.16066 2.48668
+2.38754 4.91418
+4.77403 5.43982
+0.291412 1.11147
+3.77337 5.2686
+8.31344 9.05384
+0.734064 1.14844
+7.57606 7.8521
+3.16719 3.86953
+2.55072 2.64932
+9.51707 9.6071
+0.304643 2.41784
+2.79925 3.28234
+5.32901 7.7576
+5.19903 6.30449
+1.87819 2.99454
+8.92272 9.67105
+4.62414 5.05592
+4.0079 4.64148
+2.26369 3.44573
+2.69335 3.13426
+1.90706 2.42652
+2.68113 2.79133
+1.41065 1.56018
+6.55282 7.18725
+5.72986 6.37151
+7.26968 8.22623
+3.32643 3.73606
+3.77325 4.63115
+1.05457 1.83651
+8.6815 8.85251
+3.91285 4.17139
+0.380936 0.842109
+7.33227 7.69334
+8.45635 8.923
+4.1769 5.08373
+0.501374 2.23328
+-0.161782 1.28908
+3.44716 3.4662
+3.15394 4.30243
+8.71416 9.3781
+6.3034 8.62893
+6.53824 7.04611
+0.6386 1.35269
+0.862088 0.960371
+5.12963 5.20203
+1.58695 2.0452
+6.57698 6.63228
+3.87747 4.45669
+1.51273 3.25669
+-0.0992804 0.667302
+4.7489 4.80059
+0.0280559 1.90471
+6.7462 8.27612
+0.915652 1.30007
+2.79556 3.77404
+9.87989 10.0722
+9.39105 9.84229
+7.57235 9.37122
+5.09426 6.44266
+6.3994 6.72037
+5.73441 6.99341
+6.9079 7.88049
+4.2003 4.41933
+-1.72447 2.25877
+9.04907 9.64323
+4.40473 5.3593
+9.31201 9.96079
+7.28343 8.74163
+3.0172 6.23779
+8.08422 8.56069
+6.83038 6.99863
+2.32038 3.1289
+7.42302 8.26286
+6.66905 7.18496
+0.730748 1.61335
+4.00564 5.73993
+2.81231 3.67489
+2.33178 2.37845
+9.03302 9.68681
+0.567816 0.755485
+7.89783 8.7621
+0.177662 0.332833
+-0.181569 1.36821
+6.22158 6.55787
+4.67115 5.16995
+0.806432 0.820738
+7.69636 7.87402
+4.40933 4.54995
+9.1329 9.15037
+8.87416 9.04329
+1.14349 1.8993
+3.29756 4.7172
+6.67873 8.31364
+6.91238 7.1654
+0.483084 1.55006
+2.66058 3.86294
+5.93347 6.06085
+7.40514 9.05071
diff --git a/geom_bottleneck/tests/data/test_011_A b/geom_bottleneck/tests/data/test_011_A
new file mode 100644
index 0000000..164b71d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_011_A
@@ -0,0 +1,200 @@
+0.471299 1.89241
+2.82136 3.97846
+8.81923 9.20678
+1.42474 1.65425
+8.36963 9.16097
+-0.236476 0.692489
+7.57182 8.06148
+2.89878 3.21958
+7.1285 7.51707
+5.75496 7.09461
+6.00081 6.10914
+9.60869 9.64676
+7.42889 8.97174
+7.26061 8.55944
+2.41226 2.5146
+8.5616 9.44847
+7.4946 8.86962
+5.42244 6.98028
+9.62386 9.96039
+7.70591 9.92849
+1.34119 3.2048
+3.92169 5.15228
+8.82955 9.60318
+7.94213 9.39997
+2.6716 4.02057
+0.375206 0.497663
+1.94572 3.65599
+1.03366 1.46356
+8.91855 10.1838
+7.11087 8.64425
+2.63266 2.78706
+8.93611 10.2943
+8.51999 9.28356
+1.31436 3.13725
+1.92871 4.00178
+8.30503 8.45555
+2.58739 2.82076
+3.20419 5.29453
+7.4015 8.13225
+9.07991 9.74729
+0.822366 0.938371
+2.90508 4.29367
+4.32385 5.4787
+3.63054 4.6918
+8.52962 9.87004
+1.16994 2.39465
+2.61903 3.33772
+4.15505 4.52942
+8.7068 9.66579
+8.10373 9.31351
+0.7954 1.23001
+7.82253 8.69505
+4.59616 5.91996
+1.02032 1.93931
+6.98421 8.46017
+8.42263 11.3447
+2.63444 3.7158
+7.49059 9.1137
+-0.122109 1.41074
+8.29578 8.81161
+6.24793 6.32368
+4.07212 4.39695
+5.32453 7.457
+8.3892 9.82048
+4.35981 4.78063
+5.49932 6.08321
+1.0107 1.53369
+2.48759 2.94139
+4.24977 5.52034
+1.93104 3.35207
+-0.733247 1.22412
+-0.354283 2.36812
+6.34728 6.44213
+5.98172 7.8753
+5.47963 6.82986
+6.01986 6.6588
+4.62793 5.22134
+7.73923 8.29761
+8.85565 9.51494
+5.55307 6.15804
+6.30963 7.17248
+9.4775 10.2636
+7.45333 7.74006
+1.79317 2.33273
+7.73056 8.44999
+3.94172 5.02778
+8.36177 9.85172
+5.91765 8.12935
+7.95436 8.97583
+5.06238 5.37907
+4.56153 4.97175
+9.47572 9.65038
+9.54745 9.922
+7.82271 8.66299
+4.19056 4.75156
+4.15657 5.72352
+0.213845 0.312444
+2.30944 2.6806
+2.42391 3.41888
+6.00512 6.88274
+6.64546 7.61145
+-0.204229 2.78228
+-0.417104 0.667252
+8.18696 8.67785
+9.27818 9.67924
+-0.0174685 0.21355
+5.91137 6.39606
+9.49268 10.1457
+2.11362 4.36526
+6.51084 7.82167
+6.07066 6.44843
+-0.653518 1.08588
+7.46736 7.87137
+5.26045 7.92188
+6.4171 6.8133
+6.73709 7.70383
+3.46451 4.23679
+0.122365 0.809853
+7.98627 8.0505
+1.71192 2.63047
+1.20624 2.12087
+4.6812 5.51566
+2.62672 2.67648
+4.203 5.1052
+5.26482 6.5186
+3.68166 3.74701
+2.72011 3.98338
+3.41652 3.71477
+2.26211 2.90374
+0.930209 1.43211
+1.98603 3.36662
+4.55838 5.9933
+5.66292 6.59838
+3.12432 3.87457
+6.54384 8.38959
+0.205059 0.331022
+8.70617 9.34121
+7.02182 7.38679
+2.36908 2.84197
+9.13221 9.76563
+7.50113 9.49245
+8.15671 8.45093
+1.9517 2.20923
+3.23368 3.43695
+2.97273 4.10133
+7.36338 8.96733
+4.77525 5.18347
+9.47774 10.3537
+1.75218 1.97051
+5.42544 6.18939
+9.75801 10.0151
+6.31285 6.38327
+8.43389 8.721
+7.6108 7.81113
+8.72029 10.3153
+5.18655 7.1101
+7.96243 8.43151
+0.798103 0.860125
+1.1289 2.77549
+5.91084 6.03085
+4.95884 5.46913
+5.88125 6.49667
+7.9394 8.9545
+5.07492 5.55063
+5.92251 6.08548
+3.88602 5.41487
+1.40122 2.15276
+8.74244 8.83223
+4.75577 6.60338
+0.921272 1.44873
+3.77361 3.90348
+8.8999 9.8518
+3.11077 4.85674
+8.56185 10.6345
+8.76335 9.00169
+6.8734 8.60197
+4.54408 4.93892
+5.57849 6.31727
+7.95161 8.30843
+1.55798 2.4957
+3.86082 3.97131
+6.45433 7.17065
+0.96021 2.32897
+6.84576 6.89531
+8.59095 8.70199
+3.57754 4.26457
+5.27979 5.74385
+2.06602 2.90525
+3.0856 4.18179
+2.76214 3.9982
+2.11943 5.4285
+3.1197 3.24389
+0.495798 1.23632
+3.18253 3.99433
+7.02072 8.37949
+2.77905 3.42643
+1.57093 2.30655
+7.10979 7.14006
+6.20994 6.72092
+8.15136 8.33899
diff --git a/geom_bottleneck/tests/data/test_011_B b/geom_bottleneck/tests/data/test_011_B
new file mode 100644
index 0000000..761943d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_011_B
@@ -0,0 +1,200 @@
+1.17434 1.46837
+2.58198 4.16589
+0.234041 0.968658
+1.52703 1.59579
+6.7103 7.44033
+3.19227 4.41539
+5.42556 5.57369
+3.45417 4.86089
+3.82256 4.1092
+7.82551 7.90784
+3.9384 4.71796
+5.60335 5.9054
+7.96663 9.8987
+6.30305 6.64853
+7.33246 10.5316
+0.623312 1.09008
+2.63041 2.64616
+5.36028 6.28956
+4.64202 5.91858
+7.55219 7.96304
+7.73736 9.18221
+1.67114 1.84851
+5.07514 5.12159
+7.03732 7.05228
+7.5006 7.59212
+0.244947 1.55875
+0.0170454 1.10485
+1.95394 3.53669
+5.66015 6.01949
+5.88211 7.64639
+7.46698 9.27085
+6.37429 7.10154
+4.54535 4.81932
+8.21203 9.35896
+4.89933 6.20802
+3.68683 4.17831
+0.477467 0.828394
+6.17871 6.77834
+9.77523 9.92676
+0.854808 2.38709
+7.93326 8.3553
+2.10917 2.27771
+4.07045 4.72793
+8.2016 8.8011
+2.9205 3.95746
+2.89806 4.39725
+5.5654 5.78669
+9.5219 9.98543
+7.08591 7.19588
+8.35359 9.57893
+9.81348 10.0345
+8.5994 9.71835
+5.43903 7.25234
+1.82768 2.92724
+4.44952 6.79754
+5.66747 7.34386
+5.88153 6.39253
+3.34008 4.22032
+2.46068 2.76051
+0.370778 2.61681
+6.02508 6.26809
+4.32654 4.93262
+7.41536 7.99616
+8.84229 9.87911
+3.8551 5.84353
+1.56832 2.34694
+6.96099 7.42028
+8.15753 8.72014
+9.23141 10.3815
+7.4484 7.80228
+0.473671 0.874895
+3.15689 3.50687
+3.58122 4.09945
+3.55022 3.74767
+4.42708 5.80211
+4.40956 4.68699
+3.80576 4.61856
+7.29965 8.28614
+7.40582 8.15308
+1.69789 1.77669
+1.66419 3.44308
+0.473997 0.872506
+7.83959 8.52898
+6.22416 6.36949
+-0.187159 0.871822
+0.232336 0.585965
+9.29905 9.44357
+1.4459 2.40589
+2.83008 3.19758
+1.15291 2.12112
+2.58686 3.33896
+6.79362 7.88068
+0.228178 1.48318
+5.60001 6.20258
+4.97803 7.10992
+1.70429 1.962
+2.72659 3.13886
+9.22714 9.25889
+3.84694 3.88778
+-0.282077 1.48155
+9.28756 9.58517
+4.34069 5.59751
+8.63909 8.76839
+8.86236 10.7642
+6.77597 8.41888
+7.30621 8.64164
+0.685607 1.22755
+2.91514 3.22638
+2.72098 3.66837
+8.17528 8.32638
+5.19632 5.7506
+7.34177 8.70639
+5.74082 6.35524
+5.95975 6.69284
+9.40187 10.4488
+2.92761 3.36735
+0.399531 3.13082
+4.83399 4.92635
+7.74539 8.56852
+1.76322 3.5086
+6.54479 6.72963
+7.64362 8.12404
+1.35542 1.45313
+0.214385 0.718085
+1.7006 3.21962
+5.91009 6.47862
+2.21093 2.34636
+5.96919 6.79365
+6.59951 8.22203
+1.54571 1.59397
+3.27012 3.79128
+0.32455 0.622995
+1.73926 2.78017
+9.81035 9.84077
+7.38441 7.85171
+8.90372 9.34186
+7.26323 8.41174
+5.7363 5.97348
+8.25473 10.1281
+2.3981 2.52096
+8.53783 9.63442
+8.51755 9.2735
+6.48614 6.773
+3.40182 3.65137
+2.1353 3.04852
+2.95397 3.73285
+6.98063 7.4963
+4.50189 5.26384
+0.21416 1.49363
+0.632196 1.36307
+6.57833 6.60481
+8.0634 9.33903
+2.79759 2.94462
+4.43747 4.58861
+6.48733 6.86569
+2.28008 3.47037
+6.87452 7.77431
+-0.156821 2.71557
+0.72595 1.78862
+1.97586 2.38196
+8.61839 9.1468
+4.55496 5.68986
+0.26923 1.15728
+9.63757 9.7236
+1.39497 1.96698
+4.8643 5.04172
+6.64675 7.66435
+2.56256 2.6015
+-0.381989 0.611211
+0.676336 1.26896
+8.95304 9.03243
+5.62058 6.07997
+3.36522 4.04276
+8.64868 10.5024
+4.75813 5.19834
+1.96608 2.05864
+9.01449 9.10397
+3.72786 4.51921
+5.6938 6.96584
+1.73499 2.9314
+2.73099 3.41409
+8.77171 9.07665
+4.63865 4.67649
+8.6698 9.30782
+-0.168259 2.09581
+9.29672 9.56
+0.372544 2.60567
+0.450487 1.32919
+6.95341 7.6399
+3.4403 5.24993
+5.53469 6.97831
+-0.79664 1.21306
+5.68831 6.14413
+8.85601 8.95444
+3.83309 5.211
+5.51573 6.5114
+3.64009 3.99648
+4.40759 4.99283
+1.85198 2.6457
+2.72645 3.74803
diff --git a/geom_bottleneck/tests/data/test_012_A b/geom_bottleneck/tests/data/test_012_A
new file mode 100644
index 0000000..094c6e0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_012_A
@@ -0,0 +1,5000 @@
+0.471299 1.89241
+2.82136 3.97846
+8.81923 9.20678
+1.42474 1.65425
+8.36963 9.16097
+-0.236476 0.692489
+7.57182 8.06148
+2.89878 3.21958
+7.1285 7.51707
+5.75496 7.09461
+6.00081 6.10914
+9.60869 9.64676
+7.42889 8.97174
+7.26061 8.55944
+2.41226 2.5146
+8.5616 9.44847
+7.4946 8.86962
+5.42244 6.98028
+9.62386 9.96039
+7.70591 9.92849
+1.34119 3.2048
+3.92169 5.15228
+8.82955 9.60318
+7.94213 9.39997
+2.6716 4.02057
+0.375206 0.497663
+1.94572 3.65599
+1.03366 1.46356
+8.91855 10.1838
+7.11087 8.64425
+2.63266 2.78706
+8.93611 10.2943
+8.51999 9.28356
+1.31436 3.13725
+1.92871 4.00178
+8.30503 8.45555
+2.58739 2.82076
+3.20419 5.29453
+7.4015 8.13225
+9.07991 9.74729
+0.822366 0.938371
+2.90508 4.29367
+4.32385 5.4787
+3.63054 4.6918
+8.52962 9.87004
+1.16994 2.39465
+2.61903 3.33772
+4.15505 4.52942
+8.7068 9.66579
+8.10373 9.31351
+0.7954 1.23001
+7.82253 8.69505
+4.59616 5.91996
+1.02032 1.93931
+6.98421 8.46017
+8.42263 11.3447
+2.63444 3.7158
+7.49059 9.1137
+-0.122109 1.41074
+8.29578 8.81161
+6.24793 6.32368
+4.07212 4.39695
+5.32453 7.457
+8.3892 9.82048
+4.35981 4.78063
+5.49932 6.08321
+1.0107 1.53369
+2.48759 2.94139
+4.24977 5.52034
+1.93104 3.35207
+-0.733247 1.22412
+-0.354283 2.36812
+6.34728 6.44213
+5.98172 7.8753
+5.47963 6.82986
+6.01986 6.6588
+4.62793 5.22134
+7.73923 8.29761
+8.85565 9.51494
+5.55307 6.15804
+6.30963 7.17248
+9.4775 10.2636
+7.45333 7.74006
+1.79317 2.33273
+7.73056 8.44999
+3.94172 5.02778
+8.36177 9.85172
+5.91765 8.12935
+7.95436 8.97583
+5.06238 5.37907
+4.56153 4.97175
+9.47572 9.65038
+9.54745 9.922
+7.82271 8.66299
+4.19056 4.75156
+4.15657 5.72352
+0.213845 0.312444
+2.30944 2.6806
+2.42391 3.41888
+6.00512 6.88274
+6.64546 7.61145
+-0.204229 2.78228
+-0.417104 0.667252
+8.18696 8.67785
+9.27818 9.67924
+-0.0174685 0.21355
+5.91137 6.39606
+9.49268 10.1457
+2.11362 4.36526
+6.51084 7.82167
+6.07066 6.44843
+-0.653518 1.08588
+7.46736 7.87137
+5.26045 7.92188
+6.4171 6.8133
+6.73709 7.70383
+3.46451 4.23679
+0.122365 0.809853
+7.98627 8.0505
+1.71192 2.63047
+1.20624 2.12087
+4.6812 5.51566
+2.62672 2.67648
+4.203 5.1052
+5.26482 6.5186
+3.68166 3.74701
+2.72011 3.98338
+3.41652 3.71477
+2.26211 2.90374
+0.930209 1.43211
+1.98603 3.36662
+4.55838 5.9933
+5.66292 6.59838
+3.12432 3.87457
+6.54384 8.38959
+0.205059 0.331022
+8.70617 9.34121
+7.02182 7.38679
+2.36908 2.84197
+9.13221 9.76563
+7.50113 9.49245
+8.15671 8.45093
+1.9517 2.20923
+3.23368 3.43695
+2.97273 4.10133
+7.36338 8.96733
+4.77525 5.18347
+9.47774 10.3537
+1.75218 1.97051
+5.42544 6.18939
+9.75801 10.0151
+6.31285 6.38327
+8.43389 8.721
+7.6108 7.81113
+8.72029 10.3153
+5.18655 7.1101
+7.96243 8.43151
+0.798103 0.860125
+1.1289 2.77549
+5.91084 6.03085
+4.95884 5.46913
+5.88125 6.49667
+7.9394 8.9545
+5.07492 5.55063
+5.92251 6.08548
+3.88602 5.41487
+1.40122 2.15276
+8.74244 8.83223
+4.75577 6.60338
+0.921272 1.44873
+3.77361 3.90348
+8.8999 9.8518
+3.11077 4.85674
+8.56185 10.6345
+8.76335 9.00169
+6.8734 8.60197
+4.54408 4.93892
+5.57849 6.31727
+7.95161 8.30843
+1.55798 2.4957
+3.86082 3.97131
+6.45433 7.17065
+0.96021 2.32897
+6.84576 6.89531
+8.59095 8.70199
+3.57754 4.26457
+5.27979 5.74385
+2.06602 2.90525
+3.0856 4.18179
+2.76214 3.9982
+2.11943 5.4285
+3.1197 3.24389
+0.495798 1.23632
+3.18253 3.99433
+7.02072 8.37949
+2.77905 3.42643
+1.57093 2.30655
+7.10979 7.14006
+6.20994 6.72092
+8.15136 8.33899
+0.903753 1.57921
+0.380744 1.88053
+1.3164 1.79885
+0.199366 0.576639
+5.53683 6.49433
+8.8705 9.14396
+3.1401 3.98761
+4.82675 6.69396
+7.28593 8.08916
+8.11312 9.92914
+3.25737 3.42109
+2.58413 4.57223
+2.65202 2.77196
+-0.31616 1.51568
+4.1621 5.29563
+4.49155 5.21037
+7.28481 7.31722
+9.70568 10.0406
+2.39057 2.85874
+2.30626 3.16244
+1.15896 2.09616
+5.91343 7.33024
+-0.172181 0.177363
+5.08934 6.10928
+7.15508 7.55315
+4.43036 4.68093
+6.00772 6.49566
+7.9247 8.43809
+1.57028 2.52328
+3.45458 4.43692
+3.18257 4.83824
+1.48243 1.91225
+2.59025 2.99596
+6.93059 8.34359
+4.53752 7.51216
+6.42857 6.51513
+5.5663 6.13877
+7.54367 7.56485
+9.01229 9.19913
+2.84158 3.23347
+0.42959 0.620618
+8.77033 9.33787
+8.06103 8.30989
+6.48425 7.83668
+4.66949 6.00205
+4.46683 4.66247
+8.96738 9.07714
+0.463093 0.514808
+7.72986 9.44537
+6.31391 6.8289
+0.883295 1.70946
+3.73278 3.98015
+6.73453 6.92514
+3.58434 4.43262
+0.236286 1.4601
+2.00505 2.38684
+3.845 4.20708
+1.18852 3.04911
+0.766784 1.00641
+7.38781 8.11216
+8.9396 9.27589
+0.369822 1.53322
+8.76527 9.23987
+0.663408 0.803445
+9.69209 10.1455
+9.73379 10.234
+3.47602 4.89968
+4.12754 5.45249
+7.31984 8.57369
+0.989101 1.47678
+5.57662 5.83292
+4.99092 6.85044
+4.35272 4.3683
+0.0517815 1.92227
+7.2694 7.80634
+1.35565 1.42783
+8.5638 8.91707
+1.74557 2.74123
+2.18226 2.19664
+-0.901334 1.32691
+0.866613 1.03788
+5.30895 6.31774
+7.70178 8.5675
+4.06894 4.16071
+2.59697 3.53162
+4.30201 5.34212
+4.08762 4.19091
+-0.516192 0.848397
+9.85911 10.1066
+0.472991 1.40069
+6.26012 7.0054
+0.707801 2.15445
+1.73825 1.87193
+0.206301 0.831746
+7.77872 7.92715
+4.94477 5.60361
+3.86216 5.16839
+1.35166 1.54482
+2.91721 3.56193
+4.57242 4.75913
+7.09303 8.29678
+8.18431 8.92151
+6.80303 10.87
+1.29208 1.72027
+1.22224 1.31693
+5.26756 6.26459
+2.55221 3.94397
+6.58902 6.78354
+7.85917 8.89791
+6.59279 7.63115
+4.45787 7.26828
+3.48759 5.33991
+2.13838 3.86589
+1.53368 3.57313
+1.41722 3.19336
+3.48388 4.11958
+1.53756 2.98451
+7.29083 8.22109
+1.2713 2.16915
+6.94685 7.31029
+6.2494 7.04676
+3.00376 3.02028
+1.25232 1.43301
+1.50413 2.25
+2.89098 4.77198
+4.50766 5.89294
+5.5403 6.07893
+-0.101858 0.409209
+3.87963 6.1053
+-0.19564 1.46589
+-0.342077 0.694623
+6.63875 7.42223
+7.89982 9.05857
+4.91121 5.48031
+5.90743 8.35815
+7.13881 8.21597
+4.11493 5.08147
+3.59673 3.77176
+8.08236 8.3237
+1.35842 1.48934
+5.42963 5.85906
+4.60778 4.9734
+-0.607198 0.91225
+5.40263 5.7017
+5.08624 5.63236
+7.34529 9.02233
+7.30013 8.12907
+6.56106 6.75585
+6.82576 7.25434
+2.96037 3.56454
+3.60283 4.09137
+6.35408 6.71888
+-0.688103 0.84579
+8.45128 8.69771
+6.31749 7.3294
+5.82223 6.04761
+1.72983 2.38205
+6.94974 7.76985
+9.681 10.0141
+8.65394 9.2456
+2.52904 3.39548
+6.66609 7.35785
+4.18963 4.5473
+3.58643 3.80513
+2.88796 3.82413
+0.992066 1.1477
+4.57942 5.15419
+3.02826 4.32268
+5.91565 6.82087
+4.13694 5.13393
+6.28717 6.53257
+1.3149 2.36944
+0.488974 0.981461
+4.32763 4.98272
+-0.420836 0.63619
+7.13406 7.31362
+0.367782 1.91138
+6.14763 6.16713
+0.837933 1.92794
+9.3781 10.0609
+3.22887 5.44584
+5.91554 6.65974
+5.68608 6.02435
+7.99715 8.55953
+5.37106 5.38574
+0.254544 0.374268
+0.184701 0.917061
+9.38005 9.54042
+6.86741 7.35628
+0.87398 1.69093
+7.75845 8.53773
+0.370425 1.35335
+0.699837 0.810893
+3.73223 4.32089
+3.81804 3.85752
+4.85936 5.10097
+2.70381 3.10519
+3.82523 5.27699
+9.13422 10.3317
+4.62775 4.77988
+7.91139 7.95504
+2.72614 4.79958
+0.863357 1.88643
+4.14155 5.02327
+2.49683 4.11585
+1.06741 1.11516
+6.20979 8.38443
+0.936362 2.46703
+6.58231 7.85063
+1.89469 2.31422
+8.70668 9.14006
+5.76486 6.1122
+3.15778 3.76679
+0.248282 2.19881
+1.25317 1.92694
+7.81837 9.53067
+-0.582906 0.818904
+8.34194 8.37845
+4.4913 5.10164
+3.86376 5.5453
+6.94054 7.68699
+2.07462 2.5811
+0.518698 2.1529
+3.51773 4.60946
+8.39915 8.98446
+1.63685 2.19755
+6.60737 9.05917
+2.06667 3.23994
+3.18822 3.31219
+2.44332 3.22088
+4.755 4.87118
+4.34245 4.91565
+4.64562 4.8104
+2.73282 3.35646
+9.48057 9.86441
+0.640899 1.03356
+0.789475 0.925731
+1.4247 1.58347
+1.47747 2.25408
+8.8612 9.81597
+8.44147 10.6885
+9.07046 10.0877
+0.350125 1.15765
+4.45375 5.73964
+4.06526 4.26457
+7.50776 8.23491
+1.55452 1.63786
+2.8399 4.52559
+1.34319 1.47951
+5.21572 5.65702
+5.85695 6.75574
+8.21826 10.657
+-0.0479956 1.79162
+1.72905 1.78113
+3.35685 4.03797
+3.7123 5.82296
+8.56751 10.2992
+4.07987 4.25273
+5.8347 6.07253
+3.25283 3.99065
+9.31995 10.3647
+0.649025 1.14496
+1.06966 2.04182
+7.59831 7.85826
+3.35263 3.84374
+4.91371 5.10148
+8.0875 9.23421
+3.00484 5.14282
+8.60448 9.09442
+5.61429 6.24037
+3.4729 4.17907
+7.18702 7.26274
+0.729966 0.928899
+2.27264 2.81241
+2.67248 3.91661
+3.98443 4.64406
+5.50463 6.92435
+-0.257961 0.905736
+5.71363 6.67387
+4.12643 4.66467
+3.97623 4.64917
+9.71227 9.8243
+8.66674 8.97634
+7.94673 8.73904
+7.45228 8.14466
+3.78405 4.81189
+4.05505 5.00011
+2.84957 3.15451
+6.93785 7.58172
+1.85006 1.96814
+6.82256 7.00166
+2.42727 2.68161
+8.06129 8.76308
+1.53758 3.67482
+2.5057 4.18495
+7.09618 7.79664
+1.12843 1.46228
+1.61447 2.2668
+5.58639 5.70776
+8.15398 8.34959
+2.49733 2.57643
+5.18817 5.32462
+5.62963 5.86377
+1.95215 2.26641
+7.22129 7.23255
+5.99833 6.18639
+6.20875 7.13868
+6.814 7.6597
+7.41314 9.49798
+5.48819 6.31634
+4.81318 5.08156
+9.15434 9.42787
+4.83201 5.43295
+1.44477 2.6455
+8.8907 10.4727
+3.19487 3.21255
+1.47291 3.13113
+4.14796 5.10058
+5.85016 8.41212
+7.58183 8.53659
+9.5978 10.2877
+1.5954 2.58394
+2.65561 4.0975
+-0.157024 0.16627
+7.04379 7.75368
+2.39896 2.7728
+2.42376 3.58085
+0.158653 0.857045
+7.82101 9.01833
+6.80499 7.35261
+6.62833 6.66255
+4.90229 5.45681
+8.50205 8.69236
+2.01845 2.06924
+8.2503 9.04222
+4.58265 5.52758
+8.6176 9.74887
+1.28468 1.77019
+5.40424 6.20705
+0.943905 1.98023
+4.2702 4.41287
+3.89454 4.4814
+0.585132 1.56351
+9.45354 10.5374
+3.7501 5.07553
+7.53248 8.14004
+4.60026 4.78921
+1.61073 4.22368
+6.22591 7.40966
+0.57866 1.0522
+5.877 6.55882
+3.54573 3.7731
+7.64294 7.66103
+8.2399 9.14032
+0.307808 0.571367
+7.89791 9.25734
+5.2852 5.84332
+0.45713 2.42223
+7.73426 8.48158
+8.0058 9.46405
+8.03189 8.41868
+1.54624 1.98914
+7.24167 7.27699
+8.61226 8.83199
+5.38365 6.52599
+0.827018 1.51428
+7.19285 7.48372
+-0.0969552 2.16007
+4.08084 6.32563
+9.16026 10.2604
+0.206147 0.717435
+4.00643 4.8093
+2.16139 3.14759
+1.73359 3.13485
+9.1103 9.36052
+7.05621 7.43901
+4.83509 6.07581
+5.67164 7.89488
+7.93353 8.18454
+2.59566 3.1842
+3.62521 4.95121
+3.0297 3.18649
+1.08515 2.69289
+3.77063 5.7789
+0.106035 1.27409
+0.601099 2.13481
+6.98837 7.58833
+9.22955 9.79149
+1.6398 1.78726
+2.30423 3.34814
+2.3912 2.81842
+4.71724 6.16966
+5.13553 5.5016
+5.34117 5.45075
+9.32776 10.0676
+4.54244 5.29058
+4.01337 5.73188
+8.17427 8.39652
+1.96122 2.6921
+0.594267 1.00176
+-0.136973 0.977133
+6.41362 6.78056
+1.68388 2.39891
+9.50795 10.2315
+-0.262703 1.15557
+8.72229 9.683
+5.41821 5.67519
+4.93514 7.15867
+4.07046 4.26702
+-0.00866106 0.252353
+8.65877 10.1527
+2.10958 3.40353
+2.94947 3.43201
+6.32014 7.06279
+2.55034 2.89646
+3.87777 5.68044
+2.05325 3.00968
+5.11855 6.55784
+8.99618 9.22608
+3.36303 3.84902
+2.6234 3.70832
+7.35189 8.30856
+6.43777 7.28495
+5.33954 5.48055
+0.15999 0.391114
+3.4492 5.07088
+2.38503 2.42742
+3.88912 4.93246
+2.76303 4.54991
+6.56261 7.60381
+3.64198 3.72471
+1.70542 1.78806
+9.71115 9.88315
+0.471586 1.82377
+9.27611 10.5725
+0.486889 0.851587
+4.39234 5.10637
+9.54209 9.8955
+6.99602 7.42461
+2.98797 3.74623
+5.89424 6.4498
+9.63845 9.86333
+4.39828 5.18646
+2.30118 3.5758
+8.68128 9.56011
+9.00505 10.4304
+-0.22184 0.233296
+6.48492 7.60283
+1.54156 2.60693
+4.06808 6.39369
+5.52361 6.26241
+-0.698727 0.745524
+2.30742 2.41924
+0.655833 1.65752
+6.94733 7.81866
+7.83136 9.10651
+6.45284 7.1931
+6.09683 6.66159
+9.03299 9.4163
+1.86392 3.26189
+0.54863 2.07194
+0.364026 1.38376
+0.706954 1.0736
+-0.111015 0.584367
+1.54265 2.1413
+0.501172 0.57928
+2.09411 2.28902
+1.89894 4.09104
+8.72895 8.87045
+5.27709 5.72545
+0.164581 1.64188
+8.39203 8.73608
+8.21523 8.45002
+9.62006 10.1665
+4.79076 6.26442
+3.44189 3.68669
+8.93789 9.38343
+7.07036 7.64194
+8.34396 9.56445
+8.29992 8.64954
+5.82566 7.83287
+2.43008 3.4476
+1.81121 2.12203
+4.36108 4.3842
+6.28756 6.95939
+3.8698 5.79519
+0.644581 0.699162
+9.71982 10.2422
+4.86545 5.00544
+8.3808 9.29356
+1.34495 1.40972
+1.03641 2.01838
+8.55609 9.99958
+1.40813 3.46097
+3.20928 4.08838
+8.24345 9.11587
+1.27604 2.03462
+8.28298 8.46252
+2.20644 3.19585
+1.91396 2.30108
+4.2553 5.66006
+7.34925 8.38275
+6.28319 7.22199
+8.42171 9.62596
+1.12059 1.18262
+1.37555 1.84196
+4.39663 4.93639
+9.28044 9.58437
+5.47407 6.88593
+8.36529 8.49813
+9.40208 10.5922
+-0.451389 1.92404
+2.89431 3.19453
+6.51433 8.02158
+5.52163 6.06786
+7.63525 9.86457
+4.13898 5.05845
+0.136662 0.503748
+6.13492 6.74997
+8.37416 9.18971
+8.64164 8.82663
+0.941173 1.16158
+6.9073 8.26916
+8.37278 8.44326
+8.8951 9.20427
+8.40149 9.17577
+3.60361 4.57183
+8.67263 10.1127
+5.89716 6.45412
+1.97285 2.35593
+7.22973 8.13467
+9.55645 9.92529
+0.261578 0.836274
+9.04414 9.45485
+6.18043 6.54229
+8.88579 9.54087
+1.82613 2.93849
+5.7599 5.96366
+5.23105 5.5541
+0.425229 1.44436
+0.32065 2.60892
+7.83655 9.48786
+2.3168 3.45972
+2.35466 3.23342
+8.24494 8.27258
+7.32678 7.74264
+8.37275 10.0741
+4.17337 4.98348
+-0.162009 0.724431
+9.49757 9.76377
+8.69435 9.08089
+4.13841 4.7514
+7.26358 7.55514
+6.91912 6.93
+6.7883 7.18296
+-0.614315 1.1857
+6.05907 7.33557
+4.86704 4.87705
+8.50012 9.14836
+1.83683 3.09895
+6.16389 8.39248
+3.03556 4.41004
+4.72416 5.05782
+1.98183 3.19183
+2.77103 5.71501
+4.90002 4.9817
+0.269258 0.725628
+5.59551 7.05038
+2.95416 3.09633
+2.17662 3.18385
+6.67536 7.56762
+7.31678 7.39321
+3.84158 3.85359
+4.38203 5.10149
+0.816784 1.09918
+0.70131 0.739502
+0.276631 2.32633
+9.15839 9.49433
+0.721295 1.97673
+2.63875 2.75437
+5.00344 5.5645
+2.24555 2.81234
+7.74465 9.07646
+2.35244 4.90632
+0.812093 0.954419
+3.97904 5.2071
+4.19177 4.83646
+0.853012 1.331
+2.64112 3.25613
+0.0894716 1.61954
+3.39617 3.40859
+1.56906 2.28518
+2.37258 4.36515
+1.60997 1.7561
+5.15275 5.33281
+6.47824 7.47529
+2.51145 3.29949
+2.71094 2.77785
+8.84653 9.48398
+1.3246 1.66664
+7.43718 7.5546
+3.68985 4.24649
+4.50553 4.51669
+4.15617 4.54887
+8.55319 10.2136
+2.1448 3.55805
+4.64594 4.71505
+1.71763 1.99977
+4.98066 5.46709
+7.7779 8.36497
+-0.0604997 0.301294
+5.11873 7.32867
+4.94567 5.5986
+5.32645 6.26835
+2.5768 3.13511
+3.31604 3.87555
+1.60834 2.68762
+3.30552 3.85211
+4.26741 4.98636
+0.820475 1.18854
+7.91501 10.7203
+5.17391 5.30351
+4.00452 5.75141
+2.37722 3.4602
+2.2373 2.94837
+1.62462 3.48264
+7.98507 9.2566
+5.32504 5.56388
+0.760614 0.7802
+0.855659 1.01522
+3.11231 4.43223
+5.62821 6.21564
+4.96845 5.35921
+8.10559 9.11106
+1.02533 1.13103
+6.99976 7.0788
+1.87628 2.58801
+1.11023 2.24655
+5.23343 5.45086
+0.95875 2.25343
+7.45917 8.23614
+2.72245 3.04663
+8.66816 8.70698
+5.55734 7.12262
+1.01935 1.88271
+0.804417 1.76187
+7.82703 8.78426
+4.77321 6.15199
+2.91503 3.69352
+0.776735 1.08883
+5.19981 5.46442
+9.06483 10.4008
+7.72082 8.26398
+2.9854 3.26573
+0.584028 2.60443
+0.700994 1.10379
+5.47612 5.94502
+-0.318442 0.986786
+5.0704 5.08055
+3.83732 4.4826
+5.60843 6.59005
+8.81432 9.7851
+6.28792 6.65284
+1.16812 2.27701
+7.15234 9.66795
+9.02188 9.15339
+1.76112 2.04839
+7.49419 7.6204
+5.1765 5.497
+1.45855 1.94969
+1.35003 1.55822
+2.50453 2.86815
+7.10451 8.51352
+3.87727 4.1124
+1.84876 2.79351
+3.01661 4.05396
+-0.16814 0.366484
+-0.538895 0.608786
+7.59933 9.00744
+0.938648 2.38471
+5.76934 6.16572
+8.20416 8.62505
+8.64542 8.7264
+2.75784 2.7828
+0.794451 1.97817
+9.21331 10.5156
+8.46671 8.80572
+3.94814 5.16845
+6.73654 6.97397
+4.05301 4.93008
+6.37833 6.77985
+7.21161 8.15994
+3.74993 4.61029
+-0.127938 1.09853
+2.82957 4.28816
+6.50564 6.59445
+8.37926 8.48332
+0.757443 1.74585
+0.232438 0.972293
+6.99187 8.7098
+7.20368 8.44301
+4.4801 6.07501
+4.34015 6.1495
+2.19394 3.22334
+7.29817 8.41021
+1.16627 2.68901
+4.62423 5.08039
+0.955655 2.22882
+1.45862 3.07065
+1.69815 2.56291
+4.01179 4.36587
+7.135 7.75829
+6.6823 7.27765
+5.44745 5.67195
+4.94594 5.42067
+0.267772 0.301939
+0.676432 1.6296
+1.37335 1.91645
+1.89051 2.38631
+4.84386 6.30539
+8.95613 10.944
+2.18119 2.41821
+5.74901 6.16952
+7.5431 7.88071
+9.05278 9.8128
+0.201334 1.65323
+2.82787 3.82083
+3.07073 3.08475
+8.99671 10.1766
+5.43261 6.12137
+4.83693 4.86848
+6.31804 7.21544
+2.34491 3.2562
+6.05941 6.53725
+-0.483381 1.17347
+5.53777 5.72651
+3.28875 3.47472
+3.94609 4.9418
+7.45585 8.6871
+1.50066 2.57215
+8.10112 8.67954
+6.24737 6.42635
+0.64413 1.05759
+7.1741 8.21476
+0.502722 1.77462
+0.783663 1.74174
+9.52704 9.9109
+-0.473873 2.01013
+7.07946 7.11474
+0.857335 1.6501
+4.00225 4.84453
+5.40598 6.30573
+8.18802 8.30067
+9.00412 10.9588
+9.8362 10.1517
+7.62735 8.37572
+3.41477 4.63099
+2.51254 2.81559
+6.36702 6.56061
+5.11842 5.35515
+5.21873 5.73296
+5.73528 7.77276
+3.64993 4.66826
+7.12664 8.46553
+8.7257 9.16851
+1.27615 2.20376
+7.46188 8.20752
+2.64939 2.66373
+4.94147 6.0509
+6.3805 7.48841
+6.25197 7.12327
+0.0885331 1.2682
+4.97356 6.58488
+4.11917 4.27267
+9.08793 9.70385
+0.897277 1.31702
+6.87538 8.25544
+1.55565 1.59492
+2.62483 3.54274
+1.49631 2.92263
+9.45305 9.97728
+6.24087 6.4577
+3.94636 5.13669
+-0.000956745 1.08235
+1.46134 1.83767
+9.18517 10.6601
+-0.740186 1.81269
+5.81977 6.15818
+7.0529 7.99421
+6.17753 7.49749
+8.63091 9.04205
+9.65219 10.1558
+3.12839 4.99211
+2.97262 4.07384
+4.28605 4.33171
+4.15906 5.6805
+1.35165 1.50732
+0.524207 2.12307
+5.32468 7.01472
+3.16982 4.87893
+6.88786 8.34191
+3.81703 5.22335
+3.86772 4.37359
+8.19386 10.0705
+1.73155 3.16695
+4.31685 4.62261
+9.40618 9.89612
+4.41215 5.19659
+2.35595 2.63543
+7.88481 8.14203
+7.17062 10.3534
+9.41379 10.389
+7.99867 9.01239
+3.31382 4.04915
+5.39222 6.07657
+8.5187 8.65976
+9.30132 10.6131
+7.17351 7.93596
+4.80134 6.72724
+3.59756 4.65182
+1.08248 1.17479
+1.03124 1.06871
+6.43154 6.95098
+-0.102199 0.59801
+4.94795 5.18081
+6.39126 7.30258
+1.52738 2.04271
+1.80373 2.33093
+2.72251 3.01677
+0.296722 1.10844
+6.39104 6.51567
+8.70965 8.78714
+2.07858 4.41695
+1.91027 2.9718
+1.42944 2.01864
+1.96347 2.73397
+4.0701 4.22456
+4.02859 4.05107
+7.10977 7.98092
+8.21148 9.54287
+6.59231 7.65109
+0.144191 0.830665
+2.0192 2.23704
+8.03482 8.39591
+8.90473 9.98543
+2.18284 2.70166
+3.05569 3.54238
+8.35319 9.39539
+2.00803 2.42866
+2.35282 3.13763
+2.20155 2.79377
+1.76531 2.94892
+7.52749 7.72567
+3.02266 3.24778
+4.01741 4.22521
+9.75263 9.91571
+6.45502 6.67838
+2.24912 3.47262
+1.84372 2.26517
+4.09559 5.71188
+1.43811 2.33732
+3.89171 4.16905
+3.01506 3.9725
+0.0273168 1.51766
+5.04118 5.80507
+3.08517 4.17316
+8.81637 8.8332
+8.74055 9.50143
+2.36904 2.69008
+6.39733 6.44221
+8.53272 9.51114
+9.48423 9.55002
+8.65645 9.04872
+6.66352 7.48009
+5.64389 7.88656
+5.75301 6.6759
+3.28645 4.22757
+4.99482 5.82988
+3.00004 4.0273
+1.45249 1.56662
+4.96263 5.32195
+7.91351 8.1437
+1.02034 1.56249
+0.71376 1.73319
+0.709968 1.44651
+9.01414 9.54799
+4.02116 4.68005
+7.10903 7.27075
+7.21322 8.71031
+1.6644 2.27186
+3.71304 4.68764
+9.66257 10.1452
+5.34477 5.46136
+9.27722 10.583
+3.82328 4.83316
+4.77019 5.07928
+9.07112 9.23836
+6.99091 7.25634
+2.11871 2.3054
+7.88242 7.98572
+0.570809 0.714073
+8.51532 9.49151
+0.329247 2.48897
+4.78202 5.36476
+1.47969 2.78867
+6.75011 7.36769
+2.31162 2.39533
+3.50434 4.48026
+5.84603 6.28861
+7.5337 7.62538
+1.09955 2.85741
+6.09915 7.20381
+0.933825 2.37925
+0.576363 2.0182
+3.12126 3.22507
+2.85313 3.02656
+3.25724 3.92077
+5.48575 6.58011
+1.02824 1.65415
+8.68703 9.06219
+3.28389 3.86349
+5.80264 6.12775
+7.11846 7.47444
+1.29638 3.38601
+6.37908 7.05986
+-0.592438 0.854361
+0.39233 1.17768
+2.1497 3.94423
+2.42336 2.43441
+6.94806 8.30626
+0.79865 1.4173
+1.41455 1.43684
+0.240074 1.16712
+4.18593 5.9929
+6.161 6.564
+0.726091 1.90706
+0.375606 0.694866
+4.09349 4.26452
+2.01652 2.68038
+8.99301 9.90549
+8.93909 9.17673
+1.10427 2.01247
+9.12668 9.15282
+1.08098 1.55374
+0.377836 0.414809
+7.28611 8.86318
+8.3542 8.53251
+3.86353 4.12875
+6.7631 7.40068
+4.61679 4.78182
+2.12935 3.45492
+3.68233 4.0457
+6.68131 8.22111
+8.79197 8.80474
+1.8915 2.26287
+0.387586 3.073
+6.46798 7.57381
+7.79742 9.34526
+-1.21538 1.67303
+2.07845 2.66028
+3.14148 4.46647
+1.66789 2.73375
+8.49821 10.0574
+8.42537 8.89906
+0.618349 2.72887
+6.8229 7.54501
+6.99343 7.35322
+7.34223 8.68781
+3.18834 3.98274
+8.86908 10.2535
+3.39839 3.76171
+0.188168 0.392276
+1.68187 3.53401
+6.50423 6.71714
+7.61191 8.89715
+1.68463 2.09275
+5.94627 7.6003
+2.15865 3.24126
+7.93639 8.53826
+2.99626 3.43273
+7.71028 8.41172
+3.19472 4.60878
+8.36123 8.92549
+8.92975 9.02783
+2.87187 3.49672
+6.76949 7.71139
+8.09121 9.31151
+6.84199 7.44009
+0.730655 0.800873
+7.5208 7.54109
+6.75992 7.55017
+6.09818 6.17399
+0.639209 1.27283
+3.01917 3.22327
+1.69181 2.60614
+9.49245 9.5842
+-0.418034 1.08035
+5.77705 6.4705
+6.79362 8.51993
+9.73155 9.81609
+3.71503 3.92022
+6.18589 6.77634
+3.94124 4.23942
+7.59911 8.05275
+3.68865 5.10948
+7.63926 8.63019
+-0.049855 0.0844425
+-0.41188 0.807786
+1.35962 1.81039
+5.40579 6.15098
+1.38594 2.0059
+6.93444 8.71958
+7.01229 9.38008
+-0.0974976 0.962679
+4.74131 6.59152
+1.02343 1.59245
+1.55629 1.9128
+6.28353 8.38021
+5.66349 5.79644
+1.72629 2.28563
+1.64539 2.82654
+0.359466 1.05106
+4.37569 4.82703
+5.87657 6.37853
+1.46316 1.65333
+7.44494 7.5985
+1.16846 1.98579
+4.43371 4.93234
+2.31838 2.47777
+7.52687 8.44423
+6.08056 7.42253
+9.16144 9.94783
+4.74382 4.95616
+0.248344 1.05335
+6.12345 7.43941
+9.45647 9.99799
+3.77124 4.75199
+3.31315 3.44873
+-0.0909828 1.51271
+7.03234 8.02546
+8.11403 9.11461
+6.734 7.34799
+1.08903 1.18319
+2.72871 4.31607
+6.53688 7.52754
+1.07868 1.27792
+6.28409 6.56795
+4.89866 5.79458
+9.06994 9.1221
+2.54989 3.14338
+3.69971 5.71717
+3.7113 4.55076
+8.91864 9.64522
+8.75634 8.82359
+9.02242 9.03869
+3.59945 4.20169
+4.98557 5.07401
+4.81526 5.74009
+7.264 8.63749
+2.79579 4.43389
+2.87204 4.66432
+2.32487 3.72127
+3.99704 4.72567
+8.17229 9.0158
+-0.72926 0.823658
+2.52355 3.32725
+5.3446 6.63868
+4.48935 7.37833
+3.08173 3.0968
+2.41585 3.23026
+9.23187 10.5413
+5.50099 5.51888
+1.29634 1.88846
+-0.0113225 1.41526
+6.34508 7.53417
+0.383019 2.25144
+5.0649 5.40222
+3.08221 3.76296
+9.29111 10.6833
+2.19714 2.94735
+8.75711 9.48583
+8.61564 8.69349
+1.9362 3.96191
+3.7962 4.44382
+7.78501 9.03843
+5.79649 7.29675
+6.03048 7.4316
+1.31105 4.36446
+6.5882 7.03622
+4.88148 7.12474
+6.62305 6.90973
+2.27488 2.73731
+8.42703 9.28888
+7.72928 8.53989
+7.27021 8.63879
+0.992908 1.92001
+-0.282737 0.511292
+7.88963 8.03117
+6.93371 8.26148
+-0.0346633 0.403617
+8.7827 8.82558
+5.16876 5.59742
+8.61275 8.73843
+5.70578 6.02783
+9.08706 9.35903
+9.32728 9.83021
+9.20058 10.2497
+6.79824 7.3024
+7.17979 7.51783
+0.918555 2.67878
+7.9662 8.63241
+8.85903 10.3145
+9.34614 10.1964
+9.05027 9.79872
+8.28959 8.45837
+1.32518 2.04557
+8.72848 9.16742
+5.92126 6.77277
+8.31504 8.78631
+1.02487 1.70172
+4.45204 4.72842
+8.20636 10.4724
+5.86211 6.25457
+6.15754 7.71303
+8.37832 8.82577
+4.25233 4.59417
+9.41451 9.95324
+9.372 10.4461
+1.8346 2.7144
+8.00681 8.14717
+7.03997 7.06753
+7.16892 7.70102
+7.01781 7.46799
+1.78526 1.7969
+1.63304 2.2011
+8.59718 8.61083
+9.43498 10.3636
+4.98718 5.32487
+3.65451 4.89601
+8.82368 9.11333
+-0.104862 0.598773
+4.97756 5.62342
+1.99876 3.24686
+2.32242 4.01096
+4.04914 4.77892
+3.81545 4.32583
+3.30153 3.46783
+3.14287 4.04718
+8.65711 8.76768
+9.09385 10.6898
+4.82771 5.64405
+5.98783 6.36785
+7.93397 9.6543
+4.89726 5.65486
+5.08717 5.22314
+6.59377 7.23748
+3.58289 3.98597
+0.177884 0.397629
+5.30856 5.79257
+2.53943 3.98007
+6.51217 6.59644
+0.196888 1.99904
+3.8709 4.1901
+2.37646 2.50997
+7.03837 8.13287
+6.8674 6.89535
+0.576964 2.08851
+0.902928 2.86981
+8.59261 9.20279
+5.96621 7.49899
+0.617602 1.83267
+2.29189 2.6361
+4.34207 4.61026
+6.19963 6.76443
+1.15955 1.44068
+5.25852 6.33905
+6.37306 7.53103
+9.13334 10.039
+8.67743 9.93959
+5.62973 6.04375
+8.32286 8.77042
+3.28772 6.1722
+4.97902 5.47249
+3.37765 5.07238
+4.58025 4.84341
+2.76807 3.18817
+4.27581 4.43023
+6.92572 7.68461
+0.279247 1.0561
+1.10903 2.61106
+6.71708 6.73132
+2.66415 3.75702
+8.0513 9.80334
+4.82466 6.04232
+2.59971 2.85768
+9.04689 9.73945
+3.48338 5.16622
+7.90925 8.92774
+7.30264 8.06247
+7.59087 8.26476
+0.150315 0.423068
+8.62726 9.74636
+9.01983 9.71707
+6.84007 7.40541
+8.87829 9.48342
+2.69214 3.71481
+0.580036 0.77289
+9.474 9.83397
+5.80151 6.08527
+3.63837 5.27137
+8.5848 8.65779
+7.88338 8.13276
+3.27992 4.20963
+6.21244 7.28079
+-0.348924 1.38478
+5.26688 5.93787
+3.78941 5.01009
+6.41929 8.38529
+1.41724 1.67733
+0.212821 1.58246
+0.0697189 0.160497
+9.57839 10.2377
+9.03332 9.70645
+4.94572 5.15163
+3.16999 4.536
+5.77494 6.68359
+5.89258 6.11852
+7.72257 8.21668
+8.42501 8.44905
+8.7196 8.86465
+4.392 5.1076
+1.88249 2.54422
+1.38092 1.60326
+5.04142 6.37374
+4.31795 5.91152
+1.79399 2.09314
+6.65405 8.32262
+1.36356 1.58538
+5.45456 6.55824
+4.95807 6.22848
+8.72077 10.2825
+0.745968 2.01546
+6.85041 7.11076
+4.82028 5.34442
+5.77673 8.01294
+8.58582 9.33714
+8.49884 9.21533
+9.05574 9.4096
+3.19932 3.27024
+9.50227 9.96685
+0.771636 1.0617
+9.00621 9.36397
+-0.097167 1.39463
+7.79622 8.43537
+8.05228 10.1504
+2.21685 4.17072
+1.82476 2.45381
+4.34408 4.56578
+9.27538 9.54701
+6.80153 7.44115
+7.38884 7.84448
+7.17526 8.00165
+5.85812 7.67326
+5.25545 6.30791
+5.68518 5.94055
+3.77685 4.1545
+0.530928 0.737248
+3.9772 4.59563
+8.96322 9.45618
+7.98322 8.44165
+3.42929 4.22329
+3.66445 4.7583
+-0.183652 0.434842
+3.16492 3.95726
+6.87407 7.89944
+5.08921 5.7745
+2.85466 3.04505
+7.12685 7.41248
+0.715419 0.876676
+3.47441 5.21753
+9.13594 9.87799
+5.52459 6.35691
+5.12544 6.12935
+2.44296 2.91543
+2.75148 4.19886
+1.43478 4.3919
+6.6352 7.07768
+4.72283 5.11506
+6.36434 7.69268
+2.32643 2.75289
+5.46566 6.22854
+6.37995 6.76989
+1.52564 3.55871
+1.05807 2.19393
+1.95374 4.08727
+8.11273 8.12767
+2.85955 4.71355
+4.89009 6.88516
+2.06859 2.25512
+7.50556 8.77923
+4.43353 5.11915
+5.16308 5.9695
+1.12072 1.69277
+3.96494 4.38143
+7.06931 7.89524
+0.514522 1.51265
+6.56389 7.01146
+1.51362 1.8541
+4.90339 5.51209
+2.11422 3.15457
+2.50094 3.92557
+8.24319 8.62826
+-0.0843505 0.710377
+6.35956 7.89457
+-0.790954 1.2964
+4.02253 5.19193
+2.7425 3.46763
+9.41469 10.1367
+1.57636 2.25105
+3.18647 3.38738
+8.36644 9.66791
+0.180846 0.461221
+7.07675 7.71881
+0.265366 1.19275
+5.43007 6.4854
+9.13912 9.23294
+9.52905 10.4029
+1.18712 2.66227
+5.22714 5.62601
+1.87413 2.8716
+5.71882 6.16374
+5.38169 6.13948
+-0.196005 0.236738
+5.36803 6.4395
+8.27713 8.71262
+8.82031 8.8598
+-0.53845 0.564783
+1.80716 1.94173
+5.67905 7.47291
+2.37779 3.64893
+0.574727 0.766424
+4.60701 4.86591
+3.17989 4.37738
+1.36777 3.15112
+1.48092 3.06573
+3.37009 4.06028
+4.17179 6.2073
+6.47953 6.88994
+5.74431 6.5253
+4.88827 5.49049
+5.44148 5.59239
+1.66153 2.63132
+7.69387 7.82267
+5.20911 5.48488
+-0.103218 0.497402
+7.18003 7.33324
+6.54305 8.81732
+0.278108 1.27452
+2.38323 2.94772
+1.2461 2.03246
+5.47052 5.75781
+7.31505 7.35895
+2.22248 4.23589
+0.0305319 0.430773
+8.32043 10.1222
+6.11732 7.09764
+5.08797 5.74991
+6.62491 7.34164
+5.55795 5.66083
+3.27549 4.13145
+1.0113 3.24631
+0.0717186 0.519738
+7.82905 9.30839
+9.90251 9.98691
+0.841457 0.952276
+-0.133927 0.510174
+1.14614 2.82218
+2.59767 4.19742
+3.41095 3.95265
+3.38951 3.75838
+8.86766 9.19437
+9.27927 10.261
+2.33249 2.79402
+5.69681 5.93469
+4.02502 5.38732
+0.797157 1.22845
+7.23558 7.8651
+1.1253 1.99184
+8.58296 8.64267
+-0.400141 0.74698
+3.46677 3.50526
+6.03252 6.64842
+5.8493 6.68938
+3.53209 3.84014
+7.22078 8.98106
+6.21943 7.69944
+0.887198 2.07323
+3.36591 4.57442
+4.30143 6.41179
+4.07556 4.54276
+8.77552 10.0615
+6.7247 7.04044
+9.05494 10.1126
+7.46604 7.80632
+3.38601 3.8043
+5.60475 7.02788
+9.09811 9.4654
+9.33447 9.80012
+8.66499 10.1002
+3.87007 3.88281
+2.87624 3.11359
+5.92385 6.80801
+4.49711 5.01863
+8.84524 9.36225
+6.40944 6.82093
+2.90915 3.68288
+3.96801 4.82534
+5.51744 5.84233
+3.2959 3.44409
+0.18526 0.207322
+5.49717 5.72648
+6.9522 7.1952
+0.769572 1.79343
+5.95522 6.03918
+6.54327 7.7475
+2.13516 3.83957
+-0.388892 0.775076
+1.30128 2.29414
+9.76761 10.1604
+7.38731 8.66002
+7.09229 7.43495
+9.1379 9.52432
+6.75942 7.88717
+7.42824 8.82063
+6.93078 8.19884
+2.307 2.93836
+8.38254 8.84691
+3.90159 5.37938
+0.0413204 0.112203
+0.638217 1.53943
+0.88678 2.49435
+1.99104 2.60847
+6.61595 7.65064
+2.37641 4.71719
+7.94945 9.21404
+5.44594 7.13646
+5.45737 6.12335
+7.39207 8.02885
+5.51588 7.39341
+8.1581 10.0632
+0.197869 1.44516
+-0.0161139 0.73487
+4.24155 4.7304
+0.00374564 1.26481
+8.1878 8.20011
+-0.115544 1.74771
+0.912347 2.52922
+2.72234 4.83268
+6.45577 7.07776
+9.74201 10.1772
+7.11008 8.72914
+4.41921 4.8673
+7.97673 8.36658
+0.438659 0.647061
+4.35086 5.44482
+8.22919 9.34379
+3.53242 5.65576
+1.126 2.32177
+5.95118 6.51364
+3.10519 3.9447
+1.28889 2.26267
+7.04255 7.67791
+3.12614 3.17626
+8.09968 8.49162
+6.07924 7.219
+5.99554 6.52549
+9.14378 9.5773
+5.82872 6.53112
+9.3361 10.1704
+4.3751 6.51675
+3.288 3.98328
+4.56342 4.80185
+7.16574 7.43901
+7.7638 8.47758
+7.31514 7.78499
+7.98942 9.50252
+4.31211 4.70724
+2.9094 3.33304
+0.108736 0.668815
+8.08409 9.11098
+-0.0053985 0.589992
+1.31926 2.72153
+2.28664 2.38813
+7.95237 8.26388
+-0.0283047 0.452099
+7.50295 8.71708
+7.72356 8.63468
+3.48953 3.89579
+7.73814 8.73456
+4.54487 5.45817
+6.45109 7.00312
+3.99915 5.41716
+6.81436 8.5682
+6.86726 7.55999
+2.67863 3.7053
+2.6837 3.39567
+2.84347 2.91724
+5.79383 5.80493
+2.41217 3.0619
+8.78163 9.0998
+1.43456 2.50854
+6.73393 8.53005
+3.02563 3.56456
+3.34628 4.2934
+2.44985 2.92819
+1.38262 2.89341
+4.56337 5.75702
+0.275735 1.16604
+1.39763 2.8108
+9.69128 9.90361
+8.54868 9.66756
+3.01838 3.72831
+8.34017 10.5262
+1.82721 3.0476
+5.9732 6.83307
+2.77874 4.25603
+1.71987 3.1227
+6.33773 7.89103
+1.31982 2.82992
+4.21601 4.9627
+6.68166 6.72653
+0.87708 1.06828
+1.03483 1.26625
+2.996 4.03087
+1.54718 1.57452
+2.33087 2.38226
+2.29464 3.36496
+2.03064 3.41867
+5.8456 6.10406
+7.54614 8.2874
+1.42938 2.89154
+2.65935 3.53883
+3.98845 4.42049
+6.85632 7.15487
+8.12038 9.34993
+0.873558 1.32129
+6.61595 8.00766
+9.49147 9.81947
+-0.0225601 0.328769
+-0.481519 1.37204
+6.31457 7.45251
+4.59738 5.81395
+4.83304 5.63008
+1.95746 2.78657
+2.97889 3.74408
+9.08327 10.702
+3.58219 4.93634
+7.87068 9.77851
+0.330978 1.36031
+4.78145 5.36918
+4.94672 5.56644
+7.66806 8.08613
+4.78512 6.35461
+5.17367 5.74386
+8.65884 9.97088
+9.22053 9.60447
+6.15061 6.58817
+0.0875971 0.541643
+6.45597 7.92002
+0.636824 1.05267
+5.31677 6.12838
+6.51127 6.6731
+0.459551 1.69382
+5.75106 6.41377
+3.68438 4.67415
+9.36302 9.78281
+5.46195 7.99215
+2.55471 2.59231
+-0.0640245 1.33755
+9.36027 10.6198
+2.67955 2.77882
+3.51443 4.10619
+6.83904 7.23692
+2.59553 2.81418
+7.74628 8.95169
+3.86464 3.90067
+3.32377 3.992
+1.43737 2.52191
+3.83927 3.99402
+5.24426 5.35179
+0.833857 1.05277
+8.4062 8.51964
+9.62299 9.66254
+3.55427 5.19048
+1.7003 2.62107
+6.8059 7.49246
+-0.761104 0.773528
+1.37137 1.95048
+2.1222 2.59387
+0.633505 2.04796
+0.605156 1.04336
+7.22842 8.3365
+4.28716 5.28921
+8.14286 9.52015
+7.62467 9.18603
+1.11029 1.81278
+5.05654 5.13597
+0.862653 0.97827
+7.24766 7.92167
+8.80103 8.91467
+3.05841 4.82292
+1.28204 1.55969
+1.58886 2.57874
+0.0537678 1.28837
+8.09303 9.71678
+8.37599 8.85705
+3.18107 4.01971
+6.67019 7.75848
+6.29836 8.21603
+0.86271 1.30358
+3.86126 6.49694
+5.84446 6.24913
+0.475025 0.598151
+6.3477 7.08327
+3.60161 4.51824
+7.13317 8.13858
+4.89052 6.23701
+5.69441 5.99027
+7.18735 8.34853
+9.30182 9.34894
+6.06589 6.15141
+8.05917 8.89642
+5.6136 7.14058
+0.838337 0.959487
+0.56421 2.00841
+6.46876 6.63629
+2.4434 3.92184
+7.97216 9.45372
+8.17926 8.66756
+1.86522 2.01888
+0.983342 1.89079
+2.07322 2.09765
+3.52974 4.73717
+3.24973 4.88691
+5.47789 5.95384
+4.11218 4.57076
+6.61174 7.47165
+8.09302 8.36193
+1.67911 1.69022
+4.436 6.17515
+5.6544 5.74951
+1.50354 1.76043
+4.41433 4.83589
+1.82528 3.53979
+3.98749 4.65527
+6.42503 7.5787
+8.69554 10.1767
+8.39215 8.56999
+8.71646 9.66209
+1.59091 3.39622
+6.12574 6.94955
+7.92527 8.25049
+9.19858 9.49137
+2.73382 2.97747
+4.56558 5.94738
+8.33983 8.58548
+9.00798 9.01838
+4.93268 5.28383
+3.15356 3.58606
+8.28171 8.79351
+1.47358 1.9581
+0.891797 2.05345
+1.56032 2.38159
+2.5152 3.80485
+8.0963 9.88138
+1.1262 1.89279
+7.99336 8.2352
+5.25067 5.41251
+4.57532 5.20101
+1.87911 4.59415
+4.25142 4.70467
+8.18782 8.76989
+9.20478 9.3612
+7.70898 9.7752
+0.655865 0.958924
+4.8883 5.77477
+3.03279 3.47456
+1.01979 1.41661
+8.94219 10.6987
+2.49348 4.58195
+2.44003 3.29005
+3.4725 3.55572
+9.3917 9.95851
+7.08658 7.47686
+3.56413 4.44089
+-0.47868 1.11453
+6.82615 8.00596
+3.49451 3.74705
+8.13286 8.47976
+7.01732 8.82556
+1.19064 1.48887
+5.28851 6.88637
+8.83175 9.49879
+0.939903 1.17024
+7.49124 9.01906
+2.9285 4.23224
+5.68296 6.86273
+8.53897 8.77886
+2.9107 5.01232
+0.748655 1.10265
+4.77258 5.12626
+3.995 4.75289
+2.71467 4.26926
+6.21665 7.16233
+4.53883 5.75731
+4.37153 4.76125
+7.47635 8.75777
+4.82013 6.4699
+9.36015 9.58451
+4.43054 5.86752
+2.10934 2.34705
+3.00306 3.06539
+7.81957 8.44081
+1.97221 3.06916
+0.153393 0.503956
+5.05611 5.27536
+5.73277 5.89001
+3.64807 4.85582
+6.13416 6.1528
+3.85511 4.14045
+0.411725 1.36529
+2.26932 2.5447
+3.51164 4.93266
+2.50955 4.34201
+8.74663 9.39268
+6.2229 6.39303
+4.38059 4.91592
+7.29109 8.62318
+6.31801 6.99532
+9.75036 10.0514
+1.69019 2.41527
+4.20462 5.27729
+6.32944 6.94729
+3.5736 5.21496
+4.48316 4.61828
+1.76915 2.43263
+2.42026 4.09159
+2.08762 2.43074
+5.48161 6.02473
+5.51826 7.47042
+2.78026 3.1552
+7.89469 9.49867
+3.09084 4.54697
+7.20417 7.42408
+5.36528 5.74851
+1.86239 2.41988
+1.55994 2.85743
+4.40182 4.6638
+7.91619 9.01242
+3.08119 3.74714
+1.54108 2.08538
+3.61461 3.64631
+8.76851 9.66257
+-0.645571 1.3366
+-0.707083 1.21005
+7.19571 8.23405
+5.42865 5.89329
+2.12897 2.59222
+0.603102 0.930391
+3.75025 4.63181
+6.14867 6.4526
+7.30947 7.51461
+7.83183 8.79802
+6.06658 8.53246
+1.67895 2.50063
+1.14179 2.04478
+8.59583 8.90112
+-0.918885 1.30717
+0.182607 0.613593
+3.3335 3.77196
+0.783053 2.4368
+6.49331 7.60104
+2.85101 3.28637
+7.42273 7.66905
+3.96433 5.02573
+8.26262 8.40749
+9.24451 9.32783
+4.89036 7.07214
+6.45431 6.96815
+5.20701 6.58747
+7.40142 7.98615
+4.19768 4.9831
+3.32546 3.88811
+-0.471996 0.967855
+9.36172 9.63532
+1.96831 3.00632
+7.537 9.72671
+4.67746 4.81135
+3.10782 4.93642
+4.94809 6.54855
+4.16763 5.25628
+9.04992 10.316
+0.668935 0.680886
+4.02935 4.84503
+5.32499 5.76636
+5.32267 7.15457
+5.18886 5.23491
+4.37053 5.36801
+2.39955 2.74657
+8.19764 8.86645
+4.24706 5.69703
+1.87851 2.36988
+0.886553 1.05064
+7.27428 7.90224
+9.08417 9.44879
+3.11534 4.02019
+6.3284 7.39925
+4.96029 5.59076
+2.58248 3.11741
+7.76513 8.13505
+4.93613 6.51523
+0.565355 1.70512
+2.12366 3.0319
+5.32422 6.84146
+-0.135396 1.08591
+3.7901 4.86303
+4.49677 5.41847
+0.615748 0.834712
+0.64784 1.81859
+6.65505 7.13894
+-1.12744 1.61017
+0.550814 1.24316
+6.66639 6.89866
+6.19271 8.17468
+3.09382 3.78684
+4.41221 4.95889
+7.96091 8.48824
+8.32129 10.2917
+2.13168 2.19835
+1.4635 2.38989
+5.78102 6.42215
+1.70153 3.20616
+5.35068 5.71016
+4.27702 4.37203
+5.13888 6.04764
+4.79644 5.37927
+6.75314 7.66368
+6.04484 6.84064
+4.34947 4.45643
+9.08755 10.396
+0.88804 2.17441
+6.86788 7.88301
+7.94296 8.61664
+8.02387 8.79591
+1.79024 2.40559
+5.50404 6.01044
+7.76772 8.1932
+1.174 1.23693
+6.20571 6.9224
+4.20863 4.48702
+4.16743 4.39075
+-0.11965 0.120778
+7.01234 7.52619
+5.91415 6.46151
+5.28713 5.72354
+6.26981 6.31237
+0.643056 1.43864
+1.62562 1.99875
+0.544992 0.721386
+6.92522 7.09165
+-0.107048 1.12273
+0.644674 0.91244
+8.56904 9.01883
+2.23079 2.56598
+9.79034 10.1123
+8.13788 8.4131
+1.86753 1.95236
+2.97577 3.33272
+8.57454 10.0193
+1.20043 1.53408
+3.43515 3.86571
+5.79075 6.41293
+1.71558 2.52845
+2.39907 3.46652
+9.08289 9.91182
+0.859644 1.07475
+5.30144 5.42157
+-0.441497 0.890794
+3.55044 4.14918
+-0.340115 1.19239
+6.5534 6.76908
+0.836514 2.09196
+8.15747 8.96484
+4.80087 5.14227
+7.72071 8.88223
+5.11901 5.65559
+4.44996 4.63562
+-0.328404 1.3002
+0.90759 1.34556
+5.94839 6.35058
+1.76504 1.78344
+1.32585 2.08994
+7.18641 8.20945
+0.62657 1.06025
+6.28086 6.40975
+5.05525 5.16143
+5.82694 8.07685
+6.23677 7.55394
+-0.226265 0.661443
+1.42599 2.36325
+9.04445 9.92971
+-0.169286 0.185741
+8.34636 10.9042
+9.52494 10.0475
+8.39989 10.1377
+3.89956 4.70428
+3.98673 4.97185
+5.43008 5.67936
+7.76475 7.98591
+4.46895 4.73188
+0.584662 1.54474
+2.12622 2.79994
+1.40578 2.2461
+1.45171 2.02105
+2.05665 3.04611
+2.29818 2.68118
+1.77344 2.98698
+4.92092 5.55302
+7.18758 8.37525
+8.83407 10.0565
+2.91182 4.71932
+6.47293 6.74664
+2.49238 3.69749
+0.487234 0.541003
+4.703 4.92744
+9.8867 9.94918
+1.7713 1.9792
+5.68316 6.90242
+5.62485 6.70656
+7.24837 9.60197
+7.71147 7.76519
+5.22324 5.30661
+9.11258 9.28071
+8.2827 8.90115
+8.90865 9.42138
+7.47233 8.72308
+4.89712 5.65153
+4.12392 4.20239
+5.65325 6.55887
+8.65945 9.05845
+7.9165 8.36489
+1.4952 2.43991
+5.49665 5.80793
+1.67206 2.55302
+0.943544 1.58521
+0.47 0.860959
+6.47638 7.43101
+4.38434 5.97278
+8.12782 9.10574
+5.78143 6.6539
+9.23616 9.40513
+1.6845 2.00736
+6.56955 7.37847
+7.42993 9.04718
+-0.179632 0.450904
+8.65819 9.07724
+7.86567 8.80824
+1.85428 2.7755
+2.29222 2.65374
+4.03614 4.51729
+6.9326 7.07635
+5.50807 6.498
+6.17637 7.26432
+8.7688 9.16308
+7.65 8.88604
+3.74495 4.29991
+8.5671 10.5661
+7.41964 8.21083
+8.04302 9.78783
+0.269663 0.317601
+8.29804 9.40991
+3.90673 4.22298
+8.82384 10.9441
+7.27081 8.19548
+1.30184 1.98993
+8.13028 8.92385
+7.21224 7.35137
+5.02122 5.69666
+0.817219 0.974073
+-0.128067 0.589359
+2.12137 2.74019
+5.24657 5.44714
+1.55805 3.10332
+9.91031 10.0748
+7.13941 7.9143
+-0.183908 0.934079
+3.987 4.11053
+3.26678 3.67608
+9.75921 10.1121
+0.755391 1.06346
+7.28479 7.49982
+1.37522 3.80623
+0.944351 1.46531
+9.49278 10.2372
+8.28946 8.67597
+9.43537 9.58003
+7.73357 8.756
+2.64043 2.8687
+4.70448 6.99929
+3.82199 3.89343
+3.43825 4.10908
+4.42362 5.69086
+8.08536 8.60142
+8.43208 9.31272
+7.5889 8.39208
+7.90112 7.9734
+6.10381 6.80568
+8.76283 8.80151
+1.46728 2.53288
+1.68884 2.47102
+7.63343 8.29838
+9.18852 9.5558
+0.977174 1.4792
+4.7577 5.74873
+4.66433 6.37375
+-0.0952277 0.378184
+5.30929 6.07469
+4.98811 5.16146
+3.0744 5.59799
+0.944909 1.25222
+1.38561 2.51277
+3.77811 4.23459
+2.11604 3.32458
+0.920929 1.17187
+5.23496 6.34905
+6.9953 7.65745
+4.81803 4.89553
+4.69301 5.36777
+-0.208926 2.6111
+7.97334 9.83269
+-0.396673 0.779988
+5.91367 6.47682
+6.27249 6.83533
+5.58931 6.89679
+2.03394 2.67025
+-0.197752 0.383167
+4.69751 7.695
+4.5989 6.07875
+3.7285 4.27396
+7.9807 8.27693
+-0.00248985 1.30934
+2.68016 3.916
+0.881558 1.14567
+4.77066 5.05302
+0.552268 0.919467
+2.46862 2.65199
+1.4009 2.51701
+-0.171185 1.28252
+9.27842 9.90243
+3.51778 3.57728
+6.10071 6.92163
+9.05387 10.0894
+5.52995 5.89082
+8.40216 9.0272
+9.02911 10.1602
+4.85818 7.38829
+1.6762 2.32334
+6.45416 8.62337
+5.44592 6.0245
+3.45876 3.94274
+9.07144 9.16725
+6.51885 7.6363
+7.92593 9.01986
+0.270702 1.57395
+6.11245 6.70173
+1.37658 2.19068
+2.42668 3.43827
+7.98226 8.43306
+3.72269 4.74654
+8.16252 8.58873
+8.81456 9.5363
+-0.338386 0.864811
+1.90693 2.25796
+3.5305 4.17475
+6.07997 7.67393
+0.53347 1.68815
+7.31182 8.44458
+7.77462 8.33613
+3.79975 4.15552
+9.08822 9.9771
+-0.101698 1.05442
+8.44869 9.95724
+-0.0318759 0.532673
+8.09238 9.51356
+5.51514 6.60799
+8.66528 10.3297
+8.25556 9.97893
+-0.220428 0.247563
+0.00453913 0.540444
+1.53599 1.61735
+3.77213 5.06896
+2.65332 2.75864
+6.05811 6.43112
+0.302534 0.803651
+0.393766 1.11611
+9.31035 9.62387
+0.568281 1.7765
+-0.721118 1.27387
+1.83573 2.62578
+1.39953 1.91158
+6.51883 8.52813
+2.60154 2.95054
+6.58322 9.37818
+5.61178 5.67661
+9.56511 10.2767
+9.09174 10.0697
+2.55846 3.39943
+8.38146 9.06138
+7.97019 8.18074
+6.1426 6.42787
+1.15876 1.55463
+2.93483 2.96376
+7.23883 7.29158
+9.64606 10.0674
+4.89825 6.70366
+7.35635 7.96328
+2.2702 2.36797
+-0.0464389 0.395244
+1.14883 2.10411
+4.7309 5.10593
+6.07946 7.37741
+5.50202 6.28822
+3.66574 3.96271
+1.9944 2.3862
+7.58159 7.59275
+1.98712 3.30587
+2.10317 2.89161
+9.66889 9.97287
+1.57327 2.15421
+8.14125 8.30983
+3.77185 4.12658
+8.51624 9.51485
+9.25211 9.722
+2.06312 3.0453
+9.34954 9.91254
+7.31475 8.89322
+7.85044 9.20242
+0.226243 1.28465
+0.0260868 0.575177
+9.40743 10.1655
+4.04324 5.05341
+1.02626 1.48332
+3.33074 3.72025
+9.2005 9.61387
+6.68317 7.14109
+6.82083 8.6312
+4.34816 4.50329
+-0.48874 0.975608
+4.26651 5.68526
+4.89731 5.57569
+2.68984 3.5661
+0.499714 1.01055
+9.01902 9.36142
+3.22067 4.59054
+0.65132 0.860512
+1.6791 2.36642
+8.28222 8.7579
+2.84349 3.24134
+5.64949 6.09512
+3.44026 4.43245
+2.60889 2.6248
+-0.00849234 0.984046
+7.5745 8.65675
+2.07464 2.6488
+2.59747 2.65772
+6.36828 7.42208
+3.83342 4.50127
+5.41167 5.7011
+6.53606 7.53796
+8.21975 9.56176
+1.90113 3.08684
+7.74402 7.82057
+4.26515 5.11327
+5.42743 5.59215
+8.69709 10.0912
+2.87019 3.94798
+9.27013 9.54627
+9.30568 10.2136
+9.02985 9.62917
+3.7589 4.59642
+6.59359 6.86939
+3.26574 4.83488
+5.14545 7.70086
+7.43163 8.05103
+5.72972 5.74457
+0.490113 1.31151
+7.018 7.42627
+6.22976 6.27589
+9.07732 9.30419
+4.3917 4.42663
+8.50298 10.3728
+6.18671 7.53619
+3.51053 4.097
+2.17172 3.56595
+6.08046 6.23691
+9.07361 10.9129
+3.95757 4.11333
+-0.136516 0.78995
+1.34923 3.47002
+0.0562579 0.686502
+9.10943 10.2731
+5.80174 6.16971
+7.86011 7.87649
+5.34384 5.51645
+6.32167 6.76387
+7.70566 8.28038
+-0.319903 0.867682
+-0.372564 0.570014
+8.83696 10.8439
+7.78947 9.38211
+9.25815 10.1092
+5.59721 5.67148
+0.234719 2.42489
+1.06314 2.87416
+1.75391 2.69799
+5.4536 6.66068
+1.35696 1.87102
+2.17418 3.1459
+7.61817 7.98287
+2.92194 3.18393
+7.68243 7.83261
+9.33163 10.5531
+1.14227 2.50228
+5.47911 5.70857
+9.88123 10.0758
+8.81249 8.83145
+6.02747 6.43183
+4.81158 5.79178
+6.65666 7.5047
+4.89085 5.56569
+0.935564 1.71547
+-0.0452879 1.16222
+4.03524 4.6206
+5.88518 6.02658
+2.06227 2.9581
+0.207246 2.2404
+2.81757 3.70318
+0.704257 1.98403
+2.38486 3.30039
+3.57073 4.78358
+1.53721 3.00546
+8.37852 8.39527
+1.54619 1.59789
+1.00447 1.40778
+5.31977 6.43861
+3.82175 3.83209
+3.37738 4.44002
+5.46644 5.97254
+3.88191 5.00688
+4.88046 5.39031
+4.15092 4.93679
+1.75182 2.07399
+1.16434 1.76541
+3.37032 4.29676
+3.1685 3.98533
+1.28787 1.59775
+5.86338 6.17993
+3.8645 4.25757
+1.83947 2.48092
+0.184795 0.586724
+3.13752 3.76447
+2.14264 3.03248
+5.78182 5.9029
+2.47969 3.8088
+2.59206 3.08362
+-0.354871 1.03627
+7.94041 8.05947
+9.48014 9.93817
+0.992727 1.48877
+6.1525 7.51387
+5.00071 6.15665
+7.42074 8.27606
+9.6539 9.83042
+1.08984 1.46387
+5.46282 6.95907
+4.74506 5.13968
+0.357565 1.91464
+9.07652 9.65474
+0.201095 0.646211
+7.04306 7.69131
+1.17728 1.2237
+5.92183 6.29165
+-0.41356 0.491524
+8.38339 10.4509
+8.08648 8.11344
+3.32474 3.39522
+5.762 5.83732
+2.26778 2.55548
+4.86127 5.92868
+3.75949 5.16608
+4.83431 5.88632
+2.65122 3.31344
+9.30295 9.38948
+6.03391 6.32749
+5.12035 5.59414
+5.68785 5.979
+7.89553 9.15202
+2.54445 2.74715
+2.36337 2.49709
+4.71661 6.12198
+3.72447 4.68735
+1.0541 1.53187
+3.45178 4.80929
+7.90773 8.26212
+8.1816 9.18627
+0.322569 0.871041
+7.24823 7.32699
+1.7003 2.78087
+9.70927 10.2515
+3.75922 4.01081
+1.06949 1.40253
+1.21774 1.4734
+6.02123 6.32973
+2.76396 3.09484
+2.80358 3.00026
+5.25666 6.31369
+4.71714 5.30669
+4.37906 4.50557
+7.40824 7.44969
+7.89081 9.18263
+8.8136 10.3074
+9.1757 9.37261
+7.1938 8.51137
+0.580081 2.32678
+2.02497 2.95434
+6.01446 6.78851
+8.54365 9.21454
+3.03567 3.27089
+0.650657 1.5716
+5.05518 6.36521
+1.64301 2.76399
+4.15989 4.34183
+3.72791 3.98156
+3.91372 4.06182
+3.04507 3.88871
+3.82596 4.25694
+3.36492 5.00402
+6.50019 8.17974
+3.54621 3.81009
+0.546921 2.09811
+5.1789 5.9826
+4.98983 6.31221
+2.47557 2.63878
+4.64568 4.81101
+9.1462 9.21888
+7.37417 7.5276
+2.21604 2.50113
+8.29804 10.2722
+5.1282 6.06353
+8.58281 10.1589
+6.47084 7.04085
+6.27806 6.72674
+7.11554 7.85687
+6.01085 6.02773
+5.46694 7.52872
+9.51078 9.85387
+3.36627 4.06552
+2.96126 5.12635
+3.09314 3.40691
+5.05456 6.62548
+7.56469 8.97053
+1.33727 2.87482
+5.6572 6.28169
+0.120924 0.296475
+7.09139 7.41322
+2.10076 3.28507
+8.74998 10.1094
+7.45072 9.50796
+7.75294 8.59218
+0.740374 2.44897
+7.63001 8.91562
+4.30743 4.81716
+6.40813 7.29159
+6.30213 7.35987
+6.44392 7.32584
+8.41155 9.4466
+-0.377892 0.689618
+5.88857 6.70983
+6.67779 7.70668
+4.831 5.17464
+2.62342 3.82764
+8.57453 9.29283
+7.32648 7.96725
+9.32937 9.9726
+7.30774 7.65754
+3.97456 4.59876
+5.73092 7.20962
+1.958 2.10551
+3.2115 3.81482
+5.76497 7.42425
+2.77219 3.29692
+4.95297 5.14843
+5.96367 6.3619
+2.49872 4.61736
+8.21817 8.23425
+2.13615 2.61877
+7.84121 9.55011
+8.63416 10.2773
+5.61084 6.32053
+4.86002 5.79944
+9.07858 10.688
+5.95829 6.42504
+3.3289 4.17849
+3.27989 4.91625
+8.28046 9.23021
+2.18691 2.6072
+1.3962 1.75013
+2.13627 3.73117
+2.11128 2.57303
+7.22357 7.50136
+7.43862 8.03136
+2.80578 3.02886
+0.176906 0.761142
+5.99314 6.6075
+1.90398 3.3925
+5.48264 6.73579
+7.18447 7.49811
+3.24434 5.05219
+5.53263 6.04178
+1.71172 2.45682
+0.297266 0.481632
+2.62582 3.36142
+0.243865 1.49321
+8.86142 10.169
+3.93193 4.39404
+4.98182 5.15675
+7.99209 9.73159
+8.18033 9.45596
+4.25235 4.41546
+1.59603 2.15581
+6.47724 8.69649
+5.24138 7.93131
+3.4267 3.49003
+0.0439912 0.316407
+1.99983 3.87206
+-0.103124 0.568771
+4.62451 4.80117
+2.89065 4.16315
+5.82817 7.43232
+6.89255 7.82189
+5.71037 6.81241
+4.34551 5.24905
+7.33931 7.3741
+-0.855192 1.27129
+8.94842 9.10813
+9.19877 9.68412
+6.42658 7.77968
+-0.0669636 0.430107
+6.40366 7.40701
+8.91175 9.24059
+3.21388 4.21676
+3.38557 3.79509
+4.24411 4.97032
+7.259 7.34896
+2.55995 3.18361
+8.77438 10.5503
+8.18685 9.79378
+2.78397 4.4563
+8.6891 9.38337
+6.51749 7.59374
+2.52346 3.46101
+8.40526 9.35647
+5.26942 6.33572
+4.15094 5.00668
+0.471666 1.53842
+7.63441 7.96745
+2.39974 3.7814
+2.71989 3.02994
+8.12085 8.33493
+6.19474 6.84381
+6.6133 8.31417
+5.1758 6.94983
+8.66241 8.79095
+6.10878 8.22083
+8.81883 9.08031
+8.28969 8.45176
+7.19851 8.37836
+1.5722 1.6836
+4.57814 6.95063
+7.66128 8.10631
+0.742483 3.08515
+1.15026 1.98074
+3.90133 4.12003
+7.61145 7.73433
+8.32187 10.2933
+0.407205 1.08089
+1.26545 2.60796
+2.70646 3.92753
+-0.196551 1.83536
+-0.413063 1.23838
+0.264484 0.556192
+6.30158 6.96097
+-0.66246 0.809062
+9.34243 10.3521
+8.70093 8.79679
+0.745195 1.92911
+9.12892 9.68193
+7.98533 8.30538
+6.23671 7.04296
+6.5603 6.95483
+7.08133 7.10563
+2.15769 2.41541
+8.24752 8.73978
+5.27693 5.61904
+0.317419 1.48404
+3.48029 5.46979
+7.38901 8.56554
+1.06587 1.62384
+5.54926 6.04924
+4.46577 6.48749
+5.349 6.15584
+8.04249 8.17359
+3.37651 3.56179
+3.64706 5.57403
+4.49844 5.26404
+3.93361 4.92128
+5.82184 6.29881
+0.984273 1.70318
+1.12773 1.80726
+3.11675 3.17451
+5.07913 5.46291
+0.615591 1.81465
+1.08948 2.77847
+7.97412 8.07365
+5.05207 5.82497
+0.0407709 0.558817
+6.11142 6.48205
+3.4461 3.57315
+8.6547 8.80553
+8.18965 9.64194
+5.55564 7.9703
+4.01776 4.16989
+2.4668 2.82018
+0.911925 2.56662
+4.68814 5.03614
+7.4899 8.49036
+8.40912 9.14001
+2.32725 3.16377
+0.0723972 1.42049
+6.6441 6.6953
+3.65586 4.38222
+6.35844 6.57833
+4.44435 5.73077
+1.81779 2.57257
+4.17692 4.59722
+8.54682 9.38058
+1.61135 1.81629
+3.91926 5.00536
+9.78302 9.85143
+1.25632 3.10345
+5.53191 6.08174
+-0.231868 0.676811
+1.03054 2.58105
+0.0402172 0.690608
+0.974571 1.25234
+5.22227 5.92302
+8.05843 10.1439
+8.48938 8.50755
+0.0965782 1.24008
+6.53821 7.47765
+0.189991 0.475204
+8.48963 8.54995
+9.68363 10.0534
+1.49381 2.71302
+6.75552 7.41283
+7.91075 9.15302
+0.520922 1.40928
+1.17957 2.11221
+4.00122 4.40686
+7.32467 7.9273
+6.39126 7.90248
+6.50534 8.19308
+7.19888 7.22234
+-0.136797 0.731889
+0.870318 1.25614
+2.07126 2.28297
+6.10995 7.60408
+3.02174 3.90102
+-0.657541 1.57517
+0.993121 2.66255
+7.27232 7.50832
+2.16079 3.75428
+9.27397 9.75098
+8.36865 8.5545
+4.56641 4.97607
+3.60746 4.34616
+6.31304 7.70611
+2.91442 3.7602
+4.85814 6.70407
+4.45876 5.67661
+8.06749 8.82229
+2.02826 3.59873
+1.92922 2.50088
+2.63867 3.48117
+2.17665 2.54826
+8.62674 9.10675
+0.96648 1.47671
+8.86336 9.53978
+5.52747 5.80829
+0.77099 3.06106
+2.2307 2.53877
+6.29165 6.63018
+4.44717 5.04651
+3.80894 4.63054
+7.47519 7.87072
+0.933668 1.9949
+-0.712945 1.21558
+7.30206 8.38376
+5.80281 7.00022
+7.96578 8.6558
+0.24063 0.706466
+4.41893 4.58472
+4.0132 4.92768
+5.29626 6.09397
+3.43602 4.00728
+0.780945 1.66499
+8.83861 9.15168
+9.06411 9.75544
+3.45618 3.62529
+9.51413 10.0148
+0.842106 1.75695
+1.06485 1.44192
+6.89987 8.05314
+7.89154 8.73313
+8.71675 9.79526
+2.40574 2.58062
+8.55952 8.78132
+5.61716 6.06282
+3.71059 3.77929
+2.50187 2.99137
+6.92852 7.23184
+7.00442 7.93869
+8.82232 8.8756
+4.10389 4.53702
+7.6907 7.77577
+9.31554 10.2674
+8.51082 8.70339
+4.83332 6.70311
+4.6904 5.42892
+4.71407 5.67695
+4.12047 4.44089
+7.51845 8.26858
+1.31781 1.9397
+6.26854 8.02093
+6.92072 7.77774
+0.438156 2.18909
+0.898035 1.72074
+3.81121 3.8643
+1.01676 1.34308
+9.28445 9.42801
+2.43133 4.43516
+4.33664 5.9904
+2.19178 2.37244
+1.5457 1.79785
+2.23781 2.6481
+6.8365 6.87073
+0.82568 2.74775
+9.59404 9.89262
+8.48394 9.15107
+6.16085 6.42224
+3.5667 5.97689
+4.16931 7.41638
+6.95636 7.0982
+6.87987 7.09233
+3.12619 3.14821
+7.76636 7.98459
+4.60371 5.59136
+3.92189 4.88302
+6.90694 8.19858
+3.85132 5.19015
+8.05045 8.32483
+4.8338 6.05032
+1.93576 3.18873
+2.4182 3.55039
+5.56905 5.8172
+4.18436 6.01283
+3.04944 3.85936
+7.83585 8.95233
+1.76281 3.0558
+3.44143 3.6317
+8.69887 9.40371
+5.67867 5.73236
+0.859809 1.76578
+6.92284 7.13601
+8.27495 9.13414
+5.44385 6.42599
+-0.941603 1.8215
+7.88161 8.79447
+0.965018 1.17732
+5.56442 5.79546
+8.79032 10.9909
+5.28632 5.79175
+4.80998 6.07002
+8.4021 9.81107
+3.16415 5.08682
+-0.212163 1.2052
+5.683 5.83625
+0.738527 1.31842
+2.03835 2.52756
+7.4543 8.91243
+-0.568869 1.44659
+3.58855 4.42371
+6.33058 7.18779
+-0.645579 1.94313
+2.18149 2.24157
+3.80281 4.67323
+5.14628 5.97452
+2.55239 3.45685
+3.56586 6.23355
+6.74752 7.19693
+8.99006 10.5533
+0.259833 0.99882
+8.9005 9.75401
+7.28058 8.41075
+4.57803 5.70104
+9.82823 9.90251
+6.94375 7.42033
+7.8878 8.81951
+5.01137 5.52693
+2.25503 2.28817
+6.65772 7.11107
+0.647512 2.04416
+4.34796 4.5706
+4.5395 4.91529
+2.65423 3.49531
+7.97384 8.78377
+5.53873 5.76806
+9.78641 10.1351
+6.01664 6.44407
+3.47406 3.75187
+4.59421 4.81804
+1.20641 2.00488
+2.48904 2.80768
+5.77372 6.10692
+2.49363 3.24499
+1.8483 2.62965
+2.28556 3.22209
+3.17819 4.51426
+3.5548 4.23276
+3.25239 3.57895
+0.613317 2.44862
+3.82234 4.78976
+4.72809 6.46528
+9.54107 10.4426
+9.20052 10.1921
+8.24152 9.89817
+5.17594 6.19462
+7.83364 8.17082
+5.67992 6.36464
+8.9943 10.1426
+2.20598 3.0081
+3.38199 5.16464
+0.599928 1.35804
+0.841211 1.60761
+5.29338 5.89919
+1.11061 2.29219
+3.41512 3.95907
+7.9375 10.0203
+8.73852 9.66917
+9.95092 10.0162
+4.02544 4.30219
+4.1461 5.37827
+1.08089 1.59196
+7.87513 8.21121
+7.85673 8.0973
+0.96237 1.56519
+2.45532 2.61678
+6.1829 6.23637
+0.135135 0.613518
+3.18324 3.78587
+5.64796 7.20194
+0.861169 1.71661
+9.66005 10.1169
+0.880774 1.12452
+1.29389 1.57658
+5.60299 5.89759
+5.53642 7.07306
+0.540268 1.31836
+6.60244 7.98105
+4.21877 4.57159
+3.15367 4.75356
+7.81055 8.40378
+8.00942 8.10861
+5.78071 6.35646
+3.15993 4.99293
+2.36526 2.78444
+8.1361 8.76071
+1.40066 2.96474
+-0.17906 1.05877
+5.94933 6.6808
+3.43187 4.05553
+3.02912 4.68942
+2.1506 2.29413
+2.3516 2.38305
+2.87496 3.0851
+6.71294 8.99858
+3.76177 5.52545
+1.58417 2.57063
+2.74646 4.27445
+5.48407 6.60696
+-0.133321 0.716559
+3.53886 3.58196
+2.28729 2.40198
+-0.209646 1.21263
+6.62795 7.32318
+0.714781 0.880466
+2.96831 4.05932
+6.00935 6.38896
+5.39798 6.11983
+8.47679 9.70468
+1.4339 1.74845
+2.35223 4.75732
+4.31357 4.9642
+5.26493 7.70538
+7.91888 8.94851
+6.51439 7.69469
+7.69015 7.85411
+3.94274 5.15373
+6.25852 7.32402
+2.73567 3.43236
+7.09564 8.42242
+2.55932 4.29066
+1.79489 1.84559
+8.86427 9.35669
+7.23854 8.27062
+7.8488 7.98307
+0.710888 2.22424
+0.0413624 1.10578
+1.54302 1.97696
+1.64924 3.01081
+8.15535 10.2397
+0.305662 1.63835
+8.20375 9.03123
+1.66617 2.08748
+4.01691 4.88505
+3.32856 4.10709
+5.15342 5.44616
+5.80751 7.38872
+0.485341 1.07648
+3.98267 4.20211
+6.96867 9.37655
+9.48055 9.85181
+8.39277 9.50424
+2.47589 2.79873
+3.48046 5.37417
+4.98279 6.01686
+1.29845 2.31199
+-0.204348 2.50289
+0.23488 1.00378
+6.26899 7.14823
+4.62903 5.49672
+0.199052 0.822066
+6.97297 7.69083
+4.23783 4.65198
+0.530497 0.839143
+6.61355 8.22831
+-0.0103941 2.16307
+0.148601 1.20044
+0.314438 0.67632
+3.43415 4.06208
+1.95498 3.25728
+4.23094 4.84942
+9.5493 10.0057
+2.64964 3.52073
+8.21388 9.1622
+-0.112496 0.47622
+7.97551 8.19546
+2.16155 2.6289
+0.38442 1.46032
+3.85675 3.91557
+1.00605 1.42016
+2.4853 3.53086
+-0.0765625 0.504366
+8.11302 8.46334
+7.18135 7.80218
+6.46466 8.12336
+3.75968 5.33954
+9.08789 9.73677
+6.47459 7.49454
+0.90148 1.47681
+3.44733 3.54163
+7.32968 7.909
+1.30055 2.75407
+8.78735 8.92461
+8.21764 8.59414
+0.888162 1.08404
+5.65195 6.26421
+6.23881 7.33284
+8.69731 9.88088
+3.55695 5.36909
+6.49248 7.02755
+2.31407 3.01952
+5.7803 6.1286
+6.30415 8.01577
+7.73864 8.27496
+0.741078 1.69184
+4.94671 5.68254
+3.28226 5.02894
+1.97446 2.60413
+3.26555 5.54754
+2.56179 3.41897
+3.20058 3.32486
+6.96915 7.69055
+6.89302 7.39856
+1.9659 2.61404
+1.31107 1.36867
+6.23573 6.33677
+0.17616 0.517772
+8.55548 8.79155
+9.61632 10.2651
+2.20331 2.34017
+6.93195 7.42939
+1.25398 2.23119
+1.06577 1.41048
+5.99156 7.09818
+3.34821 4.1271
+4.61618 6.90956
+2.30853 3.52875
+0.0518063 0.113732
+5.38513 6.09734
+1.73468 2.64838
+7.24679 7.63999
+4.18175 5.06728
+7.09602 7.13414
+9.06191 9.11605
+6.2309 7.67675
+3.96576 4.63237
+-0.552645 1.37948
+5.76964 6.89903
+4.9272 7.5832
+4.59003 6.49719
+4.12281 6.9664
+5.12256 5.58387
+1.78859 2.76954
+4.36808 5.05712
+8.41165 9.54483
+8.11513 8.43405
+8.42016 9.52715
+8.50598 9.34564
+1.80028 1.83558
+8.08502 8.43726
+6.96667 8.12021
+5.4726 6.26772
+7.1141 9.29989
+7.83324 8.1744
+8.74368 9.16491
+2.5515 3.01706
+5.92375 6.44495
+7.45628 8.41582
+9.04829 9.71503
+4.58856 4.75356
+7.26064 7.32462
+1.81695 2.40529
+6.88067 7.95052
+1.91408 2.02663
+1.32005 1.45025
+7.47733 8.42004
+4.99403 5.85297
+0.95744 2.28875
+-0.089503 0.536888
+1.09978 2.48865
+1.9959 3.098
+0.376116 0.448329
+3.98908 6.49684
+9.10178 9.51012
+5.41394 7.31529
+6.60708 7.59071
+4.38466 5.76203
+1.84355 2.60304
+0.658705 0.933522
+6.98725 7.05509
+5.60064 6.98804
+1.0603 1.1521
+4.06192 4.46156
+0.351018 1.00807
+9.17113 10.2192
+6.71641 6.74659
+8.85392 10.5272
+4.50816 5.22908
+1.13934 2.43196
+3.3746 3.57576
+7.62137 9.3234
+6.93482 7.16058
+5.66506 6.44324
+5.13364 5.86068
+1.97257 2.03803
+2.69746 2.73067
+0.989591 1.38342
+4.18819 4.69676
+4.31608 5.12265
+2.79556 4.87763
+3.55387 5.34421
+-0.112466 0.585639
+2.43156 2.70221
+5.88314 7.08322
+-0.450332 1.29858
+1.22202 2.46588
+6.74433 7.32925
+5.14596 5.37435
+6.76754 7.41799
+1.48762 2.45958
+4.57241 5.3382
+4.17465 5.02296
+6.48856 7.5576
+0.383566 0.823394
+8.50875 9.08734
+1.79393 2.24548
+5.06812 6.49508
+3.55364 3.61502
+5.58973 6.58885
+0.631097 2.10041
+0.323995 0.941782
+8.8798 10.1036
+6.37114 6.88202
+6.9393 7.83288
+3.09503 3.41759
+3.65269 3.70305
+5.61676 5.8924
+1.90199 2.38446
+4.23683 5.35609
+9.18649 9.88878
+8.28736 8.37734
+3.04805 5.03593
+8.02926 8.38975
+3.58161 4.01331
+3.20923 3.48207
+6.85118 8.78281
+5.06518 7.49843
+1.57456 3.05552
+3.0154 4.23782
+2.83557 3.24854
+1.29358 1.89328
+1.42911 2.72661
+3.17067 3.96651
+0.353554 1.48472
+3.46227 4.25611
+6.17639 7.24657
+5.60878 7.13562
+4.11129 5.52476
+9.17596 9.4123
+3.08339 3.65766
+4.083 4.63013
+0.628465 1.92141
+7.81989 8.39386
+3.35589 3.87531
+5.35974 5.41743
+4.48321 4.64376
+0.888177 1.37343
+8.49061 8.50063
+5.09078 6.01801
+9.65314 9.99342
+1.60502 3.0115
+1.37928 2.77642
+6.60322 8.94046
+6.74573 7.45157
+-0.291156 0.325249
+6.1518 6.66827
+5.38199 6.46959
+3.50128 5.22692
+1.31774 1.70159
+0.550546 1.48845
+7.51187 7.85496
+4.2014 5.23193
+3.88255 3.97209
+2.60555 2.84958
+5.15706 6.00036
+2.99284 3.27867
+0.395077 0.768383
+3.30863 3.60594
+0.0325231 0.379208
+6.55183 7.33346
+1.44554 2.95846
+0.245421 1.29751
+3.98808 5.41226
+5.90242 6.266
+4.11097 5.02597
+0.134753 0.929866
+0.609287 1.16311
+0.231832 1.06825
+6.22093 7.05584
+9.18429 9.80637
+0.544139 1.30185
+1.69143 2.90306
+6.75109 8.67893
+5.49641 6.76104
+8.91712 10.0271
+7.09126 8.12404
+8.82958 10.2847
+0.569249 0.69421
+3.59288 5.8053
+9.25068 9.4226
+8.51607 9.26259
+5.00906 5.17068
+1.83467 2.99102
+7.32006 7.64842
+0.405532 0.603773
+6.41882 6.60495
+0.721592 1.44375
+2.78393 4.46732
+7.14806 7.16117
+5.12868 5.27918
+2.74138 3.1737
+2.95394 4.26547
+7.82827 8.21028
+9.06982 10.7279
+0.108376 0.290131
+6.34574 6.97141
+4.39022 5.50801
+7.98339 8.79674
+3.80026 4.71831
+5.43594 5.66916
+1.6743 2.61476
+4.29763 5.47402
+7.95714 8.69311
+3.4152 3.7387
+8.01715 8.8941
+6.53723 7.44437
+-0.0222108 1.04503
+4.96242 6.01648
+1.70885 1.75511
+7.62434 8.53526
+6.82863 7.39782
+8.19967 9.22283
+1.99719 2.11323
+-0.0124079 0.240201
+4.48577 4.87935
+2.586 4.41666
+6.37848 6.67092
+4.39606 5.67983
+9.39761 10.1095
+7.10866 7.15796
+3.91993 4.52129
+5.10552 5.36997
+7.08963 8.32694
+9.12669 9.58509
+9.26894 10.1974
+0.737413 1.26523
+2.77833 5.28516
+3.19039 4.36857
+4.32954 5.45614
+4.98069 5.49295
+7.54745 8.76142
+5.70425 7.05749
+-0.250513 0.36578
+4.76997 5.89607
+2.03075 2.32111
+6.54141 6.55896
+4.19799 4.45091
+8.7796 9.11915
+5.75014 6.05646
+5.36885 5.42775
+-0.00433056 0.865304
+3.65169 5.4751
+0.23625 0.872926
+0.0386337 0.792214
+4.40245 4.56789
+6.44567 7.42162
+5.51394 5.98005
+3.50146 3.83147
+8.47573 9.85647
+7.91378 8.47044
+9.44297 9.90241
+5.962 6.68782
+4.49034 4.86927
+2.17774 3.47061
+8.80614 9.26595
+7.92096 8.13838
+7.80209 7.93317
+7.78915 8.29735
+6.98111 7.162
+0.491059 1.14901
+8.97965 9.38792
+3.30207 3.53207
+3.17127 4.43581
+3.97564 4.43746
+6.79008 7.17877
+5.61669 7.51263
+4.0853 5.38748
+4.42181 6.32041
+8.08599 8.9095
+2.46938 2.55499
+1.20692 2.06351
+1.98995 2.35216
+8.17116 9.17158
+7.53414 8.37086
+3.7744 4.46197
+3.29464 4.38
+7.33246 7.81959
+4.89572 6.2831
+-0.152496 1.56427
+0.636242 0.938556
+5.62066 6.06096
+9.42994 10.473
+8.95446 9.46311
+0.277891 2.80311
+6.92968 7.29845
+2.75677 3.02975
+2.2859 2.51308
+2.96683 3.03857
+6.44584 6.49518
+8.33607 8.60407
+7.20303 7.7616
+7.07205 7.46849
+2.35677 2.7904
+5.86404 6.12906
+2.42371 4.62735
+3.27237 4.11016
+0.0668578 0.644021
+6.77371 7.45187
+3.66596 5.21874
+0.718034 0.755944
+6.06162 7.05
+6.91473 7.09753
+5.0749 6.08914
+0.759874 1.11978
+8.54591 9.64997
+3.97266 4.70679
+1.51133 3.17164
+7.21772 7.69877
+8.00719 8.37052
+0.284003 0.38001
+4.08842 4.16227
+5.04461 5.79973
+4.60604 5.31979
+2.2461 2.28157
+6.25631 7.69766
+9.12404 9.67586
+7.73134 8.98923
+1.0513 1.46408
+9.17225 9.42567
+3.66795 4.29168
+8.84403 9.28497
+9.93613 9.94729
+3.16615 5.09374
+-0.149675 1.43397
+2.30855 2.48392
+0.843172 0.951801
+8.32945 8.8506
+8.97012 9.94697
+2.8559 2.92359
+-0.321715 0.89173
+7.48565 7.71775
+1.44301 1.47795
+6.6649 6.76187
+9.10721 9.93599
+1.82207 3.03935
+3.61893 4.5306
+2.53746 3.81243
+0.424528 1.29026
+9.51874 9.68841
+7.94954 8.14396
+7.49282 7.52655
+3.04604 3.69656
+9.45461 9.47212
+7.69209 8.16412
+0.607135 1.16564
+0.150291 0.450632
+3.28914 4.01085
+5.45597 6.02921
+8.16157 8.36605
+9.76573 10.2325
+0.151994 1.07074
+1.3748 1.68548
+2.29854 2.63593
+7.92162 8.68895
+1.28795 1.61949
+7.85469 8.26683
+4.32268 6.33174
+6.13964 6.3596
+1.25714 1.88002
+2.05006 2.28294
+8.31864 8.34151
+9.0613 10.0715
+-0.041568 0.25139
+6.79984 6.81686
+5.10674 5.70583
+5.92937 7.01652
+7.57649 8.05834
+0.937157 2.25362
+7.48567 7.59746
+2.33403 2.88942
+7.3805 7.73421
+5.586 5.75327
+0.828854 2.12988
+8.22741 8.59954
+9.69214 10.1207
+6.55359 7.08114
+1.85342 2.634
+6.08756 7.28893
+6.34993 6.93474
+8.93548 10.1463
+5.49445 5.8338
+1.47951 2.14646
+2.62089 2.75888
+2.35352 3.10539
+4.98774 5.28931
+4.92239 5.40697
+7.52674 8.78948
+4.52451 4.83819
+5.45854 5.75838
+5.51553 6.3901
+4.82905 6.44407
+6.20655 6.4483
+5.68116 7.06109
+7.97301 9.15827
+8.8854 9.91623
+9.60198 10.2449
+1.93322 2.67684
+0.441852 1.87646
+5.19981 5.71385
+2.54799 2.5809
+4.34591 5.02655
+7.54678 8.75202
+6.1496 7.19033
+1.13658 1.30756
+1.38724 2.08252
+2.13624 2.30419
+8.49196 9.41369
+-0.21387 0.685093
+2.47875 4.19982
+3.69093 4.00543
+5.70643 6.50331
+7.07443 8.83588
+6.85756 7.68937
+1.69241 1.83242
+0.140565 0.502156
+2.15007 3.23784
+4.97403 5.69757
+5.08315 6.25554
+3.45026 4.01942
+3.37482 4.73009
+7.4154 8.34013
+6.95399 7.59768
+8.07995 9.86199
+8.43993 8.88645
+7.66844 8.12742
+-0.0200687 0.435846
+4.47984 5.9416
+7.66804 10.0801
+4.14578 5.98717
+0.256533 0.89254
+6.43216 7.4474
+3.60295 4.79419
+3.90129 4.29812
+5.30606 5.58674
+9.11552 9.79229
+5.60702 5.85299
+2.39514 2.64865
+4.51164 4.60227
+6.31154 6.77441
+3.12239 3.13505
+7.50962 7.89478
+3.90928 4.88831
+9.64625 10.0629
+5.9465 6.02877
+2.08554 2.10477
+0.087547 0.34748
+2.34295 2.53703
+6.846 7.3043
+1.37869 2.11446
+4.03371 4.26278
+5.38623 6.40917
+4.75848 6.25417
+6.03478 6.15991
+-0.585543 1.2091
+2.52824 3.57712
+3.95687 5.40914
+4.42955 4.71909
+2.9328 3.98848
+5.40471 6.97056
+7.64789 9.30279
+6.19595 7.07492
+8.27328 9.41596
+8.29855 9.13665
+2.54035 3.10488
+8.25038 8.87903
+5.66599 5.88701
+7.40067 8.71195
+6.63762 6.67694
+-0.0163105 1.72666
+4.77743 6.60356
+0.567991 1.14977
+5.96841 6.42987
+3.02266 4.58424
+6.72121 7.35492
+7.51477 8.65223
+8.55055 8.81014
+5.59759 5.82816
+0.218944 1.82542
+1.03197 2.36652
+7.84302 9.1594
+2.11542 4.7332
+6.37618 6.92981
+1.34963 1.59353
+0.516281 1.08859
+-0.0151152 0.0624718
+6.45603 7.23063
+4.76865 5.46588
+7.5893 8.42021
+1.04534 1.99034
+2.62638 3.04997
+5.00254 5.98512
+7.7588 9.44547
+6.82186 7.34321
+8.7629 9.82272
+-0.309554 0.54858
+4.19843 4.92981
+5.62327 6.80846
+6.40599 7.6073
+6.1547 6.53898
+3.93941 4.44985
+3.28342 3.72778
+7.17256 7.23035
+2.31269 3.05437
+7.99132 8.20926
+7.19338 8.08381
+7.29139 7.96441
+4.25818 4.4208
+0.802894 0.81938
+0.990115 1.04066
+0.443898 0.490936
+3.44459 3.95977
+9.07812 10.3145
+7.86709 8.26338
+-0.230114 0.390748
+7.50905 8.49199
+-0.715424 1.97535
+2.92248 3.12903
+5.44209 6.62431
+0.991914 1.99037
+5.92275 6.7724
+9.10818 9.2797
+4.46434 4.83462
+4.21122 5.48353
+1.8721 3.40764
+7.04713 7.60526
+3.76581 4.76317
+7.00667 7.36475
+6.87244 7.39431
+7.6349 8.46695
+-0.0728922 0.351194
+5.02925 5.6834
+1.45779 2.83702
+0.339175 1.46574
+6.40414 6.9165
+6.30401 6.91007
+5.6392 5.78172
+5.63288 6.44639
+7.45285 8.89031
+4.09741 4.57929
+8.76728 9.06448
+1.62324 1.84552
+5.72509 6.54553
+8.65273 10.3652
+7.3362 7.8953
+8.96224 10.3113
+0.217316 1.7827
+1.28523 2.90127
+8.78746 9.11602
+8.6075 9.9606
+-0.647788 0.779976
+4.9702 5.47602
+4.15553 4.57497
+1.08174 2.80993
+4.01011 4.8145
+6.79603 7.2317
+4.3711 4.43566
+9.65087 9.79922
+8.19407 9.21784
+3.04008 4.94094
+6.0883 7.23919
+6.88708 6.97172
+0.438073 2.00665
+8.53083 8.83004
+4.22258 4.65233
+6.72856 7.61085
+3.17591 3.18978
+5.07955 5.6938
+2.09043 2.55351
+3.28085 4.43556
+7.29225 8.03925
+7.78034 7.82608
+6.59677 7.67719
+5.56032 6.38139
+8.72663 8.82535
+2.96505 3.11983
+1.67192 2.11727
+7.85386 8.49025
+6.30965 6.72799
+8.53082 9.3801
+2.8976 3.39972
+8.90427 9.44661
+-0.0665785 0.410254
+4.58099 5.81135
+1.88015 2.21838
+3.38693 4.10149
+7.46378 7.68246
+8.80985 9.72212
+6.54877 7.25642
+7.18249 7.71509
+7.41978 8.64805
+1.00839 1.78626
+0.39421 0.526751
+7.13516 7.28317
+7.28011 7.80573
+1.90158 2.49032
+1.66181 4.17994
+8.81106 9.21133
+9.46151 10.5007
+0.52585 0.575082
+7.66495 8.64072
+7.72794 8.50991
+4.92409 6.23879
+2.28769 3.21774
+3.62671 4.40932
+5.77688 7.31314
+8.94253 10.0664
+0.416618 0.635111
+1.81377 2.41356
+7.91755 8.83363
+1.62715 1.82626
+8.22065 9.51656
+0.020228 0.724724
+8.81119 9.95764
+8.66509 9.61079
+5.28201 5.32152
+3.95724 4.22138
+7.09339 7.77685
+9.63428 10.1514
+3.69117 3.779
+3.82195 4.76757
+5.75824 6.62265
+3.69984 4.75163
+3.58259 4.8788
+8.32635 8.85873
+5.81959 7.32506
+8.11265 9.14304
+2.20118 3.32511
+7.79582 8.52691
+6.5891 7.13584
+0.385393 0.440656
+1.13414 1.9951
+1.76482 2.69977
+4.76194 5.82757
+6.33633 7.5348
+4.7663 5.65083
+1.98298 3.01285
+0.956973 2.38629
+5.60955 7.65827
+9.11064 9.14351
+2.99933 3.37975
+3.36304 4.57437
+3.89886 4.50733
+8.73838 9.3514
+9.11824 9.66042
+1.47961 2.93909
+0.615297 1.13217
+1.70646 2.32478
+4.35168 4.99362
+0.986601 1.18332
+4.01551 4.92342
+7.68944 9.86838
+4.47611 4.85316
+0.051839 0.86288
+3.59624 5.5628
+7.08729 8.90374
+9.53464 9.9196
+4.69871 5.74189
+8.43146 10.6889
+3.23774 3.77777
+9.35399 9.62741
+1.15259 2.69451
+6.6368 7.33773
+5.26395 6.09857
+6.87415 7.21717
+-0.925645 1.06118
+8.49641 8.67659
+2.31486 3.25354
+2.51057 2.58303
+0.921997 1.48762
+6.29777 6.74738
+4.03945 4.27305
+7.1668 7.3471
+8.44572 8.80343
+7.16937 7.84526
+8.89008 9.4332
+7.01815 7.66319
+-0.420804 0.982878
+1.59755 1.64672
+0.700814 0.72579
+6.3138 7.37379
+8.49276 9.93522
+-0.795656 0.819657
+0.772253 1.05926
+0.917593 1.3917
+3.30076 4.12274
+-0.0237176 0.260552
+6.82385 7.49119
+6.98638 7.52012
+8.24915 9.08397
+4.17486 4.25908
+3.08435 4.64404
+8.17114 9.91412
+8.95923 9.3751
+0.596707 1.89462
+0.982917 1.40236
+6.79552 7.36657
+8.2599 9.69551
+8.85126 10.4342
+7.98967 9.14514
+0.766355 1.63286
+7.76211 7.99247
+5.23163 5.89338
+4.4707 5.50457
+9.257 9.27862
+2.11049 2.59654
+1.65501 2.06238
+0.551768 2.10873
+0.0285582 0.194421
+3.66153 3.85615
+5.07097 5.55806
+5.29145 5.80735
+2.03499 3.0863
+0.73171 2.29494
+2.63023 3.6417
+6.17478 6.25997
+5.79646 6.46363
+9.10633 10.5516
+7.23415 7.84823
+6.49951 7.1506
+9.94647 10.0242
+7.91236 8.09097
+7.8127 7.97662
+3.34238 3.42907
+8.50796 9.8311
+8.75792 8.98028
+9.34125 10.4441
+2.84413 3.71602
+1.49884 2.35652
+7.52317 9.18955
+9.5587 10.3525
+4.85436 6.1181
+5.91369 6.12194
+6.88463 8.34471
+1.51952 2.99156
+4.29022 5.12674
+8.0229 8.41246
+2.44841 3.04779
+7.59975 7.91485
+2.74491 3.62575
+0.0169968 0.240919
+5.85351 6.29039
+4.99825 5.93439
+2.153 3.35304
+1.19032 1.41763
+6.13337 7.80615
+7.05013 7.89364
+8.38056 9.92
+6.35525 6.64521
+3.93342 5.15885
+2.87656 3.47116
+3.56176 4.41159
+6.72084 7.9171
+8.03801 9.12442
+1.03329 2.56255
+7.64542 8.61709
+2.85627 2.89437
+8.8303 9.79838
+1.08032 2.34573
+7.51366 8.39169
+9.09685 10.3677
+6.753 7.41904
+-0.217662 1.42059
+6.72492 7.97553
+7.99325 8.8976
+0.765372 1.10894
+4.37958 6.04671
+8.72027 9.58928
+6.00234 7.29277
+8.43912 9.25356
+2.98816 3.17389
+0.4292 0.552167
+1.69827 2.80318
+5.99904 7.09981
+4.68367 5.87791
+-0.203208 1.09587
+2.65367 3.28472
+3.87051 3.88111
+6.36178 7.18853
+-0.0815935 0.200848
+6.82255 7.18488
+4.99295 5.08405
+2.67155 3.08447
+5.82099 6.77145
+8.76434 9.01086
+5.94982 6.18665
+3.23369 3.71743
+0.934129 2.73456
+1.13233 1.24208
+8.21931 9.03906
+6.25425 6.69972
+0.971299 4.21205
+5.68426 6.45281
+2.85786 3.3955
+8.17715 8.88439
+2.72802 5.01235
+6.12811 6.53711
+5.22878 6.45864
+0.453655 0.922032
+0.466162 0.85262
+2.40916 2.64759
+5.63583 6.37476
+2.18434 3.14105
+0.912811 2.08432
+8.9464 10.1515
+6.77323 7.27133
+0.7167 1.60579
+5.89813 6.32997
+7.66593 8.4611
+6.54145 6.88337
+5.95421 6.21188
+1.10383 1.92226
+5.37168 5.65707
+1.51874 1.66339
+4.60748 5.00384
+8.97354 10.5394
+2.05022 3.20373
+8.17316 8.19283
+2.33792 2.72643
+8.81577 9.3704
+5.95738 6.59855
+5.69025 6.17335
+6.91889 7.88142
+2.17529 2.81528
+6.65046 7.19698
+7.10694 8.78046
+2.09613 2.47484
+1.92423 2.25333
+-0.0906039 0.861376
+6.61481 7.70609
+6.7448 6.84276
+3.43655 5.28405
+6.05404 6.48902
+3.24637 3.36149
+5.69528 5.77157
+5.12352 5.31024
+7.65858 8.80828
+3.69209 4.4851
+0.25765 1.29637
+3.1537 4.13191
+3.12328 3.83765
+2.99798 4.8748
+4.49566 4.67827
+3.50822 4.03987
+8.00334 8.34084
+8.61039 9.00704
+0.0332147 0.166124
+4.55193 5.36546
+4.20308 4.31589
+0.955466 1.20095
+-0.382972 1.47625
+0.803913 1.01916
+3.78333 4.0707
+6.58604 6.70173
+3.02066 3.82562
+1.16515 2.2816
+7.87242 8.24214
+4.057 4.60368
+2.84714 3.59726
+2.77804 3.69136
+-0.139996 1.36416
+4.50647 6.37579
+8.86647 10.1549
+9.24372 10.1442
+0.743107 1.84722
+6.18761 7.65841
+0.214887 0.443938
+8.8513 9.55063
+4.04856 5.79916
+6.69671 7.10025
+6.97477 7.79702
+4.82551 5.10538
+0.821772 2.85828
+9.3086 9.74805
+5.45623 6.66668
+7.64296 8.67451
+7.53052 8.31024
+7.45352 7.5063
+1.31412 1.4979
+7.81176 8.48083
+0.228964 1.73207
+5.52579 5.93103
+6.58544 8.48938
+2.75407 4.18746
+3.21396 3.96298
+1.13806 2.34106
+0.899331 2.87945
+5.69016 6.61624
+2.48172 2.58082
+0.676004 1.43405
+3.41766 3.9503
+0.104554 0.298373
+6.50673 8.21831
+6.00349 6.69385
+9.62453 10.3147
+4.09379 6.02911
+-1.12803 1.68823
+1.83324 3.43133
+8.30576 9.09288
+-0.363911 0.405218
+1.91686 3.34928
+6.98331 7.15885
+-0.31591 0.996789
+0.145813 0.35408
+5.32016 6.13679
+6.99664 7.48644
+-0.140875 0.821045
+9.0119 9.19742
+1.69616 1.72453
+4.38064 5.07542
+6.85898 7.55478
+3.9145 4.27935
+5.77592 6.16806
+1.45345 3.01301
+4.13024 5.59662
+8.14557 8.41669
+4.00075 4.829
+-0.283024 1.59436
+5.92468 7.17507
+6.84458 7.18356
+1.06987 1.42839
+8.618 8.66235
+0.432802 1.59512
+3.78058 4.36051
+1.6113 4.21135
+6.73475 7.01057
+6.74819 6.90498
+6.93146 8.54681
+9.02605 9.91613
+3.888 4.00526
+1.07958 2.27915
+4.78456 5.10764
+3.92952 4.89555
+9.09348 9.30304
+6.73107 7.21036
+7.42366 7.73225
+4.04079 4.72919
+1.21726 1.34683
+8.82903 9.73504
+0.577663 1.00786
+1.56822 2.08675
+4.84315 5.44994
+1.01008 1.16524
+5.99782 6.01535
+0.996739 1.75305
+4.76128 6.39012
+8.93563 9.51972
+-0.0698166 0.453543
+5.9084 6.95139
+0.535401 0.692258
+4.80729 5.48335
+3.42581 4.76147
+3.58715 4.43541
+7.50236 7.71227
+5.19742 5.87901
+1.79752 2.43097
+7.29762 7.57608
+5.65169 6.47762
+6.02249 7.93642
+0.840131 2.81176
+6.2646 6.96911
+7.46014 8.17136
+9.79049 9.94054
+4.61094 5.35819
+7.30902 7.41873
+1.21883 1.84621
+6.41743 6.57736
+1.53114 1.62859
+6.73237 7.47083
+6.05618 7.56831
+7.63374 8.16821
+5.20839 6.05382
+0.619043 1.44065
+2.38657 4.88786
+3.88289 5.18788
+4.42283 4.51106
+9.15575 9.22388
+3.18678 3.72243
+3.20638 3.65935
+4.2219 4.97961
+4.63725 6.90959
+2.57123 2.59101
+4.08581 4.37325
+6.53926 6.80412
+1.77475 3.89149
+9.22854 10.426
+2.67375 4.36551
+3.17194 4.0433
+1.10304 2.0348
+3.67233 4.04957
+3.23526 3.5012
+5.17684 6.47301
+4.4 4.67662
+4.15842 5.85903
+5.88496 6.61616
+7.26489 7.51279
+4.17402 6.6997
+-0.540216 0.54573
+4.36063 4.60442
+9.18146 9.96239
+0.977216 2.42032
+9.09143 9.61178
+5.06686 6.23076
+2.04772 2.92048
+1.4154 2.00707
+7.80442 9.54824
+4.55549 4.7148
+7.56964 8.80172
+1.35347 3.21648
+9.12751 10.0605
+1.81735 2.06061
+5.63798 8.0918
+6.79492 7.98002
+9.23053 10.1299
+1.74639 2.02724
+3.71825 4.09879
+2.4995 3.42493
+4.1255 5.66758
+4.75493 6.99687
+8.22481 8.72036
+6.13689 7.53026
+5.41315 5.66358
+4.21425 5.62743
+6.22936 6.44392
+2.02303 2.96414
+-0.0655462 0.130508
+6.1487 6.70994
+4.36674 6.24985
+7.51129 7.63176
+7.9729 8.98613
+3.92117 4.15596
+4.54398 5.43399
+6.34248 6.92305
+-0.550253 1.16167
+9.15142 9.53717
+8.99354 9.65952
+6.28988 7.90053
+3.36505 3.782
+8.80005 9.70553
+1.99947 2.18573
+1.15023 2.07069
+0.253723 1.32958
+2.0392 2.93977
+2.89024 3.00836
+8.16735 8.2049
+1.49508 2.95258
+6.19092 7.44552
+2.33328 3.06758
+6.44166 7.4649
+7.34749 7.79488
+7.5557 8.04141
+2.76812 5.13617
+7.97308 9.25668
+4.73539 5.22234
+7.53377 8.41651
+-0.355405 1.36499
+4.72111 4.73744
+-1.22753 1.84842
+5.5033 5.63808
+3.95421 4.19313
+6.24752 6.98229
+4.49694 5.07277
+3.70871 4.30093
+1.31984 1.50116
+7.16044 8.70868
+2.44587 3.34659
+6.08322 7.20376
+2.75012 2.82555
+0.0394442 0.863634
+3.90896 4.73696
+4.77494 5.04158
+8.41473 8.82932
+1.7049 2.71024
+9.01684 10.1044
+4.57959 5.01066
+3.2484 4.21875
+1.11596 2.88792
+3.53616 4.14001
+5.80672 5.82478
+5.85844 7.70293
+6.18239 6.30124
+2.22913 3.23412
+2.97521 3.08481
+2.2749 3.70611
+2.3457 3.86609
+2.71695 4.04473
+7.22863 7.40115
+1.80428 2.39815
+1.80781 2.33028
+2.78662 3.14936
+9.40717 9.94906
+6.54968 6.80773
+2.76862 3.24492
+1.96034 2.87404
+3.53295 3.54927
+5.36042 5.67073
+8.63339 8.93752
+0.932415 1.70402
+4.32923 4.55594
+9.3491 10.4969
+0.121416 1.15499
+-0.172998 1.36319
+2.02349 2.29887
+1.75352 2.35329
+0.502555 2.01665
+6.71754 6.80014
+3.35175 3.93337
+7.17133 7.9851
+8.51299 9.95771
+5.86103 6.36734
+1.44593 3.46008
+4.49699 4.60855
+2.29261 3.10053
+6.68713 8.19499
+5.43776 6.84387
+8.58591 9.02134
+5.24746 6.15595
+1.3847 2.5074
+6.62143 7.07775
+1.7101 2.077
+9.70898 10.2789
+6.67451 7.92058
+2.56858 3.60374
+1.61917 2.60482
+1.77902 2.16908
+4.76209 6.00461
+3.8894 3.98269
+7.0278 7.276
+5.4866 5.59417
+1.69306 2.92506
+2.45744 3.76592
+2.5689 2.80611
+5.98283 6.06154
+9.5267 9.9626
+9.55652 10.4128
+6.6111 6.64606
+3.38826 4.26111
+3.61887 3.73455
+4.14924 6.13796
+7.15863 7.28212
+5.78984 6.56662
+2.09304 2.2681
+4.39867 4.88557
+6.20907 6.81034
+4.63336 4.91476
+0.939805 2.43621
+1.56774 5.13599
+8.40908 9.82058
+2.06273 2.20306
+2.53524 5.01482
+2.9314 3.23661
+2.48535 3.47368
+0.366389 1.4699
+8.81131 9.01654
+2.05102 2.87972
+1.9699 2.22723
+6.18333 6.98224
+1.3425 2.4443
+0.767883 1.77423
+3.1538 3.43248
+0.891006 0.903458
+5.7136 5.8713
+0.437569 1.37539
+3.98533 5.01646
+8.65764 9.89518
+3.74889 3.98561
+7.74507 8.30657
+8.24671 8.43006
+6.88467 7.42036
+1.99426 2.03522
+1.90486 2.04181
+1.12911 1.71807
+9.25253 10.105
+1.92989 2.0346
+5.60044 6.25585
+9.16848 10.087
+6.67824 6.72257
+1.88522 2.80222
+0.242758 0.852689
+5.09249 7.71484
+5.54974 6.44414
+7.66767 8.72936
+3.48884 3.83156
+3.4697 5.14646
+8.48582 8.7692
+6.76259 7.06897
+7.83856 8.62005
+5.81853 6.76571
+2.04803 2.94439
+6.85396 7.22985
+6.52449 7.39764
+9.26838 9.34809
+4.64449 5.64975
+7.51845 7.80279
+-1.27268 1.65344
+0.686101 4.20373
+7.80552 8.37119
+7.20419 8.35284
+9.33962 9.87975
+4.31238 5.58683
+2.39198 3.84398
+1.29248 2.59269
+4.71612 6.195
+5.27332 6.52174
+7.71492 7.84702
+8.18064 8.72233
+1.55223 2.31294
+6.34374 7.31758
+6.48966 6.92611
+2.62268 3.09895
+4.09064 5.06197
+2.66367 4.12126
+1.53391 2.93092
+8.64516 8.70655
+9.20047 9.28957
+4.00474 4.11716
+8.5418 9.45901
+8.73386 9.73253
+9.22596 9.63179
+1.34204 2.7834
+8.4489 9.21027
+7.75158 8.51085
+5.98856 6.11212
+1.29906 2.08111
+9.24315 9.76291
+6.84345 6.91607
+5.88294 5.90545
+3.03022 3.39941
+3.22222 3.4089
+1.12791 1.65898
+6.70232 7.36336
+8.60042 8.82377
+1.26451 1.30362
+2.76682 2.92693
+1.54763 2.19582
+6.5865 7.24173
+4.15242 4.21742
+8.39615 8.78524
+1.67017 2.08717
+9.03012 9.97041
+2.31463 2.45877
+8.29872 8.51813
+1.66689 2.51919
+-0.807606 1.47794
+1.31452 1.94418
+0.0739222 0.512106
+4.23577 4.25889
+7.45273 7.97505
+3.34234 3.46608
+7.97304 9.14131
+1.9029 2.99946
+8.84087 9.79689
+4.92769 5.68685
+2.74004 3.04513
+0.889257 2.20448
+3.10574 3.9758
+3.91547 4.32303
+7.17475 8.07377
+5.92903 8.03738
+1.57974 1.65527
+3.76339 4.2285
+2.28263 2.7559
+9.53105 9.87477
+2.10154 3.2222
+4.23683 5.34347
+1.38769 2.48482
+5.39838 5.51872
+8.50975 10.1382
+8.04108 9.21474
+8.5252 9.67823
+8.893 10.7726
+7.1294 8.18211
+1.15642 1.73882
+0.436911 0.756698
+3.66142 3.71659
+6.37686 6.7
+8.88506 8.99896
+2.31891 3.79061
+2.61615 2.81909
+1.35216 1.39571
+3.04217 3.52564
+7.8409 9.34099
+0.470596 1.49157
+6.94014 7.18365
+8.05483 8.49979
+8.18511 8.25608
+7.03597 8.45251
+2.47411 2.65172
+0.112716 0.193057
+4.45039 5.10584
+4.53906 5.80013
+5.11702 5.27151
+1.24211 1.90757
+4.64114 4.72912
+1.77254 3.45037
+-0.1275 0.99675
+5.69637 7.67722
+2.21252 2.44032
+3.89623 4.40192
+2.79904 3.15569
+8.37911 9.42424
+5.27199 6.2026
+1.84791 3.75411
+0.522801 0.54806
+3.83644 4.64785
+6.65497 7.55638
+6.75104 6.98564
+2.34979 2.98049
+8.27176 8.60459
+5.07773 5.44064
+1.16934 1.98872
+4.2914 5.37557
+6.83462 7.95408
+3.91405 5.73229
+7.77473 8.53538
+9.23441 9.90185
+4.03659 5.2473
+5.99336 7.8004
+4.2432 5.89276
+6.39847 7.81276
+9.13909 10.4164
+1.12009 2.5649
+2.35157 3.18468
+4.46918 5.55572
+3.82512 5.53666
+7.18238 8.10193
+8.40911 9.23639
+8.99555 10.4192
+6.69547 8.87825
+4.79012 5.34858
+9.23615 10.0986
+-0.590587 1.14603
+2.74289 3.48244
+-0.248403 1.1591
+3.35663 3.7229
+7.37504 7.6481
+6.64796 7.64695
+0.778081 2.41212
+4.49242 4.7772
+8.01419 8.109
+6.6494 7.76619
+8.86331 10.1205
+0.817273 0.937855
+8.00019 8.21556
+6.19405 6.54794
+6.11798 7.30421
+3.40164 4.28921
+5.31927 6.21584
+2.79377 3.40938
+3.59494 3.90321
+7.79218 10.3132
+2.99546 3.86111
+1.71916 3.40283
+6.1768 6.81915
+7.59629 8.68568
+1.59724 2.348
+6.20151 6.5391
+6.30798 6.70478
+0.489786 1.51322
+1.28396 1.86775
+5.18031 5.43007
+6.61276 7.70565
+1.4909 2.11165
+4.56163 5.49277
+1.93598 4.35147
+3.65568 5.00224
+1.68028 2.00363
+7.82874 8.67399
+1.23053 2.87598
+-0.164275 0.194491
+2.58349 4.01302
+1.23279 2.02984
+0.599702 1.09257
+9.50965 9.80164
+2.33108 3.58037
+4.38659 4.62378
+2.65097 2.87349
+0.0537058 0.576502
+4.20415 5.15693
+5.41458 5.98382
+4.37747 5.10347
+2.62536 2.70073
+6.96845 8.15356
+6.91533 8.41638
+9.36431 9.58863
+6.13019 7.25915
+2.7818 3.4951
+9.44641 10.1301
+2.68817 4.19772
+5.65664 5.6814
+8.25308 10.498
+3.50374 3.64458
+1.47063 1.78567
+8.21901 8.98152
+3.99261 4.47339
+2.51395 3.38788
+4.66178 5.24959
+9.08415 10.3467
+5.92351 7.20447
+1.74145 2.35957
+7.62653 8.96797
+6.43542 7.68775
+5.49047 6.56355
+4.9225 6.22555
+0.257967 0.704837
+3.42488 3.52873
+8.67606 9.77824
+5.12981 6.37856
+5.97359 6.32151
+1.58517 2.28129
+0.530687 1.54545
+7.04056 8.15296
+1.8541 3.1902
+9.46286 10.0098
+3.17967 4.02237
+3.49966 3.80271
+6.24894 6.49618
+1.19944 1.59215
+5.30422 6.94823
+7.49137 7.78584
+7.02669 8.16282
+2.21673 3.36471
+7.66183 8.34763
+4.13876 4.87421
+3.0199 4.07124
+8.40439 8.82943
+-0.274649 0.429602
+6.11215 7.65609
+3.34781 5.03006
+1.28231 1.77258
+7.57256 8.59456
+5.36208 5.81735
+7.18511 8.96618
+8.86053 9.49567
+5.39097 5.93211
+6.59094 7.26553
+3.69159 4.01914
+8.73797 8.81611
+1.41144 1.82827
+7.83555 8.07567
+6.13821 8.44907
+5.83432 6.48744
+2.93596 4.66271
+7.03215 7.59658
+1.65252 2.45337
+2.91358 4.90129
+8.94415 9.14642
+5.21005 6.1166
+0.33225 1.17039
+7.40089 8.07586
+9.30427 9.40776
+2.34188 2.81124
+1.02811 3.3344
+6.28117 7.62089
+4.80105 7.10049
+8.90252 10.0057
+2.20932 2.33093
+8.20746 10.6268
+4.31887 5.23945
+9.258 9.8985
+3.80742 4.15057
+1.11313 1.23711
+9.53067 9.70165
+7.95467 8.67187
+9.66031 9.83223
+3.61385 4.09571
+0.623148 0.652817
+7.77809 8.62118
+0.86157 1.98606
+3.12528 3.75815
+1.9363 3.22621
+8.23521 8.99175
+8.95406 10.4487
+3.38526 3.90652
+0.34281 2.0226
+0.739384 0.793829
+3.55637 3.96384
+6.1562 7.28647
+5.30211 7.51385
+1.46275 1.78688
+-0.0144662 0.868488
+0.0740443 0.119828
+9.26206 9.83923
+0.743397 1.40754
+4.68823 6.62985
+8.8291 9.17373
+4.66711 5.09313
+4.023 4.44994
+5.68937 5.79194
+8.04835 8.06763
+6.94662 8.00075
+0.774686 1.13428
+0.381819 2.34757
+2.1235 2.63524
+5.42795 6.89998
+6.07662 6.29083
+6.47821 6.7872
+2.58305 2.6192
+-0.598336 1.23458
+4.29089 5.43332
+8.09914 8.28229
+5.05925 5.35258
+0.181705 0.444466
+3.27849 4.79932
+0.310314 1.43125
+1.13836 2.76825
+1.2529 4.09336
+0.198106 0.608625
+1.77442 2.23777
+6.29823 6.64574
+1.22125 1.37929
+1.77592 3.04011
+1.43999 2.90926
+4.20495 5.32396
+4.98874 5.33211
+8.36483 8.67875
+5.65373 7.14132
+2.8303 3.05037
+3.41509 3.54032
+7.21702 7.85857
+5.79848 5.8913
+4.52711 5.65511
+2.04663 2.66919
+5.76363 6.77903
+-0.153046 0.77878
+4.37474 4.49936
+6.86786 7.81999
+8.92084 9.16368
+7.5975 8.56954
+0.197493 1.07503
+3.99803 4.67019
+9.35123 9.60094
+1.46442 2.4256
+5.21501 5.79612
+8.80879 8.99085
+-0.109252 1.30631
+7.34965 7.87947
+7.08703 8.12723
+0.985946 2.14663
+0.48521 0.856118
+6.57719 6.70623
+8.71165 8.72286
+3.16883 4.8714
+-0.21189 0.412944
+3.6526 4.37121
+0.364649 1.3363
+9.27722 9.35135
+3.47517 3.8793
+5.67149 6.28631
+6.52789 6.61039
+9.36323 10.4189
+4.30743 6.18638
+7.93653 9.4877
+8.24024 8.41475
+2.75692 3.13935
+8.80223 9.1489
+3.42656 3.90557
+8.96598 9.3217
+1.99582 4.84803
+5.1178 5.8688
+4.47901 5.73433
+7.30397 7.85527
+0.18463 0.656832
+7.80806 8.41666
+8.50023 9.42628
+7.67563 8.64756
+9.46783 9.52169
+2.06797 3.3107
+5.08863 5.10167
+0.82146 1.39055
+7.5428 8.04736
+9.09407 10.8208
+9.15219 9.99706
+1.61637 3.46354
+5.3812 5.96247
+9.34115 9.73575
+6.49221 7.30031
+1.56337 3.39704
+8.463 8.60841
+-0.322779 0.658242
+8.50173 8.72125
+0.854851 1.83405
+7.81945 8.12841
+2.60724 3.19985
+5.03714 5.55331
+1.85041 3.36816
+7.26119 7.64364
+5.75223 5.99653
+4.00026 4.43863
+5.00939 6.03009
+6.22879 6.6638
+6.44231 7.18622
+1.66002 1.88587
+2.59781 2.84919
+4.96399 5.40545
+5.70327 6.95018
+6.97141 7.08346
+3.98535 4.6179
+5.96795 7.14997
+5.07581 5.8262
+4.65665 4.98851
+8.65646 8.70986
+3.04175 3.19155
+0.796073 1.0952
+8.24859 8.57828
+5.26952 6.34245
+7.94685 8.78542
+0.193963 0.968524
+6.61159 6.80186
+9.37533 9.79195
+8.94048 9.74959
+5.77272 6.48616
+6.0092 7.86718
+2.52621 2.58938
+8.91347 9.22421
+4.20466 5.45909
+4.82157 5.09167
+7.35464 7.36611
+5.12413 6.45063
+2.12404 2.81187
+8.88875 9.20752
+2.59731 3.20587
+1.54772 2.08968
+6.70449 7.08952
+-0.0967146 0.888521
+3.10207 4.34815
+1.20807 2.35497
+6.00753 6.08492
+3.21837 4.00446
+4.34095 6.0963
+4.24821 4.79576
+4.49523 6.6669
+1.49483 2.52552
+0.0411497 0.641526
+8.3854 9.20954
+8.12419 8.93702
+0.0201515 1.06914
+1.57617 3.44176
+1.4173 1.76847
+5.42261 6.51539
+6.6744 8.46109
+3.05234 3.59179
+6.49059 7.24618
+7.01989 7.69901
+2.34664 2.90601
+9.17324 9.86754
+5.50919 5.70258
+2.40486 4.6009
+3.74368 4.00093
+6.9211 7.33554
+7.41358 8.7413
+8.78284 9.62033
+2.96753 3.01602
+-0.200693 0.535532
+6.4383 6.45049
+8.28835 9.42148
+4.2379 5.35128
+4.68397 5.04593
+5.7185 7.03177
+5.37494 6.43977
+2.99518 4.08138
+7.28064 7.54638
+9.10622 10.4907
+1.23839 1.50915
+6.7823 9.24533
+8.45679 8.62427
+0.106718 0.69304
+2.84119 3.50375
+3.60466 4.51338
+8.04709 8.19023
+3.31632 3.48054
+5.9027 7.46331
+-0.621072 1.13003
+8.57167 8.69262
+0.301047 1.42246
+1.24229 2.44616
+0.962706 1.55754
+8.77327 9.55275
+1.77899 2.44335
+0.368575 1.84726
+9.05918 9.07832
+6.61723 7.68015
+8.59899 8.80383
+-0.133927 0.20271
+5.69266 5.74809
+0.68202 1.52342
+7.17359 7.91482
+5.74049 7.34297
+7.88371 7.9683
+1.58749 2.26543
+3.96728 4.45988
+5.4354 6.88336
+1.68706 1.6976
+6.56907 7.40696
+0.518151 0.724124
+8.99155 9.36995
+6.00506 7.91529
+5.26967 6.11536
+2.37416 2.50887
+8.47983 9.31509
+2.38155 2.54346
+8.08415 9.65214
+1.00693 3.19203
+1.6523 1.73553
+6.85283 6.9958
+4.11425 4.90193
+1.39597 1.58725
+5.05551 5.19458
+5.89969 6.11394
+5.9148 7.26824
+9.32271 9.93989
+1.62911 2.58215
+5.43399 6.14203
+3.11393 3.58792
+8.57619 9.3788
+2.23349 2.7884
+8.09022 8.54326
+9.7114 9.87076
+5.91086 6.10885
+7.35805 7.57276
+0.650002 0.879866
+3.24977 3.75531
+2.73948 3.41051
+3.08006 4.62772
+3.71868 4.31519
+4.13905 5.78577
+1.77297 3.02983
+5.85931 5.89333
+3.68972 3.93193
+1.43922 2.98425
+6.51534 8.33386
+6.6821 7.50874
+1.2541 2.11722
+5.40634 5.54411
+4.55502 4.60346
+4.32484 4.68497
+3.40711 4.31975
+9.20893 10.0853
+6.12594 6.9009
+0.12664 0.347193
+7.53378 8.82258
+7.79572 8.91645
+2.50098 3.39701
+4.17873 4.97732
+1.05822 2.47032
+3.1012 4.97736
+8.42126 8.74568
+7.83301 8.17843
+9.26618 10.584
+3.02667 3.7128
+8.30654 8.69242
+2.87173 3.43275
+6.59917 7.54843
+7.03447 8.20283
+5.75718 6.40637
+2.62899 4.1855
+-0.520148 0.902194
+5.1538 5.61763
+1.25625 2.33142
+4.16336 4.3384
+3.01296 3.41026
+3.16515 3.26305
+2.40944 3.21897
+6.80742 8.57141
+1.15125 1.54824
+8.72251 9.50878
+3.15703 4.04482
+0.470308 0.726093
+0.199979 0.878243
+7.8908 9.17915
+6.91793 7.16038
+4.64783 5.00217
+2.21237 3.03073
+1.5825 1.63362
+3.18806 5.20795
+5.92725 5.95595
+4.65027 5.09868
+6.42204 6.87201
+8.08637 9.40221
+4.95542 6.16185
+7.45987 7.57979
+8.826 9.13961
+4.42078 5.27977
+7.26216 8.97585
+2.26919 3.33512
+9.4077 9.81908
+0.722223 1.03378
+-0.0497795 1.19355
+8.22686 9.31082
+0.0733766 0.93037
+7.47883 7.9062
+5.28731 5.74181
+1.78496 3.61348
+0.690987 0.764344
+2.56442 3.54999
+4.27944 5.43124
+4.04412 5.35376
+0.663756 1.88268
+1.73567 1.78553
+8.07666 9.41842
+7.70138 8.42873
+9.27113 9.55873
+0.982413 2.5565
+0.994807 1.02007
+5.01226 5.31923
+8.87435 10.0597
+1.74836 3.22578
+0.151528 0.191719
+5.82608 6.06438
+1.17239 1.59955
+3.18515 4.11049
+1.92258 3.70604
+1.63692 1.8266
+1.83542 2.66228
+2.21954 3.11425
+3.97546 4.3928
+0.731374 2.05705
+5.44809 5.96359
+9.85934 10.0553
+8.42169 9.63654
+6.68148 8.43446
+2.00014 3.3485
+0.735924 1.73
+1.61833 3.05643
+7.87934 8.67316
+8.67441 10.0032
+0.794573 1.2493
+6.11926 6.41441
+5.2715 5.82597
+9.41854 9.46625
+3.46299 4.06742
+5.6487 5.79053
+1.46503 3.43496
+0.9957 1.53939
+2.4714 3.1301
+0.887049 1.6196
+3.04884 3.19662
+1.24337 2.05758
+7.61142 8.55766
+0.998279 1.64425
+4.74917 5.85236
+2.97632 3.94611
+4.11786 5.62709
+7.40498 7.62083
+1.47854 3.64736
+2.1176 2.64511
+4.55533 5.89436
+7.44618 9.79926
+-0.410242 0.737348
+5.719 6.30861
+8.33692 8.38222
+8.78122 9.98195
+3.75452 4.26866
+2.23771 2.44985
+6.72455 7.61362
+5.9797 6.58846
+6.72885 7.60315
+-0.710302 1.18332
+7.73287 9.383
+6.61213 7.67394
+4.12945 5.68527
+-0.300887 0.341615
+5.77978 6.41534
+8.34001 9.96874
+1.62323 1.8283
+1.71788 2.23905
+7.43484 8.0418
+3.47322 3.8047
+3.47311 3.51261
+7.82093 8.86377
+2.46973 2.99125
+7.91166 8.55065
+3.39807 3.43599
+8.94792 10.0437
+7.70859 8.32487
+5.86852 7.13103
+7.64996 9.19033
+6.66742 7.8092
+7.88241 8.58675
+9.42939 10.3479
diff --git a/geom_bottleneck/tests/data/test_012_B b/geom_bottleneck/tests/data/test_012_B
new file mode 100644
index 0000000..5f6e43c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_012_B
@@ -0,0 +1,5000 @@
+1.17434 1.46837
+2.58198 4.16589
+0.234041 0.968658
+1.52703 1.59579
+6.7103 7.44033
+3.19227 4.41539
+5.42556 5.57369
+3.45417 4.86089
+3.82256 4.1092
+7.82551 7.90784
+3.9384 4.71796
+5.60335 5.9054
+7.96663 9.8987
+6.30305 6.64853
+7.33246 10.5316
+0.623312 1.09008
+2.63041 2.64616
+5.36028 6.28956
+4.64202 5.91858
+7.55219 7.96304
+7.73736 9.18221
+1.67114 1.84851
+5.07514 5.12159
+7.03732 7.05228
+7.5006 7.59212
+0.244947 1.55875
+0.0170454 1.10485
+1.95394 3.53669
+5.66015 6.01949
+5.88211 7.64639
+7.46698 9.27085
+6.37429 7.10154
+4.54535 4.81932
+8.21203 9.35896
+4.89933 6.20802
+3.68683 4.17831
+0.477467 0.828394
+6.17871 6.77834
+9.77523 9.92676
+0.854808 2.38709
+7.93326 8.3553
+2.10917 2.27771
+4.07045 4.72793
+8.2016 8.8011
+2.9205 3.95746
+2.89806 4.39725
+5.5654 5.78669
+9.5219 9.98543
+7.08591 7.19588
+8.35359 9.57893
+9.81348 10.0345
+8.5994 9.71835
+5.43903 7.25234
+1.82768 2.92724
+4.44952 6.79754
+5.66747 7.34386
+5.88153 6.39253
+3.34008 4.22032
+2.46068 2.76051
+0.370778 2.61681
+6.02508 6.26809
+4.32654 4.93262
+7.41536 7.99616
+8.84229 9.87911
+3.8551 5.84353
+1.56832 2.34694
+6.96099 7.42028
+8.15753 8.72014
+9.23141 10.3815
+7.4484 7.80228
+0.473671 0.874895
+3.15689 3.50687
+3.58122 4.09945
+3.55022 3.74767
+4.42708 5.80211
+4.40956 4.68699
+3.80576 4.61856
+7.29965 8.28614
+7.40582 8.15308
+1.69789 1.77669
+1.66419 3.44308
+0.473997 0.872506
+7.83959 8.52898
+6.22416 6.36949
+-0.187159 0.871822
+0.232336 0.585965
+9.29905 9.44357
+1.4459 2.40589
+2.83008 3.19758
+1.15291 2.12112
+2.58686 3.33896
+6.79362 7.88068
+0.228178 1.48318
+5.60001 6.20258
+4.97803 7.10992
+1.70429 1.962
+2.72659 3.13886
+9.22714 9.25889
+3.84694 3.88778
+-0.282077 1.48155
+9.28756 9.58517
+4.34069 5.59751
+8.63909 8.76839
+8.86236 10.7642
+6.77597 8.41888
+7.30621 8.64164
+0.685607 1.22755
+2.91514 3.22638
+2.72098 3.66837
+8.17528 8.32638
+5.19632 5.7506
+7.34177 8.70639
+5.74082 6.35524
+5.95975 6.69284
+9.40187 10.4488
+2.92761 3.36735
+0.399531 3.13082
+4.83399 4.92635
+7.74539 8.56852
+1.76322 3.5086
+6.54479 6.72963
+7.64362 8.12404
+1.35542 1.45313
+0.214385 0.718085
+1.7006 3.21962
+5.91009 6.47862
+2.21093 2.34636
+5.96919 6.79365
+6.59951 8.22203
+1.54571 1.59397
+3.27012 3.79128
+0.32455 0.622995
+1.73926 2.78017
+9.81035 9.84077
+7.38441 7.85171
+8.90372 9.34186
+7.26323 8.41174
+5.7363 5.97348
+8.25473 10.1281
+2.3981 2.52096
+8.53783 9.63442
+8.51755 9.2735
+6.48614 6.773
+3.40182 3.65137
+2.1353 3.04852
+2.95397 3.73285
+6.98063 7.4963
+4.50189 5.26384
+0.21416 1.49363
+0.632196 1.36307
+6.57833 6.60481
+8.0634 9.33903
+2.79759 2.94462
+4.43747 4.58861
+6.48733 6.86569
+2.28008 3.47037
+6.87452 7.77431
+-0.156821 2.71557
+0.72595 1.78862
+1.97586 2.38196
+8.61839 9.1468
+4.55496 5.68986
+0.26923 1.15728
+9.63757 9.7236
+1.39497 1.96698
+4.8643 5.04172
+6.64675 7.66435
+2.56256 2.6015
+-0.381989 0.611211
+0.676336 1.26896
+8.95304 9.03243
+5.62058 6.07997
+3.36522 4.04276
+8.64868 10.5024
+4.75813 5.19834
+1.96608 2.05864
+9.01449 9.10397
+3.72786 4.51921
+5.6938 6.96584
+1.73499 2.9314
+2.73099 3.41409
+8.77171 9.07665
+4.63865 4.67649
+8.6698 9.30782
+-0.168259 2.09581
+9.29672 9.56
+0.372544 2.60567
+0.450487 1.32919
+6.95341 7.6399
+3.4403 5.24993
+5.53469 6.97831
+-0.79664 1.21306
+5.68831 6.14413
+8.85601 8.95444
+3.83309 5.211
+5.51573 6.5114
+3.64009 3.99648
+4.40759 4.99283
+1.85198 2.6457
+2.72645 3.74803
+2.04751 3.00998
+3.19365 3.9383
+8.09529 9.45596
+8.88173 9.5618
+0.609816 2.67806
+1.57288 2.60884
+1.68354 1.80124
+4.92058 5.9959
+1.48728 1.84885
+0.299669 0.413905
+9.02156 9.56731
+7.50854 8.49023
+0.667131 1.89987
+2.22472 2.58793
+5.84395 8.79426
+2.35839 2.66935
+3.43111 3.69982
+6.71023 7.36801
+6.75697 9.0991
+2.35352 2.85316
+6.73054 7.39006
+9.48673 10.1493
+6.71226 6.72805
+9.22083 9.71889
+8.36513 9.33921
+0.0652672 0.319993
+3.26467 4.60881
+7.62269 7.79878
+6.48608 6.69515
+6.21737 6.88645
+6.56094 6.9699
+1.61317 2.7167
+5.08621 6.29754
+2.24676 2.8076
+3.09943 3.93921
+9.74093 10.0968
+0.417699 1.6381
+9.2958 10.2973
+3.6663 4.1369
+0.0229943 0.448065
+9.2928 10.1833
+3.66334 4.22032
+0.812172 2.19952
+7.88025 8.71192
+8.69379 9.34922
+1.70691 2.95352
+8.28737 8.29985
+5.22491 5.354
+4.03526 4.14084
+6.49359 7.05924
+0.24853 1.44718
+7.86936 8.75135
+5.76 6.68919
+5.85437 6.14314
+5.86292 6.0516
+2.35692 2.91295
+0.0990674 1.29386
+2.9911 3.56188
+0.552671 0.638929
+5.80756 6.22761
+1.21067 1.77175
+4.51882 4.72936
+1.99969 2.89732
+3.65968 6.61987
+0.478582 1.33355
+0.259061 0.289813
+3.89264 5.02474
+0.349236 0.438003
+7.70442 8.1729
+7.90389 10.1876
+3.06898 3.15219
+4.77811 5.29095
+9.76561 9.89451
+4.14295 4.2489
+0.540224 2.28623
+9.60749 10.2284
+8.49555 9.00307
+7.89668 9.76886
+4.12631 4.70897
+7.87898 7.91814
+9.29858 9.52908
+9.24009 9.91544
+3.73498 4.70275
+5.44467 5.9274
+2.13453 4.85697
+2.29607 2.88771
+0.807842 1.82319
+0.319005 2.08473
+1.62 1.63649
+2.20431 3.23869
+2.00132 2.77136
+6.64752 6.71706
+8.12249 8.28379
+7.55541 7.7813
+3.51763 3.64484
+9.21075 10.2811
+2.24501 2.54426
+5.64566 6.46452
+6.72307 8.56698
+3.91728 4.60262
+4.02535 4.29548
+3.0499 3.53135
+1.30677 2.32194
+9.36908 9.90669
+3.92387 4.33848
+2.87312 3.08243
+4.49167 5.2749
+5.43143 6.74905
+6.94595 9.16539
+1.9784 2.00429
+9.42478 10.2226
+3.7185 3.96576
+9.37729 9.50574
+5.34283 6.89736
+4.95341 5.84626
+2.91654 4.28413
+8.26544 9.3076
+6.23114 7.20273
+1.02585 2.21446
+1.6718 2.29591
+2.28926 2.73452
+-0.648145 1.105
+1.44194 2.18562
+6.78584 8.37985
+2.00402 2.08248
+1.64076 2.04067
+0.0419044 0.455962
+5.51723 5.72098
+5.42117 6.81165
+5.70331 5.81707
+4.97889 5.60741
+3.38797 4.46846
+7.20995 7.66784
+3.45388 4.23386
+3.11057 4.35995
+3.29476 4.04676
+2.0519 2.94719
+5.37101 5.38271
+5.99383 6.64188
+7.48444 7.6377
+2.15043 3.05399
+1.54093 1.83799
+5.59223 5.87222
+5.8005 6.08042
+6.1208 7.22563
+1.2938 2.17454
+4.92405 5.0402
+6.91336 7.79688
+1.47978 1.99762
+9.00494 10.8315
+5.84805 6.15303
+4.95368 5.49096
+8.21704 8.31192
+0.715222 2.33517
+0.904183 2.54741
+3.42349 3.74906
+0.627978 2.37092
+8.41477 8.72651
+3.55373 5.58652
+4.12685 4.61533
+0.775274 1.41263
+4.78915 5.08639
+6.35791 8.15015
+2.88242 3.63509
+2.78526 3.07834
+0.39129 1.15933
+3.26615 4.74531
+8.78873 9.8888
+7.25612 7.45972
+4.97452 5.30012
+0.757255 1.35518
+1.29516 2.52446
+4.66838 4.96648
+-0.0720209 0.832726
+2.68276 3.21123
+8.44253 10.0311
+3.40809 4.70506
+1.09617 2.35452
+5.19302 6.73599
+1.25316 1.58101
+6.2056 7.10099
+7.7666 8.52777
+0.301239 1.37275
+0.522829 0.731575
+6.73869 6.96826
+2.41703 3.20567
+4.94617 6.22052
+5.41524 7.68272
+6.0408 6.29938
+0.0642067 0.600878
+6.32122 6.63505
+3.25427 4.70611
+5.88704 6.1678
+8.71533 9.08476
+6.25575 6.88392
+1.54462 1.56366
+3.95938 4.03326
+2.54671 3.66798
+8.48603 9.10156
+3.37369 4.65454
+5.25469 5.64636
+7.02624 7.36449
+8.17061 8.44321
+9.23147 10.1149
+1.45589 2.25886
+6.47702 8.25307
+7.69088 7.91753
+0.442832 0.616926
+8.35355 8.83222
+7.65142 9.58906
+4.04877 5.17345
+0.76012 1.8686
+6.54877 7.40058
+7.41774 7.65429
+8.69655 9.3325
+4.8302 6.25306
+1.77203 1.90284
+3.67485 4.94569
+6.60162 6.72031
+3.05924 3.35235
+0.0823162 1.3486
+8.42991 8.86331
+6.81596 6.83527
+-0.0174808 1.6745
+-0.758131 1.08928
+4.14423 5.46342
+9.26253 9.85714
+7.42749 8.58214
+4.88849 5.86936
+8.99339 9.38141
+8.85301 9.18285
+2.64303 3.45658
+7.1133 8.66473
+3.50745 3.8629
+7.81615 7.83244
+2.94991 3.8741
+7.91822 8.8362
+-0.0553088 1.19059
+7.35558 7.77948
+2.11257 2.20563
+8.57533 9.16338
+2.3515 3.13009
+4.13239 5.38696
+2.20763 2.93941
+7.2451 7.3211
+0.834388 1.57413
+4.47024 6.17855
+4.75947 6.80913
+2.99607 3.54732
+8.15998 8.80718
+8.94688 9.27971
+4.46335 4.9522
+5.30725 5.69786
+7.63989 7.86974
+6.69589 7.69565
+5.34018 6.08115
+8.59515 9.62264
+1.80557 3.22507
+8.62429 8.94242
+1.34532 1.95042
+8.60707 8.80741
+8.03275 9.40327
+4.30357 4.39095
+8.97954 10.7076
+2.18143 3.51825
+3.98695 5.62062
+2.48813 2.60622
+5.56957 6.43776
+5.18249 5.55459
+3.45373 3.64101
+-0.00345662 0.570597
+3.61127 4.69761
+9.37858 10.6205
+7.24635 8.19639
+4.70142 4.80735
+3.30055 5.14257
+0.860415 1.31635
+4.72924 5.46893
+7.47391 7.72644
+6.22287 6.57754
+0.181652 1.01366
+2.14494 2.80736
+2.16406 3.19383
+8.52991 9.22722
+8.74411 9.06935
+0.575831 1.02699
+2.47315 3.0331
+4.2872 4.59813
+5.82293 7.03604
+2.08982 2.25319
+7.3626 8.41994
+1.23867 3.10885
+7.397 7.78026
+6.78837 7.32977
+0.829368 1.56617
+9.23075 9.35172
+6.76562 7.23578
+0.42851 0.839401
+4.83626 5.5852
+0.150032 2.45322
+2.16811 2.47439
+5.60245 5.81188
+7.43707 7.46519
+0.167317 1.44642
+4.9732 7.58343
+8.67391 10.2957
+0.318592 0.639284
+3.365 4.25929
+7.83683 8.88895
+5.20557 5.30114
+0.940347 1.74022
+5.39149 7.13464
+1.10826 1.27913
+1.9147 2.31276
+0.935283 2.49181
+3.67898 4.33336
+5.10125 6.07734
+0.348807 0.839242
+0.310986 0.58381
+2.03594 2.43119
+5.49755 5.94215
+1.94885 3.34409
+9.66806 9.97883
+4.79099 5.45155
+4.81158 5.30001
+5.17667 5.90019
+9.64168 9.99177
+1.14899 1.22792
+0.466236 0.952985
+6.93679 7.72282
+2.97285 3.23931
+9.22517 9.24315
+7.25783 7.46414
+4.37304 4.51815
+4.01069 4.02979
+0.843132 1.80443
+4.78572 6.04237
+6.02471 6.38074
+4.99536 7.76852
+4.97442 5.17384
+0.731231 1.49497
+2.2797 2.90845
+9.13211 10.341
+4.19545 5.08597
+6.13127 7.09817
+2.65124 5.02208
+5.40235 7.12912
+6.86258 6.91991
+8.24317 8.55273
+7.6877 7.69875
+3.33922 3.53776
+0.089484 0.40755
+1.34909 1.68726
+8.43113 8.72899
+4.90038 5.55994
+0.308089 0.490555
+5.42628 7.1433
+2.11647 2.56987
+3.56934 4.1619
+8.35794 9.24416
+8.8645 9.69151
+5.10701 6.0036
+7.66385 7.8412
+2.89952 4.55221
+6.01533 6.38269
+-0.945182 1.07304
+1.79537 1.85576
+-0.0313338 0.501067
+8.85689 8.87522
+1.61143 1.7773
+9.53229 9.84943
+3.51669 3.81091
+-0.448016 1.10903
+3.16889 3.439
+4.30534 4.36372
+6.20158 8.09618
+2.20949 5.23616
+3.29459 4.17079
+3.90101 4.05611
+5.89688 6.85702
+0.734474 1.04471
+7.84341 8.02702
+8.69431 10.1086
+9.73194 9.92195
+7.63516 7.70631
+8.51416 9.33072
+-0.0712911 0.361001
+2.76979 3.22708
+5.34404 7.5165
+5.64429 5.79865
+0.0755012 0.363483
+5.05631 7.27153
+-0.60164 1.09659
+0.457228 0.876186
+4.27092 5.38033
+8.63891 9.04134
+6.29608 7.04242
+8.97795 9.93013
+5.00385 5.57737
+8.48068 9.44885
+7.35543 7.78492
+3.55698 4.01035
+-0.268117 0.649128
+0.633184 0.66254
+4.54216 4.81132
+6.15574 6.35276
+4.3663 6.36286
+1.45231 2.07039
+7.37031 7.9157
+5.30961 6.3506
+5.80757 5.81762
+4.91767 4.97519
+3.45667 3.60965
+1.7934 2.3807
+4.33289 5.41047
+1.16021 1.29979
+3.75172 4.53521
+3.10835 3.1275
+2.68167 3.00314
+4.10639 4.24094
+4.90776 5.74069
+7.30861 7.86666
+3.52822 3.70998
+5.22222 5.28033
+0.00866476 0.326377
+7.73247 8.61481
+4.25231 4.77499
+8.41148 8.54604
+2.95389 3.63497
+7.76126 9.69124
+6.41218 6.69682
+4.86285 6.44503
+1.84783 1.9065
+4.08788 4.11706
+9.17473 9.50133
+5.15091 5.78649
+1.27694 3.33579
+2.92648 3.37855
+9.37392 10.5123
+4.81878 6.34991
+8.38702 8.83716
+5.07771 6.33618
+1.47438 1.75588
+6.20935 7.11166
+1.08286 1.38
+1.40048 2.0157
+6.60355 7.26234
+5.28396 5.90003
+8.9525 9.59216
+-0.0305792 0.544664
+-0.571491 0.735471
+6.287 7.03679
+5.35225 5.4104
+0.095812 0.605976
+4.33523 4.4048
+6.13288 6.80949
+4.14654 5.5505
+-0.213214 0.260592
+7.56188 7.83088
+7.8132 8.65963
+8.02469 9.3254
+0.00641711 0.420562
+7.49269 8.15849
+9.26359 9.4366
+5.74008 7.86317
+8.62729 9.78825
+4.28946 6.20553
+3.19174 4.54991
+4.16992 4.25203
+2.46138 4.11583
+1.92971 2.16701
+3.43028 3.80842
+6.98297 7.28388
+7.51884 7.55947
+7.79102 9.44326
+0.416342 1.32311
+9.35398 9.85201
+8.72997 9.10384
+6.23398 6.88888
+7.46984 7.4875
+5.92603 6.66938
+1.77761 2.58697
+0.835966 2.06139
+9.63284 10.3565
+6.13677 6.42768
+0.151375 0.382404
+8.10315 8.13441
+5.52283 6.28113
+1.00873 2.44226
+2.5239 3.89871
+5.40599 6.72653
+3.43407 4.0068
+1.22444 1.26601
+7.04395 7.80599
+3.75987 3.77123
+6.43597 7.06249
+8.34435 8.87418
+8.25853 9.04009
+0.415321 2.32725
+0.639046 1.75525
+7.83226 8.12538
+9.55429 10.2734
+3.658 4.35867
+1.8588 3.93292
+7.38922 8.16823
+8.53626 9.23024
+0.848152 1.13412
+6.31667 7.2348
+3.81584 4.62621
+9.24748 10.7408
+2.75953 2.95288
+5.70188 6.62278
+4.22202 4.45368
+3.24616 3.88779
+1.05053 2.09846
+8.67718 9.52693
+2.14107 2.71959
+1.10518 2.69689
+5.01476 5.54139
+4.69244 5.20358
+8.88285 9.93012
+2.55228 2.77382
+6.72118 7.50057
+7.58999 8.71573
+1.83763 2.13481
+4.86135 5.27995
+4.39794 5.42117
+1.42512 2.98262
+4.80489 5.34701
+2.7993 5.13702
+7.52122 8.41729
+9.08613 9.37543
+1.1555 1.3935
+7.34071 8.0428
+8.33361 8.40349
+2.514 2.54741
+8.25732 8.41758
+1.65337 2.57964
+4.20527 5.06565
+0.723443 1.06987
+5.85836 6.64701
+7.908 8.07591
+5.01839 7.0105
+3.15908 5.10364
+4.3574 6.67192
+2.06662 2.46437
+7.5595 8.9108
+7.94919 9.20231
+4.11889 5.49714
+7.28151 7.51881
+1.30685 2.09479
+3.08479 4.47364
+4.50916 5.91511
+7.31605 7.63868
+3.14469 4.07035
+8.38431 8.87993
+7.42277 7.64967
+4.22472 4.26323
+8.49871 8.90746
+7.44431 8.09014
+8.35213 8.7504
+3.85634 4.37584
+9.12975 9.77042
+-0.326056 1.17374
+3.53802 4.06211
+6.81775 6.8467
+8.19106 8.64489
+4.20526 5.37727
+2.74081 3.72143
+0.49642 1.10775
+7.76606 8.00524
+4.79825 6.38926
+1.99478 3.20484
+4.69853 6.29508
+5.73058 7.18643
+8.11708 8.64257
+9.62375 9.84838
+5.95271 6.38989
+9.0193 9.93848
+3.91188 4.10834
+6.065 6.60546
+2.62354 3.60072
+8.53665 9.06824
+6.40691 7.44693
+1.62959 2.5825
+9.4128 9.87031
+6.24697 6.62684
+3.31136 3.45626
+4.80347 4.9935
+9.21711 9.53416
+-0.491547 1.72886
+4.75174 4.87217
+0.86329 1.53331
+2.4586 4.2578
+5.10301 6.2815
+5.08302 5.86788
+6.12434 6.78948
+9.68323 10.0973
+3.52576 4.40424
+4.9925 6.89084
+0.846638 1.80782
+1.09709 1.7685
+8.38592 9.03312
+9.56243 10.2682
+5.03592 6.6429
+7.8609 8.04599
+1.21404 1.31975
+7.47824 9.2063
+1.47849 2.68795
+1.2909 2.06381
+5.21288 5.54616
+6.27218 6.99345
+4.77622 5.08494
+3.30665 4.14735
+3.38947 3.55545
+7.71197 8.53162
+1.10565 1.50806
+0.7889 0.984689
+2.88598 3.33244
+5.70958 5.81232
+5.16567 6.24511
+6.91255 7.25784
+-0.401084 0.753156
+4.81138 6.20671
+1.67301 3.58501
+7.19478 8.25624
+1.24428 2.2523
+4.31631 5.33357
+0.589196 1.02017
+5.69207 6.97803
+2.3854 3.25501
+4.1362 4.91135
+8.9932 10.3184
+7.95871 8.45158
+4.03213 5.26347
+3.09506 4.06425
+-0.0310321 0.738171
+7.35733 7.61512
+2.48488 2.96253
+4.72098 5.69867
+5.5395 5.96914
+3.17854 4.283
+6.50012 7.33744
+1.93266 3.00941
+1.49319 2.71826
+9.0187 9.13099
+7.15259 7.40691
+8.71939 8.93257
+1.57203 3.11249
+0.933429 2.16903
+2.99663 3.71667
+2.06144 2.81311
+7.9072 8.2103
+0.490069 0.614737
+7.84111 9.70812
+1.15363 1.6421
+1.15475 1.43307
+8.2228 9.92116
+7.76825 8.40724
+6.15122 7.31322
+7.1427 7.49294
+2.30516 2.7019
+2.03336 4.03387
+8.3918 9.85707
+8.57214 9.59345
+3.8057 4.1119
+8.9223 9.38556
+9.32051 9.60504
+7.13349 7.69154
+1.71855 2.00425
+5.10333 6.0605
+-0.149137 0.80973
+0.466224 3.1698
+4.19165 4.29604
+1.64018 2.3161
+9.40397 9.89211
+5.21738 7.06323
+0.525526 1.0331
+8.06992 8.08704
+9.81539 10.0915
+9.33514 9.50521
+5.95494 6.54519
+9.21466 9.35909
+4.96603 5.18164
+3.89238 5.53056
+5.04546 6.32916
+8.63758 8.65805
+7.03226 7.57074
+0.32029 1.10893
+0.194176 0.992252
+8.79061 9.50848
+0.239137 0.300717
+7.7234 8.43747
+3.43679 4.28954
+8.31382 9.18928
+1.39612 1.67253
+6.95733 7.39846
+1.29129 2.12185
+7.93611 10.2305
+3.67764 4.17562
+1.38149 2.42407
+2.2847 2.48412
+9.28655 10.0661
+2.94115 3.21326
+7.04238 7.91536
+5.06012 5.61526
+8.95611 9.91736
+2.18524 3.44007
+1.0692 1.10987
+4.37019 5.18443
+5.82014 6.441
+1.68642 1.70458
+4.93783 4.9535
+9.42003 10.1196
+-0.356795 1.30987
+1.37778 2.80527
+9.54126 10.1758
+8.67413 10.5984
+0.914291 2.0697
+6.08696 7.09832
+2.82202 3.31103
+4.07818 5.50195
+2.85223 3.67449
+6.03006 7.10863
+8.84655 10.528
+5.08031 6.2001
+1.00272 2.74191
+0.169102 0.223253
+0.025089 1.26534
+-0.203339 0.64667
+0.899666 1.48885
+0.74235 1.49976
+6.28212 6.80412
+5.65159 5.93106
+2.1686 2.7445
+5.02936 5.43091
+8.07124 8.80499
+8.65696 8.95802
+7.68394 8.365
+8.65062 8.69146
+0.058248 1.19535
+5.74545 5.84057
+6.05244 6.52152
+9.3878 10.3328
+7.71379 8.88044
+3.32961 4.54105
+8.51987 8.62854
+4.10821 4.16902
+9.47639 9.78723
+4.72417 4.84793
+2.32867 2.94068
+9.52275 9.57815
+5.32867 6.96127
+4.32462 5.1508
+4.46919 6.45961
+8.62661 10.9533
+0.0244049 0.56156
+1.49207 1.73164
+7.03156 7.81168
+5.88587 5.89732
+8.43632 9.65085
+7.52612 8.06726
+4.82464 5.6193
+3.8062 3.90356
+2.42708 2.51646
+2.06458 2.45877
+0.427218 2.24283
+7.42616 8.11513
+0.617708 1.01833
+8.74218 9.03592
+-0.213346 0.599112
+9.05291 9.59124
+5.20365 5.54277
+2.85289 3.99509
+3.08468 4.58456
+0.136826 0.685254
+3.87191 3.99021
+0.970836 1.49673
+2.44355 2.53584
+8.88615 9.94545
+3.90591 4.52798
+1.52518 2.50658
+7.21268 9.07745
+0.767314 1.23833
+8.62975 9.42367
+6.71524 7.67686
+7.61205 8.48292
+5.312 5.65087
+4.75627 5.96261
+7.90674 8.0753
+7.37887 7.71478
+3.74483 5.52984
+2.7187 2.85544
+4.7902 5.62159
+2.89671 5.19815
+7.37268 8.72506
+7.11916 8.28301
+9.19814 9.75279
+1.2085 2.60113
+-0.632009 0.889734
+7.99858 8.39743
+6.48346 7.10822
+6.30616 7.06648
+5.56514 6.51183
+2.41505 3.56224
+6.83749 8.84447
+9.05111 9.46906
+7.77476 8.4091
+6.11378 6.31232
+4.42882 5.69917
+5.88107 8.052
+3.75437 4.08893
+2.70487 2.77664
+7.26028 9.77257
+1.44621 2.73267
+2.0384 2.60397
+2.95402 3.68949
+6.04766 6.4054
+0.716046 1.77698
+1.5084 1.72988
+2.58426 2.80376
+8.05255 8.59793
+6.06336 6.20709
+3.29813 4.31473
+2.53477 4.92554
+8.78711 9.88634
+9.26627 9.82082
+6.70683 6.81257
+8.25978 8.99788
+7.28054 7.64237
+5.14556 5.20711
+4.20431 5.87866
+8.96592 9.97597
+4.06216 4.41519
+8.49174 11.0491
+5.24547 6.03094
+4.65885 5.95835
+5.09606 6.34846
+6.30463 6.65933
+6.48022 9.56168
+1.38088 2.98143
+0.486911 1.16767
+8.16327 9.34821
+0.768885 0.782616
+4.51699 6.08086
+9.55086 9.70242
+2.86802 3.72489
+1.88496 2.18749
+4.31876 4.33726
+8.38871 9.45631
+8.80634 9.36198
+5.232 6.42399
+9.86919 10.0492
+3.61902 4.53086
+3.13118 4.42364
+2.69395 3.1816
+-0.303144 1.32309
+4.28871 4.36739
+3.8631 4.08745
+4.9291 4.98968
+7.14273 7.25505
+2.56623 2.59122
+6.01753 7.72265
+6.76051 7.53954
+6.76933 8.14741
+0.933137 1.83537
+7.9357 8.57904
+5.55847 5.59984
+4.25563 4.3345
+4.28087 5.21348
+8.88534 9.06554
+1.88575 2.94002
+5.26613 6.04562
+0.514249 1.45538
+0.130644 0.501645
+4.30564 4.86337
+1.57246 2.38451
+0.303814 1.77474
+4.22675 5.02783
+6.75381 6.78634
+5.64096 5.9725
+6.76159 6.98142
+2.35569 2.39119
+3.29794 4.95962
+6.55055 7.03366
+5.31474 5.69404
+9.01335 9.16988
+8.58306 9.37831
+7.06522 7.07778
+1.14695 1.74744
+3.15507 3.22865
+5.5925 7.14168
+2.14679 3.68767
+7.54789 9.71878
+1.5667 2.08742
+-0.604726 1.66718
+0.306012 0.54799
+2.61731 5.08257
+0.80957 1.74655
+8.22035 8.81637
+4.401 5.449
+8.89389 9.01988
+4.80574 4.9322
+2.19895 2.88565
+9.06688 10.8095
+1.23727 1.58699
+7.14836 7.92057
+4.65155 6.15149
+0.563061 2.16535
+7.66764 8.0341
+8.32324 8.42774
+4.54541 5.11069
+8.0237 8.09992
+7.26113 8.09404
+2.55196 3.20317
+8.1236 8.60951
+1.90437 3.23006
+0.888133 2.50365
+1.13618 1.69444
+2.60463 3.01696
+7.2311 7.73229
+5.06501 6.01487
+3.9893 4.10116
+1.45278 1.56937
+2.74601 3.80778
+9.40705 10.3843
+3.02533 3.52213
+8.7097 9.2268
+8.73145 10.5552
+2.56059 3.5742
+6.27328 7.57089
+3.23291 3.30811
+6.33804 7.20304
+7.63648 8.34564
+9.82053 9.93597
+3.14924 4.58629
+5.28253 6.33733
+1.99411 2.04104
+0.305593 0.420302
+5.39668 6.64188
+7.99992 9.37823
+5.25169 5.65987
+0.109291 0.875734
+3.08589 5.50296
+6.51358 6.62588
+5.34687 5.58204
+0.043587 0.932787
+-0.0264143 0.28677
+8.09722 8.37087
+5.46612 6.30285
+2.89146 3.49892
+6.73278 7.11762
+5.03068 5.90176
+1.7459 2.87727
+0.207707 0.448933
+7.00453 7.63105
+6.02789 7.87991
+8.1917 8.95854
+7.49014 8.73215
+8.48402 9.22063
+1.0467 2.4687
+0.241901 1.38802
+2.65867 2.81258
+5.46725 6.59448
+3.40578 3.75607
+4.2495 4.26392
+5.6608 6.213
+2.99705 3.88852
+6.17231 6.72018
+-0.17415 0.492739
+4.89596 6.49895
+4.68876 6.60218
+-0.0510568 1.46013
+8.87099 9.28179
+3.98894 4.5838
+-0.20015 1.59214
+8.80756 9.51828
+7.74921 8.53538
+-0.380041 0.440574
+2.69409 3.91466
+2.42747 4.56745
+6.25881 7.75647
+7.2941 7.77193
+2.60806 2.90251
+0.325028 1.22219
+8.29921 9.01416
+3.85524 5.45451
+5.2612 5.71877
+2.92849 3.73937
+8.6242 8.70808
+7.28153 7.35797
+1.65378 2.87917
+3.46034 4.24143
+3.99989 4.3199
+1.15266 3.60328
+4.8464 6.4887
+4.67021 4.68421
+6.96861 7.31554
+0.00723008 0.817047
+7.59589 8.88352
+5.56725 6.08465
+9.02409 9.19527
+5.81681 6.74193
+1.98221 2.98678
+8.76392 10.7646
+4.3903 4.50531
+1.0186 2.01838
+2.66674 2.74505
+2.41105 3.44579
+8.98295 9.18995
+8.14385 8.98779
+2.69613 3.60144
+0.445704 1.51319
+-0.634889 0.860409
+6.32737 7.10112
+7.88824 8.06838
+3.76271 4.43529
+7.66487 9.30221
+8.73974 9.59191
+3.08965 3.43006
+8.9518 9.96154
+0.727194 1.55228
+6.35214 7.12234
+2.71987 3.22996
+7.12786 7.4379
+-0.346107 0.837469
+8.47103 9.05987
+9.15744 10.628
+8.3237 10.093
+1.15052 1.16223
+6.95959 7.35423
+7.69488 8.44145
+4.21694 5.65913
+3.10562 3.37534
+9.73437 9.78252
+5.0458 5.53479
+7.80485 8.5163
+2.0442 3.75748
+-0.459177 0.498702
+7.38032 8.32195
+0.909659 2.11175
+7.08657 7.56877
+1.84997 3.10206
+4.2517 4.53819
+6.71655 7.04117
+1.06604 1.29153
+2.69273 3.31633
+2.19732 2.84826
+-0.723032 0.774865
+-0.289734 1.44645
+5.87194 7.71917
+1.01576 2.83685
+0.981927 0.998558
+3.07172 3.73201
+-0.112577 1.12642
+3.54063 3.67007
+7.21571 8.53815
+0.109957 0.839052
+6.86046 7.17211
+9.40878 9.69478
+0.989391 1.69046
+8.22287 8.8147
+1.48203 2.83308
+5.86418 8.0993
+0.749797 1.09852
+1.82996 2.50847
+0.28178 0.496017
+2.60694 3.00872
+8.6254 10.1698
+6.11641 6.41537
+7.19529 7.21342
+1.8214 2.17517
+0.991201 1.3788
+2.84924 3.12362
+5.75821 7.13843
+6.7106 7.35932
+6.6055 6.6829
+7.97105 8.58613
+1.56087 1.95845
+6.36782 7.10926
+2.43382 2.74699
+7.40509 8.8029
+8.42459 8.63142
+6.26128 7.55043
+4.6465 5.4431
+2.93214 3.29517
+0.157602 0.545214
+6.05931 6.72188
+1.7908 3.11731
+2.39217 3.58736
+7.07421 7.43852
+8.13419 9.74991
+9.53094 9.65319
+2.35726 3.68679
+-0.108561 0.874853
+6.87136 8.84157
+3.40803 4.58835
+7.50448 7.89932
+4.29762 5.53867
+0.863755 2.30032
+7.24847 7.95342
+2.89618 2.98849
+-0.928261 1.61922
+0.974105 2.91262
+6.99271 7.25856
+3.60995 5.01832
+1.26865 1.79704
+9.62217 9.80719
+1.02656 1.35514
+7.16502 7.32934
+3.12092 3.28857
+2.81374 3.84317
+8.73626 10.7585
+3.36982 3.61446
+5.08437 5.78949
+2.90218 3.0862
+9.2309 10.2523
+5.0967 5.48926
+9.73088 9.92708
+1.54013 2.78301
+6.73707 10.0789
+6.41735 6.838
+2.57935 3.04287
+5.719 6.70352
+5.42474 5.62732
+4.23904 4.69787
+4.16528 4.28736
+7.73477 8.84143
+4.90346 5.87324
+5.1969 6.14087
+3.48793 4.14182
+0.648493 1.07987
+6.88101 6.97932
+7.67342 8.74418
+5.16759 6.3871
+9.16292 9.49569
+8.77422 10.4817
+-0.358149 1.04178
+9.54616 10.3424
+3.12027 4.26504
+3.81223 4.73004
+1.2386 3.32247
+8.21963 8.42629
+9.10312 9.51016
+6.96107 7.43045
+2.98587 3.12365
+0.198165 0.211424
+5.19716 6.10856
+6.10553 6.3327
+3.98176 5.11099
+1.02512 1.04242
+4.27949 5.71947
+-0.457956 0.538807
+7.99877 9.48581
+5.88782 7.73303
+1.21496 2.85825
+8.46962 8.7862
+9.50182 10.1527
+5.85223 7.76234
+2.48368 2.52439
+2.35426 2.77405
+0.397056 0.482679
+0.160423 1.15786
+4.47109 4.8633
+4.74523 5.84196
+5.39177 5.75218
+9.00754 10.3249
+3.74813 4.03273
+3.08633 4.08426
+4.62672 5.29012
+1.92055 3.01442
+3.79279 4.5603
+9.52431 9.68334
+2.8126 3.32592
+-0.313688 0.490785
+9.06695 9.36835
+2.60321 4.14185
+4.40231 4.99535
+9.32205 10.1041
+5.3879 5.44349
+0.308728 1.0956
+9.05758 9.08283
+1.90313 2.50914
+7.1391 7.59459
+7.47357 7.95993
+1.25267 2.34827
+3.33222 4.36522
+8.78126 9.38611
+0.635979 1.62283
+8.3492 8.57545
+-0.572557 1.60517
+8.28855 9.03937
+3.47934 3.90271
+4.64498 5.43501
+0.872177 2.62011
+7.3893 7.58876
+2.14063 2.88063
+1.69361 1.75261
+4.19727 4.86483
+0.814676 1.27639
+8.19899 8.58203
+8.3394 8.99896
+9.31768 10.1694
+4.99218 5.19949
+4.2459 4.75266
+9.6314 9.64249
+4.038 4.75708
+7.92398 8.8579
+4.30747 4.54161
+7.51776 7.78258
+3.77611 5.1385
+3.53275 3.90278
+1.78619 2.12474
+3.18736 3.55159
+8.36759 8.52587
+5.52526 5.7843
+7.64174 8.09773
+4.37925 5.85699
+3.94295 5.31298
+-0.464623 0.795523
+7.02408 7.7048
+0.0690458 1.0008
+1.05445 1.32797
+0.126093 0.712612
+-0.809973 1.33869
+3.45568 3.96532
+0.433875 1.78679
+8.94667 9.65034
+1.98575 2.76936
+6.47974 7.67912
+2.74186 3.34153
+7.82655 9.32112
+4.71441 6.14932
+0.741177 1.76987
+8.05021 8.23239
+0.818503 0.882959
+7.13341 7.43399
+8.45939 8.93395
+4.44558 5.70161
+3.05657 3.86962
+8.75469 8.85537
+1.0922 2.23475
+6.00278 7.51598
+0.0530968 0.582206
+4.01788 5.48223
+1.30808 2.81869
+8.18848 8.59771
+2.43691 2.80685
+8.54045 10.6178
+7.58523 7.91634
+6.70183 7.49962
+5.81501 7.29783
+0.661853 1.58021
+6.50997 7.20411
+0.334292 1.40252
+-0.329585 0.742961
+2.38756 2.48935
+2.78114 3.58788
+7.97227 8.55379
+3.36753 4.57472
+5.14486 5.31457
+3.99691 5.47708
+6.36404 6.8741
+3.22519 4.63321
+1.80583 2.21824
+8.20747 9.42947
+5.90819 6.94368
+6.58559 6.85933
+2.99108 4.03832
+7.20963 9.6252
+3.10244 3.87265
+7.23018 7.91389
+7.18084 9.61063
+6.74145 6.86507
+8.40721 9.5751
+7.12352 9.45614
+2.06653 2.51786
+4.9155 5.04183
+1.34304 2.92777
+0.571315 1.17285
+8.05396 8.28214
+5.29142 6.24974
+8.93797 9.23051
+4.6108 5.45568
+6.46124 7.53124
+3.16695 4.37505
+2.76803 2.82764
+4.1531 4.84927
+8.19433 9.00383
+5.12114 6.22952
+2.2542 4.74849
+0.621192 0.871537
+1.37403 2.28895
+0.305704 1.3287
+8.70471 9.53085
+2.29164 3.56607
+2.42106 3.37382
+1.14309 2.03085
+9.17624 10.3281
+1.88864 2.70161
+0.932647 1.2473
+5.72385 6.55694
+5.25496 5.38675
+5.85771 6.69626
+7.37247 7.93094
+7.73499 7.98782
+4.91417 5.27506
+3.51127 3.84403
+6.96198 7.27686
+6.51176 7.74735
+4.19954 5.08222
+1.58115 1.83842
+2.11889 2.3408
+1.94427 2.00422
+5.59977 6.86555
+9.46942 10.3491
+9.18904 10.1988
+1.71938 3.01547
+4.3515 5.4951
+2.53792 5.85188
+0.3884 1.36228
+5.02469 5.62368
+6.82402 7.72203
+-0.320478 0.821539
+0.0885656 0.248783
+3.01725 3.44385
+6.63776 7.74386
+6.57899 7.9332
+4.82656 5.18327
+3.91909 4.43955
+0.0708319 0.101395
+2.59796 4.22775
+-0.433109 1.26978
+-0.434274 0.624336
+3.22018 4.25282
+4.63351 4.776
+8.889 9.56332
+5.35952 5.46531
+8.73832 9.22756
+2.03432 2.34194
+0.477994 1.43353
+1.2029 2.86844
+5.09945 5.76855
+8.89076 9.01771
+5.30284 6.31732
+1.56375 3.17543
+5.4773 6.36897
+5.30934 5.35073
+7.20096 7.7075
+6.51046 7.12888
+9.37127 10.0531
+-0.0484323 0.348687
+1.83241 2.2143
+8.28633 8.60462
+2.51014 3.65817
+3.27798 3.58685
+1.41567 2.23302
+7.50794 8.10378
+-0.0579575 2.10373
+-0.856005 0.96621
+2.96238 3.48434
+1.36304 1.90594
+2.9997 3.41214
+7.2763 8.087
+1.69207 2.74419
+5.41625 5.83917
+9.22139 9.53794
+1.17477 1.51576
+6.74597 7.90871
+0.678913 1.73759
+5.70863 5.7214
+8.88411 8.93377
+3.44409 4.54586
+0.958963 1.53878
+8.29904 9.3867
+2.52433 3.60238
+8.16257 8.21986
+2.11395 4.23455
+6.85451 7.40364
+0.20286 0.639736
+2.05848 2.49034
+0.547013 0.77336
+7.83609 8.11903
+2.16539 2.29286
+3.94232 4.31368
+8.53475 8.54519
+4.77462 6.4158
+4.08395 4.68214
+1.56902 2.23811
+1.61337 3.11768
+1.51181 1.65521
+0.0821202 2.09269
+4.77622 5.16243
+4.62148 5.75837
+0.613158 0.952696
+1.89128 3.04792
+7.57509 8.92834
+2.70465 4.2941
+4.95906 5.12442
+8.0927 8.17277
+0.796512 1.3215
+5.74134 6.45291
+9.68479 9.78978
+5.89261 6.2292
+6.11377 7.9339
+2.20571 2.67129
+3.46228 4.27058
+5.26723 6.2653
+4.04391 4.26562
+0.380382 0.818995
+7.58108 7.7618
+5.02375 6.13042
+4.20178 4.66297
+2.83039 3.0221
+2.36072 2.45545
+6.68854 9.20726
+2.91388 3.42464
+9.33373 9.73449
+7.75844 7.94625
+2.72414 2.89669
+6.65438 7.96623
+1.00647 1.05385
+2.63018 4.9432
+0.152187 1.60259
+8.86332 10.3631
+2.31523 2.6815
+8.00509 8.61794
+1.69711 1.75938
+8.65442 8.73697
+4.23917 4.32001
+9.66851 10.1925
+6.93943 7.49814
+8.51986 9.03561
+2.10317 2.5175
+0.539549 1.75683
+6.29423 7.93236
+8.64345 9.54556
+1.44069 1.6814
+9.10017 9.77088
+6.16731 7.40496
+0.570043 1.93192
+2.65761 3.88544
+1.46895 1.52688
+-0.369067 0.540647
+2.04868 2.72065
+2.1286 2.27858
+5.90157 6.16431
+1.55581 2.51851
+3.29705 3.81635
+3.4137 4.10991
+8.48699 10.1364
+8.43437 9.4642
+-0.037842 1.47589
+0.541735 1.7805
+0.499576 2.36065
+4.1415 4.72435
+4.77598 6.16872
+3.30388 3.61854
+6.43796 7.85966
+5.27157 5.70871
+0.919258 2.18653
+4.00961 4.07902
+3.78201 4.23596
+4.50464 4.791
+3.70253 5.30916
+8.59228 8.70036
+4.31103 5.69049
+5.31775 5.34378
+2.24198 2.64194
+6.66937 7.41675
+7.21753 8.42057
+4.35399 4.52398
+6.90698 7.30084
+3.44296 5.44378
+3.36719 4.89951
+3.38624 5.33856
+3.44877 3.53693
+5.81398 6.3016
+7.24655 7.33127
+3.86142 4.53134
+3.85894 6.88112
+6.45704 6.95699
+6.90997 8.24088
+5.68813 5.7611
+0.699911 0.824323
+6.73758 8.42517
+9.34644 10.07
+0.289929 1.30554
+8.30644 8.49113
+6.47667 7.16073
+4.28093 4.90236
+8.32678 8.57064
+7.09205 7.92316
+5.55599 5.63919
+1.0104 2.22875
+1.72237 3.53668
+2.54699 3.14823
+-0.668582 1.25485
+1.25582 1.37003
+1.35044 1.57807
+6.17083 6.30811
+0.618816 1.20065
+-0.540992 1.21634
+2.06673 4.28857
+9.03398 10.8112
+8.73735 9.22814
+1.30178 2.7599
+6.0221 7.34889
+8.30124 8.52159
+1.92023 3.34545
+2.99331 4.93358
+3.8412 3.93379
+1.455 2.77005
+0.538664 2.1118
+4.16926 4.26053
+0.699746 0.937609
+6.36024 6.6511
+2.34698 4.84463
+8.11109 8.76496
+4.05425 4.67773
+8.2284 9.78568
+1.64423 1.80353
+5.70109 6.93764
+7.2091 9.67224
+4.47015 5.23311
+4.29326 5.36144
+7.93151 8.96494
+4.61889 4.96487
+5.38473 5.43594
+9.35456 9.66489
+1.23737 3.04121
+1.16077 1.19519
+5.91037 7.55679
+6.88344 7.60181
+6.39705 8.65039
+1.61791 2.93041
+9.68285 10.1396
+9.03129 9.05839
+7.0683 8.29875
+7.19624 7.41696
+7.5266 8.38738
+-0.254571 1.01098
+1.30218 2.03222
+7.6432 7.73031
+4.99495 6.04757
+2.79394 3.29394
+0.31505 3.55963
+7.55382 8.18787
+6.00032 6.27664
+1.49355 1.79767
+5.21191 7.19537
+3.47816 3.75801
+2.10272 2.39494
+1.31887 1.93829
+7.14313 7.63055
+7.3141 7.77239
+6.03409 6.17265
+4.24946 4.53165
+0.0569272 2.56109
+8.44766 11.4872
+4.22879 4.28007
+6.92817 6.98775
+8.08859 9.0206
+-0.0748418 1.48605
+6.56698 7.0488
+4.46624 5.4952
+3.66085 4.05778
+6.44711 8.93943
+2.45735 2.49339
+0.0606673 0.416191
+-0.183838 0.750464
+7.08561 7.67275
+6.65423 6.90808
+0.0598735 0.364072
+5.2228 5.41543
+3.14042 3.19043
+2.40069 3.02829
+1.80441 2.1849
+3.47491 3.95775
+5.49162 6.63934
+2.03332 2.32288
+3.17234 5.25109
+2.58274 2.59951
+9.37994 9.97097
+4.71509 6.77966
+5.18915 6.84982
+6.12508 7.04354
+0.811202 1.98808
+1.46825 3.66984
+2.44386 4.15623
+7.60169 7.68242
+-0.43208 1.22222
+5.40569 5.66153
+0.391742 1.79408
+6.77742 8.43115
+9.12828 9.3851
+6.39541 6.80626
+5.17919 6.29326
+6.57263 8.12999
+3.439 4.62236
+8.40525 9.80086
+7.60986 7.70099
+1.32123 1.44213
+0.526574 1.92338
+9.57195 9.79591
+9.52103 9.63159
+3.79775 4.20608
+4.74446 4.89606
+9.00085 9.60025
+1.26279 2.08363
+4.13639 4.49232
+6.59409 7.18315
+1.0637 1.78425
+5.4213 6.87661
+4.24407 4.30987
+9.79732 10.1204
+4.24597 4.83541
+8.47705 8.5145
+4.34095 4.93842
+5.68168 6.96086
+7.48654 7.91072
+8.32005 8.45111
+5.24065 5.3032
+3.25982 3.94442
+5.58106 6.18764
+4.4243 5.58619
+6.36467 7.07082
+2.70051 3.56014
+5.94534 6.87688
+7.33638 7.7645
+4.57067 5.86652
+7.83993 8.36854
+9.03617 9.11629
+7.44672 7.95614
+6.05876 6.3594
+4.02496 4.97119
+3.01438 4.36109
+7.4932 7.92357
+7.51661 7.53354
+7.60692 8.49678
+1.76088 2.59103
+7.08578 7.39566
+4.83605 5.42933
+-0.186592 0.847663
+1.15879 2.33996
+8.11815 9.35472
+6.02584 7.62549
+0.881084 1.00015
+5.39067 6.27026
+0.910755 0.97444
+5.32174 5.65652
+7.69388 8.24928
+3.40521 3.7615
+5.60321 6.92388
+8.25096 8.34324
+0.00108913 2.16897
+0.508035 0.66573
+-0.0517816 0.0876197
+3.26472 4.30955
+1.99494 2.14903
+2.089 4.32368
+5.17378 5.75964
+2.8779 3.54361
+6.56459 6.90645
+1.43196 2.88337
+1.48917 1.94009
+3.40807 4.25784
+8.0334 8.13458
+8.22254 9.6175
+2.96308 3.14349
+5.04768 5.71252
+3.9977 4.72614
+1.44384 1.60782
+7.78147 8.19817
+7.03854 7.50085
+5.90747 7.06091
+2.89169 4.31831
+2.46167 3.16529
+9.13228 9.1504
+2.57975 3.05313
+5.75976 6.52958
+8.10499 8.98982
+8.43162 8.76377
+0.422917 0.668254
+1.69046 2.09962
+5.50386 6.66954
+0.0897183 0.564514
+3.50103 4.1041
+3.91918 4.52559
+4.39297 6.18876
+3.90396 4.90868
+9.69362 9.85528
+6.27994 6.95062
+8.01563 9.09433
+8.25641 9.72944
+8.22072 8.35423
+1.27059 1.61352
+8.53312 8.96235
+3.49185 3.9042
+5.79579 6.046
+0.489013 1.2147
+4.00074 4.177
+2.66625 2.93036
+7.20267 9.34958
+7.44659 8.54707
+8.99915 10.1143
+7.59922 7.82031
+8.38502 9.03222
+0.160075 0.294398
+4.14549 4.3927
+9.35554 10.248
+-0.159435 0.467922
+2.17272 3.72336
+8.63811 8.79976
+4.23215 4.66461
+6.99516 8.2035
+6.45212 7.88791
+6.20141 6.28633
+7.69396 8.82204
+4.50807 5.96315
+8.51725 8.89286
+0.939492 2.12064
+7.4615 7.62666
+8.46681 9.11769
+3.92828 5.40884
+9.05622 9.40015
+0.229625 0.860838
+2.05694 2.52113
+-0.217927 0.574255
+9.55146 10.3256
+8.31497 8.3417
+3.52833 4.47013
+7.7131 8.52058
+2.15462 2.66777
+5.7674 6.17553
+3.3358 4.10589
+2.06642 3.00412
+2.43387 2.85242
+5.09473 5.84276
+7.3287 7.54846
+4.64254 5.11465
+4.05785 4.93614
+4.25413 5.43513
+2.96476 3.15378
+3.53732 4.48239
+2.34137 4.01272
+2.24879 3.40626
+3.43323 4.49055
+0.871415 1.33068
+0.508929 1.65611
+4.92057 4.94743
+7.03376 7.35193
+5.73043 6.47264
+7.82417 9.93642
+5.24102 5.9178
+2.38528 4.1676
+6.27437 7.19631
+9.29267 9.53262
+4.10098 5.24964
+0.383714 0.833317
+5.97628 7.92987
+8.15799 8.96819
+8.1687 8.29862
+8.16289 10.5149
+7.38205 7.89765
+3.81883 4.15607
+9.46915 9.61755
+1.50756 1.51863
+2.34236 2.84689
+0.398473 1.15027
+1.05302 1.49155
+8.71687 9.35232
+1.0502 1.40395
+7.83685 8.76302
+7.7731 8.46899
+5.56618 5.97458
+2.90035 4.12043
+6.40644 6.68706
+3.95201 4.37075
+7.1831 7.67748
+9.42789 10.0914
+5.45198 7.01256
+8.64609 9.45756
+6.01864 6.31515
+7.64621 8.65533
+5.45654 5.76553
+2.04332 2.75476
+5.49454 5.85693
+6.13688 6.21927
+2.66255 2.7385
+4.8326 6.43772
+9.12704 9.45287
+-0.294488 0.318697
+2.26979 2.35516
+4.12949 5.58506
+3.01416 3.62246
+6.64697 7.10221
+6.44307 6.82985
+4.10484 4.73148
+7.42589 7.6029
+5.33055 5.50395
+2.46474 3.05847
+5.43677 5.59206
+2.13807 2.3988
+-0.38424 1.8121
+0.00916704 0.219304
+8.62621 10.2262
+3.33927 4.51169
+5.45656 7.13165
+5.29253 6.57917
+3.51704 3.9421
+8.63729 9.13361
+3.92626 4.3469
+6.83104 7.52695
+1.22258 2.28191
+0.447646 0.789809
+7.96543 8.54328
+2.24269 2.42571
+4.4161 5.40481
+0.813992 2.21792
+0.694664 0.974182
+6.50017 6.88902
+4.00723 4.65882
+9.05784 9.85062
+6.80276 6.98196
+0.105446 0.379881
+0.416982 0.53336
+9.01269 9.55204
+3.27197 4.23315
+6.7017 6.89704
+4.21512 4.42378
+4.86735 6.90949
+4.52235 5.36878
+2.62205 3.55746
+-0.551048 0.555476
+1.63274 2.71251
+4.26739 4.88085
+8.23129 9.77405
+2.49409 3.96851
+6.66387 6.88886
+7.72383 8.90611
+3.18511 3.27281
+0.73722 1.64435
+7.90329 9.02868
+6.94845 7.06773
+0.509461 1.54928
+4.63885 5.51652
+9.24395 9.5121
+1.00007 1.57161
+5.31349 5.45437
+0.929284 1.71034
+7.05985 7.63288
+7.38418 7.45373
+4.14937 6.5167
+7.49989 8.6081
+9.28313 9.57721
+4.41285 5.1497
+2.96148 3.09221
+1.58256 1.66419
+4.45116 5.43488
+5.70927 7.11699
+3.61105 3.93153
+5.92285 6.63773
+3.50065 4.48453
+7.97338 8.96464
+0.541394 0.965435
+4.46469 5.03925
+7.33695 7.6484
+9.64234 9.6938
+4.16378 4.17886
+7.10741 7.31549
+1.51829 2.62477
+2.1892 2.9684
+9.23767 10.0462
+7.87649 7.97087
+7.05385 7.85952
+6.91232 7.50277
+6.60185 7.81572
+2.27112 3.90211
+5.74452 8.2018
+6.25117 6.26911
+0.525893 1.53447
+0.392956 0.959233
+3.51591 4.71055
+3.10449 5.41156
+7.35964 7.65642
+2.89831 3.54334
+3.42338 3.68259
+4.75496 5.51419
+3.8792 4.48395
+2.18007 4.13236
+3.15798 3.16864
+8.91248 9.21598
+8.54636 9.34037
+7.93697 9.79709
+6.40205 8.9653
+9.67332 10.2252
+4.31771 5.25423
+7.27485 7.3725
+6.22971 7.11411
+1.16538 2.16762
+1.40443 1.6876
+3.14915 4.58847
+7.13761 8.72165
+4.38448 5.88699
+7.98309 9.19449
+8.491 9.05597
+5.55043 6.19359
+2.44006 3.36071
+9.56522 9.79903
+1.86129 2.00225
+1.65239 2.11478
+7.59392 8.4655
+2.44709 2.68538
+6.80932 7.04694
+8.8212 9.4182
+0.276845 0.956468
+8.17008 8.5538
+0.77864 2.06897
+6.78458 7.68692
+0.504907 2.67518
+5.56963 6.9058
+3.42691 3.5414
+2.52065 2.71583
+5.09924 6.26696
+0.223724 0.610039
+3.61258 5.29324
+0.388393 3.11131
+2.87763 4.45415
+8.26438 10.1169
+5.89742 8.17506
+1.89686 2.66651
+5.33662 5.68228
+3.37496 5.67291
+2.25713 2.36127
+0.402185 0.716342
+6.4231 6.79227
+3.22707 4.69314
+7.85092 8.77413
+3.31322 3.72455
+5.43021 7.7167
+8.5883 9.00864
+1.21371 1.71836
+6.35584 7.9706
+5.44438 5.50414
+5.31325 6.11217
+6.08888 6.78794
+7.70604 8.13257
+1.29858 2.48753
+5.54083 6.38817
+8.23948 9.82646
+7.5575 9.0224
+8.00415 9.39763
+0.488455 1.55358
+4.48727 5.20741
+6.46648 7.02349
+0.355939 0.611119
+9.4892 10.2189
+2.61893 2.82832
+0.268193 1.24687
+3.01964 5.19554
+6.29954 7.42795
+8.70796 9.48366
+5.39307 6.64597
+2.47001 2.60746
+5.30949 7.46529
+6.07973 6.16835
+0.764507 1.6144
+7.94123 8.52143
+1.88244 1.96592
+6.42103 7.02205
+7.673 7.73208
+6.66891 7.80675
+6.9305 7.5431
+6.62335 6.93873
+4.34846 5.77621
+0.49878 2.82928
+2.65221 2.80109
+7.45348 7.74372
+4.10129 5.26894
+3.87782 4.19855
+4.62113 5.22658
+2.84558 2.88185
+2.53209 2.86065
+8.94932 9.21967
+6.48046 6.89614
+5.81885 6.66829
+6.49129 6.62015
+8.5663 9.58685
+2.43346 3.89849
+9.36561 9.45886
+1.40232 2.65
+6.66 6.74041
+2.87007 3.49668
+4.71138 6.0184
+5.03638 6.08494
+7.77735 8.14253
+1.0301 1.27179
+2.58337 4.04699
+6.95419 7.89775
+7.81164 8.62551
+3.37669 3.96217
+4.68541 5.58692
+4.79697 6.34841
+3.95334 4.81962
+9.44006 10.0941
+4.91098 5.12386
+8.44273 10.1565
+3.6685 3.73156
+5.07599 5.33357
+-0.138235 0.260923
+2.71154 3.45603
+5.75096 6.16127
+4.4775 4.64308
+6.80557 8.97442
+5.49408 5.76652
+8.31937 9.12886
+3.26479 5.51673
+2.57425 3.03145
+2.42465 3.92714
+7.86505 8.50835
+3.29229 3.43549
+4.08537 4.69709
+7.83885 8.60616
+1.61622 2.72716
+9.10228 9.41907
+8.49325 9.46612
+-0.174644 0.351716
+1.95648 2.14825
+8.28844 8.4428
+4.35888 5.59521
+5.1396 5.22537
+0.330835 0.879566
+6.14972 6.82967
+3.14811 4.89049
+-0.231668 1.08277
+3.13526 4.94545
+8.32674 8.91046
+5.22364 5.48006
+9.84318 9.88416
+-1.07813 1.6965
+1.5095 2.0328
+8.03716 8.2792
+-1.01307 1.46703
+8.22096 9.0055
+8.9917 9.0415
+5.60623 6.74537
+3.15991 3.19314
+3.13863 3.26451
+0.739618 0.896958
+0.67599 1.18486
+3.37355 4.06303
+0.38605 0.410067
+3.03297 3.46387
+3.45867 3.79806
+8.67249 9.53278
+-0.213855 0.787363
+1.52316 2.61117
+8.31846 8.59736
+4.84685 4.94042
+7.41901 7.82623
+4.99029 5.09747
+5.3637 5.37612
+3.22123 4.77749
+3.21668 5.74743
+3.48748 4.59962
+8.00016 8.56269
+1.63631 2.42239
+1.05159 3.72319
+7.22643 7.95706
+5.65694 5.99195
+9.4469 9.66915
+0.857984 1.59867
+4.05869 5.69955
+2.65788 3.07259
+1.8038 3.38748
+3.91934 4.89922
+6.18534 6.70342
+2.85076 3.20176
+8.1897 9.9614
+0.685531 2.05322
+3.31097 4.00809
+8.26537 8.63475
+2.90508 4.07797
+1.25213 2.31285
+3.05752 4.03741
+-0.481913 0.605629
+1.87958 2.19386
+7.28689 7.76316
+4.82075 5.20688
+-0.08115 0.31839
+3.50085 5.89363
+1.31184 3.30269
+4.03137 4.81493
+6.11688 6.13923
+7.93584 8.43321
+4.9838 5.3733
+3.8174 4.11979
+8.56196 9.02824
+2.87809 3.89589
+7.95309 8.05432
+3.47469 3.63716
+6.61009 7.12576
+8.87374 9.79588
+7.31513 7.99089
+5.78084 6.68535
+4.96985 5.59877
+2.20236 2.52473
+0.661014 1.11035
+6.36183 6.58403
+6.67947 6.85093
+-0.242005 0.513902
+0.442966 1.72024
+6.4587 6.74016
+6.67958 8.0837
+8.98524 9.56405
+6.91409 7.59877
+3.73596 3.97705
+5.51193 5.96437
+3.72029 4.50126
+3.09896 3.23616
+8.83312 8.91774
+0.32173 0.486199
+4.21092 4.59955
+2.61616 4.07081
+1.89049 2.65559
+4.96401 5.00629
+9.33156 9.70914
+3.72455 4.61054
+8.91265 9.6563
+7.12401 8.04324
+6.65393 7.25572
+1.04032 1.24927
+3.0174 5.56006
+1.47645 2.26867
+3.49833 4.37416
+6.16877 6.34452
+6.47417 6.90595
+4.27056 4.92535
+7.60439 9.35352
+0.426219 0.754405
+8.5291 8.68579
+5.84717 6.64632
+1.99513 2.5284
+5.10669 7.83064
+6.99006 7.37272
+0.871836 1.5934
+3.6572 4.38875
+0.154617 0.290737
+5.91634 6.50415
+5.33982 5.45293
+6.92602 6.94691
+0.349512 1.61427
+8.02048 8.99943
+5.75598 7.34946
+5.86948 6.51327
+5.11707 5.6181
+6.27656 7.10043
+8.48922 9.73833
+8.35863 8.69746
+6.67829 7.07852
+8.51257 9.50383
+3.76636 4.33757
+4.82804 5.57166
+5.17892 5.61254
+1.35188 1.94069
+6.04969 6.06833
+5.34181 5.82455
+5.71714 6.71234
+0.966462 2.56278
+7.95169 8.15951
+6.53583 6.89673
+6.73246 8.34493
+8.71111 9.76467
+7.53215 9.56537
+0.619041 0.736713
+9.24399 9.50151
+8.57184 9.88538
+2.82682 3.77294
+4.2649 4.84602
+8.6621 8.96426
+8.04469 8.3189
+7.81877 8.42944
+2.78031 5.16589
+1.23076 1.43577
+8.35385 8.49632
+3.27901 3.66774
+0.595941 1.41354
+3.37123 5.16685
+9.11003 9.95515
+-0.25959 0.32069
+1.44153 1.70148
+1.61595 1.70799
+7.8201 8.53423
+8.5402 9.36947
+8.39125 9.8221
+6.2909 6.35773
+0.000933745 0.920054
+-0.21358 0.491025
+4.00874 4.03866
+3.43552 3.55874
+7.85942 7.98987
+7.6681 8.06748
+6.19541 7.14765
+8.53891 8.96393
+2.38789 3.26866
+-0.0162847 1.18379
+1.04764 1.52755
+0.400798 0.55475
+6.32001 6.94897
+5.9692 6.2012
+1.20784 2.67873
+3.58247 4.46372
+-0.229647 0.559407
+5.65979 5.73489
+2.32795 2.78462
+0.706144 1.55147
+4.56527 4.6636
+5.98901 7.20908
+9.27329 9.95152
+1.31296 1.70529
+5.82933 6.41329
+4.17452 5.29881
+4.15885 5.25117
+0.35549 1.3511
+1.0591 2.4463
+8.87597 9.55625
+6.66826 8.57255
+0.355945 1.40613
+5.39729 6.10218
+3.78791 4.37501
+9.53885 9.87184
+2.67568 2.82552
+4.44836 4.52939
+5.96764 7.40168
+6.35578 6.98546
+0.636857 1.19517
+3.3986 5.55448
+1.46493 2.66884
+-0.0676901 1.80921
+7.83396 8.53452
+8.3508 9.04561
+4.03407 6.0066
+0.997538 3.30635
+7.83064 8.03466
+4.57652 4.97461
+3.85952 4.15471
+0.960261 2.1069
+0.522458 1.52989
+8.81627 9.00768
+0.172256 1.29455
+5.69294 6.15752
+6.86391 7.75307
+2.32429 2.95415
+1.83191 1.90364
+0.400855 0.705649
+5.23264 5.39972
+5.19047 5.79842
+2.40804 2.89401
+0.462887 1.43874
+6.70213 7.90229
+4.37985 4.95797
+3.73768 4.30645
+0.756797 2.11146
+0.458724 0.472099
+3.93098 6.47147
+5.5294 6.00365
+2.97106 3.42174
+5.75875 5.80235
+7.96799 9.02105
+5.36254 7.22823
+6.56124 7.39973
+9.49234 9.57879
+2.87576 3.59509
+3.49182 4.28124
+8.68021 9.94486
+9.60199 10.1276
+9.70115 9.81776
+3.09609 3.98732
+5.00113 8.15031
+5.21248 5.74835
+9.23337 9.5696
+2.92777 3.56297
+2.52044 3.04905
+4.79908 5.05762
+1.98626 3.69659
+4.78726 6.20637
+7.39711 7.42831
+4.44319 4.78716
+9.28452 10.0832
+8.00774 8.85707
+9.22947 10.0523
+4.38653 4.86012
+5.15285 5.23106
+8.95413 9.75947
+2.90286 3.32407
+0.348694 1.39738
+-0.0660432 0.293424
+4.09079 4.2922
+6.0407 7.23031
+2.83771 3.72237
+8.54697 9.38898
+2.16742 3.45018
+8.83255 9.30343
+3.59112 3.6531
+7.53452 7.81898
+7.11781 7.19773
+8.2892 10.0259
+4.91072 5.06031
+5.8232 7.25924
+7.0641 8.31604
+9.477 9.63892
+5.8003 6.58306
+9.63988 10.2754
+0.654364 1.02398
+5.9488 6.85043
+7.86867 8.99891
+9.202 9.46902
+4.17932 4.20271
+6.50328 6.71085
+7.19848 8.15579
+5.62459 5.75449
+-0.159668 0.791409
+7.55683 8.7315
+1.03278 1.423
+0.751457 0.808785
+6.2203 6.50634
+1.64418 2.98238
+6.87468 7.00652
+6.36966 6.7117
+7.69893 8.89535
+0.419794 1.05032
+2.73928 4.31548
+0.409245 1.55228
+6.03905 6.39323
+0.409695 0.789834
+4.39148 4.40935
+1.14673 3.23607
+5.85562 6.44503
+6.87394 6.88742
+3.761 4.35136
+7.2208 8.01436
+6.49839 6.54002
+4.70791 5.91886
+4.24906 5.96619
+2.53482 3.91496
+-0.369254 0.69193
+4.81351 6.31088
+9.76066 10.0736
+1.4413 1.55942
+7.21917 8.88908
+6.03521 7.56826
+1.25568 1.42024
+5.47575 6.04431
+1.43099 1.99979
+5.1004 6.04088
+6.54798 6.56118
+1.0142 3.1564
+1.75267 2.1453
+1.28133 1.36044
+9.60996 10.0563
+1.14397 1.50247
+6.86688 7.08724
+8.38287 9.18041
+0.132076 1.27657
+6.52553 6.9301
+0.223917 1.41325
+1.18902 1.79753
+1.40084 1.75678
+1.94524 2.51929
+1.98276 2.62875
+0.763281 1.05483
+7.97952 8.51249
+1.059 3.05463
+5.33401 5.85094
+8.37442 8.64374
+6.62865 6.67315
+1.01707 1.64386
+0.113335 2.23523
+6.71906 8.00216
+-0.886574 1.29366
+4.20078 4.85294
+8.43336 9.06988
+3.55413 4.40768
+6.69076 9.01132
+6.18982 7.14109
+7.14381 7.7046
+8.63195 9.47031
+8.88052 9.84886
+3.34443 3.62637
+4.5862 4.72832
+4.95757 5.23571
+2.85993 4.04966
+1.43846 2.27425
+5.43112 6.30496
+-0.452609 1.55525
+7.17706 7.71287
+5.78537 5.79579
+8.51102 8.9466
+-0.472904 0.810489
+3.83688 4.24045
+8.04432 9.04582
+1.57259 3.37136
+1.22231 1.33582
+5.73006 6.26477
+2.90855 4.22125
+9.39717 9.4287
+3.63873 4.16094
+0.442035 2.08889
+0.294491 1.31124
+3.14755 3.86305
+6.57634 9.44898
+2.19051 2.41878
+4.99277 5.12569
+4.10425 4.9423
+4.83547 5.62769
+5.73879 5.78179
+8.90329 9.81905
+5.60168 6.17538
+5.83843 6.66128
+1.84271 2.57406
+3.01047 3.33662
+2.85037 3.79158
+3.49007 4.46877
+8.58942 9.51529
+0.613753 1.12824
+8.23757 9.54707
+9.27134 9.4196
+6.27126 6.56417
+2.17206 2.33018
+3.53588 5.17162
+8.6312 10.0868
+5.76342 6.66164
+9.01501 9.90984
+3.22004 4.18954
+4.37918 4.68595
+2.00928 3.49815
+6.64229 7.06693
+2.85962 4.58794
+8.45587 9.8897
+2.8481 3.65956
+8.65849 8.67336
+6.48486 6.58637
+5.82336 7.45254
+4.02267 4.59696
+2.24997 2.83815
+8.16201 8.55518
+7.40645 9.07085
+1.43137 1.50333
+8.7212 10.9419
+1.50523 2.44124
+1.92455 2.85819
+4.50866 4.53052
+5.75781 5.81275
+1.71013 2.0282
+9.31592 9.9015
+6.14972 8.18798
+1.85705 2.20068
+4.80971 5.10509
+3.31201 3.58168
+8.61824 9.31861
+7.19497 7.86933
+3.25381 4.53472
+5.62799 6.29537
+9.00659 10.021
+9.15156 9.74827
+2.0324 2.80741
+0.714403 1.00476
+1.26522 1.80417
+-0.362995 0.41758
+7.08785 7.71544
+5.55685 5.74045
+0.428866 3.03773
+7.61574 8.94894
+9.07256 9.69772
+4.49537 5.06822
+5.66388 6.48899
+1.69126 2.69607
+9.90539 10.0783
+6.56455 8.27128
+6.61988 7.86616
+7.42012 7.64493
+2.99922 3.35282
+4.69379 5.18947
+0.87894 1.30518
+9.47632 9.61234
+0.665754 0.855958
+-0.422778 2.11197
+3.38786 4.15441
+7.57236 8.75855
+1.89832 3.50224
+-0.185929 1.0777
+3.32911 5.53465
+6.91111 8.69247
+6.97456 7.86905
+4.75518 5.0948
+4.23733 5.83368
+8.52456 8.56086
+0.0978267 0.136564
+7.4668 7.99757
+5.52851 5.80858
+8.5833 8.88589
+5.10603 6.41348
+4.70682 6.59981
+8.60265 9.19477
+5.04514 6.24014
+4.49041 4.88669
+7.40925 9.15624
+0.80364 1.35315
+7.11604 8.01153
+0.267749 0.714089
+0.121521 0.822226
+9.30556 9.81307
+2.11398 2.92567
+5.97722 6.08022
+7.13483 7.22211
+8.00161 9.27274
+4.87681 5.51654
+3.11843 3.84311
+5.17747 5.98482
+3.6077 4.46306
+1.37454 2.2443
+4.93385 5.96357
+2.92184 4.0964
+4.88767 5.56353
+2.87394 3.76336
+0.326521 0.622872
+2.42056 2.45007
+-0.527891 0.827211
+6.73151 7.20155
+1.82048 2.54905
+1.35563 1.88701
+3.64202 4.10669
+5.22846 5.23953
+6.06271 6.46993
+2.71418 3.2081
+6.41179 7.57176
+7.45823 7.79609
+1.01227 1.39137
+9.0872 9.20132
+5.083 5.64038
+5.63236 5.97945
+-0.317645 0.822313
+0.865396 2.65587
+5.71839 5.98983
+1.50978 2.08611
+2.95824 3.70996
+0.264301 1.02233
+8.22351 8.98589
+4.87805 5.24127
+2.31329 3.46752
+6.19539 6.69676
+5.18643 5.40947
+7.15453 7.66643
+1.20694 2.25111
+7.87378 7.89093
+5.16514 5.604
+8.68354 9.01395
+7.33753 9.37499
+2.94627 4.06036
+8.64337 8.85727
+0.0353092 1.0128
+6.98437 7.35718
+6.77073 6.79959
+3.13559 3.70735
+7.40139 8.27017
+4.01174 4.39788
+3.22281 5.11647
+7.79256 8.58737
+0.642233 1.39694
+7.18603 8.69453
+3.37803 3.59355
+0.762287 0.84262
+4.21823 4.52565
+0.894924 1.35434
+0.844327 1.19938
+5.57958 7.05431
+-0.631066 1.55134
+3.78962 4.17935
+9.15329 10.4824
+5.47536 5.52975
+8.81243 9.16088
+4.45989 4.94123
+8.68235 9.45112
+8.04719 10.3938
+8.87349 9.40483
+0.502543 0.570283
+2.08512 2.47652
+-0.654512 0.804355
+3.68569 5.21711
+5.33017 5.80226
+3.44991 5.31415
+-0.00417763 2.95077
+7.17784 7.9318
+1.2721 1.31642
+5.24415 5.64173
+2.79434 3.28746
+4.54991 6.49276
+4.74707 5.12555
+7.36365 8.15777
+0.913049 1.79828
+1.47498 1.83425
+2.64271 3.38567
+4.78159 5.44718
+7.6087 7.66442
+-0.484393 0.909893
+3.16824 3.23757
+4.43021 5.90284
+4.25954 4.74995
+6.58742 7.24125
+1.86151 2.27069
+3.16459 4.5945
+1.06471 2.08965
+3.31028 3.83029
+1.52593 2.47521
+0.703789 1.42451
+1.47969 1.68923
+2.92352 4.24089
+9.84088 9.93485
+3.18205 4.27817
+7.39345 7.78945
+3.78808 5.41572
+4.38624 6.75693
+6.93065 7.16977
+1.01289 2.19807
+3.37006 3.54196
+5.50238 5.58285
+-0.225113 1.99347
+1.67796 1.86943
+6.1999 6.35102
+3.80494 4.74814
+1.13294 2.02639
+1.1965 2.6548
+-0.284453 0.856092
+4.26565 5.02196
+9.66948 9.88874
+6.20287 6.25528
+4.38154 6.65806
+3.77411 4.3075
+5.77177 6.78486
+9.16311 9.816
+3.22861 3.42009
+3.36573 4.34724
+6.76951 7.58025
+4.83813 5.23042
+3.87192 4.37372
+5.56859 5.90066
+-0.368163 1.4593
+5.44031 7.81671
+2.66342 2.99253
+6.11846 7.69499
+4.98811 5.17531
+4.45078 4.67513
+4.88206 4.94128
+2.51813 3.0268
+0.461292 1.15264
+2.34766 4.48652
+0.198819 2.23425
+6.85634 6.98248
+0.912438 1.81872
+4.84933 6.34912
+5.15613 5.82891
+0.172772 0.994083
+3.37381 3.64549
+1.98836 3.2697
+1.64344 2.06049
+0.766585 3.09305
+7.8979 8.28046
+4.34856 5.01341
+6.69809 7.24239
+5.19034 7.04959
+5.3747 6.92123
+7.8893 10.1251
+6.11207 6.99125
+5.37115 6.84111
+9.04786 9.11002
+6.45326 6.64415
+-0.76294 0.92832
+0.980411 1.8166
+3.05536 3.50031
+6.10827 7.55786
+6.57848 9.06264
+7.66855 8.861
+4.80276 4.82283
+1.99932 3.2877
+9.45229 9.80653
+0.457474 0.778684
+5.44444 5.95239
+5.60974 8.05169
+7.64656 7.79632
+6.78372 7.65134
+6.93878 7.82023
+9.08292 9.55308
+9.16329 9.25802
+1.4909 2.38688
+4.31881 5.3564
+5.12535 5.60119
+2.44591 2.54637
+7.36929 7.80452
+2.13707 2.97655
+9.73557 9.94588
+1.96637 3.36097
+0.857068 2.29643
+5.58224 5.91142
+8.90714 9.0255
+9.77988 10.0711
+0.41121 0.970955
+-0.518356 0.91447
+7.58725 7.71255
+8.1435 8.78712
+6.5487 7.17991
+4.94961 5.50283
+8.14086 9.03281
+3.51281 5.24806
+3.5786 3.84066
+6.27435 8.37735
+8.65263 9.5555
+2.87484 3.56117
+5.57707 6.55879
+-0.111276 0.264178
+3.60894 4.15477
+2.82322 3.64397
+8.40669 9.1127
+8.43089 10.5298
+1.38472 2.2453
+1.74464 2.00472
+4.01588 4.67572
+0.408869 0.938602
+2.06155 3.46067
+4.4871 5.08963
+2.4435 3.87355
+1.32864 2.55801
+4.78579 5.26122
+7.43027 7.57749
+6.90971 7.32716
+8.01095 9.46872
+9.41627 10.524
+8.83143 10.4474
+0.631816 1.75513
+1.72965 2.17123
+-0.513239 1.1886
+6.75616 6.7984
+2.49278 4.26493
+0.230011 0.966298
+3.78506 4.95013
+2.03886 3.14808
+7.87309 10.5637
+3.54564 3.58055
+1.91974 2.9194
+4.8503 4.98668
+4.66494 4.83558
+7.57916 8.24358
+4.78743 5.38547
+2.81034 3.34534
+1.00297 2.0138
+6.87593 7.17736
+3.93157 5.0655
+3.10361 4.05519
+8.22876 8.38326
+7.48377 8.31026
+2.23106 3.4905
+0.130934 0.606709
+1.22344 2.55898
+7.55829 7.92597
+4.10977 4.86263
+0.122756 0.264176
+3.8357 4.15854
+1.28414 2.13031
+0.280029 0.805504
+2.88245 4.1704
+5.57936 6.94781
+6.22719 6.33201
+-0.761013 1.16475
+6.16636 7.12566
+2.98935 3.192
+2.23263 2.34362
+3.9082 4.11692
+2.66865 3.5275
+1.87676 2.43966
+4.60035 5.39332
+2.74287 3.73097
+2.81953 3.96666
+5.73644 6.04042
+4.02179 4.52419
+3.26438 4.07346
+1.22509 2.13719
+7.91885 9.71846
+1.28152 1.48079
+7.97918 9.26344
+8.75682 9.8677
+7.25678 7.45362
+8.16161 8.87066
+1.21873 2.37224
+7.76739 9.06346
+3.89932 5.03406
+3.53901 4.37006
+2.93795 4.04333
+6.36543 6.72985
+4.72622 4.98804
+1.86205 1.99008
+0.784581 2.05264
+0.978519 2.91723
+3.9067 6.47195
+0.735425 2.38151
+8.37394 8.41609
+6.91804 7.23374
+9.39259 10.1026
+7.28732 7.43466
+4.75982 5.44264
+6.71504 7.53933
+2.17125 2.54358
+0.703562 1.39087
+-0.221711 0.541965
+9.22839 9.39159
+9.53465 9.97585
+1.44304 2.53666
+7.886 8.85051
+9.33174 10.1632
+2.60898 3.42889
+1.73658 2.02589
+6.31651 6.77762
+7.26755 8.34499
+9.01312 10.9837
+7.47361 8.96251
+7.98365 8.02586
+1.40065 3.44891
+9.44617 9.55391
+8.24265 9.34849
+9.366 10.4216
+0.375354 1.17522
+3.37114 3.38278
+-0.742469 1.07634
+4.29988 4.81879
+4.18605 7.21928
+7.41047 8.29198
+6.68173 7.60225
+3.24292 3.30695
+1.8951 3.42167
+3.97359 4.2857
+4.72621 5.80575
+4.75014 5.02239
+6.43454 6.94568
+7.16601 8.10355
+2.16685 2.23666
+6.70852 8.63284
+8.16988 8.95848
+0.277002 1.30648
+1.5803 2.28632
+2.22634 2.34679
+0.200623 0.814959
+5.27457 6.51651
+2.49533 2.90705
+6.48922 6.69528
+8.18879 8.63551
+2.75159 3.633
+0.884853 1.56434
+1.87488 3.98951
+4.24783 5.17713
+6.22499 6.56095
+5.68238 5.99272
+3.75553 3.85012
+4.87543 5.39966
+6.62671 8.72493
+3.50262 4.05131
+5.38952 5.4974
+7.84971 7.94051
+5.39123 6.66564
+5.43986 6.17256
+7.48968 7.7677
+4.2685 4.57296
+1.75169 4.11058
+5.03634 5.16102
+4.68003 4.84715
+8.36249 9.98761
+8.94297 10.6969
+6.21572 6.24305
+7.90303 8.0672
+7.90426 8.41244
+5.98512 7.93187
+5.13297 5.27136
+6.58367 7.4971
+4.72663 5.22956
+7.99667 8.59246
+4.3303 5.92188
+1.3132 1.80875
+7.70104 9.20947
+1.78862 2.00473
+9.63678 9.65571
+-0.264416 0.318054
+2.70004 3.40777
+2.74642 3.73608
+3.6494 3.6743
+8.03113 9.22851
+1.07526 1.3116
+4.05436 5.33291
+4.60907 6.03605
+7.83426 9.10358
+2.27997 2.77309
+5.63139 6.92616
+4.40717 5.25214
+1.98986 3.5062
+2.42393 2.9584
+1.94336 3.08456
+1.20185 3.01827
+0.641733 2.10095
+7.25046 8.29391
+0.640392 1.26451
+3.9588 4.85492
+6.83036 7.41101
+6.48581 7.08757
+6.48734 8.47856
+9.55084 10.3774
+-0.173137 1.26574
+2.32702 2.58775
+2.7463 3.13914
+7.86951 8.62807
+5.96916 7.92759
+0.217046 1.70373
+1.04207 1.05755
+4.79058 5.07902
+4.19024 5.35395
+9.00175 9.83715
+8.37554 9.275
+4.5204 4.82999
+3.49936 4.75519
+7.07916 7.74619
+6.66726 7.35282
+7.39513 8.55523
+7.50381 9.60708
+1.39304 2.26927
+2.84101 4.76376
+1.21779 1.59353
+4.7893 5.70143
+9.12195 9.57131
+5.40461 6.15443
+2.86445 4.26837
+8.01324 10.9082
+2.96659 3.8042
+2.4897 4.59323
+6.37887 7.15878
+7.00143 7.6419
+3.22491 3.41843
+1.22852 3.31783
+2.09881 2.56121
+4.43205 4.67051
+4.39328 4.66715
+2.38355 3.39058
+0.638802 1.59399
+5.32717 5.81376
+8.00353 9.72007
+8.77281 9.81649
+8.95552 9.86609
+2.90915 3.96556
+3.88176 4.93124
+6.45945 7.69942
+-0.108577 1.57424
+0.304992 0.320561
+6.47789 6.5515
+1.98211 2.05312
+6.2741 7.35626
+9.45057 9.67918
+5.2916 5.48037
+0.158802 0.712187
+6.42002 6.84323
+9.11085 9.13063
+9.42446 9.95882
+6.03624 6.96469
+9.2473 9.6286
+7.10342 8.71163
+3.34072 3.35187
+7.4602 8.58506
+8.7963 8.81873
+0.323615 2.22687
+0.326746 1.76681
+2.20062 2.76862
+7.55181 7.85006
+0.941035 1.28117
+8.76643 9.60019
+9.19731 9.33092
+6.0479 6.57293
+6.12725 6.24356
+7.53078 8.92488
+3.1841 3.48283
+1.85544 2.01888
+7.3849 9.29183
+5.03915 5.27721
+4.77142 5.46282
+-0.291696 1.14641
+1.61367 2.20867
+5.31853 6.69431
+2.52731 3.13139
+4.86677 5.18106
+4.50183 4.60969
+5.95881 6.09964
+2.41939 4.42026
+6.92003 7.17891
+4.29584 5.48557
+8.02803 9.06315
+2.82326 3.49599
+5.8647 5.87561
+2.38814 3.62688
+6.32418 7.17662
+5.99907 6.5059
+3.84698 4.14446
+9.80728 9.82132
+5.2366 6.30871
+9.81878 9.91004
+1.53024 1.83525
+2.98035 3.68531
+4.5418 6.98786
+5.19561 5.9846
+0.946068 1.46672
+3.26948 4.71928
+6.13476 7.68682
+8.36934 9.65072
+6.40074 7.14762
+1.01349 1.80493
+8.4514 10.25
+-0.180382 0.682704
+1.03041 1.63565
+5.64642 6.96069
+2.73598 3.67485
+5.8705 6.66157
+4.68343 4.7176
+5.83787 7.6818
+1.42529 2.234
+3.73726 4.19241
+5.38341 5.81884
+1.13088 1.69073
+0.968034 1.98828
+1.06007 1.11039
+3.50129 4.51807
+5.83133 6.77904
+-0.334945 1.29129
+0.326706 1.16015
+9.15028 10.4391
+5.13047 6.79712
+1.06952 1.38997
+5.79345 6.49898
+7.88149 8.5143
+8.00404 8.09794
+8.22725 8.28904
+6.38406 6.61356
+6.32166 6.73458
+7.17066 7.32049
+1.64338 3.79327
+7.92135 8.55568
+7.15578 7.42231
+6.70701 7.65427
+5.76608 7.63064
+3.54163 4.08662
+3.81402 6.76906
+4.5998 4.61865
+9.01471 9.18718
+5.21234 5.73335
+0.946018 1.39917
+6.99714 8.29739
+5.64458 6.93965
+3.39809 5.70907
+6.32284 6.83604
+8.50347 8.53097
+3.90118 4.85721
+9.41198 9.62076
+4.41514 5.55152
+7.69979 7.81249
+5.34434 5.37105
+7.25274 7.76114
+7.67383 7.92718
+5.82851 6.29417
+0.935651 1.2842
+0.639586 0.786771
+6.39823 8.31226
+3.67546 4.89035
+9.20323 9.57287
+2.33896 2.99576
+8.51933 8.80243
+0.983098 1.11084
+8.48215 9.42998
+7.29586 7.3914
+2.00695 2.89046
+2.60909 2.62433
+2.04118 2.92033
+7.60386 9.01419
+7.32896 7.73342
+9.51693 9.54891
+5.1323 5.24962
+6.35326 7.18302
+2.50952 3.51872
+3.4149 3.57431
+9.18412 10.4976
+5.68123 6.42697
+5.87758 6.0124
+6.3202 6.64588
+8.2547 9.98176
+5.50949 5.7854
+0.0824268 0.128178
+2.17292 3.76233
+7.22786 7.68214
+5.09326 6.4151
+4.30171 4.86688
+2.39206 3.47399
+7.95152 8.35556
+2.40133 2.936
+2.77819 3.87516
+3.252 4.33376
+9.54269 9.7513
+6.6747 6.73043
+0.611474 1.97158
+7.65864 8.53689
+1.58345 1.8017
+2.56917 2.8152
+8.5424 8.8301
+4.98159 5.44499
+5.82482 6.03578
+3.55509 4.90785
+5.77028 5.94747
+0.163965 1.1379
+2.85039 2.94261
+4.24343 4.67273
+3.22636 4.06084
+6.03662 6.21018
+4.55495 5.07697
+1.91173 2.51739
+6.54894 7.24036
+5.55502 6.92676
+0.245707 0.586188
+2.28044 3.29563
+4.71378 5.25198
+8.28953 8.44891
+9.42282 10.179
+5.0548 5.73614
+6.3203 6.43659
+6.54178 8.82077
+3.67181 4.17365
+8.51445 8.96445
+1.69648 2.84524
+0.194222 0.920147
+2.48533 2.59803
+1.66002 1.6739
+4.79833 4.95404
+1.09801 1.11009
+6.62529 7.4066
+8.0099 8.37262
+3.55429 4.11824
+6.2666 7.12137
+7.83222 8.01342
+9.37156 9.72961
+1.1647 4.04434
+4.50719 5.09068
+3.25175 3.75482
+8.28659 9.30848
+7.30009 8.60755
+-1.12073 1.21016
+0.310087 0.725712
+8.3746 9.13511
+9.11925 10.2234
+9.68703 9.7137
+0.603098 0.844291
+5.88373 6.99327
+0.852802 1.43297
+3.7463 5.82283
+7.69639 8.25446
+-0.337322 0.977113
+8.76606 9.16618
+3.43527 3.6616
+3.93587 5.39471
+5.66569 7.20462
+5.34999 5.7193
+3.25589 3.706
+1.52012 2.55985
+4.74228 5.43725
+5.15323 5.51652
+7.77237 8.33717
+-0.0514419 0.914127
+9.27182 9.59476
+8.14192 9.74859
+6.42702 7.20331
+7.51351 7.68358
+7.0947 7.46059
+7.97635 8.59449
+2.39931 2.66008
+5.79481 5.94673
+4.41054 4.81613
+2.72202 3.61239
+2.86039 3.44719
+1.81115 3.28151
+-0.566995 0.734214
+9.61998 9.72024
+7.4163 7.61821
+0.42522 0.552659
+3.17617 4.36942
+0.740294 1.36953
+7.13755 8.39966
+0.219186 0.892588
+3.78307 5.2905
+0.783026 1.76155
+3.01893 3.33055
+3.12143 3.5713
+-0.792679 0.92539
+0.668572 1.12961
+3.88619 4.30545
+7.59276 8.1776
+4.71509 5.05622
+6.53406 7.04242
+1.581 2.21984
+4.7144 5.51372
+2.76338 3.50211
+0.16364 0.293599
+5.92365 6.10636
+3.11174 4.29165
+5.49295 6.48717
+-0.503239 0.795707
+7.30558 8.12408
+2.10674 4.13456
+7.11985 8.01932
+1.34672 1.48739
+4.05778 5.69084
+2.83686 2.9115
+6.4471 6.53909
+0.467374 1.84371
+2.76467 2.94177
+4.87867 5.33932
+0.892878 1.96273
+1.13934 2.27205
+7.76918 8.39409
+6.72181 7.43901
+7.0836 8.68472
+7.12924 7.56332
+0.689172 1.62922
+9.41146 9.91043
+0.398265 1.27579
+6.29966 7.4874
+5.09438 5.65334
+6.04623 6.4687
+5.75305 6.89731
+0.308118 0.459501
+3.63692 4.30501
+3.1755 3.71009
+7.32787 7.52785
+2.23235 4.09978
+2.71191 2.91513
+0.209457 0.840713
+7.31489 7.38296
+6.21245 6.91111
+5.75983 5.96049
+5.92056 8.24518
+-0.354452 0.489638
+4.05894 5.34828
+1.56299 1.57414
+2.85083 3.27455
+8.78323 10.0012
+0.208502 1.26471
+6.10824 6.79285
+5.55114 8.03968
+6.13077 6.32342
+7.34865 7.82592
+3.94835 4.75016
+7.8268 8.72249
+4.85131 5.07903
+5.40398 6.0134
+2.85971 3.85293
+0.126379 1.45545
+3.15768 4.28388
+9.64566 9.70016
+4.47514 6.31064
+6.44995 7.2894
+4.70992 6.13777
+3.91128 4.22263
+7.35627 8.07739
+2.49215 2.68749
+8.09946 9.16929
+0.925679 1.92784
+8.48437 8.63892
+7.2255 9.18109
+-0.00840282 0.0168954
+5.91933 6.6274
+4.16086 4.64302
+8.27009 8.47868
+1.73372 2.93094
+8.17421 9.17705
+9.19136 9.43222
+0.0653594 0.648416
+8.69 8.96184
+8.99355 9.40832
+6.25088 6.26945
+6.72391 7.38424
+9.59708 10.3496
+6.00971 6.18818
+4.64468 5.75797
+3.64832 5.30079
+5.99378 7.8792
+6.5388 6.99379
+7.31694 8.43802
+3.66227 4.92638
+9.55964 10.3796
+-0.14433 0.29095
+3.56716 3.71252
+3.82062 4.27788
+8.10405 9.35275
+7.17891 7.46539
+1.17698 1.29602
+4.48829 5.03134
+7.18025 8.13852
+9.42388 10.3634
+5.2158 6.17469
+5.22926 6.52397
+5.16731 6.40625
+6.53348 7.269
+2.07834 2.39172
+9.65044 10.1519
+8.64551 10.1294
+9.29006 10.5993
+1.50639 2.83173
+5.71675 5.99216
+3.0783 3.35571
+0.115401 1.31431
+8.03988 8.11942
+3.11917 4.53956
+1.14552 1.1646
+5.34782 6.43017
+0.0701702 1.0368
+0.183335 0.440704
+6.33438 7.71607
+2.11533 2.64323
+7.12104 7.13366
+7.21548 8.26968
+3.13445 4.13568
+4.57452 4.74602
+2.60889 3.69846
+7.21184 7.47573
+6.87651 7.03405
+2.65431 3.94352
+1.50006 1.70087
+6.16344 7.54429
+7.02057 7.73067
+8.27833 9.01489
+0.500833 0.597845
+8.34751 9.88925
+2.80242 2.91837
+5.29424 6.079
+8.36276 9.10074
+0.216887 0.268335
+1.30798 3.16393
+3.93851 4.22658
+2.58028 3.14744
+9.31131 10.3451
+7.37262 8.84852
+4.45306 5.6723
+3.74535 4.0721
+4.90174 5.63875
+3.41847 4.65199
+3.10265 3.82548
+6.56126 6.97557
+2.57449 2.95098
+7.97418 9.06301
+9.2203 9.66829
+4.64922 4.96305
+8.83034 10.115
+6.6685 6.89847
+7.36585 7.48669
+8.66761 9.39287
+0.562216 0.961875
+7.56292 7.81006
+8.50715 8.95572
+0.572825 2.24755
+5.9367 6.06766
+-0.769578 0.776163
+4.48224 4.9553
+8.21069 9.29643
+8.57206 9.47175
+1.10032 1.21371
+3.76306 3.87152
+6.46197 8.18457
+6.96501 9.70727
+3.42357 3.93484
+0.818601 2.42743
+-0.119739 0.397938
+-0.378761 0.523892
+8.03394 9.35409
+3.60283 3.98864
+2.21789 2.70607
+-0.255329 0.319063
+6.20806 6.22609
+7.1283 8.04391
+3.73565 4.03638
+8.5374 9.10987
+5.22675 5.35072
+7.51777 7.58439
+9.12636 10.4159
+9.15003 9.40672
+0.217863 1.19883
+9.42416 9.9178
+2.55337 3.8088
+7.03655 7.98242
+9.17171 9.8047
+0.110162 0.722738
+3.16467 3.58897
+6.47244 7.12961
+1.0456 1.65614
+1.58456 1.62844
+1.79039 1.84035
+6.24286 7.07838
+9.08631 9.11684
+3.05068 3.40838
+2.81212 4.03665
+2.52011 3.09841
+8.06001 8.16356
+7.07649 7.52685
+2.47666 2.86548
+8.66241 8.95103
+-0.298116 0.662697
+0.822443 2.46125
+2.07619 2.33674
+4.84135 6.21034
+7.49625 8.13026
+7.85854 8.29618
+3.01722 3.37062
+6.54393 7.30306
+2.21113 2.30166
+8.32138 8.57349
+6.2995 6.33514
+3.0018 3.56886
+4.63378 5.52214
+6.71908 8.96715
+2.29809 2.95581
+8.34947 8.71096
+4.96902 5.32075
+9.51051 9.72733
+3.311 4.77789
+3.50233 3.66309
+4.95177 5.76002
+6.12876 7.22391
+6.27743 6.79393
+3.60638 3.6833
+5.20305 5.50848
+7.16065 8.88358
+9.45049 10.2539
+6.16892 7.0314
+8.08479 9.74516
+0.0717867 0.669987
+2.17569 3.34098
+4.81716 5.7509
+7.63999 8.01157
+5.87228 6.60363
+3.39621 4.35575
+4.96079 5.07901
+7.57639 8.82003
+8.27285 8.52609
+0.665858 1.64782
+1.74256 2.07126
+6.19512 6.4258
+0.664592 1.30896
+0.180682 1.43746
+6.46752 6.81303
+2.55562 3.08708
+9.33695 9.63312
+6.33821 6.77092
+7.88252 8.55026
+8.17937 8.45385
+-0.415294 0.793096
+5.22077 5.54553
+8.67808 9.10041
+1.72096 1.92024
+0.492778 1.48076
+2.29514 2.88531
+0.0934389 1.37614
+8.40297 9.11121
+3.66605 3.91717
+-0.274468 0.867811
+9.41428 9.56659
+1.22657 2.12792
+8.71336 9.85384
+5.09347 5.42905
+2.02877 2.36652
+5.99112 7.40703
+0.911618 3.48138
+4.84352 5.11131
+1.16309 2.08613
+5.58561 5.84805
+0.663543 1.08921
+1.83189 3.93269
+4.07731 4.38879
+4.04789 4.9989
+2.09457 3.61279
+2.00982 2.94396
+7.37537 7.66574
+5.08648 5.80122
+9.19959 10.2263
+4.26136 4.86194
+6.67875 7.61134
+1.27462 2.48399
+7.2237 7.82324
+-0.0141009 0.0441377
+8.32069 8.36192
+2.82562 3.0717
+-0.528918 1.25301
+1.90486 3.04714
+1.34489 1.75301
+3.14332 4.03322
+8.55351 10.8681
+9.09824 10.3828
+0.496868 0.622499
+7.11112 7.62765
+0.335233 0.528962
+6.71335 7.13937
+6.78574 7.71172
+9.13568 9.22251
+7.10299 7.64765
+3.64747 4.06685
+8.64041 9.40111
+2.43515 2.93081
+2.95476 3.68588
+0.0863751 0.777976
+6.5891 8.18165
+8.80986 10.0735
+0.568868 1.63785
+4.41677 5.42049
+8.72857 9.88426
+3.67467 4.25442
+8.98168 10.1087
+5.08611 5.50098
+1.28982 2.34422
+-0.914176 0.969847
+4.35042 4.42735
+4.02282 5.08164
+9.00566 9.4791
+2.71821 3.24065
+3.20252 3.24988
+8.61559 9.6733
+3.15157 4.7685
+3.59348 4.67872
+0.286864 0.36279
+8.40374 10.528
+7.53647 8.13523
+6.81591 6.90226
+7.68111 9.10704
+8.37958 8.73818
+3.25808 4.40893
+1.50348 3.00641
+0.20803 1.40949
+3.93771 4.84177
+2.79232 3.35329
+4.2666 4.63588
+0.341784 1.46241
+1.53063 2.06724
+8.58212 8.86194
+8.95411 9.70651
+8.71591 9.26292
+6.66088 6.7009
+3.95881 5.93917
+8.5823 8.76007
+-0.308958 0.34174
+1.03188 1.37677
+7.52675 9.84031
+4.27952 4.32984
+1.83465 2.27607
+8.12096 8.64922
+2.22605 4.40067
+0.00929139 0.871342
+0.376531 1.29354
+3.5257 4.30165
+1.95846 4.09589
+-0.200922 0.799272
+0.24432 1.76673
+4.73477 5.06514
+8.97059 9.2276
+2.89618 2.93969
+0.168256 1.03325
+3.44522 3.83622
+2.74889 2.76042
+6.07155 6.7979
+9.06484 9.09804
+7.56658 9.29215
+4.3084 5.45621
+-0.0786996 1.12809
+8.48249 9.74107
+6.4196 6.61469
+1.57119 1.87612
+3.15463 3.86251
+2.0089 2.57741
+6.53618 7.12035
+7.07901 7.29396
+0.114756 0.887413
+8.90806 9.65731
+4.0921 5.23407
+2.63441 2.92344
+4.31769 4.98832
+8.90336 9.26837
+8.25313 8.91204
+2.87758 4.00212
+-0.708243 0.789072
+3.28656 4.55872
+5.73177 5.80293
+5.40596 5.5844
+4.09318 4.57774
+6.16178 7.00613
+8.5514 10.5495
+6.83987 7.3056
+1.06341 1.97923
+7.82153 9.00722
+0.923069 1.42337
+1.83408 2.82331
+5.75305 7.23576
+0.241909 0.96721
+1.16645 2.10491
+5.41819 6.09839
+7.49242 7.69495
+0.347233 0.383681
+2.33245 2.53467
+4.91249 5.27759
+8.11182 9.2758
+0.0955456 0.548659
+-0.359909 0.48055
+1.64759 3.47097
+6.37855 7.40015
+0.423283 2.08857
+4.10068 4.46856
+2.58389 2.69626
+0.848483 2.72258
+8.67321 8.88903
+2.07607 3.42398
+3.11033 3.80741
+2.24735 3.48626
+8.11883 8.7687
+0.29959 1.41603
+4.84924 5.13641
+1.44102 1.74592
+1.13437 2.50296
+1.75876 3.09859
+4.75363 5.90838
+7.36423 8.20074
+5.51578 6.42652
+0.915633 1.86015
+9.44679 10.3479
+2.61691 3.60215
+6.26524 7.2538
+2.74326 3.12649
+5.83934 6.98592
+9.1111 10.4891
+2.27066 2.82709
+8.19359 8.67233
+0.834236 1.7066
+6.19288 7.21392
+-0.249843 0.891821
+2.5652 3.25132
+5.25356 5.88905
+3.99545 4.18918
+1.93186 2.51527
+4.44621 4.82421
+5.89181 7.36963
+2.77321 3.60627
+2.76444 3.88016
+2.50062 2.66105
+1.14846 1.66146
+2.951 4.81656
+3.81976 4.01061
+4.75674 5.59916
+6.74092 7.08289
+2.09989 2.32514
+0.220723 0.865303
+5.48107 5.71875
+1.48372 2.88941
+0.484577 1.12051
+8.93618 9.7185
+1.89769 3.65655
+2.0129 3.55214
+9.23173 10.3694
+0.286189 1.22753
+0.453785 1.55541
+2.24068 2.6541
+8.80917 10.4969
+7.12801 7.15222
+9.25745 9.9103
+5.73429 6.76901
+7.54454 8.47157
+1.96008 3.74997
+8.00837 9.25665
+1.66384 2.07613
+5.53014 5.97461
+-1.32495 1.33319
+4.58479 5.2263
+7.92048 8.75668
+6.87595 7.02522
+0.157713 0.389585
+7.48277 7.51261
+8.10714 8.38399
+0.0802723 0.587088
+1.13024 1.71135
+5.71769 6.84757
+3.08261 4.31054
+2.95952 5.09762
+6.62815 7.44256
+5.0805 5.8499
+3.38489 3.73265
+1.10644 2.18331
+4.70493 7.31686
+2.2253 2.6338
+0.778359 1.6265
+6.94211 7.2149
+4.20976 4.99342
+7.47792 7.67881
+7.06219 8.76137
+4.97677 6.12206
+6.30829 6.69361
+6.19977 6.76781
+9.67636 10.2172
+3.41958 3.69137
+0.374486 0.943711
+4.00837 4.80107
+8.85401 10.1325
+6.0938 7.8919
+1.51055 3.08998
+8.94594 10.3139
+1.06714 2.65511
+0.703202 0.850595
+4.87735 6.00659
+8.3067 8.39924
+7.78071 8.3155
+1.98737 2.81116
+6.86323 8.07974
+1.03479 1.34584
+0.490512 0.670211
+5.82122 6.1901
+5.50836 6.63385
+7.9192 8.9606
+0.913719 2.18983
+4.97151 5.70909
+4.19907 4.37712
+2.01188 2.63318
+7.84813 9.3771
+5.32667 7.48502
+8.50951 10.1006
+-0.551637 0.930509
+1.06511 2.23353
+1.91111 3.42663
+9.37528 9.55327
+7.27975 7.38741
+3.46676 4.83165
+7.36137 8.70333
+-0.295762 0.623228
+8.48558 8.81076
+2.71689 3.41873
+6.49265 8.11042
+5.25516 5.57336
+6.10462 7.05991
+8.76997 9.15164
+7.86196 8.30651
+7.82765 9.24604
+5.98573 6.34182
+6.45367 7.47857
+3.27018 5.10835
+1.3079 2.37423
+-0.261387 0.338113
+7.60683 8.81791
+4.7346 7.41988
+5.25597 5.28517
+3.76704 4.52226
+3.91774 6.66976
+5.69618 8.92667
+1.86148 3.07531
+5.57404 6.51438
+9.39049 9.77921
+2.38692 4.21416
+6.84909 7.23633
+7.2379 7.58761
+4.73485 6.11606
+7.80013 8.08105
+1.72701 3.40244
+2.44475 4.4072
+9.72565 9.77726
+3.35288 4.06493
+8.91215 9.92325
+8.67991 9.65865
+0.253195 0.764339
+4.23564 5.59497
+1.84752 2.14986
+-0.502957 0.528737
+1.32656 2.11347
+9.81563 10.0213
+7.60114 8.05035
+8.51797 8.83342
+-0.394604 1.41267
+7.71614 8.63514
+0.530249 0.968898
+2.90463 3.01675
+7.58098 8.71658
+-0.253747 1.28827
+1.832 2.39006
+7.2268 7.27225
+3.84076 4.66703
+2.2564 2.73185
+7.31508 8.46008
+4.99387 5.64948
+7.21239 7.79983
+7.60231 7.8473
+0.555482 1.41892
+1.25539 1.73665
+8.41561 8.96404
+5.06771 5.17664
+0.0655744 2.10718
+8.00222 8.65909
+7.48841 7.83609
+6.30909 6.89448
+9.1697 9.55942
+1.36259 2.22582
+-0.923854 0.994771
+3.43724 4.64053
+8.09411 8.19574
+4.84869 5.52805
+2.69802 3.4119
+9.0613 9.29405
+0.565216 0.687165
+5.93495 6.57426
+1.86925 2.75493
+1.41068 2.00824
+1.60612 1.62471
+3.11499 5.89909
+2.69806 3.90538
+3.76301 4.22135
+3.30065 4.70725
+5.56461 7.02137
+8.35335 8.99287
+4.79259 4.88508
+6.7911 7.52912
+8.14843 8.28583
+3.67629 5.06406
+5.71462 7.04747
+9.06721 9.99733
+4.87932 6.8586
+8.00814 9.57664
+7.03069 7.51623
+9.0989 9.57644
+2.70873 3.91296
+1.64425 1.7007
+6.53716 6.99033
+8.29874 8.74509
+1.88941 2.57626
+4.65337 5.23247
+9.04723 9.06665
+3.52258 3.61496
+1.1207 1.80143
+0.680601 1.98384
+2.94593 5.38692
+2.65685 2.67932
+9.00469 10.2054
+6.44318 7.2657
+4.66656 5.33893
+3.41719 4.72453
+3.12403 4.21748
+6.67973 6.81775
+3.54347 4.14978
+3.02554 3.50812
+3.91883 3.93657
+7.31721 7.89895
+1.86275 2.85473
+6.23266 6.4449
+7.59855 9.38013
+9.07084 9.49309
+0.557656 2.6851
+6.899 7.37693
+4.23162 5.84314
+8.54108 9.37672
+3.9513 4.79746
+7.299 8.29678
+5.58879 5.88551
+9.14992 9.22385
+9.1914 9.31788
+4.95663 5.56316
+2.16516 2.39538
+0.722262 1.89664
+7.76447 7.80026
+2.77772 3.39136
+9.59513 9.78635
+1.02728 1.2181
+7.32631 7.56611
+7.37389 7.46163
+6.87949 8.18689
+8.95602 9.81169
+5.85364 6.63434
+0.129136 2.13484
+7.09608 7.71167
+7.1487 8.34258
+7.48738 8.3172
+8.77247 9.95985
+7.6706 9.56828
+8.14268 8.61726
+6.5455 7.90871
+4.57866 4.78453
+3.63937 4.42349
+5.18905 5.36516
+4.68884 5.62995
+5.88338 7.83824
+-0.002979 0.145818
+4.42981 4.77141
+0.558593 1.07999
+6.91713 7.36159
+5.13948 6.20805
+3.34368 4.07112
+7.27365 7.8383
+9.6898 9.9514
+6.14332 6.75102
+2.16534 2.78843
+2.8007 4.37952
+7.67047 7.72955
+8.77377 9.85092
+1.26087 1.55193
+6.29788 6.58511
+7.68178 9.05777
+0.383336 1.21247
+2.55185 4.30874
+8.91971 9.21836
+3.67638 4.68596
+8.13843 9.13684
+-0.424353 1.97502
+2.71499 2.93977
+0.104447 0.387901
+4.09592 4.67009
+0.808593 0.920798
+5.01258 6.30662
+4.97668 6.57412
+8.44135 9.03816
+2.78932 3.72809
+6.71337 7.15128
+4.27234 4.50127
+6.78266 9.70351
+6.48026 7.51491
+7.36296 8.42283
+4.80339 7.3704
+6.24735 7.3132
+0.134626 0.364187
+2.73854 4.09422
+0.809997 1.19657
+6.41154 6.50244
+7.16847 8.56485
+1.53582 3.33985
+1.92874 2.86427
+6.95941 7.01378
+5.8592 6.54917
+2.51802 2.75622
+3.3894 3.6957
+2.2547 2.64693
+8.62054 9.1951
+8.86378 10.0003
+1.87892 2.28732
+3.83146 4.21484
+1.53262 1.99692
+7.86048 7.93125
+1.79437 2.68269
+3.92781 4.24119
+5.43044 5.47935
+0.322904 0.618854
+3.42383 5.18531
+4.00989 5.83612
+7.06304 8.76582
+5.88039 6.77654
+8.638 8.9479
+1.73391 2.09002
+1.04861 2.84779
+-0.313019 0.557659
+3.35245 4.1308
+9.05373 9.57205
+5.85684 6.49193
+6.00719 6.86421
+4.25244 4.65772
+5.15865 5.61529
+8.78498 9.77544
+8.33803 9.26452
+3.42915 4.92279
+8.29884 8.94035
+5.10232 5.35924
+4.33571 4.86695
+7.86184 7.90029
+7.34345 7.36214
+0.201624 0.800371
+9.05882 10.5503
+4.32188 5.03154
+-0.0456982 1.22298
+2.90921 3.60013
+1.69306 2.36564
+7.79029 9.15059
+4.65205 5.06538
+6.34552 8.32176
+7.92695 9.32585
+7.17903 8.09903
+9.53561 9.60287
+0.365723 1.23929
+0.542889 0.849053
+8.15061 8.93512
+6.40042 6.41053
+5.82666 6.5488
+1.00893 1.83717
+1.76021 2.11893
+7.61076 8.6242
+2.32513 3.4856
+4.39023 6.01094
+-0.11754 0.421848
+6.76371 6.94513
+4.67607 5.58732
+-0.201992 0.765553
+7.42926 7.44429
+2.57485 2.85339
+2.74138 4.13421
+8.21645 9.18107
+6.28184 6.4996
+7.129 7.74678
+7.76842 8.74924
+3.5359 4.35892
+3.04103 3.24376
+2.29389 2.92164
+6.96306 7.64415
+8.82053 9.04584
+1.19911 2.06167
+5.91357 7.6773
+0.150241 1.23291
+4.48681 5.41762
+6.89156 8.13443
+5.37828 5.79944
+2.13694 2.91102
+1.35932 2.08272
+6.14309 6.23278
+4.03202 5.88521
+7.23417 7.43704
+1.2501 2.60793
+2.12334 3.65727
+7.05722 8.77078
+0.437873 0.585933
+6.33338 9.16643
+2.44724 4.40234
+2.92012 3.64047
+1.2039 3.25195
+8.6611 10.0398
+8.0088 9.13622
+5.96562 7.08515
+5.45181 6.65246
+0.742546 2.38958
+4.12919 4.93571
+0.428823 0.84483
+1.45226 2.5869
+9.50727 10.0211
+7.69194 8.66273
+1.25706 2.44554
+5.23247 5.47762
+0.499178 1.70722
+7.26569 8.72467
+3.59815 5.50022
+1.03601 2.43445
+0.092414 0.927635
+3.7917 3.995
+6.21977 8.40398
+3.1513 3.81188
+9.80482 10.0951
+8.65564 9.33687
+2.06164 3.49152
+2.09754 2.34929
+0.66126 2.31888
+5.34832 6.82603
+7.91038 8.59105
+0.695523 0.800961
+2.33406 2.71629
+8.37774 10.9253
+9.7682 10.106
+9.44382 9.5743
+8.78009 9.47645
+1.87309 3.04127
+1.86724 2.13913
+3.30049 3.52416
+7.18508 7.6648
+1.3736 2.12153
+2.41879 5.06716
+1.87815 2.29743
+1.76646 2.06335
+9.73034 9.95475
+0.497489 0.686102
+6.96908 7.17338
+9.23111 10.0148
+3.30981 4.21787
+9.53311 10.3734
+-0.067709 0.147251
+8.44557 8.82047
+7.10407 7.47639
+0.834352 1.36908
+9.1598 10.6508
+4.22018 4.38279
+3.8295 3.95462
+3.97302 4.97247
+1.55856 2.31013
+0.0217962 0.486978
+1.69845 2.65786
+-0.489562 0.582187
+5.10621 5.6055
+9.8478 9.85919
+6.15389 6.92324
+7.11469 8.0418
+3.20625 3.78209
+5.93389 7.66892
+1.15134 1.18023
+6.84797 7.4239
+2.9483 3.22279
+-0.43205 0.764755
+7.17846 7.33313
+5.4729 8.26894
+6.19512 7.32132
+0.591934 0.767568
+0.49266 1.80691
+9.08272 9.72242
+5.85683 6.36905
+5.27625 7.13913
+3.60853 3.98155
+0.642811 1.10253
+1.27117 1.5329
+8.76096 9.61776
+4.9498 5.12847
+7.53282 7.80438
+1.40487 1.65657
+3.45329 3.84307
+3.25698 3.49614
+2.38651 2.89802
+8.23114 8.99016
+9.58516 10.4145
+5.5185 6.27733
+0.583068 0.892249
+1.93142 2.35084
+7.94845 9.22667
+2.47963 3.9005
+3.46106 3.86301
+7.77744 8.43735
+1.41072 1.73969
+9.12904 10.4307
+3.52227 3.66861
+5.4743 5.86487
+-0.51727 1.63657
+5.09861 7.03162
+5.14763 5.93411
+3.23526 3.47376
+0.9702 1.74063
+9.28366 10.3322
+1.80257 1.92265
+8.63597 9.08467
+4.16006 4.97753
+6.37418 6.39374
+5.82376 6.62429
+7.74751 8.68962
+1.63821 2.53399
+4.9864 6.40969
+0.680772 0.995608
+3.74344 3.83319
+0.898055 1.8593
+2.36839 2.39307
+7.21046 7.51006
+0.60893 2.91523
+3.15017 4.30412
+5.02219 6.28886
+4.60541 4.73379
+8.41196 8.58978
+8.84706 10.8198
+6.95807 7.54952
+5.54729 6.9315
+4.62574 4.73423
+3.35252 3.59865
+1.02207 1.71791
+3.16408 3.73993
+0.639222 1.69519
+7.57978 8.05813
+2.41371 2.77174
+8.65544 10.093
+6.31988 6.70758
+6.5301 8.39328
+0.578825 1.20331
+1.1243 2.07824
+5.86555 6.72397
+6.37103 6.81736
+1.12086 3.46541
+2.59503 3.44073
+5.27128 5.3616
+2.87331 3.4352
+5.48408 6.67916
+3.36016 4.09125
+0.813671 0.9811
+0.812162 3.22209
+6.85104 6.86306
+0.671311 0.979685
+2.75962 2.82659
+2.42186 2.49827
+7.82974 9.59669
+3.48851 3.60085
+8.47775 10.9574
+8.6863 10.6155
+0.196484 1.07469
+1.19293 1.45012
+5.79166 6.18466
+6.51597 6.6793
+9.78341 10.1992
+8.17879 9.59257
+6.96178 8.73165
+4.09161 4.31908
+3.19514 3.4072
+5.5101 6.32978
+0.188435 1.84481
+9.41738 10.0379
+1.46994 1.6294
+4.21915 5.39529
+5.46567 5.86638
+8.19414 9.201
+4.38616 4.55193
+2.31105 2.73345
+6.05897 6.12297
+8.84135 9.74232
+9.44943 10.2225
+3.27501 3.66059
+0.524904 1.74374
+7.7228 8.43799
+5.13274 5.82863
+8.2787 8.94491
+1.61463 2.03499
+7.04346 8.69977
+0.938308 2.38676
+0.00208037 0.0186158
+1.98744 2.05864
+7.05787 8.16211
+1.68383 2.04684
+2.24812 2.28257
+0.685061 1.2947
+2.25379 2.92827
+6.0052 6.24797
+7.06213 7.86344
+0.751849 2.96376
+0.0977921 0.513746
+8.43792 9.10545
+2.80769 3.09276
+9.19308 9.59741
+4.74365 4.99708
+8.41385 8.58422
+4.28093 5.9281
+4.26205 4.75417
+1.48035 1.61363
+1.4264 1.80922
+3.48365 4.52935
+1.78396 2.96351
+8.4134 8.96536
+8.65646 9.34781
+1.88027 2.97804
+8.92531 9.02743
+6.91815 7.88895
+5.68023 7.37521
+3.93105 4.6123
+0.385874 1.30785
+1.80151 2.24385
+8.43781 9.33927
+6.69643 8.001
+6.12062 6.673
+4.8316 6.63067
+9.00443 9.08204
+1.5651 2.65023
+3.57517 4.40231
+5.85127 8.02219
+8.02586 10.018
+2.00514 2.75138
+6.32104 7.84285
+8.90914 9.78319
+4.91325 6.27817
+3.87406 4.80327
+8.57887 9.30685
+1.40351 1.71079
+-0.217977 0.224497
+8.37711 9.56393
+5.54644 5.77714
+8.18206 8.36015
+0.774967 1.97899
+9.10434 10.1721
+9.39621 10.1135
+4.80108 4.90605
+9.45978 9.96227
+2.85412 4.05215
+5.71985 7.16735
+2.35081 2.82214
+9.34881 10.5899
+7.13014 7.82872
+4.54931 4.89725
+9.41397 9.9131
+8.90226 9.55276
+8.27995 9.83651
+9.2767 9.6053
+0.388751 1.40317
+5.01478 5.88869
+6.41521 7.21754
+1.22552 1.39067
+3.75771 3.81571
+4.39362 6.04592
+8.82639 8.84544
+4.59289 4.89208
+1.52235 1.64285
+1.85893 4.52056
+1.91781 2.78253
+3.34677 4.54987
+9.26905 10.6019
+7.10958 8.02083
+0.765257 1.66957
+2.17169 2.70214
+4.2293 6.38089
+1.41111 2.45992
+5.76864 6.85715
+2.19944 2.93182
+9.03727 9.6454
+3.82652 4.35225
+2.52642 3.09725
+7.77868 9.35844
+0.337665 1.00787
+1.92021 2.04418
+4.41862 5.95486
+9.47606 9.62386
+1.12113 1.55658
+5.26701 7.09712
+8.81478 9.34863
+6.29447 7.43847
+2.82379 3.57268
+7.9735 8.79936
+3.30176 5.50666
+6.36009 6.8864
+4.13583 5.00627
+0.510514 0.882245
+6.93864 7.78543
+2.04039 2.4298
+3.18337 3.19424
+4.20059 4.67088
+0.316687 0.707377
+0.169106 1.68194
+8.26665 10.2362
+1.1124 1.78306
+2.84603 3.33142
+9.48756 9.96651
+9.4301 9.7316
+0.234674 1.23981
+0.493232 0.522565
+1.342 1.41739
+2.57196 4.08221
+1.54201 2.52284
+5.32049 6.00052
+8.54218 8.59452
+-0.030524 1.64476
+2.31645 2.72528
+4.71898 4.92827
+0.0872997 1.74969
+0.994278 1.76964
+1.34411 2.77952
+0.156817 2.10245
+5.78094 6.34389
+3.09336 3.10563
+8.14245 9.0928
+9.34202 9.75484
+9.78415 10.0211
+4.68383 5.19384
+6.09441 7.90512
+6.74941 6.76118
+1.78693 1.91697
+2.34369 2.62141
+-0.20756 0.829082
+3.57681 5.11448
+2.44234 4.45153
+4.84521 5.31902
+1.80487 3.64498
+2.46125 3.02549
+-0.334514 0.64288
+8.06406 8.49886
+1.74559 2.54474
+6.05883 6.46529
+9.00014 10.2271
+8.00064 8.5061
+0.909467 0.980765
+8.65862 8.69736
+8.11457 8.77049
+3.93237 5.02485
+4.64507 5.34852
+3.92405 4.19449
+5.02381 5.21722
+3.76203 3.78396
+6.74925 7.34781
+8.2556 8.63585
+3.92521 3.99739
+1.44641 2.31509
+0.23516 0.917239
+4.4614 6.35489
+3.33221 3.95247
+1.73289 2.07919
+6.92385 7.55052
+8.74351 9.41125
+9.41451 10.1785
+7.4001 8.81081
+2.97038 3.12524
+7.26043 7.77569
+5.56625 5.59344
+5.70977 6.33362
+7.61443 8.43218
+1.05308 1.82947
+0.377602 1.57633
+6.42483 7.51505
+4.73011 5.43693
+7.72 8.09098
+9.20063 9.82287
+6.88273 7.35327
+6.88423 7.68356
+3.55293 3.6227
+0.947096 1.76021
+3.66411 5.67117
+9.31422 10.1035
+6.84847 6.98956
+2.16221 4.45806
+0.853284 3.15932
+2.48673 2.89793
+3.37633 3.90938
+1.6141 1.66363
+1.6658 3.01723
+0.419408 1.01736
+0.712239 0.791538
+2.25249 3.62425
+8.09772 10.2367
+1.46651 1.48148
+1.73233 2.0489
+7.42679 9.23232
+7.97446 9.53281
+2.74677 4.03955
+-0.169412 0.872795
+4.90663 5.40277
+7.62122 9.49334
+6.55971 7.34259
+3.71957 5.03775
+3.33226 4.06459
+0.634912 1.52603
+3.65506 4.09318
+4.31463 4.60534
+8.58287 9.85385
+0.334759 0.7232
+2.14027 2.866
+6.06611 6.3625
+2.53013 3.18764
+4.30913 4.89247
+6.53234 6.92328
+7.66419 8.61762
+1.37598 2.26754
+8.06279 8.80692
+5.28688 5.70608
+0.509396 1.34606
+8.80589 9.29765
+9.3801 10.3988
+0.402662 0.597735
+5.87213 6.63371
+2.79136 3.763
+6.20615 7.25189
+7.54065 9.62156
+4.12107 5.04454
+5.60294 6.69246
+1.20845 1.49272
+1.75679 2.56397
+2.83939 3.85147
+6.21362 6.71341
+9.01824 9.2388
+4.66617 5.04944
+1.48766 2.55674
+8.89442 9.42175
+5.29411 5.39531
+6.66271 8.68733
+0.730461 1.42466
+6.22927 6.55086
+0.566776 1.17299
+3.06104 4.17775
+5.28026 5.73966
+5.76071 7.61585
+7.83786 9.58106
+6.32199 6.46961
+8.89555 9.17429
+3.85772 4.97805
+6.63352 8.79211
+7.87234 7.94131
+6.53479 7.87979
+3.90293 4.50376
+6.21371 7.31788
+1.00497 1.75003
+6.90351 8.02435
+2.29142 3.9809
+6.26632 6.45283
+-0.0354471 1.31727
+8.80046 9.20169
+7.86905 8.36819
+0.848737 1.82393
+7.98136 9.40712
+3.97765 4.95399
+8.70252 9.26275
+3.13412 4.29389
+2.06446 3.55839
+7.67918 8.44509
+5.96082 6.40336
+1.20461 2.36924
+4.76741 5.74978
+9.41217 9.94305
+7.36736 8.07119
+3.44102 3.56957
+3.59893 4.52751
+4.2613 6.41628
+1.65321 3.02235
+3.70067 3.86657
+0.0176327 1.1215
+4.13592 4.88595
+8.73668 9.0834
+1.80944 2.95584
+6.05721 6.93009
+5.08206 5.38626
+1.86749 1.89392
+3.58284 4.10506
+0.0885586 1.47709
+5.46502 5.93066
+8.45338 8.47878
+3.46789 4.02317
+0.975506 1.15814
+7.12758 7.60073
+7.99582 8.56746
+3.11435 3.83805
+4.51166 4.52472
+8.39096 8.75934
+8.42208 9.66019
+2.48498 4.73703
+3.50301 4.81264
+6.40196 7.0733
+8.52138 8.82265
+1.49822 1.74634
+7.08547 7.93508
+3.47832 4.42948
+6.08646 6.20865
+4.46334 4.65278
+3.80008 4.08214
+3.4853 5.44308
+5.48109 6.18681
+6.59161 8.04307
+7.36554 7.38201
+5.2144 5.31725
+4.62607 7.25804
+1.24345 1.81263
+5.49248 8.16867
+6.4056 8.26316
+7.67828 8.56923
+2.46187 2.56974
+2.22942 3.27248
+7.14933 8.06682
+2.3236 2.95462
+4.18028 4.80535
+4.981 5.54215
+7.23261 7.34863
+4.96309 6.06396
+4.24402 4.44364
+0.917707 1.32687
+1.19806 1.65106
+3.7725 5.31412
+9.70021 9.84203
+5.99824 7.77474
+3.32636 3.84266
+8.59841 9.07653
+7.9916 9.14415
+0.786519 1.84655
+0.166394 1.47834
+2.87633 3.52808
+7.53804 9.56807
+6.14406 6.16189
+1.63428 3.96845
+1.10307 1.58897
+1.30032 2.85313
+7.89803 8.32723
+8.77593 8.90136
+1.68804 2.69447
+4.5956 4.6743
+7.39643 8.29839
+6.93629 7.82243
+6.10289 7.677
+1.83835 2.34295
+1.04506 1.91684
+8.95277 9.43817
+0.36153 0.643665
+1.02408 3.18963
+4.02972 4.40301
+2.80428 2.82552
+6.51718 6.64956
+0.185341 1.56607
+6.1658 7.59364
+4.09288 4.11687
+6.90205 7.16338
+5.0755 5.39478
+4.5614 4.83286
+5.8489 8.76295
+9.70079 10.0431
+8.44334 8.54714
+3.00139 3.66327
+5.34458 6.38895
+7.11481 7.96865
+4.66776 5.15678
+0.390138 0.53352
+2.01116 3.32839
+6.78761 6.97068
+4.57477 5.0724
+1.14098 1.36134
+7.4559 8.30327
+0.700932 2.40437
+1.90469 1.99046
+4.30064 5.11485
+7.84433 8.48543
+5.96212 7.49882
+3.93055 3.96317
+0.546327 1.04814
+8.96011 9.0404
+7.89255 8.06149
+0.669924 2.6944
+-0.00972314 0.837474
+6.07199 6.37467
+2.73659 3.19833
+5.9576 7.10966
+9.1316 9.14737
+5.26101 6.59184
+5.77697 8.08876
+0.68623 0.782805
+0.842619 1.39893
+5.82075 6.15957
+4.36394 4.88479
+7.1828 7.90107
+3.3331 4.39923
+6.54243 7.24966
+2.809 2.96491
+4.18514 4.61948
+4.95453 5.33929
+8.33288 9.52867
+9.05785 10.4276
+2.58917 4.74403
+1.34279 1.89014
+4.93626 5.75424
+7.75031 7.92788
+9.00904 9.02402
+3.91286 5.15124
+6.98486 7.34688
+-0.173169 0.415019
+0.652242 1.51556
+3.50184 5.30486
+3.72563 4.09022
+4.60463 6.58985
+3.34219 4.31833
+2.55445 2.58651
+6.14573 6.3669
+4.52336 6.37342
+9.37606 9.76836
+2.4198 3.36929
+2.89109 3.66974
+5.62463 6.05989
+0.674219 1.84165
+0.590017 1.71153
+1.54622 2.10277
+6.48003 6.55663
+3.56355 3.98573
+0.743671 1.87049
+3.27833 6.0722
+4.76267 6.9967
+2.80188 4.03037
+0.372694 0.482111
+5.73987 5.9529
+8.84732 9.49033
+0.833944 1.8157
+4.06126 4.36615
+0.884619 2.34622
+6.86723 6.99141
+8.07737 9.05193
+8.35903 9.00761
+8.84777 9.74001
+8.58058 9.05479
+8.28076 8.44566
+4.55155 5.65475
+2.44314 3.38966
+3.22172 4.50395
+7.1808 7.90376
+0.639636 1.72606
+5.46807 5.94322
+9.02146 9.87864
+-0.628472 0.655557
+4.29775 5.9553
+6.77525 7.38152
+6.51827 6.93542
+8.95252 9.52939
+0.755406 1.19973
+7.69455 7.86912
+0.170143 1.12949
+7.69254 8.08221
+2.08238 3.27051
+1.28662 1.78628
+1.21208 2.79391
+-0.155739 1.7071
+8.28833 9.10011
+5.77789 6.6954
+1.98395 2.35216
+5.77469 6.05177
+2.77565 5.81092
+-1.53416 2.30576
+6.93529 8.04506
+3.91553 4.55593
+5.57201 6.29071
+1.54149 1.86613
+4.09163 4.31234
+8.47834 11.1229
+5.70376 7.02981
+2.24683 3.79925
+5.4793 6.41036
+5.27644 6.81729
+0.13273 0.371437
+1.22959 1.41618
+0.551957 1.03276
+2.01269 2.4018
+8.77113 9.09395
+8.11753 8.46262
+0.39406 0.783705
+5.35964 5.48227
+7.24727 8.23233
+7.74525 8.85748
+0.0115736 0.882607
+1.78575 2.19684
+8.32514 9.0503
+3.11074 3.34975
+0.847464 2.13237
+0.310898 0.393528
+8.68841 10.518
+1.10032 1.83755
+2.42286 3.02554
+1.16364 2.80986
+1.46419 2.11421
+7.46021 7.90273
+6.86556 7.62542
+1.91466 3.79843
+3.1056 3.83969
+3.41591 4.26565
+0.285122 1.21372
+3.75441 5.52385
+1.07643 2.63403
+6.17341 7.67244
+9.13122 9.5132
+4.39696 6.15885
+3.7207 4.07729
+6.80782 7.1958
+6.65933 6.67105
+8.51535 8.7263
+5.98305 7.17759
+2.19609 2.46108
+8.21186 8.96908
+2.94729 3.60562
+3.31907 3.9297
+0.463492 0.626603
+2.62143 3.55089
+5.76898 6.79002
+1.45502 1.56525
+4.80797 5.62389
+5.87337 6.70588
+2.92765 3.50929
+0.412987 0.951057
+3.64594 4.40269
+-0.043401 0.502176
+4.54802 5.44613
+1.20218 1.8732
+2.75547 2.96745
+7.10348 7.7945
+9.74845 9.98835
+4.83718 6.4836
+2.30563 2.5903
+4.74016 6.30789
+6.42192 6.93329
+5.37294 6.73938
+2.4365 3.05787
+1.08283 3.79193
+4.90426 5.93563
+3.8874 4.83301
+0.13909 0.983027
+4.07407 5.61421
+8.62875 10.6851
+8.10233 8.29952
+2.23047 2.4691
+7.34617 7.39475
+1.66309 2.3032
+7.11207 10.0686
+4.52412 6.38666
+2.48323 2.96878
+7.47877 8.86547
+2.67607 4.33436
+6.83659 8.21075
+2.87313 3.39011
+2.81911 4.07729
+0.227877 0.657898
+6.57843 7.14311
+-0.591405 1.56925
+7.08018 7.59
+9.09558 9.3923
+9.48544 9.79474
+0.740233 2.33129
+8.51111 11.134
+7.79219 8.0281
+1.73821 1.89316
+9.21077 9.29488
+5.38354 6.46025
+4.30403 4.5472
+0.0893758 0.919238
+7.94464 8.51053
+5.27119 6.3741
+5.22476 6.00588
diff --git a/geom_bottleneck/tests/data/test_013_A b/geom_bottleneck/tests/data/test_013_A
new file mode 100644
index 0000000..51cff1c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_013_A
@@ -0,0 +1,5 @@
+7.50638 7.78005
+0.991758 2.12178
+5.18481 6.61702
+6.14703 7.08581
+4.09936 4.83024
diff --git a/geom_bottleneck/tests/data/test_013_B b/geom_bottleneck/tests/data/test_013_B
new file mode 100644
index 0000000..be62ed3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_013_B
@@ -0,0 +1,5 @@
+5.8232 6.36308
+2.16066 2.48668
+2.38754 4.91418
+4.77403 5.43982
+0.291412 1.11147
diff --git a/geom_bottleneck/tests/data/test_014_A b/geom_bottleneck/tests/data/test_014_A
new file mode 100644
index 0000000..f7f90ff
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_014_A
@@ -0,0 +1 @@
+1.0 1.0
diff --git a/geom_bottleneck/tests/data/test_014_B b/geom_bottleneck/tests/data/test_014_B
new file mode 100644
index 0000000..a167a4f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_014_B
@@ -0,0 +1 @@
+5.0 5.0
diff --git a/geom_bottleneck/tests/data/test_015_A b/geom_bottleneck/tests/data/test_015_A
new file mode 100644
index 0000000..a167a4f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_015_A
@@ -0,0 +1 @@
+5.0 5.0
diff --git a/geom_bottleneck/tests/data/test_015_B b/geom_bottleneck/tests/data/test_015_B
new file mode 100644
index 0000000..a167a4f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_015_B
@@ -0,0 +1 @@
+5.0 5.0
diff --git a/geom_bottleneck/tests/data/test_016_A b/geom_bottleneck/tests/data/test_016_A
new file mode 100644
index 0000000..151d4b1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_016_A
@@ -0,0 +1,220 @@
+1.391781911475341 1.391781911475341
+1.395142124726278 1.395142124726278
+1.514181227875788 1.514181227875788
+1.528291566797427 1.528291566797427
+1.585389310674157 1.585389310674157
+1.629232116709072 1.629232116709072
+1.641428662445941 1.641428662445941
+1.646998748860116 1.646998748860116
+1.652915988616469 1.652915988616469
+1.69199679556404 1.69199679556404
+1.705727462482595 1.705727462482595
+1.706819293048617 1.706819293048617
+1.720175733750729 1.720175733750729
+1.728031840308488 1.728031840308488
+1.73797421040929 1.73797421040929
+1.739519744204842 1.739519744204842
+1.76132425248022 1.76132425248022
+1.767766952966369 1.767766952966369
+1.792444271021371 1.792444271021371
+1.831487552809192 1.831487552809192
+1.837086616049901 1.837086616049901
+1.851186504948943 1.851186504948943
+1.860502132730509 1.860502132730509
+1.8619433117852 1.8619433117852
+1.878229072834972 1.878229072834972
+1.880655074837347 1.880655074837347
+1.883647832802556 1.883647832802556
+1.884127769927503 1.884127769927503
+1.892969784466709 1.892969784466709
+1.916936460787894 1.916936460787894
+1.931545068229315 1.931545068229315
+1.937626522143119 1.937626522143119
+1.942267721488891 1.942267721488891
+1.963295334827521 1.963295334827521
+1.975655395743736 1.975655395743736
+1.981448090925679 1.981448090925679
+1.986220565173897 1.986220565173897
+1.98709020812351 1.98709020812351
+1.989420269013254 1.989420269013254
+2.007874648480185 2.007874648480185
+2.012179388983059 2.012179388983059
+2.019051972834053 2.019051972834053
+2.023278848058142 2.023278848058142
+2.026190677562545 2.026190677562545
+2.041594763633561 2.041594763633561
+2.042508934597344 2.042508934597344
+2.04305394648524 2.04305394648524
+2.052514683218775 2.052514683218775
+2.059038785694094 2.059038785694094
+2.062577320792516 2.062577320792516
+2.063488177732052 2.063488177732052
+2.067806664626417 2.067806664626417
+2.073013782498534 2.073013782498534
+2.08646120854976 2.08646120854976
+2.098476357223667 2.098476357223667
+2.101378199886176 2.101378199886176
+2.101927506425904 2.101927506425904
+2.12671744783454 2.12671744783454
+2.143966150630584 2.143966150630584
+2.145312642688415 2.145312642688415
+2.148704396208969 2.148704396208969
+2.153092682531471 2.153092682531471
+2.157553654759374 2.157553654759374
+2.176659075756566 2.176659075756566
+2.177260578806816 2.177260578806816
+2.179141269427014 2.179141269427014
+2.201895416482074 2.201895416482074
+2.202563945779844 2.202563945779844
+2.205113735193028 2.205113735193028
+2.207345865351049 2.207345865351049
+2.208922099676958 2.208922099676958
+2.218057898922937 2.218057898922937
+2.228610453267036 2.228610453267036
+2.241314066596301 2.241314066596301
+2.242145210071643 2.242145210071643
+2.253976266568437 2.253976266568437
+2.255324860119305 2.255324860119305
+2.271300972641221 2.271300972641221
+2.279438361991067 2.279438361991067
+2.286592331830957 2.286592331830957
+2.287159411646074 2.287159411646074
+2.296653147995115 2.296653147995115
+2.301754785182811 2.301754785182811
+2.30409930499031 2.30409930499031
+2.32141477565108 2.32141477565108
+2.347789281926012 2.347789281926012
+2.347827987256373 2.347827987256373
+2.349391321950732 2.349391321950732
+2.350129292983257 2.350129292983257
+2.358679083392328 2.358679083392328
+2.372845273125388 2.372845273125388
+2.385040766846267 2.385040766846267
+2.42114588843816 2.42114588843816
+2.425116524931602 2.425116524931602
+2.426518521893022 2.426518521893022
+2.43211651886311 2.43211651886311
+2.441302771998711 2.441302771998711
+2.446429340510857 2.446429340510857
+2.446547553904861 2.446547553904861
+2.45764765793376 2.45764765793376
+2.461222149682938 2.461222149682938
+2.467900747394114 2.467900747394114
+2.473214152160872 2.473214152160872
+2.5 2.5
+2.503557913626332 2.503557913626332
+2.504315621146863 2.504315621146863
+2.515634290122204 2.515634290122204
+2.516231935083851 2.516231935083851
+2.517558892374071 2.517558892374071
+2.526325773757754 2.526325773757754
+2.531164001388939 2.531164001388939
+2.53128061055404 2.53128061055404
+2.539387277827314 2.539387277827314
+2.540864599180268 2.540864599180268
+2.548084457784768 2.548084457784768
+2.548923292215475 2.548923292215475
+2.551730202825644 2.551730202825644
+2.553178578801818 2.553178578801818
+2.560295747947446 2.560295747947446
+2.566321603108612 2.566321603108612
+2.568932286976676 2.568932286976676
+2.574887688783916 2.574887688783916
+2.581809142325336 2.581809142325336
+2.584541960262555 2.584541960262555
+2.585511915815223 2.585511915815223
+2.592970592044868 2.592970592044868
+2.596055336381078 2.596055336381078
+2.598560573626668 2.598560573626668
+2.614019084614256 2.614019084614256
+2.618463725327216 2.618463725327216
+2.622883674481145 2.622883674481145
+2.627791161528314 2.627791161528314
+2.63535653879261 2.63535653879261
+2.654825898255443 2.654825898255443
+2.660423271276714 2.660423271276714
+2.667148030102869 2.667148030102869
+2.67012591760915 2.67012591760915
+2.698712599567882 2.698712599567882
+2.72180967799905 2.72180967799905
+2.732466204434637 2.732466204434637
+2.734187392905275 2.734187392905275
+2.737296308103857 2.737296308103857
+2.745724923243991 2.745724923243991
+2.749541709159369 2.749541709159369
+2.752925621447035 2.752925621447035
+2.754183973113479 2.754183973113479
+2.763972022430258 2.763972022430258
+2.766941997926879 2.766941997926879
+2.773850925522978 2.773850925522978
+2.777506755238121 2.777506755238121
+2.780333194223143 2.780333194223143
+2.783060349483276 2.783060349483276
+2.78679029681548 2.78679029681548
+2.786792895521339 2.786792895521339
+2.795170825459034 2.795170825459034
+2.801104989227437 2.801104989227437
+2.80525433080833 2.80525433080833
+2.805376738133109 2.805376738133109
+2.806844454092663 2.806844454092663
+2.811611818684648 2.811611818684648
+2.811994908451803 2.811994908451803
+2.816002798930236 2.816002798930236
+2.816814002472584 2.816814002472584
+2.818569391261086 2.818569391261086
+2.821660827076439 2.821660827076439
+2.822317588351085 2.822317588351085
+2.824910409962511 2.824910409962511
+2.829322097471409 2.829322097471409
+2.833852169620359 2.833852169620359
+2.839287537694811 2.839287537694811
+2.841714730677953 2.841714730677953
+2.841715058318205 2.841715058318205
+2.851653306950001 2.851653306950001
+2.853639002902003 2.853639002902003
+2.85515962291442 2.85515962291442
+2.855333736885793 2.855333736885793
+2.872540314564304 2.872540314564304
+2.879449214478037 2.879449214478037
+2.881003856158217 2.881003856158217
+2.881074731438092 2.881074731438092
+2.893589165559115 2.893589165559115
+2.898664743213686 2.898664743213686
+2.90387832180792 2.90387832180792
+2.919095859678745 2.919095859678745
+2.924945175440496 2.924945175440496
+2.931795145696962 2.931795145696962
+2.932285006979528 2.932285006979528
+2.934606807227626 2.934606807227626
+2.936392671567475 2.936392671567475
+2.953794710898493 2.953794710898493
+2.958055395706548 2.958055395706548
+2.960407744013656 2.960407744013656
+2.960759715914242 2.960759715914242
+2.969702548922556 2.969702548922556
+2.970149844982665 2.970149844982665
+2.978953970679893 2.978953970679893
+2.979075864664287 2.979075864664287
+2.984665519558418 2.984665519558418
+3.04548240149063 3.04548240149063
+3.050688336416719 3.050688336416719
+3.05773927378742 3.05773927378742
+3.059596740753369 3.059596740753369
+3.059762479996741 3.059762479996741
+3.088543279751235 3.088543279751235
+3.093580813520995 3.093580813520995
+3.104787362108069 3.104787362108069
+3.173380191779681 3.173380191779681
+3.583124637167399 3.583124637167399
+3.630658112409034 3.630658112409034
+3.631421639368965 3.631421639368965
+3.751087101339956 3.751087101339956
+3.800845709568037 3.800845709568037
+3.846558940956666 3.846558940956666
+4 4
+4 4
+4.076238038291317 4.076238038291317
+4.455547086147983 4.455547086147983
+5.356087357608394 5.356087357608394
+5.54364842773721 5.54364842773721
+7.587654388717225 7.587654388717225
diff --git a/geom_bottleneck/tests/data/test_016_B b/geom_bottleneck/tests/data/test_016_B
new file mode 100644
index 0000000..bb8655a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_016_B
@@ -0,0 +1,193 @@
+1.167089173446239 1.167089173446239
+1.256234452640111 1.256234452640111
+1.303693422257498 1.303693422257498
+1.413255970488646 1.413255970488646
+1.697910382446573 1.697910382446573
+1.718844728805093 1.718844728805093
+1.734124820632724 1.734124820632724
+1.749572938304276 1.749572938304276
+1.770320424526358 1.770320424526358
+1.786344763036807 1.786344763036807
+1.810054737907635 1.810054737907635
+1.815127306170105 1.815127306170105
+1.837806648681218 1.837806648681218
+1.870552189043019 1.870552189043019
+1.897240351979503 1.897240351979503
+1.935562152643027 1.935562152643027
+1.952562418976663 1.952562418976663
+1.959552126104175 1.959552126104175
+1.979899732318601 1.979899732318601
+2.00044500769347 2.00044500769347
+2.028951227523087 2.028951227523087
+2.037678749316724 2.037678749316724
+2.047911420446857 2.047911420446857
+2.075181804515723 2.075181804515723
+2.077245386452578 2.077245386452578
+2.084751316684838 2.084751316684838
+2.084860886126203 2.084860886126203
+2.103286477421968 2.103286477421968
+2.106856827309345 2.106856827309345
+2.113139266068691 2.113139266068691
+2.114594962503455 2.114594962503455
+2.115917727493158 2.115917727493158
+2.122335878797089 2.122335878797089
+2.127359082726206 2.127359082726206
+2.131673381033273 2.131673381033273
+2.155015793320908 2.155015793320908
+2.162480684365264 2.162480684365264
+2.195207236194009 2.195207236194009
+2.203279931784429 2.203279931784429
+2.205567995563669 2.205567995563669
+2.212933962936773 2.212933962936773
+2.215081271089993 2.215081271089993
+2.225989037578865 2.225989037578865
+2.24218929203347 2.24218929203347
+2.246321319993257 2.246321319993257
+2.280059407166517 2.280059407166517
+2.284117669032543 2.284117669032543
+2.293233992770926 2.293233992770926
+2.298815356955373 2.298815356955373
+2.300542634724628 2.300542634724628
+2.326408290042679 2.326408290042679
+2.328797162040625 2.328797162040625
+2.36025798094028 2.36025798094028
+2.365031313604634 2.365031313604634
+2.372266311053883 2.372266311053883
+2.400053902049271 2.400053902049271
+2.409134054334209 2.409134054334209
+2.411368235895246 2.411368235895246
+2.415934766378347 2.415934766378347
+2.420989857074179 2.420989857074179
+2.422520269961376 2.422520269961376
+2.43377629944218 2.43377629944218
+2.449308615746858 2.449308615746858
+2.452936540056068 2.452936540056068
+2.453698388060092 2.453698388060092
+2.454711357943602 2.454711357943602
+2.459202673400056 2.459202673400056
+2.493778305287384 2.493778305287384
+2.537394117473177 2.537394117473177
+2.544674753106669 2.544674753106669
+2.558904304820755 2.558904304820755
+2.563089994365716 2.563089994365716
+2.565476194422898 2.565476194422898
+2.599756049189921 2.599756049189921
+2.603619661709009 2.603619661709009
+2.609775379385211 2.609775379385211
+2.622552038976658 2.622552038976658
+2.623798471910885 2.623798471910885
+2.635711198661633 2.635711198661633
+2.644229304223612 2.644229304223612
+2.661919064427223 2.661919064427223
+2.666783921498494 2.666783921498494
+2.675503310152301 2.675503310152301
+2.684228699964661 2.684228699964661
+2.696854617267681 2.696854617267681
+2.700538654666735 2.700538654666735
+2.744886611436907 2.744886611436907
+2.748618547996708 2.748618547996708
+2.757981496641135 2.757981496641135
+2.774766825791652 2.774766825791652
+2.784491736143893 2.784491736143893
+2.796482184304273 2.796482184304273
+2.800849254751463 2.800849254751463
+2.816963410000067 2.816963410000067
+2.825207379914743 2.825207379914743
+2.831286409028398 2.831286409028398
+2.844827082550712 2.844827082550712
+2.853558438121966 2.853558438121966
+2.859806035663089 2.859806035663089
+2.878956033959891 2.878956033959891
+2.886422825109222 2.886422825109222
+2.891566924618832 2.891566924618832
+2.892028419188578 2.892028419188578
+2.893138900330932 2.893138900330932
+2.894250936382814 2.894250936382814
+2.90112201577666 2.90112201577666
+2.902172795370005 2.902172795370005
+2.90967533504119 2.90967533504119
+2.919687125962211 2.919687125962211
+2.923711238894001 2.923711238894001
+2.929041907338841 2.929041907338841
+2.938734873084349 2.938734873084349
+2.939642428979572 2.939642428979572
+2.943010909640486 2.943010909640486
+2.944210926048103 2.944210926048103
+2.951091358234723 2.951091358234723
+2.953950275008233 2.953950275008233
+2.966943157369611 2.966943157369611
+2.982522008227535 2.982522008227535
+2.992174049247434 2.992174049247434
+2.993098995839607 2.993098995839607
+2.995311055519335 2.995311055519335
+2.996708164866609 2.996708164866609
+2.999922110096644 2.999922110096644
+3 3
+3.000364533251431 3.000364533251431
+3.003840990677832 3.003840990677832
+3.006672301312824 3.006672301312824
+3.016489409140306 3.016489409140306
+3.021123787004333 3.021123787004333
+3.039117818612596 3.039117818612596
+3.039555193616473 3.039555193616473
+3.049952247267922 3.049952247267922
+3.057673482371216 3.057673482371216
+3.06920083507411 3.06920083507411
+3.075505231082782 3.075505231082782
+3.079038628197304 3.079038628197304
+3.084265889701239 3.084265889701239
+3.086837468106297 3.086837468106297
+3.103873984398081 3.103873984398081
+3.11528125482979 3.11528125482979
+3.119720021802376 3.119720021802376
+3.132543753577128 3.132543753577128
+3.141822873359038 3.141822873359038
+3.143502053175705 3.143502053175705
+3.153232877003746 3.153232877003746
+3.157586960809866 3.157586960809866
+3.157966892275408 3.157966892275408
+3.163583225161638 3.163583225161638
+3.178188125342772 3.178188125342772
+3.178475867931057 3.178475867931057
+3.179372297765929 3.179372297765929
+3.186437137237586 3.186437137237586
+3.188053957464282 3.188053957464282
+3.199351610026191 3.199351610026191
+3.204566427513051 3.204566427513051
+3.22885278850648 3.22885278850648
+3.229088648916556 3.229088648916556
+3.236685523936269 3.236685523936269
+3.239854786600373 3.239854786600373
+3.255809161351669 3.255809161351669
+3.287718056143732 3.287718056143732
+3.294038308299402 3.294038308299402
+3.313688277153076 3.313688277153076
+3.325783245946608 3.325783245946608
+3.331072954808429 3.331072954808429
+3.354962852285211 3.354962852285211
+3.357502741262644 3.357502741262644
+3.373668509804576 3.373668509804576
+3.408653045775418 3.408653045775418
+3.416281541503763 3.416281541503763
+3.443144279972986 3.443144279972986
+3.492970564191033 3.492970564191033
+3.493767805580122 3.493767805580122
+3.559084134799019 3.559084134799019
+3.559898699300211 3.559898699300211
+3.833585501974904 3.833585501974904
+4.099502076836052 4.099502076836052
+4.484082147277348 4.484082147277348
+4.505718324707756 4.505718324707756
+4.891723119528026 4.891723119528026
+5.065300494905414 5.065300494905414
+5.188599238535201 5.188599238535201
+5.36134479630535 5.36134479630535
+5.609786508140671 5.609786508140671
+7.08640314680382 7.08640314680382
+7.113765883549079 7.113765883549079
+7.328944131981744 7.328944131981744
+7.63625182217108 7.63625182217108
+7.716743341311718 7.716743341311718
+7.938093404092351 7.938093404092351
+8.112783377863046 8.112783377863046
+8.131485096731454 8.131485096731454
diff --git a/geom_bottleneck/tests/data/test_100_A b/geom_bottleneck/tests/data/test_100_A
new file mode 100644
index 0000000..e02a950
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_100_A
@@ -0,0 +1,2 @@
+0 3
+6 12
diff --git a/geom_bottleneck/tests/data/test_100_B b/geom_bottleneck/tests/data/test_100_B
new file mode 100644
index 0000000..f757173
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_100_B
@@ -0,0 +1,2 @@
+3 5
+5 13
diff --git a/geom_bottleneck/tests/data/test_101_A b/geom_bottleneck/tests/data/test_101_A
new file mode 100644
index 0000000..5fe22b1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_101_A
@@ -0,0 +1,2 @@
+8 11
+9 11
diff --git a/geom_bottleneck/tests/data/test_101_B b/geom_bottleneck/tests/data/test_101_B
new file mode 100644
index 0000000..ea19ef6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_101_B
@@ -0,0 +1,2 @@
+3 6
+5 8
diff --git a/geom_bottleneck/tests/data/test_102_A b/geom_bottleneck/tests/data/test_102_A
new file mode 100644
index 0000000..1cd65e9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_102_A
@@ -0,0 +1,2 @@
+7 8
+9 16
diff --git a/geom_bottleneck/tests/data/test_102_B b/geom_bottleneck/tests/data/test_102_B
new file mode 100644
index 0000000..3ffa9cb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_102_B
@@ -0,0 +1,2 @@
+1 10
+9 12
diff --git a/geom_bottleneck/tests/data/test_103_A b/geom_bottleneck/tests/data/test_103_A
new file mode 100644
index 0000000..d4c86c9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_103_A
@@ -0,0 +1,2 @@
+5 7
+10 15
diff --git a/geom_bottleneck/tests/data/test_103_B b/geom_bottleneck/tests/data/test_103_B
new file mode 100644
index 0000000..c9a898a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_103_B
@@ -0,0 +1,2 @@
+1 2
+1 7
diff --git a/geom_bottleneck/tests/data/test_104_A b/geom_bottleneck/tests/data/test_104_A
new file mode 100644
index 0000000..373ae44
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_104_A
@@ -0,0 +1,2 @@
+6 11
+3 6
diff --git a/geom_bottleneck/tests/data/test_104_B b/geom_bottleneck/tests/data/test_104_B
new file mode 100644
index 0000000..e382a3b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_104_B
@@ -0,0 +1,2 @@
+3 9
+10 17
diff --git a/geom_bottleneck/tests/data/test_105_A b/geom_bottleneck/tests/data/test_105_A
new file mode 100644
index 0000000..21b1cc4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_105_A
@@ -0,0 +1,2 @@
+5 14
+2 7
diff --git a/geom_bottleneck/tests/data/test_105_B b/geom_bottleneck/tests/data/test_105_B
new file mode 100644
index 0000000..3ab6543
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_105_B
@@ -0,0 +1,2 @@
+5 12
+3 12
diff --git a/geom_bottleneck/tests/data/test_106_A b/geom_bottleneck/tests/data/test_106_A
new file mode 100644
index 0000000..8d3ffb8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_106_A
@@ -0,0 +1,2 @@
+7 11
+7 15
diff --git a/geom_bottleneck/tests/data/test_106_B b/geom_bottleneck/tests/data/test_106_B
new file mode 100644
index 0000000..760ada5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_106_B
@@ -0,0 +1,2 @@
+4 12
+6 13
diff --git a/geom_bottleneck/tests/data/test_107_A b/geom_bottleneck/tests/data/test_107_A
new file mode 100644
index 0000000..79a621d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_107_A
@@ -0,0 +1,2 @@
+9 19
+1 7
diff --git a/geom_bottleneck/tests/data/test_107_B b/geom_bottleneck/tests/data/test_107_B
new file mode 100644
index 0000000..43e4294
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_107_B
@@ -0,0 +1,2 @@
+0 1
+1 3
diff --git a/geom_bottleneck/tests/data/test_108_A b/geom_bottleneck/tests/data/test_108_A
new file mode 100644
index 0000000..c2035e5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_108_A
@@ -0,0 +1,2 @@
+9 19
+7 16
diff --git a/geom_bottleneck/tests/data/test_108_B b/geom_bottleneck/tests/data/test_108_B
new file mode 100644
index 0000000..618c2c8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_108_B
@@ -0,0 +1,2 @@
+5 13
+0 9
diff --git a/geom_bottleneck/tests/data/test_109_A b/geom_bottleneck/tests/data/test_109_A
new file mode 100644
index 0000000..d16f551
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_109_A
@@ -0,0 +1,2 @@
+8 9
+3 10
diff --git a/geom_bottleneck/tests/data/test_109_B b/geom_bottleneck/tests/data/test_109_B
new file mode 100644
index 0000000..02f9518
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_109_B
@@ -0,0 +1,2 @@
+4 9
+6 13
diff --git a/geom_bottleneck/tests/data/test_110_A b/geom_bottleneck/tests/data/test_110_A
new file mode 100644
index 0000000..f013fd8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_110_A
@@ -0,0 +1,2 @@
+3 5
+1 10
diff --git a/geom_bottleneck/tests/data/test_110_B b/geom_bottleneck/tests/data/test_110_B
new file mode 100644
index 0000000..f443b07
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_110_B
@@ -0,0 +1,2 @@
+7 10
+3 5
diff --git a/geom_bottleneck/tests/data/test_111_A b/geom_bottleneck/tests/data/test_111_A
new file mode 100644
index 0000000..fcadd44
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_111_A
@@ -0,0 +1,2 @@
+10 19
+3 4
diff --git a/geom_bottleneck/tests/data/test_111_B b/geom_bottleneck/tests/data/test_111_B
new file mode 100644
index 0000000..569a5d5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_111_B
@@ -0,0 +1,2 @@
+5 6
+10 15
diff --git a/geom_bottleneck/tests/data/test_112_A b/geom_bottleneck/tests/data/test_112_A
new file mode 100644
index 0000000..7d421ec
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_112_A
@@ -0,0 +1,2 @@
+1 5
+7 8
diff --git a/geom_bottleneck/tests/data/test_112_B b/geom_bottleneck/tests/data/test_112_B
new file mode 100644
index 0000000..ec7a9a1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_112_B
@@ -0,0 +1,2 @@
+4 11
+9 17
diff --git a/geom_bottleneck/tests/data/test_113_A b/geom_bottleneck/tests/data/test_113_A
new file mode 100644
index 0000000..c3b3312
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_113_A
@@ -0,0 +1,2 @@
+5 12
+0 3
diff --git a/geom_bottleneck/tests/data/test_113_B b/geom_bottleneck/tests/data/test_113_B
new file mode 100644
index 0000000..ca287ff
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_113_B
@@ -0,0 +1,2 @@
+3 13
+6 11
diff --git a/geom_bottleneck/tests/data/test_114_A b/geom_bottleneck/tests/data/test_114_A
new file mode 100644
index 0000000..112e9d3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_114_A
@@ -0,0 +1,2 @@
+6 15
+2 6
diff --git a/geom_bottleneck/tests/data/test_114_B b/geom_bottleneck/tests/data/test_114_B
new file mode 100644
index 0000000..dabf69d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_114_B
@@ -0,0 +1,2 @@
+6 7
+1 4
diff --git a/geom_bottleneck/tests/data/test_115_A b/geom_bottleneck/tests/data/test_115_A
new file mode 100644
index 0000000..c467eae
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_115_A
@@ -0,0 +1,2 @@
+10 18
+0 1
diff --git a/geom_bottleneck/tests/data/test_115_B b/geom_bottleneck/tests/data/test_115_B
new file mode 100644
index 0000000..e14dd59
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_115_B
@@ -0,0 +1,2 @@
+2 3
+4 8
diff --git a/geom_bottleneck/tests/data/test_116_A b/geom_bottleneck/tests/data/test_116_A
new file mode 100644
index 0000000..1828c98
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_116_A
@@ -0,0 +1,2 @@
+8 9
+9 14
diff --git a/geom_bottleneck/tests/data/test_116_B b/geom_bottleneck/tests/data/test_116_B
new file mode 100644
index 0000000..f63039f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_116_B
@@ -0,0 +1,2 @@
+5 13
+9 18
diff --git a/geom_bottleneck/tests/data/test_117_A b/geom_bottleneck/tests/data/test_117_A
new file mode 100644
index 0000000..280d9bc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_117_A
@@ -0,0 +1,2 @@
+10 15
+9 14
diff --git a/geom_bottleneck/tests/data/test_117_B b/geom_bottleneck/tests/data/test_117_B
new file mode 100644
index 0000000..595260c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_117_B
@@ -0,0 +1,2 @@
+9 15
+6 11
diff --git a/geom_bottleneck/tests/data/test_118_A b/geom_bottleneck/tests/data/test_118_A
new file mode 100644
index 0000000..2ecae80
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_118_A
@@ -0,0 +1,2 @@
+9 10
+4 11
diff --git a/geom_bottleneck/tests/data/test_118_B b/geom_bottleneck/tests/data/test_118_B
new file mode 100644
index 0000000..13fc15b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_118_B
@@ -0,0 +1,2 @@
+5 14
+7 13
diff --git a/geom_bottleneck/tests/data/test_119_A b/geom_bottleneck/tests/data/test_119_A
new file mode 100644
index 0000000..db12f3c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_119_A
@@ -0,0 +1,2 @@
+2 12
+2 5
diff --git a/geom_bottleneck/tests/data/test_119_B b/geom_bottleneck/tests/data/test_119_B
new file mode 100644
index 0000000..79ccbdd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_119_B
@@ -0,0 +1,2 @@
+2 7
+2 3
diff --git a/geom_bottleneck/tests/data/test_120_A b/geom_bottleneck/tests/data/test_120_A
new file mode 100644
index 0000000..cd31ead
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_120_A
@@ -0,0 +1,3 @@
+5 13
+9 10
+3 4
diff --git a/geom_bottleneck/tests/data/test_120_B b/geom_bottleneck/tests/data/test_120_B
new file mode 100644
index 0000000..148cbca
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_120_B
@@ -0,0 +1,3 @@
+2 6
+5 6
+3 12
diff --git a/geom_bottleneck/tests/data/test_121_A b/geom_bottleneck/tests/data/test_121_A
new file mode 100644
index 0000000..864cde5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_121_A
@@ -0,0 +1,3 @@
+10 16
+7 14
+5 8
diff --git a/geom_bottleneck/tests/data/test_121_B b/geom_bottleneck/tests/data/test_121_B
new file mode 100644
index 0000000..cc2c1dc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_121_B
@@ -0,0 +1,3 @@
+9 15
+5 10
+0 3
diff --git a/geom_bottleneck/tests/data/test_122_A b/geom_bottleneck/tests/data/test_122_A
new file mode 100644
index 0000000..681d074
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_122_A
@@ -0,0 +1,3 @@
+5 6
+8 9
+5 11
diff --git a/geom_bottleneck/tests/data/test_122_B b/geom_bottleneck/tests/data/test_122_B
new file mode 100644
index 0000000..e8681e6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_122_B
@@ -0,0 +1,3 @@
+7 8
+0 1
+6 12
diff --git a/geom_bottleneck/tests/data/test_123_A b/geom_bottleneck/tests/data/test_123_A
new file mode 100644
index 0000000..2c53b51
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_123_A
@@ -0,0 +1,3 @@
+5 8
+4 6
+9 10
diff --git a/geom_bottleneck/tests/data/test_123_B b/geom_bottleneck/tests/data/test_123_B
new file mode 100644
index 0000000..0acdfb7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_123_B
@@ -0,0 +1,3 @@
+9 14
+5 14
+4 5
diff --git a/geom_bottleneck/tests/data/test_124_A b/geom_bottleneck/tests/data/test_124_A
new file mode 100644
index 0000000..f43cb9a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_124_A
@@ -0,0 +1,3 @@
+0 1
+8 16
+4 7
diff --git a/geom_bottleneck/tests/data/test_124_B b/geom_bottleneck/tests/data/test_124_B
new file mode 100644
index 0000000..51dd494
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_124_B
@@ -0,0 +1,3 @@
+7 8
+0 1
+4 6
diff --git a/geom_bottleneck/tests/data/test_125_A b/geom_bottleneck/tests/data/test_125_A
new file mode 100644
index 0000000..e0b6720
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_125_A
@@ -0,0 +1,3 @@
+9 11
+6 13
+1 10
diff --git a/geom_bottleneck/tests/data/test_125_B b/geom_bottleneck/tests/data/test_125_B
new file mode 100644
index 0000000..cf4f98c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_125_B
@@ -0,0 +1,3 @@
+7 16
+10 11
+7 16
diff --git a/geom_bottleneck/tests/data/test_126_A b/geom_bottleneck/tests/data/test_126_A
new file mode 100644
index 0000000..f504606
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_126_A
@@ -0,0 +1,3 @@
+4 8
+5 14
+1 6
diff --git a/geom_bottleneck/tests/data/test_126_B b/geom_bottleneck/tests/data/test_126_B
new file mode 100644
index 0000000..f5b5fda
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_126_B
@@ -0,0 +1,3 @@
+1 2
+8 12
+7 8
diff --git a/geom_bottleneck/tests/data/test_127_A b/geom_bottleneck/tests/data/test_127_A
new file mode 100644
index 0000000..20f8541
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_127_A
@@ -0,0 +1,3 @@
+7 8
+10 15
+3 4
diff --git a/geom_bottleneck/tests/data/test_127_B b/geom_bottleneck/tests/data/test_127_B
new file mode 100644
index 0000000..36f6cf3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_127_B
@@ -0,0 +1,3 @@
+0 1
+8 11
+2 3
diff --git a/geom_bottleneck/tests/data/test_128_A b/geom_bottleneck/tests/data/test_128_A
new file mode 100644
index 0000000..9e2c50e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_128_A
@@ -0,0 +1,3 @@
+9 17
+0 4
+0 3
diff --git a/geom_bottleneck/tests/data/test_128_B b/geom_bottleneck/tests/data/test_128_B
new file mode 100644
index 0000000..0fdae08
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_128_B
@@ -0,0 +1,3 @@
+10 18
+7 10
+1 2
diff --git a/geom_bottleneck/tests/data/test_129_A b/geom_bottleneck/tests/data/test_129_A
new file mode 100644
index 0000000..dc289de
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_129_A
@@ -0,0 +1,3 @@
+8 17
+5 10
+9 16
diff --git a/geom_bottleneck/tests/data/test_129_B b/geom_bottleneck/tests/data/test_129_B
new file mode 100644
index 0000000..3216111
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_129_B
@@ -0,0 +1,3 @@
+10 19
+8 17
+2 11
diff --git a/geom_bottleneck/tests/data/test_130_A b/geom_bottleneck/tests/data/test_130_A
new file mode 100644
index 0000000..db70054
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_130_A
@@ -0,0 +1,3 @@
+10 11
+10 19
+4 6
diff --git a/geom_bottleneck/tests/data/test_130_B b/geom_bottleneck/tests/data/test_130_B
new file mode 100644
index 0000000..80c5a30
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_130_B
@@ -0,0 +1,3 @@
+4 14
+0 8
+3 9
diff --git a/geom_bottleneck/tests/data/test_131_A b/geom_bottleneck/tests/data/test_131_A
new file mode 100644
index 0000000..720cdb3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_131_A
@@ -0,0 +1,3 @@
+9 15
+3 4
+2 5
diff --git a/geom_bottleneck/tests/data/test_131_B b/geom_bottleneck/tests/data/test_131_B
new file mode 100644
index 0000000..55bb437
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_131_B
@@ -0,0 +1,3 @@
+10 20
+10 15
+7 10
diff --git a/geom_bottleneck/tests/data/test_132_A b/geom_bottleneck/tests/data/test_132_A
new file mode 100644
index 0000000..dec8f13
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_132_A
@@ -0,0 +1,3 @@
+6 16
+2 4
+10 11
diff --git a/geom_bottleneck/tests/data/test_132_B b/geom_bottleneck/tests/data/test_132_B
new file mode 100644
index 0000000..8844484
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_132_B
@@ -0,0 +1,3 @@
+6 8
+5 14
+3 4
diff --git a/geom_bottleneck/tests/data/test_133_A b/geom_bottleneck/tests/data/test_133_A
new file mode 100644
index 0000000..b46cb4f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_133_A
@@ -0,0 +1,3 @@
+4 10
+9 15
+1 7
diff --git a/geom_bottleneck/tests/data/test_133_B b/geom_bottleneck/tests/data/test_133_B
new file mode 100644
index 0000000..7a5d26a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_133_B
@@ -0,0 +1,3 @@
+4 5
+3 6
+1 10
diff --git a/geom_bottleneck/tests/data/test_134_A b/geom_bottleneck/tests/data/test_134_A
new file mode 100644
index 0000000..4abd1e5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_134_A
@@ -0,0 +1,3 @@
+1 4
+6 13
+10 15
diff --git a/geom_bottleneck/tests/data/test_134_B b/geom_bottleneck/tests/data/test_134_B
new file mode 100644
index 0000000..aed169c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_134_B
@@ -0,0 +1,3 @@
+8 17
+8 16
+7 12
diff --git a/geom_bottleneck/tests/data/test_135_A b/geom_bottleneck/tests/data/test_135_A
new file mode 100644
index 0000000..bbe9e95
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_135_A
@@ -0,0 +1,3 @@
+7 15
+1 4
+2 6
diff --git a/geom_bottleneck/tests/data/test_135_B b/geom_bottleneck/tests/data/test_135_B
new file mode 100644
index 0000000..3c84c03
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_135_B
@@ -0,0 +1,3 @@
+6 10
+2 8
+1 7
diff --git a/geom_bottleneck/tests/data/test_136_A b/geom_bottleneck/tests/data/test_136_A
new file mode 100644
index 0000000..a68856e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_136_A
@@ -0,0 +1,3 @@
+0 1
+9 14
+7 11
diff --git a/geom_bottleneck/tests/data/test_136_B b/geom_bottleneck/tests/data/test_136_B
new file mode 100644
index 0000000..c03df54
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_136_B
@@ -0,0 +1,3 @@
+4 6
+3 4
+8 12
diff --git a/geom_bottleneck/tests/data/test_137_A b/geom_bottleneck/tests/data/test_137_A
new file mode 100644
index 0000000..179d357
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_137_A
@@ -0,0 +1,3 @@
+5 6
+7 14
+5 9
diff --git a/geom_bottleneck/tests/data/test_137_B b/geom_bottleneck/tests/data/test_137_B
new file mode 100644
index 0000000..42541ae
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_137_B
@@ -0,0 +1,3 @@
+10 16
+1 3
+6 7
diff --git a/geom_bottleneck/tests/data/test_138_A b/geom_bottleneck/tests/data/test_138_A
new file mode 100644
index 0000000..9c39dfb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_138_A
@@ -0,0 +1,3 @@
+0 4
+9 14
+10 20
diff --git a/geom_bottleneck/tests/data/test_138_B b/geom_bottleneck/tests/data/test_138_B
new file mode 100644
index 0000000..826d759
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_138_B
@@ -0,0 +1,3 @@
+8 13
+7 8
+10 18
diff --git a/geom_bottleneck/tests/data/test_139_A b/geom_bottleneck/tests/data/test_139_A
new file mode 100644
index 0000000..7f74c9f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_139_A
@@ -0,0 +1,3 @@
+6 7
+9 14
+4 5
diff --git a/geom_bottleneck/tests/data/test_139_B b/geom_bottleneck/tests/data/test_139_B
new file mode 100644
index 0000000..ba4ab64
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_139_B
@@ -0,0 +1,3 @@
+9 11
+7 11
+9 10
diff --git a/geom_bottleneck/tests/data/test_140_A b/geom_bottleneck/tests/data/test_140_A
new file mode 100644
index 0000000..fec44cc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_140_A
@@ -0,0 +1,4 @@
+9 11
+6 7
+4 12
+1 8
diff --git a/geom_bottleneck/tests/data/test_140_B b/geom_bottleneck/tests/data/test_140_B
new file mode 100644
index 0000000..af8aa1c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_140_B
@@ -0,0 +1,4 @@
+9 10
+1 2
+2 10
+2 8
diff --git a/geom_bottleneck/tests/data/test_141_A b/geom_bottleneck/tests/data/test_141_A
new file mode 100644
index 0000000..db65086
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_141_A
@@ -0,0 +1,4 @@
+7 13
+2 12
+5 13
+6 8
diff --git a/geom_bottleneck/tests/data/test_141_B b/geom_bottleneck/tests/data/test_141_B
new file mode 100644
index 0000000..022c192
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_141_B
@@ -0,0 +1,4 @@
+5 10
+9 12
+10 18
+8 11
diff --git a/geom_bottleneck/tests/data/test_142_A b/geom_bottleneck/tests/data/test_142_A
new file mode 100644
index 0000000..10bbe2d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_142_A
@@ -0,0 +1,4 @@
+6 15
+4 5
+6 9
+8 17
diff --git a/geom_bottleneck/tests/data/test_142_B b/geom_bottleneck/tests/data/test_142_B
new file mode 100644
index 0000000..82b6b28
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_142_B
@@ -0,0 +1,4 @@
+8 12
+8 11
+3 5
+8 17
diff --git a/geom_bottleneck/tests/data/test_143_A b/geom_bottleneck/tests/data/test_143_A
new file mode 100644
index 0000000..1db8047
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_143_A
@@ -0,0 +1,4 @@
+5 6
+0 2
+5 10
+6 10
diff --git a/geom_bottleneck/tests/data/test_143_B b/geom_bottleneck/tests/data/test_143_B
new file mode 100644
index 0000000..5c5a6a7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_143_B
@@ -0,0 +1,4 @@
+8 14
+5 7
+1 11
+4 10
diff --git a/geom_bottleneck/tests/data/test_144_A b/geom_bottleneck/tests/data/test_144_A
new file mode 100644
index 0000000..594f4c4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_144_A
@@ -0,0 +1,4 @@
+10 15
+6 13
+1 2
+1 6
diff --git a/geom_bottleneck/tests/data/test_144_B b/geom_bottleneck/tests/data/test_144_B
new file mode 100644
index 0000000..aa3cd6d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_144_B
@@ -0,0 +1,4 @@
+0 8
+10 13
+9 18
+8 11
diff --git a/geom_bottleneck/tests/data/test_145_A b/geom_bottleneck/tests/data/test_145_A
new file mode 100644
index 0000000..41ea529
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_145_A
@@ -0,0 +1,4 @@
+2 10
+3 11
+10 17
+3 8
diff --git a/geom_bottleneck/tests/data/test_145_B b/geom_bottleneck/tests/data/test_145_B
new file mode 100644
index 0000000..5bcbaf0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_145_B
@@ -0,0 +1,4 @@
+6 13
+10 15
+7 15
+6 10
diff --git a/geom_bottleneck/tests/data/test_146_A b/geom_bottleneck/tests/data/test_146_A
new file mode 100644
index 0000000..18c1b4a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_146_A
@@ -0,0 +1,4 @@
+3 5
+6 11
+1 8
+2 5
diff --git a/geom_bottleneck/tests/data/test_146_B b/geom_bottleneck/tests/data/test_146_B
new file mode 100644
index 0000000..24e5821
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_146_B
@@ -0,0 +1,4 @@
+5 12
+4 10
+5 11
+2 7
diff --git a/geom_bottleneck/tests/data/test_147_A b/geom_bottleneck/tests/data/test_147_A
new file mode 100644
index 0000000..bce747d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_147_A
@@ -0,0 +1,4 @@
+9 11
+1 2
+10 12
+10 15
diff --git a/geom_bottleneck/tests/data/test_147_B b/geom_bottleneck/tests/data/test_147_B
new file mode 100644
index 0000000..c545851
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_147_B
@@ -0,0 +1,4 @@
+4 6
+7 14
+4 12
+7 10
diff --git a/geom_bottleneck/tests/data/test_148_A b/geom_bottleneck/tests/data/test_148_A
new file mode 100644
index 0000000..cd7482f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_148_A
@@ -0,0 +1,4 @@
+5 9
+0 7
+7 11
+7 13
diff --git a/geom_bottleneck/tests/data/test_148_B b/geom_bottleneck/tests/data/test_148_B
new file mode 100644
index 0000000..a761bd3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_148_B
@@ -0,0 +1,4 @@
+7 9
+2 8
+1 2
+4 11
diff --git a/geom_bottleneck/tests/data/test_149_A b/geom_bottleneck/tests/data/test_149_A
new file mode 100644
index 0000000..81fff07
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_149_A
@@ -0,0 +1,4 @@
+2 4
+1 9
+7 13
+4 14
diff --git a/geom_bottleneck/tests/data/test_149_B b/geom_bottleneck/tests/data/test_149_B
new file mode 100644
index 0000000..1acd048
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_149_B
@@ -0,0 +1,4 @@
+9 12
+0 6
+4 10
+0 4
diff --git a/geom_bottleneck/tests/data/test_150_A b/geom_bottleneck/tests/data/test_150_A
new file mode 100644
index 0000000..8f4862d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_150_A
@@ -0,0 +1,4 @@
+9 11
+7 16
+0 1
+0 3
diff --git a/geom_bottleneck/tests/data/test_150_B b/geom_bottleneck/tests/data/test_150_B
new file mode 100644
index 0000000..d55101f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_150_B
@@ -0,0 +1,4 @@
+7 14
+4 5
+7 16
+8 14
diff --git a/geom_bottleneck/tests/data/test_151_A b/geom_bottleneck/tests/data/test_151_A
new file mode 100644
index 0000000..1915b6a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_151_A
@@ -0,0 +1,4 @@
+3 13
+10 11
+7 14
+2 11
diff --git a/geom_bottleneck/tests/data/test_151_B b/geom_bottleneck/tests/data/test_151_B
new file mode 100644
index 0000000..065a2c7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_151_B
@@ -0,0 +1,4 @@
+6 9
+10 15
+7 8
+7 12
diff --git a/geom_bottleneck/tests/data/test_152_A b/geom_bottleneck/tests/data/test_152_A
new file mode 100644
index 0000000..43ed98e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_152_A
@@ -0,0 +1,4 @@
+10 11
+2 5
+2 5
+0 3
diff --git a/geom_bottleneck/tests/data/test_152_B b/geom_bottleneck/tests/data/test_152_B
new file mode 100644
index 0000000..5e179b7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_152_B
@@ -0,0 +1,4 @@
+4 8
+5 12
+6 8
+3 5
diff --git a/geom_bottleneck/tests/data/test_153_A b/geom_bottleneck/tests/data/test_153_A
new file mode 100644
index 0000000..16f5a34
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_153_A
@@ -0,0 +1,4 @@
+0 9
+10 11
+10 16
+1 9
diff --git a/geom_bottleneck/tests/data/test_153_B b/geom_bottleneck/tests/data/test_153_B
new file mode 100644
index 0000000..a82ae69
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_153_B
@@ -0,0 +1,4 @@
+0 3
+3 10
+6 14
+4 7
diff --git a/geom_bottleneck/tests/data/test_154_A b/geom_bottleneck/tests/data/test_154_A
new file mode 100644
index 0000000..73246c1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_154_A
@@ -0,0 +1,4 @@
+2 5
+5 15
+2 5
+3 7
diff --git a/geom_bottleneck/tests/data/test_154_B b/geom_bottleneck/tests/data/test_154_B
new file mode 100644
index 0000000..6650b45
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_154_B
@@ -0,0 +1,4 @@
+3 4
+9 16
+5 12
+1 6
diff --git a/geom_bottleneck/tests/data/test_155_A b/geom_bottleneck/tests/data/test_155_A
new file mode 100644
index 0000000..9ce2859
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_155_A
@@ -0,0 +1,4 @@
+10 14
+7 10
+9 10
+4 12
diff --git a/geom_bottleneck/tests/data/test_155_B b/geom_bottleneck/tests/data/test_155_B
new file mode 100644
index 0000000..c852368
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_155_B
@@ -0,0 +1,4 @@
+6 10
+2 8
+4 8
+1 11
diff --git a/geom_bottleneck/tests/data/test_156_A b/geom_bottleneck/tests/data/test_156_A
new file mode 100644
index 0000000..e79fcd1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_156_A
@@ -0,0 +1,4 @@
+2 4
+6 12
+1 9
+4 14
diff --git a/geom_bottleneck/tests/data/test_156_B b/geom_bottleneck/tests/data/test_156_B
new file mode 100644
index 0000000..05cd916
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_156_B
@@ -0,0 +1,4 @@
+2 12
+7 12
+7 11
+2 4
diff --git a/geom_bottleneck/tests/data/test_157_A b/geom_bottleneck/tests/data/test_157_A
new file mode 100644
index 0000000..257f007
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_157_A
@@ -0,0 +1,4 @@
+8 17
+7 9
+10 16
+1 9
diff --git a/geom_bottleneck/tests/data/test_157_B b/geom_bottleneck/tests/data/test_157_B
new file mode 100644
index 0000000..da76a0c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_157_B
@@ -0,0 +1,4 @@
+9 11
+3 6
+0 3
+2 3
diff --git a/geom_bottleneck/tests/data/test_158_A b/geom_bottleneck/tests/data/test_158_A
new file mode 100644
index 0000000..ec64dab
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_158_A
@@ -0,0 +1,4 @@
+2 4
+9 15
+8 16
+8 11
diff --git a/geom_bottleneck/tests/data/test_158_B b/geom_bottleneck/tests/data/test_158_B
new file mode 100644
index 0000000..407c843
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_158_B
@@ -0,0 +1,4 @@
+10 17
+10 15
+1 8
+10 17
diff --git a/geom_bottleneck/tests/data/test_159_A b/geom_bottleneck/tests/data/test_159_A
new file mode 100644
index 0000000..bbf8d13
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_159_A
@@ -0,0 +1,4 @@
+9 13
+5 6
+3 6
+5 7
diff --git a/geom_bottleneck/tests/data/test_159_B b/geom_bottleneck/tests/data/test_159_B
new file mode 100644
index 0000000..fbe6d45
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_159_B
@@ -0,0 +1,4 @@
+2 5
+4 5
+9 14
+10 11
diff --git a/geom_bottleneck/tests/data/test_160_A b/geom_bottleneck/tests/data/test_160_A
new file mode 100644
index 0000000..c712c5a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_160_A
@@ -0,0 +1,5 @@
+3 10
+1 10
+5 15
+0 9
+8 9
diff --git a/geom_bottleneck/tests/data/test_160_B b/geom_bottleneck/tests/data/test_160_B
new file mode 100644
index 0000000..90edf6f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_160_B
@@ -0,0 +1,5 @@
+3 11
+0 8
+0 3
+4 7
+1 11
diff --git a/geom_bottleneck/tests/data/test_161_A b/geom_bottleneck/tests/data/test_161_A
new file mode 100644
index 0000000..4cbae18
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_161_A
@@ -0,0 +1,5 @@
+9 11
+8 10
+3 6
+4 14
+5 10
diff --git a/geom_bottleneck/tests/data/test_161_B b/geom_bottleneck/tests/data/test_161_B
new file mode 100644
index 0000000..e166afb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_161_B
@@ -0,0 +1,5 @@
+0 3
+8 14
+8 13
+0 2
+1 2
diff --git a/geom_bottleneck/tests/data/test_162_A b/geom_bottleneck/tests/data/test_162_A
new file mode 100644
index 0000000..e16e9a3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_162_A
@@ -0,0 +1,5 @@
+4 5
+7 17
+4 8
+10 16
+4 7
diff --git a/geom_bottleneck/tests/data/test_162_B b/geom_bottleneck/tests/data/test_162_B
new file mode 100644
index 0000000..78ab6a3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_162_B
@@ -0,0 +1,5 @@
+6 14
+9 10
+1 9
+7 17
+7 8
diff --git a/geom_bottleneck/tests/data/test_163_A b/geom_bottleneck/tests/data/test_163_A
new file mode 100644
index 0000000..6836e59
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_163_A
@@ -0,0 +1,5 @@
+6 12
+6 11
+7 15
+9 11
+1 6
diff --git a/geom_bottleneck/tests/data/test_163_B b/geom_bottleneck/tests/data/test_163_B
new file mode 100644
index 0000000..9d9e6e2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_163_B
@@ -0,0 +1,5 @@
+0 6
+1 11
+2 3
+7 14
+7 10
diff --git a/geom_bottleneck/tests/data/test_164_A b/geom_bottleneck/tests/data/test_164_A
new file mode 100644
index 0000000..a4187bd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_164_A
@@ -0,0 +1,5 @@
+0 2
+6 14
+7 16
+9 10
+2 6
diff --git a/geom_bottleneck/tests/data/test_164_B b/geom_bottleneck/tests/data/test_164_B
new file mode 100644
index 0000000..8597409
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_164_B
@@ -0,0 +1,5 @@
+2 10
+5 13
+4 13
+4 6
+8 16
diff --git a/geom_bottleneck/tests/data/test_165_A b/geom_bottleneck/tests/data/test_165_A
new file mode 100644
index 0000000..15b9f15
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_165_A
@@ -0,0 +1,5 @@
+1 9
+6 15
+6 7
+10 18
+6 7
diff --git a/geom_bottleneck/tests/data/test_165_B b/geom_bottleneck/tests/data/test_165_B
new file mode 100644
index 0000000..8056eab
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_165_B
@@ -0,0 +1,5 @@
+8 15
+3 13
+8 17
+1 9
+9 18
diff --git a/geom_bottleneck/tests/data/test_166_A b/geom_bottleneck/tests/data/test_166_A
new file mode 100644
index 0000000..8257649
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_166_A
@@ -0,0 +1,5 @@
+2 10
+4 12
+0 4
+10 18
+3 11
diff --git a/geom_bottleneck/tests/data/test_166_B b/geom_bottleneck/tests/data/test_166_B
new file mode 100644
index 0000000..02499eb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_166_B
@@ -0,0 +1,5 @@
+0 6
+6 16
+3 11
+10 19
+5 15
diff --git a/geom_bottleneck/tests/data/test_167_A b/geom_bottleneck/tests/data/test_167_A
new file mode 100644
index 0000000..416f645
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_167_A
@@ -0,0 +1,5 @@
+4 7
+0 5
+1 9
+7 8
+4 10
diff --git a/geom_bottleneck/tests/data/test_167_B b/geom_bottleneck/tests/data/test_167_B
new file mode 100644
index 0000000..2ab78e5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_167_B
@@ -0,0 +1,5 @@
+3 13
+3 13
+4 12
+4 13
+3 10
diff --git a/geom_bottleneck/tests/data/test_168_A b/geom_bottleneck/tests/data/test_168_A
new file mode 100644
index 0000000..57f9e66
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_168_A
@@ -0,0 +1,5 @@
+9 10
+3 8
+7 17
+10 11
+5 7
diff --git a/geom_bottleneck/tests/data/test_168_B b/geom_bottleneck/tests/data/test_168_B
new file mode 100644
index 0000000..6d5d9c5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_168_B
@@ -0,0 +1,5 @@
+10 18
+1 9
+4 9
+4 14
+8 14
diff --git a/geom_bottleneck/tests/data/test_169_A b/geom_bottleneck/tests/data/test_169_A
new file mode 100644
index 0000000..7db2396
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_169_A
@@ -0,0 +1,5 @@
+9 12
+10 14
+10 17
+5 6
+4 5
diff --git a/geom_bottleneck/tests/data/test_169_B b/geom_bottleneck/tests/data/test_169_B
new file mode 100644
index 0000000..58d7cec
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_169_B
@@ -0,0 +1,5 @@
+0 2
+9 10
+4 11
+10 13
+2 5
diff --git a/geom_bottleneck/tests/data/test_170_A b/geom_bottleneck/tests/data/test_170_A
new file mode 100644
index 0000000..7d30592
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_170_A
@@ -0,0 +1,5 @@
+5 11
+8 14
+6 13
+1 11
+6 15
diff --git a/geom_bottleneck/tests/data/test_170_B b/geom_bottleneck/tests/data/test_170_B
new file mode 100644
index 0000000..86d8ccc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_170_B
@@ -0,0 +1,5 @@
+1 3
+1 3
+4 7
+7 15
+5 13
diff --git a/geom_bottleneck/tests/data/test_171_A b/geom_bottleneck/tests/data/test_171_A
new file mode 100644
index 0000000..30ce17c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_171_A
@@ -0,0 +1,5 @@
+0 7
+3 5
+4 14
+8 14
+3 12
diff --git a/geom_bottleneck/tests/data/test_171_B b/geom_bottleneck/tests/data/test_171_B
new file mode 100644
index 0000000..487dcb5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_171_B
@@ -0,0 +1,5 @@
+7 13
+3 7
+0 5
+4 14
+5 12
diff --git a/geom_bottleneck/tests/data/test_172_A b/geom_bottleneck/tests/data/test_172_A
new file mode 100644
index 0000000..69232cf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_172_A
@@ -0,0 +1,5 @@
+3 4
+7 10
+8 14
+9 11
+2 12
diff --git a/geom_bottleneck/tests/data/test_172_B b/geom_bottleneck/tests/data/test_172_B
new file mode 100644
index 0000000..1ab31ab
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_172_B
@@ -0,0 +1,5 @@
+7 9
+8 10
+9 13
+3 9
+3 7
diff --git a/geom_bottleneck/tests/data/test_173_A b/geom_bottleneck/tests/data/test_173_A
new file mode 100644
index 0000000..d88d368
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_173_A
@@ -0,0 +1,5 @@
+5 8
+7 9
+7 11
+1 9
+5 6
diff --git a/geom_bottleneck/tests/data/test_173_B b/geom_bottleneck/tests/data/test_173_B
new file mode 100644
index 0000000..a331c9c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_173_B
@@ -0,0 +1,5 @@
+1 5
+6 9
+2 5
+1 4
+6 10
diff --git a/geom_bottleneck/tests/data/test_174_A b/geom_bottleneck/tests/data/test_174_A
new file mode 100644
index 0000000..a97b65b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_174_A
@@ -0,0 +1,5 @@
+4 14
+2 7
+9 19
+6 9
+0 2
diff --git a/geom_bottleneck/tests/data/test_174_B b/geom_bottleneck/tests/data/test_174_B
new file mode 100644
index 0000000..98da402
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_174_B
@@ -0,0 +1,5 @@
+4 11
+10 17
+7 8
+0 8
+3 9
diff --git a/geom_bottleneck/tests/data/test_175_A b/geom_bottleneck/tests/data/test_175_A
new file mode 100644
index 0000000..dc8bedd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_175_A
@@ -0,0 +1,5 @@
+8 11
+5 11
+7 13
+8 14
+4 12
diff --git a/geom_bottleneck/tests/data/test_175_B b/geom_bottleneck/tests/data/test_175_B
new file mode 100644
index 0000000..b5bd41f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_175_B
@@ -0,0 +1,5 @@
+4 12
+10 20
+10 20
+3 13
+9 16
diff --git a/geom_bottleneck/tests/data/test_176_A b/geom_bottleneck/tests/data/test_176_A
new file mode 100644
index 0000000..dff782a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_176_A
@@ -0,0 +1,5 @@
+10 13
+9 10
+8 15
+5 9
+5 13
diff --git a/geom_bottleneck/tests/data/test_176_B b/geom_bottleneck/tests/data/test_176_B
new file mode 100644
index 0000000..8724366
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_176_B
@@ -0,0 +1,5 @@
+2 8
+6 7
+0 9
+5 11
+4 12
diff --git a/geom_bottleneck/tests/data/test_177_A b/geom_bottleneck/tests/data/test_177_A
new file mode 100644
index 0000000..556caf8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_177_A
@@ -0,0 +1,5 @@
+4 7
+2 3
+6 7
+2 4
+0 7
diff --git a/geom_bottleneck/tests/data/test_177_B b/geom_bottleneck/tests/data/test_177_B
new file mode 100644
index 0000000..91583a5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_177_B
@@ -0,0 +1,5 @@
+8 17
+10 13
+4 6
+3 8
+0 5
diff --git a/geom_bottleneck/tests/data/test_178_A b/geom_bottleneck/tests/data/test_178_A
new file mode 100644
index 0000000..e223edb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_178_A
@@ -0,0 +1,5 @@
+2 3
+9 15
+8 10
+7 15
+5 11
diff --git a/geom_bottleneck/tests/data/test_178_B b/geom_bottleneck/tests/data/test_178_B
new file mode 100644
index 0000000..2ab0b73
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_178_B
@@ -0,0 +1,5 @@
+10 17
+2 9
+0 9
+8 12
+4 14
diff --git a/geom_bottleneck/tests/data/test_179_A b/geom_bottleneck/tests/data/test_179_A
new file mode 100644
index 0000000..7b11730
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_179_A
@@ -0,0 +1,5 @@
+3 13
+5 14
+7 14
+3 11
+10 15
diff --git a/geom_bottleneck/tests/data/test_179_B b/geom_bottleneck/tests/data/test_179_B
new file mode 100644
index 0000000..e160b9f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_179_B
@@ -0,0 +1,5 @@
+2 9
+2 10
+1 4
+3 6
+0 7
diff --git a/geom_bottleneck/tests/data/test_180_A b/geom_bottleneck/tests/data/test_180_A
new file mode 100644
index 0000000..a830fb1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_180_A
@@ -0,0 +1,6 @@
+9 19
+6 7
+9 17
+0 3
+7 8
+8 14
diff --git a/geom_bottleneck/tests/data/test_180_B b/geom_bottleneck/tests/data/test_180_B
new file mode 100644
index 0000000..0ed2108
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_180_B
@@ -0,0 +1,6 @@
+0 10
+1 11
+10 12
+5 6
+10 16
+5 14
diff --git a/geom_bottleneck/tests/data/test_181_A b/geom_bottleneck/tests/data/test_181_A
new file mode 100644
index 0000000..e29de9c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_181_A
@@ -0,0 +1,6 @@
+1 4
+1 2
+9 19
+3 6
+8 11
+4 8
diff --git a/geom_bottleneck/tests/data/test_181_B b/geom_bottleneck/tests/data/test_181_B
new file mode 100644
index 0000000..dacaa51
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_181_B
@@ -0,0 +1,6 @@
+6 11
+8 15
+8 12
+10 11
+4 7
+5 10
diff --git a/geom_bottleneck/tests/data/test_182_A b/geom_bottleneck/tests/data/test_182_A
new file mode 100644
index 0000000..e545af0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_182_A
@@ -0,0 +1,6 @@
+8 10
+2 6
+6 14
+5 6
+6 7
+0 2
diff --git a/geom_bottleneck/tests/data/test_182_B b/geom_bottleneck/tests/data/test_182_B
new file mode 100644
index 0000000..ffee041
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_182_B
@@ -0,0 +1,6 @@
+8 11
+6 8
+0 5
+7 13
+6 9
+10 19
diff --git a/geom_bottleneck/tests/data/test_183_A b/geom_bottleneck/tests/data/test_183_A
new file mode 100644
index 0000000..0681b8d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_183_A
@@ -0,0 +1,6 @@
+8 13
+5 7
+1 5
+5 11
+3 7
+0 3
diff --git a/geom_bottleneck/tests/data/test_183_B b/geom_bottleneck/tests/data/test_183_B
new file mode 100644
index 0000000..da3af74
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_183_B
@@ -0,0 +1,6 @@
+10 20
+6 11
+9 10
+1 4
+0 8
+7 14
diff --git a/geom_bottleneck/tests/data/test_184_A b/geom_bottleneck/tests/data/test_184_A
new file mode 100644
index 0000000..a252760
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_184_A
@@ -0,0 +1,6 @@
+3 7
+1 10
+2 5
+0 5
+1 4
+2 3
diff --git a/geom_bottleneck/tests/data/test_184_B b/geom_bottleneck/tests/data/test_184_B
new file mode 100644
index 0000000..788be62
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_184_B
@@ -0,0 +1,6 @@
+8 14
+10 11
+3 5
+5 9
+6 8
+9 10
diff --git a/geom_bottleneck/tests/data/test_185_A b/geom_bottleneck/tests/data/test_185_A
new file mode 100644
index 0000000..8922d7a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_185_A
@@ -0,0 +1,6 @@
+4 10
+8 10
+5 9
+9 13
+9 18
+8 14
diff --git a/geom_bottleneck/tests/data/test_185_B b/geom_bottleneck/tests/data/test_185_B
new file mode 100644
index 0000000..fc90091
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_185_B
@@ -0,0 +1,6 @@
+0 10
+4 5
+3 10
+1 11
+4 9
+4 14
diff --git a/geom_bottleneck/tests/data/test_186_A b/geom_bottleneck/tests/data/test_186_A
new file mode 100644
index 0000000..894dc49
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_186_A
@@ -0,0 +1,6 @@
+1 8
+10 11
+3 10
+8 9
+3 13
+9 13
diff --git a/geom_bottleneck/tests/data/test_186_B b/geom_bottleneck/tests/data/test_186_B
new file mode 100644
index 0000000..c0b49c0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_186_B
@@ -0,0 +1,6 @@
+6 15
+8 9
+4 7
+0 10
+1 9
+1 2
diff --git a/geom_bottleneck/tests/data/test_187_A b/geom_bottleneck/tests/data/test_187_A
new file mode 100644
index 0000000..f2181af
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_187_A
@@ -0,0 +1,6 @@
+9 11
+8 11
+10 11
+3 8
+7 17
+3 5
diff --git a/geom_bottleneck/tests/data/test_187_B b/geom_bottleneck/tests/data/test_187_B
new file mode 100644
index 0000000..ab13d0f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_187_B
@@ -0,0 +1,6 @@
+6 10
+10 19
+5 11
+6 13
+10 16
+10 20
diff --git a/geom_bottleneck/tests/data/test_188_A b/geom_bottleneck/tests/data/test_188_A
new file mode 100644
index 0000000..8290582
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_188_A
@@ -0,0 +1,6 @@
+4 9
+10 20
+0 4
+5 6
+8 9
+5 6
diff --git a/geom_bottleneck/tests/data/test_188_B b/geom_bottleneck/tests/data/test_188_B
new file mode 100644
index 0000000..6acfc2e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_188_B
@@ -0,0 +1,6 @@
+9 19
+6 11
+0 2
+5 12
+3 11
+7 11
diff --git a/geom_bottleneck/tests/data/test_189_A b/geom_bottleneck/tests/data/test_189_A
new file mode 100644
index 0000000..468967c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_189_A
@@ -0,0 +1,6 @@
+8 11
+4 8
+6 7
+9 15
+10 11
+2 3
diff --git a/geom_bottleneck/tests/data/test_189_B b/geom_bottleneck/tests/data/test_189_B
new file mode 100644
index 0000000..299edf6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_189_B
@@ -0,0 +1,6 @@
+6 10
+2 6
+2 9
+1 3
+7 10
+8 15
diff --git a/geom_bottleneck/tests/data/test_190_A b/geom_bottleneck/tests/data/test_190_A
new file mode 100644
index 0000000..01b3e3c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_190_A
@@ -0,0 +1,6 @@
+8 17
+9 10
+1 3
+9 16
+7 10
+8 14
diff --git a/geom_bottleneck/tests/data/test_190_B b/geom_bottleneck/tests/data/test_190_B
new file mode 100644
index 0000000..26d2d2a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_190_B
@@ -0,0 +1,6 @@
+8 9
+10 15
+10 12
+8 14
+4 5
+4 10
diff --git a/geom_bottleneck/tests/data/test_191_A b/geom_bottleneck/tests/data/test_191_A
new file mode 100644
index 0000000..e89e4b8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_191_A
@@ -0,0 +1,6 @@
+10 15
+2 7
+9 16
+6 14
+6 12
+4 13
diff --git a/geom_bottleneck/tests/data/test_191_B b/geom_bottleneck/tests/data/test_191_B
new file mode 100644
index 0000000..80022bc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_191_B
@@ -0,0 +1,6 @@
+8 18
+5 11
+2 7
+7 16
+6 9
+7 17
diff --git a/geom_bottleneck/tests/data/test_192_A b/geom_bottleneck/tests/data/test_192_A
new file mode 100644
index 0000000..8e0e64f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_192_A
@@ -0,0 +1,6 @@
+9 15
+1 9
+2 11
+1 8
+9 11
+7 8
diff --git a/geom_bottleneck/tests/data/test_192_B b/geom_bottleneck/tests/data/test_192_B
new file mode 100644
index 0000000..dcfe162
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_192_B
@@ -0,0 +1,6 @@
+8 16
+10 17
+8 9
+2 9
+2 12
+7 11
diff --git a/geom_bottleneck/tests/data/test_193_A b/geom_bottleneck/tests/data/test_193_A
new file mode 100644
index 0000000..6c2bcc8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_193_A
@@ -0,0 +1,6 @@
+5 10
+4 13
+6 7
+7 8
+7 8
+6 12
diff --git a/geom_bottleneck/tests/data/test_193_B b/geom_bottleneck/tests/data/test_193_B
new file mode 100644
index 0000000..fb271c9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_193_B
@@ -0,0 +1,6 @@
+7 12
+2 5
+9 18
+1 6
+7 16
+1 5
diff --git a/geom_bottleneck/tests/data/test_194_A b/geom_bottleneck/tests/data/test_194_A
new file mode 100644
index 0000000..2de1094
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_194_A
@@ -0,0 +1,6 @@
+9 14
+7 12
+3 10
+1 9
+3 10
+0 1
diff --git a/geom_bottleneck/tests/data/test_194_B b/geom_bottleneck/tests/data/test_194_B
new file mode 100644
index 0000000..5879993
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_194_B
@@ -0,0 +1,6 @@
+6 15
+4 9
+3 7
+2 3
+0 2
+2 12
diff --git a/geom_bottleneck/tests/data/test_195_A b/geom_bottleneck/tests/data/test_195_A
new file mode 100644
index 0000000..d109838
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_195_A
@@ -0,0 +1,6 @@
+0 9
+7 8
+9 15
+2 6
+3 8
+9 15
diff --git a/geom_bottleneck/tests/data/test_195_B b/geom_bottleneck/tests/data/test_195_B
new file mode 100644
index 0000000..6c66513
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_195_B
@@ -0,0 +1,6 @@
+3 9
+2 3
+3 10
+7 16
+4 7
+1 6
diff --git a/geom_bottleneck/tests/data/test_196_A b/geom_bottleneck/tests/data/test_196_A
new file mode 100644
index 0000000..4094acd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_196_A
@@ -0,0 +1,6 @@
+6 8
+8 12
+0 4
+3 11
+4 14
+9 14
diff --git a/geom_bottleneck/tests/data/test_196_B b/geom_bottleneck/tests/data/test_196_B
new file mode 100644
index 0000000..e5ed3ad
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_196_B
@@ -0,0 +1,6 @@
+4 10
+2 3
+7 8
+2 8
+5 12
+9 10
diff --git a/geom_bottleneck/tests/data/test_197_A b/geom_bottleneck/tests/data/test_197_A
new file mode 100644
index 0000000..771897b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_197_A
@@ -0,0 +1,6 @@
+4 10
+9 11
+0 6
+4 8
+9 14
+9 14
diff --git a/geom_bottleneck/tests/data/test_197_B b/geom_bottleneck/tests/data/test_197_B
new file mode 100644
index 0000000..1cfe6aa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_197_B
@@ -0,0 +1,6 @@
+7 13
+6 7
+5 11
+3 13
+6 14
+10 15
diff --git a/geom_bottleneck/tests/data/test_198_A b/geom_bottleneck/tests/data/test_198_A
new file mode 100644
index 0000000..6966ac4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_198_A
@@ -0,0 +1,6 @@
+10 17
+3 7
+7 8
+9 15
+0 3
+10 20
diff --git a/geom_bottleneck/tests/data/test_198_B b/geom_bottleneck/tests/data/test_198_B
new file mode 100644
index 0000000..6e9d9d4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_198_B
@@ -0,0 +1,6 @@
+3 11
+4 7
+6 15
+8 15
+7 10
+2 10
diff --git a/geom_bottleneck/tests/data/test_199_A b/geom_bottleneck/tests/data/test_199_A
new file mode 100644
index 0000000..8556563
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_199_A
@@ -0,0 +1,6 @@
+7 17
+3 13
+10 15
+9 17
+7 8
+5 14
diff --git a/geom_bottleneck/tests/data/test_199_B b/geom_bottleneck/tests/data/test_199_B
new file mode 100644
index 0000000..a43e0df
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_199_B
@@ -0,0 +1,6 @@
+7 17
+7 17
+9 14
+4 13
+1 8
+1 10
diff --git a/geom_bottleneck/tests/data/test_200_A b/geom_bottleneck/tests/data/test_200_A
new file mode 100644
index 0000000..b0a7fbd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_200_A
@@ -0,0 +1,7 @@
+9 10
+0 10
+7 8
+1 6
+8 14
+0 3
+6 9
diff --git a/geom_bottleneck/tests/data/test_200_B b/geom_bottleneck/tests/data/test_200_B
new file mode 100644
index 0000000..fcbab9a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_200_B
@@ -0,0 +1,7 @@
+2 7
+0 7
+2 4
+8 12
+7 12
+10 16
+5 6
diff --git a/geom_bottleneck/tests/data/test_201_A b/geom_bottleneck/tests/data/test_201_A
new file mode 100644
index 0000000..07d880d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_201_A
@@ -0,0 +1,7 @@
+4 5
+1 7
+0 8
+4 5
+9 14
+8 9
+2 10
diff --git a/geom_bottleneck/tests/data/test_201_B b/geom_bottleneck/tests/data/test_201_B
new file mode 100644
index 0000000..70b22f4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_201_B
@@ -0,0 +1,7 @@
+5 6
+6 16
+1 2
+2 3
+4 12
+6 15
+8 18
diff --git a/geom_bottleneck/tests/data/test_202_A b/geom_bottleneck/tests/data/test_202_A
new file mode 100644
index 0000000..b8fe1b9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_202_A
@@ -0,0 +1,7 @@
+0 6
+4 14
+9 10
+9 18
+5 12
+5 12
+1 7
diff --git a/geom_bottleneck/tests/data/test_202_B b/geom_bottleneck/tests/data/test_202_B
new file mode 100644
index 0000000..ee6e2e0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_202_B
@@ -0,0 +1,7 @@
+5 6
+7 17
+1 6
+3 11
+7 15
+10 20
+3 4
diff --git a/geom_bottleneck/tests/data/test_203_A b/geom_bottleneck/tests/data/test_203_A
new file mode 100644
index 0000000..71a1737
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_203_A
@@ -0,0 +1,7 @@
+4 9
+10 20
+5 9
+0 9
+0 8
+5 9
+0 10
diff --git a/geom_bottleneck/tests/data/test_203_B b/geom_bottleneck/tests/data/test_203_B
new file mode 100644
index 0000000..d217cda
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_203_B
@@ -0,0 +1,7 @@
+3 12
+1 9
+9 17
+7 14
+6 10
+10 20
+7 12
diff --git a/geom_bottleneck/tests/data/test_204_A b/geom_bottleneck/tests/data/test_204_A
new file mode 100644
index 0000000..011da68
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_204_A
@@ -0,0 +1,7 @@
+9 14
+2 3
+9 14
+6 7
+2 3
+6 13
+10 11
diff --git a/geom_bottleneck/tests/data/test_204_B b/geom_bottleneck/tests/data/test_204_B
new file mode 100644
index 0000000..c5d6236
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_204_B
@@ -0,0 +1,7 @@
+9 10
+0 4
+4 7
+8 15
+8 9
+7 10
+10 11
diff --git a/geom_bottleneck/tests/data/test_205_A b/geom_bottleneck/tests/data/test_205_A
new file mode 100644
index 0000000..d082be1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_205_A
@@ -0,0 +1,7 @@
+8 17
+9 12
+2 11
+0 8
+10 11
+0 7
+8 18
diff --git a/geom_bottleneck/tests/data/test_205_B b/geom_bottleneck/tests/data/test_205_B
new file mode 100644
index 0000000..30a242c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_205_B
@@ -0,0 +1,7 @@
+10 17
+9 18
+6 11
+6 7
+10 17
+3 13
+8 17
diff --git a/geom_bottleneck/tests/data/test_206_A b/geom_bottleneck/tests/data/test_206_A
new file mode 100644
index 0000000..15ee45b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_206_A
@@ -0,0 +1,7 @@
+5 7
+8 17
+4 7
+7 17
+9 11
+0 8
+9 10
diff --git a/geom_bottleneck/tests/data/test_206_B b/geom_bottleneck/tests/data/test_206_B
new file mode 100644
index 0000000..f8c89ef
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_206_B
@@ -0,0 +1,7 @@
+5 15
+9 17
+10 13
+6 13
+0 6
+10 16
+8 15
diff --git a/geom_bottleneck/tests/data/test_207_A b/geom_bottleneck/tests/data/test_207_A
new file mode 100644
index 0000000..2015b9e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_207_A
@@ -0,0 +1,7 @@
+4 9
+9 17
+9 10
+9 15
+2 3
+8 13
+9 13
diff --git a/geom_bottleneck/tests/data/test_207_B b/geom_bottleneck/tests/data/test_207_B
new file mode 100644
index 0000000..036a8ca
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_207_B
@@ -0,0 +1,7 @@
+10 18
+1 3
+10 15
+5 14
+7 15
+0 1
+10 13
diff --git a/geom_bottleneck/tests/data/test_208_A b/geom_bottleneck/tests/data/test_208_A
new file mode 100644
index 0000000..a1e6af4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_208_A
@@ -0,0 +1,7 @@
+6 14
+2 7
+6 16
+7 14
+8 13
+2 5
+5 9
diff --git a/geom_bottleneck/tests/data/test_208_B b/geom_bottleneck/tests/data/test_208_B
new file mode 100644
index 0000000..f21e91b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_208_B
@@ -0,0 +1,7 @@
+3 10
+8 16
+2 11
+10 18
+2 6
+3 7
+3 8
diff --git a/geom_bottleneck/tests/data/test_209_A b/geom_bottleneck/tests/data/test_209_A
new file mode 100644
index 0000000..545aae9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_209_A
@@ -0,0 +1,7 @@
+10 18
+5 8
+4 7
+10 16
+4 10
+2 9
+1 6
diff --git a/geom_bottleneck/tests/data/test_209_B b/geom_bottleneck/tests/data/test_209_B
new file mode 100644
index 0000000..2cf3171
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_209_B
@@ -0,0 +1,7 @@
+10 11
+1 2
+0 6
+10 11
+9 11
+10 17
+1 2
diff --git a/geom_bottleneck/tests/data/test_210_A b/geom_bottleneck/tests/data/test_210_A
new file mode 100644
index 0000000..799debc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_210_A
@@ -0,0 +1,7 @@
+1 3
+6 7
+10 11
+7 16
+4 5
+2 5
+10 18
diff --git a/geom_bottleneck/tests/data/test_210_B b/geom_bottleneck/tests/data/test_210_B
new file mode 100644
index 0000000..7cb0519
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_210_B
@@ -0,0 +1,7 @@
+3 7
+5 13
+6 11
+0 10
+10 18
+8 9
+1 4
diff --git a/geom_bottleneck/tests/data/test_211_A b/geom_bottleneck/tests/data/test_211_A
new file mode 100644
index 0000000..6715acb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_211_A
@@ -0,0 +1,7 @@
+9 15
+1 5
+10 11
+2 6
+6 8
+2 9
+8 11
diff --git a/geom_bottleneck/tests/data/test_211_B b/geom_bottleneck/tests/data/test_211_B
new file mode 100644
index 0000000..9c7890f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_211_B
@@ -0,0 +1,7 @@
+5 7
+3 9
+1 3
+1 2
+4 5
+4 7
+3 7
diff --git a/geom_bottleneck/tests/data/test_212_A b/geom_bottleneck/tests/data/test_212_A
new file mode 100644
index 0000000..e3d327a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_212_A
@@ -0,0 +1,7 @@
+3 6
+8 12
+7 15
+6 11
+9 16
+4 8
+7 12
diff --git a/geom_bottleneck/tests/data/test_212_B b/geom_bottleneck/tests/data/test_212_B
new file mode 100644
index 0000000..ee57410
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_212_B
@@ -0,0 +1,7 @@
+9 17
+1 2
+10 17
+1 10
+5 8
+5 7
+7 10
diff --git a/geom_bottleneck/tests/data/test_213_A b/geom_bottleneck/tests/data/test_213_A
new file mode 100644
index 0000000..4b904df
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_213_A
@@ -0,0 +1,7 @@
+4 8
+0 2
+0 7
+0 4
+6 15
+8 14
+3 10
diff --git a/geom_bottleneck/tests/data/test_213_B b/geom_bottleneck/tests/data/test_213_B
new file mode 100644
index 0000000..f5188b4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_213_B
@@ -0,0 +1,7 @@
+8 9
+8 13
+9 10
+2 12
+4 7
+7 8
+3 12
diff --git a/geom_bottleneck/tests/data/test_214_A b/geom_bottleneck/tests/data/test_214_A
new file mode 100644
index 0000000..3914579
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_214_A
@@ -0,0 +1,7 @@
+4 10
+7 8
+8 15
+1 4
+6 13
+8 15
+8 9
diff --git a/geom_bottleneck/tests/data/test_214_B b/geom_bottleneck/tests/data/test_214_B
new file mode 100644
index 0000000..f75c54f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_214_B
@@ -0,0 +1,7 @@
+5 12
+2 12
+5 10
+1 8
+10 19
+0 6
+3 9
diff --git a/geom_bottleneck/tests/data/test_215_A b/geom_bottleneck/tests/data/test_215_A
new file mode 100644
index 0000000..a8d6070
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_215_A
@@ -0,0 +1,7 @@
+3 4
+4 5
+3 9
+7 15
+9 12
+1 2
+4 12
diff --git a/geom_bottleneck/tests/data/test_215_B b/geom_bottleneck/tests/data/test_215_B
new file mode 100644
index 0000000..d956b59
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_215_B
@@ -0,0 +1,7 @@
+4 13
+5 7
+2 6
+9 12
+0 6
+0 1
+6 12
diff --git a/geom_bottleneck/tests/data/test_216_A b/geom_bottleneck/tests/data/test_216_A
new file mode 100644
index 0000000..67c5e86
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_216_A
@@ -0,0 +1,7 @@
+10 13
+10 17
+5 10
+4 6
+9 12
+6 9
+2 6
diff --git a/geom_bottleneck/tests/data/test_216_B b/geom_bottleneck/tests/data/test_216_B
new file mode 100644
index 0000000..802850d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_216_B
@@ -0,0 +1,7 @@
+3 9
+9 13
+1 2
+4 13
+1 8
+0 2
+1 2
diff --git a/geom_bottleneck/tests/data/test_217_A b/geom_bottleneck/tests/data/test_217_A
new file mode 100644
index 0000000..a37f46d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_217_A
@@ -0,0 +1,7 @@
+3 7
+1 4
+3 8
+1 2
+1 3
+8 9
+5 14
diff --git a/geom_bottleneck/tests/data/test_217_B b/geom_bottleneck/tests/data/test_217_B
new file mode 100644
index 0000000..4cac64e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_217_B
@@ -0,0 +1,7 @@
+3 12
+9 10
+9 10
+5 14
+0 8
+5 8
+2 5
diff --git a/geom_bottleneck/tests/data/test_218_A b/geom_bottleneck/tests/data/test_218_A
new file mode 100644
index 0000000..7ca83bc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_218_A
@@ -0,0 +1,7 @@
+7 11
+6 14
+9 19
+6 8
+2 7
+4 8
+2 8
diff --git a/geom_bottleneck/tests/data/test_218_B b/geom_bottleneck/tests/data/test_218_B
new file mode 100644
index 0000000..7c188f2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_218_B
@@ -0,0 +1,7 @@
+2 4
+8 16
+3 13
+3 12
+1 11
+0 1
+5 7
diff --git a/geom_bottleneck/tests/data/test_219_A b/geom_bottleneck/tests/data/test_219_A
new file mode 100644
index 0000000..275bc18
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_219_A
@@ -0,0 +1,7 @@
+3 4
+8 10
+5 6
+3 7
+9 12
+5 6
+0 1
diff --git a/geom_bottleneck/tests/data/test_219_B b/geom_bottleneck/tests/data/test_219_B
new file mode 100644
index 0000000..be6ab2a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_219_B
@@ -0,0 +1,7 @@
+7 16
+1 2
+4 12
+9 17
+10 11
+9 14
+10 16
diff --git a/geom_bottleneck/tests/data/test_220_A b/geom_bottleneck/tests/data/test_220_A
new file mode 100644
index 0000000..3b9ea09
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_220_A
@@ -0,0 +1,8 @@
+8 18
+6 9
+7 12
+8 14
+7 8
+4 11
+9 18
+4 8
diff --git a/geom_bottleneck/tests/data/test_220_B b/geom_bottleneck/tests/data/test_220_B
new file mode 100644
index 0000000..8e97d15
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_220_B
@@ -0,0 +1,8 @@
+9 19
+5 9
+8 9
+2 10
+3 9
+2 5
+6 15
+9 14
diff --git a/geom_bottleneck/tests/data/test_221_A b/geom_bottleneck/tests/data/test_221_A
new file mode 100644
index 0000000..2e229a8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_221_A
@@ -0,0 +1,8 @@
+9 17
+4 10
+3 5
+9 18
+3 10
+9 18
+5 12
+0 10
diff --git a/geom_bottleneck/tests/data/test_221_B b/geom_bottleneck/tests/data/test_221_B
new file mode 100644
index 0000000..e3c3c1b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_221_B
@@ -0,0 +1,8 @@
+1 3
+1 2
+2 6
+10 19
+4 14
+10 18
+4 9
+9 19
diff --git a/geom_bottleneck/tests/data/test_222_A b/geom_bottleneck/tests/data/test_222_A
new file mode 100644
index 0000000..fcb6c7f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_222_A
@@ -0,0 +1,8 @@
+9 13
+6 10
+10 17
+9 14
+7 16
+2 4
+5 11
+10 13
diff --git a/geom_bottleneck/tests/data/test_222_B b/geom_bottleneck/tests/data/test_222_B
new file mode 100644
index 0000000..512f188
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_222_B
@@ -0,0 +1,8 @@
+1 11
+0 1
+8 10
+0 6
+9 19
+3 4
+2 6
+9 10
diff --git a/geom_bottleneck/tests/data/test_223_A b/geom_bottleneck/tests/data/test_223_A
new file mode 100644
index 0000000..6f6cef5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_223_A
@@ -0,0 +1,8 @@
+0 8
+2 6
+3 13
+9 16
+4 7
+4 14
+7 17
+6 7
diff --git a/geom_bottleneck/tests/data/test_223_B b/geom_bottleneck/tests/data/test_223_B
new file mode 100644
index 0000000..07803f6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_223_B
@@ -0,0 +1,8 @@
+7 9
+3 10
+0 9
+0 1
+1 5
+2 8
+0 1
+10 18
diff --git a/geom_bottleneck/tests/data/test_224_A b/geom_bottleneck/tests/data/test_224_A
new file mode 100644
index 0000000..f33d061
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_224_A
@@ -0,0 +1,8 @@
+5 12
+0 6
+5 11
+9 17
+9 10
+0 10
+0 4
+8 13
diff --git a/geom_bottleneck/tests/data/test_224_B b/geom_bottleneck/tests/data/test_224_B
new file mode 100644
index 0000000..1b9ef36
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_224_B
@@ -0,0 +1,8 @@
+8 14
+3 13
+3 4
+9 19
+8 16
+5 9
+4 14
+2 4
diff --git a/geom_bottleneck/tests/data/test_225_A b/geom_bottleneck/tests/data/test_225_A
new file mode 100644
index 0000000..cc0d576
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_225_A
@@ -0,0 +1,8 @@
+0 1
+9 17
+3 12
+9 19
+8 15
+7 15
+6 10
+1 10
diff --git a/geom_bottleneck/tests/data/test_225_B b/geom_bottleneck/tests/data/test_225_B
new file mode 100644
index 0000000..b810b48
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_225_B
@@ -0,0 +1,8 @@
+8 11
+4 8
+8 14
+3 8
+2 10
+8 15
+5 14
+6 16
diff --git a/geom_bottleneck/tests/data/test_226_A b/geom_bottleneck/tests/data/test_226_A
new file mode 100644
index 0000000..e39728a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_226_A
@@ -0,0 +1,8 @@
+10 12
+3 5
+10 13
+6 8
+8 14
+8 15
+8 17
+3 8
diff --git a/geom_bottleneck/tests/data/test_226_B b/geom_bottleneck/tests/data/test_226_B
new file mode 100644
index 0000000..601abce
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_226_B
@@ -0,0 +1,8 @@
+3 4
+9 19
+3 7
+9 10
+1 4
+7 12
+0 1
+4 13
diff --git a/geom_bottleneck/tests/data/test_227_A b/geom_bottleneck/tests/data/test_227_A
new file mode 100644
index 0000000..e98b204
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_227_A
@@ -0,0 +1,8 @@
+10 11
+8 9
+2 8
+5 14
+6 16
+3 9
+7 8
+0 7
diff --git a/geom_bottleneck/tests/data/test_227_B b/geom_bottleneck/tests/data/test_227_B
new file mode 100644
index 0000000..3d5a25e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_227_B
@@ -0,0 +1,8 @@
+7 8
+9 14
+2 7
+7 17
+5 13
+4 6
+3 4
+6 16
diff --git a/geom_bottleneck/tests/data/test_228_A b/geom_bottleneck/tests/data/test_228_A
new file mode 100644
index 0000000..a3edeae
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_228_A
@@ -0,0 +1,8 @@
+9 10
+1 6
+8 10
+0 9
+0 2
+7 13
+10 20
+1 10
diff --git a/geom_bottleneck/tests/data/test_228_B b/geom_bottleneck/tests/data/test_228_B
new file mode 100644
index 0000000..64f78ac
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_228_B
@@ -0,0 +1,8 @@
+4 6
+9 12
+5 11
+9 16
+8 9
+7 16
+4 10
+3 4
diff --git a/geom_bottleneck/tests/data/test_229_A b/geom_bottleneck/tests/data/test_229_A
new file mode 100644
index 0000000..c832a04
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_229_A
@@ -0,0 +1,8 @@
+9 12
+1 10
+6 14
+4 9
+7 11
+3 12
+6 8
+4 12
diff --git a/geom_bottleneck/tests/data/test_229_B b/geom_bottleneck/tests/data/test_229_B
new file mode 100644
index 0000000..0f232d0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_229_B
@@ -0,0 +1,8 @@
+7 13
+2 11
+6 10
+6 10
+7 15
+10 14
+10 13
+10 14
diff --git a/geom_bottleneck/tests/data/test_230_A b/geom_bottleneck/tests/data/test_230_A
new file mode 100644
index 0000000..11d75a8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_230_A
@@ -0,0 +1,8 @@
+9 16
+3 5
+3 11
+0 7
+0 2
+10 16
+4 6
+8 16
diff --git a/geom_bottleneck/tests/data/test_230_B b/geom_bottleneck/tests/data/test_230_B
new file mode 100644
index 0000000..f30b9d0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_230_B
@@ -0,0 +1,8 @@
+4 11
+7 14
+8 17
+6 13
+0 1
+6 10
+8 10
+1 6
diff --git a/geom_bottleneck/tests/data/test_231_A b/geom_bottleneck/tests/data/test_231_A
new file mode 100644
index 0000000..8d21ce3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_231_A
@@ -0,0 +1,8 @@
+2 9
+1 11
+10 20
+7 16
+7 9
+0 7
+6 7
+6 7
diff --git a/geom_bottleneck/tests/data/test_231_B b/geom_bottleneck/tests/data/test_231_B
new file mode 100644
index 0000000..f5d94fe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_231_B
@@ -0,0 +1,8 @@
+7 10
+10 19
+8 9
+5 12
+7 17
+3 5
+10 11
+0 1
diff --git a/geom_bottleneck/tests/data/test_232_A b/geom_bottleneck/tests/data/test_232_A
new file mode 100644
index 0000000..ccad736
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_232_A
@@ -0,0 +1,8 @@
+1 6
+5 9
+9 10
+0 9
+0 8
+10 11
+2 7
+6 7
diff --git a/geom_bottleneck/tests/data/test_232_B b/geom_bottleneck/tests/data/test_232_B
new file mode 100644
index 0000000..f132580
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_232_B
@@ -0,0 +1,8 @@
+5 8
+4 5
+10 17
+10 16
+4 10
+5 14
+5 6
+0 7
diff --git a/geom_bottleneck/tests/data/test_233_A b/geom_bottleneck/tests/data/test_233_A
new file mode 100644
index 0000000..fd2fa4e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_233_A
@@ -0,0 +1,8 @@
+9 13
+2 6
+0 1
+6 14
+9 13
+0 1
+6 9
+2 9
diff --git a/geom_bottleneck/tests/data/test_233_B b/geom_bottleneck/tests/data/test_233_B
new file mode 100644
index 0000000..3dc34c6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_233_B
@@ -0,0 +1,8 @@
+8 12
+5 12
+1 5
+10 13
+1 7
+8 14
+7 15
+1 8
diff --git a/geom_bottleneck/tests/data/test_234_A b/geom_bottleneck/tests/data/test_234_A
new file mode 100644
index 0000000..6ff3442
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_234_A
@@ -0,0 +1,8 @@
+0 7
+5 13
+10 20
+1 2
+9 10
+10 17
+1 2
+0 7
diff --git a/geom_bottleneck/tests/data/test_234_B b/geom_bottleneck/tests/data/test_234_B
new file mode 100644
index 0000000..36a2966
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_234_B
@@ -0,0 +1,8 @@
+2 12
+1 2
+3 4
+1 4
+0 7
+7 8
+8 13
+9 18
diff --git a/geom_bottleneck/tests/data/test_235_A b/geom_bottleneck/tests/data/test_235_A
new file mode 100644
index 0000000..40aec79
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_235_A
@@ -0,0 +1,8 @@
+4 7
+10 11
+7 12
+2 7
+8 11
+9 11
+8 12
+7 16
diff --git a/geom_bottleneck/tests/data/test_235_B b/geom_bottleneck/tests/data/test_235_B
new file mode 100644
index 0000000..910422b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_235_B
@@ -0,0 +1,8 @@
+1 3
+9 15
+10 20
+6 16
+2 8
+3 9
+8 10
+9 14
diff --git a/geom_bottleneck/tests/data/test_236_A b/geom_bottleneck/tests/data/test_236_A
new file mode 100644
index 0000000..8ca54db
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_236_A
@@ -0,0 +1,8 @@
+5 11
+10 15
+7 9
+8 14
+0 5
+1 7
+2 3
+6 11
diff --git a/geom_bottleneck/tests/data/test_236_B b/geom_bottleneck/tests/data/test_236_B
new file mode 100644
index 0000000..0855757
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_236_B
@@ -0,0 +1,8 @@
+4 5
+1 8
+1 2
+1 4
+8 17
+2 5
+3 10
+1 2
diff --git a/geom_bottleneck/tests/data/test_237_A b/geom_bottleneck/tests/data/test_237_A
new file mode 100644
index 0000000..18a69fa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_237_A
@@ -0,0 +1,8 @@
+1 6
+3 6
+4 8
+0 3
+7 14
+6 7
+2 5
+6 13
diff --git a/geom_bottleneck/tests/data/test_237_B b/geom_bottleneck/tests/data/test_237_B
new file mode 100644
index 0000000..b2ad13f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_237_B
@@ -0,0 +1,8 @@
+3 8
+6 16
+3 11
+6 15
+7 14
+6 11
+3 5
+8 14
diff --git a/geom_bottleneck/tests/data/test_238_A b/geom_bottleneck/tests/data/test_238_A
new file mode 100644
index 0000000..d9011b0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_238_A
@@ -0,0 +1,8 @@
+7 16
+3 12
+4 7
+7 13
+6 9
+5 8
+5 9
+3 4
diff --git a/geom_bottleneck/tests/data/test_238_B b/geom_bottleneck/tests/data/test_238_B
new file mode 100644
index 0000000..788cf40
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_238_B
@@ -0,0 +1,8 @@
+5 6
+0 10
+2 5
+1 2
+9 16
+0 8
+0 3
+5 12
diff --git a/geom_bottleneck/tests/data/test_239_A b/geom_bottleneck/tests/data/test_239_A
new file mode 100644
index 0000000..dbb3bec
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_239_A
@@ -0,0 +1,8 @@
+2 10
+1 6
+10 20
+7 10
+2 7
+4 11
+0 5
+6 13
diff --git a/geom_bottleneck/tests/data/test_239_B b/geom_bottleneck/tests/data/test_239_B
new file mode 100644
index 0000000..a0c12ac
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_239_B
@@ -0,0 +1,8 @@
+1 5
+1 3
+5 8
+9 16
+8 17
+9 13
+3 4
+4 7
diff --git a/geom_bottleneck/tests/data/test_240_A b/geom_bottleneck/tests/data/test_240_A
new file mode 100644
index 0000000..2386a27
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_240_A
@@ -0,0 +1,9 @@
+0 1
+10 15
+6 7
+5 14
+10 15
+9 12
+0 4
+10 11
+3 10
diff --git a/geom_bottleneck/tests/data/test_240_B b/geom_bottleneck/tests/data/test_240_B
new file mode 100644
index 0000000..15439fb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_240_B
@@ -0,0 +1,9 @@
+0 3
+3 6
+2 12
+3 4
+9 13
+0 3
+0 7
+10 17
+6 15
diff --git a/geom_bottleneck/tests/data/test_241_A b/geom_bottleneck/tests/data/test_241_A
new file mode 100644
index 0000000..8ed0c54
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_241_A
@@ -0,0 +1,9 @@
+1 10
+10 14
+3 4
+3 6
+7 12
+1 3
+9 14
+0 2
+1 11
diff --git a/geom_bottleneck/tests/data/test_241_B b/geom_bottleneck/tests/data/test_241_B
new file mode 100644
index 0000000..fdac53a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_241_B
@@ -0,0 +1,9 @@
+7 8
+8 14
+10 20
+10 16
+2 7
+0 8
+7 17
+1 2
+5 6
diff --git a/geom_bottleneck/tests/data/test_242_A b/geom_bottleneck/tests/data/test_242_A
new file mode 100644
index 0000000..e1af329
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_242_A
@@ -0,0 +1,9 @@
+0 3
+2 4
+5 14
+4 8
+0 7
+3 13
+5 11
+5 7
+10 19
diff --git a/geom_bottleneck/tests/data/test_242_B b/geom_bottleneck/tests/data/test_242_B
new file mode 100644
index 0000000..b45d054
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_242_B
@@ -0,0 +1,9 @@
+5 6
+6 13
+7 12
+2 10
+0 9
+2 11
+2 9
+8 10
+10 13
diff --git a/geom_bottleneck/tests/data/test_243_A b/geom_bottleneck/tests/data/test_243_A
new file mode 100644
index 0000000..ed2d61b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_243_A
@@ -0,0 +1,9 @@
+4 6
+10 11
+4 7
+8 14
+1 4
+9 15
+8 10
+4 11
+7 10
diff --git a/geom_bottleneck/tests/data/test_243_B b/geom_bottleneck/tests/data/test_243_B
new file mode 100644
index 0000000..f0b5359
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_243_B
@@ -0,0 +1,9 @@
+7 8
+1 9
+7 10
+5 6
+3 11
+10 12
+1 8
+3 13
+0 9
diff --git a/geom_bottleneck/tests/data/test_244_A b/geom_bottleneck/tests/data/test_244_A
new file mode 100644
index 0000000..1d1e4a7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_244_A
@@ -0,0 +1,9 @@
+4 14
+3 8
+0 3
+3 12
+9 16
+4 7
+6 12
+7 8
+5 13
diff --git a/geom_bottleneck/tests/data/test_244_B b/geom_bottleneck/tests/data/test_244_B
new file mode 100644
index 0000000..5d9748f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_244_B
@@ -0,0 +1,9 @@
+3 7
+3 8
+5 15
+4 7
+1 2
+0 10
+6 15
+8 9
+4 5
diff --git a/geom_bottleneck/tests/data/test_245_A b/geom_bottleneck/tests/data/test_245_A
new file mode 100644
index 0000000..f17d580
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_245_A
@@ -0,0 +1,9 @@
+5 6
+3 11
+7 9
+1 7
+5 14
+4 7
+9 19
+1 7
+4 6
diff --git a/geom_bottleneck/tests/data/test_245_B b/geom_bottleneck/tests/data/test_245_B
new file mode 100644
index 0000000..4b67caa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_245_B
@@ -0,0 +1,9 @@
+1 2
+6 7
+7 13
+1 9
+9 13
+2 8
+2 4
+4 5
+4 7
diff --git a/geom_bottleneck/tests/data/test_246_A b/geom_bottleneck/tests/data/test_246_A
new file mode 100644
index 0000000..b4ddade
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_246_A
@@ -0,0 +1,9 @@
+10 15
+3 10
+2 7
+1 6
+2 3
+2 9
+9 10
+9 12
+8 18
diff --git a/geom_bottleneck/tests/data/test_246_B b/geom_bottleneck/tests/data/test_246_B
new file mode 100644
index 0000000..6e0c12d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_246_B
@@ -0,0 +1,9 @@
+4 9
+4 7
+6 11
+7 10
+0 3
+7 14
+7 17
+4 6
+10 15
diff --git a/geom_bottleneck/tests/data/test_247_A b/geom_bottleneck/tests/data/test_247_A
new file mode 100644
index 0000000..4832963
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_247_A
@@ -0,0 +1,9 @@
+5 14
+9 19
+4 5
+3 4
+2 7
+9 12
+10 11
+7 12
+8 12
diff --git a/geom_bottleneck/tests/data/test_247_B b/geom_bottleneck/tests/data/test_247_B
new file mode 100644
index 0000000..17cc1f0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_247_B
@@ -0,0 +1,9 @@
+4 12
+2 7
+1 2
+9 19
+4 14
+6 12
+8 11
+5 12
+9 10
diff --git a/geom_bottleneck/tests/data/test_248_A b/geom_bottleneck/tests/data/test_248_A
new file mode 100644
index 0000000..adbf3d6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_248_A
@@ -0,0 +1,9 @@
+8 9
+8 15
+2 12
+0 1
+8 14
+0 5
+7 17
+7 12
+7 10
diff --git a/geom_bottleneck/tests/data/test_248_B b/geom_bottleneck/tests/data/test_248_B
new file mode 100644
index 0000000..39ee264
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_248_B
@@ -0,0 +1,9 @@
+6 11
+1 10
+6 16
+10 13
+3 13
+10 16
+8 14
+8 16
+1 5
diff --git a/geom_bottleneck/tests/data/test_249_A b/geom_bottleneck/tests/data/test_249_A
new file mode 100644
index 0000000..2b8a639
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_249_A
@@ -0,0 +1,9 @@
+2 7
+2 4
+7 17
+2 11
+6 12
+3 12
+2 8
+5 6
+0 1
diff --git a/geom_bottleneck/tests/data/test_249_B b/geom_bottleneck/tests/data/test_249_B
new file mode 100644
index 0000000..06b036c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_249_B
@@ -0,0 +1,9 @@
+0 1
+8 11
+9 13
+3 11
+3 13
+7 15
+2 6
+4 5
+3 4
diff --git a/geom_bottleneck/tests/data/test_250_A b/geom_bottleneck/tests/data/test_250_A
new file mode 100644
index 0000000..6934dd8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_250_A
@@ -0,0 +1,9 @@
+0 8
+7 14
+5 12
+7 15
+9 19
+8 14
+6 15
+10 11
+9 19
diff --git a/geom_bottleneck/tests/data/test_250_B b/geom_bottleneck/tests/data/test_250_B
new file mode 100644
index 0000000..0d387ac
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_250_B
@@ -0,0 +1,9 @@
+8 13
+7 14
+0 6
+4 14
+7 17
+6 8
+5 13
+0 1
+5 10
diff --git a/geom_bottleneck/tests/data/test_251_A b/geom_bottleneck/tests/data/test_251_A
new file mode 100644
index 0000000..6fb7509
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_251_A
@@ -0,0 +1,9 @@
+1 8
+6 13
+1 6
+10 15
+7 8
+3 6
+3 11
+7 12
+4 9
diff --git a/geom_bottleneck/tests/data/test_251_B b/geom_bottleneck/tests/data/test_251_B
new file mode 100644
index 0000000..4ea7b4a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_251_B
@@ -0,0 +1,9 @@
+5 11
+6 12
+2 9
+5 6
+0 5
+0 2
+6 10
+4 10
+10 19
diff --git a/geom_bottleneck/tests/data/test_252_A b/geom_bottleneck/tests/data/test_252_A
new file mode 100644
index 0000000..0076fb9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_252_A
@@ -0,0 +1,9 @@
+4 8
+5 15
+0 10
+8 15
+1 8
+4 6
+5 13
+7 10
+0 1
diff --git a/geom_bottleneck/tests/data/test_252_B b/geom_bottleneck/tests/data/test_252_B
new file mode 100644
index 0000000..cf7fab7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_252_B
@@ -0,0 +1,9 @@
+2 3
+4 6
+0 9
+4 7
+4 11
+6 10
+9 11
+1 5
+3 4
diff --git a/geom_bottleneck/tests/data/test_253_A b/geom_bottleneck/tests/data/test_253_A
new file mode 100644
index 0000000..0916538
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_253_A
@@ -0,0 +1,9 @@
+9 18
+1 10
+7 12
+0 6
+2 4
+1 10
+2 4
+1 2
+2 11
diff --git a/geom_bottleneck/tests/data/test_253_B b/geom_bottleneck/tests/data/test_253_B
new file mode 100644
index 0000000..3ee1874
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_253_B
@@ -0,0 +1,9 @@
+9 12
+6 11
+0 1
+6 7
+2 5
+6 8
+10 20
+9 17
+8 15
diff --git a/geom_bottleneck/tests/data/test_254_A b/geom_bottleneck/tests/data/test_254_A
new file mode 100644
index 0000000..85af9cb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_254_A
@@ -0,0 +1,9 @@
+1 9
+2 10
+4 7
+4 14
+3 9
+1 11
+7 16
+10 11
+5 15
diff --git a/geom_bottleneck/tests/data/test_254_B b/geom_bottleneck/tests/data/test_254_B
new file mode 100644
index 0000000..573f5c5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_254_B
@@ -0,0 +1,9 @@
+9 13
+0 1
+8 9
+8 9
+3 10
+5 14
+6 12
+3 5
+2 3
diff --git a/geom_bottleneck/tests/data/test_255_A b/geom_bottleneck/tests/data/test_255_A
new file mode 100644
index 0000000..2fc0a84
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_255_A
@@ -0,0 +1,9 @@
+10 11
+4 8
+2 10
+2 10
+3 8
+6 7
+8 14
+2 10
+4 11
diff --git a/geom_bottleneck/tests/data/test_255_B b/geom_bottleneck/tests/data/test_255_B
new file mode 100644
index 0000000..04e0521
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_255_B
@@ -0,0 +1,9 @@
+5 13
+8 12
+8 9
+4 10
+7 8
+1 7
+3 11
+10 15
+5 10
diff --git a/geom_bottleneck/tests/data/test_256_A b/geom_bottleneck/tests/data/test_256_A
new file mode 100644
index 0000000..bb1df33
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_256_A
@@ -0,0 +1,9 @@
+6 7
+7 8
+10 16
+2 5
+5 15
+7 9
+10 15
+9 18
+4 9
diff --git a/geom_bottleneck/tests/data/test_256_B b/geom_bottleneck/tests/data/test_256_B
new file mode 100644
index 0000000..a9bb2f8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_256_B
@@ -0,0 +1,9 @@
+0 10
+7 9
+9 10
+7 8
+1 2
+2 4
+8 15
+3 7
+0 2
diff --git a/geom_bottleneck/tests/data/test_257_A b/geom_bottleneck/tests/data/test_257_A
new file mode 100644
index 0000000..ac06787
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_257_A
@@ -0,0 +1,9 @@
+6 14
+9 16
+9 18
+4 7
+8 15
+7 9
+9 17
+1 2
+10 17
diff --git a/geom_bottleneck/tests/data/test_257_B b/geom_bottleneck/tests/data/test_257_B
new file mode 100644
index 0000000..93ab86c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_257_B
@@ -0,0 +1,9 @@
+2 3
+3 6
+10 13
+7 14
+0 8
+0 2
+9 12
+1 7
+0 1
diff --git a/geom_bottleneck/tests/data/test_258_A b/geom_bottleneck/tests/data/test_258_A
new file mode 100644
index 0000000..b00d4c3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_258_A
@@ -0,0 +1,9 @@
+4 11
+0 6
+5 6
+2 4
+2 7
+8 11
+3 8
+3 4
+7 10
diff --git a/geom_bottleneck/tests/data/test_258_B b/geom_bottleneck/tests/data/test_258_B
new file mode 100644
index 0000000..f3ab79e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_258_B
@@ -0,0 +1,9 @@
+6 15
+5 10
+9 10
+4 10
+7 8
+2 8
+8 18
+9 18
+5 9
diff --git a/geom_bottleneck/tests/data/test_259_A b/geom_bottleneck/tests/data/test_259_A
new file mode 100644
index 0000000..30c4a56
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_259_A
@@ -0,0 +1,9 @@
+4 5
+0 1
+4 7
+5 14
+2 8
+0 1
+9 13
+5 9
+10 13
diff --git a/geom_bottleneck/tests/data/test_259_B b/geom_bottleneck/tests/data/test_259_B
new file mode 100644
index 0000000..8cb51f7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_259_B
@@ -0,0 +1,9 @@
+6 15
+9 18
+7 8
+9 16
+9 15
+5 15
+9 10
+6 10
+5 6
diff --git a/geom_bottleneck/tests/data/test_260_A b/geom_bottleneck/tests/data/test_260_A
new file mode 100644
index 0000000..83740c1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_260_A
@@ -0,0 +1,10 @@
+1 4
+2 5
+3 7
+7 9
+4 13
+8 15
+10 19
+9 14
+10 18
+10 17
diff --git a/geom_bottleneck/tests/data/test_260_B b/geom_bottleneck/tests/data/test_260_B
new file mode 100644
index 0000000..18e1128
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_260_B
@@ -0,0 +1,10 @@
+0 4
+8 15
+4 6
+10 13
+6 7
+7 10
+8 13
+2 7
+4 13
+3 5
diff --git a/geom_bottleneck/tests/data/test_261_A b/geom_bottleneck/tests/data/test_261_A
new file mode 100644
index 0000000..259e18a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_261_A
@@ -0,0 +1,10 @@
+8 11
+6 11
+9 16
+7 17
+7 14
+9 11
+0 1
+9 14
+6 14
+0 10
diff --git a/geom_bottleneck/tests/data/test_261_B b/geom_bottleneck/tests/data/test_261_B
new file mode 100644
index 0000000..2be943f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_261_B
@@ -0,0 +1,10 @@
+8 18
+5 7
+9 12
+7 10
+3 6
+4 14
+9 15
+8 14
+1 9
+0 5
diff --git a/geom_bottleneck/tests/data/test_262_A b/geom_bottleneck/tests/data/test_262_A
new file mode 100644
index 0000000..ccb706b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_262_A
@@ -0,0 +1,10 @@
+1 8
+6 16
+7 13
+10 13
+7 11
+10 15
+10 17
+8 17
+0 3
+5 6
diff --git a/geom_bottleneck/tests/data/test_262_B b/geom_bottleneck/tests/data/test_262_B
new file mode 100644
index 0000000..944d288
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_262_B
@@ -0,0 +1,10 @@
+9 18
+7 8
+0 8
+8 15
+6 14
+6 11
+6 16
+7 17
+3 4
+4 7
diff --git a/geom_bottleneck/tests/data/test_263_A b/geom_bottleneck/tests/data/test_263_A
new file mode 100644
index 0000000..6262062
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_263_A
@@ -0,0 +1,10 @@
+0 9
+10 11
+4 13
+9 13
+4 6
+7 13
+4 5
+7 9
+10 11
+10 18
diff --git a/geom_bottleneck/tests/data/test_263_B b/geom_bottleneck/tests/data/test_263_B
new file mode 100644
index 0000000..c9f8716
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_263_B
@@ -0,0 +1,10 @@
+2 6
+6 13
+2 12
+3 13
+5 6
+10 16
+9 18
+9 16
+10 18
+10 20
diff --git a/geom_bottleneck/tests/data/test_264_A b/geom_bottleneck/tests/data/test_264_A
new file mode 100644
index 0000000..8c79b6d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_264_A
@@ -0,0 +1,10 @@
+3 11
+3 4
+8 12
+2 10
+7 12
+2 10
+10 13
+4 8
+2 9
+10 11
diff --git a/geom_bottleneck/tests/data/test_264_B b/geom_bottleneck/tests/data/test_264_B
new file mode 100644
index 0000000..9b92607
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_264_B
@@ -0,0 +1,10 @@
+7 11
+2 7
+4 12
+9 10
+10 12
+8 15
+8 12
+6 7
+2 11
+10 11
diff --git a/geom_bottleneck/tests/data/test_265_A b/geom_bottleneck/tests/data/test_265_A
new file mode 100644
index 0000000..4de3ff9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_265_A
@@ -0,0 +1,10 @@
+0 4
+1 2
+6 11
+9 19
+0 6
+9 19
+0 5
+4 5
+7 11
+9 14
diff --git a/geom_bottleneck/tests/data/test_265_B b/geom_bottleneck/tests/data/test_265_B
new file mode 100644
index 0000000..f03f49f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_265_B
@@ -0,0 +1,10 @@
+1 7
+5 10
+5 10
+4 6
+0 7
+4 12
+8 11
+10 15
+2 11
+8 17
diff --git a/geom_bottleneck/tests/data/test_266_A b/geom_bottleneck/tests/data/test_266_A
new file mode 100644
index 0000000..95754d3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_266_A
@@ -0,0 +1,10 @@
+7 8
+3 12
+0 5
+0 6
+1 5
+9 17
+6 11
+3 5
+2 11
+5 7
diff --git a/geom_bottleneck/tests/data/test_266_B b/geom_bottleneck/tests/data/test_266_B
new file mode 100644
index 0000000..5a2d560
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_266_B
@@ -0,0 +1,10 @@
+10 17
+5 13
+9 10
+3 4
+4 10
+6 12
+0 7
+6 14
+1 6
+4 10
diff --git a/geom_bottleneck/tests/data/test_267_A b/geom_bottleneck/tests/data/test_267_A
new file mode 100644
index 0000000..d2c663e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_267_A
@@ -0,0 +1,10 @@
+3 4
+10 20
+2 10
+1 7
+0 4
+0 10
+0 8
+3 4
+9 19
+7 13
diff --git a/geom_bottleneck/tests/data/test_267_B b/geom_bottleneck/tests/data/test_267_B
new file mode 100644
index 0000000..aebae2b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_267_B
@@ -0,0 +1,10 @@
+2 11
+4 5
+1 10
+3 9
+6 11
+0 8
+2 3
+0 3
+6 11
+7 12
diff --git a/geom_bottleneck/tests/data/test_268_A b/geom_bottleneck/tests/data/test_268_A
new file mode 100644
index 0000000..d0e9835
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_268_A
@@ -0,0 +1,10 @@
+3 4
+10 17
+8 17
+0 2
+4 8
+0 8
+4 5
+5 6
+1 2
+1 7
diff --git a/geom_bottleneck/tests/data/test_268_B b/geom_bottleneck/tests/data/test_268_B
new file mode 100644
index 0000000..ac0c242
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_268_B
@@ -0,0 +1,10 @@
+3 11
+3 6
+1 2
+8 9
+2 5
+4 13
+4 9
+9 18
+9 15
+9 13
diff --git a/geom_bottleneck/tests/data/test_269_A b/geom_bottleneck/tests/data/test_269_A
new file mode 100644
index 0000000..62a1a47
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_269_A
@@ -0,0 +1,10 @@
+10 17
+10 18
+3 10
+6 8
+3 5
+5 11
+5 12
+9 13
+6 16
+2 11
diff --git a/geom_bottleneck/tests/data/test_269_B b/geom_bottleneck/tests/data/test_269_B
new file mode 100644
index 0000000..ecf44f6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_269_B
@@ -0,0 +1,10 @@
+3 8
+2 9
+1 6
+8 11
+10 18
+4 12
+0 2
+0 1
+0 8
+0 4
diff --git a/geom_bottleneck/tests/data/test_270_A b/geom_bottleneck/tests/data/test_270_A
new file mode 100644
index 0000000..6bd9f37
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_270_A
@@ -0,0 +1,10 @@
+6 16
+3 8
+6 7
+5 10
+7 17
+1 2
+10 19
+10 18
+4 9
+9 14
diff --git a/geom_bottleneck/tests/data/test_270_B b/geom_bottleneck/tests/data/test_270_B
new file mode 100644
index 0000000..5e177c7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_270_B
@@ -0,0 +1,10 @@
+8 14
+10 14
+6 7
+3 8
+9 10
+3 7
+2 3
+2 3
+10 19
+8 15
diff --git a/geom_bottleneck/tests/data/test_271_A b/geom_bottleneck/tests/data/test_271_A
new file mode 100644
index 0000000..12f7492
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_271_A
@@ -0,0 +1,10 @@
+0 7
+0 6
+3 10
+3 6
+1 10
+10 11
+3 13
+9 16
+9 15
+10 20
diff --git a/geom_bottleneck/tests/data/test_271_B b/geom_bottleneck/tests/data/test_271_B
new file mode 100644
index 0000000..1af6dd6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_271_B
@@ -0,0 +1,10 @@
+9 10
+9 16
+10 14
+1 4
+8 14
+10 11
+9 10
+3 7
+6 14
+7 8
diff --git a/geom_bottleneck/tests/data/test_272_A b/geom_bottleneck/tests/data/test_272_A
new file mode 100644
index 0000000..b6b67f0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_272_A
@@ -0,0 +1,10 @@
+9 17
+6 16
+6 8
+1 2
+7 12
+1 4
+0 9
+9 16
+8 10
+10 11
diff --git a/geom_bottleneck/tests/data/test_272_B b/geom_bottleneck/tests/data/test_272_B
new file mode 100644
index 0000000..9b12c0e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_272_B
@@ -0,0 +1,10 @@
+1 11
+9 14
+8 9
+3 11
+7 15
+0 5
+0 8
+5 11
+0 1
+10 11
diff --git a/geom_bottleneck/tests/data/test_273_A b/geom_bottleneck/tests/data/test_273_A
new file mode 100644
index 0000000..6ae8fde
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_273_A
@@ -0,0 +1,10 @@
+2 10
+8 9
+10 19
+3 7
+4 5
+1 8
+0 5
+6 9
+0 1
+4 10
diff --git a/geom_bottleneck/tests/data/test_273_B b/geom_bottleneck/tests/data/test_273_B
new file mode 100644
index 0000000..42955e8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_273_B
@@ -0,0 +1,10 @@
+9 19
+0 2
+0 1
+2 9
+7 9
+2 7
+3 6
+9 10
+2 3
+0 9
diff --git a/geom_bottleneck/tests/data/test_274_A b/geom_bottleneck/tests/data/test_274_A
new file mode 100644
index 0000000..78e099d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_274_A
@@ -0,0 +1,10 @@
+0 1
+10 11
+4 6
+9 15
+9 19
+4 7
+8 17
+0 7
+7 17
+4 14
diff --git a/geom_bottleneck/tests/data/test_274_B b/geom_bottleneck/tests/data/test_274_B
new file mode 100644
index 0000000..59cac0c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_274_B
@@ -0,0 +1,10 @@
+4 12
+2 7
+0 5
+3 10
+7 15
+3 8
+8 14
+8 11
+6 14
+6 16
diff --git a/geom_bottleneck/tests/data/test_275_A b/geom_bottleneck/tests/data/test_275_A
new file mode 100644
index 0000000..9593ad1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_275_A
@@ -0,0 +1,10 @@
+7 13
+2 3
+10 11
+5 10
+6 11
+10 16
+5 10
+5 9
+10 18
+10 11
diff --git a/geom_bottleneck/tests/data/test_275_B b/geom_bottleneck/tests/data/test_275_B
new file mode 100644
index 0000000..46d793b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_275_B
@@ -0,0 +1,10 @@
+9 19
+10 11
+8 9
+7 8
+4 8
+0 2
+4 12
+6 16
+4 9
+8 9
diff --git a/geom_bottleneck/tests/data/test_276_A b/geom_bottleneck/tests/data/test_276_A
new file mode 100644
index 0000000..546a9ad
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_276_A
@@ -0,0 +1,10 @@
+6 16
+2 3
+0 6
+9 18
+3 13
+1 5
+1 6
+3 4
+7 11
+0 1
diff --git a/geom_bottleneck/tests/data/test_276_B b/geom_bottleneck/tests/data/test_276_B
new file mode 100644
index 0000000..3b63537
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_276_B
@@ -0,0 +1,10 @@
+9 17
+8 9
+7 10
+2 10
+2 11
+2 7
+6 11
+7 12
+10 18
+4 14
diff --git a/geom_bottleneck/tests/data/test_277_A b/geom_bottleneck/tests/data/test_277_A
new file mode 100644
index 0000000..41ee575
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_277_A
@@ -0,0 +1,10 @@
+6 8
+6 15
+0 10
+9 10
+5 10
+4 10
+0 5
+5 9
+8 9
+2 5
diff --git a/geom_bottleneck/tests/data/test_277_B b/geom_bottleneck/tests/data/test_277_B
new file mode 100644
index 0000000..84ade69
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_277_B
@@ -0,0 +1,10 @@
+0 2
+4 7
+3 12
+8 13
+2 3
+9 18
+8 16
+2 3
+10 20
+4 10
diff --git a/geom_bottleneck/tests/data/test_278_A b/geom_bottleneck/tests/data/test_278_A
new file mode 100644
index 0000000..d2e3a7a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_278_A
@@ -0,0 +1,10 @@
+8 10
+6 7
+9 19
+6 11
+4 6
+0 8
+5 6
+5 10
+1 10
+2 7
diff --git a/geom_bottleneck/tests/data/test_278_B b/geom_bottleneck/tests/data/test_278_B
new file mode 100644
index 0000000..0046a8a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_278_B
@@ -0,0 +1,10 @@
+1 2
+0 8
+9 19
+4 13
+0 10
+7 15
+2 3
+10 17
+2 12
+10 17
diff --git a/geom_bottleneck/tests/data/test_279_A b/geom_bottleneck/tests/data/test_279_A
new file mode 100644
index 0000000..4e5619f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_279_A
@@ -0,0 +1,10 @@
+5 9
+4 8
+5 7
+0 2
+8 17
+5 12
+3 5
+1 3
+3 10
+7 10
diff --git a/geom_bottleneck/tests/data/test_279_B b/geom_bottleneck/tests/data/test_279_B
new file mode 100644
index 0000000..7ae40fa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_279_B
@@ -0,0 +1,10 @@
+9 11
+2 5
+5 15
+4 11
+5 11
+9 10
+2 8
+10 14
+6 16
+7 16
diff --git a/geom_bottleneck/tests/data/test_280_A b/geom_bottleneck/tests/data/test_280_A
new file mode 100644
index 0000000..3ac2922
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_280_A
@@ -0,0 +1,20 @@
+5 8
+10 11
+0 1
+8 18
+0 7
+2 12
+3 6
+10 20
+9 14
+4 9
+6 7
+4 13
+3 4
+10 13
+6 7
+8 17
+8 9
+5 7
+5 6
+3 11
diff --git a/geom_bottleneck/tests/data/test_280_B b/geom_bottleneck/tests/data/test_280_B
new file mode 100644
index 0000000..c5485cf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_280_B
@@ -0,0 +1,20 @@
+9 16
+6 7
+4 12
+9 10
+5 12
+5 14
+1 4
+8 17
+4 14
+8 15
+6 14
+3 13
+7 17
+4 7
+0 2
+9 17
+3 4
+6 11
+0 10
+2 3
diff --git a/geom_bottleneck/tests/data/test_281_A b/geom_bottleneck/tests/data/test_281_A
new file mode 100644
index 0000000..e9a4644
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_281_A
@@ -0,0 +1,20 @@
+2 4
+3 4
+7 10
+9 14
+9 16
+8 10
+2 3
+0 10
+10 14
+7 14
+4 7
+4 6
+5 11
+1 7
+3 10
+7 8
+6 11
+0 1
+8 9
+7 16
diff --git a/geom_bottleneck/tests/data/test_281_B b/geom_bottleneck/tests/data/test_281_B
new file mode 100644
index 0000000..f219b2a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_281_B
@@ -0,0 +1,20 @@
+5 15
+8 17
+0 5
+5 11
+7 13
+5 9
+4 7
+3 9
+6 9
+2 10
+4 9
+6 13
+8 17
+8 12
+10 15
+4 11
+3 11
+0 2
+3 8
+1 6
diff --git a/geom_bottleneck/tests/data/test_282_A b/geom_bottleneck/tests/data/test_282_A
new file mode 100644
index 0000000..946f3f2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_282_A
@@ -0,0 +1,20 @@
+7 17
+1 10
+7 12
+2 12
+1 2
+2 11
+2 6
+7 10
+9 18
+2 12
+3 12
+8 9
+0 10
+5 6
+3 9
+9 13
+0 7
+6 7
+0 2
+4 13
diff --git a/geom_bottleneck/tests/data/test_282_B b/geom_bottleneck/tests/data/test_282_B
new file mode 100644
index 0000000..ac3c7c8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_282_B
@@ -0,0 +1,20 @@
+0 8
+10 18
+4 11
+1 10
+4 9
+4 8
+3 9
+0 6
+9 12
+9 10
+9 15
+0 3
+2 11
+6 11
+2 8
+1 3
+8 16
+0 5
+9 18
+4 11
diff --git a/geom_bottleneck/tests/data/test_283_A b/geom_bottleneck/tests/data/test_283_A
new file mode 100644
index 0000000..0c4676e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_283_A
@@ -0,0 +1,20 @@
+4 12
+6 9
+7 12
+10 16
+10 11
+1 2
+0 5
+4 7
+3 12
+4 7
+10 11
+3 5
+10 16
+6 7
+10 18
+7 8
+10 11
+4 10
+6 14
+2 4
diff --git a/geom_bottleneck/tests/data/test_283_B b/geom_bottleneck/tests/data/test_283_B
new file mode 100644
index 0000000..23a83e7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_283_B
@@ -0,0 +1,20 @@
+9 16
+7 17
+2 7
+0 1
+9 17
+8 10
+8 15
+10 17
+6 12
+7 8
+1 8
+2 12
+8 9
+3 6
+6 12
+3 6
+3 5
+2 6
+10 11
+7 13
diff --git a/geom_bottleneck/tests/data/test_284_A b/geom_bottleneck/tests/data/test_284_A
new file mode 100644
index 0000000..4cec19a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_284_A
@@ -0,0 +1,20 @@
+9 13
+2 11
+2 4
+6 7
+6 14
+6 13
+7 14
+0 8
+3 4
+2 9
+4 10
+4 11
+6 15
+1 3
+5 9
+4 5
+4 13
+7 11
+9 15
+7 16
diff --git a/geom_bottleneck/tests/data/test_284_B b/geom_bottleneck/tests/data/test_284_B
new file mode 100644
index 0000000..f09aa28
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_284_B
@@ -0,0 +1,20 @@
+9 11
+7 10
+3 5
+0 1
+5 11
+2 10
+3 5
+2 4
+7 15
+3 4
+10 13
+1 3
+8 14
+0 8
+1 11
+5 13
+0 1
+2 3
+0 6
+2 6
diff --git a/geom_bottleneck/tests/data/test_285_A b/geom_bottleneck/tests/data/test_285_A
new file mode 100644
index 0000000..8e27a5a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_285_A
@@ -0,0 +1,20 @@
+7 9
+7 12
+7 16
+4 14
+1 8
+3 13
+7 15
+4 5
+10 18
+10 16
+5 6
+6 12
+3 13
+5 9
+7 15
+1 2
+10 14
+5 6
+6 12
+3 9
diff --git a/geom_bottleneck/tests/data/test_285_B b/geom_bottleneck/tests/data/test_285_B
new file mode 100644
index 0000000..16a8754
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_285_B
@@ -0,0 +1,20 @@
+4 5
+4 9
+10 19
+1 5
+3 9
+10 11
+0 1
+2 12
+1 8
+7 15
+5 9
+8 10
+7 10
+9 18
+4 9
+3 10
+7 15
+7 14
+2 4
+5 7
diff --git a/geom_bottleneck/tests/data/test_286_A b/geom_bottleneck/tests/data/test_286_A
new file mode 100644
index 0000000..f8083ac
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_286_A
@@ -0,0 +1,20 @@
+5 6
+10 11
+2 10
+0 6
+4 5
+7 8
+2 10
+4 12
+0 1
+7 15
+2 10
+10 13
+1 10
+9 14
+2 6
+2 8
+6 15
+3 4
+4 6
+2 11
diff --git a/geom_bottleneck/tests/data/test_286_B b/geom_bottleneck/tests/data/test_286_B
new file mode 100644
index 0000000..6ba8e74
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_286_B
@@ -0,0 +1,20 @@
+7 8
+3 4
+7 15
+10 14
+4 12
+4 8
+8 12
+4 8
+1 4
+10 12
+0 2
+0 1
+6 12
+7 11
+9 16
+3 11
+2 4
+10 14
+2 10
+6 8
diff --git a/geom_bottleneck/tests/data/test_287_A b/geom_bottleneck/tests/data/test_287_A
new file mode 100644
index 0000000..5dd8f38
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_287_A
@@ -0,0 +1,20 @@
+10 20
+8 9
+0 4
+6 14
+1 4
+3 7
+0 3
+10 13
+7 9
+4 6
+7 14
+3 13
+10 17
+4 13
+9 18
+2 3
+1 11
+10 16
+6 12
+4 13
diff --git a/geom_bottleneck/tests/data/test_287_B b/geom_bottleneck/tests/data/test_287_B
new file mode 100644
index 0000000..6fff124
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_287_B
@@ -0,0 +1,20 @@
+0 2
+6 7
+8 9
+2 10
+0 4
+7 8
+0 9
+1 4
+6 11
+0 2
+5 7
+9 18
+9 16
+5 14
+3 4
+5 14
+3 4
+6 9
+1 5
+7 10
diff --git a/geom_bottleneck/tests/data/test_288_A b/geom_bottleneck/tests/data/test_288_A
new file mode 100644
index 0000000..567d877
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_288_A
@@ -0,0 +1,20 @@
+8 12
+4 9
+5 14
+7 8
+4 11
+5 15
+2 10
+1 3
+0 7
+3 5
+1 3
+1 7
+8 13
+7 10
+5 6
+7 10
+3 6
+10 20
+10 17
+4 14
diff --git a/geom_bottleneck/tests/data/test_288_B b/geom_bottleneck/tests/data/test_288_B
new file mode 100644
index 0000000..1d50cf6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_288_B
@@ -0,0 +1,20 @@
+6 14
+8 11
+5 13
+1 10
+9 12
+9 19
+4 14
+0 2
+8 16
+1 10
+3 9
+0 3
+2 5
+2 4
+5 8
+2 11
+3 5
+6 16
+7 11
+5 11
diff --git a/geom_bottleneck/tests/data/test_289_A b/geom_bottleneck/tests/data/test_289_A
new file mode 100644
index 0000000..39c74ff
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_289_A
@@ -0,0 +1,20 @@
+3 4
+5 13
+8 18
+9 18
+4 10
+2 8
+1 10
+10 17
+2 3
+10 15
+2 3
+4 6
+7 8
+7 9
+8 12
+7 9
+8 15
+6 9
+0 2
+8 17
diff --git a/geom_bottleneck/tests/data/test_289_B b/geom_bottleneck/tests/data/test_289_B
new file mode 100644
index 0000000..cb24888
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_289_B
@@ -0,0 +1,20 @@
+1 11
+10 18
+6 16
+7 14
+8 16
+9 11
+2 3
+8 12
+4 5
+7 14
+5 10
+7 8
+2 12
+5 9
+0 1
+10 19
+1 5
+10 20
+3 10
+9 11
diff --git a/geom_bottleneck/tests/data/test_290_A b/geom_bottleneck/tests/data/test_290_A
new file mode 100644
index 0000000..21e124b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_290_A
@@ -0,0 +1,20 @@
+8 15
+6 10
+4 5
+10 20
+3 8
+0 10
+0 2
+3 9
+1 10
+3 11
+5 12
+6 7
+6 8
+3 6
+8 9
+9 15
+2 12
+8 12
+3 11
+4 9
diff --git a/geom_bottleneck/tests/data/test_290_B b/geom_bottleneck/tests/data/test_290_B
new file mode 100644
index 0000000..d705f0e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_290_B
@@ -0,0 +1,20 @@
+8 10
+1 2
+5 6
+2 9
+6 15
+3 8
+6 7
+4 11
+2 3
+10 14
+3 4
+3 4
+1 2
+2 11
+2 6
+6 7
+1 4
+8 16
+4 5
+9 12
diff --git a/geom_bottleneck/tests/data/test_291_A b/geom_bottleneck/tests/data/test_291_A
new file mode 100644
index 0000000..0ba0226
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_291_A
@@ -0,0 +1,20 @@
+10 11
+4 5
+4 13
+4 10
+9 13
+3 4
+8 13
+9 15
+2 8
+9 16
+8 14
+8 18
+1 6
+0 8
+8 16
+5 6
+9 19
+8 15
+8 13
+8 16
diff --git a/geom_bottleneck/tests/data/test_291_B b/geom_bottleneck/tests/data/test_291_B
new file mode 100644
index 0000000..1c933ef
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_291_B
@@ -0,0 +1,20 @@
+2 9
+4 13
+8 13
+10 13
+8 18
+8 13
+5 14
+1 6
+5 6
+7 8
+2 12
+5 6
+6 10
+7 10
+0 6
+10 14
+2 3
+10 18
+5 12
+4 5
diff --git a/geom_bottleneck/tests/data/test_292_A b/geom_bottleneck/tests/data/test_292_A
new file mode 100644
index 0000000..1929d2e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_292_A
@@ -0,0 +1,20 @@
+7 8
+5 15
+7 11
+6 15
+2 8
+8 9
+7 9
+0 2
+4 8
+2 10
+0 2
+2 4
+1 3
+6 10
+2 10
+2 9
+10 13
+7 8
+5 8
+9 11
diff --git a/geom_bottleneck/tests/data/test_292_B b/geom_bottleneck/tests/data/test_292_B
new file mode 100644
index 0000000..305f8b8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_292_B
@@ -0,0 +1,20 @@
+4 6
+3 9
+8 12
+5 15
+10 12
+4 10
+4 6
+4 6
+0 8
+8 14
+7 14
+4 13
+4 10
+5 12
+10 19
+0 7
+3 10
+10 15
+0 2
+10 11
diff --git a/geom_bottleneck/tests/data/test_293_A b/geom_bottleneck/tests/data/test_293_A
new file mode 100644
index 0000000..752bd33
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_293_A
@@ -0,0 +1,20 @@
+8 15
+5 15
+10 11
+6 7
+10 13
+9 10
+6 8
+9 18
+0 4
+2 4
+2 9
+6 15
+0 1
+5 12
+7 12
+2 9
+3 13
+4 10
+10 16
+2 9
diff --git a/geom_bottleneck/tests/data/test_293_B b/geom_bottleneck/tests/data/test_293_B
new file mode 100644
index 0000000..6ce5afb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_293_B
@@ -0,0 +1,20 @@
+2 10
+8 11
+6 16
+0 10
+2 3
+10 17
+1 2
+7 16
+3 7
+0 3
+8 9
+2 7
+7 17
+3 13
+2 7
+5 11
+6 9
+10 20
+2 4
+3 8
diff --git a/geom_bottleneck/tests/data/test_294_A b/geom_bottleneck/tests/data/test_294_A
new file mode 100644
index 0000000..556a43e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_294_A
@@ -0,0 +1,20 @@
+5 13
+4 12
+6 7
+10 16
+5 14
+3 10
+2 10
+7 11
+5 15
+0 1
+4 14
+3 12
+0 8
+10 13
+0 1
+3 9
+5 6
+7 11
+4 13
+9 11
diff --git a/geom_bottleneck/tests/data/test_294_B b/geom_bottleneck/tests/data/test_294_B
new file mode 100644
index 0000000..5a0896c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_294_B
@@ -0,0 +1,20 @@
+1 10
+6 16
+6 10
+4 12
+6 12
+0 6
+3 9
+3 12
+5 14
+9 17
+10 18
+3 13
+2 10
+8 9
+9 16
+8 14
+5 12
+4 6
+9 10
+7 12
diff --git a/geom_bottleneck/tests/data/test_295_A b/geom_bottleneck/tests/data/test_295_A
new file mode 100644
index 0000000..53b904f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_295_A
@@ -0,0 +1,20 @@
+2 10
+10 20
+9 16
+2 9
+2 7
+7 11
+8 11
+10 12
+4 9
+4 13
+6 12
+7 8
+4 8
+7 15
+2 9
+9 11
+10 13
+9 19
+7 14
+5 13
diff --git a/geom_bottleneck/tests/data/test_295_B b/geom_bottleneck/tests/data/test_295_B
new file mode 100644
index 0000000..61d13ff
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_295_B
@@ -0,0 +1,20 @@
+3 13
+3 13
+8 17
+1 6
+3 9
+3 10
+5 12
+9 10
+5 7
+9 16
+2 6
+0 1
+4 8
+1 3
+5 15
+6 7
+7 10
+1 3
+5 13
+1 7
diff --git a/geom_bottleneck/tests/data/test_296_A b/geom_bottleneck/tests/data/test_296_A
new file mode 100644
index 0000000..444d20f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_296_A
@@ -0,0 +1,20 @@
+0 6
+4 10
+10 13
+0 6
+1 6
+10 19
+6 13
+1 2
+5 13
+6 14
+4 12
+1 8
+6 16
+2 9
+9 11
+9 19
+1 10
+3 4
+2 11
+4 8
diff --git a/geom_bottleneck/tests/data/test_296_B b/geom_bottleneck/tests/data/test_296_B
new file mode 100644
index 0000000..476d729
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_296_B
@@ -0,0 +1,20 @@
+1 3
+7 9
+4 10
+10 11
+0 5
+4 12
+1 2
+7 14
+10 19
+8 9
+3 12
+1 2
+1 5
+0 1
+10 17
+9 17
+1 7
+2 5
+2 5
+4 13
diff --git a/geom_bottleneck/tests/data/test_297_A b/geom_bottleneck/tests/data/test_297_A
new file mode 100644
index 0000000..745d7f6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_297_A
@@ -0,0 +1,20 @@
+6 9
+1 3
+7 10
+9 14
+9 18
+8 12
+2 3
+5 15
+8 14
+3 12
+5 6
+7 15
+6 16
+8 18
+6 13
+6 7
+3 8
+2 3
+9 13
+9 14
diff --git a/geom_bottleneck/tests/data/test_297_B b/geom_bottleneck/tests/data/test_297_B
new file mode 100644
index 0000000..99b1ccc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_297_B
@@ -0,0 +1,20 @@
+4 11
+9 18
+9 11
+2 7
+2 9
+4 12
+4 13
+10 18
+8 10
+2 5
+9 15
+2 9
+10 15
+6 15
+9 12
+10 20
+9 16
+8 11
+0 1
+2 12
diff --git a/geom_bottleneck/tests/data/test_298_A b/geom_bottleneck/tests/data/test_298_A
new file mode 100644
index 0000000..d35fccc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_298_A
@@ -0,0 +1,20 @@
+0 6
+9 10
+4 5
+7 13
+10 19
+7 12
+10 20
+2 6
+7 13
+7 8
+9 10
+4 8
+9 10
+7 14
+9 19
+10 16
+3 7
+2 3
+1 5
+3 4
diff --git a/geom_bottleneck/tests/data/test_298_B b/geom_bottleneck/tests/data/test_298_B
new file mode 100644
index 0000000..5cf0d1c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_298_B
@@ -0,0 +1,20 @@
+4 10
+6 8
+2 3
+6 15
+9 16
+10 11
+7 13
+5 6
+2 9
+6 13
+8 14
+9 15
+10 15
+10 12
+9 18
+3 4
+6 7
+1 9
+4 10
+3 7
diff --git a/geom_bottleneck/tests/data/test_299_A b/geom_bottleneck/tests/data/test_299_A
new file mode 100644
index 0000000..3506828
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_299_A
@@ -0,0 +1,20 @@
+9 10
+1 6
+7 16
+9 13
+3 8
+6 11
+1 9
+5 14
+3 7
+3 10
+5 11
+1 7
+1 5
+0 6
+6 14
+8 11
+10 13
+9 17
+4 10
+9 14
diff --git a/geom_bottleneck/tests/data/test_299_B b/geom_bottleneck/tests/data/test_299_B
new file mode 100644
index 0000000..3600634
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_299_B
@@ -0,0 +1,20 @@
+0 9
+7 13
+8 14
+8 9
+7 17
+0 5
+1 10
+0 5
+3 4
+10 19
+6 14
+8 9
+9 14
+1 6
+9 14
+3 5
+4 5
+8 18
+10 14
+10 18
diff --git a/geom_bottleneck/tests/data/test_300_A b/geom_bottleneck/tests/data/test_300_A
new file mode 100644
index 0000000..2ab4a1e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_300_A
@@ -0,0 +1,30 @@
+8 10
+1 4
+9 12
+0 1
+0 5
+2 9
+7 13
+6 7
+3 8
+2 7
+6 8
+8 12
+1 2
+0 1
+5 10
+4 5
+9 13
+8 15
+6 8
+9 17
+7 10
+8 16
+10 11
+6 8
+6 8
+5 11
+1 4
+9 13
+2 4
+2 3
diff --git a/geom_bottleneck/tests/data/test_300_B b/geom_bottleneck/tests/data/test_300_B
new file mode 100644
index 0000000..a54300d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_300_B
@@ -0,0 +1,30 @@
+9 10
+9 11
+6 10
+1 3
+5 8
+7 12
+4 9
+7 11
+1 9
+6 15
+3 9
+3 10
+1 6
+8 15
+1 11
+1 2
+10 11
+6 7
+7 8
+0 3
+10 11
+3 9
+3 9
+5 6
+0 4
+6 9
+2 3
+1 2
+10 11
+4 14
diff --git a/geom_bottleneck/tests/data/test_301_A b/geom_bottleneck/tests/data/test_301_A
new file mode 100644
index 0000000..85f8ae5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_301_A
@@ -0,0 +1,30 @@
+4 10
+5 9
+6 12
+0 1
+4 7
+4 6
+9 19
+4 9
+2 7
+4 13
+6 7
+4 5
+0 10
+7 8
+3 4
+8 12
+0 9
+8 14
+7 13
+8 14
+1 2
+4 5
+10 14
+4 5
+3 11
+7 12
+9 16
+0 1
+9 19
+9 15
diff --git a/geom_bottleneck/tests/data/test_301_B b/geom_bottleneck/tests/data/test_301_B
new file mode 100644
index 0000000..4d9ef19
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_301_B
@@ -0,0 +1,30 @@
+5 15
+2 9
+3 4
+2 12
+10 17
+0 7
+5 8
+5 7
+7 16
+2 4
+4 8
+1 4
+5 15
+1 2
+2 12
+0 10
+9 10
+2 11
+7 8
+10 19
+1 11
+10 14
+8 11
+6 7
+3 7
+8 16
+3 11
+7 13
+5 10
+8 10
diff --git a/geom_bottleneck/tests/data/test_302_A b/geom_bottleneck/tests/data/test_302_A
new file mode 100644
index 0000000..be0e810
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_302_A
@@ -0,0 +1,30 @@
+7 13
+9 18
+1 11
+5 11
+2 3
+5 10
+1 3
+1 9
+7 11
+5 15
+4 5
+3 5
+9 13
+5 13
+10 14
+7 8
+10 19
+4 5
+2 12
+3 7
+3 4
+8 16
+6 16
+6 7
+6 11
+0 2
+0 8
+7 17
+9 17
+0 3
diff --git a/geom_bottleneck/tests/data/test_302_B b/geom_bottleneck/tests/data/test_302_B
new file mode 100644
index 0000000..38806fc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_302_B
@@ -0,0 +1,30 @@
+9 17
+3 4
+7 14
+1 6
+8 18
+2 8
+8 16
+9 19
+2 5
+10 18
+9 15
+5 13
+3 13
+7 8
+1 3
+9 10
+0 8
+6 14
+10 11
+4 14
+4 14
+4 8
+2 4
+1 9
+7 8
+6 13
+8 9
+5 11
+10 18
+7 10
diff --git a/geom_bottleneck/tests/data/test_303_A b/geom_bottleneck/tests/data/test_303_A
new file mode 100644
index 0000000..b277929
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_303_A
@@ -0,0 +1,30 @@
+4 10
+2 11
+1 5
+9 18
+9 16
+8 11
+9 13
+1 11
+1 11
+9 13
+6 10
+6 15
+0 2
+0 1
+6 10
+1 3
+0 6
+7 8
+3 6
+4 11
+7 14
+8 16
+6 7
+6 7
+6 11
+0 4
+7 12
+1 5
+2 8
+0 1
diff --git a/geom_bottleneck/tests/data/test_303_B b/geom_bottleneck/tests/data/test_303_B
new file mode 100644
index 0000000..2cff171
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_303_B
@@ -0,0 +1,30 @@
+7 8
+5 11
+8 15
+2 3
+10 11
+7 17
+0 10
+5 10
+6 8
+4 8
+7 8
+5 12
+8 15
+5 11
+4 9
+9 17
+7 13
+8 13
+6 7
+3 11
+1 6
+6 8
+1 8
+5 10
+9 19
+8 9
+7 17
+1 6
+10 13
+10 19
diff --git a/geom_bottleneck/tests/data/test_304_A b/geom_bottleneck/tests/data/test_304_A
new file mode 100644
index 0000000..2c3de43
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_304_A
@@ -0,0 +1,30 @@
+0 2
+8 14
+1 2
+0 8
+0 6
+4 8
+5 12
+3 4
+2 3
+0 6
+10 11
+0 4
+0 10
+9 16
+9 10
+5 6
+6 11
+8 9
+0 1
+6 13
+8 18
+4 10
+9 18
+1 6
+5 7
+1 8
+9 13
+5 12
+4 5
+7 8
diff --git a/geom_bottleneck/tests/data/test_304_B b/geom_bottleneck/tests/data/test_304_B
new file mode 100644
index 0000000..24402f6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_304_B
@@ -0,0 +1,30 @@
+5 15
+2 7
+8 13
+4 5
+2 3
+6 9
+8 12
+8 12
+9 18
+10 12
+3 8
+5 9
+2 12
+9 19
+6 13
+6 12
+10 14
+0 2
+2 3
+1 10
+8 13
+10 20
+3 5
+1 8
+0 6
+2 3
+8 9
+5 6
+9 17
+6 9
diff --git a/geom_bottleneck/tests/data/test_305_A b/geom_bottleneck/tests/data/test_305_A
new file mode 100644
index 0000000..aa88ed8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_305_A
@@ -0,0 +1,30 @@
+1 5
+6 7
+7 15
+4 11
+9 12
+8 10
+4 7
+10 17
+9 10
+7 15
+4 7
+8 12
+9 10
+10 15
+1 5
+4 5
+2 10
+2 3
+4 14
+8 17
+1 10
+7 10
+2 4
+6 15
+8 10
+10 20
+3 7
+2 4
+6 10
+2 5
diff --git a/geom_bottleneck/tests/data/test_305_B b/geom_bottleneck/tests/data/test_305_B
new file mode 100644
index 0000000..8edd827
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_305_B
@@ -0,0 +1,30 @@
+8 13
+10 11
+0 1
+8 13
+2 3
+9 10
+0 4
+3 9
+8 11
+7 12
+3 8
+8 10
+10 14
+2 4
+1 7
+7 10
+6 7
+7 17
+6 14
+0 6
+8 17
+9 14
+2 7
+0 2
+3 12
+7 16
+10 16
+9 13
+8 13
+1 2
diff --git a/geom_bottleneck/tests/data/test_306_A b/geom_bottleneck/tests/data/test_306_A
new file mode 100644
index 0000000..8baa725
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_306_A
@@ -0,0 +1,30 @@
+3 13
+1 8
+7 14
+5 7
+0 1
+10 17
+5 8
+4 5
+6 8
+9 10
+3 10
+9 15
+8 18
+8 14
+5 15
+8 13
+8 9
+7 13
+1 8
+7 13
+3 9
+6 12
+6 9
+2 7
+7 10
+3 9
+8 13
+5 14
+10 11
+2 6
diff --git a/geom_bottleneck/tests/data/test_306_B b/geom_bottleneck/tests/data/test_306_B
new file mode 100644
index 0000000..b33f874
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_306_B
@@ -0,0 +1,30 @@
+8 10
+8 12
+6 9
+9 11
+5 7
+2 12
+0 9
+10 13
+0 1
+3 13
+1 6
+0 4
+2 12
+4 10
+10 14
+4 5
+9 10
+1 6
+4 12
+4 7
+4 13
+0 5
+10 17
+3 5
+2 3
+5 6
+7 11
+10 12
+2 9
+6 8
diff --git a/geom_bottleneck/tests/data/test_307_A b/geom_bottleneck/tests/data/test_307_A
new file mode 100644
index 0000000..bce4bc1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_307_A
@@ -0,0 +1,30 @@
+0 1
+9 18
+5 7
+2 7
+2 8
+10 17
+9 16
+9 16
+1 6
+7 15
+5 10
+1 2
+8 14
+0 1
+5 6
+2 8
+3 4
+5 12
+4 6
+5 12
+7 11
+8 9
+3 10
+6 13
+0 7
+0 4
+7 16
+10 16
+8 12
+6 8
diff --git a/geom_bottleneck/tests/data/test_307_B b/geom_bottleneck/tests/data/test_307_B
new file mode 100644
index 0000000..fd4fcb5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_307_B
@@ -0,0 +1,30 @@
+2 5
+3 9
+0 10
+10 14
+4 9
+0 1
+1 9
+3 13
+4 5
+10 16
+5 8
+8 15
+0 5
+0 9
+9 11
+2 3
+10 20
+8 9
+7 15
+4 13
+1 9
+5 8
+7 17
+3 5
+10 16
+2 11
+4 6
+3 7
+7 15
+5 10
diff --git a/geom_bottleneck/tests/data/test_308_A b/geom_bottleneck/tests/data/test_308_A
new file mode 100644
index 0000000..55ab2aa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_308_A
@@ -0,0 +1,30 @@
+3 5
+6 16
+0 3
+0 10
+6 7
+2 6
+7 12
+0 7
+6 9
+6 12
+0 4
+3 12
+2 10
+5 8
+10 16
+8 12
+0 8
+2 3
+6 12
+7 8
+0 4
+2 9
+0 8
+4 7
+10 16
+6 8
+9 14
+6 9
+0 1
+0 1
diff --git a/geom_bottleneck/tests/data/test_308_B b/geom_bottleneck/tests/data/test_308_B
new file mode 100644
index 0000000..cdf0c84
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_308_B
@@ -0,0 +1,30 @@
+3 11
+1 4
+0 3
+9 15
+2 8
+6 12
+3 13
+0 4
+1 5
+8 18
+6 15
+0 5
+6 16
+4 6
+3 11
+4 5
+0 1
+0 10
+4 6
+0 1
+6 7
+6 7
+8 9
+7 13
+8 15
+3 4
+1 7
+4 13
+6 16
+3 12
diff --git a/geom_bottleneck/tests/data/test_309_A b/geom_bottleneck/tests/data/test_309_A
new file mode 100644
index 0000000..20cee09
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_309_A
@@ -0,0 +1,30 @@
+5 15
+2 4
+5 11
+3 13
+5 15
+8 13
+1 10
+2 10
+7 8
+0 7
+9 13
+10 13
+4 14
+0 3
+10 17
+2 7
+5 15
+1 10
+9 11
+7 10
+10 15
+5 7
+0 4
+0 8
+1 2
+8 16
+3 10
+8 16
+3 4
+5 6
diff --git a/geom_bottleneck/tests/data/test_309_B b/geom_bottleneck/tests/data/test_309_B
new file mode 100644
index 0000000..86fe46e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_309_B
@@ -0,0 +1,30 @@
+2 4
+9 17
+4 11
+3 9
+8 13
+6 7
+0 8
+10 15
+10 13
+7 12
+7 14
+9 10
+0 10
+6 7
+6 13
+2 4
+2 3
+6 10
+9 19
+7 17
+2 6
+3 10
+8 17
+8 13
+1 6
+6 16
+10 11
+7 9
+6 13
+9 15
diff --git a/geom_bottleneck/tests/data/test_310_A b/geom_bottleneck/tests/data/test_310_A
new file mode 100644
index 0000000..320f176
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_310_A
@@ -0,0 +1,30 @@
+7 12
+8 15
+10 13
+4 5
+10 12
+6 14
+5 7
+1 8
+10 19
+0 4
+0 5
+10 11
+3 12
+0 6
+8 11
+6 15
+10 16
+1 2
+8 10
+4 5
+10 17
+9 15
+7 9
+7 11
+5 11
+9 13
+0 3
+4 7
+3 4
+10 18
diff --git a/geom_bottleneck/tests/data/test_310_B b/geom_bottleneck/tests/data/test_310_B
new file mode 100644
index 0000000..3bcf21c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_310_B
@@ -0,0 +1,30 @@
+8 10
+1 11
+4 8
+4 14
+3 13
+1 5
+1 9
+3 8
+0 7
+9 10
+1 4
+0 1
+7 17
+6 9
+4 6
+6 9
+2 12
+2 10
+8 14
+7 13
+1 9
+8 14
+1 6
+3 11
+5 8
+5 12
+2 10
+0 6
+4 5
+3 13
diff --git a/geom_bottleneck/tests/data/test_311_A b/geom_bottleneck/tests/data/test_311_A
new file mode 100644
index 0000000..d98eb28
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_311_A
@@ -0,0 +1,30 @@
+2 11
+6 10
+1 4
+2 7
+2 3
+9 15
+2 3
+9 12
+2 3
+5 15
+9 17
+2 6
+0 8
+4 7
+0 5
+0 9
+7 12
+7 12
+9 12
+6 9
+7 16
+1 2
+0 8
+4 12
+2 11
+9 13
+2 7
+5 15
+5 6
+4 10
diff --git a/geom_bottleneck/tests/data/test_311_B b/geom_bottleneck/tests/data/test_311_B
new file mode 100644
index 0000000..311ede4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_311_B
@@ -0,0 +1,30 @@
+2 3
+7 15
+6 12
+10 18
+10 14
+10 11
+8 9
+1 9
+5 11
+0 1
+10 19
+8 14
+10 12
+8 13
+7 14
+3 5
+10 14
+8 17
+9 10
+7 16
+2 3
+1 7
+9 15
+8 12
+0 1
+6 11
+8 15
+8 13
+2 8
+3 12
diff --git a/geom_bottleneck/tests/data/test_312_A b/geom_bottleneck/tests/data/test_312_A
new file mode 100644
index 0000000..2745003
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_312_A
@@ -0,0 +1,30 @@
+7 12
+0 7
+4 14
+0 6
+10 11
+8 9
+5 14
+5 6
+9 12
+4 8
+2 3
+1 4
+8 10
+2 8
+9 13
+7 12
+10 17
+1 2
+4 8
+3 5
+7 8
+1 5
+6 7
+7 16
+6 10
+10 17
+10 20
+2 5
+4 13
+2 9
diff --git a/geom_bottleneck/tests/data/test_312_B b/geom_bottleneck/tests/data/test_312_B
new file mode 100644
index 0000000..4a7645b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_312_B
@@ -0,0 +1,30 @@
+8 9
+4 10
+9 19
+5 13
+6 12
+4 6
+5 11
+5 6
+3 12
+7 10
+5 12
+7 8
+3 13
+5 14
+4 9
+6 15
+5 14
+4 13
+1 9
+5 13
+5 12
+1 10
+3 4
+7 13
+3 12
+7 11
+4 5
+7 9
+0 4
+0 9
diff --git a/geom_bottleneck/tests/data/test_313_A b/geom_bottleneck/tests/data/test_313_A
new file mode 100644
index 0000000..db46821
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_313_A
@@ -0,0 +1,30 @@
+8 14
+10 15
+7 16
+8 9
+1 10
+8 16
+0 10
+2 3
+4 8
+1 7
+2 6
+5 15
+0 7
+5 6
+0 9
+2 3
+5 6
+9 12
+3 7
+8 10
+10 17
+3 12
+10 13
+4 12
+2 8
+8 14
+6 10
+4 6
+0 7
+8 11
diff --git a/geom_bottleneck/tests/data/test_313_B b/geom_bottleneck/tests/data/test_313_B
new file mode 100644
index 0000000..d387050
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_313_B
@@ -0,0 +1,30 @@
+4 10
+4 11
+4 5
+2 8
+3 6
+1 5
+8 18
+1 4
+7 8
+5 8
+7 15
+10 18
+6 10
+9 17
+6 15
+0 7
+10 19
+8 10
+4 9
+5 14
+5 9
+4 5
+5 12
+5 9
+0 1
+7 9
+2 4
+0 7
+9 18
+8 11
diff --git a/geom_bottleneck/tests/data/test_314_A b/geom_bottleneck/tests/data/test_314_A
new file mode 100644
index 0000000..03ad5db
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_314_A
@@ -0,0 +1,30 @@
+10 11
+10 11
+9 12
+2 11
+8 17
+3 10
+8 10
+10 14
+5 9
+5 6
+10 11
+9 17
+10 19
+3 8
+6 15
+10 20
+0 9
+8 12
+7 13
+4 6
+9 10
+6 15
+1 9
+3 9
+10 11
+10 15
+4 9
+8 13
+9 10
+6 9
diff --git a/geom_bottleneck/tests/data/test_314_B b/geom_bottleneck/tests/data/test_314_B
new file mode 100644
index 0000000..eaa46d9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_314_B
@@ -0,0 +1,30 @@
+10 20
+2 12
+8 13
+0 7
+6 7
+10 15
+10 20
+5 15
+7 8
+3 10
+5 7
+3 10
+0 4
+10 17
+4 9
+5 14
+9 16
+3 4
+6 7
+4 12
+4 10
+9 10
+0 10
+10 11
+1 6
+8 16
+7 16
+10 12
+6 13
+3 7
diff --git a/geom_bottleneck/tests/data/test_315_A b/geom_bottleneck/tests/data/test_315_A
new file mode 100644
index 0000000..fa49507
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_315_A
@@ -0,0 +1,30 @@
+9 16
+10 18
+6 7
+9 12
+1 5
+10 20
+9 14
+4 5
+7 13
+6 12
+1 9
+10 12
+5 8
+10 12
+7 16
+10 16
+1 9
+3 10
+1 4
+1 3
+0 6
+7 13
+1 2
+3 8
+6 13
+6 8
+3 10
+0 1
+9 18
+0 10
diff --git a/geom_bottleneck/tests/data/test_315_B b/geom_bottleneck/tests/data/test_315_B
new file mode 100644
index 0000000..d5390e2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_315_B
@@ -0,0 +1,30 @@
+1 2
+2 8
+0 2
+9 18
+1 11
+3 6
+6 7
+0 1
+8 14
+6 8
+5 6
+9 17
+5 6
+7 13
+7 9
+9 10
+7 15
+9 11
+3 4
+0 3
+8 16
+0 10
+8 15
+1 11
+8 16
+1 6
+9 17
+10 19
+7 10
+7 9
diff --git a/geom_bottleneck/tests/data/test_316_A b/geom_bottleneck/tests/data/test_316_A
new file mode 100644
index 0000000..57ff91f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_316_A
@@ -0,0 +1,30 @@
+6 16
+4 10
+6 10
+8 11
+1 2
+0 5
+7 16
+4 9
+9 11
+0 2
+0 7
+10 18
+3 6
+9 15
+8 15
+5 9
+7 17
+5 12
+9 19
+10 20
+1 2
+1 11
+3 4
+6 15
+10 18
+3 11
+10 19
+5 6
+1 5
+3 12
diff --git a/geom_bottleneck/tests/data/test_316_B b/geom_bottleneck/tests/data/test_316_B
new file mode 100644
index 0000000..407332e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_316_B
@@ -0,0 +1,30 @@
+4 7
+10 11
+3 4
+2 12
+3 4
+8 13
+3 4
+3 11
+10 11
+9 17
+5 12
+6 14
+10 17
+8 12
+8 9
+4 6
+10 14
+4 11
+5 10
+5 14
+6 7
+0 1
+8 13
+8 12
+3 8
+0 9
+7 8
+8 13
+10 11
+3 7
diff --git a/geom_bottleneck/tests/data/test_317_A b/geom_bottleneck/tests/data/test_317_A
new file mode 100644
index 0000000..4b6204e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_317_A
@@ -0,0 +1,30 @@
+5 6
+1 6
+6 10
+8 16
+7 15
+2 4
+8 17
+5 12
+0 2
+7 17
+2 11
+0 2
+8 10
+8 9
+0 8
+5 10
+2 9
+3 6
+8 9
+9 17
+4 12
+7 9
+1 11
+2 10
+9 19
+10 13
+7 10
+5 8
+5 8
+2 5
diff --git a/geom_bottleneck/tests/data/test_317_B b/geom_bottleneck/tests/data/test_317_B
new file mode 100644
index 0000000..b30729a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_317_B
@@ -0,0 +1,30 @@
+4 9
+0 7
+10 11
+4 5
+2 11
+4 9
+7 17
+7 14
+10 18
+2 6
+2 8
+2 7
+1 11
+5 14
+2 3
+6 9
+2 12
+1 4
+5 6
+5 11
+8 17
+4 12
+3 8
+1 4
+9 13
+0 7
+3 9
+3 4
+5 6
+3 11
diff --git a/geom_bottleneck/tests/data/test_318_A b/geom_bottleneck/tests/data/test_318_A
new file mode 100644
index 0000000..2ea4ad5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_318_A
@@ -0,0 +1,30 @@
+4 13
+0 5
+5 12
+3 8
+9 17
+6 16
+7 8
+9 14
+9 19
+6 15
+2 8
+1 2
+10 18
+5 11
+5 6
+8 10
+3 7
+1 11
+9 12
+8 9
+10 20
+2 6
+8 16
+9 19
+10 11
+7 11
+9 10
+8 18
+6 14
+2 4
diff --git a/geom_bottleneck/tests/data/test_318_B b/geom_bottleneck/tests/data/test_318_B
new file mode 100644
index 0000000..64fd49d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_318_B
@@ -0,0 +1,30 @@
+10 13
+6 16
+3 11
+10 20
+1 9
+1 10
+4 5
+5 10
+10 11
+1 8
+7 9
+10 11
+4 10
+0 8
+4 13
+7 9
+7 9
+7 15
+9 17
+2 11
+0 1
+6 13
+1 2
+10 13
+10 18
+7 12
+8 15
+4 10
+5 13
+3 11
diff --git a/geom_bottleneck/tests/data/test_319_A b/geom_bottleneck/tests/data/test_319_A
new file mode 100644
index 0000000..f7ffeda
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_319_A
@@ -0,0 +1,30 @@
+8 12
+6 14
+2 8
+9 18
+10 16
+8 17
+5 15
+6 7
+1 7
+6 7
+7 9
+9 10
+4 9
+9 14
+6 11
+7 8
+8 14
+6 7
+5 14
+2 10
+0 1
+0 6
+4 5
+1 5
+4 13
+6 14
+5 14
+9 11
+0 7
+3 6
diff --git a/geom_bottleneck/tests/data/test_319_B b/geom_bottleneck/tests/data/test_319_B
new file mode 100644
index 0000000..5529fa0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_319_B
@@ -0,0 +1,30 @@
+6 7
+5 6
+4 5
+0 4
+5 6
+9 11
+1 2
+8 16
+4 9
+8 10
+7 9
+4 5
+5 15
+0 7
+8 14
+10 15
+5 7
+1 6
+5 6
+5 11
+1 10
+0 5
+5 15
+5 10
+0 2
+10 13
+0 9
+3 9
+10 11
+1 10
diff --git a/geom_bottleneck/tests/data/test_320_A b/geom_bottleneck/tests/data/test_320_A
new file mode 100644
index 0000000..c7c7380
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_320_A
@@ -0,0 +1,50 @@
+5 6
+0 6
+6 10
+5 10
+0 9
+0 4
+10 11
+7 13
+0 2
+4 8
+1 2
+4 13
+8 15
+1 7
+3 4
+5 14
+0 6
+7 16
+2 12
+3 11
+0 1
+3 4
+10 16
+3 8
+0 3
+1 9
+9 14
+5 6
+1 11
+6 9
+6 12
+0 6
+9 13
+4 8
+8 10
+4 9
+7 15
+5 7
+1 2
+8 15
+5 6
+6 12
+0 7
+0 9
+5 12
+1 3
+5 7
+4 12
+7 14
+9 16
diff --git a/geom_bottleneck/tests/data/test_320_B b/geom_bottleneck/tests/data/test_320_B
new file mode 100644
index 0000000..2807b27
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_320_B
@@ -0,0 +1,50 @@
+9 17
+7 13
+7 14
+7 10
+7 12
+2 10
+8 9
+0 1
+0 10
+0 8
+1 4
+2 11
+4 13
+8 13
+4 11
+1 5
+5 6
+2 4
+9 17
+5 15
+5 8
+7 9
+8 14
+9 10
+5 13
+8 13
+8 17
+1 11
+4 7
+3 10
+3 8
+10 20
+7 8
+10 15
+3 5
+8 12
+1 2
+7 16
+7 17
+1 10
+2 8
+4 12
+9 15
+5 7
+4 8
+5 14
+6 15
+7 16
+2 8
+5 14
diff --git a/geom_bottleneck/tests/data/test_321_A b/geom_bottleneck/tests/data/test_321_A
new file mode 100644
index 0000000..b24cee9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_321_A
@@ -0,0 +1,50 @@
+1 6
+1 7
+1 2
+4 13
+8 15
+1 10
+10 17
+7 17
+0 6
+7 15
+7 13
+9 14
+9 16
+7 12
+5 8
+6 16
+1 3
+8 13
+2 6
+2 10
+2 11
+0 1
+7 15
+4 6
+10 14
+9 10
+0 3
+9 10
+3 9
+7 10
+5 6
+8 18
+2 9
+9 17
+7 12
+9 18
+2 5
+6 8
+7 14
+9 13
+8 16
+9 19
+2 11
+9 16
+6 7
+5 6
+9 17
+8 15
+3 4
+7 14
diff --git a/geom_bottleneck/tests/data/test_321_B b/geom_bottleneck/tests/data/test_321_B
new file mode 100644
index 0000000..be6f00b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_321_B
@@ -0,0 +1,50 @@
+3 8
+8 13
+10 11
+9 11
+10 18
+3 10
+5 10
+9 18
+5 11
+5 7
+9 15
+10 13
+5 7
+6 14
+10 17
+4 10
+10 12
+10 17
+6 16
+3 8
+5 13
+9 12
+9 10
+10 12
+9 14
+7 16
+7 16
+10 14
+7 14
+3 4
+3 4
+8 18
+9 14
+5 9
+2 12
+9 17
+0 7
+2 4
+10 11
+7 14
+0 8
+1 9
+5 6
+2 4
+5 8
+3 12
+3 5
+1 5
+0 6
+4 14
diff --git a/geom_bottleneck/tests/data/test_322_A b/geom_bottleneck/tests/data/test_322_A
new file mode 100644
index 0000000..18eed8e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_322_A
@@ -0,0 +1,50 @@
+8 12
+6 11
+2 8
+0 2
+5 14
+6 8
+1 3
+5 9
+5 10
+6 13
+3 6
+10 14
+2 10
+8 11
+3 13
+3 8
+0 10
+0 3
+8 11
+2 12
+1 2
+10 11
+1 2
+7 16
+1 4
+8 11
+5 7
+8 17
+5 11
+3 8
+5 10
+1 4
+3 5
+4 5
+7 10
+4 13
+1 7
+0 1
+0 7
+6 16
+8 16
+4 11
+2 3
+10 13
+2 8
+7 9
+5 6
+4 10
+1 10
+0 7
diff --git a/geom_bottleneck/tests/data/test_322_B b/geom_bottleneck/tests/data/test_322_B
new file mode 100644
index 0000000..f829c84
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_322_B
@@ -0,0 +1,50 @@
+1 9
+1 8
+6 12
+8 18
+9 17
+5 7
+3 8
+10 11
+10 19
+8 14
+6 8
+6 13
+3 5
+7 16
+0 5
+1 10
+1 2
+0 2
+6 7
+8 17
+4 12
+0 3
+6 8
+0 6
+9 10
+10 11
+8 15
+4 7
+1 11
+7 10
+3 11
+6 16
+2 7
+8 9
+10 18
+0 5
+1 4
+10 12
+3 9
+7 8
+10 14
+7 14
+6 13
+9 16
+5 15
+0 2
+5 12
+9 10
+2 10
+6 7
diff --git a/geom_bottleneck/tests/data/test_323_A b/geom_bottleneck/tests/data/test_323_A
new file mode 100644
index 0000000..c452dff
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_323_A
@@ -0,0 +1,50 @@
+2 3
+8 16
+7 16
+7 8
+10 11
+2 12
+5 13
+5 14
+9 10
+7 8
+2 12
+0 9
+1 11
+6 12
+9 19
+6 12
+8 10
+7 10
+10 19
+0 2
+6 12
+2 11
+9 10
+0 9
+9 15
+4 11
+2 5
+4 10
+5 10
+0 7
+8 14
+1 4
+9 16
+1 10
+10 12
+3 10
+2 5
+2 12
+10 15
+0 7
+9 14
+7 8
+5 6
+8 18
+0 5
+0 10
+5 13
+7 11
+9 19
+4 11
diff --git a/geom_bottleneck/tests/data/test_323_B b/geom_bottleneck/tests/data/test_323_B
new file mode 100644
index 0000000..4a7c144
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_323_B
@@ -0,0 +1,50 @@
+3 4
+3 12
+0 3
+0 5
+2 4
+5 8
+5 10
+8 18
+6 15
+1 9
+8 15
+5 11
+8 13
+4 6
+9 18
+3 4
+10 18
+2 11
+3 10
+3 4
+9 12
+6 13
+7 15
+7 11
+6 9
+3 11
+8 11
+8 13
+9 14
+5 14
+1 7
+6 14
+0 1
+10 17
+0 3
+10 13
+0 1
+3 4
+1 7
+4 6
+7 14
+2 12
+8 10
+3 8
+8 18
+8 18
+8 14
+5 9
+10 18
+5 7
diff --git a/geom_bottleneck/tests/data/test_324_A b/geom_bottleneck/tests/data/test_324_A
new file mode 100644
index 0000000..330da65
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_324_A
@@ -0,0 +1,50 @@
+0 3
+8 9
+4 7
+1 5
+4 5
+5 7
+5 11
+5 9
+2 4
+9 16
+9 15
+7 13
+5 10
+3 11
+8 12
+8 14
+4 7
+6 9
+5 12
+7 11
+4 9
+8 18
+8 13
+3 9
+5 12
+3 12
+3 4
+2 3
+9 17
+0 7
+4 8
+5 13
+1 4
+1 4
+5 6
+3 12
+3 4
+8 14
+3 13
+7 10
+3 4
+9 15
+4 10
+9 17
+5 8
+2 6
+2 9
+1 3
+6 12
+0 2
diff --git a/geom_bottleneck/tests/data/test_324_B b/geom_bottleneck/tests/data/test_324_B
new file mode 100644
index 0000000..4fb3fef
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_324_B
@@ -0,0 +1,50 @@
+3 9
+2 3
+5 12
+1 8
+5 10
+3 5
+1 2
+6 13
+10 17
+5 14
+7 13
+2 6
+4 5
+2 12
+3 12
+4 9
+7 14
+5 7
+6 7
+4 7
+1 9
+4 13
+10 19
+2 11
+3 9
+10 16
+2 7
+3 5
+5 12
+7 14
+0 10
+4 5
+8 18
+1 5
+7 14
+4 13
+4 7
+6 9
+6 12
+2 11
+4 12
+4 5
+7 17
+8 13
+3 4
+2 6
+6 14
+5 6
+5 6
+6 13
diff --git a/geom_bottleneck/tests/data/test_325_A b/geom_bottleneck/tests/data/test_325_A
new file mode 100644
index 0000000..0e38bad
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_325_A
@@ -0,0 +1,50 @@
+6 9
+5 6
+7 17
+4 13
+6 12
+3 9
+3 9
+2 11
+0 3
+4 5
+6 11
+6 7
+8 12
+4 5
+10 11
+9 10
+0 3
+4 6
+0 8
+6 13
+8 12
+7 14
+0 1
+0 1
+8 9
+9 14
+10 12
+3 6
+4 5
+5 13
+10 13
+8 16
+8 16
+2 6
+3 4
+8 16
+2 6
+8 17
+7 11
+0 2
+5 12
+5 9
+5 12
+1 11
+3 10
+5 12
+5 7
+4 5
+4 6
+4 11
diff --git a/geom_bottleneck/tests/data/test_325_B b/geom_bottleneck/tests/data/test_325_B
new file mode 100644
index 0000000..807bb12
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_325_B
@@ -0,0 +1,50 @@
+6 12
+6 12
+5 13
+10 13
+9 16
+4 11
+9 15
+1 9
+2 3
+9 19
+5 8
+10 11
+9 15
+10 13
+9 15
+6 10
+1 5
+9 12
+5 11
+5 8
+10 19
+9 13
+2 3
+7 10
+6 8
+5 12
+7 16
+2 12
+2 6
+10 15
+0 1
+2 10
+10 11
+0 6
+6 13
+3 13
+8 12
+10 11
+10 14
+4 13
+6 13
+0 4
+9 15
+5 15
+6 13
+9 10
+10 15
+2 10
+6 16
+1 9
diff --git a/geom_bottleneck/tests/data/test_326_A b/geom_bottleneck/tests/data/test_326_A
new file mode 100644
index 0000000..2cb897b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_326_A
@@ -0,0 +1,50 @@
+10 12
+3 12
+0 1
+2 7
+3 9
+6 14
+9 19
+3 7
+8 10
+1 2
+4 7
+1 4
+5 6
+10 16
+6 11
+4 9
+5 10
+5 6
+5 10
+3 6
+6 15
+3 7
+9 19
+4 6
+9 19
+4 13
+8 18
+10 12
+9 13
+1 3
+9 16
+9 10
+5 10
+6 12
+8 10
+3 9
+1 8
+7 8
+7 11
+9 13
+0 1
+9 12
+5 14
+10 13
+1 4
+0 8
+9 19
+4 11
+4 13
+7 11
diff --git a/geom_bottleneck/tests/data/test_326_B b/geom_bottleneck/tests/data/test_326_B
new file mode 100644
index 0000000..6b37e39
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_326_B
@@ -0,0 +1,50 @@
+1 8
+6 14
+7 9
+5 14
+8 12
+9 19
+0 5
+0 2
+9 10
+2 3
+4 9
+9 10
+9 10
+7 15
+1 4
+1 6
+9 16
+8 12
+2 9
+9 15
+7 8
+7 13
+0 1
+4 14
+7 17
+4 10
+7 12
+9 10
+5 12
+4 9
+7 8
+3 10
+10 11
+9 19
+1 2
+5 13
+6 13
+6 11
+6 8
+2 9
+5 9
+4 12
+10 18
+5 9
+9 12
+1 11
+7 8
+3 5
+7 17
+3 9
diff --git a/geom_bottleneck/tests/data/test_327_A b/geom_bottleneck/tests/data/test_327_A
new file mode 100644
index 0000000..0d54292
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_327_A
@@ -0,0 +1,50 @@
+8 17
+4 7
+1 11
+9 10
+4 7
+0 9
+10 13
+5 7
+2 6
+7 9
+8 9
+5 8
+4 5
+3 9
+5 13
+10 17
+1 4
+7 15
+1 6
+10 17
+3 11
+10 11
+1 6
+3 12
+5 10
+8 14
+2 11
+6 11
+9 14
+7 16
+1 9
+8 9
+0 5
+4 13
+4 5
+1 3
+10 17
+10 13
+7 11
+4 9
+7 8
+7 15
+0 10
+3 4
+2 3
+6 16
+10 18
+6 13
+9 11
+6 16
diff --git a/geom_bottleneck/tests/data/test_327_B b/geom_bottleneck/tests/data/test_327_B
new file mode 100644
index 0000000..548eb3f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_327_B
@@ -0,0 +1,50 @@
+1 6
+10 11
+1 9
+6 10
+7 17
+9 11
+7 10
+6 10
+4 13
+7 17
+7 11
+3 4
+2 5
+0 8
+8 10
+7 9
+3 7
+4 12
+8 10
+4 6
+9 17
+1 2
+1 5
+6 11
+0 4
+5 8
+5 6
+7 13
+5 10
+4 5
+8 17
+10 12
+7 8
+3 13
+2 3
+3 9
+10 17
+0 1
+0 1
+9 16
+7 8
+3 4
+1 10
+4 13
+1 2
+9 10
+1 2
+5 14
+2 6
+1 5
diff --git a/geom_bottleneck/tests/data/test_328_A b/geom_bottleneck/tests/data/test_328_A
new file mode 100644
index 0000000..810b747
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_328_A
@@ -0,0 +1,50 @@
+2 11
+0 5
+2 6
+5 14
+1 10
+10 12
+0 1
+4 5
+1 2
+8 16
+8 9
+4 13
+2 3
+4 6
+4 14
+0 5
+5 15
+7 12
+5 8
+5 6
+10 15
+7 8
+3 9
+0 10
+4 5
+4 7
+1 9
+10 13
+0 1
+9 10
+2 9
+2 3
+8 16
+4 5
+9 11
+2 9
+7 14
+8 11
+5 8
+10 19
+4 7
+5 14
+0 5
+4 5
+2 5
+3 8
+10 20
+1 11
+4 14
+3 11
diff --git a/geom_bottleneck/tests/data/test_328_B b/geom_bottleneck/tests/data/test_328_B
new file mode 100644
index 0000000..e781d51
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_328_B
@@ -0,0 +1,50 @@
+3 10
+5 8
+4 10
+4 5
+4 11
+4 6
+0 5
+7 11
+6 16
+3 4
+7 14
+1 7
+10 11
+10 11
+2 3
+2 11
+9 12
+2 3
+5 6
+2 4
+2 8
+7 9
+10 14
+4 13
+2 9
+10 11
+6 13
+5 8
+1 8
+7 11
+7 8
+10 17
+9 10
+3 8
+2 4
+10 14
+4 9
+10 19
+9 11
+3 5
+10 20
+9 10
+3 6
+6 15
+6 14
+9 19
+9 11
+5 12
+3 8
+3 9
diff --git a/geom_bottleneck/tests/data/test_329_A b/geom_bottleneck/tests/data/test_329_A
new file mode 100644
index 0000000..b02fd14
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_329_A
@@ -0,0 +1,50 @@
+8 13
+4 13
+0 1
+6 12
+3 12
+0 1
+7 8
+4 12
+2 6
+7 11
+4 8
+3 5
+2 6
+5 12
+2 12
+1 10
+3 10
+2 3
+3 10
+3 4
+2 4
+7 8
+9 16
+3 5
+5 6
+6 11
+3 12
+2 4
+10 11
+8 11
+8 11
+2 9
+0 6
+4 7
+0 1
+2 3
+2 5
+8 16
+8 9
+2 11
+6 16
+6 12
+10 17
+6 11
+3 9
+2 9
+10 11
+9 12
+4 5
+2 6
diff --git a/geom_bottleneck/tests/data/test_329_B b/geom_bottleneck/tests/data/test_329_B
new file mode 100644
index 0000000..0ca3fcd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_329_B
@@ -0,0 +1,50 @@
+0 9
+5 6
+0 5
+9 12
+10 20
+9 12
+7 14
+9 19
+2 3
+5 14
+0 4
+2 3
+8 9
+0 5
+2 5
+9 10
+3 4
+1 7
+7 13
+10 13
+2 11
+9 18
+0 5
+5 13
+1 9
+10 19
+3 5
+2 6
+0 4
+8 13
+10 11
+5 13
+0 2
+0 1
+6 16
+5 8
+8 9
+2 10
+0 3
+4 14
+8 11
+7 14
+1 2
+1 3
+3 5
+3 10
+9 17
+3 6
+3 4
+1 10
diff --git a/geom_bottleneck/tests/data/test_330_A b/geom_bottleneck/tests/data/test_330_A
new file mode 100644
index 0000000..4cdb2c9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_330_A
@@ -0,0 +1,50 @@
+7 13
+2 8
+2 4
+5 15
+4 10
+9 17
+2 9
+9 12
+6 7
+6 7
+5 15
+4 5
+5 6
+4 6
+0 7
+4 7
+0 2
+8 18
+1 11
+10 11
+5 13
+3 5
+3 11
+0 1
+1 2
+10 14
+1 6
+2 3
+5 15
+3 13
+8 10
+6 15
+10 14
+3 10
+7 17
+4 14
+2 8
+10 11
+9 18
+10 15
+6 12
+4 8
+0 7
+9 11
+6 7
+1 8
+10 15
+0 6
+1 7
+7 16
diff --git a/geom_bottleneck/tests/data/test_330_B b/geom_bottleneck/tests/data/test_330_B
new file mode 100644
index 0000000..01f1570
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_330_B
@@ -0,0 +1,50 @@
+7 10
+4 5
+2 9
+1 2
+7 10
+4 6
+1 9
+6 16
+0 1
+9 14
+6 11
+10 16
+6 9
+0 6
+0 5
+10 12
+4 14
+7 8
+0 3
+9 18
+8 14
+4 7
+1 9
+2 5
+8 9
+9 10
+2 6
+1 11
+2 8
+4 10
+0 4
+2 9
+3 4
+0 10
+5 14
+4 12
+5 11
+4 7
+2 9
+7 16
+8 14
+8 12
+2 9
+4 11
+4 7
+0 1
+6 7
+5 6
+4 12
+2 4
diff --git a/geom_bottleneck/tests/data/test_331_A b/geom_bottleneck/tests/data/test_331_A
new file mode 100644
index 0000000..a271a66
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_331_A
@@ -0,0 +1,50 @@
+10 17
+0 8
+5 8
+10 11
+8 9
+10 13
+10 20
+6 7
+7 12
+0 8
+4 7
+0 10
+8 9
+1 9
+3 8
+10 12
+7 12
+9 18
+6 13
+3 9
+5 9
+6 7
+9 18
+10 17
+6 14
+4 8
+5 14
+10 17
+10 11
+7 16
+5 11
+8 10
+7 14
+6 8
+10 17
+7 8
+3 5
+0 2
+4 10
+8 9
+1 2
+3 12
+1 4
+2 6
+0 1
+0 10
+9 10
+5 6
+5 9
+10 15
diff --git a/geom_bottleneck/tests/data/test_331_B b/geom_bottleneck/tests/data/test_331_B
new file mode 100644
index 0000000..72a1a7b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_331_B
@@ -0,0 +1,50 @@
+5 6
+9 13
+9 17
+8 9
+8 18
+4 14
+8 9
+6 9
+1 5
+8 15
+6 7
+0 1
+5 12
+9 15
+10 16
+2 4
+3 6
+10 14
+10 13
+3 10
+7 13
+9 13
+6 16
+2 3
+6 10
+8 12
+0 9
+2 3
+5 13
+10 12
+1 5
+5 11
+2 6
+1 10
+7 11
+4 5
+5 14
+1 10
+10 15
+3 11
+2 6
+4 10
+6 13
+1 9
+3 10
+6 15
+2 8
+8 14
+4 7
+9 14
diff --git a/geom_bottleneck/tests/data/test_332_A b/geom_bottleneck/tests/data/test_332_A
new file mode 100644
index 0000000..c1e999a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_332_A
@@ -0,0 +1,50 @@
+5 13
+10 20
+4 5
+4 5
+3 13
+9 13
+6 8
+10 11
+3 8
+6 9
+4 5
+2 10
+10 17
+4 13
+8 12
+7 13
+2 4
+10 16
+3 11
+7 16
+5 6
+5 11
+3 6
+8 10
+2 3
+6 9
+1 3
+5 9
+7 16
+6 11
+4 14
+6 15
+10 18
+10 15
+1 10
+2 12
+6 14
+3 12
+0 5
+5 8
+4 14
+9 13
+7 14
+8 9
+8 17
+9 19
+6 15
+5 15
+1 8
+7 12
diff --git a/geom_bottleneck/tests/data/test_332_B b/geom_bottleneck/tests/data/test_332_B
new file mode 100644
index 0000000..1f4686e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_332_B
@@ -0,0 +1,50 @@
+10 11
+5 11
+0 10
+5 9
+4 7
+10 14
+7 12
+10 19
+1 7
+4 8
+3 12
+10 20
+0 3
+4 11
+8 11
+3 13
+0 9
+6 8
+4 12
+6 9
+5 8
+9 12
+7 12
+8 14
+6 11
+0 5
+4 7
+10 19
+9 10
+10 11
+4 8
+10 14
+2 11
+10 11
+3 5
+0 6
+10 20
+9 19
+5 14
+4 11
+7 9
+9 15
+2 3
+2 4
+8 14
+10 14
+9 16
+2 7
+9 17
+7 13
diff --git a/geom_bottleneck/tests/data/test_333_A b/geom_bottleneck/tests/data/test_333_A
new file mode 100644
index 0000000..c1cc126
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_333_A
@@ -0,0 +1,50 @@
+7 12
+4 10
+2 5
+3 12
+8 15
+0 9
+0 6
+9 12
+6 16
+10 18
+5 13
+10 11
+2 3
+9 14
+10 19
+2 11
+9 10
+5 15
+9 19
+1 2
+7 8
+1 5
+8 10
+8 9
+2 3
+7 8
+3 4
+2 6
+0 10
+10 17
+7 16
+6 8
+1 2
+9 10
+10 19
+4 5
+4 10
+2 4
+8 11
+2 7
+2 7
+0 5
+3 7
+7 16
+5 15
+4 11
+7 16
+0 6
+7 8
+1 2
diff --git a/geom_bottleneck/tests/data/test_333_B b/geom_bottleneck/tests/data/test_333_B
new file mode 100644
index 0000000..fd22364
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_333_B
@@ -0,0 +1,50 @@
+0 3
+10 20
+6 13
+9 16
+3 4
+4 13
+2 3
+3 8
+5 13
+10 11
+3 5
+3 5
+7 10
+1 4
+1 2
+8 18
+0 10
+6 16
+5 8
+7 15
+4 10
+1 11
+5 9
+5 13
+1 2
+1 9
+3 8
+6 16
+7 8
+0 8
+9 15
+4 5
+10 11
+0 5
+2 5
+1 8
+10 16
+2 9
+8 14
+6 10
+9 18
+7 8
+9 16
+4 12
+10 15
+3 10
+6 10
+2 5
+4 14
+3 4
diff --git a/geom_bottleneck/tests/data/test_334_A b/geom_bottleneck/tests/data/test_334_A
new file mode 100644
index 0000000..914d6c3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_334_A
@@ -0,0 +1,50 @@
+8 13
+10 20
+2 3
+7 15
+9 17
+2 12
+5 6
+2 5
+6 13
+10 20
+3 8
+1 9
+3 13
+10 11
+1 5
+7 11
+5 15
+5 6
+9 11
+3 5
+3 8
+6 16
+8 12
+4 7
+0 4
+8 12
+5 15
+9 14
+5 6
+3 4
+1 8
+2 7
+4 7
+8 18
+3 9
+0 5
+0 10
+8 10
+8 14
+3 13
+3 9
+9 17
+5 15
+7 16
+1 9
+0 2
+1 9
+9 12
+5 13
+9 19
diff --git a/geom_bottleneck/tests/data/test_334_B b/geom_bottleneck/tests/data/test_334_B
new file mode 100644
index 0000000..27524b9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_334_B
@@ -0,0 +1,50 @@
+10 11
+9 14
+2 11
+10 17
+9 15
+4 9
+7 16
+9 12
+8 12
+7 11
+6 16
+3 12
+0 4
+9 15
+3 10
+2 9
+2 3
+6 7
+3 9
+5 8
+6 8
+4 5
+9 14
+6 10
+1 10
+10 12
+8 10
+7 12
+3 9
+4 9
+4 11
+5 10
+9 11
+7 8
+6 16
+8 17
+9 14
+4 14
+2 4
+1 2
+9 11
+7 13
+9 10
+2 9
+2 12
+2 4
+9 16
+7 17
+3 11
+8 9
diff --git a/geom_bottleneck/tests/data/test_335_A b/geom_bottleneck/tests/data/test_335_A
new file mode 100644
index 0000000..1a400bc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_335_A
@@ -0,0 +1,50 @@
+0 2
+6 11
+7 11
+7 12
+7 11
+9 10
+6 14
+4 5
+5 7
+7 16
+2 3
+10 15
+10 19
+9 16
+6 15
+7 14
+8 18
+7 15
+8 14
+10 11
+10 11
+5 9
+0 10
+9 11
+9 19
+0 6
+2 10
+8 15
+1 7
+5 12
+3 4
+1 6
+0 2
+9 16
+9 19
+10 16
+6 9
+1 9
+6 7
+9 10
+8 14
+4 8
+9 10
+1 10
+5 6
+9 11
+7 16
+0 9
+7 13
+7 9
diff --git a/geom_bottleneck/tests/data/test_335_B b/geom_bottleneck/tests/data/test_335_B
new file mode 100644
index 0000000..93c3211
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_335_B
@@ -0,0 +1,50 @@
+8 14
+9 15
+6 11
+4 14
+2 3
+7 13
+5 11
+8 14
+1 8
+9 12
+0 10
+3 5
+10 11
+0 2
+5 13
+6 12
+8 11
+4 10
+5 14
+6 15
+9 19
+4 6
+4 5
+9 16
+5 9
+5 6
+7 14
+9 11
+9 18
+1 9
+1 4
+6 12
+2 10
+8 14
+1 11
+2 4
+9 16
+3 9
+2 11
+7 12
+6 9
+0 8
+9 17
+9 15
+10 12
+0 7
+6 9
+8 13
+10 18
+6 15
diff --git a/geom_bottleneck/tests/data/test_336_A b/geom_bottleneck/tests/data/test_336_A
new file mode 100644
index 0000000..5410dc3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_336_A
@@ -0,0 +1,50 @@
+4 7
+9 16
+2 5
+0 8
+0 9
+10 11
+7 11
+2 3
+6 13
+6 9
+2 8
+7 16
+2 6
+5 14
+6 9
+7 17
+1 8
+0 4
+7 13
+9 13
+10 16
+0 2
+7 16
+8 17
+7 11
+6 7
+2 12
+5 12
+9 17
+6 7
+1 5
+9 12
+7 10
+6 11
+7 16
+6 11
+6 7
+2 6
+1 8
+10 14
+5 6
+2 7
+5 6
+2 11
+8 10
+6 10
+3 12
+3 11
+8 12
+8 10
diff --git a/geom_bottleneck/tests/data/test_336_B b/geom_bottleneck/tests/data/test_336_B
new file mode 100644
index 0000000..8b60a46
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_336_B
@@ -0,0 +1,50 @@
+6 15
+8 10
+0 10
+5 10
+1 10
+8 17
+2 9
+7 9
+9 12
+7 8
+8 9
+7 8
+4 14
+10 17
+3 8
+2 7
+1 10
+6 13
+9 16
+6 13
+2 4
+4 12
+2 3
+3 10
+6 13
+6 11
+6 13
+9 17
+4 5
+0 1
+5 6
+0 7
+1 8
+5 9
+0 7
+0 3
+8 10
+4 6
+10 16
+1 9
+1 10
+7 12
+1 3
+6 10
+5 6
+9 10
+6 7
+5 7
+8 12
+0 9
diff --git a/geom_bottleneck/tests/data/test_337_A b/geom_bottleneck/tests/data/test_337_A
new file mode 100644
index 0000000..652b5f1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_337_A
@@ -0,0 +1,50 @@
+3 5
+1 2
+6 14
+10 18
+3 10
+1 11
+1 7
+2 11
+1 2
+0 7
+2 8
+9 14
+8 10
+1 3
+5 11
+7 8
+6 14
+8 17
+2 10
+7 15
+0 2
+4 12
+10 18
+10 11
+2 6
+3 9
+0 4
+5 15
+4 10
+8 14
+5 12
+10 11
+9 16
+9 14
+3 4
+3 5
+1 10
+3 4
+10 11
+1 6
+6 10
+1 8
+9 10
+1 6
+5 6
+5 6
+3 13
+10 19
+5 9
+4 12
diff --git a/geom_bottleneck/tests/data/test_337_B b/geom_bottleneck/tests/data/test_337_B
new file mode 100644
index 0000000..eba21bc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_337_B
@@ -0,0 +1,50 @@
+0 7
+2 4
+5 14
+7 8
+10 18
+4 13
+2 9
+8 16
+1 9
+5 9
+6 13
+0 1
+10 17
+4 9
+8 15
+1 9
+9 17
+5 14
+7 14
+5 12
+9 18
+8 15
+3 12
+7 17
+1 4
+5 7
+5 15
+3 6
+2 5
+1 2
+4 6
+6 15
+3 7
+4 5
+1 9
+7 8
+10 14
+9 18
+9 13
+9 11
+2 6
+8 10
+2 8
+0 9
+0 10
+1 5
+0 1
+6 9
+6 10
+0 3
diff --git a/geom_bottleneck/tests/data/test_338_A b/geom_bottleneck/tests/data/test_338_A
new file mode 100644
index 0000000..567256f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_338_A
@@ -0,0 +1,50 @@
+9 16
+3 6
+8 18
+7 15
+5 7
+8 14
+2 6
+10 12
+1 5
+5 8
+2 11
+1 3
+7 15
+5 13
+10 16
+1 11
+4 6
+7 8
+4 5
+5 11
+7 12
+6 12
+7 15
+8 16
+4 14
+1 6
+4 13
+3 12
+0 1
+3 6
+4 5
+4 11
+8 9
+0 7
+2 10
+9 17
+1 11
+5 9
+1 8
+10 11
+1 7
+6 8
+7 16
+1 4
+10 17
+2 8
+6 10
+10 14
+1 11
+5 15
diff --git a/geom_bottleneck/tests/data/test_338_B b/geom_bottleneck/tests/data/test_338_B
new file mode 100644
index 0000000..82c3d80
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_338_B
@@ -0,0 +1,50 @@
+1 2
+10 14
+5 6
+8 17
+9 17
+1 6
+4 10
+3 13
+7 15
+5 6
+8 10
+2 5
+3 13
+5 15
+2 4
+8 10
+2 9
+1 3
+6 12
+3 6
+2 12
+2 10
+3 11
+0 2
+4 12
+7 12
+3 5
+6 7
+9 17
+8 9
+3 12
+10 20
+2 10
+3 5
+2 11
+7 17
+3 12
+2 6
+9 11
+4 12
+0 8
+9 11
+1 4
+2 7
+7 16
+0 8
+4 13
+4 5
+8 14
+8 11
diff --git a/geom_bottleneck/tests/data/test_339_A b/geom_bottleneck/tests/data/test_339_A
new file mode 100644
index 0000000..9148a9c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_339_A
@@ -0,0 +1,50 @@
+3 4
+10 13
+6 8
+8 10
+2 3
+3 6
+10 19
+6 14
+6 9
+0 8
+5 7
+10 15
+9 17
+2 3
+9 14
+6 14
+1 11
+4 9
+2 3
+9 16
+6 11
+3 8
+6 9
+10 12
+1 3
+3 13
+7 14
+4 9
+8 11
+7 9
+1 2
+9 11
+8 17
+0 2
+9 19
+5 14
+6 8
+10 14
+7 13
+0 10
+4 5
+0 9
+2 9
+0 5
+9 15
+3 9
+3 7
+7 16
+1 2
+10 18
diff --git a/geom_bottleneck/tests/data/test_339_B b/geom_bottleneck/tests/data/test_339_B
new file mode 100644
index 0000000..385967f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_339_B
@@ -0,0 +1,50 @@
+2 9
+3 4
+1 5
+8 12
+8 12
+5 14
+4 9
+4 10
+5 8
+3 8
+9 10
+0 3
+1 10
+0 7
+6 13
+4 7
+10 20
+7 8
+5 8
+9 18
+1 6
+5 8
+4 8
+7 12
+7 17
+10 18
+9 10
+8 16
+8 13
+7 16
+9 18
+0 1
+7 8
+3 13
+3 4
+1 8
+6 14
+5 14
+3 6
+6 9
+7 15
+5 13
+6 15
+2 12
+9 19
+7 15
+0 4
+3 12
+9 11
+10 11
diff --git a/geom_bottleneck/tests/data/test_340_A b/geom_bottleneck/tests/data/test_340_A
new file mode 100644
index 0000000..4af25b1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_340_A
@@ -0,0 +1,100 @@
+0 5
+10 19
+1 4
+6 9
+1 6
+3 11
+4 10
+9 12
+1 10
+7 12
+8 11
+3 4
+8 18
+9 15
+0 2
+9 12
+1 6
+0 8
+4 5
+2 10
+0 2
+4 10
+6 7
+7 13
+2 3
+0 9
+5 6
+0 10
+5 7
+6 15
+9 15
+1 2
+2 3
+9 14
+8 18
+4 10
+7 15
+5 8
+3 11
+10 14
+4 12
+8 13
+8 17
+2 4
+0 9
+10 19
+3 4
+0 5
+8 15
+1 9
+8 11
+9 16
+0 1
+3 6
+4 6
+2 9
+3 9
+5 11
+1 8
+6 12
+10 19
+5 6
+3 12
+0 2
+9 17
+0 3
+0 4
+10 20
+8 14
+2 10
+3 7
+7 12
+2 4
+8 9
+1 7
+3 13
+1 5
+6 7
+10 13
+9 10
+6 15
+9 11
+0 10
+6 8
+8 9
+5 9
+10 16
+5 11
+7 13
+2 6
+2 3
+5 7
+4 10
+9 19
+7 10
+1 8
+2 9
+10 13
+10 12
+7 11
diff --git a/geom_bottleneck/tests/data/test_340_B b/geom_bottleneck/tests/data/test_340_B
new file mode 100644
index 0000000..0e3fa2a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_340_B
@@ -0,0 +1,100 @@
+7 11
+8 16
+1 4
+8 12
+9 19
+2 5
+2 8
+2 9
+0 4
+1 9
+5 7
+5 9
+10 14
+1 9
+3 10
+0 8
+10 11
+2 10
+2 11
+9 15
+0 1
+0 10
+3 10
+5 12
+5 12
+1 2
+7 12
+0 1
+1 4
+6 15
+1 5
+9 13
+9 17
+9 19
+8 9
+4 6
+1 10
+5 9
+2 3
+7 8
+1 5
+1 4
+8 9
+6 14
+2 9
+1 8
+4 10
+8 10
+1 11
+7 10
+8 13
+5 9
+9 19
+8 9
+3 6
+10 11
+7 8
+3 8
+6 9
+4 12
+10 19
+5 8
+1 9
+8 13
+2 4
+1 8
+7 16
+3 9
+0 3
+1 4
+8 17
+8 9
+5 12
+9 19
+2 8
+0 1
+1 2
+6 10
+1 7
+7 15
+4 8
+2 5
+3 13
+4 7
+9 12
+8 15
+10 12
+9 12
+5 13
+6 15
+1 3
+4 9
+9 16
+7 8
+2 12
+10 19
+1 9
+2 5
+5 6
+9 12
diff --git a/geom_bottleneck/tests/data/test_341_A b/geom_bottleneck/tests/data/test_341_A
new file mode 100644
index 0000000..932688b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_341_A
@@ -0,0 +1,100 @@
+6 15
+6 7
+3 11
+8 15
+2 10
+10 13
+6 16
+9 10
+8 15
+3 12
+10 14
+1 8
+8 17
+1 8
+4 10
+7 12
+1 10
+7 10
+8 18
+3 5
+1 3
+1 6
+0 3
+10 19
+8 18
+4 7
+1 3
+2 8
+1 10
+4 13
+10 13
+10 17
+0 4
+6 12
+4 5
+3 8
+2 4
+4 10
+5 11
+9 14
+5 15
+2 11
+4 12
+5 11
+7 16
+5 7
+4 7
+6 7
+2 6
+3 12
+10 15
+7 12
+1 9
+0 1
+5 8
+1 8
+5 12
+1 3
+2 3
+4 10
+2 10
+10 19
+2 3
+4 13
+10 14
+3 4
+0 10
+5 7
+10 11
+8 11
+6 11
+7 17
+3 4
+0 6
+9 11
+3 12
+5 12
+9 10
+6 8
+4 11
+3 7
+2 6
+9 10
+8 18
+10 11
+2 9
+4 9
+4 13
+0 5
+10 17
+5 6
+6 16
+0 3
+0 8
+5 15
+5 12
+3 10
+8 11
+10 17
+4 6
diff --git a/geom_bottleneck/tests/data/test_341_B b/geom_bottleneck/tests/data/test_341_B
new file mode 100644
index 0000000..68cc4b9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_341_B
@@ -0,0 +1,100 @@
+9 15
+10 18
+2 5
+5 7
+3 13
+6 13
+0 1
+2 12
+2 11
+3 4
+3 5
+1 9
+4 7
+10 12
+3 8
+9 17
+10 20
+5 7
+3 5
+9 18
+9 12
+3 5
+0 7
+1 2
+6 14
+7 8
+0 2
+3 11
+10 18
+7 10
+0 4
+10 11
+6 12
+8 16
+7 17
+0 8
+0 10
+9 16
+8 15
+5 6
+5 10
+4 8
+4 10
+1 11
+6 7
+6 9
+1 10
+3 5
+10 20
+10 11
+2 8
+10 13
+9 14
+8 11
+10 11
+7 16
+8 10
+8 17
+5 14
+0 7
+7 8
+4 8
+6 14
+2 5
+10 15
+2 10
+2 4
+8 13
+6 14
+2 3
+7 8
+8 13
+4 8
+1 6
+1 9
+0 1
+7 14
+10 11
+2 7
+5 15
+0 4
+1 7
+0 6
+6 13
+6 15
+1 2
+2 4
+8 9
+0 1
+3 4
+8 9
+9 11
+9 16
+8 17
+1 3
+8 10
+8 9
+8 15
+1 3
+7 16
diff --git a/geom_bottleneck/tests/data/test_342_A b/geom_bottleneck/tests/data/test_342_A
new file mode 100644
index 0000000..04cdc19
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_342_A
@@ -0,0 +1,100 @@
+4 8
+4 5
+1 9
+4 13
+2 10
+7 15
+6 7
+8 17
+1 8
+6 7
+9 19
+8 12
+10 18
+5 7
+8 13
+9 12
+9 14
+1 2
+7 11
+9 11
+6 15
+2 12
+6 10
+0 7
+1 10
+2 5
+8 11
+3 13
+3 11
+3 10
+6 14
+1 10
+4 6
+3 13
+5 10
+3 9
+9 16
+3 4
+0 2
+9 10
+10 16
+5 12
+6 11
+4 7
+9 18
+10 16
+5 7
+6 12
+0 7
+5 9
+8 18
+4 7
+2 6
+8 17
+7 10
+7 10
+6 11
+8 9
+3 7
+8 16
+4 9
+6 12
+0 6
+4 12
+10 15
+10 17
+10 20
+3 11
+2 12
+0 9
+3 12
+4 5
+5 7
+3 7
+0 4
+5 9
+1 7
+6 13
+9 13
+8 9
+0 6
+3 10
+1 11
+0 2
+0 6
+3 9
+2 7
+4 7
+8 14
+2 7
+2 4
+4 7
+1 7
+10 13
+6 16
+5 15
+7 17
+7 10
+3 5
+7 10
diff --git a/geom_bottleneck/tests/data/test_342_B b/geom_bottleneck/tests/data/test_342_B
new file mode 100644
index 0000000..e6aae99
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_342_B
@@ -0,0 +1,100 @@
+9 16
+6 15
+1 4
+0 1
+3 5
+2 3
+10 20
+3 7
+0 10
+3 13
+7 8
+4 6
+7 14
+8 9
+8 14
+10 20
+1 9
+4 14
+4 5
+2 6
+6 8
+1 10
+7 14
+8 10
+4 8
+7 8
+7 12
+6 16
+6 7
+9 19
+8 12
+1 9
+1 3
+10 16
+3 6
+2 8
+0 2
+7 15
+2 3
+8 13
+5 8
+1 2
+10 11
+4 11
+5 12
+10 15
+7 8
+2 5
+6 13
+8 17
+8 14
+4 8
+6 11
+5 6
+0 7
+0 5
+8 13
+1 2
+6 11
+6 11
+8 9
+4 5
+4 8
+0 5
+3 9
+1 3
+8 9
+10 16
+8 17
+8 17
+3 4
+3 5
+8 12
+9 10
+9 10
+8 14
+3 10
+5 9
+1 4
+9 19
+0 2
+7 8
+6 8
+7 12
+6 12
+0 1
+9 11
+3 11
+5 6
+0 8
+2 4
+1 7
+3 4
+0 3
+9 17
+2 9
+1 6
+2 6
+7 15
+1 4
diff --git a/geom_bottleneck/tests/data/test_343_A b/geom_bottleneck/tests/data/test_343_A
new file mode 100644
index 0000000..9759369
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_343_A
@@ -0,0 +1,100 @@
+5 13
+5 9
+2 3
+6 14
+1 2
+3 6
+1 3
+9 14
+0 6
+1 8
+9 10
+4 5
+10 19
+6 13
+7 8
+10 16
+6 7
+10 18
+8 11
+2 8
+8 9
+5 10
+1 2
+10 14
+10 12
+8 17
+7 12
+9 12
+1 5
+2 4
+8 13
+2 11
+0 5
+4 8
+2 12
+2 10
+6 15
+1 2
+8 11
+8 18
+8 9
+7 9
+5 7
+0 10
+4 10
+5 13
+8 16
+5 11
+8 16
+7 9
+2 11
+8 12
+8 10
+9 16
+7 8
+5 15
+0 1
+6 7
+7 8
+6 7
+7 13
+9 16
+9 15
+3 11
+4 10
+2 10
+3 13
+0 1
+7 10
+9 10
+8 10
+3 4
+1 4
+1 6
+4 7
+4 10
+6 11
+10 13
+7 10
+9 14
+9 15
+7 9
+3 10
+6 8
+5 15
+8 11
+7 14
+8 18
+9 13
+9 15
+10 17
+3 13
+5 7
+8 16
+4 12
+9 10
+6 12
+1 9
+0 6
+5 11
diff --git a/geom_bottleneck/tests/data/test_343_B b/geom_bottleneck/tests/data/test_343_B
new file mode 100644
index 0000000..e338ab2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_343_B
@@ -0,0 +1,100 @@
+2 12
+5 9
+5 6
+10 19
+2 6
+6 14
+8 18
+6 9
+2 10
+5 7
+0 6
+7 10
+7 14
+10 15
+10 16
+6 16
+7 16
+3 8
+2 4
+2 11
+10 19
+7 15
+8 9
+7 11
+10 20
+9 11
+3 6
+6 15
+5 14
+2 3
+1 3
+5 11
+3 8
+2 9
+1 3
+10 20
+6 11
+0 9
+6 9
+0 5
+9 10
+2 7
+8 14
+9 19
+2 7
+10 11
+0 6
+4 7
+10 16
+9 12
+7 16
+5 12
+1 8
+4 12
+1 2
+1 8
+9 13
+9 14
+8 9
+4 9
+4 11
+9 19
+5 15
+2 3
+9 10
+8 15
+7 8
+9 10
+5 12
+2 12
+0 1
+3 4
+3 5
+5 14
+10 18
+3 10
+0 1
+9 10
+4 6
+10 18
+9 17
+6 7
+8 15
+3 11
+7 8
+6 12
+5 11
+0 10
+5 8
+6 15
+6 13
+0 4
+4 13
+6 9
+0 1
+0 1
+3 10
+8 17
+0 8
+9 18
diff --git a/geom_bottleneck/tests/data/test_344_A b/geom_bottleneck/tests/data/test_344_A
new file mode 100644
index 0000000..e8e81ab
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_344_A
@@ -0,0 +1,100 @@
+2 11
+2 7
+2 7
+1 11
+2 6
+0 9
+2 8
+2 12
+0 9
+5 10
+6 10
+2 4
+9 19
+0 6
+0 6
+9 18
+6 7
+3 13
+3 9
+1 4
+1 9
+1 11
+9 19
+8 9
+7 13
+5 13
+10 14
+10 12
+1 3
+10 17
+2 4
+8 9
+8 18
+7 15
+3 13
+10 19
+0 2
+0 10
+2 7
+5 6
+9 14
+0 4
+7 14
+10 11
+3 5
+0 2
+8 18
+4 5
+10 16
+9 18
+6 16
+4 8
+3 4
+2 7
+4 14
+4 10
+4 10
+10 14
+8 9
+7 16
+1 7
+4 14
+6 7
+3 4
+9 10
+2 3
+7 13
+10 13
+10 14
+3 8
+0 6
+3 4
+1 10
+6 12
+4 6
+3 9
+3 9
+5 11
+10 13
+2 5
+9 16
+4 14
+3 5
+0 1
+10 19
+9 16
+10 14
+0 4
+1 3
+6 8
+7 14
+1 11
+0 6
+1 5
+8 9
+8 11
+7 16
+10 11
+1 7
+2 12
diff --git a/geom_bottleneck/tests/data/test_344_B b/geom_bottleneck/tests/data/test_344_B
new file mode 100644
index 0000000..af72be5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_344_B
@@ -0,0 +1,100 @@
+10 11
+8 9
+3 12
+2 10
+1 6
+4 8
+8 11
+7 17
+8 18
+9 10
+5 6
+2 9
+8 10
+1 8
+3 13
+5 12
+8 14
+7 14
+2 12
+10 15
+0 7
+7 8
+8 17
+8 10
+4 8
+6 7
+6 8
+2 3
+5 15
+2 11
+10 18
+6 13
+1 2
+6 16
+2 8
+8 11
+9 18
+8 14
+6 16
+10 20
+8 9
+0 7
+1 5
+7 16
+10 17
+1 2
+2 5
+2 6
+3 4
+7 9
+5 8
+5 7
+5 7
+1 11
+7 10
+7 17
+7 14
+5 7
+10 20
+0 2
+5 9
+0 1
+4 12
+5 6
+5 6
+2 9
+0 10
+10 11
+2 7
+8 9
+5 6
+0 2
+4 10
+6 13
+5 15
+9 11
+3 9
+6 10
+0 4
+6 9
+6 16
+10 15
+6 16
+0 8
+4 12
+10 15
+6 11
+8 11
+8 9
+3 12
+4 11
+5 11
+10 14
+9 14
+3 12
+7 8
+2 7
+8 12
+8 9
+4 12
diff --git a/geom_bottleneck/tests/data/test_345_A b/geom_bottleneck/tests/data/test_345_A
new file mode 100644
index 0000000..584e4ed
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_345_A
@@ -0,0 +1,100 @@
+2 6
+6 16
+7 11
+0 4
+4 5
+3 9
+9 10
+6 12
+1 3
+9 16
+6 15
+10 14
+4 6
+6 7
+1 7
+2 8
+3 10
+9 10
+0 10
+0 1
+10 11
+3 8
+4 10
+9 15
+6 9
+0 3
+1 7
+1 3
+4 5
+8 12
+2 3
+6 14
+8 14
+1 9
+10 17
+4 5
+3 7
+9 10
+4 7
+7 12
+10 11
+6 11
+0 7
+6 8
+5 15
+1 5
+7 11
+5 7
+10 11
+9 14
+0 3
+8 12
+10 20
+0 10
+5 14
+5 8
+9 10
+3 12
+0 8
+1 11
+3 6
+3 5
+10 14
+3 12
+5 9
+5 13
+6 16
+7 15
+9 17
+7 12
+1 10
+7 10
+6 8
+3 12
+4 12
+5 9
+1 7
+7 16
+8 10
+1 11
+2 11
+4 10
+7 8
+5 15
+2 5
+3 10
+8 12
+9 12
+2 3
+0 3
+10 12
+0 10
+10 14
+4 6
+10 11
+8 17
+6 8
+10 16
+9 18
+5 7
diff --git a/geom_bottleneck/tests/data/test_345_B b/geom_bottleneck/tests/data/test_345_B
new file mode 100644
index 0000000..8c3e758
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_345_B
@@ -0,0 +1,100 @@
+2 5
+8 13
+1 3
+4 13
+3 12
+1 9
+8 14
+4 13
+9 14
+8 14
+7 16
+8 14
+7 8
+0 9
+3 12
+9 14
+9 10
+2 3
+3 6
+6 15
+9 15
+6 12
+0 6
+9 12
+4 9
+5 14
+9 13
+8 9
+5 15
+2 7
+8 10
+0 2
+7 11
+5 10
+7 15
+5 6
+1 8
+7 9
+9 15
+3 10
+1 2
+3 6
+0 5
+6 16
+2 8
+9 10
+4 11
+2 3
+4 8
+5 11
+9 15
+2 7
+5 14
+10 18
+1 3
+9 14
+10 16
+3 8
+9 14
+1 3
+9 13
+2 7
+1 2
+7 13
+1 8
+2 5
+4 5
+3 5
+1 2
+10 13
+6 16
+10 15
+1 7
+10 12
+0 10
+7 12
+9 14
+4 5
+4 5
+6 9
+9 19
+5 12
+9 10
+9 19
+10 18
+8 11
+7 17
+0 3
+3 13
+3 11
+4 8
+6 11
+1 6
+0 9
+9 12
+8 13
+1 10
+7 13
+6 12
+4 8
diff --git a/geom_bottleneck/tests/data/test_346_A b/geom_bottleneck/tests/data/test_346_A
new file mode 100644
index 0000000..ab26e2f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_346_A
@@ -0,0 +1,100 @@
+10 11
+1 11
+1 9
+0 5
+1 3
+10 18
+0 5
+4 5
+1 8
+8 16
+5 6
+9 13
+6 13
+4 5
+7 14
+8 9
+4 5
+9 11
+6 9
+9 18
+10 15
+8 15
+10 12
+3 7
+10 14
+3 9
+10 12
+3 9
+0 10
+5 8
+7 17
+8 11
+6 7
+10 17
+0 8
+0 1
+0 9
+8 10
+7 15
+8 17
+0 4
+0 3
+10 11
+7 10
+4 13
+4 9
+3 4
+4 5
+4 12
+4 11
+5 11
+3 4
+10 16
+0 2
+0 6
+8 10
+9 11
+7 15
+7 9
+5 11
+9 15
+7 8
+7 16
+4 14
+2 3
+5 8
+2 3
+9 15
+8 15
+6 15
+1 6
+2 5
+4 13
+6 12
+7 8
+0 2
+8 14
+4 9
+10 11
+10 16
+3 10
+7 16
+9 13
+1 2
+7 12
+3 5
+5 6
+4 12
+9 11
+6 7
+2 8
+9 10
+7 8
+0 6
+1 2
+5 9
+3 10
+3 13
+2 9
+2 9
diff --git a/geom_bottleneck/tests/data/test_346_B b/geom_bottleneck/tests/data/test_346_B
new file mode 100644
index 0000000..5e30972
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_346_B
@@ -0,0 +1,100 @@
+8 15
+1 8
+10 15
+8 13
+9 16
+3 13
+3 5
+1 8
+8 16
+6 12
+7 16
+4 14
+3 9
+0 8
+9 18
+4 14
+1 10
+6 12
+4 5
+10 14
+3 6
+9 10
+1 4
+6 16
+8 17
+6 7
+0 5
+1 9
+3 7
+8 14
+9 17
+10 15
+3 10
+4 14
+9 10
+9 16
+4 9
+2 12
+4 5
+6 14
+3 12
+10 16
+10 14
+6 12
+2 11
+4 11
+1 10
+5 6
+3 13
+10 19
+4 8
+0 2
+7 9
+6 7
+10 12
+9 18
+2 8
+6 9
+2 6
+4 11
+9 18
+8 14
+10 16
+9 13
+4 5
+1 6
+9 15
+8 9
+10 14
+1 2
+9 17
+10 15
+5 8
+8 11
+8 9
+10 17
+2 4
+5 6
+1 4
+1 4
+5 15
+7 13
+6 12
+10 12
+7 13
+9 10
+5 9
+0 5
+1 7
+2 3
+9 14
+4 10
+8 9
+3 12
+2 3
+4 11
+10 20
+10 13
+3 9
+8 16
diff --git a/geom_bottleneck/tests/data/test_347_A b/geom_bottleneck/tests/data/test_347_A
new file mode 100644
index 0000000..0cfd08b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_347_A
@@ -0,0 +1,100 @@
+0 3
+9 14
+9 11
+1 3
+7 8
+4 12
+7 8
+10 20
+8 13
+2 5
+8 9
+5 14
+8 9
+5 11
+10 14
+7 15
+4 9
+4 10
+1 2
+2 6
+6 12
+0 1
+7 8
+10 13
+4 9
+0 3
+2 3
+0 4
+3 6
+7 13
+0 1
+10 13
+3 4
+1 2
+0 5
+9 12
+1 11
+8 17
+3 4
+3 7
+4 9
+1 2
+1 9
+4 14
+10 11
+3 11
+8 9
+2 6
+4 7
+8 13
+7 10
+0 1
+10 19
+7 13
+6 11
+1 10
+4 12
+9 14
+5 12
+3 13
+0 1
+2 3
+4 8
+5 11
+8 18
+5 6
+0 3
+0 3
+5 8
+10 11
+3 9
+0 4
+8 11
+5 14
+3 7
+9 10
+6 7
+8 14
+9 18
+6 11
+7 8
+6 10
+4 9
+4 9
+9 14
+6 13
+6 13
+10 17
+7 17
+8 15
+7 9
+4 9
+4 14
+0 1
+5 15
+4 8
+0 7
+4 5
+7 16
+4 9
diff --git a/geom_bottleneck/tests/data/test_347_B b/geom_bottleneck/tests/data/test_347_B
new file mode 100644
index 0000000..66d57ea
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_347_B
@@ -0,0 +1,100 @@
+10 11
+6 15
+5 11
+8 9
+8 12
+4 7
+6 7
+6 11
+10 16
+6 15
+9 19
+7 16
+10 12
+0 1
+9 13
+9 10
+10 15
+6 10
+10 12
+7 10
+9 17
+2 3
+10 19
+2 3
+5 13
+7 9
+9 16
+9 18
+9 16
+4 10
+1 11
+6 7
+9 10
+6 7
+3 4
+8 15
+6 16
+8 9
+6 8
+8 10
+0 6
+7 9
+5 10
+3 6
+1 5
+6 7
+6 9
+4 13
+5 7
+8 17
+10 16
+9 19
+5 9
+2 3
+6 7
+7 16
+4 10
+3 10
+6 9
+3 11
+9 18
+7 15
+8 16
+6 9
+8 10
+6 10
+0 3
+1 2
+2 3
+5 11
+5 9
+1 11
+10 11
+0 10
+9 14
+1 5
+3 4
+3 10
+6 12
+0 7
+5 9
+9 12
+8 16
+7 12
+1 11
+9 11
+5 15
+10 19
+2 8
+5 15
+4 6
+3 10
+4 13
+0 9
+5 6
+6 10
+2 3
+3 12
+1 10
+6 7
diff --git a/geom_bottleneck/tests/data/test_348_A b/geom_bottleneck/tests/data/test_348_A
new file mode 100644
index 0000000..8cef3ff
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_348_A
@@ -0,0 +1,100 @@
+8 16
+2 7
+7 12
+0 9
+9 12
+8 18
+1 3
+2 6
+3 8
+2 6
+3 11
+5 10
+8 9
+0 7
+5 11
+3 10
+3 7
+2 12
+5 12
+6 12
+3 9
+2 9
+1 2
+9 12
+0 9
+9 16
+6 10
+6 10
+2 4
+2 10
+7 8
+8 15
+4 14
+3 5
+8 10
+7 9
+10 19
+8 16
+7 8
+3 4
+8 13
+3 13
+0 1
+7 16
+7 13
+0 7
+7 11
+3 10
+4 14
+4 7
+1 2
+10 13
+8 14
+5 15
+7 11
+6 14
+9 10
+6 15
+2 12
+4 13
+1 4
+6 11
+1 2
+2 7
+3 4
+3 4
+2 8
+2 10
+8 18
+9 12
+9 13
+8 9
+4 10
+5 6
+6 10
+8 9
+5 15
+3 7
+2 10
+1 5
+6 7
+4 5
+5 8
+10 17
+5 8
+10 19
+5 15
+3 10
+8 18
+0 2
+9 13
+2 11
+1 7
+4 12
+5 7
+4 10
+5 13
+3 4
+7 15
+0 1
diff --git a/geom_bottleneck/tests/data/test_348_B b/geom_bottleneck/tests/data/test_348_B
new file mode 100644
index 0000000..5db1829
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_348_B
@@ -0,0 +1,100 @@
+8 18
+0 10
+5 12
+5 13
+5 6
+7 14
+3 9
+2 7
+0 1
+4 11
+10 11
+10 17
+7 8
+5 6
+1 6
+10 15
+8 9
+8 11
+5 6
+7 9
+4 6
+10 13
+6 14
+1 2
+5 6
+7 15
+1 9
+10 12
+9 10
+4 9
+7 10
+7 9
+8 16
+1 9
+5 10
+10 17
+4 5
+8 10
+5 15
+7 14
+5 10
+1 11
+7 11
+8 16
+1 10
+10 17
+2 6
+7 12
+4 5
+2 6
+0 7
+2 9
+10 11
+10 20
+7 17
+9 17
+2 8
+7 11
+2 4
+2 7
+7 10
+10 16
+6 13
+1 3
+2 10
+9 19
+2 12
+6 12
+4 5
+9 17
+1 6
+0 1
+4 10
+8 12
+0 8
+10 19
+2 11
+3 4
+0 1
+1 9
+9 14
+4 8
+2 10
+0 3
+7 15
+8 12
+7 15
+5 7
+8 11
+5 12
+2 11
+9 14
+10 12
+1 11
+7 9
+10 11
+1 5
+2 8
+6 15
+1 5
diff --git a/geom_bottleneck/tests/data/test_349_A b/geom_bottleneck/tests/data/test_349_A
new file mode 100644
index 0000000..a3d008e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_349_A
@@ -0,0 +1,100 @@
+9 18
+5 7
+10 20
+5 6
+8 12
+5 6
+7 14
+9 17
+9 11
+6 7
+3 4
+1 2
+7 9
+1 8
+3 6
+10 13
+2 9
+9 10
+0 8
+3 12
+2 12
+0 6
+7 16
+8 16
+7 8
+10 12
+6 7
+10 13
+3 9
+2 3
+8 14
+4 8
+7 12
+6 12
+6 16
+1 8
+7 13
+2 10
+9 16
+3 10
+0 8
+10 11
+1 2
+5 12
+10 20
+3 10
+7 14
+2 12
+2 10
+4 7
+6 15
+6 7
+3 13
+5 12
+6 9
+5 6
+10 17
+6 7
+4 5
+10 11
+9 13
+6 14
+4 9
+4 7
+5 9
+6 11
+10 13
+5 15
+3 6
+1 7
+7 12
+6 7
+3 9
+5 9
+0 2
+10 14
+3 4
+6 16
+5 13
+2 7
+9 16
+0 6
+9 11
+0 3
+1 10
+3 6
+10 16
+4 10
+10 11
+9 14
+3 13
+0 3
+8 10
+8 18
+5 13
+5 11
+9 18
+1 3
+8 12
+5 6
diff --git a/geom_bottleneck/tests/data/test_349_B b/geom_bottleneck/tests/data/test_349_B
new file mode 100644
index 0000000..d66b5eb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_349_B
@@ -0,0 +1,100 @@
+8 9
+2 3
+7 8
+4 14
+8 15
+3 8
+5 9
+1 3
+7 9
+0 5
+6 11
+3 12
+9 12
+4 10
+7 8
+10 14
+4 9
+5 6
+3 8
+7 15
+2 9
+3 4
+8 14
+7 11
+5 6
+10 19
+8 13
+2 5
+0 9
+0 8
+8 13
+4 8
+10 17
+10 14
+8 17
+2 6
+9 10
+6 10
+8 9
+0 2
+10 18
+6 9
+10 17
+0 3
+8 13
+9 12
+4 5
+8 14
+9 10
+1 2
+2 10
+8 15
+3 12
+4 9
+5 12
+3 11
+2 6
+3 7
+2 4
+5 10
+10 13
+2 4
+4 5
+1 2
+2 8
+2 3
+5 10
+6 7
+9 18
+8 9
+7 12
+2 4
+7 9
+7 14
+8 10
+10 11
+8 13
+10 15
+6 12
+10 16
+9 12
+9 16
+1 5
+2 9
+6 8
+8 10
+0 1
+1 3
+10 11
+7 16
+5 9
+7 13
+7 15
+6 10
+1 4
+10 15
+2 7
+2 7
+8 9
+3 13
diff --git a/geom_bottleneck/tests/data/test_350_A b/geom_bottleneck/tests/data/test_350_A
new file mode 100644
index 0000000..734d037
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_350_A
@@ -0,0 +1,100 @@
+4 13
+9 10
+7 11
+3 10
+1 9
+3 4
+3 11
+7 13
+9 15
+7 8
+7 14
+0 10
+1 6
+7 10
+3 4
+1 2
+7 12
+7 17
+3 11
+4 9
+7 16
+10 11
+3 13
+3 7
+4 5
+3 7
+6 9
+9 10
+0 8
+9 16
+10 13
+5 13
+3 8
+6 9
+10 11
+9 16
+10 11
+5 15
+9 13
+0 1
+10 17
+1 2
+10 20
+0 2
+9 17
+4 9
+10 16
+3 5
+9 18
+2 6
+4 12
+3 12
+7 9
+2 11
+5 13
+2 5
+0 5
+3 9
+3 7
+2 6
+8 15
+1 9
+3 4
+5 10
+3 4
+9 19
+6 8
+9 10
+3 13
+4 5
+1 4
+10 11
+9 13
+8 10
+10 12
+6 8
+1 6
+9 10
+1 5
+1 2
+8 9
+2 9
+3 4
+1 10
+0 7
+0 1
+1 10
+7 8
+4 11
+9 12
+7 17
+8 9
+4 8
+8 11
+9 16
+4 7
+3 5
+3 6
+5 6
+0 9
diff --git a/geom_bottleneck/tests/data/test_350_B b/geom_bottleneck/tests/data/test_350_B
new file mode 100644
index 0000000..3cf03c4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_350_B
@@ -0,0 +1,100 @@
+10 11
+7 8
+10 13
+1 2
+0 1
+9 10
+10 18
+9 18
+1 9
+0 10
+10 11
+10 14
+0 2
+8 17
+7 17
+8 13
+0 3
+4 11
+5 7
+9 14
+5 14
+1 4
+5 9
+3 5
+10 18
+3 13
+3 4
+4 7
+3 7
+8 13
+1 11
+0 3
+1 4
+10 20
+4 5
+0 9
+9 13
+6 12
+9 19
+7 16
+2 3
+5 6
+1 9
+0 8
+2 4
+8 15
+0 7
+5 6
+4 8
+2 6
+1 2
+8 10
+2 10
+0 1
+8 13
+10 12
+1 8
+2 8
+2 4
+9 12
+7 8
+6 14
+3 9
+1 6
+7 13
+4 7
+10 17
+7 8
+9 12
+8 10
+6 13
+5 14
+5 13
+10 14
+9 13
+1 2
+2 3
+7 11
+6 13
+10 11
+1 9
+1 3
+7 14
+5 14
+2 3
+3 6
+9 11
+10 15
+0 6
+8 16
+4 11
+1 8
+3 8
+2 5
+6 13
+3 6
+7 8
+10 15
+7 10
+3 4
diff --git a/geom_bottleneck/tests/data/test_351_A b/geom_bottleneck/tests/data/test_351_A
new file mode 100644
index 0000000..3989d6c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_351_A
@@ -0,0 +1,100 @@
+2 11
+9 18
+7 13
+10 12
+5 10
+8 11
+10 11
+0 1
+6 13
+2 12
+5 13
+6 8
+2 3
+4 6
+4 10
+5 12
+7 12
+6 13
+6 13
+7 17
+6 10
+6 14
+8 9
+1 9
+0 10
+7 10
+3 12
+9 14
+2 10
+10 14
+1 7
+1 6
+2 12
+7 13
+3 6
+4 5
+2 9
+7 8
+1 2
+8 12
+6 11
+7 8
+10 13
+3 10
+4 12
+5 8
+9 15
+8 15
+4 11
+6 7
+6 8
+9 18
+2 3
+10 20
+0 5
+10 20
+4 13
+10 12
+7 17
+8 16
+2 10
+9 11
+5 11
+5 15
+2 5
+3 12
+5 8
+6 9
+10 11
+3 8
+5 15
+3 13
+10 15
+8 10
+4 9
+4 6
+8 10
+8 17
+0 1
+1 2
+1 8
+7 14
+0 1
+1 5
+6 7
+1 6
+9 14
+8 12
+0 1
+2 10
+0 8
+4 10
+0 8
+3 4
+7 11
+9 13
+0 5
+3 9
+4 9
+2 4
diff --git a/geom_bottleneck/tests/data/test_351_B b/geom_bottleneck/tests/data/test_351_B
new file mode 100644
index 0000000..b1c32d7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_351_B
@@ -0,0 +1,100 @@
+9 18
+7 9
+6 14
+2 10
+6 7
+9 13
+3 12
+6 7
+4 7
+6 9
+3 4
+7 17
+0 9
+3 8
+0 3
+3 13
+10 15
+1 5
+1 7
+4 10
+2 9
+9 12
+4 11
+10 16
+2 7
+9 17
+1 8
+9 12
+5 8
+10 13
+2 11
+8 9
+5 6
+0 6
+0 5
+2 3
+9 12
+9 13
+8 10
+4 6
+1 4
+7 9
+4 5
+8 9
+5 7
+4 14
+5 9
+3 11
+4 8
+3 10
+4 13
+6 14
+6 13
+6 16
+9 18
+4 14
+3 4
+6 12
+2 6
+8 16
+9 13
+0 4
+9 18
+7 17
+0 5
+0 2
+7 8
+8 10
+0 1
+10 17
+2 7
+10 14
+7 9
+3 10
+1 11
+2 4
+7 13
+5 8
+2 7
+4 9
+8 14
+1 6
+2 4
+4 5
+6 12
+8 9
+0 4
+4 5
+0 7
+9 12
+8 9
+4 9
+8 9
+9 18
+3 10
+0 3
+10 16
+3 9
+3 7
+3 13
diff --git a/geom_bottleneck/tests/data/test_352_A b/geom_bottleneck/tests/data/test_352_A
new file mode 100644
index 0000000..df81454
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_352_A
@@ -0,0 +1,100 @@
+8 12
+1 7
+7 15
+10 15
+5 8
+1 7
+1 2
+1 7
+6 10
+6 12
+8 16
+0 10
+4 8
+1 2
+6 13
+7 11
+5 11
+5 6
+0 1
+8 17
+0 2
+0 4
+9 16
+9 16
+10 13
+5 12
+3 11
+4 9
+9 12
+9 13
+1 5
+1 2
+2 6
+1 7
+8 17
+7 8
+4 9
+9 13
+1 8
+7 9
+0 10
+7 8
+9 15
+5 11
+0 4
+6 9
+0 10
+10 19
+6 11
+0 10
+7 16
+9 10
+2 5
+6 7
+6 11
+5 14
+9 10
+6 11
+8 12
+7 11
+4 12
+9 11
+1 4
+5 7
+6 8
+3 4
+8 15
+2 5
+8 13
+1 2
+4 5
+5 12
+6 15
+6 10
+1 8
+0 9
+0 2
+9 18
+7 14
+4 8
+5 10
+0 10
+9 10
+0 10
+10 14
+0 1
+7 8
+9 14
+8 11
+8 12
+8 14
+7 16
+4 7
+4 14
+0 4
+2 3
+6 16
+9 16
+6 12
+8 17
diff --git a/geom_bottleneck/tests/data/test_352_B b/geom_bottleneck/tests/data/test_352_B
new file mode 100644
index 0000000..9b30bae
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_352_B
@@ -0,0 +1,100 @@
+2 10
+0 1
+10 15
+7 14
+2 3
+0 9
+1 4
+5 6
+1 4
+2 8
+2 4
+0 6
+2 8
+0 1
+10 14
+5 11
+0 6
+10 17
+2 9
+10 16
+7 14
+4 11
+6 7
+3 6
+7 16
+2 8
+0 3
+1 2
+5 7
+10 12
+5 6
+1 3
+5 14
+5 14
+6 13
+8 16
+0 10
+6 12
+9 17
+3 5
+4 10
+3 6
+1 9
+1 9
+8 17
+3 4
+0 1
+1 9
+9 11
+6 7
+0 7
+3 4
+9 15
+9 13
+0 5
+1 10
+6 15
+10 19
+5 14
+1 11
+6 12
+4 13
+4 11
+2 3
+7 11
+2 5
+0 6
+0 2
+10 11
+1 5
+6 7
+2 10
+9 17
+0 5
+8 13
+2 12
+6 7
+1 6
+9 17
+8 14
+0 10
+1 2
+2 3
+2 10
+2 12
+4 6
+8 9
+7 8
+6 10
+7 17
+8 17
+10 19
+4 6
+7 9
+2 12
+2 10
+8 15
+0 4
+1 6
+2 5
diff --git a/geom_bottleneck/tests/data/test_353_A b/geom_bottleneck/tests/data/test_353_A
new file mode 100644
index 0000000..3dda9d1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_353_A
@@ -0,0 +1,100 @@
+1 11
+3 5
+3 5
+2 3
+9 10
+0 9
+6 9
+0 8
+8 10
+6 12
+1 10
+1 2
+0 8
+8 18
+0 7
+3 4
+2 7
+8 15
+1 5
+1 9
+2 11
+7 11
+3 12
+4 6
+0 2
+8 16
+0 1
+10 18
+4 9
+8 18
+1 8
+5 7
+8 16
+1 2
+4 10
+9 18
+3 5
+5 8
+2 10
+3 8
+8 16
+10 12
+0 1
+0 9
+3 7
+3 4
+3 6
+3 9
+8 10
+2 12
+6 10
+3 13
+2 6
+9 10
+6 10
+9 19
+3 5
+4 6
+8 9
+2 3
+5 6
+3 4
+3 7
+7 17
+8 12
+5 6
+1 2
+0 1
+6 10
+7 9
+5 15
+7 14
+2 9
+1 5
+4 5
+0 9
+1 9
+7 8
+1 7
+2 3
+10 16
+5 6
+5 10
+0 9
+1 11
+7 10
+7 17
+10 19
+1 2
+9 19
+10 14
+7 11
+9 14
+8 17
+1 2
+7 16
+2 9
+9 16
+3 4
+0 1
diff --git a/geom_bottleneck/tests/data/test_353_B b/geom_bottleneck/tests/data/test_353_B
new file mode 100644
index 0000000..16ed654
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_353_B
@@ -0,0 +1,100 @@
+1 9
+1 9
+9 14
+7 9
+9 18
+6 13
+1 2
+5 15
+7 8
+8 15
+5 11
+9 13
+1 8
+4 6
+10 11
+6 7
+4 10
+0 4
+3 7
+0 1
+10 11
+7 13
+0 2
+4 5
+10 18
+8 13
+4 11
+8 18
+8 15
+1 10
+6 13
+5 8
+10 15
+7 14
+2 3
+10 19
+5 8
+2 3
+7 14
+1 7
+1 9
+6 12
+2 8
+3 11
+5 13
+2 3
+10 16
+10 15
+2 10
+10 18
+3 6
+0 6
+1 4
+6 11
+1 3
+8 9
+8 16
+0 2
+8 12
+9 10
+1 4
+0 3
+0 2
+5 14
+3 11
+7 12
+7 17
+5 6
+10 16
+3 4
+0 6
+0 3
+0 1
+3 13
+6 7
+4 9
+7 9
+0 1
+10 13
+8 12
+0 6
+2 8
+10 13
+2 3
+7 13
+9 19
+4 7
+10 16
+1 5
+2 11
+3 13
+8 13
+3 9
+3 9
+3 13
+7 15
+0 2
+2 6
+7 14
+1 4
diff --git a/geom_bottleneck/tests/data/test_354_A b/geom_bottleneck/tests/data/test_354_A
new file mode 100644
index 0000000..c701ef2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_354_A
@@ -0,0 +1,100 @@
+6 16
+5 15
+0 2
+8 18
+10 15
+0 2
+3 5
+6 14
+1 9
+3 12
+6 8
+2 3
+2 11
+8 14
+10 15
+3 5
+10 12
+1 4
+3 4
+8 15
+10 15
+6 15
+10 16
+10 17
+3 11
+10 17
+2 3
+2 10
+5 9
+5 9
+8 16
+0 7
+7 15
+1 3
+0 1
+10 17
+10 12
+0 8
+4 11
+1 8
+5 8
+0 10
+2 4
+1 2
+7 11
+7 14
+4 5
+7 16
+3 7
+5 7
+8 9
+8 12
+2 3
+6 16
+6 16
+5 7
+5 14
+0 10
+9 16
+9 11
+6 16
+5 14
+5 11
+8 9
+4 10
+5 6
+1 2
+6 15
+1 5
+9 10
+8 9
+0 8
+4 5
+10 19
+7 11
+8 18
+3 4
+7 8
+2 9
+6 11
+1 2
+7 16
+0 2
+1 10
+10 11
+4 5
+9 12
+8 13
+1 11
+4 8
+0 1
+9 15
+0 7
+2 4
+1 6
+1 10
+8 15
+8 18
+8 10
+9 17
diff --git a/geom_bottleneck/tests/data/test_354_B b/geom_bottleneck/tests/data/test_354_B
new file mode 100644
index 0000000..0a21b24
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_354_B
@@ -0,0 +1,100 @@
+7 8
+3 12
+9 19
+5 13
+8 9
+4 14
+10 12
+1 4
+1 5
+8 16
+5 10
+7 10
+5 9
+4 7
+6 9
+6 7
+0 1
+7 8
+1 7
+9 19
+7 8
+3 13
+10 18
+8 13
+3 13
+6 15
+2 3
+3 13
+1 8
+9 18
+4 9
+9 10
+10 18
+6 9
+8 17
+1 5
+3 8
+1 11
+7 12
+0 1
+4 5
+7 16
+6 11
+3 5
+5 14
+6 11
+3 10
+7 8
+8 11
+7 13
+10 17
+1 9
+7 14
+1 10
+3 12
+7 15
+1 4
+7 10
+0 5
+3 9
+5 12
+7 16
+5 6
+0 10
+0 1
+3 5
+0 7
+1 6
+4 5
+3 8
+1 8
+2 3
+10 20
+4 10
+7 11
+0 4
+4 6
+5 8
+10 17
+9 10
+0 3
+0 3
+5 9
+9 19
+8 14
+9 14
+4 11
+10 17
+7 9
+6 7
+10 19
+9 10
+3 8
+2 11
+4 14
+9 16
+2 8
+2 5
+5 11
+10 18
diff --git a/geom_bottleneck/tests/data/test_355_A b/geom_bottleneck/tests/data/test_355_A
new file mode 100644
index 0000000..48d49bd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_355_A
@@ -0,0 +1,100 @@
+6 9
+0 2
+2 6
+4 6
+5 7
+8 14
+10 15
+8 9
+6 14
+9 15
+6 12
+1 9
+4 7
+1 4
+3 8
+0 2
+6 16
+6 7
+5 7
+9 11
+10 20
+3 11
+9 13
+2 5
+0 3
+7 14
+7 8
+10 18
+5 7
+4 11
+0 10
+7 16
+1 8
+7 15
+3 4
+3 5
+8 13
+9 12
+5 10
+9 13
+5 11
+8 16
+3 4
+4 11
+9 18
+1 3
+10 14
+5 6
+5 10
+8 11
+8 10
+7 14
+3 6
+9 17
+0 3
+0 2
+2 11
+4 8
+0 6
+7 14
+10 11
+5 7
+9 18
+2 8
+4 5
+1 11
+0 9
+9 10
+3 12
+10 19
+3 7
+7 14
+1 3
+8 9
+9 13
+0 8
+5 11
+6 13
+5 10
+10 15
+8 15
+6 12
+2 6
+2 4
+4 9
+3 6
+9 10
+5 10
+10 15
+9 17
+5 10
+6 11
+2 8
+4 5
+5 15
+2 3
+7 14
+4 10
+4 11
+8 10
diff --git a/geom_bottleneck/tests/data/test_355_B b/geom_bottleneck/tests/data/test_355_B
new file mode 100644
index 0000000..cd9cec5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_355_B
@@ -0,0 +1,100 @@
+4 11
+9 14
+8 12
+3 5
+5 11
+7 15
+7 15
+1 10
+1 6
+4 13
+7 8
+5 7
+1 2
+3 13
+2 5
+4 10
+6 7
+10 11
+2 6
+1 10
+4 5
+10 18
+5 9
+0 3
+8 9
+5 13
+4 5
+1 2
+4 9
+1 11
+5 15
+9 11
+2 3
+0 1
+4 11
+6 10
+8 10
+2 8
+3 5
+4 8
+10 20
+0 5
+3 13
+2 8
+0 10
+2 7
+10 11
+0 2
+8 12
+1 10
+3 9
+2 8
+6 7
+10 17
+4 5
+2 7
+5 8
+10 20
+5 13
+10 19
+4 13
+1 9
+6 12
+3 4
+4 5
+8 18
+7 14
+1 10
+7 14
+5 9
+1 6
+6 14
+7 8
+5 12
+4 14
+1 7
+2 8
+6 11
+7 13
+3 10
+3 4
+3 11
+9 10
+1 11
+9 10
+2 8
+10 19
+3 6
+10 13
+4 5
+7 16
+2 7
+4 7
+9 15
+9 17
+4 8
+5 8
+4 8
+0 1
+10 17
diff --git a/geom_bottleneck/tests/data/test_356_A b/geom_bottleneck/tests/data/test_356_A
new file mode 100644
index 0000000..cb92f38
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_356_A
@@ -0,0 +1,100 @@
+7 12
+5 6
+6 13
+1 6
+9 10
+10 11
+2 9
+4 14
+4 11
+5 14
+4 13
+6 12
+7 13
+8 9
+5 11
+6 14
+9 13
+0 3
+7 11
+3 13
+2 5
+0 6
+1 8
+3 9
+8 17
+1 7
+10 19
+0 4
+8 18
+0 7
+1 3
+1 10
+0 6
+1 5
+3 11
+0 3
+7 13
+10 11
+2 4
+2 5
+4 11
+4 14
+0 6
+2 11
+6 11
+3 4
+2 6
+6 16
+6 8
+9 13
+8 12
+7 16
+9 16
+4 8
+1 8
+9 19
+7 13
+9 19
+5 6
+3 10
+2 10
+2 10
+9 11
+9 18
+7 13
+7 11
+5 8
+8 13
+8 10
+7 13
+7 17
+6 15
+5 8
+5 9
+5 9
+7 10
+4 10
+9 13
+6 16
+4 12
+5 6
+9 17
+1 2
+2 7
+5 11
+2 12
+10 16
+1 10
+10 19
+5 9
+10 19
+5 10
+10 13
+10 13
+6 7
+10 19
+2 10
+4 6
+3 5
+1 11
diff --git a/geom_bottleneck/tests/data/test_356_B b/geom_bottleneck/tests/data/test_356_B
new file mode 100644
index 0000000..365ed3f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_356_B
@@ -0,0 +1,100 @@
+6 11
+8 12
+7 8
+3 4
+9 12
+8 15
+4 5
+8 18
+2 3
+0 2
+8 11
+1 2
+2 8
+9 13
+6 10
+10 20
+0 3
+7 12
+7 11
+10 20
+6 10
+8 14
+5 6
+5 10
+8 12
+6 16
+1 11
+3 9
+7 17
+8 17
+5 11
+6 16
+5 9
+9 19
+7 11
+0 8
+8 17
+6 13
+0 5
+10 19
+3 8
+0 8
+0 9
+9 16
+8 12
+3 4
+2 3
+1 2
+6 11
+3 4
+2 4
+3 11
+4 11
+8 15
+7 9
+8 10
+4 14
+9 12
+9 16
+1 2
+7 13
+5 11
+1 8
+9 12
+0 5
+10 13
+9 11
+5 14
+0 9
+10 20
+7 8
+4 10
+0 3
+3 12
+8 17
+1 9
+5 9
+2 3
+1 8
+6 7
+3 4
+1 8
+7 10
+1 10
+0 1
+4 6
+8 11
+9 13
+5 6
+10 14
+10 16
+1 6
+5 9
+10 20
+7 13
+3 11
+0 3
+0 7
+6 12
+1 9
diff --git a/geom_bottleneck/tests/data/test_357_A b/geom_bottleneck/tests/data/test_357_A
new file mode 100644
index 0000000..de1e8eb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_357_A
@@ -0,0 +1,100 @@
+6 11
+4 11
+5 10
+8 9
+4 12
+10 17
+0 1
+9 15
+3 7
+6 13
+7 8
+3 4
+4 12
+8 9
+2 4
+10 20
+3 4
+6 16
+6 16
+4 12
+5 6
+9 12
+1 8
+6 14
+8 13
+2 10
+4 14
+3 5
+7 12
+2 7
+3 6
+1 2
+4 5
+7 13
+3 8
+6 9
+4 9
+6 7
+1 6
+8 10
+10 15
+3 6
+10 19
+8 14
+8 9
+4 7
+7 11
+4 11
+2 5
+0 7
+10 13
+4 6
+5 6
+7 16
+2 10
+8 18
+4 5
+9 10
+8 9
+8 14
+0 1
+5 15
+2 9
+6 7
+8 10
+10 14
+8 11
+5 8
+1 5
+9 15
+3 10
+5 10
+1 5
+4 6
+3 11
+6 7
+9 12
+5 11
+1 6
+6 14
+0 5
+3 12
+2 10
+7 12
+7 15
+1 11
+8 12
+3 7
+10 14
+8 9
+8 9
+9 10
+2 12
+3 4
+1 10
+9 15
+1 7
+10 14
+1 3
+10 14
diff --git a/geom_bottleneck/tests/data/test_357_B b/geom_bottleneck/tests/data/test_357_B
new file mode 100644
index 0000000..1c68b90
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_357_B
@@ -0,0 +1,100 @@
+8 10
+0 5
+6 15
+7 17
+6 14
+3 4
+3 5
+0 9
+1 5
+1 2
+2 3
+6 7
+9 10
+3 13
+9 13
+8 11
+5 7
+2 11
+7 9
+10 11
+9 11
+10 12
+4 10
+8 9
+4 12
+8 11
+5 14
+0 1
+8 9
+9 13
+6 14
+7 10
+10 17
+2 10
+9 17
+8 16
+1 3
+9 19
+0 1
+7 15
+2 8
+1 2
+0 1
+2 3
+7 8
+6 11
+10 20
+3 12
+6 11
+7 9
+5 8
+5 14
+3 12
+8 17
+10 15
+9 14
+8 9
+7 13
+9 12
+1 7
+5 11
+5 11
+6 8
+8 9
+5 6
+3 10
+3 4
+1 3
+3 10
+7 8
+1 9
+3 13
+3 10
+7 14
+4 14
+1 10
+0 10
+9 10
+10 15
+1 2
+8 10
+3 4
+2 4
+2 3
+7 13
+3 6
+8 14
+5 6
+3 11
+8 14
+0 5
+3 10
+7 11
+3 11
+10 19
+8 9
+0 1
+10 20
+7 8
+0 8
diff --git a/geom_bottleneck/tests/data/test_358_A b/geom_bottleneck/tests/data/test_358_A
new file mode 100644
index 0000000..2297dae
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_358_A
@@ -0,0 +1,100 @@
+7 12
+6 15
+1 4
+1 5
+7 9
+7 16
+0 2
+2 3
+6 12
+1 9
+9 12
+6 8
+8 9
+2 3
+6 11
+4 6
+7 11
+7 10
+8 9
+5 8
+6 8
+0 6
+9 18
+0 1
+7 14
+7 9
+7 14
+10 15
+3 10
+7 16
+8 15
+6 12
+7 9
+6 11
+3 8
+3 4
+4 6
+5 11
+10 16
+7 9
+2 8
+1 6
+8 9
+7 8
+7 14
+9 19
+4 9
+0 1
+3 4
+5 11
+2 12
+3 9
+9 16
+3 5
+0 8
+7 13
+7 17
+0 1
+4 12
+7 15
+8 11
+8 18
+4 8
+8 12
+8 18
+4 12
+4 10
+6 12
+9 14
+6 12
+9 11
+6 7
+0 5
+1 6
+8 17
+5 9
+5 14
+5 10
+9 19
+6 11
+3 4
+4 14
+1 11
+1 4
+10 19
+6 13
+3 4
+2 3
+2 7
+1 11
+5 11
+6 14
+1 6
+8 9
+7 8
+1 9
+2 8
+3 10
+10 17
+4 5
diff --git a/geom_bottleneck/tests/data/test_358_B b/geom_bottleneck/tests/data/test_358_B
new file mode 100644
index 0000000..e2d7d03
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_358_B
@@ -0,0 +1,100 @@
+6 7
+6 12
+10 13
+3 6
+9 10
+8 11
+3 13
+3 4
+10 16
+8 9
+3 5
+1 8
+4 5
+8 13
+9 18
+3 11
+3 13
+8 12
+7 11
+0 2
+4 7
+8 13
+7 16
+0 10
+1 9
+8 18
+1 9
+3 12
+1 10
+0 9
+9 16
+8 14
+0 7
+9 10
+0 3
+3 4
+6 8
+8 17
+9 16
+5 7
+0 2
+6 7
+1 6
+6 13
+4 5
+8 12
+9 14
+6 16
+9 14
+10 20
+4 14
+0 3
+9 18
+1 11
+6 13
+3 10
+9 13
+9 17
+6 16
+5 8
+3 4
+2 8
+9 15
+6 10
+8 18
+4 5
+3 5
+2 8
+3 11
+9 10
+3 11
+4 11
+9 12
+1 11
+0 10
+0 9
+8 12
+0 3
+9 14
+8 12
+6 14
+10 16
+3 8
+5 11
+1 6
+10 17
+0 2
+9 17
+8 10
+10 11
+9 13
+0 10
+5 11
+9 10
+4 5
+5 7
+4 14
+0 6
+0 1
+5 15
diff --git a/geom_bottleneck/tests/data/test_359_A b/geom_bottleneck/tests/data/test_359_A
new file mode 100644
index 0000000..6e990e4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_359_A
@@ -0,0 +1,100 @@
+7 8
+8 11
+7 8
+5 6
+4 5
+4 5
+7 8
+3 8
+2 8
+8 10
+2 3
+6 7
+0 5
+2 4
+8 17
+7 15
+8 9
+6 7
+10 11
+7 14
+9 10
+0 8
+3 7
+3 13
+3 12
+4 10
+9 17
+9 19
+5 14
+2 8
+9 19
+4 11
+2 12
+0 2
+4 12
+5 13
+1 3
+6 15
+2 12
+3 4
+0 10
+1 2
+9 19
+5 14
+3 7
+0 7
+10 12
+1 11
+1 8
+0 1
+5 11
+3 4
+1 4
+2 6
+8 12
+9 13
+10 13
+0 7
+9 18
+5 6
+2 4
+10 14
+7 8
+5 15
+9 10
+5 13
+0 9
+4 6
+2 3
+2 11
+9 15
+4 11
+1 7
+4 9
+6 14
+8 15
+3 11
+3 6
+8 13
+6 12
+7 9
+10 20
+9 19
+6 7
+2 12
+0 10
+10 13
+10 13
+5 15
+4 14
+9 15
+0 7
+7 13
+9 10
+5 10
+8 10
+8 17
+8 17
+0 9
+0 1
diff --git a/geom_bottleneck/tests/data/test_359_B b/geom_bottleneck/tests/data/test_359_B
new file mode 100644
index 0000000..97c1bfe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_359_B
@@ -0,0 +1,100 @@
+9 12
+2 11
+9 10
+10 12
+2 7
+4 7
+0 1
+9 11
+10 15
+4 12
+9 15
+9 18
+10 20
+7 8
+6 8
+10 20
+9 10
+8 18
+7 17
+3 4
+5 6
+1 8
+3 4
+9 18
+9 13
+5 15
+9 10
+5 11
+5 11
+9 11
+2 5
+9 16
+7 8
+0 4
+3 11
+1 7
+0 10
+5 12
+5 15
+2 3
+10 19
+9 12
+1 3
+5 11
+3 8
+9 15
+2 12
+9 16
+7 9
+1 2
+1 8
+4 13
+4 8
+0 1
+2 6
+1 6
+8 10
+6 12
+8 16
+8 17
+4 12
+9 12
+0 8
+3 10
+6 13
+4 5
+1 9
+5 9
+0 6
+6 7
+1 10
+7 17
+4 7
+5 15
+2 4
+9 14
+7 17
+5 13
+9 11
+0 7
+1 9
+3 8
+5 14
+1 7
+3 11
+1 10
+8 12
+10 11
+0 7
+7 14
+6 14
+0 10
+3 5
+10 18
+3 10
+6 7
+1 3
+1 3
+8 16
+7 16
diff --git a/geom_bottleneck/tests/data/test_360_A b/geom_bottleneck/tests/data/test_360_A
new file mode 100644
index 0000000..d271aaa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_360_A
@@ -0,0 +1,2 @@
+84 85
+52 129
diff --git a/geom_bottleneck/tests/data/test_360_B b/geom_bottleneck/tests/data/test_360_B
new file mode 100644
index 0000000..2408922
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_360_B
@@ -0,0 +1,2 @@
+74 97
+83 94
diff --git a/geom_bottleneck/tests/data/test_361_A b/geom_bottleneck/tests/data/test_361_A
new file mode 100644
index 0000000..b4eea74
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_361_A
@@ -0,0 +1,2 @@
+97 159
+60 73
diff --git a/geom_bottleneck/tests/data/test_361_B b/geom_bottleneck/tests/data/test_361_B
new file mode 100644
index 0000000..3680b00
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_361_B
@@ -0,0 +1,2 @@
+47 60
+95 167
diff --git a/geom_bottleneck/tests/data/test_362_A b/geom_bottleneck/tests/data/test_362_A
new file mode 100644
index 0000000..1c4803d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_362_A
@@ -0,0 +1,2 @@
+85 121
+2 61
diff --git a/geom_bottleneck/tests/data/test_362_B b/geom_bottleneck/tests/data/test_362_B
new file mode 100644
index 0000000..37fc7aa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_362_B
@@ -0,0 +1,2 @@
+41 67
+80 101
diff --git a/geom_bottleneck/tests/data/test_363_A b/geom_bottleneck/tests/data/test_363_A
new file mode 100644
index 0000000..909ac51
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_363_A
@@ -0,0 +1,2 @@
+77 159
+60 118
diff --git a/geom_bottleneck/tests/data/test_363_B b/geom_bottleneck/tests/data/test_363_B
new file mode 100644
index 0000000..4c76429
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_363_B
@@ -0,0 +1,2 @@
+52 73
+71 103
diff --git a/geom_bottleneck/tests/data/test_364_A b/geom_bottleneck/tests/data/test_364_A
new file mode 100644
index 0000000..a6e34b7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_364_A
@@ -0,0 +1,2 @@
+20 21
+70 88
diff --git a/geom_bottleneck/tests/data/test_364_B b/geom_bottleneck/tests/data/test_364_B
new file mode 100644
index 0000000..ba5c4bf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_364_B
@@ -0,0 +1,2 @@
+65 72
+81 164
diff --git a/geom_bottleneck/tests/data/test_365_A b/geom_bottleneck/tests/data/test_365_A
new file mode 100644
index 0000000..6c9d44c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_365_A
@@ -0,0 +1,2 @@
+9 64
+48 115
diff --git a/geom_bottleneck/tests/data/test_365_B b/geom_bottleneck/tests/data/test_365_B
new file mode 100644
index 0000000..f9e51a7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_365_B
@@ -0,0 +1,2 @@
+87 125
+74 132
diff --git a/geom_bottleneck/tests/data/test_366_A b/geom_bottleneck/tests/data/test_366_A
new file mode 100644
index 0000000..fbf146c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_366_A
@@ -0,0 +1,2 @@
+97 162
+27 43
diff --git a/geom_bottleneck/tests/data/test_366_B b/geom_bottleneck/tests/data/test_366_B
new file mode 100644
index 0000000..7385b5f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_366_B
@@ -0,0 +1,2 @@
+51 149
+65 126
diff --git a/geom_bottleneck/tests/data/test_367_A b/geom_bottleneck/tests/data/test_367_A
new file mode 100644
index 0000000..48190bb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_367_A
@@ -0,0 +1,2 @@
+36 104
+19 85
diff --git a/geom_bottleneck/tests/data/test_367_B b/geom_bottleneck/tests/data/test_367_B
new file mode 100644
index 0000000..7e26c08
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_367_B
@@ -0,0 +1,2 @@
+96 171
+17 21
diff --git a/geom_bottleneck/tests/data/test_368_A b/geom_bottleneck/tests/data/test_368_A
new file mode 100644
index 0000000..4b4767d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_368_A
@@ -0,0 +1,2 @@
+72 156
+84 129
diff --git a/geom_bottleneck/tests/data/test_368_B b/geom_bottleneck/tests/data/test_368_B
new file mode 100644
index 0000000..3c72417
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_368_B
@@ -0,0 +1,2 @@
+32 71
+88 129
diff --git a/geom_bottleneck/tests/data/test_369_A b/geom_bottleneck/tests/data/test_369_A
new file mode 100644
index 0000000..d8a01b6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_369_A
@@ -0,0 +1,2 @@
+56 128
+69 161
diff --git a/geom_bottleneck/tests/data/test_369_B b/geom_bottleneck/tests/data/test_369_B
new file mode 100644
index 0000000..9f7da60
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_369_B
@@ -0,0 +1,2 @@
+3 84
+92 119
diff --git a/geom_bottleneck/tests/data/test_370_A b/geom_bottleneck/tests/data/test_370_A
new file mode 100644
index 0000000..bdc8979
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_370_A
@@ -0,0 +1,2 @@
+49 140
+100 135
diff --git a/geom_bottleneck/tests/data/test_370_B b/geom_bottleneck/tests/data/test_370_B
new file mode 100644
index 0000000..e145eb4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_370_B
@@ -0,0 +1,2 @@
+28 51
+55 70
diff --git a/geom_bottleneck/tests/data/test_371_A b/geom_bottleneck/tests/data/test_371_A
new file mode 100644
index 0000000..208a164
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_371_A
@@ -0,0 +1,2 @@
+93 154
+54 138
diff --git a/geom_bottleneck/tests/data/test_371_B b/geom_bottleneck/tests/data/test_371_B
new file mode 100644
index 0000000..7a2fc8a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_371_B
@@ -0,0 +1,2 @@
+31 81
+88 143
diff --git a/geom_bottleneck/tests/data/test_372_A b/geom_bottleneck/tests/data/test_372_A
new file mode 100644
index 0000000..dd3597a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_372_A
@@ -0,0 +1,2 @@
+3 92
+88 127
diff --git a/geom_bottleneck/tests/data/test_372_B b/geom_bottleneck/tests/data/test_372_B
new file mode 100644
index 0000000..225c36e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_372_B
@@ -0,0 +1,2 @@
+6 95
+54 74
diff --git a/geom_bottleneck/tests/data/test_373_A b/geom_bottleneck/tests/data/test_373_A
new file mode 100644
index 0000000..0a84fd2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_373_A
@@ -0,0 +1,2 @@
+80 109
+36 96
diff --git a/geom_bottleneck/tests/data/test_373_B b/geom_bottleneck/tests/data/test_373_B
new file mode 100644
index 0000000..b790337
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_373_B
@@ -0,0 +1,2 @@
+64 106
+12 78
diff --git a/geom_bottleneck/tests/data/test_374_A b/geom_bottleneck/tests/data/test_374_A
new file mode 100644
index 0000000..0df06a4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_374_A
@@ -0,0 +1,2 @@
+91 158
+15 61
diff --git a/geom_bottleneck/tests/data/test_374_B b/geom_bottleneck/tests/data/test_374_B
new file mode 100644
index 0000000..7bd1bdd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_374_B
@@ -0,0 +1,2 @@
+85 155
+5 64
diff --git a/geom_bottleneck/tests/data/test_375_A b/geom_bottleneck/tests/data/test_375_A
new file mode 100644
index 0000000..77cd274
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_375_A
@@ -0,0 +1,2 @@
+77 154
+15 27
diff --git a/geom_bottleneck/tests/data/test_375_B b/geom_bottleneck/tests/data/test_375_B
new file mode 100644
index 0000000..db3c6ee
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_375_B
@@ -0,0 +1,2 @@
+81 144
+44 79
diff --git a/geom_bottleneck/tests/data/test_376_A b/geom_bottleneck/tests/data/test_376_A
new file mode 100644
index 0000000..aca7402
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_376_A
@@ -0,0 +1,2 @@
+20 47
+61 129
diff --git a/geom_bottleneck/tests/data/test_376_B b/geom_bottleneck/tests/data/test_376_B
new file mode 100644
index 0000000..5bbae78
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_376_B
@@ -0,0 +1,2 @@
+41 98
+76 137
diff --git a/geom_bottleneck/tests/data/test_377_A b/geom_bottleneck/tests/data/test_377_A
new file mode 100644
index 0000000..707adfd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_377_A
@@ -0,0 +1,2 @@
+91 123
+17 50
diff --git a/geom_bottleneck/tests/data/test_377_B b/geom_bottleneck/tests/data/test_377_B
new file mode 100644
index 0000000..afbe113
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_377_B
@@ -0,0 +1,2 @@
+45 116
+18 98
diff --git a/geom_bottleneck/tests/data/test_378_A b/geom_bottleneck/tests/data/test_378_A
new file mode 100644
index 0000000..7ac23e9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_378_A
@@ -0,0 +1,2 @@
+98 183
+5 58
diff --git a/geom_bottleneck/tests/data/test_378_B b/geom_bottleneck/tests/data/test_378_B
new file mode 100644
index 0000000..328b726
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_378_B
@@ -0,0 +1,2 @@
+58 154
+82 148
diff --git a/geom_bottleneck/tests/data/test_379_A b/geom_bottleneck/tests/data/test_379_A
new file mode 100644
index 0000000..0f57258
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_379_A
@@ -0,0 +1,2 @@
+73 133
+38 52
diff --git a/geom_bottleneck/tests/data/test_379_B b/geom_bottleneck/tests/data/test_379_B
new file mode 100644
index 0000000..45e35ba
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_379_B
@@ -0,0 +1,2 @@
+46 95
+50 110
diff --git a/geom_bottleneck/tests/data/test_380_A b/geom_bottleneck/tests/data/test_380_A
new file mode 100644
index 0000000..a6d1d31
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_380_A
@@ -0,0 +1,3 @@
+42 50
+67 107
+6 85
diff --git a/geom_bottleneck/tests/data/test_380_B b/geom_bottleneck/tests/data/test_380_B
new file mode 100644
index 0000000..023f533
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_380_B
@@ -0,0 +1,3 @@
+31 126
+78 132
+15 92
diff --git a/geom_bottleneck/tests/data/test_381_A b/geom_bottleneck/tests/data/test_381_A
new file mode 100644
index 0000000..0b5985d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_381_A
@@ -0,0 +1,3 @@
+7 43
+49 69
+94 119
diff --git a/geom_bottleneck/tests/data/test_381_B b/geom_bottleneck/tests/data/test_381_B
new file mode 100644
index 0000000..1f5ffef
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_381_B
@@ -0,0 +1,3 @@
+98 101
+89 113
+80 157
diff --git a/geom_bottleneck/tests/data/test_382_A b/geom_bottleneck/tests/data/test_382_A
new file mode 100644
index 0000000..e155629
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_382_A
@@ -0,0 +1,3 @@
+60 119
+40 77
+52 101
diff --git a/geom_bottleneck/tests/data/test_382_B b/geom_bottleneck/tests/data/test_382_B
new file mode 100644
index 0000000..5273c5f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_382_B
@@ -0,0 +1,3 @@
+9 47
+74 170
+88 93
diff --git a/geom_bottleneck/tests/data/test_383_A b/geom_bottleneck/tests/data/test_383_A
new file mode 100644
index 0000000..7579cf6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_383_A
@@ -0,0 +1,3 @@
+45 55
+12 57
+38 111
diff --git a/geom_bottleneck/tests/data/test_383_B b/geom_bottleneck/tests/data/test_383_B
new file mode 100644
index 0000000..050e76d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_383_B
@@ -0,0 +1,3 @@
+61 126
+14 94
+58 81
diff --git a/geom_bottleneck/tests/data/test_384_A b/geom_bottleneck/tests/data/test_384_A
new file mode 100644
index 0000000..5ba83b2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_384_A
@@ -0,0 +1,3 @@
+21 105
+7 55
+95 108
diff --git a/geom_bottleneck/tests/data/test_384_B b/geom_bottleneck/tests/data/test_384_B
new file mode 100644
index 0000000..f1a0074
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_384_B
@@ -0,0 +1,3 @@
+73 93
+20 52
+99 187
diff --git a/geom_bottleneck/tests/data/test_385_A b/geom_bottleneck/tests/data/test_385_A
new file mode 100644
index 0000000..195db5d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_385_A
@@ -0,0 +1,3 @@
+28 66
+4 72
+57 155
diff --git a/geom_bottleneck/tests/data/test_385_B b/geom_bottleneck/tests/data/test_385_B
new file mode 100644
index 0000000..9234688
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_385_B
@@ -0,0 +1,3 @@
+75 175
+55 79
+89 178
diff --git a/geom_bottleneck/tests/data/test_386_A b/geom_bottleneck/tests/data/test_386_A
new file mode 100644
index 0000000..7a9281c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_386_A
@@ -0,0 +1,3 @@
+65 87
+11 33
+17 45
diff --git a/geom_bottleneck/tests/data/test_386_B b/geom_bottleneck/tests/data/test_386_B
new file mode 100644
index 0000000..86a3caf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_386_B
@@ -0,0 +1,3 @@
+83 93
+13 46
+67 68
diff --git a/geom_bottleneck/tests/data/test_387_A b/geom_bottleneck/tests/data/test_387_A
new file mode 100644
index 0000000..ff92400
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_387_A
@@ -0,0 +1,3 @@
+33 68
+20 115
+21 25
diff --git a/geom_bottleneck/tests/data/test_387_B b/geom_bottleneck/tests/data/test_387_B
new file mode 100644
index 0000000..c2e44a4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_387_B
@@ -0,0 +1,3 @@
+44 45
+24 66
+6 45
diff --git a/geom_bottleneck/tests/data/test_388_A b/geom_bottleneck/tests/data/test_388_A
new file mode 100644
index 0000000..62b75be
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_388_A
@@ -0,0 +1,3 @@
+89 163
+54 98
+45 86
diff --git a/geom_bottleneck/tests/data/test_388_B b/geom_bottleneck/tests/data/test_388_B
new file mode 100644
index 0000000..025fdc6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_388_B
@@ -0,0 +1,3 @@
+83 139
+91 174
+74 93
diff --git a/geom_bottleneck/tests/data/test_389_A b/geom_bottleneck/tests/data/test_389_A
new file mode 100644
index 0000000..5fa0b26
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_389_A
@@ -0,0 +1,3 @@
+93 165
+72 168
+84 113
diff --git a/geom_bottleneck/tests/data/test_389_B b/geom_bottleneck/tests/data/test_389_B
new file mode 100644
index 0000000..7ebd7f3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_389_B
@@ -0,0 +1,3 @@
+88 140
+82 133
+69 110
diff --git a/geom_bottleneck/tests/data/test_390_A b/geom_bottleneck/tests/data/test_390_A
new file mode 100644
index 0000000..9f2c33d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_390_A
@@ -0,0 +1,3 @@
+90 139
+28 95
+66 131
diff --git a/geom_bottleneck/tests/data/test_390_B b/geom_bottleneck/tests/data/test_390_B
new file mode 100644
index 0000000..833af00
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_390_B
@@ -0,0 +1,3 @@
+79 116
+46 68
+39 102
diff --git a/geom_bottleneck/tests/data/test_391_A b/geom_bottleneck/tests/data/test_391_A
new file mode 100644
index 0000000..f353fda
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_391_A
@@ -0,0 +1,3 @@
+38 51
+43 103
+80 129
diff --git a/geom_bottleneck/tests/data/test_391_B b/geom_bottleneck/tests/data/test_391_B
new file mode 100644
index 0000000..edff01f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_391_B
@@ -0,0 +1,3 @@
+22 116
+2 92
+13 109
diff --git a/geom_bottleneck/tests/data/test_392_A b/geom_bottleneck/tests/data/test_392_A
new file mode 100644
index 0000000..317da32
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_392_A
@@ -0,0 +1,3 @@
+10 15
+48 118
+86 151
diff --git a/geom_bottleneck/tests/data/test_392_B b/geom_bottleneck/tests/data/test_392_B
new file mode 100644
index 0000000..c8cb61c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_392_B
@@ -0,0 +1,3 @@
+73 173
+27 46
+73 146
diff --git a/geom_bottleneck/tests/data/test_393_A b/geom_bottleneck/tests/data/test_393_A
new file mode 100644
index 0000000..10b537c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_393_A
@@ -0,0 +1,3 @@
+68 103
+89 121
+98 113
diff --git a/geom_bottleneck/tests/data/test_393_B b/geom_bottleneck/tests/data/test_393_B
new file mode 100644
index 0000000..24bc23a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_393_B
@@ -0,0 +1,3 @@
+68 100
+41 63
+12 41
diff --git a/geom_bottleneck/tests/data/test_394_A b/geom_bottleneck/tests/data/test_394_A
new file mode 100644
index 0000000..e626e4a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_394_A
@@ -0,0 +1,3 @@
+16 63
+5 58
+73 84
diff --git a/geom_bottleneck/tests/data/test_394_B b/geom_bottleneck/tests/data/test_394_B
new file mode 100644
index 0000000..24e086f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_394_B
@@ -0,0 +1,3 @@
+86 134
+41 102
+14 107
diff --git a/geom_bottleneck/tests/data/test_395_A b/geom_bottleneck/tests/data/test_395_A
new file mode 100644
index 0000000..fa5d9e1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_395_A
@@ -0,0 +1,3 @@
+76 152
+99 166
+91 110
diff --git a/geom_bottleneck/tests/data/test_395_B b/geom_bottleneck/tests/data/test_395_B
new file mode 100644
index 0000000..8cc1049
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_395_B
@@ -0,0 +1,3 @@
+42 109
+54 89
+51 113
diff --git a/geom_bottleneck/tests/data/test_396_A b/geom_bottleneck/tests/data/test_396_A
new file mode 100644
index 0000000..ab2ac42
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_396_A
@@ -0,0 +1,3 @@
+0 22
+81 139
+26 41
diff --git a/geom_bottleneck/tests/data/test_396_B b/geom_bottleneck/tests/data/test_396_B
new file mode 100644
index 0000000..dd8a3d4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_396_B
@@ -0,0 +1,3 @@
+76 123
+23 24
+23 118
diff --git a/geom_bottleneck/tests/data/test_397_A b/geom_bottleneck/tests/data/test_397_A
new file mode 100644
index 0000000..683bdca
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_397_A
@@ -0,0 +1,3 @@
+53 128
+82 162
+34 127
diff --git a/geom_bottleneck/tests/data/test_397_B b/geom_bottleneck/tests/data/test_397_B
new file mode 100644
index 0000000..a7b2d72
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_397_B
@@ -0,0 +1,3 @@
+49 95
+82 140
+21 92
diff --git a/geom_bottleneck/tests/data/test_398_A b/geom_bottleneck/tests/data/test_398_A
new file mode 100644
index 0000000..d802d50
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_398_A
@@ -0,0 +1,3 @@
+37 98
+42 125
+79 99
diff --git a/geom_bottleneck/tests/data/test_398_B b/geom_bottleneck/tests/data/test_398_B
new file mode 100644
index 0000000..9e5b5e1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_398_B
@@ -0,0 +1,3 @@
+48 91
+49 115
+65 158
diff --git a/geom_bottleneck/tests/data/test_399_A b/geom_bottleneck/tests/data/test_399_A
new file mode 100644
index 0000000..204dfdf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_399_A
@@ -0,0 +1,3 @@
+87 153
+22 28
+68 72
diff --git a/geom_bottleneck/tests/data/test_399_B b/geom_bottleneck/tests/data/test_399_B
new file mode 100644
index 0000000..58cb084
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_399_B
@@ -0,0 +1,3 @@
+33 93
+3 10
+21 32
diff --git a/geom_bottleneck/tests/data/test_400_A b/geom_bottleneck/tests/data/test_400_A
new file mode 100644
index 0000000..b867cf5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_400_A
@@ -0,0 +1,4 @@
+55 89
+35 85
+62 84
+84 151
diff --git a/geom_bottleneck/tests/data/test_400_B b/geom_bottleneck/tests/data/test_400_B
new file mode 100644
index 0000000..18df91d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_400_B
@@ -0,0 +1,4 @@
+37 89
+45 56
+4 79
+86 139
diff --git a/geom_bottleneck/tests/data/test_401_A b/geom_bottleneck/tests/data/test_401_A
new file mode 100644
index 0000000..0f03308
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_401_A
@@ -0,0 +1,4 @@
+15 34
+2 72
+14 50
+58 86
diff --git a/geom_bottleneck/tests/data/test_401_B b/geom_bottleneck/tests/data/test_401_B
new file mode 100644
index 0000000..b517be8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_401_B
@@ -0,0 +1,4 @@
+85 97
+24 54
+44 45
+75 171
diff --git a/geom_bottleneck/tests/data/test_402_A b/geom_bottleneck/tests/data/test_402_A
new file mode 100644
index 0000000..6a6f79f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_402_A
@@ -0,0 +1,4 @@
+97 167
+17 65
+82 157
+88 110
diff --git a/geom_bottleneck/tests/data/test_402_B b/geom_bottleneck/tests/data/test_402_B
new file mode 100644
index 0000000..6585f2b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_402_B
@@ -0,0 +1,4 @@
+69 87
+32 52
+71 92
+38 91
diff --git a/geom_bottleneck/tests/data/test_403_A b/geom_bottleneck/tests/data/test_403_A
new file mode 100644
index 0000000..8b5929a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_403_A
@@ -0,0 +1,4 @@
+75 84
+86 184
+46 132
+79 136
diff --git a/geom_bottleneck/tests/data/test_403_B b/geom_bottleneck/tests/data/test_403_B
new file mode 100644
index 0000000..71f089f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_403_B
@@ -0,0 +1,4 @@
+41 132
+44 72
+6 105
+91 187
diff --git a/geom_bottleneck/tests/data/test_404_A b/geom_bottleneck/tests/data/test_404_A
new file mode 100644
index 0000000..10add8e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_404_A
@@ -0,0 +1,4 @@
+28 95
+43 126
+75 105
+2 101
diff --git a/geom_bottleneck/tests/data/test_404_B b/geom_bottleneck/tests/data/test_404_B
new file mode 100644
index 0000000..b38a7a7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_404_B
@@ -0,0 +1,4 @@
+49 56
+50 116
+54 132
+55 94
diff --git a/geom_bottleneck/tests/data/test_405_A b/geom_bottleneck/tests/data/test_405_A
new file mode 100644
index 0000000..6cab1bd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_405_A
@@ -0,0 +1,4 @@
+53 120
+12 15
+80 83
+79 96
diff --git a/geom_bottleneck/tests/data/test_405_B b/geom_bottleneck/tests/data/test_405_B
new file mode 100644
index 0000000..96645aa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_405_B
@@ -0,0 +1,4 @@
+41 113
+17 18
+22 39
+89 135
diff --git a/geom_bottleneck/tests/data/test_406_A b/geom_bottleneck/tests/data/test_406_A
new file mode 100644
index 0000000..cf08c48
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_406_A
@@ -0,0 +1,4 @@
+88 168
+26 35
+96 126
+84 102
diff --git a/geom_bottleneck/tests/data/test_406_B b/geom_bottleneck/tests/data/test_406_B
new file mode 100644
index 0000000..b4ca0a0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_406_B
@@ -0,0 +1,4 @@
+81 173
+76 111
+2 15
+44 142
diff --git a/geom_bottleneck/tests/data/test_407_A b/geom_bottleneck/tests/data/test_407_A
new file mode 100644
index 0000000..2372aba
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_407_A
@@ -0,0 +1,4 @@
+55 92
+95 170
+51 149
+76 156
diff --git a/geom_bottleneck/tests/data/test_407_B b/geom_bottleneck/tests/data/test_407_B
new file mode 100644
index 0000000..bd43334
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_407_B
@@ -0,0 +1,4 @@
+55 100
+17 86
+37 66
+97 131
diff --git a/geom_bottleneck/tests/data/test_408_A b/geom_bottleneck/tests/data/test_408_A
new file mode 100644
index 0000000..91652d4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_408_A
@@ -0,0 +1,4 @@
+3 9
+50 134
+50 115
+30 82
diff --git a/geom_bottleneck/tests/data/test_408_B b/geom_bottleneck/tests/data/test_408_B
new file mode 100644
index 0000000..5f936a7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_408_B
@@ -0,0 +1,4 @@
+57 103
+83 173
+20 58
+74 93
diff --git a/geom_bottleneck/tests/data/test_409_A b/geom_bottleneck/tests/data/test_409_A
new file mode 100644
index 0000000..b4d01d2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_409_A
@@ -0,0 +1,4 @@
+87 144
+33 79
+44 110
+42 92
diff --git a/geom_bottleneck/tests/data/test_409_B b/geom_bottleneck/tests/data/test_409_B
new file mode 100644
index 0000000..4e15e41
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_409_B
@@ -0,0 +1,4 @@
+2 39
+82 170
+1 40
+50 115
diff --git a/geom_bottleneck/tests/data/test_410_A b/geom_bottleneck/tests/data/test_410_A
new file mode 100644
index 0000000..c02ab24
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_410_A
@@ -0,0 +1,4 @@
+15 80
+70 160
+52 144
+100 134
diff --git a/geom_bottleneck/tests/data/test_410_B b/geom_bottleneck/tests/data/test_410_B
new file mode 100644
index 0000000..d000095
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_410_B
@@ -0,0 +1,4 @@
+87 144
+43 91
+68 77
+79 172
diff --git a/geom_bottleneck/tests/data/test_411_A b/geom_bottleneck/tests/data/test_411_A
new file mode 100644
index 0000000..8130c4a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_411_A
@@ -0,0 +1,4 @@
+81 158
+50 142
+83 129
+74 85
diff --git a/geom_bottleneck/tests/data/test_411_B b/geom_bottleneck/tests/data/test_411_B
new file mode 100644
index 0000000..e53f61f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_411_B
@@ -0,0 +1,4 @@
+31 115
+57 108
+83 135
+2 26
diff --git a/geom_bottleneck/tests/data/test_412_A b/geom_bottleneck/tests/data/test_412_A
new file mode 100644
index 0000000..34a88b0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_412_A
@@ -0,0 +1,4 @@
+5 31
+39 91
+24 75
+93 128
diff --git a/geom_bottleneck/tests/data/test_412_B b/geom_bottleneck/tests/data/test_412_B
new file mode 100644
index 0000000..a163ece
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_412_B
@@ -0,0 +1,4 @@
+0 76
+97 144
+55 92
+1 67
diff --git a/geom_bottleneck/tests/data/test_413_A b/geom_bottleneck/tests/data/test_413_A
new file mode 100644
index 0000000..61d6f70
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_413_A
@@ -0,0 +1,4 @@
+44 111
+69 88
+8 80
+78 113
diff --git a/geom_bottleneck/tests/data/test_413_B b/geom_bottleneck/tests/data/test_413_B
new file mode 100644
index 0000000..5b9dc54
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_413_B
@@ -0,0 +1,4 @@
+87 159
+53 114
+70 136
+63 103
diff --git a/geom_bottleneck/tests/data/test_414_A b/geom_bottleneck/tests/data/test_414_A
new file mode 100644
index 0000000..933f1e4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_414_A
@@ -0,0 +1,4 @@
+39 44
+29 113
+85 158
+59 77
diff --git a/geom_bottleneck/tests/data/test_414_B b/geom_bottleneck/tests/data/test_414_B
new file mode 100644
index 0000000..b54a5fe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_414_B
@@ -0,0 +1,4 @@
+14 109
+5 90
+85 134
+60 88
diff --git a/geom_bottleneck/tests/data/test_415_A b/geom_bottleneck/tests/data/test_415_A
new file mode 100644
index 0000000..bbce6b8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_415_A
@@ -0,0 +1,4 @@
+23 70
+40 46
+21 109
+50 149
diff --git a/geom_bottleneck/tests/data/test_415_B b/geom_bottleneck/tests/data/test_415_B
new file mode 100644
index 0000000..3943a46
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_415_B
@@ -0,0 +1,4 @@
+14 80
+74 154
+50 70
+90 173
diff --git a/geom_bottleneck/tests/data/test_416_A b/geom_bottleneck/tests/data/test_416_A
new file mode 100644
index 0000000..c7a9a3d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_416_A
@@ -0,0 +1,4 @@
+23 53
+20 94
+89 105
+98 146
diff --git a/geom_bottleneck/tests/data/test_416_B b/geom_bottleneck/tests/data/test_416_B
new file mode 100644
index 0000000..6e8c430
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_416_B
@@ -0,0 +1,4 @@
+73 74
+62 124
+95 126
+62 141
diff --git a/geom_bottleneck/tests/data/test_417_A b/geom_bottleneck/tests/data/test_417_A
new file mode 100644
index 0000000..6e5688c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_417_A
@@ -0,0 +1,4 @@
+66 148
+86 117
+4 32
+95 146
diff --git a/geom_bottleneck/tests/data/test_417_B b/geom_bottleneck/tests/data/test_417_B
new file mode 100644
index 0000000..2bfa9c2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_417_B
@@ -0,0 +1,4 @@
+87 111
+23 122
+62 95
+12 22
diff --git a/geom_bottleneck/tests/data/test_418_A b/geom_bottleneck/tests/data/test_418_A
new file mode 100644
index 0000000..9ab98de
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_418_A
@@ -0,0 +1,4 @@
+29 122
+71 102
+70 109
+43 120
diff --git a/geom_bottleneck/tests/data/test_418_B b/geom_bottleneck/tests/data/test_418_B
new file mode 100644
index 0000000..f3231de
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_418_B
@@ -0,0 +1,4 @@
+45 121
+58 64
+57 105
+41 138
diff --git a/geom_bottleneck/tests/data/test_419_A b/geom_bottleneck/tests/data/test_419_A
new file mode 100644
index 0000000..825d191
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_419_A
@@ -0,0 +1,4 @@
+28 111
+100 167
+17 59
+10 38
diff --git a/geom_bottleneck/tests/data/test_419_B b/geom_bottleneck/tests/data/test_419_B
new file mode 100644
index 0000000..101be4f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_419_B
@@ -0,0 +1,4 @@
+63 99
+78 143
+67 150
+24 77
diff --git a/geom_bottleneck/tests/data/test_420_A b/geom_bottleneck/tests/data/test_420_A
new file mode 100644
index 0000000..455d829
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_420_A
@@ -0,0 +1,5 @@
+89 160
+26 36
+37 61
+95 137
+41 68
diff --git a/geom_bottleneck/tests/data/test_420_B b/geom_bottleneck/tests/data/test_420_B
new file mode 100644
index 0000000..27e1c6d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_420_B
@@ -0,0 +1,5 @@
+100 185
+31 112
+78 129
+49 143
+74 171
diff --git a/geom_bottleneck/tests/data/test_421_A b/geom_bottleneck/tests/data/test_421_A
new file mode 100644
index 0000000..c08ddf1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_421_A
@@ -0,0 +1,5 @@
+27 127
+2 101
+42 52
+5 81
+4 62
diff --git a/geom_bottleneck/tests/data/test_421_B b/geom_bottleneck/tests/data/test_421_B
new file mode 100644
index 0000000..37cbda8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_421_B
@@ -0,0 +1,5 @@
+27 40
+67 78
+50 122
+41 95
+1 63
diff --git a/geom_bottleneck/tests/data/test_422_A b/geom_bottleneck/tests/data/test_422_A
new file mode 100644
index 0000000..348a116
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_422_A
@@ -0,0 +1,5 @@
+54 143
+21 24
+96 180
+13 113
+93 134
diff --git a/geom_bottleneck/tests/data/test_422_B b/geom_bottleneck/tests/data/test_422_B
new file mode 100644
index 0000000..0f33ae9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_422_B
@@ -0,0 +1,5 @@
+5 18
+63 106
+29 94
+59 155
+66 155
diff --git a/geom_bottleneck/tests/data/test_423_A b/geom_bottleneck/tests/data/test_423_A
new file mode 100644
index 0000000..b3b448e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_423_A
@@ -0,0 +1,5 @@
+47 88
+80 138
+75 129
+2 90
+58 133
diff --git a/geom_bottleneck/tests/data/test_423_B b/geom_bottleneck/tests/data/test_423_B
new file mode 100644
index 0000000..873a875
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_423_B
@@ -0,0 +1,5 @@
+77 129
+99 174
+93 104
+71 93
+18 26
diff --git a/geom_bottleneck/tests/data/test_424_A b/geom_bottleneck/tests/data/test_424_A
new file mode 100644
index 0000000..ab20fc1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_424_A
@@ -0,0 +1,5 @@
+73 167
+50 133
+25 41
+46 87
+27 93
diff --git a/geom_bottleneck/tests/data/test_424_B b/geom_bottleneck/tests/data/test_424_B
new file mode 100644
index 0000000..a0f5059
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_424_B
@@ -0,0 +1,5 @@
+71 113
+54 63
+0 33
+27 127
+14 79
diff --git a/geom_bottleneck/tests/data/test_425_A b/geom_bottleneck/tests/data/test_425_A
new file mode 100644
index 0000000..7116974
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_425_A
@@ -0,0 +1,5 @@
+90 168
+44 63
+83 88
+80 81
+13 94
diff --git a/geom_bottleneck/tests/data/test_425_B b/geom_bottleneck/tests/data/test_425_B
new file mode 100644
index 0000000..6f1e713
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_425_B
@@ -0,0 +1,5 @@
+66 161
+99 137
+71 147
+58 80
+42 96
diff --git a/geom_bottleneck/tests/data/test_426_A b/geom_bottleneck/tests/data/test_426_A
new file mode 100644
index 0000000..6404cdd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_426_A
@@ -0,0 +1,5 @@
+90 161
+75 121
+54 111
+21 84
+73 106
diff --git a/geom_bottleneck/tests/data/test_426_B b/geom_bottleneck/tests/data/test_426_B
new file mode 100644
index 0000000..06fbc21
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_426_B
@@ -0,0 +1,5 @@
+82 109
+85 100
+26 92
+52 91
+23 83
diff --git a/geom_bottleneck/tests/data/test_427_A b/geom_bottleneck/tests/data/test_427_A
new file mode 100644
index 0000000..ab36b49
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_427_A
@@ -0,0 +1,5 @@
+15 28
+39 93
+1 43
+16 98
+81 167
diff --git a/geom_bottleneck/tests/data/test_427_B b/geom_bottleneck/tests/data/test_427_B
new file mode 100644
index 0000000..eb34e17
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_427_B
@@ -0,0 +1,5 @@
+57 70
+99 181
+26 81
+13 32
+95 153
diff --git a/geom_bottleneck/tests/data/test_428_A b/geom_bottleneck/tests/data/test_428_A
new file mode 100644
index 0000000..12957ab
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_428_A
@@ -0,0 +1,5 @@
+85 155
+86 173
+63 88
+50 84
+75 85
diff --git a/geom_bottleneck/tests/data/test_428_B b/geom_bottleneck/tests/data/test_428_B
new file mode 100644
index 0000000..b0fd1c4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_428_B
@@ -0,0 +1,5 @@
+70 113
+92 93
+57 103
+40 81
+9 47
diff --git a/geom_bottleneck/tests/data/test_429_A b/geom_bottleneck/tests/data/test_429_A
new file mode 100644
index 0000000..0cdda41
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_429_A
@@ -0,0 +1,5 @@
+90 165
+83 128
+5 28
+68 121
+1 67
diff --git a/geom_bottleneck/tests/data/test_429_B b/geom_bottleneck/tests/data/test_429_B
new file mode 100644
index 0000000..0180a92
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_429_B
@@ -0,0 +1,5 @@
+31 34
+88 147
+17 91
+46 138
+13 81
diff --git a/geom_bottleneck/tests/data/test_430_A b/geom_bottleneck/tests/data/test_430_A
new file mode 100644
index 0000000..03029c6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_430_A
@@ -0,0 +1,5 @@
+85 181
+93 118
+77 167
+39 110
+21 22
diff --git a/geom_bottleneck/tests/data/test_430_B b/geom_bottleneck/tests/data/test_430_B
new file mode 100644
index 0000000..9c58f1f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_430_B
@@ -0,0 +1,5 @@
+59 88
+28 29
+56 57
+3 73
+78 93
diff --git a/geom_bottleneck/tests/data/test_431_A b/geom_bottleneck/tests/data/test_431_A
new file mode 100644
index 0000000..272ec7d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_431_A
@@ -0,0 +1,5 @@
+26 28
+90 172
+46 118
+25 102
+78 141
diff --git a/geom_bottleneck/tests/data/test_431_B b/geom_bottleneck/tests/data/test_431_B
new file mode 100644
index 0000000..9ccc9d1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_431_B
@@ -0,0 +1,5 @@
+25 107
+61 128
+24 111
+47 48
+70 96
diff --git a/geom_bottleneck/tests/data/test_432_A b/geom_bottleneck/tests/data/test_432_A
new file mode 100644
index 0000000..91dbacb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_432_A
@@ -0,0 +1,5 @@
+53 78
+16 74
+6 106
+46 145
+33 41
diff --git a/geom_bottleneck/tests/data/test_432_B b/geom_bottleneck/tests/data/test_432_B
new file mode 100644
index 0000000..47afd85
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_432_B
@@ -0,0 +1,5 @@
+16 100
+70 119
+42 137
+94 164
+94 105
diff --git a/geom_bottleneck/tests/data/test_433_A b/geom_bottleneck/tests/data/test_433_A
new file mode 100644
index 0000000..1577e13
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_433_A
@@ -0,0 +1,5 @@
+30 97
+79 93
+42 97
+88 140
+85 131
diff --git a/geom_bottleneck/tests/data/test_433_B b/geom_bottleneck/tests/data/test_433_B
new file mode 100644
index 0000000..f63aea0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_433_B
@@ -0,0 +1,5 @@
+38 55
+29 129
+30 97
+11 43
+26 59
diff --git a/geom_bottleneck/tests/data/test_434_A b/geom_bottleneck/tests/data/test_434_A
new file mode 100644
index 0000000..5ef7655
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_434_A
@@ -0,0 +1,5 @@
+63 102
+32 38
+98 179
+89 136
+39 67
diff --git a/geom_bottleneck/tests/data/test_434_B b/geom_bottleneck/tests/data/test_434_B
new file mode 100644
index 0000000..a089420
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_434_B
@@ -0,0 +1,5 @@
+92 101
+9 11
+47 138
+95 176
+8 87
diff --git a/geom_bottleneck/tests/data/test_435_A b/geom_bottleneck/tests/data/test_435_A
new file mode 100644
index 0000000..9021906
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_435_A
@@ -0,0 +1,5 @@
+34 98
+33 80
+18 85
+36 100
+60 64
diff --git a/geom_bottleneck/tests/data/test_435_B b/geom_bottleneck/tests/data/test_435_B
new file mode 100644
index 0000000..225d87c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_435_B
@@ -0,0 +1,5 @@
+96 175
+12 80
+79 166
+28 88
+81 150
diff --git a/geom_bottleneck/tests/data/test_436_A b/geom_bottleneck/tests/data/test_436_A
new file mode 100644
index 0000000..4004cfe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_436_A
@@ -0,0 +1,5 @@
+59 101
+23 98
+15 108
+65 119
+67 91
diff --git a/geom_bottleneck/tests/data/test_436_B b/geom_bottleneck/tests/data/test_436_B
new file mode 100644
index 0000000..8fbd097
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_436_B
@@ -0,0 +1,5 @@
+23 86
+58 123
+18 62
+100 165
+6 105
diff --git a/geom_bottleneck/tests/data/test_437_A b/geom_bottleneck/tests/data/test_437_A
new file mode 100644
index 0000000..8210316
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_437_A
@@ -0,0 +1,5 @@
+10 38
+90 165
+35 122
+100 170
+62 93
diff --git a/geom_bottleneck/tests/data/test_437_B b/geom_bottleneck/tests/data/test_437_B
new file mode 100644
index 0000000..c7e55b3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_437_B
@@ -0,0 +1,5 @@
+27 73
+87 187
+78 176
+44 82
+58 77
diff --git a/geom_bottleneck/tests/data/test_438_A b/geom_bottleneck/tests/data/test_438_A
new file mode 100644
index 0000000..e2f48a4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_438_A
@@ -0,0 +1,5 @@
+14 74
+65 127
+21 51
+19 42
+58 96
diff --git a/geom_bottleneck/tests/data/test_438_B b/geom_bottleneck/tests/data/test_438_B
new file mode 100644
index 0000000..eb84689
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_438_B
@@ -0,0 +1,5 @@
+97 165
+49 116
+73 83
+6 8
+99 153
diff --git a/geom_bottleneck/tests/data/test_439_A b/geom_bottleneck/tests/data/test_439_A
new file mode 100644
index 0000000..fc36518
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_439_A
@@ -0,0 +1,5 @@
+66 120
+59 119
+40 56
+42 120
+48 140
diff --git a/geom_bottleneck/tests/data/test_439_B b/geom_bottleneck/tests/data/test_439_B
new file mode 100644
index 0000000..b9de5b7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_439_B
@@ -0,0 +1,5 @@
+25 94
+94 157
+64 156
+79 100
+28 98
diff --git a/geom_bottleneck/tests/data/test_440_A b/geom_bottleneck/tests/data/test_440_A
new file mode 100644
index 0000000..4f0cdc2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_440_A
@@ -0,0 +1,6 @@
+25 32
+90 153
+23 86
+4 29
+52 124
+17 75
diff --git a/geom_bottleneck/tests/data/test_440_B b/geom_bottleneck/tests/data/test_440_B
new file mode 100644
index 0000000..c06754e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_440_B
@@ -0,0 +1,6 @@
+47 132
+64 156
+96 149
+31 94
+86 94
+40 63
diff --git a/geom_bottleneck/tests/data/test_441_A b/geom_bottleneck/tests/data/test_441_A
new file mode 100644
index 0000000..f1d7779
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_441_A
@@ -0,0 +1,6 @@
+45 121
+61 95
+57 68
+10 82
+90 147
+80 179
diff --git a/geom_bottleneck/tests/data/test_441_B b/geom_bottleneck/tests/data/test_441_B
new file mode 100644
index 0000000..039c8db
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_441_B
@@ -0,0 +1,6 @@
+97 122
+44 109
+15 48
+49 106
+30 65
+66 70
diff --git a/geom_bottleneck/tests/data/test_442_A b/geom_bottleneck/tests/data/test_442_A
new file mode 100644
index 0000000..9a22bd2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_442_A
@@ -0,0 +1,6 @@
+44 47
+6 81
+66 163
+74 144
+66 135
+62 63
diff --git a/geom_bottleneck/tests/data/test_442_B b/geom_bottleneck/tests/data/test_442_B
new file mode 100644
index 0000000..9663228
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_442_B
@@ -0,0 +1,6 @@
+41 65
+52 109
+96 175
+80 93
+32 78
+97 124
diff --git a/geom_bottleneck/tests/data/test_443_A b/geom_bottleneck/tests/data/test_443_A
new file mode 100644
index 0000000..27d9885
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_443_A
@@ -0,0 +1,6 @@
+19 38
+86 142
+86 132
+32 118
+73 138
+25 83
diff --git a/geom_bottleneck/tests/data/test_443_B b/geom_bottleneck/tests/data/test_443_B
new file mode 100644
index 0000000..c084218
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_443_B
@@ -0,0 +1,6 @@
+78 165
+88 138
+5 29
+81 109
+4 96
+69 130
diff --git a/geom_bottleneck/tests/data/test_444_A b/geom_bottleneck/tests/data/test_444_A
new file mode 100644
index 0000000..86dfb79
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_444_A
@@ -0,0 +1,6 @@
+22 23
+59 111
+65 91
+0 56
+92 156
+67 69
diff --git a/geom_bottleneck/tests/data/test_444_B b/geom_bottleneck/tests/data/test_444_B
new file mode 100644
index 0000000..b7f54f9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_444_B
@@ -0,0 +1,6 @@
+20 39
+0 44
+34 84
+3 30
+70 96
+92 127
diff --git a/geom_bottleneck/tests/data/test_445_A b/geom_bottleneck/tests/data/test_445_A
new file mode 100644
index 0000000..6ec29f6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_445_A
@@ -0,0 +1,6 @@
+49 64
+36 102
+43 120
+98 194
+65 110
+49 89
diff --git a/geom_bottleneck/tests/data/test_445_B b/geom_bottleneck/tests/data/test_445_B
new file mode 100644
index 0000000..7e5ce8e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_445_B
@@ -0,0 +1,6 @@
+84 88
+42 132
+26 36
+11 91
+17 114
+37 70
diff --git a/geom_bottleneck/tests/data/test_446_A b/geom_bottleneck/tests/data/test_446_A
new file mode 100644
index 0000000..2e66159
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_446_A
@@ -0,0 +1,6 @@
+48 147
+86 146
+42 64
+39 111
+71 113
+59 63
diff --git a/geom_bottleneck/tests/data/test_446_B b/geom_bottleneck/tests/data/test_446_B
new file mode 100644
index 0000000..b4a4baa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_446_B
@@ -0,0 +1,6 @@
+14 15
+64 163
+23 41
+4 90
+3 23
+66 68
diff --git a/geom_bottleneck/tests/data/test_447_A b/geom_bottleneck/tests/data/test_447_A
new file mode 100644
index 0000000..adbca26
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_447_A
@@ -0,0 +1,6 @@
+91 119
+93 186
+11 53
+85 87
+8 50
+69 84
diff --git a/geom_bottleneck/tests/data/test_447_B b/geom_bottleneck/tests/data/test_447_B
new file mode 100644
index 0000000..c996a99
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_447_B
@@ -0,0 +1,6 @@
+67 71
+77 143
+48 103
+80 121
+73 107
+18 36
diff --git a/geom_bottleneck/tests/data/test_448_A b/geom_bottleneck/tests/data/test_448_A
new file mode 100644
index 0000000..3b1d2ac
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_448_A
@@ -0,0 +1,6 @@
+99 127
+80 81
+72 138
+40 123
+76 120
+13 52
diff --git a/geom_bottleneck/tests/data/test_448_B b/geom_bottleneck/tests/data/test_448_B
new file mode 100644
index 0000000..358c96b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_448_B
@@ -0,0 +1,6 @@
+94 105
+31 105
+2 50
+91 132
+63 86
+81 116
diff --git a/geom_bottleneck/tests/data/test_449_A b/geom_bottleneck/tests/data/test_449_A
new file mode 100644
index 0000000..1b9fdde
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_449_A
@@ -0,0 +1,6 @@
+99 164
+24 78
+75 119
+62 129
+93 117
+34 124
diff --git a/geom_bottleneck/tests/data/test_449_B b/geom_bottleneck/tests/data/test_449_B
new file mode 100644
index 0000000..39ca7bf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_449_B
@@ -0,0 +1,6 @@
+5 101
+53 86
+58 92
+99 198
+48 57
+34 102
diff --git a/geom_bottleneck/tests/data/test_450_A b/geom_bottleneck/tests/data/test_450_A
new file mode 100644
index 0000000..c97d1bd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_450_A
@@ -0,0 +1,6 @@
+98 112
+27 55
+36 69
+5 32
+36 85
+24 90
diff --git a/geom_bottleneck/tests/data/test_450_B b/geom_bottleneck/tests/data/test_450_B
new file mode 100644
index 0000000..038d497
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_450_B
@@ -0,0 +1,6 @@
+66 156
+74 158
+85 136
+4 53
+61 93
+13 37
diff --git a/geom_bottleneck/tests/data/test_451_A b/geom_bottleneck/tests/data/test_451_A
new file mode 100644
index 0000000..1c77ff4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_451_A
@@ -0,0 +1,6 @@
+83 99
+42 129
+82 117
+35 132
+1 101
+53 115
diff --git a/geom_bottleneck/tests/data/test_451_B b/geom_bottleneck/tests/data/test_451_B
new file mode 100644
index 0000000..37c9b78
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_451_B
@@ -0,0 +1,6 @@
+18 102
+62 111
+17 40
+78 135
+20 23
+69 77
diff --git a/geom_bottleneck/tests/data/test_452_A b/geom_bottleneck/tests/data/test_452_A
new file mode 100644
index 0000000..24159ea
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_452_A
@@ -0,0 +1,6 @@
+12 65
+2 42
+61 93
+22 31
+66 139
+44 106
diff --git a/geom_bottleneck/tests/data/test_452_B b/geom_bottleneck/tests/data/test_452_B
new file mode 100644
index 0000000..602fb45
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_452_B
@@ -0,0 +1,6 @@
+88 156
+1 91
+7 42
+83 94
+50 133
+82 146
diff --git a/geom_bottleneck/tests/data/test_453_A b/geom_bottleneck/tests/data/test_453_A
new file mode 100644
index 0000000..aa29541
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_453_A
@@ -0,0 +1,6 @@
+39 50
+28 76
+83 87
+27 38
+85 120
+57 78
diff --git a/geom_bottleneck/tests/data/test_453_B b/geom_bottleneck/tests/data/test_453_B
new file mode 100644
index 0000000..7cce047
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_453_B
@@ -0,0 +1,6 @@
+59 106
+28 69
+91 189
+43 57
+32 33
+75 156
diff --git a/geom_bottleneck/tests/data/test_454_A b/geom_bottleneck/tests/data/test_454_A
new file mode 100644
index 0000000..3e5e41b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_454_A
@@ -0,0 +1,6 @@
+32 39
+6 50
+72 153
+38 115
+23 45
+18 34
diff --git a/geom_bottleneck/tests/data/test_454_B b/geom_bottleneck/tests/data/test_454_B
new file mode 100644
index 0000000..e5e2305
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_454_B
@@ -0,0 +1,6 @@
+83 180
+76 118
+76 114
+95 192
+19 53
+42 81
diff --git a/geom_bottleneck/tests/data/test_455_A b/geom_bottleneck/tests/data/test_455_A
new file mode 100644
index 0000000..d06d256
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_455_A
@@ -0,0 +1,6 @@
+80 110
+12 104
+89 151
+71 168
+91 95
+27 55
diff --git a/geom_bottleneck/tests/data/test_455_B b/geom_bottleneck/tests/data/test_455_B
new file mode 100644
index 0000000..afdab0b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_455_B
@@ -0,0 +1,6 @@
+68 166
+33 38
+66 158
+72 93
+66 96
+82 88
diff --git a/geom_bottleneck/tests/data/test_456_A b/geom_bottleneck/tests/data/test_456_A
new file mode 100644
index 0000000..7a30bf3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_456_A
@@ -0,0 +1,6 @@
+72 114
+8 79
+19 50
+72 134
+94 108
+5 24
diff --git a/geom_bottleneck/tests/data/test_456_B b/geom_bottleneck/tests/data/test_456_B
new file mode 100644
index 0000000..a1a1329
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_456_B
@@ -0,0 +1,6 @@
+86 114
+38 105
+46 98
+20 90
+98 118
+52 142
diff --git a/geom_bottleneck/tests/data/test_457_A b/geom_bottleneck/tests/data/test_457_A
new file mode 100644
index 0000000..d5339ec
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_457_A
@@ -0,0 +1,6 @@
+70 109
+61 79
+55 152
+88 187
+64 136
+71 110
diff --git a/geom_bottleneck/tests/data/test_457_B b/geom_bottleneck/tests/data/test_457_B
new file mode 100644
index 0000000..e96c110
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_457_B
@@ -0,0 +1,6 @@
+57 128
+47 82
+87 96
+97 132
+23 41
+6 104
diff --git a/geom_bottleneck/tests/data/test_458_A b/geom_bottleneck/tests/data/test_458_A
new file mode 100644
index 0000000..a9287b2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_458_A
@@ -0,0 +1,6 @@
+43 63
+79 80
+77 142
+50 116
+43 46
+45 139
diff --git a/geom_bottleneck/tests/data/test_458_B b/geom_bottleneck/tests/data/test_458_B
new file mode 100644
index 0000000..63b7c63
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_458_B
@@ -0,0 +1,6 @@
+69 79
+9 64
+29 115
+33 87
+5 100
+24 71
diff --git a/geom_bottleneck/tests/data/test_459_A b/geom_bottleneck/tests/data/test_459_A
new file mode 100644
index 0000000..f8a82f8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_459_A
@@ -0,0 +1,6 @@
+90 94
+75 107
+80 88
+35 98
+53 84
+78 93
diff --git a/geom_bottleneck/tests/data/test_459_B b/geom_bottleneck/tests/data/test_459_B
new file mode 100644
index 0000000..dc645ee
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_459_B
@@ -0,0 +1,6 @@
+95 101
+29 59
+32 77
+17 19
+92 108
+6 19
diff --git a/geom_bottleneck/tests/data/test_460_A b/geom_bottleneck/tests/data/test_460_A
new file mode 100644
index 0000000..000c14e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_460_A
@@ -0,0 +1,7 @@
+88 127
+65 145
+59 149
+69 152
+61 146
+28 90
+21 104
diff --git a/geom_bottleneck/tests/data/test_460_B b/geom_bottleneck/tests/data/test_460_B
new file mode 100644
index 0000000..4a7d4a3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_460_B
@@ -0,0 +1,7 @@
+47 131
+59 153
+24 95
+63 96
+6 102
+91 98
+31 118
diff --git a/geom_bottleneck/tests/data/test_461_A b/geom_bottleneck/tests/data/test_461_A
new file mode 100644
index 0000000..aaebf2d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_461_A
@@ -0,0 +1,7 @@
+57 67
+75 82
+63 88
+57 139
+67 103
+15 68
+100 117
diff --git a/geom_bottleneck/tests/data/test_461_B b/geom_bottleneck/tests/data/test_461_B
new file mode 100644
index 0000000..183fa51
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_461_B
@@ -0,0 +1,7 @@
+47 127
+9 35
+14 75
+29 92
+76 171
+9 56
+56 86
diff --git a/geom_bottleneck/tests/data/test_462_A b/geom_bottleneck/tests/data/test_462_A
new file mode 100644
index 0000000..df1936d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_462_A
@@ -0,0 +1,7 @@
+0 90
+50 113
+73 149
+86 105
+20 105
+14 75
+41 115
diff --git a/geom_bottleneck/tests/data/test_462_B b/geom_bottleneck/tests/data/test_462_B
new file mode 100644
index 0000000..5be3bf0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_462_B
@@ -0,0 +1,7 @@
+88 133
+47 100
+27 48
+54 153
+91 116
+90 150
+0 82
diff --git a/geom_bottleneck/tests/data/test_463_A b/geom_bottleneck/tests/data/test_463_A
new file mode 100644
index 0000000..c8776fe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_463_A
@@ -0,0 +1,7 @@
+34 67
+34 92
+53 99
+64 155
+92 157
+16 55
+75 156
diff --git a/geom_bottleneck/tests/data/test_463_B b/geom_bottleneck/tests/data/test_463_B
new file mode 100644
index 0000000..a9f1273
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_463_B
@@ -0,0 +1,7 @@
+20 72
+99 146
+70 158
+4 38
+92 102
+20 32
+47 135
diff --git a/geom_bottleneck/tests/data/test_464_A b/geom_bottleneck/tests/data/test_464_A
new file mode 100644
index 0000000..98ff6a9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_464_A
@@ -0,0 +1,7 @@
+69 149
+52 115
+32 82
+22 60
+55 56
+80 116
+62 72
diff --git a/geom_bottleneck/tests/data/test_464_B b/geom_bottleneck/tests/data/test_464_B
new file mode 100644
index 0000000..0e57b03
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_464_B
@@ -0,0 +1,7 @@
+81 121
+17 86
+57 141
+13 15
+66 80
+66 107
+76 80
diff --git a/geom_bottleneck/tests/data/test_465_A b/geom_bottleneck/tests/data/test_465_A
new file mode 100644
index 0000000..b164c7a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_465_A
@@ -0,0 +1,7 @@
+8 34
+48 141
+61 122
+56 130
+58 158
+51 81
+32 100
diff --git a/geom_bottleneck/tests/data/test_465_B b/geom_bottleneck/tests/data/test_465_B
new file mode 100644
index 0000000..610a2a5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_465_B
@@ -0,0 +1,7 @@
+8 89
+62 160
+27 109
+94 112
+59 140
+51 69
+52 136
diff --git a/geom_bottleneck/tests/data/test_466_A b/geom_bottleneck/tests/data/test_466_A
new file mode 100644
index 0000000..3c0052c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_466_A
@@ -0,0 +1,7 @@
+54 113
+15 32
+94 138
+42 132
+84 136
+81 135
+4 62
diff --git a/geom_bottleneck/tests/data/test_466_B b/geom_bottleneck/tests/data/test_466_B
new file mode 100644
index 0000000..e8c16f8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_466_B
@@ -0,0 +1,7 @@
+51 116
+81 147
+11 51
+76 148
+90 100
+3 100
+62 138
diff --git a/geom_bottleneck/tests/data/test_467_A b/geom_bottleneck/tests/data/test_467_A
new file mode 100644
index 0000000..69280bb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_467_A
@@ -0,0 +1,7 @@
+40 43
+46 99
+90 137
+93 122
+38 45
+87 134
+48 146
diff --git a/geom_bottleneck/tests/data/test_467_B b/geom_bottleneck/tests/data/test_467_B
new file mode 100644
index 0000000..c857912
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_467_B
@@ -0,0 +1,7 @@
+22 23
+57 100
+84 162
+30 92
+65 75
+97 133
+47 117
diff --git a/geom_bottleneck/tests/data/test_468_A b/geom_bottleneck/tests/data/test_468_A
new file mode 100644
index 0000000..9f92c43
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_468_A
@@ -0,0 +1,7 @@
+93 128
+20 66
+72 134
+97 111
+64 99
+17 47
+12 58
diff --git a/geom_bottleneck/tests/data/test_468_B b/geom_bottleneck/tests/data/test_468_B
new file mode 100644
index 0000000..b20cdf4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_468_B
@@ -0,0 +1,7 @@
+84 156
+42 142
+28 43
+83 179
+15 81
+51 113
+56 136
diff --git a/geom_bottleneck/tests/data/test_469_A b/geom_bottleneck/tests/data/test_469_A
new file mode 100644
index 0000000..842bb69
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_469_A
@@ -0,0 +1,7 @@
+60 115
+77 137
+40 98
+11 59
+16 29
+60 98
+86 149
diff --git a/geom_bottleneck/tests/data/test_469_B b/geom_bottleneck/tests/data/test_469_B
new file mode 100644
index 0000000..e6de4fe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_469_B
@@ -0,0 +1,7 @@
+28 101
+15 65
+55 67
+40 73
+14 69
+87 117
+83 137
diff --git a/geom_bottleneck/tests/data/test_470_A b/geom_bottleneck/tests/data/test_470_A
new file mode 100644
index 0000000..5f2fd6b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_470_A
@@ -0,0 +1,7 @@
+1 17
+80 137
+31 128
+78 83
+95 188
+94 150
+7 103
diff --git a/geom_bottleneck/tests/data/test_470_B b/geom_bottleneck/tests/data/test_470_B
new file mode 100644
index 0000000..5db84e8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_470_B
@@ -0,0 +1,7 @@
+85 178
+3 52
+99 189
+95 115
+98 183
+0 60
+22 120
diff --git a/geom_bottleneck/tests/data/test_471_A b/geom_bottleneck/tests/data/test_471_A
new file mode 100644
index 0000000..e88e5ff
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_471_A
@@ -0,0 +1,7 @@
+58 107
+6 86
+44 47
+12 97
+48 133
+89 111
+94 155
diff --git a/geom_bottleneck/tests/data/test_471_B b/geom_bottleneck/tests/data/test_471_B
new file mode 100644
index 0000000..26065c0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_471_B
@@ -0,0 +1,7 @@
+51 115
+25 51
+77 165
+21 116
+19 21
+11 77
+5 9
diff --git a/geom_bottleneck/tests/data/test_472_A b/geom_bottleneck/tests/data/test_472_A
new file mode 100644
index 0000000..bd2ec1a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_472_A
@@ -0,0 +1,7 @@
+68 75
+12 88
+15 84
+33 120
+76 160
+23 56
+16 116
diff --git a/geom_bottleneck/tests/data/test_472_B b/geom_bottleneck/tests/data/test_472_B
new file mode 100644
index 0000000..3914a18
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_472_B
@@ -0,0 +1,7 @@
+75 129
+58 68
+36 119
+11 59
+25 42
+50 65
+12 28
diff --git a/geom_bottleneck/tests/data/test_473_A b/geom_bottleneck/tests/data/test_473_A
new file mode 100644
index 0000000..d8e4ed1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_473_A
@@ -0,0 +1,7 @@
+86 119
+34 71
+91 182
+97 170
+73 104
+71 160
+26 120
diff --git a/geom_bottleneck/tests/data/test_473_B b/geom_bottleneck/tests/data/test_473_B
new file mode 100644
index 0000000..1ce2c2f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_473_B
@@ -0,0 +1,7 @@
+53 111
+78 111
+99 134
+42 70
+70 84
+52 85
+55 154
diff --git a/geom_bottleneck/tests/data/test_474_A b/geom_bottleneck/tests/data/test_474_A
new file mode 100644
index 0000000..30c9ad1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_474_A
@@ -0,0 +1,7 @@
+84 139
+74 167
+0 76
+6 33
+73 165
+80 173
+28 38
diff --git a/geom_bottleneck/tests/data/test_474_B b/geom_bottleneck/tests/data/test_474_B
new file mode 100644
index 0000000..35c507a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_474_B
@@ -0,0 +1,7 @@
+76 134
+38 118
+37 87
+61 110
+59 79
+67 75
+45 100
diff --git a/geom_bottleneck/tests/data/test_475_A b/geom_bottleneck/tests/data/test_475_A
new file mode 100644
index 0000000..05023db
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_475_A
@@ -0,0 +1,7 @@
+17 92
+69 112
+37 83
+62 116
+69 85
+63 92
+31 55
diff --git a/geom_bottleneck/tests/data/test_475_B b/geom_bottleneck/tests/data/test_475_B
new file mode 100644
index 0000000..0fcc2d0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_475_B
@@ -0,0 +1,7 @@
+18 105
+66 104
+36 67
+50 61
+44 118
+75 99
+41 49
diff --git a/geom_bottleneck/tests/data/test_476_A b/geom_bottleneck/tests/data/test_476_A
new file mode 100644
index 0000000..0c4ede1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_476_A
@@ -0,0 +1,7 @@
+14 109
+64 142
+98 152
+34 115
+47 100
+85 99
+0 7
diff --git a/geom_bottleneck/tests/data/test_476_B b/geom_bottleneck/tests/data/test_476_B
new file mode 100644
index 0000000..ae68bae
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_476_B
@@ -0,0 +1,7 @@
+99 172
+23 91
+0 80
+89 102
+21 56
+86 169
+48 116
diff --git a/geom_bottleneck/tests/data/test_477_A b/geom_bottleneck/tests/data/test_477_A
new file mode 100644
index 0000000..719e1b7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_477_A
@@ -0,0 +1,7 @@
+2 87
+9 51
+78 81
+26 122
+54 126
+66 128
+88 139
diff --git a/geom_bottleneck/tests/data/test_477_B b/geom_bottleneck/tests/data/test_477_B
new file mode 100644
index 0000000..6c2e706
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_477_B
@@ -0,0 +1,7 @@
+9 55
+60 64
+26 57
+6 74
+70 103
+84 87
+35 56
diff --git a/geom_bottleneck/tests/data/test_478_A b/geom_bottleneck/tests/data/test_478_A
new file mode 100644
index 0000000..61b09a8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_478_A
@@ -0,0 +1,7 @@
+76 114
+41 48
+16 34
+28 80
+100 119
+57 64
+53 104
diff --git a/geom_bottleneck/tests/data/test_478_B b/geom_bottleneck/tests/data/test_478_B
new file mode 100644
index 0000000..a302122
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_478_B
@@ -0,0 +1,7 @@
+81 179
+64 112
+9 49
+64 132
+15 81
+97 137
+17 39
diff --git a/geom_bottleneck/tests/data/test_479_A b/geom_bottleneck/tests/data/test_479_A
new file mode 100644
index 0000000..b956a54
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_479_A
@@ -0,0 +1,7 @@
+31 104
+56 83
+21 87
+76 135
+63 126
+89 134
+74 159
diff --git a/geom_bottleneck/tests/data/test_479_B b/geom_bottleneck/tests/data/test_479_B
new file mode 100644
index 0000000..10d8948
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_479_B
@@ -0,0 +1,7 @@
+98 131
+8 98
+96 101
+78 146
+6 35
+88 116
+82 88
diff --git a/geom_bottleneck/tests/data/test_480_A b/geom_bottleneck/tests/data/test_480_A
new file mode 100644
index 0000000..6ad5182
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_480_A
@@ -0,0 +1,8 @@
+75 137
+100 185
+65 142
+7 8
+25 44
+39 108
+94 99
+6 78
diff --git a/geom_bottleneck/tests/data/test_480_B b/geom_bottleneck/tests/data/test_480_B
new file mode 100644
index 0000000..246f278
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_480_B
@@ -0,0 +1,8 @@
+80 156
+94 180
+55 143
+39 93
+72 170
+76 176
+72 160
+36 59
diff --git a/geom_bottleneck/tests/data/test_481_A b/geom_bottleneck/tests/data/test_481_A
new file mode 100644
index 0000000..8e414ab
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_481_A
@@ -0,0 +1,8 @@
+4 61
+27 91
+83 153
+1 25
+25 33
+71 76
+5 103
+8 34
diff --git a/geom_bottleneck/tests/data/test_481_B b/geom_bottleneck/tests/data/test_481_B
new file mode 100644
index 0000000..5596312
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_481_B
@@ -0,0 +1,8 @@
+59 143
+99 148
+21 32
+60 71
+16 51
+78 90
+11 77
+56 145
diff --git a/geom_bottleneck/tests/data/test_482_A b/geom_bottleneck/tests/data/test_482_A
new file mode 100644
index 0000000..b40bc32
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_482_A
@@ -0,0 +1,8 @@
+56 139
+4 18
+16 47
+99 186
+16 63
+44 50
+99 187
+30 85
diff --git a/geom_bottleneck/tests/data/test_482_B b/geom_bottleneck/tests/data/test_482_B
new file mode 100644
index 0000000..04b23b5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_482_B
@@ -0,0 +1,8 @@
+84 162
+22 52
+12 98
+59 106
+86 155
+93 108
+75 119
+18 20
diff --git a/geom_bottleneck/tests/data/test_483_A b/geom_bottleneck/tests/data/test_483_A
new file mode 100644
index 0000000..7ef0f99
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_483_A
@@ -0,0 +1,8 @@
+10 13
+53 81
+57 151
+81 148
+91 132
+9 89
+11 65
+29 85
diff --git a/geom_bottleneck/tests/data/test_483_B b/geom_bottleneck/tests/data/test_483_B
new file mode 100644
index 0000000..eabdee1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_483_B
@@ -0,0 +1,8 @@
+87 187
+79 111
+41 93
+54 76
+27 86
+97 150
+97 185
+36 37
diff --git a/geom_bottleneck/tests/data/test_484_A b/geom_bottleneck/tests/data/test_484_A
new file mode 100644
index 0000000..11fa5dd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_484_A
@@ -0,0 +1,8 @@
+58 147
+24 70
+83 171
+78 91
+55 86
+83 168
+40 125
+75 121
diff --git a/geom_bottleneck/tests/data/test_484_B b/geom_bottleneck/tests/data/test_484_B
new file mode 100644
index 0000000..2dda740
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_484_B
@@ -0,0 +1,8 @@
+55 66
+48 100
+69 123
+84 152
+56 155
+87 99
+83 167
+39 49
diff --git a/geom_bottleneck/tests/data/test_485_A b/geom_bottleneck/tests/data/test_485_A
new file mode 100644
index 0000000..bd500dd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_485_A
@@ -0,0 +1,8 @@
+64 81
+52 69
+62 74
+3 79
+24 117
+81 133
+5 37
+53 90
diff --git a/geom_bottleneck/tests/data/test_485_B b/geom_bottleneck/tests/data/test_485_B
new file mode 100644
index 0000000..a117670
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_485_B
@@ -0,0 +1,8 @@
+80 97
+10 69
+49 123
+28 123
+92 135
+19 107
+7 53
+99 165
diff --git a/geom_bottleneck/tests/data/test_486_A b/geom_bottleneck/tests/data/test_486_A
new file mode 100644
index 0000000..4dcc3ca
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_486_A
@@ -0,0 +1,8 @@
+76 162
+58 117
+91 152
+96 137
+45 49
+64 156
+35 64
+42 114
diff --git a/geom_bottleneck/tests/data/test_486_B b/geom_bottleneck/tests/data/test_486_B
new file mode 100644
index 0000000..c808dc5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_486_B
@@ -0,0 +1,8 @@
+35 95
+0 78
+61 78
+100 110
+100 106
+56 91
+97 133
+87 176
diff --git a/geom_bottleneck/tests/data/test_487_A b/geom_bottleneck/tests/data/test_487_A
new file mode 100644
index 0000000..7250b20
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_487_A
@@ -0,0 +1,8 @@
+78 114
+95 110
+22 47
+95 181
+6 76
+47 89
+10 27
+69 102
diff --git a/geom_bottleneck/tests/data/test_487_B b/geom_bottleneck/tests/data/test_487_B
new file mode 100644
index 0000000..b0a4119
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_487_B
@@ -0,0 +1,8 @@
+31 113
+71 115
+10 97
+97 101
+30 61
+79 157
+56 89
+96 184
diff --git a/geom_bottleneck/tests/data/test_488_A b/geom_bottleneck/tests/data/test_488_A
new file mode 100644
index 0000000..92f19ab
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_488_A
@@ -0,0 +1,8 @@
+7 28
+32 59
+64 84
+71 156
+89 166
+67 154
+54 89
+49 78
diff --git a/geom_bottleneck/tests/data/test_488_B b/geom_bottleneck/tests/data/test_488_B
new file mode 100644
index 0000000..712480d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_488_B
@@ -0,0 +1,8 @@
+54 128
+20 59
+64 135
+80 106
+35 88
+93 187
+4 5
+73 126
diff --git a/geom_bottleneck/tests/data/test_489_A b/geom_bottleneck/tests/data/test_489_A
new file mode 100644
index 0000000..f1c9abf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_489_A
@@ -0,0 +1,8 @@
+52 74
+59 74
+83 84
+51 135
+41 132
+29 113
+7 65
+97 176
diff --git a/geom_bottleneck/tests/data/test_489_B b/geom_bottleneck/tests/data/test_489_B
new file mode 100644
index 0000000..5c5316f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_489_B
@@ -0,0 +1,8 @@
+43 126
+23 64
+16 111
+96 97
+84 112
+39 85
+33 74
+39 97
diff --git a/geom_bottleneck/tests/data/test_490_A b/geom_bottleneck/tests/data/test_490_A
new file mode 100644
index 0000000..e907d09
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_490_A
@@ -0,0 +1,8 @@
+93 146
+47 99
+6 55
+19 66
+15 28
+2 93
+97 143
+52 125
diff --git a/geom_bottleneck/tests/data/test_490_B b/geom_bottleneck/tests/data/test_490_B
new file mode 100644
index 0000000..6368e47
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_490_B
@@ -0,0 +1,8 @@
+82 172
+98 155
+73 119
+50 133
+13 84
+53 73
+5 21
+82 83
diff --git a/geom_bottleneck/tests/data/test_491_A b/geom_bottleneck/tests/data/test_491_A
new file mode 100644
index 0000000..9fdc2fb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_491_A
@@ -0,0 +1,8 @@
+12 35
+75 82
+45 91
+18 27
+99 178
+35 37
+46 113
+70 94
diff --git a/geom_bottleneck/tests/data/test_491_B b/geom_bottleneck/tests/data/test_491_B
new file mode 100644
index 0000000..09cd4ac
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_491_B
@@ -0,0 +1,8 @@
+76 121
+84 172
+70 167
+57 143
+4 52
+69 159
+10 100
+96 153
diff --git a/geom_bottleneck/tests/data/test_492_A b/geom_bottleneck/tests/data/test_492_A
new file mode 100644
index 0000000..434683d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_492_A
@@ -0,0 +1,8 @@
+21 92
+42 105
+79 166
+41 78
+72 87
+25 49
+78 104
+60 115
diff --git a/geom_bottleneck/tests/data/test_492_B b/geom_bottleneck/tests/data/test_492_B
new file mode 100644
index 0000000..3f6f5fa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_492_B
@@ -0,0 +1,8 @@
+80 94
+66 106
+36 79
+12 20
+28 36
+94 155
+62 100
+77 136
diff --git a/geom_bottleneck/tests/data/test_493_A b/geom_bottleneck/tests/data/test_493_A
new file mode 100644
index 0000000..12cfc64
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_493_A
@@ -0,0 +1,8 @@
+14 46
+79 109
+49 92
+100 181
+32 44
+15 16
+59 62
+66 127
diff --git a/geom_bottleneck/tests/data/test_493_B b/geom_bottleneck/tests/data/test_493_B
new file mode 100644
index 0000000..43dcf08
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_493_B
@@ -0,0 +1,8 @@
+18 21
+74 155
+36 57
+28 41
+15 40
+94 133
+72 153
+42 135
diff --git a/geom_bottleneck/tests/data/test_494_A b/geom_bottleneck/tests/data/test_494_A
new file mode 100644
index 0000000..b35b505
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_494_A
@@ -0,0 +1,8 @@
+31 40
+44 129
+74 92
+41 132
+79 105
+18 58
+93 123
+8 39
diff --git a/geom_bottleneck/tests/data/test_494_B b/geom_bottleneck/tests/data/test_494_B
new file mode 100644
index 0000000..fb70ed6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_494_B
@@ -0,0 +1,8 @@
+86 165
+30 101
+85 185
+15 71
+75 175
+61 141
+43 81
+90 128
diff --git a/geom_bottleneck/tests/data/test_495_A b/geom_bottleneck/tests/data/test_495_A
new file mode 100644
index 0000000..c244b7a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_495_A
@@ -0,0 +1,8 @@
+90 133
+48 84
+48 126
+0 80
+8 17
+60 82
+17 48
+9 74
diff --git a/geom_bottleneck/tests/data/test_495_B b/geom_bottleneck/tests/data/test_495_B
new file mode 100644
index 0000000..4bd121d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_495_B
@@ -0,0 +1,8 @@
+19 25
+39 63
+0 3
+39 86
+72 91
+27 85
+97 141
+79 174
diff --git a/geom_bottleneck/tests/data/test_496_A b/geom_bottleneck/tests/data/test_496_A
new file mode 100644
index 0000000..cc2cc0b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_496_A
@@ -0,0 +1,8 @@
+79 127
+84 146
+58 143
+28 68
+35 100
+38 126
+24 89
+32 70
diff --git a/geom_bottleneck/tests/data/test_496_B b/geom_bottleneck/tests/data/test_496_B
new file mode 100644
index 0000000..5b8aeaa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_496_B
@@ -0,0 +1,8 @@
+9 61
+68 125
+4 98
+98 99
+49 67
+41 50
+38 61
+24 44
diff --git a/geom_bottleneck/tests/data/test_497_A b/geom_bottleneck/tests/data/test_497_A
new file mode 100644
index 0000000..b3b511d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_497_A
@@ -0,0 +1,8 @@
+19 24
+89 174
+47 137
+93 131
+50 127
+6 34
+99 118
+86 98
diff --git a/geom_bottleneck/tests/data/test_497_B b/geom_bottleneck/tests/data/test_497_B
new file mode 100644
index 0000000..8870c73
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_497_B
@@ -0,0 +1,8 @@
+0 69
+39 100
+58 156
+37 74
+47 62
+81 172
+81 175
+56 147
diff --git a/geom_bottleneck/tests/data/test_498_A b/geom_bottleneck/tests/data/test_498_A
new file mode 100644
index 0000000..5bef5fa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_498_A
@@ -0,0 +1,8 @@
+55 140
+94 160
+22 35
+42 89
+50 127
+8 59
+25 87
+35 103
diff --git a/geom_bottleneck/tests/data/test_498_B b/geom_bottleneck/tests/data/test_498_B
new file mode 100644
index 0000000..b1ed38a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_498_B
@@ -0,0 +1,8 @@
+88 164
+14 29
+13 19
+3 49
+86 107
+62 138
+72 77
+2 22
diff --git a/geom_bottleneck/tests/data/test_499_A b/geom_bottleneck/tests/data/test_499_A
new file mode 100644
index 0000000..a24f367
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_499_A
@@ -0,0 +1,8 @@
+35 68
+22 25
+87 132
+23 119
+64 131
+13 106
+8 22
+83 169
diff --git a/geom_bottleneck/tests/data/test_499_B b/geom_bottleneck/tests/data/test_499_B
new file mode 100644
index 0000000..24d0d92
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_499_B
@@ -0,0 +1,8 @@
+27 105
+66 84
+76 101
+96 126
+40 103
+82 159
+41 45
+58 97
diff --git a/geom_bottleneck/tests/data/test_500_A b/geom_bottleneck/tests/data/test_500_A
new file mode 100644
index 0000000..ed86941
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_500_A
@@ -0,0 +1,9 @@
+96 120
+81 139
+35 58
+14 38
+23 33
+44 97
+26 61
+47 74
+75 124
diff --git a/geom_bottleneck/tests/data/test_500_B b/geom_bottleneck/tests/data/test_500_B
new file mode 100644
index 0000000..58f0cd6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_500_B
@@ -0,0 +1,9 @@
+57 153
+7 107
+56 78
+67 90
+14 86
+97 112
+5 45
+55 151
+51 133
diff --git a/geom_bottleneck/tests/data/test_501_A b/geom_bottleneck/tests/data/test_501_A
new file mode 100644
index 0000000..b6f9335
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_501_A
@@ -0,0 +1,9 @@
+57 145
+1 34
+98 129
+25 26
+19 94
+90 187
+62 160
+70 115
+88 160
diff --git a/geom_bottleneck/tests/data/test_501_B b/geom_bottleneck/tests/data/test_501_B
new file mode 100644
index 0000000..af0d32b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_501_B
@@ -0,0 +1,9 @@
+77 100
+34 41
+79 99
+27 65
+30 69
+58 96
+98 195
+45 144
+82 147
diff --git a/geom_bottleneck/tests/data/test_502_A b/geom_bottleneck/tests/data/test_502_A
new file mode 100644
index 0000000..64c4bfe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_502_A
@@ -0,0 +1,9 @@
+78 102
+66 134
+42 104
+17 68
+33 113
+84 160
+86 119
+32 73
+6 19
diff --git a/geom_bottleneck/tests/data/test_502_B b/geom_bottleneck/tests/data/test_502_B
new file mode 100644
index 0000000..4b1bb48
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_502_B
@@ -0,0 +1,9 @@
+2 25
+80 119
+56 147
+94 99
+51 116
+29 109
+89 180
+45 75
+93 170
diff --git a/geom_bottleneck/tests/data/test_503_A b/geom_bottleneck/tests/data/test_503_A
new file mode 100644
index 0000000..7686e8d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_503_A
@@ -0,0 +1,9 @@
+53 55
+1 67
+100 128
+27 39
+17 62
+66 98
+49 85
+13 14
+72 91
diff --git a/geom_bottleneck/tests/data/test_503_B b/geom_bottleneck/tests/data/test_503_B
new file mode 100644
index 0000000..c662290
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_503_B
@@ -0,0 +1,9 @@
+74 110
+99 192
+22 56
+19 40
+63 99
+31 44
+28 122
+89 161
+85 184
diff --git a/geom_bottleneck/tests/data/test_504_A b/geom_bottleneck/tests/data/test_504_A
new file mode 100644
index 0000000..7b0bcd8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_504_A
@@ -0,0 +1,9 @@
+52 60
+30 76
+55 91
+83 91
+23 53
+64 68
+12 106
+54 99
+0 83
diff --git a/geom_bottleneck/tests/data/test_504_B b/geom_bottleneck/tests/data/test_504_B
new file mode 100644
index 0000000..1fb9704
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_504_B
@@ -0,0 +1,9 @@
+10 57
+0 87
+74 85
+13 91
+48 59
+21 109
+85 141
+70 151
+24 103
diff --git a/geom_bottleneck/tests/data/test_505_A b/geom_bottleneck/tests/data/test_505_A
new file mode 100644
index 0000000..fd80b53
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_505_A
@@ -0,0 +1,9 @@
+90 183
+100 112
+33 120
+94 114
+96 190
+70 109
+22 102
+71 126
+99 150
diff --git a/geom_bottleneck/tests/data/test_505_B b/geom_bottleneck/tests/data/test_505_B
new file mode 100644
index 0000000..9bd046e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_505_B
@@ -0,0 +1,9 @@
+18 83
+61 159
+73 138
+51 137
+20 96
+89 185
+13 52
+54 134
+24 35
diff --git a/geom_bottleneck/tests/data/test_506_A b/geom_bottleneck/tests/data/test_506_A
new file mode 100644
index 0000000..1f5e9ac
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_506_A
@@ -0,0 +1,9 @@
+95 117
+41 138
+52 118
+82 163
+9 22
+58 156
+7 74
+24 42
+96 158
diff --git a/geom_bottleneck/tests/data/test_506_B b/geom_bottleneck/tests/data/test_506_B
new file mode 100644
index 0000000..0dc89b8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_506_B
@@ -0,0 +1,9 @@
+91 134
+78 119
+94 141
+5 57
+34 55
+43 101
+27 116
+41 72
+98 126
diff --git a/geom_bottleneck/tests/data/test_507_A b/geom_bottleneck/tests/data/test_507_A
new file mode 100644
index 0000000..a6d164e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_507_A
@@ -0,0 +1,9 @@
+34 62
+21 105
+41 63
+74 99
+52 95
+89 100
+11 82
+74 83
+78 132
diff --git a/geom_bottleneck/tests/data/test_507_B b/geom_bottleneck/tests/data/test_507_B
new file mode 100644
index 0000000..b39a7fe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_507_B
@@ -0,0 +1,9 @@
+49 76
+24 57
+25 101
+9 99
+65 146
+23 43
+89 165
+63 138
+50 76
diff --git a/geom_bottleneck/tests/data/test_508_A b/geom_bottleneck/tests/data/test_508_A
new file mode 100644
index 0000000..c837ce3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_508_A
@@ -0,0 +1,9 @@
+59 141
+59 74
+0 5
+11 105
+15 58
+43 117
+47 93
+60 149
+69 92
diff --git a/geom_bottleneck/tests/data/test_508_B b/geom_bottleneck/tests/data/test_508_B
new file mode 100644
index 0000000..733b5a0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_508_B
@@ -0,0 +1,9 @@
+29 104
+50 67
+43 82
+86 102
+45 81
+19 106
+74 124
+77 150
+80 104
diff --git a/geom_bottleneck/tests/data/test_509_A b/geom_bottleneck/tests/data/test_509_A
new file mode 100644
index 0000000..98137f3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_509_A
@@ -0,0 +1,9 @@
+40 74
+89 138
+20 44
+56 65
+12 14
+87 149
+23 123
+12 28
+56 146
diff --git a/geom_bottleneck/tests/data/test_509_B b/geom_bottleneck/tests/data/test_509_B
new file mode 100644
index 0000000..1edd08c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_509_B
@@ -0,0 +1,9 @@
+89 153
+20 65
+87 128
+27 101
+23 71
+6 53
+50 128
+16 108
+92 157
diff --git a/geom_bottleneck/tests/data/test_510_A b/geom_bottleneck/tests/data/test_510_A
new file mode 100644
index 0000000..b1e0e68
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_510_A
@@ -0,0 +1,9 @@
+67 70
+99 197
+62 111
+25 59
+61 131
+34 108
+99 185
+73 125
+76 130
diff --git a/geom_bottleneck/tests/data/test_510_B b/geom_bottleneck/tests/data/test_510_B
new file mode 100644
index 0000000..8e48152
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_510_B
@@ -0,0 +1,9 @@
+72 74
+57 126
+32 106
+55 88
+75 167
+5 34
+46 72
+86 104
+30 129
diff --git a/geom_bottleneck/tests/data/test_511_A b/geom_bottleneck/tests/data/test_511_A
new file mode 100644
index 0000000..a2c6b34
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_511_A
@@ -0,0 +1,9 @@
+10 56
+84 163
+34 131
+32 106
+61 84
+71 106
+17 32
+23 43
+44 79
diff --git a/geom_bottleneck/tests/data/test_511_B b/geom_bottleneck/tests/data/test_511_B
new file mode 100644
index 0000000..ff48216
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_511_B
@@ -0,0 +1,9 @@
+57 66
+89 124
+93 120
+72 119
+83 125
+1 17
+25 97
+32 90
+89 135
diff --git a/geom_bottleneck/tests/data/test_512_A b/geom_bottleneck/tests/data/test_512_A
new file mode 100644
index 0000000..8f875d8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_512_A
@@ -0,0 +1,9 @@
+88 136
+21 65
+12 82
+35 48
+97 127
+38 89
+69 71
+47 107
+91 127
diff --git a/geom_bottleneck/tests/data/test_512_B b/geom_bottleneck/tests/data/test_512_B
new file mode 100644
index 0000000..c6988c1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_512_B
@@ -0,0 +1,9 @@
+59 98
+88 114
+90 122
+83 147
+95 153
+9 56
+14 54
+25 70
+47 60
diff --git a/geom_bottleneck/tests/data/test_513_A b/geom_bottleneck/tests/data/test_513_A
new file mode 100644
index 0000000..844c16d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_513_A
@@ -0,0 +1,9 @@
+34 45
+64 149
+94 147
+34 73
+15 91
+2 53
+46 99
+70 100
+28 62
diff --git a/geom_bottleneck/tests/data/test_513_B b/geom_bottleneck/tests/data/test_513_B
new file mode 100644
index 0000000..ee75f8c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_513_B
@@ -0,0 +1,9 @@
+14 50
+76 112
+46 60
+45 94
+73 150
+79 128
+5 72
+44 87
+25 97
diff --git a/geom_bottleneck/tests/data/test_514_A b/geom_bottleneck/tests/data/test_514_A
new file mode 100644
index 0000000..9b58831
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_514_A
@@ -0,0 +1,9 @@
+4 78
+32 82
+56 106
+56 135
+0 1
+18 103
+29 65
+50 82
+68 82
diff --git a/geom_bottleneck/tests/data/test_514_B b/geom_bottleneck/tests/data/test_514_B
new file mode 100644
index 0000000..39c6534
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_514_B
@@ -0,0 +1,9 @@
+34 63
+63 145
+40 63
+3 93
+57 123
+32 51
+100 115
+23 32
+21 23
diff --git a/geom_bottleneck/tests/data/test_515_A b/geom_bottleneck/tests/data/test_515_A
new file mode 100644
index 0000000..fc2578b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_515_A
@@ -0,0 +1,9 @@
+32 33
+77 131
+64 160
+26 35
+77 106
+69 70
+98 106
+29 107
+65 69
diff --git a/geom_bottleneck/tests/data/test_515_B b/geom_bottleneck/tests/data/test_515_B
new file mode 100644
index 0000000..715f6e5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_515_B
@@ -0,0 +1,9 @@
+86 101
+89 138
+100 133
+81 103
+9 16
+79 133
+30 113
+98 195
+2 86
diff --git a/geom_bottleneck/tests/data/test_516_A b/geom_bottleneck/tests/data/test_516_A
new file mode 100644
index 0000000..bd37e5d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_516_A
@@ -0,0 +1,9 @@
+80 178
+95 153
+66 133
+12 74
+59 87
+85 165
+36 89
+57 145
+85 177
diff --git a/geom_bottleneck/tests/data/test_516_B b/geom_bottleneck/tests/data/test_516_B
new file mode 100644
index 0000000..8d23127
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_516_B
@@ -0,0 +1,9 @@
+29 85
+39 41
+50 99
+16 76
+82 131
+20 107
+20 25
+91 105
+98 172
diff --git a/geom_bottleneck/tests/data/test_517_A b/geom_bottleneck/tests/data/test_517_A
new file mode 100644
index 0000000..17ca01c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_517_A
@@ -0,0 +1,9 @@
+39 41
+60 128
+14 32
+52 138
+74 79
+52 100
+4 39
+53 145
+33 127
diff --git a/geom_bottleneck/tests/data/test_517_B b/geom_bottleneck/tests/data/test_517_B
new file mode 100644
index 0000000..ba82599
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_517_B
@@ -0,0 +1,9 @@
+31 113
+54 116
+69 151
+9 18
+60 62
+0 22
+93 162
+15 62
+63 148
diff --git a/geom_bottleneck/tests/data/test_518_A b/geom_bottleneck/tests/data/test_518_A
new file mode 100644
index 0000000..bb1711c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_518_A
@@ -0,0 +1,9 @@
+49 70
+63 113
+60 158
+17 111
+37 112
+35 101
+3 51
+89 126
+91 129
diff --git a/geom_bottleneck/tests/data/test_518_B b/geom_bottleneck/tests/data/test_518_B
new file mode 100644
index 0000000..5b2e95a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_518_B
@@ -0,0 +1,9 @@
+7 97
+72 146
+59 147
+89 103
+72 169
+43 65
+29 98
+28 44
+14 40
diff --git a/geom_bottleneck/tests/data/test_519_A b/geom_bottleneck/tests/data/test_519_A
new file mode 100644
index 0000000..f0cb6ea
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_519_A
@@ -0,0 +1,9 @@
+6 92
+25 100
+99 156
+12 89
+3 102
+32 107
+13 40
+79 94
+33 118
diff --git a/geom_bottleneck/tests/data/test_519_B b/geom_bottleneck/tests/data/test_519_B
new file mode 100644
index 0000000..03396db
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_519_B
@@ -0,0 +1,9 @@
+32 46
+61 155
+98 180
+10 89
+86 127
+0 4
+51 65
+9 85
+32 85
diff --git a/geom_bottleneck/tests/data/test_520_A b/geom_bottleneck/tests/data/test_520_A
new file mode 100644
index 0000000..9353285
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_520_A
@@ -0,0 +1,10 @@
+91 117
+68 132
+36 70
+20 75
+47 97
+50 84
+9 79
+63 70
+0 48
+15 75
diff --git a/geom_bottleneck/tests/data/test_520_B b/geom_bottleneck/tests/data/test_520_B
new file mode 100644
index 0000000..1e328cd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_520_B
@@ -0,0 +1,10 @@
+35 51
+16 23
+4 91
+69 133
+21 30
+80 169
+55 100
+34 76
+24 30
+97 167
diff --git a/geom_bottleneck/tests/data/test_521_A b/geom_bottleneck/tests/data/test_521_A
new file mode 100644
index 0000000..d0bea91
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_521_A
@@ -0,0 +1,10 @@
+22 45
+99 100
+34 81
+41 104
+1 25
+3 93
+26 88
+4 23
+97 159
+7 19
diff --git a/geom_bottleneck/tests/data/test_521_B b/geom_bottleneck/tests/data/test_521_B
new file mode 100644
index 0000000..5e584b0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_521_B
@@ -0,0 +1,10 @@
+2 40
+31 85
+57 105
+28 61
+18 111
+95 115
+0 66
+81 167
+96 174
+85 170
diff --git a/geom_bottleneck/tests/data/test_522_A b/geom_bottleneck/tests/data/test_522_A
new file mode 100644
index 0000000..5631735
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_522_A
@@ -0,0 +1,10 @@
+99 187
+92 127
+69 157
+82 161
+94 141
+97 108
+70 94
+20 39
+87 172
+87 122
diff --git a/geom_bottleneck/tests/data/test_522_B b/geom_bottleneck/tests/data/test_522_B
new file mode 100644
index 0000000..903bcdc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_522_B
@@ -0,0 +1,10 @@
+39 51
+28 81
+77 78
+17 52
+42 124
+34 37
+96 117
+39 98
+65 142
+4 72
diff --git a/geom_bottleneck/tests/data/test_523_A b/geom_bottleneck/tests/data/test_523_A
new file mode 100644
index 0000000..b4da958
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_523_A
@@ -0,0 +1,10 @@
+73 158
+5 34
+4 67
+88 109
+46 137
+86 152
+61 113
+61 93
+71 77
+65 157
diff --git a/geom_bottleneck/tests/data/test_523_B b/geom_bottleneck/tests/data/test_523_B
new file mode 100644
index 0000000..bcc7438
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_523_B
@@ -0,0 +1,10 @@
+54 78
+6 86
+63 130
+90 183
+59 89
+96 151
+93 117
+74 147
+20 93
+26 110
diff --git a/geom_bottleneck/tests/data/test_524_A b/geom_bottleneck/tests/data/test_524_A
new file mode 100644
index 0000000..e260687
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_524_A
@@ -0,0 +1,10 @@
+25 116
+12 34
+31 39
+56 152
+47 147
+67 112
+60 146
+77 112
+71 120
+67 75
diff --git a/geom_bottleneck/tests/data/test_524_B b/geom_bottleneck/tests/data/test_524_B
new file mode 100644
index 0000000..92a2d76
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_524_B
@@ -0,0 +1,10 @@
+2 10
+32 42
+24 123
+24 32
+84 135
+49 148
+100 181
+81 137
+63 96
+13 16
diff --git a/geom_bottleneck/tests/data/test_525_A b/geom_bottleneck/tests/data/test_525_A
new file mode 100644
index 0000000..25d9d8f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_525_A
@@ -0,0 +1,10 @@
+51 101
+67 155
+84 155
+67 151
+39 122
+93 167
+83 117
+20 67
+39 136
+54 116
diff --git a/geom_bottleneck/tests/data/test_525_B b/geom_bottleneck/tests/data/test_525_B
new file mode 100644
index 0000000..d61ee84
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_525_B
@@ -0,0 +1,10 @@
+69 120
+93 141
+65 96
+8 81
+27 110
+94 178
+9 89
+1 91
+77 86
+33 49
diff --git a/geom_bottleneck/tests/data/test_526_A b/geom_bottleneck/tests/data/test_526_A
new file mode 100644
index 0000000..985ba29
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_526_A
@@ -0,0 +1,10 @@
+10 27
+53 116
+71 93
+88 122
+45 87
+82 167
+89 105
+20 101
+25 71
+61 124
diff --git a/geom_bottleneck/tests/data/test_526_B b/geom_bottleneck/tests/data/test_526_B
new file mode 100644
index 0000000..2ebf00a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_526_B
@@ -0,0 +1,10 @@
+70 95
+68 69
+13 105
+58 156
+51 97
+64 106
+87 95
+63 85
+62 79
+82 87
diff --git a/geom_bottleneck/tests/data/test_527_A b/geom_bottleneck/tests/data/test_527_A
new file mode 100644
index 0000000..802b177
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_527_A
@@ -0,0 +1,10 @@
+5 27
+91 164
+68 91
+11 72
+37 66
+12 27
+30 47
+54 58
+34 80
+43 133
diff --git a/geom_bottleneck/tests/data/test_527_B b/geom_bottleneck/tests/data/test_527_B
new file mode 100644
index 0000000..a04d9f1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_527_B
@@ -0,0 +1,10 @@
+88 156
+74 105
+64 69
+96 127
+10 93
+52 107
+58 134
+18 108
+80 108
+93 161
diff --git a/geom_bottleneck/tests/data/test_528_A b/geom_bottleneck/tests/data/test_528_A
new file mode 100644
index 0000000..da776dc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_528_A
@@ -0,0 +1,10 @@
+36 107
+14 86
+45 96
+22 58
+57 103
+92 138
+65 150
+33 94
+40 79
+50 54
diff --git a/geom_bottleneck/tests/data/test_528_B b/geom_bottleneck/tests/data/test_528_B
new file mode 100644
index 0000000..5329277
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_528_B
@@ -0,0 +1,10 @@
+39 122
+19 43
+88 130
+48 106
+27 69
+93 140
+1 23
+50 94
+87 139
+97 151
diff --git a/geom_bottleneck/tests/data/test_529_A b/geom_bottleneck/tests/data/test_529_A
new file mode 100644
index 0000000..ebbf6fa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_529_A
@@ -0,0 +1,10 @@
+80 140
+0 97
+28 29
+15 85
+21 35
+34 74
+26 27
+91 135
+21 36
+33 117
diff --git a/geom_bottleneck/tests/data/test_529_B b/geom_bottleneck/tests/data/test_529_B
new file mode 100644
index 0000000..6e0f836
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_529_B
@@ -0,0 +1,10 @@
+22 46
+0 79
+33 86
+14 99
+71 108
+83 91
+40 69
+36 45
+42 112
+44 75
diff --git a/geom_bottleneck/tests/data/test_530_A b/geom_bottleneck/tests/data/test_530_A
new file mode 100644
index 0000000..904eac4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_530_A
@@ -0,0 +1,10 @@
+89 119
+35 104
+90 95
+6 77
+44 71
+46 100
+40 127
+11 52
+28 81
+39 73
diff --git a/geom_bottleneck/tests/data/test_530_B b/geom_bottleneck/tests/data/test_530_B
new file mode 100644
index 0000000..f4cfc4c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_530_B
@@ -0,0 +1,10 @@
+79 179
+39 89
+5 67
+39 66
+88 162
+82 97
+80 156
+91 182
+44 110
+56 67
diff --git a/geom_bottleneck/tests/data/test_531_A b/geom_bottleneck/tests/data/test_531_A
new file mode 100644
index 0000000..416eb0a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_531_A
@@ -0,0 +1,10 @@
+33 133
+73 98
+77 129
+21 118
+9 21
+68 166
+13 46
+53 84
+48 75
+24 90
diff --git a/geom_bottleneck/tests/data/test_531_B b/geom_bottleneck/tests/data/test_531_B
new file mode 100644
index 0000000..afb424a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_531_B
@@ -0,0 +1,10 @@
+89 148
+25 112
+86 132
+78 106
+57 70
+92 160
+67 86
+94 123
+12 26
+65 117
diff --git a/geom_bottleneck/tests/data/test_532_A b/geom_bottleneck/tests/data/test_532_A
new file mode 100644
index 0000000..7eb97c1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_532_A
@@ -0,0 +1,10 @@
+8 62
+77 140
+23 60
+13 93
+67 74
+59 152
+22 65
+16 17
+97 98
+76 91
diff --git a/geom_bottleneck/tests/data/test_532_B b/geom_bottleneck/tests/data/test_532_B
new file mode 100644
index 0000000..e86a6a0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_532_B
@@ -0,0 +1,10 @@
+66 111
+54 74
+95 142
+96 167
+63 84
+76 84
+53 59
+97 130
+20 68
+5 58
diff --git a/geom_bottleneck/tests/data/test_533_A b/geom_bottleneck/tests/data/test_533_A
new file mode 100644
index 0000000..0462a89
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_533_A
@@ -0,0 +1,10 @@
+66 103
+20 42
+30 31
+61 90
+31 129
+49 53
+2 3
+78 122
+36 103
+59 63
diff --git a/geom_bottleneck/tests/data/test_533_B b/geom_bottleneck/tests/data/test_533_B
new file mode 100644
index 0000000..d077aa2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_533_B
@@ -0,0 +1,10 @@
+51 121
+9 63
+71 121
+66 100
+89 111
+15 23
+98 110
+15 96
+4 52
+96 119
diff --git a/geom_bottleneck/tests/data/test_534_A b/geom_bottleneck/tests/data/test_534_A
new file mode 100644
index 0000000..a5c6b69
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_534_A
@@ -0,0 +1,10 @@
+84 177
+8 103
+81 176
+0 71
+4 80
+59 123
+42 63
+1 98
+86 169
+31 97
diff --git a/geom_bottleneck/tests/data/test_534_B b/geom_bottleneck/tests/data/test_534_B
new file mode 100644
index 0000000..10d4e7b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_534_B
@@ -0,0 +1,10 @@
+8 56
+35 95
+62 104
+26 105
+32 52
+1 48
+87 150
+61 77
+12 66
+62 96
diff --git a/geom_bottleneck/tests/data/test_535_A b/geom_bottleneck/tests/data/test_535_A
new file mode 100644
index 0000000..faaf29f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_535_A
@@ -0,0 +1,10 @@
+40 53
+9 46
+94 119
+85 113
+2 97
+62 162
+74 89
+87 118
+76 120
+33 39
diff --git a/geom_bottleneck/tests/data/test_535_B b/geom_bottleneck/tests/data/test_535_B
new file mode 100644
index 0000000..108c8a3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_535_B
@@ -0,0 +1,10 @@
+6 82
+22 100
+2 82
+71 123
+91 179
+14 107
+28 38
+71 83
+6 60
+1 5
diff --git a/geom_bottleneck/tests/data/test_536_A b/geom_bottleneck/tests/data/test_536_A
new file mode 100644
index 0000000..320f5af
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_536_A
@@ -0,0 +1,10 @@
+87 179
+24 37
+14 64
+10 103
+92 160
+96 136
+86 171
+21 54
+22 32
+71 169
diff --git a/geom_bottleneck/tests/data/test_536_B b/geom_bottleneck/tests/data/test_536_B
new file mode 100644
index 0000000..9ce91f5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_536_B
@@ -0,0 +1,10 @@
+73 151
+54 87
+79 166
+69 149
+77 132
+49 149
+86 107
+72 119
+35 77
+52 56
diff --git a/geom_bottleneck/tests/data/test_537_A b/geom_bottleneck/tests/data/test_537_A
new file mode 100644
index 0000000..c41e293
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_537_A
@@ -0,0 +1,10 @@
+4 80
+18 78
+55 56
+32 118
+79 151
+5 78
+11 12
+89 113
+99 120
+26 85
diff --git a/geom_bottleneck/tests/data/test_537_B b/geom_bottleneck/tests/data/test_537_B
new file mode 100644
index 0000000..a10f64d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_537_B
@@ -0,0 +1,10 @@
+53 138
+80 135
+34 112
+20 46
+79 122
+21 87
+82 83
+91 112
+59 139
+9 97
diff --git a/geom_bottleneck/tests/data/test_538_A b/geom_bottleneck/tests/data/test_538_A
new file mode 100644
index 0000000..0d98495
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_538_A
@@ -0,0 +1,10 @@
+68 91
+38 132
+6 57
+24 46
+71 79
+61 129
+59 82
+15 105
+77 79
+44 117
diff --git a/geom_bottleneck/tests/data/test_538_B b/geom_bottleneck/tests/data/test_538_B
new file mode 100644
index 0000000..6dde6f3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_538_B
@@ -0,0 +1,10 @@
+0 89
+73 128
+54 150
+79 98
+62 137
+51 66
+67 99
+31 100
+68 105
+19 30
diff --git a/geom_bottleneck/tests/data/test_539_A b/geom_bottleneck/tests/data/test_539_A
new file mode 100644
index 0000000..a844d1c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_539_A
@@ -0,0 +1,10 @@
+72 140
+32 108
+64 99
+78 130
+74 122
+92 134
+71 75
+14 89
+86 134
+1 36
diff --git a/geom_bottleneck/tests/data/test_539_B b/geom_bottleneck/tests/data/test_539_B
new file mode 100644
index 0000000..824a004
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_539_B
@@ -0,0 +1,10 @@
+2 56
+57 82
+6 38
+60 68
+80 101
+27 57
+56 133
+45 75
+42 103
+38 78
diff --git a/geom_bottleneck/tests/data/test_540_A b/geom_bottleneck/tests/data/test_540_A
new file mode 100644
index 0000000..26bd782
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_540_A
@@ -0,0 +1,20 @@
+98 163
+65 109
+99 135
+11 83
+36 76
+57 84
+97 180
+22 87
+27 51
+92 190
+66 102
+32 76
+78 125
+70 144
+72 127
+50 51
+34 112
+3 39
+37 79
+55 143
diff --git a/geom_bottleneck/tests/data/test_540_B b/geom_bottleneck/tests/data/test_540_B
new file mode 100644
index 0000000..224839d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_540_B
@@ -0,0 +1,20 @@
+90 182
+48 122
+34 109
+78 115
+60 110
+78 134
+58 59
+14 27
+48 94
+63 100
+88 171
+29 123
+20 61
+66 115
+46 61
+5 74
+94 189
+46 80
+85 88
+9 75
diff --git a/geom_bottleneck/tests/data/test_541_A b/geom_bottleneck/tests/data/test_541_A
new file mode 100644
index 0000000..fe8039b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_541_A
@@ -0,0 +1,20 @@
+79 102
+50 71
+80 116
+35 44
+54 112
+89 90
+16 90
+14 30
+44 122
+98 135
+45 68
+46 125
+0 11
+46 94
+75 79
+76 89
+15 82
+84 95
+49 61
+68 123
diff --git a/geom_bottleneck/tests/data/test_541_B b/geom_bottleneck/tests/data/test_541_B
new file mode 100644
index 0000000..c33af0e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_541_B
@@ -0,0 +1,20 @@
+39 108
+72 146
+49 50
+31 72
+84 104
+72 90
+57 81
+14 74
+69 74
+88 157
+9 65
+34 46
+44 87
+39 65
+14 77
+22 116
+5 58
+43 113
+62 120
+85 118
diff --git a/geom_bottleneck/tests/data/test_542_A b/geom_bottleneck/tests/data/test_542_A
new file mode 100644
index 0000000..d45ea52
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_542_A
@@ -0,0 +1,20 @@
+17 49
+64 156
+91 96
+83 142
+90 118
+20 59
+26 69
+82 118
+94 179
+1 20
+81 123
+89 165
+17 71
+60 85
+56 147
+94 175
+82 148
+31 118
+51 95
+12 41
diff --git a/geom_bottleneck/tests/data/test_542_B b/geom_bottleneck/tests/data/test_542_B
new file mode 100644
index 0000000..9dcdf8a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_542_B
@@ -0,0 +1,20 @@
+21 47
+41 90
+78 121
+36 93
+8 108
+78 117
+31 92
+97 102
+12 96
+83 89
+36 85
+2 81
+24 86
+26 105
+10 99
+59 101
+45 98
+94 162
+57 60
+29 81
diff --git a/geom_bottleneck/tests/data/test_543_A b/geom_bottleneck/tests/data/test_543_A
new file mode 100644
index 0000000..511fbc1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_543_A
@@ -0,0 +1,20 @@
+92 188
+94 159
+77 175
+13 23
+92 186
+85 144
+100 191
+34 48
+58 103
+74 113
+73 95
+34 66
+2 98
+80 95
+82 140
+38 133
+67 121
+65 70
+83 86
+90 143
diff --git a/geom_bottleneck/tests/data/test_543_B b/geom_bottleneck/tests/data/test_543_B
new file mode 100644
index 0000000..879080c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_543_B
@@ -0,0 +1,20 @@
+100 168
+52 97
+35 39
+4 38
+42 55
+47 117
+49 145
+16 48
+99 145
+45 54
+69 129
+8 103
+47 108
+25 70
+93 148
+96 133
+44 49
+94 115
+48 53
+44 109
diff --git a/geom_bottleneck/tests/data/test_544_A b/geom_bottleneck/tests/data/test_544_A
new file mode 100644
index 0000000..a355d41
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_544_A
@@ -0,0 +1,20 @@
+31 114
+22 94
+10 88
+82 134
+28 106
+90 188
+78 130
+87 176
+99 155
+71 116
+39 105
+8 40
+96 184
+53 100
+77 79
+26 96
+30 116
+82 167
+62 122
+95 152
diff --git a/geom_bottleneck/tests/data/test_544_B b/geom_bottleneck/tests/data/test_544_B
new file mode 100644
index 0000000..83587cf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_544_B
@@ -0,0 +1,20 @@
+75 125
+7 26
+61 102
+98 99
+12 88
+49 63
+46 61
+77 111
+13 56
+37 89
+7 84
+51 69
+86 142
+98 140
+91 122
+10 65
+9 33
+6 70
+95 101
+26 111
diff --git a/geom_bottleneck/tests/data/test_545_A b/geom_bottleneck/tests/data/test_545_A
new file mode 100644
index 0000000..c5351d7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_545_A
@@ -0,0 +1,20 @@
+52 89
+34 54
+44 124
+82 128
+75 104
+26 120
+77 159
+11 42
+75 153
+89 189
+52 73
+43 128
+45 132
+80 160
+53 55
+76 122
+96 114
+64 109
+20 119
+99 145
diff --git a/geom_bottleneck/tests/data/test_545_B b/geom_bottleneck/tests/data/test_545_B
new file mode 100644
index 0000000..0c60c17
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_545_B
@@ -0,0 +1,20 @@
+74 118
+29 69
+19 82
+50 124
+82 155
+15 63
+35 51
+38 52
+11 105
+70 114
+19 86
+91 157
+98 151
+14 83
+39 126
+38 52
+57 68
+79 137
+21 66
+68 92
diff --git a/geom_bottleneck/tests/data/test_546_A b/geom_bottleneck/tests/data/test_546_A
new file mode 100644
index 0000000..4391c84
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_546_A
@@ -0,0 +1,20 @@
+60 91
+46 132
+27 127
+4 36
+66 116
+73 113
+56 98
+29 66
+38 88
+18 24
+19 52
+32 119
+39 81
+71 110
+24 46
+81 90
+80 111
+47 88
+94 142
+42 47
diff --git a/geom_bottleneck/tests/data/test_546_B b/geom_bottleneck/tests/data/test_546_B
new file mode 100644
index 0000000..3d3dec6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_546_B
@@ -0,0 +1,20 @@
+82 101
+14 80
+56 78
+28 113
+61 125
+70 88
+30 47
+88 176
+84 169
+15 92
+17 19
+33 61
+33 34
+60 142
+7 8
+5 34
+99 140
+35 113
+14 46
+74 112
diff --git a/geom_bottleneck/tests/data/test_547_A b/geom_bottleneck/tests/data/test_547_A
new file mode 100644
index 0000000..1388d05
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_547_A
@@ -0,0 +1,20 @@
+36 57
+27 86
+11 103
+73 132
+5 58
+59 66
+26 35
+0 18
+47 138
+49 118
+23 79
+12 99
+9 35
+15 79
+18 25
+94 137
+8 50
+68 78
+79 179
+31 121
diff --git a/geom_bottleneck/tests/data/test_547_B b/geom_bottleneck/tests/data/test_547_B
new file mode 100644
index 0000000..dbb925d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_547_B
@@ -0,0 +1,20 @@
+24 75
+28 29
+35 81
+81 178
+25 79
+78 106
+23 93
+57 151
+96 135
+85 151
+73 149
+37 98
+10 24
+30 61
+39 67
+68 74
+57 79
+66 160
+60 151
+66 139
diff --git a/geom_bottleneck/tests/data/test_548_A b/geom_bottleneck/tests/data/test_548_A
new file mode 100644
index 0000000..08c858e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_548_A
@@ -0,0 +1,20 @@
+15 24
+24 72
+67 142
+71 97
+26 61
+99 158
+61 82
+100 198
+51 114
+10 98
+46 93
+74 171
+14 75
+85 101
+30 40
+37 42
+2 16
+48 64
+48 99
+77 170
diff --git a/geom_bottleneck/tests/data/test_548_B b/geom_bottleneck/tests/data/test_548_B
new file mode 100644
index 0000000..b6dda3a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_548_B
@@ -0,0 +1,20 @@
+51 59
+99 108
+89 148
+82 96
+55 117
+52 148
+74 133
+37 99
+6 71
+0 15
+100 170
+28 56
+12 39
+61 98
+24 92
+18 88
+63 158
+91 129
+79 154
+39 85
diff --git a/geom_bottleneck/tests/data/test_549_A b/geom_bottleneck/tests/data/test_549_A
new file mode 100644
index 0000000..b0d5ddf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_549_A
@@ -0,0 +1,20 @@
+35 44
+1 25
+100 168
+81 169
+40 84
+28 37
+50 58
+60 122
+4 27
+2 99
+67 145
+51 111
+96 148
+47 65
+64 159
+54 114
+90 113
+4 36
+94 178
+19 20
diff --git a/geom_bottleneck/tests/data/test_549_B b/geom_bottleneck/tests/data/test_549_B
new file mode 100644
index 0000000..a44a982
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_549_B
@@ -0,0 +1,20 @@
+68 146
+8 27
+6 64
+76 113
+71 89
+29 65
+74 133
+52 57
+21 26
+2 39
+95 194
+67 113
+14 20
+90 160
+93 171
+72 97
+57 157
+23 42
+13 70
+17 44
diff --git a/geom_bottleneck/tests/data/test_550_A b/geom_bottleneck/tests/data/test_550_A
new file mode 100644
index 0000000..b8ba8e8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_550_A
@@ -0,0 +1,20 @@
+76 145
+38 79
+44 90
+71 155
+48 63
+88 125
+36 107
+91 136
+25 33
+49 57
+37 70
+69 116
+63 64
+70 118
+43 115
+80 99
+42 71
+86 91
+96 166
+69 121
diff --git a/geom_bottleneck/tests/data/test_550_B b/geom_bottleneck/tests/data/test_550_B
new file mode 100644
index 0000000..ed900f0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_550_B
@@ -0,0 +1,20 @@
+25 66
+55 107
+62 87
+15 49
+46 99
+25 39
+73 94
+43 126
+85 163
+12 96
+48 127
+21 26
+40 45
+88 188
+77 109
+38 44
+0 66
+57 59
+85 104
+32 54
diff --git a/geom_bottleneck/tests/data/test_551_A b/geom_bottleneck/tests/data/test_551_A
new file mode 100644
index 0000000..3002ec2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_551_A
@@ -0,0 +1,20 @@
+68 98
+42 48
+4 5
+6 82
+41 83
+94 141
+17 48
+33 105
+71 162
+55 95
+43 132
+81 162
+6 32
+88 101
+76 85
+36 70
+42 45
+60 122
+83 127
+100 148
diff --git a/geom_bottleneck/tests/data/test_551_B b/geom_bottleneck/tests/data/test_551_B
new file mode 100644
index 0000000..5a9b2de
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_551_B
@@ -0,0 +1,20 @@
+58 109
+88 154
+56 66
+76 142
+86 125
+95 181
+46 85
+15 43
+55 79
+77 104
+45 113
+66 74
+64 100
+45 138
+6 62
+36 79
+77 106
+82 115
+15 110
+62 156
diff --git a/geom_bottleneck/tests/data/test_552_A b/geom_bottleneck/tests/data/test_552_A
new file mode 100644
index 0000000..19de840
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_552_A
@@ -0,0 +1,20 @@
+10 104
+23 89
+7 13
+66 150
+92 157
+22 43
+35 62
+96 187
+84 89
+75 160
+88 118
+74 99
+43 138
+20 37
+90 176
+85 157
+90 168
+63 157
+59 106
+68 92
diff --git a/geom_bottleneck/tests/data/test_552_B b/geom_bottleneck/tests/data/test_552_B
new file mode 100644
index 0000000..54b3e00
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_552_B
@@ -0,0 +1,20 @@
+57 121
+94 173
+84 133
+61 106
+71 130
+44 114
+55 73
+100 144
+91 126
+60 109
+44 92
+23 87
+52 116
+24 25
+10 93
+60 140
+11 55
+96 155
+76 165
+38 129
diff --git a/geom_bottleneck/tests/data/test_553_A b/geom_bottleneck/tests/data/test_553_A
new file mode 100644
index 0000000..deff96a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_553_A
@@ -0,0 +1,20 @@
+1 4
+23 91
+97 103
+6 68
+13 25
+9 18
+65 122
+91 154
+41 76
+86 132
+31 62
+93 167
+45 50
+70 166
+38 113
+52 132
+77 161
+13 60
+39 65
+60 69
diff --git a/geom_bottleneck/tests/data/test_553_B b/geom_bottleneck/tests/data/test_553_B
new file mode 100644
index 0000000..ee7ce9b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_553_B
@@ -0,0 +1,20 @@
+51 60
+76 151
+87 157
+49 110
+78 112
+3 59
+55 98
+26 121
+69 158
+15 63
+70 109
+30 46
+23 75
+65 138
+87 120
+7 46
+99 187
+43 69
+73 161
+37 93
diff --git a/geom_bottleneck/tests/data/test_554_A b/geom_bottleneck/tests/data/test_554_A
new file mode 100644
index 0000000..da38226
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_554_A
@@ -0,0 +1,20 @@
+69 134
+81 159
+100 168
+96 111
+46 134
+56 61
+8 31
+63 119
+57 137
+16 84
+5 51
+79 128
+20 117
+85 136
+34 88
+23 73
+3 87
+10 34
+72 120
+36 71
diff --git a/geom_bottleneck/tests/data/test_554_B b/geom_bottleneck/tests/data/test_554_B
new file mode 100644
index 0000000..8583236
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_554_B
@@ -0,0 +1,20 @@
+14 62
+54 74
+87 164
+57 87
+70 113
+5 75
+86 185
+3 69
+36 52
+31 93
+85 104
+4 97
+89 149
+19 92
+70 120
+13 18
+48 72
+100 152
+35 48
+94 191
diff --git a/geom_bottleneck/tests/data/test_555_A b/geom_bottleneck/tests/data/test_555_A
new file mode 100644
index 0000000..87cd93d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_555_A
@@ -0,0 +1,20 @@
+23 58
+71 106
+56 155
+37 85
+88 186
+12 75
+23 86
+17 92
+30 96
+13 54
+53 152
+84 153
+15 22
+67 86
+93 147
+17 117
+99 170
+75 108
+18 118
+71 131
diff --git a/geom_bottleneck/tests/data/test_555_B b/geom_bottleneck/tests/data/test_555_B
new file mode 100644
index 0000000..2b8c351
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_555_B
@@ -0,0 +1,20 @@
+9 71
+95 131
+85 156
+86 142
+10 54
+56 119
+49 100
+30 50
+7 64
+27 82
+14 85
+33 35
+22 52
+92 171
+36 62
+85 133
+4 14
+47 124
+70 131
+14 29
diff --git a/geom_bottleneck/tests/data/test_556_A b/geom_bottleneck/tests/data/test_556_A
new file mode 100644
index 0000000..182965d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_556_A
@@ -0,0 +1,20 @@
+79 147
+83 144
+20 30
+92 185
+29 40
+46 90
+21 106
+15 24
+16 63
+62 67
+18 106
+52 127
+47 64
+15 84
+10 87
+16 102
+89 139
+64 68
+57 128
+37 120
diff --git a/geom_bottleneck/tests/data/test_556_B b/geom_bottleneck/tests/data/test_556_B
new file mode 100644
index 0000000..f2e3409
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_556_B
@@ -0,0 +1,20 @@
+84 125
+37 84
+38 46
+32 59
+36 76
+95 107
+82 144
+81 121
+72 145
+1 100
+70 143
+76 167
+8 26
+51 90
+74 165
+88 89
+56 155
+95 165
+24 109
+45 141
diff --git a/geom_bottleneck/tests/data/test_557_A b/geom_bottleneck/tests/data/test_557_A
new file mode 100644
index 0000000..ac233bb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_557_A
@@ -0,0 +1,20 @@
+47 91
+57 100
+93 157
+12 91
+95 109
+26 103
+55 78
+58 106
+5 96
+25 85
+76 97
+20 78
+85 160
+71 144
+81 145
+58 59
+49 86
+31 35
+89 156
+15 82
diff --git a/geom_bottleneck/tests/data/test_557_B b/geom_bottleneck/tests/data/test_557_B
new file mode 100644
index 0000000..f838403
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_557_B
@@ -0,0 +1,20 @@
+31 112
+70 120
+12 49
+95 96
+27 87
+50 120
+78 115
+22 108
+54 82
+31 109
+51 74
+55 140
+7 92
+88 133
+61 82
+90 183
+33 64
+90 121
+26 47
+98 120
diff --git a/geom_bottleneck/tests/data/test_558_A b/geom_bottleneck/tests/data/test_558_A
new file mode 100644
index 0000000..7108d09
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_558_A
@@ -0,0 +1,20 @@
+57 115
+32 131
+32 111
+46 104
+8 12
+20 69
+65 89
+8 37
+88 153
+61 63
+86 139
+74 88
+3 62
+58 104
+31 100
+29 81
+55 59
+11 18
+63 103
+56 110
diff --git a/geom_bottleneck/tests/data/test_558_B b/geom_bottleneck/tests/data/test_558_B
new file mode 100644
index 0000000..dd19869
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_558_B
@@ -0,0 +1,20 @@
+43 134
+43 44
+56 124
+97 118
+34 68
+56 140
+41 140
+24 95
+57 91
+22 28
+94 158
+69 141
+94 110
+7 41
+39 59
+69 107
+76 163
+30 105
+96 142
+46 127
diff --git a/geom_bottleneck/tests/data/test_559_A b/geom_bottleneck/tests/data/test_559_A
new file mode 100644
index 0000000..46f07b4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_559_A
@@ -0,0 +1,20 @@
+21 99
+7 104
+89 130
+91 181
+19 90
+57 146
+15 60
+66 123
+13 58
+3 57
+39 114
+4 53
+80 125
+83 132
+81 98
+14 99
+81 175
+49 92
+39 125
+31 111
diff --git a/geom_bottleneck/tests/data/test_559_B b/geom_bottleneck/tests/data/test_559_B
new file mode 100644
index 0000000..b747fb8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_559_B
@@ -0,0 +1,20 @@
+13 43
+81 86
+45 84
+84 111
+39 83
+85 115
+70 150
+97 192
+70 107
+21 74
+71 73
+98 184
+14 114
+63 126
+21 59
+53 147
+70 114
+30 56
+34 35
+61 133
diff --git a/geom_bottleneck/tests/data/test_560_A b/geom_bottleneck/tests/data/test_560_A
new file mode 100644
index 0000000..9b704ae
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_560_A
@@ -0,0 +1,30 @@
+35 126
+34 37
+78 84
+70 127
+97 106
+42 49
+49 105
+50 150
+80 140
+30 128
+90 136
+77 173
+42 98
+17 97
+100 181
+30 45
+6 40
+30 75
+66 148
+13 66
+39 113
+53 106
+65 133
+1 17
+61 123
+37 114
+1 77
+6 19
+8 11
+20 95
diff --git a/geom_bottleneck/tests/data/test_560_B b/geom_bottleneck/tests/data/test_560_B
new file mode 100644
index 0000000..d4ece9d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_560_B
@@ -0,0 +1,30 @@
+100 150
+25 32
+99 187
+42 117
+60 84
+22 104
+15 113
+29 58
+91 185
+92 120
+95 133
+42 67
+62 148
+79 122
+27 66
+14 75
+44 142
+10 25
+54 149
+31 38
+97 161
+63 115
+29 76
+100 102
+59 72
+54 140
+8 108
+12 83
+54 127
+43 95
diff --git a/geom_bottleneck/tests/data/test_561_A b/geom_bottleneck/tests/data/test_561_A
new file mode 100644
index 0000000..81a3e31
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_561_A
@@ -0,0 +1,30 @@
+13 66
+67 124
+99 163
+91 163
+42 140
+96 153
+6 77
+6 83
+84 166
+48 79
+50 79
+63 111
+21 85
+55 117
+62 160
+4 101
+30 75
+42 87
+58 60
+88 178
+43 54
+90 120
+72 147
+30 70
+13 66
+89 166
+83 149
+69 160
+66 83
+89 142
diff --git a/geom_bottleneck/tests/data/test_561_B b/geom_bottleneck/tests/data/test_561_B
new file mode 100644
index 0000000..c60b08c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_561_B
@@ -0,0 +1,30 @@
+61 97
+8 94
+32 68
+55 101
+24 56
+25 30
+33 79
+16 111
+72 82
+42 86
+93 143
+94 163
+69 168
+68 100
+3 102
+9 72
+6 74
+4 46
+97 130
+15 27
+12 33
+62 67
+37 74
+0 76
+14 102
+33 95
+46 131
+89 90
+79 97
+100 109
diff --git a/geom_bottleneck/tests/data/test_562_A b/geom_bottleneck/tests/data/test_562_A
new file mode 100644
index 0000000..6dadf55
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_562_A
@@ -0,0 +1,30 @@
+12 41
+99 100
+15 60
+95 108
+9 108
+4 5
+96 161
+88 168
+12 106
+78 167
+80 164
+69 130
+88 161
+49 134
+18 76
+54 134
+45 136
+22 50
+21 78
+17 88
+46 117
+97 174
+25 95
+8 9
+43 123
+25 107
+58 73
+2 7
+89 152
+81 114
diff --git a/geom_bottleneck/tests/data/test_562_B b/geom_bottleneck/tests/data/test_562_B
new file mode 100644
index 0000000..48eaf77
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_562_B
@@ -0,0 +1,30 @@
+5 104
+17 105
+43 120
+87 88
+35 71
+47 55
+57 87
+66 119
+26 114
+4 9
+29 70
+40 95
+61 73
+20 31
+85 148
+47 59
+34 43
+36 50
+70 77
+30 47
+36 56
+9 55
+35 127
+36 84
+83 118
+90 98
+69 85
+34 104
+76 127
+78 99
diff --git a/geom_bottleneck/tests/data/test_563_A b/geom_bottleneck/tests/data/test_563_A
new file mode 100644
index 0000000..954685e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_563_A
@@ -0,0 +1,30 @@
+51 145
+19 119
+94 179
+8 35
+90 155
+34 39
+55 96
+19 27
+84 95
+12 52
+14 101
+72 143
+1 14
+88 138
+95 109
+85 134
+54 149
+35 85
+50 55
+93 173
+81 108
+14 112
+23 67
+13 14
+21 37
+89 177
+63 163
+2 89
+5 61
+18 76
diff --git a/geom_bottleneck/tests/data/test_563_B b/geom_bottleneck/tests/data/test_563_B
new file mode 100644
index 0000000..c3d7844
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_563_B
@@ -0,0 +1,30 @@
+40 75
+52 88
+0 33
+63 134
+19 77
+34 106
+67 164
+6 61
+67 144
+41 105
+30 108
+17 24
+97 105
+61 90
+45 80
+34 52
+58 140
+46 52
+4 13
+43 143
+74 168
+85 148
+24 55
+80 84
+3 56
+39 138
+1 30
+14 20
+14 91
+42 48
diff --git a/geom_bottleneck/tests/data/test_564_A b/geom_bottleneck/tests/data/test_564_A
new file mode 100644
index 0000000..a39b7ae
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_564_A
@@ -0,0 +1,30 @@
+85 112
+83 119
+84 128
+36 100
+18 112
+83 89
+17 80
+68 147
+32 76
+42 46
+29 89
+9 49
+40 135
+65 75
+69 113
+87 184
+81 103
+13 81
+44 99
+17 51
+99 102
+86 89
+29 124
+52 140
+19 54
+73 173
+89 172
+6 33
+80 139
+52 58
diff --git a/geom_bottleneck/tests/data/test_564_B b/geom_bottleneck/tests/data/test_564_B
new file mode 100644
index 0000000..22adad2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_564_B
@@ -0,0 +1,30 @@
+56 66
+92 164
+7 68
+87 135
+45 70
+94 109
+32 103
+44 73
+36 124
+50 139
+88 102
+17 116
+3 61
+90 149
+41 62
+13 42
+19 51
+96 105
+55 143
+67 165
+44 129
+72 171
+20 51
+36 119
+35 96
+33 107
+48 106
+9 30
+36 110
+90 114
diff --git a/geom_bottleneck/tests/data/test_565_A b/geom_bottleneck/tests/data/test_565_A
new file mode 100644
index 0000000..34eb265
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_565_A
@@ -0,0 +1,30 @@
+33 61
+68 78
+90 98
+66 127
+93 152
+21 29
+49 52
+78 171
+42 55
+95 159
+82 141
+85 152
+22 25
+71 132
+24 75
+3 82
+42 131
+24 73
+89 155
+32 132
+77 159
+97 165
+89 92
+50 82
+52 102
+11 64
+47 135
+45 89
+11 52
+11 25
diff --git a/geom_bottleneck/tests/data/test_565_B b/geom_bottleneck/tests/data/test_565_B
new file mode 100644
index 0000000..da5ed1d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_565_B
@@ -0,0 +1,30 @@
+46 66
+86 178
+19 102
+97 140
+22 97
+49 97
+6 48
+23 105
+92 157
+85 103
+67 167
+29 44
+88 183
+85 184
+90 93
+23 113
+30 106
+32 130
+81 154
+76 141
+75 101
+26 84
+9 77
+53 73
+23 84
+83 85
+6 44
+29 31
+26 107
+61 114
diff --git a/geom_bottleneck/tests/data/test_566_A b/geom_bottleneck/tests/data/test_566_A
new file mode 100644
index 0000000..55d0a13
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_566_A
@@ -0,0 +1,30 @@
+4 34
+20 53
+59 101
+40 70
+29 58
+67 107
+92 122
+35 120
+34 98
+34 79
+17 20
+12 53
+69 167
+19 88
+92 118
+21 73
+54 78
+0 83
+41 127
+34 59
+41 106
+4 102
+46 48
+99 189
+15 25
+17 19
+25 33
+25 108
+25 105
+64 99
diff --git a/geom_bottleneck/tests/data/test_566_B b/geom_bottleneck/tests/data/test_566_B
new file mode 100644
index 0000000..57c08b6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_566_B
@@ -0,0 +1,30 @@
+36 121
+5 33
+47 137
+95 158
+43 105
+4 15
+0 59
+30 36
+29 106
+58 126
+81 129
+63 108
+52 147
+80 163
+93 94
+32 122
+12 92
+74 135
+25 28
+11 107
+91 182
+68 90
+90 106
+96 126
+83 117
+57 147
+89 181
+36 107
+24 68
+83 131
diff --git a/geom_bottleneck/tests/data/test_567_A b/geom_bottleneck/tests/data/test_567_A
new file mode 100644
index 0000000..3304c25
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_567_A
@@ -0,0 +1,30 @@
+67 79
+12 58
+33 85
+25 70
+79 128
+34 59
+22 45
+100 102
+25 57
+30 113
+77 89
+74 83
+43 138
+30 81
+26 64
+91 94
+83 149
+83 119
+44 46
+79 105
+49 140
+58 110
+92 104
+8 65
+40 52
+46 60
+9 17
+25 47
+25 125
+95 109
diff --git a/geom_bottleneck/tests/data/test_567_B b/geom_bottleneck/tests/data/test_567_B
new file mode 100644
index 0000000..4a8f5fa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_567_B
@@ -0,0 +1,30 @@
+46 93
+85 165
+2 24
+29 81
+88 99
+94 109
+78 82
+54 69
+43 139
+3 40
+37 117
+98 138
+12 71
+75 84
+9 100
+56 65
+97 146
+56 105
+17 82
+11 44
+93 100
+6 99
+32 128
+9 35
+9 41
+66 123
+66 163
+34 110
+47 82
+15 97
diff --git a/geom_bottleneck/tests/data/test_568_A b/geom_bottleneck/tests/data/test_568_A
new file mode 100644
index 0000000..e6e0ecb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_568_A
@@ -0,0 +1,30 @@
+20 98
+14 51
+82 116
+80 117
+96 109
+61 101
+44 75
+76 80
+64 96
+100 158
+13 89
+84 138
+0 16
+94 138
+32 117
+68 157
+7 24
+1 56
+72 101
+47 128
+85 90
+66 155
+33 106
+97 144
+50 139
+10 54
+23 77
+87 106
+37 104
+11 37
diff --git a/geom_bottleneck/tests/data/test_568_B b/geom_bottleneck/tests/data/test_568_B
new file mode 100644
index 0000000..081ff5e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_568_B
@@ -0,0 +1,30 @@
+49 147
+26 112
+32 71
+30 50
+77 136
+10 110
+50 71
+14 110
+4 24
+64 125
+54 121
+58 142
+50 51
+0 63
+7 96
+49 146
+64 111
+53 122
+2 84
+56 102
+44 102
+5 78
+61 90
+32 92
+99 157
+100 188
+37 70
+6 7
+58 139
+52 138
diff --git a/geom_bottleneck/tests/data/test_569_A b/geom_bottleneck/tests/data/test_569_A
new file mode 100644
index 0000000..7fc96cf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_569_A
@@ -0,0 +1,30 @@
+83 116
+33 112
+58 86
+3 65
+21 46
+51 58
+47 138
+88 112
+4 84
+4 8
+46 74
+74 132
+54 120
+2 68
+99 119
+5 43
+5 61
+54 75
+83 169
+100 192
+47 133
+27 28
+44 128
+19 77
+60 160
+46 55
+78 169
+16 82
+60 97
+57 60
diff --git a/geom_bottleneck/tests/data/test_569_B b/geom_bottleneck/tests/data/test_569_B
new file mode 100644
index 0000000..b732aac
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_569_B
@@ -0,0 +1,30 @@
+51 97
+59 91
+9 11
+49 50
+54 111
+44 132
+22 53
+11 80
+22 101
+76 79
+29 112
+99 123
+67 116
+69 110
+27 51
+22 55
+3 58
+43 84
+18 68
+88 134
+28 29
+70 137
+36 37
+85 168
+4 69
+50 99
+27 117
+12 69
+55 127
+23 28
diff --git a/geom_bottleneck/tests/data/test_570_A b/geom_bottleneck/tests/data/test_570_A
new file mode 100644
index 0000000..371835b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_570_A
@@ -0,0 +1,30 @@
+30 76
+17 43
+84 85
+45 52
+85 117
+95 172
+36 58
+6 12
+70 147
+82 114
+67 163
+1 85
+1 92
+23 80
+58 60
+42 123
+100 148
+52 127
+45 49
+33 47
+48 124
+77 169
+5 64
+24 49
+16 40
+83 130
+86 121
+73 157
+88 124
+59 80
diff --git a/geom_bottleneck/tests/data/test_570_B b/geom_bottleneck/tests/data/test_570_B
new file mode 100644
index 0000000..3ce3450
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_570_B
@@ -0,0 +1,30 @@
+44 134
+28 120
+0 58
+32 41
+64 82
+7 91
+32 123
+22 46
+87 159
+3 13
+79 102
+37 80
+77 91
+64 126
+43 128
+53 107
+50 89
+15 111
+37 101
+6 51
+11 41
+66 110
+99 191
+8 53
+12 59
+53 91
+9 51
+47 57
+35 88
+83 134
diff --git a/geom_bottleneck/tests/data/test_571_A b/geom_bottleneck/tests/data/test_571_A
new file mode 100644
index 0000000..6b58a17
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_571_A
@@ -0,0 +1,30 @@
+73 83
+85 94
+20 39
+62 71
+100 146
+84 95
+21 64
+62 136
+49 90
+39 129
+92 156
+27 105
+48 66
+5 100
+86 186
+74 118
+93 173
+93 143
+91 173
+5 59
+75 78
+98 106
+37 125
+24 60
+24 117
+83 131
+69 137
+1 54
+81 154
+26 124
diff --git a/geom_bottleneck/tests/data/test_571_B b/geom_bottleneck/tests/data/test_571_B
new file mode 100644
index 0000000..0bb3b3e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_571_B
@@ -0,0 +1,30 @@
+90 159
+93 97
+57 109
+87 127
+96 185
+53 142
+59 125
+54 132
+26 48
+54 150
+63 65
+36 50
+3 19
+19 95
+47 76
+25 36
+34 70
+63 126
+99 199
+11 38
+96 120
+89 162
+55 125
+3 98
+11 31
+18 103
+68 101
+47 68
+45 48
+36 59
diff --git a/geom_bottleneck/tests/data/test_572_A b/geom_bottleneck/tests/data/test_572_A
new file mode 100644
index 0000000..052ddfe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_572_A
@@ -0,0 +1,30 @@
+83 96
+59 158
+99 133
+98 139
+71 163
+95 138
+83 97
+46 72
+23 29
+49 133
+60 63
+6 84
+33 86
+33 71
+99 188
+51 61
+79 150
+38 61
+68 147
+98 170
+77 131
+32 97
+57 119
+36 37
+66 75
+37 68
+72 150
+42 99
+28 90
+56 123
diff --git a/geom_bottleneck/tests/data/test_572_B b/geom_bottleneck/tests/data/test_572_B
new file mode 100644
index 0000000..d816eab
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_572_B
@@ -0,0 +1,30 @@
+44 61
+72 88
+8 15
+78 155
+90 99
+87 106
+50 57
+60 126
+75 175
+81 135
+94 181
+6 52
+64 152
+63 79
+23 105
+88 104
+68 145
+9 26
+23 68
+49 144
+5 9
+62 156
+6 94
+61 159
+82 130
+26 84
+78 110
+27 75
+41 123
+56 147
diff --git a/geom_bottleneck/tests/data/test_573_A b/geom_bottleneck/tests/data/test_573_A
new file mode 100644
index 0000000..fe68d64
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_573_A
@@ -0,0 +1,30 @@
+43 94
+41 75
+26 69
+43 58
+64 94
+54 98
+19 106
+99 119
+52 115
+79 88
+77 84
+96 118
+55 80
+47 114
+64 137
+79 158
+38 60
+79 136
+57 82
+17 103
+28 82
+28 35
+74 86
+99 121
+96 176
+0 55
+2 76
+85 155
+9 40
+76 118
diff --git a/geom_bottleneck/tests/data/test_573_B b/geom_bottleneck/tests/data/test_573_B
new file mode 100644
index 0000000..9824068
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_573_B
@@ -0,0 +1,30 @@
+60 107
+11 66
+34 94
+40 87
+1 4
+43 67
+25 76
+73 108
+86 178
+25 58
+95 99
+82 97
+13 54
+58 88
+38 78
+44 131
+92 99
+5 88
+98 120
+56 112
+45 112
+69 110
+48 121
+53 83
+20 52
+3 45
+49 126
+13 17
+30 83
+97 121
diff --git a/geom_bottleneck/tests/data/test_574_A b/geom_bottleneck/tests/data/test_574_A
new file mode 100644
index 0000000..9dbb066
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_574_A
@@ -0,0 +1,30 @@
+21 109
+12 79
+44 58
+0 97
+30 124
+58 154
+91 150
+1 92
+34 43
+18 109
+10 11
+0 84
+30 56
+66 166
+43 80
+77 167
+61 94
+58 136
+20 110
+84 144
+100 182
+8 80
+79 124
+89 164
+61 84
+69 129
+30 111
+67 105
+69 70
+38 108
diff --git a/geom_bottleneck/tests/data/test_574_B b/geom_bottleneck/tests/data/test_574_B
new file mode 100644
index 0000000..dc0f4c7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_574_B
@@ -0,0 +1,30 @@
+24 53
+49 112
+58 149
+49 136
+66 149
+10 87
+36 113
+66 144
+87 150
+20 40
+41 136
+80 111
+99 199
+76 131
+7 72
+99 122
+93 124
+5 8
+97 105
+23 27
+82 102
+30 84
+62 143
+8 48
+40 119
+29 62
+11 68
+75 128
+68 124
+23 26
diff --git a/geom_bottleneck/tests/data/test_575_A b/geom_bottleneck/tests/data/test_575_A
new file mode 100644
index 0000000..7703382
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_575_A
@@ -0,0 +1,30 @@
+78 141
+24 58
+30 120
+71 72
+4 21
+30 61
+7 52
+16 91
+58 109
+28 97
+46 86
+65 134
+86 151
+77 134
+6 32
+31 83
+84 180
+53 118
+78 108
+88 115
+75 137
+92 149
+57 120
+94 109
+59 131
+5 36
+39 91
+65 138
+96 167
+87 164
diff --git a/geom_bottleneck/tests/data/test_575_B b/geom_bottleneck/tests/data/test_575_B
new file mode 100644
index 0000000..a5ba6b7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_575_B
@@ -0,0 +1,30 @@
+77 176
+11 43
+38 70
+64 163
+70 101
+18 66
+50 119
+30 48
+18 88
+85 106
+50 56
+42 134
+25 92
+5 53
+86 101
+44 91
+61 127
+42 55
+31 103
+15 23
+93 117
+45 68
+39 84
+64 135
+86 109
+82 174
+72 73
+43 73
+37 41
+71 76
diff --git a/geom_bottleneck/tests/data/test_576_A b/geom_bottleneck/tests/data/test_576_A
new file mode 100644
index 0000000..57eb281
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_576_A
@@ -0,0 +1,30 @@
+61 135
+79 123
+27 28
+4 48
+44 120
+40 69
+28 82
+4 45
+28 82
+70 145
+14 102
+84 169
+89 121
+67 137
+65 141
+39 60
+97 162
+90 187
+23 78
+71 168
+76 98
+85 101
+9 86
+57 89
+86 109
+55 62
+90 101
+82 110
+100 153
+33 67
diff --git a/geom_bottleneck/tests/data/test_576_B b/geom_bottleneck/tests/data/test_576_B
new file mode 100644
index 0000000..fa63de8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_576_B
@@ -0,0 +1,30 @@
+83 145
+27 62
+71 125
+78 175
+11 55
+81 94
+91 141
+27 103
+68 97
+54 89
+68 143
+50 100
+65 85
+84 179
+83 96
+44 121
+13 86
+29 86
+72 172
+95 140
+83 161
+83 100
+98 167
+8 66
+75 101
+6 50
+10 58
+5 57
+51 77
+87 140
diff --git a/geom_bottleneck/tests/data/test_577_A b/geom_bottleneck/tests/data/test_577_A
new file mode 100644
index 0000000..d086e3f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_577_A
@@ -0,0 +1,30 @@
+65 94
+1 2
+30 31
+91 131
+75 170
+38 85
+51 73
+78 155
+43 141
+54 109
+53 54
+36 74
+75 80
+51 144
+33 127
+31 89
+0 10
+18 87
+11 18
+51 126
+64 91
+7 51
+26 71
+92 160
+24 44
+0 58
+3 78
+2 67
+12 88
+68 130
diff --git a/geom_bottleneck/tests/data/test_577_B b/geom_bottleneck/tests/data/test_577_B
new file mode 100644
index 0000000..e48e09a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_577_B
@@ -0,0 +1,30 @@
+90 189
+96 195
+64 91
+81 84
+42 76
+17 19
+76 77
+64 149
+85 99
+90 147
+60 95
+59 155
+29 121
+27 104
+10 72
+32 79
+44 129
+9 70
+68 136
+9 75
+27 89
+70 148
+77 149
+8 91
+24 84
+90 123
+86 105
+64 94
+84 109
+31 51
diff --git a/geom_bottleneck/tests/data/test_578_A b/geom_bottleneck/tests/data/test_578_A
new file mode 100644
index 0000000..8b9a6fe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_578_A
@@ -0,0 +1,30 @@
+9 99
+58 83
+62 110
+32 102
+86 169
+95 131
+1 6
+1 55
+88 154
+67 95
+21 22
+31 118
+15 52
+64 92
+36 87
+18 106
+71 150
+10 55
+67 97
+53 145
+31 40
+33 62
+79 116
+70 110
+96 145
+86 182
+43 116
+54 145
+100 172
+74 84
diff --git a/geom_bottleneck/tests/data/test_578_B b/geom_bottleneck/tests/data/test_578_B
new file mode 100644
index 0000000..636f20d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_578_B
@@ -0,0 +1,30 @@
+33 36
+89 175
+83 151
+61 138
+4 15
+9 58
+38 111
+29 117
+22 79
+26 86
+48 55
+65 134
+60 84
+23 96
+69 149
+29 48
+38 137
+39 51
+88 112
+14 41
+29 119
+52 56
+55 96
+58 127
+78 148
+44 64
+35 108
+69 124
+6 80
+43 77
diff --git a/geom_bottleneck/tests/data/test_579_A b/geom_bottleneck/tests/data/test_579_A
new file mode 100644
index 0000000..99bbb96
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_579_A
@@ -0,0 +1,30 @@
+90 170
+5 32
+49 116
+37 88
+19 64
+81 177
+39 77
+37 123
+53 127
+31 76
+67 114
+51 125
+48 121
+59 62
+31 119
+35 90
+100 117
+33 130
+22 74
+23 41
+71 159
+3 57
+22 61
+86 123
+91 115
+66 92
+39 104
+85 134
+72 160
+6 94
diff --git a/geom_bottleneck/tests/data/test_579_B b/geom_bottleneck/tests/data/test_579_B
new file mode 100644
index 0000000..6d3e9b6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_579_B
@@ -0,0 +1,30 @@
+76 123
+2 17
+41 123
+62 138
+40 70
+92 164
+70 105
+63 109
+14 23
+26 109
+78 141
+85 162
+37 49
+27 96
+62 68
+80 136
+30 72
+44 85
+59 122
+42 137
+67 140
+81 181
+43 84
+91 108
+71 86
+30 45
+76 94
+25 57
+25 71
+70 90
diff --git a/geom_bottleneck/tests/data/test_580_A b/geom_bottleneck/tests/data/test_580_A
new file mode 100644
index 0000000..b8d1c86
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_580_A
@@ -0,0 +1,50 @@
+34 78
+25 82
+42 132
+77 154
+15 52
+54 69
+68 78
+36 111
+9 24
+30 53
+53 117
+84 163
+91 124
+13 76
+20 59
+67 151
+17 103
+76 156
+3 41
+2 37
+65 158
+67 75
+42 125
+83 115
+47 147
+13 44
+83 133
+92 146
+57 125
+66 103
+55 69
+39 63
+16 63
+98 108
+23 93
+12 30
+7 70
+70 131
+49 127
+83 90
+97 171
+35 81
+78 130
+88 143
+62 124
+2 40
+66 110
+51 61
+2 25
+69 74
diff --git a/geom_bottleneck/tests/data/test_580_B b/geom_bottleneck/tests/data/test_580_B
new file mode 100644
index 0000000..1fd48af
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_580_B
@@ -0,0 +1,50 @@
+60 156
+65 78
+70 102
+52 113
+64 154
+45 126
+45 86
+6 49
+7 93
+99 127
+15 33
+1 36
+12 30
+30 89
+41 84
+66 131
+8 23
+0 9
+95 149
+47 83
+69 165
+79 91
+74 125
+59 77
+93 137
+33 119
+24 113
+98 116
+10 70
+57 124
+97 126
+48 113
+30 67
+2 15
+56 86
+75 111
+81 82
+99 196
+69 105
+51 147
+5 69
+40 136
+79 147
+44 136
+95 194
+67 93
+0 46
+26 90
+58 115
+40 87
diff --git a/geom_bottleneck/tests/data/test_581_A b/geom_bottleneck/tests/data/test_581_A
new file mode 100644
index 0000000..cf1555c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_581_A
@@ -0,0 +1,50 @@
+79 87
+81 162
+7 74
+53 79
+19 50
+30 106
+68 155
+17 79
+75 90
+55 71
+30 127
+57 145
+78 80
+11 96
+16 47
+56 131
+45 46
+75 136
+17 75
+72 74
+27 114
+28 112
+31 123
+37 110
+89 159
+57 85
+49 52
+72 130
+68 86
+88 152
+5 66
+67 71
+51 91
+72 82
+3 21
+21 38
+47 86
+37 108
+35 123
+49 119
+36 97
+36 119
+9 48
+16 36
+32 37
+38 68
+82 147
+39 79
+23 101
+33 104
diff --git a/geom_bottleneck/tests/data/test_581_B b/geom_bottleneck/tests/data/test_581_B
new file mode 100644
index 0000000..853ac92
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_581_B
@@ -0,0 +1,50 @@
+94 181
+38 90
+83 137
+36 93
+8 53
+59 118
+21 110
+94 175
+18 40
+94 120
+46 81
+54 145
+13 37
+36 100
+73 86
+67 166
+91 187
+11 15
+45 124
+23 29
+89 125
+78 101
+83 98
+52 73
+39 62
+15 86
+80 140
+100 181
+50 55
+80 124
+27 29
+19 76
+92 167
+12 57
+63 134
+45 46
+42 110
+93 179
+31 130
+59 137
+7 99
+77 107
+59 127
+82 160
+27 70
+100 200
+80 101
+16 97
+93 184
+15 48
diff --git a/geom_bottleneck/tests/data/test_582_A b/geom_bottleneck/tests/data/test_582_A
new file mode 100644
index 0000000..dcabc9f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_582_A
@@ -0,0 +1,50 @@
+85 106
+23 89
+31 90
+4 42
+45 104
+100 137
+32 115
+65 112
+25 82
+75 158
+74 147
+6 106
+92 179
+91 110
+94 150
+9 19
+91 110
+82 108
+39 90
+49 69
+73 89
+61 68
+22 85
+13 57
+86 102
+23 43
+29 65
+3 72
+85 131
+71 80
+83 89
+73 119
+28 46
+33 101
+18 24
+38 69
+50 51
+84 85
+75 175
+99 153
+84 86
+97 100
+68 115
+91 108
+62 77
+54 80
+7 49
+26 29
+53 101
+64 73
diff --git a/geom_bottleneck/tests/data/test_582_B b/geom_bottleneck/tests/data/test_582_B
new file mode 100644
index 0000000..9420fa9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_582_B
@@ -0,0 +1,50 @@
+99 153
+54 92
+64 65
+40 117
+28 70
+33 105
+70 105
+72 109
+9 34
+72 151
+1 46
+57 133
+51 72
+52 119
+44 92
+13 71
+96 191
+80 123
+47 121
+84 162
+69 111
+15 35
+41 45
+23 86
+36 107
+6 18
+63 118
+4 50
+84 107
+90 132
+74 127
+14 37
+75 167
+42 81
+53 76
+32 88
+2 70
+87 129
+7 8
+6 35
+70 115
+69 137
+80 174
+24 107
+66 116
+22 110
+4 90
+0 41
+63 160
+99 142
diff --git a/geom_bottleneck/tests/data/test_583_A b/geom_bottleneck/tests/data/test_583_A
new file mode 100644
index 0000000..cc36f56
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_583_A
@@ -0,0 +1,50 @@
+99 127
+62 97
+4 61
+70 121
+74 149
+79 158
+98 193
+22 53
+66 89
+45 58
+49 80
+56 89
+48 124
+100 166
+76 143
+32 33
+15 59
+16 91
+32 33
+1 21
+73 169
+84 171
+49 69
+52 146
+10 57
+26 112
+54 76
+92 125
+47 49
+53 107
+2 69
+99 186
+67 79
+13 113
+54 73
+1 72
+4 20
+43 112
+0 89
+77 150
+31 61
+24 29
+75 169
+56 143
+88 133
+37 38
+90 160
+97 189
+39 72
+30 38
diff --git a/geom_bottleneck/tests/data/test_583_B b/geom_bottleneck/tests/data/test_583_B
new file mode 100644
index 0000000..d021fb3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_583_B
@@ -0,0 +1,50 @@
+26 43
+87 160
+74 100
+69 139
+72 87
+22 58
+0 3
+67 133
+52 56
+67 97
+42 117
+30 44
+67 119
+91 164
+45 65
+35 127
+80 91
+75 160
+11 68
+86 92
+24 79
+90 156
+91 94
+64 114
+55 66
+72 80
+36 78
+85 114
+27 69
+40 75
+65 152
+48 106
+72 105
+63 109
+37 108
+48 84
+81 147
+14 91
+46 94
+6 14
+28 100
+41 103
+21 92
+40 111
+42 106
+86 136
+97 113
+24 79
+77 99
+80 89
diff --git a/geom_bottleneck/tests/data/test_584_A b/geom_bottleneck/tests/data/test_584_A
new file mode 100644
index 0000000..c934a50
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_584_A
@@ -0,0 +1,50 @@
+15 100
+30 70
+46 69
+99 128
+25 93
+75 90
+6 31
+47 141
+51 99
+98 133
+50 69
+3 27
+16 91
+36 95
+29 73
+26 76
+24 45
+9 105
+21 103
+46 81
+91 156
+77 141
+36 72
+92 122
+48 98
+34 105
+80 172
+92 136
+16 81
+30 100
+13 111
+1 51
+1 52
+66 140
+81 96
+18 69
+37 123
+82 132
+64 114
+6 26
+46 70
+39 74
+20 108
+70 128
+43 86
+50 71
+73 98
+42 74
+52 79
+42 101
diff --git a/geom_bottleneck/tests/data/test_584_B b/geom_bottleneck/tests/data/test_584_B
new file mode 100644
index 0000000..9f07efc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_584_B
@@ -0,0 +1,50 @@
+99 143
+58 93
+32 121
+23 112
+64 102
+73 110
+76 128
+18 108
+17 97
+82 97
+40 138
+43 92
+18 33
+36 60
+2 27
+67 132
+45 79
+40 78
+90 97
+98 163
+16 86
+74 83
+98 154
+7 74
+3 41
+43 55
+69 123
+54 154
+96 143
+66 98
+26 52
+6 47
+45 84
+17 50
+32 78
+15 25
+46 133
+41 115
+54 144
+19 39
+71 150
+77 133
+42 90
+100 165
+73 113
+63 67
+19 106
+11 18
+11 73
+67 69
diff --git a/geom_bottleneck/tests/data/test_585_A b/geom_bottleneck/tests/data/test_585_A
new file mode 100644
index 0000000..903e5b1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_585_A
@@ -0,0 +1,50 @@
+50 147
+39 41
+59 153
+79 105
+90 122
+21 31
+34 51
+27 64
+77 125
+46 115
+92 164
+81 167
+91 182
+15 87
+39 115
+43 113
+29 115
+9 60
+81 95
+45 89
+36 101
+29 41
+68 132
+40 110
+33 92
+2 3
+27 113
+90 152
+35 109
+48 90
+63 160
+46 102
+61 146
+48 68
+23 98
+53 91
+80 101
+50 55
+78 163
+89 126
+62 145
+64 129
+18 31
+27 110
+58 91
+6 20
+84 103
+54 120
+87 162
+97 144
diff --git a/geom_bottleneck/tests/data/test_585_B b/geom_bottleneck/tests/data/test_585_B
new file mode 100644
index 0000000..69f116a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_585_B
@@ -0,0 +1,50 @@
+41 56
+85 176
+84 155
+25 40
+33 60
+84 92
+66 123
+63 66
+24 60
+4 51
+74 84
+13 70
+4 15
+86 102
+29 120
+62 70
+29 94
+11 20
+71 162
+87 165
+24 118
+65 93
+28 97
+54 151
+42 126
+55 86
+50 150
+5 35
+80 103
+94 158
+85 147
+73 95
+26 96
+67 151
+38 102
+42 72
+8 36
+78 165
+15 16
+35 67
+0 64
+35 70
+15 69
+75 96
+17 44
+42 66
+41 68
+80 88
+35 128
+34 113
diff --git a/geom_bottleneck/tests/data/test_586_A b/geom_bottleneck/tests/data/test_586_A
new file mode 100644
index 0000000..ed8b673
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_586_A
@@ -0,0 +1,50 @@
+62 74
+15 108
+49 131
+94 134
+5 6
+24 120
+35 79
+48 73
+84 170
+67 86
+30 98
+6 12
+60 107
+8 106
+6 57
+69 74
+24 120
+20 52
+78 147
+24 124
+76 87
+7 46
+20 115
+68 98
+51 87
+87 147
+83 93
+15 108
+70 103
+63 65
+70 90
+52 112
+54 107
+86 114
+58 137
+93 148
+43 120
+3 55
+20 97
+14 25
+59 111
+68 119
+78 165
+16 50
+3 5
+89 173
+84 181
+93 184
+89 185
+23 61
diff --git a/geom_bottleneck/tests/data/test_586_B b/geom_bottleneck/tests/data/test_586_B
new file mode 100644
index 0000000..715be5e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_586_B
@@ -0,0 +1,50 @@
+5 85
+46 116
+51 79
+20 36
+51 96
+83 170
+40 116
+40 128
+55 92
+51 127
+45 111
+56 65
+16 56
+30 52
+38 84
+56 70
+48 88
+0 6
+99 148
+64 159
+30 101
+14 51
+49 116
+66 71
+9 78
+4 35
+84 128
+39 58
+85 96
+54 60
+14 89
+2 46
+40 120
+76 117
+14 80
+47 118
+86 175
+35 126
+77 112
+75 150
+14 52
+90 169
+25 32
+73 95
+92 157
+5 34
+62 131
+16 26
+5 103
+73 106
diff --git a/geom_bottleneck/tests/data/test_587_A b/geom_bottleneck/tests/data/test_587_A
new file mode 100644
index 0000000..883ddd7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_587_A
@@ -0,0 +1,50 @@
+66 164
+74 81
+56 140
+77 143
+72 139
+77 113
+59 106
+37 42
+58 158
+46 52
+7 30
+73 107
+46 70
+35 120
+74 103
+71 117
+26 93
+11 68
+35 60
+91 151
+33 122
+30 106
+43 134
+90 131
+32 95
+8 72
+4 39
+17 115
+22 32
+28 100
+37 126
+84 152
+72 107
+68 157
+95 193
+93 191
+56 154
+39 42
+5 45
+62 121
+73 166
+14 51
+89 140
+76 166
+85 150
+18 112
+22 103
+65 147
+96 181
+55 123
diff --git a/geom_bottleneck/tests/data/test_587_B b/geom_bottleneck/tests/data/test_587_B
new file mode 100644
index 0000000..589512c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_587_B
@@ -0,0 +1,50 @@
+4 57
+12 64
+65 153
+73 111
+37 134
+11 54
+78 176
+33 77
+31 131
+14 101
+25 107
+83 112
+17 92
+59 139
+4 104
+82 114
+18 64
+13 72
+1 96
+72 112
+19 90
+23 34
+46 63
+45 79
+88 89
+16 105
+100 191
+31 46
+45 133
+86 119
+17 18
+59 140
+49 97
+31 47
+98 154
+70 99
+61 75
+31 34
+4 19
+46 122
+55 57
+81 171
+25 61
+18 89
+0 11
+48 79
+94 128
+73 122
+17 56
+19 39
diff --git a/geom_bottleneck/tests/data/test_588_A b/geom_bottleneck/tests/data/test_588_A
new file mode 100644
index 0000000..c486b96
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_588_A
@@ -0,0 +1,50 @@
+96 166
+5 58
+87 143
+50 104
+31 106
+80 106
+99 106
+46 52
+42 127
+10 86
+17 18
+20 94
+49 65
+10 75
+85 132
+13 54
+75 123
+8 13
+83 153
+25 47
+57 135
+14 57
+1 37
+29 34
+13 26
+52 94
+62 97
+93 153
+69 84
+87 88
+73 100
+54 97
+11 72
+51 143
+66 94
+85 178
+60 73
+36 126
+99 134
+23 68
+72 134
+81 138
+28 42
+65 84
+11 28
+15 38
+18 51
+79 149
+76 114
+33 53
diff --git a/geom_bottleneck/tests/data/test_588_B b/geom_bottleneck/tests/data/test_588_B
new file mode 100644
index 0000000..13829bc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_588_B
@@ -0,0 +1,50 @@
+87 173
+41 85
+10 87
+43 78
+99 128
+35 64
+28 66
+9 67
+100 194
+22 89
+0 15
+77 90
+59 60
+92 93
+32 84
+62 112
+54 151
+46 47
+52 94
+17 113
+21 100
+5 48
+87 114
+71 112
+2 67
+65 120
+26 74
+69 132
+47 83
+14 20
+5 13
+56 137
+57 79
+76 132
+30 31
+89 145
+84 130
+78 158
+44 76
+70 125
+95 127
+6 53
+17 110
+93 158
+61 94
+32 111
+20 113
+26 105
+63 112
+36 37
diff --git a/geom_bottleneck/tests/data/test_589_A b/geom_bottleneck/tests/data/test_589_A
new file mode 100644
index 0000000..7743778
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_589_A
@@ -0,0 +1,50 @@
+71 126
+62 78
+69 164
+34 56
+82 167
+61 138
+63 94
+17 27
+81 135
+94 145
+24 39
+93 134
+99 152
+38 91
+27 100
+21 115
+69 120
+8 42
+93 122
+87 155
+18 104
+0 2
+41 104
+63 159
+93 139
+74 167
+3 94
+68 92
+30 44
+24 101
+8 104
+8 61
+59 111
+53 91
+43 68
+52 143
+11 48
+74 152
+20 115
+27 100
+65 81
+63 67
+84 85
+16 30
+71 80
+58 116
+95 188
+96 106
+7 94
+38 45
diff --git a/geom_bottleneck/tests/data/test_589_B b/geom_bottleneck/tests/data/test_589_B
new file mode 100644
index 0000000..bbd5038
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_589_B
@@ -0,0 +1,50 @@
+28 114
+87 171
+0 35
+94 100
+98 147
+53 68
+64 95
+54 145
+45 76
+22 98
+83 155
+31 89
+27 79
+32 37
+28 58
+77 139
+87 143
+80 152
+25 28
+61 123
+0 4
+25 42
+64 159
+34 37
+84 153
+13 93
+25 69
+80 112
+89 163
+18 77
+35 119
+35 114
+39 60
+90 187
+0 33
+11 80
+52 140
+59 73
+92 168
+76 91
+49 88
+80 130
+37 104
+65 146
+14 56
+66 95
+87 182
+12 102
+78 135
+73 143
diff --git a/geom_bottleneck/tests/data/test_590_A b/geom_bottleneck/tests/data/test_590_A
new file mode 100644
index 0000000..3dfb2df
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_590_A
@@ -0,0 +1,50 @@
+31 67
+88 180
+59 105
+31 117
+19 50
+43 59
+9 60
+4 58
+80 144
+47 71
+63 139
+14 68
+38 136
+8 52
+35 81
+56 116
+81 168
+56 99
+95 142
+24 121
+29 100
+88 174
+47 95
+40 93
+7 25
+3 84
+48 94
+90 128
+59 137
+96 164
+95 115
+69 105
+81 139
+59 65
+66 71
+53 84
+20 59
+29 61
+77 150
+48 138
+41 125
+53 86
+5 86
+42 69
+17 54
+70 105
+69 148
+18 58
+72 100
+67 77
diff --git a/geom_bottleneck/tests/data/test_590_B b/geom_bottleneck/tests/data/test_590_B
new file mode 100644
index 0000000..18d6a7f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_590_B
@@ -0,0 +1,50 @@
+79 84
+10 56
+10 18
+78 175
+50 74
+8 104
+77 116
+5 45
+48 116
+17 92
+72 159
+66 113
+51 140
+60 101
+76 120
+52 75
+3 71
+31 53
+75 156
+93 172
+4 93
+11 42
+89 167
+19 49
+62 119
+55 97
+39 68
+74 140
+64 97
+97 154
+30 98
+16 59
+18 68
+66 139
+9 44
+56 74
+61 82
+51 115
+45 51
+89 121
+71 134
+82 119
+13 113
+36 43
+21 121
+24 115
+37 65
+99 100
+36 135
+37 96
diff --git a/geom_bottleneck/tests/data/test_591_A b/geom_bottleneck/tests/data/test_591_A
new file mode 100644
index 0000000..411c1bb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_591_A
@@ -0,0 +1,50 @@
+13 93
+48 89
+12 53
+4 87
+91 181
+15 16
+29 59
+38 57
+8 29
+73 165
+29 44
+45 67
+24 74
+50 91
+88 162
+30 105
+80 134
+58 61
+69 135
+31 107
+0 15
+17 115
+72 74
+45 50
+75 115
+76 97
+61 89
+45 112
+59 97
+32 50
+85 88
+35 124
+95 112
+76 147
+69 84
+12 47
+100 154
+92 163
+4 55
+23 76
+85 100
+96 170
+28 87
+17 116
+44 57
+22 118
+51 134
+32 91
+8 14
+25 80
diff --git a/geom_bottleneck/tests/data/test_591_B b/geom_bottleneck/tests/data/test_591_B
new file mode 100644
index 0000000..cc96d2f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_591_B
@@ -0,0 +1,50 @@
+85 150
+85 96
+57 94
+13 112
+48 89
+7 17
+47 136
+96 173
+100 144
+12 76
+75 90
+51 116
+33 72
+21 65
+41 66
+80 104
+4 53
+71 72
+52 77
+93 94
+20 76
+29 101
+47 104
+33 87
+47 48
+73 161
+32 37
+4 74
+30 57
+56 109
+95 138
+76 135
+70 160
+59 136
+29 105
+75 169
+100 154
+67 139
+28 104
+89 121
+1 18
+7 47
+100 134
+3 4
+29 85
+79 129
+48 89
+97 191
+60 153
+100 199
diff --git a/geom_bottleneck/tests/data/test_592_A b/geom_bottleneck/tests/data/test_592_A
new file mode 100644
index 0000000..bac0698
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_592_A
@@ -0,0 +1,50 @@
+59 132
+83 149
+50 62
+45 103
+28 32
+74 163
+78 151
+19 85
+26 113
+42 136
+87 123
+49 108
+7 69
+45 84
+96 153
+50 112
+3 72
+91 136
+16 79
+56 105
+92 170
+92 177
+15 57
+13 104
+90 112
+16 87
+99 154
+91 174
+49 76
+39 137
+38 59
+25 33
+88 113
+85 136
+38 67
+44 73
+75 166
+60 131
+56 155
+86 105
+69 75
+54 108
+8 79
+68 103
+56 133
+29 91
+57 77
+42 109
+97 170
+89 92
diff --git a/geom_bottleneck/tests/data/test_592_B b/geom_bottleneck/tests/data/test_592_B
new file mode 100644
index 0000000..bc8a8c6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_592_B
@@ -0,0 +1,50 @@
+73 140
+34 69
+82 101
+44 70
+26 87
+76 151
+18 43
+14 83
+35 126
+31 86
+59 125
+89 160
+33 38
+38 79
+54 77
+51 91
+75 87
+4 94
+2 23
+75 152
+1 8
+65 100
+60 80
+62 96
+40 116
+0 66
+10 99
+21 48
+98 161
+0 35
+18 25
+61 68
+58 152
+97 161
+43 99
+25 35
+55 59
+78 151
+6 94
+17 60
+98 142
+81 119
+2 29
+0 95
+55 141
+29 99
+14 44
+32 68
+31 107
+26 74
diff --git a/geom_bottleneck/tests/data/test_593_A b/geom_bottleneck/tests/data/test_593_A
new file mode 100644
index 0000000..e62ec21
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_593_A
@@ -0,0 +1,50 @@
+15 96
+50 89
+53 59
+42 45
+76 150
+24 110
+27 126
+26 79
+93 132
+65 100
+38 134
+14 68
+88 130
+92 120
+36 122
+24 77
+11 102
+56 91
+12 77
+89 131
+57 137
+86 173
+38 66
+7 27
+49 134
+38 81
+100 122
+85 98
+96 147
+25 80
+49 88
+32 127
+42 122
+3 11
+25 59
+11 31
+82 151
+97 187
+55 99
+11 71
+14 28
+80 105
+4 74
+89 113
+99 127
+40 75
+86 121
+44 52
+74 123
+51 105
diff --git a/geom_bottleneck/tests/data/test_593_B b/geom_bottleneck/tests/data/test_593_B
new file mode 100644
index 0000000..a5150da
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_593_B
@@ -0,0 +1,50 @@
+70 127
+81 175
+6 42
+67 74
+18 95
+32 33
+98 188
+25 67
+99 170
+60 119
+35 79
+20 42
+28 64
+92 129
+26 110
+95 123
+37 130
+25 97
+44 136
+30 78
+42 72
+52 139
+80 177
+44 143
+79 122
+100 198
+74 90
+15 73
+48 63
+66 146
+77 168
+28 66
+72 103
+23 77
+84 133
+37 127
+70 139
+85 129
+13 32
+57 151
+26 83
+7 45
+14 16
+23 70
+94 117
+71 148
+9 89
+20 109
+64 85
+27 106
diff --git a/geom_bottleneck/tests/data/test_594_A b/geom_bottleneck/tests/data/test_594_A
new file mode 100644
index 0000000..ca81d4c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_594_A
@@ -0,0 +1,50 @@
+49 127
+45 58
+50 143
+52 55
+32 102
+79 154
+36 134
+61 161
+41 134
+31 71
+51 86
+88 135
+68 93
+30 68
+8 80
+3 68
+36 101
+15 73
+51 132
+95 180
+27 43
+28 56
+58 73
+32 108
+85 179
+11 17
+65 159
+6 40
+27 53
+72 151
+66 114
+17 56
+84 95
+35 80
+85 110
+97 167
+74 84
+96 134
+76 117
+61 99
+20 91
+89 114
+1 32
+0 29
+71 138
+53 123
+78 96
+57 138
+7 89
+92 105
diff --git a/geom_bottleneck/tests/data/test_594_B b/geom_bottleneck/tests/data/test_594_B
new file mode 100644
index 0000000..d366e85
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_594_B
@@ -0,0 +1,50 @@
+46 86
+23 69
+40 50
+66 89
+63 123
+23 108
+61 79
+59 144
+60 156
+49 88
+60 92
+65 101
+56 64
+3 53
+84 141
+39 79
+36 101
+8 82
+61 138
+29 78
+14 108
+29 122
+93 124
+53 95
+70 89
+10 102
+10 104
+23 27
+6 53
+8 41
+86 164
+8 41
+51 120
+27 63
+33 60
+62 99
+56 119
+58 84
+39 118
+25 86
+6 67
+50 56
+91 173
+71 121
+28 51
+88 142
+90 186
+69 149
+87 102
+60 129
diff --git a/geom_bottleneck/tests/data/test_595_A b/geom_bottleneck/tests/data/test_595_A
new file mode 100644
index 0000000..805de28
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_595_A
@@ -0,0 +1,50 @@
+39 91
+72 162
+80 123
+46 113
+51 65
+80 149
+72 132
+27 124
+17 111
+17 71
+86 120
+82 102
+71 117
+33 86
+15 84
+76 146
+69 102
+97 153
+91 185
+5 53
+61 95
+85 107
+92 101
+80 113
+12 63
+62 111
+29 109
+33 77
+91 134
+49 138
+30 57
+70 106
+98 110
+87 168
+76 140
+20 109
+58 71
+56 99
+49 117
+60 118
+63 149
+9 92
+14 94
+12 52
+21 37
+37 91
+65 107
+98 101
+71 131
+54 108
diff --git a/geom_bottleneck/tests/data/test_595_B b/geom_bottleneck/tests/data/test_595_B
new file mode 100644
index 0000000..c458a54
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_595_B
@@ -0,0 +1,50 @@
+92 101
+74 76
+47 115
+99 119
+19 44
+57 156
+21 59
+12 86
+92 168
+73 148
+92 164
+47 130
+32 96
+22 116
+58 99
+85 169
+66 147
+31 117
+17 107
+83 158
+10 54
+95 129
+88 158
+72 78
+98 125
+99 170
+22 79
+10 16
+2 31
+52 62
+16 40
+31 103
+38 100
+32 82
+71 133
+55 135
+74 158
+13 45
+6 12
+13 43
+44 57
+25 51
+88 112
+35 66
+31 83
+28 59
+44 103
+40 131
+100 124
+21 107
diff --git a/geom_bottleneck/tests/data/test_596_A b/geom_bottleneck/tests/data/test_596_A
new file mode 100644
index 0000000..3a32cf7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_596_A
@@ -0,0 +1,50 @@
+95 140
+26 108
+52 84
+39 95
+18 48
+29 105
+64 114
+75 103
+59 80
+11 95
+41 52
+43 123
+51 77
+31 54
+64 130
+23 79
+82 102
+53 94
+13 14
+19 74
+74 109
+71 140
+93 94
+76 82
+43 48
+46 70
+53 121
+35 68
+30 32
+13 53
+28 60
+51 111
+64 142
+84 153
+15 79
+89 140
+39 136
+15 37
+35 115
+15 105
+16 62
+3 77
+93 107
+88 104
+56 113
+59 142
+11 52
+22 64
+66 138
+32 75
diff --git a/geom_bottleneck/tests/data/test_596_B b/geom_bottleneck/tests/data/test_596_B
new file mode 100644
index 0000000..1b9c765
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_596_B
@@ -0,0 +1,50 @@
+73 154
+65 99
+56 77
+56 70
+67 75
+4 26
+31 64
+89 106
+73 91
+31 43
+98 185
+50 138
+79 131
+47 73
+16 55
+35 98
+24 100
+67 72
+44 95
+66 101
+40 91
+53 90
+6 67
+57 67
+15 111
+2 43
+3 18
+35 116
+44 138
+46 85
+31 41
+16 17
+61 96
+90 100
+45 129
+97 172
+38 70
+47 136
+26 56
+0 95
+100 155
+48 110
+4 60
+16 29
+74 103
+63 113
+93 98
+73 94
+15 86
+40 86
diff --git a/geom_bottleneck/tests/data/test_597_A b/geom_bottleneck/tests/data/test_597_A
new file mode 100644
index 0000000..984cc9f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_597_A
@@ -0,0 +1,50 @@
+75 141
+50 130
+82 143
+98 128
+15 107
+9 22
+27 64
+2 51
+14 42
+15 27
+39 110
+50 95
+62 91
+80 85
+89 92
+56 78
+94 114
+68 130
+80 93
+12 25
+86 88
+33 73
+38 79
+28 100
+65 139
+22 59
+70 169
+45 118
+77 87
+46 49
+87 122
+50 109
+6 101
+8 21
+0 32
+16 81
+89 167
+83 85
+91 185
+85 120
+87 128
+20 58
+76 112
+13 60
+8 15
+93 172
+12 92
+51 132
+92 140
+83 167
diff --git a/geom_bottleneck/tests/data/test_597_B b/geom_bottleneck/tests/data/test_597_B
new file mode 100644
index 0000000..d84920c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_597_B
@@ -0,0 +1,50 @@
+89 118
+56 104
+78 101
+56 103
+13 94
+98 186
+99 137
+58 90
+61 154
+0 12
+7 23
+77 158
+66 157
+70 91
+10 38
+14 23
+21 92
+89 189
+84 105
+79 130
+17 27
+93 102
+62 82
+60 84
+18 28
+49 143
+70 157
+54 119
+32 124
+17 89
+1 49
+4 53
+76 109
+61 113
+71 90
+4 95
+78 125
+21 110
+2 72
+26 106
+35 55
+76 90
+80 127
+80 137
+30 63
+12 81
+48 93
+27 123
+24 57
+56 120
diff --git a/geom_bottleneck/tests/data/test_598_A b/geom_bottleneck/tests/data/test_598_A
new file mode 100644
index 0000000..4c4fa46
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_598_A
@@ -0,0 +1,50 @@
+62 152
+79 161
+64 158
+93 154
+51 99
+69 113
+21 62
+66 156
+48 137
+66 121
+78 165
+56 107
+87 141
+87 159
+42 50
+61 72
+31 61
+26 125
+33 118
+32 88
+98 110
+75 103
+67 130
+94 192
+97 153
+3 4
+48 136
+56 57
+43 53
+29 113
+82 110
+90 103
+54 93
+53 106
+75 143
+32 44
+85 147
+50 72
+22 71
+49 96
+49 132
+32 113
+24 58
+58 142
+60 106
+100 163
+45 123
+27 31
+41 76
+14 40
diff --git a/geom_bottleneck/tests/data/test_598_B b/geom_bottleneck/tests/data/test_598_B
new file mode 100644
index 0000000..974d069
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_598_B
@@ -0,0 +1,50 @@
+8 45
+47 75
+81 128
+60 100
+13 40
+47 96
+97 169
+28 93
+36 92
+80 175
+41 121
+24 55
+94 100
+69 82
+53 97
+64 119
+53 151
+30 51
+11 82
+77 118
+66 113
+54 92
+23 100
+79 82
+44 122
+93 185
+75 169
+98 99
+69 163
+28 100
+66 70
+69 98
+80 99
+23 79
+100 134
+67 126
+57 138
+79 116
+25 44
+48 142
+26 123
+14 51
+93 151
+68 71
+6 27
+4 64
+63 128
+88 166
+59 70
+19 80
diff --git a/geom_bottleneck/tests/data/test_599_A b/geom_bottleneck/tests/data/test_599_A
new file mode 100644
index 0000000..984a0ed
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_599_A
@@ -0,0 +1,50 @@
+6 64
+55 70
+74 171
+88 144
+91 170
+61 75
+1 42
+69 72
+99 112
+100 113
+97 165
+78 83
+12 90
+19 103
+91 134
+78 121
+31 75
+57 139
+2 15
+84 129
+73 139
+24 71
+56 135
+17 117
+26 66
+46 110
+21 97
+24 111
+100 177
+59 132
+13 14
+12 73
+4 51
+49 89
+27 82
+23 107
+84 112
+8 52
+96 172
+97 133
+40 80
+21 32
+65 149
+61 125
+92 133
+89 119
+28 37
+46 106
+95 190
+78 91
diff --git a/geom_bottleneck/tests/data/test_599_B b/geom_bottleneck/tests/data/test_599_B
new file mode 100644
index 0000000..aaea2a7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_599_B
@@ -0,0 +1,50 @@
+83 144
+54 114
+6 83
+53 109
+60 159
+33 90
+72 83
+3 5
+72 170
+60 116
+75 172
+19 107
+11 36
+36 109
+25 59
+22 100
+30 127
+57 119
+28 87
+81 144
+10 53
+2 27
+71 117
+60 84
+95 99
+77 81
+56 67
+67 85
+32 42
+28 45
+81 148
+6 33
+60 146
+83 86
+30 48
+89 105
+26 53
+65 89
+41 94
+47 84
+88 130
+51 95
+65 74
+98 107
+99 180
+80 107
+89 94
+25 36
+83 106
+24 112
diff --git a/geom_bottleneck/tests/data/test_600_A b/geom_bottleneck/tests/data/test_600_A
new file mode 100644
index 0000000..13c5659
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_600_A
@@ -0,0 +1,100 @@
+77 125
+40 107
+52 73
+65 77
+96 158
+26 106
+61 138
+1 10
+56 151
+91 161
+1 20
+100 172
+69 152
+26 57
+33 96
+21 98
+2 24
+54 115
+35 116
+17 31
+21 50
+36 93
+61 74
+98 122
+96 151
+90 168
+49 69
+23 24
+2 67
+28 123
+95 181
+60 81
+33 96
+25 103
+44 114
+84 128
+1 45
+90 154
+34 83
+57 149
+49 109
+57 121
+47 74
+57 77
+37 132
+44 48
+61 98
+37 60
+66 84
+71 73
+30 121
+50 150
+44 99
+86 179
+99 137
+53 125
+85 136
+56 126
+99 163
+43 132
+1 66
+90 132
+27 40
+2 10
+65 115
+39 68
+17 89
+90 153
+22 102
+28 78
+56 101
+89 184
+88 125
+83 85
+75 144
+26 89
+56 108
+83 173
+90 106
+7 72
+97 173
+94 131
+31 104
+95 148
+100 102
+37 82
+86 128
+29 56
+54 109
+81 157
+82 126
+62 71
+33 116
+86 126
+20 103
+34 131
+93 107
+26 104
+31 91
+23 115
diff --git a/geom_bottleneck/tests/data/test_600_B b/geom_bottleneck/tests/data/test_600_B
new file mode 100644
index 0000000..5de1dfa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_600_B
@@ -0,0 +1,100 @@
+99 168
+39 113
+73 109
+91 101
+67 144
+17 57
+3 59
+81 155
+100 159
+48 110
+98 128
+73 167
+55 135
+42 140
+84 129
+18 97
+92 103
+33 86
+68 84
+83 111
+72 111
+97 179
+8 58
+6 80
+21 99
+81 124
+37 85
+19 48
+11 14
+53 122
+16 74
+75 113
+47 74
+87 166
+45 69
+51 68
+74 122
+10 47
+50 90
+66 114
+24 115
+40 65
+74 136
+72 146
+24 114
+48 91
+56 68
+78 102
+30 64
+75 159
+16 101
+58 150
+69 126
+80 136
+6 96
+53 121
+15 115
+76 81
+36 59
+63 68
+85 142
+7 50
+20 83
+9 40
+98 163
+70 165
+88 177
+85 149
+0 17
+30 124
+40 113
+35 91
+66 117
+94 108
+11 106
+78 88
+42 107
+60 121
+55 119
+78 110
+0 76
+63 130
+10 105
+23 68
+13 81
+60 142
+3 81
+53 90
+26 99
+95 165
+52 126
+41 70
+6 29
+14 103
+88 170
+79 102
+9 98
+27 124
+12 60
+59 145
diff --git a/geom_bottleneck/tests/data/test_601_A b/geom_bottleneck/tests/data/test_601_A
new file mode 100644
index 0000000..9f57dd0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_601_A
@@ -0,0 +1,100 @@
+49 135
+27 47
+45 83
+13 49
+15 80
+78 84
+54 128
+20 24
+75 121
+52 90
+15 64
+19 101
+35 80
+35 69
+49 122
+21 49
+51 75
+41 95
+91 162
+26 101
+54 104
+65 164
+74 100
+6 51
+58 68
+99 148
+55 87
+35 51
+51 77
+22 117
+78 141
+80 135
+66 145
+80 145
+68 112
+35 97
+63 91
+10 62
+1 73
+40 106
+76 77
+8 93
+94 136
+57 157
+16 43
+46 92
+49 77
+44 49
+51 120
+68 133
+41 73
+72 109
+42 59
+11 13
+19 86
+24 49
+11 105
+93 113
+81 160
+5 99
+78 159
+37 97
+68 120
+54 111
+41 49
+33 123
+27 35
+71 101
+55 70
+99 183
+68 121
+62 92
+47 53
+4 6
+56 110
+96 113
+85 122
+85 92
+31 97
+1 62
+25 67
+30 39
+16 23
+97 148
+21 22
+21 46
+85 134
+19 23
+12 56
+16 40
+59 138
+9 63
+31 46
+88 161
+72 74
+28 45
+57 95
+90 164
+89 106
+49 134
diff --git a/geom_bottleneck/tests/data/test_601_B b/geom_bottleneck/tests/data/test_601_B
new file mode 100644
index 0000000..64d7ef8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_601_B
@@ -0,0 +1,100 @@
+45 101
+84 90
+70 98
+64 109
+100 111
+82 87
+26 54
+18 90
+84 133
+92 145
+68 139
+90 154
+85 104
+34 76
+30 79
+21 99
+2 85
+20 75
+12 57
+62 102
+69 148
+18 116
+28 97
+52 88
+40 68
+21 26
+66 73
+8 68
+31 130
+83 174
+89 156
+38 43
+62 153
+4 34
+85 123
+51 99
+39 119
+99 149
+19 81
+51 79
+51 136
+25 52
+63 80
+91 166
+62 126
+86 102
+16 39
+0 66
+26 107
+55 89
+72 100
+73 106
+82 129
+77 112
+44 81
+94 118
+57 136
+1 13
+43 52
+24 112
+39 129
+28 97
+41 105
+59 150
+21 84
+38 92
+39 91
+25 36
+52 125
+56 119
+99 171
+51 142
+6 34
+44 77
+100 170
+23 43
+76 138
+67 77
+26 116
+18 49
+25 92
+42 138
+22 41
+48 112
+81 89
+51 67
+64 90
+51 94
+75 147
+49 96
+47 102
+31 114
+7 92
+48 81
+40 41
+84 117
+34 118
+9 27
+86 145
+56 69
diff --git a/geom_bottleneck/tests/data/test_602_A b/geom_bottleneck/tests/data/test_602_A
new file mode 100644
index 0000000..df83de7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_602_A
@@ -0,0 +1,100 @@
+8 77
+68 127
+23 104
+15 96
+58 68
+5 77
+70 105
+13 49
+60 133
+31 122
+74 75
+80 132
+72 107
+44 52
+31 124
+32 36
+62 146
+51 98
+31 118
+45 107
+53 85
+76 152
+67 161
+51 92
+10 23
+89 183
+73 117
+47 112
+42 97
+68 101
+82 86
+32 61
+39 134
+9 109
+31 83
+95 137
+82 155
+34 39
+5 6
+24 108
+94 150
+22 68
+95 172
+12 92
+59 107
+31 59
+0 40
+53 64
+32 73
+69 134
+21 63
+13 107
+10 82
+3 94
+85 147
+51 127
+91 169
+17 87
+80 137
+90 178
+89 185
+56 103
+13 18
+83 84
+34 77
+50 148
+1 10
+80 141
+92 191
+9 21
+85 172
+11 50
+98 134
+12 99
+81 137
+66 90
+32 109
+22 73
+39 130
+38 52
+24 68
+71 113
+84 90
+79 102
+92 192
+47 105
+70 132
+4 45
+57 123
+60 125
+48 56
+19 110
+40 130
+36 114
+55 92
+1 66
+77 131
+96 172
+34 85
+79 102
diff --git a/geom_bottleneck/tests/data/test_602_B b/geom_bottleneck/tests/data/test_602_B
new file mode 100644
index 0000000..fb19e1c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_602_B
@@ -0,0 +1,100 @@
+4 97
+46 76
+86 104
+38 75
+73 124
+7 52
+42 105
+72 132
+14 114
+38 136
+77 91
+72 92
+36 64
+53 121
+57 62
+20 49
+55 78
+82 151
+9 95
+6 20
+10 51
+50 110
+38 100
+69 150
+80 102
+78 93
+94 157
+7 55
+39 121
+80 136
+24 49
+33 95
+99 150
+55 119
+97 188
+73 82
+26 42
+84 92
+5 103
+88 167
+7 54
+35 74
+68 141
+31 56
+98 182
+38 116
+0 63
+29 39
+19 62
+41 91
+50 81
+37 106
+22 65
+19 113
+55 125
+59 79
+29 75
+6 48
+12 101
+37 102
+48 126
+34 71
+63 90
+87 139
+97 147
+86 143
+22 69
+7 17
+9 93
+82 109
+12 55
+88 126
+97 102
+6 70
+6 21
+39 105
+4 103
+46 139
+38 111
+44 45
+17 31
+79 150
+83 96
+97 101
+66 152
+15 84
+82 99
+2 102
+62 123
+8 101
+32 92
+76 158
+20 26
+20 106
+17 75
+70 89
+13 22
+57 87
+6 27
+16 25
diff --git a/geom_bottleneck/tests/data/test_603_A b/geom_bottleneck/tests/data/test_603_A
new file mode 100644
index 0000000..a81f6cb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_603_A
@@ -0,0 +1,100 @@
+59 86
+86 166
+73 114
+3 10
+36 59
+0 33
+24 25
+51 70
+83 129
+7 60
+47 58
+20 97
+30 96
+61 161
+83 143
+83 127
+100 188
+6 28
+18 44
+53 54
+58 94
+53 97
+36 86
+83 133
+37 83
+79 125
+19 104
+67 156
+6 99
+44 128
+37 64
+35 92
+36 126
+55 155
+16 48
+37 108
+72 119
+96 111
+10 83
+96 143
+31 65
+41 138
+94 148
+41 74
+6 92
+53 133
+98 113
+2 71
+15 52
+28 54
+46 58
+81 109
+24 85
+60 159
+61 68
+46 96
+45 138
+99 117
+82 145
+69 121
+15 53
+74 174
+51 114
+100 145
+26 82
+32 115
+72 169
+48 144
+75 172
+65 114
+49 74
+45 119
+31 122
+59 146
+62 67
+43 46
+6 69
+23 25
+76 176
+68 164
+36 113
+26 106
+46 134
+71 151
+59 121
+10 99
+71 167
+82 162
+62 79
+97 127
+68 115
+46 90
+83 156
+12 39
+61 87
+90 187
+0 84
+44 85
+41 93
+98 187
diff --git a/geom_bottleneck/tests/data/test_603_B b/geom_bottleneck/tests/data/test_603_B
new file mode 100644
index 0000000..0ea6eda
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_603_B
@@ -0,0 +1,100 @@
+67 101
+34 55
+8 100
+52 112
+78 120
+15 71
+17 58
+83 109
+41 137
+41 107
+26 125
+87 111
+82 141
+77 78
+24 50
+49 78
+79 88
+91 110
+75 78
+84 91
+100 199
+34 70
+66 154
+23 34
+46 73
+43 94
+23 65
+89 175
+44 46
+13 24
+8 95
+94 162
+13 27
+74 102
+80 156
+77 124
+44 100
+13 52
+32 43
+23 38
+87 162
+24 52
+67 103
+97 146
+79 94
+21 100
+97 186
+38 39
+67 123
+99 197
+29 46
+52 139
+1 80
+5 34
+67 86
+49 122
+45 50
+64 80
+73 154
+85 164
+23 42
+93 123
+54 123
+63 64
+84 162
+86 103
+47 117
+32 112
+60 152
+96 111
+79 97
+86 130
+0 98
+65 161
+55 83
+73 139
+82 133
+9 108
+24 123
+92 132
+87 91
+23 40
+55 116
+91 176
+49 100
+25 58
+4 65
+28 39
+3 74
+22 37
+34 128
+98 154
+32 122
+9 84
+53 79
+47 61
+76 82
+11 34
+65 128
+28 82
diff --git a/geom_bottleneck/tests/data/test_604_A b/geom_bottleneck/tests/data/test_604_A
new file mode 100644
index 0000000..11a7c84
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_604_A
@@ -0,0 +1,100 @@
+90 168
+97 169
+3 20
+65 71
+61 105
+6 56
+50 122
+9 12
+15 51
+73 121
+54 118
+27 121
+97 135
+38 100
+35 69
+40 57
+64 159
+37 125
+79 116
+11 54
+66 72
+76 162
+69 154
+35 77
+91 177
+77 111
+67 145
+59 100
+94 130
+75 135
+53 106
+43 106
+100 130
+81 159
+14 107
+52 91
+47 136
+83 133
+16 63
+11 98
+4 6
+98 120
+98 117
+69 90
+24 108
+74 138
+100 105
+9 16
+55 81
+86 154
+6 99
+82 85
+86 176
+57 79
+83 136
+70 135
+30 85
+73 126
+73 164
+20 89
+42 93
+97 150
+6 69
+26 66
+43 129
+84 117
+75 132
+68 98
+29 111
+57 140
+15 107
+75 141
+97 180
+47 130
+31 72
+56 150
+30 75
+86 106
+49 50
+16 38
+40 68
+99 176
+10 56
+89 128
+97 124
+35 134
+82 137
+34 97
+34 40
+34 43
+71 149
+33 113
+6 80
+69 160
+54 148
+88 131
+98 141
+91 112
+25 106
+68 149
diff --git a/geom_bottleneck/tests/data/test_604_B b/geom_bottleneck/tests/data/test_604_B
new file mode 100644
index 0000000..6e14339
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_604_B
@@ -0,0 +1,100 @@
+4 69
+24 43
+68 72
+33 77
+96 106
+48 134
+18 38
+1 28
+12 112
+70 76
+6 16
+19 65
+35 49
+91 95
+50 147
+94 174
+87 124
+27 29
+17 116
+50 120
+83 183
+60 129
+92 120
+67 125
+60 73
+17 60
+10 12
+65 158
+19 100
+44 92
+86 139
+98 184
+67 100
+28 115
+16 94
+36 94
+40 99
+20 115
+94 149
+80 135
+47 109
+39 53
+62 159
+25 78
+30 118
+71 89
+86 166
+85 159
+58 120
+45 64
+73 156
+66 107
+31 88
+53 88
+67 167
+49 144
+60 71
+69 151
+44 111
+43 93
+95 102
+78 150
+98 120
+22 92
+70 76
+1 98
+25 44
+93 166
+16 100
+94 134
+37 99
+4 70
+32 47
+61 136
+30 95
+99 133
+91 163
+32 112
+78 91
+55 62
+16 33
+13 48
+45 75
+96 155
+20 82
+39 57
+22 51
+7 31
+73 90
+49 55
+32 65
+16 22
+33 71
+80 97
+85 154
+100 172
+86 114
+98 191
+2 7
+35 113
diff --git a/geom_bottleneck/tests/data/test_605_A b/geom_bottleneck/tests/data/test_605_A
new file mode 100644
index 0000000..522dbf9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_605_A
@@ -0,0 +1,100 @@
+59 77
+22 53
+70 99
+32 126
+63 100
+72 89
+93 150
+70 83
+35 53
+96 128
+55 151
+30 96
+6 85
+80 131
+76 80
+36 79
+50 72
+70 134
+20 77
+27 33
+35 37
+44 55
+91 165
+68 132
+52 141
+81 142
+43 106
+46 55
+55 100
+21 86
+100 130
+97 173
+56 142
+26 36
+54 68
+17 23
+57 124
+65 122
+11 30
+70 96
+46 47
+52 114
+65 104
+24 39
+2 102
+91 181
+66 107
+27 120
+24 38
+33 94
+87 166
+35 78
+38 92
+56 125
+15 50
+95 129
+85 174
+53 126
+76 171
+71 154
+67 86
+61 133
+99 183
+92 102
+83 103
+80 174
+63 109
+37 60
+12 78
+30 56
+19 117
+33 99
+3 94
+18 52
+44 133
+53 55
+37 95
+43 92
+64 127
+12 79
+65 129
+48 92
+92 136
+25 64
+83 91
+22 91
+66 96
+33 37
+8 45
+4 5
+21 107
+72 171
+6 14
+75 124
+79 140
+52 114
+61 62
+89 151
+98 102
+4 46
diff --git a/geom_bottleneck/tests/data/test_605_B b/geom_bottleneck/tests/data/test_605_B
new file mode 100644
index 0000000..34f19db
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_605_B
@@ -0,0 +1,100 @@
+17 96
+1 57
+57 149
+10 24
+76 155
+3 81
+66 101
+79 85
+17 91
+78 105
+78 155
+91 167
+63 84
+41 45
+12 50
+49 107
+13 31
+93 175
+93 105
+33 46
+70 121
+36 57
+43 103
+44 99
+54 91
+25 65
+26 27
+64 119
+94 161
+29 115
+0 14
+81 152
+15 83
+4 50
+56 132
+27 50
+42 61
+28 39
+2 38
+55 87
+52 91
+70 160
+57 94
+32 41
+52 142
+28 37
+81 92
+89 91
+79 127
+94 179
+45 128
+92 120
+61 124
+61 143
+12 31
+2 36
+42 48
+25 55
+89 184
+56 57
+90 154
+55 94
+70 104
+35 135
+10 39
+45 63
+72 102
+0 12
+45 71
+84 126
+89 146
+52 100
+14 93
+16 42
+89 186
+50 77
+64 75
+29 52
+14 81
+55 73
+69 105
+47 144
+70 102
+59 76
+81 94
+63 163
+19 55
+70 146
+58 118
+56 96
+74 93
+24 30
+100 190
+80 115
+88 172
+0 31
+83 124
+53 153
+68 70
+73 108
diff --git a/geom_bottleneck/tests/data/test_606_A b/geom_bottleneck/tests/data/test_606_A
new file mode 100644
index 0000000..2f4dec4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_606_A
@@ -0,0 +1,100 @@
+49 104
+89 185
+56 72
+44 117
+27 73
+64 87
+30 44
+89 150
+73 105
+80 156
+48 145
+36 87
+62 122
+85 97
+51 144
+48 137
+61 132
+47 66
+78 134
+17 101
+66 119
+74 82
+96 99
+56 57
+66 109
+13 103
+6 40
+55 78
+77 130
+92 133
+65 74
+8 9
+29 123
+6 61
+41 138
+21 98
+85 107
+99 108
+79 95
+93 161
+9 20
+58 150
+33 93
+2 48
+38 40
+83 153
+33 92
+94 155
+44 96
+17 102
+68 99
+32 69
+73 126
+5 43
+86 181
+2 38
+65 163
+86 164
+49 132
+41 86
+96 186
+87 145
+12 81
+11 73
+77 87
+22 116
+14 21
+56 82
+61 120
+2 24
+67 71
+33 93
+89 132
+14 102
+12 29
+7 38
+12 88
+76 123
+46 75
+79 99
+49 74
+27 35
+8 47
+33 84
+79 171
+72 83
+79 106
+96 152
+86 164
+100 128
+7 97
+70 128
+89 156
+15 17
+86 126
+65 110
+53 80
+51 81
+36 85
+50 82
diff --git a/geom_bottleneck/tests/data/test_606_B b/geom_bottleneck/tests/data/test_606_B
new file mode 100644
index 0000000..62417b1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_606_B
@@ -0,0 +1,100 @@
+35 135
+1 41
+63 72
+43 98
+37 71
+24 87
+14 105
+66 67
+12 79
+60 145
+20 72
+0 70
+67 149
+22 30
+86 151
+20 106
+38 74
+58 133
+40 103
+34 111
+81 126
+55 74
+49 133
+44 128
+54 86
+15 82
+84 89
+87 121
+95 135
+53 104
+91 157
+7 101
+45 124
+87 162
+73 164
+60 123
+77 81
+69 78
+44 118
+0 79
+66 106
+67 85
+85 168
+93 122
+0 42
+10 66
+9 23
+29 80
+46 76
+75 126
+2 32
+99 143
+24 90
+31 120
+73 98
+42 57
+67 86
+44 99
+65 135
+100 167
+33 43
+10 29
+36 63
+79 178
+82 85
+35 49
+24 57
+66 142
+2 29
+73 149
+16 76
+27 53
+86 88
+36 75
+54 56
+11 82
+87 183
+33 72
+84 94
+96 108
+13 63
+34 98
+76 173
+57 114
+63 149
+74 131
+20 21
+48 100
+92 98
+3 41
+66 138
+90 130
+62 152
+26 101
+28 102
+41 139
+85 167
+68 84
+64 74
+64 136
diff --git a/geom_bottleneck/tests/data/test_607_A b/geom_bottleneck/tests/data/test_607_A
new file mode 100644
index 0000000..abc3b6b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_607_A
@@ -0,0 +1,100 @@
+82 154
+80 107
+94 156
+55 58
+84 183
+82 128
+35 97
+32 105
+12 104
+17 57
+54 67
+59 103
+22 106
+50 122
+31 93
+33 123
+9 105
+78 140
+15 101
+67 117
+34 119
+96 123
+71 169
+91 93
+99 119
+85 169
+59 69
+85 169
+32 76
+62 134
+21 77
+79 141
+5 63
+9 72
+21 41
+2 95
+16 92
+22 54
+44 58
+1 24
+26 54
+33 93
+85 135
+74 110
+63 81
+64 113
+3 21
+24 92
+78 82
+54 63
+66 83
+22 38
+41 59
+99 156
+26 34
+67 78
+9 22
+15 62
+25 43
+0 93
+43 44
+54 63
+16 40
+62 136
+35 85
+80 179
+4 103
+21 73
+91 119
+99 188
+16 42
+63 64
+76 137
+58 61
+20 39
+61 72
+0 9
+7 41
+11 61
+39 124
+70 153
+97 121
+66 166
+7 72
+65 140
+96 140
+60 87
+34 35
+14 15
+17 41
+33 69
+5 101
+49 109
+79 102
+22 57
+50 126
+24 119
+76 166
+84 93
+34 70
diff --git a/geom_bottleneck/tests/data/test_607_B b/geom_bottleneck/tests/data/test_607_B
new file mode 100644
index 0000000..0f79931
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_607_B
@@ -0,0 +1,100 @@
+23 33
+0 85
+33 82
+21 38
+41 75
+94 128
+35 107
+9 76
+65 74
+71 133
+83 173
+94 109
+58 83
+61 68
+44 111
+67 107
+97 152
+100 167
+94 105
+94 95
+9 37
+18 47
+87 141
+81 153
+57 90
+10 19
+67 137
+11 75
+86 139
+39 72
+13 51
+65 155
+56 98
+91 149
+58 68
+6 89
+39 95
+82 150
+97 129
+26 73
+87 112
+37 117
+73 137
+68 73
+4 88
+2 70
+79 112
+59 123
+31 93
+36 77
+95 158
+25 52
+33 47
+69 112
+73 160
+95 138
+15 56
+31 96
+1 2
+9 41
+59 129
+48 55
+52 111
+51 139
+38 115
+100 198
+30 46
+77 105
+43 115
+66 151
+69 70
+93 98
+19 59
+10 59
+10 59
+51 89
+21 58
+48 75
+57 58
+0 34
+48 110
+87 152
+9 44
+19 73
+8 76
+82 165
+4 51
+9 24
+62 105
+97 147
+28 102
+37 77
+25 55
+77 86
+80 87
+81 172
+99 152
+57 107
+61 154
+45 93
diff --git a/geom_bottleneck/tests/data/test_608_A b/geom_bottleneck/tests/data/test_608_A
new file mode 100644
index 0000000..a4beccc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_608_A
@@ -0,0 +1,100 @@
+91 111
+71 96
+84 176
+57 123
+7 22
+4 76
+83 171
+79 172
+96 173
+75 76
+19 98
+91 135
+13 54
+10 13
+2 53
+65 128
+96 133
+54 64
+43 112
+72 139
+32 33
+45 89
+82 174
+36 79
+5 89
+90 114
+41 90
+16 30
+78 177
+64 77
+40 67
+57 129
+29 51
+53 54
+86 90
+64 116
+87 92
+73 76
+35 108
+25 81
+57 155
+55 123
+56 99
+96 103
+88 93
+28 101
+74 106
+76 166
+28 126
+34 41
+75 91
+19 119
+59 108
+29 121
+0 66
+9 25
+68 150
+26 51
+19 47
+34 55
+37 127
+66 80
+23 52
+8 19
+65 128
+44 109
+16 70
+17 114
+29 31
+40 100
+20 42
+61 121
+89 153
+35 104
+5 81
+33 95
+17 29
+93 132
+72 133
+100 102
+54 109
+23 53
+85 87
+64 69
+20 67
+30 34
+96 143
+40 134
+60 86
+40 91
+92 133
+73 141
+70 117
+43 78
+52 83
+27 114
+2 88
+48 121
+40 66
+96 159
diff --git a/geom_bottleneck/tests/data/test_608_B b/geom_bottleneck/tests/data/test_608_B
new file mode 100644
index 0000000..94f4c9a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_608_B
@@ -0,0 +1,100 @@
+69 152
+69 122
+74 138
+60 95
+88 127
+98 124
+99 193
+82 85
+17 78
+57 130
+50 71
+62 94
+7 39
+89 137
+26 69
+71 146
+9 73
+37 55
+25 111
+65 145
+94 157
+92 99
+31 51
+50 112
+87 99
+64 76
+55 126
+6 56
+48 124
+89 147
+16 18
+93 172
+53 152
+90 102
+25 123
+81 110
+1 93
+74 150
+61 73
+39 100
+74 148
+58 152
+21 94
+39 112
+96 161
+4 85
+61 79
+90 150
+2 42
+100 110
+81 161
+56 71
+90 162
+2 30
+69 80
+33 99
+27 43
+56 74
+57 138
+63 162
+51 121
+80 153
+75 174
+4 29
+91 122
+45 145
+72 74
+66 130
+13 79
+9 91
+59 100
+35 114
+100 124
+40 80
+40 134
+72 123
+43 63
+43 81
+37 83
+74 128
+5 86
+54 66
+88 133
+6 93
+98 166
+8 104
+100 199
+56 130
+88 128
+41 97
+8 17
+44 123
+7 51
+33 59
+0 80
+16 69
+16 55
+77 141
+75 108
+84 117
diff --git a/geom_bottleneck/tests/data/test_609_A b/geom_bottleneck/tests/data/test_609_A
new file mode 100644
index 0000000..a8e841e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_609_A
@@ -0,0 +1,100 @@
+52 69
+8 75
+78 173
+64 147
+34 126
+24 107
+83 158
+79 135
+39 119
+72 163
+12 78
+45 107
+7 27
+8 48
+65 133
+43 99
+92 116
+46 61
+78 94
+73 122
+30 89
+27 50
+46 142
+58 92
+7 73
+52 123
+53 77
+28 115
+28 111
+65 159
+95 131
+58 82
+47 103
+31 110
+15 37
+90 139
+76 128
+88 131
+76 145
+96 165
+77 154
+11 36
+36 63
+25 122
+100 144
+13 15
+7 65
+50 128
+97 104
+98 183
+39 81
+55 89
+76 78
+46 87
+2 43
+86 151
+61 130
+40 122
+72 111
+14 113
+26 89
+43 61
+80 176
+83 170
+78 153
+93 171
+87 142
+98 101
+60 71
+24 93
+18 94
+86 103
+22 42
+14 104
+2 85
+26 78
+98 190
+91 191
+9 68
+46 124
+50 105
+0 38
+62 138
+26 27
+78 168
+80 87
+64 68
+64 129
+10 48
+77 171
+79 129
+53 89
+30 92
+71 125
+26 125
+12 112
+96 134
+27 114
+62 91
+10 11
diff --git a/geom_bottleneck/tests/data/test_609_B b/geom_bottleneck/tests/data/test_609_B
new file mode 100644
index 0000000..574351a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_609_B
@@ -0,0 +1,100 @@
+64 90
+2 6
+69 77
+35 119
+59 88
+27 127
+39 134
+68 155
+92 151
+5 84
+79 125
+37 66
+31 116
+48 97
+63 88
+92 176
+36 98
+97 135
+67 130
+21 44
+42 114
+42 114
+56 93
+4 78
+91 128
+87 94
+35 69
+5 25
+46 72
+91 151
+96 180
+87 165
+24 32
+72 134
+78 150
+0 3
+100 197
+84 95
+6 31
+61 97
+25 26
+46 114
+91 152
+64 82
+75 78
+73 134
+43 58
+66 157
+82 130
+66 96
+49 61
+55 82
+25 39
+58 153
+93 184
+17 113
+51 123
+51 77
+61 106
+26 111
+94 187
+28 77
+5 95
+100 123
+0 74
+55 91
+60 76
+2 43
+58 110
+82 153
+22 100
+13 92
+7 22
+82 153
+71 84
+16 26
+3 45
+80 97
+51 143
+99 191
+38 67
+14 112
+4 11
+72 141
+4 34
+86 115
+74 134
+53 102
+87 116
+51 119
+5 105
+62 103
+32 116
+64 152
+41 52
+1 38
+3 57
+50 133
+57 132
+57 93
diff --git a/geom_bottleneck/tests/data/test_610_A b/geom_bottleneck/tests/data/test_610_A
new file mode 100644
index 0000000..c37fa9c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_610_A
@@ -0,0 +1,100 @@
+4 71
+61 90
+58 59
+14 102
+53 142
+94 103
+47 71
+72 115
+33 113
+64 142
+82 115
+65 85
+34 101
+78 93
+68 109
+84 112
+45 80
+30 83
+100 164
+88 158
+2 10
+56 135
+22 41
+11 21
+77 128
+34 110
+8 54
+91 184
+57 120
+100 187
+76 115
+52 83
+48 54
+78 173
+10 84
+85 185
+44 129
+100 132
+52 58
+23 84
+65 70
+54 73
+92 167
+91 103
+73 112
+11 85
+38 78
+78 105
+7 22
+3 85
+57 125
+45 77
+15 99
+87 104
+2 70
+11 111
+40 75
+33 47
+99 186
+24 87
+20 78
+14 92
+71 135
+23 30
+58 95
+51 112
+8 21
+75 138
+78 102
+0 48
+86 106
+18 28
+4 103
+75 81
+96 126
+16 88
+83 120
+87 182
+35 48
+31 58
+46 71
+52 73
+71 89
+20 92
+33 107
+10 62
+29 37
+6 22
+0 81
+33 35
+0 81
+20 82
+18 39
+19 84
+88 166
+49 95
+64 74
+58 139
+20 21
+49 105
diff --git a/geom_bottleneck/tests/data/test_610_B b/geom_bottleneck/tests/data/test_610_B
new file mode 100644
index 0000000..0745255
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_610_B
@@ -0,0 +1,100 @@
+44 136
+49 63
+56 122
+67 109
+38 136
+87 96
+23 34
+53 130
+94 108
+67 81
+58 88
+74 158
+20 86
+34 42
+76 128
+33 61
+92 156
+97 107
+39 111
+93 165
+56 144
+36 121
+2 34
+90 136
+91 185
+76 125
+13 26
+59 108
+39 131
+65 138
+49 145
+86 179
+56 138
+62 128
+37 106
+11 22
+27 39
+39 116
+83 127
+20 51
+10 20
+14 79
+96 107
+44 122
+85 122
+85 112
+75 95
+55 100
+56 111
+46 127
+72 157
+49 71
+32 126
+90 144
+94 95
+34 81
+21 64
+37 84
+40 103
+53 76
+88 102
+63 73
+28 31
+42 43
+29 50
+17 61
+59 156
+97 164
+22 50
+45 128
+65 159
+56 123
+10 82
+76 132
+9 86
+97 180
+34 62
+63 70
+68 127
+52 104
+75 168
+54 66
+67 154
+94 113
+34 76
+12 106
+34 69
+31 130
+70 105
+27 52
+47 71
+36 128
+68 156
+47 134
+12 79
+42 139
+85 138
+37 91
+43 68
+23 81
diff --git a/geom_bottleneck/tests/data/test_611_A b/geom_bottleneck/tests/data/test_611_A
new file mode 100644
index 0000000..f7cfbbe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_611_A
@@ -0,0 +1,100 @@
+79 154
+81 116
+71 125
+5 48
+85 176
+76 115
+3 87
+85 102
+17 116
+49 80
+95 183
+82 92
+23 60
+66 97
+4 37
+81 90
+24 50
+64 136
+54 86
+87 160
+33 102
+40 80
+82 127
+97 118
+68 76
+99 160
+92 107
+14 80
+5 45
+42 83
+40 108
+77 163
+39 105
+91 176
+45 73
+96 169
+78 176
+12 90
+53 135
+87 124
+79 172
+52 65
+26 86
+65 112
+1 60
+57 131
+65 135
+45 57
+28 71
+40 50
+17 110
+95 112
+59 156
+38 86
+63 78
+60 112
+28 108
+18 72
+18 91
+33 94
+41 105
+2 37
+36 93
+49 103
+57 131
+10 108
+29 64
+73 83
+79 85
+30 115
+93 111
+47 90
+41 47
+90 158
+72 137
+55 65
+55 136
+40 52
+38 49
+33 57
+82 125
+53 139
+42 87
+43 55
+16 54
+45 61
+6 92
+21 37
+33 84
+37 137
+39 87
+19 70
+62 79
+9 15
+16 48
+39 131
+59 130
+80 94
+56 126
+76 95
diff --git a/geom_bottleneck/tests/data/test_611_B b/geom_bottleneck/tests/data/test_611_B
new file mode 100644
index 0000000..ffc3bf6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_611_B
@@ -0,0 +1,100 @@
+15 50
+61 137
+52 63
+72 148
+89 101
+93 143
+56 127
+30 99
+72 120
+92 114
+53 106
+43 72
+80 116
+67 136
+33 98
+63 111
+39 55
+84 170
+55 106
+1 8
+96 157
+85 143
+30 95
+66 132
+45 51
+36 128
+69 141
+1 31
+20 97
+14 47
+66 163
+44 125
+45 75
+86 185
+13 78
+28 31
+6 14
+96 108
+62 99
+29 120
+11 20
+55 107
+9 19
+32 105
+4 60
+92 160
+29 80
+68 113
+63 161
+78 95
+24 96
+98 128
+28 81
+87 175
+81 165
+70 137
+55 83
+38 43
+96 158
+40 100
+15 21
+66 70
+22 103
+37 106
+61 126
+52 151
+92 113
+36 61
+11 106
+81 141
+38 135
+48 142
+8 16
+88 89
+80 178
+100 160
+43 91
+71 122
+2 79
+21 27
+74 82
+3 6
+56 109
+94 175
+78 153
+32 117
+78 135
+14 53
+68 70
+53 115
+59 143
+41 63
+18 111
+28 109
+30 65
+42 132
+91 135
+5 43
+47 144
+53 103
diff --git a/geom_bottleneck/tests/data/test_612_A b/geom_bottleneck/tests/data/test_612_A
new file mode 100644
index 0000000..1d08d30
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_612_A
@@ -0,0 +1,100 @@
+29 103
+5 54
+70 158
+33 82
+96 190
+84 184
+49 139
+37 47
+96 159
+75 126
+37 67
+5 28
+41 44
+64 107
+0 88
+32 35
+41 42
+11 14
+82 107
+36 111
+35 80
+69 142
+22 85
+95 191
+48 102
+78 135
+74 151
+71 73
+92 114
+95 152
+52 85
+52 95
+72 147
+33 133
+57 148
+90 155
+94 192
+97 108
+84 172
+3 46
+36 112
+72 129
+80 132
+17 41
+67 113
+27 77
+45 86
+56 135
+41 65
+13 53
+52 84
+54 101
+34 74
+25 99
+86 87
+36 136
+82 124
+5 95
+86 150
+76 90
+66 127
+54 110
+76 82
+82 101
+75 139
+2 28
+68 156
+38 60
+51 75
+96 161
+98 143
+38 66
+43 67
+72 112
+25 27
+96 195
+24 26
+46 85
+71 157
+12 47
+46 92
+72 109
+14 65
+68 144
+53 56
+61 105
+18 111
+51 95
+18 28
+39 121
+67 71
+42 58
+25 106
+88 169
+66 150
+47 114
+36 61
+12 101
+64 137
+8 31
diff --git a/geom_bottleneck/tests/data/test_612_B b/geom_bottleneck/tests/data/test_612_B
new file mode 100644
index 0000000..712c645
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_612_B
@@ -0,0 +1,100 @@
+51 131
+46 143
+100 147
+25 81
+73 151
+74 80
+50 143
+91 157
+46 56
+67 152
+67 75
+78 137
+33 90
+17 45
+82 165
+64 97
+85 168
+44 130
+93 140
+80 137
+68 76
+82 177
+21 60
+73 82
+28 41
+45 121
+6 100
+72 83
+27 74
+53 69
+7 8
+7 93
+30 57
+38 98
+38 44
+58 81
+70 168
+15 112
+25 66
+80 122
+24 38
+60 149
+29 116
+54 75
+53 142
+48 111
+0 21
+82 151
+74 118
+93 155
+14 69
+7 70
+30 125
+9 73
+21 54
+97 144
+14 26
+27 95
+25 74
+60 75
+44 95
+94 168
+82 108
+97 129
+7 49
+86 95
+92 97
+98 166
+31 82
+33 90
+24 47
+48 147
+66 117
+26 66
+29 114
+84 166
+62 127
+72 132
+20 37
+77 170
+21 89
+1 9
+74 83
+96 192
+40 117
+3 8
+38 72
+88 156
+66 109
+22 52
+14 39
+51 92
+65 123
+81 119
+28 43
+75 170
+94 159
+20 96
+63 109
+17 106
diff --git a/geom_bottleneck/tests/data/test_613_A b/geom_bottleneck/tests/data/test_613_A
new file mode 100644
index 0000000..909c462
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_613_A
@@ -0,0 +1,100 @@
+43 47
+47 132
+11 66
+37 81
+99 108
+46 54
+47 80
+96 121
+12 18
+56 128
+7 75
+27 104
+43 110
+100 127
+28 29
+75 174
+62 105
+0 13
+43 62
+5 43
+8 27
+54 56
+43 103
+41 105
+96 156
+42 48
+97 134
+25 67
+79 144
+25 29
+99 140
+98 128
+45 144
+37 46
+4 98
+92 121
+12 77
+14 97
+92 119
+72 167
+14 36
+92 101
+30 38
+94 100
+42 55
+8 97
+8 78
+78 135
+46 83
+78 126
+30 58
+80 175
+49 130
+67 85
+4 24
+100 188
+36 49
+88 179
+45 69
+80 89
+1 73
+30 88
+44 124
+29 81
+15 100
+35 70
+29 87
+73 152
+64 102
+47 136
+50 68
+75 127
+80 152
+34 44
+78 167
+98 162
+18 45
+19 60
+90 120
+68 106
+98 198
+61 130
+3 41
+90 100
+22 68
+19 57
+59 88
+19 77
+60 92
+38 61
+7 45
+23 87
+71 155
+23 57
+97 177
+58 128
+77 109
+13 112
+37 129
+54 61
diff --git a/geom_bottleneck/tests/data/test_613_B b/geom_bottleneck/tests/data/test_613_B
new file mode 100644
index 0000000..9569b49
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_613_B
@@ -0,0 +1,100 @@
+22 108
+62 83
+61 105
+95 188
+77 78
+7 45
+83 149
+1 65
+14 16
+30 89
+84 112
+29 123
+73 173
+5 35
+37 58
+11 56
+83 125
+71 165
+53 103
+88 176
+28 88
+71 141
+93 170
+95 187
+15 84
+57 70
+19 118
+14 51
+37 117
+69 131
+97 143
+20 117
+54 99
+54 146
+62 104
+76 155
+23 75
+77 155
+23 117
+30 42
+97 137
+44 107
+24 33
+99 188
+30 38
+60 129
+83 102
+95 120
+37 71
+72 106
+90 149
+16 73
+97 127
+81 98
+39 101
+64 149
+43 112
+90 182
+8 93
+36 50
+33 45
+63 78
+25 103
+78 125
+47 143
+83 141
+66 153
+51 125
+53 83
+94 125
+99 199
+67 109
+67 99
+29 55
+68 148
+91 159
+65 96
+25 84
+63 134
+40 136
+94 173
+67 154
+14 107
+73 153
+24 79
+85 116
+66 104
+98 166
+0 42
+100 148
+74 168
+31 86
+42 62
+83 182
+48 131
+18 94
+90 134
+84 150
+78 175
+27 121
diff --git a/geom_bottleneck/tests/data/test_614_A b/geom_bottleneck/tests/data/test_614_A
new file mode 100644
index 0000000..29c02c8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_614_A
@@ -0,0 +1,100 @@
+24 124
+56 99
+57 147
+95 161
+39 104
+63 154
+82 105
+65 89
+82 122
+62 129
+88 181
+75 121
+32 33
+44 68
+12 28
+36 131
+63 64
+23 72
+92 159
+80 112
+2 92
+48 110
+50 98
+23 50
+20 72
+32 39
+32 86
+51 63
+47 114
+61 71
+32 78
+43 110
+69 157
+79 122
+35 48
+74 85
+15 62
+14 72
+29 62
+37 61
+56 75
+35 88
+70 84
+37 91
+45 139
+16 33
+76 145
+8 70
+87 128
+91 183
+29 47
+37 48
+13 102
+88 142
+10 75
+35 109
+84 178
+88 118
+85 93
+17 113
+30 49
+13 47
+83 129
+60 106
+92 154
+29 90
+93 135
+33 66
+60 117
+36 92
+1 22
+13 76
+5 102
+7 102
+76 154
+78 133
+72 135
+93 146
+37 47
+44 103
+68 102
+81 136
+51 58
+92 172
+43 119
+92 140
+62 116
+15 84
+58 82
+94 119
+74 131
+5 42
+37 56
+28 127
+82 85
+60 107
+18 98
+1 80
+95 129
+96 101
diff --git a/geom_bottleneck/tests/data/test_614_B b/geom_bottleneck/tests/data/test_614_B
new file mode 100644
index 0000000..f34b836
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_614_B
@@ -0,0 +1,100 @@
+28 55
+77 152
+40 97
+23 116
+61 120
+59 143
+27 48
+32 88
+92 117
+66 145
+83 132
+2 51
+57 82
+47 122
+7 40
+68 150
+86 156
+68 122
+74 94
+92 113
+14 46
+61 116
+42 133
+15 55
+9 24
+49 70
+41 108
+20 45
+93 177
+87 144
+81 161
+11 60
+64 92
+24 69
+50 79
+39 82
+28 116
+62 122
+38 48
+64 75
+51 62
+22 34
+10 96
+61 73
+72 146
+10 62
+61 86
+5 41
+43 106
+25 66
+30 55
+91 112
+30 76
+96 176
+84 148
+17 81
+51 127
+90 106
+100 177
+67 129
+23 84
+49 99
+100 124
+11 59
+54 106
+19 113
+76 96
+10 96
+15 114
+83 143
+29 57
+82 143
+32 64
+6 73
+94 142
+22 52
+93 100
+57 154
+100 110
+90 165
+69 110
+54 118
+38 47
+92 142
+45 65
+0 19
+100 196
+71 136
+16 78
+53 148
+76 83
+49 81
+86 148
+59 152
+13 69
+25 101
+57 102
+89 113
+15 17
+1 2
diff --git a/geom_bottleneck/tests/data/test_615_A b/geom_bottleneck/tests/data/test_615_A
new file mode 100644
index 0000000..d1b55eb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_615_A
@@ -0,0 +1,100 @@
+98 121
+87 153
+92 109
+60 122
+16 78
+1 43
+29 68
+93 186
+35 121
+95 183
+47 59
+98 129
+57 129
+82 134
+10 104
+20 60
+74 125
+97 158
+96 142
+71 88
+94 192
+37 132
+50 114
+65 96
+43 128
+27 48
+96 180
+10 22
+39 129
+28 29
+36 136
+1 65
+0 80
+3 99
+31 44
+35 94
+73 82
+91 155
+67 166
+36 78
+92 183
+74 157
+46 123
+31 68
+62 72
+21 83
+7 70
+49 137
+23 79
+48 132
+78 171
+51 80
+41 54
+59 108
+82 156
+42 136
+92 163
+27 90
+82 128
+95 96
+20 74
+26 40
+36 86
+29 35
+84 168
+82 151
+80 123
+58 109
+37 74
+53 86
+55 124
+24 91
+52 113
+79 126
+3 82
+68 124
+91 142
+48 85
+36 131
+7 61
+69 150
+66 77
+64 142
+91 95
+11 25
+71 162
+51 58
+20 104
+61 152
+2 19
+26 27
+41 58
+46 102
+29 41
+13 36
+93 145
+7 35
+54 102
+98 158
+85 93
diff --git a/geom_bottleneck/tests/data/test_615_B b/geom_bottleneck/tests/data/test_615_B
new file mode 100644
index 0000000..ab204be
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_615_B
@@ -0,0 +1,100 @@
+11 38
+73 143
+46 112
+28 29
+68 96
+49 111
+90 154
+98 189
+25 45
+40 129
+76 104
+72 79
+100 121
+3 73
+73 83
+51 84
+81 102
+55 91
+60 96
+54 139
+80 131
+4 84
+97 125
+75 132
+39 84
+90 153
+29 61
+27 31
+14 71
+86 112
+52 87
+1 100
+66 69
+16 51
+70 93
+91 139
+80 140
+92 144
+20 42
+45 122
+27 115
+51 112
+61 94
+54 140
+85 159
+0 99
+31 59
+9 24
+31 122
+5 13
+51 85
+22 65
+14 42
+79 120
+40 43
+13 85
+78 147
+47 48
+87 109
+94 187
+2 74
+36 95
+41 72
+85 105
+36 103
+41 94
+27 90
+66 72
+42 89
+93 170
+84 151
+66 96
+65 162
+2 3
+25 45
+50 77
+20 78
+21 50
+93 119
+76 150
+65 93
+11 68
+42 61
+28 92
+39 129
+92 112
+91 187
+48 97
+59 62
+0 31
+57 107
+83 140
+80 82
+87 135
+35 48
+23 57
+79 166
+7 81
+97 121
+97 98
diff --git a/geom_bottleneck/tests/data/test_616_A b/geom_bottleneck/tests/data/test_616_A
new file mode 100644
index 0000000..2b99b87
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_616_A
@@ -0,0 +1,100 @@
+74 170
+100 122
+43 126
+66 162
+54 71
+31 122
+49 55
+100 194
+68 142
+83 94
+4 55
+20 79
+90 117
+67 143
+50 51
+40 123
+21 64
+41 114
+35 44
+75 169
+82 162
+52 138
+69 99
+53 107
+36 95
+99 118
+55 69
+86 102
+70 75
+5 94
+55 133
+79 141
+100 171
+6 73
+22 99
+92 185
+5 94
+34 131
+50 143
+97 184
+51 106
+82 158
+85 173
+81 163
+59 85
+50 93
+49 60
+94 128
+83 167
+29 44
+85 164
+62 138
+33 92
+32 114
+74 80
+64 124
+30 117
+22 116
+37 80
+87 142
+65 143
+0 95
+93 131
+70 168
+35 90
+74 169
+79 173
+49 99
+33 120
+30 63
+57 113
+72 97
+71 127
+53 61
+77 139
+85 159
+0 80
+51 120
+3 76
+65 88
+63 121
+55 73
+23 92
+29 98
+2 31
+65 112
+15 86
+47 86
+100 146
+21 49
+76 158
+75 130
+65 141
+73 112
+6 90
+29 110
+89 93
+99 106
+95 135
+39 101
diff --git a/geom_bottleneck/tests/data/test_616_B b/geom_bottleneck/tests/data/test_616_B
new file mode 100644
index 0000000..55a8c9f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_616_B
@@ -0,0 +1,100 @@
+22 54
+34 134
+72 81
+63 68
+99 119
+35 79
+86 177
+39 120
+68 128
+50 115
+59 119
+60 125
+19 91
+82 118
+81 100
+46 144
+99 152
+7 81
+81 113
+29 93
+68 86
+15 54
+52 67
+85 182
+44 76
+2 55
+51 146
+19 32
+39 111
+41 116
+83 112
+97 190
+83 94
+85 133
+31 103
+55 92
+99 150
+49 136
+72 138
+1 53
+25 89
+37 106
+49 149
+2 10
+39 90
+85 143
+4 17
+8 69
+59 120
+70 80
+73 96
+80 119
+57 86
+30 59
+52 60
+13 93
+16 92
+45 103
+14 27
+4 30
+81 117
+22 39
+14 78
+42 120
+19 118
+97 115
+74 164
+70 158
+12 63
+38 79
+80 150
+37 111
+71 97
+7 13
+73 162
+31 75
+61 98
+54 89
+73 110
+87 137
+61 126
+23 71
+97 146
+20 47
+98 181
+63 69
+4 102
+11 50
+17 46
+19 22
+70 167
+98 147
+99 153
+93 144
+44 72
+67 117
+46 133
+15 48
+64 135
+55 122
diff --git a/geom_bottleneck/tests/data/test_617_A b/geom_bottleneck/tests/data/test_617_A
new file mode 100644
index 0000000..9eb04ba
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_617_A
@@ -0,0 +1,100 @@
+91 153
+68 149
+3 63
+83 160
+15 40
+13 60
+92 126
+96 190
+2 94
+75 89
+100 141
+12 107
+66 104
+57 120
+65 91
+91 191
+12 93
+50 66
+30 85
+4 5
+63 124
+69 145
+50 131
+61 94
+23 33
+27 91
+43 46
+67 131
+90 106
+47 128
+99 109
+76 133
+62 89
+68 95
+72 125
+37 55
+10 14
+6 55
+9 13
+99 168
+14 47
+24 62
+27 112
+92 133
+95 166
+36 76
+67 152
+72 94
+72 158
+77 175
+93 143
+38 78
+20 71
+68 122
+39 111
+49 120
+0 62
+52 127
+51 142
+81 168
+63 117
+33 52
+47 48
+4 66
+92 166
+51 120
+77 80
+54 89
+83 124
+90 126
+93 122
+6 83
+63 111
+95 146
+3 57
+39 117
+76 105
+71 76
+13 88
+94 185
+77 147
+47 147
+60 123
+64 134
+97 110
+99 111
+75 119
+15 35
+82 130
+92 129
+27 108
+93 94
+91 138
+43 101
+90 160
+90 155
+27 88
+2 17
+20 43
+9 94
diff --git a/geom_bottleneck/tests/data/test_617_B b/geom_bottleneck/tests/data/test_617_B
new file mode 100644
index 0000000..eb300a8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_617_B
@@ -0,0 +1,100 @@
+100 145
+51 93
+52 55
+73 86
+99 166
+80 151
+75 83
+81 105
+10 11
+52 110
+32 102
+38 124
+83 168
+55 116
+47 101
+71 90
+78 163
+19 98
+58 135
+54 137
+79 114
+91 102
+96 119
+9 10
+30 82
+15 60
+69 106
+56 125
+0 7
+71 74
+37 79
+80 102
+89 177
+43 92
+80 94
+9 92
+37 69
+6 95
+85 111
+27 38
+95 138
+92 157
+51 57
+79 96
+67 123
+56 70
+69 153
+82 151
+96 192
+12 34
+66 78
+75 154
+91 135
+79 179
+67 153
+45 86
+88 144
+91 109
+60 115
+92 176
+45 110
+35 117
+58 61
+91 147
+80 86
+9 80
+65 125
+75 78
+29 105
+69 148
+55 138
+54 60
+89 139
+98 131
+73 104
+29 127
+63 123
+7 69
+82 152
+6 92
+20 37
+41 112
+82 182
+73 128
+48 106
+60 98
+35 65
+13 42
+49 52
+8 36
+6 18
+42 70
+16 60
+30 56
+78 120
+80 94
+38 92
+19 52
+78 89
+49 131
diff --git a/geom_bottleneck/tests/data/test_618_A b/geom_bottleneck/tests/data/test_618_A
new file mode 100644
index 0000000..a53c5f8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_618_A
@@ -0,0 +1,100 @@
+28 78
+66 159
+45 123
+56 140
+67 109
+32 81
+23 101
+44 121
+82 99
+20 28
+59 137
+93 185
+51 103
+75 89
+47 69
+48 94
+23 52
+35 74
+67 161
+67 138
+12 25
+50 73
+90 158
+55 124
+95 120
+36 96
+91 126
+100 114
+15 66
+89 180
+19 54
+81 137
+65 114
+46 51
+42 141
+74 88
+46 76
+38 69
+21 92
+92 97
+16 29
+97 177
+22 75
+94 155
+10 47
+96 174
+98 155
+16 104
+49 88
+36 44
+1 9
+66 83
+71 117
+45 56
+49 146
+29 66
+31 35
+49 133
+43 123
+6 20
+24 103
+14 103
+13 30
+100 101
+8 68
+71 101
+18 52
+33 94
+82 113
+0 36
+1 79
+63 141
+29 113
+41 105
+5 105
+47 142
+98 159
+48 96
+31 43
+29 76
+63 159
+9 72
+39 62
+75 111
+27 37
+72 81
+39 112
+70 88
+78 149
+69 101
+68 136
+72 77
+18 40
+48 72
+53 115
+12 78
+40 63
+75 163
+57 141
+47 140
diff --git a/geom_bottleneck/tests/data/test_618_B b/geom_bottleneck/tests/data/test_618_B
new file mode 100644
index 0000000..611fb6a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_618_B
@@ -0,0 +1,100 @@
+35 126
+40 82
+62 85
+64 72
+55 138
+43 97
+12 41
+75 142
+12 68
+26 114
+69 169
+65 101
+76 161
+20 63
+25 113
+70 153
+54 70
+41 79
+29 91
+85 100
+53 134
+12 13
+38 56
+28 112
+34 118
+56 111
+17 104
+66 108
+23 26
+47 96
+18 100
+18 100
+51 127
+40 87
+63 75
+40 101
+14 48
+72 90
+80 121
+28 56
+91 147
+25 92
+31 55
+25 106
+41 57
+42 52
+65 98
+14 110
+98 188
+39 75
+68 147
+62 148
+16 96
+91 103
+83 109
+55 91
+85 184
+62 73
+9 105
+70 74
+33 132
+6 82
+97 169
+11 90
+98 194
+91 160
+74 133
+25 69
+73 114
+1 27
+100 120
+77 159
+88 187
+31 42
+24 25
+93 140
+44 96
+0 86
+39 55
+52 96
+2 54
+33 97
+63 151
+7 95
+40 54
+89 127
+71 112
+74 162
+55 113
+20 60
+81 106
+36 111
+17 75
+48 69
+6 33
+11 94
+73 150
+5 28
+62 118
+38 78
diff --git a/geom_bottleneck/tests/data/test_619_A b/geom_bottleneck/tests/data/test_619_A
new file mode 100644
index 0000000..4dd6557
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_619_A
@@ -0,0 +1,100 @@
+31 76
+34 130
+70 80
+52 82
+40 116
+77 109
+84 130
+53 111
+63 79
+7 12
+28 70
+35 78
+95 115
+78 123
+23 44
+96 162
+50 139
+58 155
+31 91
+91 129
+82 139
+21 111
+98 117
+75 137
+27 68
+51 125
+93 104
+71 161
+66 147
+97 132
+98 169
+93 186
+22 83
+73 136
+27 70
+100 194
+74 87
+21 31
+11 107
+59 70
+0 77
+99 126
+50 86
+31 123
+62 91
+25 119
+44 104
+68 156
+79 165
+58 89
+66 122
+20 42
+71 77
+97 177
+40 66
+78 122
+73 169
+84 89
+28 107
+58 94
+76 89
+68 103
+50 89
+90 97
+32 94
+30 96
+78 100
+97 186
+99 141
+61 116
+19 32
+19 101
+32 65
+15 67
+69 150
+55 64
+37 53
+76 130
+4 53
+27 79
+90 121
+8 53
+39 75
+90 102
+41 65
+34 124
+16 110
+52 61
+55 58
+23 62
+14 92
+39 88
+5 71
+59 110
+12 100
+14 90
+35 101
+23 105
+50 124
+58 148
diff --git a/geom_bottleneck/tests/data/test_619_B b/geom_bottleneck/tests/data/test_619_B
new file mode 100644
index 0000000..711d7cb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_619_B
@@ -0,0 +1,100 @@
+75 136
+69 74
+21 44
+4 30
+6 70
+27 50
+57 72
+62 67
+50 127
+33 84
+10 71
+87 167
+12 58
+1 41
+86 164
+74 133
+64 132
+80 178
+72 124
+91 165
+4 96
+6 90
+49 97
+87 123
+34 101
+34 66
+94 108
+78 109
+34 87
+23 107
+7 70
+88 108
+100 157
+18 29
+15 38
+81 136
+39 103
+12 96
+56 136
+71 104
+90 137
+100 167
+39 125
+10 102
+8 49
+86 89
+76 153
+21 48
+52 129
+58 61
+41 136
+43 110
+37 39
+20 65
+99 161
+54 82
+17 64
+66 137
+32 44
+13 40
+43 127
+1 21
+41 63
+57 127
+29 126
+64 134
+24 122
+62 73
+20 120
+72 109
+100 156
+35 43
+4 19
+84 174
+64 101
+32 122
+14 43
+68 111
+84 132
+55 92
+21 84
+90 183
+62 63
+10 107
+40 46
+81 124
+62 120
+50 125
+38 112
+72 137
+93 190
+38 57
+27 42
+7 76
+84 169
+45 102
+51 78
+96 111
+84 153
+53 60
diff --git a/geom_bottleneck/tests/data/test_620_A b/geom_bottleneck/tests/data/test_620_A
new file mode 100644
index 0000000..74e7856
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_620_A
@@ -0,0 +1,2 @@
+977 1670
+257 583
diff --git a/geom_bottleneck/tests/data/test_620_B b/geom_bottleneck/tests/data/test_620_B
new file mode 100644
index 0000000..e7efa97
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_620_B
@@ -0,0 +1,2 @@
+519 914
+659 781
diff --git a/geom_bottleneck/tests/data/test_621_A b/geom_bottleneck/tests/data/test_621_A
new file mode 100644
index 0000000..6a24523
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_621_A
@@ -0,0 +1,2 @@
+928 1424
+468 1402
diff --git a/geom_bottleneck/tests/data/test_621_B b/geom_bottleneck/tests/data/test_621_B
new file mode 100644
index 0000000..7b49acb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_621_B
@@ -0,0 +1,2 @@
+946 1838
+602 1466
diff --git a/geom_bottleneck/tests/data/test_622_A b/geom_bottleneck/tests/data/test_622_A
new file mode 100644
index 0000000..58d67ac
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_622_A
@@ -0,0 +1,2 @@
+199 1177
+163 743
diff --git a/geom_bottleneck/tests/data/test_622_B b/geom_bottleneck/tests/data/test_622_B
new file mode 100644
index 0000000..f9a4fdd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_622_B
@@ -0,0 +1,2 @@
+502 1478
+838 1480
diff --git a/geom_bottleneck/tests/data/test_623_A b/geom_bottleneck/tests/data/test_623_A
new file mode 100644
index 0000000..8d99200
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_623_A
@@ -0,0 +1,2 @@
+156 443
+264 982
diff --git a/geom_bottleneck/tests/data/test_623_B b/geom_bottleneck/tests/data/test_623_B
new file mode 100644
index 0000000..22ab9fd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_623_B
@@ -0,0 +1,2 @@
+995 1285
+571 1427
diff --git a/geom_bottleneck/tests/data/test_624_A b/geom_bottleneck/tests/data/test_624_A
new file mode 100644
index 0000000..49891f6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_624_A
@@ -0,0 +1,2 @@
+884 1159
+315 1125
diff --git a/geom_bottleneck/tests/data/test_624_B b/geom_bottleneck/tests/data/test_624_B
new file mode 100644
index 0000000..fa3e1ea
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_624_B
@@ -0,0 +1,2 @@
+236 1034
+474 567
diff --git a/geom_bottleneck/tests/data/test_625_A b/geom_bottleneck/tests/data/test_625_A
new file mode 100644
index 0000000..4da6ce4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_625_A
@@ -0,0 +1,2 @@
+8 375
+509 926
diff --git a/geom_bottleneck/tests/data/test_625_B b/geom_bottleneck/tests/data/test_625_B
new file mode 100644
index 0000000..bf587fc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_625_B
@@ -0,0 +1,2 @@
+805 895
+735 1279
diff --git a/geom_bottleneck/tests/data/test_626_A b/geom_bottleneck/tests/data/test_626_A
new file mode 100644
index 0000000..92036c8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_626_A
@@ -0,0 +1,2 @@
+821 1025
+74 936
diff --git a/geom_bottleneck/tests/data/test_626_B b/geom_bottleneck/tests/data/test_626_B
new file mode 100644
index 0000000..3052b59
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_626_B
@@ -0,0 +1,2 @@
+155 737
+564 1257
diff --git a/geom_bottleneck/tests/data/test_627_A b/geom_bottleneck/tests/data/test_627_A
new file mode 100644
index 0000000..f682247
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_627_A
@@ -0,0 +1,2 @@
+680 1473
+354 876
diff --git a/geom_bottleneck/tests/data/test_627_B b/geom_bottleneck/tests/data/test_627_B
new file mode 100644
index 0000000..7c61fad
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_627_B
@@ -0,0 +1,2 @@
+767 1509
+998 1182
diff --git a/geom_bottleneck/tests/data/test_628_A b/geom_bottleneck/tests/data/test_628_A
new file mode 100644
index 0000000..f499ec3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_628_A
@@ -0,0 +1,2 @@
+481 1127
+66 1027
diff --git a/geom_bottleneck/tests/data/test_628_B b/geom_bottleneck/tests/data/test_628_B
new file mode 100644
index 0000000..5eb5994
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_628_B
@@ -0,0 +1,2 @@
+961 1197
+123 388
diff --git a/geom_bottleneck/tests/data/test_629_A b/geom_bottleneck/tests/data/test_629_A
new file mode 100644
index 0000000..ff42c12
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_629_A
@@ -0,0 +1,2 @@
+457 1026
+405 1343
diff --git a/geom_bottleneck/tests/data/test_629_B b/geom_bottleneck/tests/data/test_629_B
new file mode 100644
index 0000000..b0b983a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_629_B
@@ -0,0 +1,2 @@
+575 706
+472 965
diff --git a/geom_bottleneck/tests/data/test_630_A b/geom_bottleneck/tests/data/test_630_A
new file mode 100644
index 0000000..6ed10cf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_630_A
@@ -0,0 +1,2 @@
+480 650
+0 307
diff --git a/geom_bottleneck/tests/data/test_630_B b/geom_bottleneck/tests/data/test_630_B
new file mode 100644
index 0000000..0583a0c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_630_B
@@ -0,0 +1,2 @@
+836 1099
+771 1050
diff --git a/geom_bottleneck/tests/data/test_631_A b/geom_bottleneck/tests/data/test_631_A
new file mode 100644
index 0000000..d49637c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_631_A
@@ -0,0 +1,2 @@
+551 1534
+392 820
diff --git a/geom_bottleneck/tests/data/test_631_B b/geom_bottleneck/tests/data/test_631_B
new file mode 100644
index 0000000..f522f48
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_631_B
@@ -0,0 +1,2 @@
+721 1465
+591 781
diff --git a/geom_bottleneck/tests/data/test_632_A b/geom_bottleneck/tests/data/test_632_A
new file mode 100644
index 0000000..32c4757
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_632_A
@@ -0,0 +1,2 @@
+352 417
+814 986
diff --git a/geom_bottleneck/tests/data/test_632_B b/geom_bottleneck/tests/data/test_632_B
new file mode 100644
index 0000000..f50a6bb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_632_B
@@ -0,0 +1,2 @@
+211 264
+517 1443
diff --git a/geom_bottleneck/tests/data/test_633_A b/geom_bottleneck/tests/data/test_633_A
new file mode 100644
index 0000000..0199c88
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_633_A
@@ -0,0 +1,2 @@
+487 1216
+842 1559
diff --git a/geom_bottleneck/tests/data/test_633_B b/geom_bottleneck/tests/data/test_633_B
new file mode 100644
index 0000000..d516834
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_633_B
@@ -0,0 +1,2 @@
+353 982
+437 1421
diff --git a/geom_bottleneck/tests/data/test_634_A b/geom_bottleneck/tests/data/test_634_A
new file mode 100644
index 0000000..45493ad
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_634_A
@@ -0,0 +1,2 @@
+367 742
+382 796
diff --git a/geom_bottleneck/tests/data/test_634_B b/geom_bottleneck/tests/data/test_634_B
new file mode 100644
index 0000000..8840b3a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_634_B
@@ -0,0 +1,2 @@
+9 723
+351 901
diff --git a/geom_bottleneck/tests/data/test_635_A b/geom_bottleneck/tests/data/test_635_A
new file mode 100644
index 0000000..d65240b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_635_A
@@ -0,0 +1,2 @@
+984 1272
+952 1384
diff --git a/geom_bottleneck/tests/data/test_635_B b/geom_bottleneck/tests/data/test_635_B
new file mode 100644
index 0000000..8cc813d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_635_B
@@ -0,0 +1,2 @@
+528 622
+88 466
diff --git a/geom_bottleneck/tests/data/test_636_A b/geom_bottleneck/tests/data/test_636_A
new file mode 100644
index 0000000..eee9635
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_636_A
@@ -0,0 +1,2 @@
+285 617
+809 1379
diff --git a/geom_bottleneck/tests/data/test_636_B b/geom_bottleneck/tests/data/test_636_B
new file mode 100644
index 0000000..e565845
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_636_B
@@ -0,0 +1,2 @@
+162 1083
+842 1760
diff --git a/geom_bottleneck/tests/data/test_637_A b/geom_bottleneck/tests/data/test_637_A
new file mode 100644
index 0000000..4ba4314
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_637_A
@@ -0,0 +1,2 @@
+624 1031
+118 423
diff --git a/geom_bottleneck/tests/data/test_637_B b/geom_bottleneck/tests/data/test_637_B
new file mode 100644
index 0000000..58aba0f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_637_B
@@ -0,0 +1,2 @@
+453 958
+310 1149
diff --git a/geom_bottleneck/tests/data/test_638_A b/geom_bottleneck/tests/data/test_638_A
new file mode 100644
index 0000000..4d993df
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_638_A
@@ -0,0 +1,2 @@
+683 1251
+811 1566
diff --git a/geom_bottleneck/tests/data/test_638_B b/geom_bottleneck/tests/data/test_638_B
new file mode 100644
index 0000000..5750b40
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_638_B
@@ -0,0 +1,2 @@
+489 1389
+408 858
diff --git a/geom_bottleneck/tests/data/test_639_A b/geom_bottleneck/tests/data/test_639_A
new file mode 100644
index 0000000..1e86c9b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_639_A
@@ -0,0 +1,2 @@
+907 1067
+329 547
diff --git a/geom_bottleneck/tests/data/test_639_B b/geom_bottleneck/tests/data/test_639_B
new file mode 100644
index 0000000..758fe2d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_639_B
@@ -0,0 +1,2 @@
+896 1777
+769 1237
diff --git a/geom_bottleneck/tests/data/test_640_A b/geom_bottleneck/tests/data/test_640_A
new file mode 100644
index 0000000..981248a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_640_A
@@ -0,0 +1,3 @@
+609 1601
+450 549
+123 590
diff --git a/geom_bottleneck/tests/data/test_640_B b/geom_bottleneck/tests/data/test_640_B
new file mode 100644
index 0000000..d4f75ec
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_640_B
@@ -0,0 +1,3 @@
+392 752
+844 1720
+51 914
diff --git a/geom_bottleneck/tests/data/test_641_A b/geom_bottleneck/tests/data/test_641_A
new file mode 100644
index 0000000..04100b0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_641_A
@@ -0,0 +1,3 @@
+344 679
+413 673
+647 1475
diff --git a/geom_bottleneck/tests/data/test_641_B b/geom_bottleneck/tests/data/test_641_B
new file mode 100644
index 0000000..840a640
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_641_B
@@ -0,0 +1,3 @@
+688 1185
+529 598
+382 1269
diff --git a/geom_bottleneck/tests/data/test_642_A b/geom_bottleneck/tests/data/test_642_A
new file mode 100644
index 0000000..a7da9ec
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_642_A
@@ -0,0 +1,3 @@
+886 1249
+24 684
+651 895
diff --git a/geom_bottleneck/tests/data/test_642_B b/geom_bottleneck/tests/data/test_642_B
new file mode 100644
index 0000000..e25e427
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_642_B
@@ -0,0 +1,3 @@
+779 977
+2 736
+978 1769
diff --git a/geom_bottleneck/tests/data/test_643_A b/geom_bottleneck/tests/data/test_643_A
new file mode 100644
index 0000000..e818bdc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_643_A
@@ -0,0 +1,3 @@
+891 1186
+391 1185
+921 1300
diff --git a/geom_bottleneck/tests/data/test_643_B b/geom_bottleneck/tests/data/test_643_B
new file mode 100644
index 0000000..7a5f620
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_643_B
@@ -0,0 +1,3 @@
+21 783
+84 583
+133 483
diff --git a/geom_bottleneck/tests/data/test_644_A b/geom_bottleneck/tests/data/test_644_A
new file mode 100644
index 0000000..f6bc335
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_644_A
@@ -0,0 +1,3 @@
+608 1036
+485 1247
+532 1302
diff --git a/geom_bottleneck/tests/data/test_644_B b/geom_bottleneck/tests/data/test_644_B
new file mode 100644
index 0000000..109024d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_644_B
@@ -0,0 +1,3 @@
+639 1059
+177 1044
+680 901
diff --git a/geom_bottleneck/tests/data/test_645_A b/geom_bottleneck/tests/data/test_645_A
new file mode 100644
index 0000000..3f62c52
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_645_A
@@ -0,0 +1,3 @@
+353 877
+730 1291
+610 992
diff --git a/geom_bottleneck/tests/data/test_645_B b/geom_bottleneck/tests/data/test_645_B
new file mode 100644
index 0000000..f818161
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_645_B
@@ -0,0 +1,3 @@
+854 1092
+395 737
+966 1230
diff --git a/geom_bottleneck/tests/data/test_646_A b/geom_bottleneck/tests/data/test_646_A
new file mode 100644
index 0000000..7582a95
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_646_A
@@ -0,0 +1,3 @@
+908 946
+490 875
+115 272
diff --git a/geom_bottleneck/tests/data/test_646_B b/geom_bottleneck/tests/data/test_646_B
new file mode 100644
index 0000000..af402f8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_646_B
@@ -0,0 +1,3 @@
+787 1300
+123 569
+222 235
diff --git a/geom_bottleneck/tests/data/test_647_A b/geom_bottleneck/tests/data/test_647_A
new file mode 100644
index 0000000..caa678f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_647_A
@@ -0,0 +1,3 @@
+165 217
+390 1141
+18 238
diff --git a/geom_bottleneck/tests/data/test_647_B b/geom_bottleneck/tests/data/test_647_B
new file mode 100644
index 0000000..a135f9e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_647_B
@@ -0,0 +1,3 @@
+244 641
+97 859
+575 1088
diff --git a/geom_bottleneck/tests/data/test_648_A b/geom_bottleneck/tests/data/test_648_A
new file mode 100644
index 0000000..35e36b8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_648_A
@@ -0,0 +1,3 @@
+461 1111
+285 713
+349 943
diff --git a/geom_bottleneck/tests/data/test_648_B b/geom_bottleneck/tests/data/test_648_B
new file mode 100644
index 0000000..8a28c4a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_648_B
@@ -0,0 +1,3 @@
+808 938
+293 374
+580 976
diff --git a/geom_bottleneck/tests/data/test_649_A b/geom_bottleneck/tests/data/test_649_A
new file mode 100644
index 0000000..065cc77
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_649_A
@@ -0,0 +1,3 @@
+57 802
+286 543
+403 1224
diff --git a/geom_bottleneck/tests/data/test_649_B b/geom_bottleneck/tests/data/test_649_B
new file mode 100644
index 0000000..b23411e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_649_B
@@ -0,0 +1,3 @@
+548 551
+21 683
+6 490
diff --git a/geom_bottleneck/tests/data/test_650_A b/geom_bottleneck/tests/data/test_650_A
new file mode 100644
index 0000000..d87b7b4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_650_A
@@ -0,0 +1,3 @@
+36 367
+273 389
+981 1711
diff --git a/geom_bottleneck/tests/data/test_650_B b/geom_bottleneck/tests/data/test_650_B
new file mode 100644
index 0000000..f379676
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_650_B
@@ -0,0 +1,3 @@
+659 1452
+551 1121
+551 949
diff --git a/geom_bottleneck/tests/data/test_651_A b/geom_bottleneck/tests/data/test_651_A
new file mode 100644
index 0000000..ecf506a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_651_A
@@ -0,0 +1,3 @@
+929 1425
+793 1446
+949 1437
diff --git a/geom_bottleneck/tests/data/test_651_B b/geom_bottleneck/tests/data/test_651_B
new file mode 100644
index 0000000..f05128d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_651_B
@@ -0,0 +1,3 @@
+860 1575
+476 1240
+126 1042
diff --git a/geom_bottleneck/tests/data/test_652_A b/geom_bottleneck/tests/data/test_652_A
new file mode 100644
index 0000000..52d5bdf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_652_A
@@ -0,0 +1,3 @@
+842 1066
+564 764
+68 267
diff --git a/geom_bottleneck/tests/data/test_652_B b/geom_bottleneck/tests/data/test_652_B
new file mode 100644
index 0000000..2b12de5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_652_B
@@ -0,0 +1,3 @@
+427 528
+404 1245
+800 994
diff --git a/geom_bottleneck/tests/data/test_653_A b/geom_bottleneck/tests/data/test_653_A
new file mode 100644
index 0000000..b4bbdd3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_653_A
@@ -0,0 +1,3 @@
+792 967
+574 1406
+175 533
diff --git a/geom_bottleneck/tests/data/test_653_B b/geom_bottleneck/tests/data/test_653_B
new file mode 100644
index 0000000..f349693
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_653_B
@@ -0,0 +1,3 @@
+421 822
+339 1231
+723 1052
diff --git a/geom_bottleneck/tests/data/test_654_A b/geom_bottleneck/tests/data/test_654_A
new file mode 100644
index 0000000..d090ad8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_654_A
@@ -0,0 +1,3 @@
+175 462
+829 1810
+494 1040
diff --git a/geom_bottleneck/tests/data/test_654_B b/geom_bottleneck/tests/data/test_654_B
new file mode 100644
index 0000000..f9944d7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_654_B
@@ -0,0 +1,3 @@
+656 658
+403 1260
+887 1883
diff --git a/geom_bottleneck/tests/data/test_655_A b/geom_bottleneck/tests/data/test_655_A
new file mode 100644
index 0000000..9105397
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_655_A
@@ -0,0 +1,3 @@
+1 419
+674 970
+633 664
diff --git a/geom_bottleneck/tests/data/test_655_B b/geom_bottleneck/tests/data/test_655_B
new file mode 100644
index 0000000..9aa2ab6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_655_B
@@ -0,0 +1,3 @@
+194 461
+376 901
+417 723
diff --git a/geom_bottleneck/tests/data/test_656_A b/geom_bottleneck/tests/data/test_656_A
new file mode 100644
index 0000000..bcdfd3c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_656_A
@@ -0,0 +1,3 @@
+707 825
+811 1475
+344 915
diff --git a/geom_bottleneck/tests/data/test_656_B b/geom_bottleneck/tests/data/test_656_B
new file mode 100644
index 0000000..5ee0ab0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_656_B
@@ -0,0 +1,3 @@
+928 1504
+366 991
+506 1194
diff --git a/geom_bottleneck/tests/data/test_657_A b/geom_bottleneck/tests/data/test_657_A
new file mode 100644
index 0000000..7d39a99
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_657_A
@@ -0,0 +1,3 @@
+101 439
+539 1442
+955 1560
diff --git a/geom_bottleneck/tests/data/test_657_B b/geom_bottleneck/tests/data/test_657_B
new file mode 100644
index 0000000..3b9d726
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_657_B
@@ -0,0 +1,3 @@
+505 966
+757 1602
+615 1309
diff --git a/geom_bottleneck/tests/data/test_658_A b/geom_bottleneck/tests/data/test_658_A
new file mode 100644
index 0000000..33f8b08
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_658_A
@@ -0,0 +1,3 @@
+829 1642
+95 139
+435 558
diff --git a/geom_bottleneck/tests/data/test_658_B b/geom_bottleneck/tests/data/test_658_B
new file mode 100644
index 0000000..b131e5d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_658_B
@@ -0,0 +1,3 @@
+171 1171
+240 780
+363 720
diff --git a/geom_bottleneck/tests/data/test_659_A b/geom_bottleneck/tests/data/test_659_A
new file mode 100644
index 0000000..974d216
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_659_A
@@ -0,0 +1,3 @@
+409 1266
+680 909
+942 1270
diff --git a/geom_bottleneck/tests/data/test_659_B b/geom_bottleneck/tests/data/test_659_B
new file mode 100644
index 0000000..c3cfbeb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_659_B
@@ -0,0 +1,3 @@
+318 1245
+561 1013
+787 1275
diff --git a/geom_bottleneck/tests/data/test_660_A b/geom_bottleneck/tests/data/test_660_A
new file mode 100644
index 0000000..1c408f3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_660_A
@@ -0,0 +1,4 @@
+526 757
+355 743
+250 1221
+35 439
diff --git a/geom_bottleneck/tests/data/test_660_B b/geom_bottleneck/tests/data/test_660_B
new file mode 100644
index 0000000..5fffa69
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_660_B
@@ -0,0 +1,4 @@
+348 611
+127 398
+839 1650
+136 803
diff --git a/geom_bottleneck/tests/data/test_661_A b/geom_bottleneck/tests/data/test_661_A
new file mode 100644
index 0000000..df0d8ad
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_661_A
@@ -0,0 +1,4 @@
+769 905
+534 1227
+410 422
+937 1744
diff --git a/geom_bottleneck/tests/data/test_661_B b/geom_bottleneck/tests/data/test_661_B
new file mode 100644
index 0000000..56cfa0c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_661_B
@@ -0,0 +1,4 @@
+19 350
+255 390
+910 1001
+853 1070
diff --git a/geom_bottleneck/tests/data/test_662_A b/geom_bottleneck/tests/data/test_662_A
new file mode 100644
index 0000000..cb65a38
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_662_A
@@ -0,0 +1,4 @@
+394 674
+364 1209
+763 1333
+344 1294
diff --git a/geom_bottleneck/tests/data/test_662_B b/geom_bottleneck/tests/data/test_662_B
new file mode 100644
index 0000000..92f0ee6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_662_B
@@ -0,0 +1,4 @@
+324 939
+829 987
+210 998
+519 756
diff --git a/geom_bottleneck/tests/data/test_663_A b/geom_bottleneck/tests/data/test_663_A
new file mode 100644
index 0000000..ed35031
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_663_A
@@ -0,0 +1,4 @@
+659 1254
+201 1188
+660 811
+630 1044
diff --git a/geom_bottleneck/tests/data/test_663_B b/geom_bottleneck/tests/data/test_663_B
new file mode 100644
index 0000000..6a6126c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_663_B
@@ -0,0 +1,4 @@
+873 914
+441 1063
+135 468
+584 620
diff --git a/geom_bottleneck/tests/data/test_664_A b/geom_bottleneck/tests/data/test_664_A
new file mode 100644
index 0000000..59f6bfa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_664_A
@@ -0,0 +1,4 @@
+753 1625
+353 1109
+565 650
+321 708
diff --git a/geom_bottleneck/tests/data/test_664_B b/geom_bottleneck/tests/data/test_664_B
new file mode 100644
index 0000000..6b34a5f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_664_B
@@ -0,0 +1,4 @@
+664 794
+572 1058
+754 1119
+899 1445
diff --git a/geom_bottleneck/tests/data/test_665_A b/geom_bottleneck/tests/data/test_665_A
new file mode 100644
index 0000000..ff6ce72
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_665_A
@@ -0,0 +1,4 @@
+661 1260
+232 833
+820 826
+32 139
diff --git a/geom_bottleneck/tests/data/test_665_B b/geom_bottleneck/tests/data/test_665_B
new file mode 100644
index 0000000..9a5d4a9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_665_B
@@ -0,0 +1,4 @@
+466 1319
+809 1762
+165 235
+636 1460
diff --git a/geom_bottleneck/tests/data/test_666_A b/geom_bottleneck/tests/data/test_666_A
new file mode 100644
index 0000000..455e262
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_666_A
@@ -0,0 +1,4 @@
+496 1447
+606 1017
+578 767
+971 1768
diff --git a/geom_bottleneck/tests/data/test_666_B b/geom_bottleneck/tests/data/test_666_B
new file mode 100644
index 0000000..0c9069e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_666_B
@@ -0,0 +1,4 @@
+578 896
+731 1115
+455 1129
+649 1421
diff --git a/geom_bottleneck/tests/data/test_667_A b/geom_bottleneck/tests/data/test_667_A
new file mode 100644
index 0000000..054d14e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_667_A
@@ -0,0 +1,4 @@
+537 1030
+887 1179
+644 905
+403 1382
diff --git a/geom_bottleneck/tests/data/test_667_B b/geom_bottleneck/tests/data/test_667_B
new file mode 100644
index 0000000..a4a432a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_667_B
@@ -0,0 +1,4 @@
+981 1100
+582 1487
+603 1448
+526 1059
diff --git a/geom_bottleneck/tests/data/test_668_A b/geom_bottleneck/tests/data/test_668_A
new file mode 100644
index 0000000..00c5554
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_668_A
@@ -0,0 +1,4 @@
+376 564
+803 1414
+324 973
+901 1266
diff --git a/geom_bottleneck/tests/data/test_668_B b/geom_bottleneck/tests/data/test_668_B
new file mode 100644
index 0000000..5b7e07c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_668_B
@@ -0,0 +1,4 @@
+901 1627
+805 1168
+867 1069
+156 291
diff --git a/geom_bottleneck/tests/data/test_669_A b/geom_bottleneck/tests/data/test_669_A
new file mode 100644
index 0000000..2abb014
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_669_A
@@ -0,0 +1,4 @@
+282 848
+560 1190
+152 342
+998 1524
diff --git a/geom_bottleneck/tests/data/test_669_B b/geom_bottleneck/tests/data/test_669_B
new file mode 100644
index 0000000..5694ce9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_669_B
@@ -0,0 +1,4 @@
+398 731
+835 1681
+791 1026
+939 1024
diff --git a/geom_bottleneck/tests/data/test_670_A b/geom_bottleneck/tests/data/test_670_A
new file mode 100644
index 0000000..e7ae4f1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_670_A
@@ -0,0 +1,4 @@
+665 1146
+512 1332
+375 595
+566 1211
diff --git a/geom_bottleneck/tests/data/test_670_B b/geom_bottleneck/tests/data/test_670_B
new file mode 100644
index 0000000..8f6b057
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_670_B
@@ -0,0 +1,4 @@
+203 469
+966 1146
+342 638
+290 498
diff --git a/geom_bottleneck/tests/data/test_671_A b/geom_bottleneck/tests/data/test_671_A
new file mode 100644
index 0000000..8ac70f3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_671_A
@@ -0,0 +1,4 @@
+533 1333
+682 1127
+928 1703
+487 781
diff --git a/geom_bottleneck/tests/data/test_671_B b/geom_bottleneck/tests/data/test_671_B
new file mode 100644
index 0000000..bcb5f1b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_671_B
@@ -0,0 +1,4 @@
+336 1128
+992 1292
+931 1497
+622 1165
diff --git a/geom_bottleneck/tests/data/test_672_A b/geom_bottleneck/tests/data/test_672_A
new file mode 100644
index 0000000..4ca2b19
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_672_A
@@ -0,0 +1,4 @@
+30 600
+893 1394
+112 776
+434 905
diff --git a/geom_bottleneck/tests/data/test_672_B b/geom_bottleneck/tests/data/test_672_B
new file mode 100644
index 0000000..29b8d76
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_672_B
@@ -0,0 +1,4 @@
+684 1559
+372 1171
+113 700
+180 865
diff --git a/geom_bottleneck/tests/data/test_673_A b/geom_bottleneck/tests/data/test_673_A
new file mode 100644
index 0000000..f6e6e4a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_673_A
@@ -0,0 +1,4 @@
+894 1455
+676 1502
+402 976
+863 1258
diff --git a/geom_bottleneck/tests/data/test_673_B b/geom_bottleneck/tests/data/test_673_B
new file mode 100644
index 0000000..01ac9c7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_673_B
@@ -0,0 +1,4 @@
+190 473
+420 1059
+187 827
+482 1365
diff --git a/geom_bottleneck/tests/data/test_674_A b/geom_bottleneck/tests/data/test_674_A
new file mode 100644
index 0000000..8bbf6ad
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_674_A
@@ -0,0 +1,4 @@
+89 681
+460 781
+500 679
+786 827
diff --git a/geom_bottleneck/tests/data/test_674_B b/geom_bottleneck/tests/data/test_674_B
new file mode 100644
index 0000000..ddebd4c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_674_B
@@ -0,0 +1,4 @@
+445 1261
+769 1735
+5 81
+964 1477
diff --git a/geom_bottleneck/tests/data/test_675_A b/geom_bottleneck/tests/data/test_675_A
new file mode 100644
index 0000000..30b36bb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_675_A
@@ -0,0 +1,4 @@
+507 965
+1000 1816
+946 1201
+926 1637
diff --git a/geom_bottleneck/tests/data/test_675_B b/geom_bottleneck/tests/data/test_675_B
new file mode 100644
index 0000000..c0722ef
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_675_B
@@ -0,0 +1,4 @@
+302 1162
+795 1527
+602 747
+646 683
diff --git a/geom_bottleneck/tests/data/test_676_A b/geom_bottleneck/tests/data/test_676_A
new file mode 100644
index 0000000..b43ef5e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_676_A
@@ -0,0 +1,4 @@
+343 1040
+556 758
+286 983
+467 700
diff --git a/geom_bottleneck/tests/data/test_676_B b/geom_bottleneck/tests/data/test_676_B
new file mode 100644
index 0000000..59b2fb6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_676_B
@@ -0,0 +1,4 @@
+446 1062
+65 988
+159 1102
+920 1553
diff --git a/geom_bottleneck/tests/data/test_677_A b/geom_bottleneck/tests/data/test_677_A
new file mode 100644
index 0000000..4d9d36e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_677_A
@@ -0,0 +1,4 @@
+355 949
+561 704
+153 945
+407 1134
diff --git a/geom_bottleneck/tests/data/test_677_B b/geom_bottleneck/tests/data/test_677_B
new file mode 100644
index 0000000..4edf573
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_677_B
@@ -0,0 +1,4 @@
+758 962
+354 535
+115 782
+309 1207
diff --git a/geom_bottleneck/tests/data/test_678_A b/geom_bottleneck/tests/data/test_678_A
new file mode 100644
index 0000000..54ab668
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_678_A
@@ -0,0 +1,4 @@
+946 1489
+594 1446
+686 986
+200 493
diff --git a/geom_bottleneck/tests/data/test_678_B b/geom_bottleneck/tests/data/test_678_B
new file mode 100644
index 0000000..f695f5f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_678_B
@@ -0,0 +1,4 @@
+708 725
+761 1309
+47 963
+61 320
diff --git a/geom_bottleneck/tests/data/test_679_A b/geom_bottleneck/tests/data/test_679_A
new file mode 100644
index 0000000..33e4ce8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_679_A
@@ -0,0 +1,4 @@
+153 950
+179 1047
+736 845
+943 1760
diff --git a/geom_bottleneck/tests/data/test_679_B b/geom_bottleneck/tests/data/test_679_B
new file mode 100644
index 0000000..a99ec77
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_679_B
@@ -0,0 +1,4 @@
+744 1423
+669 1350
+989 1062
+57 823
diff --git a/geom_bottleneck/tests/data/test_680_A b/geom_bottleneck/tests/data/test_680_A
new file mode 100644
index 0000000..4bb43a8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_680_A
@@ -0,0 +1,5 @@
+102 183
+847 1835
+300 1098
+953 1849
+327 1070
diff --git a/geom_bottleneck/tests/data/test_680_B b/geom_bottleneck/tests/data/test_680_B
new file mode 100644
index 0000000..efb704f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_680_B
@@ -0,0 +1,5 @@
+917 1904
+340 1190
+128 516
+695 1474
+450 628
diff --git a/geom_bottleneck/tests/data/test_681_A b/geom_bottleneck/tests/data/test_681_A
new file mode 100644
index 0000000..5eb7d6a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_681_A
@@ -0,0 +1,5 @@
+882 1558
+108 921
+479 653
+329 533
+643 952
diff --git a/geom_bottleneck/tests/data/test_681_B b/geom_bottleneck/tests/data/test_681_B
new file mode 100644
index 0000000..092ddc5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_681_B
@@ -0,0 +1,5 @@
+155 350
+686 1081
+791 900
+402 653
+364 610
diff --git a/geom_bottleneck/tests/data/test_682_A b/geom_bottleneck/tests/data/test_682_A
new file mode 100644
index 0000000..7898cba
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_682_A
@@ -0,0 +1,5 @@
+548 632
+839 990
+856 1008
+719 1091
+532 1445
diff --git a/geom_bottleneck/tests/data/test_682_B b/geom_bottleneck/tests/data/test_682_B
new file mode 100644
index 0000000..f5b1d81
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_682_B
@@ -0,0 +1,5 @@
+341 429
+146 682
+40 962
+543 1339
+277 944
diff --git a/geom_bottleneck/tests/data/test_683_A b/geom_bottleneck/tests/data/test_683_A
new file mode 100644
index 0000000..3661bfc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_683_A
@@ -0,0 +1,5 @@
+227 587
+365 708
+565 1465
+240 248
+610 1328
diff --git a/geom_bottleneck/tests/data/test_683_B b/geom_bottleneck/tests/data/test_683_B
new file mode 100644
index 0000000..62c998b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_683_B
@@ -0,0 +1,5 @@
+741 1553
+314 914
+980 1322
+398 1163
+304 901
diff --git a/geom_bottleneck/tests/data/test_684_A b/geom_bottleneck/tests/data/test_684_A
new file mode 100644
index 0000000..b22afe3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_684_A
@@ -0,0 +1,5 @@
+196 1047
+489 739
+11 758
+204 1069
+959 976
diff --git a/geom_bottleneck/tests/data/test_684_B b/geom_bottleneck/tests/data/test_684_B
new file mode 100644
index 0000000..cbede63
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_684_B
@@ -0,0 +1,5 @@
+391 1180
+229 906
+246 1219
+564 1171
+797 1273
diff --git a/geom_bottleneck/tests/data/test_685_A b/geom_bottleneck/tests/data/test_685_A
new file mode 100644
index 0000000..c4bd0e9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_685_A
@@ -0,0 +1,5 @@
+628 762
+148 921
+694 1155
+865 1298
+365 1337
diff --git a/geom_bottleneck/tests/data/test_685_B b/geom_bottleneck/tests/data/test_685_B
new file mode 100644
index 0000000..984dd98
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_685_B
@@ -0,0 +1,5 @@
+504 1226
+608 1576
+256 475
+479 884
+384 656
diff --git a/geom_bottleneck/tests/data/test_686_A b/geom_bottleneck/tests/data/test_686_A
new file mode 100644
index 0000000..e498d5c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_686_A
@@ -0,0 +1,5 @@
+839 1291
+140 808
+539 720
+928 1729
+881 1126
diff --git a/geom_bottleneck/tests/data/test_686_B b/geom_bottleneck/tests/data/test_686_B
new file mode 100644
index 0000000..56ada59
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_686_B
@@ -0,0 +1,5 @@
+280 962
+935 1205
+328 1022
+27 247
+554 732
diff --git a/geom_bottleneck/tests/data/test_687_A b/geom_bottleneck/tests/data/test_687_A
new file mode 100644
index 0000000..c31c2d2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_687_A
@@ -0,0 +1,5 @@
+323 954
+507 885
+533 1044
+679 1402
+43 918
diff --git a/geom_bottleneck/tests/data/test_687_B b/geom_bottleneck/tests/data/test_687_B
new file mode 100644
index 0000000..471eeed
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_687_B
@@ -0,0 +1,5 @@
+243 823
+269 1215
+449 1214
+24 777
+705 1558
diff --git a/geom_bottleneck/tests/data/test_688_A b/geom_bottleneck/tests/data/test_688_A
new file mode 100644
index 0000000..7396099
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_688_A
@@ -0,0 +1,5 @@
+471 989
+319 432
+130 900
+856 1389
+422 635
diff --git a/geom_bottleneck/tests/data/test_688_B b/geom_bottleneck/tests/data/test_688_B
new file mode 100644
index 0000000..e133e74
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_688_B
@@ -0,0 +1,5 @@
+13 373
+575 1199
+553 1347
+158 1148
+111 393
diff --git a/geom_bottleneck/tests/data/test_689_A b/geom_bottleneck/tests/data/test_689_A
new file mode 100644
index 0000000..72febe7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_689_A
@@ -0,0 +1,5 @@
+451 1035
+293 380
+400 648
+9 681
+85 96
diff --git a/geom_bottleneck/tests/data/test_689_B b/geom_bottleneck/tests/data/test_689_B
new file mode 100644
index 0000000..f684387
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_689_B
@@ -0,0 +1,5 @@
+431 1117
+40 969
+54 1026
+297 710
+722 1143
diff --git a/geom_bottleneck/tests/data/test_690_A b/geom_bottleneck/tests/data/test_690_A
new file mode 100644
index 0000000..4106f49
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_690_A
@@ -0,0 +1,5 @@
+624 1464
+228 1205
+638 876
+896 1632
+564 1378
diff --git a/geom_bottleneck/tests/data/test_690_B b/geom_bottleneck/tests/data/test_690_B
new file mode 100644
index 0000000..d452cff
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_690_B
@@ -0,0 +1,5 @@
+745 1386
+574 898
+472 1427
+922 1325
+592 1053
diff --git a/geom_bottleneck/tests/data/test_691_A b/geom_bottleneck/tests/data/test_691_A
new file mode 100644
index 0000000..b6c906e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_691_A
@@ -0,0 +1,5 @@
+291 1111
+75 251
+47 913
+753 1632
+582 739
diff --git a/geom_bottleneck/tests/data/test_691_B b/geom_bottleneck/tests/data/test_691_B
new file mode 100644
index 0000000..57e58ff
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_691_B
@@ -0,0 +1,5 @@
+264 911
+478 839
+182 258
+336 1121
+915 1764
diff --git a/geom_bottleneck/tests/data/test_692_A b/geom_bottleneck/tests/data/test_692_A
new file mode 100644
index 0000000..1686c25
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_692_A
@@ -0,0 +1,5 @@
+856 1460
+852 1085
+246 328
+508 1202
+900 1487
diff --git a/geom_bottleneck/tests/data/test_692_B b/geom_bottleneck/tests/data/test_692_B
new file mode 100644
index 0000000..bf6174a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_692_B
@@ -0,0 +1,5 @@
+624 1180
+247 889
+218 373
+823 1637
+439 597
diff --git a/geom_bottleneck/tests/data/test_693_A b/geom_bottleneck/tests/data/test_693_A
new file mode 100644
index 0000000..ea16ba6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_693_A
@@ -0,0 +1,5 @@
+37 175
+952 1934
+808 843
+742 822
+75 863
diff --git a/geom_bottleneck/tests/data/test_693_B b/geom_bottleneck/tests/data/test_693_B
new file mode 100644
index 0000000..52c8f97
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_693_B
@@ -0,0 +1,5 @@
+431 1287
+490 765
+552 843
+179 1131
+334 732
diff --git a/geom_bottleneck/tests/data/test_694_A b/geom_bottleneck/tests/data/test_694_A
new file mode 100644
index 0000000..e577a0f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_694_A
@@ -0,0 +1,5 @@
+917 1066
+928 1036
+611 1593
+682 1661
+561 810
diff --git a/geom_bottleneck/tests/data/test_694_B b/geom_bottleneck/tests/data/test_694_B
new file mode 100644
index 0000000..e406840
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_694_B
@@ -0,0 +1,5 @@
+754 918
+735 1730
+430 1284
+588 986
+56 791
diff --git a/geom_bottleneck/tests/data/test_695_A b/geom_bottleneck/tests/data/test_695_A
new file mode 100644
index 0000000..ef9cacb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_695_A
@@ -0,0 +1,5 @@
+219 629
+438 1008
+695 1385
+137 844
+394 1126
diff --git a/geom_bottleneck/tests/data/test_695_B b/geom_bottleneck/tests/data/test_695_B
new file mode 100644
index 0000000..f2bb91b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_695_B
@@ -0,0 +1,5 @@
+556 1218
+942 975
+730 1199
+110 947
+867 1613
diff --git a/geom_bottleneck/tests/data/test_696_A b/geom_bottleneck/tests/data/test_696_A
new file mode 100644
index 0000000..71fa19f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_696_A
@@ -0,0 +1,5 @@
+929 1104
+287 561
+801 1419
+549 1265
+758 795
diff --git a/geom_bottleneck/tests/data/test_696_B b/geom_bottleneck/tests/data/test_696_B
new file mode 100644
index 0000000..a964c63
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_696_B
@@ -0,0 +1,5 @@
+446 641
+863 1426
+0 382
+659 945
+707 715
diff --git a/geom_bottleneck/tests/data/test_697_A b/geom_bottleneck/tests/data/test_697_A
new file mode 100644
index 0000000..848e417
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_697_A
@@ -0,0 +1,5 @@
+876 1854
+147 864
+249 1095
+965 1723
+548 865
diff --git a/geom_bottleneck/tests/data/test_697_B b/geom_bottleneck/tests/data/test_697_B
new file mode 100644
index 0000000..98a8d15
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_697_B
@@ -0,0 +1,5 @@
+478 1175
+40 533
+212 388
+865 1736
+697 1335
diff --git a/geom_bottleneck/tests/data/test_698_A b/geom_bottleneck/tests/data/test_698_A
new file mode 100644
index 0000000..a90620d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_698_A
@@ -0,0 +1,5 @@
+714 1561
+967 1649
+57 65
+560 807
+451 1000
diff --git a/geom_bottleneck/tests/data/test_698_B b/geom_bottleneck/tests/data/test_698_B
new file mode 100644
index 0000000..ef52ae0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_698_B
@@ -0,0 +1,5 @@
+909 1809
+266 758
+894 1395
+495 1481
+91 646
diff --git a/geom_bottleneck/tests/data/test_699_A b/geom_bottleneck/tests/data/test_699_A
new file mode 100644
index 0000000..e00215d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_699_A
@@ -0,0 +1,5 @@
+749 799
+150 307
+463 1009
+503 1047
+613 1549
diff --git a/geom_bottleneck/tests/data/test_699_B b/geom_bottleneck/tests/data/test_699_B
new file mode 100644
index 0000000..0fff210
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_699_B
@@ -0,0 +1,5 @@
+915 1430
+582 685
+994 1491
+227 869
+251 1173
diff --git a/geom_bottleneck/tests/data/test_700_A b/geom_bottleneck/tests/data/test_700_A
new file mode 100644
index 0000000..9425b73
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_700_A
@@ -0,0 +1,6 @@
+313 977
+396 888
+244 339
+474 1072
+191 1069
+519 940
diff --git a/geom_bottleneck/tests/data/test_700_B b/geom_bottleneck/tests/data/test_700_B
new file mode 100644
index 0000000..19944b2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_700_B
@@ -0,0 +1,6 @@
+547 588
+852 1072
+34 817
+54 441
+222 413
+184 888
diff --git a/geom_bottleneck/tests/data/test_701_A b/geom_bottleneck/tests/data/test_701_A
new file mode 100644
index 0000000..062d6fb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_701_A
@@ -0,0 +1,6 @@
+582 910
+701 1226
+195 619
+541 668
+275 1161
+322 1041
diff --git a/geom_bottleneck/tests/data/test_701_B b/geom_bottleneck/tests/data/test_701_B
new file mode 100644
index 0000000..3149c7c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_701_B
@@ -0,0 +1,6 @@
+868 1747
+559 1027
+635 1354
+337 541
+630 1220
+860 1681
diff --git a/geom_bottleneck/tests/data/test_702_A b/geom_bottleneck/tests/data/test_702_A
new file mode 100644
index 0000000..2a82935
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_702_A
@@ -0,0 +1,6 @@
+378 869
+890 1016
+13 941
+706 1365
+879 1261
+334 864
diff --git a/geom_bottleneck/tests/data/test_702_B b/geom_bottleneck/tests/data/test_702_B
new file mode 100644
index 0000000..c3854d5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_702_B
@@ -0,0 +1,6 @@
+381 525
+852 1350
+825 884
+984 1542
+614 942
+74 652
diff --git a/geom_bottleneck/tests/data/test_703_A b/geom_bottleneck/tests/data/test_703_A
new file mode 100644
index 0000000..fb434c0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_703_A
@@ -0,0 +1,6 @@
+551 801
+116 205
+364 382
+883 1597
+834 1212
+737 988
diff --git a/geom_bottleneck/tests/data/test_703_B b/geom_bottleneck/tests/data/test_703_B
new file mode 100644
index 0000000..f8af9dd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_703_B
@@ -0,0 +1,6 @@
+661 695
+904 1528
+65 986
+691 785
+98 1000
+102 592
diff --git a/geom_bottleneck/tests/data/test_704_A b/geom_bottleneck/tests/data/test_704_A
new file mode 100644
index 0000000..a89a1aa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_704_A
@@ -0,0 +1,6 @@
+679 1424
+746 1074
+761 1546
+360 934
+139 855
+942 1002
diff --git a/geom_bottleneck/tests/data/test_704_B b/geom_bottleneck/tests/data/test_704_B
new file mode 100644
index 0000000..5abc5fa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_704_B
@@ -0,0 +1,6 @@
+781 1388
+48 645
+242 294
+979 1071
+348 1065
+701 1351
diff --git a/geom_bottleneck/tests/data/test_705_A b/geom_bottleneck/tests/data/test_705_A
new file mode 100644
index 0000000..924a661
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_705_A
@@ -0,0 +1,6 @@
+123 751
+405 935
+708 1217
+540 708
+810 1047
+346 1088
diff --git a/geom_bottleneck/tests/data/test_705_B b/geom_bottleneck/tests/data/test_705_B
new file mode 100644
index 0000000..0681a80
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_705_B
@@ -0,0 +1,6 @@
+175 1150
+840 1056
+180 658
+805 1787
+123 467
+947 1539
diff --git a/geom_bottleneck/tests/data/test_706_A b/geom_bottleneck/tests/data/test_706_A
new file mode 100644
index 0000000..0a249be
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_706_A
@@ -0,0 +1,6 @@
+900 1181
+555 663
+1 750
+883 1197
+33 518
+450 808
diff --git a/geom_bottleneck/tests/data/test_706_B b/geom_bottleneck/tests/data/test_706_B
new file mode 100644
index 0000000..624923c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_706_B
@@ -0,0 +1,6 @@
+682 818
+814 1240
+900 1777
+399 967
+420 921
+723 1022
diff --git a/geom_bottleneck/tests/data/test_707_A b/geom_bottleneck/tests/data/test_707_A
new file mode 100644
index 0000000..a251b74
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_707_A
@@ -0,0 +1,6 @@
+991 1398
+632 1322
+635 1448
+97 955
+793 1016
+995 1832
diff --git a/geom_bottleneck/tests/data/test_707_B b/geom_bottleneck/tests/data/test_707_B
new file mode 100644
index 0000000..2647b31
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_707_B
@@ -0,0 +1,6 @@
+320 551
+552 1125
+383 551
+891 1032
+272 1038
+925 1695
diff --git a/geom_bottleneck/tests/data/test_708_A b/geom_bottleneck/tests/data/test_708_A
new file mode 100644
index 0000000..ddc601a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_708_A
@@ -0,0 +1,6 @@
+681 786
+125 980
+146 721
+769 1207
+504 1208
+724 985
diff --git a/geom_bottleneck/tests/data/test_708_B b/geom_bottleneck/tests/data/test_708_B
new file mode 100644
index 0000000..0a64a4f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_708_B
@@ -0,0 +1,6 @@
+571 697
+763 1635
+573 623
+683 1438
+783 1580
+541 1374
diff --git a/geom_bottleneck/tests/data/test_709_A b/geom_bottleneck/tests/data/test_709_A
new file mode 100644
index 0000000..2d3aa30
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_709_A
@@ -0,0 +1,6 @@
+704 1089
+764 1349
+322 1100
+731 1284
+42 525
+49 602
diff --git a/geom_bottleneck/tests/data/test_709_B b/geom_bottleneck/tests/data/test_709_B
new file mode 100644
index 0000000..c5f7233
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_709_B
@@ -0,0 +1,6 @@
+435 502
+150 1140
+356 1273
+592 1292
+552 1331
+905 1713
diff --git a/geom_bottleneck/tests/data/test_710_A b/geom_bottleneck/tests/data/test_710_A
new file mode 100644
index 0000000..e611f5a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_710_A
@@ -0,0 +1,6 @@
+257 589
+18 966
+482 1110
+588 763
+989 1857
+479 494
diff --git a/geom_bottleneck/tests/data/test_710_B b/geom_bottleneck/tests/data/test_710_B
new file mode 100644
index 0000000..cd9cedb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_710_B
@@ -0,0 +1,6 @@
+2 263
+642 884
+72 321
+632 1186
+633 1310
+263 1219
diff --git a/geom_bottleneck/tests/data/test_711_A b/geom_bottleneck/tests/data/test_711_A
new file mode 100644
index 0000000..900b87a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_711_A
@@ -0,0 +1,6 @@
+954 1912
+243 556
+758 967
+836 1102
+184 1134
+401 434
diff --git a/geom_bottleneck/tests/data/test_711_B b/geom_bottleneck/tests/data/test_711_B
new file mode 100644
index 0000000..31dd505
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_711_B
@@ -0,0 +1,6 @@
+454 1045
+606 646
+999 1478
+398 845
+743 1192
+926 1080
diff --git a/geom_bottleneck/tests/data/test_712_A b/geom_bottleneck/tests/data/test_712_A
new file mode 100644
index 0000000..15bc0a2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_712_A
@@ -0,0 +1,6 @@
+395 1052
+984 1461
+792 801
+652 1183
+411 744
+830 876
diff --git a/geom_bottleneck/tests/data/test_712_B b/geom_bottleneck/tests/data/test_712_B
new file mode 100644
index 0000000..3071ea5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_712_B
@@ -0,0 +1,6 @@
+16 294
+910 1274
+495 1113
+4 944
+244 512
+164 1074
diff --git a/geom_bottleneck/tests/data/test_713_A b/geom_bottleneck/tests/data/test_713_A
new file mode 100644
index 0000000..89ee240
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_713_A
@@ -0,0 +1,6 @@
+588 1259
+827 1531
+94 877
+171 1137
+482 729
+879 1065
diff --git a/geom_bottleneck/tests/data/test_713_B b/geom_bottleneck/tests/data/test_713_B
new file mode 100644
index 0000000..f2b501c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_713_B
@@ -0,0 +1,6 @@
+222 623
+527 1158
+784 1040
+597 1063
+456 525
+713 1476
diff --git a/geom_bottleneck/tests/data/test_714_A b/geom_bottleneck/tests/data/test_714_A
new file mode 100644
index 0000000..73ba892
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_714_A
@@ -0,0 +1,6 @@
+81 1045
+398 727
+668 1311
+788 1623
+363 1222
+630 757
diff --git a/geom_bottleneck/tests/data/test_714_B b/geom_bottleneck/tests/data/test_714_B
new file mode 100644
index 0000000..c495e7a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_714_B
@@ -0,0 +1,6 @@
+840 1651
+664 995
+984 1812
+501 1183
+859 1373
+224 321
diff --git a/geom_bottleneck/tests/data/test_715_A b/geom_bottleneck/tests/data/test_715_A
new file mode 100644
index 0000000..70b698d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_715_A
@@ -0,0 +1,6 @@
+390 400
+914 963
+118 182
+848 1799
+24 207
+310 917
diff --git a/geom_bottleneck/tests/data/test_715_B b/geom_bottleneck/tests/data/test_715_B
new file mode 100644
index 0000000..3cdf2b3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_715_B
@@ -0,0 +1,6 @@
+999 1621
+121 432
+878 1064
+454 925
+642 1350
+976 1667
diff --git a/geom_bottleneck/tests/data/test_716_A b/geom_bottleneck/tests/data/test_716_A
new file mode 100644
index 0000000..ada9ac0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_716_A
@@ -0,0 +1,6 @@
+838 1400
+274 999
+806 1428
+957 1203
+48 503
+600 754
diff --git a/geom_bottleneck/tests/data/test_716_B b/geom_bottleneck/tests/data/test_716_B
new file mode 100644
index 0000000..b13c8a1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_716_B
@@ -0,0 +1,6 @@
+64 560
+385 907
+324 1041
+611 868
+685 1605
+320 733
diff --git a/geom_bottleneck/tests/data/test_717_A b/geom_bottleneck/tests/data/test_717_A
new file mode 100644
index 0000000..f23e351
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_717_A
@@ -0,0 +1,6 @@
+435 538
+281 369
+230 609
+932 1150
+629 1558
+397 511
diff --git a/geom_bottleneck/tests/data/test_717_B b/geom_bottleneck/tests/data/test_717_B
new file mode 100644
index 0000000..150f7ff
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_717_B
@@ -0,0 +1,6 @@
+293 1253
+356 1075
+559 754
+309 911
+726 1445
+539 1249
diff --git a/geom_bottleneck/tests/data/test_718_A b/geom_bottleneck/tests/data/test_718_A
new file mode 100644
index 0000000..6efc756
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_718_A
@@ -0,0 +1,6 @@
+289 455
+404 1182
+924 1629
+961 1779
+392 1078
+881 1571
diff --git a/geom_bottleneck/tests/data/test_718_B b/geom_bottleneck/tests/data/test_718_B
new file mode 100644
index 0000000..4e45db1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_718_B
@@ -0,0 +1,6 @@
+666 983
+482 1016
+609 1498
+352 882
+92 384
+911 1898
diff --git a/geom_bottleneck/tests/data/test_719_A b/geom_bottleneck/tests/data/test_719_A
new file mode 100644
index 0000000..3512e1f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_719_A
@@ -0,0 +1,6 @@
+589 1272
+999 1340
+628 1428
+112 311
+854 1288
+579 1034
diff --git a/geom_bottleneck/tests/data/test_719_B b/geom_bottleneck/tests/data/test_719_B
new file mode 100644
index 0000000..028f44a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_719_B
@@ -0,0 +1,6 @@
+223 460
+798 1620
+582 901
+542 835
+309 851
+28 133
diff --git a/geom_bottleneck/tests/data/test_720_A b/geom_bottleneck/tests/data/test_720_A
new file mode 100644
index 0000000..57e2829
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_720_A
@@ -0,0 +1,7 @@
+842 955
+876 1162
+447 481
+217 1212
+392 731
+112 940
+462 796
diff --git a/geom_bottleneck/tests/data/test_720_B b/geom_bottleneck/tests/data/test_720_B
new file mode 100644
index 0000000..f3f2675
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_720_B
@@ -0,0 +1,7 @@
+768 1167
+970 1497
+720 809
+848 1278
+264 387
+443 673
+481 643
diff --git a/geom_bottleneck/tests/data/test_721_A b/geom_bottleneck/tests/data/test_721_A
new file mode 100644
index 0000000..f8a7f29
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_721_A
@@ -0,0 +1,7 @@
+712 1082
+573 1189
+468 579
+431 1140
+543 758
+852 1545
+707 1585
diff --git a/geom_bottleneck/tests/data/test_721_B b/geom_bottleneck/tests/data/test_721_B
new file mode 100644
index 0000000..35b828c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_721_B
@@ -0,0 +1,7 @@
+274 999
+671 1640
+687 969
+641 796
+566 1384
+558 1386
+611 1189
diff --git a/geom_bottleneck/tests/data/test_722_A b/geom_bottleneck/tests/data/test_722_A
new file mode 100644
index 0000000..6e0719f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_722_A
@@ -0,0 +1,7 @@
+292 783
+995 1371
+60 662
+506 531
+294 1245
+966 1027
+750 1180
diff --git a/geom_bottleneck/tests/data/test_722_B b/geom_bottleneck/tests/data/test_722_B
new file mode 100644
index 0000000..0fd37cc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_722_B
@@ -0,0 +1,7 @@
+194 750
+520 773
+206 498
+746 1278
+354 643
+812 1219
+547 707
diff --git a/geom_bottleneck/tests/data/test_723_A b/geom_bottleneck/tests/data/test_723_A
new file mode 100644
index 0000000..ad94fdd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_723_A
@@ -0,0 +1,7 @@
+44 715
+470 1287
+692 1635
+849 1409
+636 724
+108 255
+377 1253
diff --git a/geom_bottleneck/tests/data/test_723_B b/geom_bottleneck/tests/data/test_723_B
new file mode 100644
index 0000000..247a17e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_723_B
@@ -0,0 +1,7 @@
+565 1129
+574 725
+387 1204
+990 1093
+548 1447
+547 1294
+394 421
diff --git a/geom_bottleneck/tests/data/test_724_A b/geom_bottleneck/tests/data/test_724_A
new file mode 100644
index 0000000..f9a6bcf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_724_A
@@ -0,0 +1,7 @@
+121 963
+4 934
+471 1403
+78 700
+500 749
+577 1241
+961 1123
diff --git a/geom_bottleneck/tests/data/test_724_B b/geom_bottleneck/tests/data/test_724_B
new file mode 100644
index 0000000..71d03b3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_724_B
@@ -0,0 +1,7 @@
+597 1424
+232 317
+618 1105
+593 1007
+410 1158
+534 965
+306 782
diff --git a/geom_bottleneck/tests/data/test_725_A b/geom_bottleneck/tests/data/test_725_A
new file mode 100644
index 0000000..1e20d9e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_725_A
@@ -0,0 +1,7 @@
+365 431
+764 1023
+503 1251
+50 557
+899 930
+906 1266
+698 1582
diff --git a/geom_bottleneck/tests/data/test_725_B b/geom_bottleneck/tests/data/test_725_B
new file mode 100644
index 0000000..a215c1e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_725_B
@@ -0,0 +1,7 @@
+591 1250
+643 1388
+429 1007
+953 1625
+604 1075
+486 1455
+999 1790
diff --git a/geom_bottleneck/tests/data/test_726_A b/geom_bottleneck/tests/data/test_726_A
new file mode 100644
index 0000000..dd9500a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_726_A
@@ -0,0 +1,7 @@
+193 1032
+813 1060
+401 672
+819 1490
+913 993
+294 753
+107 807
diff --git a/geom_bottleneck/tests/data/test_726_B b/geom_bottleneck/tests/data/test_726_B
new file mode 100644
index 0000000..b3d3e50
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_726_B
@@ -0,0 +1,7 @@
+57 1011
+861 1503
+669 1185
+630 1360
+636 952
+524 526
+264 1129
diff --git a/geom_bottleneck/tests/data/test_727_A b/geom_bottleneck/tests/data/test_727_A
new file mode 100644
index 0000000..dae9ff3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_727_A
@@ -0,0 +1,7 @@
+268 505
+525 1512
+131 265
+534 1402
+810 1044
+474 933
+752 1495
diff --git a/geom_bottleneck/tests/data/test_727_B b/geom_bottleneck/tests/data/test_727_B
new file mode 100644
index 0000000..551d523
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_727_B
@@ -0,0 +1,7 @@
+366 1348
+38 470
+594 1547
+97 353
+417 626
+791 1472
+493 1262
diff --git a/geom_bottleneck/tests/data/test_728_A b/geom_bottleneck/tests/data/test_728_A
new file mode 100644
index 0000000..8074ce8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_728_A
@@ -0,0 +1,7 @@
+798 958
+59 406
+670 868
+533 789
+192 727
+52 109
+997 1981
diff --git a/geom_bottleneck/tests/data/test_728_B b/geom_bottleneck/tests/data/test_728_B
new file mode 100644
index 0000000..6d1448a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_728_B
@@ -0,0 +1,7 @@
+211 624
+198 1095
+150 530
+757 1274
+672 1255
+847 1476
+879 1407
diff --git a/geom_bottleneck/tests/data/test_729_A b/geom_bottleneck/tests/data/test_729_A
new file mode 100644
index 0000000..f9de136
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_729_A
@@ -0,0 +1,7 @@
+574 1387
+241 543
+338 345
+888 1183
+942 1193
+5 802
+357 510
diff --git a/geom_bottleneck/tests/data/test_729_B b/geom_bottleneck/tests/data/test_729_B
new file mode 100644
index 0000000..d34621f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_729_B
@@ -0,0 +1,7 @@
+878 1129
+669 805
+56 973
+201 756
+911 1352
+494 887
+161 541
diff --git a/geom_bottleneck/tests/data/test_730_A b/geom_bottleneck/tests/data/test_730_A
new file mode 100644
index 0000000..433cbd8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_730_A
@@ -0,0 +1,7 @@
+135 1110
+126 417
+647 964
+895 1124
+213 1115
+340 755
+154 605
diff --git a/geom_bottleneck/tests/data/test_730_B b/geom_bottleneck/tests/data/test_730_B
new file mode 100644
index 0000000..1b46964
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_730_B
@@ -0,0 +1,7 @@
+854 866
+212 1211
+180 272
+386 1292
+47 565
+916 1350
+906 912
diff --git a/geom_bottleneck/tests/data/test_731_A b/geom_bottleneck/tests/data/test_731_A
new file mode 100644
index 0000000..38d42cd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_731_A
@@ -0,0 +1,7 @@
+1000 1606
+332 982
+581 1398
+403 1237
+954 1071
+560 890
+980 1624
diff --git a/geom_bottleneck/tests/data/test_731_B b/geom_bottleneck/tests/data/test_731_B
new file mode 100644
index 0000000..3017d7a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_731_B
@@ -0,0 +1,7 @@
+171 558
+391 1367
+177 1159
+130 343
+914 1175
+774 835
+672 1301
diff --git a/geom_bottleneck/tests/data/test_732_A b/geom_bottleneck/tests/data/test_732_A
new file mode 100644
index 0000000..75a48cf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_732_A
@@ -0,0 +1,7 @@
+330 1018
+692 1639
+213 1060
+138 458
+356 1233
+976 1361
+117 365
diff --git a/geom_bottleneck/tests/data/test_732_B b/geom_bottleneck/tests/data/test_732_B
new file mode 100644
index 0000000..fada3b9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_732_B
@@ -0,0 +1,7 @@
+530 729
+842 926
+375 633
+364 987
+507 1398
+303 1096
+137 344
diff --git a/geom_bottleneck/tests/data/test_733_A b/geom_bottleneck/tests/data/test_733_A
new file mode 100644
index 0000000..d97ae0b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_733_A
@@ -0,0 +1,7 @@
+155 290
+712 904
+154 668
+518 1267
+224 1022
+997 1304
+551 1015
diff --git a/geom_bottleneck/tests/data/test_733_B b/geom_bottleneck/tests/data/test_733_B
new file mode 100644
index 0000000..529c7de
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_733_B
@@ -0,0 +1,7 @@
+930 1406
+626 980
+541 1340
+129 1023
+407 615
+105 850
+688 756
diff --git a/geom_bottleneck/tests/data/test_734_A b/geom_bottleneck/tests/data/test_734_A
new file mode 100644
index 0000000..9aec4b4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_734_A
@@ -0,0 +1,7 @@
+296 1160
+3 574
+642 808
+844 1148
+982 1081
+236 634
+151 904
diff --git a/geom_bottleneck/tests/data/test_734_B b/geom_bottleneck/tests/data/test_734_B
new file mode 100644
index 0000000..4cb7206
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_734_B
@@ -0,0 +1,7 @@
+30 884
+13 769
+406 954
+794 1615
+976 1177
+631 816
+400 1099
diff --git a/geom_bottleneck/tests/data/test_735_A b/geom_bottleneck/tests/data/test_735_A
new file mode 100644
index 0000000..f364a21
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_735_A
@@ -0,0 +1,7 @@
+259 941
+218 975
+286 718
+70 401
+496 830
+220 362
+511 1270
diff --git a/geom_bottleneck/tests/data/test_735_B b/geom_bottleneck/tests/data/test_735_B
new file mode 100644
index 0000000..0f93850
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_735_B
@@ -0,0 +1,7 @@
+489 705
+467 962
+110 116
+817 1521
+571 1059
+426 584
+933 1307
diff --git a/geom_bottleneck/tests/data/test_736_A b/geom_bottleneck/tests/data/test_736_A
new file mode 100644
index 0000000..d89c563
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_736_A
@@ -0,0 +1,7 @@
+624 1466
+288 1004
+552 978
+710 1190
+796 1634
+322 800
+171 197
diff --git a/geom_bottleneck/tests/data/test_736_B b/geom_bottleneck/tests/data/test_736_B
new file mode 100644
index 0000000..25427f3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_736_B
@@ -0,0 +1,7 @@
+385 852
+110 431
+284 646
+803 1541
+436 821
+262 951
+470 1172
diff --git a/geom_bottleneck/tests/data/test_737_A b/geom_bottleneck/tests/data/test_737_A
new file mode 100644
index 0000000..2fbdf41
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_737_A
@@ -0,0 +1,7 @@
+340 942
+812 1103
+129 553
+729 781
+779 1100
+99 1059
+720 1532
diff --git a/geom_bottleneck/tests/data/test_737_B b/geom_bottleneck/tests/data/test_737_B
new file mode 100644
index 0000000..42348d5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_737_B
@@ -0,0 +1,7 @@
+677 1323
+268 916
+165 674
+594 689
+975 1246
+717 734
+877 1479
diff --git a/geom_bottleneck/tests/data/test_738_A b/geom_bottleneck/tests/data/test_738_A
new file mode 100644
index 0000000..d56b09b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_738_A
@@ -0,0 +1,7 @@
+367 725
+277 1154
+267 994
+780 1005
+293 530
+964 1682
+421 734
diff --git a/geom_bottleneck/tests/data/test_738_B b/geom_bottleneck/tests/data/test_738_B
new file mode 100644
index 0000000..834b2cf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_738_B
@@ -0,0 +1,7 @@
+661 1499
+920 1597
+528 958
+482 957
+143 757
+547 1079
+774 937
diff --git a/geom_bottleneck/tests/data/test_739_A b/geom_bottleneck/tests/data/test_739_A
new file mode 100644
index 0000000..84cbd7c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_739_A
@@ -0,0 +1,7 @@
+414 1244
+395 937
+504 1155
+711 1389
+302 859
+220 731
+725 962
diff --git a/geom_bottleneck/tests/data/test_739_B b/geom_bottleneck/tests/data/test_739_B
new file mode 100644
index 0000000..85afe3e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_739_B
@@ -0,0 +1,7 @@
+598 980
+50 441
+473 1160
+524 1273
+523 1060
+936 1295
+73 910
diff --git a/geom_bottleneck/tests/data/test_740_A b/geom_bottleneck/tests/data/test_740_A
new file mode 100644
index 0000000..a99113a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_740_A
@@ -0,0 +1,8 @@
+569 1119
+905 1475
+608 1595
+469 1334
+501 1299
+306 797
+802 1036
+155 379
diff --git a/geom_bottleneck/tests/data/test_740_B b/geom_bottleneck/tests/data/test_740_B
new file mode 100644
index 0000000..5aac504
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_740_B
@@ -0,0 +1,8 @@
+729 946
+190 1105
+541 1315
+719 1537
+319 1219
+269 468
+638 838
+51 440
diff --git a/geom_bottleneck/tests/data/test_741_A b/geom_bottleneck/tests/data/test_741_A
new file mode 100644
index 0000000..7c3f3fc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_741_A
@@ -0,0 +1,8 @@
+897 1868
+872 1752
+739 1445
+156 178
+256 714
+198 528
+595 1485
+873 1452
diff --git a/geom_bottleneck/tests/data/test_741_B b/geom_bottleneck/tests/data/test_741_B
new file mode 100644
index 0000000..9f8d386
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_741_B
@@ -0,0 +1,8 @@
+193 277
+309 1030
+263 1230
+824 1414
+191 1103
+42 165
+665 690
+414 742
diff --git a/geom_bottleneck/tests/data/test_742_A b/geom_bottleneck/tests/data/test_742_A
new file mode 100644
index 0000000..9effd4c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_742_A
@@ -0,0 +1,8 @@
+268 974
+345 812
+75 359
+178 827
+647 1213
+667 677
+400 521
+703 1302
diff --git a/geom_bottleneck/tests/data/test_742_B b/geom_bottleneck/tests/data/test_742_B
new file mode 100644
index 0000000..f17965b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_742_B
@@ -0,0 +1,8 @@
+577 1161
+635 1057
+395 684
+225 312
+194 475
+550 732
+892 1097
+494 987
diff --git a/geom_bottleneck/tests/data/test_743_A b/geom_bottleneck/tests/data/test_743_A
new file mode 100644
index 0000000..3a40cfb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_743_A
@@ -0,0 +1,8 @@
+593 1306
+117 664
+701 1073
+918 1452
+125 1012
+80 106
+26 904
+525 1251
diff --git a/geom_bottleneck/tests/data/test_743_B b/geom_bottleneck/tests/data/test_743_B
new file mode 100644
index 0000000..482d6dd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_743_B
@@ -0,0 +1,8 @@
+913 1090
+957 1355
+465 559
+490 1102
+957 1559
+535 805
+569 1211
+8 570
diff --git a/geom_bottleneck/tests/data/test_744_A b/geom_bottleneck/tests/data/test_744_A
new file mode 100644
index 0000000..25c3e55
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_744_A
@@ -0,0 +1,8 @@
+648 773
+599 1278
+940 1503
+127 461
+923 1912
+724 939
+609 633
+720 936
diff --git a/geom_bottleneck/tests/data/test_744_B b/geom_bottleneck/tests/data/test_744_B
new file mode 100644
index 0000000..da30f30
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_744_B
@@ -0,0 +1,8 @@
+102 119
+262 460
+568 825
+855 1517
+622 1062
+441 607
+183 1095
+446 1422
diff --git a/geom_bottleneck/tests/data/test_745_A b/geom_bottleneck/tests/data/test_745_A
new file mode 100644
index 0000000..f8ef7e6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_745_A
@@ -0,0 +1,8 @@
+34 614
+939 1749
+639 698
+16 851
+847 1299
+760 1345
+477 682
+931 1291
diff --git a/geom_bottleneck/tests/data/test_745_B b/geom_bottleneck/tests/data/test_745_B
new file mode 100644
index 0000000..f6d32b5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_745_B
@@ -0,0 +1,8 @@
+972 1016
+16 293
+116 641
+230 1015
+164 468
+557 700
+1 477
+437 739
diff --git a/geom_bottleneck/tests/data/test_746_A b/geom_bottleneck/tests/data/test_746_A
new file mode 100644
index 0000000..dbd677e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_746_A
@@ -0,0 +1,8 @@
+651 1348
+225 349
+382 755
+986 1090
+601 856
+349 1261
+667 1644
+637 1197
diff --git a/geom_bottleneck/tests/data/test_746_B b/geom_bottleneck/tests/data/test_746_B
new file mode 100644
index 0000000..9d02f4b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_746_B
@@ -0,0 +1,8 @@
+804 1762
+13 403
+615 1487
+810 899
+939 1026
+59 539
+258 803
+199 488
diff --git a/geom_bottleneck/tests/data/test_747_A b/geom_bottleneck/tests/data/test_747_A
new file mode 100644
index 0000000..c7886f8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_747_A
@@ -0,0 +1,8 @@
+810 1169
+599 1295
+34 243
+41 247
+828 1689
+884 1265
+57 122
+340 1041
diff --git a/geom_bottleneck/tests/data/test_747_B b/geom_bottleneck/tests/data/test_747_B
new file mode 100644
index 0000000..1ca1b5e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_747_B
@@ -0,0 +1,8 @@
+282 836
+663 822
+874 1239
+911 1439
+704 1085
+593 787
+125 683
+790 1041
diff --git a/geom_bottleneck/tests/data/test_748_A b/geom_bottleneck/tests/data/test_748_A
new file mode 100644
index 0000000..5fe22c2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_748_A
@@ -0,0 +1,8 @@
+713 1382
+941 1859
+531 1460
+239 703
+4 712
+381 1018
+492 1298
+142 765
diff --git a/geom_bottleneck/tests/data/test_748_B b/geom_bottleneck/tests/data/test_748_B
new file mode 100644
index 0000000..2e69002
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_748_B
@@ -0,0 +1,8 @@
+993 1036
+886 1574
+892 1880
+649 1474
+228 1041
+124 730
+197 360
+490 1447
diff --git a/geom_bottleneck/tests/data/test_749_A b/geom_bottleneck/tests/data/test_749_A
new file mode 100644
index 0000000..b3bf068
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_749_A
@@ -0,0 +1,8 @@
+233 929
+150 391
+761 1353
+402 872
+890 1624
+103 482
+855 1150
+173 190
diff --git a/geom_bottleneck/tests/data/test_749_B b/geom_bottleneck/tests/data/test_749_B
new file mode 100644
index 0000000..b181d57
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_749_B
@@ -0,0 +1,8 @@
+304 960
+633 956
+62 250
+678 1085
+582 1509
+267 1159
+555 872
+828 935
diff --git a/geom_bottleneck/tests/data/test_750_A b/geom_bottleneck/tests/data/test_750_A
new file mode 100644
index 0000000..3bd3e77
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_750_A
@@ -0,0 +1,8 @@
+46 814
+299 740
+422 505
+597 674
+626 882
+550 1384
+257 522
+191 537
diff --git a/geom_bottleneck/tests/data/test_750_B b/geom_bottleneck/tests/data/test_750_B
new file mode 100644
index 0000000..837ed3d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_750_B
@@ -0,0 +1,8 @@
+119 1069
+304 1151
+984 1304
+938 1017
+915 1414
+603 1419
+806 1391
+247 563
diff --git a/geom_bottleneck/tests/data/test_751_A b/geom_bottleneck/tests/data/test_751_A
new file mode 100644
index 0000000..adb0fe7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_751_A
@@ -0,0 +1,8 @@
+161 749
+884 1266
+52 256
+626 1062
+244 1161
+52 651
+429 513
+123 381
diff --git a/geom_bottleneck/tests/data/test_751_B b/geom_bottleneck/tests/data/test_751_B
new file mode 100644
index 0000000..1ed1651
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_751_B
@@ -0,0 +1,8 @@
+646 1122
+980 1686
+3 270
+410 1255
+5 817
+9 390
+601 1013
+786 1675
diff --git a/geom_bottleneck/tests/data/test_752_A b/geom_bottleneck/tests/data/test_752_A
new file mode 100644
index 0000000..4b54da2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_752_A
@@ -0,0 +1,8 @@
+941 1425
+272 829
+904 1623
+562 1306
+223 245
+534 1385
+903 1274
+531 629
diff --git a/geom_bottleneck/tests/data/test_752_B b/geom_bottleneck/tests/data/test_752_B
new file mode 100644
index 0000000..9c05ec9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_752_B
@@ -0,0 +1,8 @@
+514 1333
+981 1676
+949 1493
+952 1015
+572 1224
+131 835
+93 335
+306 906
diff --git a/geom_bottleneck/tests/data/test_753_A b/geom_bottleneck/tests/data/test_753_A
new file mode 100644
index 0000000..5704668
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_753_A
@@ -0,0 +1,8 @@
+405 996
+473 1330
+168 804
+516 578
+712 1449
+425 1336
+237 816
+625 1304
diff --git a/geom_bottleneck/tests/data/test_753_B b/geom_bottleneck/tests/data/test_753_B
new file mode 100644
index 0000000..1e845f7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_753_B
@@ -0,0 +1,8 @@
+291 1031
+70 332
+847 973
+311 398
+815 1512
+996 1375
+720 1388
+518 611
diff --git a/geom_bottleneck/tests/data/test_754_A b/geom_bottleneck/tests/data/test_754_A
new file mode 100644
index 0000000..1957784
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_754_A
@@ -0,0 +1,8 @@
+138 781
+992 1803
+189 1157
+546 1145
+461 1153
+634 1004
+152 947
+706 713
diff --git a/geom_bottleneck/tests/data/test_754_B b/geom_bottleneck/tests/data/test_754_B
new file mode 100644
index 0000000..4463862
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_754_B
@@ -0,0 +1,8 @@
+742 1152
+909 947
+350 1168
+240 769
+415 479
+752 1507
+356 902
+856 1356
diff --git a/geom_bottleneck/tests/data/test_755_A b/geom_bottleneck/tests/data/test_755_A
new file mode 100644
index 0000000..d05546d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_755_A
@@ -0,0 +1,8 @@
+163 1000
+403 624
+628 829
+458 854
+319 778
+180 856
+822 1028
+806 923
diff --git a/geom_bottleneck/tests/data/test_755_B b/geom_bottleneck/tests/data/test_755_B
new file mode 100644
index 0000000..47b372a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_755_B
@@ -0,0 +1,8 @@
+922 1134
+900 1378
+200 780
+184 815
+631 1014
+837 1762
+676 789
+298 486
diff --git a/geom_bottleneck/tests/data/test_756_A b/geom_bottleneck/tests/data/test_756_A
new file mode 100644
index 0000000..bac3296
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_756_A
@@ -0,0 +1,8 @@
+467 1356
+84 188
+215 968
+702 1035
+305 745
+171 880
+724 1223
+916 1487
diff --git a/geom_bottleneck/tests/data/test_756_B b/geom_bottleneck/tests/data/test_756_B
new file mode 100644
index 0000000..0579dd8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_756_B
@@ -0,0 +1,8 @@
+62 816
+781 1333
+496 1018
+211 657
+968 1779
+684 828
+707 816
+133 710
diff --git a/geom_bottleneck/tests/data/test_757_A b/geom_bottleneck/tests/data/test_757_A
new file mode 100644
index 0000000..3d0e16e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_757_A
@@ -0,0 +1,8 @@
+850 1310
+104 459
+439 1185
+320 454
+423 1247
+85 891
+899 1560
+114 246
diff --git a/geom_bottleneck/tests/data/test_757_B b/geom_bottleneck/tests/data/test_757_B
new file mode 100644
index 0000000..7ccedc5
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_757_B
@@ -0,0 +1,8 @@
+797 1761
+642 812
+919 1333
+446 703
+330 1069
+575 668
+735 1258
+723 1330
diff --git a/geom_bottleneck/tests/data/test_758_A b/geom_bottleneck/tests/data/test_758_A
new file mode 100644
index 0000000..fdabcdd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_758_A
@@ -0,0 +1,8 @@
+310 820
+65 766
+892 1802
+459 1216
+237 358
+371 419
+218 375
+27 127
diff --git a/geom_bottleneck/tests/data/test_758_B b/geom_bottleneck/tests/data/test_758_B
new file mode 100644
index 0000000..4fb7f60
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_758_B
@@ -0,0 +1,8 @@
+261 318
+423 669
+485 1330
+814 942
+276 1013
+914 1010
+893 1161
+559 1118
diff --git a/geom_bottleneck/tests/data/test_759_A b/geom_bottleneck/tests/data/test_759_A
new file mode 100644
index 0000000..dcf3a28
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_759_A
@@ -0,0 +1,8 @@
+235 1080
+801 1281
+406 1012
+157 1091
+394 1385
+217 791
+971 1930
+529 1401
diff --git a/geom_bottleneck/tests/data/test_759_B b/geom_bottleneck/tests/data/test_759_B
new file mode 100644
index 0000000..e094e35
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_759_B
@@ -0,0 +1,8 @@
+957 1887
+857 1225
+366 386
+678 1429
+828 876
+250 466
+506 1127
+791 946
diff --git a/geom_bottleneck/tests/data/test_760_A b/geom_bottleneck/tests/data/test_760_A
new file mode 100644
index 0000000..38e77f3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_760_A
@@ -0,0 +1,9 @@
+754 1750
+559 782
+889 1821
+897 1093
+380 764
+367 932
+854 1721
+815 1633
+803 939
diff --git a/geom_bottleneck/tests/data/test_760_B b/geom_bottleneck/tests/data/test_760_B
new file mode 100644
index 0000000..1bb3547
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_760_B
@@ -0,0 +1,9 @@
+895 1474
+904 1893
+474 832
+238 631
+82 583
+470 797
+461 903
+856 1006
+151 669
diff --git a/geom_bottleneck/tests/data/test_761_A b/geom_bottleneck/tests/data/test_761_A
new file mode 100644
index 0000000..4690752
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_761_A
@@ -0,0 +1,9 @@
+377 1284
+139 699
+50 438
+687 919
+35 957
+652 713
+272 1264
+788 1721
+656 1330
diff --git a/geom_bottleneck/tests/data/test_761_B b/geom_bottleneck/tests/data/test_761_B
new file mode 100644
index 0000000..9978d2c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_761_B
@@ -0,0 +1,9 @@
+670 860
+401 500
+127 995
+594 1023
+638 1052
+727 802
+766 1624
+261 880
+172 663
diff --git a/geom_bottleneck/tests/data/test_762_A b/geom_bottleneck/tests/data/test_762_A
new file mode 100644
index 0000000..7918ab6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_762_A
@@ -0,0 +1,9 @@
+457 1270
+23 803
+189 293
+113 500
+911 1041
+504 728
+105 492
+514 1222
+753 923
diff --git a/geom_bottleneck/tests/data/test_762_B b/geom_bottleneck/tests/data/test_762_B
new file mode 100644
index 0000000..d36f033
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_762_B
@@ -0,0 +1,9 @@
+393 565
+182 184
+852 1821
+702 1558
+157 245
+456 924
+640 1103
+934 1125
+979 1099
diff --git a/geom_bottleneck/tests/data/test_763_A b/geom_bottleneck/tests/data/test_763_A
new file mode 100644
index 0000000..73d90de
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_763_A
@@ -0,0 +1,9 @@
+89 776
+785 1157
+846 1324
+854 1048
+968 1721
+653 1216
+707 718
+958 1397
+247 1245
diff --git a/geom_bottleneck/tests/data/test_763_B b/geom_bottleneck/tests/data/test_763_B
new file mode 100644
index 0000000..09d159c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_763_B
@@ -0,0 +1,9 @@
+730 1315
+831 1373
+669 1287
+125 500
+676 1262
+272 524
+173 651
+38 624
+514 1175
diff --git a/geom_bottleneck/tests/data/test_764_A b/geom_bottleneck/tests/data/test_764_A
new file mode 100644
index 0000000..8dead93
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_764_A
@@ -0,0 +1,9 @@
+104 150
+837 890
+975 1135
+650 697
+202 393
+972 1174
+619 969
+274 891
+16 366
diff --git a/geom_bottleneck/tests/data/test_764_B b/geom_bottleneck/tests/data/test_764_B
new file mode 100644
index 0000000..014198d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_764_B
@@ -0,0 +1,9 @@
+150 432
+45 234
+8 95
+31 712
+331 1329
+184 531
+44 922
+764 1746
+838 919
diff --git a/geom_bottleneck/tests/data/test_765_A b/geom_bottleneck/tests/data/test_765_A
new file mode 100644
index 0000000..666d2fe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_765_A
@@ -0,0 +1,9 @@
+105 587
+505 1209
+617 651
+120 670
+322 1268
+410 1307
+822 1420
+351 1226
+150 633
diff --git a/geom_bottleneck/tests/data/test_765_B b/geom_bottleneck/tests/data/test_765_B
new file mode 100644
index 0000000..c0be6d4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_765_B
@@ -0,0 +1,9 @@
+274 1006
+627 1237
+21 246
+785 1167
+929 1234
+462 904
+539 997
+453 592
+251 513
diff --git a/geom_bottleneck/tests/data/test_766_A b/geom_bottleneck/tests/data/test_766_A
new file mode 100644
index 0000000..48d55d9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_766_A
@@ -0,0 +1,9 @@
+49 532
+799 1331
+372 667
+852 1746
+400 834
+182 499
+889 1775
+831 867
+139 227
diff --git a/geom_bottleneck/tests/data/test_766_B b/geom_bottleneck/tests/data/test_766_B
new file mode 100644
index 0000000..9943c61
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_766_B
@@ -0,0 +1,9 @@
+976 1516
+153 908
+103 143
+105 439
+469 744
+981 1387
+267 319
+960 1495
+734 1370
diff --git a/geom_bottleneck/tests/data/test_767_A b/geom_bottleneck/tests/data/test_767_A
new file mode 100644
index 0000000..badb767
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_767_A
@@ -0,0 +1,9 @@
+244 622
+925 1530
+263 455
+189 991
+342 1273
+266 321
+544 962
+613 1019
+592 791
diff --git a/geom_bottleneck/tests/data/test_767_B b/geom_bottleneck/tests/data/test_767_B
new file mode 100644
index 0000000..3eb4c39
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_767_B
@@ -0,0 +1,9 @@
+928 1479
+80 1065
+382 1056
+679 880
+307 891
+685 1466
+278 806
+501 1479
+126 271
diff --git a/geom_bottleneck/tests/data/test_768_A b/geom_bottleneck/tests/data/test_768_A
new file mode 100644
index 0000000..69b6425
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_768_A
@@ -0,0 +1,9 @@
+674 1590
+745 1289
+854 1215
+412 627
+538 992
+135 1053
+385 594
+354 569
+702 1010
diff --git a/geom_bottleneck/tests/data/test_768_B b/geom_bottleneck/tests/data/test_768_B
new file mode 100644
index 0000000..a0e8eb0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_768_B
@@ -0,0 +1,9 @@
+735 1627
+423 514
+524 1236
+377 412
+372 415
+873 1835
+719 1488
+828 1361
+160 705
diff --git a/geom_bottleneck/tests/data/test_769_A b/geom_bottleneck/tests/data/test_769_A
new file mode 100644
index 0000000..08a46bd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_769_A
@@ -0,0 +1,9 @@
+930 1077
+466 1159
+305 866
+672 1003
+970 1824
+774 1212
+454 611
+702 944
+979 1136
diff --git a/geom_bottleneck/tests/data/test_769_B b/geom_bottleneck/tests/data/test_769_B
new file mode 100644
index 0000000..ce18190
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_769_B
@@ -0,0 +1,9 @@
+293 996
+973 1865
+346 753
+897 1337
+58 1055
+35 647
+892 1158
+59 174
+342 1131
diff --git a/geom_bottleneck/tests/data/test_770_A b/geom_bottleneck/tests/data/test_770_A
new file mode 100644
index 0000000..edfdf26
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_770_A
@@ -0,0 +1,9 @@
+61 130
+770 1196
+740 778
+985 1720
+131 208
+740 1516
+798 1185
+609 1141
+159 389
diff --git a/geom_bottleneck/tests/data/test_770_B b/geom_bottleneck/tests/data/test_770_B
new file mode 100644
index 0000000..cd59228
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_770_B
@@ -0,0 +1,9 @@
+815 1216
+229 652
+696 1309
+585 1011
+882 1621
+398 670
+931 1271
+988 1333
+197 1110
diff --git a/geom_bottleneck/tests/data/test_771_A b/geom_bottleneck/tests/data/test_771_A
new file mode 100644
index 0000000..9c3f4ba
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_771_A
@@ -0,0 +1,9 @@
+186 373
+378 642
+448 1022
+866 911
+706 1637
+528 950
+150 216
+327 506
+898 1366
diff --git a/geom_bottleneck/tests/data/test_771_B b/geom_bottleneck/tests/data/test_771_B
new file mode 100644
index 0000000..8c07a06
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_771_B
@@ -0,0 +1,9 @@
+968 1807
+686 1584
+296 347
+695 1143
+614 1205
+310 502
+249 694
+420 457
+743 1113
diff --git a/geom_bottleneck/tests/data/test_772_A b/geom_bottleneck/tests/data/test_772_A
new file mode 100644
index 0000000..034ed92
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_772_A
@@ -0,0 +1,9 @@
+286 399
+38 700
+884 1344
+201 1085
+285 1278
+661 901
+921 966
+3 728
+237 982
diff --git a/geom_bottleneck/tests/data/test_772_B b/geom_bottleneck/tests/data/test_772_B
new file mode 100644
index 0000000..bc29bff
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_772_B
@@ -0,0 +1,9 @@
+148 440
+806 1799
+886 1586
+363 1211
+316 683
+229 766
+839 1204
+245 685
+43 841
diff --git a/geom_bottleneck/tests/data/test_773_A b/geom_bottleneck/tests/data/test_773_A
new file mode 100644
index 0000000..0601e04
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_773_A
@@ -0,0 +1,9 @@
+796 1034
+635 1409
+52 141
+974 1000
+341 800
+727 820
+343 1278
+138 153
+446 823
diff --git a/geom_bottleneck/tests/data/test_773_B b/geom_bottleneck/tests/data/test_773_B
new file mode 100644
index 0000000..004d2d6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_773_B
@@ -0,0 +1,9 @@
+327 384
+214 341
+815 1156
+868 1138
+369 392
+351 1162
+829 1594
+618 783
+47 656
diff --git a/geom_bottleneck/tests/data/test_774_A b/geom_bottleneck/tests/data/test_774_A
new file mode 100644
index 0000000..3e211a0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_774_A
@@ -0,0 +1,9 @@
+833 1408
+738 1321
+731 825
+670 795
+458 1062
+777 1262
+719 1131
+979 1366
+350 1290
diff --git a/geom_bottleneck/tests/data/test_774_B b/geom_bottleneck/tests/data/test_774_B
new file mode 100644
index 0000000..3cf3985
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_774_B
@@ -0,0 +1,9 @@
+421 1393
+851 1666
+633 1458
+560 1168
+936 1833
+855 1548
+275 1067
+899 1767
+539 947
diff --git a/geom_bottleneck/tests/data/test_775_A b/geom_bottleneck/tests/data/test_775_A
new file mode 100644
index 0000000..5676eb4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_775_A
@@ -0,0 +1,9 @@
+210 651
+529 1257
+998 1304
+957 1816
+624 800
+200 460
+319 1051
+422 962
+642 1439
diff --git a/geom_bottleneck/tests/data/test_775_B b/geom_bottleneck/tests/data/test_775_B
new file mode 100644
index 0000000..5c4e8bc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_775_B
@@ -0,0 +1,9 @@
+652 1315
+419 981
+912 1832
+578 1215
+317 992
+785 1422
+528 664
+968 1344
+847 993
diff --git a/geom_bottleneck/tests/data/test_776_A b/geom_bottleneck/tests/data/test_776_A
new file mode 100644
index 0000000..49370ff
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_776_A
@@ -0,0 +1,9 @@
+707 768
+983 1893
+386 786
+370 914
+45 501
+625 1184
+175 1073
+262 1227
+819 1257
diff --git a/geom_bottleneck/tests/data/test_776_B b/geom_bottleneck/tests/data/test_776_B
new file mode 100644
index 0000000..575a2d9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_776_B
@@ -0,0 +1,9 @@
+949 1560
+757 1176
+689 1184
+819 1333
+50 884
+872 1695
+992 1145
+909 1889
+516 1376
diff --git a/geom_bottleneck/tests/data/test_777_A b/geom_bottleneck/tests/data/test_777_A
new file mode 100644
index 0000000..eb1c980
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_777_A
@@ -0,0 +1,9 @@
+958 1247
+143 570
+463 1343
+347 1346
+640 1203
+923 964
+489 701
+712 837
+616 978
diff --git a/geom_bottleneck/tests/data/test_777_B b/geom_bottleneck/tests/data/test_777_B
new file mode 100644
index 0000000..eb9c8ee
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_777_B
@@ -0,0 +1,9 @@
+781 1080
+494 1278
+123 159
+936 1305
+748 1302
+271 524
+37 953
+758 946
+182 670
diff --git a/geom_bottleneck/tests/data/test_778_A b/geom_bottleneck/tests/data/test_778_A
new file mode 100644
index 0000000..8392b2a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_778_A
@@ -0,0 +1,9 @@
+544 1145
+371 1278
+417 814
+694 1566
+443 1104
+710 827
+617 714
+286 503
+191 568
diff --git a/geom_bottleneck/tests/data/test_778_B b/geom_bottleneck/tests/data/test_778_B
new file mode 100644
index 0000000..017b08d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_778_B
@@ -0,0 +1,9 @@
+746 1177
+291 727
+956 1929
+255 294
+938 1415
+564 1206
+657 1586
+499 1013
+67 1035
diff --git a/geom_bottleneck/tests/data/test_779_A b/geom_bottleneck/tests/data/test_779_A
new file mode 100644
index 0000000..221d574
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_779_A
@@ -0,0 +1,9 @@
+771 1728
+948 1405
+842 1792
+956 1247
+194 841
+152 1145
+683 1458
+854 1851
+817 864
diff --git a/geom_bottleneck/tests/data/test_779_B b/geom_bottleneck/tests/data/test_779_B
new file mode 100644
index 0000000..113003e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_779_B
@@ -0,0 +1,9 @@
+911 955
+410 1292
+972 1259
+128 1011
+362 591
+827 834
+677 1611
+783 1570
+844 1426
diff --git a/geom_bottleneck/tests/data/test_780_A b/geom_bottleneck/tests/data/test_780_A
new file mode 100644
index 0000000..3d9a22c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_780_A
@@ -0,0 +1,10 @@
+183 274
+354 862
+922 1354
+560 1351
+235 292
+695 1560
+29 997
+962 1865
+141 1080
+827 1101
diff --git a/geom_bottleneck/tests/data/test_780_B b/geom_bottleneck/tests/data/test_780_B
new file mode 100644
index 0000000..defbae9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_780_B
@@ -0,0 +1,10 @@
+42 318
+758 1669
+351 1022
+824 1415
+902 1400
+515 576
+260 586
+28 176
+469 1338
+909 1379
diff --git a/geom_bottleneck/tests/data/test_781_A b/geom_bottleneck/tests/data/test_781_A
new file mode 100644
index 0000000..72201a7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_781_A
@@ -0,0 +1,10 @@
+329 554
+888 1476
+129 806
+786 990
+328 727
+574 1226
+864 1378
+61 561
+154 823
+922 1810
diff --git a/geom_bottleneck/tests/data/test_781_B b/geom_bottleneck/tests/data/test_781_B
new file mode 100644
index 0000000..85c8683
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_781_B
@@ -0,0 +1,10 @@
+193 306
+784 949
+446 467
+830 891
+36 174
+28 1028
+135 1113
+689 737
+598 669
+808 1618
diff --git a/geom_bottleneck/tests/data/test_782_A b/geom_bottleneck/tests/data/test_782_A
new file mode 100644
index 0000000..b376509
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_782_A
@@ -0,0 +1,10 @@
+488 967
+298 299
+687 942
+225 1184
+375 467
+17 355
+165 658
+911 1012
+970 1538
+26 194
diff --git a/geom_bottleneck/tests/data/test_782_B b/geom_bottleneck/tests/data/test_782_B
new file mode 100644
index 0000000..9fba291
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_782_B
@@ -0,0 +1,10 @@
+191 1062
+253 1153
+930 1745
+736 1486
+274 503
+830 1830
+769 865
+33 921
+160 304
+229 1012
diff --git a/geom_bottleneck/tests/data/test_783_A b/geom_bottleneck/tests/data/test_783_A
new file mode 100644
index 0000000..83593db
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_783_A
@@ -0,0 +1,10 @@
+575 1393
+206 817
+209 288
+181 466
+796 861
+885 1340
+110 346
+18 946
+769 1139
+422 1212
diff --git a/geom_bottleneck/tests/data/test_783_B b/geom_bottleneck/tests/data/test_783_B
new file mode 100644
index 0000000..d169a48
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_783_B
@@ -0,0 +1,10 @@
+810 1113
+997 1451
+205 1095
+621 1281
+677 1326
+911 1262
+395 916
+224 882
+708 812
+82 824
diff --git a/geom_bottleneck/tests/data/test_784_A b/geom_bottleneck/tests/data/test_784_A
new file mode 100644
index 0000000..b10df8b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_784_A
@@ -0,0 +1,10 @@
+963 1352
+692 1376
+910 967
+668 831
+840 962
+348 424
+729 1606
+417 514
+350 871
+289 298
diff --git a/geom_bottleneck/tests/data/test_784_B b/geom_bottleneck/tests/data/test_784_B
new file mode 100644
index 0000000..ef2b466
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_784_B
@@ -0,0 +1,10 @@
+754 955
+100 1075
+199 738
+800 1132
+419 949
+729 969
+774 941
+559 1196
+692 1096
+741 1061
diff --git a/geom_bottleneck/tests/data/test_785_A b/geom_bottleneck/tests/data/test_785_A
new file mode 100644
index 0000000..3cdfaba
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_785_A
@@ -0,0 +1,10 @@
+797 970
+423 870
+289 692
+856 1132
+465 1409
+521 977
+322 545
+137 608
+934 1682
+77 959
diff --git a/geom_bottleneck/tests/data/test_785_B b/geom_bottleneck/tests/data/test_785_B
new file mode 100644
index 0000000..32fe176
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_785_B
@@ -0,0 +1,10 @@
+554 985
+793 1614
+915 1231
+215 790
+410 1181
+290 830
+733 1352
+717 829
+37 152
+989 1971
diff --git a/geom_bottleneck/tests/data/test_786_A b/geom_bottleneck/tests/data/test_786_A
new file mode 100644
index 0000000..2d9fcec
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_786_A
@@ -0,0 +1,10 @@
+274 873
+62 804
+282 663
+517 1295
+906 921
+967 1806
+724 1674
+976 1641
+923 1492
+529 1316
diff --git a/geom_bottleneck/tests/data/test_786_B b/geom_bottleneck/tests/data/test_786_B
new file mode 100644
index 0000000..417ee4b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_786_B
@@ -0,0 +1,10 @@
+185 563
+774 1322
+467 499
+627 1251
+193 228
+528 1146
+957 1286
+882 891
+271 1024
+43 489
diff --git a/geom_bottleneck/tests/data/test_787_A b/geom_bottleneck/tests/data/test_787_A
new file mode 100644
index 0000000..7c056b6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_787_A
@@ -0,0 +1,10 @@
+297 511
+275 457
+251 1094
+824 1027
+872 1563
+842 1711
+841 1094
+732 1633
+82 105
+397 900
diff --git a/geom_bottleneck/tests/data/test_787_B b/geom_bottleneck/tests/data/test_787_B
new file mode 100644
index 0000000..ddc126a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_787_B
@@ -0,0 +1,10 @@
+152 438
+370 689
+859 1398
+697 1574
+294 635
+414 1138
+656 1516
+543 800
+260 902
+55 193
diff --git a/geom_bottleneck/tests/data/test_788_A b/geom_bottleneck/tests/data/test_788_A
new file mode 100644
index 0000000..61a58b0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_788_A
@@ -0,0 +1,10 @@
+820 1238
+143 789
+0 482
+20 414
+838 1690
+810 1160
+178 978
+963 1890
+852 1293
+399 609
diff --git a/geom_bottleneck/tests/data/test_788_B b/geom_bottleneck/tests/data/test_788_B
new file mode 100644
index 0000000..d0782d9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_788_B
@@ -0,0 +1,10 @@
+608 1470
+780 828
+436 513
+373 703
+950 1343
+608 949
+996 1248
+400 407
+911 1501
+660 1273
diff --git a/geom_bottleneck/tests/data/test_789_A b/geom_bottleneck/tests/data/test_789_A
new file mode 100644
index 0000000..4805534
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_789_A
@@ -0,0 +1,10 @@
+354 1062
+357 491
+915 1394
+385 1352
+461 585
+612 1103
+229 327
+741 1148
+572 1245
+399 863
diff --git a/geom_bottleneck/tests/data/test_789_B b/geom_bottleneck/tests/data/test_789_B
new file mode 100644
index 0000000..808dab9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_789_B
@@ -0,0 +1,10 @@
+806 1352
+254 492
+202 1049
+571 1363
+359 1262
+828 1364
+123 603
+50 581
+502 1455
+218 1133
diff --git a/geom_bottleneck/tests/data/test_790_A b/geom_bottleneck/tests/data/test_790_A
new file mode 100644
index 0000000..231f25c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_790_A
@@ -0,0 +1,10 @@
+411 1365
+920 965
+799 1463
+516 980
+775 1260
+48 353
+828 978
+166 1166
+391 992
+580 970
diff --git a/geom_bottleneck/tests/data/test_790_B b/geom_bottleneck/tests/data/test_790_B
new file mode 100644
index 0000000..0892cfe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_790_B
@@ -0,0 +1,10 @@
+145 299
+605 1499
+534 1303
+440 1163
+628 1355
+2 71
+902 1181
+376 490
+696 1515
+24 40
diff --git a/geom_bottleneck/tests/data/test_791_A b/geom_bottleneck/tests/data/test_791_A
new file mode 100644
index 0000000..e12631e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_791_A
@@ -0,0 +1,10 @@
+806 943
+568 1238
+44 633
+424 491
+361 1057
+583 1403
+754 1333
+843 1653
+512 1431
+768 1390
diff --git a/geom_bottleneck/tests/data/test_791_B b/geom_bottleneck/tests/data/test_791_B
new file mode 100644
index 0000000..62aa958
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_791_B
@@ -0,0 +1,10 @@
+850 1256
+138 1008
+948 1188
+914 1911
+659 1270
+375 986
+994 1160
+835 863
+73 849
+756 1456
diff --git a/geom_bottleneck/tests/data/test_792_A b/geom_bottleneck/tests/data/test_792_A
new file mode 100644
index 0000000..3b73b46
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_792_A
@@ -0,0 +1,10 @@
+610 1074
+927 1375
+497 992
+277 1026
+978 1640
+244 290
+299 814
+80 476
+599 1512
+793 824
diff --git a/geom_bottleneck/tests/data/test_792_B b/geom_bottleneck/tests/data/test_792_B
new file mode 100644
index 0000000..517ff30
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_792_B
@@ -0,0 +1,10 @@
+531 1350
+371 1273
+498 546
+487 1299
+347 1067
+638 1257
+205 802
+240 658
+1 249
+147 878
diff --git a/geom_bottleneck/tests/data/test_793_A b/geom_bottleneck/tests/data/test_793_A
new file mode 100644
index 0000000..d9b85ae
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_793_A
@@ -0,0 +1,10 @@
+267 566
+193 1014
+348 534
+640 670
+795 1157
+752 1273
+439 1172
+254 687
+959 1954
+408 1084
diff --git a/geom_bottleneck/tests/data/test_793_B b/geom_bottleneck/tests/data/test_793_B
new file mode 100644
index 0000000..66180dd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_793_B
@@ -0,0 +1,10 @@
+751 1576
+410 1090
+288 1200
+430 1222
+988 1576
+152 1095
+583 596
+799 1296
+828 1022
+217 956
diff --git a/geom_bottleneck/tests/data/test_794_A b/geom_bottleneck/tests/data/test_794_A
new file mode 100644
index 0000000..3d5401c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_794_A
@@ -0,0 +1,10 @@
+1 160
+264 1182
+662 1435
+659 892
+47 845
+383 744
+773 1409
+895 906
+152 735
+344 870
diff --git a/geom_bottleneck/tests/data/test_794_B b/geom_bottleneck/tests/data/test_794_B
new file mode 100644
index 0000000..26be9a3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_794_B
@@ -0,0 +1,10 @@
+607 934
+865 900
+339 349
+888 1238
+981 1281
+1 554
+514 627
+77 1040
+911 1850
+276 1178
diff --git a/geom_bottleneck/tests/data/test_795_A b/geom_bottleneck/tests/data/test_795_A
new file mode 100644
index 0000000..7c73f4d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_795_A
@@ -0,0 +1,10 @@
+494 905
+440 1385
+496 955
+162 1027
+237 421
+873 1102
+349 1346
+470 880
+364 822
+869 1335
diff --git a/geom_bottleneck/tests/data/test_795_B b/geom_bottleneck/tests/data/test_795_B
new file mode 100644
index 0000000..afc371b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_795_B
@@ -0,0 +1,10 @@
+22 509
+741 1484
+558 982
+862 1077
+856 1695
+4 100
+995 1304
+103 990
+64 439
+883 1258
diff --git a/geom_bottleneck/tests/data/test_796_A b/geom_bottleneck/tests/data/test_796_A
new file mode 100644
index 0000000..a326a52
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_796_A
@@ -0,0 +1,10 @@
+16 636
+823 1691
+880 1198
+967 1441
+501 745
+318 427
+177 192
+944 1596
+229 458
+570 1267
diff --git a/geom_bottleneck/tests/data/test_796_B b/geom_bottleneck/tests/data/test_796_B
new file mode 100644
index 0000000..86d2cf9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_796_B
@@ -0,0 +1,10 @@
+240 255
+28 64
+713 1016
+577 662
+838 1674
+41 365
+889 1477
+1000 1767
+58 393
+870 1574
diff --git a/geom_bottleneck/tests/data/test_797_A b/geom_bottleneck/tests/data/test_797_A
new file mode 100644
index 0000000..b5149bf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_797_A
@@ -0,0 +1,10 @@
+258 711
+970 1782
+725 883
+626 1199
+785 1502
+713 820
+754 1570
+311 1068
+866 1364
+50 713
diff --git a/geom_bottleneck/tests/data/test_797_B b/geom_bottleneck/tests/data/test_797_B
new file mode 100644
index 0000000..45ba81b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_797_B
@@ -0,0 +1,10 @@
+381 1350
+844 1724
+531 1460
+472 1208
+659 914
+745 757
+627 1608
+69 357
+298 621
+100 760
diff --git a/geom_bottleneck/tests/data/test_798_A b/geom_bottleneck/tests/data/test_798_A
new file mode 100644
index 0000000..a053ddd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_798_A
@@ -0,0 +1,10 @@
+153 558
+364 847
+444 1083
+994 1375
+728 1585
+495 1005
+47 431
+361 1262
+645 646
+816 1742
diff --git a/geom_bottleneck/tests/data/test_798_B b/geom_bottleneck/tests/data/test_798_B
new file mode 100644
index 0000000..69c921b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_798_B
@@ -0,0 +1,10 @@
+416 985
+449 995
+832 1102
+550 775
+367 614
+393 458
+340 890
+264 955
+10 50
+834 1137
diff --git a/geom_bottleneck/tests/data/test_799_A b/geom_bottleneck/tests/data/test_799_A
new file mode 100644
index 0000000..374e56a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_799_A
@@ -0,0 +1,10 @@
+40 603
+309 973
+679 1580
+219 675
+92 934
+537 1366
+63 461
+408 807
+983 1016
+176 789
diff --git a/geom_bottleneck/tests/data/test_799_B b/geom_bottleneck/tests/data/test_799_B
new file mode 100644
index 0000000..f92c370
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_799_B
@@ -0,0 +1,10 @@
+312 772
+963 1630
+613 920
+597 1153
+941 1187
+150 434
+269 804
+885 887
+649 881
+618 973
diff --git a/geom_bottleneck/tests/data/test_800_A b/geom_bottleneck/tests/data/test_800_A
new file mode 100644
index 0000000..36aab61
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_800_A
@@ -0,0 +1,20 @@
+729 1257
+887 1370
+876 1762
+569 878
+13 393
+287 1169
+720 899
+338 892
+594 1438
+248 1204
+315 985
+796 1645
+730 1605
+323 490
+470 1454
+285 1067
+215 757
+92 325
+866 869
+899 1630
diff --git a/geom_bottleneck/tests/data/test_800_B b/geom_bottleneck/tests/data/test_800_B
new file mode 100644
index 0000000..2496bcb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_800_B
@@ -0,0 +1,20 @@
+961 1808
+251 958
+152 851
+834 1250
+727 1719
+968 1220
+107 206
+564 1423
+475 1438
+884 1174
+928 1303
+39 708
+854 1539
+825 1094
+614 989
+281 856
+445 1141
+784 1664
+657 969
+154 1026
diff --git a/geom_bottleneck/tests/data/test_801_A b/geom_bottleneck/tests/data/test_801_A
new file mode 100644
index 0000000..66ed176
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_801_A
@@ -0,0 +1,20 @@
+823 1484
+877 1798
+158 361
+59 670
+365 636
+536 831
+669 1574
+51 690
+243 1047
+579 1472
+450 618
+478 706
+850 1720
+10 822
+502 1081
+815 833
+192 629
+745 909
+936 1924
+619 1215
diff --git a/geom_bottleneck/tests/data/test_801_B b/geom_bottleneck/tests/data/test_801_B
new file mode 100644
index 0000000..4376fcf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_801_B
@@ -0,0 +1,20 @@
+911 924
+564 1044
+939 1177
+226 536
+692 1241
+931 1421
+750 767
+427 630
+594 1388
+751 1751
+933 1190
+379 1220
+63 623
+79 190
+650 993
+508 1351
+961 1710
+619 863
+548 1358
+727 1515
diff --git a/geom_bottleneck/tests/data/test_802_A b/geom_bottleneck/tests/data/test_802_A
new file mode 100644
index 0000000..6bfdeda
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_802_A
@@ -0,0 +1,20 @@
+63 288
+994 1416
+92 461
+241 742
+325 877
+466 925
+923 1215
+941 1044
+618 1396
+248 1066
+383 442
+583 1016
+947 1095
+186 602
+291 448
+339 384
+467 1107
+771 942
+92 794
+2 533
diff --git a/geom_bottleneck/tests/data/test_802_B b/geom_bottleneck/tests/data/test_802_B
new file mode 100644
index 0000000..eaec985
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_802_B
@@ -0,0 +1,20 @@
+350 416
+143 1004
+710 1425
+665 1101
+828 1491
+80 449
+977 1801
+497 509
+664 700
+405 670
+688 1502
+102 938
+893 1437
+245 728
+626 1333
+526 1473
+914 1253
+96 268
+693 1302
+982 1487
diff --git a/geom_bottleneck/tests/data/test_803_A b/geom_bottleneck/tests/data/test_803_A
new file mode 100644
index 0000000..501248d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_803_A
@@ -0,0 +1,20 @@
+553 1373
+92 606
+892 1104
+804 1697
+653 953
+421 824
+670 1420
+621 1196
+912 1889
+482 1161
+381 691
+192 1146
+592 670
+920 1293
+754 1475
+217 379
+584 1551
+168 463
+212 251
+303 469
diff --git a/geom_bottleneck/tests/data/test_803_B b/geom_bottleneck/tests/data/test_803_B
new file mode 100644
index 0000000..42dadd9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_803_B
@@ -0,0 +1,20 @@
+252 701
+398 718
+663 871
+257 475
+998 1850
+292 587
+813 1363
+374 757
+295 749
+405 607
+21 374
+489 1313
+975 1840
+773 1423
+204 693
+149 532
+57 191
+307 618
+509 1109
+308 350
diff --git a/geom_bottleneck/tests/data/test_804_A b/geom_bottleneck/tests/data/test_804_A
new file mode 100644
index 0000000..6af9294
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_804_A
@@ -0,0 +1,20 @@
+518 993
+44 915
+674 768
+122 870
+394 839
+631 1285
+805 1491
+521 802
+456 474
+450 1083
+555 1280
+858 1839
+131 144
+361 953
+600 985
+158 537
+771 1062
+286 1285
+168 397
+748 1722
diff --git a/geom_bottleneck/tests/data/test_804_B b/geom_bottleneck/tests/data/test_804_B
new file mode 100644
index 0000000..8470b65
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_804_B
@@ -0,0 +1,20 @@
+132 843
+202 982
+374 1118
+9 980
+843 852
+537 761
+645 656
+882 1627
+51 619
+217 926
+870 1398
+87 1080
+223 1189
+160 379
+406 561
+536 1522
+353 487
+312 1180
+526 1492
+249 823
diff --git a/geom_bottleneck/tests/data/test_805_A b/geom_bottleneck/tests/data/test_805_A
new file mode 100644
index 0000000..45a3198
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_805_A
@@ -0,0 +1,20 @@
+350 546
+268 1153
+401 757
+503 848
+981 1709
+161 948
+688 1661
+234 471
+397 801
+433 1024
+942 1394
+308 969
+32 690
+797 1248
+182 407
+714 1267
+577 1209
+775 919
+140 976
+366 1300
diff --git a/geom_bottleneck/tests/data/test_805_B b/geom_bottleneck/tests/data/test_805_B
new file mode 100644
index 0000000..4967cfd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_805_B
@@ -0,0 +1,20 @@
+330 1222
+792 1359
+905 1402
+933 1482
+322 933
+440 887
+672 1438
+849 1650
+264 794
+21 219
+437 593
+159 598
+466 675
+712 1347
+566 1363
+244 382
+374 520
+729 1295
+998 1116
+954 1362
diff --git a/geom_bottleneck/tests/data/test_806_A b/geom_bottleneck/tests/data/test_806_A
new file mode 100644
index 0000000..8eb1e33
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_806_A
@@ -0,0 +1,20 @@
+909 1049
+241 667
+928 1287
+838 1606
+159 1145
+395 714
+445 804
+897 1289
+770 1108
+649 714
+643 684
+436 561
+125 637
+704 856
+738 913
+478 1206
+396 1306
+106 213
+840 929
+320 1037
diff --git a/geom_bottleneck/tests/data/test_806_B b/geom_bottleneck/tests/data/test_806_B
new file mode 100644
index 0000000..27727b2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_806_B
@@ -0,0 +1,20 @@
+342 756
+736 1334
+769 1194
+352 967
+165 282
+209 306
+977 1040
+385 604
+141 566
+458 884
+186 477
+869 1651
+143 850
+742 1329
+212 872
+445 1214
+864 870
+836 1772
+534 1338
+338 1244
diff --git a/geom_bottleneck/tests/data/test_807_A b/geom_bottleneck/tests/data/test_807_A
new file mode 100644
index 0000000..4979b7d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_807_A
@@ -0,0 +1,20 @@
+657 1104
+391 1193
+374 1227
+9 94
+458 555
+982 1529
+840 920
+831 1039
+468 1180
+912 1687
+988 1717
+33 324
+577 639
+426 1103
+733 1096
+41 421
+376 784
+823 1180
+389 1204
+788 1243
diff --git a/geom_bottleneck/tests/data/test_807_B b/geom_bottleneck/tests/data/test_807_B
new file mode 100644
index 0000000..67610cb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_807_B
@@ -0,0 +1,20 @@
+295 1223
+755 1585
+860 1191
+281 873
+86 1000
+508 1264
+16 594
+616 747
+522 1196
+34 270
+422 1196
+22 801
+812 947
+91 517
+233 586
+167 475
+173 233
+130 807
+764 1691
+942 1622
diff --git a/geom_bottleneck/tests/data/test_808_A b/geom_bottleneck/tests/data/test_808_A
new file mode 100644
index 0000000..b35d354
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_808_A
@@ -0,0 +1,20 @@
+395 768
+234 477
+627 1516
+353 1158
+108 195
+399 496
+787 1246
+330 553
+840 1835
+474 947
+736 1100
+248 381
+559 575
+716 1583
+873 1336
+927 1293
+857 1611
+691 1202
+293 770
+27 585
diff --git a/geom_bottleneck/tests/data/test_808_B b/geom_bottleneck/tests/data/test_808_B
new file mode 100644
index 0000000..fb783cb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_808_B
@@ -0,0 +1,20 @@
+801 1397
+119 551
+305 964
+706 1119
+586 1050
+925 1532
+595 1000
+898 1753
+491 699
+450 802
+499 1011
+180 468
+616 768
+179 901
+89 144
+828 1466
+927 1852
+151 584
+213 997
+952 1055
diff --git a/geom_bottleneck/tests/data/test_809_A b/geom_bottleneck/tests/data/test_809_A
new file mode 100644
index 0000000..e578429
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_809_A
@@ -0,0 +1,20 @@
+512 1083
+60 706
+61 93
+413 1076
+277 298
+766 1458
+984 1052
+762 1727
+356 422
+263 655
+605 968
+422 1373
+174 1033
+983 1676
+666 1005
+179 336
+553 1267
+987 1269
+756 1753
+842 1754
diff --git a/geom_bottleneck/tests/data/test_809_B b/geom_bottleneck/tests/data/test_809_B
new file mode 100644
index 0000000..e4deda8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_809_B
@@ -0,0 +1,20 @@
+178 1010
+727 738
+812 1638
+893 1821
+41 650
+797 1295
+174 473
+389 1244
+289 601
+626 1188
+890 1646
+296 318
+861 1582
+860 1410
+670 1574
+310 813
+186 263
+886 1796
+263 760
+396 1314
diff --git a/geom_bottleneck/tests/data/test_810_A b/geom_bottleneck/tests/data/test_810_A
new file mode 100644
index 0000000..b7da658
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_810_A
@@ -0,0 +1,20 @@
+843 1230
+289 770
+614 776
+512 987
+326 1253
+651 932
+827 839
+945 1361
+492 706
+312 1139
+463 1394
+68 1045
+229 1200
+126 898
+494 1095
+893 1824
+548 889
+45 952
+136 725
+304 1154
diff --git a/geom_bottleneck/tests/data/test_810_B b/geom_bottleneck/tests/data/test_810_B
new file mode 100644
index 0000000..06e2af4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_810_B
@@ -0,0 +1,20 @@
+207 249
+374 690
+287 677
+566 817
+875 1590
+570 1096
+34 543
+344 801
+31 796
+681 1566
+402 835
+404 906
+754 1339
+96 514
+549 1065
+874 1762
+935 1530
+368 1331
+465 831
+890 1413
diff --git a/geom_bottleneck/tests/data/test_811_A b/geom_bottleneck/tests/data/test_811_A
new file mode 100644
index 0000000..708fc33
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_811_A
@@ -0,0 +1,20 @@
+605 650
+57 484
+621 641
+794 1393
+951 1609
+132 656
+639 1132
+419 967
+741 1547
+105 466
+306 1270
+827 1475
+260 376
+418 1180
+458 1136
+957 1237
+363 749
+742 1038
+958 1157
+153 252
diff --git a/geom_bottleneck/tests/data/test_811_B b/geom_bottleneck/tests/data/test_811_B
new file mode 100644
index 0000000..69bffab
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_811_B
@@ -0,0 +1,20 @@
+687 1060
+622 650
+544 1212
+38 633
+280 956
+695 791
+120 956
+364 435
+825 1760
+137 303
+701 1432
+967 1395
+566 966
+695 951
+85 262
+82 595
+11 100
+312 1104
+669 1424
+157 285
diff --git a/geom_bottleneck/tests/data/test_812_A b/geom_bottleneck/tests/data/test_812_A
new file mode 100644
index 0000000..f592f5f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_812_A
@@ -0,0 +1,20 @@
+333 661
+942 1519
+825 1088
+68 726
+443 1398
+918 1335
+853 1787
+163 269
+158 214
+444 1036
+163 670
+124 834
+745 890
+728 1254
+981 1370
+858 1117
+159 700
+978 1371
+554 1366
+112 689
diff --git a/geom_bottleneck/tests/data/test_812_B b/geom_bottleneck/tests/data/test_812_B
new file mode 100644
index 0000000..7e37dec
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_812_B
@@ -0,0 +1,20 @@
+228 896
+635 880
+250 930
+8 479
+168 214
+366 775
+41 981
+461 692
+337 839
+870 1634
+497 511
+253 389
+807 913
+487 1348
+245 1186
+222 1169
+254 810
+855 1471
+399 1155
+433 1194
diff --git a/geom_bottleneck/tests/data/test_813_A b/geom_bottleneck/tests/data/test_813_A
new file mode 100644
index 0000000..94bbbc3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_813_A
@@ -0,0 +1,20 @@
+45 843
+606 637
+981 1438
+769 1525
+694 1370
+596 1454
+365 813
+164 704
+198 347
+115 553
+767 1119
+663 1052
+379 697
+294 335
+457 1253
+320 1147
+508 830
+506 738
+381 1010
+896 1376
diff --git a/geom_bottleneck/tests/data/test_813_B b/geom_bottleneck/tests/data/test_813_B
new file mode 100644
index 0000000..54ce63b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_813_B
@@ -0,0 +1,20 @@
+519 1068
+65 460
+199 429
+695 1050
+407 524
+24 581
+54 728
+843 1551
+773 829
+355 644
+145 962
+837 1238
+796 830
+383 791
+86 1028
+461 1145
+270 1231
+374 837
+730 875
+659 1188
diff --git a/geom_bottleneck/tests/data/test_814_A b/geom_bottleneck/tests/data/test_814_A
new file mode 100644
index 0000000..3eb0a25
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_814_A
@@ -0,0 +1,20 @@
+571 1312
+384 842
+418 932
+388 1146
+857 1045
+952 1326
+551 631
+820 1105
+791 884
+50 788
+697 1165
+840 1425
+130 169
+106 615
+429 1085
+428 567
+138 762
+364 1304
+116 1013
+50 983
diff --git a/geom_bottleneck/tests/data/test_814_B b/geom_bottleneck/tests/data/test_814_B
new file mode 100644
index 0000000..a65d82f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_814_B
@@ -0,0 +1,20 @@
+617 718
+320 697
+164 654
+423 821
+444 1368
+211 382
+184 857
+799 1071
+866 924
+48 829
+90 249
+378 1336
+817 832
+6 246
+115 280
+363 447
+422 964
+902 1809
+637 1073
+585 606
diff --git a/geom_bottleneck/tests/data/test_815_A b/geom_bottleneck/tests/data/test_815_A
new file mode 100644
index 0000000..ae366c6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_815_A
@@ -0,0 +1,20 @@
+911 1198
+516 1091
+421 1381
+257 824
+272 394
+75 841
+659 805
+980 1436
+237 431
+668 1221
+441 1057
+560 849
+305 1270
+572 929
+460 812
+471 640
+50 773
+1 446
+895 1610
+837 1400
diff --git a/geom_bottleneck/tests/data/test_815_B b/geom_bottleneck/tests/data/test_815_B
new file mode 100644
index 0000000..6d11d46
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_815_B
@@ -0,0 +1,20 @@
+589 1196
+872 1375
+473 627
+522 671
+940 1274
+666 1453
+1 861
+656 1221
+669 866
+916 1378
+340 773
+454 1020
+190 561
+828 1606
+356 693
+876 1220
+644 763
+991 1241
+559 1095
+124 406
diff --git a/geom_bottleneck/tests/data/test_816_A b/geom_bottleneck/tests/data/test_816_A
new file mode 100644
index 0000000..54dc128
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_816_A
@@ -0,0 +1,20 @@
+376 1109
+877 1496
+817 1426
+647 703
+92 672
+909 1671
+580 965
+626 1528
+347 1159
+551 1396
+432 941
+7 766
+1 370
+664 1384
+106 448
+763 1190
+768 892
+19 465
+220 1188
+96 554
diff --git a/geom_bottleneck/tests/data/test_816_B b/geom_bottleneck/tests/data/test_816_B
new file mode 100644
index 0000000..56f00ce
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_816_B
@@ -0,0 +1,20 @@
+930 1560
+702 1257
+174 988
+712 777
+150 355
+146 617
+265 954
+519 820
+575 1117
+603 1133
+910 1817
+363 415
+102 347
+925 1565
+621 1336
+203 752
+743 1550
+39 310
+904 1206
+696 1445
diff --git a/geom_bottleneck/tests/data/test_817_A b/geom_bottleneck/tests/data/test_817_A
new file mode 100644
index 0000000..8c01be3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_817_A
@@ -0,0 +1,20 @@
+14 829
+708 1194
+415 1028
+395 1236
+294 792
+319 730
+490 889
+424 1364
+512 864
+820 1563
+461 880
+345 686
+318 407
+993 1857
+833 882
+937 1452
+376 719
+171 852
+457 523
+156 784
diff --git a/geom_bottleneck/tests/data/test_817_B b/geom_bottleneck/tests/data/test_817_B
new file mode 100644
index 0000000..1aa1eaa
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_817_B
@@ -0,0 +1,20 @@
+544 1398
+776 1241
+56 1054
+942 1736
+752 1563
+475 1241
+423 923
+553 1023
+101 846
+841 1613
+895 1353
+832 1502
+300 915
+986 1488
+397 648
+823 1196
+457 1079
+371 471
+398 1114
+50 853
diff --git a/geom_bottleneck/tests/data/test_818_A b/geom_bottleneck/tests/data/test_818_A
new file mode 100644
index 0000000..44ac7de
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_818_A
@@ -0,0 +1,20 @@
+296 395
+102 172
+9 500
+426 574
+931 1885
+76 901
+202 1197
+462 1135
+87 907
+109 780
+186 238
+297 833
+142 360
+719 1106
+25 775
+626 1219
+911 1619
+9 322
+158 222
+843 1086
diff --git a/geom_bottleneck/tests/data/test_818_B b/geom_bottleneck/tests/data/test_818_B
new file mode 100644
index 0000000..83c706c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_818_B
@@ -0,0 +1,20 @@
+989 1945
+718 1675
+126 965
+27 359
+756 962
+158 737
+149 473
+748 896
+779 1215
+685 933
+742 1449
+717 1575
+834 1467
+80 377
+634 1348
+419 766
+345 733
+111 753
+138 1014
+452 1429
diff --git a/geom_bottleneck/tests/data/test_819_A b/geom_bottleneck/tests/data/test_819_A
new file mode 100644
index 0000000..1065f24
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_819_A
@@ -0,0 +1,20 @@
+119 806
+187 942
+454 844
+581 583
+753 1715
+199 380
+623 697
+63 469
+929 1518
+960 1306
+996 1011
+157 203
+666 1505
+14 693
+414 536
+461 1330
+975 1260
+375 1004
+375 1145
+453 723
diff --git a/geom_bottleneck/tests/data/test_819_B b/geom_bottleneck/tests/data/test_819_B
new file mode 100644
index 0000000..f1c8ba3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_819_B
@@ -0,0 +1,20 @@
+184 385
+214 473
+11 1007
+301 516
+689 820
+267 1052
+26 720
+414 726
+946 1295
+720 1275
+430 1272
+119 349
+850 1371
+738 1125
+450 1222
+728 1503
+951 1796
+843 947
+856 983
+705 996
diff --git a/geom_bottleneck/tests/data/test_820_A b/geom_bottleneck/tests/data/test_820_A
new file mode 100644
index 0000000..1f23572
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_820_A
@@ -0,0 +1,30 @@
+232 279
+761 1519
+175 773
+522 1293
+336 381
+478 998
+61 328
+450 1350
+669 1085
+602 870
+286 987
+593 897
+358 742
+900 1878
+441 668
+109 977
+847 1651
+41 863
+94 851
+240 491
+335 1150
+135 748
+480 1052
+420 572
+837 1662
+629 1223
+895 1453
+304 1051
+424 553
+308 714
diff --git a/geom_bottleneck/tests/data/test_820_B b/geom_bottleneck/tests/data/test_820_B
new file mode 100644
index 0000000..3465e1b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_820_B
@@ -0,0 +1,30 @@
+309 934
+8 585
+213 1043
+116 589
+436 679
+70 715
+604 1194
+562 1151
+727 1616
+404 632
+948 1712
+934 1186
+690 1385
+636 682
+140 888
+738 884
+704 1593
+868 979
+954 1310
+605 1513
+955 1763
+730 1719
+393 1159
+325 1279
+35 153
+436 838
+249 1157
+394 921
+634 1242
+914 1138
diff --git a/geom_bottleneck/tests/data/test_821_A b/geom_bottleneck/tests/data/test_821_A
new file mode 100644
index 0000000..ab4fa20
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_821_A
@@ -0,0 +1,30 @@
+610 907
+704 897
+228 1047
+459 1435
+105 904
+492 1288
+557 863
+368 622
+715 1240
+627 1465
+823 1003
+823 891
+724 853
+227 933
+88 600
+735 1479
+591 757
+260 347
+314 1130
+342 985
+80 990
+93 137
+153 761
+91 408
+497 1011
+980 1277
+916 1437
+81 1038
+735 1143
+374 773
diff --git a/geom_bottleneck/tests/data/test_821_B b/geom_bottleneck/tests/data/test_821_B
new file mode 100644
index 0000000..36073ce
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_821_B
@@ -0,0 +1,30 @@
+575 1235
+999 1599
+78 560
+384 694
+217 646
+709 1344
+772 1755
+542 994
+376 1248
+924 1462
+675 892
+927 1354
+306 1292
+573 1316
+731 1424
+445 911
+145 588
+402 822
+584 920
+374 831
+636 1237
+580 614
+490 1107
+529 1074
+652 1460
+892 1245
+917 1530
+679 1511
+725 820
+620 1439
diff --git a/geom_bottleneck/tests/data/test_822_A b/geom_bottleneck/tests/data/test_822_A
new file mode 100644
index 0000000..38b5219
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_822_A
@@ -0,0 +1,30 @@
+416 1100
+661 1339
+612 962
+593 1233
+642 1509
+574 969
+202 450
+370 787
+14 937
+974 1336
+420 775
+808 1662
+304 319
+492 555
+740 1524
+935 1749
+88 758
+995 1590
+40 963
+141 1031
+695 886
+504 1111
+684 1360
+861 1552
+482 746
+89 547
+493 598
+190 310
+806 1384
+472 1459
diff --git a/geom_bottleneck/tests/data/test_822_B b/geom_bottleneck/tests/data/test_822_B
new file mode 100644
index 0000000..c61c33e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_822_B
@@ -0,0 +1,30 @@
+843 1057
+860 1286
+703 1268
+545 1381
+515 1186
+178 952
+456 907
+713 964
+555 981
+332 1263
+11 112
+291 347
+958 1460
+723 1182
+850 865
+631 677
+227 640
+676 1506
+256 610
+581 1468
+15 619
+233 1100
+35 957
+444 817
+517 1318
+129 318
+765 1584
+733 1001
+932 998
+693 1076
diff --git a/geom_bottleneck/tests/data/test_823_A b/geom_bottleneck/tests/data/test_823_A
new file mode 100644
index 0000000..5d441a2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_823_A
@@ -0,0 +1,30 @@
+817 1477
+662 1416
+722 1408
+43 588
+583 585
+159 836
+752 922
+529 727
+55 60
+447 1200
+248 735
+520 1121
+541 1379
+704 1640
+681 1454
+234 385
+884 1063
+884 1535
+612 704
+55 102
+214 913
+597 1576
+19 919
+907 951
+785 1577
+185 281
+567 680
+577 1162
+323 495
+321 920
diff --git a/geom_bottleneck/tests/data/test_823_B b/geom_bottleneck/tests/data/test_823_B
new file mode 100644
index 0000000..e1ae113
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_823_B
@@ -0,0 +1,30 @@
+562 1532
+19 557
+758 1238
+732 1011
+116 761
+988 1621
+783 786
+128 964
+208 249
+111 948
+510 719
+711 1630
+99 769
+159 816
+295 807
+485 1332
+848 1845
+721 1534
+344 1341
+678 1465
+665 889
+734 1611
+246 783
+238 618
+401 809
+234 571
+527 1227
+690 1550
+278 729
+454 591
diff --git a/geom_bottleneck/tests/data/test_824_A b/geom_bottleneck/tests/data/test_824_A
new file mode 100644
index 0000000..3bfc169
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_824_A
@@ -0,0 +1,30 @@
+333 858
+230 978
+281 1158
+880 1314
+816 1259
+840 1631
+385 979
+413 537
+378 697
+222 486
+213 285
+664 1109
+7 300
+482 903
+325 338
+616 875
+46 548
+145 965
+126 760
+873 1030
+533 1087
+417 487
+510 919
+760 1722
+144 897
+136 412
+88 137
+704 1084
+457 744
+424 1148
diff --git a/geom_bottleneck/tests/data/test_824_B b/geom_bottleneck/tests/data/test_824_B
new file mode 100644
index 0000000..192df92
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_824_B
@@ -0,0 +1,30 @@
+285 785
+57 516
+410 1131
+794 1019
+732 1499
+391 1297
+104 689
+294 976
+748 1061
+806 1309
+118 995
+7 994
+952 1007
+994 1296
+340 1335
+387 762
+800 946
+757 1299
+167 976
+538 802
+147 808
+51 694
+20 353
+290 376
+575 1395
+294 1074
+754 1042
+461 474
+634 1525
+491 1208
diff --git a/geom_bottleneck/tests/data/test_825_A b/geom_bottleneck/tests/data/test_825_A
new file mode 100644
index 0000000..5dc0d10
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_825_A
@@ -0,0 +1,30 @@
+727 1401
+217 1102
+836 1270
+380 446
+569 1295
+55 504
+239 312
+872 1710
+552 1075
+584 1470
+402 438
+441 1296
+194 1105
+643 1563
+933 1180
+448 735
+749 1583
+725 1624
+533 1043
+952 1467
+548 926
+839 926
+5 724
+768 1115
+557 578
+712 1472
+279 1121
+399 808
+601 951
+293 422
diff --git a/geom_bottleneck/tests/data/test_825_B b/geom_bottleneck/tests/data/test_825_B
new file mode 100644
index 0000000..e440801
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_825_B
@@ -0,0 +1,30 @@
+466 883
+492 1180
+645 1446
+138 604
+469 1261
+110 409
+923 1649
+101 397
+410 440
+655 1223
+280 822
+564 701
+736 1735
+645 1272
+495 982
+339 389
+188 738
+669 1263
+106 658
+981 1256
+815 1378
+914 1482
+193 855
+361 1134
+885 1858
+98 576
+577 897
+528 549
+152 154
+363 886
diff --git a/geom_bottleneck/tests/data/test_826_A b/geom_bottleneck/tests/data/test_826_A
new file mode 100644
index 0000000..8fbcf93
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_826_A
@@ -0,0 +1,30 @@
+669 1220
+577 787
+982 1553
+218 1116
+715 831
+383 780
+328 925
+216 612
+635 1185
+211 707
+915 1130
+223 693
+468 1277
+570 1219
+281 1037
+759 1522
+435 1201
+356 582
+996 1867
+369 833
+584 1415
+472 1174
+6 905
+329 358
+703 1331
+141 180
+136 204
+873 1858
+107 943
+158 1153
diff --git a/geom_bottleneck/tests/data/test_826_B b/geom_bottleneck/tests/data/test_826_B
new file mode 100644
index 0000000..10fe424
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_826_B
@@ -0,0 +1,30 @@
+651 1534
+143 212
+685 962
+100 862
+34 102
+333 1131
+274 651
+142 1075
+312 751
+848 1583
+396 548
+377 1071
+824 1067
+932 1352
+510 1339
+435 561
+259 1223
+434 1080
+974 1509
+618 1604
+795 1363
+668 1299
+532 1157
+326 632
+182 768
+611 1431
+62 528
+832 1370
+413 1373
+153 813
diff --git a/geom_bottleneck/tests/data/test_827_A b/geom_bottleneck/tests/data/test_827_A
new file mode 100644
index 0000000..c1c63c9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_827_A
@@ -0,0 +1,30 @@
+211 875
+625 678
+698 1671
+942 1243
+129 250
+370 497
+725 1322
+195 1094
+382 1059
+973 1185
+877 1196
+863 1764
+645 1372
+4 484
+29 156
+802 1201
+195 1074
+261 1181
+139 1099
+768 1204
+882 1317
+107 693
+928 1275
+459 1071
+270 633
+384 906
+493 576
+909 1222
+212 437
+74 656
diff --git a/geom_bottleneck/tests/data/test_827_B b/geom_bottleneck/tests/data/test_827_B
new file mode 100644
index 0000000..57ea673
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_827_B
@@ -0,0 +1,30 @@
+804 1730
+244 333
+131 547
+866 1012
+364 546
+530 950
+702 824
+290 418
+636 795
+202 618
+858 1059
+140 687
+76 447
+60 499
+502 1080
+858 1704
+555 585
+503 1152
+151 787
+565 1211
+172 556
+322 422
+176 952
+333 572
+40 982
+656 1365
+553 1493
+600 680
+72 555
+711 769
diff --git a/geom_bottleneck/tests/data/test_828_A b/geom_bottleneck/tests/data/test_828_A
new file mode 100644
index 0000000..ee02128
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_828_A
@@ -0,0 +1,30 @@
+227 983
+778 1655
+311 1256
+462 911
+100 932
+411 895
+738 1086
+375 1308
+899 1896
+742 1425
+909 1290
+68 375
+148 195
+981 1120
+848 1463
+234 616
+45 314
+180 447
+368 1310
+443 734
+721 1345
+617 1376
+340 767
+420 1094
+848 979
+984 1866
+996 1169
+28 895
+203 1153
+535 1241
diff --git a/geom_bottleneck/tests/data/test_828_B b/geom_bottleneck/tests/data/test_828_B
new file mode 100644
index 0000000..92fae09
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_828_B
@@ -0,0 +1,30 @@
+309 789
+405 1405
+610 1330
+213 683
+768 1598
+843 1024
+898 1445
+625 1363
+557 996
+455 1026
+146 1137
+411 617
+155 969
+93 444
+92 206
+470 927
+792 1691
+871 984
+551 1271
+801 1755
+134 505
+270 1081
+382 852
+549 686
+2 314
+146 428
+460 1373
+602 1492
+950 1060
+516 1438
diff --git a/geom_bottleneck/tests/data/test_829_A b/geom_bottleneck/tests/data/test_829_A
new file mode 100644
index 0000000..fceb407
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_829_A
@@ -0,0 +1,30 @@
+222 1184
+346 478
+748 1587
+29 615
+190 1077
+889 1417
+381 1314
+388 448
+654 1525
+876 1242
+306 625
+289 660
+251 355
+4 963
+310 1154
+216 1065
+7 10
+75 525
+249 1084
+972 1796
+938 1780
+218 1156
+959 1810
+530 785
+562 1005
+483 751
+892 1440
+352 493
+676 1329
+718 1688
diff --git a/geom_bottleneck/tests/data/test_829_B b/geom_bottleneck/tests/data/test_829_B
new file mode 100644
index 0000000..85f538c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_829_B
@@ -0,0 +1,30 @@
+910 1441
+681 1671
+845 1784
+354 1210
+4 180
+830 1486
+466 566
+808 1728
+1 589
+808 862
+404 543
+304 879
+618 1013
+905 1788
+912 1187
+228 604
+959 1487
+793 1275
+631 1205
+151 157
+984 1427
+244 578
+875 1741
+654 1288
+506 780
+827 1138
+213 928
+30 420
+670 1438
+448 737
diff --git a/geom_bottleneck/tests/data/test_830_A b/geom_bottleneck/tests/data/test_830_A
new file mode 100644
index 0000000..fd54955
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_830_A
@@ -0,0 +1,30 @@
+35 644
+830 1511
+414 677
+768 1461
+467 1032
+152 1060
+960 1807
+566 831
+550 1210
+521 1018
+250 651
+698 699
+979 1102
+555 1516
+463 1057
+739 896
+330 549
+412 775
+775 1433
+733 1438
+430 1342
+7 751
+338 943
+923 1173
+734 1460
+880 1453
+225 1004
+571 1375
+739 1085
+288 1202
diff --git a/geom_bottleneck/tests/data/test_830_B b/geom_bottleneck/tests/data/test_830_B
new file mode 100644
index 0000000..5b9d84b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_830_B
@@ -0,0 +1,30 @@
+814 1305
+205 1199
+972 1431
+37 488
+673 1079
+630 1288
+698 828
+970 1666
+516 625
+65 209
+752 1716
+12 992
+563 1552
+821 1168
+460 943
+616 682
+386 546
+249 638
+583 1024
+38 889
+491 1020
+179 964
+995 1256
+861 1632
+252 518
+255 344
+480 1200
+89 711
+598 1022
+632 677
diff --git a/geom_bottleneck/tests/data/test_831_A b/geom_bottleneck/tests/data/test_831_A
new file mode 100644
index 0000000..fe09be1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_831_A
@@ -0,0 +1,30 @@
+772 1298
+705 1567
+946 1693
+632 1045
+752 875
+919 1723
+657 884
+708 1156
+442 1086
+571 1454
+641 894
+371 1152
+762 952
+684 760
+275 369
+858 994
+485 730
+921 1267
+643 928
+353 1307
+384 406
+154 380
+299 998
+378 1208
+27 265
+948 1081
+551 1512
+50 308
+773 1297
+134 514
diff --git a/geom_bottleneck/tests/data/test_831_B b/geom_bottleneck/tests/data/test_831_B
new file mode 100644
index 0000000..1f4d148
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_831_B
@@ -0,0 +1,30 @@
+757 1588
+145 1094
+523 1331
+687 1430
+877 1046
+573 696
+359 1012
+711 734
+368 552
+588 1267
+231 702
+64 429
+901 1202
+93 467
+647 1449
+747 994
+364 692
+384 833
+143 390
+445 1283
+248 696
+397 451
+695 1014
+852 1363
+512 1491
+983 1278
+506 841
+533 1031
+26 813
+850 1601
diff --git a/geom_bottleneck/tests/data/test_832_A b/geom_bottleneck/tests/data/test_832_A
new file mode 100644
index 0000000..79d3383
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_832_A
@@ -0,0 +1,30 @@
+373 1269
+753 1101
+529 825
+462 539
+52 293
+878 1396
+67 683
+106 1096
+973 1589
+129 911
+556 1327
+743 1248
+687 1505
+804 1322
+338 703
+438 1149
+539 730
+802 1046
+462 803
+175 506
+382 796
+470 1219
+608 1146
+12 757
+713 1367
+719 1001
+451 585
+408 1308
+29 510
+67 866
diff --git a/geom_bottleneck/tests/data/test_832_B b/geom_bottleneck/tests/data/test_832_B
new file mode 100644
index 0000000..9106904
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_832_B
@@ -0,0 +1,30 @@
+239 1006
+358 806
+53 229
+529 931
+923 1837
+644 1410
+761 1240
+511 966
+639 1127
+874 1114
+604 995
+916 1100
+634 1043
+317 607
+43 613
+9 216
+349 1035
+48 193
+396 986
+809 1193
+307 832
+86 786
+934 1164
+534 1434
+960 1092
+13 799
+658 1056
+411 1382
+378 568
+808 1400
diff --git a/geom_bottleneck/tests/data/test_833_A b/geom_bottleneck/tests/data/test_833_A
new file mode 100644
index 0000000..1dbdd95
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_833_A
@@ -0,0 +1,30 @@
+505 885
+170 695
+258 297
+652 996
+987 1055
+937 1159
+846 1133
+984 1715
+243 1199
+596 827
+40 585
+589 1356
+305 943
+974 1253
+965 1615
+840 1238
+842 1407
+596 1296
+603 741
+839 966
+300 951
+852 1656
+783 1676
+45 631
+973 1199
+513 725
+133 391
+633 1132
+442 1271
+100 401
diff --git a/geom_bottleneck/tests/data/test_833_B b/geom_bottleneck/tests/data/test_833_B
new file mode 100644
index 0000000..a325070
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_833_B
@@ -0,0 +1,30 @@
+152 524
+210 255
+714 1034
+808 1480
+594 1020
+33 742
+285 562
+437 1341
+716 903
+767 1201
+146 938
+608 1275
+54 601
+752 1037
+896 1514
+113 321
+986 1932
+453 1382
+93 547
+687 1677
+134 1122
+5 268
+31 66
+832 1755
+313 966
+602 834
+433 679
+548 789
+414 1414
+734 1061
diff --git a/geom_bottleneck/tests/data/test_834_A b/geom_bottleneck/tests/data/test_834_A
new file mode 100644
index 0000000..7088d54
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_834_A
@@ -0,0 +1,30 @@
+709 1214
+541 1328
+291 925
+23 570
+334 447
+648 808
+532 1226
+315 509
+796 1147
+435 1417
+336 1183
+401 893
+184 721
+496 509
+274 841
+463 625
+906 1694
+512 1242
+617 1494
+874 1805
+162 621
+802 1074
+904 993
+124 653
+44 818
+577 1417
+520 1294
+574 709
+317 394
+643 1152
diff --git a/geom_bottleneck/tests/data/test_834_B b/geom_bottleneck/tests/data/test_834_B
new file mode 100644
index 0000000..5dd4204
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_834_B
@@ -0,0 +1,30 @@
+176 662
+579 764
+544 706
+68 939
+230 345
+901 1737
+714 1299
+482 1000
+290 802
+760 1461
+647 1412
+781 1498
+354 780
+697 818
+375 709
+794 1664
+989 1869
+320 729
+688 1029
+853 1290
+679 1504
+918 1749
+767 1734
+300 996
+625 900
+123 496
+89 408
+255 679
+329 1248
+659 1003
diff --git a/geom_bottleneck/tests/data/test_835_A b/geom_bottleneck/tests/data/test_835_A
new file mode 100644
index 0000000..47e934b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_835_A
@@ -0,0 +1,30 @@
+554 1108
+257 549
+102 222
+531 715
+977 1231
+292 534
+624 1603
+394 508
+936 1007
+139 427
+457 1069
+873 1535
+789 887
+912 1213
+503 1307
+734 889
+789 1372
+811 1701
+558 1477
+485 763
+711 876
+961 1691
+294 635
+963 1955
+737 1563
+15 980
+23 339
+770 1156
+399 1341
+886 1049
diff --git a/geom_bottleneck/tests/data/test_835_B b/geom_bottleneck/tests/data/test_835_B
new file mode 100644
index 0000000..9a3edbe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_835_B
@@ -0,0 +1,30 @@
+38 645
+994 1933
+145 1066
+900 1210
+691 1208
+672 959
+349 445
+567 1137
+547 1325
+943 1437
+591 712
+526 750
+2 227
+108 667
+137 722
+327 1192
+396 1374
+390 1069
+396 783
+927 1242
+870 1797
+532 1049
+543 1081
+470 917
+738 1731
+814 1558
+794 1555
+439 499
+593 1490
+349 410
diff --git a/geom_bottleneck/tests/data/test_836_A b/geom_bottleneck/tests/data/test_836_A
new file mode 100644
index 0000000..1a9885f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_836_A
@@ -0,0 +1,30 @@
+790 1396
+959 1240
+518 1462
+797 1737
+356 649
+304 716
+773 1583
+888 1299
+355 801
+318 1109
+271 1257
+645 820
+292 1221
+792 968
+879 1494
+253 642
+105 802
+917 1305
+648 1646
+724 1157
+566 1056
+868 1437
+398 1098
+601 917
+436 1368
+26 933
+670 1615
+189 367
+79 1050
+955 1528
diff --git a/geom_bottleneck/tests/data/test_836_B b/geom_bottleneck/tests/data/test_836_B
new file mode 100644
index 0000000..8335ddf
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_836_B
@@ -0,0 +1,30 @@
+135 337
+332 1300
+859 1117
+591 988
+441 1441
+174 635
+78 703
+10 648
+188 422
+292 830
+492 1179
+104 276
+263 640
+63 760
+993 1248
+107 644
+723 747
+85 698
+276 410
+407 735
+229 810
+512 561
+802 1555
+542 818
+666 1499
+383 754
+132 216
+581 723
+775 1446
+908 1029
diff --git a/geom_bottleneck/tests/data/test_837_A b/geom_bottleneck/tests/data/test_837_A
new file mode 100644
index 0000000..8d3facc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_837_A
@@ -0,0 +1,30 @@
+456 998
+976 1929
+745 1606
+77 375
+149 692
+508 1466
+68 113
+493 1163
+185 1109
+761 1172
+313 1261
+508 1091
+122 834
+766 1333
+996 1208
+161 468
+688 903
+551 744
+745 1522
+579 1022
+149 722
+458 652
+8 758
+801 1344
+96 696
+589 1125
+589 989
+941 1492
+851 1168
+670 728
diff --git a/geom_bottleneck/tests/data/test_837_B b/geom_bottleneck/tests/data/test_837_B
new file mode 100644
index 0000000..8439a1f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_837_B
@@ -0,0 +1,30 @@
+102 508
+437 603
+199 669
+853 1602
+106 722
+732 771
+301 538
+505 988
+731 1707
+276 1142
+923 1449
+366 1330
+221 833
+107 174
+914 1231
+651 1411
+137 666
+781 1074
+459 655
+509 1344
+74 234
+927 1739
+960 1461
+556 608
+644 805
+457 971
+992 1522
+798 887
+147 944
+96 111
diff --git a/geom_bottleneck/tests/data/test_838_A b/geom_bottleneck/tests/data/test_838_A
new file mode 100644
index 0000000..9f6e83e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_838_A
@@ -0,0 +1,30 @@
+918 952
+225 1163
+801 1184
+786 1485
+512 747
+389 756
+966 1924
+542 720
+742 1207
+329 891
+273 1268
+701 1015
+29 682
+303 1139
+716 1617
+362 1135
+540 1071
+58 497
+725 1445
+46 688
+931 1327
+467 1229
+303 916
+702 1067
+862 1258
+535 1347
+640 1252
+619 1377
+702 1237
+971 1779
diff --git a/geom_bottleneck/tests/data/test_838_B b/geom_bottleneck/tests/data/test_838_B
new file mode 100644
index 0000000..227776e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_838_B
@@ -0,0 +1,30 @@
+898 1448
+295 893
+829 1147
+149 339
+529 1046
+729 1258
+602 1296
+571 672
+953 1890
+26 777
+984 1487
+879 1533
+456 1103
+741 1227
+235 718
+65 102
+432 1037
+307 824
+977 1325
+275 582
+753 1683
+809 1622
+63 478
+648 1273
+945 1446
+234 843
+354 1134
+298 1160
+471 882
+911 1296
diff --git a/geom_bottleneck/tests/data/test_839_A b/geom_bottleneck/tests/data/test_839_A
new file mode 100644
index 0000000..073be3c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_839_A
@@ -0,0 +1,30 @@
+488 765
+890 1359
+573 1009
+876 1603
+430 1408
+774 1380
+786 881
+392 1227
+506 755
+844 1516
+716 1555
+697 1415
+816 908
+981 1231
+775 1437
+224 582
+657 1045
+937 1441
+428 682
+865 1547
+802 1736
+700 1196
+881 1569
+507 875
+884 1852
+176 345
+278 338
+78 384
+562 781
+463 1403
diff --git a/geom_bottleneck/tests/data/test_839_B b/geom_bottleneck/tests/data/test_839_B
new file mode 100644
index 0000000..ca5ee3e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_839_B
@@ -0,0 +1,30 @@
+768 1077
+971 1887
+547 1058
+468 905
+54 250
+727 782
+101 407
+111 1085
+637 826
+209 531
+690 1134
+989 1111
+817 848
+862 952
+530 679
+431 823
+958 1666
+973 1598
+423 766
+42 736
+833 1832
+206 848
+148 336
+804 1691
+186 361
+53 288
+449 1314
+618 904
+759 1339
+8 923
diff --git a/geom_bottleneck/tests/data/test_840_A b/geom_bottleneck/tests/data/test_840_A
new file mode 100644
index 0000000..02ed823
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_840_A
@@ -0,0 +1,50 @@
+121 1010
+730 1566
+866 872
+984 1105
+12 455
+503 963
+956 1410
+986 1887
+929 1377
+809 823
+129 1090
+545 640
+641 921
+786 916
+222 474
+464 677
+357 1055
+199 1046
+327 892
+449 1272
+564 1505
+867 1494
+383 585
+617 1200
+254 997
+528 994
+458 507
+250 1217
+141 1104
+710 1191
+565 1355
+959 1876
+323 665
+290 1141
+749 1035
+641 817
+855 1596
+296 610
+144 215
+563 776
+77 599
+380 1160
+720 811
+55 905
+389 830
+268 1170
+579 1272
+240 811
+552 737
+498 844
diff --git a/geom_bottleneck/tests/data/test_840_B b/geom_bottleneck/tests/data/test_840_B
new file mode 100644
index 0000000..4bd5737
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_840_B
@@ -0,0 +1,50 @@
+156 272
+847 1154
+32 482
+781 1129
+956 1017
+429 1305
+312 1054
+11 979
+495 1463
+645 1524
+521 901
+685 1414
+741 1123
+179 428
+475 1073
+360 1315
+435 524
+897 1422
+668 1253
+538 802
+79 329
+791 1484
+557 772
+831 950
+640 666
+196 358
+214 394
+738 1566
+788 1752
+932 1820
+853 1847
+561 1446
+671 1490
+792 1123
+892 1481
+9 650
+92 308
+760 1021
+807 1449
+721 1693
+932 1892
+674 734
+837 1338
+313 507
+300 686
+264 1045
+210 788
+426 1169
+354 1154
+711 1322
diff --git a/geom_bottleneck/tests/data/test_841_A b/geom_bottleneck/tests/data/test_841_A
new file mode 100644
index 0000000..d6b2c08
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_841_A
@@ -0,0 +1,50 @@
+932 1449
+350 597
+425 503
+858 1265
+781 1372
+293 300
+593 806
+958 1619
+647 819
+598 1284
+160 571
+651 955
+521 1143
+906 1546
+848 1529
+729 1180
+990 1245
+54 398
+404 1096
+88 896
+679 1094
+737 1504
+609 1460
+32 747
+338 1060
+565 1216
+637 1537
+449 1042
+889 1510
+184 241
+103 584
+136 919
+503 659
+848 1333
+890 941
+360 836
+418 506
+750 994
+963 1068
+712 1501
+331 396
+515 617
+555 728
+81 401
+186 654
+934 1122
+649 843
+953 1342
+316 622
+866 1234
diff --git a/geom_bottleneck/tests/data/test_841_B b/geom_bottleneck/tests/data/test_841_B
new file mode 100644
index 0000000..9775dd8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_841_B
@@ -0,0 +1,50 @@
+381 908
+662 956
+316 894
+326 664
+655 1453
+261 430
+385 866
+630 1168
+117 237
+603 1595
+19 419
+375 1154
+982 1372
+897 1324
+347 687
+868 1049
+53 1031
+722 1078
+918 1107
+675 1326
+485 505
+777 1032
+76 273
+231 1113
+751 1180
+937 1635
+156 873
+641 1316
+632 1052
+54 1021
+993 1159
+905 1039
+606 1293
+235 364
+530 540
+326 843
+636 1442
+474 814
+176 942
+924 1685
+668 817
+560 1090
+805 1794
+679 1076
+409 1108
+582 1311
+21 449
+142 622
+614 1153
+570 908
diff --git a/geom_bottleneck/tests/data/test_842_A b/geom_bottleneck/tests/data/test_842_A
new file mode 100644
index 0000000..49124dc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_842_A
@@ -0,0 +1,50 @@
+205 815
+309 971
+468 1170
+602 1127
+239 434
+403 631
+80 500
+14 864
+594 1199
+406 407
+30 360
+188 993
+381 1063
+175 1087
+357 1063
+153 1117
+600 1365
+662 1189
+513 744
+339 1332
+860 1720
+897 1406
+462 808
+191 234
+542 729
+425 738
+159 160
+821 1536
+327 355
+616 1302
+699 1148
+870 1512
+810 1146
+448 564
+881 1246
+364 833
+889 1160
+102 175
+385 731
+86 659
+14 321
+257 1193
+685 1606
+174 925
+165 1021
+116 419
+775 1510
+53 614
+18 39
+561 670
diff --git a/geom_bottleneck/tests/data/test_842_B b/geom_bottleneck/tests/data/test_842_B
new file mode 100644
index 0000000..36715f2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_842_B
@@ -0,0 +1,50 @@
+577 1182
+779 1169
+525 1384
+851 968
+906 1679
+221 445
+494 653
+813 1061
+478 1174
+37 224
+700 1239
+338 855
+82 670
+159 872
+932 1231
+89 411
+869 1484
+708 966
+814 1075
+108 203
+603 691
+797 1680
+869 1223
+162 165
+281 333
+650 721
+200 665
+692 1332
+497 1331
+948 1098
+351 1188
+844 1508
+319 762
+302 442
+320 617
+220 649
+498 882
+411 711
+833 1373
+943 1586
+310 544
+24 818
+485 903
+58 1028
+84 1023
+69 823
+399 634
+755 945
+460 764
+583 800
diff --git a/geom_bottleneck/tests/data/test_843_A b/geom_bottleneck/tests/data/test_843_A
new file mode 100644
index 0000000..aa5cea9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_843_A
@@ -0,0 +1,50 @@
+855 1686
+375 653
+487 968
+501 1179
+269 747
+102 128
+756 1241
+934 1507
+707 1166
+438 644
+215 482
+186 1134
+588 1179
+323 806
+260 948
+999 1181
+809 866
+383 618
+667 1211
+697 1543
+216 289
+618 1318
+230 633
+261 439
+36 430
+926 1424
+573 1382
+545 1489
+198 254
+997 1313
+625 1138
+71 216
+123 152
+966 1260
+583 1455
+685 1595
+319 803
+809 1754
+543 672
+973 1482
+282 1191
+94 413
+933 1847
+593 770
+384 463
+301 531
+306 832
+645 679
+863 1024
+257 716
diff --git a/geom_bottleneck/tests/data/test_843_B b/geom_bottleneck/tests/data/test_843_B
new file mode 100644
index 0000000..b14eed6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_843_B
@@ -0,0 +1,50 @@
+36 726
+683 1328
+991 1393
+822 1642
+499 1065
+41 726
+770 903
+83 190
+993 1392
+584 1281
+520 643
+878 1560
+461 694
+715 1155
+752 1593
+592 622
+8 746
+280 816
+571 797
+24 712
+799 1664
+988 1479
+397 1339
+827 1088
+466 1179
+701 1236
+841 1384
+360 1235
+425 739
+982 1503
+188 345
+161 405
+366 1067
+245 975
+834 1160
+19 508
+594 1292
+149 267
+201 891
+22 922
+984 1108
+731 1251
+871 1092
+946 1519
+772 1388
+738 1194
+924 1862
+35 765
+904 1276
+190 235
diff --git a/geom_bottleneck/tests/data/test_844_A b/geom_bottleneck/tests/data/test_844_A
new file mode 100644
index 0000000..753b2fc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_844_A
@@ -0,0 +1,50 @@
+207 275
+665 774
+655 1360
+274 366
+83 646
+435 599
+479 793
+74 1043
+604 1048
+106 557
+885 1524
+694 1680
+770 833
+38 261
+6 547
+893 1287
+732 1589
+343 1201
+531 1088
+962 1666
+979 1708
+206 538
+73 114
+354 1140
+220 330
+299 833
+694 883
+651 701
+256 425
+551 612
+709 1304
+806 1613
+193 901
+29 916
+257 313
+806 1193
+205 530
+981 1851
+878 1208
+327 799
+958 1874
+783 1109
+466 537
+349 1191
+410 630
+513 837
+587 1033
+777 1202
+90 503
+893 1737
diff --git a/geom_bottleneck/tests/data/test_844_B b/geom_bottleneck/tests/data/test_844_B
new file mode 100644
index 0000000..373d26c
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_844_B
@@ -0,0 +1,50 @@
+67 793
+551 1443
+572 1395
+51 149
+805 920
+541 1479
+365 1244
+997 1447
+234 900
+144 1068
+418 929
+720 903
+155 219
+937 1905
+371 1112
+983 1372
+607 1244
+259 1217
+708 850
+992 1713
+398 968
+0 588
+167 742
+465 577
+188 892
+924 1045
+103 892
+489 1072
+170 195
+448 1141
+990 1075
+880 894
+703 1565
+318 785
+843 1614
+326 995
+104 185
+333 1186
+483 631
+246 797
+407 701
+333 545
+73 181
+591 1202
+851 1721
+615 1260
+504 1421
+472 486
+65 189
+986 1801
diff --git a/geom_bottleneck/tests/data/test_845_A b/geom_bottleneck/tests/data/test_845_A
new file mode 100644
index 0000000..2015fbb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_845_A
@@ -0,0 +1,50 @@
+446 1114
+872 1568
+544 1415
+144 507
+256 602
+208 382
+899 1217
+756 1597
+428 574
+201 843
+609 770
+443 531
+479 955
+959 1238
+821 1798
+564 1526
+26 545
+264 633
+34 527
+153 213
+215 703
+925 964
+651 1041
+32 797
+234 1162
+166 544
+407 981
+817 1528
+883 1412
+867 1173
+327 358
+326 330
+540 1054
+632 1503
+632 1465
+240 799
+954 1859
+214 374
+546 1395
+914 1529
+680 1588
+367 377
+890 971
+289 1247
+31 846
+810 1172
+658 1366
+537 1089
+256 1134
+16 1008
diff --git a/geom_bottleneck/tests/data/test_845_B b/geom_bottleneck/tests/data/test_845_B
new file mode 100644
index 0000000..b053f52
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_845_B
@@ -0,0 +1,50 @@
+537 582
+313 723
+386 619
+121 1100
+466 1044
+502 581
+16 838
+599 1395
+899 1523
+589 591
+36 928
+896 1718
+16 252
+99 722
+925 1343
+328 1244
+245 973
+596 1499
+122 763
+945 1563
+38 452
+680 890
+499 1247
+295 803
+385 1357
+885 1780
+597 637
+193 313
+951 1019
+679 1344
+991 1447
+697 1551
+834 1223
+57 795
+657 775
+374 1093
+187 398
+706 1353
+904 1801
+538 932
+843 1632
+370 1250
+590 957
+996 1385
+364 714
+307 689
+866 1687
+547 1072
+451 864
+746 900
diff --git a/geom_bottleneck/tests/data/test_846_A b/geom_bottleneck/tests/data/test_846_A
new file mode 100644
index 0000000..520c6d4
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_846_A
@@ -0,0 +1,50 @@
+659 889
+754 1573
+955 1466
+177 454
+109 235
+107 1086
+741 949
+689 1029
+288 564
+987 1133
+235 240
+398 1178
+27 395
+483 863
+509 1192
+920 1870
+732 1501
+494 1321
+190 362
+278 778
+726 1309
+397 1117
+7 888
+514 1366
+598 902
+48 950
+103 506
+770 1359
+689 1403
+340 1072
+191 850
+512 742
+441 507
+67 201
+50 781
+649 1619
+457 843
+756 993
+343 361
+505 1029
+687 707
+496 1371
+854 990
+555 1488
+217 249
+477 837
+150 258
+514 1286
+170 982
+160 521
diff --git a/geom_bottleneck/tests/data/test_846_B b/geom_bottleneck/tests/data/test_846_B
new file mode 100644
index 0000000..3046f20
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_846_B
@@ -0,0 +1,50 @@
+701 1467
+679 1557
+705 1082
+845 1787
+776 824
+890 1825
+867 1265
+105 710
+282 1235
+900 1455
+598 1253
+642 794
+304 961
+492 778
+16 233
+301 1249
+524 1358
+884 1577
+542 1423
+856 1110
+768 883
+226 755
+18 940
+846 916
+512 1411
+598 1196
+841 1345
+306 891
+571 981
+353 918
+840 1652
+886 1748
+269 1233
+940 1583
+364 1070
+187 683
+350 1141
+730 1223
+333 701
+284 449
+846 1539
+509 1400
+21 696
+543 778
+714 1428
+304 348
+475 1353
+594 1122
+426 946
+418 1312
diff --git a/geom_bottleneck/tests/data/test_847_A b/geom_bottleneck/tests/data/test_847_A
new file mode 100644
index 0000000..ee5c8c1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_847_A
@@ -0,0 +1,50 @@
+780 1633
+384 1190
+605 779
+787 1716
+504 698
+879 1796
+446 1258
+386 649
+830 1220
+576 717
+888 1126
+457 1259
+975 1588
+717 1266
+737 914
+103 695
+906 1516
+454 516
+696 899
+43 921
+613 781
+325 858
+655 1647
+72 601
+143 707
+293 1064
+13 310
+610 1021
+975 1576
+185 1017
+983 1261
+197 286
+68 472
+997 1630
+197 1191
+11 58
+804 1741
+364 519
+977 1124
+557 1184
+727 1681
+652 918
+928 1838
+675 1074
+551 976
+320 1244
+675 1477
+962 1898
+843 1490
+449 640
diff --git a/geom_bottleneck/tests/data/test_847_B b/geom_bottleneck/tests/data/test_847_B
new file mode 100644
index 0000000..de6f45a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_847_B
@@ -0,0 +1,50 @@
+198 500
+390 1022
+911 1544
+842 1778
+213 793
+173 1093
+61 455
+340 1005
+905 1418
+814 1236
+476 518
+133 382
+291 1249
+350 359
+967 1585
+441 810
+324 836
+769 1325
+828 1770
+758 1471
+9 499
+649 882
+418 1135
+28 97
+703 1400
+316 535
+799 1286
+16 348
+323 536
+113 864
+248 745
+468 597
+689 1618
+278 1208
+978 1589
+339 402
+232 442
+236 928
+856 1570
+709 1560
+34 260
+810 1365
+787 1781
+675 1043
+800 1255
+479 1118
+363 592
+97 729
+929 1430
+860 1219
diff --git a/geom_bottleneck/tests/data/test_848_A b/geom_bottleneck/tests/data/test_848_A
new file mode 100644
index 0000000..e9e603b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_848_A
@@ -0,0 +1,50 @@
+697 1454
+137 892
+466 950
+881 1230
+539 1162
+247 1065
+859 1032
+861 1215
+8 142
+772 1757
+458 1102
+382 730
+166 1086
+606 1008
+74 82
+967 1701
+562 1019
+648 764
+759 1745
+483 1208
+501 808
+942 1717
+569 888
+686 1292
+68 796
+504 1268
+655 1529
+335 451
+139 339
+709 1570
+238 542
+999 1912
+904 1545
+735 1386
+265 909
+935 1749
+745 787
+397 1083
+295 963
+12 523
+769 943
+998 1204
+531 1528
+596 1140
+173 1030
+810 1356
+728 750
+554 1185
+334 643
+879 1368
diff --git a/geom_bottleneck/tests/data/test_848_B b/geom_bottleneck/tests/data/test_848_B
new file mode 100644
index 0000000..00005be
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_848_B
@@ -0,0 +1,50 @@
+885 1435
+500 978
+291 765
+353 1157
+527 1446
+734 904
+302 393
+199 918
+561 744
+96 349
+338 631
+503 1162
+286 589
+492 544
+826 1742
+924 1340
+707 877
+691 1487
+883 1530
+233 810
+73 252
+192 595
+271 491
+915 1426
+128 781
+906 1244
+268 308
+979 1349
+823 1647
+993 1177
+318 961
+619 1143
+857 1682
+92 110
+676 1202
+485 1468
+968 1064
+565 634
+49 1043
+487 1316
+668 1425
+552 1443
+589 655
+515 850
+858 1826
+514 779
+322 506
+422 996
+213 1013
+897 1711
diff --git a/geom_bottleneck/tests/data/test_849_A b/geom_bottleneck/tests/data/test_849_A
new file mode 100644
index 0000000..7938a96
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_849_A
@@ -0,0 +1,50 @@
+785 1228
+858 997
+734 1553
+888 1700
+553 1433
+352 385
+851 1468
+803 950
+358 715
+376 1290
+419 784
+38 689
+504 1285
+250 768
+344 1015
+295 1063
+501 1219
+995 1383
+781 1320
+260 1154
+290 942
+683 918
+623 1468
+74 654
+742 1201
+919 974
+718 1316
+591 821
+864 1035
+591 951
+922 1553
+751 1468
+57 832
+809 1103
+243 322
+605 919
+947 1101
+7 1003
+655 1586
+737 1610
+537 935
+185 455
+466 834
+160 599
+386 1035
+381 448
+841 1005
+898 1693
+493 729
+506 685
diff --git a/geom_bottleneck/tests/data/test_849_B b/geom_bottleneck/tests/data/test_849_B
new file mode 100644
index 0000000..21da75d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_849_B
@@ -0,0 +1,50 @@
+87 1055
+578 1265
+657 1071
+939 1551
+679 1032
+768 1665
+668 1163
+689 1159
+229 1083
+358 1158
+515 595
+972 1301
+764 1428
+551 1533
+770 929
+104 172
+948 1359
+48 854
+510 995
+914 1735
+228 440
+854 1064
+351 908
+664 1290
+919 1050
+882 1794
+472 819
+826 1133
+279 944
+363 1081
+296 934
+227 749
+172 931
+583 1524
+409 848
+284 804
+436 1098
+96 768
+632 646
+832 1167
+862 1470
+544 1519
+889 1030
+422 1414
+948 1105
+967 1273
+552 589
+986 1793
+52 252
+430 864
diff --git a/geom_bottleneck/tests/data/test_850_A b/geom_bottleneck/tests/data/test_850_A
new file mode 100644
index 0000000..dfb2165
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_850_A
@@ -0,0 +1,50 @@
+819 907
+322 836
+10 262
+950 1844
+280 419
+724 1489
+982 1737
+183 305
+393 1066
+958 1033
+328 554
+609 1374
+512 835
+563 1444
+671 972
+161 838
+631 851
+867 1362
+995 1134
+990 1841
+479 839
+439 502
+408 917
+879 1633
+725 863
+271 614
+757 1203
+70 980
+745 841
+739 1679
+269 934
+926 1412
+977 1200
+532 1251
+607 708
+524 726
+737 983
+700 1200
+715 1247
+301 596
+136 869
+290 397
+88 764
+250 945
+0 378
+595 1513
+612 874
+706 757
+353 712
+509 953
diff --git a/geom_bottleneck/tests/data/test_850_B b/geom_bottleneck/tests/data/test_850_B
new file mode 100644
index 0000000..573788d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_850_B
@@ -0,0 +1,50 @@
+602 1008
+42 926
+253 1183
+404 631
+779 1700
+698 1638
+92 1004
+296 370
+204 378
+225 593
+685 1259
+982 1447
+544 951
+682 1653
+449 1092
+664 1035
+856 1428
+658 1320
+615 1113
+83 285
+276 745
+297 363
+590 732
+547 999
+440 901
+337 830
+492 595
+487 1018
+159 1115
+853 1350
+139 377
+9 573
+47 505
+187 480
+374 510
+831 1626
+948 1484
+450 1028
+840 1390
+132 288
+472 1025
+74 260
+281 518
+95 248
+699 735
+275 1183
+802 971
+119 1091
+709 1224
+397 855
diff --git a/geom_bottleneck/tests/data/test_851_A b/geom_bottleneck/tests/data/test_851_A
new file mode 100644
index 0000000..0a2f88e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_851_A
@@ -0,0 +1,50 @@
+390 859
+367 1332
+230 1179
+734 1289
+67 554
+186 319
+787 841
+516 1218
+616 1597
+551 1223
+669 862
+265 888
+24 428
+841 1616
+816 1058
+922 1460
+749 1311
+734 1658
+581 973
+780 1708
+99 1091
+851 1503
+161 1118
+944 1804
+456 458
+395 1163
+880 1842
+850 1397
+359 461
+996 1098
+337 1164
+975 994
+512 816
+436 648
+42 59
+586 841
+48 65
+352 821
+58 171
+870 1085
+639 763
+415 1274
+549 913
+37 47
+820 1311
+120 854
+924 1272
+325 800
+483 888
+167 512
diff --git a/geom_bottleneck/tests/data/test_851_B b/geom_bottleneck/tests/data/test_851_B
new file mode 100644
index 0000000..8e4b97e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_851_B
@@ -0,0 +1,50 @@
+173 900
+214 742
+715 941
+288 723
+561 1288
+482 789
+555 1396
+244 1162
+24 229
+897 1127
+809 1700
+785 1558
+76 361
+453 827
+61 728
+600 986
+237 887
+720 1191
+834 1643
+576 1344
+764 1307
+417 1377
+780 1174
+187 235
+776 1010
+952 970
+377 1184
+454 979
+758 970
+330 1179
+364 1105
+101 909
+481 692
+579 1234
+623 1088
+425 464
+360 503
+534 882
+363 1011
+973 1732
+413 504
+171 514
+89 282
+430 1044
+531 610
+713 873
+737 1131
+807 1603
+584 1034
+887 1189
diff --git a/geom_bottleneck/tests/data/test_852_A b/geom_bottleneck/tests/data/test_852_A
new file mode 100644
index 0000000..3d8f706
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_852_A
@@ -0,0 +1,50 @@
+473 535
+32 734
+940 1633
+31 264
+217 284
+963 1618
+780 1453
+436 606
+958 1899
+509 1436
+1000 1824
+793 889
+667 1236
+647 1383
+588 1280
+682 1431
+617 765
+740 799
+640 1082
+724 1466
+540 1456
+772 1324
+551 1437
+270 1096
+709 1110
+317 876
+6 185
+612 686
+220 1032
+55 414
+272 669
+233 973
+264 825
+58 779
+92 330
+837 910
+106 237
+980 1316
+806 1161
+433 1270
+304 900
+569 882
+459 563
+991 1221
+33 686
+228 429
+527 542
+911 1456
+395 938
+825 1625
diff --git a/geom_bottleneck/tests/data/test_852_B b/geom_bottleneck/tests/data/test_852_B
new file mode 100644
index 0000000..9de826f
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_852_B
@@ -0,0 +1,50 @@
+380 777
+698 1291
+826 1366
+108 741
+88 586
+50 631
+333 860
+51 355
+746 1232
+864 1129
+312 868
+514 591
+818 940
+561 1106
+997 1618
+986 1648
+417 1273
+544 1325
+343 1332
+852 1788
+740 1072
+890 957
+880 1540
+110 1072
+969 1706
+964 1771
+366 1347
+542 631
+863 1294
+216 864
+766 1148
+436 1431
+227 989
+694 786
+216 801
+119 946
+607 1270
+300 1178
+338 572
+374 509
+233 934
+531 542
+174 504
+521 738
+837 1202
+231 528
+595 1041
+530 1474
+218 852
+874 1675
diff --git a/geom_bottleneck/tests/data/test_853_A b/geom_bottleneck/tests/data/test_853_A
new file mode 100644
index 0000000..bcf5afe
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_853_A
@@ -0,0 +1,50 @@
+200 886
+263 814
+456 853
+495 694
+864 1233
+80 743
+147 356
+164 450
+250 1230
+759 792
+417 1228
+572 1002
+854 1634
+806 1057
+522 1196
+684 1295
+999 1547
+301 1014
+772 1685
+816 923
+820 876
+118 348
+340 849
+686 824
+874 1610
+510 1503
+602 1309
+677 1497
+146 1008
+853 1484
+729 1333
+617 1097
+511 935
+143 938
+485 552
+433 980
+859 1077
+3 717
+176 1136
+436 1213
+163 418
+505 889
+303 689
+837 1225
+296 345
+814 1699
+603 1524
+679 1224
+729 1714
+760 953
diff --git a/geom_bottleneck/tests/data/test_853_B b/geom_bottleneck/tests/data/test_853_B
new file mode 100644
index 0000000..d294f05
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_853_B
@@ -0,0 +1,50 @@
+223 899
+821 1752
+179 260
+757 1350
+661 1211
+397 1004
+114 557
+579 1379
+752 1531
+292 818
+459 580
+715 1007
+849 1067
+495 1197
+803 991
+588 1569
+362 1316
+38 961
+899 1762
+325 906
+411 1364
+320 1221
+301 674
+811 1126
+464 1441
+220 1130
+514 784
+196 240
+946 1543
+614 928
+610 626
+628 1059
+576 829
+363 1272
+338 888
+470 497
+767 824
+578 645
+136 573
+563 731
+794 1510
+466 1243
+341 1080
+34 787
+901 1260
+339 1068
+406 746
+135 590
+507 1272
+705 756
diff --git a/geom_bottleneck/tests/data/test_854_A b/geom_bottleneck/tests/data/test_854_A
new file mode 100644
index 0000000..4765953
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_854_A
@@ -0,0 +1,50 @@
+670 1518
+858 1578
+59 559
+503 768
+14 876
+830 858
+978 1670
+648 1003
+620 1028
+522 809
+678 1574
+303 1157
+238 748
+886 987
+445 1100
+994 1772
+50 602
+134 315
+885 1274
+862 1737
+369 1231
+199 594
+611 1387
+517 1513
+731 865
+357 1222
+137 822
+894 1389
+839 1547
+962 1432
+170 512
+596 907
+480 545
+416 889
+311 1213
+897 1057
+394 1075
+943 1054
+342 1014
+137 742
+163 843
+655 763
+642 1182
+753 1458
+200 958
+289 311
+726 808
+614 1330
+796 1506
+292 555
diff --git a/geom_bottleneck/tests/data/test_854_B b/geom_bottleneck/tests/data/test_854_B
new file mode 100644
index 0000000..aa949eb
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_854_B
@@ -0,0 +1,50 @@
+232 702
+892 1789
+441 1152
+710 975
+908 1187
+315 530
+255 334
+502 1485
+820 1718
+531 1002
+694 1032
+183 594
+924 1037
+948 1015
+465 906
+854 1761
+257 924
+588 1298
+382 1070
+315 646
+68 997
+924 1788
+927 1813
+522 1496
+667 1585
+884 1720
+373 1104
+140 1087
+988 1426
+690 796
+538 1095
+458 489
+685 805
+554 1389
+708 1480
+155 566
+704 891
+194 356
+607 1330
+512 725
+343 985
+660 1310
+117 1001
+454 1189
+554 1122
+722 1493
+805 1093
+60 419
+403 1277
+847 1750
diff --git a/geom_bottleneck/tests/data/test_855_A b/geom_bottleneck/tests/data/test_855_A
new file mode 100644
index 0000000..ab7ec0b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_855_A
@@ -0,0 +1,50 @@
+614 654
+663 1260
+449 1202
+762 985
+173 235
+219 556
+230 1224
+569 739
+65 145
+814 1671
+395 1280
+224 1211
+349 1209
+628 1611
+680 1532
+644 1398
+971 1611
+574 1353
+832 1740
+866 1082
+822 1654
+786 1770
+200 1071
+709 1343
+955 1924
+78 546
+168 872
+251 735
+505 1392
+719 799
+321 327
+823 1682
+327 788
+85 640
+423 1306
+581 665
+476 665
+257 926
+305 600
+828 1419
+957 1645
+22 783
+760 1281
+890 1141
+756 1272
+852 1339
+162 1155
+661 1360
+328 597
+81 549
diff --git a/geom_bottleneck/tests/data/test_855_B b/geom_bottleneck/tests/data/test_855_B
new file mode 100644
index 0000000..be6ff94
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_855_B
@@ -0,0 +1,50 @@
+758 1131
+201 805
+622 704
+457 770
+211 1153
+604 1593
+658 1229
+845 1733
+3 55
+813 1682
+926 1122
+87 399
+415 1287
+943 1357
+538 884
+39 447
+678 1201
+469 977
+445 1406
+931 992
+137 843
+914 1789
+736 1382
+933 1376
+426 1190
+332 715
+385 1226
+727 1493
+972 1306
+674 1674
+801 1277
+542 1301
+591 1067
+318 1136
+90 552
+168 232
+814 1715
+860 1249
+104 353
+841 1674
+775 1615
+517 693
+103 261
+472 517
+56 570
+767 1433
+839 1303
+683 1605
+311 700
+89 256
diff --git a/geom_bottleneck/tests/data/test_856_A b/geom_bottleneck/tests/data/test_856_A
new file mode 100644
index 0000000..3cbfae3
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_856_A
@@ -0,0 +1,50 @@
+719 1457
+209 663
+890 1735
+774 1570
+582 935
+231 1051
+723 1681
+341 1197
+4 150
+30 263
+38 984
+950 1487
+523 609
+453 854
+956 1422
+180 436
+690 966
+848 1237
+972 1095
+120 843
+523 1438
+49 182
+294 622
+586 1385
+750 786
+856 1407
+327 1270
+655 957
+373 1358
+372 785
+727 1497
+308 567
+784 1046
+315 913
+862 1742
+699 1337
+24 662
+407 455
+24 393
+913 1501
+13 1005
+709 1107
+264 1079
+107 781
+275 805
+164 179
+445 1355
+907 1785
+571 629
+953 1080
diff --git a/geom_bottleneck/tests/data/test_856_B b/geom_bottleneck/tests/data/test_856_B
new file mode 100644
index 0000000..ec34ae9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_856_B
@@ -0,0 +1,50 @@
+724 1643
+458 1388
+638 1303
+431 1405
+710 861
+659 723
+714 1351
+402 1186
+730 1584
+304 788
+845 850
+331 451
+421 1121
+821 1257
+2 923
+246 1167
+776 1109
+307 963
+553 1262
+841 1061
+27 290
+507 1297
+471 935
+583 1176
+781 955
+286 703
+178 303
+674 1372
+942 968
+521 1497
+6 593
+198 375
+263 1085
+486 1143
+807 1093
+17 795
+921 1559
+577 1316
+45 282
+670 1319
+228 400
+480 1047
+477 1308
+971 1055
+336 396
+731 941
+995 1354
+535 1309
+648 1642
+441 1432
diff --git a/geom_bottleneck/tests/data/test_857_A b/geom_bottleneck/tests/data/test_857_A
new file mode 100644
index 0000000..6bbbf0b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_857_A
@@ -0,0 +1,50 @@
+155 1103
+527 601
+613 714
+27 82
+288 1267
+522 713
+839 925
+554 1132
+148 255
+692 1319
+216 257
+11 251
+199 862
+371 724
+728 1561
+314 918
+452 540
+30 958
+745 1698
+434 1341
+469 1469
+913 1715
+599 1267
+260 953
+182 511
+504 1442
+597 1080
+300 888
+459 1000
+563 1521
+563 1468
+760 1702
+8 519
+393 910
+108 255
+375 1168
+344 1257
+563 1052
+813 1139
+999 1599
+175 785
+847 882
+825 1567
+977 1567
+218 847
+921 1150
+888 1280
+395 761
+495 1444
+195 1091
diff --git a/geom_bottleneck/tests/data/test_857_B b/geom_bottleneck/tests/data/test_857_B
new file mode 100644
index 0000000..2d0ac7d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_857_B
@@ -0,0 +1,50 @@
+781 853
+693 1641
+405 573
+301 1124
+303 1182
+839 1546
+597 1040
+56 318
+13 902
+667 878
+555 979
+486 1277
+647 782
+602 1195
+218 288
+59 487
+581 822
+703 842
+123 587
+173 609
+841 975
+554 641
+828 1660
+872 1486
+511 1069
+454 942
+933 1266
+416 643
+59 582
+278 354
+687 901
+1 930
+473 917
+604 950
+122 639
+126 987
+105 1046
+705 1298
+749 1143
+394 417
+15 16
+356 751
+955 1065
+599 813
+881 1008
+984 1857
+531 1371
+354 668
+747 1406
+738 1675
diff --git a/geom_bottleneck/tests/data/test_858_A b/geom_bottleneck/tests/data/test_858_A
new file mode 100644
index 0000000..1d3b9ad
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_858_A
@@ -0,0 +1,50 @@
+997 1050
+873 1795
+636 907
+851 1847
+38 669
+941 1873
+706 814
+776 882
+723 1329
+578 1461
+697 727
+369 1010
+426 1101
+552 720
+196 1177
+346 515
+701 1633
+399 514
+937 1425
+566 1446
+605 962
+260 696
+675 1180
+359 672
+192 355
+919 1323
+38 663
+688 1298
+239 504
+349 402
+842 1446
+831 1046
+442 770
+78 160
+351 1088
+577 1360
+29 290
+290 507
+467 1363
+1000 1796
+58 709
+428 615
+397 470
+628 1481
+874 1036
+32 84
+349 524
+244 821
+552 654
+762 1121
diff --git a/geom_bottleneck/tests/data/test_858_B b/geom_bottleneck/tests/data/test_858_B
new file mode 100644
index 0000000..a982114
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_858_B
@@ -0,0 +1,50 @@
+788 1123
+394 925
+228 647
+718 993
+774 961
+984 1106
+712 1001
+607 1594
+627 967
+971 1710
+166 510
+25 544
+985 1358
+205 1127
+844 1792
+510 518
+479 517
+828 1454
+61 1061
+647 1410
+727 1585
+94 479
+768 922
+162 895
+735 754
+951 1358
+747 1267
+933 980
+319 1007
+183 1000
+521 778
+129 375
+235 1221
+392 808
+872 1465
+380 794
+915 1896
+242 621
+908 1118
+341 593
+393 1304
+469 1169
+733 1077
+979 1477
+786 1583
+923 1650
+867 896
+714 1479
+860 907
+310 461
diff --git a/geom_bottleneck/tests/data/test_859_A b/geom_bottleneck/tests/data/test_859_A
new file mode 100644
index 0000000..24bd533
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_859_A
@@ -0,0 +1,50 @@
+305 883
+599 1497
+157 582
+832 1048
+62 403
+263 1151
+898 962
+258 428
+309 729
+626 1318
+279 415
+635 1029
+898 974
+733 1187
+661 1430
+243 1046
+498 865
+70 189
+834 1801
+820 1278
+972 1686
+255 826
+761 1694
+383 593
+326 491
+442 684
+523 1381
+229 1215
+402 551
+514 1133
+493 677
+415 996
+301 389
+586 1554
+21 956
+861 1058
+625 1082
+599 1208
+672 1147
+335 1229
+119 282
+114 772
+104 250
+236 977
+804 1446
+310 1229
+727 1176
+660 1484
+650 1188
+782 1781
diff --git a/geom_bottleneck/tests/data/test_859_B b/geom_bottleneck/tests/data/test_859_B
new file mode 100644
index 0000000..ac8c3b7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_859_B
@@ -0,0 +1,50 @@
+676 874
+562 574
+260 841
+590 1249
+517 1185
+85 807
+447 909
+50 185
+961 1522
+825 1594
+159 879
+105 1015
+767 1661
+828 1827
+341 355
+104 716
+1000 1615
+135 156
+580 1099
+898 1322
+797 1442
+145 272
+397 427
+289 717
+147 535
+543 1442
+491 761
+315 888
+943 1377
+941 1582
+703 1561
+873 1055
+981 1494
+933 989
+54 194
+842 1269
+901 1394
+346 1035
+858 1198
+864 1606
+122 873
+587 936
+705 1286
+176 754
+690 1066
+950 1037
+346 781
+474 1279
+180 1172
+957 1613
diff --git a/geom_bottleneck/tests/data/test_860_A b/geom_bottleneck/tests/data/test_860_A
new file mode 100644
index 0000000..bef7e26
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_860_A
@@ -0,0 +1,100 @@
+286 883
+351 366
+209 489
+760 1212
+838 1652
+595 660
+603 1448
+39 243
+601 832
+245 589
+258 1170
+586 1359
+639 1499
+233 1078
+722 781
+998 1722
+867 952
+85 635
+625 1224
+545 1458
+103 885
+227 270
+397 911
+28 776
+893 1191
+600 929
+554 1437
+510 611
+768 769
+396 540
+753 1168
+508 915
+609 874
+804 1177
+777 1596
+547 844
+63 286
+979 1153
+672 1523
+620 1414
+189 629
+841 889
+329 1319
+234 432
+267 1009
+441 1379
+954 1894
+908 1341
+313 1305
+671 1250
+296 992
+518 1355
+596 905
+169 366
+333 524
+73 352
+670 1216
+459 560
+945 1546
+279 561
+27 773
+701 1354
+768 1673
+778 829
+698 1194
+680 1054
+138 954
+957 1332
+873 1110
+215 605
+997 1772
+785 935
+985 1406
+999 1441
+849 924
+547 721
+80 977
+181 321
+44 87
+561 763
+448 1065
+694 711
+539 904
+522 1201
+951 1434
+467 766
+261 1178
+900 1180
+440 1158
+134 1038
+375 383
+383 722
+974 1675
+105 380
+42 94
+855 877
+176 220
+379 952
+415 1095
+273 1064
diff --git a/geom_bottleneck/tests/data/test_860_B b/geom_bottleneck/tests/data/test_860_B
new file mode 100644
index 0000000..36f7915
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_860_B
@@ -0,0 +1,100 @@
+54 531
+338 1142
+464 1266
+979 1648
+714 782
+478 592
+490 1025
+958 1817
+518 1232
+259 955
+628 1122
+47 423
+831 1649
+30 971
+833 1292
+304 784
+824 1612
+267 1156
+839 926
+190 200
+817 1817
+876 1083
+654 1410
+665 1309
+226 671
+584 640
+234 1111
+806 1282
+227 642
+80 717
+608 1151
+60 808
+216 928
+177 644
+218 1177
+690 1266
+450 1313
+309 861
+979 1696
+210 1066
+461 1403
+317 680
+313 722
+112 770
+166 746
+275 515
+566 1020
+575 931
+483 851
+807 1561
+137 467
+539 1148
+539 1511
+323 563
+633 1434
+287 1046
+260 320
+785 1657
+665 1299
+123 1038
+731 1330
+844 1161
+783 785
+212 619
+712 1288
+617 761
+367 381
+613 1128
+249 372
+977 1165
+202 504
+553 1006
+760 1241
+621 1168
+761 1372
+920 1579
+541 1430
+890 1618
+20 801
+495 809
+685 1544
+709 1130
+321 1130
+802 1219
+122 740
+660 1369
+283 810
+424 425
+475 580
+616 1579
+669 1244
+223 1000
+57 188
+365 1019
+775 1711
+451 512
+234 627
+741 1601
+526 1293
+911 1233
diff --git a/geom_bottleneck/tests/data/test_861_A b/geom_bottleneck/tests/data/test_861_A
new file mode 100644
index 0000000..1058733
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_861_A
@@ -0,0 +1,100 @@
+127 281
+555 671
+852 1188
+977 1877
+824 1400
+698 772
+759 1378
+901 1755
+445 1382
+653 1090
+781 1672
+314 1003
+826 861
+86 713
+880 1567
+253 886
+285 1117
+742 1603
+867 1483
+14 632
+845 1280
+649 1074
+322 897
+68 387
+618 679
+918 935
+89 1077
+586 1247
+52 917
+550 1169
+426 952
+535 860
+485 1229
+152 400
+241 1071
+77 181
+795 948
+942 1437
+728 811
+119 577
+433 921
+492 1054
+582 881
+813 1720
+40 497
+389 500
+542 570
+570 580
+672 953
+754 1221
+362 468
+707 1394
+146 927
+142 1098
+820 1494
+539 1194
+422 1194
+277 1109
+975 1238
+718 1181
+1 133
+887 1015
+961 1428
+758 1212
+48 554
+945 1432
+302 1165
+742 1046
+941 1415
+468 634
+964 1097
+220 232
+970 1602
+876 1222
+712 737
+131 471
+939 1209
+579 1496
+953 1937
+295 1269
+757 1470
+141 236
+649 712
+895 1621
+806 1653
+61 736
+695 948
+986 1051
+630 1053
+637 643
+951 1857
+991 1205
+982 1752
+395 549
+216 323
+803 1202
+976 1731
+866 1223
+540 1029
+786 805
diff --git a/geom_bottleneck/tests/data/test_861_B b/geom_bottleneck/tests/data/test_861_B
new file mode 100644
index 0000000..a6a11d7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_861_B
@@ -0,0 +1,100 @@
+517 1489
+251 612
+436 1287
+158 969
+181 653
+176 187
+494 1323
+174 1154
+896 926
+101 733
+416 984
+583 763
+161 512
+111 495
+991 1712
+827 854
+342 877
+13 212
+808 1594
+423 1182
+219 666
+195 233
+347 708
+979 1787
+758 1254
+414 1279
+421 563
+340 722
+209 552
+258 704
+776 1610
+672 972
+412 1195
+48 846
+946 1569
+844 1094
+891 1866
+430 925
+661 1317
+819 1214
+837 1824
+731 982
+14 53
+333 1086
+512 868
+789 1264
+15 313
+256 973
+678 1052
+259 1229
+969 1150
+602 1255
+302 1291
+257 1082
+756 1579
+103 110
+125 960
+368 1258
+183 1001
+559 1106
+447 944
+784 1446
+947 1735
+982 1775
+586 1368
+239 1171
+210 856
+94 1017
+138 1075
+59 657
+440 1015
+978 1530
+785 1259
+381 963
+463 1115
+785 1398
+0 147
+952 1432
+573 1345
+592 1443
+829 1357
+250 966
+948 1110
+848 1569
+251 904
+945 1606
+99 1025
+799 863
+690 1141
+21 445
+860 1338
+43 130
+148 853
+261 979
+177 324
+400 1084
+277 1098
+888 1223
+948 1629
+573 1197
diff --git a/geom_bottleneck/tests/data/test_862_A b/geom_bottleneck/tests/data/test_862_A
new file mode 100644
index 0000000..d37d3ef
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_862_A
@@ -0,0 +1,100 @@
+102 300
+352 359
+521 683
+515 1057
+914 1269
+100 498
+589 1272
+77 129
+417 487
+579 1450
+101 780
+36 807
+588 1009
+556 1004
+875 1497
+488 1097
+842 1462
+221 1204
+328 518
+186 828
+870 992
+309 931
+56 558
+780 1456
+164 1070
+472 934
+412 1210
+842 872
+575 1445
+755 1457
+250 571
+426 1223
+367 1073
+648 749
+303 1009
+147 491
+118 1002
+320 398
+473 1445
+817 1679
+35 369
+170 947
+953 1168
+169 278
+307 547
+260 507
+901 1598
+116 381
+241 765
+98 970
+216 1171
+746 1175
+605 1578
+601 1019
+598 967
+316 723
+838 1609
+78 357
+563 893
+545 1089
+813 1743
+981 1110
+454 514
+613 799
+742 1712
+620 764
+464 702
+643 1186
+674 1638
+418 669
+310 1147
+325 1015
+983 1678
+625 951
+407 750
+973 1792
+552 1354
+391 1120
+463 829
+716 1387
+6 403
+177 756
+505 708
+219 471
+187 714
+852 1248
+913 1610
+971 1722
+943 1812
+452 726
+509 624
+178 767
+699 1085
+771 1634
+140 251
+646 822
+456 754
+263 1179
+430 540
+96 810
diff --git a/geom_bottleneck/tests/data/test_862_B b/geom_bottleneck/tests/data/test_862_B
new file mode 100644
index 0000000..a18168e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_862_B
@@ -0,0 +1,100 @@
+123 340
+973 1465
+652 1288
+89 1046
+165 777
+390 986
+139 396
+378 927
+426 1167
+32 223
+259 1177
+771 1250
+494 1143
+528 759
+515 912
+319 992
+134 169
+851 1595
+676 816
+111 304
+35 872
+58 456
+522 1458
+392 1221
+112 1035
+471 1214
+495 580
+339 1276
+143 268
+12 788
+723 1470
+745 1088
+664 1449
+442 463
+268 1026
+289 910
+141 162
+411 1163
+626 1174
+743 1627
+261 1211
+950 1869
+214 1114
+995 1678
+586 960
+754 1098
+363 1013
+808 1761
+58 601
+267 1109
+571 1518
+639 1092
+565 785
+256 537
+490 509
+467 1036
+931 1450
+891 1584
+701 1280
+939 1642
+416 834
+72 964
+530 553
+224 331
+234 683
+722 1338
+190 496
+282 1201
+174 1133
+348 690
+799 1606
+891 1085
+408 1263
+204 522
+867 1729
+856 1102
+175 589
+827 1559
+880 1479
+558 720
+810 1534
+954 1315
+501 901
+675 1031
+721 1091
+265 1103
+670 1553
+587 614
+712 735
+713 1167
+565 714
+67 594
+928 1456
+375 449
+893 1022
+319 500
+101 783
+637 1572
+26 620
+107 845
diff --git a/geom_bottleneck/tests/data/test_863_A b/geom_bottleneck/tests/data/test_863_A
new file mode 100644
index 0000000..011d452
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_863_A
@@ -0,0 +1,100 @@
+596 1590
+388 1099
+928 1387
+473 1128
+595 925
+188 767
+40 804
+542 1405
+661 1245
+579 666
+526 616
+235 378
+379 477
+257 781
+910 1279
+882 1387
+562 1374
+499 603
+342 1317
+184 581
+315 1198
+987 1072
+696 1049
+498 1250
+782 1609
+771 1330
+203 354
+227 1171
+506 939
+360 1303
+969 1942
+772 850
+615 1079
+542 1186
+644 1583
+676 1131
+496 1300
+825 1120
+492 1332
+408 1051
+768 1110
+466 1044
+795 1594
+56 577
+529 1378
+899 1752
+943 1916
+509 780
+609 1175
+999 1928
+360 1164
+901 1764
+558 592
+665 752
+7 82
+919 1683
+772 1057
+211 928
+494 1347
+568 1412
+661 1649
+466 551
+75 498
+329 577
+143 636
+112 144
+217 221
+340 1208
+259 1177
+36 364
+63 299
+74 513
+67 186
+201 672
+508 1253
+96 129
+301 991
+925 1873
+340 1050
+237 672
+445 816
+836 1594
+649 1458
+227 1152
+880 933
+209 939
+822 890
+760 1131
+274 1096
+706 1604
+33 589
+552 1228
+69 615
+794 914
+305 423
+956 1053
+914 1411
+421 1282
+261 1067
+967 1966
diff --git a/geom_bottleneck/tests/data/test_863_B b/geom_bottleneck/tests/data/test_863_B
new file mode 100644
index 0000000..d9daaae
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_863_B
@@ -0,0 +1,100 @@
+986 1775
+226 644
+68 818
+739 1449
+962 1111
+850 1460
+306 1206
+901 1742
+171 513
+83 396
+776 1243
+646 948
+693 1431
+219 627
+247 813
+243 1070
+452 1130
+315 1227
+16 808
+977 1035
+454 583
+566 1521
+437 507
+484 1294
+494 506
+752 1161
+152 1081
+566 1413
+141 331
+706 1243
+258 849
+729 1447
+988 1985
+774 1653
+972 1907
+510 589
+402 905
+981 1420
+688 1112
+291 1016
+975 1800
+240 879
+643 1264
+448 458
+707 1075
+157 654
+51 635
+639 677
+688 1518
+99 198
+914 1734
+445 1036
+897 941
+504 1318
+192 479
+287 1003
+624 1444
+815 961
+956 1436
+445 656
+52 574
+787 987
+994 1875
+354 1317
+189 1072
+264 418
+645 1086
+319 942
+202 676
+841 1204
+695 1354
+289 748
+631 649
+894 1632
+909 1782
+794 1065
+0 430
+4 209
+286 1174
+327 1132
+342 641
+455 1256
+295 819
+749 1381
+811 1469
+69 514
+54 1044
+262 1176
+418 854
+819 1524
+861 1796
+242 996
+990 1068
+19 519
+831 1475
+782 1334
+748 986
+869 1569
+556 1535
+685 1411
diff --git a/geom_bottleneck/tests/data/test_864_A b/geom_bottleneck/tests/data/test_864_A
new file mode 100644
index 0000000..f82ed50
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_864_A
@@ -0,0 +1,100 @@
+698 789
+78 479
+383 639
+731 1686
+306 787
+614 696
+719 1184
+404 852
+317 776
+91 656
+126 806
+19 775
+976 1941
+876 1716
+501 1160
+851 1078
+547 641
+187 372
+654 1080
+745 1229
+151 577
+219 600
+318 1253
+317 362
+720 1487
+147 720
+900 1717
+402 1317
+187 1156
+573 1301
+173 479
+613 889
+956 1747
+583 1203
+478 1031
+498 1031
+394 1197
+118 842
+204 246
+562 1361
+340 835
+749 871
+847 1637
+776 1643
+731 1242
+302 741
+312 369
+903 1276
+814 1418
+205 336
+485 1196
+897 1667
+442 562
+319 1253
+56 469
+674 923
+51 642
+487 739
+32 759
+631 1091
+219 293
+381 419
+179 761
+935 1358
+408 636
+355 831
+677 1286
+98 306
+893 922
+275 1275
+350 923
+583 1490
+562 1545
+213 634
+538 870
+270 301
+536 1323
+663 1279
+286 325
+1 331
+927 1472
+998 1673
+404 484
+368 1234
+650 803
+238 845
+956 1851
+278 1002
+767 1110
+176 190
+808 841
+910 1693
+242 1010
+523 1133
+364 543
+915 1652
+401 1326
+787 1236
+250 985
+884 1153
diff --git a/geom_bottleneck/tests/data/test_864_B b/geom_bottleneck/tests/data/test_864_B
new file mode 100644
index 0000000..0b56a95
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_864_B
@@ -0,0 +1,100 @@
+11 893
+131 282
+718 1633
+802 822
+342 857
+797 1757
+703 704
+296 1271
+439 868
+143 1065
+860 1380
+62 101
+536 1375
+526 533
+482 1222
+338 1199
+665 770
+85 713
+829 930
+366 710
+300 757
+561 1556
+904 905
+711 1575
+30 766
+710 898
+476 897
+592 1142
+731 1153
+799 1176
+31 769
+570 718
+620 1438
+718 1198
+938 1650
+31 296
+342 929
+953 1681
+650 896
+868 1404
+800 1680
+776 1229
+612 1330
+362 1338
+958 1066
+269 978
+981 1035
+160 322
+673 795
+150 1117
+564 1490
+737 1617
+492 1040
+599 954
+261 1094
+691 734
+318 1231
+157 546
+329 916
+982 1956
+211 719
+665 1381
+911 1689
+368 425
+459 749
+706 1410
+103 539
+134 476
+209 341
+469 589
+350 462
+789 1113
+945 1335
+936 1272
+886 1823
+958 1528
+96 492
+532 1243
+119 577
+322 367
+518 1434
+692 839
+509 1104
+668 1357
+139 1127
+258 300
+307 382
+156 403
+171 582
+411 701
+794 944
+937 1602
+6 60
+593 929
+977 1052
+221 1209
+603 832
+881 1176
+394 710
+660 1260
diff --git a/geom_bottleneck/tests/data/test_865_A b/geom_bottleneck/tests/data/test_865_A
new file mode 100644
index 0000000..7453ead
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_865_A
@@ -0,0 +1,100 @@
+680 1206
+916 1092
+447 722
+821 1233
+565 1508
+548 1163
+973 1156
+229 1196
+378 542
+334 619
+581 606
+171 644
+143 407
+857 1539
+129 337
+582 780
+378 441
+196 340
+619 746
+28 94
+294 590
+881 1520
+113 174
+1000 1989
+343 395
+633 1542
+348 988
+973 1914
+58 903
+510 767
+440 448
+876 1806
+932 1554
+367 917
+465 820
+359 1185
+793 820
+999 1064
+193 871
+409 1286
+224 631
+381 793
+650 1047
+493 524
+698 1162
+846 1083
+536 1456
+909 1650
+245 982
+714 1104
+867 1447
+709 1527
+831 859
+170 266
+31 541
+578 650
+960 1059
+147 741
+202 407
+110 136
+747 1087
+781 1489
+759 1738
+945 1542
+790 1588
+52 259
+290 1116
+561 1416
+200 740
+50 629
+907 1349
+312 708
+87 433
+33 920
+934 1278
+530 706
+760 879
+834 1301
+819 1372
+656 1622
+950 1152
+452 692
+426 798
+469 811
+158 554
+563 1532
+713 1332
+567 964
+111 921
+237 1102
+156 1100
+113 344
+553 1386
+880 982
+355 655
+81 959
+203 437
+848 1389
+7 377
+305 717
diff --git a/geom_bottleneck/tests/data/test_865_B b/geom_bottleneck/tests/data/test_865_B
new file mode 100644
index 0000000..265e3bd
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_865_B
@@ -0,0 +1,100 @@
+121 979
+358 852
+219 696
+216 239
+200 737
+859 1771
+323 826
+192 1007
+129 389
+489 1130
+227 568
+806 1657
+613 1508
+626 1325
+643 1425
+905 1619
+123 372
+26 371
+949 1838
+399 1361
+516 652
+273 485
+346 753
+975 1839
+276 789
+824 893
+937 1262
+34 37
+444 993
+133 860
+190 421
+978 1903
+56 733
+421 756
+583 590
+133 371
+881 1309
+897 1347
+442 979
+700 941
+871 1095
+34 182
+206 603
+858 1533
+284 821
+241 1167
+623 989
+715 1664
+187 822
+970 1681
+26 153
+533 648
+406 873
+791 862
+217 983
+211 930
+781 1001
+973 1393
+204 845
+23 894
+11 772
+863 1663
+126 233
+306 835
+85 370
+802 1738
+526 1171
+429 1118
+697 1462
+196 512
+887 902
+7 401
+881 1262
+743 1392
+676 733
+527 1394
+911 1179
+816 1280
+513 1072
+842 1750
+942 1260
+841 1438
+86 704
+308 639
+478 1085
+56 220
+411 1045
+185 1141
+941 1695
+465 1360
+157 665
+19 599
+540 891
+832 1200
+408 1232
+540 1207
+881 1721
+496 691
+623 1295
+811 873
diff --git a/geom_bottleneck/tests/data/test_866_A b/geom_bottleneck/tests/data/test_866_A
new file mode 100644
index 0000000..a05ad71
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_866_A
@@ -0,0 +1,100 @@
+554 1091
+21 867
+633 899
+500 663
+971 975
+410 1235
+179 1036
+438 917
+434 678
+378 520
+747 1564
+39 131
+748 1408
+581 1266
+818 915
+527 1287
+452 998
+585 1061
+224 244
+554 1427
+859 1079
+613 1539
+522 738
+392 1170
+788 1437
+288 680
+370 1117
+476 1151
+826 1129
+41 551
+96 839
+480 1110
+909 1050
+59 1059
+549 801
+124 198
+991 1323
+122 1026
+573 1345
+701 1061
+40 265
+872 1116
+579 1464
+807 1198
+269 553
+376 786
+711 866
+864 1301
+716 1185
+366 775
+1000 1991
+970 1156
+921 1050
+599 1510
+49 593
+475 1394
+764 1704
+516 912
+721 805
+986 1006
+728 852
+789 1097
+459 597
+967 1276
+261 1126
+906 920
+466 1134
+419 467
+638 818
+243 738
+188 906
+434 1199
+821 892
+885 1241
+7 664
+963 1398
+576 1142
+84 385
+20 308
+845 1162
+79 730
+203 625
+412 1054
+553 898
+752 920
+640 1312
+169 706
+920 1586
+134 246
+352 619
+90 716
+197 616
+819 1101
+805 1686
+543 1178
+482 1411
+297 1259
+957 1763
+355 808
+591 1221
diff --git a/geom_bottleneck/tests/data/test_866_B b/geom_bottleneck/tests/data/test_866_B
new file mode 100644
index 0000000..c3e0b3a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_866_B
@@ -0,0 +1,100 @@
+573 1390
+68 742
+178 1172
+592 975
+294 453
+280 552
+750 1332
+947 1248
+972 1885
+868 942
+269 719
+457 944
+863 1391
+802 1524
+64 235
+161 495
+439 1397
+143 354
+974 1778
+239 643
+831 1814
+216 969
+515 1065
+334 1263
+504 1264
+950 1570
+558 976
+84 242
+125 745
+382 448
+602 1380
+98 211
+994 1767
+140 712
+694 1187
+523 901
+906 970
+65 850
+188 858
+787 1715
+836 1543
+356 1082
+9 932
+945 1142
+653 756
+934 1085
+526 1465
+636 1544
+711 1660
+63 607
+279 482
+716 768
+380 543
+210 885
+597 1476
+172 837
+542 1257
+465 557
+983 1339
+647 1098
+643 1101
+239 688
+658 1241
+448 595
+320 641
+622 673
+788 824
+2 645
+456 1068
+707 984
+334 1093
+81 601
+413 813
+311 345
+129 827
+253 556
+971 1376
+291 534
+846 1646
+61 699
+552 1406
+583 866
+285 635
+772 1351
+937 1014
+688 709
+425 906
+750 1220
+395 685
+93 392
+596 1460
+749 1123
+631 843
+100 311
+774 991
+873 1870
+297 422
+856 1311
+983 1053
+746 1722
diff --git a/geom_bottleneck/tests/data/test_867_A b/geom_bottleneck/tests/data/test_867_A
new file mode 100644
index 0000000..0e5ca13
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_867_A
@@ -0,0 +1,100 @@
+324 1024
+307 1299
+253 1161
+488 662
+711 1205
+481 510
+910 1280
+465 1426
+800 1294
+664 1348
+676 1342
+946 1581
+956 1482
+70 194
+312 636
+477 1373
+465 1242
+720 1446
+850 1798
+354 386
+657 998
+126 306
+800 1781
+695 1218
+69 522
+832 1255
+553 1007
+796 1602
+889 1204
+390 1048
+792 1754
+493 1394
+71 545
+200 996
+28 103
+705 1003
+315 489
+140 903
+161 296
+697 1682
+748 1663
+360 1052
+226 776
+18 564
+417 449
+234 350
+639 1585
+574 788
+862 1581
+950 1575
+268 532
+946 1194
+386 613
+782 1325
+494 1069
+792 846
+453 1409
+444 1022
+268 554
+319 792
+187 932
+491 1155
+93 253
+986 1147
+758 1167
+424 780
+194 891
+360 1218
+59 457
+625 1514
+618 919
+680 1182
+31 358
+544 744
+529 1135
+859 1346
+533 1132
+833 873
+583 733
+695 1156
+102 1023
+542 1132
+317 640
+883 1183
+696 1191
+603 1489
+492 1373
+935 1085
+235 620
+37 549
+802 1022
+211 508
+907 1146
+989 1239
+68 909
+367 919
+626 827
+770 1592
+413 414
+427 620
diff --git a/geom_bottleneck/tests/data/test_867_B b/geom_bottleneck/tests/data/test_867_B
new file mode 100644
index 0000000..c8eb5e0
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_867_B
@@ -0,0 +1,100 @@
+780 1730
+13 771
+347 670
+699 1353
+924 1139
+806 1496
+537 561
+756 1433
+987 1945
+689 1191
+123 972
+46 99
+468 961
+722 997
+675 1491
+626 1171
+315 1095
+582 741
+445 1083
+974 1633
+543 1308
+829 1343
+414 1038
+817 1254
+596 619
+94 438
+545 955
+832 1672
+0 240
+110 729
+444 1151
+331 1174
+684 765
+612 1448
+369 1181
+675 1243
+758 1008
+716 858
+618 931
+642 1279
+219 593
+650 751
+228 998
+40 93
+181 758
+372 658
+87 607
+190 1136
+990 1325
+232 991
+205 1111
+497 965
+767 1480
+896 1862
+777 1234
+790 1452
+734 1521
+457 1207
+934 979
+617 948
+217 767
+654 1122
+902 1565
+951 984
+250 644
+63 299
+726 1472
+406 1249
+749 777
+140 250
+235 1047
+118 1003
+728 833
+158 1021
+243 801
+112 330
+10 912
+629 796
+954 1471
+764 1267
+598 1299
+131 899
+103 405
+187 456
+985 1359
+228 599
+440 1326
+776 852
+156 847
+295 558
+453 786
+236 560
+948 1458
+599 1174
+482 869
+857 1110
+978 1947
+424 446
+699 1688
+886 1793
diff --git a/geom_bottleneck/tests/data/test_868_A b/geom_bottleneck/tests/data/test_868_A
new file mode 100644
index 0000000..0a0fad2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_868_A
@@ -0,0 +1,100 @@
+430 1257
+813 1021
+677 1089
+222 1147
+837 1410
+931 1488
+664 1192
+946 1885
+492 1036
+808 1524
+389 1210
+953 1056
+96 797
+818 1592
+900 1074
+63 516
+46 961
+999 1353
+797 1101
+343 1142
+355 459
+384 1358
+401 800
+354 1100
+661 1246
+76 437
+19 581
+385 760
+704 1218
+25 332
+406 1275
+838 1648
+57 335
+501 638
+826 1431
+682 1568
+803 1533
+894 1845
+38 580
+54 835
+448 507
+132 538
+226 1080
+307 489
+339 596
+334 1283
+573 891
+844 1119
+674 949
+998 1669
+226 599
+487 527
+401 1224
+785 1065
+270 710
+410 545
+981 1732
+602 704
+38 838
+145 646
+671 1128
+621 787
+782 1217
+932 1014
+935 1117
+923 1561
+79 253
+170 548
+343 937
+966 1919
+847 1290
+41 234
+683 926
+279 457
+243 957
+316 1240
+630 1492
+901 1691
+919 1022
+385 574
+902 1474
+640 1197
+805 973
+943 1173
+24 846
+139 140
+48 425
+124 1016
+880 1326
+175 275
+835 1142
+244 331
+770 969
+386 950
+391 886
+334 1284
+754 1503
+179 842
+955 1780
+330 436
diff --git a/geom_bottleneck/tests/data/test_868_B b/geom_bottleneck/tests/data/test_868_B
new file mode 100644
index 0000000..00c87b2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_868_B
@@ -0,0 +1,100 @@
+166 1061
+527 1335
+325 949
+111 649
+488 697
+766 1222
+709 1440
+141 784
+700 939
+798 1136
+861 1837
+628 1376
+473 1366
+145 643
+194 363
+986 1365
+564 979
+870 1837
+451 928
+797 1196
+521 1453
+0 285
+191 1080
+846 1666
+337 494
+790 1644
+759 1570
+46 871
+886 966
+169 897
+55 627
+538 1463
+114 429
+787 827
+850 1806
+31 827
+482 1012
+120 693
+777 1353
+271 916
+15 717
+660 943
+265 446
+985 1045
+22 519
+715 1571
+604 1475
+141 983
+395 1392
+98 851
+179 766
+237 652
+794 1439
+275 451
+47 631
+183 1091
+500 989
+727 1263
+625 1578
+327 1057
+725 1166
+212 731
+699 1449
+471 472
+787 1014
+714 1402
+412 913
+326 1203
+239 592
+920 1395
+303 410
+197 853
+101 1007
+970 1893
+925 1655
+490 670
+158 428
+413 1207
+722 1712
+776 1727
+548 1012
+891 1253
+329 1285
+576 1098
+357 878
+713 1660
+165 726
+786 1231
+447 600
+103 478
+177 764
+386 1263
+307 327
+812 1500
+685 1462
+973 1935
+973 1024
+848 868
+897 1464
+696 1688
diff --git a/geom_bottleneck/tests/data/test_869_A b/geom_bottleneck/tests/data/test_869_A
new file mode 100644
index 0000000..fa16527
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_869_A
@@ -0,0 +1,100 @@
+723 777
+589 1331
+521 602
+976 1210
+302 783
+550 1430
+254 453
+580 1493
+870 1136
+765 1589
+178 699
+654 1093
+505 739
+285 572
+694 975
+4 681
+733 1644
+258 639
+575 1027
+628 756
+887 1885
+430 1393
+194 371
+57 230
+275 489
+269 458
+254 354
+227 1077
+837 1711
+737 1290
+315 1159
+440 791
+922 1280
+175 615
+137 448
+712 1488
+96 617
+815 1776
+280 540
+595 1107
+545 987
+914 1273
+418 919
+135 1053
+612 653
+194 901
+99 866
+689 1038
+273 789
+350 1046
+433 828
+679 1512
+611 1131
+344 1098
+86 1055
+791 1490
+717 1192
+900 1504
+165 1119
+47 512
+452 858
+290 447
+610 774
+451 1149
+693 809
+513 889
+313 771
+290 604
+419 990
+554 728
+726 1563
+860 1471
+671 767
+735 763
+615 1318
+792 1245
+403 1356
+624 1031
+875 1372
+780 1429
+692 1291
+549 655
+412 1158
+727 982
+780 986
+899 1741
+896 1193
+958 1531
+580 698
+23 296
+735 1275
+400 495
+411 1166
+128 630
+498 1178
+195 459
+829 1674
+678 1531
+329 785
+625 1441
diff --git a/geom_bottleneck/tests/data/test_869_B b/geom_bottleneck/tests/data/test_869_B
new file mode 100644
index 0000000..7ffd8c9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_869_B
@@ -0,0 +1,100 @@
+979 1349
+400 1004
+925 1748
+266 1261
+562 1050
+591 592
+63 630
+404 603
+971 1511
+352 619
+907 1852
+388 830
+8 145
+14 369
+247 938
+648 1230
+625 1083
+231 1003
+926 1824
+143 879
+689 1615
+340 1273
+565 955
+419 443
+92 867
+554 697
+774 1475
+298 1142
+677 1036
+734 811
+831 1211
+585 757
+328 573
+117 789
+575 614
+191 1007
+457 829
+35 193
+518 1335
+5 799
+505 1285
+48 381
+684 990
+767 1230
+953 1161
+51 556
+391 522
+405 419
+217 877
+793 857
+360 455
+259 791
+507 553
+505 1256
+403 842
+981 1524
+223 246
+780 1102
+707 1010
+584 1474
+529 1074
+384 464
+452 668
+28 321
+181 496
+343 1061
+764 1720
+454 1394
+768 822
+217 741
+176 476
+263 306
+914 1258
+526 584
+823 1116
+82 697
+994 1908
+667 982
+231 463
+230 807
+843 1706
+50 369
+521 740
+599 1004
+72 775
+279 502
+833 1423
+880 1593
+371 1093
+703 1272
+815 1096
+125 1058
+497 899
+991 1183
+300 1016
+394 514
+962 1608
+797 1721
+994 1473
+108 421
diff --git a/geom_bottleneck/tests/data/test_870_A b/geom_bottleneck/tests/data/test_870_A
new file mode 100644
index 0000000..72422f7
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_870_A
@@ -0,0 +1,100 @@
+60 817
+390 412
+83 364
+762 1271
+949 1643
+874 1468
+411 1354
+897 1800
+66 622
+763 1511
+51 1025
+882 1063
+91 96
+309 1302
+646 1599
+721 1157
+923 1112
+907 1582
+434 517
+854 1679
+719 1601
+38 615
+762 1454
+394 438
+2 40
+828 1110
+994 1556
+647 745
+610 1499
+9 27
+4 572
+829 1229
+44 319
+807 1726
+286 1104
+953 1884
+941 1314
+131 1041
+363 883
+825 1168
+975 1168
+561 1292
+151 204
+465 648
+346 459
+252 1179
+766 917
+583 1401
+353 666
+493 739
+809 1531
+391 964
+410 1172
+180 194
+865 1343
+849 1201
+839 1253
+5 590
+674 1029
+821 1333
+711 874
+557 1038
+101 163
+564 834
+696 707
+631 1249
+762 1107
+343 515
+987 1870
+525 1274
+402 1043
+164 220
+940 1422
+840 1281
+50 1012
+275 1062
+472 790
+61 306
+217 661
+283 1281
+436 972
+952 1838
+374 1049
+577 1482
+486 1288
+743 851
+469 1295
+553 1233
+11 774
+687 1381
+243 481
+399 873
+777 1539
+489 742
+293 513
+755 1047
+881 1154
+757 1457
+261 1097
+693 1283
diff --git a/geom_bottleneck/tests/data/test_870_B b/geom_bottleneck/tests/data/test_870_B
new file mode 100644
index 0000000..db4847d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_870_B
@@ -0,0 +1,100 @@
+278 1098
+502 1411
+318 748
+154 189
+605 1475
+556 1482
+377 718
+168 338
+595 921
+962 1686
+301 409
+730 1138
+132 612
+988 1838
+759 1728
+170 465
+654 681
+43 199
+358 1076
+270 316
+602 1382
+657 1138
+211 448
+516 652
+781 1312
+937 1266
+30 227
+769 1102
+91 938
+737 1368
+733 1087
+511 721
+582 997
+261 635
+540 992
+503 590
+189 267
+614 824
+517 1181
+120 447
+545 650
+248 1122
+798 1437
+571 1265
+358 993
+618 1573
+406 861
+540 1382
+213 509
+964 1055
+481 858
+933 1275
+680 1433
+634 665
+963 1365
+612 1163
+895 1316
+95 814
+483 1416
+142 989
+37 588
+17 728
+137 492
+498 1010
+868 1023
+713 1344
+606 1243
+806 1540
+868 1118
+115 780
+329 690
+742 1226
+595 1135
+534 938
+53 175
+627 683
+277 1165
+323 329
+587 869
+308 1234
+266 338
+103 928
+385 863
+628 1620
+157 370
+258 731
+30 588
+202 920
+589 618
+5 221
+882 1659
+68 136
+918 1860
+466 801
+719 1236
+79 664
+562 1234
+258 784
+669 1010
+850 1761
diff --git a/geom_bottleneck/tests/data/test_871_A b/geom_bottleneck/tests/data/test_871_A
new file mode 100644
index 0000000..08ce8b2
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_871_A
@@ -0,0 +1,100 @@
+42 835
+829 1708
+683 1618
+329 527
+127 163
+931 1127
+902 1289
+712 755
+344 415
+991 1939
+8 415
+225 1099
+685 1632
+996 1747
+751 1238
+569 1367
+256 401
+711 1157
+58 745
+112 1087
+226 902
+560 1414
+482 1323
+243 382
+672 1335
+202 962
+803 1090
+398 967
+790 1384
+901 1648
+280 296
+684 1484
+432 498
+599 972
+86 497
+703 1327
+730 1472
+889 946
+1000 1305
+735 1569
+606 1155
+916 1843
+246 286
+102 980
+854 1598
+518 944
+341 973
+426 489
+888 1375
+359 409
+49 660
+619 1187
+635 1439
+338 1297
+347 654
+847 989
+161 915
+846 1341
+196 418
+698 1689
+535 634
+407 419
+767 1110
+154 1127
+912 1214
+982 1797
+824 1331
+38 859
+753 867
+297 988
+784 1479
+407 1024
+884 1054
+894 1476
+674 837
+402 1183
+906 1306
+27 471
+672 1594
+480 830
+174 302
+133 928
+858 1186
+541 950
+395 397
+356 1259
+219 1028
+120 465
+703 1595
+9 234
+790 1682
+322 1197
+314 655
+770 1287
+95 775
+444 520
+118 800
+852 1564
+24 333
+906 1508
diff --git a/geom_bottleneck/tests/data/test_871_B b/geom_bottleneck/tests/data/test_871_B
new file mode 100644
index 0000000..23c1dd8
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_871_B
@@ -0,0 +1,100 @@
+112 365
+974 1486
+76 198
+108 949
+30 308
+221 985
+687 1236
+255 744
+597 1580
+552 1173
+944 1327
+291 494
+867 1053
+73 595
+265 407
+827 1067
+990 1968
+663 948
+555 1506
+469 1046
+909 939
+59 858
+756 986
+101 335
+57 1047
+516 1348
+615 775
+578 1391
+756 1351
+341 1087
+147 471
+893 1879
+68 603
+433 867
+982 1332
+11 464
+710 1435
+337 967
+468 1092
+282 474
+712 1541
+779 1165
+255 872
+590 1550
+255 949
+316 494
+398 1017
+863 1551
+835 1072
+554 1129
+560 854
+862 1403
+97 304
+71 393
+351 1038
+624 1327
+185 1077
+311 601
+640 736
+542 980
+735 884
+78 879
+230 799
+462 1295
+249 678
+736 900
+867 984
+254 405
+408 543
+271 694
+371 1039
+38 598
+888 1058
+876 1612
+697 1333
+650 1183
+910 1895
+884 1723
+922 1772
+911 1770
+788 1139
+981 1024
+962 1552
+389 612
+661 1027
+583 1188
+649 1291
+793 1505
+442 1158
+356 832
+190 589
+643 713
+496 536
+530 1381
+153 641
+162 335
+629 1071
+110 395
+18 833
+8 423
diff --git a/geom_bottleneck/tests/data/test_872_A b/geom_bottleneck/tests/data/test_872_A
new file mode 100644
index 0000000..9647bed
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_872_A
@@ -0,0 +1,100 @@
+357 473
+781 1680
+963 1614
+418 582
+427 979
+738 924
+946 1432
+903 1821
+250 279
+570 1065
+305 1090
+750 756
+317 1028
+865 1402
+464 465
+316 1186
+856 1199
+763 1744
+46 424
+954 1654
+602 843
+232 426
+864 1001
+292 495
+72 455
+907 1762
+575 697
+886 1098
+954 1502
+980 1741
+317 527
+72 711
+614 695
+931 1149
+223 229
+684 1073
+221 897
+1000 1806
+165 358
+454 1067
+569 878
+162 950
+910 1768
+329 508
+247 1201
+469 849
+973 1153
+298 670
+682 1515
+230 777
+876 1085
+438 598
+72 775
+668 687
+254 502
+989 1165
+646 1375
+972 1552
+593 1408
+860 1844
+256 469
+982 1530
+834 1562
+195 280
+81 393
+470 802
+570 667
+95 558
+846 1778
+639 1120
+340 804
+527 530
+413 428
+797 1156
+610 780
+113 323
+287 441
+388 838
+418 743
+859 970
+96 898
+29 592
+396 1004
+463 1417
+641 1130
+880 1301
+176 1121
+286 325
+456 1093
+988 1077
+885 1278
+47 828
+617 1089
+595 1071
+870 895
+661 1423
+720 759
+379 924
+892 1184
+583 589
diff --git a/geom_bottleneck/tests/data/test_872_B b/geom_bottleneck/tests/data/test_872_B
new file mode 100644
index 0000000..1c58840
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_872_B
@@ -0,0 +1,100 @@
+153 586
+46 542
+64 130
+498 815
+144 494
+300 1100
+146 383
+431 558
+710 839
+615 648
+680 970
+995 1797
+903 1605
+994 1759
+335 810
+93 670
+928 1252
+754 1015
+941 1668
+105 746
+448 924
+419 1140
+881 1239
+500 831
+794 1571
+780 1613
+892 1155
+133 279
+869 1603
+745 1402
+463 623
+501 686
+510 1155
+806 1373
+302 821
+710 1492
+508 879
+643 787
+494 1172
+427 1018
+37 813
+394 497
+498 1374
+565 1285
+216 453
+315 1039
+356 920
+968 1326
+400 460
+779 964
+179 560
+405 1249
+64 466
+128 978
+99 582
+424 885
+39 675
+912 1624
+531 652
+617 1391
+338 788
+993 1673
+229 301
+879 1305
+356 467
+950 1787
+471 1441
+692 1677
+84 383
+767 1029
+865 1658
+468 988
+854 1028
+483 1097
+898 1321
+605 723
+632 1154
+782 1260
+797 1207
+176 445
+126 827
+333 541
+722 1131
+188 642
+287 1194
+8 607
+955 1136
+44 1000
+515 858
+39 311
+436 1200
+344 1280
+856 1776
+603 1524
+230 617
+953 1413
+592 916
+393 1116
+498 529
+283 734
diff --git a/geom_bottleneck/tests/data/test_873_A b/geom_bottleneck/tests/data/test_873_A
new file mode 100644
index 0000000..d9e1da9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_873_A
@@ -0,0 +1,100 @@
+871 918
+442 1110
+786 797
+342 1125
+473 1471
+550 737
+956 1854
+259 420
+592 1059
+861 1049
+50 255
+11 163
+254 810
+649 659
+866 1083
+786 1466
+728 1162
+659 1272
+884 1597
+34 1016
+487 679
+765 1214
+145 505
+994 1925
+711 1474
+207 713
+143 567
+935 1009
+62 1036
+168 713
+7 478
+628 1423
+51 693
+391 575
+18 283
+45 308
+971 1067
+934 1548
+604 1154
+4 558
+425 998
+77 439
+513 1485
+354 1302
+317 816
+5 551
+346 804
+872 1197
+309 418
+691 886
+927 1242
+51 491
+88 645
+835 1584
+377 751
+668 684
+226 1026
+418 691
+335 939
+955 1872
+490 1173
+68 355
+689 740
+284 550
+531 1023
+312 390
+127 875
+3 408
+314 458
+907 932
+489 890
+451 1402
+52 849
+709 1325
+373 1367
+390 1030
+707 1272
+25 607
+742 996
+838 1569
+570 1522
+278 1034
+863 1805
+615 823
+865 1726
+902 1367
+81 1011
+619 1462
+18 422
+433 1195
+154 635
+27 975
+690 1465
+447 1308
+686 1058
+204 1164
+572 1531
+202 609
+772 777
+740 1633
diff --git a/geom_bottleneck/tests/data/test_873_B b/geom_bottleneck/tests/data/test_873_B
new file mode 100644
index 0000000..a9f3ea1
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_873_B
@@ -0,0 +1,100 @@
+816 1608
+484 669
+486 883
+131 221
+617 1433
+421 578
+277 879
+587 979
+662 783
+275 1001
+538 1142
+135 857
+984 1296
+163 997
+818 1596
+591 1112
+29 465
+156 374
+805 1436
+709 977
+650 1507
+360 1041
+940 1108
+957 1483
+628 775
+109 461
+680 1562
+457 507
+68 693
+795 935
+505 564
+706 951
+60 977
+501 1258
+441 539
+280 658
+787 1427
+311 866
+722 808
+94 679
+979 1850
+408 1002
+246 1068
+125 815
+520 819
+557 1306
+369 1123
+14 940
+666 931
+589 1555
+430 871
+105 907
+294 469
+798 1528
+30 640
+566 1287
+930 1651
+599 691
+139 256
+938 1775
+173 682
+597 899
+430 924
+201 1194
+164 611
+996 1009
+482 807
+680 1375
+281 704
+422 457
+698 963
+742 876
+839 1814
+901 1360
+775 1461
+612 801
+498 1360
+176 707
+430 596
+134 578
+408 742
+867 1346
+66 912
+390 824
+823 1332
+787 1775
+924 1615
+619 1109
+892 1583
+583 904
+591 1270
+805 815
+913 1698
+557 623
+15 98
+28 862
+775 981
+627 1137
+836 1587
+556 988
diff --git a/geom_bottleneck/tests/data/test_874_A b/geom_bottleneck/tests/data/test_874_A
new file mode 100644
index 0000000..4d66819
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_874_A
@@ -0,0 +1,100 @@
+401 767
+318 1182
+238 653
+420 702
+684 942
+381 618
+263 1108
+275 381
+659 1140
+301 646
+401 432
+68 350
+147 1106
+670 1593
+792 1332
+779 1462
+129 130
+604 665
+800 1027
+631 945
+961 1286
+767 1426
+123 653
+860 1160
+929 1528
+876 1665
+148 1072
+898 1869
+375 386
+135 943
+847 1128
+455 1273
+28 509
+202 1148
+241 462
+612 732
+655 667
+392 726
+525 655
+993 1778
+241 1229
+185 599
+321 836
+773 1506
+632 1023
+885 1663
+868 985
+84 664
+761 1738
+75 641
+988 1791
+178 992
+34 69
+990 1431
+460 957
+352 453
+102 946
+123 883
+535 1360
+961 1232
+825 885
+259 679
+139 620
+946 1073
+690 753
+39 1022
+741 1612
+662 1215
+156 703
+942 1906
+477 496
+499 737
+175 763
+304 563
+317 1266
+918 1673
+646 686
+941 1023
+502 1266
+811 822
+153 688
+892 1832
+737 1518
+53 475
+140 709
+379 871
+138 816
+228 1106
+272 774
+732 1715
+344 849
+580 971
+983 1855
+312 399
+561 1352
+335 1008
+268 1083
+488 921
+327 449
+177 198
diff --git a/geom_bottleneck/tests/data/test_874_B b/geom_bottleneck/tests/data/test_874_B
new file mode 100644
index 0000000..2142cbc
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_874_B
@@ -0,0 +1,100 @@
+682 1578
+580 1035
+713 1240
+664 1644
+492 852
+126 441
+113 329
+144 557
+829 1627
+857 1645
+332 1104
+531 773
+616 1523
+568 831
+251 340
+155 1058
+519 1241
+525 571
+182 334
+148 450
+974 1128
+508 1003
+188 738
+763 1502
+726 1288
+892 954
+418 1171
+414 927
+268 591
+529 1371
+10 396
+379 1371
+578 1428
+493 529
+79 364
+340 1082
+84 653
+847 1396
+905 1164
+526 690
+715 1436
+317 823
+161 223
+19 515
+520 1415
+871 1311
+601 1249
+533 1040
+454 1168
+35 919
+191 668
+102 424
+899 1107
+439 558
+145 1108
+138 1085
+633 756
+616 801
+795 1193
+428 892
+712 1066
+451 723
+294 640
+228 1009
+984 1910
+966 1472
+578 771
+403 896
+341 841
+441 671
+513 665
+137 386
+591 750
+881 1549
+753 1355
+66 695
+500 592
+364 715
+275 485
+841 1194
+204 386
+556 1196
+388 1345
+695 1051
+47 494
+505 1386
+427 933
+635 714
+998 1743
+637 822
+355 1048
+430 1086
+905 1747
+906 1612
+590 804
+709 1164
+852 1511
+205 626
+403 978
+706 1085
diff --git a/geom_bottleneck/tests/data/test_875_A b/geom_bottleneck/tests/data/test_875_A
new file mode 100644
index 0000000..1748357
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_875_A
@@ -0,0 +1,100 @@
+501 816
+326 1114
+214 1139
+167 352
+465 1246
+268 284
+830 907
+240 975
+995 1655
+583 822
+320 963
+446 975
+525 1385
+280 1057
+788 978
+238 1027
+731 1643
+154 467
+988 1430
+468 594
+170 779
+931 1377
+332 888
+432 1036
+310 841
+960 1909
+554 1147
+999 1007
+213 626
+667 862
+200 773
+166 657
+830 1352
+698 816
+455 850
+435 1100
+300 584
+935 1403
+544 1425
+78 451
+543 955
+831 1610
+530 633
+443 1150
+16 712
+798 1758
+760 1226
+839 1249
+310 891
+343 553
+341 463
+925 948
+691 851
+899 1768
+486 530
+830 1370
+515 894
+782 1153
+539 1004
+907 1348
+28 395
+335 626
+599 946
+571 1494
+607 1477
+560 1176
+27 63
+190 453
+586 1257
+659 831
+991 1363
+95 851
+226 785
+263 836
+97 531
+768 905
+970 1051
+487 1361
+96 206
+374 979
+539 1321
+837 1108
+776 1081
+381 774
+420 754
+799 983
+636 1239
+863 1608
+531 563
+703 814
+229 958
+874 1208
+553 581
+589 1387
+607 920
+928 1917
+171 351
+571 1035
+528 1318
+168 442
diff --git a/geom_bottleneck/tests/data/test_875_B b/geom_bottleneck/tests/data/test_875_B
new file mode 100644
index 0000000..3a5860e
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_875_B
@@ -0,0 +1,100 @@
+380 1025
+918 1126
+119 483
+810 1668
+393 693
+545 1003
+682 862
+357 966
+429 955
+776 1227
+233 522
+559 599
+514 843
+682 906
+535 810
+924 1161
+222 371
+400 741
+561 943
+60 644
+810 1317
+470 1412
+756 1724
+235 1098
+995 1942
+244 776
+189 1011
+549 622
+193 816
+336 535
+232 1076
+614 1332
+38 1001
+764 1255
+337 763
+30 878
+949 1522
+719 741
+446 749
+400 1077
+309 310
+154 677
+458 1246
+476 541
+177 660
+676 1084
+426 968
+422 888
+243 255
+724 901
+994 1350
+623 1151
+387 452
+745 1263
+142 572
+198 388
+789 1416
+445 970
+245 494
+253 499
+401 582
+217 271
+528 1475
+170 850
+978 1681
+68 170
+381 1017
+39 298
+634 1443
+288 447
+867 1061
+24 477
+345 869
+674 1544
+645 1452
+698 723
+838 1195
+419 1214
+468 476
+620 1599
+898 1491
+416 1010
+431 921
+56 242
+867 1451
+759 1102
+396 1226
+559 1364
+212 743
+292 1289
+832 1536
+271 340
+990 1428
+287 1025
+364 839
+471 1138
+17 284
+953 1212
+421 841
+527 1382
diff --git a/geom_bottleneck/tests/data/test_876_A b/geom_bottleneck/tests/data/test_876_A
new file mode 100644
index 0000000..1b65f8d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_876_A
@@ -0,0 +1,100 @@
+466 895
+77 814
+639 1357
+475 1032
+941 1560
+527 749
+839 845
+96 619
+328 455
+385 828
+954 1817
+476 847
+240 463
+477 849
+965 1359
+238 991
+746 1597
+109 529
+567 616
+525 1224
+80 990
+984 1314
+591 1398
+801 1039
+237 332
+529 1232
+8 763
+665 1615
+823 1790
+746 1594
+875 1682
+302 1001
+486 840
+586 1174
+376 903
+782 1083
+680 993
+811 1136
+576 687
+330 1057
+892 963
+547 763
+17 869
+207 455
+162 612
+414 776
+446 498
+455 1151
+292 355
+240 541
+89 545
+672 1017
+375 783
+152 348
+347 525
+678 682
+538 1301
+569 1458
+624 946
+188 283
+300 456
+225 423
+925 1867
+312 600
+849 984
+148 300
+236 862
+336 806
+566 1280
+793 1411
+789 1666
+134 714
+660 1259
+870 1344
+329 1320
+136 684
+743 1016
+904 1005
+271 1059
+28 566
+482 1474
+278 614
+776 1361
+372 1174
+118 589
+793 906
+346 539
+860 892
+588 1255
+590 1394
+258 935
+452 861
+785 1525
+789 1745
+150 622
+720 1458
+486 1477
+937 1381
+317 1224
+37 301
diff --git a/geom_bottleneck/tests/data/test_876_B b/geom_bottleneck/tests/data/test_876_B
new file mode 100644
index 0000000..62102e9
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_876_B
@@ -0,0 +1,100 @@
+162 530
+694 1522
+850 1742
+293 471
+254 1094
+293 856
+392 411
+919 1673
+427 629
+116 390
+583 1089
+31 812
+270 769
+297 435
+933 1186
+625 741
+759 868
+632 749
+41 82
+138 528
+933 1746
+910 1135
+312 868
+955 1464
+208 1044
+84 368
+444 1114
+749 1643
+572 1339
+584 1330
+736 1483
+779 780
+459 473
+481 1392
+537 1402
+254 1114
+637 1366
+381 1339
+808 1517
+858 1513
+116 508
+102 675
+133 327
+283 1196
+126 910
+634 699
+253 1086
+75 1063
+93 247
+194 661
+848 1195
+690 1350
+816 1340
+821 1352
+387 569
+487 870
+160 1012
+483 1120
+916 1704
+519 975
+324 533
+791 1611
+128 1011
+477 741
+884 930
+773 1424
+904 1238
+252 1162
+730 750
+292 441
+747 1242
+525 1071
+373 1261
+706 1402
+877 1639
+848 1474
+652 884
+995 1061
+509 1496
+970 1168
+855 1167
+94 289
+759 1697
+153 239
+483 1315
+694 1110
+93 255
+564 1525
+632 1562
+218 1068
+548 1072
+167 906
+803 1710
+635 914
+923 1918
+99 633
+8 712
+138 565
+698 1179
+928 1611
diff --git a/geom_bottleneck/tests/data/test_877_A b/geom_bottleneck/tests/data/test_877_A
new file mode 100644
index 0000000..c60479b
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_877_A
@@ -0,0 +1,100 @@
+300 707
+123 319
+525 876
+685 1396
+289 961
+27 123
+884 1628
+982 1831
+634 1123
+383 831
+279 637
+349 474
+352 856
+253 1047
+431 679
+986 1871
+923 1654
+991 1073
+686 1337
+848 1810
+180 753
+423 529
+318 466
+356 742
+953 997
+861 865
+205 1200
+423 1141
+976 1485
+698 775
+445 1410
+83 322
+11 585
+384 468
+674 1121
+544 1216
+205 648
+474 745
+860 1595
+624 1216
+970 1721
+505 1397
+886 1137
+184 706
+817 1142
+781 1282
+299 965
+835 940
+954 1359
+304 502
+309 949
+347 441
+80 406
+804 910
+895 1394
+835 1328
+586 634
+790 1152
+884 1203
+252 899
+91 828
+501 968
+971 1076
+676 1214
+217 318
+932 1399
+404 451
+235 1091
+765 1022
+974 1189
+353 989
+828 1769
+948 1846
+914 1206
+589 1406
+551 1139
+317 367
+616 1284
+567 895
+229 528
+533 911
+514 1260
+905 1811
+421 863
+681 925
+252 1023
+365 573
+195 886
+169 710
+327 1311
+348 388
+26 56
+534 1014
+187 263
+927 1764
+3 29
+469 1008
+968 1729
+279 611
+944 1650
diff --git a/geom_bottleneck/tests/data/test_877_B b/geom_bottleneck/tests/data/test_877_B
new file mode 100644
index 0000000..728311d
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_877_B
@@ -0,0 +1,100 @@
+628 985
+787 1122
+361 604
+695 1462
+712 977
+294 738
+893 1223
+582 1579
+908 1112
+827 1451
+360 465
+273 375
+123 803
+853 1841
+381 948
+549 868
+34 995
+285 1076
+233 561
+232 1170
+663 1129
+17 34
+41 274
+881 1726
+551 1357
+193 916
+754 852
+384 1061
+745 1426
+954 1188
+950 1469
+493 565
+307 1174
+486 1222
+443 1433
+722 973
+912 1453
+973 1474
+398 1142
+85 779
+961 1952
+928 1842
+351 814
+147 519
+729 877
+26 60
+406 1082
+579 602
+893 1692
+837 1802
+306 457
+945 1792
+461 897
+794 894
+767 1178
+469 1423
+129 833
+251 563
+887 1856
+426 1380
+173 539
+398 1249
+890 1101
+40 864
+481 1123
+651 1126
+520 926
+885 1396
+791 896
+416 1283
+646 1571
+246 1002
+249 394
+650 1543
+378 1225
+918 1043
+58 188
+568 671
+256 796
+315 1143
+840 1449
+709 1260
+730 1655
+525 1409
+561 1149
+338 1162
+204 252
+935 1919
+438 1194
+727 1497
+876 1461
+920 1163
+19 767
+379 427
+953 1926
+912 1022
+423 584
+333 642
+726 1473
+421 1106
diff --git a/geom_bottleneck/tests/data/test_878_A b/geom_bottleneck/tests/data/test_878_A
new file mode 100644
index 0000000..c8d0724
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_878_A
@@ -0,0 +1,100 @@
+279 1254
+922 1250
+849 997
+144 505
+218 1071
+540 1361
+681 773
+572 1345
+827 848
+105 244
+299 1253
+172 784
+730 1315
+488 1249
+803 1175
+139 611
+910 1599
+387 1304
+851 1418
+392 1256
+642 655
+323 338
+594 802
+761 1161
+980 1822
+272 811
+385 474
+70 568
+518 1331
+528 1188
+138 465
+71 1033
+258 968
+242 319
+644 1125
+988 1292
+828 1367
+726 1657
+61 520
+734 1189
+142 615
+794 1276
+267 575
+738 1043
+653 753
+484 1337
+680 761
+963 972
+415 1343
+167 685
+93 861
+263 506
+609 829
+145 436
+302 484
+10 881
+431 603
+638 764
+723 1348
+470 581
+418 1249
+61 814
+992 1096
+776 1386
+406 842
+204 1047
+450 710
+639 765
+272 807
+932 1571
+982 1321
+559 770
+255 363
+648 1136
+668 1322
+332 588
+387 390
+309 737
+561 1463
+958 981
+359 1053
+994 1768
+243 381
+971 1245
+96 704
+353 1090
+589 1261
+46 789
+459 519
+262 425
+154 710
+870 1103
+30 653
+672 1521
+824 1677
+763 835
+143 753
+658 1168
+8 563
+971 1095
diff --git a/geom_bottleneck/tests/data/test_878_B b/geom_bottleneck/tests/data/test_878_B
new file mode 100644
index 0000000..32723ce
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_878_B
@@ -0,0 +1,100 @@
+284 785
+695 1555
+939 1668
+395 439
+587 754
+586 996
+831 1534
+296 1185
+379 1162
+243 923
+818 1623
+410 644
+43 356
+929 1429
+83 937
+885 1611
+427 526
+225 804
+717 1460
+30 590
+125 1119
+600 1356
+803 1729
+462 542
+225 785
+26 79
+780 1711
+372 1148
+113 547
+589 1288
+673 1638
+56 555
+569 1078
+687 1547
+201 777
+860 1372
+317 1268
+481 1465
+577 1347
+355 639
+199 560
+669 911
+64 1003
+654 1047
+254 700
+126 542
+418 1041
+242 1075
+642 1349
+476 1047
+614 1041
+365 507
+117 842
+147 929
+369 835
+138 1031
+177 707
+857 968
+803 821
+562 1007
+231 1021
+872 1803
+84 613
+315 562
+962 965
+648 1619
+425 574
+303 654
+766 1676
+17 975
+127 960
+439 645
+646 1215
+448 1375
+697 1654
+294 314
+151 661
+800 1084
+760 1457
+944 1538
+224 895
+309 355
+688 1059
+509 1108
+770 793
+884 947
+147 963
+708 1229
+398 816
+8 872
+617 1057
+642 1609
+558 1128
+409 705
+777 1406
+454 640
+882 1002
+391 1241
+609 1380
+455 863
diff --git a/geom_bottleneck/tests/data/test_879_A b/geom_bottleneck/tests/data/test_879_A
new file mode 100644
index 0000000..7a92be6
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_879_A
@@ -0,0 +1,100 @@
+939 1572
+712 1236
+114 128
+992 1777
+566 617
+460 1258
+681 1380
+716 832
+375 960
+912 1414
+63 1058
+943 1482
+278 690
+123 616
+31 641
+382 862
+962 1798
+709 1518
+190 487
+84 723
+419 515
+105 915
+184 641
+952 1441
+139 760
+462 879
+431 577
+502 1482
+252 1124
+166 413
+406 426
+40 921
+538 936
+850 1574
+64 139
+472 1374
+171 944
+81 128
+107 521
+426 855
+273 278
+139 208
+763 893
+623 973
+433 565
+353 915
+404 945
+981 1151
+200 894
+476 1268
+913 1287
+609 1592
+984 1462
+878 1037
+255 1113
+845 1766
+257 265
+550 1385
+753 1597
+412 1269
+251 1120
+167 851
+288 1117
+392 1279
+213 534
+623 987
+975 1806
+924 1066
+52 676
+822 974
+239 557
+679 1158
+268 524
+241 500
+281 401
+993 1711
+539 1414
+677 1108
+377 482
+315 845
+981 1605
+426 447
+479 1372
+820 1416
+916 1423
+677 1165
+388 1322
+990 1641
+909 914
+814 1225
+851 1151
+78 235
+635 1581
+229 431
+125 877
+708 1338
+763 1354
+877 1794
+225 1171
+232 435
diff --git a/geom_bottleneck/tests/data/test_879_B b/geom_bottleneck/tests/data/test_879_B
new file mode 100644
index 0000000..f4c4a36
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_879_B
@@ -0,0 +1,100 @@
+826 1808
+951 1166
+931 1147
+239 288
+607 762
+103 692
+78 132
+14 502
+666 982
+207 961
+303 690
+492 1135
+528 1499
+979 1576
+584 704
+921 1134
+874 1791
+51 789
+824 1574
+534 1078
+304 1104
+288 828
+445 1433
+492 788
+158 159
+374 863
+313 766
+716 1156
+540 624
+963 1803
+144 341
+415 1223
+314 501
+203 739
+674 1323
+604 705
+958 1738
+33 994
+179 1002
+23 278
+387 460
+857 1659
+563 865
+248 1032
+612 1147
+809 1802
+488 1003
+572 1525
+197 664
+120 648
+290 793
+475 1101
+97 479
+517 703
+843 1555
+292 482
+293 846
+969 1431
+525 552
+299 795
+543 1520
+685 1208
+689 1139
+564 1021
+478 969
+219 646
+361 718
+390 1038
+167 677
+968 1814
+663 1192
+446 1405
+337 1080
+403 564
+167 1159
+717 1483
+707 1224
+923 1698
+564 833
+988 1819
+48 300
+5 540
+252 378
+385 1039
+65 366
+473 1119
+369 989
+804 1501
+333 580
+321 1033
+693 1147
+291 408
+498 1244
+923 1204
+758 1214
+85 561
+550 647
+589 1155
+512 687
+110 459
diff --git a/geom_bottleneck/tests/data/test_list.txt b/geom_bottleneck/tests/data/test_list.txt
new file mode 100644
index 0000000..24b462a
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_list.txt
@@ -0,0 +1,792 @@
+test_001_A test_001_B 0.01 1 -1 0 0 -1
+test_002_A test_002_B 0.01 0.2 0 0
+test_003_A test_003_B 0.01 2 1 1
+test_004_A test_004_B 0.01 inf -1 -1
+test_005_A test_005_B 0.01 4 5 5
+test_008_A test_008_B 0.01 0.55 0 -1
+test_009_A test_009_B 0.01 0.55 0 -1
+test_010_A test_010_B 0.01 1.32937
+test_011_A test_011_B 0.01 1.03125
+test_014_A test_014_B 0.01 0
+test_015_A test_015_B 0.01 0
+test_016_A test_016_B 0.01 0
+test_100_A test_100_B 0.01 1.5
+test_101_A test_101_B 0.01 1.5
+test_102_A test_102_B 0.01 4.5
+test_103_A test_103_B 0.01 3
+test_104_A test_104_B 0.01 3.5
+test_105_A test_105_B 0.01 3.5
+test_106_A test_106_B 0.01 3
+test_107_A test_107_B 0.01 5
+test_108_A test_108_B 0.01 5
+test_109_A test_109_B 0.01 3
+test_110_A test_110_B 0.01 4.5
+test_111_A test_111_B 0.01 4
+test_112_A test_112_B 0.01 4
+test_113_A test_113_B 0.01 2.5
+test_114_A test_114_B 0.01 4.5
+test_115_A test_115_B 0.01 4
+test_116_A test_116_B 0.01 4
+test_117_A test_117_B 0.01 2.5
+test_118_A test_118_B 0.01 3
+test_119_A test_119_B 0.01 5
+test_120_A test_120_B 0.01 2
+test_121_A test_121_B 0.01 3
+test_122_A test_122_B 0.01 1
+test_123_A test_123_B 0.01 4
+test_124_A test_124_B 0.01 4
+test_125_A test_125_B 0.01 4.5
+test_126_A test_126_B 0.01 3
+test_127_A test_127_B 0.01 2.5
+test_128_A test_128_B 0.01 2
+test_129_A test_129_B 0.01 3
+test_130_A test_130_B 0.01 5
+test_131_A test_131_B 0.01 5
+test_132_A test_132_B 0.01 2
+test_133_A test_133_B 0.01 3
+test_134_A test_134_B 0.01 3
+test_135_A test_135_B 0.01 4
+test_136_A test_136_B 0.01 2
+test_137_A test_137_B 0.01 3
+test_138_A test_138_B 0.01 2
+test_139_A test_139_B 0.01 2.5
+test_140_A test_140_B 0.01 2
+test_141_A test_141_B 0.01 4
+test_142_A test_142_B 0.01 3
+test_143_A test_143_B 0.01 4
+test_144_A test_144_B 0.01 3
+test_145_A test_145_B 0.01 4
+test_146_A test_146_B 0.01 3
+test_147_A test_147_B 0.01 4
+test_148_A test_148_B 0.01 3
+test_149_A test_149_B 0.01 4
+test_150_A test_150_B 0.01 3
+test_151_A test_151_B 0.01 4
+test_152_A test_152_B 0.01 3.5
+test_153_A test_153_B 0.01 4
+test_154_A test_154_B 0.01 3.5
+test_155_A test_155_B 0.01 3
+test_156_A test_156_B 0.01 3
+test_157_A test_157_B 0.01 4.5
+test_158_A test_158_B 0.01 3.5
+test_159_A test_159_B 0.01 1
+test_160_A test_160_B 0.01 4
+test_161_A test_161_B 0.01 4
+test_162_A test_162_B 0.01 3
+test_163_A test_163_B 0.01 5
+test_164_A test_164_B 0.01 4
+test_165_A test_165_B 0.01 4
+test_166_A test_166_B 0.01 4
+test_167_A test_167_B 0.01 4.5
+test_168_A test_168_B 0.01 4
+test_169_A test_169_B 0.01 3.5
+test_170_A test_170_B 0.01 4
+test_171_A test_171_B 0.01 2
+test_172_A test_172_B 0.01 3
+test_173_A test_173_B 0.01 4
+test_174_A test_174_B 0.01 3
+test_175_A test_175_B 0.01 5
+test_176_A test_176_B 0.01 4.5
+test_177_A test_177_B 0.01 4.5
+test_178_A test_178_B 0.01 4.5
+test_179_A test_179_B 0.01 4
+test_180_A test_180_B 0.01 5
+test_181_A test_181_B 0.01 4
+test_182_A test_182_B 0.01 4.5
+test_183_A test_183_B 0.01 5
+test_184_A test_184_B 0.01 4
+test_185_A test_185_B 0.01 4.5
+test_186_A test_186_B 0.01 3
+test_187_A test_187_B 0.01 4.5
+test_188_A test_188_B 0.01 3
+test_189_A test_189_B 0.01 2
+test_190_A test_190_B 0.01 3
+test_191_A test_191_B 0.01 3
+test_192_A test_192_B 0.01 3.5
+test_193_A test_193_B 0.01 4.5
+test_194_A test_194_B 0.01 3
+test_195_A test_195_B 0.01 3
+test_196_A test_196_B 0.01 3
+test_197_A test_197_B 0.01 3
+test_198_A test_198_B 0.01 5
+test_199_A test_199_B 0.01 3.5
+test_200_A test_200_B 0.01 3
+test_201_A test_201_B 0.01 5
+test_202_A test_202_B 0.01 3
+test_203_A test_203_B 0.01 4
+test_204_A test_204_B 0.01 2.5
+test_205_A test_205_B 0.01 4
+test_206_A test_206_B 0.01 3.5
+test_207_A test_207_B 0.01 3
+test_208_A test_208_B 0.01 4
+test_209_A test_209_B 0.01 3
+test_210_A test_210_B 0.01 5
+test_211_A test_211_B 0.01 3
+test_212_A test_212_B 0.01 3
+test_213_A test_213_B 0.01 3.5
+test_214_A test_214_B 0.01 4
+test_215_A test_215_B 0.01 3
+test_216_A test_216_B 0.01 3.5
+test_217_A test_217_B 0.01 4
+test_218_A test_218_B 0.01 4
+test_219_A test_219_B 0.01 4
+test_220_A test_220_B 0.01 3
+test_221_A test_221_B 0.01 4
+test_222_A test_222_B 0.01 4
+test_223_A test_223_B 0.01 4
+test_224_A test_224_B 0.01 3
+test_225_A test_225_B 0.01 3
+test_226_A test_226_B 0.01 4
+test_227_A test_227_B 0.01 4
+test_228_A test_228_B 0.01 4
+test_229_A test_229_B 0.01 3
+test_230_A test_230_B 0.01 3
+test_231_A test_231_B 0.01 4
+test_232_A test_232_B 0.01 4
+test_233_A test_233_B 0.01 2
+test_234_A test_234_B 0.01 3.5
+test_235_A test_235_B 0.01 4
+test_236_A test_236_B 0.01 3
+test_237_A test_237_B 0.01 3.5
+test_238_A test_238_B 0.01 4
+test_239_A test_239_B 0.01 3
+test_240_A test_240_B 0.01 3
+test_241_A test_241_B 0.01 5
+test_242_A test_242_B 0.01 4.5
+test_243_A test_243_B 0.01 4
+test_244_A test_244_B 0.01 3.5
+test_245_A test_245_B 0.01 5
+test_246_A test_246_B 0.01 2.5
+test_247_A test_247_B 0.01 3
+test_248_A test_248_B 0.01 4
+test_249_A test_249_B 0.01 2
+test_250_A test_250_B 0.01 5
+test_251_A test_251_B 0.01 4
+test_252_A test_252_B 0.01 4
+test_253_A test_253_B 0.01 4.5
+test_254_A test_254_B 0.01 4
+test_255_A test_255_B 0.01 3
+test_256_A test_256_B 0.01 4.5
+test_257_A test_257_B 0.01 4
+test_258_A test_258_B 0.01 5
+test_259_A test_259_B 0.01 4
+test_260_A test_260_B 0.01 4
+test_261_A test_261_B 0.01 2.5
+test_262_A test_262_B 0.01 2
+test_263_A test_263_B 0.01 4.5
+test_264_A test_264_B 0.01 3.5
+test_265_A test_265_B 0.01 4
+test_266_A test_266_B 0.01 3
+test_267_A test_267_B 0.01 5
+test_268_A test_268_B 0.01 4
+test_269_A test_269_B 0.01 4
+test_270_A test_270_B 0.01 3
+test_271_A test_271_B 0.01 4
+test_272_A test_272_B 0.01 4
+test_273_A test_273_B 0.01 2
+test_274_A test_274_B 0.01 3
+test_275_A test_275_B 0.01 3
+test_276_A test_276_B 0.01 4
+test_277_A test_277_B 0.01 5
+test_278_A test_278_B 0.01 4
+test_279_A test_279_B 0.01 4.5
+test_280_A test_280_B 0.01 3.5
+test_281_A test_281_B 0.01 2
+test_282_A test_282_B 0.01 3
+test_283_A test_283_B 0.01 3
+test_284_A test_284_B 0.01 3
+test_285_A test_285_B 0.01 3
+test_286_A test_286_B 0.01 3
+test_287_A test_287_B 0.01 3.5
+test_288_A test_288_B 0.01 3
+test_289_A test_289_B 0.01 2
+test_290_A test_290_B 0.01 4
+test_291_A test_291_B 0.01 3
+test_292_A test_292_B 0.01 4
+test_293_A test_293_B 0.01 2.5
+test_294_A test_294_B 0.01 4
+test_295_A test_295_B 0.01 3.5
+test_296_A test_296_B 0.01 3
+test_297_A test_297_B 0.01 3
+test_298_A test_298_B 0.01 4
+test_299_A test_299_B 0.01 4
+test_300_A test_300_B 0.01 3
+test_301_A test_301_B 0.01 2
+test_302_A test_302_B 0.01 2
+test_303_A test_303_B 0.01 3
+test_304_A test_304_B 0.01 3
+test_305_A test_305_B 0.01 3
+test_306_A test_306_B 0.01 3
+test_307_A test_307_B 0.01 2
+test_308_A test_308_B 0.01 3
+test_309_A test_309_B 0.01 2.5
+test_310_A test_310_B 0.01 4
+test_311_A test_311_B 0.01 3
+test_312_A test_312_B 0.01 3.5
+test_313_A test_313_B 0.01 3
+test_314_A test_314_B 0.01 2
+test_315_A test_315_B 0.01 3
+test_316_A test_316_B 0.01 4.5
+test_317_A test_317_B 0.01 3
+test_318_A test_318_B 0.01 3
+test_319_A test_319_B 0.01 3
+test_320_A test_320_B 0.01 4
+test_321_A test_321_B 0.01 2
+test_322_A test_322_B 0.01 3
+test_323_A test_323_B 0.01 3
+test_324_A test_324_B 0.01 2
+test_325_A test_325_B 0.01 3
+test_326_A test_326_B 0.01 2
+test_327_A test_327_B 0.01 3
+test_328_A test_328_B 0.01 3
+test_329_A test_329_B 0.01 4
+test_330_A test_330_B 0.01 3
+test_331_A test_331_B 0.01 3
+test_332_A test_332_B 0.01 2
+test_333_A test_333_B 0.01 2
+test_334_A test_334_B 0.01 3
+test_335_A test_335_B 0.01 2
+test_336_A test_336_B 0.01 3
+test_337_A test_337_B 0.01 2
+test_338_A test_338_B 0.01 2
+test_339_A test_339_B 0.01 2
+test_340_A test_340_B 0.01 1
+test_341_A test_341_B 0.01 2
+test_342_A test_342_B 0.01 2
+test_343_A test_343_B 0.01 2
+test_344_A test_344_B 0.01 2
+test_345_A test_345_B 0.01 2
+test_346_A test_346_B 0.01 2
+test_347_A test_347_B 0.01 2
+test_348_A test_348_B 0.01 2
+test_349_A test_349_B 0.01 2
+test_350_A test_350_B 0.01 2
+test_351_A test_351_B 0.01 2
+test_352_A test_352_B 0.01 2
+test_353_A test_353_B 0.01 2.5
+test_354_A test_354_B 0.01 2
+test_355_A test_355_B 0.01 2
+test_356_A test_356_B 0.01 2
+test_357_A test_357_B 0.01 2
+test_358_A test_358_B 0.01 2
+test_359_A test_359_B 0.01 2
+test_360_A test_360_B 0.01 32
+test_361_A test_361_B 0.01 8
+test_362_A test_362_B 0.01 29.5
+test_363_A test_363_B 0.01 41
+test_364_A test_364_B 0.01 41.5
+test_365_A test_365_B 0.01 27.5
+test_366_A test_366_B 0.01 46
+test_367_A test_367_B 0.01 37.5
+test_368_A test_368_B 0.01 27
+test_369_A test_369_B 0.01 42
+test_370_A test_370_B 0.01 45.5
+test_371_A test_371_B 0.01 34
+test_372_A test_372_B 0.01 19.5
+test_373_A test_373_B 0.01 24
+test_374_A test_374_B 0.01 10
+test_375_A test_375_B 0.01 17.5
+test_376_A test_376_B 0.01 28.5
+test_377_A test_377_B 0.01 40
+test_378_A test_378_B 0.01 40
+test_379_A test_379_B 0.01 24.5
+test_380_A test_380_B 0.01 36
+test_381_A test_381_B 0.01 38
+test_382_A test_382_B 0.01 48
+test_383_A test_383_B 0.01 32.5
+test_384_A test_384_B 0.01 44
+test_385_A test_385_B 0.01 44.5
+test_386_A test_386_B 0.01 11
+test_387_A test_387_B 0.01 47.5
+test_388_A test_388_B 0.01 28
+test_389_A test_389_B 0.01 32
+test_390_A test_390_B 0.01 24.5
+test_391_A test_391_B 0.01 47
+test_392_A test_392_B 0.01 28
+test_393_A test_393_B 0.01 16
+test_394_A test_394_B 0.01 44
+test_395_A test_395_B 0.01 38
+test_396_A test_396_B 0.01 47.5
+test_397_A test_397_B 0.01 35
+test_398_A test_398_B 0.01 33
+test_399_A test_399_B 0.01 33
+test_400_A test_400_B 0.01 31
+test_401_A test_401_B 0.01 48
+test_402_A test_402_B 0.01 37.5
+test_403_A test_403_B 0.01 40
+test_404_A test_404_B 0.01 47
+test_405_A test_405_B 0.01 23
+test_406_A test_406_B 0.01 40
+test_407_A test_407_B 0.01 46
+test_408_A test_408_B 0.01 39
+test_409_A test_409_B 0.01 26
+test_410_A test_410_B 0.01 28
+test_411_A test_411_B 0.01 27
+test_412_A test_412_B 0.01 33
+test_413_A test_413_B 0.01 36
+test_414_A test_414_B 0.01 42.5
+test_415_A test_415_B 0.01 40
+test_416_A test_416_B 0.01 37
+test_417_A test_417_B 0.01 43
+test_418_A test_418_B 0.01 16
+test_419_A test_419_B 0.01 34
+test_420_A test_420_B 0.01 42.5
+test_421_A test_421_B 0.01 38
+test_422_A test_422_B 0.01 30
+test_423_A test_423_B 0.01 44
+test_424_A test_424_B 0.01 46
+test_425_A test_425_B 0.01 38
+test_426_A test_426_B 0.01 35.5
+test_427_A test_427_B 0.01 29
+test_428_A test_428_B 0.01 43.5
+test_429_A test_429_B 0.01 34
+test_430_A test_430_B 0.01 48
+test_431_A test_431_B 0.01 41
+test_432_A test_432_B 0.01 35
+test_433_A test_433_B 0.01 32
+test_434_A test_434_B 0.01 36
+test_435_A test_435_B 0.01 43.5
+test_436_A test_436_B 0.01 32.5
+test_437_A test_437_B 0.01 40
+test_438_A test_438_B 0.01 34
+test_439_A test_439_B 0.01 31.5
+test_440_A test_440_B 0.01 26.5
+test_441_A test_441_B 0.01 49.5
+test_442_A test_442_B 0.01 30
+test_443_A test_443_B 0.01 29
+test_444_A test_444_B 0.01 29
+test_445_A test_445_B 0.01 48
+test_446_A test_446_B 0.01 35
+test_447_A test_447_B 0.01 43
+test_448_A test_448_B 0.01 19
+test_449_A test_449_B 0.01 34
+test_450_A test_450_B 0.01 44
+test_451_A test_451_B 0.01 36
+test_452_A test_452_B 0.01 32
+test_453_A test_453_B 0.01 49
+test_454_A test_454_B 0.01 48.5
+test_455_A test_455_B 0.01 46
+test_456_A test_456_B 0.01 33.5
+test_457_A test_457_B 0.01 49.5
+test_458_A test_458_B 0.01 38
+test_459_A test_459_B 0.01 21
+test_460_A test_460_B 0.01 40
+test_461_A test_461_B 0.01 32
+test_462_A test_462_B 0.01 37
+test_463_A test_463_B 0.01 23
+test_464_A test_464_B 0.01 19
+test_465_A test_465_B 0.01 29
+test_466_A test_466_B 0.01 38
+test_467_A test_467_B 0.01 29
+test_468_A test_468_B 0.01 45
+test_469_A test_469_B 0.01 27.5
+test_470_A test_470_B 0.01 43
+test_471_A test_471_B 0.01 24.5
+test_472_A test_472_B 0.01 42
+test_473_A test_473_B 0.01 36.5
+test_474_A test_474_B 0.01 46.5
+test_475_A test_475_B 0.01 18
+test_476_A test_476_B 0.01 29
+test_477_A test_477_B 0.01 44
+test_478_A test_478_B 0.01 49
+test_479_A test_479_B 0.01 33
+test_480_A test_480_B 0.01 43
+test_481_A test_481_B 0.01 42
+test_482_A test_482_B 0.01 31
+test_483_A test_483_B 0.01 37
+test_484_A test_484_B 0.01 25
+test_485_A test_485_B 0.01 33
+test_486_A test_486_B 0.01 35
+test_487_A test_487_B 0.01 39
+test_488_A test_488_B 0.01 26.5
+test_489_A test_489_B 0.01 39.5
+test_490_A test_490_B 0.01 26
+test_491_A test_491_B 0.01 45
+test_492_A test_492_B 0.01 21
+test_493_A test_493_B 0.01 37
+test_494_A test_494_B 0.01 50
+test_495_A test_495_B 0.01 41
+test_496_A test_496_B 0.01 34
+test_497_A test_497_B 0.01 35
+test_498_A test_498_B 0.01 34
+test_499_A test_499_B 0.01 30
+test_500_A test_500_B 0.01 39
+test_501_A test_501_B 0.01 36
+test_502_A test_502_B 0.01 36
+test_503_A test_503_B 0.01 49.5
+test_504_A test_504_B 0.01 40.5
+test_505_A test_505_B 0.01 29
+test_506_A test_506_B 0.01 33
+test_507_A test_507_B 0.01 38
+test_508_A test_508_B 0.01 21.5
+test_509_A test_509_B 0.01 27
+test_510_A test_510_B 0.01 43
+test_511_A test_511_B 0.01 34
+test_512_A test_512_B 0.01 25.5
+test_513_A test_513_B 0.01 19
+test_514_A test_514_B 0.01 28
+test_515_A test_515_B 0.01 41.5
+test_516_A test_516_B 0.01 46
+test_517_A test_517_B 0.01 34
+test_518_A test_518_B 0.01 33
+test_519_A test_519_B 0.01 37.5
+test_520_A test_520_B 0.01 37
+test_521_A test_521_B 0.01 42.5
+test_522_A test_522_B 0.01 44
+test_523_A test_523_B 0.01 36.5
+test_524_A test_524_B 0.01 40
+test_525_A test_525_B 0.01 36.5
+test_526_A test_526_B 0.01 24
+test_527_A test_527_B 0.01 34
+test_528_A test_528_B 0.01 23.5
+test_529_A test_529_B 0.01 30
+test_530_A test_530_B 0.01 50
+test_531_A test_531_B 0.01 33
+test_532_A test_532_B 0.01 36
+test_533_A test_533_B 0.01 24
+test_534_A test_534_B 0.01 46.5
+test_535_A test_535_B 0.01 39
+test_536_A test_536_B 0.01 26
+test_537_A test_537_B 0.01 30
+test_538_A test_538_B 0.01 27.5
+test_539_A test_539_B 0.01 26
+test_540_A test_540_B 0.01 23
+test_541_A test_541_B 0.01 26.5
+test_542_A test_542_B 0.01 40.5
+test_543_A test_543_B 0.01 41
+test_544_A test_544_B 0.01 46
+test_545_A test_545_B 0.01 33
+test_546_A test_546_B 0.01 38
+test_547_A test_547_B 0.01 33
+test_548_A test_548_B 0.01 28
+test_549_A test_549_B 0.01 29
+test_550_A test_550_B 0.01 33
+test_551_A test_551_B 0.01 20
+test_552_A test_552_B 0.01 27
+test_553_A test_553_B 0.01 21.5
+test_554_A test_554_B 0.01 28
+test_555_A test_555_B 0.01 31
+test_556_A test_556_B 0.01 31
+test_557_A test_557_B 0.01 30
+test_558_A test_558_B 0.01 29
+test_559_A test_559_B 0.01 30
+test_560_A test_560_B 0.01 21
+test_561_A test_561_B 0.01 37.5
+test_562_A test_562_B 0.01 40
+test_563_A test_563_B 0.01 25
+test_564_A test_564_B 0.01 22
+test_565_A test_565_B 0.01 24
+test_566_A test_566_B 0.01 39
+test_567_A test_567_B 0.01 27
+test_568_A test_568_B 0.01 30
+test_569_A test_569_B 0.01 35
+test_570_A test_570_B 0.01 29
+test_571_A test_571_B 0.01 27
+test_572_A test_572_B 0.01 23
+test_573_A test_573_B 0.01 34
+test_574_A test_574_B 0.01 26
+test_575_A test_575_B 0.01 28
+test_576_A test_576_B 0.01 22
+test_577_A test_577_B 0.01 29
+test_578_A test_578_B 0.01 24
+test_579_A test_579_B 0.01 22
+test_580_A test_580_B 0.01 31
+test_581_A test_581_B 0.01 39
+test_582_A test_582_B 0.01 21
+test_583_A test_583_B 0.01 32
+test_584_A test_584_B 0.01 22
+test_585_A test_585_B 0.01 26
+test_586_A test_586_B 0.01 20
+test_587_A test_587_B 0.01 28
+test_588_A test_588_B 0.01 22
+test_589_A test_589_B 0.01 20
+test_590_A test_590_B 0.01 17
+test_591_A test_591_B 0.01 24
+test_592_A test_592_B 0.01 27.5
+test_593_A test_593_B 0.01 31
+test_594_A test_594_B 0.01 18
+test_595_A test_595_B 0.01 18
+test_596_A test_596_B 0.01 32
+test_597_A test_597_B 0.01 17
+test_598_A test_598_B 0.01 19
+test_599_A test_599_B 0.01 23
+test_600_A test_600_B 0.01 16
+test_601_A test_601_B 0.01 13
+test_602_A test_602_B 0.01 25
+test_603_A test_603_B 0.01 17
+test_604_A test_604_B 0.01 18
+test_605_A test_605_B 0.01 20
+test_606_A test_606_B 0.01 16
+test_607_A test_607_B 0.01 19
+test_608_A test_608_B 0.01 22
+test_609_A test_609_B 0.01 18
+test_610_A test_610_B 0.01 22
+test_611_A test_611_B 0.01 18
+test_612_A test_612_B 0.01 21
+test_613_A test_613_B 0.01 23
+test_614_A test_614_B 0.01 14
+test_615_A test_615_B 0.01 21
+test_616_A test_616_B 0.01 20
+test_617_A test_617_B 0.01 17
+test_618_A test_618_B 0.01 15
+test_619_A test_619_B 0.01 18
+test_620_A test_620_B 0.01 346.5
+test_621_A test_621_B 0.01 414
+test_622_A test_622_B 0.01 321
+test_623_A test_623_B 0.01 428
+test_624_A test_624_B 0.01 137.5
+test_625_A test_625_B 0.01 272
+test_626_A test_626_B 0.01 257
+test_627_A test_627_B 0.01 261
+test_628_A test_628_B 0.01 480.5
+test_629_A test_629_B 0.01 378
+test_630_A test_630_B 0.01 153.5
+test_631_A test_631_B 0.01 199
+test_632_A test_632_B 0.01 457
+test_633_A test_633_B 0.01 358.5
+test_634_A test_634_B 0.01 357
+test_635_A test_635_B 0.01 216
+test_636_A test_636_B 0.01 460.5
+test_637_A test_637_B 0.01 314
+test_638_A test_638_B 0.01 322
+test_639_A test_639_B 0.01 440.5
+test_640_A test_640_B 0.01 324
+test_641_A test_641_B 0.01 265
+test_642_A test_642_B 0.01 395.5
+test_643_A test_643_B 0.01 397
+test_644_A test_644_B 0.01 308
+test_645_A test_645_B 0.01 199
+test_646_A test_646_B 0.01 256.5
+test_647_A test_647_B 0.01 293
+test_648_A test_648_B 0.01 297
+test_649_A test_649_B 0.01 410.5
+test_650_A test_650_B 0.01 322
+test_651_A test_651_B 0.01 458
+test_652_A test_652_B 0.01 420.5
+test_653_A test_653_B 0.01 235
+test_654_A test_654_B 0.01 220
+test_655_A test_655_B 0.01 257
+test_656_A test_656_B 0.01 305
+test_657_A test_657_B 0.01 230.5
+test_658_A test_658_B 0.01 500
+test_659_A test_659_B 0.01 155
+test_660_A test_660_B 0.01 418
+test_661_A test_661_B 0.01 403.5
+test_662_A test_662_B 0.01 296
+test_663_A test_663_B 0.01 297.5
+test_664_A test_664_B 0.01 219
+test_665_A test_665_B 0.01 476.5
+test_666_A test_666_B 0.01 347
+test_667_A test_667_B 0.01 284
+test_668_A test_668_B 0.01 324.5
+test_669_A test_669_B 0.01 231
+test_670_A test_670_B 0.01 410
+test_671_A test_671_B 0.01 206
+test_672_A test_672_B 0.01 266
+test_673_A test_673_B 0.01 319.5
+test_674_A test_674_B 0.01 483
+test_675_A test_675_B 0.01 355.5
+test_676_A test_676_B 0.01 316.5
+test_677_A test_677_B 0.01 297
+test_678_A test_678_B 0.01 458
+test_679_A test_679_B 0.01 398.5
+test_680_A test_680_B 0.01 371.5
+test_681_A test_681_B 0.01 338
+test_682_A test_682_B 0.01 461
+test_683_A test_683_B 0.01 298.5
+test_684_A test_684_B 0.01 303.5
+test_685_A test_685_B 0.01 265
+test_686_A test_686_B 0.01 400.5
+test_687_A test_687_B 0.01 264
+test_688_A test_688_B 0.01 303
+test_689_A test_689_B 0.01 360
+test_690_A test_690_B 0.01 325
+test_691_A test_691_B 0.01 217
+test_692_A test_692_B 0.01 313
+test_693_A test_693_B 0.01 491
+test_694_A test_694_B 0.01 367.5
+test_695_A test_695_B 0.01 285
+test_696_A test_696_B 0.01 314
+test_697_A test_697_B 0.01 379
+test_698_A test_698_B 0.01 277.5
+test_699_A test_699_B 0.01 302
+test_700_A test_700_B 0.01 299
+test_701_A test_701_B 0.01 439.5
+test_702_A test_702_B 0.01 289
+test_703_A test_703_B 0.01 460.5
+test_704_A test_704_B 0.01 210
+test_705_A test_705_B 0.01 491
+test_706_A test_706_B 0.01 438.5
+test_707_A test_707_B 0.01 323
+test_708_A test_708_B 0.01 427
+test_709_A test_709_B 0.01 364
+test_710_A test_710_B 0.01 434
+test_711_A test_711_B 0.01 434
+test_712_A test_712_B 0.01 391
+test_713_A test_713_B 0.01 356
+test_714_A test_714_B 0.01 420
+test_715_A test_715_B 0.01 354
+test_716_A test_716_B 0.01 281
+test_717_A test_717_B 0.01 359.5
+test_718_A test_718_B 0.01 345
+test_719_A test_719_B 0.01 341.5
+test_720_A test_720_B 0.01 497.5
+test_721_A test_721_B 0.01 199
+test_722_A test_722_B 0.01 452
+test_723_A test_723_B 0.01 335.5
+test_724_A test_724_B 0.01 311
+test_725_A test_725_B 0.01 336
+test_726_A test_726_B 0.01 300
+test_727_A test_727_B 0.01 317
+test_728_A test_728_B 0.01 492
+test_729_A test_729_B 0.01 304
+test_730_A test_730_B 0.01 217
+test_731_A test_731_B 0.01 322
+test_732_A test_732_B 0.01 289
+test_733_A test_733_B 0.01 182
+test_734_A test_734_B 0.01 410.5
+test_735_A test_735_B 0.01 306
+test_736_A test_736_B 0.01 294
+test_737_A test_737_B 0.01 254
+test_738_A test_738_B 0.01 338.5
+test_739_A test_739_B 0.01 225
+test_740_A test_740_B 0.01 280
+test_741_A test_741_B 0.01 454
+test_742_A test_742_B 0.01 226
+test_743_A test_743_B 0.01 365
+test_744_A test_744_B 0.01 456
+test_745_A test_745_B 0.01 405
+test_746_A test_746_B 0.01 322
+test_747_A test_747_B 0.01 279
+test_748_A test_748_B 0.01 311.5
+test_749_A test_749_B 0.01 308
+test_750_A test_750_B 0.01 322
+test_751_A test_751_B 0.01 409
+test_752_A test_752_B 0.01 277
+test_753_A test_753_B 0.01 318
+test_754_A test_754_B 0.01 299.5
+test_755_A test_755_B 0.01 462.5
+test_756_A test_756_B 0.01 314
+test_757_A test_757_B 0.01 300
+test_758_A test_758_B 0.01 455
+test_759_A test_759_B 0.01 422.5
+test_760_A test_760_B 0.01 433.5
+test_761_A test_761_B 0.01 278
+test_762_A test_762_B 0.01 484.5
+test_763_A test_763_B 0.01 348
+test_764_A test_764_B 0.01 491
+test_765_A test_765_B 0.01 280
+test_766_A test_766_B 0.01 259
+test_767_A test_767_B 0.01 275.5
+test_768_A test_768_B 0.01 348
+test_769_A test_769_B 0.01 330
+test_770_A test_770_B 0.01 412
+test_771_A test_771_B 0.01 262
+test_772_A test_772_B 0.01 455
+test_773_A test_773_B 0.01 294
+test_774_A test_774_B 0.01 425
+test_775_A test_775_B 0.01 220.5
+test_776_A test_776_B 0.01 411.5
+test_777_A test_777_B 0.01 383
+test_778_A test_778_B 0.01 363
+test_779_A test_779_B 0.01 302
+test_780_A test_780_B 0.01 328
+test_781_A test_781_B 0.01 294
+test_782_A test_782_B 0.01 407.5
+test_783_A test_783_B 0.01 260.5
+test_784_A test_784_B 0.01 410
+test_785_A test_785_B 0.01 328
+test_786_A test_786_B 0.01 419.5
+test_787_A test_787_B 0.01 165
+test_788_A test_788_B 0.01 389
+test_789_A test_789_B 0.01 254
+test_790_A test_790_B 0.01 311
+test_791_A test_791_B 0.01 258
+test_792_A test_792_B 0.01 331
+test_793_A test_793_B 0.01 378
+test_794_A test_794_B 0.01 415
+test_795_A test_795_B 0.01 364
+test_796_A test_796_B 0.01 279
+test_797_A test_797_B 0.01 249
+test_798_A test_798_B 0.01 463
+test_799_A test_799_B 0.01 304
+test_800_A test_800_B 0.01 187
+test_801_A test_801_B 0.01 305.5
+test_802_A test_802_B 0.01 385
+test_803_A test_803_B 0.01 360.5
+test_804_A test_804_B 0.01 269
+test_805_A test_805_B 0.01 294
+test_806_A test_806_B 0.01 362
+test_807_A test_807_B 0.01 354
+test_808_A test_808_B 0.01 196
+test_809_A test_809_B 0.01 248
+test_810_A test_810_B 0.01 297.5
+test_811_A test_811_B 0.01 243
+test_812_A test_812_B 0.01 312
+test_813_A test_813_B 0.01 241
+test_814_A test_814_B 0.01 384
+test_815_A test_815_B 0.01 250
+test_816_A test_816_B 0.01 205
+test_817_A test_817_B 0.01 308
+test_818_A test_818_B 0.01 356
+test_819_A test_819_B 0.01 230
+test_820_A test_820_B 0.01 178
+test_821_A test_821_B 0.01 294
+test_822_A test_822_B 0.01 227
+test_823_A test_823_B 0.01 234
+test_824_A test_824_B 0.01 241
+test_825_A test_825_B 0.01 233
+test_826_A test_826_B 0.01 284
+test_827_A test_827_B 0.01 287
+test_828_A test_828_B 0.01 192
+test_829_A test_829_B 0.01 359
+test_830_A test_830_B 0.01 225
+test_831_A test_831_B 0.01 273
+test_832_A test_832_B 0.01 248
+test_833_A test_833_B 0.01 217
+test_834_A test_834_B 0.01 332
+test_835_A test_835_B 0.01 218
+test_836_A test_836_B 0.01 335
+test_837_A test_837_B 0.01 192
+test_838_A test_838_B 0.01 188
+test_839_A test_839_B 0.01 347
+test_840_A test_840_B 0.01 273
+test_841_A test_841_B 0.01 187
+test_842_A test_842_B 0.01 170
+test_843_A test_843_B 0.01 230
+test_844_A test_844_B 0.01 206.5
+test_845_A test_845_B 0.01 177
+test_846_A test_846_B 0.01 251
+test_847_A test_847_B 0.01 163
+test_848_A test_848_B 0.01 174
+test_849_A test_849_B 0.01 177
+test_850_A test_850_B 0.01 252
+test_851_A test_851_B 0.01 262
+test_852_A test_852_B 0.01 174
+test_853_A test_853_B 0.01 169
+test_854_A test_854_B 0.01 200
+test_855_A test_855_B 0.01 189
+test_856_A test_856_B 0.01 206.5
+test_857_A test_857_B 0.01 260
+test_858_A test_858_B 0.01 191
+test_859_A test_859_B 0.01 216
+test_860_A test_860_B 0.01 181.5
+test_861_A test_861_B 0.01 219
+test_862_A test_862_B 0.01 143
+test_863_A test_863_B 0.01 173
+test_864_A test_864_B 0.01 134
+test_865_A test_865_B 0.01 159
+test_866_A test_866_B 0.01 205
+test_867_A test_867_B 0.01 178
+test_868_A test_868_B 0.01 189.5
+test_869_A test_869_B 0.01 145
+test_870_A test_870_B 0.01 179
+test_871_A test_871_B 0.01 167
+test_872_A test_872_B 0.01 149
+test_873_A test_873_B 0.01 149
+test_874_A test_874_B 0.01 187
+test_875_A test_875_B 0.01 193
+test_876_A test_876_B 0.01 165
+test_877_A test_877_B 0.01 190
+test_878_A test_878_B 0.01 242
+test_879_A test_879_B 0.01 187
diff --git a/geom_bottleneck/tests/data/test_list.txt.bak b/geom_bottleneck/tests/data/test_list.txt.bak
new file mode 100644
index 0000000..71b89ed
--- /dev/null
+++ b/geom_bottleneck/tests/data/test_list.txt.bak
@@ -0,0 +1,792 @@
+test_001_A test_001_B 0.01 1 -1 0 0 -1
+test_002_A test_002_B 0.01 0.2 0 0
+test_003_A test_003_B 0.01 2 1 1
+test_004_A test_004_B 0.01 inf -1 -1
+test_005_A test_005_B 0.01 4 5 5
+test_010_A test_010_B 0.01 1.32937
+test_011_A test_011_B 0.01 1.03125
+test_012_A test_012_B 0.01 0.56679
+test_013_A test_013_B 0.01 1.26332
+test_014_A test_014_B 0.01 0
+test_015_A test_015_B 0.01 0
+test_016_A test_016_B 0.01 0
+test_100_A test_100_B 0.01 1.5
+test_101_A test_101_B 0.01 1.5
+test_102_A test_102_B 0.01 4.5
+test_103_A test_103_B 0.01 3
+test_104_A test_104_B 0.01 3.5
+test_105_A test_105_B 0.01 3.5
+test_106_A test_106_B 0.01 3
+test_107_A test_107_B 0.01 5
+test_108_A test_108_B 0.01 5
+test_109_A test_109_B 0.01 3
+test_110_A test_110_B 0.01 4.5
+test_111_A test_111_B 0.01 4
+test_112_A test_112_B 0.01 4
+test_113_A test_113_B 0.01 2.5
+test_114_A test_114_B 0.01 4.5
+test_115_A test_115_B 0.01 4
+test_116_A test_116_B 0.01 4
+test_117_A test_117_B 0.01 2.5
+test_118_A test_118_B 0.01 3
+test_119_A test_119_B 0.01 5
+test_120_A test_120_B 0.01 2
+test_121_A test_121_B 0.01 3
+test_122_A test_122_B 0.01 1
+test_123_A test_123_B 0.01 4
+test_124_A test_124_B 0.01 4
+test_125_A test_125_B 0.01 4.5
+test_126_A test_126_B 0.01 3
+test_127_A test_127_B 0.01 2.5
+test_128_A test_128_B 0.01 2
+test_129_A test_129_B 0.01 3
+test_130_A test_130_B 0.01 5
+test_131_A test_131_B 0.01 5
+test_132_A test_132_B 0.01 2
+test_133_A test_133_B 0.01 3
+test_134_A test_134_B 0.01 3
+test_135_A test_135_B 0.01 4
+test_136_A test_136_B 0.01 2
+test_137_A test_137_B 0.01 3
+test_138_A test_138_B 0.01 2
+test_139_A test_139_B 0.01 2.5
+test_140_A test_140_B 0.01 2
+test_141_A test_141_B 0.01 4
+test_142_A test_142_B 0.01 3
+test_143_A test_143_B 0.01 4
+test_144_A test_144_B 0.01 3
+test_145_A test_145_B 0.01 4
+test_146_A test_146_B 0.01 3
+test_147_A test_147_B 0.01 4
+test_148_A test_148_B 0.01 3
+test_149_A test_149_B 0.01 4
+test_150_A test_150_B 0.01 3
+test_151_A test_151_B 0.01 4
+test_152_A test_152_B 0.01 3.5
+test_153_A test_153_B 0.01 4
+test_154_A test_154_B 0.01 3.5
+test_155_A test_155_B 0.01 3
+test_156_A test_156_B 0.01 3
+test_157_A test_157_B 0.01 4.5
+test_158_A test_158_B 0.01 3.5
+test_159_A test_159_B 0.01 1
+test_160_A test_160_B 0.01 4
+test_161_A test_161_B 0.01 4
+test_162_A test_162_B 0.01 3
+test_163_A test_163_B 0.01 5
+test_164_A test_164_B 0.01 4
+test_165_A test_165_B 0.01 4
+test_166_A test_166_B 0.01 4
+test_167_A test_167_B 0.01 4.5
+test_168_A test_168_B 0.01 4
+test_169_A test_169_B 0.01 3.5
+test_170_A test_170_B 0.01 4
+test_171_A test_171_B 0.01 2
+test_172_A test_172_B 0.01 3
+test_173_A test_173_B 0.01 4
+test_174_A test_174_B 0.01 3
+test_175_A test_175_B 0.01 5
+test_176_A test_176_B 0.01 4.5
+test_177_A test_177_B 0.01 4.5
+test_178_A test_178_B 0.01 4.5
+test_179_A test_179_B 0.01 4
+test_180_A test_180_B 0.01 5
+test_181_A test_181_B 0.01 4
+test_182_A test_182_B 0.01 4.5
+test_183_A test_183_B 0.01 5
+test_184_A test_184_B 0.01 4
+test_185_A test_185_B 0.01 4.5
+test_186_A test_186_B 0.01 3
+test_187_A test_187_B 0.01 4.5
+test_188_A test_188_B 0.01 3
+test_189_A test_189_B 0.01 2
+test_190_A test_190_B 0.01 3
+test_191_A test_191_B 0.01 3
+test_192_A test_192_B 0.01 3.5
+test_193_A test_193_B 0.01 4.5
+test_194_A test_194_B 0.01 3
+test_195_A test_195_B 0.01 3
+test_196_A test_196_B 0.01 3
+test_197_A test_197_B 0.01 3
+test_198_A test_198_B 0.01 5
+test_199_A test_199_B 0.01 3.5
+test_200_A test_200_B 0.01 3
+test_201_A test_201_B 0.01 5
+test_202_A test_202_B 0.01 3
+test_203_A test_203_B 0.01 4
+test_204_A test_204_B 0.01 2.5
+test_205_A test_205_B 0.01 4
+test_206_A test_206_B 0.01 3.5
+test_207_A test_207_B 0.01 3
+test_208_A test_208_B 0.01 4
+test_209_A test_209_B 0.01 3
+test_210_A test_210_B 0.01 5
+test_211_A test_211_B 0.01 3
+test_212_A test_212_B 0.01 3
+test_213_A test_213_B 0.01 3.5
+test_214_A test_214_B 0.01 4
+test_215_A test_215_B 0.01 3
+test_216_A test_216_B 0.01 3.5
+test_217_A test_217_B 0.01 4
+test_218_A test_218_B 0.01 4
+test_219_A test_219_B 0.01 4
+test_220_A test_220_B 0.01 3
+test_221_A test_221_B 0.01 4
+test_222_A test_222_B 0.01 4
+test_223_A test_223_B 0.01 4
+test_224_A test_224_B 0.01 3
+test_225_A test_225_B 0.01 3
+test_226_A test_226_B 0.01 4
+test_227_A test_227_B 0.01 4
+test_228_A test_228_B 0.01 4
+test_229_A test_229_B 0.01 3
+test_230_A test_230_B 0.01 3
+test_231_A test_231_B 0.01 4
+test_232_A test_232_B 0.01 4
+test_233_A test_233_B 0.01 2
+test_234_A test_234_B 0.01 3.5
+test_235_A test_235_B 0.01 4
+test_236_A test_236_B 0.01 3
+test_237_A test_237_B 0.01 3.5
+test_238_A test_238_B 0.01 4
+test_239_A test_239_B 0.01 3
+test_240_A test_240_B 0.01 3
+test_241_A test_241_B 0.01 5
+test_242_A test_242_B 0.01 4.5
+test_243_A test_243_B 0.01 4
+test_244_A test_244_B 0.01 3.5
+test_245_A test_245_B 0.01 5
+test_246_A test_246_B 0.01 2.5
+test_247_A test_247_B 0.01 3
+test_248_A test_248_B 0.01 4
+test_249_A test_249_B 0.01 2
+test_250_A test_250_B 0.01 5
+test_251_A test_251_B 0.01 4
+test_252_A test_252_B 0.01 4
+test_253_A test_253_B 0.01 4.5
+test_254_A test_254_B 0.01 4
+test_255_A test_255_B 0.01 3
+test_256_A test_256_B 0.01 4.5
+test_257_A test_257_B 0.01 4
+test_258_A test_258_B 0.01 5
+test_259_A test_259_B 0.01 4
+test_260_A test_260_B 0.01 4
+test_261_A test_261_B 0.01 2.5
+test_262_A test_262_B 0.01 2
+test_263_A test_263_B 0.01 4.5
+test_264_A test_264_B 0.01 3.5
+test_265_A test_265_B 0.01 4
+test_266_A test_266_B 0.01 3
+test_267_A test_267_B 0.01 5
+test_268_A test_268_B 0.01 4
+test_269_A test_269_B 0.01 4
+test_270_A test_270_B 0.01 3
+test_271_A test_271_B 0.01 4
+test_272_A test_272_B 0.01 4
+test_273_A test_273_B 0.01 2
+test_274_A test_274_B 0.01 3
+test_275_A test_275_B 0.01 3
+test_276_A test_276_B 0.01 4
+test_277_A test_277_B 0.01 5
+test_278_A test_278_B 0.01 4
+test_279_A test_279_B 0.01 4.5
+test_280_A test_280_B 0.01 3.5
+test_281_A test_281_B 0.01 2
+test_282_A test_282_B 0.01 3
+test_283_A test_283_B 0.01 3
+test_284_A test_284_B 0.01 3
+test_285_A test_285_B 0.01 3
+test_286_A test_286_B 0.01 3
+test_287_A test_287_B 0.01 3.5
+test_288_A test_288_B 0.01 3
+test_289_A test_289_B 0.01 2
+test_290_A test_290_B 0.01 4
+test_291_A test_291_B 0.01 3
+test_292_A test_292_B 0.01 4
+test_293_A test_293_B 0.01 2.5
+test_294_A test_294_B 0.01 4
+test_295_A test_295_B 0.01 3.5
+test_296_A test_296_B 0.01 3
+test_297_A test_297_B 0.01 3
+test_298_A test_298_B 0.01 4
+test_299_A test_299_B 0.01 4
+test_300_A test_300_B 0.01 3
+test_301_A test_301_B 0.01 2
+test_302_A test_302_B 0.01 2
+test_303_A test_303_B 0.01 3
+test_304_A test_304_B 0.01 3
+test_305_A test_305_B 0.01 3
+test_306_A test_306_B 0.01 3
+test_307_A test_307_B 0.01 2
+test_308_A test_308_B 0.01 3
+test_309_A test_309_B 0.01 2.5
+test_310_A test_310_B 0.01 4
+test_311_A test_311_B 0.01 3
+test_312_A test_312_B 0.01 3.5
+test_313_A test_313_B 0.01 3
+test_314_A test_314_B 0.01 2
+test_315_A test_315_B 0.01 3
+test_316_A test_316_B 0.01 4.5
+test_317_A test_317_B 0.01 3
+test_318_A test_318_B 0.01 3
+test_319_A test_319_B 0.01 3
+test_320_A test_320_B 0.01 4
+test_321_A test_321_B 0.01 2
+test_322_A test_322_B 0.01 3
+test_323_A test_323_B 0.01 3
+test_324_A test_324_B 0.01 2
+test_325_A test_325_B 0.01 3
+test_326_A test_326_B 0.01 2
+test_327_A test_327_B 0.01 3
+test_328_A test_328_B 0.01 3
+test_329_A test_329_B 0.01 4
+test_330_A test_330_B 0.01 3
+test_331_A test_331_B 0.01 3
+test_332_A test_332_B 0.01 2
+test_333_A test_333_B 0.01 2
+test_334_A test_334_B 0.01 3
+test_335_A test_335_B 0.01 2
+test_336_A test_336_B 0.01 3
+test_337_A test_337_B 0.01 2
+test_338_A test_338_B 0.01 2
+test_339_A test_339_B 0.01 2
+test_340_A test_340_B 0.01 1
+test_341_A test_341_B 0.01 2
+test_342_A test_342_B 0.01 2
+test_343_A test_343_B 0.01 2
+test_344_A test_344_B 0.01 2
+test_345_A test_345_B 0.01 2
+test_346_A test_346_B 0.01 2
+test_347_A test_347_B 0.01 2
+test_348_A test_348_B 0.01 2
+test_349_A test_349_B 0.01 2
+test_350_A test_350_B 0.01 2
+test_351_A test_351_B 0.01 2
+test_352_A test_352_B 0.01 2
+test_353_A test_353_B 0.01 2.5
+test_354_A test_354_B 0.01 2
+test_355_A test_355_B 0.01 2
+test_356_A test_356_B 0.01 2
+test_357_A test_357_B 0.01 2
+test_358_A test_358_B 0.01 2
+test_359_A test_359_B 0.01 2
+test_360_A test_360_B 0.01 32
+test_361_A test_361_B 0.01 8
+test_362_A test_362_B 0.01 29.5
+test_363_A test_363_B 0.01 41
+test_364_A test_364_B 0.01 41.5
+test_365_A test_365_B 0.01 27.5
+test_366_A test_366_B 0.01 46
+test_367_A test_367_B 0.01 37.5
+test_368_A test_368_B 0.01 27
+test_369_A test_369_B 0.01 42
+test_370_A test_370_B 0.01 45.5
+test_371_A test_371_B 0.01 34
+test_372_A test_372_B 0.01 19.5
+test_373_A test_373_B 0.01 24
+test_374_A test_374_B 0.01 10
+test_375_A test_375_B 0.01 17.5
+test_376_A test_376_B 0.01 28.5
+test_377_A test_377_B 0.01 40
+test_378_A test_378_B 0.01 40
+test_379_A test_379_B 0.01 24.5
+test_380_A test_380_B 0.01 36
+test_381_A test_381_B 0.01 38
+test_382_A test_382_B 0.01 48
+test_383_A test_383_B 0.01 32.5
+test_384_A test_384_B 0.01 44
+test_385_A test_385_B 0.01 44.5
+test_386_A test_386_B 0.01 11
+test_387_A test_387_B 0.01 47.5
+test_388_A test_388_B 0.01 28
+test_389_A test_389_B 0.01 32
+test_390_A test_390_B 0.01 24.5
+test_391_A test_391_B 0.01 47
+test_392_A test_392_B 0.01 28
+test_393_A test_393_B 0.01 16
+test_394_A test_394_B 0.01 44
+test_395_A test_395_B 0.01 38
+test_396_A test_396_B 0.01 47.5
+test_397_A test_397_B 0.01 35
+test_398_A test_398_B 0.01 33
+test_399_A test_399_B 0.01 33
+test_400_A test_400_B 0.01 31
+test_401_A test_401_B 0.01 48
+test_402_A test_402_B 0.01 37.5
+test_403_A test_403_B 0.01 40
+test_404_A test_404_B 0.01 47
+test_405_A test_405_B 0.01 23
+test_406_A test_406_B 0.01 40
+test_407_A test_407_B 0.01 46
+test_408_A test_408_B 0.01 39
+test_409_A test_409_B 0.01 26
+test_410_A test_410_B 0.01 28
+test_411_A test_411_B 0.01 27
+test_412_A test_412_B 0.01 33
+test_413_A test_413_B 0.01 36
+test_414_A test_414_B 0.01 42.5
+test_415_A test_415_B 0.01 40
+test_416_A test_416_B 0.01 37
+test_417_A test_417_B 0.01 43
+test_418_A test_418_B 0.01 16
+test_419_A test_419_B 0.01 34
+test_420_A test_420_B 0.01 42.5
+test_421_A test_421_B 0.01 38
+test_422_A test_422_B 0.01 30
+test_423_A test_423_B 0.01 44
+test_424_A test_424_B 0.01 46
+test_425_A test_425_B 0.01 38
+test_426_A test_426_B 0.01 35.5
+test_427_A test_427_B 0.01 29
+test_428_A test_428_B 0.01 43.5
+test_429_A test_429_B 0.01 34
+test_430_A test_430_B 0.01 48
+test_431_A test_431_B 0.01 41
+test_432_A test_432_B 0.01 35
+test_433_A test_433_B 0.01 32
+test_434_A test_434_B 0.01 36
+test_435_A test_435_B 0.01 43.5
+test_436_A test_436_B 0.01 32.5
+test_437_A test_437_B 0.01 40
+test_438_A test_438_B 0.01 34
+test_439_A test_439_B 0.01 31.5
+test_440_A test_440_B 0.01 26.5
+test_441_A test_441_B 0.01 49.5
+test_442_A test_442_B 0.01 30
+test_443_A test_443_B 0.01 29
+test_444_A test_444_B 0.01 29
+test_445_A test_445_B 0.01 48
+test_446_A test_446_B 0.01 35
+test_447_A test_447_B 0.01 43
+test_448_A test_448_B 0.01 19
+test_449_A test_449_B 0.01 34
+test_450_A test_450_B 0.01 44
+test_451_A test_451_B 0.01 36
+test_452_A test_452_B 0.01 32
+test_453_A test_453_B 0.01 49
+test_454_A test_454_B 0.01 48.5
+test_455_A test_455_B 0.01 46
+test_456_A test_456_B 0.01 33.5
+test_457_A test_457_B 0.01 49.5
+test_458_A test_458_B 0.01 38
+test_459_A test_459_B 0.01 21
+test_460_A test_460_B 0.01 40
+test_461_A test_461_B 0.01 32
+test_462_A test_462_B 0.01 37
+test_463_A test_463_B 0.01 23
+test_464_A test_464_B 0.01 19
+test_465_A test_465_B 0.01 29
+test_466_A test_466_B 0.01 38
+test_467_A test_467_B 0.01 29
+test_468_A test_468_B 0.01 45
+test_469_A test_469_B 0.01 27.5
+test_470_A test_470_B 0.01 43
+test_471_A test_471_B 0.01 24.5
+test_472_A test_472_B 0.01 42
+test_473_A test_473_B 0.01 36.5
+test_474_A test_474_B 0.01 46.5
+test_475_A test_475_B 0.01 18
+test_476_A test_476_B 0.01 29
+test_477_A test_477_B 0.01 44
+test_478_A test_478_B 0.01 49
+test_479_A test_479_B 0.01 33
+test_480_A test_480_B 0.01 43
+test_481_A test_481_B 0.01 42
+test_482_A test_482_B 0.01 31
+test_483_A test_483_B 0.01 37
+test_484_A test_484_B 0.01 25
+test_485_A test_485_B 0.01 33
+test_486_A test_486_B 0.01 35
+test_487_A test_487_B 0.01 39
+test_488_A test_488_B 0.01 26.5
+test_489_A test_489_B 0.01 39.5
+test_490_A test_490_B 0.01 26
+test_491_A test_491_B 0.01 45
+test_492_A test_492_B 0.01 21
+test_493_A test_493_B 0.01 37
+test_494_A test_494_B 0.01 50
+test_495_A test_495_B 0.01 41
+test_496_A test_496_B 0.01 34
+test_497_A test_497_B 0.01 35
+test_498_A test_498_B 0.01 34
+test_499_A test_499_B 0.01 30
+test_500_A test_500_B 0.01 39
+test_501_A test_501_B 0.01 36
+test_502_A test_502_B 0.01 36
+test_503_A test_503_B 0.01 49.5
+test_504_A test_504_B 0.01 40.5
+test_505_A test_505_B 0.01 29
+test_506_A test_506_B 0.01 33
+test_507_A test_507_B 0.01 38
+test_508_A test_508_B 0.01 21.5
+test_509_A test_509_B 0.01 27
+test_510_A test_510_B 0.01 43
+test_511_A test_511_B 0.01 34
+test_512_A test_512_B 0.01 25.5
+test_513_A test_513_B 0.01 19
+test_514_A test_514_B 0.01 28
+test_515_A test_515_B 0.01 41.5
+test_516_A test_516_B 0.01 46
+test_517_A test_517_B 0.01 34
+test_518_A test_518_B 0.01 33
+test_519_A test_519_B 0.01 37.5
+test_520_A test_520_B 0.01 37
+test_521_A test_521_B 0.01 42.5
+test_522_A test_522_B 0.01 44
+test_523_A test_523_B 0.01 36.5
+test_524_A test_524_B 0.01 40
+test_525_A test_525_B 0.01 36.5
+test_526_A test_526_B 0.01 24
+test_527_A test_527_B 0.01 34
+test_528_A test_528_B 0.01 23.5
+test_529_A test_529_B 0.01 30
+test_530_A test_530_B 0.01 50
+test_531_A test_531_B 0.01 33
+test_532_A test_532_B 0.01 36
+test_533_A test_533_B 0.01 24
+test_534_A test_534_B 0.01 46.5
+test_535_A test_535_B 0.01 39
+test_536_A test_536_B 0.01 26
+test_537_A test_537_B 0.01 30
+test_538_A test_538_B 0.01 27.5
+test_539_A test_539_B 0.01 26
+test_540_A test_540_B 0.01 23
+test_541_A test_541_B 0.01 26.5
+test_542_A test_542_B 0.01 40.5
+test_543_A test_543_B 0.01 41
+test_544_A test_544_B 0.01 46
+test_545_A test_545_B 0.01 33
+test_546_A test_546_B 0.01 38
+test_547_A test_547_B 0.01 33
+test_548_A test_548_B 0.01 28
+test_549_A test_549_B 0.01 29
+test_550_A test_550_B 0.01 33
+test_551_A test_551_B 0.01 20
+test_552_A test_552_B 0.01 27
+test_553_A test_553_B 0.01 21.5
+test_554_A test_554_B 0.01 28
+test_555_A test_555_B 0.01 31
+test_556_A test_556_B 0.01 31
+test_557_A test_557_B 0.01 30
+test_558_A test_558_B 0.01 29
+test_559_A test_559_B 0.01 30
+test_560_A test_560_B 0.01 21
+test_561_A test_561_B 0.01 37.5
+test_562_A test_562_B 0.01 40
+test_563_A test_563_B 0.01 25
+test_564_A test_564_B 0.01 22
+test_565_A test_565_B 0.01 24
+test_566_A test_566_B 0.01 39
+test_567_A test_567_B 0.01 27
+test_568_A test_568_B 0.01 30
+test_569_A test_569_B 0.01 35
+test_570_A test_570_B 0.01 29
+test_571_A test_571_B 0.01 27
+test_572_A test_572_B 0.01 23
+test_573_A test_573_B 0.01 34
+test_574_A test_574_B 0.01 26
+test_575_A test_575_B 0.01 28
+test_576_A test_576_B 0.01 22
+test_577_A test_577_B 0.01 29
+test_578_A test_578_B 0.01 24
+test_579_A test_579_B 0.01 22
+test_580_A test_580_B 0.01 31
+test_581_A test_581_B 0.01 39
+test_582_A test_582_B 0.01 21
+test_583_A test_583_B 0.01 32
+test_584_A test_584_B 0.01 22
+test_585_A test_585_B 0.01 26
+test_586_A test_586_B 0.01 20
+test_587_A test_587_B 0.01 28
+test_588_A test_588_B 0.01 22
+test_589_A test_589_B 0.01 20
+test_590_A test_590_B 0.01 17
+test_591_A test_591_B 0.01 24
+test_592_A test_592_B 0.01 27.5
+test_593_A test_593_B 0.01 31
+test_594_A test_594_B 0.01 18
+test_595_A test_595_B 0.01 18
+test_596_A test_596_B 0.01 32
+test_597_A test_597_B 0.01 17
+test_598_A test_598_B 0.01 19
+test_599_A test_599_B 0.01 23
+test_600_A test_600_B 0.01 16
+test_601_A test_601_B 0.01 13
+test_602_A test_602_B 0.01 25
+test_603_A test_603_B 0.01 17
+test_604_A test_604_B 0.01 18
+test_605_A test_605_B 0.01 20
+test_606_A test_606_B 0.01 16
+test_607_A test_607_B 0.01 19
+test_608_A test_608_B 0.01 22
+test_609_A test_609_B 0.01 18
+test_610_A test_610_B 0.01 22
+test_611_A test_611_B 0.01 18
+test_612_A test_612_B 0.01 21
+test_613_A test_613_B 0.01 23
+test_614_A test_614_B 0.01 14
+test_615_A test_615_B 0.01 21
+test_616_A test_616_B 0.01 20
+test_617_A test_617_B 0.01 17
+test_618_A test_618_B 0.01 15
+test_619_A test_619_B 0.01 18
+test_620_A test_620_B 0.01 346.5
+test_621_A test_621_B 0.01 414
+test_622_A test_622_B 0.01 321
+test_623_A test_623_B 0.01 428
+test_624_A test_624_B 0.01 137.5
+test_625_A test_625_B 0.01 272
+test_626_A test_626_B 0.01 257
+test_627_A test_627_B 0.01 261
+test_628_A test_628_B 0.01 480.5
+test_629_A test_629_B 0.01 378
+test_630_A test_630_B 0.01 153.5
+test_631_A test_631_B 0.01 199
+test_632_A test_632_B 0.01 457
+test_633_A test_633_B 0.01 358.5
+test_634_A test_634_B 0.01 357
+test_635_A test_635_B 0.01 216
+test_636_A test_636_B 0.01 460.5
+test_637_A test_637_B 0.01 314
+test_638_A test_638_B 0.01 322
+test_639_A test_639_B 0.01 440.5
+test_640_A test_640_B 0.01 324
+test_641_A test_641_B 0.01 265
+test_642_A test_642_B 0.01 395.5
+test_643_A test_643_B 0.01 397
+test_644_A test_644_B 0.01 308
+test_645_A test_645_B 0.01 199
+test_646_A test_646_B 0.01 256.5
+test_647_A test_647_B 0.01 293
+test_648_A test_648_B 0.01 297
+test_649_A test_649_B 0.01 410.5
+test_650_A test_650_B 0.01 322
+test_651_A test_651_B 0.01 458
+test_652_A test_652_B 0.01 420.5
+test_653_A test_653_B 0.01 235
+test_654_A test_654_B 0.01 220
+test_655_A test_655_B 0.01 257
+test_656_A test_656_B 0.01 305
+test_657_A test_657_B 0.01 230.5
+test_658_A test_658_B 0.01 500
+test_659_A test_659_B 0.01 155
+test_660_A test_660_B 0.01 418
+test_661_A test_661_B 0.01 403.5
+test_662_A test_662_B 0.01 296
+test_663_A test_663_B 0.01 297.5
+test_664_A test_664_B 0.01 219
+test_665_A test_665_B 0.01 476.5
+test_666_A test_666_B 0.01 347
+test_667_A test_667_B 0.01 284
+test_668_A test_668_B 0.01 324.5
+test_669_A test_669_B 0.01 231
+test_670_A test_670_B 0.01 410
+test_671_A test_671_B 0.01 206
+test_672_A test_672_B 0.01 266
+test_673_A test_673_B 0.01 319.5
+test_674_A test_674_B 0.01 483
+test_675_A test_675_B 0.01 355.5
+test_676_A test_676_B 0.01 316.5
+test_677_A test_677_B 0.01 297
+test_678_A test_678_B 0.01 458
+test_679_A test_679_B 0.01 398.5
+test_680_A test_680_B 0.01 371.5
+test_681_A test_681_B 0.01 338
+test_682_A test_682_B 0.01 461
+test_683_A test_683_B 0.01 298.5
+test_684_A test_684_B 0.01 303.5
+test_685_A test_685_B 0.01 265
+test_686_A test_686_B 0.01 400.5
+test_687_A test_687_B 0.01 264
+test_688_A test_688_B 0.01 303
+test_689_A test_689_B 0.01 360
+test_690_A test_690_B 0.01 325
+test_691_A test_691_B 0.01 217
+test_692_A test_692_B 0.01 313
+test_693_A test_693_B 0.01 491
+test_694_A test_694_B 0.01 367.5
+test_695_A test_695_B 0.01 285
+test_696_A test_696_B 0.01 314
+test_697_A test_697_B 0.01 379
+test_698_A test_698_B 0.01 277.5
+test_699_A test_699_B 0.01 302
+test_700_A test_700_B 0.01 299
+test_701_A test_701_B 0.01 439.5
+test_702_A test_702_B 0.01 289
+test_703_A test_703_B 0.01 460.5
+test_704_A test_704_B 0.01 210
+test_705_A test_705_B 0.01 491
+test_706_A test_706_B 0.01 438.5
+test_707_A test_707_B 0.01 323
+test_708_A test_708_B 0.01 427
+test_709_A test_709_B 0.01 364
+test_710_A test_710_B 0.01 434
+test_711_A test_711_B 0.01 434
+test_712_A test_712_B 0.01 391
+test_713_A test_713_B 0.01 356
+test_714_A test_714_B 0.01 420
+test_715_A test_715_B 0.01 354
+test_716_A test_716_B 0.01 281
+test_717_A test_717_B 0.01 359.5
+test_718_A test_718_B 0.01 345
+test_719_A test_719_B 0.01 341.5
+test_720_A test_720_B 0.01 497.5
+test_721_A test_721_B 0.01 199
+test_722_A test_722_B 0.01 452
+test_723_A test_723_B 0.01 335.5
+test_724_A test_724_B 0.01 311
+test_725_A test_725_B 0.01 336
+test_726_A test_726_B 0.01 300
+test_727_A test_727_B 0.01 317
+test_728_A test_728_B 0.01 492
+test_729_A test_729_B 0.01 304
+test_730_A test_730_B 0.01 217
+test_731_A test_731_B 0.01 322
+test_732_A test_732_B 0.01 289
+test_733_A test_733_B 0.01 182
+test_734_A test_734_B 0.01 410.5
+test_735_A test_735_B 0.01 306
+test_736_A test_736_B 0.01 294
+test_737_A test_737_B 0.01 254
+test_738_A test_738_B 0.01 338.5
+test_739_A test_739_B 0.01 225
+test_740_A test_740_B 0.01 280
+test_741_A test_741_B 0.01 454
+test_742_A test_742_B 0.01 226
+test_743_A test_743_B 0.01 365
+test_744_A test_744_B 0.01 456
+test_745_A test_745_B 0.01 405
+test_746_A test_746_B 0.01 322
+test_747_A test_747_B 0.01 279
+test_748_A test_748_B 0.01 311.5
+test_749_A test_749_B 0.01 308
+test_750_A test_750_B 0.01 322
+test_751_A test_751_B 0.01 409
+test_752_A test_752_B 0.01 277
+test_753_A test_753_B 0.01 318
+test_754_A test_754_B 0.01 299.5
+test_755_A test_755_B 0.01 462.5
+test_756_A test_756_B 0.01 314
+test_757_A test_757_B 0.01 300
+test_758_A test_758_B 0.01 455
+test_759_A test_759_B 0.01 422.5
+test_760_A test_760_B 0.01 433.5
+test_761_A test_761_B 0.01 278
+test_762_A test_762_B 0.01 484.5
+test_763_A test_763_B 0.01 348
+test_764_A test_764_B 0.01 491
+test_765_A test_765_B 0.01 280
+test_766_A test_766_B 0.01 259
+test_767_A test_767_B 0.01 275.5
+test_768_A test_768_B 0.01 348
+test_769_A test_769_B 0.01 330
+test_770_A test_770_B 0.01 412
+test_771_A test_771_B 0.01 262
+test_772_A test_772_B 0.01 455
+test_773_A test_773_B 0.01 294
+test_774_A test_774_B 0.01 425
+test_775_A test_775_B 0.01 220.5
+test_776_A test_776_B 0.01 411.5
+test_777_A test_777_B 0.01 383
+test_778_A test_778_B 0.01 363
+test_779_A test_779_B 0.01 302
+test_780_A test_780_B 0.01 328
+test_781_A test_781_B 0.01 294
+test_782_A test_782_B 0.01 407.5
+test_783_A test_783_B 0.01 260.5
+test_784_A test_784_B 0.01 410
+test_785_A test_785_B 0.01 328
+test_786_A test_786_B 0.01 419.5
+test_787_A test_787_B 0.01 165
+test_788_A test_788_B 0.01 389
+test_789_A test_789_B 0.01 254
+test_790_A test_790_B 0.01 311
+test_791_A test_791_B 0.01 258
+test_792_A test_792_B 0.01 331
+test_793_A test_793_B 0.01 378
+test_794_A test_794_B 0.01 415
+test_795_A test_795_B 0.01 364
+test_796_A test_796_B 0.01 279
+test_797_A test_797_B 0.01 249
+test_798_A test_798_B 0.01 463
+test_799_A test_799_B 0.01 304
+test_800_A test_800_B 0.01 187
+test_801_A test_801_B 0.01 305.5
+test_802_A test_802_B 0.01 385
+test_803_A test_803_B 0.01 360.5
+test_804_A test_804_B 0.01 269
+test_805_A test_805_B 0.01 294
+test_806_A test_806_B 0.01 362
+test_807_A test_807_B 0.01 354
+test_808_A test_808_B 0.01 196
+test_809_A test_809_B 0.01 248
+test_810_A test_810_B 0.01 297.5
+test_811_A test_811_B 0.01 243
+test_812_A test_812_B 0.01 312
+test_813_A test_813_B 0.01 241
+test_814_A test_814_B 0.01 384
+test_815_A test_815_B 0.01 250
+test_816_A test_816_B 0.01 205
+test_817_A test_817_B 0.01 308
+test_818_A test_818_B 0.01 356
+test_819_A test_819_B 0.01 230
+test_820_A test_820_B 0.01 178
+test_821_A test_821_B 0.01 294
+test_822_A test_822_B 0.01 227
+test_823_A test_823_B 0.01 234
+test_824_A test_824_B 0.01 241
+test_825_A test_825_B 0.01 233
+test_826_A test_826_B 0.01 284
+test_827_A test_827_B 0.01 287
+test_828_A test_828_B 0.01 192
+test_829_A test_829_B 0.01 359
+test_830_A test_830_B 0.01 225
+test_831_A test_831_B 0.01 273
+test_832_A test_832_B 0.01 248
+test_833_A test_833_B 0.01 217
+test_834_A test_834_B 0.01 332
+test_835_A test_835_B 0.01 218
+test_836_A test_836_B 0.01 335
+test_837_A test_837_B 0.01 192
+test_838_A test_838_B 0.01 188
+test_839_A test_839_B 0.01 347
+test_840_A test_840_B 0.01 273
+test_841_A test_841_B 0.01 187
+test_842_A test_842_B 0.01 170
+test_843_A test_843_B 0.01 230
+test_844_A test_844_B 0.01 206.5
+test_845_A test_845_B 0.01 177
+test_846_A test_846_B 0.01 251
+test_847_A test_847_B 0.01 163
+test_848_A test_848_B 0.01 174
+test_849_A test_849_B 0.01 177
+test_850_A test_850_B 0.01 252
+test_851_A test_851_B 0.01 262
+test_852_A test_852_B 0.01 174
+test_853_A test_853_B 0.01 169
+test_854_A test_854_B 0.01 200
+test_855_A test_855_B 0.01 189
+test_856_A test_856_B 0.01 206.5
+test_857_A test_857_B 0.01 260
+test_858_A test_858_B 0.01 191
+test_859_A test_859_B 0.01 216
+test_860_A test_860_B 0.01 181.5
+test_861_A test_861_B 0.01 219
+test_862_A test_862_B 0.01 143
+test_863_A test_863_B 0.01 173
+test_864_A test_864_B 0.01 134
+test_865_A test_865_B 0.01 159
+test_866_A test_866_B 0.01 205
+test_867_A test_867_B 0.01 178
+test_868_A test_868_B 0.01 189.5
+test_869_A test_869_B 0.01 145
+test_870_A test_870_B 0.01 179
+test_871_A test_871_B 0.01 167
+test_872_A test_872_B 0.01 149
+test_873_A test_873_B 0.01 149
+test_874_A test_874_B 0.01 187
+test_875_A test_875_B 0.01 193
+test_876_A test_876_B 0.01 165
+test_877_A test_877_B 0.01 190
+test_878_A test_878_B 0.01 242
+test_879_A test_879_B 0.01 187
diff --git a/geom_bottleneck/tests/data/ws_tests/test_100_A b/geom_bottleneck/tests/data/ws_tests/test_100_A
new file mode 100644
index 0000000..8d126f0
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_100_A
@@ -0,0 +1,100 @@
+7.50638 7.78005
+0.991758 2.12178
+5.18481 6.61702
+6.14703 7.08581
+4.09936 4.83024
+3.79915 4.51283
+3.17645 3.75321
+0.61305 0.998622
+0.445643 1.13781
+6.38205 6.53669
+5.96392 6.44093
+7.21047 7.26005
+0.6703 1.26593
+0.529933 1.7027
+7.92495 8.83023
+2.1382 2.71695
+3.79209 4.5197
+5.23354 5.82214
+-0.395097 2.18831
+3.22028 3.88648
+5.56262 5.79949
+8.39623 9.37185
+2.7452 3.84539
+9.5022 10.2414
+1.01374 1.40504
+3.2029 3.89559
+7.61236 8.28485
+6.4371 6.909
+4.45616 5.35067
+1.57802 1.77895
+6.5991 7.76339
+6.66729 6.71714
+6.11898 6.57121
+2.60663 4.36396
+-0.259613 1.17683
+7.72857 9.48862
+4.68398 5.51521
+4.87447 5.4233
+6.86301 6.88244
+4.17814 4.25886
+8.70558 9.72902
+4.40873 4.57389
+6.1824 7.05049
+7.97557 8.79739
+8.52591 8.6985
+5.15336 5.27796
+9.70144 9.77031
+0.561778 1.39045
+9.32553 10.2456
+7.01495 7.74521
+6.83355 7.28255
+1.96721 3.01504
+5.78411 7.59464
+5.64012 6.10721
+3.7249 5.17086
+4.33297 5.91657
+7.11793 7.2545
+5.109 6.76878
+3.02787 3.04077
+0.999365 2.05566
+8.81392 8.9086
+6.20106 6.78943
+6.7987 7.05794
+0.438805 0.449602
+8.71793 9.79853
+-0.150282 0.51997
+5.72257 5.93156
+5.71098 6.09535
+9.0378 9.45942
+0.534987 0.872885
+7.72276 8.57754
+9.26069 9.40289
+4.148 4.80519
+1.04579 3.18109
+0.259767 0.93215
+0.250608 0.511569
+4.88108 5.62239
+4.6731 5.3348
+7.84979 7.93545
+0.912521 1.48142
+4.82553 5.38108
+6.02179 7.61665
+3.85848 6.39418
+5.10754 6.02118
+1.71956 1.86238
+6.47336 6.74034
+-0.0371018 0.212738
+3.97259 4.15465
+2.17413 3.20188
+4.49098 6.09812
+6.62445 7.84196
+6.57541 7.432
+6.81052 9.6653
+3.67502 4.69734
+3.92378 4.14743
+5.93127 6.46154
+0.63424 0.705454
+7.60129 9.23263
+4.23064 4.74575
+0.397705 1.24458
diff --git a/geom_bottleneck/tests/data/ws_tests/test_100_A.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_100_A.pd.dipha
new file mode 100644
index 0000000..e94f5fe
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_100_A.pd.dipha
Binary files differ
diff --git a/geom_bottleneck/tests/data/ws_tests/test_100_B b/geom_bottleneck/tests/data/ws_tests/test_100_B
new file mode 100644
index 0000000..852799d
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_100_B
@@ -0,0 +1,100 @@
+5.8232 6.36308
+2.16066 2.48668
+2.38754 4.91418
+4.77403 5.43982
+0.291412 1.11147
+3.77337 5.2686
+8.31344 9.05384
+0.734064 1.14844
+7.57606 7.8521
+3.16719 3.86953
+2.55072 2.64932
+9.51707 9.6071
+0.304643 2.41784
+2.79925 3.28234
+5.32901 7.7576
+5.19903 6.30449
+1.87819 2.99454
+8.92272 9.67105
+4.62414 5.05592
+4.0079 4.64148
+2.26369 3.44573
+2.69335 3.13426
+1.90706 2.42652
+2.68113 2.79133
+1.41065 1.56018
+6.55282 7.18725
+5.72986 6.37151
+7.26968 8.22623
+3.32643 3.73606
+3.77325 4.63115
+1.05457 1.83651
+8.6815 8.85251
+3.91285 4.17139
+0.380936 0.842109
+7.33227 7.69334
+8.45635 8.923
+4.1769 5.08373
+0.501374 2.23328
+-0.161782 1.28908
+3.44716 3.4662
+3.15394 4.30243
+8.71416 9.3781
+6.3034 8.62893
+6.53824 7.04611
+0.6386 1.35269
+0.862088 0.960371
+5.12963 5.20203
+1.58695 2.0452
+6.57698 6.63228
+3.87747 4.45669
+1.51273 3.25669
+-0.0992804 0.667302
+4.7489 4.80059
+0.0280559 1.90471
+6.7462 8.27612
+0.915652 1.30007
+2.79556 3.77404
+9.87989 10.0722
+9.39105 9.84229
+7.57235 9.37122
+5.09426 6.44266
+6.3994 6.72037
+5.73441 6.99341
+6.9079 7.88049
+4.2003 4.41933
+-1.72447 2.25877
+9.04907 9.64323
+4.40473 5.3593
+9.31201 9.96079
+7.28343 8.74163
+3.0172 6.23779
+8.08422 8.56069
+6.83038 6.99863
+2.32038 3.1289
+7.42302 8.26286
+6.66905 7.18496
+0.730748 1.61335
+4.00564 5.73993
+2.81231 3.67489
+2.33178 2.37845
+9.03302 9.68681
+0.567816 0.755485
+7.89783 8.7621
+0.177662 0.332833
+-0.181569 1.36821
+6.22158 6.55787
+4.67115 5.16995
+0.806432 0.820738
+7.69636 7.87402
+4.40933 4.54995
+9.1329 9.15037
+8.87416 9.04329
+1.14349 1.8993
+3.29756 4.7172
+6.67873 8.31364
+6.91238 7.1654
+0.483084 1.55006
+2.66058 3.86294
+5.93347 6.06085
+7.40514 9.05071
diff --git a/geom_bottleneck/tests/data/ws_tests/test_100_B.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_100_B.pd.dipha
new file mode 100644
index 0000000..25d6734
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_100_B.pd.dipha
Binary files differ
diff --git a/geom_bottleneck/tests/data/ws_tests/test_200_A b/geom_bottleneck/tests/data/ws_tests/test_200_A
new file mode 100644
index 0000000..164b71d
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_200_A
@@ -0,0 +1,200 @@
+0.471299 1.89241
+2.82136 3.97846
+8.81923 9.20678
+1.42474 1.65425
+8.36963 9.16097
+-0.236476 0.692489
+7.57182 8.06148
+2.89878 3.21958
+7.1285 7.51707
+5.75496 7.09461
+6.00081 6.10914
+9.60869 9.64676
+7.42889 8.97174
+7.26061 8.55944
+2.41226 2.5146
+8.5616 9.44847
+7.4946 8.86962
+5.42244 6.98028
+9.62386 9.96039
+7.70591 9.92849
+1.34119 3.2048
+3.92169 5.15228
+8.82955 9.60318
+7.94213 9.39997
+2.6716 4.02057
+0.375206 0.497663
+1.94572 3.65599
+1.03366 1.46356
+8.91855 10.1838
+7.11087 8.64425
+2.63266 2.78706
+8.93611 10.2943
+8.51999 9.28356
+1.31436 3.13725
+1.92871 4.00178
+8.30503 8.45555
+2.58739 2.82076
+3.20419 5.29453
+7.4015 8.13225
+9.07991 9.74729
+0.822366 0.938371
+2.90508 4.29367
+4.32385 5.4787
+3.63054 4.6918
+8.52962 9.87004
+1.16994 2.39465
+2.61903 3.33772
+4.15505 4.52942
+8.7068 9.66579
+8.10373 9.31351
+0.7954 1.23001
+7.82253 8.69505
+4.59616 5.91996
+1.02032 1.93931
+6.98421 8.46017
+8.42263 11.3447
+2.63444 3.7158
+7.49059 9.1137
+-0.122109 1.41074
+8.29578 8.81161
+6.24793 6.32368
+4.07212 4.39695
+5.32453 7.457
+8.3892 9.82048
+4.35981 4.78063
+5.49932 6.08321
+1.0107 1.53369
+2.48759 2.94139
+4.24977 5.52034
+1.93104 3.35207
+-0.733247 1.22412
+-0.354283 2.36812
+6.34728 6.44213
+5.98172 7.8753
+5.47963 6.82986
+6.01986 6.6588
+4.62793 5.22134
+7.73923 8.29761
+8.85565 9.51494
+5.55307 6.15804
+6.30963 7.17248
+9.4775 10.2636
+7.45333 7.74006
+1.79317 2.33273
+7.73056 8.44999
+3.94172 5.02778
+8.36177 9.85172
+5.91765 8.12935
+7.95436 8.97583
+5.06238 5.37907
+4.56153 4.97175
+9.47572 9.65038
+9.54745 9.922
+7.82271 8.66299
+4.19056 4.75156
+4.15657 5.72352
+0.213845 0.312444
+2.30944 2.6806
+2.42391 3.41888
+6.00512 6.88274
+6.64546 7.61145
+-0.204229 2.78228
+-0.417104 0.667252
+8.18696 8.67785
+9.27818 9.67924
+-0.0174685 0.21355
+5.91137 6.39606
+9.49268 10.1457
+2.11362 4.36526
+6.51084 7.82167
+6.07066 6.44843
+-0.653518 1.08588
+7.46736 7.87137
+5.26045 7.92188
+6.4171 6.8133
+6.73709 7.70383
+3.46451 4.23679
+0.122365 0.809853
+7.98627 8.0505
+1.71192 2.63047
+1.20624 2.12087
+4.6812 5.51566
+2.62672 2.67648
+4.203 5.1052
+5.26482 6.5186
+3.68166 3.74701
+2.72011 3.98338
+3.41652 3.71477
+2.26211 2.90374
+0.930209 1.43211
+1.98603 3.36662
+4.55838 5.9933
+5.66292 6.59838
+3.12432 3.87457
+6.54384 8.38959
+0.205059 0.331022
+8.70617 9.34121
+7.02182 7.38679
+2.36908 2.84197
+9.13221 9.76563
+7.50113 9.49245
+8.15671 8.45093
+1.9517 2.20923
+3.23368 3.43695
+2.97273 4.10133
+7.36338 8.96733
+4.77525 5.18347
+9.47774 10.3537
+1.75218 1.97051
+5.42544 6.18939
+9.75801 10.0151
+6.31285 6.38327
+8.43389 8.721
+7.6108 7.81113
+8.72029 10.3153
+5.18655 7.1101
+7.96243 8.43151
+0.798103 0.860125
+1.1289 2.77549
+5.91084 6.03085
+4.95884 5.46913
+5.88125 6.49667
+7.9394 8.9545
+5.07492 5.55063
+5.92251 6.08548
+3.88602 5.41487
+1.40122 2.15276
+8.74244 8.83223
+4.75577 6.60338
+0.921272 1.44873
+3.77361 3.90348
+8.8999 9.8518
+3.11077 4.85674
+8.56185 10.6345
+8.76335 9.00169
+6.8734 8.60197
+4.54408 4.93892
+5.57849 6.31727
+7.95161 8.30843
+1.55798 2.4957
+3.86082 3.97131
+6.45433 7.17065
+0.96021 2.32897
+6.84576 6.89531
+8.59095 8.70199
+3.57754 4.26457
+5.27979 5.74385
+2.06602 2.90525
+3.0856 4.18179
+2.76214 3.9982
+2.11943 5.4285
+3.1197 3.24389
+0.495798 1.23632
+3.18253 3.99433
+7.02072 8.37949
+2.77905 3.42643
+1.57093 2.30655
+7.10979 7.14006
+6.20994 6.72092
+8.15136 8.33899
diff --git a/geom_bottleneck/tests/data/ws_tests/test_200_B b/geom_bottleneck/tests/data/ws_tests/test_200_B
new file mode 100644
index 0000000..761943d
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_200_B
@@ -0,0 +1,200 @@
+1.17434 1.46837
+2.58198 4.16589
+0.234041 0.968658
+1.52703 1.59579
+6.7103 7.44033
+3.19227 4.41539
+5.42556 5.57369
+3.45417 4.86089
+3.82256 4.1092
+7.82551 7.90784
+3.9384 4.71796
+5.60335 5.9054
+7.96663 9.8987
+6.30305 6.64853
+7.33246 10.5316
+0.623312 1.09008
+2.63041 2.64616
+5.36028 6.28956
+4.64202 5.91858
+7.55219 7.96304
+7.73736 9.18221
+1.67114 1.84851
+5.07514 5.12159
+7.03732 7.05228
+7.5006 7.59212
+0.244947 1.55875
+0.0170454 1.10485
+1.95394 3.53669
+5.66015 6.01949
+5.88211 7.64639
+7.46698 9.27085
+6.37429 7.10154
+4.54535 4.81932
+8.21203 9.35896
+4.89933 6.20802
+3.68683 4.17831
+0.477467 0.828394
+6.17871 6.77834
+9.77523 9.92676
+0.854808 2.38709
+7.93326 8.3553
+2.10917 2.27771
+4.07045 4.72793
+8.2016 8.8011
+2.9205 3.95746
+2.89806 4.39725
+5.5654 5.78669
+9.5219 9.98543
+7.08591 7.19588
+8.35359 9.57893
+9.81348 10.0345
+8.5994 9.71835
+5.43903 7.25234
+1.82768 2.92724
+4.44952 6.79754
+5.66747 7.34386
+5.88153 6.39253
+3.34008 4.22032
+2.46068 2.76051
+0.370778 2.61681
+6.02508 6.26809
+4.32654 4.93262
+7.41536 7.99616
+8.84229 9.87911
+3.8551 5.84353
+1.56832 2.34694
+6.96099 7.42028
+8.15753 8.72014
+9.23141 10.3815
+7.4484 7.80228
+0.473671 0.874895
+3.15689 3.50687
+3.58122 4.09945
+3.55022 3.74767
+4.42708 5.80211
+4.40956 4.68699
+3.80576 4.61856
+7.29965 8.28614
+7.40582 8.15308
+1.69789 1.77669
+1.66419 3.44308
+0.473997 0.872506
+7.83959 8.52898
+6.22416 6.36949
+-0.187159 0.871822
+0.232336 0.585965
+9.29905 9.44357
+1.4459 2.40589
+2.83008 3.19758
+1.15291 2.12112
+2.58686 3.33896
+6.79362 7.88068
+0.228178 1.48318
+5.60001 6.20258
+4.97803 7.10992
+1.70429 1.962
+2.72659 3.13886
+9.22714 9.25889
+3.84694 3.88778
+-0.282077 1.48155
+9.28756 9.58517
+4.34069 5.59751
+8.63909 8.76839
+8.86236 10.7642
+6.77597 8.41888
+7.30621 8.64164
+0.685607 1.22755
+2.91514 3.22638
+2.72098 3.66837
+8.17528 8.32638
+5.19632 5.7506
+7.34177 8.70639
+5.74082 6.35524
+5.95975 6.69284
+9.40187 10.4488
+2.92761 3.36735
+0.399531 3.13082
+4.83399 4.92635
+7.74539 8.56852
+1.76322 3.5086
+6.54479 6.72963
+7.64362 8.12404
+1.35542 1.45313
+0.214385 0.718085
+1.7006 3.21962
+5.91009 6.47862
+2.21093 2.34636
+5.96919 6.79365
+6.59951 8.22203
+1.54571 1.59397
+3.27012 3.79128
+0.32455 0.622995
+1.73926 2.78017
+9.81035 9.84077
+7.38441 7.85171
+8.90372 9.34186
+7.26323 8.41174
+5.7363 5.97348
+8.25473 10.1281
+2.3981 2.52096
+8.53783 9.63442
+8.51755 9.2735
+6.48614 6.773
+3.40182 3.65137
+2.1353 3.04852
+2.95397 3.73285
+6.98063 7.4963
+4.50189 5.26384
+0.21416 1.49363
+0.632196 1.36307
+6.57833 6.60481
+8.0634 9.33903
+2.79759 2.94462
+4.43747 4.58861
+6.48733 6.86569
+2.28008 3.47037
+6.87452 7.77431
+-0.156821 2.71557
+0.72595 1.78862
+1.97586 2.38196
+8.61839 9.1468
+4.55496 5.68986
+0.26923 1.15728
+9.63757 9.7236
+1.39497 1.96698
+4.8643 5.04172
+6.64675 7.66435
+2.56256 2.6015
+-0.381989 0.611211
+0.676336 1.26896
+8.95304 9.03243
+5.62058 6.07997
+3.36522 4.04276
+8.64868 10.5024
+4.75813 5.19834
+1.96608 2.05864
+9.01449 9.10397
+3.72786 4.51921
+5.6938 6.96584
+1.73499 2.9314
+2.73099 3.41409
+8.77171 9.07665
+4.63865 4.67649
+8.6698 9.30782
+-0.168259 2.09581
+9.29672 9.56
+0.372544 2.60567
+0.450487 1.32919
+6.95341 7.6399
+3.4403 5.24993
+5.53469 6.97831
+-0.79664 1.21306
+5.68831 6.14413
+8.85601 8.95444
+3.83309 5.211
+5.51573 6.5114
+3.64009 3.99648
+4.40759 4.99283
+1.85198 2.6457
+2.72645 3.74803
diff --git a/geom_bottleneck/tests/data/ws_tests/test_5000_A b/geom_bottleneck/tests/data/ws_tests/test_5000_A
new file mode 100644
index 0000000..094c6e0
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_5000_A
@@ -0,0 +1,5000 @@
+0.471299 1.89241
+2.82136 3.97846
+8.81923 9.20678
+1.42474 1.65425
+8.36963 9.16097
+-0.236476 0.692489
+7.57182 8.06148
+2.89878 3.21958
+7.1285 7.51707
+5.75496 7.09461
+6.00081 6.10914
+9.60869 9.64676
+7.42889 8.97174
+7.26061 8.55944
+2.41226 2.5146
+8.5616 9.44847
+7.4946 8.86962
+5.42244 6.98028
+9.62386 9.96039
+7.70591 9.92849
+1.34119 3.2048
+3.92169 5.15228
+8.82955 9.60318
+7.94213 9.39997
+2.6716 4.02057
+0.375206 0.497663
+1.94572 3.65599
+1.03366 1.46356
+8.91855 10.1838
+7.11087 8.64425
+2.63266 2.78706
+8.93611 10.2943
+8.51999 9.28356
+1.31436 3.13725
+1.92871 4.00178
+8.30503 8.45555
+2.58739 2.82076
+3.20419 5.29453
+7.4015 8.13225
+9.07991 9.74729
+0.822366 0.938371
+2.90508 4.29367
+4.32385 5.4787
+3.63054 4.6918
+8.52962 9.87004
+1.16994 2.39465
+2.61903 3.33772
+4.15505 4.52942
+8.7068 9.66579
+8.10373 9.31351
+0.7954 1.23001
+7.82253 8.69505
+4.59616 5.91996
+1.02032 1.93931
+6.98421 8.46017
+8.42263 11.3447
+2.63444 3.7158
+7.49059 9.1137
+-0.122109 1.41074
+8.29578 8.81161
+6.24793 6.32368
+4.07212 4.39695
+5.32453 7.457
+8.3892 9.82048
+4.35981 4.78063
+5.49932 6.08321
+1.0107 1.53369
+2.48759 2.94139
+4.24977 5.52034
+1.93104 3.35207
+-0.733247 1.22412
+-0.354283 2.36812
+6.34728 6.44213
+5.98172 7.8753
+5.47963 6.82986
+6.01986 6.6588
+4.62793 5.22134
+7.73923 8.29761
+8.85565 9.51494
+5.55307 6.15804
+6.30963 7.17248
+9.4775 10.2636
+7.45333 7.74006
+1.79317 2.33273
+7.73056 8.44999
+3.94172 5.02778
+8.36177 9.85172
+5.91765 8.12935
+7.95436 8.97583
+5.06238 5.37907
+4.56153 4.97175
+9.47572 9.65038
+9.54745 9.922
+7.82271 8.66299
+4.19056 4.75156
+4.15657 5.72352
+0.213845 0.312444
+2.30944 2.6806
+2.42391 3.41888
+6.00512 6.88274
+6.64546 7.61145
+-0.204229 2.78228
+-0.417104 0.667252
+8.18696 8.67785
+9.27818 9.67924
+-0.0174685 0.21355
+5.91137 6.39606
+9.49268 10.1457
+2.11362 4.36526
+6.51084 7.82167
+6.07066 6.44843
+-0.653518 1.08588
+7.46736 7.87137
+5.26045 7.92188
+6.4171 6.8133
+6.73709 7.70383
+3.46451 4.23679
+0.122365 0.809853
+7.98627 8.0505
+1.71192 2.63047
+1.20624 2.12087
+4.6812 5.51566
+2.62672 2.67648
+4.203 5.1052
+5.26482 6.5186
+3.68166 3.74701
+2.72011 3.98338
+3.41652 3.71477
+2.26211 2.90374
+0.930209 1.43211
+1.98603 3.36662
+4.55838 5.9933
+5.66292 6.59838
+3.12432 3.87457
+6.54384 8.38959
+0.205059 0.331022
+8.70617 9.34121
+7.02182 7.38679
+2.36908 2.84197
+9.13221 9.76563
+7.50113 9.49245
+8.15671 8.45093
+1.9517 2.20923
+3.23368 3.43695
+2.97273 4.10133
+7.36338 8.96733
+4.77525 5.18347
+9.47774 10.3537
+1.75218 1.97051
+5.42544 6.18939
+9.75801 10.0151
+6.31285 6.38327
+8.43389 8.721
+7.6108 7.81113
+8.72029 10.3153
+5.18655 7.1101
+7.96243 8.43151
+0.798103 0.860125
+1.1289 2.77549
+5.91084 6.03085
+4.95884 5.46913
+5.88125 6.49667
+7.9394 8.9545
+5.07492 5.55063
+5.92251 6.08548
+3.88602 5.41487
+1.40122 2.15276
+8.74244 8.83223
+4.75577 6.60338
+0.921272 1.44873
+3.77361 3.90348
+8.8999 9.8518
+3.11077 4.85674
+8.56185 10.6345
+8.76335 9.00169
+6.8734 8.60197
+4.54408 4.93892
+5.57849 6.31727
+7.95161 8.30843
+1.55798 2.4957
+3.86082 3.97131
+6.45433 7.17065
+0.96021 2.32897
+6.84576 6.89531
+8.59095 8.70199
+3.57754 4.26457
+5.27979 5.74385
+2.06602 2.90525
+3.0856 4.18179
+2.76214 3.9982
+2.11943 5.4285
+3.1197 3.24389
+0.495798 1.23632
+3.18253 3.99433
+7.02072 8.37949
+2.77905 3.42643
+1.57093 2.30655
+7.10979 7.14006
+6.20994 6.72092
+8.15136 8.33899
+0.903753 1.57921
+0.380744 1.88053
+1.3164 1.79885
+0.199366 0.576639
+5.53683 6.49433
+8.8705 9.14396
+3.1401 3.98761
+4.82675 6.69396
+7.28593 8.08916
+8.11312 9.92914
+3.25737 3.42109
+2.58413 4.57223
+2.65202 2.77196
+-0.31616 1.51568
+4.1621 5.29563
+4.49155 5.21037
+7.28481 7.31722
+9.70568 10.0406
+2.39057 2.85874
+2.30626 3.16244
+1.15896 2.09616
+5.91343 7.33024
+-0.172181 0.177363
+5.08934 6.10928
+7.15508 7.55315
+4.43036 4.68093
+6.00772 6.49566
+7.9247 8.43809
+1.57028 2.52328
+3.45458 4.43692
+3.18257 4.83824
+1.48243 1.91225
+2.59025 2.99596
+6.93059 8.34359
+4.53752 7.51216
+6.42857 6.51513
+5.5663 6.13877
+7.54367 7.56485
+9.01229 9.19913
+2.84158 3.23347
+0.42959 0.620618
+8.77033 9.33787
+8.06103 8.30989
+6.48425 7.83668
+4.66949 6.00205
+4.46683 4.66247
+8.96738 9.07714
+0.463093 0.514808
+7.72986 9.44537
+6.31391 6.8289
+0.883295 1.70946
+3.73278 3.98015
+6.73453 6.92514
+3.58434 4.43262
+0.236286 1.4601
+2.00505 2.38684
+3.845 4.20708
+1.18852 3.04911
+0.766784 1.00641
+7.38781 8.11216
+8.9396 9.27589
+0.369822 1.53322
+8.76527 9.23987
+0.663408 0.803445
+9.69209 10.1455
+9.73379 10.234
+3.47602 4.89968
+4.12754 5.45249
+7.31984 8.57369
+0.989101 1.47678
+5.57662 5.83292
+4.99092 6.85044
+4.35272 4.3683
+0.0517815 1.92227
+7.2694 7.80634
+1.35565 1.42783
+8.5638 8.91707
+1.74557 2.74123
+2.18226 2.19664
+-0.901334 1.32691
+0.866613 1.03788
+5.30895 6.31774
+7.70178 8.5675
+4.06894 4.16071
+2.59697 3.53162
+4.30201 5.34212
+4.08762 4.19091
+-0.516192 0.848397
+9.85911 10.1066
+0.472991 1.40069
+6.26012 7.0054
+0.707801 2.15445
+1.73825 1.87193
+0.206301 0.831746
+7.77872 7.92715
+4.94477 5.60361
+3.86216 5.16839
+1.35166 1.54482
+2.91721 3.56193
+4.57242 4.75913
+7.09303 8.29678
+8.18431 8.92151
+6.80303 10.87
+1.29208 1.72027
+1.22224 1.31693
+5.26756 6.26459
+2.55221 3.94397
+6.58902 6.78354
+7.85917 8.89791
+6.59279 7.63115
+4.45787 7.26828
+3.48759 5.33991
+2.13838 3.86589
+1.53368 3.57313
+1.41722 3.19336
+3.48388 4.11958
+1.53756 2.98451
+7.29083 8.22109
+1.2713 2.16915
+6.94685 7.31029
+6.2494 7.04676
+3.00376 3.02028
+1.25232 1.43301
+1.50413 2.25
+2.89098 4.77198
+4.50766 5.89294
+5.5403 6.07893
+-0.101858 0.409209
+3.87963 6.1053
+-0.19564 1.46589
+-0.342077 0.694623
+6.63875 7.42223
+7.89982 9.05857
+4.91121 5.48031
+5.90743 8.35815
+7.13881 8.21597
+4.11493 5.08147
+3.59673 3.77176
+8.08236 8.3237
+1.35842 1.48934
+5.42963 5.85906
+4.60778 4.9734
+-0.607198 0.91225
+5.40263 5.7017
+5.08624 5.63236
+7.34529 9.02233
+7.30013 8.12907
+6.56106 6.75585
+6.82576 7.25434
+2.96037 3.56454
+3.60283 4.09137
+6.35408 6.71888
+-0.688103 0.84579
+8.45128 8.69771
+6.31749 7.3294
+5.82223 6.04761
+1.72983 2.38205
+6.94974 7.76985
+9.681 10.0141
+8.65394 9.2456
+2.52904 3.39548
+6.66609 7.35785
+4.18963 4.5473
+3.58643 3.80513
+2.88796 3.82413
+0.992066 1.1477
+4.57942 5.15419
+3.02826 4.32268
+5.91565 6.82087
+4.13694 5.13393
+6.28717 6.53257
+1.3149 2.36944
+0.488974 0.981461
+4.32763 4.98272
+-0.420836 0.63619
+7.13406 7.31362
+0.367782 1.91138
+6.14763 6.16713
+0.837933 1.92794
+9.3781 10.0609
+3.22887 5.44584
+5.91554 6.65974
+5.68608 6.02435
+7.99715 8.55953
+5.37106 5.38574
+0.254544 0.374268
+0.184701 0.917061
+9.38005 9.54042
+6.86741 7.35628
+0.87398 1.69093
+7.75845 8.53773
+0.370425 1.35335
+0.699837 0.810893
+3.73223 4.32089
+3.81804 3.85752
+4.85936 5.10097
+2.70381 3.10519
+3.82523 5.27699
+9.13422 10.3317
+4.62775 4.77988
+7.91139 7.95504
+2.72614 4.79958
+0.863357 1.88643
+4.14155 5.02327
+2.49683 4.11585
+1.06741 1.11516
+6.20979 8.38443
+0.936362 2.46703
+6.58231 7.85063
+1.89469 2.31422
+8.70668 9.14006
+5.76486 6.1122
+3.15778 3.76679
+0.248282 2.19881
+1.25317 1.92694
+7.81837 9.53067
+-0.582906 0.818904
+8.34194 8.37845
+4.4913 5.10164
+3.86376 5.5453
+6.94054 7.68699
+2.07462 2.5811
+0.518698 2.1529
+3.51773 4.60946
+8.39915 8.98446
+1.63685 2.19755
+6.60737 9.05917
+2.06667 3.23994
+3.18822 3.31219
+2.44332 3.22088
+4.755 4.87118
+4.34245 4.91565
+4.64562 4.8104
+2.73282 3.35646
+9.48057 9.86441
+0.640899 1.03356
+0.789475 0.925731
+1.4247 1.58347
+1.47747 2.25408
+8.8612 9.81597
+8.44147 10.6885
+9.07046 10.0877
+0.350125 1.15765
+4.45375 5.73964
+4.06526 4.26457
+7.50776 8.23491
+1.55452 1.63786
+2.8399 4.52559
+1.34319 1.47951
+5.21572 5.65702
+5.85695 6.75574
+8.21826 10.657
+-0.0479956 1.79162
+1.72905 1.78113
+3.35685 4.03797
+3.7123 5.82296
+8.56751 10.2992
+4.07987 4.25273
+5.8347 6.07253
+3.25283 3.99065
+9.31995 10.3647
+0.649025 1.14496
+1.06966 2.04182
+7.59831 7.85826
+3.35263 3.84374
+4.91371 5.10148
+8.0875 9.23421
+3.00484 5.14282
+8.60448 9.09442
+5.61429 6.24037
+3.4729 4.17907
+7.18702 7.26274
+0.729966 0.928899
+2.27264 2.81241
+2.67248 3.91661
+3.98443 4.64406
+5.50463 6.92435
+-0.257961 0.905736
+5.71363 6.67387
+4.12643 4.66467
+3.97623 4.64917
+9.71227 9.8243
+8.66674 8.97634
+7.94673 8.73904
+7.45228 8.14466
+3.78405 4.81189
+4.05505 5.00011
+2.84957 3.15451
+6.93785 7.58172
+1.85006 1.96814
+6.82256 7.00166
+2.42727 2.68161
+8.06129 8.76308
+1.53758 3.67482
+2.5057 4.18495
+7.09618 7.79664
+1.12843 1.46228
+1.61447 2.2668
+5.58639 5.70776
+8.15398 8.34959
+2.49733 2.57643
+5.18817 5.32462
+5.62963 5.86377
+1.95215 2.26641
+7.22129 7.23255
+5.99833 6.18639
+6.20875 7.13868
+6.814 7.6597
+7.41314 9.49798
+5.48819 6.31634
+4.81318 5.08156
+9.15434 9.42787
+4.83201 5.43295
+1.44477 2.6455
+8.8907 10.4727
+3.19487 3.21255
+1.47291 3.13113
+4.14796 5.10058
+5.85016 8.41212
+7.58183 8.53659
+9.5978 10.2877
+1.5954 2.58394
+2.65561 4.0975
+-0.157024 0.16627
+7.04379 7.75368
+2.39896 2.7728
+2.42376 3.58085
+0.158653 0.857045
+7.82101 9.01833
+6.80499 7.35261
+6.62833 6.66255
+4.90229 5.45681
+8.50205 8.69236
+2.01845 2.06924
+8.2503 9.04222
+4.58265 5.52758
+8.6176 9.74887
+1.28468 1.77019
+5.40424 6.20705
+0.943905 1.98023
+4.2702 4.41287
+3.89454 4.4814
+0.585132 1.56351
+9.45354 10.5374
+3.7501 5.07553
+7.53248 8.14004
+4.60026 4.78921
+1.61073 4.22368
+6.22591 7.40966
+0.57866 1.0522
+5.877 6.55882
+3.54573 3.7731
+7.64294 7.66103
+8.2399 9.14032
+0.307808 0.571367
+7.89791 9.25734
+5.2852 5.84332
+0.45713 2.42223
+7.73426 8.48158
+8.0058 9.46405
+8.03189 8.41868
+1.54624 1.98914
+7.24167 7.27699
+8.61226 8.83199
+5.38365 6.52599
+0.827018 1.51428
+7.19285 7.48372
+-0.0969552 2.16007
+4.08084 6.32563
+9.16026 10.2604
+0.206147 0.717435
+4.00643 4.8093
+2.16139 3.14759
+1.73359 3.13485
+9.1103 9.36052
+7.05621 7.43901
+4.83509 6.07581
+5.67164 7.89488
+7.93353 8.18454
+2.59566 3.1842
+3.62521 4.95121
+3.0297 3.18649
+1.08515 2.69289
+3.77063 5.7789
+0.106035 1.27409
+0.601099 2.13481
+6.98837 7.58833
+9.22955 9.79149
+1.6398 1.78726
+2.30423 3.34814
+2.3912 2.81842
+4.71724 6.16966
+5.13553 5.5016
+5.34117 5.45075
+9.32776 10.0676
+4.54244 5.29058
+4.01337 5.73188
+8.17427 8.39652
+1.96122 2.6921
+0.594267 1.00176
+-0.136973 0.977133
+6.41362 6.78056
+1.68388 2.39891
+9.50795 10.2315
+-0.262703 1.15557
+8.72229 9.683
+5.41821 5.67519
+4.93514 7.15867
+4.07046 4.26702
+-0.00866106 0.252353
+8.65877 10.1527
+2.10958 3.40353
+2.94947 3.43201
+6.32014 7.06279
+2.55034 2.89646
+3.87777 5.68044
+2.05325 3.00968
+5.11855 6.55784
+8.99618 9.22608
+3.36303 3.84902
+2.6234 3.70832
+7.35189 8.30856
+6.43777 7.28495
+5.33954 5.48055
+0.15999 0.391114
+3.4492 5.07088
+2.38503 2.42742
+3.88912 4.93246
+2.76303 4.54991
+6.56261 7.60381
+3.64198 3.72471
+1.70542 1.78806
+9.71115 9.88315
+0.471586 1.82377
+9.27611 10.5725
+0.486889 0.851587
+4.39234 5.10637
+9.54209 9.8955
+6.99602 7.42461
+2.98797 3.74623
+5.89424 6.4498
+9.63845 9.86333
+4.39828 5.18646
+2.30118 3.5758
+8.68128 9.56011
+9.00505 10.4304
+-0.22184 0.233296
+6.48492 7.60283
+1.54156 2.60693
+4.06808 6.39369
+5.52361 6.26241
+-0.698727 0.745524
+2.30742 2.41924
+0.655833 1.65752
+6.94733 7.81866
+7.83136 9.10651
+6.45284 7.1931
+6.09683 6.66159
+9.03299 9.4163
+1.86392 3.26189
+0.54863 2.07194
+0.364026 1.38376
+0.706954 1.0736
+-0.111015 0.584367
+1.54265 2.1413
+0.501172 0.57928
+2.09411 2.28902
+1.89894 4.09104
+8.72895 8.87045
+5.27709 5.72545
+0.164581 1.64188
+8.39203 8.73608
+8.21523 8.45002
+9.62006 10.1665
+4.79076 6.26442
+3.44189 3.68669
+8.93789 9.38343
+7.07036 7.64194
+8.34396 9.56445
+8.29992 8.64954
+5.82566 7.83287
+2.43008 3.4476
+1.81121 2.12203
+4.36108 4.3842
+6.28756 6.95939
+3.8698 5.79519
+0.644581 0.699162
+9.71982 10.2422
+4.86545 5.00544
+8.3808 9.29356
+1.34495 1.40972
+1.03641 2.01838
+8.55609 9.99958
+1.40813 3.46097
+3.20928 4.08838
+8.24345 9.11587
+1.27604 2.03462
+8.28298 8.46252
+2.20644 3.19585
+1.91396 2.30108
+4.2553 5.66006
+7.34925 8.38275
+6.28319 7.22199
+8.42171 9.62596
+1.12059 1.18262
+1.37555 1.84196
+4.39663 4.93639
+9.28044 9.58437
+5.47407 6.88593
+8.36529 8.49813
+9.40208 10.5922
+-0.451389 1.92404
+2.89431 3.19453
+6.51433 8.02158
+5.52163 6.06786
+7.63525 9.86457
+4.13898 5.05845
+0.136662 0.503748
+6.13492 6.74997
+8.37416 9.18971
+8.64164 8.82663
+0.941173 1.16158
+6.9073 8.26916
+8.37278 8.44326
+8.8951 9.20427
+8.40149 9.17577
+3.60361 4.57183
+8.67263 10.1127
+5.89716 6.45412
+1.97285 2.35593
+7.22973 8.13467
+9.55645 9.92529
+0.261578 0.836274
+9.04414 9.45485
+6.18043 6.54229
+8.88579 9.54087
+1.82613 2.93849
+5.7599 5.96366
+5.23105 5.5541
+0.425229 1.44436
+0.32065 2.60892
+7.83655 9.48786
+2.3168 3.45972
+2.35466 3.23342
+8.24494 8.27258
+7.32678 7.74264
+8.37275 10.0741
+4.17337 4.98348
+-0.162009 0.724431
+9.49757 9.76377
+8.69435 9.08089
+4.13841 4.7514
+7.26358 7.55514
+6.91912 6.93
+6.7883 7.18296
+-0.614315 1.1857
+6.05907 7.33557
+4.86704 4.87705
+8.50012 9.14836
+1.83683 3.09895
+6.16389 8.39248
+3.03556 4.41004
+4.72416 5.05782
+1.98183 3.19183
+2.77103 5.71501
+4.90002 4.9817
+0.269258 0.725628
+5.59551 7.05038
+2.95416 3.09633
+2.17662 3.18385
+6.67536 7.56762
+7.31678 7.39321
+3.84158 3.85359
+4.38203 5.10149
+0.816784 1.09918
+0.70131 0.739502
+0.276631 2.32633
+9.15839 9.49433
+0.721295 1.97673
+2.63875 2.75437
+5.00344 5.5645
+2.24555 2.81234
+7.74465 9.07646
+2.35244 4.90632
+0.812093 0.954419
+3.97904 5.2071
+4.19177 4.83646
+0.853012 1.331
+2.64112 3.25613
+0.0894716 1.61954
+3.39617 3.40859
+1.56906 2.28518
+2.37258 4.36515
+1.60997 1.7561
+5.15275 5.33281
+6.47824 7.47529
+2.51145 3.29949
+2.71094 2.77785
+8.84653 9.48398
+1.3246 1.66664
+7.43718 7.5546
+3.68985 4.24649
+4.50553 4.51669
+4.15617 4.54887
+8.55319 10.2136
+2.1448 3.55805
+4.64594 4.71505
+1.71763 1.99977
+4.98066 5.46709
+7.7779 8.36497
+-0.0604997 0.301294
+5.11873 7.32867
+4.94567 5.5986
+5.32645 6.26835
+2.5768 3.13511
+3.31604 3.87555
+1.60834 2.68762
+3.30552 3.85211
+4.26741 4.98636
+0.820475 1.18854
+7.91501 10.7203
+5.17391 5.30351
+4.00452 5.75141
+2.37722 3.4602
+2.2373 2.94837
+1.62462 3.48264
+7.98507 9.2566
+5.32504 5.56388
+0.760614 0.7802
+0.855659 1.01522
+3.11231 4.43223
+5.62821 6.21564
+4.96845 5.35921
+8.10559 9.11106
+1.02533 1.13103
+6.99976 7.0788
+1.87628 2.58801
+1.11023 2.24655
+5.23343 5.45086
+0.95875 2.25343
+7.45917 8.23614
+2.72245 3.04663
+8.66816 8.70698
+5.55734 7.12262
+1.01935 1.88271
+0.804417 1.76187
+7.82703 8.78426
+4.77321 6.15199
+2.91503 3.69352
+0.776735 1.08883
+5.19981 5.46442
+9.06483 10.4008
+7.72082 8.26398
+2.9854 3.26573
+0.584028 2.60443
+0.700994 1.10379
+5.47612 5.94502
+-0.318442 0.986786
+5.0704 5.08055
+3.83732 4.4826
+5.60843 6.59005
+8.81432 9.7851
+6.28792 6.65284
+1.16812 2.27701
+7.15234 9.66795
+9.02188 9.15339
+1.76112 2.04839
+7.49419 7.6204
+5.1765 5.497
+1.45855 1.94969
+1.35003 1.55822
+2.50453 2.86815
+7.10451 8.51352
+3.87727 4.1124
+1.84876 2.79351
+3.01661 4.05396
+-0.16814 0.366484
+-0.538895 0.608786
+7.59933 9.00744
+0.938648 2.38471
+5.76934 6.16572
+8.20416 8.62505
+8.64542 8.7264
+2.75784 2.7828
+0.794451 1.97817
+9.21331 10.5156
+8.46671 8.80572
+3.94814 5.16845
+6.73654 6.97397
+4.05301 4.93008
+6.37833 6.77985
+7.21161 8.15994
+3.74993 4.61029
+-0.127938 1.09853
+2.82957 4.28816
+6.50564 6.59445
+8.37926 8.48332
+0.757443 1.74585
+0.232438 0.972293
+6.99187 8.7098
+7.20368 8.44301
+4.4801 6.07501
+4.34015 6.1495
+2.19394 3.22334
+7.29817 8.41021
+1.16627 2.68901
+4.62423 5.08039
+0.955655 2.22882
+1.45862 3.07065
+1.69815 2.56291
+4.01179 4.36587
+7.135 7.75829
+6.6823 7.27765
+5.44745 5.67195
+4.94594 5.42067
+0.267772 0.301939
+0.676432 1.6296
+1.37335 1.91645
+1.89051 2.38631
+4.84386 6.30539
+8.95613 10.944
+2.18119 2.41821
+5.74901 6.16952
+7.5431 7.88071
+9.05278 9.8128
+0.201334 1.65323
+2.82787 3.82083
+3.07073 3.08475
+8.99671 10.1766
+5.43261 6.12137
+4.83693 4.86848
+6.31804 7.21544
+2.34491 3.2562
+6.05941 6.53725
+-0.483381 1.17347
+5.53777 5.72651
+3.28875 3.47472
+3.94609 4.9418
+7.45585 8.6871
+1.50066 2.57215
+8.10112 8.67954
+6.24737 6.42635
+0.64413 1.05759
+7.1741 8.21476
+0.502722 1.77462
+0.783663 1.74174
+9.52704 9.9109
+-0.473873 2.01013
+7.07946 7.11474
+0.857335 1.6501
+4.00225 4.84453
+5.40598 6.30573
+8.18802 8.30067
+9.00412 10.9588
+9.8362 10.1517
+7.62735 8.37572
+3.41477 4.63099
+2.51254 2.81559
+6.36702 6.56061
+5.11842 5.35515
+5.21873 5.73296
+5.73528 7.77276
+3.64993 4.66826
+7.12664 8.46553
+8.7257 9.16851
+1.27615 2.20376
+7.46188 8.20752
+2.64939 2.66373
+4.94147 6.0509
+6.3805 7.48841
+6.25197 7.12327
+0.0885331 1.2682
+4.97356 6.58488
+4.11917 4.27267
+9.08793 9.70385
+0.897277 1.31702
+6.87538 8.25544
+1.55565 1.59492
+2.62483 3.54274
+1.49631 2.92263
+9.45305 9.97728
+6.24087 6.4577
+3.94636 5.13669
+-0.000956745 1.08235
+1.46134 1.83767
+9.18517 10.6601
+-0.740186 1.81269
+5.81977 6.15818
+7.0529 7.99421
+6.17753 7.49749
+8.63091 9.04205
+9.65219 10.1558
+3.12839 4.99211
+2.97262 4.07384
+4.28605 4.33171
+4.15906 5.6805
+1.35165 1.50732
+0.524207 2.12307
+5.32468 7.01472
+3.16982 4.87893
+6.88786 8.34191
+3.81703 5.22335
+3.86772 4.37359
+8.19386 10.0705
+1.73155 3.16695
+4.31685 4.62261
+9.40618 9.89612
+4.41215 5.19659
+2.35595 2.63543
+7.88481 8.14203
+7.17062 10.3534
+9.41379 10.389
+7.99867 9.01239
+3.31382 4.04915
+5.39222 6.07657
+8.5187 8.65976
+9.30132 10.6131
+7.17351 7.93596
+4.80134 6.72724
+3.59756 4.65182
+1.08248 1.17479
+1.03124 1.06871
+6.43154 6.95098
+-0.102199 0.59801
+4.94795 5.18081
+6.39126 7.30258
+1.52738 2.04271
+1.80373 2.33093
+2.72251 3.01677
+0.296722 1.10844
+6.39104 6.51567
+8.70965 8.78714
+2.07858 4.41695
+1.91027 2.9718
+1.42944 2.01864
+1.96347 2.73397
+4.0701 4.22456
+4.02859 4.05107
+7.10977 7.98092
+8.21148 9.54287
+6.59231 7.65109
+0.144191 0.830665
+2.0192 2.23704
+8.03482 8.39591
+8.90473 9.98543
+2.18284 2.70166
+3.05569 3.54238
+8.35319 9.39539
+2.00803 2.42866
+2.35282 3.13763
+2.20155 2.79377
+1.76531 2.94892
+7.52749 7.72567
+3.02266 3.24778
+4.01741 4.22521
+9.75263 9.91571
+6.45502 6.67838
+2.24912 3.47262
+1.84372 2.26517
+4.09559 5.71188
+1.43811 2.33732
+3.89171 4.16905
+3.01506 3.9725
+0.0273168 1.51766
+5.04118 5.80507
+3.08517 4.17316
+8.81637 8.8332
+8.74055 9.50143
+2.36904 2.69008
+6.39733 6.44221
+8.53272 9.51114
+9.48423 9.55002
+8.65645 9.04872
+6.66352 7.48009
+5.64389 7.88656
+5.75301 6.6759
+3.28645 4.22757
+4.99482 5.82988
+3.00004 4.0273
+1.45249 1.56662
+4.96263 5.32195
+7.91351 8.1437
+1.02034 1.56249
+0.71376 1.73319
+0.709968 1.44651
+9.01414 9.54799
+4.02116 4.68005
+7.10903 7.27075
+7.21322 8.71031
+1.6644 2.27186
+3.71304 4.68764
+9.66257 10.1452
+5.34477 5.46136
+9.27722 10.583
+3.82328 4.83316
+4.77019 5.07928
+9.07112 9.23836
+6.99091 7.25634
+2.11871 2.3054
+7.88242 7.98572
+0.570809 0.714073
+8.51532 9.49151
+0.329247 2.48897
+4.78202 5.36476
+1.47969 2.78867
+6.75011 7.36769
+2.31162 2.39533
+3.50434 4.48026
+5.84603 6.28861
+7.5337 7.62538
+1.09955 2.85741
+6.09915 7.20381
+0.933825 2.37925
+0.576363 2.0182
+3.12126 3.22507
+2.85313 3.02656
+3.25724 3.92077
+5.48575 6.58011
+1.02824 1.65415
+8.68703 9.06219
+3.28389 3.86349
+5.80264 6.12775
+7.11846 7.47444
+1.29638 3.38601
+6.37908 7.05986
+-0.592438 0.854361
+0.39233 1.17768
+2.1497 3.94423
+2.42336 2.43441
+6.94806 8.30626
+0.79865 1.4173
+1.41455 1.43684
+0.240074 1.16712
+4.18593 5.9929
+6.161 6.564
+0.726091 1.90706
+0.375606 0.694866
+4.09349 4.26452
+2.01652 2.68038
+8.99301 9.90549
+8.93909 9.17673
+1.10427 2.01247
+9.12668 9.15282
+1.08098 1.55374
+0.377836 0.414809
+7.28611 8.86318
+8.3542 8.53251
+3.86353 4.12875
+6.7631 7.40068
+4.61679 4.78182
+2.12935 3.45492
+3.68233 4.0457
+6.68131 8.22111
+8.79197 8.80474
+1.8915 2.26287
+0.387586 3.073
+6.46798 7.57381
+7.79742 9.34526
+-1.21538 1.67303
+2.07845 2.66028
+3.14148 4.46647
+1.66789 2.73375
+8.49821 10.0574
+8.42537 8.89906
+0.618349 2.72887
+6.8229 7.54501
+6.99343 7.35322
+7.34223 8.68781
+3.18834 3.98274
+8.86908 10.2535
+3.39839 3.76171
+0.188168 0.392276
+1.68187 3.53401
+6.50423 6.71714
+7.61191 8.89715
+1.68463 2.09275
+5.94627 7.6003
+2.15865 3.24126
+7.93639 8.53826
+2.99626 3.43273
+7.71028 8.41172
+3.19472 4.60878
+8.36123 8.92549
+8.92975 9.02783
+2.87187 3.49672
+6.76949 7.71139
+8.09121 9.31151
+6.84199 7.44009
+0.730655 0.800873
+7.5208 7.54109
+6.75992 7.55017
+6.09818 6.17399
+0.639209 1.27283
+3.01917 3.22327
+1.69181 2.60614
+9.49245 9.5842
+-0.418034 1.08035
+5.77705 6.4705
+6.79362 8.51993
+9.73155 9.81609
+3.71503 3.92022
+6.18589 6.77634
+3.94124 4.23942
+7.59911 8.05275
+3.68865 5.10948
+7.63926 8.63019
+-0.049855 0.0844425
+-0.41188 0.807786
+1.35962 1.81039
+5.40579 6.15098
+1.38594 2.0059
+6.93444 8.71958
+7.01229 9.38008
+-0.0974976 0.962679
+4.74131 6.59152
+1.02343 1.59245
+1.55629 1.9128
+6.28353 8.38021
+5.66349 5.79644
+1.72629 2.28563
+1.64539 2.82654
+0.359466 1.05106
+4.37569 4.82703
+5.87657 6.37853
+1.46316 1.65333
+7.44494 7.5985
+1.16846 1.98579
+4.43371 4.93234
+2.31838 2.47777
+7.52687 8.44423
+6.08056 7.42253
+9.16144 9.94783
+4.74382 4.95616
+0.248344 1.05335
+6.12345 7.43941
+9.45647 9.99799
+3.77124 4.75199
+3.31315 3.44873
+-0.0909828 1.51271
+7.03234 8.02546
+8.11403 9.11461
+6.734 7.34799
+1.08903 1.18319
+2.72871 4.31607
+6.53688 7.52754
+1.07868 1.27792
+6.28409 6.56795
+4.89866 5.79458
+9.06994 9.1221
+2.54989 3.14338
+3.69971 5.71717
+3.7113 4.55076
+8.91864 9.64522
+8.75634 8.82359
+9.02242 9.03869
+3.59945 4.20169
+4.98557 5.07401
+4.81526 5.74009
+7.264 8.63749
+2.79579 4.43389
+2.87204 4.66432
+2.32487 3.72127
+3.99704 4.72567
+8.17229 9.0158
+-0.72926 0.823658
+2.52355 3.32725
+5.3446 6.63868
+4.48935 7.37833
+3.08173 3.0968
+2.41585 3.23026
+9.23187 10.5413
+5.50099 5.51888
+1.29634 1.88846
+-0.0113225 1.41526
+6.34508 7.53417
+0.383019 2.25144
+5.0649 5.40222
+3.08221 3.76296
+9.29111 10.6833
+2.19714 2.94735
+8.75711 9.48583
+8.61564 8.69349
+1.9362 3.96191
+3.7962 4.44382
+7.78501 9.03843
+5.79649 7.29675
+6.03048 7.4316
+1.31105 4.36446
+6.5882 7.03622
+4.88148 7.12474
+6.62305 6.90973
+2.27488 2.73731
+8.42703 9.28888
+7.72928 8.53989
+7.27021 8.63879
+0.992908 1.92001
+-0.282737 0.511292
+7.88963 8.03117
+6.93371 8.26148
+-0.0346633 0.403617
+8.7827 8.82558
+5.16876 5.59742
+8.61275 8.73843
+5.70578 6.02783
+9.08706 9.35903
+9.32728 9.83021
+9.20058 10.2497
+6.79824 7.3024
+7.17979 7.51783
+0.918555 2.67878
+7.9662 8.63241
+8.85903 10.3145
+9.34614 10.1964
+9.05027 9.79872
+8.28959 8.45837
+1.32518 2.04557
+8.72848 9.16742
+5.92126 6.77277
+8.31504 8.78631
+1.02487 1.70172
+4.45204 4.72842
+8.20636 10.4724
+5.86211 6.25457
+6.15754 7.71303
+8.37832 8.82577
+4.25233 4.59417
+9.41451 9.95324
+9.372 10.4461
+1.8346 2.7144
+8.00681 8.14717
+7.03997 7.06753
+7.16892 7.70102
+7.01781 7.46799
+1.78526 1.7969
+1.63304 2.2011
+8.59718 8.61083
+9.43498 10.3636
+4.98718 5.32487
+3.65451 4.89601
+8.82368 9.11333
+-0.104862 0.598773
+4.97756 5.62342
+1.99876 3.24686
+2.32242 4.01096
+4.04914 4.77892
+3.81545 4.32583
+3.30153 3.46783
+3.14287 4.04718
+8.65711 8.76768
+9.09385 10.6898
+4.82771 5.64405
+5.98783 6.36785
+7.93397 9.6543
+4.89726 5.65486
+5.08717 5.22314
+6.59377 7.23748
+3.58289 3.98597
+0.177884 0.397629
+5.30856 5.79257
+2.53943 3.98007
+6.51217 6.59644
+0.196888 1.99904
+3.8709 4.1901
+2.37646 2.50997
+7.03837 8.13287
+6.8674 6.89535
+0.576964 2.08851
+0.902928 2.86981
+8.59261 9.20279
+5.96621 7.49899
+0.617602 1.83267
+2.29189 2.6361
+4.34207 4.61026
+6.19963 6.76443
+1.15955 1.44068
+5.25852 6.33905
+6.37306 7.53103
+9.13334 10.039
+8.67743 9.93959
+5.62973 6.04375
+8.32286 8.77042
+3.28772 6.1722
+4.97902 5.47249
+3.37765 5.07238
+4.58025 4.84341
+2.76807 3.18817
+4.27581 4.43023
+6.92572 7.68461
+0.279247 1.0561
+1.10903 2.61106
+6.71708 6.73132
+2.66415 3.75702
+8.0513 9.80334
+4.82466 6.04232
+2.59971 2.85768
+9.04689 9.73945
+3.48338 5.16622
+7.90925 8.92774
+7.30264 8.06247
+7.59087 8.26476
+0.150315 0.423068
+8.62726 9.74636
+9.01983 9.71707
+6.84007 7.40541
+8.87829 9.48342
+2.69214 3.71481
+0.580036 0.77289
+9.474 9.83397
+5.80151 6.08527
+3.63837 5.27137
+8.5848 8.65779
+7.88338 8.13276
+3.27992 4.20963
+6.21244 7.28079
+-0.348924 1.38478
+5.26688 5.93787
+3.78941 5.01009
+6.41929 8.38529
+1.41724 1.67733
+0.212821 1.58246
+0.0697189 0.160497
+9.57839 10.2377
+9.03332 9.70645
+4.94572 5.15163
+3.16999 4.536
+5.77494 6.68359
+5.89258 6.11852
+7.72257 8.21668
+8.42501 8.44905
+8.7196 8.86465
+4.392 5.1076
+1.88249 2.54422
+1.38092 1.60326
+5.04142 6.37374
+4.31795 5.91152
+1.79399 2.09314
+6.65405 8.32262
+1.36356 1.58538
+5.45456 6.55824
+4.95807 6.22848
+8.72077 10.2825
+0.745968 2.01546
+6.85041 7.11076
+4.82028 5.34442
+5.77673 8.01294
+8.58582 9.33714
+8.49884 9.21533
+9.05574 9.4096
+3.19932 3.27024
+9.50227 9.96685
+0.771636 1.0617
+9.00621 9.36397
+-0.097167 1.39463
+7.79622 8.43537
+8.05228 10.1504
+2.21685 4.17072
+1.82476 2.45381
+4.34408 4.56578
+9.27538 9.54701
+6.80153 7.44115
+7.38884 7.84448
+7.17526 8.00165
+5.85812 7.67326
+5.25545 6.30791
+5.68518 5.94055
+3.77685 4.1545
+0.530928 0.737248
+3.9772 4.59563
+8.96322 9.45618
+7.98322 8.44165
+3.42929 4.22329
+3.66445 4.7583
+-0.183652 0.434842
+3.16492 3.95726
+6.87407 7.89944
+5.08921 5.7745
+2.85466 3.04505
+7.12685 7.41248
+0.715419 0.876676
+3.47441 5.21753
+9.13594 9.87799
+5.52459 6.35691
+5.12544 6.12935
+2.44296 2.91543
+2.75148 4.19886
+1.43478 4.3919
+6.6352 7.07768
+4.72283 5.11506
+6.36434 7.69268
+2.32643 2.75289
+5.46566 6.22854
+6.37995 6.76989
+1.52564 3.55871
+1.05807 2.19393
+1.95374 4.08727
+8.11273 8.12767
+2.85955 4.71355
+4.89009 6.88516
+2.06859 2.25512
+7.50556 8.77923
+4.43353 5.11915
+5.16308 5.9695
+1.12072 1.69277
+3.96494 4.38143
+7.06931 7.89524
+0.514522 1.51265
+6.56389 7.01146
+1.51362 1.8541
+4.90339 5.51209
+2.11422 3.15457
+2.50094 3.92557
+8.24319 8.62826
+-0.0843505 0.710377
+6.35956 7.89457
+-0.790954 1.2964
+4.02253 5.19193
+2.7425 3.46763
+9.41469 10.1367
+1.57636 2.25105
+3.18647 3.38738
+8.36644 9.66791
+0.180846 0.461221
+7.07675 7.71881
+0.265366 1.19275
+5.43007 6.4854
+9.13912 9.23294
+9.52905 10.4029
+1.18712 2.66227
+5.22714 5.62601
+1.87413 2.8716
+5.71882 6.16374
+5.38169 6.13948
+-0.196005 0.236738
+5.36803 6.4395
+8.27713 8.71262
+8.82031 8.8598
+-0.53845 0.564783
+1.80716 1.94173
+5.67905 7.47291
+2.37779 3.64893
+0.574727 0.766424
+4.60701 4.86591
+3.17989 4.37738
+1.36777 3.15112
+1.48092 3.06573
+3.37009 4.06028
+4.17179 6.2073
+6.47953 6.88994
+5.74431 6.5253
+4.88827 5.49049
+5.44148 5.59239
+1.66153 2.63132
+7.69387 7.82267
+5.20911 5.48488
+-0.103218 0.497402
+7.18003 7.33324
+6.54305 8.81732
+0.278108 1.27452
+2.38323 2.94772
+1.2461 2.03246
+5.47052 5.75781
+7.31505 7.35895
+2.22248 4.23589
+0.0305319 0.430773
+8.32043 10.1222
+6.11732 7.09764
+5.08797 5.74991
+6.62491 7.34164
+5.55795 5.66083
+3.27549 4.13145
+1.0113 3.24631
+0.0717186 0.519738
+7.82905 9.30839
+9.90251 9.98691
+0.841457 0.952276
+-0.133927 0.510174
+1.14614 2.82218
+2.59767 4.19742
+3.41095 3.95265
+3.38951 3.75838
+8.86766 9.19437
+9.27927 10.261
+2.33249 2.79402
+5.69681 5.93469
+4.02502 5.38732
+0.797157 1.22845
+7.23558 7.8651
+1.1253 1.99184
+8.58296 8.64267
+-0.400141 0.74698
+3.46677 3.50526
+6.03252 6.64842
+5.8493 6.68938
+3.53209 3.84014
+7.22078 8.98106
+6.21943 7.69944
+0.887198 2.07323
+3.36591 4.57442
+4.30143 6.41179
+4.07556 4.54276
+8.77552 10.0615
+6.7247 7.04044
+9.05494 10.1126
+7.46604 7.80632
+3.38601 3.8043
+5.60475 7.02788
+9.09811 9.4654
+9.33447 9.80012
+8.66499 10.1002
+3.87007 3.88281
+2.87624 3.11359
+5.92385 6.80801
+4.49711 5.01863
+8.84524 9.36225
+6.40944 6.82093
+2.90915 3.68288
+3.96801 4.82534
+5.51744 5.84233
+3.2959 3.44409
+0.18526 0.207322
+5.49717 5.72648
+6.9522 7.1952
+0.769572 1.79343
+5.95522 6.03918
+6.54327 7.7475
+2.13516 3.83957
+-0.388892 0.775076
+1.30128 2.29414
+9.76761 10.1604
+7.38731 8.66002
+7.09229 7.43495
+9.1379 9.52432
+6.75942 7.88717
+7.42824 8.82063
+6.93078 8.19884
+2.307 2.93836
+8.38254 8.84691
+3.90159 5.37938
+0.0413204 0.112203
+0.638217 1.53943
+0.88678 2.49435
+1.99104 2.60847
+6.61595 7.65064
+2.37641 4.71719
+7.94945 9.21404
+5.44594 7.13646
+5.45737 6.12335
+7.39207 8.02885
+5.51588 7.39341
+8.1581 10.0632
+0.197869 1.44516
+-0.0161139 0.73487
+4.24155 4.7304
+0.00374564 1.26481
+8.1878 8.20011
+-0.115544 1.74771
+0.912347 2.52922
+2.72234 4.83268
+6.45577 7.07776
+9.74201 10.1772
+7.11008 8.72914
+4.41921 4.8673
+7.97673 8.36658
+0.438659 0.647061
+4.35086 5.44482
+8.22919 9.34379
+3.53242 5.65576
+1.126 2.32177
+5.95118 6.51364
+3.10519 3.9447
+1.28889 2.26267
+7.04255 7.67791
+3.12614 3.17626
+8.09968 8.49162
+6.07924 7.219
+5.99554 6.52549
+9.14378 9.5773
+5.82872 6.53112
+9.3361 10.1704
+4.3751 6.51675
+3.288 3.98328
+4.56342 4.80185
+7.16574 7.43901
+7.7638 8.47758
+7.31514 7.78499
+7.98942 9.50252
+4.31211 4.70724
+2.9094 3.33304
+0.108736 0.668815
+8.08409 9.11098
+-0.0053985 0.589992
+1.31926 2.72153
+2.28664 2.38813
+7.95237 8.26388
+-0.0283047 0.452099
+7.50295 8.71708
+7.72356 8.63468
+3.48953 3.89579
+7.73814 8.73456
+4.54487 5.45817
+6.45109 7.00312
+3.99915 5.41716
+6.81436 8.5682
+6.86726 7.55999
+2.67863 3.7053
+2.6837 3.39567
+2.84347 2.91724
+5.79383 5.80493
+2.41217 3.0619
+8.78163 9.0998
+1.43456 2.50854
+6.73393 8.53005
+3.02563 3.56456
+3.34628 4.2934
+2.44985 2.92819
+1.38262 2.89341
+4.56337 5.75702
+0.275735 1.16604
+1.39763 2.8108
+9.69128 9.90361
+8.54868 9.66756
+3.01838 3.72831
+8.34017 10.5262
+1.82721 3.0476
+5.9732 6.83307
+2.77874 4.25603
+1.71987 3.1227
+6.33773 7.89103
+1.31982 2.82992
+4.21601 4.9627
+6.68166 6.72653
+0.87708 1.06828
+1.03483 1.26625
+2.996 4.03087
+1.54718 1.57452
+2.33087 2.38226
+2.29464 3.36496
+2.03064 3.41867
+5.8456 6.10406
+7.54614 8.2874
+1.42938 2.89154
+2.65935 3.53883
+3.98845 4.42049
+6.85632 7.15487
+8.12038 9.34993
+0.873558 1.32129
+6.61595 8.00766
+9.49147 9.81947
+-0.0225601 0.328769
+-0.481519 1.37204
+6.31457 7.45251
+4.59738 5.81395
+4.83304 5.63008
+1.95746 2.78657
+2.97889 3.74408
+9.08327 10.702
+3.58219 4.93634
+7.87068 9.77851
+0.330978 1.36031
+4.78145 5.36918
+4.94672 5.56644
+7.66806 8.08613
+4.78512 6.35461
+5.17367 5.74386
+8.65884 9.97088
+9.22053 9.60447
+6.15061 6.58817
+0.0875971 0.541643
+6.45597 7.92002
+0.636824 1.05267
+5.31677 6.12838
+6.51127 6.6731
+0.459551 1.69382
+5.75106 6.41377
+3.68438 4.67415
+9.36302 9.78281
+5.46195 7.99215
+2.55471 2.59231
+-0.0640245 1.33755
+9.36027 10.6198
+2.67955 2.77882
+3.51443 4.10619
+6.83904 7.23692
+2.59553 2.81418
+7.74628 8.95169
+3.86464 3.90067
+3.32377 3.992
+1.43737 2.52191
+3.83927 3.99402
+5.24426 5.35179
+0.833857 1.05277
+8.4062 8.51964
+9.62299 9.66254
+3.55427 5.19048
+1.7003 2.62107
+6.8059 7.49246
+-0.761104 0.773528
+1.37137 1.95048
+2.1222 2.59387
+0.633505 2.04796
+0.605156 1.04336
+7.22842 8.3365
+4.28716 5.28921
+8.14286 9.52015
+7.62467 9.18603
+1.11029 1.81278
+5.05654 5.13597
+0.862653 0.97827
+7.24766 7.92167
+8.80103 8.91467
+3.05841 4.82292
+1.28204 1.55969
+1.58886 2.57874
+0.0537678 1.28837
+8.09303 9.71678
+8.37599 8.85705
+3.18107 4.01971
+6.67019 7.75848
+6.29836 8.21603
+0.86271 1.30358
+3.86126 6.49694
+5.84446 6.24913
+0.475025 0.598151
+6.3477 7.08327
+3.60161 4.51824
+7.13317 8.13858
+4.89052 6.23701
+5.69441 5.99027
+7.18735 8.34853
+9.30182 9.34894
+6.06589 6.15141
+8.05917 8.89642
+5.6136 7.14058
+0.838337 0.959487
+0.56421 2.00841
+6.46876 6.63629
+2.4434 3.92184
+7.97216 9.45372
+8.17926 8.66756
+1.86522 2.01888
+0.983342 1.89079
+2.07322 2.09765
+3.52974 4.73717
+3.24973 4.88691
+5.47789 5.95384
+4.11218 4.57076
+6.61174 7.47165
+8.09302 8.36193
+1.67911 1.69022
+4.436 6.17515
+5.6544 5.74951
+1.50354 1.76043
+4.41433 4.83589
+1.82528 3.53979
+3.98749 4.65527
+6.42503 7.5787
+8.69554 10.1767
+8.39215 8.56999
+8.71646 9.66209
+1.59091 3.39622
+6.12574 6.94955
+7.92527 8.25049
+9.19858 9.49137
+2.73382 2.97747
+4.56558 5.94738
+8.33983 8.58548
+9.00798 9.01838
+4.93268 5.28383
+3.15356 3.58606
+8.28171 8.79351
+1.47358 1.9581
+0.891797 2.05345
+1.56032 2.38159
+2.5152 3.80485
+8.0963 9.88138
+1.1262 1.89279
+7.99336 8.2352
+5.25067 5.41251
+4.57532 5.20101
+1.87911 4.59415
+4.25142 4.70467
+8.18782 8.76989
+9.20478 9.3612
+7.70898 9.7752
+0.655865 0.958924
+4.8883 5.77477
+3.03279 3.47456
+1.01979 1.41661
+8.94219 10.6987
+2.49348 4.58195
+2.44003 3.29005
+3.4725 3.55572
+9.3917 9.95851
+7.08658 7.47686
+3.56413 4.44089
+-0.47868 1.11453
+6.82615 8.00596
+3.49451 3.74705
+8.13286 8.47976
+7.01732 8.82556
+1.19064 1.48887
+5.28851 6.88637
+8.83175 9.49879
+0.939903 1.17024
+7.49124 9.01906
+2.9285 4.23224
+5.68296 6.86273
+8.53897 8.77886
+2.9107 5.01232
+0.748655 1.10265
+4.77258 5.12626
+3.995 4.75289
+2.71467 4.26926
+6.21665 7.16233
+4.53883 5.75731
+4.37153 4.76125
+7.47635 8.75777
+4.82013 6.4699
+9.36015 9.58451
+4.43054 5.86752
+2.10934 2.34705
+3.00306 3.06539
+7.81957 8.44081
+1.97221 3.06916
+0.153393 0.503956
+5.05611 5.27536
+5.73277 5.89001
+3.64807 4.85582
+6.13416 6.1528
+3.85511 4.14045
+0.411725 1.36529
+2.26932 2.5447
+3.51164 4.93266
+2.50955 4.34201
+8.74663 9.39268
+6.2229 6.39303
+4.38059 4.91592
+7.29109 8.62318
+6.31801 6.99532
+9.75036 10.0514
+1.69019 2.41527
+4.20462 5.27729
+6.32944 6.94729
+3.5736 5.21496
+4.48316 4.61828
+1.76915 2.43263
+2.42026 4.09159
+2.08762 2.43074
+5.48161 6.02473
+5.51826 7.47042
+2.78026 3.1552
+7.89469 9.49867
+3.09084 4.54697
+7.20417 7.42408
+5.36528 5.74851
+1.86239 2.41988
+1.55994 2.85743
+4.40182 4.6638
+7.91619 9.01242
+3.08119 3.74714
+1.54108 2.08538
+3.61461 3.64631
+8.76851 9.66257
+-0.645571 1.3366
+-0.707083 1.21005
+7.19571 8.23405
+5.42865 5.89329
+2.12897 2.59222
+0.603102 0.930391
+3.75025 4.63181
+6.14867 6.4526
+7.30947 7.51461
+7.83183 8.79802
+6.06658 8.53246
+1.67895 2.50063
+1.14179 2.04478
+8.59583 8.90112
+-0.918885 1.30717
+0.182607 0.613593
+3.3335 3.77196
+0.783053 2.4368
+6.49331 7.60104
+2.85101 3.28637
+7.42273 7.66905
+3.96433 5.02573
+8.26262 8.40749
+9.24451 9.32783
+4.89036 7.07214
+6.45431 6.96815
+5.20701 6.58747
+7.40142 7.98615
+4.19768 4.9831
+3.32546 3.88811
+-0.471996 0.967855
+9.36172 9.63532
+1.96831 3.00632
+7.537 9.72671
+4.67746 4.81135
+3.10782 4.93642
+4.94809 6.54855
+4.16763 5.25628
+9.04992 10.316
+0.668935 0.680886
+4.02935 4.84503
+5.32499 5.76636
+5.32267 7.15457
+5.18886 5.23491
+4.37053 5.36801
+2.39955 2.74657
+8.19764 8.86645
+4.24706 5.69703
+1.87851 2.36988
+0.886553 1.05064
+7.27428 7.90224
+9.08417 9.44879
+3.11534 4.02019
+6.3284 7.39925
+4.96029 5.59076
+2.58248 3.11741
+7.76513 8.13505
+4.93613 6.51523
+0.565355 1.70512
+2.12366 3.0319
+5.32422 6.84146
+-0.135396 1.08591
+3.7901 4.86303
+4.49677 5.41847
+0.615748 0.834712
+0.64784 1.81859
+6.65505 7.13894
+-1.12744 1.61017
+0.550814 1.24316
+6.66639 6.89866
+6.19271 8.17468
+3.09382 3.78684
+4.41221 4.95889
+7.96091 8.48824
+8.32129 10.2917
+2.13168 2.19835
+1.4635 2.38989
+5.78102 6.42215
+1.70153 3.20616
+5.35068 5.71016
+4.27702 4.37203
+5.13888 6.04764
+4.79644 5.37927
+6.75314 7.66368
+6.04484 6.84064
+4.34947 4.45643
+9.08755 10.396
+0.88804 2.17441
+6.86788 7.88301
+7.94296 8.61664
+8.02387 8.79591
+1.79024 2.40559
+5.50404 6.01044
+7.76772 8.1932
+1.174 1.23693
+6.20571 6.9224
+4.20863 4.48702
+4.16743 4.39075
+-0.11965 0.120778
+7.01234 7.52619
+5.91415 6.46151
+5.28713 5.72354
+6.26981 6.31237
+0.643056 1.43864
+1.62562 1.99875
+0.544992 0.721386
+6.92522 7.09165
+-0.107048 1.12273
+0.644674 0.91244
+8.56904 9.01883
+2.23079 2.56598
+9.79034 10.1123
+8.13788 8.4131
+1.86753 1.95236
+2.97577 3.33272
+8.57454 10.0193
+1.20043 1.53408
+3.43515 3.86571
+5.79075 6.41293
+1.71558 2.52845
+2.39907 3.46652
+9.08289 9.91182
+0.859644 1.07475
+5.30144 5.42157
+-0.441497 0.890794
+3.55044 4.14918
+-0.340115 1.19239
+6.5534 6.76908
+0.836514 2.09196
+8.15747 8.96484
+4.80087 5.14227
+7.72071 8.88223
+5.11901 5.65559
+4.44996 4.63562
+-0.328404 1.3002
+0.90759 1.34556
+5.94839 6.35058
+1.76504 1.78344
+1.32585 2.08994
+7.18641 8.20945
+0.62657 1.06025
+6.28086 6.40975
+5.05525 5.16143
+5.82694 8.07685
+6.23677 7.55394
+-0.226265 0.661443
+1.42599 2.36325
+9.04445 9.92971
+-0.169286 0.185741
+8.34636 10.9042
+9.52494 10.0475
+8.39989 10.1377
+3.89956 4.70428
+3.98673 4.97185
+5.43008 5.67936
+7.76475 7.98591
+4.46895 4.73188
+0.584662 1.54474
+2.12622 2.79994
+1.40578 2.2461
+1.45171 2.02105
+2.05665 3.04611
+2.29818 2.68118
+1.77344 2.98698
+4.92092 5.55302
+7.18758 8.37525
+8.83407 10.0565
+2.91182 4.71932
+6.47293 6.74664
+2.49238 3.69749
+0.487234 0.541003
+4.703 4.92744
+9.8867 9.94918
+1.7713 1.9792
+5.68316 6.90242
+5.62485 6.70656
+7.24837 9.60197
+7.71147 7.76519
+5.22324 5.30661
+9.11258 9.28071
+8.2827 8.90115
+8.90865 9.42138
+7.47233 8.72308
+4.89712 5.65153
+4.12392 4.20239
+5.65325 6.55887
+8.65945 9.05845
+7.9165 8.36489
+1.4952 2.43991
+5.49665 5.80793
+1.67206 2.55302
+0.943544 1.58521
+0.47 0.860959
+6.47638 7.43101
+4.38434 5.97278
+8.12782 9.10574
+5.78143 6.6539
+9.23616 9.40513
+1.6845 2.00736
+6.56955 7.37847
+7.42993 9.04718
+-0.179632 0.450904
+8.65819 9.07724
+7.86567 8.80824
+1.85428 2.7755
+2.29222 2.65374
+4.03614 4.51729
+6.9326 7.07635
+5.50807 6.498
+6.17637 7.26432
+8.7688 9.16308
+7.65 8.88604
+3.74495 4.29991
+8.5671 10.5661
+7.41964 8.21083
+8.04302 9.78783
+0.269663 0.317601
+8.29804 9.40991
+3.90673 4.22298
+8.82384 10.9441
+7.27081 8.19548
+1.30184 1.98993
+8.13028 8.92385
+7.21224 7.35137
+5.02122 5.69666
+0.817219 0.974073
+-0.128067 0.589359
+2.12137 2.74019
+5.24657 5.44714
+1.55805 3.10332
+9.91031 10.0748
+7.13941 7.9143
+-0.183908 0.934079
+3.987 4.11053
+3.26678 3.67608
+9.75921 10.1121
+0.755391 1.06346
+7.28479 7.49982
+1.37522 3.80623
+0.944351 1.46531
+9.49278 10.2372
+8.28946 8.67597
+9.43537 9.58003
+7.73357 8.756
+2.64043 2.8687
+4.70448 6.99929
+3.82199 3.89343
+3.43825 4.10908
+4.42362 5.69086
+8.08536 8.60142
+8.43208 9.31272
+7.5889 8.39208
+7.90112 7.9734
+6.10381 6.80568
+8.76283 8.80151
+1.46728 2.53288
+1.68884 2.47102
+7.63343 8.29838
+9.18852 9.5558
+0.977174 1.4792
+4.7577 5.74873
+4.66433 6.37375
+-0.0952277 0.378184
+5.30929 6.07469
+4.98811 5.16146
+3.0744 5.59799
+0.944909 1.25222
+1.38561 2.51277
+3.77811 4.23459
+2.11604 3.32458
+0.920929 1.17187
+5.23496 6.34905
+6.9953 7.65745
+4.81803 4.89553
+4.69301 5.36777
+-0.208926 2.6111
+7.97334 9.83269
+-0.396673 0.779988
+5.91367 6.47682
+6.27249 6.83533
+5.58931 6.89679
+2.03394 2.67025
+-0.197752 0.383167
+4.69751 7.695
+4.5989 6.07875
+3.7285 4.27396
+7.9807 8.27693
+-0.00248985 1.30934
+2.68016 3.916
+0.881558 1.14567
+4.77066 5.05302
+0.552268 0.919467
+2.46862 2.65199
+1.4009 2.51701
+-0.171185 1.28252
+9.27842 9.90243
+3.51778 3.57728
+6.10071 6.92163
+9.05387 10.0894
+5.52995 5.89082
+8.40216 9.0272
+9.02911 10.1602
+4.85818 7.38829
+1.6762 2.32334
+6.45416 8.62337
+5.44592 6.0245
+3.45876 3.94274
+9.07144 9.16725
+6.51885 7.6363
+7.92593 9.01986
+0.270702 1.57395
+6.11245 6.70173
+1.37658 2.19068
+2.42668 3.43827
+7.98226 8.43306
+3.72269 4.74654
+8.16252 8.58873
+8.81456 9.5363
+-0.338386 0.864811
+1.90693 2.25796
+3.5305 4.17475
+6.07997 7.67393
+0.53347 1.68815
+7.31182 8.44458
+7.77462 8.33613
+3.79975 4.15552
+9.08822 9.9771
+-0.101698 1.05442
+8.44869 9.95724
+-0.0318759 0.532673
+8.09238 9.51356
+5.51514 6.60799
+8.66528 10.3297
+8.25556 9.97893
+-0.220428 0.247563
+0.00453913 0.540444
+1.53599 1.61735
+3.77213 5.06896
+2.65332 2.75864
+6.05811 6.43112
+0.302534 0.803651
+0.393766 1.11611
+9.31035 9.62387
+0.568281 1.7765
+-0.721118 1.27387
+1.83573 2.62578
+1.39953 1.91158
+6.51883 8.52813
+2.60154 2.95054
+6.58322 9.37818
+5.61178 5.67661
+9.56511 10.2767
+9.09174 10.0697
+2.55846 3.39943
+8.38146 9.06138
+7.97019 8.18074
+6.1426 6.42787
+1.15876 1.55463
+2.93483 2.96376
+7.23883 7.29158
+9.64606 10.0674
+4.89825 6.70366
+7.35635 7.96328
+2.2702 2.36797
+-0.0464389 0.395244
+1.14883 2.10411
+4.7309 5.10593
+6.07946 7.37741
+5.50202 6.28822
+3.66574 3.96271
+1.9944 2.3862
+7.58159 7.59275
+1.98712 3.30587
+2.10317 2.89161
+9.66889 9.97287
+1.57327 2.15421
+8.14125 8.30983
+3.77185 4.12658
+8.51624 9.51485
+9.25211 9.722
+2.06312 3.0453
+9.34954 9.91254
+7.31475 8.89322
+7.85044 9.20242
+0.226243 1.28465
+0.0260868 0.575177
+9.40743 10.1655
+4.04324 5.05341
+1.02626 1.48332
+3.33074 3.72025
+9.2005 9.61387
+6.68317 7.14109
+6.82083 8.6312
+4.34816 4.50329
+-0.48874 0.975608
+4.26651 5.68526
+4.89731 5.57569
+2.68984 3.5661
+0.499714 1.01055
+9.01902 9.36142
+3.22067 4.59054
+0.65132 0.860512
+1.6791 2.36642
+8.28222 8.7579
+2.84349 3.24134
+5.64949 6.09512
+3.44026 4.43245
+2.60889 2.6248
+-0.00849234 0.984046
+7.5745 8.65675
+2.07464 2.6488
+2.59747 2.65772
+6.36828 7.42208
+3.83342 4.50127
+5.41167 5.7011
+6.53606 7.53796
+8.21975 9.56176
+1.90113 3.08684
+7.74402 7.82057
+4.26515 5.11327
+5.42743 5.59215
+8.69709 10.0912
+2.87019 3.94798
+9.27013 9.54627
+9.30568 10.2136
+9.02985 9.62917
+3.7589 4.59642
+6.59359 6.86939
+3.26574 4.83488
+5.14545 7.70086
+7.43163 8.05103
+5.72972 5.74457
+0.490113 1.31151
+7.018 7.42627
+6.22976 6.27589
+9.07732 9.30419
+4.3917 4.42663
+8.50298 10.3728
+6.18671 7.53619
+3.51053 4.097
+2.17172 3.56595
+6.08046 6.23691
+9.07361 10.9129
+3.95757 4.11333
+-0.136516 0.78995
+1.34923 3.47002
+0.0562579 0.686502
+9.10943 10.2731
+5.80174 6.16971
+7.86011 7.87649
+5.34384 5.51645
+6.32167 6.76387
+7.70566 8.28038
+-0.319903 0.867682
+-0.372564 0.570014
+8.83696 10.8439
+7.78947 9.38211
+9.25815 10.1092
+5.59721 5.67148
+0.234719 2.42489
+1.06314 2.87416
+1.75391 2.69799
+5.4536 6.66068
+1.35696 1.87102
+2.17418 3.1459
+7.61817 7.98287
+2.92194 3.18393
+7.68243 7.83261
+9.33163 10.5531
+1.14227 2.50228
+5.47911 5.70857
+9.88123 10.0758
+8.81249 8.83145
+6.02747 6.43183
+4.81158 5.79178
+6.65666 7.5047
+4.89085 5.56569
+0.935564 1.71547
+-0.0452879 1.16222
+4.03524 4.6206
+5.88518 6.02658
+2.06227 2.9581
+0.207246 2.2404
+2.81757 3.70318
+0.704257 1.98403
+2.38486 3.30039
+3.57073 4.78358
+1.53721 3.00546
+8.37852 8.39527
+1.54619 1.59789
+1.00447 1.40778
+5.31977 6.43861
+3.82175 3.83209
+3.37738 4.44002
+5.46644 5.97254
+3.88191 5.00688
+4.88046 5.39031
+4.15092 4.93679
+1.75182 2.07399
+1.16434 1.76541
+3.37032 4.29676
+3.1685 3.98533
+1.28787 1.59775
+5.86338 6.17993
+3.8645 4.25757
+1.83947 2.48092
+0.184795 0.586724
+3.13752 3.76447
+2.14264 3.03248
+5.78182 5.9029
+2.47969 3.8088
+2.59206 3.08362
+-0.354871 1.03627
+7.94041 8.05947
+9.48014 9.93817
+0.992727 1.48877
+6.1525 7.51387
+5.00071 6.15665
+7.42074 8.27606
+9.6539 9.83042
+1.08984 1.46387
+5.46282 6.95907
+4.74506 5.13968
+0.357565 1.91464
+9.07652 9.65474
+0.201095 0.646211
+7.04306 7.69131
+1.17728 1.2237
+5.92183 6.29165
+-0.41356 0.491524
+8.38339 10.4509
+8.08648 8.11344
+3.32474 3.39522
+5.762 5.83732
+2.26778 2.55548
+4.86127 5.92868
+3.75949 5.16608
+4.83431 5.88632
+2.65122 3.31344
+9.30295 9.38948
+6.03391 6.32749
+5.12035 5.59414
+5.68785 5.979
+7.89553 9.15202
+2.54445 2.74715
+2.36337 2.49709
+4.71661 6.12198
+3.72447 4.68735
+1.0541 1.53187
+3.45178 4.80929
+7.90773 8.26212
+8.1816 9.18627
+0.322569 0.871041
+7.24823 7.32699
+1.7003 2.78087
+9.70927 10.2515
+3.75922 4.01081
+1.06949 1.40253
+1.21774 1.4734
+6.02123 6.32973
+2.76396 3.09484
+2.80358 3.00026
+5.25666 6.31369
+4.71714 5.30669
+4.37906 4.50557
+7.40824 7.44969
+7.89081 9.18263
+8.8136 10.3074
+9.1757 9.37261
+7.1938 8.51137
+0.580081 2.32678
+2.02497 2.95434
+6.01446 6.78851
+8.54365 9.21454
+3.03567 3.27089
+0.650657 1.5716
+5.05518 6.36521
+1.64301 2.76399
+4.15989 4.34183
+3.72791 3.98156
+3.91372 4.06182
+3.04507 3.88871
+3.82596 4.25694
+3.36492 5.00402
+6.50019 8.17974
+3.54621 3.81009
+0.546921 2.09811
+5.1789 5.9826
+4.98983 6.31221
+2.47557 2.63878
+4.64568 4.81101
+9.1462 9.21888
+7.37417 7.5276
+2.21604 2.50113
+8.29804 10.2722
+5.1282 6.06353
+8.58281 10.1589
+6.47084 7.04085
+6.27806 6.72674
+7.11554 7.85687
+6.01085 6.02773
+5.46694 7.52872
+9.51078 9.85387
+3.36627 4.06552
+2.96126 5.12635
+3.09314 3.40691
+5.05456 6.62548
+7.56469 8.97053
+1.33727 2.87482
+5.6572 6.28169
+0.120924 0.296475
+7.09139 7.41322
+2.10076 3.28507
+8.74998 10.1094
+7.45072 9.50796
+7.75294 8.59218
+0.740374 2.44897
+7.63001 8.91562
+4.30743 4.81716
+6.40813 7.29159
+6.30213 7.35987
+6.44392 7.32584
+8.41155 9.4466
+-0.377892 0.689618
+5.88857 6.70983
+6.67779 7.70668
+4.831 5.17464
+2.62342 3.82764
+8.57453 9.29283
+7.32648 7.96725
+9.32937 9.9726
+7.30774 7.65754
+3.97456 4.59876
+5.73092 7.20962
+1.958 2.10551
+3.2115 3.81482
+5.76497 7.42425
+2.77219 3.29692
+4.95297 5.14843
+5.96367 6.3619
+2.49872 4.61736
+8.21817 8.23425
+2.13615 2.61877
+7.84121 9.55011
+8.63416 10.2773
+5.61084 6.32053
+4.86002 5.79944
+9.07858 10.688
+5.95829 6.42504
+3.3289 4.17849
+3.27989 4.91625
+8.28046 9.23021
+2.18691 2.6072
+1.3962 1.75013
+2.13627 3.73117
+2.11128 2.57303
+7.22357 7.50136
+7.43862 8.03136
+2.80578 3.02886
+0.176906 0.761142
+5.99314 6.6075
+1.90398 3.3925
+5.48264 6.73579
+7.18447 7.49811
+3.24434 5.05219
+5.53263 6.04178
+1.71172 2.45682
+0.297266 0.481632
+2.62582 3.36142
+0.243865 1.49321
+8.86142 10.169
+3.93193 4.39404
+4.98182 5.15675
+7.99209 9.73159
+8.18033 9.45596
+4.25235 4.41546
+1.59603 2.15581
+6.47724 8.69649
+5.24138 7.93131
+3.4267 3.49003
+0.0439912 0.316407
+1.99983 3.87206
+-0.103124 0.568771
+4.62451 4.80117
+2.89065 4.16315
+5.82817 7.43232
+6.89255 7.82189
+5.71037 6.81241
+4.34551 5.24905
+7.33931 7.3741
+-0.855192 1.27129
+8.94842 9.10813
+9.19877 9.68412
+6.42658 7.77968
+-0.0669636 0.430107
+6.40366 7.40701
+8.91175 9.24059
+3.21388 4.21676
+3.38557 3.79509
+4.24411 4.97032
+7.259 7.34896
+2.55995 3.18361
+8.77438 10.5503
+8.18685 9.79378
+2.78397 4.4563
+8.6891 9.38337
+6.51749 7.59374
+2.52346 3.46101
+8.40526 9.35647
+5.26942 6.33572
+4.15094 5.00668
+0.471666 1.53842
+7.63441 7.96745
+2.39974 3.7814
+2.71989 3.02994
+8.12085 8.33493
+6.19474 6.84381
+6.6133 8.31417
+5.1758 6.94983
+8.66241 8.79095
+6.10878 8.22083
+8.81883 9.08031
+8.28969 8.45176
+7.19851 8.37836
+1.5722 1.6836
+4.57814 6.95063
+7.66128 8.10631
+0.742483 3.08515
+1.15026 1.98074
+3.90133 4.12003
+7.61145 7.73433
+8.32187 10.2933
+0.407205 1.08089
+1.26545 2.60796
+2.70646 3.92753
+-0.196551 1.83536
+-0.413063 1.23838
+0.264484 0.556192
+6.30158 6.96097
+-0.66246 0.809062
+9.34243 10.3521
+8.70093 8.79679
+0.745195 1.92911
+9.12892 9.68193
+7.98533 8.30538
+6.23671 7.04296
+6.5603 6.95483
+7.08133 7.10563
+2.15769 2.41541
+8.24752 8.73978
+5.27693 5.61904
+0.317419 1.48404
+3.48029 5.46979
+7.38901 8.56554
+1.06587 1.62384
+5.54926 6.04924
+4.46577 6.48749
+5.349 6.15584
+8.04249 8.17359
+3.37651 3.56179
+3.64706 5.57403
+4.49844 5.26404
+3.93361 4.92128
+5.82184 6.29881
+0.984273 1.70318
+1.12773 1.80726
+3.11675 3.17451
+5.07913 5.46291
+0.615591 1.81465
+1.08948 2.77847
+7.97412 8.07365
+5.05207 5.82497
+0.0407709 0.558817
+6.11142 6.48205
+3.4461 3.57315
+8.6547 8.80553
+8.18965 9.64194
+5.55564 7.9703
+4.01776 4.16989
+2.4668 2.82018
+0.911925 2.56662
+4.68814 5.03614
+7.4899 8.49036
+8.40912 9.14001
+2.32725 3.16377
+0.0723972 1.42049
+6.6441 6.6953
+3.65586 4.38222
+6.35844 6.57833
+4.44435 5.73077
+1.81779 2.57257
+4.17692 4.59722
+8.54682 9.38058
+1.61135 1.81629
+3.91926 5.00536
+9.78302 9.85143
+1.25632 3.10345
+5.53191 6.08174
+-0.231868 0.676811
+1.03054 2.58105
+0.0402172 0.690608
+0.974571 1.25234
+5.22227 5.92302
+8.05843 10.1439
+8.48938 8.50755
+0.0965782 1.24008
+6.53821 7.47765
+0.189991 0.475204
+8.48963 8.54995
+9.68363 10.0534
+1.49381 2.71302
+6.75552 7.41283
+7.91075 9.15302
+0.520922 1.40928
+1.17957 2.11221
+4.00122 4.40686
+7.32467 7.9273
+6.39126 7.90248
+6.50534 8.19308
+7.19888 7.22234
+-0.136797 0.731889
+0.870318 1.25614
+2.07126 2.28297
+6.10995 7.60408
+3.02174 3.90102
+-0.657541 1.57517
+0.993121 2.66255
+7.27232 7.50832
+2.16079 3.75428
+9.27397 9.75098
+8.36865 8.5545
+4.56641 4.97607
+3.60746 4.34616
+6.31304 7.70611
+2.91442 3.7602
+4.85814 6.70407
+4.45876 5.67661
+8.06749 8.82229
+2.02826 3.59873
+1.92922 2.50088
+2.63867 3.48117
+2.17665 2.54826
+8.62674 9.10675
+0.96648 1.47671
+8.86336 9.53978
+5.52747 5.80829
+0.77099 3.06106
+2.2307 2.53877
+6.29165 6.63018
+4.44717 5.04651
+3.80894 4.63054
+7.47519 7.87072
+0.933668 1.9949
+-0.712945 1.21558
+7.30206 8.38376
+5.80281 7.00022
+7.96578 8.6558
+0.24063 0.706466
+4.41893 4.58472
+4.0132 4.92768
+5.29626 6.09397
+3.43602 4.00728
+0.780945 1.66499
+8.83861 9.15168
+9.06411 9.75544
+3.45618 3.62529
+9.51413 10.0148
+0.842106 1.75695
+1.06485 1.44192
+6.89987 8.05314
+7.89154 8.73313
+8.71675 9.79526
+2.40574 2.58062
+8.55952 8.78132
+5.61716 6.06282
+3.71059 3.77929
+2.50187 2.99137
+6.92852 7.23184
+7.00442 7.93869
+8.82232 8.8756
+4.10389 4.53702
+7.6907 7.77577
+9.31554 10.2674
+8.51082 8.70339
+4.83332 6.70311
+4.6904 5.42892
+4.71407 5.67695
+4.12047 4.44089
+7.51845 8.26858
+1.31781 1.9397
+6.26854 8.02093
+6.92072 7.77774
+0.438156 2.18909
+0.898035 1.72074
+3.81121 3.8643
+1.01676 1.34308
+9.28445 9.42801
+2.43133 4.43516
+4.33664 5.9904
+2.19178 2.37244
+1.5457 1.79785
+2.23781 2.6481
+6.8365 6.87073
+0.82568 2.74775
+9.59404 9.89262
+8.48394 9.15107
+6.16085 6.42224
+3.5667 5.97689
+4.16931 7.41638
+6.95636 7.0982
+6.87987 7.09233
+3.12619 3.14821
+7.76636 7.98459
+4.60371 5.59136
+3.92189 4.88302
+6.90694 8.19858
+3.85132 5.19015
+8.05045 8.32483
+4.8338 6.05032
+1.93576 3.18873
+2.4182 3.55039
+5.56905 5.8172
+4.18436 6.01283
+3.04944 3.85936
+7.83585 8.95233
+1.76281 3.0558
+3.44143 3.6317
+8.69887 9.40371
+5.67867 5.73236
+0.859809 1.76578
+6.92284 7.13601
+8.27495 9.13414
+5.44385 6.42599
+-0.941603 1.8215
+7.88161 8.79447
+0.965018 1.17732
+5.56442 5.79546
+8.79032 10.9909
+5.28632 5.79175
+4.80998 6.07002
+8.4021 9.81107
+3.16415 5.08682
+-0.212163 1.2052
+5.683 5.83625
+0.738527 1.31842
+2.03835 2.52756
+7.4543 8.91243
+-0.568869 1.44659
+3.58855 4.42371
+6.33058 7.18779
+-0.645579 1.94313
+2.18149 2.24157
+3.80281 4.67323
+5.14628 5.97452
+2.55239 3.45685
+3.56586 6.23355
+6.74752 7.19693
+8.99006 10.5533
+0.259833 0.99882
+8.9005 9.75401
+7.28058 8.41075
+4.57803 5.70104
+9.82823 9.90251
+6.94375 7.42033
+7.8878 8.81951
+5.01137 5.52693
+2.25503 2.28817
+6.65772 7.11107
+0.647512 2.04416
+4.34796 4.5706
+4.5395 4.91529
+2.65423 3.49531
+7.97384 8.78377
+5.53873 5.76806
+9.78641 10.1351
+6.01664 6.44407
+3.47406 3.75187
+4.59421 4.81804
+1.20641 2.00488
+2.48904 2.80768
+5.77372 6.10692
+2.49363 3.24499
+1.8483 2.62965
+2.28556 3.22209
+3.17819 4.51426
+3.5548 4.23276
+3.25239 3.57895
+0.613317 2.44862
+3.82234 4.78976
+4.72809 6.46528
+9.54107 10.4426
+9.20052 10.1921
+8.24152 9.89817
+5.17594 6.19462
+7.83364 8.17082
+5.67992 6.36464
+8.9943 10.1426
+2.20598 3.0081
+3.38199 5.16464
+0.599928 1.35804
+0.841211 1.60761
+5.29338 5.89919
+1.11061 2.29219
+3.41512 3.95907
+7.9375 10.0203
+8.73852 9.66917
+9.95092 10.0162
+4.02544 4.30219
+4.1461 5.37827
+1.08089 1.59196
+7.87513 8.21121
+7.85673 8.0973
+0.96237 1.56519
+2.45532 2.61678
+6.1829 6.23637
+0.135135 0.613518
+3.18324 3.78587
+5.64796 7.20194
+0.861169 1.71661
+9.66005 10.1169
+0.880774 1.12452
+1.29389 1.57658
+5.60299 5.89759
+5.53642 7.07306
+0.540268 1.31836
+6.60244 7.98105
+4.21877 4.57159
+3.15367 4.75356
+7.81055 8.40378
+8.00942 8.10861
+5.78071 6.35646
+3.15993 4.99293
+2.36526 2.78444
+8.1361 8.76071
+1.40066 2.96474
+-0.17906 1.05877
+5.94933 6.6808
+3.43187 4.05553
+3.02912 4.68942
+2.1506 2.29413
+2.3516 2.38305
+2.87496 3.0851
+6.71294 8.99858
+3.76177 5.52545
+1.58417 2.57063
+2.74646 4.27445
+5.48407 6.60696
+-0.133321 0.716559
+3.53886 3.58196
+2.28729 2.40198
+-0.209646 1.21263
+6.62795 7.32318
+0.714781 0.880466
+2.96831 4.05932
+6.00935 6.38896
+5.39798 6.11983
+8.47679 9.70468
+1.4339 1.74845
+2.35223 4.75732
+4.31357 4.9642
+5.26493 7.70538
+7.91888 8.94851
+6.51439 7.69469
+7.69015 7.85411
+3.94274 5.15373
+6.25852 7.32402
+2.73567 3.43236
+7.09564 8.42242
+2.55932 4.29066
+1.79489 1.84559
+8.86427 9.35669
+7.23854 8.27062
+7.8488 7.98307
+0.710888 2.22424
+0.0413624 1.10578
+1.54302 1.97696
+1.64924 3.01081
+8.15535 10.2397
+0.305662 1.63835
+8.20375 9.03123
+1.66617 2.08748
+4.01691 4.88505
+3.32856 4.10709
+5.15342 5.44616
+5.80751 7.38872
+0.485341 1.07648
+3.98267 4.20211
+6.96867 9.37655
+9.48055 9.85181
+8.39277 9.50424
+2.47589 2.79873
+3.48046 5.37417
+4.98279 6.01686
+1.29845 2.31199
+-0.204348 2.50289
+0.23488 1.00378
+6.26899 7.14823
+4.62903 5.49672
+0.199052 0.822066
+6.97297 7.69083
+4.23783 4.65198
+0.530497 0.839143
+6.61355 8.22831
+-0.0103941 2.16307
+0.148601 1.20044
+0.314438 0.67632
+3.43415 4.06208
+1.95498 3.25728
+4.23094 4.84942
+9.5493 10.0057
+2.64964 3.52073
+8.21388 9.1622
+-0.112496 0.47622
+7.97551 8.19546
+2.16155 2.6289
+0.38442 1.46032
+3.85675 3.91557
+1.00605 1.42016
+2.4853 3.53086
+-0.0765625 0.504366
+8.11302 8.46334
+7.18135 7.80218
+6.46466 8.12336
+3.75968 5.33954
+9.08789 9.73677
+6.47459 7.49454
+0.90148 1.47681
+3.44733 3.54163
+7.32968 7.909
+1.30055 2.75407
+8.78735 8.92461
+8.21764 8.59414
+0.888162 1.08404
+5.65195 6.26421
+6.23881 7.33284
+8.69731 9.88088
+3.55695 5.36909
+6.49248 7.02755
+2.31407 3.01952
+5.7803 6.1286
+6.30415 8.01577
+7.73864 8.27496
+0.741078 1.69184
+4.94671 5.68254
+3.28226 5.02894
+1.97446 2.60413
+3.26555 5.54754
+2.56179 3.41897
+3.20058 3.32486
+6.96915 7.69055
+6.89302 7.39856
+1.9659 2.61404
+1.31107 1.36867
+6.23573 6.33677
+0.17616 0.517772
+8.55548 8.79155
+9.61632 10.2651
+2.20331 2.34017
+6.93195 7.42939
+1.25398 2.23119
+1.06577 1.41048
+5.99156 7.09818
+3.34821 4.1271
+4.61618 6.90956
+2.30853 3.52875
+0.0518063 0.113732
+5.38513 6.09734
+1.73468 2.64838
+7.24679 7.63999
+4.18175 5.06728
+7.09602 7.13414
+9.06191 9.11605
+6.2309 7.67675
+3.96576 4.63237
+-0.552645 1.37948
+5.76964 6.89903
+4.9272 7.5832
+4.59003 6.49719
+4.12281 6.9664
+5.12256 5.58387
+1.78859 2.76954
+4.36808 5.05712
+8.41165 9.54483
+8.11513 8.43405
+8.42016 9.52715
+8.50598 9.34564
+1.80028 1.83558
+8.08502 8.43726
+6.96667 8.12021
+5.4726 6.26772
+7.1141 9.29989
+7.83324 8.1744
+8.74368 9.16491
+2.5515 3.01706
+5.92375 6.44495
+7.45628 8.41582
+9.04829 9.71503
+4.58856 4.75356
+7.26064 7.32462
+1.81695 2.40529
+6.88067 7.95052
+1.91408 2.02663
+1.32005 1.45025
+7.47733 8.42004
+4.99403 5.85297
+0.95744 2.28875
+-0.089503 0.536888
+1.09978 2.48865
+1.9959 3.098
+0.376116 0.448329
+3.98908 6.49684
+9.10178 9.51012
+5.41394 7.31529
+6.60708 7.59071
+4.38466 5.76203
+1.84355 2.60304
+0.658705 0.933522
+6.98725 7.05509
+5.60064 6.98804
+1.0603 1.1521
+4.06192 4.46156
+0.351018 1.00807
+9.17113 10.2192
+6.71641 6.74659
+8.85392 10.5272
+4.50816 5.22908
+1.13934 2.43196
+3.3746 3.57576
+7.62137 9.3234
+6.93482 7.16058
+5.66506 6.44324
+5.13364 5.86068
+1.97257 2.03803
+2.69746 2.73067
+0.989591 1.38342
+4.18819 4.69676
+4.31608 5.12265
+2.79556 4.87763
+3.55387 5.34421
+-0.112466 0.585639
+2.43156 2.70221
+5.88314 7.08322
+-0.450332 1.29858
+1.22202 2.46588
+6.74433 7.32925
+5.14596 5.37435
+6.76754 7.41799
+1.48762 2.45958
+4.57241 5.3382
+4.17465 5.02296
+6.48856 7.5576
+0.383566 0.823394
+8.50875 9.08734
+1.79393 2.24548
+5.06812 6.49508
+3.55364 3.61502
+5.58973 6.58885
+0.631097 2.10041
+0.323995 0.941782
+8.8798 10.1036
+6.37114 6.88202
+6.9393 7.83288
+3.09503 3.41759
+3.65269 3.70305
+5.61676 5.8924
+1.90199 2.38446
+4.23683 5.35609
+9.18649 9.88878
+8.28736 8.37734
+3.04805 5.03593
+8.02926 8.38975
+3.58161 4.01331
+3.20923 3.48207
+6.85118 8.78281
+5.06518 7.49843
+1.57456 3.05552
+3.0154 4.23782
+2.83557 3.24854
+1.29358 1.89328
+1.42911 2.72661
+3.17067 3.96651
+0.353554 1.48472
+3.46227 4.25611
+6.17639 7.24657
+5.60878 7.13562
+4.11129 5.52476
+9.17596 9.4123
+3.08339 3.65766
+4.083 4.63013
+0.628465 1.92141
+7.81989 8.39386
+3.35589 3.87531
+5.35974 5.41743
+4.48321 4.64376
+0.888177 1.37343
+8.49061 8.50063
+5.09078 6.01801
+9.65314 9.99342
+1.60502 3.0115
+1.37928 2.77642
+6.60322 8.94046
+6.74573 7.45157
+-0.291156 0.325249
+6.1518 6.66827
+5.38199 6.46959
+3.50128 5.22692
+1.31774 1.70159
+0.550546 1.48845
+7.51187 7.85496
+4.2014 5.23193
+3.88255 3.97209
+2.60555 2.84958
+5.15706 6.00036
+2.99284 3.27867
+0.395077 0.768383
+3.30863 3.60594
+0.0325231 0.379208
+6.55183 7.33346
+1.44554 2.95846
+0.245421 1.29751
+3.98808 5.41226
+5.90242 6.266
+4.11097 5.02597
+0.134753 0.929866
+0.609287 1.16311
+0.231832 1.06825
+6.22093 7.05584
+9.18429 9.80637
+0.544139 1.30185
+1.69143 2.90306
+6.75109 8.67893
+5.49641 6.76104
+8.91712 10.0271
+7.09126 8.12404
+8.82958 10.2847
+0.569249 0.69421
+3.59288 5.8053
+9.25068 9.4226
+8.51607 9.26259
+5.00906 5.17068
+1.83467 2.99102
+7.32006 7.64842
+0.405532 0.603773
+6.41882 6.60495
+0.721592 1.44375
+2.78393 4.46732
+7.14806 7.16117
+5.12868 5.27918
+2.74138 3.1737
+2.95394 4.26547
+7.82827 8.21028
+9.06982 10.7279
+0.108376 0.290131
+6.34574 6.97141
+4.39022 5.50801
+7.98339 8.79674
+3.80026 4.71831
+5.43594 5.66916
+1.6743 2.61476
+4.29763 5.47402
+7.95714 8.69311
+3.4152 3.7387
+8.01715 8.8941
+6.53723 7.44437
+-0.0222108 1.04503
+4.96242 6.01648
+1.70885 1.75511
+7.62434 8.53526
+6.82863 7.39782
+8.19967 9.22283
+1.99719 2.11323
+-0.0124079 0.240201
+4.48577 4.87935
+2.586 4.41666
+6.37848 6.67092
+4.39606 5.67983
+9.39761 10.1095
+7.10866 7.15796
+3.91993 4.52129
+5.10552 5.36997
+7.08963 8.32694
+9.12669 9.58509
+9.26894 10.1974
+0.737413 1.26523
+2.77833 5.28516
+3.19039 4.36857
+4.32954 5.45614
+4.98069 5.49295
+7.54745 8.76142
+5.70425 7.05749
+-0.250513 0.36578
+4.76997 5.89607
+2.03075 2.32111
+6.54141 6.55896
+4.19799 4.45091
+8.7796 9.11915
+5.75014 6.05646
+5.36885 5.42775
+-0.00433056 0.865304
+3.65169 5.4751
+0.23625 0.872926
+0.0386337 0.792214
+4.40245 4.56789
+6.44567 7.42162
+5.51394 5.98005
+3.50146 3.83147
+8.47573 9.85647
+7.91378 8.47044
+9.44297 9.90241
+5.962 6.68782
+4.49034 4.86927
+2.17774 3.47061
+8.80614 9.26595
+7.92096 8.13838
+7.80209 7.93317
+7.78915 8.29735
+6.98111 7.162
+0.491059 1.14901
+8.97965 9.38792
+3.30207 3.53207
+3.17127 4.43581
+3.97564 4.43746
+6.79008 7.17877
+5.61669 7.51263
+4.0853 5.38748
+4.42181 6.32041
+8.08599 8.9095
+2.46938 2.55499
+1.20692 2.06351
+1.98995 2.35216
+8.17116 9.17158
+7.53414 8.37086
+3.7744 4.46197
+3.29464 4.38
+7.33246 7.81959
+4.89572 6.2831
+-0.152496 1.56427
+0.636242 0.938556
+5.62066 6.06096
+9.42994 10.473
+8.95446 9.46311
+0.277891 2.80311
+6.92968 7.29845
+2.75677 3.02975
+2.2859 2.51308
+2.96683 3.03857
+6.44584 6.49518
+8.33607 8.60407
+7.20303 7.7616
+7.07205 7.46849
+2.35677 2.7904
+5.86404 6.12906
+2.42371 4.62735
+3.27237 4.11016
+0.0668578 0.644021
+6.77371 7.45187
+3.66596 5.21874
+0.718034 0.755944
+6.06162 7.05
+6.91473 7.09753
+5.0749 6.08914
+0.759874 1.11978
+8.54591 9.64997
+3.97266 4.70679
+1.51133 3.17164
+7.21772 7.69877
+8.00719 8.37052
+0.284003 0.38001
+4.08842 4.16227
+5.04461 5.79973
+4.60604 5.31979
+2.2461 2.28157
+6.25631 7.69766
+9.12404 9.67586
+7.73134 8.98923
+1.0513 1.46408
+9.17225 9.42567
+3.66795 4.29168
+8.84403 9.28497
+9.93613 9.94729
+3.16615 5.09374
+-0.149675 1.43397
+2.30855 2.48392
+0.843172 0.951801
+8.32945 8.8506
+8.97012 9.94697
+2.8559 2.92359
+-0.321715 0.89173
+7.48565 7.71775
+1.44301 1.47795
+6.6649 6.76187
+9.10721 9.93599
+1.82207 3.03935
+3.61893 4.5306
+2.53746 3.81243
+0.424528 1.29026
+9.51874 9.68841
+7.94954 8.14396
+7.49282 7.52655
+3.04604 3.69656
+9.45461 9.47212
+7.69209 8.16412
+0.607135 1.16564
+0.150291 0.450632
+3.28914 4.01085
+5.45597 6.02921
+8.16157 8.36605
+9.76573 10.2325
+0.151994 1.07074
+1.3748 1.68548
+2.29854 2.63593
+7.92162 8.68895
+1.28795 1.61949
+7.85469 8.26683
+4.32268 6.33174
+6.13964 6.3596
+1.25714 1.88002
+2.05006 2.28294
+8.31864 8.34151
+9.0613 10.0715
+-0.041568 0.25139
+6.79984 6.81686
+5.10674 5.70583
+5.92937 7.01652
+7.57649 8.05834
+0.937157 2.25362
+7.48567 7.59746
+2.33403 2.88942
+7.3805 7.73421
+5.586 5.75327
+0.828854 2.12988
+8.22741 8.59954
+9.69214 10.1207
+6.55359 7.08114
+1.85342 2.634
+6.08756 7.28893
+6.34993 6.93474
+8.93548 10.1463
+5.49445 5.8338
+1.47951 2.14646
+2.62089 2.75888
+2.35352 3.10539
+4.98774 5.28931
+4.92239 5.40697
+7.52674 8.78948
+4.52451 4.83819
+5.45854 5.75838
+5.51553 6.3901
+4.82905 6.44407
+6.20655 6.4483
+5.68116 7.06109
+7.97301 9.15827
+8.8854 9.91623
+9.60198 10.2449
+1.93322 2.67684
+0.441852 1.87646
+5.19981 5.71385
+2.54799 2.5809
+4.34591 5.02655
+7.54678 8.75202
+6.1496 7.19033
+1.13658 1.30756
+1.38724 2.08252
+2.13624 2.30419
+8.49196 9.41369
+-0.21387 0.685093
+2.47875 4.19982
+3.69093 4.00543
+5.70643 6.50331
+7.07443 8.83588
+6.85756 7.68937
+1.69241 1.83242
+0.140565 0.502156
+2.15007 3.23784
+4.97403 5.69757
+5.08315 6.25554
+3.45026 4.01942
+3.37482 4.73009
+7.4154 8.34013
+6.95399 7.59768
+8.07995 9.86199
+8.43993 8.88645
+7.66844 8.12742
+-0.0200687 0.435846
+4.47984 5.9416
+7.66804 10.0801
+4.14578 5.98717
+0.256533 0.89254
+6.43216 7.4474
+3.60295 4.79419
+3.90129 4.29812
+5.30606 5.58674
+9.11552 9.79229
+5.60702 5.85299
+2.39514 2.64865
+4.51164 4.60227
+6.31154 6.77441
+3.12239 3.13505
+7.50962 7.89478
+3.90928 4.88831
+9.64625 10.0629
+5.9465 6.02877
+2.08554 2.10477
+0.087547 0.34748
+2.34295 2.53703
+6.846 7.3043
+1.37869 2.11446
+4.03371 4.26278
+5.38623 6.40917
+4.75848 6.25417
+6.03478 6.15991
+-0.585543 1.2091
+2.52824 3.57712
+3.95687 5.40914
+4.42955 4.71909
+2.9328 3.98848
+5.40471 6.97056
+7.64789 9.30279
+6.19595 7.07492
+8.27328 9.41596
+8.29855 9.13665
+2.54035 3.10488
+8.25038 8.87903
+5.66599 5.88701
+7.40067 8.71195
+6.63762 6.67694
+-0.0163105 1.72666
+4.77743 6.60356
+0.567991 1.14977
+5.96841 6.42987
+3.02266 4.58424
+6.72121 7.35492
+7.51477 8.65223
+8.55055 8.81014
+5.59759 5.82816
+0.218944 1.82542
+1.03197 2.36652
+7.84302 9.1594
+2.11542 4.7332
+6.37618 6.92981
+1.34963 1.59353
+0.516281 1.08859
+-0.0151152 0.0624718
+6.45603 7.23063
+4.76865 5.46588
+7.5893 8.42021
+1.04534 1.99034
+2.62638 3.04997
+5.00254 5.98512
+7.7588 9.44547
+6.82186 7.34321
+8.7629 9.82272
+-0.309554 0.54858
+4.19843 4.92981
+5.62327 6.80846
+6.40599 7.6073
+6.1547 6.53898
+3.93941 4.44985
+3.28342 3.72778
+7.17256 7.23035
+2.31269 3.05437
+7.99132 8.20926
+7.19338 8.08381
+7.29139 7.96441
+4.25818 4.4208
+0.802894 0.81938
+0.990115 1.04066
+0.443898 0.490936
+3.44459 3.95977
+9.07812 10.3145
+7.86709 8.26338
+-0.230114 0.390748
+7.50905 8.49199
+-0.715424 1.97535
+2.92248 3.12903
+5.44209 6.62431
+0.991914 1.99037
+5.92275 6.7724
+9.10818 9.2797
+4.46434 4.83462
+4.21122 5.48353
+1.8721 3.40764
+7.04713 7.60526
+3.76581 4.76317
+7.00667 7.36475
+6.87244 7.39431
+7.6349 8.46695
+-0.0728922 0.351194
+5.02925 5.6834
+1.45779 2.83702
+0.339175 1.46574
+6.40414 6.9165
+6.30401 6.91007
+5.6392 5.78172
+5.63288 6.44639
+7.45285 8.89031
+4.09741 4.57929
+8.76728 9.06448
+1.62324 1.84552
+5.72509 6.54553
+8.65273 10.3652
+7.3362 7.8953
+8.96224 10.3113
+0.217316 1.7827
+1.28523 2.90127
+8.78746 9.11602
+8.6075 9.9606
+-0.647788 0.779976
+4.9702 5.47602
+4.15553 4.57497
+1.08174 2.80993
+4.01011 4.8145
+6.79603 7.2317
+4.3711 4.43566
+9.65087 9.79922
+8.19407 9.21784
+3.04008 4.94094
+6.0883 7.23919
+6.88708 6.97172
+0.438073 2.00665
+8.53083 8.83004
+4.22258 4.65233
+6.72856 7.61085
+3.17591 3.18978
+5.07955 5.6938
+2.09043 2.55351
+3.28085 4.43556
+7.29225 8.03925
+7.78034 7.82608
+6.59677 7.67719
+5.56032 6.38139
+8.72663 8.82535
+2.96505 3.11983
+1.67192 2.11727
+7.85386 8.49025
+6.30965 6.72799
+8.53082 9.3801
+2.8976 3.39972
+8.90427 9.44661
+-0.0665785 0.410254
+4.58099 5.81135
+1.88015 2.21838
+3.38693 4.10149
+7.46378 7.68246
+8.80985 9.72212
+6.54877 7.25642
+7.18249 7.71509
+7.41978 8.64805
+1.00839 1.78626
+0.39421 0.526751
+7.13516 7.28317
+7.28011 7.80573
+1.90158 2.49032
+1.66181 4.17994
+8.81106 9.21133
+9.46151 10.5007
+0.52585 0.575082
+7.66495 8.64072
+7.72794 8.50991
+4.92409 6.23879
+2.28769 3.21774
+3.62671 4.40932
+5.77688 7.31314
+8.94253 10.0664
+0.416618 0.635111
+1.81377 2.41356
+7.91755 8.83363
+1.62715 1.82626
+8.22065 9.51656
+0.020228 0.724724
+8.81119 9.95764
+8.66509 9.61079
+5.28201 5.32152
+3.95724 4.22138
+7.09339 7.77685
+9.63428 10.1514
+3.69117 3.779
+3.82195 4.76757
+5.75824 6.62265
+3.69984 4.75163
+3.58259 4.8788
+8.32635 8.85873
+5.81959 7.32506
+8.11265 9.14304
+2.20118 3.32511
+7.79582 8.52691
+6.5891 7.13584
+0.385393 0.440656
+1.13414 1.9951
+1.76482 2.69977
+4.76194 5.82757
+6.33633 7.5348
+4.7663 5.65083
+1.98298 3.01285
+0.956973 2.38629
+5.60955 7.65827
+9.11064 9.14351
+2.99933 3.37975
+3.36304 4.57437
+3.89886 4.50733
+8.73838 9.3514
+9.11824 9.66042
+1.47961 2.93909
+0.615297 1.13217
+1.70646 2.32478
+4.35168 4.99362
+0.986601 1.18332
+4.01551 4.92342
+7.68944 9.86838
+4.47611 4.85316
+0.051839 0.86288
+3.59624 5.5628
+7.08729 8.90374
+9.53464 9.9196
+4.69871 5.74189
+8.43146 10.6889
+3.23774 3.77777
+9.35399 9.62741
+1.15259 2.69451
+6.6368 7.33773
+5.26395 6.09857
+6.87415 7.21717
+-0.925645 1.06118
+8.49641 8.67659
+2.31486 3.25354
+2.51057 2.58303
+0.921997 1.48762
+6.29777 6.74738
+4.03945 4.27305
+7.1668 7.3471
+8.44572 8.80343
+7.16937 7.84526
+8.89008 9.4332
+7.01815 7.66319
+-0.420804 0.982878
+1.59755 1.64672
+0.700814 0.72579
+6.3138 7.37379
+8.49276 9.93522
+-0.795656 0.819657
+0.772253 1.05926
+0.917593 1.3917
+3.30076 4.12274
+-0.0237176 0.260552
+6.82385 7.49119
+6.98638 7.52012
+8.24915 9.08397
+4.17486 4.25908
+3.08435 4.64404
+8.17114 9.91412
+8.95923 9.3751
+0.596707 1.89462
+0.982917 1.40236
+6.79552 7.36657
+8.2599 9.69551
+8.85126 10.4342
+7.98967 9.14514
+0.766355 1.63286
+7.76211 7.99247
+5.23163 5.89338
+4.4707 5.50457
+9.257 9.27862
+2.11049 2.59654
+1.65501 2.06238
+0.551768 2.10873
+0.0285582 0.194421
+3.66153 3.85615
+5.07097 5.55806
+5.29145 5.80735
+2.03499 3.0863
+0.73171 2.29494
+2.63023 3.6417
+6.17478 6.25997
+5.79646 6.46363
+9.10633 10.5516
+7.23415 7.84823
+6.49951 7.1506
+9.94647 10.0242
+7.91236 8.09097
+7.8127 7.97662
+3.34238 3.42907
+8.50796 9.8311
+8.75792 8.98028
+9.34125 10.4441
+2.84413 3.71602
+1.49884 2.35652
+7.52317 9.18955
+9.5587 10.3525
+4.85436 6.1181
+5.91369 6.12194
+6.88463 8.34471
+1.51952 2.99156
+4.29022 5.12674
+8.0229 8.41246
+2.44841 3.04779
+7.59975 7.91485
+2.74491 3.62575
+0.0169968 0.240919
+5.85351 6.29039
+4.99825 5.93439
+2.153 3.35304
+1.19032 1.41763
+6.13337 7.80615
+7.05013 7.89364
+8.38056 9.92
+6.35525 6.64521
+3.93342 5.15885
+2.87656 3.47116
+3.56176 4.41159
+6.72084 7.9171
+8.03801 9.12442
+1.03329 2.56255
+7.64542 8.61709
+2.85627 2.89437
+8.8303 9.79838
+1.08032 2.34573
+7.51366 8.39169
+9.09685 10.3677
+6.753 7.41904
+-0.217662 1.42059
+6.72492 7.97553
+7.99325 8.8976
+0.765372 1.10894
+4.37958 6.04671
+8.72027 9.58928
+6.00234 7.29277
+8.43912 9.25356
+2.98816 3.17389
+0.4292 0.552167
+1.69827 2.80318
+5.99904 7.09981
+4.68367 5.87791
+-0.203208 1.09587
+2.65367 3.28472
+3.87051 3.88111
+6.36178 7.18853
+-0.0815935 0.200848
+6.82255 7.18488
+4.99295 5.08405
+2.67155 3.08447
+5.82099 6.77145
+8.76434 9.01086
+5.94982 6.18665
+3.23369 3.71743
+0.934129 2.73456
+1.13233 1.24208
+8.21931 9.03906
+6.25425 6.69972
+0.971299 4.21205
+5.68426 6.45281
+2.85786 3.3955
+8.17715 8.88439
+2.72802 5.01235
+6.12811 6.53711
+5.22878 6.45864
+0.453655 0.922032
+0.466162 0.85262
+2.40916 2.64759
+5.63583 6.37476
+2.18434 3.14105
+0.912811 2.08432
+8.9464 10.1515
+6.77323 7.27133
+0.7167 1.60579
+5.89813 6.32997
+7.66593 8.4611
+6.54145 6.88337
+5.95421 6.21188
+1.10383 1.92226
+5.37168 5.65707
+1.51874 1.66339
+4.60748 5.00384
+8.97354 10.5394
+2.05022 3.20373
+8.17316 8.19283
+2.33792 2.72643
+8.81577 9.3704
+5.95738 6.59855
+5.69025 6.17335
+6.91889 7.88142
+2.17529 2.81528
+6.65046 7.19698
+7.10694 8.78046
+2.09613 2.47484
+1.92423 2.25333
+-0.0906039 0.861376
+6.61481 7.70609
+6.7448 6.84276
+3.43655 5.28405
+6.05404 6.48902
+3.24637 3.36149
+5.69528 5.77157
+5.12352 5.31024
+7.65858 8.80828
+3.69209 4.4851
+0.25765 1.29637
+3.1537 4.13191
+3.12328 3.83765
+2.99798 4.8748
+4.49566 4.67827
+3.50822 4.03987
+8.00334 8.34084
+8.61039 9.00704
+0.0332147 0.166124
+4.55193 5.36546
+4.20308 4.31589
+0.955466 1.20095
+-0.382972 1.47625
+0.803913 1.01916
+3.78333 4.0707
+6.58604 6.70173
+3.02066 3.82562
+1.16515 2.2816
+7.87242 8.24214
+4.057 4.60368
+2.84714 3.59726
+2.77804 3.69136
+-0.139996 1.36416
+4.50647 6.37579
+8.86647 10.1549
+9.24372 10.1442
+0.743107 1.84722
+6.18761 7.65841
+0.214887 0.443938
+8.8513 9.55063
+4.04856 5.79916
+6.69671 7.10025
+6.97477 7.79702
+4.82551 5.10538
+0.821772 2.85828
+9.3086 9.74805
+5.45623 6.66668
+7.64296 8.67451
+7.53052 8.31024
+7.45352 7.5063
+1.31412 1.4979
+7.81176 8.48083
+0.228964 1.73207
+5.52579 5.93103
+6.58544 8.48938
+2.75407 4.18746
+3.21396 3.96298
+1.13806 2.34106
+0.899331 2.87945
+5.69016 6.61624
+2.48172 2.58082
+0.676004 1.43405
+3.41766 3.9503
+0.104554 0.298373
+6.50673 8.21831
+6.00349 6.69385
+9.62453 10.3147
+4.09379 6.02911
+-1.12803 1.68823
+1.83324 3.43133
+8.30576 9.09288
+-0.363911 0.405218
+1.91686 3.34928
+6.98331 7.15885
+-0.31591 0.996789
+0.145813 0.35408
+5.32016 6.13679
+6.99664 7.48644
+-0.140875 0.821045
+9.0119 9.19742
+1.69616 1.72453
+4.38064 5.07542
+6.85898 7.55478
+3.9145 4.27935
+5.77592 6.16806
+1.45345 3.01301
+4.13024 5.59662
+8.14557 8.41669
+4.00075 4.829
+-0.283024 1.59436
+5.92468 7.17507
+6.84458 7.18356
+1.06987 1.42839
+8.618 8.66235
+0.432802 1.59512
+3.78058 4.36051
+1.6113 4.21135
+6.73475 7.01057
+6.74819 6.90498
+6.93146 8.54681
+9.02605 9.91613
+3.888 4.00526
+1.07958 2.27915
+4.78456 5.10764
+3.92952 4.89555
+9.09348 9.30304
+6.73107 7.21036
+7.42366 7.73225
+4.04079 4.72919
+1.21726 1.34683
+8.82903 9.73504
+0.577663 1.00786
+1.56822 2.08675
+4.84315 5.44994
+1.01008 1.16524
+5.99782 6.01535
+0.996739 1.75305
+4.76128 6.39012
+8.93563 9.51972
+-0.0698166 0.453543
+5.9084 6.95139
+0.535401 0.692258
+4.80729 5.48335
+3.42581 4.76147
+3.58715 4.43541
+7.50236 7.71227
+5.19742 5.87901
+1.79752 2.43097
+7.29762 7.57608
+5.65169 6.47762
+6.02249 7.93642
+0.840131 2.81176
+6.2646 6.96911
+7.46014 8.17136
+9.79049 9.94054
+4.61094 5.35819
+7.30902 7.41873
+1.21883 1.84621
+6.41743 6.57736
+1.53114 1.62859
+6.73237 7.47083
+6.05618 7.56831
+7.63374 8.16821
+5.20839 6.05382
+0.619043 1.44065
+2.38657 4.88786
+3.88289 5.18788
+4.42283 4.51106
+9.15575 9.22388
+3.18678 3.72243
+3.20638 3.65935
+4.2219 4.97961
+4.63725 6.90959
+2.57123 2.59101
+4.08581 4.37325
+6.53926 6.80412
+1.77475 3.89149
+9.22854 10.426
+2.67375 4.36551
+3.17194 4.0433
+1.10304 2.0348
+3.67233 4.04957
+3.23526 3.5012
+5.17684 6.47301
+4.4 4.67662
+4.15842 5.85903
+5.88496 6.61616
+7.26489 7.51279
+4.17402 6.6997
+-0.540216 0.54573
+4.36063 4.60442
+9.18146 9.96239
+0.977216 2.42032
+9.09143 9.61178
+5.06686 6.23076
+2.04772 2.92048
+1.4154 2.00707
+7.80442 9.54824
+4.55549 4.7148
+7.56964 8.80172
+1.35347 3.21648
+9.12751 10.0605
+1.81735 2.06061
+5.63798 8.0918
+6.79492 7.98002
+9.23053 10.1299
+1.74639 2.02724
+3.71825 4.09879
+2.4995 3.42493
+4.1255 5.66758
+4.75493 6.99687
+8.22481 8.72036
+6.13689 7.53026
+5.41315 5.66358
+4.21425 5.62743
+6.22936 6.44392
+2.02303 2.96414
+-0.0655462 0.130508
+6.1487 6.70994
+4.36674 6.24985
+7.51129 7.63176
+7.9729 8.98613
+3.92117 4.15596
+4.54398 5.43399
+6.34248 6.92305
+-0.550253 1.16167
+9.15142 9.53717
+8.99354 9.65952
+6.28988 7.90053
+3.36505 3.782
+8.80005 9.70553
+1.99947 2.18573
+1.15023 2.07069
+0.253723 1.32958
+2.0392 2.93977
+2.89024 3.00836
+8.16735 8.2049
+1.49508 2.95258
+6.19092 7.44552
+2.33328 3.06758
+6.44166 7.4649
+7.34749 7.79488
+7.5557 8.04141
+2.76812 5.13617
+7.97308 9.25668
+4.73539 5.22234
+7.53377 8.41651
+-0.355405 1.36499
+4.72111 4.73744
+-1.22753 1.84842
+5.5033 5.63808
+3.95421 4.19313
+6.24752 6.98229
+4.49694 5.07277
+3.70871 4.30093
+1.31984 1.50116
+7.16044 8.70868
+2.44587 3.34659
+6.08322 7.20376
+2.75012 2.82555
+0.0394442 0.863634
+3.90896 4.73696
+4.77494 5.04158
+8.41473 8.82932
+1.7049 2.71024
+9.01684 10.1044
+4.57959 5.01066
+3.2484 4.21875
+1.11596 2.88792
+3.53616 4.14001
+5.80672 5.82478
+5.85844 7.70293
+6.18239 6.30124
+2.22913 3.23412
+2.97521 3.08481
+2.2749 3.70611
+2.3457 3.86609
+2.71695 4.04473
+7.22863 7.40115
+1.80428 2.39815
+1.80781 2.33028
+2.78662 3.14936
+9.40717 9.94906
+6.54968 6.80773
+2.76862 3.24492
+1.96034 2.87404
+3.53295 3.54927
+5.36042 5.67073
+8.63339 8.93752
+0.932415 1.70402
+4.32923 4.55594
+9.3491 10.4969
+0.121416 1.15499
+-0.172998 1.36319
+2.02349 2.29887
+1.75352 2.35329
+0.502555 2.01665
+6.71754 6.80014
+3.35175 3.93337
+7.17133 7.9851
+8.51299 9.95771
+5.86103 6.36734
+1.44593 3.46008
+4.49699 4.60855
+2.29261 3.10053
+6.68713 8.19499
+5.43776 6.84387
+8.58591 9.02134
+5.24746 6.15595
+1.3847 2.5074
+6.62143 7.07775
+1.7101 2.077
+9.70898 10.2789
+6.67451 7.92058
+2.56858 3.60374
+1.61917 2.60482
+1.77902 2.16908
+4.76209 6.00461
+3.8894 3.98269
+7.0278 7.276
+5.4866 5.59417
+1.69306 2.92506
+2.45744 3.76592
+2.5689 2.80611
+5.98283 6.06154
+9.5267 9.9626
+9.55652 10.4128
+6.6111 6.64606
+3.38826 4.26111
+3.61887 3.73455
+4.14924 6.13796
+7.15863 7.28212
+5.78984 6.56662
+2.09304 2.2681
+4.39867 4.88557
+6.20907 6.81034
+4.63336 4.91476
+0.939805 2.43621
+1.56774 5.13599
+8.40908 9.82058
+2.06273 2.20306
+2.53524 5.01482
+2.9314 3.23661
+2.48535 3.47368
+0.366389 1.4699
+8.81131 9.01654
+2.05102 2.87972
+1.9699 2.22723
+6.18333 6.98224
+1.3425 2.4443
+0.767883 1.77423
+3.1538 3.43248
+0.891006 0.903458
+5.7136 5.8713
+0.437569 1.37539
+3.98533 5.01646
+8.65764 9.89518
+3.74889 3.98561
+7.74507 8.30657
+8.24671 8.43006
+6.88467 7.42036
+1.99426 2.03522
+1.90486 2.04181
+1.12911 1.71807
+9.25253 10.105
+1.92989 2.0346
+5.60044 6.25585
+9.16848 10.087
+6.67824 6.72257
+1.88522 2.80222
+0.242758 0.852689
+5.09249 7.71484
+5.54974 6.44414
+7.66767 8.72936
+3.48884 3.83156
+3.4697 5.14646
+8.48582 8.7692
+6.76259 7.06897
+7.83856 8.62005
+5.81853 6.76571
+2.04803 2.94439
+6.85396 7.22985
+6.52449 7.39764
+9.26838 9.34809
+4.64449 5.64975
+7.51845 7.80279
+-1.27268 1.65344
+0.686101 4.20373
+7.80552 8.37119
+7.20419 8.35284
+9.33962 9.87975
+4.31238 5.58683
+2.39198 3.84398
+1.29248 2.59269
+4.71612 6.195
+5.27332 6.52174
+7.71492 7.84702
+8.18064 8.72233
+1.55223 2.31294
+6.34374 7.31758
+6.48966 6.92611
+2.62268 3.09895
+4.09064 5.06197
+2.66367 4.12126
+1.53391 2.93092
+8.64516 8.70655
+9.20047 9.28957
+4.00474 4.11716
+8.5418 9.45901
+8.73386 9.73253
+9.22596 9.63179
+1.34204 2.7834
+8.4489 9.21027
+7.75158 8.51085
+5.98856 6.11212
+1.29906 2.08111
+9.24315 9.76291
+6.84345 6.91607
+5.88294 5.90545
+3.03022 3.39941
+3.22222 3.4089
+1.12791 1.65898
+6.70232 7.36336
+8.60042 8.82377
+1.26451 1.30362
+2.76682 2.92693
+1.54763 2.19582
+6.5865 7.24173
+4.15242 4.21742
+8.39615 8.78524
+1.67017 2.08717
+9.03012 9.97041
+2.31463 2.45877
+8.29872 8.51813
+1.66689 2.51919
+-0.807606 1.47794
+1.31452 1.94418
+0.0739222 0.512106
+4.23577 4.25889
+7.45273 7.97505
+3.34234 3.46608
+7.97304 9.14131
+1.9029 2.99946
+8.84087 9.79689
+4.92769 5.68685
+2.74004 3.04513
+0.889257 2.20448
+3.10574 3.9758
+3.91547 4.32303
+7.17475 8.07377
+5.92903 8.03738
+1.57974 1.65527
+3.76339 4.2285
+2.28263 2.7559
+9.53105 9.87477
+2.10154 3.2222
+4.23683 5.34347
+1.38769 2.48482
+5.39838 5.51872
+8.50975 10.1382
+8.04108 9.21474
+8.5252 9.67823
+8.893 10.7726
+7.1294 8.18211
+1.15642 1.73882
+0.436911 0.756698
+3.66142 3.71659
+6.37686 6.7
+8.88506 8.99896
+2.31891 3.79061
+2.61615 2.81909
+1.35216 1.39571
+3.04217 3.52564
+7.8409 9.34099
+0.470596 1.49157
+6.94014 7.18365
+8.05483 8.49979
+8.18511 8.25608
+7.03597 8.45251
+2.47411 2.65172
+0.112716 0.193057
+4.45039 5.10584
+4.53906 5.80013
+5.11702 5.27151
+1.24211 1.90757
+4.64114 4.72912
+1.77254 3.45037
+-0.1275 0.99675
+5.69637 7.67722
+2.21252 2.44032
+3.89623 4.40192
+2.79904 3.15569
+8.37911 9.42424
+5.27199 6.2026
+1.84791 3.75411
+0.522801 0.54806
+3.83644 4.64785
+6.65497 7.55638
+6.75104 6.98564
+2.34979 2.98049
+8.27176 8.60459
+5.07773 5.44064
+1.16934 1.98872
+4.2914 5.37557
+6.83462 7.95408
+3.91405 5.73229
+7.77473 8.53538
+9.23441 9.90185
+4.03659 5.2473
+5.99336 7.8004
+4.2432 5.89276
+6.39847 7.81276
+9.13909 10.4164
+1.12009 2.5649
+2.35157 3.18468
+4.46918 5.55572
+3.82512 5.53666
+7.18238 8.10193
+8.40911 9.23639
+8.99555 10.4192
+6.69547 8.87825
+4.79012 5.34858
+9.23615 10.0986
+-0.590587 1.14603
+2.74289 3.48244
+-0.248403 1.1591
+3.35663 3.7229
+7.37504 7.6481
+6.64796 7.64695
+0.778081 2.41212
+4.49242 4.7772
+8.01419 8.109
+6.6494 7.76619
+8.86331 10.1205
+0.817273 0.937855
+8.00019 8.21556
+6.19405 6.54794
+6.11798 7.30421
+3.40164 4.28921
+5.31927 6.21584
+2.79377 3.40938
+3.59494 3.90321
+7.79218 10.3132
+2.99546 3.86111
+1.71916 3.40283
+6.1768 6.81915
+7.59629 8.68568
+1.59724 2.348
+6.20151 6.5391
+6.30798 6.70478
+0.489786 1.51322
+1.28396 1.86775
+5.18031 5.43007
+6.61276 7.70565
+1.4909 2.11165
+4.56163 5.49277
+1.93598 4.35147
+3.65568 5.00224
+1.68028 2.00363
+7.82874 8.67399
+1.23053 2.87598
+-0.164275 0.194491
+2.58349 4.01302
+1.23279 2.02984
+0.599702 1.09257
+9.50965 9.80164
+2.33108 3.58037
+4.38659 4.62378
+2.65097 2.87349
+0.0537058 0.576502
+4.20415 5.15693
+5.41458 5.98382
+4.37747 5.10347
+2.62536 2.70073
+6.96845 8.15356
+6.91533 8.41638
+9.36431 9.58863
+6.13019 7.25915
+2.7818 3.4951
+9.44641 10.1301
+2.68817 4.19772
+5.65664 5.6814
+8.25308 10.498
+3.50374 3.64458
+1.47063 1.78567
+8.21901 8.98152
+3.99261 4.47339
+2.51395 3.38788
+4.66178 5.24959
+9.08415 10.3467
+5.92351 7.20447
+1.74145 2.35957
+7.62653 8.96797
+6.43542 7.68775
+5.49047 6.56355
+4.9225 6.22555
+0.257967 0.704837
+3.42488 3.52873
+8.67606 9.77824
+5.12981 6.37856
+5.97359 6.32151
+1.58517 2.28129
+0.530687 1.54545
+7.04056 8.15296
+1.8541 3.1902
+9.46286 10.0098
+3.17967 4.02237
+3.49966 3.80271
+6.24894 6.49618
+1.19944 1.59215
+5.30422 6.94823
+7.49137 7.78584
+7.02669 8.16282
+2.21673 3.36471
+7.66183 8.34763
+4.13876 4.87421
+3.0199 4.07124
+8.40439 8.82943
+-0.274649 0.429602
+6.11215 7.65609
+3.34781 5.03006
+1.28231 1.77258
+7.57256 8.59456
+5.36208 5.81735
+7.18511 8.96618
+8.86053 9.49567
+5.39097 5.93211
+6.59094 7.26553
+3.69159 4.01914
+8.73797 8.81611
+1.41144 1.82827
+7.83555 8.07567
+6.13821 8.44907
+5.83432 6.48744
+2.93596 4.66271
+7.03215 7.59658
+1.65252 2.45337
+2.91358 4.90129
+8.94415 9.14642
+5.21005 6.1166
+0.33225 1.17039
+7.40089 8.07586
+9.30427 9.40776
+2.34188 2.81124
+1.02811 3.3344
+6.28117 7.62089
+4.80105 7.10049
+8.90252 10.0057
+2.20932 2.33093
+8.20746 10.6268
+4.31887 5.23945
+9.258 9.8985
+3.80742 4.15057
+1.11313 1.23711
+9.53067 9.70165
+7.95467 8.67187
+9.66031 9.83223
+3.61385 4.09571
+0.623148 0.652817
+7.77809 8.62118
+0.86157 1.98606
+3.12528 3.75815
+1.9363 3.22621
+8.23521 8.99175
+8.95406 10.4487
+3.38526 3.90652
+0.34281 2.0226
+0.739384 0.793829
+3.55637 3.96384
+6.1562 7.28647
+5.30211 7.51385
+1.46275 1.78688
+-0.0144662 0.868488
+0.0740443 0.119828
+9.26206 9.83923
+0.743397 1.40754
+4.68823 6.62985
+8.8291 9.17373
+4.66711 5.09313
+4.023 4.44994
+5.68937 5.79194
+8.04835 8.06763
+6.94662 8.00075
+0.774686 1.13428
+0.381819 2.34757
+2.1235 2.63524
+5.42795 6.89998
+6.07662 6.29083
+6.47821 6.7872
+2.58305 2.6192
+-0.598336 1.23458
+4.29089 5.43332
+8.09914 8.28229
+5.05925 5.35258
+0.181705 0.444466
+3.27849 4.79932
+0.310314 1.43125
+1.13836 2.76825
+1.2529 4.09336
+0.198106 0.608625
+1.77442 2.23777
+6.29823 6.64574
+1.22125 1.37929
+1.77592 3.04011
+1.43999 2.90926
+4.20495 5.32396
+4.98874 5.33211
+8.36483 8.67875
+5.65373 7.14132
+2.8303 3.05037
+3.41509 3.54032
+7.21702 7.85857
+5.79848 5.8913
+4.52711 5.65511
+2.04663 2.66919
+5.76363 6.77903
+-0.153046 0.77878
+4.37474 4.49936
+6.86786 7.81999
+8.92084 9.16368
+7.5975 8.56954
+0.197493 1.07503
+3.99803 4.67019
+9.35123 9.60094
+1.46442 2.4256
+5.21501 5.79612
+8.80879 8.99085
+-0.109252 1.30631
+7.34965 7.87947
+7.08703 8.12723
+0.985946 2.14663
+0.48521 0.856118
+6.57719 6.70623
+8.71165 8.72286
+3.16883 4.8714
+-0.21189 0.412944
+3.6526 4.37121
+0.364649 1.3363
+9.27722 9.35135
+3.47517 3.8793
+5.67149 6.28631
+6.52789 6.61039
+9.36323 10.4189
+4.30743 6.18638
+7.93653 9.4877
+8.24024 8.41475
+2.75692 3.13935
+8.80223 9.1489
+3.42656 3.90557
+8.96598 9.3217
+1.99582 4.84803
+5.1178 5.8688
+4.47901 5.73433
+7.30397 7.85527
+0.18463 0.656832
+7.80806 8.41666
+8.50023 9.42628
+7.67563 8.64756
+9.46783 9.52169
+2.06797 3.3107
+5.08863 5.10167
+0.82146 1.39055
+7.5428 8.04736
+9.09407 10.8208
+9.15219 9.99706
+1.61637 3.46354
+5.3812 5.96247
+9.34115 9.73575
+6.49221 7.30031
+1.56337 3.39704
+8.463 8.60841
+-0.322779 0.658242
+8.50173 8.72125
+0.854851 1.83405
+7.81945 8.12841
+2.60724 3.19985
+5.03714 5.55331
+1.85041 3.36816
+7.26119 7.64364
+5.75223 5.99653
+4.00026 4.43863
+5.00939 6.03009
+6.22879 6.6638
+6.44231 7.18622
+1.66002 1.88587
+2.59781 2.84919
+4.96399 5.40545
+5.70327 6.95018
+6.97141 7.08346
+3.98535 4.6179
+5.96795 7.14997
+5.07581 5.8262
+4.65665 4.98851
+8.65646 8.70986
+3.04175 3.19155
+0.796073 1.0952
+8.24859 8.57828
+5.26952 6.34245
+7.94685 8.78542
+0.193963 0.968524
+6.61159 6.80186
+9.37533 9.79195
+8.94048 9.74959
+5.77272 6.48616
+6.0092 7.86718
+2.52621 2.58938
+8.91347 9.22421
+4.20466 5.45909
+4.82157 5.09167
+7.35464 7.36611
+5.12413 6.45063
+2.12404 2.81187
+8.88875 9.20752
+2.59731 3.20587
+1.54772 2.08968
+6.70449 7.08952
+-0.0967146 0.888521
+3.10207 4.34815
+1.20807 2.35497
+6.00753 6.08492
+3.21837 4.00446
+4.34095 6.0963
+4.24821 4.79576
+4.49523 6.6669
+1.49483 2.52552
+0.0411497 0.641526
+8.3854 9.20954
+8.12419 8.93702
+0.0201515 1.06914
+1.57617 3.44176
+1.4173 1.76847
+5.42261 6.51539
+6.6744 8.46109
+3.05234 3.59179
+6.49059 7.24618
+7.01989 7.69901
+2.34664 2.90601
+9.17324 9.86754
+5.50919 5.70258
+2.40486 4.6009
+3.74368 4.00093
+6.9211 7.33554
+7.41358 8.7413
+8.78284 9.62033
+2.96753 3.01602
+-0.200693 0.535532
+6.4383 6.45049
+8.28835 9.42148
+4.2379 5.35128
+4.68397 5.04593
+5.7185 7.03177
+5.37494 6.43977
+2.99518 4.08138
+7.28064 7.54638
+9.10622 10.4907
+1.23839 1.50915
+6.7823 9.24533
+8.45679 8.62427
+0.106718 0.69304
+2.84119 3.50375
+3.60466 4.51338
+8.04709 8.19023
+3.31632 3.48054
+5.9027 7.46331
+-0.621072 1.13003
+8.57167 8.69262
+0.301047 1.42246
+1.24229 2.44616
+0.962706 1.55754
+8.77327 9.55275
+1.77899 2.44335
+0.368575 1.84726
+9.05918 9.07832
+6.61723 7.68015
+8.59899 8.80383
+-0.133927 0.20271
+5.69266 5.74809
+0.68202 1.52342
+7.17359 7.91482
+5.74049 7.34297
+7.88371 7.9683
+1.58749 2.26543
+3.96728 4.45988
+5.4354 6.88336
+1.68706 1.6976
+6.56907 7.40696
+0.518151 0.724124
+8.99155 9.36995
+6.00506 7.91529
+5.26967 6.11536
+2.37416 2.50887
+8.47983 9.31509
+2.38155 2.54346
+8.08415 9.65214
+1.00693 3.19203
+1.6523 1.73553
+6.85283 6.9958
+4.11425 4.90193
+1.39597 1.58725
+5.05551 5.19458
+5.89969 6.11394
+5.9148 7.26824
+9.32271 9.93989
+1.62911 2.58215
+5.43399 6.14203
+3.11393 3.58792
+8.57619 9.3788
+2.23349 2.7884
+8.09022 8.54326
+9.7114 9.87076
+5.91086 6.10885
+7.35805 7.57276
+0.650002 0.879866
+3.24977 3.75531
+2.73948 3.41051
+3.08006 4.62772
+3.71868 4.31519
+4.13905 5.78577
+1.77297 3.02983
+5.85931 5.89333
+3.68972 3.93193
+1.43922 2.98425
+6.51534 8.33386
+6.6821 7.50874
+1.2541 2.11722
+5.40634 5.54411
+4.55502 4.60346
+4.32484 4.68497
+3.40711 4.31975
+9.20893 10.0853
+6.12594 6.9009
+0.12664 0.347193
+7.53378 8.82258
+7.79572 8.91645
+2.50098 3.39701
+4.17873 4.97732
+1.05822 2.47032
+3.1012 4.97736
+8.42126 8.74568
+7.83301 8.17843
+9.26618 10.584
+3.02667 3.7128
+8.30654 8.69242
+2.87173 3.43275
+6.59917 7.54843
+7.03447 8.20283
+5.75718 6.40637
+2.62899 4.1855
+-0.520148 0.902194
+5.1538 5.61763
+1.25625 2.33142
+4.16336 4.3384
+3.01296 3.41026
+3.16515 3.26305
+2.40944 3.21897
+6.80742 8.57141
+1.15125 1.54824
+8.72251 9.50878
+3.15703 4.04482
+0.470308 0.726093
+0.199979 0.878243
+7.8908 9.17915
+6.91793 7.16038
+4.64783 5.00217
+2.21237 3.03073
+1.5825 1.63362
+3.18806 5.20795
+5.92725 5.95595
+4.65027 5.09868
+6.42204 6.87201
+8.08637 9.40221
+4.95542 6.16185
+7.45987 7.57979
+8.826 9.13961
+4.42078 5.27977
+7.26216 8.97585
+2.26919 3.33512
+9.4077 9.81908
+0.722223 1.03378
+-0.0497795 1.19355
+8.22686 9.31082
+0.0733766 0.93037
+7.47883 7.9062
+5.28731 5.74181
+1.78496 3.61348
+0.690987 0.764344
+2.56442 3.54999
+4.27944 5.43124
+4.04412 5.35376
+0.663756 1.88268
+1.73567 1.78553
+8.07666 9.41842
+7.70138 8.42873
+9.27113 9.55873
+0.982413 2.5565
+0.994807 1.02007
+5.01226 5.31923
+8.87435 10.0597
+1.74836 3.22578
+0.151528 0.191719
+5.82608 6.06438
+1.17239 1.59955
+3.18515 4.11049
+1.92258 3.70604
+1.63692 1.8266
+1.83542 2.66228
+2.21954 3.11425
+3.97546 4.3928
+0.731374 2.05705
+5.44809 5.96359
+9.85934 10.0553
+8.42169 9.63654
+6.68148 8.43446
+2.00014 3.3485
+0.735924 1.73
+1.61833 3.05643
+7.87934 8.67316
+8.67441 10.0032
+0.794573 1.2493
+6.11926 6.41441
+5.2715 5.82597
+9.41854 9.46625
+3.46299 4.06742
+5.6487 5.79053
+1.46503 3.43496
+0.9957 1.53939
+2.4714 3.1301
+0.887049 1.6196
+3.04884 3.19662
+1.24337 2.05758
+7.61142 8.55766
+0.998279 1.64425
+4.74917 5.85236
+2.97632 3.94611
+4.11786 5.62709
+7.40498 7.62083
+1.47854 3.64736
+2.1176 2.64511
+4.55533 5.89436
+7.44618 9.79926
+-0.410242 0.737348
+5.719 6.30861
+8.33692 8.38222
+8.78122 9.98195
+3.75452 4.26866
+2.23771 2.44985
+6.72455 7.61362
+5.9797 6.58846
+6.72885 7.60315
+-0.710302 1.18332
+7.73287 9.383
+6.61213 7.67394
+4.12945 5.68527
+-0.300887 0.341615
+5.77978 6.41534
+8.34001 9.96874
+1.62323 1.8283
+1.71788 2.23905
+7.43484 8.0418
+3.47322 3.8047
+3.47311 3.51261
+7.82093 8.86377
+2.46973 2.99125
+7.91166 8.55065
+3.39807 3.43599
+8.94792 10.0437
+7.70859 8.32487
+5.86852 7.13103
+7.64996 9.19033
+6.66742 7.8092
+7.88241 8.58675
+9.42939 10.3479
diff --git a/geom_bottleneck/tests/data/ws_tests/test_5000_B b/geom_bottleneck/tests/data/ws_tests/test_5000_B
new file mode 100644
index 0000000..5f6e43c
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_5000_B
@@ -0,0 +1,5000 @@
+1.17434 1.46837
+2.58198 4.16589
+0.234041 0.968658
+1.52703 1.59579
+6.7103 7.44033
+3.19227 4.41539
+5.42556 5.57369
+3.45417 4.86089
+3.82256 4.1092
+7.82551 7.90784
+3.9384 4.71796
+5.60335 5.9054
+7.96663 9.8987
+6.30305 6.64853
+7.33246 10.5316
+0.623312 1.09008
+2.63041 2.64616
+5.36028 6.28956
+4.64202 5.91858
+7.55219 7.96304
+7.73736 9.18221
+1.67114 1.84851
+5.07514 5.12159
+7.03732 7.05228
+7.5006 7.59212
+0.244947 1.55875
+0.0170454 1.10485
+1.95394 3.53669
+5.66015 6.01949
+5.88211 7.64639
+7.46698 9.27085
+6.37429 7.10154
+4.54535 4.81932
+8.21203 9.35896
+4.89933 6.20802
+3.68683 4.17831
+0.477467 0.828394
+6.17871 6.77834
+9.77523 9.92676
+0.854808 2.38709
+7.93326 8.3553
+2.10917 2.27771
+4.07045 4.72793
+8.2016 8.8011
+2.9205 3.95746
+2.89806 4.39725
+5.5654 5.78669
+9.5219 9.98543
+7.08591 7.19588
+8.35359 9.57893
+9.81348 10.0345
+8.5994 9.71835
+5.43903 7.25234
+1.82768 2.92724
+4.44952 6.79754
+5.66747 7.34386
+5.88153 6.39253
+3.34008 4.22032
+2.46068 2.76051
+0.370778 2.61681
+6.02508 6.26809
+4.32654 4.93262
+7.41536 7.99616
+8.84229 9.87911
+3.8551 5.84353
+1.56832 2.34694
+6.96099 7.42028
+8.15753 8.72014
+9.23141 10.3815
+7.4484 7.80228
+0.473671 0.874895
+3.15689 3.50687
+3.58122 4.09945
+3.55022 3.74767
+4.42708 5.80211
+4.40956 4.68699
+3.80576 4.61856
+7.29965 8.28614
+7.40582 8.15308
+1.69789 1.77669
+1.66419 3.44308
+0.473997 0.872506
+7.83959 8.52898
+6.22416 6.36949
+-0.187159 0.871822
+0.232336 0.585965
+9.29905 9.44357
+1.4459 2.40589
+2.83008 3.19758
+1.15291 2.12112
+2.58686 3.33896
+6.79362 7.88068
+0.228178 1.48318
+5.60001 6.20258
+4.97803 7.10992
+1.70429 1.962
+2.72659 3.13886
+9.22714 9.25889
+3.84694 3.88778
+-0.282077 1.48155
+9.28756 9.58517
+4.34069 5.59751
+8.63909 8.76839
+8.86236 10.7642
+6.77597 8.41888
+7.30621 8.64164
+0.685607 1.22755
+2.91514 3.22638
+2.72098 3.66837
+8.17528 8.32638
+5.19632 5.7506
+7.34177 8.70639
+5.74082 6.35524
+5.95975 6.69284
+9.40187 10.4488
+2.92761 3.36735
+0.399531 3.13082
+4.83399 4.92635
+7.74539 8.56852
+1.76322 3.5086
+6.54479 6.72963
+7.64362 8.12404
+1.35542 1.45313
+0.214385 0.718085
+1.7006 3.21962
+5.91009 6.47862
+2.21093 2.34636
+5.96919 6.79365
+6.59951 8.22203
+1.54571 1.59397
+3.27012 3.79128
+0.32455 0.622995
+1.73926 2.78017
+9.81035 9.84077
+7.38441 7.85171
+8.90372 9.34186
+7.26323 8.41174
+5.7363 5.97348
+8.25473 10.1281
+2.3981 2.52096
+8.53783 9.63442
+8.51755 9.2735
+6.48614 6.773
+3.40182 3.65137
+2.1353 3.04852
+2.95397 3.73285
+6.98063 7.4963
+4.50189 5.26384
+0.21416 1.49363
+0.632196 1.36307
+6.57833 6.60481
+8.0634 9.33903
+2.79759 2.94462
+4.43747 4.58861
+6.48733 6.86569
+2.28008 3.47037
+6.87452 7.77431
+-0.156821 2.71557
+0.72595 1.78862
+1.97586 2.38196
+8.61839 9.1468
+4.55496 5.68986
+0.26923 1.15728
+9.63757 9.7236
+1.39497 1.96698
+4.8643 5.04172
+6.64675 7.66435
+2.56256 2.6015
+-0.381989 0.611211
+0.676336 1.26896
+8.95304 9.03243
+5.62058 6.07997
+3.36522 4.04276
+8.64868 10.5024
+4.75813 5.19834
+1.96608 2.05864
+9.01449 9.10397
+3.72786 4.51921
+5.6938 6.96584
+1.73499 2.9314
+2.73099 3.41409
+8.77171 9.07665
+4.63865 4.67649
+8.6698 9.30782
+-0.168259 2.09581
+9.29672 9.56
+0.372544 2.60567
+0.450487 1.32919
+6.95341 7.6399
+3.4403 5.24993
+5.53469 6.97831
+-0.79664 1.21306
+5.68831 6.14413
+8.85601 8.95444
+3.83309 5.211
+5.51573 6.5114
+3.64009 3.99648
+4.40759 4.99283
+1.85198 2.6457
+2.72645 3.74803
+2.04751 3.00998
+3.19365 3.9383
+8.09529 9.45596
+8.88173 9.5618
+0.609816 2.67806
+1.57288 2.60884
+1.68354 1.80124
+4.92058 5.9959
+1.48728 1.84885
+0.299669 0.413905
+9.02156 9.56731
+7.50854 8.49023
+0.667131 1.89987
+2.22472 2.58793
+5.84395 8.79426
+2.35839 2.66935
+3.43111 3.69982
+6.71023 7.36801
+6.75697 9.0991
+2.35352 2.85316
+6.73054 7.39006
+9.48673 10.1493
+6.71226 6.72805
+9.22083 9.71889
+8.36513 9.33921
+0.0652672 0.319993
+3.26467 4.60881
+7.62269 7.79878
+6.48608 6.69515
+6.21737 6.88645
+6.56094 6.9699
+1.61317 2.7167
+5.08621 6.29754
+2.24676 2.8076
+3.09943 3.93921
+9.74093 10.0968
+0.417699 1.6381
+9.2958 10.2973
+3.6663 4.1369
+0.0229943 0.448065
+9.2928 10.1833
+3.66334 4.22032
+0.812172 2.19952
+7.88025 8.71192
+8.69379 9.34922
+1.70691 2.95352
+8.28737 8.29985
+5.22491 5.354
+4.03526 4.14084
+6.49359 7.05924
+0.24853 1.44718
+7.86936 8.75135
+5.76 6.68919
+5.85437 6.14314
+5.86292 6.0516
+2.35692 2.91295
+0.0990674 1.29386
+2.9911 3.56188
+0.552671 0.638929
+5.80756 6.22761
+1.21067 1.77175
+4.51882 4.72936
+1.99969 2.89732
+3.65968 6.61987
+0.478582 1.33355
+0.259061 0.289813
+3.89264 5.02474
+0.349236 0.438003
+7.70442 8.1729
+7.90389 10.1876
+3.06898 3.15219
+4.77811 5.29095
+9.76561 9.89451
+4.14295 4.2489
+0.540224 2.28623
+9.60749 10.2284
+8.49555 9.00307
+7.89668 9.76886
+4.12631 4.70897
+7.87898 7.91814
+9.29858 9.52908
+9.24009 9.91544
+3.73498 4.70275
+5.44467 5.9274
+2.13453 4.85697
+2.29607 2.88771
+0.807842 1.82319
+0.319005 2.08473
+1.62 1.63649
+2.20431 3.23869
+2.00132 2.77136
+6.64752 6.71706
+8.12249 8.28379
+7.55541 7.7813
+3.51763 3.64484
+9.21075 10.2811
+2.24501 2.54426
+5.64566 6.46452
+6.72307 8.56698
+3.91728 4.60262
+4.02535 4.29548
+3.0499 3.53135
+1.30677 2.32194
+9.36908 9.90669
+3.92387 4.33848
+2.87312 3.08243
+4.49167 5.2749
+5.43143 6.74905
+6.94595 9.16539
+1.9784 2.00429
+9.42478 10.2226
+3.7185 3.96576
+9.37729 9.50574
+5.34283 6.89736
+4.95341 5.84626
+2.91654 4.28413
+8.26544 9.3076
+6.23114 7.20273
+1.02585 2.21446
+1.6718 2.29591
+2.28926 2.73452
+-0.648145 1.105
+1.44194 2.18562
+6.78584 8.37985
+2.00402 2.08248
+1.64076 2.04067
+0.0419044 0.455962
+5.51723 5.72098
+5.42117 6.81165
+5.70331 5.81707
+4.97889 5.60741
+3.38797 4.46846
+7.20995 7.66784
+3.45388 4.23386
+3.11057 4.35995
+3.29476 4.04676
+2.0519 2.94719
+5.37101 5.38271
+5.99383 6.64188
+7.48444 7.6377
+2.15043 3.05399
+1.54093 1.83799
+5.59223 5.87222
+5.8005 6.08042
+6.1208 7.22563
+1.2938 2.17454
+4.92405 5.0402
+6.91336 7.79688
+1.47978 1.99762
+9.00494 10.8315
+5.84805 6.15303
+4.95368 5.49096
+8.21704 8.31192
+0.715222 2.33517
+0.904183 2.54741
+3.42349 3.74906
+0.627978 2.37092
+8.41477 8.72651
+3.55373 5.58652
+4.12685 4.61533
+0.775274 1.41263
+4.78915 5.08639
+6.35791 8.15015
+2.88242 3.63509
+2.78526 3.07834
+0.39129 1.15933
+3.26615 4.74531
+8.78873 9.8888
+7.25612 7.45972
+4.97452 5.30012
+0.757255 1.35518
+1.29516 2.52446
+4.66838 4.96648
+-0.0720209 0.832726
+2.68276 3.21123
+8.44253 10.0311
+3.40809 4.70506
+1.09617 2.35452
+5.19302 6.73599
+1.25316 1.58101
+6.2056 7.10099
+7.7666 8.52777
+0.301239 1.37275
+0.522829 0.731575
+6.73869 6.96826
+2.41703 3.20567
+4.94617 6.22052
+5.41524 7.68272
+6.0408 6.29938
+0.0642067 0.600878
+6.32122 6.63505
+3.25427 4.70611
+5.88704 6.1678
+8.71533 9.08476
+6.25575 6.88392
+1.54462 1.56366
+3.95938 4.03326
+2.54671 3.66798
+8.48603 9.10156
+3.37369 4.65454
+5.25469 5.64636
+7.02624 7.36449
+8.17061 8.44321
+9.23147 10.1149
+1.45589 2.25886
+6.47702 8.25307
+7.69088 7.91753
+0.442832 0.616926
+8.35355 8.83222
+7.65142 9.58906
+4.04877 5.17345
+0.76012 1.8686
+6.54877 7.40058
+7.41774 7.65429
+8.69655 9.3325
+4.8302 6.25306
+1.77203 1.90284
+3.67485 4.94569
+6.60162 6.72031
+3.05924 3.35235
+0.0823162 1.3486
+8.42991 8.86331
+6.81596 6.83527
+-0.0174808 1.6745
+-0.758131 1.08928
+4.14423 5.46342
+9.26253 9.85714
+7.42749 8.58214
+4.88849 5.86936
+8.99339 9.38141
+8.85301 9.18285
+2.64303 3.45658
+7.1133 8.66473
+3.50745 3.8629
+7.81615 7.83244
+2.94991 3.8741
+7.91822 8.8362
+-0.0553088 1.19059
+7.35558 7.77948
+2.11257 2.20563
+8.57533 9.16338
+2.3515 3.13009
+4.13239 5.38696
+2.20763 2.93941
+7.2451 7.3211
+0.834388 1.57413
+4.47024 6.17855
+4.75947 6.80913
+2.99607 3.54732
+8.15998 8.80718
+8.94688 9.27971
+4.46335 4.9522
+5.30725 5.69786
+7.63989 7.86974
+6.69589 7.69565
+5.34018 6.08115
+8.59515 9.62264
+1.80557 3.22507
+8.62429 8.94242
+1.34532 1.95042
+8.60707 8.80741
+8.03275 9.40327
+4.30357 4.39095
+8.97954 10.7076
+2.18143 3.51825
+3.98695 5.62062
+2.48813 2.60622
+5.56957 6.43776
+5.18249 5.55459
+3.45373 3.64101
+-0.00345662 0.570597
+3.61127 4.69761
+9.37858 10.6205
+7.24635 8.19639
+4.70142 4.80735
+3.30055 5.14257
+0.860415 1.31635
+4.72924 5.46893
+7.47391 7.72644
+6.22287 6.57754
+0.181652 1.01366
+2.14494 2.80736
+2.16406 3.19383
+8.52991 9.22722
+8.74411 9.06935
+0.575831 1.02699
+2.47315 3.0331
+4.2872 4.59813
+5.82293 7.03604
+2.08982 2.25319
+7.3626 8.41994
+1.23867 3.10885
+7.397 7.78026
+6.78837 7.32977
+0.829368 1.56617
+9.23075 9.35172
+6.76562 7.23578
+0.42851 0.839401
+4.83626 5.5852
+0.150032 2.45322
+2.16811 2.47439
+5.60245 5.81188
+7.43707 7.46519
+0.167317 1.44642
+4.9732 7.58343
+8.67391 10.2957
+0.318592 0.639284
+3.365 4.25929
+7.83683 8.88895
+5.20557 5.30114
+0.940347 1.74022
+5.39149 7.13464
+1.10826 1.27913
+1.9147 2.31276
+0.935283 2.49181
+3.67898 4.33336
+5.10125 6.07734
+0.348807 0.839242
+0.310986 0.58381
+2.03594 2.43119
+5.49755 5.94215
+1.94885 3.34409
+9.66806 9.97883
+4.79099 5.45155
+4.81158 5.30001
+5.17667 5.90019
+9.64168 9.99177
+1.14899 1.22792
+0.466236 0.952985
+6.93679 7.72282
+2.97285 3.23931
+9.22517 9.24315
+7.25783 7.46414
+4.37304 4.51815
+4.01069 4.02979
+0.843132 1.80443
+4.78572 6.04237
+6.02471 6.38074
+4.99536 7.76852
+4.97442 5.17384
+0.731231 1.49497
+2.2797 2.90845
+9.13211 10.341
+4.19545 5.08597
+6.13127 7.09817
+2.65124 5.02208
+5.40235 7.12912
+6.86258 6.91991
+8.24317 8.55273
+7.6877 7.69875
+3.33922 3.53776
+0.089484 0.40755
+1.34909 1.68726
+8.43113 8.72899
+4.90038 5.55994
+0.308089 0.490555
+5.42628 7.1433
+2.11647 2.56987
+3.56934 4.1619
+8.35794 9.24416
+8.8645 9.69151
+5.10701 6.0036
+7.66385 7.8412
+2.89952 4.55221
+6.01533 6.38269
+-0.945182 1.07304
+1.79537 1.85576
+-0.0313338 0.501067
+8.85689 8.87522
+1.61143 1.7773
+9.53229 9.84943
+3.51669 3.81091
+-0.448016 1.10903
+3.16889 3.439
+4.30534 4.36372
+6.20158 8.09618
+2.20949 5.23616
+3.29459 4.17079
+3.90101 4.05611
+5.89688 6.85702
+0.734474 1.04471
+7.84341 8.02702
+8.69431 10.1086
+9.73194 9.92195
+7.63516 7.70631
+8.51416 9.33072
+-0.0712911 0.361001
+2.76979 3.22708
+5.34404 7.5165
+5.64429 5.79865
+0.0755012 0.363483
+5.05631 7.27153
+-0.60164 1.09659
+0.457228 0.876186
+4.27092 5.38033
+8.63891 9.04134
+6.29608 7.04242
+8.97795 9.93013
+5.00385 5.57737
+8.48068 9.44885
+7.35543 7.78492
+3.55698 4.01035
+-0.268117 0.649128
+0.633184 0.66254
+4.54216 4.81132
+6.15574 6.35276
+4.3663 6.36286
+1.45231 2.07039
+7.37031 7.9157
+5.30961 6.3506
+5.80757 5.81762
+4.91767 4.97519
+3.45667 3.60965
+1.7934 2.3807
+4.33289 5.41047
+1.16021 1.29979
+3.75172 4.53521
+3.10835 3.1275
+2.68167 3.00314
+4.10639 4.24094
+4.90776 5.74069
+7.30861 7.86666
+3.52822 3.70998
+5.22222 5.28033
+0.00866476 0.326377
+7.73247 8.61481
+4.25231 4.77499
+8.41148 8.54604
+2.95389 3.63497
+7.76126 9.69124
+6.41218 6.69682
+4.86285 6.44503
+1.84783 1.9065
+4.08788 4.11706
+9.17473 9.50133
+5.15091 5.78649
+1.27694 3.33579
+2.92648 3.37855
+9.37392 10.5123
+4.81878 6.34991
+8.38702 8.83716
+5.07771 6.33618
+1.47438 1.75588
+6.20935 7.11166
+1.08286 1.38
+1.40048 2.0157
+6.60355 7.26234
+5.28396 5.90003
+8.9525 9.59216
+-0.0305792 0.544664
+-0.571491 0.735471
+6.287 7.03679
+5.35225 5.4104
+0.095812 0.605976
+4.33523 4.4048
+6.13288 6.80949
+4.14654 5.5505
+-0.213214 0.260592
+7.56188 7.83088
+7.8132 8.65963
+8.02469 9.3254
+0.00641711 0.420562
+7.49269 8.15849
+9.26359 9.4366
+5.74008 7.86317
+8.62729 9.78825
+4.28946 6.20553
+3.19174 4.54991
+4.16992 4.25203
+2.46138 4.11583
+1.92971 2.16701
+3.43028 3.80842
+6.98297 7.28388
+7.51884 7.55947
+7.79102 9.44326
+0.416342 1.32311
+9.35398 9.85201
+8.72997 9.10384
+6.23398 6.88888
+7.46984 7.4875
+5.92603 6.66938
+1.77761 2.58697
+0.835966 2.06139
+9.63284 10.3565
+6.13677 6.42768
+0.151375 0.382404
+8.10315 8.13441
+5.52283 6.28113
+1.00873 2.44226
+2.5239 3.89871
+5.40599 6.72653
+3.43407 4.0068
+1.22444 1.26601
+7.04395 7.80599
+3.75987 3.77123
+6.43597 7.06249
+8.34435 8.87418
+8.25853 9.04009
+0.415321 2.32725
+0.639046 1.75525
+7.83226 8.12538
+9.55429 10.2734
+3.658 4.35867
+1.8588 3.93292
+7.38922 8.16823
+8.53626 9.23024
+0.848152 1.13412
+6.31667 7.2348
+3.81584 4.62621
+9.24748 10.7408
+2.75953 2.95288
+5.70188 6.62278
+4.22202 4.45368
+3.24616 3.88779
+1.05053 2.09846
+8.67718 9.52693
+2.14107 2.71959
+1.10518 2.69689
+5.01476 5.54139
+4.69244 5.20358
+8.88285 9.93012
+2.55228 2.77382
+6.72118 7.50057
+7.58999 8.71573
+1.83763 2.13481
+4.86135 5.27995
+4.39794 5.42117
+1.42512 2.98262
+4.80489 5.34701
+2.7993 5.13702
+7.52122 8.41729
+9.08613 9.37543
+1.1555 1.3935
+7.34071 8.0428
+8.33361 8.40349
+2.514 2.54741
+8.25732 8.41758
+1.65337 2.57964
+4.20527 5.06565
+0.723443 1.06987
+5.85836 6.64701
+7.908 8.07591
+5.01839 7.0105
+3.15908 5.10364
+4.3574 6.67192
+2.06662 2.46437
+7.5595 8.9108
+7.94919 9.20231
+4.11889 5.49714
+7.28151 7.51881
+1.30685 2.09479
+3.08479 4.47364
+4.50916 5.91511
+7.31605 7.63868
+3.14469 4.07035
+8.38431 8.87993
+7.42277 7.64967
+4.22472 4.26323
+8.49871 8.90746
+7.44431 8.09014
+8.35213 8.7504
+3.85634 4.37584
+9.12975 9.77042
+-0.326056 1.17374
+3.53802 4.06211
+6.81775 6.8467
+8.19106 8.64489
+4.20526 5.37727
+2.74081 3.72143
+0.49642 1.10775
+7.76606 8.00524
+4.79825 6.38926
+1.99478 3.20484
+4.69853 6.29508
+5.73058 7.18643
+8.11708 8.64257
+9.62375 9.84838
+5.95271 6.38989
+9.0193 9.93848
+3.91188 4.10834
+6.065 6.60546
+2.62354 3.60072
+8.53665 9.06824
+6.40691 7.44693
+1.62959 2.5825
+9.4128 9.87031
+6.24697 6.62684
+3.31136 3.45626
+4.80347 4.9935
+9.21711 9.53416
+-0.491547 1.72886
+4.75174 4.87217
+0.86329 1.53331
+2.4586 4.2578
+5.10301 6.2815
+5.08302 5.86788
+6.12434 6.78948
+9.68323 10.0973
+3.52576 4.40424
+4.9925 6.89084
+0.846638 1.80782
+1.09709 1.7685
+8.38592 9.03312
+9.56243 10.2682
+5.03592 6.6429
+7.8609 8.04599
+1.21404 1.31975
+7.47824 9.2063
+1.47849 2.68795
+1.2909 2.06381
+5.21288 5.54616
+6.27218 6.99345
+4.77622 5.08494
+3.30665 4.14735
+3.38947 3.55545
+7.71197 8.53162
+1.10565 1.50806
+0.7889 0.984689
+2.88598 3.33244
+5.70958 5.81232
+5.16567 6.24511
+6.91255 7.25784
+-0.401084 0.753156
+4.81138 6.20671
+1.67301 3.58501
+7.19478 8.25624
+1.24428 2.2523
+4.31631 5.33357
+0.589196 1.02017
+5.69207 6.97803
+2.3854 3.25501
+4.1362 4.91135
+8.9932 10.3184
+7.95871 8.45158
+4.03213 5.26347
+3.09506 4.06425
+-0.0310321 0.738171
+7.35733 7.61512
+2.48488 2.96253
+4.72098 5.69867
+5.5395 5.96914
+3.17854 4.283
+6.50012 7.33744
+1.93266 3.00941
+1.49319 2.71826
+9.0187 9.13099
+7.15259 7.40691
+8.71939 8.93257
+1.57203 3.11249
+0.933429 2.16903
+2.99663 3.71667
+2.06144 2.81311
+7.9072 8.2103
+0.490069 0.614737
+7.84111 9.70812
+1.15363 1.6421
+1.15475 1.43307
+8.2228 9.92116
+7.76825 8.40724
+6.15122 7.31322
+7.1427 7.49294
+2.30516 2.7019
+2.03336 4.03387
+8.3918 9.85707
+8.57214 9.59345
+3.8057 4.1119
+8.9223 9.38556
+9.32051 9.60504
+7.13349 7.69154
+1.71855 2.00425
+5.10333 6.0605
+-0.149137 0.80973
+0.466224 3.1698
+4.19165 4.29604
+1.64018 2.3161
+9.40397 9.89211
+5.21738 7.06323
+0.525526 1.0331
+8.06992 8.08704
+9.81539 10.0915
+9.33514 9.50521
+5.95494 6.54519
+9.21466 9.35909
+4.96603 5.18164
+3.89238 5.53056
+5.04546 6.32916
+8.63758 8.65805
+7.03226 7.57074
+0.32029 1.10893
+0.194176 0.992252
+8.79061 9.50848
+0.239137 0.300717
+7.7234 8.43747
+3.43679 4.28954
+8.31382 9.18928
+1.39612 1.67253
+6.95733 7.39846
+1.29129 2.12185
+7.93611 10.2305
+3.67764 4.17562
+1.38149 2.42407
+2.2847 2.48412
+9.28655 10.0661
+2.94115 3.21326
+7.04238 7.91536
+5.06012 5.61526
+8.95611 9.91736
+2.18524 3.44007
+1.0692 1.10987
+4.37019 5.18443
+5.82014 6.441
+1.68642 1.70458
+4.93783 4.9535
+9.42003 10.1196
+-0.356795 1.30987
+1.37778 2.80527
+9.54126 10.1758
+8.67413 10.5984
+0.914291 2.0697
+6.08696 7.09832
+2.82202 3.31103
+4.07818 5.50195
+2.85223 3.67449
+6.03006 7.10863
+8.84655 10.528
+5.08031 6.2001
+1.00272 2.74191
+0.169102 0.223253
+0.025089 1.26534
+-0.203339 0.64667
+0.899666 1.48885
+0.74235 1.49976
+6.28212 6.80412
+5.65159 5.93106
+2.1686 2.7445
+5.02936 5.43091
+8.07124 8.80499
+8.65696 8.95802
+7.68394 8.365
+8.65062 8.69146
+0.058248 1.19535
+5.74545 5.84057
+6.05244 6.52152
+9.3878 10.3328
+7.71379 8.88044
+3.32961 4.54105
+8.51987 8.62854
+4.10821 4.16902
+9.47639 9.78723
+4.72417 4.84793
+2.32867 2.94068
+9.52275 9.57815
+5.32867 6.96127
+4.32462 5.1508
+4.46919 6.45961
+8.62661 10.9533
+0.0244049 0.56156
+1.49207 1.73164
+7.03156 7.81168
+5.88587 5.89732
+8.43632 9.65085
+7.52612 8.06726
+4.82464 5.6193
+3.8062 3.90356
+2.42708 2.51646
+2.06458 2.45877
+0.427218 2.24283
+7.42616 8.11513
+0.617708 1.01833
+8.74218 9.03592
+-0.213346 0.599112
+9.05291 9.59124
+5.20365 5.54277
+2.85289 3.99509
+3.08468 4.58456
+0.136826 0.685254
+3.87191 3.99021
+0.970836 1.49673
+2.44355 2.53584
+8.88615 9.94545
+3.90591 4.52798
+1.52518 2.50658
+7.21268 9.07745
+0.767314 1.23833
+8.62975 9.42367
+6.71524 7.67686
+7.61205 8.48292
+5.312 5.65087
+4.75627 5.96261
+7.90674 8.0753
+7.37887 7.71478
+3.74483 5.52984
+2.7187 2.85544
+4.7902 5.62159
+2.89671 5.19815
+7.37268 8.72506
+7.11916 8.28301
+9.19814 9.75279
+1.2085 2.60113
+-0.632009 0.889734
+7.99858 8.39743
+6.48346 7.10822
+6.30616 7.06648
+5.56514 6.51183
+2.41505 3.56224
+6.83749 8.84447
+9.05111 9.46906
+7.77476 8.4091
+6.11378 6.31232
+4.42882 5.69917
+5.88107 8.052
+3.75437 4.08893
+2.70487 2.77664
+7.26028 9.77257
+1.44621 2.73267
+2.0384 2.60397
+2.95402 3.68949
+6.04766 6.4054
+0.716046 1.77698
+1.5084 1.72988
+2.58426 2.80376
+8.05255 8.59793
+6.06336 6.20709
+3.29813 4.31473
+2.53477 4.92554
+8.78711 9.88634
+9.26627 9.82082
+6.70683 6.81257
+8.25978 8.99788
+7.28054 7.64237
+5.14556 5.20711
+4.20431 5.87866
+8.96592 9.97597
+4.06216 4.41519
+8.49174 11.0491
+5.24547 6.03094
+4.65885 5.95835
+5.09606 6.34846
+6.30463 6.65933
+6.48022 9.56168
+1.38088 2.98143
+0.486911 1.16767
+8.16327 9.34821
+0.768885 0.782616
+4.51699 6.08086
+9.55086 9.70242
+2.86802 3.72489
+1.88496 2.18749
+4.31876 4.33726
+8.38871 9.45631
+8.80634 9.36198
+5.232 6.42399
+9.86919 10.0492
+3.61902 4.53086
+3.13118 4.42364
+2.69395 3.1816
+-0.303144 1.32309
+4.28871 4.36739
+3.8631 4.08745
+4.9291 4.98968
+7.14273 7.25505
+2.56623 2.59122
+6.01753 7.72265
+6.76051 7.53954
+6.76933 8.14741
+0.933137 1.83537
+7.9357 8.57904
+5.55847 5.59984
+4.25563 4.3345
+4.28087 5.21348
+8.88534 9.06554
+1.88575 2.94002
+5.26613 6.04562
+0.514249 1.45538
+0.130644 0.501645
+4.30564 4.86337
+1.57246 2.38451
+0.303814 1.77474
+4.22675 5.02783
+6.75381 6.78634
+5.64096 5.9725
+6.76159 6.98142
+2.35569 2.39119
+3.29794 4.95962
+6.55055 7.03366
+5.31474 5.69404
+9.01335 9.16988
+8.58306 9.37831
+7.06522 7.07778
+1.14695 1.74744
+3.15507 3.22865
+5.5925 7.14168
+2.14679 3.68767
+7.54789 9.71878
+1.5667 2.08742
+-0.604726 1.66718
+0.306012 0.54799
+2.61731 5.08257
+0.80957 1.74655
+8.22035 8.81637
+4.401 5.449
+8.89389 9.01988
+4.80574 4.9322
+2.19895 2.88565
+9.06688 10.8095
+1.23727 1.58699
+7.14836 7.92057
+4.65155 6.15149
+0.563061 2.16535
+7.66764 8.0341
+8.32324 8.42774
+4.54541 5.11069
+8.0237 8.09992
+7.26113 8.09404
+2.55196 3.20317
+8.1236 8.60951
+1.90437 3.23006
+0.888133 2.50365
+1.13618 1.69444
+2.60463 3.01696
+7.2311 7.73229
+5.06501 6.01487
+3.9893 4.10116
+1.45278 1.56937
+2.74601 3.80778
+9.40705 10.3843
+3.02533 3.52213
+8.7097 9.2268
+8.73145 10.5552
+2.56059 3.5742
+6.27328 7.57089
+3.23291 3.30811
+6.33804 7.20304
+7.63648 8.34564
+9.82053 9.93597
+3.14924 4.58629
+5.28253 6.33733
+1.99411 2.04104
+0.305593 0.420302
+5.39668 6.64188
+7.99992 9.37823
+5.25169 5.65987
+0.109291 0.875734
+3.08589 5.50296
+6.51358 6.62588
+5.34687 5.58204
+0.043587 0.932787
+-0.0264143 0.28677
+8.09722 8.37087
+5.46612 6.30285
+2.89146 3.49892
+6.73278 7.11762
+5.03068 5.90176
+1.7459 2.87727
+0.207707 0.448933
+7.00453 7.63105
+6.02789 7.87991
+8.1917 8.95854
+7.49014 8.73215
+8.48402 9.22063
+1.0467 2.4687
+0.241901 1.38802
+2.65867 2.81258
+5.46725 6.59448
+3.40578 3.75607
+4.2495 4.26392
+5.6608 6.213
+2.99705 3.88852
+6.17231 6.72018
+-0.17415 0.492739
+4.89596 6.49895
+4.68876 6.60218
+-0.0510568 1.46013
+8.87099 9.28179
+3.98894 4.5838
+-0.20015 1.59214
+8.80756 9.51828
+7.74921 8.53538
+-0.380041 0.440574
+2.69409 3.91466
+2.42747 4.56745
+6.25881 7.75647
+7.2941 7.77193
+2.60806 2.90251
+0.325028 1.22219
+8.29921 9.01416
+3.85524 5.45451
+5.2612 5.71877
+2.92849 3.73937
+8.6242 8.70808
+7.28153 7.35797
+1.65378 2.87917
+3.46034 4.24143
+3.99989 4.3199
+1.15266 3.60328
+4.8464 6.4887
+4.67021 4.68421
+6.96861 7.31554
+0.00723008 0.817047
+7.59589 8.88352
+5.56725 6.08465
+9.02409 9.19527
+5.81681 6.74193
+1.98221 2.98678
+8.76392 10.7646
+4.3903 4.50531
+1.0186 2.01838
+2.66674 2.74505
+2.41105 3.44579
+8.98295 9.18995
+8.14385 8.98779
+2.69613 3.60144
+0.445704 1.51319
+-0.634889 0.860409
+6.32737 7.10112
+7.88824 8.06838
+3.76271 4.43529
+7.66487 9.30221
+8.73974 9.59191
+3.08965 3.43006
+8.9518 9.96154
+0.727194 1.55228
+6.35214 7.12234
+2.71987 3.22996
+7.12786 7.4379
+-0.346107 0.837469
+8.47103 9.05987
+9.15744 10.628
+8.3237 10.093
+1.15052 1.16223
+6.95959 7.35423
+7.69488 8.44145
+4.21694 5.65913
+3.10562 3.37534
+9.73437 9.78252
+5.0458 5.53479
+7.80485 8.5163
+2.0442 3.75748
+-0.459177 0.498702
+7.38032 8.32195
+0.909659 2.11175
+7.08657 7.56877
+1.84997 3.10206
+4.2517 4.53819
+6.71655 7.04117
+1.06604 1.29153
+2.69273 3.31633
+2.19732 2.84826
+-0.723032 0.774865
+-0.289734 1.44645
+5.87194 7.71917
+1.01576 2.83685
+0.981927 0.998558
+3.07172 3.73201
+-0.112577 1.12642
+3.54063 3.67007
+7.21571 8.53815
+0.109957 0.839052
+6.86046 7.17211
+9.40878 9.69478
+0.989391 1.69046
+8.22287 8.8147
+1.48203 2.83308
+5.86418 8.0993
+0.749797 1.09852
+1.82996 2.50847
+0.28178 0.496017
+2.60694 3.00872
+8.6254 10.1698
+6.11641 6.41537
+7.19529 7.21342
+1.8214 2.17517
+0.991201 1.3788
+2.84924 3.12362
+5.75821 7.13843
+6.7106 7.35932
+6.6055 6.6829
+7.97105 8.58613
+1.56087 1.95845
+6.36782 7.10926
+2.43382 2.74699
+7.40509 8.8029
+8.42459 8.63142
+6.26128 7.55043
+4.6465 5.4431
+2.93214 3.29517
+0.157602 0.545214
+6.05931 6.72188
+1.7908 3.11731
+2.39217 3.58736
+7.07421 7.43852
+8.13419 9.74991
+9.53094 9.65319
+2.35726 3.68679
+-0.108561 0.874853
+6.87136 8.84157
+3.40803 4.58835
+7.50448 7.89932
+4.29762 5.53867
+0.863755 2.30032
+7.24847 7.95342
+2.89618 2.98849
+-0.928261 1.61922
+0.974105 2.91262
+6.99271 7.25856
+3.60995 5.01832
+1.26865 1.79704
+9.62217 9.80719
+1.02656 1.35514
+7.16502 7.32934
+3.12092 3.28857
+2.81374 3.84317
+8.73626 10.7585
+3.36982 3.61446
+5.08437 5.78949
+2.90218 3.0862
+9.2309 10.2523
+5.0967 5.48926
+9.73088 9.92708
+1.54013 2.78301
+6.73707 10.0789
+6.41735 6.838
+2.57935 3.04287
+5.719 6.70352
+5.42474 5.62732
+4.23904 4.69787
+4.16528 4.28736
+7.73477 8.84143
+4.90346 5.87324
+5.1969 6.14087
+3.48793 4.14182
+0.648493 1.07987
+6.88101 6.97932
+7.67342 8.74418
+5.16759 6.3871
+9.16292 9.49569
+8.77422 10.4817
+-0.358149 1.04178
+9.54616 10.3424
+3.12027 4.26504
+3.81223 4.73004
+1.2386 3.32247
+8.21963 8.42629
+9.10312 9.51016
+6.96107 7.43045
+2.98587 3.12365
+0.198165 0.211424
+5.19716 6.10856
+6.10553 6.3327
+3.98176 5.11099
+1.02512 1.04242
+4.27949 5.71947
+-0.457956 0.538807
+7.99877 9.48581
+5.88782 7.73303
+1.21496 2.85825
+8.46962 8.7862
+9.50182 10.1527
+5.85223 7.76234
+2.48368 2.52439
+2.35426 2.77405
+0.397056 0.482679
+0.160423 1.15786
+4.47109 4.8633
+4.74523 5.84196
+5.39177 5.75218
+9.00754 10.3249
+3.74813 4.03273
+3.08633 4.08426
+4.62672 5.29012
+1.92055 3.01442
+3.79279 4.5603
+9.52431 9.68334
+2.8126 3.32592
+-0.313688 0.490785
+9.06695 9.36835
+2.60321 4.14185
+4.40231 4.99535
+9.32205 10.1041
+5.3879 5.44349
+0.308728 1.0956
+9.05758 9.08283
+1.90313 2.50914
+7.1391 7.59459
+7.47357 7.95993
+1.25267 2.34827
+3.33222 4.36522
+8.78126 9.38611
+0.635979 1.62283
+8.3492 8.57545
+-0.572557 1.60517
+8.28855 9.03937
+3.47934 3.90271
+4.64498 5.43501
+0.872177 2.62011
+7.3893 7.58876
+2.14063 2.88063
+1.69361 1.75261
+4.19727 4.86483
+0.814676 1.27639
+8.19899 8.58203
+8.3394 8.99896
+9.31768 10.1694
+4.99218 5.19949
+4.2459 4.75266
+9.6314 9.64249
+4.038 4.75708
+7.92398 8.8579
+4.30747 4.54161
+7.51776 7.78258
+3.77611 5.1385
+3.53275 3.90278
+1.78619 2.12474
+3.18736 3.55159
+8.36759 8.52587
+5.52526 5.7843
+7.64174 8.09773
+4.37925 5.85699
+3.94295 5.31298
+-0.464623 0.795523
+7.02408 7.7048
+0.0690458 1.0008
+1.05445 1.32797
+0.126093 0.712612
+-0.809973 1.33869
+3.45568 3.96532
+0.433875 1.78679
+8.94667 9.65034
+1.98575 2.76936
+6.47974 7.67912
+2.74186 3.34153
+7.82655 9.32112
+4.71441 6.14932
+0.741177 1.76987
+8.05021 8.23239
+0.818503 0.882959
+7.13341 7.43399
+8.45939 8.93395
+4.44558 5.70161
+3.05657 3.86962
+8.75469 8.85537
+1.0922 2.23475
+6.00278 7.51598
+0.0530968 0.582206
+4.01788 5.48223
+1.30808 2.81869
+8.18848 8.59771
+2.43691 2.80685
+8.54045 10.6178
+7.58523 7.91634
+6.70183 7.49962
+5.81501 7.29783
+0.661853 1.58021
+6.50997 7.20411
+0.334292 1.40252
+-0.329585 0.742961
+2.38756 2.48935
+2.78114 3.58788
+7.97227 8.55379
+3.36753 4.57472
+5.14486 5.31457
+3.99691 5.47708
+6.36404 6.8741
+3.22519 4.63321
+1.80583 2.21824
+8.20747 9.42947
+5.90819 6.94368
+6.58559 6.85933
+2.99108 4.03832
+7.20963 9.6252
+3.10244 3.87265
+7.23018 7.91389
+7.18084 9.61063
+6.74145 6.86507
+8.40721 9.5751
+7.12352 9.45614
+2.06653 2.51786
+4.9155 5.04183
+1.34304 2.92777
+0.571315 1.17285
+8.05396 8.28214
+5.29142 6.24974
+8.93797 9.23051
+4.6108 5.45568
+6.46124 7.53124
+3.16695 4.37505
+2.76803 2.82764
+4.1531 4.84927
+8.19433 9.00383
+5.12114 6.22952
+2.2542 4.74849
+0.621192 0.871537
+1.37403 2.28895
+0.305704 1.3287
+8.70471 9.53085
+2.29164 3.56607
+2.42106 3.37382
+1.14309 2.03085
+9.17624 10.3281
+1.88864 2.70161
+0.932647 1.2473
+5.72385 6.55694
+5.25496 5.38675
+5.85771 6.69626
+7.37247 7.93094
+7.73499 7.98782
+4.91417 5.27506
+3.51127 3.84403
+6.96198 7.27686
+6.51176 7.74735
+4.19954 5.08222
+1.58115 1.83842
+2.11889 2.3408
+1.94427 2.00422
+5.59977 6.86555
+9.46942 10.3491
+9.18904 10.1988
+1.71938 3.01547
+4.3515 5.4951
+2.53792 5.85188
+0.3884 1.36228
+5.02469 5.62368
+6.82402 7.72203
+-0.320478 0.821539
+0.0885656 0.248783
+3.01725 3.44385
+6.63776 7.74386
+6.57899 7.9332
+4.82656 5.18327
+3.91909 4.43955
+0.0708319 0.101395
+2.59796 4.22775
+-0.433109 1.26978
+-0.434274 0.624336
+3.22018 4.25282
+4.63351 4.776
+8.889 9.56332
+5.35952 5.46531
+8.73832 9.22756
+2.03432 2.34194
+0.477994 1.43353
+1.2029 2.86844
+5.09945 5.76855
+8.89076 9.01771
+5.30284 6.31732
+1.56375 3.17543
+5.4773 6.36897
+5.30934 5.35073
+7.20096 7.7075
+6.51046 7.12888
+9.37127 10.0531
+-0.0484323 0.348687
+1.83241 2.2143
+8.28633 8.60462
+2.51014 3.65817
+3.27798 3.58685
+1.41567 2.23302
+7.50794 8.10378
+-0.0579575 2.10373
+-0.856005 0.96621
+2.96238 3.48434
+1.36304 1.90594
+2.9997 3.41214
+7.2763 8.087
+1.69207 2.74419
+5.41625 5.83917
+9.22139 9.53794
+1.17477 1.51576
+6.74597 7.90871
+0.678913 1.73759
+5.70863 5.7214
+8.88411 8.93377
+3.44409 4.54586
+0.958963 1.53878
+8.29904 9.3867
+2.52433 3.60238
+8.16257 8.21986
+2.11395 4.23455
+6.85451 7.40364
+0.20286 0.639736
+2.05848 2.49034
+0.547013 0.77336
+7.83609 8.11903
+2.16539 2.29286
+3.94232 4.31368
+8.53475 8.54519
+4.77462 6.4158
+4.08395 4.68214
+1.56902 2.23811
+1.61337 3.11768
+1.51181 1.65521
+0.0821202 2.09269
+4.77622 5.16243
+4.62148 5.75837
+0.613158 0.952696
+1.89128 3.04792
+7.57509 8.92834
+2.70465 4.2941
+4.95906 5.12442
+8.0927 8.17277
+0.796512 1.3215
+5.74134 6.45291
+9.68479 9.78978
+5.89261 6.2292
+6.11377 7.9339
+2.20571 2.67129
+3.46228 4.27058
+5.26723 6.2653
+4.04391 4.26562
+0.380382 0.818995
+7.58108 7.7618
+5.02375 6.13042
+4.20178 4.66297
+2.83039 3.0221
+2.36072 2.45545
+6.68854 9.20726
+2.91388 3.42464
+9.33373 9.73449
+7.75844 7.94625
+2.72414 2.89669
+6.65438 7.96623
+1.00647 1.05385
+2.63018 4.9432
+0.152187 1.60259
+8.86332 10.3631
+2.31523 2.6815
+8.00509 8.61794
+1.69711 1.75938
+8.65442 8.73697
+4.23917 4.32001
+9.66851 10.1925
+6.93943 7.49814
+8.51986 9.03561
+2.10317 2.5175
+0.539549 1.75683
+6.29423 7.93236
+8.64345 9.54556
+1.44069 1.6814
+9.10017 9.77088
+6.16731 7.40496
+0.570043 1.93192
+2.65761 3.88544
+1.46895 1.52688
+-0.369067 0.540647
+2.04868 2.72065
+2.1286 2.27858
+5.90157 6.16431
+1.55581 2.51851
+3.29705 3.81635
+3.4137 4.10991
+8.48699 10.1364
+8.43437 9.4642
+-0.037842 1.47589
+0.541735 1.7805
+0.499576 2.36065
+4.1415 4.72435
+4.77598 6.16872
+3.30388 3.61854
+6.43796 7.85966
+5.27157 5.70871
+0.919258 2.18653
+4.00961 4.07902
+3.78201 4.23596
+4.50464 4.791
+3.70253 5.30916
+8.59228 8.70036
+4.31103 5.69049
+5.31775 5.34378
+2.24198 2.64194
+6.66937 7.41675
+7.21753 8.42057
+4.35399 4.52398
+6.90698 7.30084
+3.44296 5.44378
+3.36719 4.89951
+3.38624 5.33856
+3.44877 3.53693
+5.81398 6.3016
+7.24655 7.33127
+3.86142 4.53134
+3.85894 6.88112
+6.45704 6.95699
+6.90997 8.24088
+5.68813 5.7611
+0.699911 0.824323
+6.73758 8.42517
+9.34644 10.07
+0.289929 1.30554
+8.30644 8.49113
+6.47667 7.16073
+4.28093 4.90236
+8.32678 8.57064
+7.09205 7.92316
+5.55599 5.63919
+1.0104 2.22875
+1.72237 3.53668
+2.54699 3.14823
+-0.668582 1.25485
+1.25582 1.37003
+1.35044 1.57807
+6.17083 6.30811
+0.618816 1.20065
+-0.540992 1.21634
+2.06673 4.28857
+9.03398 10.8112
+8.73735 9.22814
+1.30178 2.7599
+6.0221 7.34889
+8.30124 8.52159
+1.92023 3.34545
+2.99331 4.93358
+3.8412 3.93379
+1.455 2.77005
+0.538664 2.1118
+4.16926 4.26053
+0.699746 0.937609
+6.36024 6.6511
+2.34698 4.84463
+8.11109 8.76496
+4.05425 4.67773
+8.2284 9.78568
+1.64423 1.80353
+5.70109 6.93764
+7.2091 9.67224
+4.47015 5.23311
+4.29326 5.36144
+7.93151 8.96494
+4.61889 4.96487
+5.38473 5.43594
+9.35456 9.66489
+1.23737 3.04121
+1.16077 1.19519
+5.91037 7.55679
+6.88344 7.60181
+6.39705 8.65039
+1.61791 2.93041
+9.68285 10.1396
+9.03129 9.05839
+7.0683 8.29875
+7.19624 7.41696
+7.5266 8.38738
+-0.254571 1.01098
+1.30218 2.03222
+7.6432 7.73031
+4.99495 6.04757
+2.79394 3.29394
+0.31505 3.55963
+7.55382 8.18787
+6.00032 6.27664
+1.49355 1.79767
+5.21191 7.19537
+3.47816 3.75801
+2.10272 2.39494
+1.31887 1.93829
+7.14313 7.63055
+7.3141 7.77239
+6.03409 6.17265
+4.24946 4.53165
+0.0569272 2.56109
+8.44766 11.4872
+4.22879 4.28007
+6.92817 6.98775
+8.08859 9.0206
+-0.0748418 1.48605
+6.56698 7.0488
+4.46624 5.4952
+3.66085 4.05778
+6.44711 8.93943
+2.45735 2.49339
+0.0606673 0.416191
+-0.183838 0.750464
+7.08561 7.67275
+6.65423 6.90808
+0.0598735 0.364072
+5.2228 5.41543
+3.14042 3.19043
+2.40069 3.02829
+1.80441 2.1849
+3.47491 3.95775
+5.49162 6.63934
+2.03332 2.32288
+3.17234 5.25109
+2.58274 2.59951
+9.37994 9.97097
+4.71509 6.77966
+5.18915 6.84982
+6.12508 7.04354
+0.811202 1.98808
+1.46825 3.66984
+2.44386 4.15623
+7.60169 7.68242
+-0.43208 1.22222
+5.40569 5.66153
+0.391742 1.79408
+6.77742 8.43115
+9.12828 9.3851
+6.39541 6.80626
+5.17919 6.29326
+6.57263 8.12999
+3.439 4.62236
+8.40525 9.80086
+7.60986 7.70099
+1.32123 1.44213
+0.526574 1.92338
+9.57195 9.79591
+9.52103 9.63159
+3.79775 4.20608
+4.74446 4.89606
+9.00085 9.60025
+1.26279 2.08363
+4.13639 4.49232
+6.59409 7.18315
+1.0637 1.78425
+5.4213 6.87661
+4.24407 4.30987
+9.79732 10.1204
+4.24597 4.83541
+8.47705 8.5145
+4.34095 4.93842
+5.68168 6.96086
+7.48654 7.91072
+8.32005 8.45111
+5.24065 5.3032
+3.25982 3.94442
+5.58106 6.18764
+4.4243 5.58619
+6.36467 7.07082
+2.70051 3.56014
+5.94534 6.87688
+7.33638 7.7645
+4.57067 5.86652
+7.83993 8.36854
+9.03617 9.11629
+7.44672 7.95614
+6.05876 6.3594
+4.02496 4.97119
+3.01438 4.36109
+7.4932 7.92357
+7.51661 7.53354
+7.60692 8.49678
+1.76088 2.59103
+7.08578 7.39566
+4.83605 5.42933
+-0.186592 0.847663
+1.15879 2.33996
+8.11815 9.35472
+6.02584 7.62549
+0.881084 1.00015
+5.39067 6.27026
+0.910755 0.97444
+5.32174 5.65652
+7.69388 8.24928
+3.40521 3.7615
+5.60321 6.92388
+8.25096 8.34324
+0.00108913 2.16897
+0.508035 0.66573
+-0.0517816 0.0876197
+3.26472 4.30955
+1.99494 2.14903
+2.089 4.32368
+5.17378 5.75964
+2.8779 3.54361
+6.56459 6.90645
+1.43196 2.88337
+1.48917 1.94009
+3.40807 4.25784
+8.0334 8.13458
+8.22254 9.6175
+2.96308 3.14349
+5.04768 5.71252
+3.9977 4.72614
+1.44384 1.60782
+7.78147 8.19817
+7.03854 7.50085
+5.90747 7.06091
+2.89169 4.31831
+2.46167 3.16529
+9.13228 9.1504
+2.57975 3.05313
+5.75976 6.52958
+8.10499 8.98982
+8.43162 8.76377
+0.422917 0.668254
+1.69046 2.09962
+5.50386 6.66954
+0.0897183 0.564514
+3.50103 4.1041
+3.91918 4.52559
+4.39297 6.18876
+3.90396 4.90868
+9.69362 9.85528
+6.27994 6.95062
+8.01563 9.09433
+8.25641 9.72944
+8.22072 8.35423
+1.27059 1.61352
+8.53312 8.96235
+3.49185 3.9042
+5.79579 6.046
+0.489013 1.2147
+4.00074 4.177
+2.66625 2.93036
+7.20267 9.34958
+7.44659 8.54707
+8.99915 10.1143
+7.59922 7.82031
+8.38502 9.03222
+0.160075 0.294398
+4.14549 4.3927
+9.35554 10.248
+-0.159435 0.467922
+2.17272 3.72336
+8.63811 8.79976
+4.23215 4.66461
+6.99516 8.2035
+6.45212 7.88791
+6.20141 6.28633
+7.69396 8.82204
+4.50807 5.96315
+8.51725 8.89286
+0.939492 2.12064
+7.4615 7.62666
+8.46681 9.11769
+3.92828 5.40884
+9.05622 9.40015
+0.229625 0.860838
+2.05694 2.52113
+-0.217927 0.574255
+9.55146 10.3256
+8.31497 8.3417
+3.52833 4.47013
+7.7131 8.52058
+2.15462 2.66777
+5.7674 6.17553
+3.3358 4.10589
+2.06642 3.00412
+2.43387 2.85242
+5.09473 5.84276
+7.3287 7.54846
+4.64254 5.11465
+4.05785 4.93614
+4.25413 5.43513
+2.96476 3.15378
+3.53732 4.48239
+2.34137 4.01272
+2.24879 3.40626
+3.43323 4.49055
+0.871415 1.33068
+0.508929 1.65611
+4.92057 4.94743
+7.03376 7.35193
+5.73043 6.47264
+7.82417 9.93642
+5.24102 5.9178
+2.38528 4.1676
+6.27437 7.19631
+9.29267 9.53262
+4.10098 5.24964
+0.383714 0.833317
+5.97628 7.92987
+8.15799 8.96819
+8.1687 8.29862
+8.16289 10.5149
+7.38205 7.89765
+3.81883 4.15607
+9.46915 9.61755
+1.50756 1.51863
+2.34236 2.84689
+0.398473 1.15027
+1.05302 1.49155
+8.71687 9.35232
+1.0502 1.40395
+7.83685 8.76302
+7.7731 8.46899
+5.56618 5.97458
+2.90035 4.12043
+6.40644 6.68706
+3.95201 4.37075
+7.1831 7.67748
+9.42789 10.0914
+5.45198 7.01256
+8.64609 9.45756
+6.01864 6.31515
+7.64621 8.65533
+5.45654 5.76553
+2.04332 2.75476
+5.49454 5.85693
+6.13688 6.21927
+2.66255 2.7385
+4.8326 6.43772
+9.12704 9.45287
+-0.294488 0.318697
+2.26979 2.35516
+4.12949 5.58506
+3.01416 3.62246
+6.64697 7.10221
+6.44307 6.82985
+4.10484 4.73148
+7.42589 7.6029
+5.33055 5.50395
+2.46474 3.05847
+5.43677 5.59206
+2.13807 2.3988
+-0.38424 1.8121
+0.00916704 0.219304
+8.62621 10.2262
+3.33927 4.51169
+5.45656 7.13165
+5.29253 6.57917
+3.51704 3.9421
+8.63729 9.13361
+3.92626 4.3469
+6.83104 7.52695
+1.22258 2.28191
+0.447646 0.789809
+7.96543 8.54328
+2.24269 2.42571
+4.4161 5.40481
+0.813992 2.21792
+0.694664 0.974182
+6.50017 6.88902
+4.00723 4.65882
+9.05784 9.85062
+6.80276 6.98196
+0.105446 0.379881
+0.416982 0.53336
+9.01269 9.55204
+3.27197 4.23315
+6.7017 6.89704
+4.21512 4.42378
+4.86735 6.90949
+4.52235 5.36878
+2.62205 3.55746
+-0.551048 0.555476
+1.63274 2.71251
+4.26739 4.88085
+8.23129 9.77405
+2.49409 3.96851
+6.66387 6.88886
+7.72383 8.90611
+3.18511 3.27281
+0.73722 1.64435
+7.90329 9.02868
+6.94845 7.06773
+0.509461 1.54928
+4.63885 5.51652
+9.24395 9.5121
+1.00007 1.57161
+5.31349 5.45437
+0.929284 1.71034
+7.05985 7.63288
+7.38418 7.45373
+4.14937 6.5167
+7.49989 8.6081
+9.28313 9.57721
+4.41285 5.1497
+2.96148 3.09221
+1.58256 1.66419
+4.45116 5.43488
+5.70927 7.11699
+3.61105 3.93153
+5.92285 6.63773
+3.50065 4.48453
+7.97338 8.96464
+0.541394 0.965435
+4.46469 5.03925
+7.33695 7.6484
+9.64234 9.6938
+4.16378 4.17886
+7.10741 7.31549
+1.51829 2.62477
+2.1892 2.9684
+9.23767 10.0462
+7.87649 7.97087
+7.05385 7.85952
+6.91232 7.50277
+6.60185 7.81572
+2.27112 3.90211
+5.74452 8.2018
+6.25117 6.26911
+0.525893 1.53447
+0.392956 0.959233
+3.51591 4.71055
+3.10449 5.41156
+7.35964 7.65642
+2.89831 3.54334
+3.42338 3.68259
+4.75496 5.51419
+3.8792 4.48395
+2.18007 4.13236
+3.15798 3.16864
+8.91248 9.21598
+8.54636 9.34037
+7.93697 9.79709
+6.40205 8.9653
+9.67332 10.2252
+4.31771 5.25423
+7.27485 7.3725
+6.22971 7.11411
+1.16538 2.16762
+1.40443 1.6876
+3.14915 4.58847
+7.13761 8.72165
+4.38448 5.88699
+7.98309 9.19449
+8.491 9.05597
+5.55043 6.19359
+2.44006 3.36071
+9.56522 9.79903
+1.86129 2.00225
+1.65239 2.11478
+7.59392 8.4655
+2.44709 2.68538
+6.80932 7.04694
+8.8212 9.4182
+0.276845 0.956468
+8.17008 8.5538
+0.77864 2.06897
+6.78458 7.68692
+0.504907 2.67518
+5.56963 6.9058
+3.42691 3.5414
+2.52065 2.71583
+5.09924 6.26696
+0.223724 0.610039
+3.61258 5.29324
+0.388393 3.11131
+2.87763 4.45415
+8.26438 10.1169
+5.89742 8.17506
+1.89686 2.66651
+5.33662 5.68228
+3.37496 5.67291
+2.25713 2.36127
+0.402185 0.716342
+6.4231 6.79227
+3.22707 4.69314
+7.85092 8.77413
+3.31322 3.72455
+5.43021 7.7167
+8.5883 9.00864
+1.21371 1.71836
+6.35584 7.9706
+5.44438 5.50414
+5.31325 6.11217
+6.08888 6.78794
+7.70604 8.13257
+1.29858 2.48753
+5.54083 6.38817
+8.23948 9.82646
+7.5575 9.0224
+8.00415 9.39763
+0.488455 1.55358
+4.48727 5.20741
+6.46648 7.02349
+0.355939 0.611119
+9.4892 10.2189
+2.61893 2.82832
+0.268193 1.24687
+3.01964 5.19554
+6.29954 7.42795
+8.70796 9.48366
+5.39307 6.64597
+2.47001 2.60746
+5.30949 7.46529
+6.07973 6.16835
+0.764507 1.6144
+7.94123 8.52143
+1.88244 1.96592
+6.42103 7.02205
+7.673 7.73208
+6.66891 7.80675
+6.9305 7.5431
+6.62335 6.93873
+4.34846 5.77621
+0.49878 2.82928
+2.65221 2.80109
+7.45348 7.74372
+4.10129 5.26894
+3.87782 4.19855
+4.62113 5.22658
+2.84558 2.88185
+2.53209 2.86065
+8.94932 9.21967
+6.48046 6.89614
+5.81885 6.66829
+6.49129 6.62015
+8.5663 9.58685
+2.43346 3.89849
+9.36561 9.45886
+1.40232 2.65
+6.66 6.74041
+2.87007 3.49668
+4.71138 6.0184
+5.03638 6.08494
+7.77735 8.14253
+1.0301 1.27179
+2.58337 4.04699
+6.95419 7.89775
+7.81164 8.62551
+3.37669 3.96217
+4.68541 5.58692
+4.79697 6.34841
+3.95334 4.81962
+9.44006 10.0941
+4.91098 5.12386
+8.44273 10.1565
+3.6685 3.73156
+5.07599 5.33357
+-0.138235 0.260923
+2.71154 3.45603
+5.75096 6.16127
+4.4775 4.64308
+6.80557 8.97442
+5.49408 5.76652
+8.31937 9.12886
+3.26479 5.51673
+2.57425 3.03145
+2.42465 3.92714
+7.86505 8.50835
+3.29229 3.43549
+4.08537 4.69709
+7.83885 8.60616
+1.61622 2.72716
+9.10228 9.41907
+8.49325 9.46612
+-0.174644 0.351716
+1.95648 2.14825
+8.28844 8.4428
+4.35888 5.59521
+5.1396 5.22537
+0.330835 0.879566
+6.14972 6.82967
+3.14811 4.89049
+-0.231668 1.08277
+3.13526 4.94545
+8.32674 8.91046
+5.22364 5.48006
+9.84318 9.88416
+-1.07813 1.6965
+1.5095 2.0328
+8.03716 8.2792
+-1.01307 1.46703
+8.22096 9.0055
+8.9917 9.0415
+5.60623 6.74537
+3.15991 3.19314
+3.13863 3.26451
+0.739618 0.896958
+0.67599 1.18486
+3.37355 4.06303
+0.38605 0.410067
+3.03297 3.46387
+3.45867 3.79806
+8.67249 9.53278
+-0.213855 0.787363
+1.52316 2.61117
+8.31846 8.59736
+4.84685 4.94042
+7.41901 7.82623
+4.99029 5.09747
+5.3637 5.37612
+3.22123 4.77749
+3.21668 5.74743
+3.48748 4.59962
+8.00016 8.56269
+1.63631 2.42239
+1.05159 3.72319
+7.22643 7.95706
+5.65694 5.99195
+9.4469 9.66915
+0.857984 1.59867
+4.05869 5.69955
+2.65788 3.07259
+1.8038 3.38748
+3.91934 4.89922
+6.18534 6.70342
+2.85076 3.20176
+8.1897 9.9614
+0.685531 2.05322
+3.31097 4.00809
+8.26537 8.63475
+2.90508 4.07797
+1.25213 2.31285
+3.05752 4.03741
+-0.481913 0.605629
+1.87958 2.19386
+7.28689 7.76316
+4.82075 5.20688
+-0.08115 0.31839
+3.50085 5.89363
+1.31184 3.30269
+4.03137 4.81493
+6.11688 6.13923
+7.93584 8.43321
+4.9838 5.3733
+3.8174 4.11979
+8.56196 9.02824
+2.87809 3.89589
+7.95309 8.05432
+3.47469 3.63716
+6.61009 7.12576
+8.87374 9.79588
+7.31513 7.99089
+5.78084 6.68535
+4.96985 5.59877
+2.20236 2.52473
+0.661014 1.11035
+6.36183 6.58403
+6.67947 6.85093
+-0.242005 0.513902
+0.442966 1.72024
+6.4587 6.74016
+6.67958 8.0837
+8.98524 9.56405
+6.91409 7.59877
+3.73596 3.97705
+5.51193 5.96437
+3.72029 4.50126
+3.09896 3.23616
+8.83312 8.91774
+0.32173 0.486199
+4.21092 4.59955
+2.61616 4.07081
+1.89049 2.65559
+4.96401 5.00629
+9.33156 9.70914
+3.72455 4.61054
+8.91265 9.6563
+7.12401 8.04324
+6.65393 7.25572
+1.04032 1.24927
+3.0174 5.56006
+1.47645 2.26867
+3.49833 4.37416
+6.16877 6.34452
+6.47417 6.90595
+4.27056 4.92535
+7.60439 9.35352
+0.426219 0.754405
+8.5291 8.68579
+5.84717 6.64632
+1.99513 2.5284
+5.10669 7.83064
+6.99006 7.37272
+0.871836 1.5934
+3.6572 4.38875
+0.154617 0.290737
+5.91634 6.50415
+5.33982 5.45293
+6.92602 6.94691
+0.349512 1.61427
+8.02048 8.99943
+5.75598 7.34946
+5.86948 6.51327
+5.11707 5.6181
+6.27656 7.10043
+8.48922 9.73833
+8.35863 8.69746
+6.67829 7.07852
+8.51257 9.50383
+3.76636 4.33757
+4.82804 5.57166
+5.17892 5.61254
+1.35188 1.94069
+6.04969 6.06833
+5.34181 5.82455
+5.71714 6.71234
+0.966462 2.56278
+7.95169 8.15951
+6.53583 6.89673
+6.73246 8.34493
+8.71111 9.76467
+7.53215 9.56537
+0.619041 0.736713
+9.24399 9.50151
+8.57184 9.88538
+2.82682 3.77294
+4.2649 4.84602
+8.6621 8.96426
+8.04469 8.3189
+7.81877 8.42944
+2.78031 5.16589
+1.23076 1.43577
+8.35385 8.49632
+3.27901 3.66774
+0.595941 1.41354
+3.37123 5.16685
+9.11003 9.95515
+-0.25959 0.32069
+1.44153 1.70148
+1.61595 1.70799
+7.8201 8.53423
+8.5402 9.36947
+8.39125 9.8221
+6.2909 6.35773
+0.000933745 0.920054
+-0.21358 0.491025
+4.00874 4.03866
+3.43552 3.55874
+7.85942 7.98987
+7.6681 8.06748
+6.19541 7.14765
+8.53891 8.96393
+2.38789 3.26866
+-0.0162847 1.18379
+1.04764 1.52755
+0.400798 0.55475
+6.32001 6.94897
+5.9692 6.2012
+1.20784 2.67873
+3.58247 4.46372
+-0.229647 0.559407
+5.65979 5.73489
+2.32795 2.78462
+0.706144 1.55147
+4.56527 4.6636
+5.98901 7.20908
+9.27329 9.95152
+1.31296 1.70529
+5.82933 6.41329
+4.17452 5.29881
+4.15885 5.25117
+0.35549 1.3511
+1.0591 2.4463
+8.87597 9.55625
+6.66826 8.57255
+0.355945 1.40613
+5.39729 6.10218
+3.78791 4.37501
+9.53885 9.87184
+2.67568 2.82552
+4.44836 4.52939
+5.96764 7.40168
+6.35578 6.98546
+0.636857 1.19517
+3.3986 5.55448
+1.46493 2.66884
+-0.0676901 1.80921
+7.83396 8.53452
+8.3508 9.04561
+4.03407 6.0066
+0.997538 3.30635
+7.83064 8.03466
+4.57652 4.97461
+3.85952 4.15471
+0.960261 2.1069
+0.522458 1.52989
+8.81627 9.00768
+0.172256 1.29455
+5.69294 6.15752
+6.86391 7.75307
+2.32429 2.95415
+1.83191 1.90364
+0.400855 0.705649
+5.23264 5.39972
+5.19047 5.79842
+2.40804 2.89401
+0.462887 1.43874
+6.70213 7.90229
+4.37985 4.95797
+3.73768 4.30645
+0.756797 2.11146
+0.458724 0.472099
+3.93098 6.47147
+5.5294 6.00365
+2.97106 3.42174
+5.75875 5.80235
+7.96799 9.02105
+5.36254 7.22823
+6.56124 7.39973
+9.49234 9.57879
+2.87576 3.59509
+3.49182 4.28124
+8.68021 9.94486
+9.60199 10.1276
+9.70115 9.81776
+3.09609 3.98732
+5.00113 8.15031
+5.21248 5.74835
+9.23337 9.5696
+2.92777 3.56297
+2.52044 3.04905
+4.79908 5.05762
+1.98626 3.69659
+4.78726 6.20637
+7.39711 7.42831
+4.44319 4.78716
+9.28452 10.0832
+8.00774 8.85707
+9.22947 10.0523
+4.38653 4.86012
+5.15285 5.23106
+8.95413 9.75947
+2.90286 3.32407
+0.348694 1.39738
+-0.0660432 0.293424
+4.09079 4.2922
+6.0407 7.23031
+2.83771 3.72237
+8.54697 9.38898
+2.16742 3.45018
+8.83255 9.30343
+3.59112 3.6531
+7.53452 7.81898
+7.11781 7.19773
+8.2892 10.0259
+4.91072 5.06031
+5.8232 7.25924
+7.0641 8.31604
+9.477 9.63892
+5.8003 6.58306
+9.63988 10.2754
+0.654364 1.02398
+5.9488 6.85043
+7.86867 8.99891
+9.202 9.46902
+4.17932 4.20271
+6.50328 6.71085
+7.19848 8.15579
+5.62459 5.75449
+-0.159668 0.791409
+7.55683 8.7315
+1.03278 1.423
+0.751457 0.808785
+6.2203 6.50634
+1.64418 2.98238
+6.87468 7.00652
+6.36966 6.7117
+7.69893 8.89535
+0.419794 1.05032
+2.73928 4.31548
+0.409245 1.55228
+6.03905 6.39323
+0.409695 0.789834
+4.39148 4.40935
+1.14673 3.23607
+5.85562 6.44503
+6.87394 6.88742
+3.761 4.35136
+7.2208 8.01436
+6.49839 6.54002
+4.70791 5.91886
+4.24906 5.96619
+2.53482 3.91496
+-0.369254 0.69193
+4.81351 6.31088
+9.76066 10.0736
+1.4413 1.55942
+7.21917 8.88908
+6.03521 7.56826
+1.25568 1.42024
+5.47575 6.04431
+1.43099 1.99979
+5.1004 6.04088
+6.54798 6.56118
+1.0142 3.1564
+1.75267 2.1453
+1.28133 1.36044
+9.60996 10.0563
+1.14397 1.50247
+6.86688 7.08724
+8.38287 9.18041
+0.132076 1.27657
+6.52553 6.9301
+0.223917 1.41325
+1.18902 1.79753
+1.40084 1.75678
+1.94524 2.51929
+1.98276 2.62875
+0.763281 1.05483
+7.97952 8.51249
+1.059 3.05463
+5.33401 5.85094
+8.37442 8.64374
+6.62865 6.67315
+1.01707 1.64386
+0.113335 2.23523
+6.71906 8.00216
+-0.886574 1.29366
+4.20078 4.85294
+8.43336 9.06988
+3.55413 4.40768
+6.69076 9.01132
+6.18982 7.14109
+7.14381 7.7046
+8.63195 9.47031
+8.88052 9.84886
+3.34443 3.62637
+4.5862 4.72832
+4.95757 5.23571
+2.85993 4.04966
+1.43846 2.27425
+5.43112 6.30496
+-0.452609 1.55525
+7.17706 7.71287
+5.78537 5.79579
+8.51102 8.9466
+-0.472904 0.810489
+3.83688 4.24045
+8.04432 9.04582
+1.57259 3.37136
+1.22231 1.33582
+5.73006 6.26477
+2.90855 4.22125
+9.39717 9.4287
+3.63873 4.16094
+0.442035 2.08889
+0.294491 1.31124
+3.14755 3.86305
+6.57634 9.44898
+2.19051 2.41878
+4.99277 5.12569
+4.10425 4.9423
+4.83547 5.62769
+5.73879 5.78179
+8.90329 9.81905
+5.60168 6.17538
+5.83843 6.66128
+1.84271 2.57406
+3.01047 3.33662
+2.85037 3.79158
+3.49007 4.46877
+8.58942 9.51529
+0.613753 1.12824
+8.23757 9.54707
+9.27134 9.4196
+6.27126 6.56417
+2.17206 2.33018
+3.53588 5.17162
+8.6312 10.0868
+5.76342 6.66164
+9.01501 9.90984
+3.22004 4.18954
+4.37918 4.68595
+2.00928 3.49815
+6.64229 7.06693
+2.85962 4.58794
+8.45587 9.8897
+2.8481 3.65956
+8.65849 8.67336
+6.48486 6.58637
+5.82336 7.45254
+4.02267 4.59696
+2.24997 2.83815
+8.16201 8.55518
+7.40645 9.07085
+1.43137 1.50333
+8.7212 10.9419
+1.50523 2.44124
+1.92455 2.85819
+4.50866 4.53052
+5.75781 5.81275
+1.71013 2.0282
+9.31592 9.9015
+6.14972 8.18798
+1.85705 2.20068
+4.80971 5.10509
+3.31201 3.58168
+8.61824 9.31861
+7.19497 7.86933
+3.25381 4.53472
+5.62799 6.29537
+9.00659 10.021
+9.15156 9.74827
+2.0324 2.80741
+0.714403 1.00476
+1.26522 1.80417
+-0.362995 0.41758
+7.08785 7.71544
+5.55685 5.74045
+0.428866 3.03773
+7.61574 8.94894
+9.07256 9.69772
+4.49537 5.06822
+5.66388 6.48899
+1.69126 2.69607
+9.90539 10.0783
+6.56455 8.27128
+6.61988 7.86616
+7.42012 7.64493
+2.99922 3.35282
+4.69379 5.18947
+0.87894 1.30518
+9.47632 9.61234
+0.665754 0.855958
+-0.422778 2.11197
+3.38786 4.15441
+7.57236 8.75855
+1.89832 3.50224
+-0.185929 1.0777
+3.32911 5.53465
+6.91111 8.69247
+6.97456 7.86905
+4.75518 5.0948
+4.23733 5.83368
+8.52456 8.56086
+0.0978267 0.136564
+7.4668 7.99757
+5.52851 5.80858
+8.5833 8.88589
+5.10603 6.41348
+4.70682 6.59981
+8.60265 9.19477
+5.04514 6.24014
+4.49041 4.88669
+7.40925 9.15624
+0.80364 1.35315
+7.11604 8.01153
+0.267749 0.714089
+0.121521 0.822226
+9.30556 9.81307
+2.11398 2.92567
+5.97722 6.08022
+7.13483 7.22211
+8.00161 9.27274
+4.87681 5.51654
+3.11843 3.84311
+5.17747 5.98482
+3.6077 4.46306
+1.37454 2.2443
+4.93385 5.96357
+2.92184 4.0964
+4.88767 5.56353
+2.87394 3.76336
+0.326521 0.622872
+2.42056 2.45007
+-0.527891 0.827211
+6.73151 7.20155
+1.82048 2.54905
+1.35563 1.88701
+3.64202 4.10669
+5.22846 5.23953
+6.06271 6.46993
+2.71418 3.2081
+6.41179 7.57176
+7.45823 7.79609
+1.01227 1.39137
+9.0872 9.20132
+5.083 5.64038
+5.63236 5.97945
+-0.317645 0.822313
+0.865396 2.65587
+5.71839 5.98983
+1.50978 2.08611
+2.95824 3.70996
+0.264301 1.02233
+8.22351 8.98589
+4.87805 5.24127
+2.31329 3.46752
+6.19539 6.69676
+5.18643 5.40947
+7.15453 7.66643
+1.20694 2.25111
+7.87378 7.89093
+5.16514 5.604
+8.68354 9.01395
+7.33753 9.37499
+2.94627 4.06036
+8.64337 8.85727
+0.0353092 1.0128
+6.98437 7.35718
+6.77073 6.79959
+3.13559 3.70735
+7.40139 8.27017
+4.01174 4.39788
+3.22281 5.11647
+7.79256 8.58737
+0.642233 1.39694
+7.18603 8.69453
+3.37803 3.59355
+0.762287 0.84262
+4.21823 4.52565
+0.894924 1.35434
+0.844327 1.19938
+5.57958 7.05431
+-0.631066 1.55134
+3.78962 4.17935
+9.15329 10.4824
+5.47536 5.52975
+8.81243 9.16088
+4.45989 4.94123
+8.68235 9.45112
+8.04719 10.3938
+8.87349 9.40483
+0.502543 0.570283
+2.08512 2.47652
+-0.654512 0.804355
+3.68569 5.21711
+5.33017 5.80226
+3.44991 5.31415
+-0.00417763 2.95077
+7.17784 7.9318
+1.2721 1.31642
+5.24415 5.64173
+2.79434 3.28746
+4.54991 6.49276
+4.74707 5.12555
+7.36365 8.15777
+0.913049 1.79828
+1.47498 1.83425
+2.64271 3.38567
+4.78159 5.44718
+7.6087 7.66442
+-0.484393 0.909893
+3.16824 3.23757
+4.43021 5.90284
+4.25954 4.74995
+6.58742 7.24125
+1.86151 2.27069
+3.16459 4.5945
+1.06471 2.08965
+3.31028 3.83029
+1.52593 2.47521
+0.703789 1.42451
+1.47969 1.68923
+2.92352 4.24089
+9.84088 9.93485
+3.18205 4.27817
+7.39345 7.78945
+3.78808 5.41572
+4.38624 6.75693
+6.93065 7.16977
+1.01289 2.19807
+3.37006 3.54196
+5.50238 5.58285
+-0.225113 1.99347
+1.67796 1.86943
+6.1999 6.35102
+3.80494 4.74814
+1.13294 2.02639
+1.1965 2.6548
+-0.284453 0.856092
+4.26565 5.02196
+9.66948 9.88874
+6.20287 6.25528
+4.38154 6.65806
+3.77411 4.3075
+5.77177 6.78486
+9.16311 9.816
+3.22861 3.42009
+3.36573 4.34724
+6.76951 7.58025
+4.83813 5.23042
+3.87192 4.37372
+5.56859 5.90066
+-0.368163 1.4593
+5.44031 7.81671
+2.66342 2.99253
+6.11846 7.69499
+4.98811 5.17531
+4.45078 4.67513
+4.88206 4.94128
+2.51813 3.0268
+0.461292 1.15264
+2.34766 4.48652
+0.198819 2.23425
+6.85634 6.98248
+0.912438 1.81872
+4.84933 6.34912
+5.15613 5.82891
+0.172772 0.994083
+3.37381 3.64549
+1.98836 3.2697
+1.64344 2.06049
+0.766585 3.09305
+7.8979 8.28046
+4.34856 5.01341
+6.69809 7.24239
+5.19034 7.04959
+5.3747 6.92123
+7.8893 10.1251
+6.11207 6.99125
+5.37115 6.84111
+9.04786 9.11002
+6.45326 6.64415
+-0.76294 0.92832
+0.980411 1.8166
+3.05536 3.50031
+6.10827 7.55786
+6.57848 9.06264
+7.66855 8.861
+4.80276 4.82283
+1.99932 3.2877
+9.45229 9.80653
+0.457474 0.778684
+5.44444 5.95239
+5.60974 8.05169
+7.64656 7.79632
+6.78372 7.65134
+6.93878 7.82023
+9.08292 9.55308
+9.16329 9.25802
+1.4909 2.38688
+4.31881 5.3564
+5.12535 5.60119
+2.44591 2.54637
+7.36929 7.80452
+2.13707 2.97655
+9.73557 9.94588
+1.96637 3.36097
+0.857068 2.29643
+5.58224 5.91142
+8.90714 9.0255
+9.77988 10.0711
+0.41121 0.970955
+-0.518356 0.91447
+7.58725 7.71255
+8.1435 8.78712
+6.5487 7.17991
+4.94961 5.50283
+8.14086 9.03281
+3.51281 5.24806
+3.5786 3.84066
+6.27435 8.37735
+8.65263 9.5555
+2.87484 3.56117
+5.57707 6.55879
+-0.111276 0.264178
+3.60894 4.15477
+2.82322 3.64397
+8.40669 9.1127
+8.43089 10.5298
+1.38472 2.2453
+1.74464 2.00472
+4.01588 4.67572
+0.408869 0.938602
+2.06155 3.46067
+4.4871 5.08963
+2.4435 3.87355
+1.32864 2.55801
+4.78579 5.26122
+7.43027 7.57749
+6.90971 7.32716
+8.01095 9.46872
+9.41627 10.524
+8.83143 10.4474
+0.631816 1.75513
+1.72965 2.17123
+-0.513239 1.1886
+6.75616 6.7984
+2.49278 4.26493
+0.230011 0.966298
+3.78506 4.95013
+2.03886 3.14808
+7.87309 10.5637
+3.54564 3.58055
+1.91974 2.9194
+4.8503 4.98668
+4.66494 4.83558
+7.57916 8.24358
+4.78743 5.38547
+2.81034 3.34534
+1.00297 2.0138
+6.87593 7.17736
+3.93157 5.0655
+3.10361 4.05519
+8.22876 8.38326
+7.48377 8.31026
+2.23106 3.4905
+0.130934 0.606709
+1.22344 2.55898
+7.55829 7.92597
+4.10977 4.86263
+0.122756 0.264176
+3.8357 4.15854
+1.28414 2.13031
+0.280029 0.805504
+2.88245 4.1704
+5.57936 6.94781
+6.22719 6.33201
+-0.761013 1.16475
+6.16636 7.12566
+2.98935 3.192
+2.23263 2.34362
+3.9082 4.11692
+2.66865 3.5275
+1.87676 2.43966
+4.60035 5.39332
+2.74287 3.73097
+2.81953 3.96666
+5.73644 6.04042
+4.02179 4.52419
+3.26438 4.07346
+1.22509 2.13719
+7.91885 9.71846
+1.28152 1.48079
+7.97918 9.26344
+8.75682 9.8677
+7.25678 7.45362
+8.16161 8.87066
+1.21873 2.37224
+7.76739 9.06346
+3.89932 5.03406
+3.53901 4.37006
+2.93795 4.04333
+6.36543 6.72985
+4.72622 4.98804
+1.86205 1.99008
+0.784581 2.05264
+0.978519 2.91723
+3.9067 6.47195
+0.735425 2.38151
+8.37394 8.41609
+6.91804 7.23374
+9.39259 10.1026
+7.28732 7.43466
+4.75982 5.44264
+6.71504 7.53933
+2.17125 2.54358
+0.703562 1.39087
+-0.221711 0.541965
+9.22839 9.39159
+9.53465 9.97585
+1.44304 2.53666
+7.886 8.85051
+9.33174 10.1632
+2.60898 3.42889
+1.73658 2.02589
+6.31651 6.77762
+7.26755 8.34499
+9.01312 10.9837
+7.47361 8.96251
+7.98365 8.02586
+1.40065 3.44891
+9.44617 9.55391
+8.24265 9.34849
+9.366 10.4216
+0.375354 1.17522
+3.37114 3.38278
+-0.742469 1.07634
+4.29988 4.81879
+4.18605 7.21928
+7.41047 8.29198
+6.68173 7.60225
+3.24292 3.30695
+1.8951 3.42167
+3.97359 4.2857
+4.72621 5.80575
+4.75014 5.02239
+6.43454 6.94568
+7.16601 8.10355
+2.16685 2.23666
+6.70852 8.63284
+8.16988 8.95848
+0.277002 1.30648
+1.5803 2.28632
+2.22634 2.34679
+0.200623 0.814959
+5.27457 6.51651
+2.49533 2.90705
+6.48922 6.69528
+8.18879 8.63551
+2.75159 3.633
+0.884853 1.56434
+1.87488 3.98951
+4.24783 5.17713
+6.22499 6.56095
+5.68238 5.99272
+3.75553 3.85012
+4.87543 5.39966
+6.62671 8.72493
+3.50262 4.05131
+5.38952 5.4974
+7.84971 7.94051
+5.39123 6.66564
+5.43986 6.17256
+7.48968 7.7677
+4.2685 4.57296
+1.75169 4.11058
+5.03634 5.16102
+4.68003 4.84715
+8.36249 9.98761
+8.94297 10.6969
+6.21572 6.24305
+7.90303 8.0672
+7.90426 8.41244
+5.98512 7.93187
+5.13297 5.27136
+6.58367 7.4971
+4.72663 5.22956
+7.99667 8.59246
+4.3303 5.92188
+1.3132 1.80875
+7.70104 9.20947
+1.78862 2.00473
+9.63678 9.65571
+-0.264416 0.318054
+2.70004 3.40777
+2.74642 3.73608
+3.6494 3.6743
+8.03113 9.22851
+1.07526 1.3116
+4.05436 5.33291
+4.60907 6.03605
+7.83426 9.10358
+2.27997 2.77309
+5.63139 6.92616
+4.40717 5.25214
+1.98986 3.5062
+2.42393 2.9584
+1.94336 3.08456
+1.20185 3.01827
+0.641733 2.10095
+7.25046 8.29391
+0.640392 1.26451
+3.9588 4.85492
+6.83036 7.41101
+6.48581 7.08757
+6.48734 8.47856
+9.55084 10.3774
+-0.173137 1.26574
+2.32702 2.58775
+2.7463 3.13914
+7.86951 8.62807
+5.96916 7.92759
+0.217046 1.70373
+1.04207 1.05755
+4.79058 5.07902
+4.19024 5.35395
+9.00175 9.83715
+8.37554 9.275
+4.5204 4.82999
+3.49936 4.75519
+7.07916 7.74619
+6.66726 7.35282
+7.39513 8.55523
+7.50381 9.60708
+1.39304 2.26927
+2.84101 4.76376
+1.21779 1.59353
+4.7893 5.70143
+9.12195 9.57131
+5.40461 6.15443
+2.86445 4.26837
+8.01324 10.9082
+2.96659 3.8042
+2.4897 4.59323
+6.37887 7.15878
+7.00143 7.6419
+3.22491 3.41843
+1.22852 3.31783
+2.09881 2.56121
+4.43205 4.67051
+4.39328 4.66715
+2.38355 3.39058
+0.638802 1.59399
+5.32717 5.81376
+8.00353 9.72007
+8.77281 9.81649
+8.95552 9.86609
+2.90915 3.96556
+3.88176 4.93124
+6.45945 7.69942
+-0.108577 1.57424
+0.304992 0.320561
+6.47789 6.5515
+1.98211 2.05312
+6.2741 7.35626
+9.45057 9.67918
+5.2916 5.48037
+0.158802 0.712187
+6.42002 6.84323
+9.11085 9.13063
+9.42446 9.95882
+6.03624 6.96469
+9.2473 9.6286
+7.10342 8.71163
+3.34072 3.35187
+7.4602 8.58506
+8.7963 8.81873
+0.323615 2.22687
+0.326746 1.76681
+2.20062 2.76862
+7.55181 7.85006
+0.941035 1.28117
+8.76643 9.60019
+9.19731 9.33092
+6.0479 6.57293
+6.12725 6.24356
+7.53078 8.92488
+3.1841 3.48283
+1.85544 2.01888
+7.3849 9.29183
+5.03915 5.27721
+4.77142 5.46282
+-0.291696 1.14641
+1.61367 2.20867
+5.31853 6.69431
+2.52731 3.13139
+4.86677 5.18106
+4.50183 4.60969
+5.95881 6.09964
+2.41939 4.42026
+6.92003 7.17891
+4.29584 5.48557
+8.02803 9.06315
+2.82326 3.49599
+5.8647 5.87561
+2.38814 3.62688
+6.32418 7.17662
+5.99907 6.5059
+3.84698 4.14446
+9.80728 9.82132
+5.2366 6.30871
+9.81878 9.91004
+1.53024 1.83525
+2.98035 3.68531
+4.5418 6.98786
+5.19561 5.9846
+0.946068 1.46672
+3.26948 4.71928
+6.13476 7.68682
+8.36934 9.65072
+6.40074 7.14762
+1.01349 1.80493
+8.4514 10.25
+-0.180382 0.682704
+1.03041 1.63565
+5.64642 6.96069
+2.73598 3.67485
+5.8705 6.66157
+4.68343 4.7176
+5.83787 7.6818
+1.42529 2.234
+3.73726 4.19241
+5.38341 5.81884
+1.13088 1.69073
+0.968034 1.98828
+1.06007 1.11039
+3.50129 4.51807
+5.83133 6.77904
+-0.334945 1.29129
+0.326706 1.16015
+9.15028 10.4391
+5.13047 6.79712
+1.06952 1.38997
+5.79345 6.49898
+7.88149 8.5143
+8.00404 8.09794
+8.22725 8.28904
+6.38406 6.61356
+6.32166 6.73458
+7.17066 7.32049
+1.64338 3.79327
+7.92135 8.55568
+7.15578 7.42231
+6.70701 7.65427
+5.76608 7.63064
+3.54163 4.08662
+3.81402 6.76906
+4.5998 4.61865
+9.01471 9.18718
+5.21234 5.73335
+0.946018 1.39917
+6.99714 8.29739
+5.64458 6.93965
+3.39809 5.70907
+6.32284 6.83604
+8.50347 8.53097
+3.90118 4.85721
+9.41198 9.62076
+4.41514 5.55152
+7.69979 7.81249
+5.34434 5.37105
+7.25274 7.76114
+7.67383 7.92718
+5.82851 6.29417
+0.935651 1.2842
+0.639586 0.786771
+6.39823 8.31226
+3.67546 4.89035
+9.20323 9.57287
+2.33896 2.99576
+8.51933 8.80243
+0.983098 1.11084
+8.48215 9.42998
+7.29586 7.3914
+2.00695 2.89046
+2.60909 2.62433
+2.04118 2.92033
+7.60386 9.01419
+7.32896 7.73342
+9.51693 9.54891
+5.1323 5.24962
+6.35326 7.18302
+2.50952 3.51872
+3.4149 3.57431
+9.18412 10.4976
+5.68123 6.42697
+5.87758 6.0124
+6.3202 6.64588
+8.2547 9.98176
+5.50949 5.7854
+0.0824268 0.128178
+2.17292 3.76233
+7.22786 7.68214
+5.09326 6.4151
+4.30171 4.86688
+2.39206 3.47399
+7.95152 8.35556
+2.40133 2.936
+2.77819 3.87516
+3.252 4.33376
+9.54269 9.7513
+6.6747 6.73043
+0.611474 1.97158
+7.65864 8.53689
+1.58345 1.8017
+2.56917 2.8152
+8.5424 8.8301
+4.98159 5.44499
+5.82482 6.03578
+3.55509 4.90785
+5.77028 5.94747
+0.163965 1.1379
+2.85039 2.94261
+4.24343 4.67273
+3.22636 4.06084
+6.03662 6.21018
+4.55495 5.07697
+1.91173 2.51739
+6.54894 7.24036
+5.55502 6.92676
+0.245707 0.586188
+2.28044 3.29563
+4.71378 5.25198
+8.28953 8.44891
+9.42282 10.179
+5.0548 5.73614
+6.3203 6.43659
+6.54178 8.82077
+3.67181 4.17365
+8.51445 8.96445
+1.69648 2.84524
+0.194222 0.920147
+2.48533 2.59803
+1.66002 1.6739
+4.79833 4.95404
+1.09801 1.11009
+6.62529 7.4066
+8.0099 8.37262
+3.55429 4.11824
+6.2666 7.12137
+7.83222 8.01342
+9.37156 9.72961
+1.1647 4.04434
+4.50719 5.09068
+3.25175 3.75482
+8.28659 9.30848
+7.30009 8.60755
+-1.12073 1.21016
+0.310087 0.725712
+8.3746 9.13511
+9.11925 10.2234
+9.68703 9.7137
+0.603098 0.844291
+5.88373 6.99327
+0.852802 1.43297
+3.7463 5.82283
+7.69639 8.25446
+-0.337322 0.977113
+8.76606 9.16618
+3.43527 3.6616
+3.93587 5.39471
+5.66569 7.20462
+5.34999 5.7193
+3.25589 3.706
+1.52012 2.55985
+4.74228 5.43725
+5.15323 5.51652
+7.77237 8.33717
+-0.0514419 0.914127
+9.27182 9.59476
+8.14192 9.74859
+6.42702 7.20331
+7.51351 7.68358
+7.0947 7.46059
+7.97635 8.59449
+2.39931 2.66008
+5.79481 5.94673
+4.41054 4.81613
+2.72202 3.61239
+2.86039 3.44719
+1.81115 3.28151
+-0.566995 0.734214
+9.61998 9.72024
+7.4163 7.61821
+0.42522 0.552659
+3.17617 4.36942
+0.740294 1.36953
+7.13755 8.39966
+0.219186 0.892588
+3.78307 5.2905
+0.783026 1.76155
+3.01893 3.33055
+3.12143 3.5713
+-0.792679 0.92539
+0.668572 1.12961
+3.88619 4.30545
+7.59276 8.1776
+4.71509 5.05622
+6.53406 7.04242
+1.581 2.21984
+4.7144 5.51372
+2.76338 3.50211
+0.16364 0.293599
+5.92365 6.10636
+3.11174 4.29165
+5.49295 6.48717
+-0.503239 0.795707
+7.30558 8.12408
+2.10674 4.13456
+7.11985 8.01932
+1.34672 1.48739
+4.05778 5.69084
+2.83686 2.9115
+6.4471 6.53909
+0.467374 1.84371
+2.76467 2.94177
+4.87867 5.33932
+0.892878 1.96273
+1.13934 2.27205
+7.76918 8.39409
+6.72181 7.43901
+7.0836 8.68472
+7.12924 7.56332
+0.689172 1.62922
+9.41146 9.91043
+0.398265 1.27579
+6.29966 7.4874
+5.09438 5.65334
+6.04623 6.4687
+5.75305 6.89731
+0.308118 0.459501
+3.63692 4.30501
+3.1755 3.71009
+7.32787 7.52785
+2.23235 4.09978
+2.71191 2.91513
+0.209457 0.840713
+7.31489 7.38296
+6.21245 6.91111
+5.75983 5.96049
+5.92056 8.24518
+-0.354452 0.489638
+4.05894 5.34828
+1.56299 1.57414
+2.85083 3.27455
+8.78323 10.0012
+0.208502 1.26471
+6.10824 6.79285
+5.55114 8.03968
+6.13077 6.32342
+7.34865 7.82592
+3.94835 4.75016
+7.8268 8.72249
+4.85131 5.07903
+5.40398 6.0134
+2.85971 3.85293
+0.126379 1.45545
+3.15768 4.28388
+9.64566 9.70016
+4.47514 6.31064
+6.44995 7.2894
+4.70992 6.13777
+3.91128 4.22263
+7.35627 8.07739
+2.49215 2.68749
+8.09946 9.16929
+0.925679 1.92784
+8.48437 8.63892
+7.2255 9.18109
+-0.00840282 0.0168954
+5.91933 6.6274
+4.16086 4.64302
+8.27009 8.47868
+1.73372 2.93094
+8.17421 9.17705
+9.19136 9.43222
+0.0653594 0.648416
+8.69 8.96184
+8.99355 9.40832
+6.25088 6.26945
+6.72391 7.38424
+9.59708 10.3496
+6.00971 6.18818
+4.64468 5.75797
+3.64832 5.30079
+5.99378 7.8792
+6.5388 6.99379
+7.31694 8.43802
+3.66227 4.92638
+9.55964 10.3796
+-0.14433 0.29095
+3.56716 3.71252
+3.82062 4.27788
+8.10405 9.35275
+7.17891 7.46539
+1.17698 1.29602
+4.48829 5.03134
+7.18025 8.13852
+9.42388 10.3634
+5.2158 6.17469
+5.22926 6.52397
+5.16731 6.40625
+6.53348 7.269
+2.07834 2.39172
+9.65044 10.1519
+8.64551 10.1294
+9.29006 10.5993
+1.50639 2.83173
+5.71675 5.99216
+3.0783 3.35571
+0.115401 1.31431
+8.03988 8.11942
+3.11917 4.53956
+1.14552 1.1646
+5.34782 6.43017
+0.0701702 1.0368
+0.183335 0.440704
+6.33438 7.71607
+2.11533 2.64323
+7.12104 7.13366
+7.21548 8.26968
+3.13445 4.13568
+4.57452 4.74602
+2.60889 3.69846
+7.21184 7.47573
+6.87651 7.03405
+2.65431 3.94352
+1.50006 1.70087
+6.16344 7.54429
+7.02057 7.73067
+8.27833 9.01489
+0.500833 0.597845
+8.34751 9.88925
+2.80242 2.91837
+5.29424 6.079
+8.36276 9.10074
+0.216887 0.268335
+1.30798 3.16393
+3.93851 4.22658
+2.58028 3.14744
+9.31131 10.3451
+7.37262 8.84852
+4.45306 5.6723
+3.74535 4.0721
+4.90174 5.63875
+3.41847 4.65199
+3.10265 3.82548
+6.56126 6.97557
+2.57449 2.95098
+7.97418 9.06301
+9.2203 9.66829
+4.64922 4.96305
+8.83034 10.115
+6.6685 6.89847
+7.36585 7.48669
+8.66761 9.39287
+0.562216 0.961875
+7.56292 7.81006
+8.50715 8.95572
+0.572825 2.24755
+5.9367 6.06766
+-0.769578 0.776163
+4.48224 4.9553
+8.21069 9.29643
+8.57206 9.47175
+1.10032 1.21371
+3.76306 3.87152
+6.46197 8.18457
+6.96501 9.70727
+3.42357 3.93484
+0.818601 2.42743
+-0.119739 0.397938
+-0.378761 0.523892
+8.03394 9.35409
+3.60283 3.98864
+2.21789 2.70607
+-0.255329 0.319063
+6.20806 6.22609
+7.1283 8.04391
+3.73565 4.03638
+8.5374 9.10987
+5.22675 5.35072
+7.51777 7.58439
+9.12636 10.4159
+9.15003 9.40672
+0.217863 1.19883
+9.42416 9.9178
+2.55337 3.8088
+7.03655 7.98242
+9.17171 9.8047
+0.110162 0.722738
+3.16467 3.58897
+6.47244 7.12961
+1.0456 1.65614
+1.58456 1.62844
+1.79039 1.84035
+6.24286 7.07838
+9.08631 9.11684
+3.05068 3.40838
+2.81212 4.03665
+2.52011 3.09841
+8.06001 8.16356
+7.07649 7.52685
+2.47666 2.86548
+8.66241 8.95103
+-0.298116 0.662697
+0.822443 2.46125
+2.07619 2.33674
+4.84135 6.21034
+7.49625 8.13026
+7.85854 8.29618
+3.01722 3.37062
+6.54393 7.30306
+2.21113 2.30166
+8.32138 8.57349
+6.2995 6.33514
+3.0018 3.56886
+4.63378 5.52214
+6.71908 8.96715
+2.29809 2.95581
+8.34947 8.71096
+4.96902 5.32075
+9.51051 9.72733
+3.311 4.77789
+3.50233 3.66309
+4.95177 5.76002
+6.12876 7.22391
+6.27743 6.79393
+3.60638 3.6833
+5.20305 5.50848
+7.16065 8.88358
+9.45049 10.2539
+6.16892 7.0314
+8.08479 9.74516
+0.0717867 0.669987
+2.17569 3.34098
+4.81716 5.7509
+7.63999 8.01157
+5.87228 6.60363
+3.39621 4.35575
+4.96079 5.07901
+7.57639 8.82003
+8.27285 8.52609
+0.665858 1.64782
+1.74256 2.07126
+6.19512 6.4258
+0.664592 1.30896
+0.180682 1.43746
+6.46752 6.81303
+2.55562 3.08708
+9.33695 9.63312
+6.33821 6.77092
+7.88252 8.55026
+8.17937 8.45385
+-0.415294 0.793096
+5.22077 5.54553
+8.67808 9.10041
+1.72096 1.92024
+0.492778 1.48076
+2.29514 2.88531
+0.0934389 1.37614
+8.40297 9.11121
+3.66605 3.91717
+-0.274468 0.867811
+9.41428 9.56659
+1.22657 2.12792
+8.71336 9.85384
+5.09347 5.42905
+2.02877 2.36652
+5.99112 7.40703
+0.911618 3.48138
+4.84352 5.11131
+1.16309 2.08613
+5.58561 5.84805
+0.663543 1.08921
+1.83189 3.93269
+4.07731 4.38879
+4.04789 4.9989
+2.09457 3.61279
+2.00982 2.94396
+7.37537 7.66574
+5.08648 5.80122
+9.19959 10.2263
+4.26136 4.86194
+6.67875 7.61134
+1.27462 2.48399
+7.2237 7.82324
+-0.0141009 0.0441377
+8.32069 8.36192
+2.82562 3.0717
+-0.528918 1.25301
+1.90486 3.04714
+1.34489 1.75301
+3.14332 4.03322
+8.55351 10.8681
+9.09824 10.3828
+0.496868 0.622499
+7.11112 7.62765
+0.335233 0.528962
+6.71335 7.13937
+6.78574 7.71172
+9.13568 9.22251
+7.10299 7.64765
+3.64747 4.06685
+8.64041 9.40111
+2.43515 2.93081
+2.95476 3.68588
+0.0863751 0.777976
+6.5891 8.18165
+8.80986 10.0735
+0.568868 1.63785
+4.41677 5.42049
+8.72857 9.88426
+3.67467 4.25442
+8.98168 10.1087
+5.08611 5.50098
+1.28982 2.34422
+-0.914176 0.969847
+4.35042 4.42735
+4.02282 5.08164
+9.00566 9.4791
+2.71821 3.24065
+3.20252 3.24988
+8.61559 9.6733
+3.15157 4.7685
+3.59348 4.67872
+0.286864 0.36279
+8.40374 10.528
+7.53647 8.13523
+6.81591 6.90226
+7.68111 9.10704
+8.37958 8.73818
+3.25808 4.40893
+1.50348 3.00641
+0.20803 1.40949
+3.93771 4.84177
+2.79232 3.35329
+4.2666 4.63588
+0.341784 1.46241
+1.53063 2.06724
+8.58212 8.86194
+8.95411 9.70651
+8.71591 9.26292
+6.66088 6.7009
+3.95881 5.93917
+8.5823 8.76007
+-0.308958 0.34174
+1.03188 1.37677
+7.52675 9.84031
+4.27952 4.32984
+1.83465 2.27607
+8.12096 8.64922
+2.22605 4.40067
+0.00929139 0.871342
+0.376531 1.29354
+3.5257 4.30165
+1.95846 4.09589
+-0.200922 0.799272
+0.24432 1.76673
+4.73477 5.06514
+8.97059 9.2276
+2.89618 2.93969
+0.168256 1.03325
+3.44522 3.83622
+2.74889 2.76042
+6.07155 6.7979
+9.06484 9.09804
+7.56658 9.29215
+4.3084 5.45621
+-0.0786996 1.12809
+8.48249 9.74107
+6.4196 6.61469
+1.57119 1.87612
+3.15463 3.86251
+2.0089 2.57741
+6.53618 7.12035
+7.07901 7.29396
+0.114756 0.887413
+8.90806 9.65731
+4.0921 5.23407
+2.63441 2.92344
+4.31769 4.98832
+8.90336 9.26837
+8.25313 8.91204
+2.87758 4.00212
+-0.708243 0.789072
+3.28656 4.55872
+5.73177 5.80293
+5.40596 5.5844
+4.09318 4.57774
+6.16178 7.00613
+8.5514 10.5495
+6.83987 7.3056
+1.06341 1.97923
+7.82153 9.00722
+0.923069 1.42337
+1.83408 2.82331
+5.75305 7.23576
+0.241909 0.96721
+1.16645 2.10491
+5.41819 6.09839
+7.49242 7.69495
+0.347233 0.383681
+2.33245 2.53467
+4.91249 5.27759
+8.11182 9.2758
+0.0955456 0.548659
+-0.359909 0.48055
+1.64759 3.47097
+6.37855 7.40015
+0.423283 2.08857
+4.10068 4.46856
+2.58389 2.69626
+0.848483 2.72258
+8.67321 8.88903
+2.07607 3.42398
+3.11033 3.80741
+2.24735 3.48626
+8.11883 8.7687
+0.29959 1.41603
+4.84924 5.13641
+1.44102 1.74592
+1.13437 2.50296
+1.75876 3.09859
+4.75363 5.90838
+7.36423 8.20074
+5.51578 6.42652
+0.915633 1.86015
+9.44679 10.3479
+2.61691 3.60215
+6.26524 7.2538
+2.74326 3.12649
+5.83934 6.98592
+9.1111 10.4891
+2.27066 2.82709
+8.19359 8.67233
+0.834236 1.7066
+6.19288 7.21392
+-0.249843 0.891821
+2.5652 3.25132
+5.25356 5.88905
+3.99545 4.18918
+1.93186 2.51527
+4.44621 4.82421
+5.89181 7.36963
+2.77321 3.60627
+2.76444 3.88016
+2.50062 2.66105
+1.14846 1.66146
+2.951 4.81656
+3.81976 4.01061
+4.75674 5.59916
+6.74092 7.08289
+2.09989 2.32514
+0.220723 0.865303
+5.48107 5.71875
+1.48372 2.88941
+0.484577 1.12051
+8.93618 9.7185
+1.89769 3.65655
+2.0129 3.55214
+9.23173 10.3694
+0.286189 1.22753
+0.453785 1.55541
+2.24068 2.6541
+8.80917 10.4969
+7.12801 7.15222
+9.25745 9.9103
+5.73429 6.76901
+7.54454 8.47157
+1.96008 3.74997
+8.00837 9.25665
+1.66384 2.07613
+5.53014 5.97461
+-1.32495 1.33319
+4.58479 5.2263
+7.92048 8.75668
+6.87595 7.02522
+0.157713 0.389585
+7.48277 7.51261
+8.10714 8.38399
+0.0802723 0.587088
+1.13024 1.71135
+5.71769 6.84757
+3.08261 4.31054
+2.95952 5.09762
+6.62815 7.44256
+5.0805 5.8499
+3.38489 3.73265
+1.10644 2.18331
+4.70493 7.31686
+2.2253 2.6338
+0.778359 1.6265
+6.94211 7.2149
+4.20976 4.99342
+7.47792 7.67881
+7.06219 8.76137
+4.97677 6.12206
+6.30829 6.69361
+6.19977 6.76781
+9.67636 10.2172
+3.41958 3.69137
+0.374486 0.943711
+4.00837 4.80107
+8.85401 10.1325
+6.0938 7.8919
+1.51055 3.08998
+8.94594 10.3139
+1.06714 2.65511
+0.703202 0.850595
+4.87735 6.00659
+8.3067 8.39924
+7.78071 8.3155
+1.98737 2.81116
+6.86323 8.07974
+1.03479 1.34584
+0.490512 0.670211
+5.82122 6.1901
+5.50836 6.63385
+7.9192 8.9606
+0.913719 2.18983
+4.97151 5.70909
+4.19907 4.37712
+2.01188 2.63318
+7.84813 9.3771
+5.32667 7.48502
+8.50951 10.1006
+-0.551637 0.930509
+1.06511 2.23353
+1.91111 3.42663
+9.37528 9.55327
+7.27975 7.38741
+3.46676 4.83165
+7.36137 8.70333
+-0.295762 0.623228
+8.48558 8.81076
+2.71689 3.41873
+6.49265 8.11042
+5.25516 5.57336
+6.10462 7.05991
+8.76997 9.15164
+7.86196 8.30651
+7.82765 9.24604
+5.98573 6.34182
+6.45367 7.47857
+3.27018 5.10835
+1.3079 2.37423
+-0.261387 0.338113
+7.60683 8.81791
+4.7346 7.41988
+5.25597 5.28517
+3.76704 4.52226
+3.91774 6.66976
+5.69618 8.92667
+1.86148 3.07531
+5.57404 6.51438
+9.39049 9.77921
+2.38692 4.21416
+6.84909 7.23633
+7.2379 7.58761
+4.73485 6.11606
+7.80013 8.08105
+1.72701 3.40244
+2.44475 4.4072
+9.72565 9.77726
+3.35288 4.06493
+8.91215 9.92325
+8.67991 9.65865
+0.253195 0.764339
+4.23564 5.59497
+1.84752 2.14986
+-0.502957 0.528737
+1.32656 2.11347
+9.81563 10.0213
+7.60114 8.05035
+8.51797 8.83342
+-0.394604 1.41267
+7.71614 8.63514
+0.530249 0.968898
+2.90463 3.01675
+7.58098 8.71658
+-0.253747 1.28827
+1.832 2.39006
+7.2268 7.27225
+3.84076 4.66703
+2.2564 2.73185
+7.31508 8.46008
+4.99387 5.64948
+7.21239 7.79983
+7.60231 7.8473
+0.555482 1.41892
+1.25539 1.73665
+8.41561 8.96404
+5.06771 5.17664
+0.0655744 2.10718
+8.00222 8.65909
+7.48841 7.83609
+6.30909 6.89448
+9.1697 9.55942
+1.36259 2.22582
+-0.923854 0.994771
+3.43724 4.64053
+8.09411 8.19574
+4.84869 5.52805
+2.69802 3.4119
+9.0613 9.29405
+0.565216 0.687165
+5.93495 6.57426
+1.86925 2.75493
+1.41068 2.00824
+1.60612 1.62471
+3.11499 5.89909
+2.69806 3.90538
+3.76301 4.22135
+3.30065 4.70725
+5.56461 7.02137
+8.35335 8.99287
+4.79259 4.88508
+6.7911 7.52912
+8.14843 8.28583
+3.67629 5.06406
+5.71462 7.04747
+9.06721 9.99733
+4.87932 6.8586
+8.00814 9.57664
+7.03069 7.51623
+9.0989 9.57644
+2.70873 3.91296
+1.64425 1.7007
+6.53716 6.99033
+8.29874 8.74509
+1.88941 2.57626
+4.65337 5.23247
+9.04723 9.06665
+3.52258 3.61496
+1.1207 1.80143
+0.680601 1.98384
+2.94593 5.38692
+2.65685 2.67932
+9.00469 10.2054
+6.44318 7.2657
+4.66656 5.33893
+3.41719 4.72453
+3.12403 4.21748
+6.67973 6.81775
+3.54347 4.14978
+3.02554 3.50812
+3.91883 3.93657
+7.31721 7.89895
+1.86275 2.85473
+6.23266 6.4449
+7.59855 9.38013
+9.07084 9.49309
+0.557656 2.6851
+6.899 7.37693
+4.23162 5.84314
+8.54108 9.37672
+3.9513 4.79746
+7.299 8.29678
+5.58879 5.88551
+9.14992 9.22385
+9.1914 9.31788
+4.95663 5.56316
+2.16516 2.39538
+0.722262 1.89664
+7.76447 7.80026
+2.77772 3.39136
+9.59513 9.78635
+1.02728 1.2181
+7.32631 7.56611
+7.37389 7.46163
+6.87949 8.18689
+8.95602 9.81169
+5.85364 6.63434
+0.129136 2.13484
+7.09608 7.71167
+7.1487 8.34258
+7.48738 8.3172
+8.77247 9.95985
+7.6706 9.56828
+8.14268 8.61726
+6.5455 7.90871
+4.57866 4.78453
+3.63937 4.42349
+5.18905 5.36516
+4.68884 5.62995
+5.88338 7.83824
+-0.002979 0.145818
+4.42981 4.77141
+0.558593 1.07999
+6.91713 7.36159
+5.13948 6.20805
+3.34368 4.07112
+7.27365 7.8383
+9.6898 9.9514
+6.14332 6.75102
+2.16534 2.78843
+2.8007 4.37952
+7.67047 7.72955
+8.77377 9.85092
+1.26087 1.55193
+6.29788 6.58511
+7.68178 9.05777
+0.383336 1.21247
+2.55185 4.30874
+8.91971 9.21836
+3.67638 4.68596
+8.13843 9.13684
+-0.424353 1.97502
+2.71499 2.93977
+0.104447 0.387901
+4.09592 4.67009
+0.808593 0.920798
+5.01258 6.30662
+4.97668 6.57412
+8.44135 9.03816
+2.78932 3.72809
+6.71337 7.15128
+4.27234 4.50127
+6.78266 9.70351
+6.48026 7.51491
+7.36296 8.42283
+4.80339 7.3704
+6.24735 7.3132
+0.134626 0.364187
+2.73854 4.09422
+0.809997 1.19657
+6.41154 6.50244
+7.16847 8.56485
+1.53582 3.33985
+1.92874 2.86427
+6.95941 7.01378
+5.8592 6.54917
+2.51802 2.75622
+3.3894 3.6957
+2.2547 2.64693
+8.62054 9.1951
+8.86378 10.0003
+1.87892 2.28732
+3.83146 4.21484
+1.53262 1.99692
+7.86048 7.93125
+1.79437 2.68269
+3.92781 4.24119
+5.43044 5.47935
+0.322904 0.618854
+3.42383 5.18531
+4.00989 5.83612
+7.06304 8.76582
+5.88039 6.77654
+8.638 8.9479
+1.73391 2.09002
+1.04861 2.84779
+-0.313019 0.557659
+3.35245 4.1308
+9.05373 9.57205
+5.85684 6.49193
+6.00719 6.86421
+4.25244 4.65772
+5.15865 5.61529
+8.78498 9.77544
+8.33803 9.26452
+3.42915 4.92279
+8.29884 8.94035
+5.10232 5.35924
+4.33571 4.86695
+7.86184 7.90029
+7.34345 7.36214
+0.201624 0.800371
+9.05882 10.5503
+4.32188 5.03154
+-0.0456982 1.22298
+2.90921 3.60013
+1.69306 2.36564
+7.79029 9.15059
+4.65205 5.06538
+6.34552 8.32176
+7.92695 9.32585
+7.17903 8.09903
+9.53561 9.60287
+0.365723 1.23929
+0.542889 0.849053
+8.15061 8.93512
+6.40042 6.41053
+5.82666 6.5488
+1.00893 1.83717
+1.76021 2.11893
+7.61076 8.6242
+2.32513 3.4856
+4.39023 6.01094
+-0.11754 0.421848
+6.76371 6.94513
+4.67607 5.58732
+-0.201992 0.765553
+7.42926 7.44429
+2.57485 2.85339
+2.74138 4.13421
+8.21645 9.18107
+6.28184 6.4996
+7.129 7.74678
+7.76842 8.74924
+3.5359 4.35892
+3.04103 3.24376
+2.29389 2.92164
+6.96306 7.64415
+8.82053 9.04584
+1.19911 2.06167
+5.91357 7.6773
+0.150241 1.23291
+4.48681 5.41762
+6.89156 8.13443
+5.37828 5.79944
+2.13694 2.91102
+1.35932 2.08272
+6.14309 6.23278
+4.03202 5.88521
+7.23417 7.43704
+1.2501 2.60793
+2.12334 3.65727
+7.05722 8.77078
+0.437873 0.585933
+6.33338 9.16643
+2.44724 4.40234
+2.92012 3.64047
+1.2039 3.25195
+8.6611 10.0398
+8.0088 9.13622
+5.96562 7.08515
+5.45181 6.65246
+0.742546 2.38958
+4.12919 4.93571
+0.428823 0.84483
+1.45226 2.5869
+9.50727 10.0211
+7.69194 8.66273
+1.25706 2.44554
+5.23247 5.47762
+0.499178 1.70722
+7.26569 8.72467
+3.59815 5.50022
+1.03601 2.43445
+0.092414 0.927635
+3.7917 3.995
+6.21977 8.40398
+3.1513 3.81188
+9.80482 10.0951
+8.65564 9.33687
+2.06164 3.49152
+2.09754 2.34929
+0.66126 2.31888
+5.34832 6.82603
+7.91038 8.59105
+0.695523 0.800961
+2.33406 2.71629
+8.37774 10.9253
+9.7682 10.106
+9.44382 9.5743
+8.78009 9.47645
+1.87309 3.04127
+1.86724 2.13913
+3.30049 3.52416
+7.18508 7.6648
+1.3736 2.12153
+2.41879 5.06716
+1.87815 2.29743
+1.76646 2.06335
+9.73034 9.95475
+0.497489 0.686102
+6.96908 7.17338
+9.23111 10.0148
+3.30981 4.21787
+9.53311 10.3734
+-0.067709 0.147251
+8.44557 8.82047
+7.10407 7.47639
+0.834352 1.36908
+9.1598 10.6508
+4.22018 4.38279
+3.8295 3.95462
+3.97302 4.97247
+1.55856 2.31013
+0.0217962 0.486978
+1.69845 2.65786
+-0.489562 0.582187
+5.10621 5.6055
+9.8478 9.85919
+6.15389 6.92324
+7.11469 8.0418
+3.20625 3.78209
+5.93389 7.66892
+1.15134 1.18023
+6.84797 7.4239
+2.9483 3.22279
+-0.43205 0.764755
+7.17846 7.33313
+5.4729 8.26894
+6.19512 7.32132
+0.591934 0.767568
+0.49266 1.80691
+9.08272 9.72242
+5.85683 6.36905
+5.27625 7.13913
+3.60853 3.98155
+0.642811 1.10253
+1.27117 1.5329
+8.76096 9.61776
+4.9498 5.12847
+7.53282 7.80438
+1.40487 1.65657
+3.45329 3.84307
+3.25698 3.49614
+2.38651 2.89802
+8.23114 8.99016
+9.58516 10.4145
+5.5185 6.27733
+0.583068 0.892249
+1.93142 2.35084
+7.94845 9.22667
+2.47963 3.9005
+3.46106 3.86301
+7.77744 8.43735
+1.41072 1.73969
+9.12904 10.4307
+3.52227 3.66861
+5.4743 5.86487
+-0.51727 1.63657
+5.09861 7.03162
+5.14763 5.93411
+3.23526 3.47376
+0.9702 1.74063
+9.28366 10.3322
+1.80257 1.92265
+8.63597 9.08467
+4.16006 4.97753
+6.37418 6.39374
+5.82376 6.62429
+7.74751 8.68962
+1.63821 2.53399
+4.9864 6.40969
+0.680772 0.995608
+3.74344 3.83319
+0.898055 1.8593
+2.36839 2.39307
+7.21046 7.51006
+0.60893 2.91523
+3.15017 4.30412
+5.02219 6.28886
+4.60541 4.73379
+8.41196 8.58978
+8.84706 10.8198
+6.95807 7.54952
+5.54729 6.9315
+4.62574 4.73423
+3.35252 3.59865
+1.02207 1.71791
+3.16408 3.73993
+0.639222 1.69519
+7.57978 8.05813
+2.41371 2.77174
+8.65544 10.093
+6.31988 6.70758
+6.5301 8.39328
+0.578825 1.20331
+1.1243 2.07824
+5.86555 6.72397
+6.37103 6.81736
+1.12086 3.46541
+2.59503 3.44073
+5.27128 5.3616
+2.87331 3.4352
+5.48408 6.67916
+3.36016 4.09125
+0.813671 0.9811
+0.812162 3.22209
+6.85104 6.86306
+0.671311 0.979685
+2.75962 2.82659
+2.42186 2.49827
+7.82974 9.59669
+3.48851 3.60085
+8.47775 10.9574
+8.6863 10.6155
+0.196484 1.07469
+1.19293 1.45012
+5.79166 6.18466
+6.51597 6.6793
+9.78341 10.1992
+8.17879 9.59257
+6.96178 8.73165
+4.09161 4.31908
+3.19514 3.4072
+5.5101 6.32978
+0.188435 1.84481
+9.41738 10.0379
+1.46994 1.6294
+4.21915 5.39529
+5.46567 5.86638
+8.19414 9.201
+4.38616 4.55193
+2.31105 2.73345
+6.05897 6.12297
+8.84135 9.74232
+9.44943 10.2225
+3.27501 3.66059
+0.524904 1.74374
+7.7228 8.43799
+5.13274 5.82863
+8.2787 8.94491
+1.61463 2.03499
+7.04346 8.69977
+0.938308 2.38676
+0.00208037 0.0186158
+1.98744 2.05864
+7.05787 8.16211
+1.68383 2.04684
+2.24812 2.28257
+0.685061 1.2947
+2.25379 2.92827
+6.0052 6.24797
+7.06213 7.86344
+0.751849 2.96376
+0.0977921 0.513746
+8.43792 9.10545
+2.80769 3.09276
+9.19308 9.59741
+4.74365 4.99708
+8.41385 8.58422
+4.28093 5.9281
+4.26205 4.75417
+1.48035 1.61363
+1.4264 1.80922
+3.48365 4.52935
+1.78396 2.96351
+8.4134 8.96536
+8.65646 9.34781
+1.88027 2.97804
+8.92531 9.02743
+6.91815 7.88895
+5.68023 7.37521
+3.93105 4.6123
+0.385874 1.30785
+1.80151 2.24385
+8.43781 9.33927
+6.69643 8.001
+6.12062 6.673
+4.8316 6.63067
+9.00443 9.08204
+1.5651 2.65023
+3.57517 4.40231
+5.85127 8.02219
+8.02586 10.018
+2.00514 2.75138
+6.32104 7.84285
+8.90914 9.78319
+4.91325 6.27817
+3.87406 4.80327
+8.57887 9.30685
+1.40351 1.71079
+-0.217977 0.224497
+8.37711 9.56393
+5.54644 5.77714
+8.18206 8.36015
+0.774967 1.97899
+9.10434 10.1721
+9.39621 10.1135
+4.80108 4.90605
+9.45978 9.96227
+2.85412 4.05215
+5.71985 7.16735
+2.35081 2.82214
+9.34881 10.5899
+7.13014 7.82872
+4.54931 4.89725
+9.41397 9.9131
+8.90226 9.55276
+8.27995 9.83651
+9.2767 9.6053
+0.388751 1.40317
+5.01478 5.88869
+6.41521 7.21754
+1.22552 1.39067
+3.75771 3.81571
+4.39362 6.04592
+8.82639 8.84544
+4.59289 4.89208
+1.52235 1.64285
+1.85893 4.52056
+1.91781 2.78253
+3.34677 4.54987
+9.26905 10.6019
+7.10958 8.02083
+0.765257 1.66957
+2.17169 2.70214
+4.2293 6.38089
+1.41111 2.45992
+5.76864 6.85715
+2.19944 2.93182
+9.03727 9.6454
+3.82652 4.35225
+2.52642 3.09725
+7.77868 9.35844
+0.337665 1.00787
+1.92021 2.04418
+4.41862 5.95486
+9.47606 9.62386
+1.12113 1.55658
+5.26701 7.09712
+8.81478 9.34863
+6.29447 7.43847
+2.82379 3.57268
+7.9735 8.79936
+3.30176 5.50666
+6.36009 6.8864
+4.13583 5.00627
+0.510514 0.882245
+6.93864 7.78543
+2.04039 2.4298
+3.18337 3.19424
+4.20059 4.67088
+0.316687 0.707377
+0.169106 1.68194
+8.26665 10.2362
+1.1124 1.78306
+2.84603 3.33142
+9.48756 9.96651
+9.4301 9.7316
+0.234674 1.23981
+0.493232 0.522565
+1.342 1.41739
+2.57196 4.08221
+1.54201 2.52284
+5.32049 6.00052
+8.54218 8.59452
+-0.030524 1.64476
+2.31645 2.72528
+4.71898 4.92827
+0.0872997 1.74969
+0.994278 1.76964
+1.34411 2.77952
+0.156817 2.10245
+5.78094 6.34389
+3.09336 3.10563
+8.14245 9.0928
+9.34202 9.75484
+9.78415 10.0211
+4.68383 5.19384
+6.09441 7.90512
+6.74941 6.76118
+1.78693 1.91697
+2.34369 2.62141
+-0.20756 0.829082
+3.57681 5.11448
+2.44234 4.45153
+4.84521 5.31902
+1.80487 3.64498
+2.46125 3.02549
+-0.334514 0.64288
+8.06406 8.49886
+1.74559 2.54474
+6.05883 6.46529
+9.00014 10.2271
+8.00064 8.5061
+0.909467 0.980765
+8.65862 8.69736
+8.11457 8.77049
+3.93237 5.02485
+4.64507 5.34852
+3.92405 4.19449
+5.02381 5.21722
+3.76203 3.78396
+6.74925 7.34781
+8.2556 8.63585
+3.92521 3.99739
+1.44641 2.31509
+0.23516 0.917239
+4.4614 6.35489
+3.33221 3.95247
+1.73289 2.07919
+6.92385 7.55052
+8.74351 9.41125
+9.41451 10.1785
+7.4001 8.81081
+2.97038 3.12524
+7.26043 7.77569
+5.56625 5.59344
+5.70977 6.33362
+7.61443 8.43218
+1.05308 1.82947
+0.377602 1.57633
+6.42483 7.51505
+4.73011 5.43693
+7.72 8.09098
+9.20063 9.82287
+6.88273 7.35327
+6.88423 7.68356
+3.55293 3.6227
+0.947096 1.76021
+3.66411 5.67117
+9.31422 10.1035
+6.84847 6.98956
+2.16221 4.45806
+0.853284 3.15932
+2.48673 2.89793
+3.37633 3.90938
+1.6141 1.66363
+1.6658 3.01723
+0.419408 1.01736
+0.712239 0.791538
+2.25249 3.62425
+8.09772 10.2367
+1.46651 1.48148
+1.73233 2.0489
+7.42679 9.23232
+7.97446 9.53281
+2.74677 4.03955
+-0.169412 0.872795
+4.90663 5.40277
+7.62122 9.49334
+6.55971 7.34259
+3.71957 5.03775
+3.33226 4.06459
+0.634912 1.52603
+3.65506 4.09318
+4.31463 4.60534
+8.58287 9.85385
+0.334759 0.7232
+2.14027 2.866
+6.06611 6.3625
+2.53013 3.18764
+4.30913 4.89247
+6.53234 6.92328
+7.66419 8.61762
+1.37598 2.26754
+8.06279 8.80692
+5.28688 5.70608
+0.509396 1.34606
+8.80589 9.29765
+9.3801 10.3988
+0.402662 0.597735
+5.87213 6.63371
+2.79136 3.763
+6.20615 7.25189
+7.54065 9.62156
+4.12107 5.04454
+5.60294 6.69246
+1.20845 1.49272
+1.75679 2.56397
+2.83939 3.85147
+6.21362 6.71341
+9.01824 9.2388
+4.66617 5.04944
+1.48766 2.55674
+8.89442 9.42175
+5.29411 5.39531
+6.66271 8.68733
+0.730461 1.42466
+6.22927 6.55086
+0.566776 1.17299
+3.06104 4.17775
+5.28026 5.73966
+5.76071 7.61585
+7.83786 9.58106
+6.32199 6.46961
+8.89555 9.17429
+3.85772 4.97805
+6.63352 8.79211
+7.87234 7.94131
+6.53479 7.87979
+3.90293 4.50376
+6.21371 7.31788
+1.00497 1.75003
+6.90351 8.02435
+2.29142 3.9809
+6.26632 6.45283
+-0.0354471 1.31727
+8.80046 9.20169
+7.86905 8.36819
+0.848737 1.82393
+7.98136 9.40712
+3.97765 4.95399
+8.70252 9.26275
+3.13412 4.29389
+2.06446 3.55839
+7.67918 8.44509
+5.96082 6.40336
+1.20461 2.36924
+4.76741 5.74978
+9.41217 9.94305
+7.36736 8.07119
+3.44102 3.56957
+3.59893 4.52751
+4.2613 6.41628
+1.65321 3.02235
+3.70067 3.86657
+0.0176327 1.1215
+4.13592 4.88595
+8.73668 9.0834
+1.80944 2.95584
+6.05721 6.93009
+5.08206 5.38626
+1.86749 1.89392
+3.58284 4.10506
+0.0885586 1.47709
+5.46502 5.93066
+8.45338 8.47878
+3.46789 4.02317
+0.975506 1.15814
+7.12758 7.60073
+7.99582 8.56746
+3.11435 3.83805
+4.51166 4.52472
+8.39096 8.75934
+8.42208 9.66019
+2.48498 4.73703
+3.50301 4.81264
+6.40196 7.0733
+8.52138 8.82265
+1.49822 1.74634
+7.08547 7.93508
+3.47832 4.42948
+6.08646 6.20865
+4.46334 4.65278
+3.80008 4.08214
+3.4853 5.44308
+5.48109 6.18681
+6.59161 8.04307
+7.36554 7.38201
+5.2144 5.31725
+4.62607 7.25804
+1.24345 1.81263
+5.49248 8.16867
+6.4056 8.26316
+7.67828 8.56923
+2.46187 2.56974
+2.22942 3.27248
+7.14933 8.06682
+2.3236 2.95462
+4.18028 4.80535
+4.981 5.54215
+7.23261 7.34863
+4.96309 6.06396
+4.24402 4.44364
+0.917707 1.32687
+1.19806 1.65106
+3.7725 5.31412
+9.70021 9.84203
+5.99824 7.77474
+3.32636 3.84266
+8.59841 9.07653
+7.9916 9.14415
+0.786519 1.84655
+0.166394 1.47834
+2.87633 3.52808
+7.53804 9.56807
+6.14406 6.16189
+1.63428 3.96845
+1.10307 1.58897
+1.30032 2.85313
+7.89803 8.32723
+8.77593 8.90136
+1.68804 2.69447
+4.5956 4.6743
+7.39643 8.29839
+6.93629 7.82243
+6.10289 7.677
+1.83835 2.34295
+1.04506 1.91684
+8.95277 9.43817
+0.36153 0.643665
+1.02408 3.18963
+4.02972 4.40301
+2.80428 2.82552
+6.51718 6.64956
+0.185341 1.56607
+6.1658 7.59364
+4.09288 4.11687
+6.90205 7.16338
+5.0755 5.39478
+4.5614 4.83286
+5.8489 8.76295
+9.70079 10.0431
+8.44334 8.54714
+3.00139 3.66327
+5.34458 6.38895
+7.11481 7.96865
+4.66776 5.15678
+0.390138 0.53352
+2.01116 3.32839
+6.78761 6.97068
+4.57477 5.0724
+1.14098 1.36134
+7.4559 8.30327
+0.700932 2.40437
+1.90469 1.99046
+4.30064 5.11485
+7.84433 8.48543
+5.96212 7.49882
+3.93055 3.96317
+0.546327 1.04814
+8.96011 9.0404
+7.89255 8.06149
+0.669924 2.6944
+-0.00972314 0.837474
+6.07199 6.37467
+2.73659 3.19833
+5.9576 7.10966
+9.1316 9.14737
+5.26101 6.59184
+5.77697 8.08876
+0.68623 0.782805
+0.842619 1.39893
+5.82075 6.15957
+4.36394 4.88479
+7.1828 7.90107
+3.3331 4.39923
+6.54243 7.24966
+2.809 2.96491
+4.18514 4.61948
+4.95453 5.33929
+8.33288 9.52867
+9.05785 10.4276
+2.58917 4.74403
+1.34279 1.89014
+4.93626 5.75424
+7.75031 7.92788
+9.00904 9.02402
+3.91286 5.15124
+6.98486 7.34688
+-0.173169 0.415019
+0.652242 1.51556
+3.50184 5.30486
+3.72563 4.09022
+4.60463 6.58985
+3.34219 4.31833
+2.55445 2.58651
+6.14573 6.3669
+4.52336 6.37342
+9.37606 9.76836
+2.4198 3.36929
+2.89109 3.66974
+5.62463 6.05989
+0.674219 1.84165
+0.590017 1.71153
+1.54622 2.10277
+6.48003 6.55663
+3.56355 3.98573
+0.743671 1.87049
+3.27833 6.0722
+4.76267 6.9967
+2.80188 4.03037
+0.372694 0.482111
+5.73987 5.9529
+8.84732 9.49033
+0.833944 1.8157
+4.06126 4.36615
+0.884619 2.34622
+6.86723 6.99141
+8.07737 9.05193
+8.35903 9.00761
+8.84777 9.74001
+8.58058 9.05479
+8.28076 8.44566
+4.55155 5.65475
+2.44314 3.38966
+3.22172 4.50395
+7.1808 7.90376
+0.639636 1.72606
+5.46807 5.94322
+9.02146 9.87864
+-0.628472 0.655557
+4.29775 5.9553
+6.77525 7.38152
+6.51827 6.93542
+8.95252 9.52939
+0.755406 1.19973
+7.69455 7.86912
+0.170143 1.12949
+7.69254 8.08221
+2.08238 3.27051
+1.28662 1.78628
+1.21208 2.79391
+-0.155739 1.7071
+8.28833 9.10011
+5.77789 6.6954
+1.98395 2.35216
+5.77469 6.05177
+2.77565 5.81092
+-1.53416 2.30576
+6.93529 8.04506
+3.91553 4.55593
+5.57201 6.29071
+1.54149 1.86613
+4.09163 4.31234
+8.47834 11.1229
+5.70376 7.02981
+2.24683 3.79925
+5.4793 6.41036
+5.27644 6.81729
+0.13273 0.371437
+1.22959 1.41618
+0.551957 1.03276
+2.01269 2.4018
+8.77113 9.09395
+8.11753 8.46262
+0.39406 0.783705
+5.35964 5.48227
+7.24727 8.23233
+7.74525 8.85748
+0.0115736 0.882607
+1.78575 2.19684
+8.32514 9.0503
+3.11074 3.34975
+0.847464 2.13237
+0.310898 0.393528
+8.68841 10.518
+1.10032 1.83755
+2.42286 3.02554
+1.16364 2.80986
+1.46419 2.11421
+7.46021 7.90273
+6.86556 7.62542
+1.91466 3.79843
+3.1056 3.83969
+3.41591 4.26565
+0.285122 1.21372
+3.75441 5.52385
+1.07643 2.63403
+6.17341 7.67244
+9.13122 9.5132
+4.39696 6.15885
+3.7207 4.07729
+6.80782 7.1958
+6.65933 6.67105
+8.51535 8.7263
+5.98305 7.17759
+2.19609 2.46108
+8.21186 8.96908
+2.94729 3.60562
+3.31907 3.9297
+0.463492 0.626603
+2.62143 3.55089
+5.76898 6.79002
+1.45502 1.56525
+4.80797 5.62389
+5.87337 6.70588
+2.92765 3.50929
+0.412987 0.951057
+3.64594 4.40269
+-0.043401 0.502176
+4.54802 5.44613
+1.20218 1.8732
+2.75547 2.96745
+7.10348 7.7945
+9.74845 9.98835
+4.83718 6.4836
+2.30563 2.5903
+4.74016 6.30789
+6.42192 6.93329
+5.37294 6.73938
+2.4365 3.05787
+1.08283 3.79193
+4.90426 5.93563
+3.8874 4.83301
+0.13909 0.983027
+4.07407 5.61421
+8.62875 10.6851
+8.10233 8.29952
+2.23047 2.4691
+7.34617 7.39475
+1.66309 2.3032
+7.11207 10.0686
+4.52412 6.38666
+2.48323 2.96878
+7.47877 8.86547
+2.67607 4.33436
+6.83659 8.21075
+2.87313 3.39011
+2.81911 4.07729
+0.227877 0.657898
+6.57843 7.14311
+-0.591405 1.56925
+7.08018 7.59
+9.09558 9.3923
+9.48544 9.79474
+0.740233 2.33129
+8.51111 11.134
+7.79219 8.0281
+1.73821 1.89316
+9.21077 9.29488
+5.38354 6.46025
+4.30403 4.5472
+0.0893758 0.919238
+7.94464 8.51053
+5.27119 6.3741
+5.22476 6.00588
diff --git a/geom_bottleneck/tests/data/ws_tests/test_5_A b/geom_bottleneck/tests/data/ws_tests/test_5_A
new file mode 100644
index 0000000..51cff1c
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_5_A
@@ -0,0 +1,5 @@
+7.50638 7.78005
+0.991758 2.12178
+5.18481 6.61702
+6.14703 7.08581
+4.09936 4.83024
diff --git a/geom_bottleneck/tests/data/ws_tests/test_5_A.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_5_A.pd.dipha
new file mode 100644
index 0000000..be84441
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_5_A.pd.dipha
Binary files differ
diff --git a/geom_bottleneck/tests/data/ws_tests/test_5_B b/geom_bottleneck/tests/data/ws_tests/test_5_B
new file mode 100644
index 0000000..be62ed3
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_5_B
@@ -0,0 +1,5 @@
+5.8232 6.36308
+2.16066 2.48668
+2.38754 4.91418
+4.77403 5.43982
+0.291412 1.11147
diff --git a/geom_bottleneck/tests/data/ws_tests/test_5_B.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_5_B.pd.dipha
new file mode 100644
index 0000000..14ca67c
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_5_B.pd.dipha
Binary files differ
diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag1_A b/geom_bottleneck/tests/data/ws_tests/test_diag1_A
new file mode 100644
index 0000000..f7f90ff
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_diag1_A
@@ -0,0 +1 @@
+1.0 1.0
diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag1_A.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_diag1_A.pd.dipha
new file mode 100644
index 0000000..fa4a4d9
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_diag1_A.pd.dipha
Binary files differ
diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag1_B b/geom_bottleneck/tests/data/ws_tests/test_diag1_B
new file mode 100644
index 0000000..a167a4f
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_diag1_B
@@ -0,0 +1 @@
+5.0 5.0
diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag1_B.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_diag1_B.pd.dipha
new file mode 100644
index 0000000..621a55f
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_diag1_B.pd.dipha
Binary files differ
diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag2_A b/geom_bottleneck/tests/data/ws_tests/test_diag2_A
new file mode 100644
index 0000000..a167a4f
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_diag2_A
@@ -0,0 +1 @@
+5.0 5.0
diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag2_A.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_diag2_A.pd.dipha
new file mode 100644
index 0000000..621a55f
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_diag2_A.pd.dipha
Binary files differ
diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag2_B b/geom_bottleneck/tests/data/ws_tests/test_diag2_B
new file mode 100644
index 0000000..a167a4f
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_diag2_B
@@ -0,0 +1 @@
+5.0 5.0
diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag2_B.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_diag2_B.pd.dipha
new file mode 100644
index 0000000..621a55f
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_diag2_B.pd.dipha
Binary files differ
diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag3_A b/geom_bottleneck/tests/data/ws_tests/test_diag3_A
new file mode 100644
index 0000000..151d4b1
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_diag3_A
@@ -0,0 +1,220 @@
+1.391781911475341 1.391781911475341
+1.395142124726278 1.395142124726278
+1.514181227875788 1.514181227875788
+1.528291566797427 1.528291566797427
+1.585389310674157 1.585389310674157
+1.629232116709072 1.629232116709072
+1.641428662445941 1.641428662445941
+1.646998748860116 1.646998748860116
+1.652915988616469 1.652915988616469
+1.69199679556404 1.69199679556404
+1.705727462482595 1.705727462482595
+1.706819293048617 1.706819293048617
+1.720175733750729 1.720175733750729
+1.728031840308488 1.728031840308488
+1.73797421040929 1.73797421040929
+1.739519744204842 1.739519744204842
+1.76132425248022 1.76132425248022
+1.767766952966369 1.767766952966369
+1.792444271021371 1.792444271021371
+1.831487552809192 1.831487552809192
+1.837086616049901 1.837086616049901
+1.851186504948943 1.851186504948943
+1.860502132730509 1.860502132730509
+1.8619433117852 1.8619433117852
+1.878229072834972 1.878229072834972
+1.880655074837347 1.880655074837347
+1.883647832802556 1.883647832802556
+1.884127769927503 1.884127769927503
+1.892969784466709 1.892969784466709
+1.916936460787894 1.916936460787894
+1.931545068229315 1.931545068229315
+1.937626522143119 1.937626522143119
+1.942267721488891 1.942267721488891
+1.963295334827521 1.963295334827521
+1.975655395743736 1.975655395743736
+1.981448090925679 1.981448090925679
+1.986220565173897 1.986220565173897
+1.98709020812351 1.98709020812351
+1.989420269013254 1.989420269013254
+2.007874648480185 2.007874648480185
+2.012179388983059 2.012179388983059
+2.019051972834053 2.019051972834053
+2.023278848058142 2.023278848058142
+2.026190677562545 2.026190677562545
+2.041594763633561 2.041594763633561
+2.042508934597344 2.042508934597344
+2.04305394648524 2.04305394648524
+2.052514683218775 2.052514683218775
+2.059038785694094 2.059038785694094
+2.062577320792516 2.062577320792516
+2.063488177732052 2.063488177732052
+2.067806664626417 2.067806664626417
+2.073013782498534 2.073013782498534
+2.08646120854976 2.08646120854976
+2.098476357223667 2.098476357223667
+2.101378199886176 2.101378199886176
+2.101927506425904 2.101927506425904
+2.12671744783454 2.12671744783454
+2.143966150630584 2.143966150630584
+2.145312642688415 2.145312642688415
+2.148704396208969 2.148704396208969
+2.153092682531471 2.153092682531471
+2.157553654759374 2.157553654759374
+2.176659075756566 2.176659075756566
+2.177260578806816 2.177260578806816
+2.179141269427014 2.179141269427014
+2.201895416482074 2.201895416482074
+2.202563945779844 2.202563945779844
+2.205113735193028 2.205113735193028
+2.207345865351049 2.207345865351049
+2.208922099676958 2.208922099676958
+2.218057898922937 2.218057898922937
+2.228610453267036 2.228610453267036
+2.241314066596301 2.241314066596301
+2.242145210071643 2.242145210071643
+2.253976266568437 2.253976266568437
+2.255324860119305 2.255324860119305
+2.271300972641221 2.271300972641221
+2.279438361991067 2.279438361991067
+2.286592331830957 2.286592331830957
+2.287159411646074 2.287159411646074
+2.296653147995115 2.296653147995115
+2.301754785182811 2.301754785182811
+2.30409930499031 2.30409930499031
+2.32141477565108 2.32141477565108
+2.347789281926012 2.347789281926012
+2.347827987256373 2.347827987256373
+2.349391321950732 2.349391321950732
+2.350129292983257 2.350129292983257
+2.358679083392328 2.358679083392328
+2.372845273125388 2.372845273125388
+2.385040766846267 2.385040766846267
+2.42114588843816 2.42114588843816
+2.425116524931602 2.425116524931602
+2.426518521893022 2.426518521893022
+2.43211651886311 2.43211651886311
+2.441302771998711 2.441302771998711
+2.446429340510857 2.446429340510857
+2.446547553904861 2.446547553904861
+2.45764765793376 2.45764765793376
+2.461222149682938 2.461222149682938
+2.467900747394114 2.467900747394114
+2.473214152160872 2.473214152160872
+2.5 2.5
+2.503557913626332 2.503557913626332
+2.504315621146863 2.504315621146863
+2.515634290122204 2.515634290122204
+2.516231935083851 2.516231935083851
+2.517558892374071 2.517558892374071
+2.526325773757754 2.526325773757754
+2.531164001388939 2.531164001388939
+2.53128061055404 2.53128061055404
+2.539387277827314 2.539387277827314
+2.540864599180268 2.540864599180268
+2.548084457784768 2.548084457784768
+2.548923292215475 2.548923292215475
+2.551730202825644 2.551730202825644
+2.553178578801818 2.553178578801818
+2.560295747947446 2.560295747947446
+2.566321603108612 2.566321603108612
+2.568932286976676 2.568932286976676
+2.574887688783916 2.574887688783916
+2.581809142325336 2.581809142325336
+2.584541960262555 2.584541960262555
+2.585511915815223 2.585511915815223
+2.592970592044868 2.592970592044868
+2.596055336381078 2.596055336381078
+2.598560573626668 2.598560573626668
+2.614019084614256 2.614019084614256
+2.618463725327216 2.618463725327216
+2.622883674481145 2.622883674481145
+2.627791161528314 2.627791161528314
+2.63535653879261 2.63535653879261
+2.654825898255443 2.654825898255443
+2.660423271276714 2.660423271276714
+2.667148030102869 2.667148030102869
+2.67012591760915 2.67012591760915
+2.698712599567882 2.698712599567882
+2.72180967799905 2.72180967799905
+2.732466204434637 2.732466204434637
+2.734187392905275 2.734187392905275
+2.737296308103857 2.737296308103857
+2.745724923243991 2.745724923243991
+2.749541709159369 2.749541709159369
+2.752925621447035 2.752925621447035
+2.754183973113479 2.754183973113479
+2.763972022430258 2.763972022430258
+2.766941997926879 2.766941997926879
+2.773850925522978 2.773850925522978
+2.777506755238121 2.777506755238121
+2.780333194223143 2.780333194223143
+2.783060349483276 2.783060349483276
+2.78679029681548 2.78679029681548
+2.786792895521339 2.786792895521339
+2.795170825459034 2.795170825459034
+2.801104989227437 2.801104989227437
+2.80525433080833 2.80525433080833
+2.805376738133109 2.805376738133109
+2.806844454092663 2.806844454092663
+2.811611818684648 2.811611818684648
+2.811994908451803 2.811994908451803
+2.816002798930236 2.816002798930236
+2.816814002472584 2.816814002472584
+2.818569391261086 2.818569391261086
+2.821660827076439 2.821660827076439
+2.822317588351085 2.822317588351085
+2.824910409962511 2.824910409962511
+2.829322097471409 2.829322097471409
+2.833852169620359 2.833852169620359
+2.839287537694811 2.839287537694811
+2.841714730677953 2.841714730677953
+2.841715058318205 2.841715058318205
+2.851653306950001 2.851653306950001
+2.853639002902003 2.853639002902003
+2.85515962291442 2.85515962291442
+2.855333736885793 2.855333736885793
+2.872540314564304 2.872540314564304
+2.879449214478037 2.879449214478037
+2.881003856158217 2.881003856158217
+2.881074731438092 2.881074731438092
+2.893589165559115 2.893589165559115
+2.898664743213686 2.898664743213686
+2.90387832180792 2.90387832180792
+2.919095859678745 2.919095859678745
+2.924945175440496 2.924945175440496
+2.931795145696962 2.931795145696962
+2.932285006979528 2.932285006979528
+2.934606807227626 2.934606807227626
+2.936392671567475 2.936392671567475
+2.953794710898493 2.953794710898493
+2.958055395706548 2.958055395706548
+2.960407744013656 2.960407744013656
+2.960759715914242 2.960759715914242
+2.969702548922556 2.969702548922556
+2.970149844982665 2.970149844982665
+2.978953970679893 2.978953970679893
+2.979075864664287 2.979075864664287
+2.984665519558418 2.984665519558418
+3.04548240149063 3.04548240149063
+3.050688336416719 3.050688336416719
+3.05773927378742 3.05773927378742
+3.059596740753369 3.059596740753369
+3.059762479996741 3.059762479996741
+3.088543279751235 3.088543279751235
+3.093580813520995 3.093580813520995
+3.104787362108069 3.104787362108069
+3.173380191779681 3.173380191779681
+3.583124637167399 3.583124637167399
+3.630658112409034 3.630658112409034
+3.631421639368965 3.631421639368965
+3.751087101339956 3.751087101339956
+3.800845709568037 3.800845709568037
+3.846558940956666 3.846558940956666
+4 4
+4 4
+4.076238038291317 4.076238038291317
+4.455547086147983 4.455547086147983
+5.356087357608394 5.356087357608394
+5.54364842773721 5.54364842773721
+7.587654388717225 7.587654388717225
diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag3_A.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_diag3_A.pd.dipha
new file mode 100644
index 0000000..0dbfb89
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_diag3_A.pd.dipha
Binary files differ
diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag3_B b/geom_bottleneck/tests/data/ws_tests/test_diag3_B
new file mode 100644
index 0000000..bb8655a
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_diag3_B
@@ -0,0 +1,193 @@
+1.167089173446239 1.167089173446239
+1.256234452640111 1.256234452640111
+1.303693422257498 1.303693422257498
+1.413255970488646 1.413255970488646
+1.697910382446573 1.697910382446573
+1.718844728805093 1.718844728805093
+1.734124820632724 1.734124820632724
+1.749572938304276 1.749572938304276
+1.770320424526358 1.770320424526358
+1.786344763036807 1.786344763036807
+1.810054737907635 1.810054737907635
+1.815127306170105 1.815127306170105
+1.837806648681218 1.837806648681218
+1.870552189043019 1.870552189043019
+1.897240351979503 1.897240351979503
+1.935562152643027 1.935562152643027
+1.952562418976663 1.952562418976663
+1.959552126104175 1.959552126104175
+1.979899732318601 1.979899732318601
+2.00044500769347 2.00044500769347
+2.028951227523087 2.028951227523087
+2.037678749316724 2.037678749316724
+2.047911420446857 2.047911420446857
+2.075181804515723 2.075181804515723
+2.077245386452578 2.077245386452578
+2.084751316684838 2.084751316684838
+2.084860886126203 2.084860886126203
+2.103286477421968 2.103286477421968
+2.106856827309345 2.106856827309345
+2.113139266068691 2.113139266068691
+2.114594962503455 2.114594962503455
+2.115917727493158 2.115917727493158
+2.122335878797089 2.122335878797089
+2.127359082726206 2.127359082726206
+2.131673381033273 2.131673381033273
+2.155015793320908 2.155015793320908
+2.162480684365264 2.162480684365264
+2.195207236194009 2.195207236194009
+2.203279931784429 2.203279931784429
+2.205567995563669 2.205567995563669
+2.212933962936773 2.212933962936773
+2.215081271089993 2.215081271089993
+2.225989037578865 2.225989037578865
+2.24218929203347 2.24218929203347
+2.246321319993257 2.246321319993257
+2.280059407166517 2.280059407166517
+2.284117669032543 2.284117669032543
+2.293233992770926 2.293233992770926
+2.298815356955373 2.298815356955373
+2.300542634724628 2.300542634724628
+2.326408290042679 2.326408290042679
+2.328797162040625 2.328797162040625
+2.36025798094028 2.36025798094028
+2.365031313604634 2.365031313604634
+2.372266311053883 2.372266311053883
+2.400053902049271 2.400053902049271
+2.409134054334209 2.409134054334209
+2.411368235895246 2.411368235895246
+2.415934766378347 2.415934766378347
+2.420989857074179 2.420989857074179
+2.422520269961376 2.422520269961376
+2.43377629944218 2.43377629944218
+2.449308615746858 2.449308615746858
+2.452936540056068 2.452936540056068
+2.453698388060092 2.453698388060092
+2.454711357943602 2.454711357943602
+2.459202673400056 2.459202673400056
+2.493778305287384 2.493778305287384
+2.537394117473177 2.537394117473177
+2.544674753106669 2.544674753106669
+2.558904304820755 2.558904304820755
+2.563089994365716 2.563089994365716
+2.565476194422898 2.565476194422898
+2.599756049189921 2.599756049189921
+2.603619661709009 2.603619661709009
+2.609775379385211 2.609775379385211
+2.622552038976658 2.622552038976658
+2.623798471910885 2.623798471910885
+2.635711198661633 2.635711198661633
+2.644229304223612 2.644229304223612
+2.661919064427223 2.661919064427223
+2.666783921498494 2.666783921498494
+2.675503310152301 2.675503310152301
+2.684228699964661 2.684228699964661
+2.696854617267681 2.696854617267681
+2.700538654666735 2.700538654666735
+2.744886611436907 2.744886611436907
+2.748618547996708 2.748618547996708
+2.757981496641135 2.757981496641135
+2.774766825791652 2.774766825791652
+2.784491736143893 2.784491736143893
+2.796482184304273 2.796482184304273
+2.800849254751463 2.800849254751463
+2.816963410000067 2.816963410000067
+2.825207379914743 2.825207379914743
+2.831286409028398 2.831286409028398
+2.844827082550712 2.844827082550712
+2.853558438121966 2.853558438121966
+2.859806035663089 2.859806035663089
+2.878956033959891 2.878956033959891
+2.886422825109222 2.886422825109222
+2.891566924618832 2.891566924618832
+2.892028419188578 2.892028419188578
+2.893138900330932 2.893138900330932
+2.894250936382814 2.894250936382814
+2.90112201577666 2.90112201577666
+2.902172795370005 2.902172795370005
+2.90967533504119 2.90967533504119
+2.919687125962211 2.919687125962211
+2.923711238894001 2.923711238894001
+2.929041907338841 2.929041907338841
+2.938734873084349 2.938734873084349
+2.939642428979572 2.939642428979572
+2.943010909640486 2.943010909640486
+2.944210926048103 2.944210926048103
+2.951091358234723 2.951091358234723
+2.953950275008233 2.953950275008233
+2.966943157369611 2.966943157369611
+2.982522008227535 2.982522008227535
+2.992174049247434 2.992174049247434
+2.993098995839607 2.993098995839607
+2.995311055519335 2.995311055519335
+2.996708164866609 2.996708164866609
+2.999922110096644 2.999922110096644
+3 3
+3.000364533251431 3.000364533251431
+3.003840990677832 3.003840990677832
+3.006672301312824 3.006672301312824
+3.016489409140306 3.016489409140306
+3.021123787004333 3.021123787004333
+3.039117818612596 3.039117818612596
+3.039555193616473 3.039555193616473
+3.049952247267922 3.049952247267922
+3.057673482371216 3.057673482371216
+3.06920083507411 3.06920083507411
+3.075505231082782 3.075505231082782
+3.079038628197304 3.079038628197304
+3.084265889701239 3.084265889701239
+3.086837468106297 3.086837468106297
+3.103873984398081 3.103873984398081
+3.11528125482979 3.11528125482979
+3.119720021802376 3.119720021802376
+3.132543753577128 3.132543753577128
+3.141822873359038 3.141822873359038
+3.143502053175705 3.143502053175705
+3.153232877003746 3.153232877003746
+3.157586960809866 3.157586960809866
+3.157966892275408 3.157966892275408
+3.163583225161638 3.163583225161638
+3.178188125342772 3.178188125342772
+3.178475867931057 3.178475867931057
+3.179372297765929 3.179372297765929
+3.186437137237586 3.186437137237586
+3.188053957464282 3.188053957464282
+3.199351610026191 3.199351610026191
+3.204566427513051 3.204566427513051
+3.22885278850648 3.22885278850648
+3.229088648916556 3.229088648916556
+3.236685523936269 3.236685523936269
+3.239854786600373 3.239854786600373
+3.255809161351669 3.255809161351669
+3.287718056143732 3.287718056143732
+3.294038308299402 3.294038308299402
+3.313688277153076 3.313688277153076
+3.325783245946608 3.325783245946608
+3.331072954808429 3.331072954808429
+3.354962852285211 3.354962852285211
+3.357502741262644 3.357502741262644
+3.373668509804576 3.373668509804576
+3.408653045775418 3.408653045775418
+3.416281541503763 3.416281541503763
+3.443144279972986 3.443144279972986
+3.492970564191033 3.492970564191033
+3.493767805580122 3.493767805580122
+3.559084134799019 3.559084134799019
+3.559898699300211 3.559898699300211
+3.833585501974904 3.833585501974904
+4.099502076836052 4.099502076836052
+4.484082147277348 4.484082147277348
+4.505718324707756 4.505718324707756
+4.891723119528026 4.891723119528026
+5.065300494905414 5.065300494905414
+5.188599238535201 5.188599238535201
+5.36134479630535 5.36134479630535
+5.609786508140671 5.609786508140671
+7.08640314680382 7.08640314680382
+7.113765883549079 7.113765883549079
+7.328944131981744 7.328944131981744
+7.63625182217108 7.63625182217108
+7.716743341311718 7.716743341311718
+7.938093404092351 7.938093404092351
+8.112783377863046 8.112783377863046
+8.131485096731454 8.131485096731454
diff --git a/geom_bottleneck/tests/data/ws_tests/test_diag3_B.pd.dipha b/geom_bottleneck/tests/data/ws_tests/test_diag3_B.pd.dipha
new file mode 100644
index 0000000..3fbfd90
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_diag3_B.pd.dipha
Binary files differ
diff --git a/geom_bottleneck/tests/data/ws_tests/test_list.txt b/geom_bottleneck/tests/data/ws_tests/test_list.txt
new file mode 100644
index 0000000..27340d8
--- /dev/null
+++ b/geom_bottleneck/tests/data/ws_tests/test_list.txt
@@ -0,0 +1,21 @@
+test_5_A test_5_B 1.0 -1.0 4.320655
+test_5_A test_5_B 2.0 -1.0 1.7323016335246
+test_5_A test_5_B 3.0 -1.0 1.396199948
+test_5_A test_5_B 1.0 1.0 6.603006
+test_5_A test_5_B 2.0 1.0 2.73426775794691
+test_5_A test_5_B 3.0 1.0 2.13072755216204
+test_5_A test_5_B 1.0 2.0 5.1888795679967
+test_5_A test_5_B 2.0 2.0 2.26649677575857
+test_5_A test_5_B 3.0 2.0 1.86434961396614
+test_100_A test_100_B 1.0 -1.0 27.5573259
+test_100_A test_100_B 2.0 -1.0 3.38004972483238
+test_100_A test_100_B 3.0 -1.0 1.9045814702967
+test_100_A test_100_B 1.0 1.0 40.4375855
+test_100_A test_100_B 2.0 1.0 4.75252460986668
+test_100_A test_100_B 3.0 1.0 2.556594741819
+test_100_A test_100_B 1.0 2.0 31.7187555735287
+test_100_A test_100_B 2.0 2.0 3.81132239777023
+test_100_A test_100_B 3.0 2.0 2.09695346034248
+test_diag1_A test_diag1_B 1.0 -1.0 0.0
+test_diag2_A test_diag2_B 1.0 -1.0 0.0
+test_diag3_A test_diag3_B 1.0 -1.0 0.0
diff --git a/geom_bottleneck/tests/test_hera_bottleneck.cpp b/geom_bottleneck/tests/test_hera_bottleneck.cpp
new file mode 100644
index 0000000..f22e415
--- /dev/null
+++ b/geom_bottleneck/tests/test_hera_bottleneck.cpp
@@ -0,0 +1,611 @@
+#include "catch/catch.hpp"
+
+#include <sstream>
+#include <iostream>
+
+#include "bottleneck.h"
+
+using PairVector = std::vector<std::pair<double, double>>;
+using PairVectorF = std::vector<std::pair<float, float>>;
+
+std::vector<std::string> split_on_delim(const std::string& s, char delim)
+{
+ std::stringstream ss(s);
+ std::string token;
+ std::vector<std::string> tokens;
+ while(std::getline(ss, token, delim)) {
+ tokens.push_back(token);
+ }
+ return tokens;
+}
+
+
+// single row in a file with test cases
+struct TestFromFileCase {
+
+ std::string file_1;
+ std::string file_2;
+ double delta;
+ double answer;
+ std::vector<std::pair<int, int>> longest_edges;
+ double internal_p { hera::get_infinity<double>() };
+
+ TestFromFileCase(const std::string& s)
+ {
+ auto tokens = split_on_delim(s, ' ');
+// assert(tokens.size() > 5);
+ assert(tokens.size() % 2 == 0);
+
+ size_t token_idx = 0;
+ file_1 = tokens.at(token_idx++);
+ file_2 = tokens.at(token_idx++);
+ delta = std::stod(tokens.at(token_idx++));
+ answer = std::stod(tokens.at(token_idx++));
+ while(token_idx < tokens.size() - 1) {
+ int v1 = std::stoi(tokens[token_idx++]);
+ int v2 = std::stoi(tokens[token_idx++]);
+ longest_edges.emplace_back(v1, v2);
+ }
+ }
+};
+
+std::ostream& operator<<(std::ostream& out, const TestFromFileCase& s)
+{
+ out << "[" << s.file_1 << ", " << s.file_2 << ", norm = ";
+ if (s.internal_p != hera::get_infinity()) {
+ out << s.internal_p;
+ } else {
+ out << "infinity";
+ }
+ out << ", answer = " << s.answer << ", edges { ";
+ for(auto e : s.longest_edges) {
+ out << e.first << " <-> " << e.second << ", ";
+ }
+ out << "} ]";
+ return out;
+}
+
+
+TEST_CASE("simple cases", "bottleneckDistApprox")
+{
+ PairVector diagram_A, diagram_B;
+ double delta = 0.01;
+ //double internal_p = hera::get_infinity<double>();
+
+ SECTION("trivial: two empty diagrams") {
+ REQUIRE( 0.0 == hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta));
+ }
+
+ SECTION("trivial: one empty diagram, one single-point diagram") {
+
+ diagram_A.emplace_back(1.0, 2.0);
+
+ double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ REQUIRE( fabs(d1 - 0.5) <= 0.00000000001 );
+
+ double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta);
+ REQUIRE( fabs(d2 - 0.5) <= 0.00000000001 );
+ }
+
+ SECTION("trivial: two single-point diagrams-1") {
+
+ diagram_A.emplace_back(10.0, 20.0); // (5, 5)
+ diagram_B.emplace_back(13.0, 19.0); // (3, 3)
+
+ double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta);
+ double correct_answer = 3.0;
+ REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer);
+ REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer);
+ }
+
+ SECTION("trivial: two single-point diagrams-2") {
+
+ diagram_A.emplace_back(10.0, 20.0); // (5, 5)
+ diagram_B.emplace_back(130.0, 138.0); // (4, 4)
+
+ double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta);
+ double correct_answer = 5.0;
+ REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer );
+ REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer );
+
+ }
+
+}
+
+TEST_CASE("float version", "check_template")
+{
+ PairVectorF diagram_A, diagram_B;
+ float delta = 0.01;
+ //float internal_p = hera::get_infinity<double>();
+
+ SECTION("trivial: two empty diagrams") {
+ REQUIRE( 0.0 == hera::bottleneckDistApprox<PairVectorF>(diagram_A, diagram_B, delta));
+ REQUIRE( 0.0 == hera::bottleneckDistExact<PairVectorF>(diagram_A, diagram_B));
+ }
+
+ SECTION("trivial: two single-point diagrams-2") {
+
+ diagram_A.emplace_back(10, 20); // (5, 5)
+ diagram_B.emplace_back(130, 138); // (4, 4)
+
+ float d1 = hera::bottleneckDistApprox<PairVectorF>(diagram_A, diagram_B, delta);
+ float d2 = hera::bottleneckDistApprox<PairVectorF>(diagram_B, diagram_A, delta);
+ float d3 = hera::bottleneckDistExact<PairVectorF>(diagram_B, diagram_A);
+ float correct_answer = 5;
+ REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer );
+ REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer );
+
+ }
+
+}
+
+
+TEST_CASE("infinity points", "bottleneckDistApprox")
+{
+ PairVector diagram_A, diagram_B;
+ double delta = 0.01;
+
+ // do not use Hera's infinity! it is -1
+ double inf = std::numeric_limits<double>::infinity();
+
+ SECTION("two points at infinity, no finite points") {
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double corr_answer = 1.0;
+ REQUIRE( fabs(d - corr_answer) <= delta * corr_answer);
+ }
+
+ SECTION("two points at infinity") {
+
+ // edge cost 3.0
+ diagram_A.emplace_back(10.0, 20.0); // (5, 5)
+ diagram_B.emplace_back(13.0, 19.0); // (3, 3)
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double corr_answer = 3.0;
+ REQUIRE( fabs(d - corr_answer) <= delta * corr_answer);
+ }
+
+ SECTION("three points at infinity, no finite points") {
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double corr_answer = inf;
+ REQUIRE( d == corr_answer );
+ }
+
+ SECTION("three points at infinity") {
+
+ // edge cost 3.0
+ diagram_A.emplace_back(10.0, 20.0); // (5, 5)
+ diagram_B.emplace_back(13.0, 19.0); // (3, 3)
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, inf);
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double corr_answer = inf;
+ REQUIRE( d == corr_answer );
+ }
+
+
+ SECTION("all four corners at infinity, no finite points, finite answer") {
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, -inf);
+ diagram_B.emplace_back(2.0, -inf);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(inf, 1.0);
+ diagram_B.emplace_back(inf, 2.0);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(-inf, 1.0);
+ diagram_B.emplace_back(-inf, 2.0);
+
+ double d = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double corr_answer = 1.0;
+
+ REQUIRE( d == corr_answer );
+ }
+
+ SECTION("all four corners at infinity, no finite points, infinite answer-1") {
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, inf);
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, -inf);
+ diagram_B.emplace_back(2.0, -inf);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(inf, 1.0);
+ diagram_B.emplace_back(inf, 2.0);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(-inf, 1.0);
+ diagram_B.emplace_back(-inf, 2.0);
+
+ double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta);
+ double corr_answer = inf;
+
+ REQUIRE( d1 == corr_answer );
+ REQUIRE( d2 == corr_answer );
+ }
+
+ SECTION("all four corners at infinity, no finite points, infinite answer-2") {
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, -inf);
+ diagram_B.emplace_back(2.0, -inf);
+ diagram_B.emplace_back(2.0, -inf);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(inf, 1.0);
+ diagram_B.emplace_back(inf, 2.0);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(-inf, 1.0);
+ diagram_B.emplace_back(-inf, 2.0);
+
+ double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta);
+ double corr_answer = inf;
+
+ REQUIRE( d1 == corr_answer );
+ REQUIRE( d2 == corr_answer );
+ }
+
+ SECTION("all four corners at infinity, no finite points, infinite answer-3") {
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, -inf);
+ diagram_B.emplace_back(2.0, -inf);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(inf, 1.0);
+ diagram_A.emplace_back(inf, 1.0);
+ diagram_B.emplace_back(inf, 2.0);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(-inf, 1.0);
+ diagram_B.emplace_back(-inf, 2.0);
+
+ double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta);
+ double corr_answer = inf;
+
+ REQUIRE( d1 == corr_answer );
+ REQUIRE( d2 == corr_answer );
+ }
+
+ SECTION("all four corners at infinity, no finite points, infinite answer-4") {
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(1.0, -inf);
+ diagram_B.emplace_back(2.0, -inf);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(inf, 1.0);
+ diagram_B.emplace_back(inf, 2.0);
+
+ // edge cost 1.0
+ diagram_A.emplace_back(-inf, 1.0);
+ diagram_B.emplace_back(-inf, 2.0);
+ diagram_B.emplace_back(-inf, 2.0);
+
+ double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta);
+ double corr_answer = inf;
+
+ REQUIRE( d1 == corr_answer );
+ REQUIRE( d2 == corr_answer );
+ }
+
+ SECTION("all four corners at infinity, with finite points, infinite answer-1") {
+
+ diagram_A.emplace_back(1.0, inf);
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ diagram_A.emplace_back(1.0, -inf);
+ diagram_B.emplace_back(2.0, -inf);
+
+ diagram_A.emplace_back(inf, 1.0);
+ diagram_B.emplace_back(inf, 2.0);
+
+ diagram_A.emplace_back(-inf, 1.0);
+ diagram_B.emplace_back(-inf, 2.0);
+
+ // finite edge
+ diagram_A.emplace_back(10.0, 20.0);
+ diagram_B.emplace_back(13.0, 19.0);
+
+ double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta);
+ double corr_answer = inf;
+
+ REQUIRE( d1 == corr_answer );
+ REQUIRE( d2 == corr_answer );
+ }
+
+ SECTION("all four corners at infinity, with finite points, infinite answer-2") {
+
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ diagram_A.emplace_back(1.0, -inf);
+ diagram_B.emplace_back(2.0, -inf);
+ diagram_B.emplace_back(2.0, -inf);
+
+ diagram_A.emplace_back(inf, 1.0);
+ diagram_B.emplace_back(inf, 2.0);
+
+ diagram_A.emplace_back(-inf, 1.0);
+ diagram_B.emplace_back(-inf, 2.0);
+
+ // finite edge
+ diagram_A.emplace_back(10.0, 20.0);
+ diagram_B.emplace_back(13.0, 19.0);
+
+ double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta);
+ double corr_answer = inf;
+
+ REQUIRE( d1 == corr_answer );
+ REQUIRE( d2 == corr_answer );
+ }
+
+ SECTION("all four corners at infinity, with finite points, infinite answer-3") {
+
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ diagram_A.emplace_back(1.0, -inf);
+ diagram_B.emplace_back(2.0, -inf);
+
+ diagram_A.emplace_back(inf, 1.0);
+ diagram_A.emplace_back(inf, 1.0);
+ diagram_B.emplace_back(inf, 2.0);
+
+ diagram_A.emplace_back(-inf, 1.0);
+ diagram_B.emplace_back(-inf, 2.0);
+
+ // finite edge
+ diagram_A.emplace_back(10.0, 20.0);
+ diagram_B.emplace_back(13.0, 19.0);
+
+ double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta);
+ double corr_answer = inf;
+
+ REQUIRE( d1 == corr_answer );
+ REQUIRE( d2 == corr_answer );
+ }
+
+ SECTION("all four corners at infinity, no finite points, infinite answer-4") {
+
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ diagram_A.emplace_back(1.0, -inf);
+ diagram_B.emplace_back(2.0, -inf);
+
+ diagram_A.emplace_back(inf, 1.0);
+ diagram_B.emplace_back(inf, 2.0);
+
+ diagram_A.emplace_back(-inf, 1.0);
+ diagram_B.emplace_back(-inf, 2.0);
+ diagram_B.emplace_back(-inf, 2.0);
+
+ // finite edge
+ diagram_A.emplace_back(10.0, 20.0);
+ diagram_B.emplace_back(13.0, 19.0);
+
+ double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+ double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta);
+ double corr_answer = inf;
+
+ REQUIRE( d1 == corr_answer );
+ REQUIRE( d2 == corr_answer );
+ }
+
+
+ SECTION("simple small example with finite answer") {
+ diagram_A.emplace_back(1.0, inf);
+ diagram_B.emplace_back(2.0, inf);
+
+ diagram_A.emplace_back(1.9, inf);
+ diagram_B.emplace_back(1.1, inf);
+
+ // 1.1 - 1.0 + 2.0 - 1.9 = 0.2
+
+ diagram_A.emplace_back(inf, 1.0);
+ diagram_B.emplace_back(inf, 2.0);
+
+ diagram_A.emplace_back(inf, 1.9);
+ diagram_B.emplace_back(inf, 1.1);
+
+
+ // finite edge
+ diagram_A.emplace_back(10.0, 20.0);
+ diagram_B.emplace_back(13.0, 19.0);
+
+ double d1 = hera::bottleneckDistExact<>(diagram_A, diagram_B);
+ double d2 = hera::bottleneckDistExact<>(diagram_B, diagram_A);
+ double corr_answer = 3.0;
+
+ REQUIRE( d1 == corr_answer );
+ REQUIRE( d2 == corr_answer );
+
+
+ }
+
+}
+
+TEST_CASE("longest edge", "bottleneckDistApprox")
+{
+ PairVector diagram_A, diagram_B;
+ hera::bt::MatchingEdge<double> longest_edge_1;
+ hera::bt::MatchingEdge<double> longest_edge_2;
+ double delta = 0.01;
+
+ SECTION("trivial: two empty diagrams") {
+ // should not fail
+ REQUIRE( 0.0 == hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta, longest_edge_1, true));
+ }
+
+ SECTION("trivial: one empty diagram, one single-point diagram") {
+
+ diagram_A.emplace_back(1.0, 2.0);
+
+ double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta, longest_edge_1, true);
+ REQUIRE(longest_edge_1.first.getRealX() == 1.0);
+ REQUIRE(longest_edge_1.first.getRealY() == 2.0);
+
+ double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta, longest_edge_2, true);
+ REQUIRE(longest_edge_2.second.getRealX() == 1.0);
+ REQUIRE(longest_edge_2.second.getRealY() == 2.0);
+ }
+
+ SECTION("trivial: two single-point diagrams-1") {
+
+ diagram_A.emplace_back(10.0, 20.0);
+ diagram_B.emplace_back(11.0, 19.0);
+
+ double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta, longest_edge_1, true);
+
+ REQUIRE(longest_edge_1.first.getRealX() == 10.0);
+ REQUIRE(longest_edge_1.first.getRealY() == 20.0);
+
+ REQUIRE(longest_edge_1.second.getRealX() == 11.0);
+ REQUIRE(longest_edge_1.second.getRealY() == 19.0);
+
+// double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta, longest_edge_2, true);
+// REQUIRE(longest_edge_2.second.getRealX() == 1.0);
+// REQUIRE(longest_edge_2.second.getRealY() == 2.0);
+// double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+// double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta);
+// double correct_answer = 3.0;
+// REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer);
+// REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer);
+ }
+//
+// SECTION("trivial: two single-point diagrams-2") {
+//
+// diagram_A.emplace_back(10.0, 20.0); // (5, 5)
+// diagram_B.emplace_back(130.0, 138.0); // (4, 4)
+//
+// double d1 = hera::bottleneckDistApprox<>(diagram_A, diagram_B, delta);
+// double d2 = hera::bottleneckDistApprox<>(diagram_B, diagram_A, delta);
+// double correct_answer = 5.0;
+// REQUIRE( fabs(d1 - correct_answer) <= delta * correct_answer );
+// REQUIRE( fabs(d2 - correct_answer) <= delta * correct_answer );
+//
+// }
+
+}
+
+TEST_CASE("file cases", "bottleneck_dist")
+{
+ PairVector diagram_A, diagram_B;
+ hera::bt::MatchingEdge<double> longest_edge;
+
+ const char* file_name = "../tests/data/test_list.txt";
+ std::string dir_prefix = "../tests/data/";
+ std::ifstream f;
+ f.open(file_name);
+ std::vector<TestFromFileCase> test_params;
+ std::string s;
+ while (std::getline(f, s)) {
+ test_params.emplace_back(s);
+ //std::cout << "read test params " << test_params.back() << std::endl;
+ }
+
+ SECTION("from file:") {
+
+ for (const auto& ts : test_params) {
+ bool read_file_A = hera::readDiagramPointSet(dir_prefix + ts.file_1, diagram_A);
+ bool read_file_B = hera::readDiagramPointSet(dir_prefix + ts.file_2, diagram_B);
+ REQUIRE(read_file_A);
+ REQUIRE(read_file_B);
+
+ double hera_answer = hera::bottleneckDistApprox(diagram_A, diagram_B, ts.delta, longest_edge, true);
+ std::pair<int, int> hera_le { longest_edge.first.get_user_id(), longest_edge.second.get_user_id() };
+
+ REQUIRE((hera_answer == ts.answer or fabs(hera_answer - ts.answer) <= ts.delta * hera_answer));
+ REQUIRE((ts.longest_edges.empty() or
+ std::find(ts.longest_edges.begin(), ts.longest_edges.end(), hera_le) != ts.longest_edges.end()));
+
+ double hera_answer_exact = hera::bottleneckDistExact(diagram_A, diagram_B, 14, longest_edge, true);
+ std::pair<int, int> hera_le_exact { longest_edge.first.get_user_id(), longest_edge.second.get_user_id() };
+
+ REQUIRE((hera_answer_exact == ts.answer or
+ fabs(hera_answer_exact - ts.answer) <= 0.0001 * ts.answer));
+
+ REQUIRE((ts.longest_edges.empty() or
+ std::find(ts.longest_edges.begin(), ts.longest_edges.end(), hera_le_exact) !=
+ ts.longest_edges.end()));
+
+ // check that longest_edge length matches the bottleneck distance
+
+ double hera_le_cost;
+ bool check_longest_edge_cost = true;
+ if (longest_edge.first.get_user_id() >= 0 and longest_edge.second.get_user_id() < 0) {
+ // longest edge: off-diagonal point of A connected to its diagonal projection
+ hera_le_cost = longest_edge.first.get_persistence(ts.internal_p);
+ } else if (longest_edge.first.get_user_id() < 0 and longest_edge.second.get_user_id() >= 0) {
+ // longest edge: off-diagonal point of B connected to its diagonal projection
+ hera_le_cost = longest_edge.second.get_persistence(ts.internal_p);
+ } else if (longest_edge.first.get_user_id() >= 0 and longest_edge.second.get_user_id() >= 0) {
+ // longest edge connects two off-diagonal points of A and B
+ hera_le_cost = hera::bt::dist_l_inf_slow(longest_edge.first, longest_edge.second);
+ } else {
+ check_longest_edge_cost = false;
+ }
+// if (check_longest_edge_cost and hera_le_cost != hera_answer_exact) {
+// std::cout << "PROBLEM HERE: " << ts << ", longest edge " << longest_edge.first << " - "
+// << longest_edge.second << ", hera_le_cost " << hera_le_cost << ", answwer "
+// << hera_answer_exact << std::endl;
+// }
+ REQUIRE( (not check_longest_edge_cost or fabs(hera_le_cost - hera_answer_exact) < 0.0001 * hera_answer_exact) );
+ std::cout << ts << " PASSED " << std::endl;
+ }
+ }
+
+}
diff --git a/geom_bottleneck/tests/tests_main.cpp b/geom_bottleneck/tests/tests_main.cpp
new file mode 100644
index 0000000..d24407e
--- /dev/null
+++ b/geom_bottleneck/tests/tests_main.cpp
@@ -0,0 +1,3 @@
+#define LOG_AUCTION
+#define CATCH_CONFIG_MAIN
+#include "catch/catch.hpp"
diff --git a/geom_matching/wasserstein/CMakeLists.txt b/geom_matching/wasserstein/CMakeLists.txt
index fe5fd73..53da46b 100644
--- a/geom_matching/wasserstein/CMakeLists.txt
+++ b/geom_matching/wasserstein/CMakeLists.txt
@@ -46,20 +46,20 @@ file(GLOB WS_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h ${CMAKE_CURRENT_SOU
find_package (Threads)
set (libraries ${libraries} ${CMAKE_THREAD_LIBS_INIT})
-add_executable(wasserstein_dist ${CMAKE_CURRENT_SOURCE_DIR}/example/wasserstein_dist.cpp ${WS_HEADERS})
+add_executable(wasserstein_dist ${CMAKE_CURRENT_SOURCE_DIR}/example/wasserstein_dist.cpp ${WS_HEADERS} include/hera_infinity.h)
target_link_libraries(wasserstein_dist PUBLIC ${libraries})
-add_executable(wasserstein_dist_dipha ${CMAKE_CURRENT_SOURCE_DIR}/example/wasserstein_dist_dipha.cpp ${WS_HEADERS})
+add_executable(wasserstein_dist_dipha ${CMAKE_CURRENT_SOURCE_DIR}/example/wasserstein_dist_dipha.cpp ${WS_HEADERS} include/hera_infinity.h)
target_link_libraries(wasserstein_dist_dipha PUBLIC ${libraries})
add_executable(wasserstein_dist_finitize_dipha ${CMAKE_CURRENT_SOURCE_DIR}/example/wasserstein_dist_finitize_dipha.cpp ${WS_HEADERS})
target_link_libraries(wasserstein_dist_finitize_dipha PUBLIC ${libraries})
# pure geometric version, arbitrary dimension
-add_executable(wasserstein_dist_point_cloud ${CMAKE_CURRENT_SOURCE_DIR}/example/wasserstein_dist_point_cloud.cpp ${WS_HEADERS})
+add_executable(wasserstein_dist_point_cloud ${CMAKE_CURRENT_SOURCE_DIR}/example/wasserstein_dist_point_cloud.cpp ${WS_HEADERS} include/hera_infinity.h)
target_link_libraries(wasserstein_dist_point_cloud PUBLIC ${libraries})
# Tests
-add_executable(wasserstein_test ${CMAKE_CURRENT_SOURCE_DIR}/tests/tests_main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_hera_wasserstein.cpp)
+add_executable(wasserstein_test ${CMAKE_CURRENT_SOURCE_DIR}/tests/tests_main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_hera_wasserstein.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_hera_wasserstein_pure_geom.cpp include/hera_infinity.h tests/tests_reader.h)
#add_executable(wasserstein_test EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/tests/test_hera_wasserstein.cpp)
target_link_libraries(wasserstein_test PUBLIC ${libraries})
diff --git a/geom_matching/wasserstein/example/wasserstein_dist_point_cloud.cpp b/geom_matching/wasserstein/example/wasserstein_dist_point_cloud.cpp
index 6f699a4..2f9718e 100644
--- a/geom_matching/wasserstein/example/wasserstein_dist_point_cloud.cpp
+++ b/geom_matching/wasserstein/example/wasserstein_dist_point_cloud.cpp
@@ -35,6 +35,7 @@ derivative works thereof, in binary and source code form.
int main(int argc, char* argv[])
{
+
//{
//int n_points = 3;
//int dim = 3;
@@ -106,7 +107,6 @@ int main(int argc, char* argv[])
params.dim = dimension_A;
-
params.wasserstein_power = (4 <= argc) ? atof(argv[3]) : 1.0;
if (params.wasserstein_power < 1.0) {
std::cerr << "The third argument (wasserstein_degree) was \"" << argv[3] << "\", must be a number >= 1.0. Cannot proceed. " << std::endl;
diff --git a/geom_matching/wasserstein/include/auction_oracle_kdtree_pure_geom.hpp b/geom_matching/wasserstein/include/auction_oracle_kdtree_pure_geom.hpp
index a6bdf10..eaf54cf 100644
--- a/geom_matching/wasserstein/include/auction_oracle_kdtree_pure_geom.hpp
+++ b/geom_matching/wasserstein/include/auction_oracle_kdtree_pure_geom.hpp
@@ -111,11 +111,9 @@ AuctionOracleKDTreePureGeom<Real_, PointContainer_>::get_optimal_bid_debug(IdxTy
Real best_item_value = std::numeric_limits<Real>::max();
Real second_best_item_value = std::numeric_limits<Real>::max();
- for(IdxType item_idx = 0; item_idx < this->items.size(); ++item_idx) {
+ for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) {
auto item = this->items[item_idx];
- if (item.type != bidder.type and item_idx != bidder_idx)
- continue;
- auto item_value = std::pow(dist_lp(bidder, item, this->internal_p), this->wasserstein_power, this->dim) + this->prices[item_idx];
+ auto item_value = std::pow(traits.distance(bidder, item), this->wasserstein_power) + this->prices[item_idx];
if (item_value < best_item_value) {
best_item_value = item_value;
best_item_idx = item_idx;
@@ -126,11 +124,10 @@ AuctionOracleKDTreePureGeom<Real_, PointContainer_>::get_optimal_bid_debug(IdxTy
for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) {
auto item = this->items[item_idx];
- if (item.type != bidder.type and item_idx != bidder_idx)
- continue;
if (item_idx == best_item_idx)
continue;
- auto item_value = std::pow(dist_lp(bidder, item, this->internal_p), this->wasserstein_power, this->dim) + this->prices[item_idx];
+
+ auto item_value = std::pow(traits.distance(bidder, item), this->wasserstein_power) + this->prices[item_idx];
if (item_value < second_best_item_value) {
second_best_item_value = item_value;
second_best_item_idx = item_idx;
@@ -166,6 +163,12 @@ IdxValPair<Real_> AuctionOracleKDTreePureGeom<Real_, PointContainer_>::get_optim
result.first = best_item_idx;
result.second = ( second_best_item_value - best_item_value ) + this->prices[best_item_idx] + this->epsilon;
+#ifdef DEBUG_KDTREE_RESTR_ORACLE
+ auto bid_debug = get_optimal_bid_debug(bidder_idx);
+ assert(fabs(bid_debug.best_item_value - best_item_value) < 0.000000001);
+ assert(fabs(bid_debug.second_best_item_value - second_best_item_value) < 0.000000001);
+#endif
+
return result;
}
diff --git a/geom_matching/wasserstein/include/auction_oracle_kdtree_restricted.hpp b/geom_matching/wasserstein/include/auction_oracle_kdtree_restricted.hpp
index 0e6f780..3c3cba3 100644
--- a/geom_matching/wasserstein/include/auction_oracle_kdtree_restricted.hpp
+++ b/geom_matching/wasserstein/include/auction_oracle_kdtree_restricted.hpp
@@ -243,11 +243,11 @@ AuctionOracleKDTreeRestricted<Real_, PointContainer_>::get_optimal_bid_debug(Idx
Real best_item_value = std::numeric_limits<Real>::max();
Real second_best_item_value = std::numeric_limits<Real>::max();
- for(IdxType item_idx = 0; item_idx < this->items.size(); ++item_idx) {
+ for(IdxType item_idx = 0; item_idx < static_cast<IdxType>(this->items.size()); ++item_idx) {
auto item = this->items[item_idx];
if (item.type != bidder.type and item_idx != bidder_idx)
continue;
- auto item_value = std::pow(dist_lp(bidder, item, this->internal_p), this->wasserstein_power) + this->prices[item_idx];
+ auto item_value = std::pow(dist_lp(bidder, item, this->internal_p, 2), this->wasserstein_power) + this->prices[item_idx];
if (item_value < best_item_value) {
best_item_value = item_value;
best_item_idx = item_idx;
@@ -258,11 +258,11 @@ AuctionOracleKDTreeRestricted<Real_, PointContainer_>::get_optimal_bid_debug(Idx
for(size_t item_idx = 0; item_idx < this->items.size(); ++item_idx) {
auto item = this->items[item_idx];
- if (item.type != bidder.type and item_idx != bidder_idx)
+ if (item.type != bidder.type and static_cast<IdxType>(item_idx) != bidder_idx)
continue;
if (item_idx == best_item_idx)
continue;
- auto item_value = std::pow(dist_lp(bidder, item, this->internal_p), this->wasserstein_power) + this->prices[item_idx];
+ auto item_value = std::pow(dist_lp(bidder, item, this->internal_p, 2), this->wasserstein_power) + this->prices[item_idx];
if (item_value < second_best_item_value) {
second_best_item_value = item_value;
second_best_item_idx = item_idx;
diff --git a/geom_matching/wasserstein/include/auction_runner_gs.hpp b/geom_matching/wasserstein/include/auction_runner_gs.hpp
index d9f419d..141cb2c 100644
--- a/geom_matching/wasserstein/include/auction_runner_gs.hpp
+++ b/geom_matching/wasserstein/include/auction_runner_gs.hpp
@@ -244,6 +244,12 @@ void AuctionRunnerGS<R, AO, PC>::run_auction_phases(const int max_num_phases, co
flush_assignment();
run_auction_phase();
Real current_result = getDistanceToQthPowerInternal();
+// Real current_result_1 = 0.0;
+// for(size_t i = 0; i < num_bidders; ++i) {
+// current_result_1 += oracle.traits.distance(bidders[i], items[bidders_to_items[i]]);
+// }
+// current_result = current_result_1;
+// assert(fabs(current_result - current_result_1) < 0.001);
Real denominator = current_result - num_bidders * oracle.get_epsilon();
current_result = pow(current_result, 1.0 / wasserstein_power);
#ifdef LOG_AUCTION
@@ -259,6 +265,7 @@ void AuctionRunnerGS<R, AO, PC>::run_auction_phases(const int max_num_phases, co
denominator = pow(denominator, 1.0 / wasserstein_power);
Real numerator = current_result - denominator;
relative_error = numerator / denominator;
+ // spdlog::get("console")->info("relative error = {} / {} = {}, result = {}", numerator, denominator, relative_error, current_result);
#ifdef LOG_AUCTION
console_logger->info("error = {0} / {1} = {2}",
numerator, denominator, relative_error);
@@ -280,6 +287,7 @@ void AuctionRunnerGS<R, AO, PC>::run_auction()
if (num_bidders == 1) {
assign_item_to_bidder(0, 0);
wasserstein_cost = get_item_bidder_cost(0,0);
+ is_distance_computed = true;
return;
}
@@ -319,7 +327,7 @@ void AuctionRunnerGS<R, AO, PC>::run_auction_phase()
#ifdef DEBUG_AUCTION
for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) {
- if ( bidders_to_items[bidder_idx] < 0 or bidders_to_items[bidder_idx] >= num_bidders) {
+ if ( bidders_to_items[bidder_idx] < 0 or bidders_to_items[bidder_idx] >= (IdxType)num_bidders) {
std::cerr << "After auction terminated bidder " << bidder_idx;
std::cerr << " has no items assigned" << std::endl;
throw std::runtime_error("Auction did not give a perfect matching");
@@ -333,8 +341,7 @@ template<class R, class AO, class PC>
R AuctionRunnerGS<R, AO, PC>::get_item_bidder_cost(const size_t item_idx, const size_t bidder_idx, const bool tolerate_invalid_idx) const
{
if (item_idx != k_invalid_index and bidder_idx != k_invalid_index) {
- return std::pow(dist_lp(bidders[bidder_idx], items[item_idx], internal_p, dimension),
- wasserstein_power);
+ return std::pow(dist_lp(bidders[bidder_idx], items[item_idx], internal_p, dimension), wasserstein_power);
} else {
if (tolerate_invalid_idx)
return R(0.0);
@@ -416,7 +423,7 @@ void AuctionRunnerGS<R, AO, PC>::sanity_check()
}
for(size_t bidder_idx = 0; bidder_idx < num_bidders; ++bidder_idx) {
- assert( bidders_to_items[bidder_idx] == k_invalid_index or ( bidders_to_items[bidder_idx] < num_items and bidders_to_items[bidder_idx] >= 0));
+ assert( bidders_to_items[bidder_idx] == k_invalid_index or ( bidders_to_items[bidder_idx] < (IdxType)num_items and bidders_to_items[bidder_idx] >= 0));
if ( bidders_to_items[bidder_idx] != k_invalid_index) {
@@ -440,7 +447,7 @@ void AuctionRunnerGS<R, AO, PC>::sanity_check()
}
for(IdxType item_idx = 0; item_idx < static_cast<IdxType>(num_bidders); ++item_idx) {
- assert( items_to_bidders[item_idx] == k_invalid_index or ( items_to_bidders[item_idx] < num_items and items_to_bidders[item_idx] >= 0));
+ assert( items_to_bidders[item_idx] == k_invalid_index or ( items_to_bidders[item_idx] < static_cast<IdxType>(num_items) and items_to_bidders[item_idx] >= 0));
if ( items_to_bidders.at(item_idx) != k_invalid_index) {
// check for uniqueness
diff --git a/geom_matching/wasserstein/include/auction_runner_jac.hpp b/geom_matching/wasserstein/include/auction_runner_jac.hpp
index 8663bae..e623f4a 100644
--- a/geom_matching/wasserstein/include/auction_runner_jac.hpp
+++ b/geom_matching/wasserstein/include/auction_runner_jac.hpp
@@ -42,7 +42,6 @@ derivative works thereof, in binary and source code form.
#undef DEBUG_AUCTION
#endif
-
namespace hera {
namespace ws {
@@ -350,6 +349,8 @@ namespace ws {
typename AuctionRunnerJac<R, AO, PC>::Real
AuctionRunnerJac<R, AO, PC>::get_relative_error(const bool debug_output) const
{
+ if (partial_cost == 0.0 and unassigned_bidders.empty())
+ return 0.0;
Real result;
#ifndef WASSERSTEIN_PURE_GEOM
Real gamma = get_gamma();
@@ -558,9 +559,10 @@ namespace ws {
if (num_bidders == 1) {
assign_item_to_bidder(0, 0);
wasserstein_cost = get_item_bidder_cost(0,0);
+ is_distance_computed = true;
return;
}
- double init_eps = (initial_epsilon > 0.0) ? initial_epsilon : oracle.max_val_ / 4.0;
+ R init_eps = (initial_epsilon > 0.0) ? initial_epsilon : oracle.max_val_ / 4.0;
run_auction_phases(max_num_phases, init_eps);
is_distance_computed = true;
wasserstein_cost = partial_cost;
@@ -703,7 +705,11 @@ namespace ws {
template<class R, class AO, class PC>
bool AuctionRunnerJac<R, AO, PC>::continue_auction_phase() const
{
+#ifdef WASSERSTEIN_PURE_GEOM
+ return not unassigned_bidders.empty();
+#else
return not unassigned_bidders.empty() and not is_done();
+#endif
}
template<class R, class AO, class PC>
diff --git a/geom_matching/wasserstein/include/basic_defs_ws.h b/geom_matching/wasserstein/include/basic_defs_ws.h
index 58d6fd2..1c5928f 100644
--- a/geom_matching/wasserstein/include/basic_defs_ws.h
+++ b/geom_matching/wasserstein/include/basic_defs_ws.h
@@ -51,6 +51,7 @@ derivative works thereof, in binary and source code form.
#include "spdlog/fmt/ostr.h"
#endif
+#include "hera_infinity.h"
#include "dnn/geometry/euclidean-dynamic.h"
#include "def_debug_ws.h"
@@ -59,20 +60,20 @@ derivative works thereof, in binary and source code form.
namespace hera
{
-template<class Real = double>
-bool is_infinity(const Real& x)
-{
- return x == Real(-1);
-};
+//template<class Real = double>
+//inline bool is_infinity(const Real& x)
+//{
+// return x == Real(-1);
+//};
+//
+//template<class Real = double>
+//inline Real get_infinity()
+//{
+// return Real( -1 );
+//}
template<class Real = double>
-Real get_infinity()
-{
- return Real( -1 );
-}
-
-template<class Real = double>
-bool is_p_valid_norm(const Real& p)
+inline bool is_p_valid_norm(const Real& p)
{
return is_infinity<Real>(p) or p >= Real(1);
}
@@ -101,10 +102,8 @@ namespace ws
template<class Real = double>
using IdxValPair = std::pair<IdxType, Real>;
-
-
template<class R>
- std::ostream& operator<<(std::ostream& output, const IdxValPair<R> p)
+ inline std::ostream& operator<<(std::ostream& output, const IdxValPair<R> p)
{
output << fmt::format("({0}, {1})", p.first, p.second);
return output;
@@ -112,7 +111,7 @@ namespace ws
enum class OwnerType { k_none, k_normal, k_diagonal };
- std::ostream& operator<<(std::ostream& s, const OwnerType t)
+ inline std::ostream& operator<<(std::ostream& s, const OwnerType t)
{
switch(t)
{
@@ -210,11 +209,11 @@ namespace ws
#ifndef FOR_R_TDA
template <class Real = double>
- std::ostream& operator<<(std::ostream& output, const DiagramPoint<Real> p);
+ inline std::ostream& operator<<(std::ostream& output, const DiagramPoint<Real> p);
#endif
template<class Real>
- void format_arg(fmt::BasicFormatter<char> &f, const char *&format_str, const DiagramPoint<Real>&p) {
+ inline void format_arg(fmt::BasicFormatter<char> &f, const char *&format_str, const DiagramPoint<Real>&p) {
if (p.is_diagonal()) {
f.writer().write("({0},{1}, DIAG)", p.x, p.y);
} else {
@@ -269,14 +268,14 @@ namespace ws
};
template<class R, class Pt>
- R dist_lp(const Pt& a, const Pt& b, const R p, const int dim)
+ inline R dist_lp(const Pt& a, const Pt& b, const R p, const int dim)
{
return DistImpl<R, Pt>()(a, b, p, dim);
}
// TODO
template<class Real, typename DiagPointContainer>
- double getFurthestDistance3Approx(DiagPointContainer& A, DiagPointContainer& B, const Real p)
+ inline double getFurthestDistance3Approx(DiagPointContainer& A, DiagPointContainer& B, const Real p)
{
int dim = 2;
Real result { 0.0 };
@@ -297,7 +296,7 @@ namespace ws
}
template<class Real>
- Real getFurthestDistance3Approx_pg(const hera::ws::dnn::DynamicPointVector<Real>& A, const hera::ws::dnn::DynamicPointVector<Real>& B, const Real p, const int dim)
+ inline Real getFurthestDistance3Approx_pg(const hera::ws::dnn::DynamicPointVector<Real>& A, const hera::ws::dnn::DynamicPointVector<Real>& B, const Real p, const int dim)
{
Real result { 0.0 };
int opt_b_idx = 0;
@@ -317,13 +316,13 @@ namespace ws
template<class Container>
- std::string format_container_to_log(const Container& cont);
+ inline std::string format_container_to_log(const Container& cont);
template<class Real, class IndexContainer>
- std::string format_point_set_to_log(const IndexContainer& indices, const std::vector<DiagramPoint<Real>>& points);
+ inline std::string format_point_set_to_log(const IndexContainer& indices, const std::vector<DiagramPoint<Real>>& points);
template<class T>
- std::string format_int(T i);
+ inline std::string format_int(T i);
} // ws
} // hera
diff --git a/geom_matching/wasserstein/include/basic_defs_ws.hpp b/geom_matching/wasserstein/include/basic_defs_ws.hpp
index 1750b4e..a1153af 100644
--- a/geom_matching/wasserstein/include/basic_defs_ws.hpp
+++ b/geom_matching/wasserstein/include/basic_defs_ws.hpp
@@ -64,7 +64,7 @@ bool Point<Real>::operator!=(const Point<Real>& other) const
#ifndef FOR_R_TDA
template <class Real>
-std::ostream& operator<<(std::ostream& output, const Point<Real> p)
+inline std::ostream& operator<<(std::ostream& output, const Point<Real> p)
{
output << "(" << p.x << ", " << p.y << ")";
return output;
@@ -72,20 +72,20 @@ std::ostream& operator<<(std::ostream& output, const Point<Real> p)
#endif
template <class Real>
-Real sqr_dist(const Point<Real>& a, const Point<Real>& b)
+inline Real sqr_dist(const Point<Real>& a, const Point<Real>& b)
{
return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
template <class Real>
-Real dist(const Point<Real>& a, const Point<Real>& b)
+inline Real dist(const Point<Real>& a, const Point<Real>& b)
{
return sqrt(sqr_dist(a, b));
}
template <class Real>
-Real DiagramPoint<Real>::persistence_lp(const Real p) const
+inline Real DiagramPoint<Real>::persistence_lp(const Real p) const
{
if (is_diagonal())
return 0.0;
@@ -100,7 +100,7 @@ Real DiagramPoint<Real>::persistence_lp(const Real p) const
#ifndef FOR_R_TDA
template <class Real>
-std::ostream& operator<<(std::ostream& output, const DiagramPoint<Real> p)
+inline std::ostream& operator<<(std::ostream& output, const DiagramPoint<Real> p)
{
if ( p.type == DiagramPoint<Real>::DIAG ) {
output << "(" << p.x << ", " << p.y << ", " << 0.5 * (p.x + p.y) << " DIAG )";
@@ -142,7 +142,7 @@ Real DiagramPoint<Real>::getRealY() const
}
template<class Container>
-std::string format_container_to_log(const Container& cont)
+inline std::string format_container_to_log(const Container& cont)
{
std::stringstream result;
result << "[";
@@ -157,7 +157,7 @@ std::string format_container_to_log(const Container& cont)
}
template<class Container>
-std::string format_pair_container_to_log(const Container& cont)
+inline std::string format_pair_container_to_log(const Container& cont)
{
std::stringstream result;
result << "[";
@@ -173,7 +173,7 @@ std::string format_pair_container_to_log(const Container& cont)
template<class Real, class IndexContainer>
-std::string format_point_set_to_log(const IndexContainer& indices,
+inline std::string format_point_set_to_log(const IndexContainer& indices,
const std::vector<DiagramPoint<Real>>& points)
{
std::stringstream result;
@@ -189,7 +189,7 @@ std::string format_point_set_to_log(const IndexContainer& indices,
}
template<class T>
-std::string format_int(T i)
+inline std::string format_int(T i)
{
std::stringstream ss;
ss.imbue(std::locale(""));
diff --git a/geom_matching/wasserstein/include/diagonal_heap.h b/geom_matching/wasserstein/include/diagonal_heap.h
index 9ffee70..3b3c8bc 100644
--- a/geom_matching/wasserstein/include/diagonal_heap.h
+++ b/geom_matching/wasserstein/include/diagonal_heap.h
@@ -129,7 +129,7 @@ using LossesHeapOld = IdxValHeap<Real, CompPairsBySecondLexStruct<Real>>;
#endif
template <class Real>
-std::string losses_heap_to_string(const LossesHeapOld<Real>& h)
+inline std::string losses_heap_to_string(const LossesHeapOld<Real>& h)
{
std::stringstream result;
result << "[";
diff --git a/geom_matching/wasserstein/include/diagram_reader.h b/geom_matching/wasserstein/include/diagram_reader.h
index 55228b4..4b24f78 100644
--- a/geom_matching/wasserstein/include/diagram_reader.h
+++ b/geom_matching/wasserstein/include/diagram_reader.h
@@ -55,31 +55,31 @@ namespace hera {
// cannot choose stod, stof or stold based on RealType,
// lazy solution: partial specialization
template<class RealType = double>
-RealType parse_real_from_str(const std::string& s);
+inline RealType parse_real_from_str(const std::string& s);
template <>
-double parse_real_from_str<double>(const std::string& s)
+inline double parse_real_from_str<double>(const std::string& s)
{
return std::stod(s);
}
template <>
-long double parse_real_from_str<long double>(const std::string& s)
+inline long double parse_real_from_str<long double>(const std::string& s)
{
return std::stold(s);
}
template <>
-float parse_real_from_str<float>(const std::string& s)
+inline float parse_real_from_str<float>(const std::string& s)
{
return std::stof(s);
}
template<class RealType>
-RealType parse_real_from_str(const std::string& s)
+inline RealType parse_real_from_str(const std::string& s)
{
static_assert(sizeof(RealType) != sizeof(RealType), "Must be specialized for each type you want to use, see above");
}
@@ -90,7 +90,7 @@ RealType parse_real_from_str(const std::string& s)
// decPrecision is the maximal decimal precision in the input,
// it is zero if all coordinates in the input are integers
template<class RealType = double, class ContType_ = std::vector<std::pair<RealType, RealType>>>
-bool read_diagram_point_set(const char* fname, ContType_& result, int& decPrecision)
+inline bool read_diagram_point_set(const char* fname, ContType_& result, int& decPrecision)
{
size_t lineNumber { 0 };
result.clear();
@@ -182,7 +182,7 @@ bool read_diagram_point_set(const char* fname, ContType_& result, int& decPrecis
// wrappers
template<class RealType = double, class ContType_ = std::vector<std::pair<RealType, RealType>>>
-bool read_diagram_point_set(const std::string& fname, ContType_& result, int& decPrecision)
+inline bool read_diagram_point_set(const std::string& fname, ContType_& result, int& decPrecision)
{
return read_diagram_point_set<RealType, ContType_>(fname.c_str(), result, decPrecision);
}
@@ -190,21 +190,21 @@ bool read_diagram_point_set(const std::string& fname, ContType_& result, int& de
// these two functions are now just wrappers for the previous ones,
// in case someone needs them; decPrecision is ignored
template<class RealType = double, class ContType_ = std::vector<std::pair<RealType, RealType>>>
-bool read_diagram_point_set(const char* fname, ContType_& result)
+inline bool read_diagram_point_set(const char* fname, ContType_& result)
{
int decPrecision;
return read_diagram_point_set<RealType, ContType_>(fname, result, decPrecision);
}
template<class RealType = double, class ContType_ = std::vector<std::pair<RealType, RealType>>>
-bool read_diagram_point_set(const std::string& fname, ContType_& result)
+inline bool read_diagram_point_set(const std::string& fname, ContType_& result)
{
int decPrecision;
return read_diagram_point_set<RealType, ContType_>(fname.c_str(), result, decPrecision);
}
template<class RealType = double, class ContType_ = std::vector<std::pair<RealType, RealType> > >
-bool read_diagram_dipha(const std::string& fname, unsigned int dim, ContType_& result)
+inline bool read_diagram_dipha(const std::string& fname, unsigned int dim, ContType_& result)
{
std::ifstream file;
file.open(fname, std::ios::in | std::ios::binary);
@@ -274,7 +274,7 @@ bool read_diagram_dipha(const std::string& fname, unsigned int dim, ContType_& r
template<class RealType, class ContType>
-void remove_duplicates(ContType& dgm_A, ContType& dgm_B)
+inline void remove_duplicates(ContType& dgm_A, ContType& dgm_B)
{
std::map<std::pair<RealType, RealType>, int> map_A, map_B;
// copy points to maps
@@ -348,7 +348,7 @@ int finitize(RealType finitization, std::vector<std::pair<RealType, RealType> >&
#ifdef WASSERSTEIN_PURE_GEOM
template<class Real>
-int get_point_dimension(const std::string& line)
+inline int get_point_dimension(const std::string& line)
{
Real x;
int dim = 0;
@@ -361,7 +361,7 @@ int get_point_dimension(const std::string& line)
template<class RealType = double >
-bool read_point_cloud(const char* fname, hera::ws::dnn::DynamicPointVector<RealType>& result, int& dimension, int& decPrecision)
+inline bool read_point_cloud(const char* fname, hera::ws::dnn::DynamicPointVector<RealType>& result, int& dimension, int& decPrecision)
{
using DynamicPointTraitsR = typename hera::ws::dnn::DynamicPointTraits<RealType>;
@@ -443,20 +443,20 @@ bool read_point_cloud(const char* fname, hera::ws::dnn::DynamicPointVector<RealT
// wrappers
template<class RealType = double >
-bool read_point_cloud(const char* fname, hera::ws::dnn::DynamicPointVector<RealType>& result, int& dimension)
+inline bool read_point_cloud(const char* fname, hera::ws::dnn::DynamicPointVector<RealType>& result, int& dimension)
{
int dec_precision;
return read_point_cloud<RealType>(fname, result, dimension, dec_precision);
}
template<class RealType = double >
-bool read_point_cloud(std::string fname, hera::ws::dnn::DynamicPointVector<RealType>& result, int& dimension, int& dec_precision)
+inline bool read_point_cloud(std::string fname, hera::ws::dnn::DynamicPointVector<RealType>& result, int& dimension, int& dec_precision)
{
return read_point_cloud<RealType>(fname.c_str(), result, dimension, dec_precision);
}
template<class RealType = double >
-bool read_point_cloud(std::string fname, hera::ws::dnn::DynamicPointVector<RealType>& result, int& dimension)
+inline bool read_point_cloud(std::string fname, hera::ws::dnn::DynamicPointVector<RealType>& result, int& dimension)
{
return read_point_cloud<RealType>(fname.c_str(), result, dimension);
}
diff --git a/geom_matching/wasserstein/include/dnn/geometry/euclidean-dynamic.h b/geom_matching/wasserstein/include/dnn/geometry/euclidean-dynamic.h
index 4b98309..b003906 100644
--- a/geom_matching/wasserstein/include/dnn/geometry/euclidean-dynamic.h
+++ b/geom_matching/wasserstein/include/dnn/geometry/euclidean-dynamic.h
@@ -8,6 +8,8 @@
#include <boost/serialization/vector.hpp>
#include <cmath>
+#include "hera_infinity.h"
+
namespace hera
{
namespace ws
@@ -89,7 +91,27 @@ struct DynamicPointTraits
DynamicPointTraits(unsigned dim = 0):
dim_(dim) {}
- DistanceType distance(PointType p1, PointType p2) const { return sqrt(sq_distance(p1,p2)); }
+ DistanceType distance(PointType p1, PointType p2) const
+ {
+ Real result = 0.0;
+ if (hera::is_infinity(internal_p)) {
+ // max norm
+ for (unsigned i = 0; i < dimension(); ++i)
+ result = std::max(result, fabs(coordinate(p1,i) - coordinate(p2,i)));
+ } else if (internal_p == Real(1.0)) {
+ // l1-norm
+ for (unsigned i = 0; i < dimension(); ++i)
+ result += fabs(coordinate(p1,i) - coordinate(p2,i));
+ } else if (internal_p == Real(2.0)) {
+ result = sqrt(sq_distance(p1,p2));
+ } else {
+ assert(internal_p > 1.0);
+ for (unsigned i = 0; i < dimension(); ++i)
+ result += std::pow(fabs(coordinate(p1,i) - coordinate(p2,i)), internal_p);
+ result = std::pow(result, Real(1.0) / internal_p);
+ }
+ return result;
+ }
DistanceType distance(PointHandle p1, PointHandle p2) const { return distance(PointType({p1.p}), PointType({p2.p})); }
DistanceType sq_distance(PointType p1, PointType p2) const { Real res = 0; for (unsigned i = 0; i < dimension(); ++i) { Real c1 = coordinate(p1,i), c2 = coordinate(p2,i); res += (c1 - c2)*(c1 - c2); } return res; }
DistanceType sq_distance(PointHandle p1, PointHandle p2) const { return sq_distance(PointType({p1.p}), PointType({p2.p})); }
diff --git a/geom_matching/wasserstein/include/dnn/local/kd-tree.hpp b/geom_matching/wasserstein/include/dnn/local/kd-tree.hpp
index 3a4f0eb..bdeef45 100644
--- a/geom_matching/wasserstein/include/dnn/local/kd-tree.hpp
+++ b/geom_matching/wasserstein/include/dnn/local/kd-tree.hpp
@@ -101,7 +101,7 @@ hera::ws::dnn::KDTree<T>::OrderTree
size_t next_i = (i + 1) % traits.dimension();
// Replace with a size condition instead?
- if (b < m - 1) q.push(KDTreeNode(b, m, next_i));
+ if (m - b > 1) q.push(KDTreeNode(b, m, next_i));
if (e - m > 2) q.push(KDTreeNode(m+1, e, next_i));
}
}
diff --git a/geom_matching/wasserstein/include/hera_infinity.h b/geom_matching/wasserstein/include/hera_infinity.h
new file mode 100644
index 0000000..8d86dbb
--- /dev/null
+++ b/geom_matching/wasserstein/include/hera_infinity.h
@@ -0,0 +1,22 @@
+#ifndef WASSERSTEIN_HERA_INFINITY_H
+#define WASSERSTEIN_HERA_INFINITY_H
+
+// we cannot assume that template parameter Real will always provide infinity() value,
+// so value -1.0 is used to encode infinity (l_inf norm is used by default)
+
+namespace hera {
+
+ template<class Real = double>
+ inline bool is_infinity(const Real& x)
+ {
+ return x == Real(-1);
+ };
+
+ template<class Real = double>
+ inline constexpr Real get_infinity()
+ {
+ return Real(-1);
+ }
+}
+
+#endif //WASSERSTEIN_HERA_INFINITY_H
diff --git a/geom_matching/wasserstein/include/wasserstein.h b/geom_matching/wasserstein/include/wasserstein.h
index b90a545..a24bada 100644
--- a/geom_matching/wasserstein/include/wasserstein.h
+++ b/geom_matching/wasserstein/include/wasserstein.h
@@ -73,7 +73,7 @@ namespace ws
// compare as multisets
template<class PairContainer>
- bool are_equal(const PairContainer& dgm1, const PairContainer& dgm2)
+ inline bool are_equal(const PairContainer& dgm1, const PairContainer& dgm2)
{
if (dgm1.size() != dgm2.size()) {
return false;
@@ -97,7 +97,7 @@ namespace ws
// to handle points with one coordinate = infinity
template<class RealType>
- RealType get_one_dimensional_cost(std::vector<RealType>& set_A,
+ inline RealType get_one_dimensional_cost(std::vector<RealType>& set_A,
std::vector<RealType>& set_B,
const RealType wasserstein_power)
{
@@ -210,7 +210,7 @@ namespace ws
// this function assumes that all coordinates are finite
// points at infinity are processed in wasserstein_cost
template<class RealType>
- RealType wasserstein_cost_vec(const std::vector<DiagramPoint<RealType>>& A,
+ inline RealType wasserstein_cost_vec(const std::vector<DiagramPoint<RealType>>& A,
const std::vector<DiagramPoint<RealType>>& B,
const AuctionParams<RealType>& params,
const std::string& _log_filename_prefix)
@@ -245,7 +245,7 @@ namespace ws
template<class PairContainer>
-typename DiagramTraits<PairContainer>::RealType
+inline typename DiagramTraits<PairContainer>::RealType
wasserstein_cost(const PairContainer& A,
const PairContainer& B,
const AuctionParams< typename DiagramTraits<PairContainer>::RealType >& params,
@@ -332,9 +332,9 @@ wasserstein_cost(const PairContainer& A,
}
template<class PairContainer>
-typename DiagramTraits<PairContainer>::RealType
-wasserstein_dist(PairContainer& A,
- PairContainer& B,
+inline typename DiagramTraits<PairContainer>::RealType
+wasserstein_dist(const PairContainer& A,
+ const PairContainer& B,
const AuctionParams<typename DiagramTraits<PairContainer>::RealType> params,
const std::string& _log_filename_prefix = "")
{
diff --git a/geom_matching/wasserstein/include/wasserstein_pure_geom.hpp b/geom_matching/wasserstein/include/wasserstein_pure_geom.hpp
index 2a57599..096d95d 100644
--- a/geom_matching/wasserstein/include/wasserstein_pure_geom.hpp
+++ b/geom_matching/wasserstein/include/wasserstein_pure_geom.hpp
@@ -30,7 +30,7 @@ namespace ws
using AuctionRunnerJacR = typename hera::ws::AuctionRunnerJac<Real, hera::ws::AuctionOracleKDTreePureGeom<Real>, hera::ws::dnn::DynamicPointVector<Real>>;
-double wasserstein_cost(const DynamicPointVector<double>& set_A, const DynamicPointVector<double>& set_B, const AuctionParams<double>& params)
+inline double wasserstein_cost(const DynamicPointVector<double>& set_A, const DynamicPointVector<double>& set_B, const AuctionParams<double>& params)
{
if (params.wasserstein_power < 1.0) {
throw std::runtime_error("Bad q in Wasserstein " + std::to_string(params.wasserstein_power));
@@ -72,10 +72,9 @@ double wasserstein_cost(const DynamicPointVector<double>& set_A, const DynamicPo
auction.run_auction();
return auction.get_wasserstein_cost();
}
-
}
-double wasserstein_dist(const DynamicPointVector<double>& set_A, const DynamicPointVector<double>& set_B, const AuctionParams<double>& params)
+inline double wasserstein_dist(const DynamicPointVector<double>& set_A, const DynamicPointVector<double>& set_B, const AuctionParams<double>& params)
{
return std::pow(wasserstein_cost(set_A, set_B, params), 1.0 / params.wasserstein_power);
}
diff --git a/geom_matching/wasserstein/tests/test_hera_wasserstein.cpp b/geom_matching/wasserstein/tests/test_hera_wasserstein.cpp
index 3d5db5f..0a80d2f 100644
--- a/geom_matching/wasserstein/tests/test_hera_wasserstein.cpp
+++ b/geom_matching/wasserstein/tests/test_hera_wasserstein.cpp
@@ -8,61 +8,12 @@
#undef LOG_AUCTION
#include "wasserstein.h"
+#include "tests_reader.h"
+using namespace hera_test;
using PairVector = std::vector<std::pair<double, double>>;
-std::vector<std::string> split_on_delim(const std::string& s, char delim)
-{
- std::stringstream ss(s);
- std::string token;
- std::vector<std::string> tokens;
- while(std::getline(ss, token, delim)) {
- tokens.push_back(token);
- }
- return tokens;
-}
-
-
-// single row in a file with test cases
-struct TestFromFileCase {
-
- std::string file_1;
- std::string file_2;
- double q;
- double internal_p;
- double answer;
-
- TestFromFileCase(std::string s)
- {
- auto tokens = split_on_delim(s, ' ');
- assert(tokens.size() == 5);
-
- file_1 = tokens.at(0);
- file_2 = tokens.at(1);
- q = std::stod(tokens.at(2));
- internal_p = std::stod(tokens.at(3));
- answer = std::stod(tokens.at(4));
-
- if ( q < 1.0 or std::isinf(q) or
- (internal_p != hera::get_infinity<double>() and internal_p < 1.0)) {
- throw std::runtime_error("Bad line in test_list.txt");
- }
- }
-};
-
-std::ostream& operator<<(std::ostream& out, const TestFromFileCase& s)
-{
- out << "[" << s.file_1 << ", " << s.file_2 << ", q = " << s.q << ", norm = ";
- if (s.internal_p != hera::get_infinity()) {
- out << s.internal_p;
- } else {
- out << "infinity";
- }
- out << ", answer = " << s.answer << "]";
- return out;
-}
-
TEST_CASE("simple cases", "wasserstein_dist")
{
diff --git a/geom_matching/wasserstein/tests/test_hera_wasserstein_pure_geom.cpp b/geom_matching/wasserstein/tests/test_hera_wasserstein_pure_geom.cpp
new file mode 100644
index 0000000..9603ceb
--- /dev/null
+++ b/geom_matching/wasserstein/tests/test_hera_wasserstein_pure_geom.cpp
@@ -0,0 +1,111 @@
+#include "catch/catch.hpp"
+
+#include <sstream>
+#include <iostream>
+
+
+#undef LOG_AUCTION
+
+#include "wasserstein_pure_geom.hpp"
+#include "tests_reader.h"
+
+using namespace hera_test;
+
+TEST_CASE("simple point clouds", "wasserstein_dist_pure_geom")
+{
+// int n_points = 3;
+// int dim = 3;
+// using Traits = hera::ws::dnn::DynamicPointTraits<double>;
+// hera::ws::dnn::DynamicPointTraits<double> traits(dim);
+// hera::ws::dnn::DynamicPointVector<double> dgm_a = traits.container(n_points);
+// hera::ws::dnn::DynamicPointVector<double> dgm_b = traits.container(n_points);
+//
+// dgm_a[0][0] = 0.0;
+// dgm_a[0][1] = 0.0;
+// dgm_a[0][2] = 0.0;
+//
+// dgm_a[1][0] = 1.0;
+// dgm_a[1][1] = 0.0;
+// dgm_a[1][2] = 0.0;
+//
+// dgm_a[2][0] = 0.0;
+// dgm_a[2][1] = 1.0;
+// dgm_a[2][2] = 1.0;
+//
+// dgm_b[0][0] = 0.0;
+// dgm_b[0][1] = 0.1;
+// dgm_b[0][2] = 0.1;
+//
+// dgm_b[1][0] = 1.1;
+// dgm_b[1][1] = 0.0;
+// dgm_b[1][2] = 0.0;
+//
+// dgm_b[2][0] = 0.0;
+// dgm_b[2][1] = 1.1;
+// dgm_b[2][2] = 0.9;
+
+ const int dim = 3;
+ using Traits = hera::ws::dnn::DynamicPointTraits<double>;
+ hera::ws::dnn::DynamicPointTraits<double> traits(dim);
+ hera::AuctionParams<double> params;
+ params.dim = dim;
+ params.wasserstein_power = 1.0;
+ params.delta = 0.01;
+ params.internal_p = hera::get_infinity<double>();
+ params.initial_epsilon = 0.0;
+ params.epsilon_common_ratio = 0.0;
+ params.max_num_phases = 30;
+ params.gamma_threshold = 0.0;
+ params.max_bids_per_round = 0; // use Jacobi
+
+
+ SECTION("trivial: two single-point diagrams-1") {
+
+ int n_points = 1;
+ hera::ws::dnn::DynamicPointVector<double> dgm_a = traits.container(n_points);
+ hera::ws::dnn::DynamicPointVector<double> dgm_b = traits.container(n_points);
+
+ dgm_a[0][0] = 0.0;
+ dgm_a[0][1] = 0.0;
+ dgm_a[0][2] = 0.0;
+
+ dgm_b[0][0] = 1.0;
+ dgm_b[0][1] = 1.0;
+ dgm_b[0][2] = 1.0;
+
+ std::vector<size_t> max_bids { 1, 10, 0 };
+ std::vector<int> internal_ps{ 1, 2, static_cast<int>(hera::get_infinity()) };
+ std::vector<double> wasserstein_powers { 1, 2, 3 };
+
+ for(auto internal_p : internal_ps) {
+ // there is only one point, so the answer does not depend wasserstein power
+ double correct_answer;
+ switch (internal_p) {
+ case 1 :
+ correct_answer = 3.0;
+ break;
+ case 2 :
+ correct_answer = sqrt(3.0);
+ break;
+ case static_cast<int>(hera::get_infinity()) :
+ correct_answer = 1.0;
+ break;
+ default :
+ throw std::runtime_error("Correct answer not specified in test case");
+ }
+
+ for (auto max_bid : max_bids) {
+ for (auto wasserstein_power : wasserstein_powers) {
+ params.max_bids_per_round = max_bid;
+ params.internal_p = internal_p;
+ params.wasserstein_power = wasserstein_power;
+ double d1 = hera::ws::wasserstein_dist(dgm_a, dgm_b, params);
+ double d2 = hera::ws::wasserstein_dist(dgm_b, dgm_a, params);
+ REQUIRE(fabs(d1 - d2) <= 0.00000000001);
+ REQUIRE(fabs(d1 - correct_answer) <= 0.00000000001);
+ }
+ }
+ }
+ }
+}
+
diff --git a/geom_matching/wasserstein/tests/tests_reader.h b/geom_matching/wasserstein/tests/tests_reader.h
new file mode 100644
index 0000000..f2d5735
--- /dev/null
+++ b/geom_matching/wasserstein/tests/tests_reader.h
@@ -0,0 +1,67 @@
+#ifndef WASSERSTEIN_TESTS_READER_H
+#define WASSERSTEIN_TESTS_READER_H
+
+#include <vector>
+#include <string>
+#include <ostream>
+#include <iostream>
+#include <sstream>
+#include <cassert>
+#include <cmath>
+
+#include "hera_infinity.h"
+
+namespace hera_test {
+ inline std::vector<std::string> split_on_delim(const std::string& s, char delim)
+ {
+ std::stringstream ss(s);
+ std::string token;
+ std::vector<std::string> tokens;
+ while (std::getline(ss, token, delim)) {
+ tokens.push_back(token);
+ }
+ return tokens;
+ }
+
+
+ // single row in a file with test cases
+ struct TestFromFileCase
+ {
+
+ std::string file_1;
+ std::string file_2;
+ double q;
+ double internal_p;
+ double answer;
+
+ TestFromFileCase(std::string s)
+ {
+ auto tokens = split_on_delim(s, ' ');
+ assert(tokens.size() == 5);
+
+ file_1 = tokens.at(0);
+ file_2 = tokens.at(1);
+ q = std::stod(tokens.at(2));
+ internal_p = std::stod(tokens.at(3));
+ answer = std::stod(tokens.at(4));
+
+ if (q < 1.0 or std::isinf(q) or
+ (internal_p != hera::get_infinity<double>() and internal_p < 1.0)) {
+ throw std::runtime_error("Bad line in test_list.txt");
+ }
+ }
+ };
+
+ inline std::ostream& operator<<(std::ostream& out, const TestFromFileCase& s)
+ {
+ out << "[" << s.file_1 << ", " << s.file_2 << ", q = " << s.q << ", norm = ";
+ if (s.internal_p != hera::get_infinity()) {
+ out << s.internal_p;
+ } else {
+ out << "infinity";
+ }
+ out << ", answer = " << s.answer << "]";
+ return out;
+ }
+} // namespace hera_test
+#endif //WASSERSTEIN_TESTS_READER_H