29eba9a976759f7f82b6d7709919987f8f703e42
[platform/framework/web/crosswalk.git] / src / third_party / libc++ / trunk / test / strings / basic.string / string.ops / string_compare / size_size_string_size_size.pass.cpp
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 // <string>
11
12 // int compare(size_type pos1, size_type n1, const basic_string& str,
13 //             size_type pos2, size_type n2) const;
14
15 #include <string>
16 #include <stdexcept>
17 #include <cassert>
18
19 #include "min_allocator.h"
20
21 int sign(int x)
22 {
23     if (x == 0)
24         return 0;
25     if (x < 0)
26         return -1;
27     return 1;
28 }
29
30 template <class S>
31 void
32 test(const S& s, typename S::size_type pos1, typename S::size_type n1,
33      const S& str, typename S::size_type pos2, typename S::size_type n2, int x)
34 {
35     try
36     {
37         assert(sign(s.compare(pos1, n1, str, pos2, n2)) == sign(x));
38         assert(pos1 <= s.size());
39         assert(pos2 <= str.size());
40     }
41     catch (std::out_of_range&)
42     {
43         assert(pos1 > s.size() || pos2 > str.size());
44     }
45 }
46
47 template <class S>
48 void test0()
49 {
50     test(S(""), 0, 0, S(""), 0, 0, 0);
51     test(S(""), 0, 0, S(""), 0, 1, 0);
52     test(S(""), 0, 0, S(""), 1, 0, 0);
53     test(S(""), 0, 0, S("abcde"), 0, 0, 0);
54     test(S(""), 0, 0, S("abcde"), 0, 1, -1);
55     test(S(""), 0, 0, S("abcde"), 0, 2, -2);
56     test(S(""), 0, 0, S("abcde"), 0, 4, -4);
57     test(S(""), 0, 0, S("abcde"), 0, 5, -5);
58     test(S(""), 0, 0, S("abcde"), 0, 6, -5);
59     test(S(""), 0, 0, S("abcde"), 1, 0, 0);
60     test(S(""), 0, 0, S("abcde"), 1, 1, -1);
61     test(S(""), 0, 0, S("abcde"), 1, 2, -2);
62     test(S(""), 0, 0, S("abcde"), 1, 3, -3);
63     test(S(""), 0, 0, S("abcde"), 1, 4, -4);
64     test(S(""), 0, 0, S("abcde"), 1, 5, -4);
65     test(S(""), 0, 0, S("abcde"), 2, 0, 0);
66     test(S(""), 0, 0, S("abcde"), 2, 1, -1);
67     test(S(""), 0, 0, S("abcde"), 2, 2, -2);
68     test(S(""), 0, 0, S("abcde"), 2, 3, -3);
69     test(S(""), 0, 0, S("abcde"), 2, 4, -3);
70     test(S(""), 0, 0, S("abcde"), 4, 0, 0);
71     test(S(""), 0, 0, S("abcde"), 4, 1, -1);
72     test(S(""), 0, 0, S("abcde"), 4, 2, -1);
73     test(S(""), 0, 0, S("abcde"), 5, 0, 0);
74     test(S(""), 0, 0, S("abcde"), 5, 1, 0);
75     test(S(""), 0, 0, S("abcde"), 6, 0, 0);
76     test(S(""), 0, 0, S("abcdefghij"), 0, 0, 0);
77     test(S(""), 0, 0, S("abcdefghij"), 0, 1, -1);
78     test(S(""), 0, 0, S("abcdefghij"), 0, 5, -5);
79     test(S(""), 0, 0, S("abcdefghij"), 0, 9, -9);
80     test(S(""), 0, 0, S("abcdefghij"), 0, 10, -10);
81     test(S(""), 0, 0, S("abcdefghij"), 0, 11, -10);
82     test(S(""), 0, 0, S("abcdefghij"), 1, 0, 0);
83     test(S(""), 0, 0, S("abcdefghij"), 1, 1, -1);
84     test(S(""), 0, 0, S("abcdefghij"), 1, 4, -4);
85     test(S(""), 0, 0, S("abcdefghij"), 1, 8, -8);
86     test(S(""), 0, 0, S("abcdefghij"), 1, 9, -9);
87     test(S(""), 0, 0, S("abcdefghij"), 1, 10, -9);
88     test(S(""), 0, 0, S("abcdefghij"), 5, 0, 0);
89     test(S(""), 0, 0, S("abcdefghij"), 5, 1, -1);
90     test(S(""), 0, 0, S("abcdefghij"), 5, 2, -2);
91     test(S(""), 0, 0, S("abcdefghij"), 5, 4, -4);
92     test(S(""), 0, 0, S("abcdefghij"), 5, 5, -5);
93     test(S(""), 0, 0, S("abcdefghij"), 5, 6, -5);
94     test(S(""), 0, 0, S("abcdefghij"), 9, 0, 0);
95     test(S(""), 0, 0, S("abcdefghij"), 9, 1, -1);
96     test(S(""), 0, 0, S("abcdefghij"), 9, 2, -1);
97     test(S(""), 0, 0, S("abcdefghij"), 10, 0, 0);
98     test(S(""), 0, 0, S("abcdefghij"), 10, 1, 0);
99     test(S(""), 0, 0, S("abcdefghij"), 11, 0, 0);
100     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
101     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
102     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
103     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
104     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
105     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
106     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
107     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
108     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
109     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
110     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
111     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
112     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
113     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
114     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
115     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
116     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
117     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
118     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
119     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
120     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
121     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
122     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
123     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
124     test(S(""), 0, 1, S(""), 0, 0, 0);
125     test(S(""), 0, 1, S(""), 0, 1, 0);
126     test(S(""), 0, 1, S(""), 1, 0, 0);
127     test(S(""), 0, 1, S("abcde"), 0, 0, 0);
128     test(S(""), 0, 1, S("abcde"), 0, 1, -1);
129     test(S(""), 0, 1, S("abcde"), 0, 2, -2);
130     test(S(""), 0, 1, S("abcde"), 0, 4, -4);
131     test(S(""), 0, 1, S("abcde"), 0, 5, -5);
132     test(S(""), 0, 1, S("abcde"), 0, 6, -5);
133     test(S(""), 0, 1, S("abcde"), 1, 0, 0);
134     test(S(""), 0, 1, S("abcde"), 1, 1, -1);
135     test(S(""), 0, 1, S("abcde"), 1, 2, -2);
136     test(S(""), 0, 1, S("abcde"), 1, 3, -3);
137     test(S(""), 0, 1, S("abcde"), 1, 4, -4);
138     test(S(""), 0, 1, S("abcde"), 1, 5, -4);
139     test(S(""), 0, 1, S("abcde"), 2, 0, 0);
140     test(S(""), 0, 1, S("abcde"), 2, 1, -1);
141     test(S(""), 0, 1, S("abcde"), 2, 2, -2);
142     test(S(""), 0, 1, S("abcde"), 2, 3, -3);
143     test(S(""), 0, 1, S("abcde"), 2, 4, -3);
144     test(S(""), 0, 1, S("abcde"), 4, 0, 0);
145     test(S(""), 0, 1, S("abcde"), 4, 1, -1);
146     test(S(""), 0, 1, S("abcde"), 4, 2, -1);
147     test(S(""), 0, 1, S("abcde"), 5, 0, 0);
148     test(S(""), 0, 1, S("abcde"), 5, 1, 0);
149     test(S(""), 0, 1, S("abcde"), 6, 0, 0);
150 }
151
152 template <class S>
153 void test1()
154 {
155     test(S(""), 0, 1, S("abcdefghij"), 0, 0, 0);
156     test(S(""), 0, 1, S("abcdefghij"), 0, 1, -1);
157     test(S(""), 0, 1, S("abcdefghij"), 0, 5, -5);
158     test(S(""), 0, 1, S("abcdefghij"), 0, 9, -9);
159     test(S(""), 0, 1, S("abcdefghij"), 0, 10, -10);
160     test(S(""), 0, 1, S("abcdefghij"), 0, 11, -10);
161     test(S(""), 0, 1, S("abcdefghij"), 1, 0, 0);
162     test(S(""), 0, 1, S("abcdefghij"), 1, 1, -1);
163     test(S(""), 0, 1, S("abcdefghij"), 1, 4, -4);
164     test(S(""), 0, 1, S("abcdefghij"), 1, 8, -8);
165     test(S(""), 0, 1, S("abcdefghij"), 1, 9, -9);
166     test(S(""), 0, 1, S("abcdefghij"), 1, 10, -9);
167     test(S(""), 0, 1, S("abcdefghij"), 5, 0, 0);
168     test(S(""), 0, 1, S("abcdefghij"), 5, 1, -1);
169     test(S(""), 0, 1, S("abcdefghij"), 5, 2, -2);
170     test(S(""), 0, 1, S("abcdefghij"), 5, 4, -4);
171     test(S(""), 0, 1, S("abcdefghij"), 5, 5, -5);
172     test(S(""), 0, 1, S("abcdefghij"), 5, 6, -5);
173     test(S(""), 0, 1, S("abcdefghij"), 9, 0, 0);
174     test(S(""), 0, 1, S("abcdefghij"), 9, 1, -1);
175     test(S(""), 0, 1, S("abcdefghij"), 9, 2, -1);
176     test(S(""), 0, 1, S("abcdefghij"), 10, 0, 0);
177     test(S(""), 0, 1, S("abcdefghij"), 10, 1, 0);
178     test(S(""), 0, 1, S("abcdefghij"), 11, 0, 0);
179     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
180     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
181     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
182     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
183     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
184     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
185     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
186     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
187     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
188     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
189     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
190     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
191     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
192     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
193     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
194     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
195     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
196     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
197     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
198     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
199     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
200     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
201     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
202     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
203     test(S(""), 1, 0, S(""), 0, 0, 0);
204     test(S(""), 1, 0, S(""), 0, 1, 0);
205     test(S(""), 1, 0, S(""), 1, 0, 0);
206     test(S(""), 1, 0, S("abcde"), 0, 0, 0);
207     test(S(""), 1, 0, S("abcde"), 0, 1, 0);
208     test(S(""), 1, 0, S("abcde"), 0, 2, 0);
209     test(S(""), 1, 0, S("abcde"), 0, 4, 0);
210     test(S(""), 1, 0, S("abcde"), 0, 5, 0);
211     test(S(""), 1, 0, S("abcde"), 0, 6, 0);
212     test(S(""), 1, 0, S("abcde"), 1, 0, 0);
213     test(S(""), 1, 0, S("abcde"), 1, 1, 0);
214     test(S(""), 1, 0, S("abcde"), 1, 2, 0);
215     test(S(""), 1, 0, S("abcde"), 1, 3, 0);
216     test(S(""), 1, 0, S("abcde"), 1, 4, 0);
217     test(S(""), 1, 0, S("abcde"), 1, 5, 0);
218     test(S(""), 1, 0, S("abcde"), 2, 0, 0);
219     test(S(""), 1, 0, S("abcde"), 2, 1, 0);
220     test(S(""), 1, 0, S("abcde"), 2, 2, 0);
221     test(S(""), 1, 0, S("abcde"), 2, 3, 0);
222     test(S(""), 1, 0, S("abcde"), 2, 4, 0);
223     test(S(""), 1, 0, S("abcde"), 4, 0, 0);
224     test(S(""), 1, 0, S("abcde"), 4, 1, 0);
225     test(S(""), 1, 0, S("abcde"), 4, 2, 0);
226     test(S(""), 1, 0, S("abcde"), 5, 0, 0);
227     test(S(""), 1, 0, S("abcde"), 5, 1, 0);
228     test(S(""), 1, 0, S("abcde"), 6, 0, 0);
229     test(S(""), 1, 0, S("abcdefghij"), 0, 0, 0);
230     test(S(""), 1, 0, S("abcdefghij"), 0, 1, 0);
231     test(S(""), 1, 0, S("abcdefghij"), 0, 5, 0);
232     test(S(""), 1, 0, S("abcdefghij"), 0, 9, 0);
233     test(S(""), 1, 0, S("abcdefghij"), 0, 10, 0);
234     test(S(""), 1, 0, S("abcdefghij"), 0, 11, 0);
235     test(S(""), 1, 0, S("abcdefghij"), 1, 0, 0);
236     test(S(""), 1, 0, S("abcdefghij"), 1, 1, 0);
237     test(S(""), 1, 0, S("abcdefghij"), 1, 4, 0);
238     test(S(""), 1, 0, S("abcdefghij"), 1, 8, 0);
239     test(S(""), 1, 0, S("abcdefghij"), 1, 9, 0);
240     test(S(""), 1, 0, S("abcdefghij"), 1, 10, 0);
241     test(S(""), 1, 0, S("abcdefghij"), 5, 0, 0);
242     test(S(""), 1, 0, S("abcdefghij"), 5, 1, 0);
243     test(S(""), 1, 0, S("abcdefghij"), 5, 2, 0);
244     test(S(""), 1, 0, S("abcdefghij"), 5, 4, 0);
245     test(S(""), 1, 0, S("abcdefghij"), 5, 5, 0);
246     test(S(""), 1, 0, S("abcdefghij"), 5, 6, 0);
247     test(S(""), 1, 0, S("abcdefghij"), 9, 0, 0);
248     test(S(""), 1, 0, S("abcdefghij"), 9, 1, 0);
249     test(S(""), 1, 0, S("abcdefghij"), 9, 2, 0);
250     test(S(""), 1, 0, S("abcdefghij"), 10, 0, 0);
251     test(S(""), 1, 0, S("abcdefghij"), 10, 1, 0);
252     test(S(""), 1, 0, S("abcdefghij"), 11, 0, 0);
253     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
254     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
255 }
256
257 template <class S>
258 void test2()
259 {
260     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
261     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
262     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
263     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
264     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
265     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
266     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
267     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
268     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
269     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
270     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
271     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
272     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
273     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
274     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
275     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
276     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
277     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
278     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
279     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
280     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
281     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
282     test(S("abcde"), 0, 0, S(""), 0, 0, 0);
283     test(S("abcde"), 0, 0, S(""), 0, 1, 0);
284     test(S("abcde"), 0, 0, S(""), 1, 0, 0);
285     test(S("abcde"), 0, 0, S("abcde"), 0, 0, 0);
286     test(S("abcde"), 0, 0, S("abcde"), 0, 1, -1);
287     test(S("abcde"), 0, 0, S("abcde"), 0, 2, -2);
288     test(S("abcde"), 0, 0, S("abcde"), 0, 4, -4);
289     test(S("abcde"), 0, 0, S("abcde"), 0, 5, -5);
290     test(S("abcde"), 0, 0, S("abcde"), 0, 6, -5);
291     test(S("abcde"), 0, 0, S("abcde"), 1, 0, 0);
292     test(S("abcde"), 0, 0, S("abcde"), 1, 1, -1);
293     test(S("abcde"), 0, 0, S("abcde"), 1, 2, -2);
294     test(S("abcde"), 0, 0, S("abcde"), 1, 3, -3);
295     test(S("abcde"), 0, 0, S("abcde"), 1, 4, -4);
296     test(S("abcde"), 0, 0, S("abcde"), 1, 5, -4);
297     test(S("abcde"), 0, 0, S("abcde"), 2, 0, 0);
298     test(S("abcde"), 0, 0, S("abcde"), 2, 1, -1);
299     test(S("abcde"), 0, 0, S("abcde"), 2, 2, -2);
300     test(S("abcde"), 0, 0, S("abcde"), 2, 3, -3);
301     test(S("abcde"), 0, 0, S("abcde"), 2, 4, -3);
302     test(S("abcde"), 0, 0, S("abcde"), 4, 0, 0);
303     test(S("abcde"), 0, 0, S("abcde"), 4, 1, -1);
304     test(S("abcde"), 0, 0, S("abcde"), 4, 2, -1);
305     test(S("abcde"), 0, 0, S("abcde"), 5, 0, 0);
306     test(S("abcde"), 0, 0, S("abcde"), 5, 1, 0);
307     test(S("abcde"), 0, 0, S("abcde"), 6, 0, 0);
308     test(S("abcde"), 0, 0, S("abcdefghij"), 0, 0, 0);
309     test(S("abcde"), 0, 0, S("abcdefghij"), 0, 1, -1);
310     test(S("abcde"), 0, 0, S("abcdefghij"), 0, 5, -5);
311     test(S("abcde"), 0, 0, S("abcdefghij"), 0, 9, -9);
312     test(S("abcde"), 0, 0, S("abcdefghij"), 0, 10, -10);
313     test(S("abcde"), 0, 0, S("abcdefghij"), 0, 11, -10);
314     test(S("abcde"), 0, 0, S("abcdefghij"), 1, 0, 0);
315     test(S("abcde"), 0, 0, S("abcdefghij"), 1, 1, -1);
316     test(S("abcde"), 0, 0, S("abcdefghij"), 1, 4, -4);
317     test(S("abcde"), 0, 0, S("abcdefghij"), 1, 8, -8);
318     test(S("abcde"), 0, 0, S("abcdefghij"), 1, 9, -9);
319     test(S("abcde"), 0, 0, S("abcdefghij"), 1, 10, -9);
320     test(S("abcde"), 0, 0, S("abcdefghij"), 5, 0, 0);
321     test(S("abcde"), 0, 0, S("abcdefghij"), 5, 1, -1);
322     test(S("abcde"), 0, 0, S("abcdefghij"), 5, 2, -2);
323     test(S("abcde"), 0, 0, S("abcdefghij"), 5, 4, -4);
324     test(S("abcde"), 0, 0, S("abcdefghij"), 5, 5, -5);
325     test(S("abcde"), 0, 0, S("abcdefghij"), 5, 6, -5);
326     test(S("abcde"), 0, 0, S("abcdefghij"), 9, 0, 0);
327     test(S("abcde"), 0, 0, S("abcdefghij"), 9, 1, -1);
328     test(S("abcde"), 0, 0, S("abcdefghij"), 9, 2, -1);
329     test(S("abcde"), 0, 0, S("abcdefghij"), 10, 0, 0);
330     test(S("abcde"), 0, 0, S("abcdefghij"), 10, 1, 0);
331     test(S("abcde"), 0, 0, S("abcdefghij"), 11, 0, 0);
332     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
333     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
334     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
335     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
336     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
337     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
338     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
339     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
340     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
341     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
342     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
343     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
344     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
345     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
346     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
347     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
348     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
349     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
350     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
351     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
352     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
353     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
354     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
355     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
356     test(S("abcde"), 0, 1, S(""), 0, 0, 1);
357     test(S("abcde"), 0, 1, S(""), 0, 1, 1);
358     test(S("abcde"), 0, 1, S(""), 1, 0, 0);
359     test(S("abcde"), 0, 1, S("abcde"), 0, 0, 1);
360 }
361
362 template <class S>
363 void test3()
364 {
365     test(S("abcde"), 0, 1, S("abcde"), 0, 1, 0);
366     test(S("abcde"), 0, 1, S("abcde"), 0, 2, -1);
367     test(S("abcde"), 0, 1, S("abcde"), 0, 4, -3);
368     test(S("abcde"), 0, 1, S("abcde"), 0, 5, -4);
369     test(S("abcde"), 0, 1, S("abcde"), 0, 6, -4);
370     test(S("abcde"), 0, 1, S("abcde"), 1, 0, 1);
371     test(S("abcde"), 0, 1, S("abcde"), 1, 1, -1);
372     test(S("abcde"), 0, 1, S("abcde"), 1, 2, -1);
373     test(S("abcde"), 0, 1, S("abcde"), 1, 3, -1);
374     test(S("abcde"), 0, 1, S("abcde"), 1, 4, -1);
375     test(S("abcde"), 0, 1, S("abcde"), 1, 5, -1);
376     test(S("abcde"), 0, 1, S("abcde"), 2, 0, 1);
377     test(S("abcde"), 0, 1, S("abcde"), 2, 1, -2);
378     test(S("abcde"), 0, 1, S("abcde"), 2, 2, -2);
379     test(S("abcde"), 0, 1, S("abcde"), 2, 3, -2);
380     test(S("abcde"), 0, 1, S("abcde"), 2, 4, -2);
381     test(S("abcde"), 0, 1, S("abcde"), 4, 0, 1);
382     test(S("abcde"), 0, 1, S("abcde"), 4, 1, -4);
383     test(S("abcde"), 0, 1, S("abcde"), 4, 2, -4);
384     test(S("abcde"), 0, 1, S("abcde"), 5, 0, 1);
385     test(S("abcde"), 0, 1, S("abcde"), 5, 1, 1);
386     test(S("abcde"), 0, 1, S("abcde"), 6, 0, 0);
387     test(S("abcde"), 0, 1, S("abcdefghij"), 0, 0, 1);
388     test(S("abcde"), 0, 1, S("abcdefghij"), 0, 1, 0);
389     test(S("abcde"), 0, 1, S("abcdefghij"), 0, 5, -4);
390     test(S("abcde"), 0, 1, S("abcdefghij"), 0, 9, -8);
391     test(S("abcde"), 0, 1, S("abcdefghij"), 0, 10, -9);
392     test(S("abcde"), 0, 1, S("abcdefghij"), 0, 11, -9);
393     test(S("abcde"), 0, 1, S("abcdefghij"), 1, 0, 1);
394     test(S("abcde"), 0, 1, S("abcdefghij"), 1, 1, -1);
395     test(S("abcde"), 0, 1, S("abcdefghij"), 1, 4, -1);
396     test(S("abcde"), 0, 1, S("abcdefghij"), 1, 8, -1);
397     test(S("abcde"), 0, 1, S("abcdefghij"), 1, 9, -1);
398     test(S("abcde"), 0, 1, S("abcdefghij"), 1, 10, -1);
399     test(S("abcde"), 0, 1, S("abcdefghij"), 5, 0, 1);
400     test(S("abcde"), 0, 1, S("abcdefghij"), 5, 1, -5);
401     test(S("abcde"), 0, 1, S("abcdefghij"), 5, 2, -5);
402     test(S("abcde"), 0, 1, S("abcdefghij"), 5, 4, -5);
403     test(S("abcde"), 0, 1, S("abcdefghij"), 5, 5, -5);
404     test(S("abcde"), 0, 1, S("abcdefghij"), 5, 6, -5);
405     test(S("abcde"), 0, 1, S("abcdefghij"), 9, 0, 1);
406     test(S("abcde"), 0, 1, S("abcdefghij"), 9, 1, -9);
407     test(S("abcde"), 0, 1, S("abcdefghij"), 9, 2, -9);
408     test(S("abcde"), 0, 1, S("abcdefghij"), 10, 0, 1);
409     test(S("abcde"), 0, 1, S("abcdefghij"), 10, 1, 1);
410     test(S("abcde"), 0, 1, S("abcdefghij"), 11, 0, 0);
411     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
412     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0);
413     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9);
414     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18);
415     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19);
416     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19);
417     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
418     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
419     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1);
420     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1);
421     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1);
422     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1);
423     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
424     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10);
425     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10);
426     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10);
427     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
428     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
429     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
430     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19);
431     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19);
432     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
433     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
434     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
435     test(S("abcde"), 0, 2, S(""), 0, 0, 2);
436     test(S("abcde"), 0, 2, S(""), 0, 1, 2);
437     test(S("abcde"), 0, 2, S(""), 1, 0, 0);
438     test(S("abcde"), 0, 2, S("abcde"), 0, 0, 2);
439     test(S("abcde"), 0, 2, S("abcde"), 0, 1, 1);
440     test(S("abcde"), 0, 2, S("abcde"), 0, 2, 0);
441     test(S("abcde"), 0, 2, S("abcde"), 0, 4, -2);
442     test(S("abcde"), 0, 2, S("abcde"), 0, 5, -3);
443     test(S("abcde"), 0, 2, S("abcde"), 0, 6, -3);
444     test(S("abcde"), 0, 2, S("abcde"), 1, 0, 2);
445     test(S("abcde"), 0, 2, S("abcde"), 1, 1, -1);
446     test(S("abcde"), 0, 2, S("abcde"), 1, 2, -1);
447     test(S("abcde"), 0, 2, S("abcde"), 1, 3, -1);
448     test(S("abcde"), 0, 2, S("abcde"), 1, 4, -1);
449     test(S("abcde"), 0, 2, S("abcde"), 1, 5, -1);
450     test(S("abcde"), 0, 2, S("abcde"), 2, 0, 2);
451     test(S("abcde"), 0, 2, S("abcde"), 2, 1, -2);
452     test(S("abcde"), 0, 2, S("abcde"), 2, 2, -2);
453     test(S("abcde"), 0, 2, S("abcde"), 2, 3, -2);
454     test(S("abcde"), 0, 2, S("abcde"), 2, 4, -2);
455     test(S("abcde"), 0, 2, S("abcde"), 4, 0, 2);
456     test(S("abcde"), 0, 2, S("abcde"), 4, 1, -4);
457     test(S("abcde"), 0, 2, S("abcde"), 4, 2, -4);
458     test(S("abcde"), 0, 2, S("abcde"), 5, 0, 2);
459     test(S("abcde"), 0, 2, S("abcde"), 5, 1, 2);
460     test(S("abcde"), 0, 2, S("abcde"), 6, 0, 0);
461     test(S("abcde"), 0, 2, S("abcdefghij"), 0, 0, 2);
462     test(S("abcde"), 0, 2, S("abcdefghij"), 0, 1, 1);
463     test(S("abcde"), 0, 2, S("abcdefghij"), 0, 5, -3);
464     test(S("abcde"), 0, 2, S("abcdefghij"), 0, 9, -7);
465 }
466
467 template <class S>
468 void test4()
469 {
470     test(S("abcde"), 0, 2, S("abcdefghij"), 0, 10, -8);
471     test(S("abcde"), 0, 2, S("abcdefghij"), 0, 11, -8);
472     test(S("abcde"), 0, 2, S("abcdefghij"), 1, 0, 2);
473     test(S("abcde"), 0, 2, S("abcdefghij"), 1, 1, -1);
474     test(S("abcde"), 0, 2, S("abcdefghij"), 1, 4, -1);
475     test(S("abcde"), 0, 2, S("abcdefghij"), 1, 8, -1);
476     test(S("abcde"), 0, 2, S("abcdefghij"), 1, 9, -1);
477     test(S("abcde"), 0, 2, S("abcdefghij"), 1, 10, -1);
478     test(S("abcde"), 0, 2, S("abcdefghij"), 5, 0, 2);
479     test(S("abcde"), 0, 2, S("abcdefghij"), 5, 1, -5);
480     test(S("abcde"), 0, 2, S("abcdefghij"), 5, 2, -5);
481     test(S("abcde"), 0, 2, S("abcdefghij"), 5, 4, -5);
482     test(S("abcde"), 0, 2, S("abcdefghij"), 5, 5, -5);
483     test(S("abcde"), 0, 2, S("abcdefghij"), 5, 6, -5);
484     test(S("abcde"), 0, 2, S("abcdefghij"), 9, 0, 2);
485     test(S("abcde"), 0, 2, S("abcdefghij"), 9, 1, -9);
486     test(S("abcde"), 0, 2, S("abcdefghij"), 9, 2, -9);
487     test(S("abcde"), 0, 2, S("abcdefghij"), 10, 0, 2);
488     test(S("abcde"), 0, 2, S("abcdefghij"), 10, 1, 2);
489     test(S("abcde"), 0, 2, S("abcdefghij"), 11, 0, 0);
490     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
491     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 1, 1);
492     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 10, -8);
493     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 19, -17);
494     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 20, -18);
495     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 21, -18);
496     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
497     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 1, -1);
498     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 9, -1);
499     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 18, -1);
500     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 19, -1);
501     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 20, -1);
502     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
503     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 1, -10);
504     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 5, -10);
505     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 9, -10);
506     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 10, -10);
507     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 11, -10);
508     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
509     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 1, -19);
510     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 2, -19);
511     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
512     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
513     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
514     test(S("abcde"), 0, 4, S(""), 0, 0, 4);
515     test(S("abcde"), 0, 4, S(""), 0, 1, 4);
516     test(S("abcde"), 0, 4, S(""), 1, 0, 0);
517     test(S("abcde"), 0, 4, S("abcde"), 0, 0, 4);
518     test(S("abcde"), 0, 4, S("abcde"), 0, 1, 3);
519     test(S("abcde"), 0, 4, S("abcde"), 0, 2, 2);
520     test(S("abcde"), 0, 4, S("abcde"), 0, 4, 0);
521     test(S("abcde"), 0, 4, S("abcde"), 0, 5, -1);
522     test(S("abcde"), 0, 4, S("abcde"), 0, 6, -1);
523     test(S("abcde"), 0, 4, S("abcde"), 1, 0, 4);
524     test(S("abcde"), 0, 4, S("abcde"), 1, 1, -1);
525     test(S("abcde"), 0, 4, S("abcde"), 1, 2, -1);
526     test(S("abcde"), 0, 4, S("abcde"), 1, 3, -1);
527     test(S("abcde"), 0, 4, S("abcde"), 1, 4, -1);
528     test(S("abcde"), 0, 4, S("abcde"), 1, 5, -1);
529     test(S("abcde"), 0, 4, S("abcde"), 2, 0, 4);
530     test(S("abcde"), 0, 4, S("abcde"), 2, 1, -2);
531     test(S("abcde"), 0, 4, S("abcde"), 2, 2, -2);
532     test(S("abcde"), 0, 4, S("abcde"), 2, 3, -2);
533     test(S("abcde"), 0, 4, S("abcde"), 2, 4, -2);
534     test(S("abcde"), 0, 4, S("abcde"), 4, 0, 4);
535     test(S("abcde"), 0, 4, S("abcde"), 4, 1, -4);
536     test(S("abcde"), 0, 4, S("abcde"), 4, 2, -4);
537     test(S("abcde"), 0, 4, S("abcde"), 5, 0, 4);
538     test(S("abcde"), 0, 4, S("abcde"), 5, 1, 4);
539     test(S("abcde"), 0, 4, S("abcde"), 6, 0, 0);
540     test(S("abcde"), 0, 4, S("abcdefghij"), 0, 0, 4);
541     test(S("abcde"), 0, 4, S("abcdefghij"), 0, 1, 3);
542     test(S("abcde"), 0, 4, S("abcdefghij"), 0, 5, -1);
543     test(S("abcde"), 0, 4, S("abcdefghij"), 0, 9, -5);
544     test(S("abcde"), 0, 4, S("abcdefghij"), 0, 10, -6);
545     test(S("abcde"), 0, 4, S("abcdefghij"), 0, 11, -6);
546     test(S("abcde"), 0, 4, S("abcdefghij"), 1, 0, 4);
547     test(S("abcde"), 0, 4, S("abcdefghij"), 1, 1, -1);
548     test(S("abcde"), 0, 4, S("abcdefghij"), 1, 4, -1);
549     test(S("abcde"), 0, 4, S("abcdefghij"), 1, 8, -1);
550     test(S("abcde"), 0, 4, S("abcdefghij"), 1, 9, -1);
551     test(S("abcde"), 0, 4, S("abcdefghij"), 1, 10, -1);
552     test(S("abcde"), 0, 4, S("abcdefghij"), 5, 0, 4);
553     test(S("abcde"), 0, 4, S("abcdefghij"), 5, 1, -5);
554     test(S("abcde"), 0, 4, S("abcdefghij"), 5, 2, -5);
555     test(S("abcde"), 0, 4, S("abcdefghij"), 5, 4, -5);
556     test(S("abcde"), 0, 4, S("abcdefghij"), 5, 5, -5);
557     test(S("abcde"), 0, 4, S("abcdefghij"), 5, 6, -5);
558     test(S("abcde"), 0, 4, S("abcdefghij"), 9, 0, 4);
559     test(S("abcde"), 0, 4, S("abcdefghij"), 9, 1, -9);
560     test(S("abcde"), 0, 4, S("abcdefghij"), 9, 2, -9);
561     test(S("abcde"), 0, 4, S("abcdefghij"), 10, 0, 4);
562     test(S("abcde"), 0, 4, S("abcdefghij"), 10, 1, 4);
563     test(S("abcde"), 0, 4, S("abcdefghij"), 11, 0, 0);
564     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
565     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 1, 3);
566     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 10, -6);
567     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 19, -15);
568     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 20, -16);
569     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 21, -16);
570 }
571
572 template <class S>
573 void test5()
574 {
575     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
576     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 1, -1);
577     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 9, -1);
578     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 18, -1);
579     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 19, -1);
580     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 20, -1);
581     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
582     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 1, -10);
583     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 5, -10);
584     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 9, -10);
585     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 10, -10);
586     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 11, -10);
587     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
588     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 1, -19);
589     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 2, -19);
590     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
591     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
592     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
593     test(S("abcde"), 0, 5, S(""), 0, 0, 5);
594     test(S("abcde"), 0, 5, S(""), 0, 1, 5);
595     test(S("abcde"), 0, 5, S(""), 1, 0, 0);
596     test(S("abcde"), 0, 5, S("abcde"), 0, 0, 5);
597     test(S("abcde"), 0, 5, S("abcde"), 0, 1, 4);
598     test(S("abcde"), 0, 5, S("abcde"), 0, 2, 3);
599     test(S("abcde"), 0, 5, S("abcde"), 0, 4, 1);
600     test(S("abcde"), 0, 5, S("abcde"), 0, 5, 0);
601     test(S("abcde"), 0, 5, S("abcde"), 0, 6, 0);
602     test(S("abcde"), 0, 5, S("abcde"), 1, 0, 5);
603     test(S("abcde"), 0, 5, S("abcde"), 1, 1, -1);
604     test(S("abcde"), 0, 5, S("abcde"), 1, 2, -1);
605     test(S("abcde"), 0, 5, S("abcde"), 1, 3, -1);
606     test(S("abcde"), 0, 5, S("abcde"), 1, 4, -1);
607     test(S("abcde"), 0, 5, S("abcde"), 1, 5, -1);
608     test(S("abcde"), 0, 5, S("abcde"), 2, 0, 5);
609     test(S("abcde"), 0, 5, S("abcde"), 2, 1, -2);
610     test(S("abcde"), 0, 5, S("abcde"), 2, 2, -2);
611     test(S("abcde"), 0, 5, S("abcde"), 2, 3, -2);
612     test(S("abcde"), 0, 5, S("abcde"), 2, 4, -2);
613     test(S("abcde"), 0, 5, S("abcde"), 4, 0, 5);
614     test(S("abcde"), 0, 5, S("abcde"), 4, 1, -4);
615     test(S("abcde"), 0, 5, S("abcde"), 4, 2, -4);
616     test(S("abcde"), 0, 5, S("abcde"), 5, 0, 5);
617     test(S("abcde"), 0, 5, S("abcde"), 5, 1, 5);
618     test(S("abcde"), 0, 5, S("abcde"), 6, 0, 0);
619     test(S("abcde"), 0, 5, S("abcdefghij"), 0, 0, 5);
620     test(S("abcde"), 0, 5, S("abcdefghij"), 0, 1, 4);
621     test(S("abcde"), 0, 5, S("abcdefghij"), 0, 5, 0);
622     test(S("abcde"), 0, 5, S("abcdefghij"), 0, 9, -4);
623     test(S("abcde"), 0, 5, S("abcdefghij"), 0, 10, -5);
624     test(S("abcde"), 0, 5, S("abcdefghij"), 0, 11, -5);
625     test(S("abcde"), 0, 5, S("abcdefghij"), 1, 0, 5);
626     test(S("abcde"), 0, 5, S("abcdefghij"), 1, 1, -1);
627     test(S("abcde"), 0, 5, S("abcdefghij"), 1, 4, -1);
628     test(S("abcde"), 0, 5, S("abcdefghij"), 1, 8, -1);
629     test(S("abcde"), 0, 5, S("abcdefghij"), 1, 9, -1);
630     test(S("abcde"), 0, 5, S("abcdefghij"), 1, 10, -1);
631     test(S("abcde"), 0, 5, S("abcdefghij"), 5, 0, 5);
632     test(S("abcde"), 0, 5, S("abcdefghij"), 5, 1, -5);
633     test(S("abcde"), 0, 5, S("abcdefghij"), 5, 2, -5);
634     test(S("abcde"), 0, 5, S("abcdefghij"), 5, 4, -5);
635     test(S("abcde"), 0, 5, S("abcdefghij"), 5, 5, -5);
636     test(S("abcde"), 0, 5, S("abcdefghij"), 5, 6, -5);
637     test(S("abcde"), 0, 5, S("abcdefghij"), 9, 0, 5);
638     test(S("abcde"), 0, 5, S("abcdefghij"), 9, 1, -9);
639     test(S("abcde"), 0, 5, S("abcdefghij"), 9, 2, -9);
640     test(S("abcde"), 0, 5, S("abcdefghij"), 10, 0, 5);
641     test(S("abcde"), 0, 5, S("abcdefghij"), 10, 1, 5);
642     test(S("abcde"), 0, 5, S("abcdefghij"), 11, 0, 0);
643     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
644     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 1, 4);
645     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 10, -5);
646     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 19, -14);
647     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 20, -15);
648     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 21, -15);
649     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
650     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 1, -1);
651     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 9, -1);
652     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 18, -1);
653     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 19, -1);
654     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 20, -1);
655     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
656     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 1, -10);
657     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 5, -10);
658     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 9, -10);
659     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 10, -10);
660     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 11, -10);
661     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
662     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 1, -19);
663     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 2, -19);
664     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
665     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
666     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
667     test(S("abcde"), 0, 6, S(""), 0, 0, 5);
668     test(S("abcde"), 0, 6, S(""), 0, 1, 5);
669     test(S("abcde"), 0, 6, S(""), 1, 0, 0);
670     test(S("abcde"), 0, 6, S("abcde"), 0, 0, 5);
671     test(S("abcde"), 0, 6, S("abcde"), 0, 1, 4);
672     test(S("abcde"), 0, 6, S("abcde"), 0, 2, 3);
673     test(S("abcde"), 0, 6, S("abcde"), 0, 4, 1);
674     test(S("abcde"), 0, 6, S("abcde"), 0, 5, 0);
675 }
676
677 template <class S>
678 void test6()
679 {
680     test(S("abcde"), 0, 6, S("abcde"), 0, 6, 0);
681     test(S("abcde"), 0, 6, S("abcde"), 1, 0, 5);
682     test(S("abcde"), 0, 6, S("abcde"), 1, 1, -1);
683     test(S("abcde"), 0, 6, S("abcde"), 1, 2, -1);
684     test(S("abcde"), 0, 6, S("abcde"), 1, 3, -1);
685     test(S("abcde"), 0, 6, S("abcde"), 1, 4, -1);
686     test(S("abcde"), 0, 6, S("abcde"), 1, 5, -1);
687     test(S("abcde"), 0, 6, S("abcde"), 2, 0, 5);
688     test(S("abcde"), 0, 6, S("abcde"), 2, 1, -2);
689     test(S("abcde"), 0, 6, S("abcde"), 2, 2, -2);
690     test(S("abcde"), 0, 6, S("abcde"), 2, 3, -2);
691     test(S("abcde"), 0, 6, S("abcde"), 2, 4, -2);
692     test(S("abcde"), 0, 6, S("abcde"), 4, 0, 5);
693     test(S("abcde"), 0, 6, S("abcde"), 4, 1, -4);
694     test(S("abcde"), 0, 6, S("abcde"), 4, 2, -4);
695     test(S("abcde"), 0, 6, S("abcde"), 5, 0, 5);
696     test(S("abcde"), 0, 6, S("abcde"), 5, 1, 5);
697     test(S("abcde"), 0, 6, S("abcde"), 6, 0, 0);
698     test(S("abcde"), 0, 6, S("abcdefghij"), 0, 0, 5);
699     test(S("abcde"), 0, 6, S("abcdefghij"), 0, 1, 4);
700     test(S("abcde"), 0, 6, S("abcdefghij"), 0, 5, 0);
701     test(S("abcde"), 0, 6, S("abcdefghij"), 0, 9, -4);
702     test(S("abcde"), 0, 6, S("abcdefghij"), 0, 10, -5);
703     test(S("abcde"), 0, 6, S("abcdefghij"), 0, 11, -5);
704     test(S("abcde"), 0, 6, S("abcdefghij"), 1, 0, 5);
705     test(S("abcde"), 0, 6, S("abcdefghij"), 1, 1, -1);
706     test(S("abcde"), 0, 6, S("abcdefghij"), 1, 4, -1);
707     test(S("abcde"), 0, 6, S("abcdefghij"), 1, 8, -1);
708     test(S("abcde"), 0, 6, S("abcdefghij"), 1, 9, -1);
709     test(S("abcde"), 0, 6, S("abcdefghij"), 1, 10, -1);
710     test(S("abcde"), 0, 6, S("abcdefghij"), 5, 0, 5);
711     test(S("abcde"), 0, 6, S("abcdefghij"), 5, 1, -5);
712     test(S("abcde"), 0, 6, S("abcdefghij"), 5, 2, -5);
713     test(S("abcde"), 0, 6, S("abcdefghij"), 5, 4, -5);
714     test(S("abcde"), 0, 6, S("abcdefghij"), 5, 5, -5);
715     test(S("abcde"), 0, 6, S("abcdefghij"), 5, 6, -5);
716     test(S("abcde"), 0, 6, S("abcdefghij"), 9, 0, 5);
717     test(S("abcde"), 0, 6, S("abcdefghij"), 9, 1, -9);
718     test(S("abcde"), 0, 6, S("abcdefghij"), 9, 2, -9);
719     test(S("abcde"), 0, 6, S("abcdefghij"), 10, 0, 5);
720     test(S("abcde"), 0, 6, S("abcdefghij"), 10, 1, 5);
721     test(S("abcde"), 0, 6, S("abcdefghij"), 11, 0, 0);
722     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 0, 5);
723     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 1, 4);
724     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 10, -5);
725     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 19, -14);
726     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 20, -15);
727     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 21, -15);
728     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 0, 5);
729     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 1, -1);
730     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 9, -1);
731     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 18, -1);
732     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 19, -1);
733     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 20, -1);
734     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 0, 5);
735     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 1, -10);
736     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 5, -10);
737     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 9, -10);
738     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 10, -10);
739     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 11, -10);
740     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 0, 5);
741     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 1, -19);
742     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 2, -19);
743     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 20, 0, 5);
744     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 20, 1, 5);
745     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 21, 0, 0);
746     test(S("abcde"), 1, 0, S(""), 0, 0, 0);
747     test(S("abcde"), 1, 0, S(""), 0, 1, 0);
748     test(S("abcde"), 1, 0, S(""), 1, 0, 0);
749     test(S("abcde"), 1, 0, S("abcde"), 0, 0, 0);
750     test(S("abcde"), 1, 0, S("abcde"), 0, 1, -1);
751     test(S("abcde"), 1, 0, S("abcde"), 0, 2, -2);
752     test(S("abcde"), 1, 0, S("abcde"), 0, 4, -4);
753     test(S("abcde"), 1, 0, S("abcde"), 0, 5, -5);
754     test(S("abcde"), 1, 0, S("abcde"), 0, 6, -5);
755     test(S("abcde"), 1, 0, S("abcde"), 1, 0, 0);
756     test(S("abcde"), 1, 0, S("abcde"), 1, 1, -1);
757     test(S("abcde"), 1, 0, S("abcde"), 1, 2, -2);
758     test(S("abcde"), 1, 0, S("abcde"), 1, 3, -3);
759     test(S("abcde"), 1, 0, S("abcde"), 1, 4, -4);
760     test(S("abcde"), 1, 0, S("abcde"), 1, 5, -4);
761     test(S("abcde"), 1, 0, S("abcde"), 2, 0, 0);
762     test(S("abcde"), 1, 0, S("abcde"), 2, 1, -1);
763     test(S("abcde"), 1, 0, S("abcde"), 2, 2, -2);
764     test(S("abcde"), 1, 0, S("abcde"), 2, 3, -3);
765     test(S("abcde"), 1, 0, S("abcde"), 2, 4, -3);
766     test(S("abcde"), 1, 0, S("abcde"), 4, 0, 0);
767     test(S("abcde"), 1, 0, S("abcde"), 4, 1, -1);
768     test(S("abcde"), 1, 0, S("abcde"), 4, 2, -1);
769     test(S("abcde"), 1, 0, S("abcde"), 5, 0, 0);
770     test(S("abcde"), 1, 0, S("abcde"), 5, 1, 0);
771     test(S("abcde"), 1, 0, S("abcde"), 6, 0, 0);
772     test(S("abcde"), 1, 0, S("abcdefghij"), 0, 0, 0);
773     test(S("abcde"), 1, 0, S("abcdefghij"), 0, 1, -1);
774     test(S("abcde"), 1, 0, S("abcdefghij"), 0, 5, -5);
775     test(S("abcde"), 1, 0, S("abcdefghij"), 0, 9, -9);
776     test(S("abcde"), 1, 0, S("abcdefghij"), 0, 10, -10);
777     test(S("abcde"), 1, 0, S("abcdefghij"), 0, 11, -10);
778     test(S("abcde"), 1, 0, S("abcdefghij"), 1, 0, 0);
779     test(S("abcde"), 1, 0, S("abcdefghij"), 1, 1, -1);
780 }
781
782 template <class S>
783 void test7()
784 {
785     test(S("abcde"), 1, 0, S("abcdefghij"), 1, 4, -4);
786     test(S("abcde"), 1, 0, S("abcdefghij"), 1, 8, -8);
787     test(S("abcde"), 1, 0, S("abcdefghij"), 1, 9, -9);
788     test(S("abcde"), 1, 0, S("abcdefghij"), 1, 10, -9);
789     test(S("abcde"), 1, 0, S("abcdefghij"), 5, 0, 0);
790     test(S("abcde"), 1, 0, S("abcdefghij"), 5, 1, -1);
791     test(S("abcde"), 1, 0, S("abcdefghij"), 5, 2, -2);
792     test(S("abcde"), 1, 0, S("abcdefghij"), 5, 4, -4);
793     test(S("abcde"), 1, 0, S("abcdefghij"), 5, 5, -5);
794     test(S("abcde"), 1, 0, S("abcdefghij"), 5, 6, -5);
795     test(S("abcde"), 1, 0, S("abcdefghij"), 9, 0, 0);
796     test(S("abcde"), 1, 0, S("abcdefghij"), 9, 1, -1);
797     test(S("abcde"), 1, 0, S("abcdefghij"), 9, 2, -1);
798     test(S("abcde"), 1, 0, S("abcdefghij"), 10, 0, 0);
799     test(S("abcde"), 1, 0, S("abcdefghij"), 10, 1, 0);
800     test(S("abcde"), 1, 0, S("abcdefghij"), 11, 0, 0);
801     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
802     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
803     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
804     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
805     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
806     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
807     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
808     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
809     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
810     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
811     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
812     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
813     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
814     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
815     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
816     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
817     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
818     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
819     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
820     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
821     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
822     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
823     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
824     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
825     test(S("abcde"), 1, 1, S(""), 0, 0, 1);
826     test(S("abcde"), 1, 1, S(""), 0, 1, 1);
827     test(S("abcde"), 1, 1, S(""), 1, 0, 0);
828     test(S("abcde"), 1, 1, S("abcde"), 0, 0, 1);
829     test(S("abcde"), 1, 1, S("abcde"), 0, 1, 1);
830     test(S("abcde"), 1, 1, S("abcde"), 0, 2, 1);
831     test(S("abcde"), 1, 1, S("abcde"), 0, 4, 1);
832     test(S("abcde"), 1, 1, S("abcde"), 0, 5, 1);
833     test(S("abcde"), 1, 1, S("abcde"), 0, 6, 1);
834     test(S("abcde"), 1, 1, S("abcde"), 1, 0, 1);
835     test(S("abcde"), 1, 1, S("abcde"), 1, 1, 0);
836     test(S("abcde"), 1, 1, S("abcde"), 1, 2, -1);
837     test(S("abcde"), 1, 1, S("abcde"), 1, 3, -2);
838     test(S("abcde"), 1, 1, S("abcde"), 1, 4, -3);
839     test(S("abcde"), 1, 1, S("abcde"), 1, 5, -3);
840     test(S("abcde"), 1, 1, S("abcde"), 2, 0, 1);
841     test(S("abcde"), 1, 1, S("abcde"), 2, 1, -1);
842     test(S("abcde"), 1, 1, S("abcde"), 2, 2, -1);
843     test(S("abcde"), 1, 1, S("abcde"), 2, 3, -1);
844     test(S("abcde"), 1, 1, S("abcde"), 2, 4, -1);
845     test(S("abcde"), 1, 1, S("abcde"), 4, 0, 1);
846     test(S("abcde"), 1, 1, S("abcde"), 4, 1, -3);
847     test(S("abcde"), 1, 1, S("abcde"), 4, 2, -3);
848     test(S("abcde"), 1, 1, S("abcde"), 5, 0, 1);
849     test(S("abcde"), 1, 1, S("abcde"), 5, 1, 1);
850     test(S("abcde"), 1, 1, S("abcde"), 6, 0, 0);
851     test(S("abcde"), 1, 1, S("abcdefghij"), 0, 0, 1);
852     test(S("abcde"), 1, 1, S("abcdefghij"), 0, 1, 1);
853     test(S("abcde"), 1, 1, S("abcdefghij"), 0, 5, 1);
854     test(S("abcde"), 1, 1, S("abcdefghij"), 0, 9, 1);
855     test(S("abcde"), 1, 1, S("abcdefghij"), 0, 10, 1);
856     test(S("abcde"), 1, 1, S("abcdefghij"), 0, 11, 1);
857     test(S("abcde"), 1, 1, S("abcdefghij"), 1, 0, 1);
858     test(S("abcde"), 1, 1, S("abcdefghij"), 1, 1, 0);
859     test(S("abcde"), 1, 1, S("abcdefghij"), 1, 4, -3);
860     test(S("abcde"), 1, 1, S("abcdefghij"), 1, 8, -7);
861     test(S("abcde"), 1, 1, S("abcdefghij"), 1, 9, -8);
862     test(S("abcde"), 1, 1, S("abcdefghij"), 1, 10, -8);
863     test(S("abcde"), 1, 1, S("abcdefghij"), 5, 0, 1);
864     test(S("abcde"), 1, 1, S("abcdefghij"), 5, 1, -4);
865     test(S("abcde"), 1, 1, S("abcdefghij"), 5, 2, -4);
866     test(S("abcde"), 1, 1, S("abcdefghij"), 5, 4, -4);
867     test(S("abcde"), 1, 1, S("abcdefghij"), 5, 5, -4);
868     test(S("abcde"), 1, 1, S("abcdefghij"), 5, 6, -4);
869     test(S("abcde"), 1, 1, S("abcdefghij"), 9, 0, 1);
870     test(S("abcde"), 1, 1, S("abcdefghij"), 9, 1, -8);
871     test(S("abcde"), 1, 1, S("abcdefghij"), 9, 2, -8);
872     test(S("abcde"), 1, 1, S("abcdefghij"), 10, 0, 1);
873     test(S("abcde"), 1, 1, S("abcdefghij"), 10, 1, 1);
874     test(S("abcde"), 1, 1, S("abcdefghij"), 11, 0, 0);
875     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
876     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1);
877     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1);
878     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1);
879     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1);
880     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1);
881     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
882     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0);
883     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8);
884     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17);
885 }
886
887 template <class S>
888 void test8()
889 {
890     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18);
891     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18);
892     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
893     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9);
894     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9);
895     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
896     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
897     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
898     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
899     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18);
900     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18);
901     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
902     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
903     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
904     test(S("abcde"), 1, 2, S(""), 0, 0, 2);
905     test(S("abcde"), 1, 2, S(""), 0, 1, 2);
906     test(S("abcde"), 1, 2, S(""), 1, 0, 0);
907     test(S("abcde"), 1, 2, S("abcde"), 0, 0, 2);
908     test(S("abcde"), 1, 2, S("abcde"), 0, 1, 1);
909     test(S("abcde"), 1, 2, S("abcde"), 0, 2, 1);
910     test(S("abcde"), 1, 2, S("abcde"), 0, 4, 1);
911     test(S("abcde"), 1, 2, S("abcde"), 0, 5, 1);
912     test(S("abcde"), 1, 2, S("abcde"), 0, 6, 1);
913     test(S("abcde"), 1, 2, S("abcde"), 1, 0, 2);
914     test(S("abcde"), 1, 2, S("abcde"), 1, 1, 1);
915     test(S("abcde"), 1, 2, S("abcde"), 1, 2, 0);
916     test(S("abcde"), 1, 2, S("abcde"), 1, 3, -1);
917     test(S("abcde"), 1, 2, S("abcde"), 1, 4, -2);
918     test(S("abcde"), 1, 2, S("abcde"), 1, 5, -2);
919     test(S("abcde"), 1, 2, S("abcde"), 2, 0, 2);
920     test(S("abcde"), 1, 2, S("abcde"), 2, 1, -1);
921     test(S("abcde"), 1, 2, S("abcde"), 2, 2, -1);
922     test(S("abcde"), 1, 2, S("abcde"), 2, 3, -1);
923     test(S("abcde"), 1, 2, S("abcde"), 2, 4, -1);
924     test(S("abcde"), 1, 2, S("abcde"), 4, 0, 2);
925     test(S("abcde"), 1, 2, S("abcde"), 4, 1, -3);
926     test(S("abcde"), 1, 2, S("abcde"), 4, 2, -3);
927     test(S("abcde"), 1, 2, S("abcde"), 5, 0, 2);
928     test(S("abcde"), 1, 2, S("abcde"), 5, 1, 2);
929     test(S("abcde"), 1, 2, S("abcde"), 6, 0, 0);
930     test(S("abcde"), 1, 2, S("abcdefghij"), 0, 0, 2);
931     test(S("abcde"), 1, 2, S("abcdefghij"), 0, 1, 1);
932     test(S("abcde"), 1, 2, S("abcdefghij"), 0, 5, 1);
933     test(S("abcde"), 1, 2, S("abcdefghij"), 0, 9, 1);
934     test(S("abcde"), 1, 2, S("abcdefghij"), 0, 10, 1);
935     test(S("abcde"), 1, 2, S("abcdefghij"), 0, 11, 1);
936     test(S("abcde"), 1, 2, S("abcdefghij"), 1, 0, 2);
937     test(S("abcde"), 1, 2, S("abcdefghij"), 1, 1, 1);
938     test(S("abcde"), 1, 2, S("abcdefghij"), 1, 4, -2);
939     test(S("abcde"), 1, 2, S("abcdefghij"), 1, 8, -6);
940     test(S("abcde"), 1, 2, S("abcdefghij"), 1, 9, -7);
941     test(S("abcde"), 1, 2, S("abcdefghij"), 1, 10, -7);
942     test(S("abcde"), 1, 2, S("abcdefghij"), 5, 0, 2);
943     test(S("abcde"), 1, 2, S("abcdefghij"), 5, 1, -4);
944     test(S("abcde"), 1, 2, S("abcdefghij"), 5, 2, -4);
945     test(S("abcde"), 1, 2, S("abcdefghij"), 5, 4, -4);
946     test(S("abcde"), 1, 2, S("abcdefghij"), 5, 5, -4);
947     test(S("abcde"), 1, 2, S("abcdefghij"), 5, 6, -4);
948     test(S("abcde"), 1, 2, S("abcdefghij"), 9, 0, 2);
949     test(S("abcde"), 1, 2, S("abcdefghij"), 9, 1, -8);
950     test(S("abcde"), 1, 2, S("abcdefghij"), 9, 2, -8);
951     test(S("abcde"), 1, 2, S("abcdefghij"), 10, 0, 2);
952     test(S("abcde"), 1, 2, S("abcdefghij"), 10, 1, 2);
953     test(S("abcde"), 1, 2, S("abcdefghij"), 11, 0, 0);
954     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
955     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 1, 1);
956     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 10, 1);
957     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 19, 1);
958     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 20, 1);
959     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 21, 1);
960     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
961     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 1, 1);
962     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 9, -7);
963     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 18, -16);
964     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 19, -17);
965     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 20, -17);
966     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
967     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 1, -9);
968     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 5, -9);
969     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 9, -9);
970     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 10, -9);
971     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 11, -9);
972     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
973     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 1, -18);
974     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 2, -18);
975     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
976     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
977     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
978     test(S("abcde"), 1, 3, S(""), 0, 0, 3);
979     test(S("abcde"), 1, 3, S(""), 0, 1, 3);
980     test(S("abcde"), 1, 3, S(""), 1, 0, 0);
981     test(S("abcde"), 1, 3, S("abcde"), 0, 0, 3);
982     test(S("abcde"), 1, 3, S("abcde"), 0, 1, 1);
983     test(S("abcde"), 1, 3, S("abcde"), 0, 2, 1);
984     test(S("abcde"), 1, 3, S("abcde"), 0, 4, 1);
985     test(S("abcde"), 1, 3, S("abcde"), 0, 5, 1);
986     test(S("abcde"), 1, 3, S("abcde"), 0, 6, 1);
987     test(S("abcde"), 1, 3, S("abcde"), 1, 0, 3);
988     test(S("abcde"), 1, 3, S("abcde"), 1, 1, 2);
989     test(S("abcde"), 1, 3, S("abcde"), 1, 2, 1);
990 }
991
992 template <class S>
993 void test9()
994 {
995     test(S("abcde"), 1, 3, S("abcde"), 1, 3, 0);
996     test(S("abcde"), 1, 3, S("abcde"), 1, 4, -1);
997     test(S("abcde"), 1, 3, S("abcde"), 1, 5, -1);
998     test(S("abcde"), 1, 3, S("abcde"), 2, 0, 3);
999     test(S("abcde"), 1, 3, S("abcde"), 2, 1, -1);
1000     test(S("abcde"), 1, 3, S("abcde"), 2, 2, -1);
1001     test(S("abcde"), 1, 3, S("abcde"), 2, 3, -1);
1002     test(S("abcde"), 1, 3, S("abcde"), 2, 4, -1);
1003     test(S("abcde"), 1, 3, S("abcde"), 4, 0, 3);
1004     test(S("abcde"), 1, 3, S("abcde"), 4, 1, -3);
1005     test(S("abcde"), 1, 3, S("abcde"), 4, 2, -3);
1006     test(S("abcde"), 1, 3, S("abcde"), 5, 0, 3);
1007     test(S("abcde"), 1, 3, S("abcde"), 5, 1, 3);
1008     test(S("abcde"), 1, 3, S("abcde"), 6, 0, 0);
1009     test(S("abcde"), 1, 3, S("abcdefghij"), 0, 0, 3);
1010     test(S("abcde"), 1, 3, S("abcdefghij"), 0, 1, 1);
1011     test(S("abcde"), 1, 3, S("abcdefghij"), 0, 5, 1);
1012     test(S("abcde"), 1, 3, S("abcdefghij"), 0, 9, 1);
1013     test(S("abcde"), 1, 3, S("abcdefghij"), 0, 10, 1);
1014     test(S("abcde"), 1, 3, S("abcdefghij"), 0, 11, 1);
1015     test(S("abcde"), 1, 3, S("abcdefghij"), 1, 0, 3);
1016     test(S("abcde"), 1, 3, S("abcdefghij"), 1, 1, 2);
1017     test(S("abcde"), 1, 3, S("abcdefghij"), 1, 4, -1);
1018     test(S("abcde"), 1, 3, S("abcdefghij"), 1, 8, -5);
1019     test(S("abcde"), 1, 3, S("abcdefghij"), 1, 9, -6);
1020     test(S("abcde"), 1, 3, S("abcdefghij"), 1, 10, -6);
1021     test(S("abcde"), 1, 3, S("abcdefghij"), 5, 0, 3);
1022     test(S("abcde"), 1, 3, S("abcdefghij"), 5, 1, -4);
1023     test(S("abcde"), 1, 3, S("abcdefghij"), 5, 2, -4);
1024     test(S("abcde"), 1, 3, S("abcdefghij"), 5, 4, -4);
1025     test(S("abcde"), 1, 3, S("abcdefghij"), 5, 5, -4);
1026     test(S("abcde"), 1, 3, S("abcdefghij"), 5, 6, -4);
1027     test(S("abcde"), 1, 3, S("abcdefghij"), 9, 0, 3);
1028     test(S("abcde"), 1, 3, S("abcdefghij"), 9, 1, -8);
1029     test(S("abcde"), 1, 3, S("abcdefghij"), 9, 2, -8);
1030     test(S("abcde"), 1, 3, S("abcdefghij"), 10, 0, 3);
1031     test(S("abcde"), 1, 3, S("abcdefghij"), 10, 1, 3);
1032     test(S("abcde"), 1, 3, S("abcdefghij"), 11, 0, 0);
1033     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 0, 3);
1034     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 1, 1);
1035     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 10, 1);
1036     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 19, 1);
1037     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 20, 1);
1038     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 21, 1);
1039     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 0, 3);
1040     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 1, 2);
1041     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 9, -6);
1042     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 18, -15);
1043     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 19, -16);
1044     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 20, -16);
1045     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 0, 3);
1046     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 1, -9);
1047     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 5, -9);
1048     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 9, -9);
1049     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 10, -9);
1050     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 11, -9);
1051     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 0, 3);
1052     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 1, -18);
1053     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 2, -18);
1054     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 20, 0, 3);
1055     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 20, 1, 3);
1056     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 21, 0, 0);
1057     test(S("abcde"), 1, 4, S(""), 0, 0, 4);
1058     test(S("abcde"), 1, 4, S(""), 0, 1, 4);
1059     test(S("abcde"), 1, 4, S(""), 1, 0, 0);
1060     test(S("abcde"), 1, 4, S("abcde"), 0, 0, 4);
1061     test(S("abcde"), 1, 4, S("abcde"), 0, 1, 1);
1062     test(S("abcde"), 1, 4, S("abcde"), 0, 2, 1);
1063     test(S("abcde"), 1, 4, S("abcde"), 0, 4, 1);
1064     test(S("abcde"), 1, 4, S("abcde"), 0, 5, 1);
1065     test(S("abcde"), 1, 4, S("abcde"), 0, 6, 1);
1066     test(S("abcde"), 1, 4, S("abcde"), 1, 0, 4);
1067     test(S("abcde"), 1, 4, S("abcde"), 1, 1, 3);
1068     test(S("abcde"), 1, 4, S("abcde"), 1, 2, 2);
1069     test(S("abcde"), 1, 4, S("abcde"), 1, 3, 1);
1070     test(S("abcde"), 1, 4, S("abcde"), 1, 4, 0);
1071     test(S("abcde"), 1, 4, S("abcde"), 1, 5, 0);
1072     test(S("abcde"), 1, 4, S("abcde"), 2, 0, 4);
1073     test(S("abcde"), 1, 4, S("abcde"), 2, 1, -1);
1074     test(S("abcde"), 1, 4, S("abcde"), 2, 2, -1);
1075     test(S("abcde"), 1, 4, S("abcde"), 2, 3, -1);
1076     test(S("abcde"), 1, 4, S("abcde"), 2, 4, -1);
1077     test(S("abcde"), 1, 4, S("abcde"), 4, 0, 4);
1078     test(S("abcde"), 1, 4, S("abcde"), 4, 1, -3);
1079     test(S("abcde"), 1, 4, S("abcde"), 4, 2, -3);
1080     test(S("abcde"), 1, 4, S("abcde"), 5, 0, 4);
1081     test(S("abcde"), 1, 4, S("abcde"), 5, 1, 4);
1082     test(S("abcde"), 1, 4, S("abcde"), 6, 0, 0);
1083     test(S("abcde"), 1, 4, S("abcdefghij"), 0, 0, 4);
1084     test(S("abcde"), 1, 4, S("abcdefghij"), 0, 1, 1);
1085     test(S("abcde"), 1, 4, S("abcdefghij"), 0, 5, 1);
1086     test(S("abcde"), 1, 4, S("abcdefghij"), 0, 9, 1);
1087     test(S("abcde"), 1, 4, S("abcdefghij"), 0, 10, 1);
1088     test(S("abcde"), 1, 4, S("abcdefghij"), 0, 11, 1);
1089     test(S("abcde"), 1, 4, S("abcdefghij"), 1, 0, 4);
1090     test(S("abcde"), 1, 4, S("abcdefghij"), 1, 1, 3);
1091     test(S("abcde"), 1, 4, S("abcdefghij"), 1, 4, 0);
1092     test(S("abcde"), 1, 4, S("abcdefghij"), 1, 8, -4);
1093     test(S("abcde"), 1, 4, S("abcdefghij"), 1, 9, -5);
1094     test(S("abcde"), 1, 4, S("abcdefghij"), 1, 10, -5);
1095 }
1096
1097 template <class S>
1098 void test10()
1099 {
1100     test(S("abcde"), 1, 4, S("abcdefghij"), 5, 0, 4);
1101     test(S("abcde"), 1, 4, S("abcdefghij"), 5, 1, -4);
1102     test(S("abcde"), 1, 4, S("abcdefghij"), 5, 2, -4);
1103     test(S("abcde"), 1, 4, S("abcdefghij"), 5, 4, -4);
1104     test(S("abcde"), 1, 4, S("abcdefghij"), 5, 5, -4);
1105     test(S("abcde"), 1, 4, S("abcdefghij"), 5, 6, -4);
1106     test(S("abcde"), 1, 4, S("abcdefghij"), 9, 0, 4);
1107     test(S("abcde"), 1, 4, S("abcdefghij"), 9, 1, -8);
1108     test(S("abcde"), 1, 4, S("abcdefghij"), 9, 2, -8);
1109     test(S("abcde"), 1, 4, S("abcdefghij"), 10, 0, 4);
1110     test(S("abcde"), 1, 4, S("abcdefghij"), 10, 1, 4);
1111     test(S("abcde"), 1, 4, S("abcdefghij"), 11, 0, 0);
1112     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
1113     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 1, 1);
1114     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 10, 1);
1115     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 19, 1);
1116     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 20, 1);
1117     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 21, 1);
1118     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
1119     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 1, 3);
1120     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 9, -5);
1121     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 18, -14);
1122     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 19, -15);
1123     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 20, -15);
1124     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
1125     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 1, -9);
1126     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 5, -9);
1127     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 9, -9);
1128     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 10, -9);
1129     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 11, -9);
1130     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
1131     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 1, -18);
1132     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 2, -18);
1133     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
1134     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
1135     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
1136     test(S("abcde"), 1, 5, S(""), 0, 0, 4);
1137     test(S("abcde"), 1, 5, S(""), 0, 1, 4);
1138     test(S("abcde"), 1, 5, S(""), 1, 0, 0);
1139     test(S("abcde"), 1, 5, S("abcde"), 0, 0, 4);
1140     test(S("abcde"), 1, 5, S("abcde"), 0, 1, 1);
1141     test(S("abcde"), 1, 5, S("abcde"), 0, 2, 1);
1142     test(S("abcde"), 1, 5, S("abcde"), 0, 4, 1);
1143     test(S("abcde"), 1, 5, S("abcde"), 0, 5, 1);
1144     test(S("abcde"), 1, 5, S("abcde"), 0, 6, 1);
1145     test(S("abcde"), 1, 5, S("abcde"), 1, 0, 4);
1146     test(S("abcde"), 1, 5, S("abcde"), 1, 1, 3);
1147     test(S("abcde"), 1, 5, S("abcde"), 1, 2, 2);
1148     test(S("abcde"), 1, 5, S("abcde"), 1, 3, 1);
1149     test(S("abcde"), 1, 5, S("abcde"), 1, 4, 0);
1150     test(S("abcde"), 1, 5, S("abcde"), 1, 5, 0);
1151     test(S("abcde"), 1, 5, S("abcde"), 2, 0, 4);
1152     test(S("abcde"), 1, 5, S("abcde"), 2, 1, -1);
1153     test(S("abcde"), 1, 5, S("abcde"), 2, 2, -1);
1154     test(S("abcde"), 1, 5, S("abcde"), 2, 3, -1);
1155     test(S("abcde"), 1, 5, S("abcde"), 2, 4, -1);
1156     test(S("abcde"), 1, 5, S("abcde"), 4, 0, 4);
1157     test(S("abcde"), 1, 5, S("abcde"), 4, 1, -3);
1158     test(S("abcde"), 1, 5, S("abcde"), 4, 2, -3);
1159     test(S("abcde"), 1, 5, S("abcde"), 5, 0, 4);
1160     test(S("abcde"), 1, 5, S("abcde"), 5, 1, 4);
1161     test(S("abcde"), 1, 5, S("abcde"), 6, 0, 0);
1162     test(S("abcde"), 1, 5, S("abcdefghij"), 0, 0, 4);
1163     test(S("abcde"), 1, 5, S("abcdefghij"), 0, 1, 1);
1164     test(S("abcde"), 1, 5, S("abcdefghij"), 0, 5, 1);
1165     test(S("abcde"), 1, 5, S("abcdefghij"), 0, 9, 1);
1166     test(S("abcde"), 1, 5, S("abcdefghij"), 0, 10, 1);
1167     test(S("abcde"), 1, 5, S("abcdefghij"), 0, 11, 1);
1168     test(S("abcde"), 1, 5, S("abcdefghij"), 1, 0, 4);
1169     test(S("abcde"), 1, 5, S("abcdefghij"), 1, 1, 3);
1170     test(S("abcde"), 1, 5, S("abcdefghij"), 1, 4, 0);
1171     test(S("abcde"), 1, 5, S("abcdefghij"), 1, 8, -4);
1172     test(S("abcde"), 1, 5, S("abcdefghij"), 1, 9, -5);
1173     test(S("abcde"), 1, 5, S("abcdefghij"), 1, 10, -5);
1174     test(S("abcde"), 1, 5, S("abcdefghij"), 5, 0, 4);
1175     test(S("abcde"), 1, 5, S("abcdefghij"), 5, 1, -4);
1176     test(S("abcde"), 1, 5, S("abcdefghij"), 5, 2, -4);
1177     test(S("abcde"), 1, 5, S("abcdefghij"), 5, 4, -4);
1178     test(S("abcde"), 1, 5, S("abcdefghij"), 5, 5, -4);
1179     test(S("abcde"), 1, 5, S("abcdefghij"), 5, 6, -4);
1180     test(S("abcde"), 1, 5, S("abcdefghij"), 9, 0, 4);
1181     test(S("abcde"), 1, 5, S("abcdefghij"), 9, 1, -8);
1182     test(S("abcde"), 1, 5, S("abcdefghij"), 9, 2, -8);
1183     test(S("abcde"), 1, 5, S("abcdefghij"), 10, 0, 4);
1184     test(S("abcde"), 1, 5, S("abcdefghij"), 10, 1, 4);
1185     test(S("abcde"), 1, 5, S("abcdefghij"), 11, 0, 0);
1186     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 0, 4);
1187     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 1, 1);
1188     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 10, 1);
1189     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 19, 1);
1190     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 20, 1);
1191     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 21, 1);
1192     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 0, 4);
1193     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 1, 3);
1194     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 9, -5);
1195     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 18, -14);
1196     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 19, -15);
1197     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 20, -15);
1198     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 0, 4);
1199     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 1, -9);
1200 }
1201
1202 template <class S>
1203 void test11()
1204 {
1205     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 5, -9);
1206     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 9, -9);
1207     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 10, -9);
1208     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 11, -9);
1209     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 0, 4);
1210     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 1, -18);
1211     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 2, -18);
1212     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 20, 0, 4);
1213     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 20, 1, 4);
1214     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
1215     test(S("abcde"), 2, 0, S(""), 0, 0, 0);
1216     test(S("abcde"), 2, 0, S(""), 0, 1, 0);
1217     test(S("abcde"), 2, 0, S(""), 1, 0, 0);
1218     test(S("abcde"), 2, 0, S("abcde"), 0, 0, 0);
1219     test(S("abcde"), 2, 0, S("abcde"), 0, 1, -1);
1220     test(S("abcde"), 2, 0, S("abcde"), 0, 2, -2);
1221     test(S("abcde"), 2, 0, S("abcde"), 0, 4, -4);
1222     test(S("abcde"), 2, 0, S("abcde"), 0, 5, -5);
1223     test(S("abcde"), 2, 0, S("abcde"), 0, 6, -5);
1224     test(S("abcde"), 2, 0, S("abcde"), 1, 0, 0);
1225     test(S("abcde"), 2, 0, S("abcde"), 1, 1, -1);
1226     test(S("abcde"), 2, 0, S("abcde"), 1, 2, -2);
1227     test(S("abcde"), 2, 0, S("abcde"), 1, 3, -3);
1228     test(S("abcde"), 2, 0, S("abcde"), 1, 4, -4);
1229     test(S("abcde"), 2, 0, S("abcde"), 1, 5, -4);
1230     test(S("abcde"), 2, 0, S("abcde"), 2, 0, 0);
1231     test(S("abcde"), 2, 0, S("abcde"), 2, 1, -1);
1232     test(S("abcde"), 2, 0, S("abcde"), 2, 2, -2);
1233     test(S("abcde"), 2, 0, S("abcde"), 2, 3, -3);
1234     test(S("abcde"), 2, 0, S("abcde"), 2, 4, -3);
1235     test(S("abcde"), 2, 0, S("abcde"), 4, 0, 0);
1236     test(S("abcde"), 2, 0, S("abcde"), 4, 1, -1);
1237     test(S("abcde"), 2, 0, S("abcde"), 4, 2, -1);
1238     test(S("abcde"), 2, 0, S("abcde"), 5, 0, 0);
1239     test(S("abcde"), 2, 0, S("abcde"), 5, 1, 0);
1240     test(S("abcde"), 2, 0, S("abcde"), 6, 0, 0);
1241     test(S("abcde"), 2, 0, S("abcdefghij"), 0, 0, 0);
1242     test(S("abcde"), 2, 0, S("abcdefghij"), 0, 1, -1);
1243     test(S("abcde"), 2, 0, S("abcdefghij"), 0, 5, -5);
1244     test(S("abcde"), 2, 0, S("abcdefghij"), 0, 9, -9);
1245     test(S("abcde"), 2, 0, S("abcdefghij"), 0, 10, -10);
1246     test(S("abcde"), 2, 0, S("abcdefghij"), 0, 11, -10);
1247     test(S("abcde"), 2, 0, S("abcdefghij"), 1, 0, 0);
1248     test(S("abcde"), 2, 0, S("abcdefghij"), 1, 1, -1);
1249     test(S("abcde"), 2, 0, S("abcdefghij"), 1, 4, -4);
1250     test(S("abcde"), 2, 0, S("abcdefghij"), 1, 8, -8);
1251     test(S("abcde"), 2, 0, S("abcdefghij"), 1, 9, -9);
1252     test(S("abcde"), 2, 0, S("abcdefghij"), 1, 10, -9);
1253     test(S("abcde"), 2, 0, S("abcdefghij"), 5, 0, 0);
1254     test(S("abcde"), 2, 0, S("abcdefghij"), 5, 1, -1);
1255     test(S("abcde"), 2, 0, S("abcdefghij"), 5, 2, -2);
1256     test(S("abcde"), 2, 0, S("abcdefghij"), 5, 4, -4);
1257     test(S("abcde"), 2, 0, S("abcdefghij"), 5, 5, -5);
1258     test(S("abcde"), 2, 0, S("abcdefghij"), 5, 6, -5);
1259     test(S("abcde"), 2, 0, S("abcdefghij"), 9, 0, 0);
1260     test(S("abcde"), 2, 0, S("abcdefghij"), 9, 1, -1);
1261     test(S("abcde"), 2, 0, S("abcdefghij"), 9, 2, -1);
1262     test(S("abcde"), 2, 0, S("abcdefghij"), 10, 0, 0);
1263     test(S("abcde"), 2, 0, S("abcdefghij"), 10, 1, 0);
1264     test(S("abcde"), 2, 0, S("abcdefghij"), 11, 0, 0);
1265     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
1266     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
1267     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
1268     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
1269     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
1270     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
1271     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
1272     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
1273     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
1274     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
1275     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
1276     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
1277     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
1278     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
1279     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
1280     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
1281     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
1282     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
1283     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
1284     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
1285     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
1286     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
1287     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
1288     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
1289     test(S("abcde"), 2, 1, S(""), 0, 0, 1);
1290     test(S("abcde"), 2, 1, S(""), 0, 1, 1);
1291     test(S("abcde"), 2, 1, S(""), 1, 0, 0);
1292     test(S("abcde"), 2, 1, S("abcde"), 0, 0, 1);
1293     test(S("abcde"), 2, 1, S("abcde"), 0, 1, 2);
1294     test(S("abcde"), 2, 1, S("abcde"), 0, 2, 2);
1295     test(S("abcde"), 2, 1, S("abcde"), 0, 4, 2);
1296     test(S("abcde"), 2, 1, S("abcde"), 0, 5, 2);
1297     test(S("abcde"), 2, 1, S("abcde"), 0, 6, 2);
1298     test(S("abcde"), 2, 1, S("abcde"), 1, 0, 1);
1299     test(S("abcde"), 2, 1, S("abcde"), 1, 1, 1);
1300     test(S("abcde"), 2, 1, S("abcde"), 1, 2, 1);
1301     test(S("abcde"), 2, 1, S("abcde"), 1, 3, 1);
1302     test(S("abcde"), 2, 1, S("abcde"), 1, 4, 1);
1303     test(S("abcde"), 2, 1, S("abcde"), 1, 5, 1);
1304     test(S("abcde"), 2, 1, S("abcde"), 2, 0, 1);
1305 }
1306
1307 template <class S>
1308 void test12()
1309 {
1310     test(S("abcde"), 2, 1, S("abcde"), 2, 1, 0);
1311     test(S("abcde"), 2, 1, S("abcde"), 2, 2, -1);
1312     test(S("abcde"), 2, 1, S("abcde"), 2, 3, -2);
1313     test(S("abcde"), 2, 1, S("abcde"), 2, 4, -2);
1314     test(S("abcde"), 2, 1, S("abcde"), 4, 0, 1);
1315     test(S("abcde"), 2, 1, S("abcde"), 4, 1, -2);
1316     test(S("abcde"), 2, 1, S("abcde"), 4, 2, -2);
1317     test(S("abcde"), 2, 1, S("abcde"), 5, 0, 1);
1318     test(S("abcde"), 2, 1, S("abcde"), 5, 1, 1);
1319     test(S("abcde"), 2, 1, S("abcde"), 6, 0, 0);
1320     test(S("abcde"), 2, 1, S("abcdefghij"), 0, 0, 1);
1321     test(S("abcde"), 2, 1, S("abcdefghij"), 0, 1, 2);
1322     test(S("abcde"), 2, 1, S("abcdefghij"), 0, 5, 2);
1323     test(S("abcde"), 2, 1, S("abcdefghij"), 0, 9, 2);
1324     test(S("abcde"), 2, 1, S("abcdefghij"), 0, 10, 2);
1325     test(S("abcde"), 2, 1, S("abcdefghij"), 0, 11, 2);
1326     test(S("abcde"), 2, 1, S("abcdefghij"), 1, 0, 1);
1327     test(S("abcde"), 2, 1, S("abcdefghij"), 1, 1, 1);
1328     test(S("abcde"), 2, 1, S("abcdefghij"), 1, 4, 1);
1329     test(S("abcde"), 2, 1, S("abcdefghij"), 1, 8, 1);
1330     test(S("abcde"), 2, 1, S("abcdefghij"), 1, 9, 1);
1331     test(S("abcde"), 2, 1, S("abcdefghij"), 1, 10, 1);
1332     test(S("abcde"), 2, 1, S("abcdefghij"), 5, 0, 1);
1333     test(S("abcde"), 2, 1, S("abcdefghij"), 5, 1, -3);
1334     test(S("abcde"), 2, 1, S("abcdefghij"), 5, 2, -3);
1335     test(S("abcde"), 2, 1, S("abcdefghij"), 5, 4, -3);
1336     test(S("abcde"), 2, 1, S("abcdefghij"), 5, 5, -3);
1337     test(S("abcde"), 2, 1, S("abcdefghij"), 5, 6, -3);
1338     test(S("abcde"), 2, 1, S("abcdefghij"), 9, 0, 1);
1339     test(S("abcde"), 2, 1, S("abcdefghij"), 9, 1, -7);
1340     test(S("abcde"), 2, 1, S("abcdefghij"), 9, 2, -7);
1341     test(S("abcde"), 2, 1, S("abcdefghij"), 10, 0, 1);
1342     test(S("abcde"), 2, 1, S("abcdefghij"), 10, 1, 1);
1343     test(S("abcde"), 2, 1, S("abcdefghij"), 11, 0, 0);
1344     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
1345     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 1, 2);
1346     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 10, 2);
1347     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 19, 2);
1348     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 20, 2);
1349     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 21, 2);
1350     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
1351     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 1, 1);
1352     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 9, 1);
1353     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 18, 1);
1354     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 19, 1);
1355     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 20, 1);
1356     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
1357     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 1, -8);
1358     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 5, -8);
1359     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 9, -8);
1360     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 10, -8);
1361     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 11, -8);
1362     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
1363     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 1, -17);
1364     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 2, -17);
1365     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
1366     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
1367     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
1368     test(S("abcde"), 2, 2, S(""), 0, 0, 2);
1369     test(S("abcde"), 2, 2, S(""), 0, 1, 2);
1370     test(S("abcde"), 2, 2, S(""), 1, 0, 0);
1371     test(S("abcde"), 2, 2, S("abcde"), 0, 0, 2);
1372     test(S("abcde"), 2, 2, S("abcde"), 0, 1, 2);
1373     test(S("abcde"), 2, 2, S("abcde"), 0, 2, 2);
1374     test(S("abcde"), 2, 2, S("abcde"), 0, 4, 2);
1375     test(S("abcde"), 2, 2, S("abcde"), 0, 5, 2);
1376     test(S("abcde"), 2, 2, S("abcde"), 0, 6, 2);
1377     test(S("abcde"), 2, 2, S("abcde"), 1, 0, 2);
1378     test(S("abcde"), 2, 2, S("abcde"), 1, 1, 1);
1379     test(S("abcde"), 2, 2, S("abcde"), 1, 2, 1);
1380     test(S("abcde"), 2, 2, S("abcde"), 1, 3, 1);
1381     test(S("abcde"), 2, 2, S("abcde"), 1, 4, 1);
1382     test(S("abcde"), 2, 2, S("abcde"), 1, 5, 1);
1383     test(S("abcde"), 2, 2, S("abcde"), 2, 0, 2);
1384     test(S("abcde"), 2, 2, S("abcde"), 2, 1, 1);
1385     test(S("abcde"), 2, 2, S("abcde"), 2, 2, 0);
1386     test(S("abcde"), 2, 2, S("abcde"), 2, 3, -1);
1387     test(S("abcde"), 2, 2, S("abcde"), 2, 4, -1);
1388     test(S("abcde"), 2, 2, S("abcde"), 4, 0, 2);
1389     test(S("abcde"), 2, 2, S("abcde"), 4, 1, -2);
1390     test(S("abcde"), 2, 2, S("abcde"), 4, 2, -2);
1391     test(S("abcde"), 2, 2, S("abcde"), 5, 0, 2);
1392     test(S("abcde"), 2, 2, S("abcde"), 5, 1, 2);
1393     test(S("abcde"), 2, 2, S("abcde"), 6, 0, 0);
1394     test(S("abcde"), 2, 2, S("abcdefghij"), 0, 0, 2);
1395     test(S("abcde"), 2, 2, S("abcdefghij"), 0, 1, 2);
1396     test(S("abcde"), 2, 2, S("abcdefghij"), 0, 5, 2);
1397     test(S("abcde"), 2, 2, S("abcdefghij"), 0, 9, 2);
1398     test(S("abcde"), 2, 2, S("abcdefghij"), 0, 10, 2);
1399     test(S("abcde"), 2, 2, S("abcdefghij"), 0, 11, 2);
1400     test(S("abcde"), 2, 2, S("abcdefghij"), 1, 0, 2);
1401     test(S("abcde"), 2, 2, S("abcdefghij"), 1, 1, 1);
1402     test(S("abcde"), 2, 2, S("abcdefghij"), 1, 4, 1);
1403     test(S("abcde"), 2, 2, S("abcdefghij"), 1, 8, 1);
1404     test(S("abcde"), 2, 2, S("abcdefghij"), 1, 9, 1);
1405     test(S("abcde"), 2, 2, S("abcdefghij"), 1, 10, 1);
1406     test(S("abcde"), 2, 2, S("abcdefghij"), 5, 0, 2);
1407     test(S("abcde"), 2, 2, S("abcdefghij"), 5, 1, -3);
1408     test(S("abcde"), 2, 2, S("abcdefghij"), 5, 2, -3);
1409     test(S("abcde"), 2, 2, S("abcdefghij"), 5, 4, -3);
1410 }
1411
1412 template <class S>
1413 void test13()
1414 {
1415     test(S("abcde"), 2, 2, S("abcdefghij"), 5, 5, -3);
1416     test(S("abcde"), 2, 2, S("abcdefghij"), 5, 6, -3);
1417     test(S("abcde"), 2, 2, S("abcdefghij"), 9, 0, 2);
1418     test(S("abcde"), 2, 2, S("abcdefghij"), 9, 1, -7);
1419     test(S("abcde"), 2, 2, S("abcdefghij"), 9, 2, -7);
1420     test(S("abcde"), 2, 2, S("abcdefghij"), 10, 0, 2);
1421     test(S("abcde"), 2, 2, S("abcdefghij"), 10, 1, 2);
1422     test(S("abcde"), 2, 2, S("abcdefghij"), 11, 0, 0);
1423     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
1424     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 1, 2);
1425     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 10, 2);
1426     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 19, 2);
1427     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 20, 2);
1428     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 21, 2);
1429     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
1430     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 1, 1);
1431     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 9, 1);
1432     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 18, 1);
1433     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 19, 1);
1434     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 20, 1);
1435     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
1436     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 1, -8);
1437     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 5, -8);
1438     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 9, -8);
1439     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 10, -8);
1440     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 11, -8);
1441     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
1442     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 1, -17);
1443     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 2, -17);
1444     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
1445     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
1446     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
1447     test(S("abcde"), 2, 3, S(""), 0, 0, 3);
1448     test(S("abcde"), 2, 3, S(""), 0, 1, 3);
1449     test(S("abcde"), 2, 3, S(""), 1, 0, 0);
1450     test(S("abcde"), 2, 3, S("abcde"), 0, 0, 3);
1451     test(S("abcde"), 2, 3, S("abcde"), 0, 1, 2);
1452     test(S("abcde"), 2, 3, S("abcde"), 0, 2, 2);
1453     test(S("abcde"), 2, 3, S("abcde"), 0, 4, 2);
1454     test(S("abcde"), 2, 3, S("abcde"), 0, 5, 2);
1455     test(S("abcde"), 2, 3, S("abcde"), 0, 6, 2);
1456     test(S("abcde"), 2, 3, S("abcde"), 1, 0, 3);
1457     test(S("abcde"), 2, 3, S("abcde"), 1, 1, 1);
1458     test(S("abcde"), 2, 3, S("abcde"), 1, 2, 1);
1459     test(S("abcde"), 2, 3, S("abcde"), 1, 3, 1);
1460     test(S("abcde"), 2, 3, S("abcde"), 1, 4, 1);
1461     test(S("abcde"), 2, 3, S("abcde"), 1, 5, 1);
1462     test(S("abcde"), 2, 3, S("abcde"), 2, 0, 3);
1463     test(S("abcde"), 2, 3, S("abcde"), 2, 1, 2);
1464     test(S("abcde"), 2, 3, S("abcde"), 2, 2, 1);
1465     test(S("abcde"), 2, 3, S("abcde"), 2, 3, 0);
1466     test(S("abcde"), 2, 3, S("abcde"), 2, 4, 0);
1467     test(S("abcde"), 2, 3, S("abcde"), 4, 0, 3);
1468     test(S("abcde"), 2, 3, S("abcde"), 4, 1, -2);
1469     test(S("abcde"), 2, 3, S("abcde"), 4, 2, -2);
1470     test(S("abcde"), 2, 3, S("abcde"), 5, 0, 3);
1471     test(S("abcde"), 2, 3, S("abcde"), 5, 1, 3);
1472     test(S("abcde"), 2, 3, S("abcde"), 6, 0, 0);
1473     test(S("abcde"), 2, 3, S("abcdefghij"), 0, 0, 3);
1474     test(S("abcde"), 2, 3, S("abcdefghij"), 0, 1, 2);
1475     test(S("abcde"), 2, 3, S("abcdefghij"), 0, 5, 2);
1476     test(S("abcde"), 2, 3, S("abcdefghij"), 0, 9, 2);
1477     test(S("abcde"), 2, 3, S("abcdefghij"), 0, 10, 2);
1478     test(S("abcde"), 2, 3, S("abcdefghij"), 0, 11, 2);
1479     test(S("abcde"), 2, 3, S("abcdefghij"), 1, 0, 3);
1480     test(S("abcde"), 2, 3, S("abcdefghij"), 1, 1, 1);
1481     test(S("abcde"), 2, 3, S("abcdefghij"), 1, 4, 1);
1482     test(S("abcde"), 2, 3, S("abcdefghij"), 1, 8, 1);
1483     test(S("abcde"), 2, 3, S("abcdefghij"), 1, 9, 1);
1484     test(S("abcde"), 2, 3, S("abcdefghij"), 1, 10, 1);
1485     test(S("abcde"), 2, 3, S("abcdefghij"), 5, 0, 3);
1486     test(S("abcde"), 2, 3, S("abcdefghij"), 5, 1, -3);
1487     test(S("abcde"), 2, 3, S("abcdefghij"), 5, 2, -3);
1488     test(S("abcde"), 2, 3, S("abcdefghij"), 5, 4, -3);
1489     test(S("abcde"), 2, 3, S("abcdefghij"), 5, 5, -3);
1490     test(S("abcde"), 2, 3, S("abcdefghij"), 5, 6, -3);
1491     test(S("abcde"), 2, 3, S("abcdefghij"), 9, 0, 3);
1492     test(S("abcde"), 2, 3, S("abcdefghij"), 9, 1, -7);
1493     test(S("abcde"), 2, 3, S("abcdefghij"), 9, 2, -7);
1494     test(S("abcde"), 2, 3, S("abcdefghij"), 10, 0, 3);
1495     test(S("abcde"), 2, 3, S("abcdefghij"), 10, 1, 3);
1496     test(S("abcde"), 2, 3, S("abcdefghij"), 11, 0, 0);
1497     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 0, 3);
1498     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 1, 2);
1499     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 10, 2);
1500     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 19, 2);
1501     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 20, 2);
1502     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 21, 2);
1503     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 0, 3);
1504     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 1, 1);
1505     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 9, 1);
1506     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 18, 1);
1507     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 19, 1);
1508     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 20, 1);
1509     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 0, 3);
1510     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 1, -8);
1511     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 5, -8);
1512     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 9, -8);
1513     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 10, -8);
1514     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 11, -8);
1515 }
1516
1517 template <class S>
1518 void test14()
1519 {
1520     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 0, 3);
1521     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 1, -17);
1522     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 2, -17);
1523     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 20, 0, 3);
1524     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 20, 1, 3);
1525     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 21, 0, 0);
1526     test(S("abcde"), 2, 4, S(""), 0, 0, 3);
1527     test(S("abcde"), 2, 4, S(""), 0, 1, 3);
1528     test(S("abcde"), 2, 4, S(""), 1, 0, 0);
1529     test(S("abcde"), 2, 4, S("abcde"), 0, 0, 3);
1530     test(S("abcde"), 2, 4, S("abcde"), 0, 1, 2);
1531     test(S("abcde"), 2, 4, S("abcde"), 0, 2, 2);
1532     test(S("abcde"), 2, 4, S("abcde"), 0, 4, 2);
1533     test(S("abcde"), 2, 4, S("abcde"), 0, 5, 2);
1534     test(S("abcde"), 2, 4, S("abcde"), 0, 6, 2);
1535     test(S("abcde"), 2, 4, S("abcde"), 1, 0, 3);
1536     test(S("abcde"), 2, 4, S("abcde"), 1, 1, 1);
1537     test(S("abcde"), 2, 4, S("abcde"), 1, 2, 1);
1538     test(S("abcde"), 2, 4, S("abcde"), 1, 3, 1);
1539     test(S("abcde"), 2, 4, S("abcde"), 1, 4, 1);
1540     test(S("abcde"), 2, 4, S("abcde"), 1, 5, 1);
1541     test(S("abcde"), 2, 4, S("abcde"), 2, 0, 3);
1542     test(S("abcde"), 2, 4, S("abcde"), 2, 1, 2);
1543     test(S("abcde"), 2, 4, S("abcde"), 2, 2, 1);
1544     test(S("abcde"), 2, 4, S("abcde"), 2, 3, 0);
1545     test(S("abcde"), 2, 4, S("abcde"), 2, 4, 0);
1546     test(S("abcde"), 2, 4, S("abcde"), 4, 0, 3);
1547     test(S("abcde"), 2, 4, S("abcde"), 4, 1, -2);
1548     test(S("abcde"), 2, 4, S("abcde"), 4, 2, -2);
1549     test(S("abcde"), 2, 4, S("abcde"), 5, 0, 3);
1550     test(S("abcde"), 2, 4, S("abcde"), 5, 1, 3);
1551     test(S("abcde"), 2, 4, S("abcde"), 6, 0, 0);
1552     test(S("abcde"), 2, 4, S("abcdefghij"), 0, 0, 3);
1553     test(S("abcde"), 2, 4, S("abcdefghij"), 0, 1, 2);
1554     test(S("abcde"), 2, 4, S("abcdefghij"), 0, 5, 2);
1555     test(S("abcde"), 2, 4, S("abcdefghij"), 0, 9, 2);
1556     test(S("abcde"), 2, 4, S("abcdefghij"), 0, 10, 2);
1557     test(S("abcde"), 2, 4, S("abcdefghij"), 0, 11, 2);
1558     test(S("abcde"), 2, 4, S("abcdefghij"), 1, 0, 3);
1559     test(S("abcde"), 2, 4, S("abcdefghij"), 1, 1, 1);
1560     test(S("abcde"), 2, 4, S("abcdefghij"), 1, 4, 1);
1561     test(S("abcde"), 2, 4, S("abcdefghij"), 1, 8, 1);
1562     test(S("abcde"), 2, 4, S("abcdefghij"), 1, 9, 1);
1563     test(S("abcde"), 2, 4, S("abcdefghij"), 1, 10, 1);
1564     test(S("abcde"), 2, 4, S("abcdefghij"), 5, 0, 3);
1565     test(S("abcde"), 2, 4, S("abcdefghij"), 5, 1, -3);
1566     test(S("abcde"), 2, 4, S("abcdefghij"), 5, 2, -3);
1567     test(S("abcde"), 2, 4, S("abcdefghij"), 5, 4, -3);
1568     test(S("abcde"), 2, 4, S("abcdefghij"), 5, 5, -3);
1569     test(S("abcde"), 2, 4, S("abcdefghij"), 5, 6, -3);
1570     test(S("abcde"), 2, 4, S("abcdefghij"), 9, 0, 3);
1571     test(S("abcde"), 2, 4, S("abcdefghij"), 9, 1, -7);
1572     test(S("abcde"), 2, 4, S("abcdefghij"), 9, 2, -7);
1573     test(S("abcde"), 2, 4, S("abcdefghij"), 10, 0, 3);
1574     test(S("abcde"), 2, 4, S("abcdefghij"), 10, 1, 3);
1575     test(S("abcde"), 2, 4, S("abcdefghij"), 11, 0, 0);
1576     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 0, 3);
1577     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 1, 2);
1578     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 10, 2);
1579     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 19, 2);
1580     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 20, 2);
1581     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 21, 2);
1582     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 0, 3);
1583     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 1, 1);
1584     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 9, 1);
1585     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 18, 1);
1586     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 19, 1);
1587     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 20, 1);
1588     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 0, 3);
1589     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 1, -8);
1590     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 5, -8);
1591     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 9, -8);
1592     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 10, -8);
1593     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 11, -8);
1594     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 0, 3);
1595     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 1, -17);
1596     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 2, -17);
1597     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 20, 0, 3);
1598     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 20, 1, 3);
1599     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
1600     test(S("abcde"), 4, 0, S(""), 0, 0, 0);
1601     test(S("abcde"), 4, 0, S(""), 0, 1, 0);
1602     test(S("abcde"), 4, 0, S(""), 1, 0, 0);
1603     test(S("abcde"), 4, 0, S("abcde"), 0, 0, 0);
1604     test(S("abcde"), 4, 0, S("abcde"), 0, 1, -1);
1605     test(S("abcde"), 4, 0, S("abcde"), 0, 2, -2);
1606     test(S("abcde"), 4, 0, S("abcde"), 0, 4, -4);
1607     test(S("abcde"), 4, 0, S("abcde"), 0, 5, -5);
1608     test(S("abcde"), 4, 0, S("abcde"), 0, 6, -5);
1609     test(S("abcde"), 4, 0, S("abcde"), 1, 0, 0);
1610     test(S("abcde"), 4, 0, S("abcde"), 1, 1, -1);
1611     test(S("abcde"), 4, 0, S("abcde"), 1, 2, -2);
1612     test(S("abcde"), 4, 0, S("abcde"), 1, 3, -3);
1613     test(S("abcde"), 4, 0, S("abcde"), 1, 4, -4);
1614     test(S("abcde"), 4, 0, S("abcde"), 1, 5, -4);
1615     test(S("abcde"), 4, 0, S("abcde"), 2, 0, 0);
1616     test(S("abcde"), 4, 0, S("abcde"), 2, 1, -1);
1617     test(S("abcde"), 4, 0, S("abcde"), 2, 2, -2);
1618     test(S("abcde"), 4, 0, S("abcde"), 2, 3, -3);
1619     test(S("abcde"), 4, 0, S("abcde"), 2, 4, -3);
1620 }
1621
1622 template <class S>
1623 void test15()
1624 {
1625     test(S("abcde"), 4, 0, S("abcde"), 4, 0, 0);
1626     test(S("abcde"), 4, 0, S("abcde"), 4, 1, -1);
1627     test(S("abcde"), 4, 0, S("abcde"), 4, 2, -1);
1628     test(S("abcde"), 4, 0, S("abcde"), 5, 0, 0);
1629     test(S("abcde"), 4, 0, S("abcde"), 5, 1, 0);
1630     test(S("abcde"), 4, 0, S("abcde"), 6, 0, 0);
1631     test(S("abcde"), 4, 0, S("abcdefghij"), 0, 0, 0);
1632     test(S("abcde"), 4, 0, S("abcdefghij"), 0, 1, -1);
1633     test(S("abcde"), 4, 0, S("abcdefghij"), 0, 5, -5);
1634     test(S("abcde"), 4, 0, S("abcdefghij"), 0, 9, -9);
1635     test(S("abcde"), 4, 0, S("abcdefghij"), 0, 10, -10);
1636     test(S("abcde"), 4, 0, S("abcdefghij"), 0, 11, -10);
1637     test(S("abcde"), 4, 0, S("abcdefghij"), 1, 0, 0);
1638     test(S("abcde"), 4, 0, S("abcdefghij"), 1, 1, -1);
1639     test(S("abcde"), 4, 0, S("abcdefghij"), 1, 4, -4);
1640     test(S("abcde"), 4, 0, S("abcdefghij"), 1, 8, -8);
1641     test(S("abcde"), 4, 0, S("abcdefghij"), 1, 9, -9);
1642     test(S("abcde"), 4, 0, S("abcdefghij"), 1, 10, -9);
1643     test(S("abcde"), 4, 0, S("abcdefghij"), 5, 0, 0);
1644     test(S("abcde"), 4, 0, S("abcdefghij"), 5, 1, -1);
1645     test(S("abcde"), 4, 0, S("abcdefghij"), 5, 2, -2);
1646     test(S("abcde"), 4, 0, S("abcdefghij"), 5, 4, -4);
1647     test(S("abcde"), 4, 0, S("abcdefghij"), 5, 5, -5);
1648     test(S("abcde"), 4, 0, S("abcdefghij"), 5, 6, -5);
1649     test(S("abcde"), 4, 0, S("abcdefghij"), 9, 0, 0);
1650     test(S("abcde"), 4, 0, S("abcdefghij"), 9, 1, -1);
1651     test(S("abcde"), 4, 0, S("abcdefghij"), 9, 2, -1);
1652     test(S("abcde"), 4, 0, S("abcdefghij"), 10, 0, 0);
1653     test(S("abcde"), 4, 0, S("abcdefghij"), 10, 1, 0);
1654     test(S("abcde"), 4, 0, S("abcdefghij"), 11, 0, 0);
1655     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
1656     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
1657     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
1658     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
1659     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
1660     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
1661     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
1662     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
1663     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
1664     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
1665     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
1666     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
1667     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
1668     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
1669     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
1670     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
1671     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
1672     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
1673     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
1674     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
1675     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
1676     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
1677     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
1678     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
1679     test(S("abcde"), 4, 1, S(""), 0, 0, 1);
1680     test(S("abcde"), 4, 1, S(""), 0, 1, 1);
1681     test(S("abcde"), 4, 1, S(""), 1, 0, 0);
1682     test(S("abcde"), 4, 1, S("abcde"), 0, 0, 1);
1683     test(S("abcde"), 4, 1, S("abcde"), 0, 1, 4);
1684     test(S("abcde"), 4, 1, S("abcde"), 0, 2, 4);
1685     test(S("abcde"), 4, 1, S("abcde"), 0, 4, 4);
1686     test(S("abcde"), 4, 1, S("abcde"), 0, 5, 4);
1687     test(S("abcde"), 4, 1, S("abcde"), 0, 6, 4);
1688     test(S("abcde"), 4, 1, S("abcde"), 1, 0, 1);
1689     test(S("abcde"), 4, 1, S("abcde"), 1, 1, 3);
1690     test(S("abcde"), 4, 1, S("abcde"), 1, 2, 3);
1691     test(S("abcde"), 4, 1, S("abcde"), 1, 3, 3);
1692     test(S("abcde"), 4, 1, S("abcde"), 1, 4, 3);
1693     test(S("abcde"), 4, 1, S("abcde"), 1, 5, 3);
1694     test(S("abcde"), 4, 1, S("abcde"), 2, 0, 1);
1695     test(S("abcde"), 4, 1, S("abcde"), 2, 1, 2);
1696     test(S("abcde"), 4, 1, S("abcde"), 2, 2, 2);
1697     test(S("abcde"), 4, 1, S("abcde"), 2, 3, 2);
1698     test(S("abcde"), 4, 1, S("abcde"), 2, 4, 2);
1699     test(S("abcde"), 4, 1, S("abcde"), 4, 0, 1);
1700     test(S("abcde"), 4, 1, S("abcde"), 4, 1, 0);
1701     test(S("abcde"), 4, 1, S("abcde"), 4, 2, 0);
1702     test(S("abcde"), 4, 1, S("abcde"), 5, 0, 1);
1703     test(S("abcde"), 4, 1, S("abcde"), 5, 1, 1);
1704     test(S("abcde"), 4, 1, S("abcde"), 6, 0, 0);
1705     test(S("abcde"), 4, 1, S("abcdefghij"), 0, 0, 1);
1706     test(S("abcde"), 4, 1, S("abcdefghij"), 0, 1, 4);
1707     test(S("abcde"), 4, 1, S("abcdefghij"), 0, 5, 4);
1708     test(S("abcde"), 4, 1, S("abcdefghij"), 0, 9, 4);
1709     test(S("abcde"), 4, 1, S("abcdefghij"), 0, 10, 4);
1710     test(S("abcde"), 4, 1, S("abcdefghij"), 0, 11, 4);
1711     test(S("abcde"), 4, 1, S("abcdefghij"), 1, 0, 1);
1712     test(S("abcde"), 4, 1, S("abcdefghij"), 1, 1, 3);
1713     test(S("abcde"), 4, 1, S("abcdefghij"), 1, 4, 3);
1714     test(S("abcde"), 4, 1, S("abcdefghij"), 1, 8, 3);
1715     test(S("abcde"), 4, 1, S("abcdefghij"), 1, 9, 3);
1716     test(S("abcde"), 4, 1, S("abcdefghij"), 1, 10, 3);
1717     test(S("abcde"), 4, 1, S("abcdefghij"), 5, 0, 1);
1718     test(S("abcde"), 4, 1, S("abcdefghij"), 5, 1, -1);
1719     test(S("abcde"), 4, 1, S("abcdefghij"), 5, 2, -1);
1720     test(S("abcde"), 4, 1, S("abcdefghij"), 5, 4, -1);
1721     test(S("abcde"), 4, 1, S("abcdefghij"), 5, 5, -1);
1722     test(S("abcde"), 4, 1, S("abcdefghij"), 5, 6, -1);
1723     test(S("abcde"), 4, 1, S("abcdefghij"), 9, 0, 1);
1724     test(S("abcde"), 4, 1, S("abcdefghij"), 9, 1, -5);
1725 }
1726
1727 template <class S>
1728 void test16()
1729 {
1730     test(S("abcde"), 4, 1, S("abcdefghij"), 9, 2, -5);
1731     test(S("abcde"), 4, 1, S("abcdefghij"), 10, 0, 1);
1732     test(S("abcde"), 4, 1, S("abcdefghij"), 10, 1, 1);
1733     test(S("abcde"), 4, 1, S("abcdefghij"), 11, 0, 0);
1734     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
1735     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 1, 4);
1736     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 10, 4);
1737     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 19, 4);
1738     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 20, 4);
1739     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 21, 4);
1740     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
1741     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 1, 3);
1742     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 9, 3);
1743     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 18, 3);
1744     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 19, 3);
1745     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 20, 3);
1746     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
1747     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 1, -6);
1748     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 5, -6);
1749     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 9, -6);
1750     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 10, -6);
1751     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 11, -6);
1752     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
1753     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 1, -15);
1754     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 2, -15);
1755     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
1756     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
1757     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
1758     test(S("abcde"), 4, 2, S(""), 0, 0, 1);
1759     test(S("abcde"), 4, 2, S(""), 0, 1, 1);
1760     test(S("abcde"), 4, 2, S(""), 1, 0, 0);
1761     test(S("abcde"), 4, 2, S("abcde"), 0, 0, 1);
1762     test(S("abcde"), 4, 2, S("abcde"), 0, 1, 4);
1763     test(S("abcde"), 4, 2, S("abcde"), 0, 2, 4);
1764     test(S("abcde"), 4, 2, S("abcde"), 0, 4, 4);
1765     test(S("abcde"), 4, 2, S("abcde"), 0, 5, 4);
1766     test(S("abcde"), 4, 2, S("abcde"), 0, 6, 4);
1767     test(S("abcde"), 4, 2, S("abcde"), 1, 0, 1);
1768     test(S("abcde"), 4, 2, S("abcde"), 1, 1, 3);
1769     test(S("abcde"), 4, 2, S("abcde"), 1, 2, 3);
1770     test(S("abcde"), 4, 2, S("abcde"), 1, 3, 3);
1771     test(S("abcde"), 4, 2, S("abcde"), 1, 4, 3);
1772     test(S("abcde"), 4, 2, S("abcde"), 1, 5, 3);
1773     test(S("abcde"), 4, 2, S("abcde"), 2, 0, 1);
1774     test(S("abcde"), 4, 2, S("abcde"), 2, 1, 2);
1775     test(S("abcde"), 4, 2, S("abcde"), 2, 2, 2);
1776     test(S("abcde"), 4, 2, S("abcde"), 2, 3, 2);
1777     test(S("abcde"), 4, 2, S("abcde"), 2, 4, 2);
1778     test(S("abcde"), 4, 2, S("abcde"), 4, 0, 1);
1779     test(S("abcde"), 4, 2, S("abcde"), 4, 1, 0);
1780     test(S("abcde"), 4, 2, S("abcde"), 4, 2, 0);
1781     test(S("abcde"), 4, 2, S("abcde"), 5, 0, 1);
1782     test(S("abcde"), 4, 2, S("abcde"), 5, 1, 1);
1783     test(S("abcde"), 4, 2, S("abcde"), 6, 0, 0);
1784     test(S("abcde"), 4, 2, S("abcdefghij"), 0, 0, 1);
1785     test(S("abcde"), 4, 2, S("abcdefghij"), 0, 1, 4);
1786     test(S("abcde"), 4, 2, S("abcdefghij"), 0, 5, 4);
1787     test(S("abcde"), 4, 2, S("abcdefghij"), 0, 9, 4);
1788     test(S("abcde"), 4, 2, S("abcdefghij"), 0, 10, 4);
1789     test(S("abcde"), 4, 2, S("abcdefghij"), 0, 11, 4);
1790     test(S("abcde"), 4, 2, S("abcdefghij"), 1, 0, 1);
1791     test(S("abcde"), 4, 2, S("abcdefghij"), 1, 1, 3);
1792     test(S("abcde"), 4, 2, S("abcdefghij"), 1, 4, 3);
1793     test(S("abcde"), 4, 2, S("abcdefghij"), 1, 8, 3);
1794     test(S("abcde"), 4, 2, S("abcdefghij"), 1, 9, 3);
1795     test(S("abcde"), 4, 2, S("abcdefghij"), 1, 10, 3);
1796     test(S("abcde"), 4, 2, S("abcdefghij"), 5, 0, 1);
1797     test(S("abcde"), 4, 2, S("abcdefghij"), 5, 1, -1);
1798     test(S("abcde"), 4, 2, S("abcdefghij"), 5, 2, -1);
1799     test(S("abcde"), 4, 2, S("abcdefghij"), 5, 4, -1);
1800     test(S("abcde"), 4, 2, S("abcdefghij"), 5, 5, -1);
1801     test(S("abcde"), 4, 2, S("abcdefghij"), 5, 6, -1);
1802     test(S("abcde"), 4, 2, S("abcdefghij"), 9, 0, 1);
1803     test(S("abcde"), 4, 2, S("abcdefghij"), 9, 1, -5);
1804     test(S("abcde"), 4, 2, S("abcdefghij"), 9, 2, -5);
1805     test(S("abcde"), 4, 2, S("abcdefghij"), 10, 0, 1);
1806     test(S("abcde"), 4, 2, S("abcdefghij"), 10, 1, 1);
1807     test(S("abcde"), 4, 2, S("abcdefghij"), 11, 0, 0);
1808     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 0, 1);
1809     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 1, 4);
1810     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 10, 4);
1811     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 19, 4);
1812     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 20, 4);
1813     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 21, 4);
1814     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 0, 1);
1815     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 1, 3);
1816     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 9, 3);
1817     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 18, 3);
1818     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 19, 3);
1819     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 20, 3);
1820     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 0, 1);
1821     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 1, -6);
1822     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 5, -6);
1823     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 9, -6);
1824     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 10, -6);
1825     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 11, -6);
1826     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 0, 1);
1827     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 1, -15);
1828     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 2, -15);
1829     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 20, 0, 1);
1830 }
1831
1832 template <class S>
1833 void test17()
1834 {
1835     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 20, 1, 1);
1836     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
1837     test(S("abcde"), 5, 0, S(""), 0, 0, 0);
1838     test(S("abcde"), 5, 0, S(""), 0, 1, 0);
1839     test(S("abcde"), 5, 0, S(""), 1, 0, 0);
1840     test(S("abcde"), 5, 0, S("abcde"), 0, 0, 0);
1841     test(S("abcde"), 5, 0, S("abcde"), 0, 1, -1);
1842     test(S("abcde"), 5, 0, S("abcde"), 0, 2, -2);
1843     test(S("abcde"), 5, 0, S("abcde"), 0, 4, -4);
1844     test(S("abcde"), 5, 0, S("abcde"), 0, 5, -5);
1845     test(S("abcde"), 5, 0, S("abcde"), 0, 6, -5);
1846     test(S("abcde"), 5, 0, S("abcde"), 1, 0, 0);
1847     test(S("abcde"), 5, 0, S("abcde"), 1, 1, -1);
1848     test(S("abcde"), 5, 0, S("abcde"), 1, 2, -2);
1849     test(S("abcde"), 5, 0, S("abcde"), 1, 3, -3);
1850     test(S("abcde"), 5, 0, S("abcde"), 1, 4, -4);
1851     test(S("abcde"), 5, 0, S("abcde"), 1, 5, -4);
1852     test(S("abcde"), 5, 0, S("abcde"), 2, 0, 0);
1853     test(S("abcde"), 5, 0, S("abcde"), 2, 1, -1);
1854     test(S("abcde"), 5, 0, S("abcde"), 2, 2, -2);
1855     test(S("abcde"), 5, 0, S("abcde"), 2, 3, -3);
1856     test(S("abcde"), 5, 0, S("abcde"), 2, 4, -3);
1857     test(S("abcde"), 5, 0, S("abcde"), 4, 0, 0);
1858     test(S("abcde"), 5, 0, S("abcde"), 4, 1, -1);
1859     test(S("abcde"), 5, 0, S("abcde"), 4, 2, -1);
1860     test(S("abcde"), 5, 0, S("abcde"), 5, 0, 0);
1861     test(S("abcde"), 5, 0, S("abcde"), 5, 1, 0);
1862     test(S("abcde"), 5, 0, S("abcde"), 6, 0, 0);
1863     test(S("abcde"), 5, 0, S("abcdefghij"), 0, 0, 0);
1864     test(S("abcde"), 5, 0, S("abcdefghij"), 0, 1, -1);
1865     test(S("abcde"), 5, 0, S("abcdefghij"), 0, 5, -5);
1866     test(S("abcde"), 5, 0, S("abcdefghij"), 0, 9, -9);
1867     test(S("abcde"), 5, 0, S("abcdefghij"), 0, 10, -10);
1868     test(S("abcde"), 5, 0, S("abcdefghij"), 0, 11, -10);
1869     test(S("abcde"), 5, 0, S("abcdefghij"), 1, 0, 0);
1870     test(S("abcde"), 5, 0, S("abcdefghij"), 1, 1, -1);
1871     test(S("abcde"), 5, 0, S("abcdefghij"), 1, 4, -4);
1872     test(S("abcde"), 5, 0, S("abcdefghij"), 1, 8, -8);
1873     test(S("abcde"), 5, 0, S("abcdefghij"), 1, 9, -9);
1874     test(S("abcde"), 5, 0, S("abcdefghij"), 1, 10, -9);
1875     test(S("abcde"), 5, 0, S("abcdefghij"), 5, 0, 0);
1876     test(S("abcde"), 5, 0, S("abcdefghij"), 5, 1, -1);
1877     test(S("abcde"), 5, 0, S("abcdefghij"), 5, 2, -2);
1878     test(S("abcde"), 5, 0, S("abcdefghij"), 5, 4, -4);
1879     test(S("abcde"), 5, 0, S("abcdefghij"), 5, 5, -5);
1880     test(S("abcde"), 5, 0, S("abcdefghij"), 5, 6, -5);
1881     test(S("abcde"), 5, 0, S("abcdefghij"), 9, 0, 0);
1882     test(S("abcde"), 5, 0, S("abcdefghij"), 9, 1, -1);
1883     test(S("abcde"), 5, 0, S("abcdefghij"), 9, 2, -1);
1884     test(S("abcde"), 5, 0, S("abcdefghij"), 10, 0, 0);
1885     test(S("abcde"), 5, 0, S("abcdefghij"), 10, 1, 0);
1886     test(S("abcde"), 5, 0, S("abcdefghij"), 11, 0, 0);
1887     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
1888     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
1889     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
1890     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
1891     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
1892     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
1893     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
1894     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
1895     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
1896     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
1897     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
1898     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
1899     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
1900     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
1901     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
1902     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
1903     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
1904     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
1905     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
1906     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
1907     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
1908     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
1909     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
1910     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
1911     test(S("abcde"), 5, 1, S(""), 0, 0, 0);
1912     test(S("abcde"), 5, 1, S(""), 0, 1, 0);
1913     test(S("abcde"), 5, 1, S(""), 1, 0, 0);
1914     test(S("abcde"), 5, 1, S("abcde"), 0, 0, 0);
1915     test(S("abcde"), 5, 1, S("abcde"), 0, 1, -1);
1916     test(S("abcde"), 5, 1, S("abcde"), 0, 2, -2);
1917     test(S("abcde"), 5, 1, S("abcde"), 0, 4, -4);
1918     test(S("abcde"), 5, 1, S("abcde"), 0, 5, -5);
1919     test(S("abcde"), 5, 1, S("abcde"), 0, 6, -5);
1920     test(S("abcde"), 5, 1, S("abcde"), 1, 0, 0);
1921     test(S("abcde"), 5, 1, S("abcde"), 1, 1, -1);
1922     test(S("abcde"), 5, 1, S("abcde"), 1, 2, -2);
1923     test(S("abcde"), 5, 1, S("abcde"), 1, 3, -3);
1924     test(S("abcde"), 5, 1, S("abcde"), 1, 4, -4);
1925     test(S("abcde"), 5, 1, S("abcde"), 1, 5, -4);
1926     test(S("abcde"), 5, 1, S("abcde"), 2, 0, 0);
1927     test(S("abcde"), 5, 1, S("abcde"), 2, 1, -1);
1928     test(S("abcde"), 5, 1, S("abcde"), 2, 2, -2);
1929     test(S("abcde"), 5, 1, S("abcde"), 2, 3, -3);
1930     test(S("abcde"), 5, 1, S("abcde"), 2, 4, -3);
1931     test(S("abcde"), 5, 1, S("abcde"), 4, 0, 0);
1932     test(S("abcde"), 5, 1, S("abcde"), 4, 1, -1);
1933     test(S("abcde"), 5, 1, S("abcde"), 4, 2, -1);
1934     test(S("abcde"), 5, 1, S("abcde"), 5, 0, 0);
1935 }
1936
1937 template <class S>
1938 void test18()
1939 {
1940     test(S("abcde"), 5, 1, S("abcde"), 5, 1, 0);
1941     test(S("abcde"), 5, 1, S("abcde"), 6, 0, 0);
1942     test(S("abcde"), 5, 1, S("abcdefghij"), 0, 0, 0);
1943     test(S("abcde"), 5, 1, S("abcdefghij"), 0, 1, -1);
1944     test(S("abcde"), 5, 1, S("abcdefghij"), 0, 5, -5);
1945     test(S("abcde"), 5, 1, S("abcdefghij"), 0, 9, -9);
1946     test(S("abcde"), 5, 1, S("abcdefghij"), 0, 10, -10);
1947     test(S("abcde"), 5, 1, S("abcdefghij"), 0, 11, -10);
1948     test(S("abcde"), 5, 1, S("abcdefghij"), 1, 0, 0);
1949     test(S("abcde"), 5, 1, S("abcdefghij"), 1, 1, -1);
1950     test(S("abcde"), 5, 1, S("abcdefghij"), 1, 4, -4);
1951     test(S("abcde"), 5, 1, S("abcdefghij"), 1, 8, -8);
1952     test(S("abcde"), 5, 1, S("abcdefghij"), 1, 9, -9);
1953     test(S("abcde"), 5, 1, S("abcdefghij"), 1, 10, -9);
1954     test(S("abcde"), 5, 1, S("abcdefghij"), 5, 0, 0);
1955     test(S("abcde"), 5, 1, S("abcdefghij"), 5, 1, -1);
1956     test(S("abcde"), 5, 1, S("abcdefghij"), 5, 2, -2);
1957     test(S("abcde"), 5, 1, S("abcdefghij"), 5, 4, -4);
1958     test(S("abcde"), 5, 1, S("abcdefghij"), 5, 5, -5);
1959     test(S("abcde"), 5, 1, S("abcdefghij"), 5, 6, -5);
1960     test(S("abcde"), 5, 1, S("abcdefghij"), 9, 0, 0);
1961     test(S("abcde"), 5, 1, S("abcdefghij"), 9, 1, -1);
1962     test(S("abcde"), 5, 1, S("abcdefghij"), 9, 2, -1);
1963     test(S("abcde"), 5, 1, S("abcdefghij"), 10, 0, 0);
1964     test(S("abcde"), 5, 1, S("abcdefghij"), 10, 1, 0);
1965     test(S("abcde"), 5, 1, S("abcdefghij"), 11, 0, 0);
1966     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
1967     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
1968     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
1969     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
1970     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
1971     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
1972     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
1973     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
1974     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
1975     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
1976     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
1977     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
1978     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
1979     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
1980     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
1981     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
1982     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
1983     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
1984     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
1985     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
1986     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
1987     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
1988     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
1989     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
1990     test(S("abcde"), 6, 0, S(""), 0, 0, 0);
1991     test(S("abcde"), 6, 0, S(""), 0, 1, 0);
1992     test(S("abcde"), 6, 0, S(""), 1, 0, 0);
1993     test(S("abcde"), 6, 0, S("abcde"), 0, 0, 0);
1994     test(S("abcde"), 6, 0, S("abcde"), 0, 1, 0);
1995     test(S("abcde"), 6, 0, S("abcde"), 0, 2, 0);
1996     test(S("abcde"), 6, 0, S("abcde"), 0, 4, 0);
1997     test(S("abcde"), 6, 0, S("abcde"), 0, 5, 0);
1998     test(S("abcde"), 6, 0, S("abcde"), 0, 6, 0);
1999     test(S("abcde"), 6, 0, S("abcde"), 1, 0, 0);
2000     test(S("abcde"), 6, 0, S("abcde"), 1, 1, 0);
2001     test(S("abcde"), 6, 0, S("abcde"), 1, 2, 0);
2002     test(S("abcde"), 6, 0, S("abcde"), 1, 3, 0);
2003     test(S("abcde"), 6, 0, S("abcde"), 1, 4, 0);
2004     test(S("abcde"), 6, 0, S("abcde"), 1, 5, 0);
2005     test(S("abcde"), 6, 0, S("abcde"), 2, 0, 0);
2006     test(S("abcde"), 6, 0, S("abcde"), 2, 1, 0);
2007     test(S("abcde"), 6, 0, S("abcde"), 2, 2, 0);
2008     test(S("abcde"), 6, 0, S("abcde"), 2, 3, 0);
2009     test(S("abcde"), 6, 0, S("abcde"), 2, 4, 0);
2010     test(S("abcde"), 6, 0, S("abcde"), 4, 0, 0);
2011     test(S("abcde"), 6, 0, S("abcde"), 4, 1, 0);
2012     test(S("abcde"), 6, 0, S("abcde"), 4, 2, 0);
2013     test(S("abcde"), 6, 0, S("abcde"), 5, 0, 0);
2014     test(S("abcde"), 6, 0, S("abcde"), 5, 1, 0);
2015     test(S("abcde"), 6, 0, S("abcde"), 6, 0, 0);
2016     test(S("abcde"), 6, 0, S("abcdefghij"), 0, 0, 0);
2017     test(S("abcde"), 6, 0, S("abcdefghij"), 0, 1, 0);
2018     test(S("abcde"), 6, 0, S("abcdefghij"), 0, 5, 0);
2019     test(S("abcde"), 6, 0, S("abcdefghij"), 0, 9, 0);
2020     test(S("abcde"), 6, 0, S("abcdefghij"), 0, 10, 0);
2021     test(S("abcde"), 6, 0, S("abcdefghij"), 0, 11, 0);
2022     test(S("abcde"), 6, 0, S("abcdefghij"), 1, 0, 0);
2023     test(S("abcde"), 6, 0, S("abcdefghij"), 1, 1, 0);
2024     test(S("abcde"), 6, 0, S("abcdefghij"), 1, 4, 0);
2025     test(S("abcde"), 6, 0, S("abcdefghij"), 1, 8, 0);
2026     test(S("abcde"), 6, 0, S("abcdefghij"), 1, 9, 0);
2027     test(S("abcde"), 6, 0, S("abcdefghij"), 1, 10, 0);
2028     test(S("abcde"), 6, 0, S("abcdefghij"), 5, 0, 0);
2029     test(S("abcde"), 6, 0, S("abcdefghij"), 5, 1, 0);
2030     test(S("abcde"), 6, 0, S("abcdefghij"), 5, 2, 0);
2031     test(S("abcde"), 6, 0, S("abcdefghij"), 5, 4, 0);
2032     test(S("abcde"), 6, 0, S("abcdefghij"), 5, 5, 0);
2033     test(S("abcde"), 6, 0, S("abcdefghij"), 5, 6, 0);
2034     test(S("abcde"), 6, 0, S("abcdefghij"), 9, 0, 0);
2035     test(S("abcde"), 6, 0, S("abcdefghij"), 9, 1, 0);
2036     test(S("abcde"), 6, 0, S("abcdefghij"), 9, 2, 0);
2037     test(S("abcde"), 6, 0, S("abcdefghij"), 10, 0, 0);
2038     test(S("abcde"), 6, 0, S("abcdefghij"), 10, 1, 0);
2039     test(S("abcde"), 6, 0, S("abcdefghij"), 11, 0, 0);
2040 }
2041
2042 template <class S>
2043 void test19()
2044 {
2045     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
2046     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
2047     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
2048     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
2049     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
2050     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
2051     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
2052     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
2053     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
2054     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
2055     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
2056     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
2057     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
2058     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
2059     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
2060     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
2061     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
2062     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
2063     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
2064     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
2065     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
2066     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
2067     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
2068     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
2069     test(S("abcdefghij"), 0, 0, S(""), 0, 0, 0);
2070     test(S("abcdefghij"), 0, 0, S(""), 0, 1, 0);
2071     test(S("abcdefghij"), 0, 0, S(""), 1, 0, 0);
2072     test(S("abcdefghij"), 0, 0, S("abcde"), 0, 0, 0);
2073     test(S("abcdefghij"), 0, 0, S("abcde"), 0, 1, -1);
2074     test(S("abcdefghij"), 0, 0, S("abcde"), 0, 2, -2);
2075     test(S("abcdefghij"), 0, 0, S("abcde"), 0, 4, -4);
2076     test(S("abcdefghij"), 0, 0, S("abcde"), 0, 5, -5);
2077     test(S("abcdefghij"), 0, 0, S("abcde"), 0, 6, -5);
2078     test(S("abcdefghij"), 0, 0, S("abcde"), 1, 0, 0);
2079     test(S("abcdefghij"), 0, 0, S("abcde"), 1, 1, -1);
2080     test(S("abcdefghij"), 0, 0, S("abcde"), 1, 2, -2);
2081     test(S("abcdefghij"), 0, 0, S("abcde"), 1, 3, -3);
2082     test(S("abcdefghij"), 0, 0, S("abcde"), 1, 4, -4);
2083     test(S("abcdefghij"), 0, 0, S("abcde"), 1, 5, -4);
2084     test(S("abcdefghij"), 0, 0, S("abcde"), 2, 0, 0);
2085     test(S("abcdefghij"), 0, 0, S("abcde"), 2, 1, -1);
2086     test(S("abcdefghij"), 0, 0, S("abcde"), 2, 2, -2);
2087     test(S("abcdefghij"), 0, 0, S("abcde"), 2, 3, -3);
2088     test(S("abcdefghij"), 0, 0, S("abcde"), 2, 4, -3);
2089     test(S("abcdefghij"), 0, 0, S("abcde"), 4, 0, 0);
2090     test(S("abcdefghij"), 0, 0, S("abcde"), 4, 1, -1);
2091     test(S("abcdefghij"), 0, 0, S("abcde"), 4, 2, -1);
2092     test(S("abcdefghij"), 0, 0, S("abcde"), 5, 0, 0);
2093     test(S("abcdefghij"), 0, 0, S("abcde"), 5, 1, 0);
2094     test(S("abcdefghij"), 0, 0, S("abcde"), 6, 0, 0);
2095     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 0, 0);
2096     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 1, -1);
2097     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 5, -5);
2098     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 9, -9);
2099     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 10, -10);
2100     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 11, -10);
2101     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 0, 0);
2102     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 1, -1);
2103     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 4, -4);
2104     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 8, -8);
2105     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 9, -9);
2106     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 10, -9);
2107     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 0, 0);
2108     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 1, -1);
2109     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 2, -2);
2110     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 4, -4);
2111     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 5, -5);
2112     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 6, -5);
2113     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 0, 0);
2114     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 1, -1);
2115     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 2, -1);
2116     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 10, 0, 0);
2117     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 10, 1, 0);
2118     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 11, 0, 0);
2119     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
2120     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
2121     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
2122     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
2123     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
2124     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
2125     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
2126     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
2127     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
2128     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
2129     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
2130     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
2131     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
2132     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
2133     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
2134     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
2135     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
2136     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
2137     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
2138     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
2139     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
2140     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
2141     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
2142     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
2143     test(S("abcdefghij"), 0, 1, S(""), 0, 0, 1);
2144     test(S("abcdefghij"), 0, 1, S(""), 0, 1, 1);
2145 }
2146
2147 template <class S>
2148 void test20()
2149 {
2150     test(S("abcdefghij"), 0, 1, S(""), 1, 0, 0);
2151     test(S("abcdefghij"), 0, 1, S("abcde"), 0, 0, 1);
2152     test(S("abcdefghij"), 0, 1, S("abcde"), 0, 1, 0);
2153     test(S("abcdefghij"), 0, 1, S("abcde"), 0, 2, -1);
2154     test(S("abcdefghij"), 0, 1, S("abcde"), 0, 4, -3);
2155     test(S("abcdefghij"), 0, 1, S("abcde"), 0, 5, -4);
2156     test(S("abcdefghij"), 0, 1, S("abcde"), 0, 6, -4);
2157     test(S("abcdefghij"), 0, 1, S("abcde"), 1, 0, 1);
2158     test(S("abcdefghij"), 0, 1, S("abcde"), 1, 1, -1);
2159     test(S("abcdefghij"), 0, 1, S("abcde"), 1, 2, -1);
2160     test(S("abcdefghij"), 0, 1, S("abcde"), 1, 3, -1);
2161     test(S("abcdefghij"), 0, 1, S("abcde"), 1, 4, -1);
2162     test(S("abcdefghij"), 0, 1, S("abcde"), 1, 5, -1);
2163     test(S("abcdefghij"), 0, 1, S("abcde"), 2, 0, 1);
2164     test(S("abcdefghij"), 0, 1, S("abcde"), 2, 1, -2);
2165     test(S("abcdefghij"), 0, 1, S("abcde"), 2, 2, -2);
2166     test(S("abcdefghij"), 0, 1, S("abcde"), 2, 3, -2);
2167     test(S("abcdefghij"), 0, 1, S("abcde"), 2, 4, -2);
2168     test(S("abcdefghij"), 0, 1, S("abcde"), 4, 0, 1);
2169     test(S("abcdefghij"), 0, 1, S("abcde"), 4, 1, -4);
2170     test(S("abcdefghij"), 0, 1, S("abcde"), 4, 2, -4);
2171     test(S("abcdefghij"), 0, 1, S("abcde"), 5, 0, 1);
2172     test(S("abcdefghij"), 0, 1, S("abcde"), 5, 1, 1);
2173     test(S("abcdefghij"), 0, 1, S("abcde"), 6, 0, 0);
2174     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 0, 1);
2175     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 1, 0);
2176     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 5, -4);
2177     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 9, -8);
2178     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 10, -9);
2179     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 11, -9);
2180     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 0, 1);
2181     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 1, -1);
2182     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 4, -1);
2183     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 8, -1);
2184     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 9, -1);
2185     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 10, -1);
2186     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 0, 1);
2187     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 1, -5);
2188     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 2, -5);
2189     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 4, -5);
2190     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 5, -5);
2191     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 6, -5);
2192     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 0, 1);
2193     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 1, -9);
2194     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 2, -9);
2195     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 10, 0, 1);
2196     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 10, 1, 1);
2197     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 11, 0, 0);
2198     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
2199     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0);
2200     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9);
2201     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18);
2202     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19);
2203     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19);
2204     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
2205     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
2206     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1);
2207     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1);
2208     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1);
2209     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1);
2210     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
2211     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10);
2212     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10);
2213     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10);
2214     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
2215     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
2216     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
2217     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19);
2218     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19);
2219     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
2220     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
2221     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
2222     test(S("abcdefghij"), 0, 5, S(""), 0, 0, 5);
2223     test(S("abcdefghij"), 0, 5, S(""), 0, 1, 5);
2224     test(S("abcdefghij"), 0, 5, S(""), 1, 0, 0);
2225     test(S("abcdefghij"), 0, 5, S("abcde"), 0, 0, 5);
2226     test(S("abcdefghij"), 0, 5, S("abcde"), 0, 1, 4);
2227     test(S("abcdefghij"), 0, 5, S("abcde"), 0, 2, 3);
2228     test(S("abcdefghij"), 0, 5, S("abcde"), 0, 4, 1);
2229     test(S("abcdefghij"), 0, 5, S("abcde"), 0, 5, 0);
2230     test(S("abcdefghij"), 0, 5, S("abcde"), 0, 6, 0);
2231     test(S("abcdefghij"), 0, 5, S("abcde"), 1, 0, 5);
2232     test(S("abcdefghij"), 0, 5, S("abcde"), 1, 1, -1);
2233     test(S("abcdefghij"), 0, 5, S("abcde"), 1, 2, -1);
2234     test(S("abcdefghij"), 0, 5, S("abcde"), 1, 3, -1);
2235     test(S("abcdefghij"), 0, 5, S("abcde"), 1, 4, -1);
2236     test(S("abcdefghij"), 0, 5, S("abcde"), 1, 5, -1);
2237     test(S("abcdefghij"), 0, 5, S("abcde"), 2, 0, 5);
2238     test(S("abcdefghij"), 0, 5, S("abcde"), 2, 1, -2);
2239     test(S("abcdefghij"), 0, 5, S("abcde"), 2, 2, -2);
2240     test(S("abcdefghij"), 0, 5, S("abcde"), 2, 3, -2);
2241     test(S("abcdefghij"), 0, 5, S("abcde"), 2, 4, -2);
2242     test(S("abcdefghij"), 0, 5, S("abcde"), 4, 0, 5);
2243     test(S("abcdefghij"), 0, 5, S("abcde"), 4, 1, -4);
2244     test(S("abcdefghij"), 0, 5, S("abcde"), 4, 2, -4);
2245     test(S("abcdefghij"), 0, 5, S("abcde"), 5, 0, 5);
2246     test(S("abcdefghij"), 0, 5, S("abcde"), 5, 1, 5);
2247     test(S("abcdefghij"), 0, 5, S("abcde"), 6, 0, 0);
2248     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 0, 5);
2249     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 1, 4);
2250 }
2251
2252 template <class S>
2253 void test21()
2254 {
2255     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 5, 0);
2256     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 9, -4);
2257     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 10, -5);
2258     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 11, -5);
2259     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 0, 5);
2260     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 1, -1);
2261     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 4, -1);
2262     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 8, -1);
2263     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 9, -1);
2264     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 10, -1);
2265     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 0, 5);
2266     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 1, -5);
2267     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 2, -5);
2268     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 4, -5);
2269     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 5, -5);
2270     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 6, -5);
2271     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 0, 5);
2272     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 1, -9);
2273     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 2, -9);
2274     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 10, 0, 5);
2275     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 10, 1, 5);
2276     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 11, 0, 0);
2277     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
2278     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 1, 4);
2279     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 10, -5);
2280     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 19, -14);
2281     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 20, -15);
2282     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 21, -15);
2283     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
2284     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 1, -1);
2285     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 9, -1);
2286     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 18, -1);
2287     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 19, -1);
2288     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 20, -1);
2289     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
2290     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 1, -10);
2291     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 5, -10);
2292     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 9, -10);
2293     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 10, -10);
2294     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 11, -10);
2295     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
2296     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 1, -19);
2297     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 2, -19);
2298     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
2299     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
2300     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
2301     test(S("abcdefghij"), 0, 9, S(""), 0, 0, 9);
2302     test(S("abcdefghij"), 0, 9, S(""), 0, 1, 9);
2303     test(S("abcdefghij"), 0, 9, S(""), 1, 0, 0);
2304     test(S("abcdefghij"), 0, 9, S("abcde"), 0, 0, 9);
2305     test(S("abcdefghij"), 0, 9, S("abcde"), 0, 1, 8);
2306     test(S("abcdefghij"), 0, 9, S("abcde"), 0, 2, 7);
2307     test(S("abcdefghij"), 0, 9, S("abcde"), 0, 4, 5);
2308     test(S("abcdefghij"), 0, 9, S("abcde"), 0, 5, 4);
2309     test(S("abcdefghij"), 0, 9, S("abcde"), 0, 6, 4);
2310     test(S("abcdefghij"), 0, 9, S("abcde"), 1, 0, 9);
2311     test(S("abcdefghij"), 0, 9, S("abcde"), 1, 1, -1);
2312     test(S("abcdefghij"), 0, 9, S("abcde"), 1, 2, -1);
2313     test(S("abcdefghij"), 0, 9, S("abcde"), 1, 3, -1);
2314     test(S("abcdefghij"), 0, 9, S("abcde"), 1, 4, -1);
2315     test(S("abcdefghij"), 0, 9, S("abcde"), 1, 5, -1);
2316     test(S("abcdefghij"), 0, 9, S("abcde"), 2, 0, 9);
2317     test(S("abcdefghij"), 0, 9, S("abcde"), 2, 1, -2);
2318     test(S("abcdefghij"), 0, 9, S("abcde"), 2, 2, -2);
2319     test(S("abcdefghij"), 0, 9, S("abcde"), 2, 3, -2);
2320     test(S("abcdefghij"), 0, 9, S("abcde"), 2, 4, -2);
2321     test(S("abcdefghij"), 0, 9, S("abcde"), 4, 0, 9);
2322     test(S("abcdefghij"), 0, 9, S("abcde"), 4, 1, -4);
2323     test(S("abcdefghij"), 0, 9, S("abcde"), 4, 2, -4);
2324     test(S("abcdefghij"), 0, 9, S("abcde"), 5, 0, 9);
2325     test(S("abcdefghij"), 0, 9, S("abcde"), 5, 1, 9);
2326     test(S("abcdefghij"), 0, 9, S("abcde"), 6, 0, 0);
2327     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 0, 9);
2328     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 1, 8);
2329     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 5, 4);
2330     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 9, 0);
2331     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 10, -1);
2332     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 11, -1);
2333     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 0, 9);
2334     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 1, -1);
2335     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 4, -1);
2336     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 8, -1);
2337     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 9, -1);
2338     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 10, -1);
2339     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 0, 9);
2340     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 1, -5);
2341     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 2, -5);
2342     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 4, -5);
2343     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 5, -5);
2344     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 6, -5);
2345     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 0, 9);
2346     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 1, -9);
2347     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 2, -9);
2348     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 10, 0, 9);
2349     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 10, 1, 9);
2350     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 11, 0, 0);
2351     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
2352     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 1, 8);
2353     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 10, -1);
2354     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 19, -10);
2355 }
2356
2357 template <class S>
2358 void test22()
2359 {
2360     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 20, -11);
2361     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 21, -11);
2362     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
2363     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 1, -1);
2364     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 9, -1);
2365     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 18, -1);
2366     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 19, -1);
2367     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 20, -1);
2368     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
2369     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 1, -10);
2370     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 5, -10);
2371     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 9, -10);
2372     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 10, -10);
2373     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 11, -10);
2374     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
2375     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 1, -19);
2376     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 2, -19);
2377     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
2378     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
2379     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
2380     test(S("abcdefghij"), 0, 10, S(""), 0, 0, 10);
2381     test(S("abcdefghij"), 0, 10, S(""), 0, 1, 10);
2382     test(S("abcdefghij"), 0, 10, S(""), 1, 0, 0);
2383     test(S("abcdefghij"), 0, 10, S("abcde"), 0, 0, 10);
2384     test(S("abcdefghij"), 0, 10, S("abcde"), 0, 1, 9);
2385     test(S("abcdefghij"), 0, 10, S("abcde"), 0, 2, 8);
2386     test(S("abcdefghij"), 0, 10, S("abcde"), 0, 4, 6);
2387     test(S("abcdefghij"), 0, 10, S("abcde"), 0, 5, 5);
2388     test(S("abcdefghij"), 0, 10, S("abcde"), 0, 6, 5);
2389     test(S("abcdefghij"), 0, 10, S("abcde"), 1, 0, 10);
2390     test(S("abcdefghij"), 0, 10, S("abcde"), 1, 1, -1);
2391     test(S("abcdefghij"), 0, 10, S("abcde"), 1, 2, -1);
2392     test(S("abcdefghij"), 0, 10, S("abcde"), 1, 3, -1);
2393     test(S("abcdefghij"), 0, 10, S("abcde"), 1, 4, -1);
2394     test(S("abcdefghij"), 0, 10, S("abcde"), 1, 5, -1);
2395     test(S("abcdefghij"), 0, 10, S("abcde"), 2, 0, 10);
2396     test(S("abcdefghij"), 0, 10, S("abcde"), 2, 1, -2);
2397     test(S("abcdefghij"), 0, 10, S("abcde"), 2, 2, -2);
2398     test(S("abcdefghij"), 0, 10, S("abcde"), 2, 3, -2);
2399     test(S("abcdefghij"), 0, 10, S("abcde"), 2, 4, -2);
2400     test(S("abcdefghij"), 0, 10, S("abcde"), 4, 0, 10);
2401     test(S("abcdefghij"), 0, 10, S("abcde"), 4, 1, -4);
2402     test(S("abcdefghij"), 0, 10, S("abcde"), 4, 2, -4);
2403     test(S("abcdefghij"), 0, 10, S("abcde"), 5, 0, 10);
2404     test(S("abcdefghij"), 0, 10, S("abcde"), 5, 1, 10);
2405     test(S("abcdefghij"), 0, 10, S("abcde"), 6, 0, 0);
2406     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 0, 10);
2407     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 1, 9);
2408     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 5, 5);
2409     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 9, 1);
2410     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 10, 0);
2411     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 11, 0);
2412     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 0, 10);
2413     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 1, -1);
2414     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 4, -1);
2415     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 8, -1);
2416     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 9, -1);
2417     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 10, -1);
2418     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 0, 10);
2419     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 1, -5);
2420     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 2, -5);
2421     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 4, -5);
2422     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 5, -5);
2423     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 6, -5);
2424     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 0, 10);
2425     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 1, -9);
2426     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 2, -9);
2427     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 10, 0, 10);
2428     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 10, 1, 10);
2429     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 11, 0, 0);
2430     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 0, 10);
2431     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 1, 9);
2432     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 10, 0);
2433     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 19, -9);
2434     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 20, -10);
2435     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 21, -10);
2436     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 0, 10);
2437     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 1, -1);
2438     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 9, -1);
2439     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 18, -1);
2440     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 19, -1);
2441     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 20, -1);
2442     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 0, 10);
2443     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 1, -10);
2444     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 5, -10);
2445     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 9, -10);
2446     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 10, -10);
2447     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 11, -10);
2448     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 0, 10);
2449     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 1, -19);
2450     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 2, -19);
2451     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 20, 0, 10);
2452     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 20, 1, 10);
2453     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
2454     test(S("abcdefghij"), 0, 11, S(""), 0, 0, 10);
2455     test(S("abcdefghij"), 0, 11, S(""), 0, 1, 10);
2456     test(S("abcdefghij"), 0, 11, S(""), 1, 0, 0);
2457     test(S("abcdefghij"), 0, 11, S("abcde"), 0, 0, 10);
2458     test(S("abcdefghij"), 0, 11, S("abcde"), 0, 1, 9);
2459     test(S("abcdefghij"), 0, 11, S("abcde"), 0, 2, 8);
2460 }
2461
2462 template <class S>
2463 void test23()
2464 {
2465     test(S("abcdefghij"), 0, 11, S("abcde"), 0, 4, 6);
2466     test(S("abcdefghij"), 0, 11, S("abcde"), 0, 5, 5);
2467     test(S("abcdefghij"), 0, 11, S("abcde"), 0, 6, 5);
2468     test(S("abcdefghij"), 0, 11, S("abcde"), 1, 0, 10);
2469     test(S("abcdefghij"), 0, 11, S("abcde"), 1, 1, -1);
2470     test(S("abcdefghij"), 0, 11, S("abcde"), 1, 2, -1);
2471     test(S("abcdefghij"), 0, 11, S("abcde"), 1, 3, -1);
2472     test(S("abcdefghij"), 0, 11, S("abcde"), 1, 4, -1);
2473     test(S("abcdefghij"), 0, 11, S("abcde"), 1, 5, -1);
2474     test(S("abcdefghij"), 0, 11, S("abcde"), 2, 0, 10);
2475     test(S("abcdefghij"), 0, 11, S("abcde"), 2, 1, -2);
2476     test(S("abcdefghij"), 0, 11, S("abcde"), 2, 2, -2);
2477     test(S("abcdefghij"), 0, 11, S("abcde"), 2, 3, -2);
2478     test(S("abcdefghij"), 0, 11, S("abcde"), 2, 4, -2);
2479     test(S("abcdefghij"), 0, 11, S("abcde"), 4, 0, 10);
2480     test(S("abcdefghij"), 0, 11, S("abcde"), 4, 1, -4);
2481     test(S("abcdefghij"), 0, 11, S("abcde"), 4, 2, -4);
2482     test(S("abcdefghij"), 0, 11, S("abcde"), 5, 0, 10);
2483     test(S("abcdefghij"), 0, 11, S("abcde"), 5, 1, 10);
2484     test(S("abcdefghij"), 0, 11, S("abcde"), 6, 0, 0);
2485     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 0, 10);
2486     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 1, 9);
2487     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 5, 5);
2488     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 9, 1);
2489     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 10, 0);
2490     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 11, 0);
2491     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 0, 10);
2492     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 1, -1);
2493     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 4, -1);
2494     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 8, -1);
2495     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 9, -1);
2496     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 10, -1);
2497     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 0, 10);
2498     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 1, -5);
2499     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 2, -5);
2500     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 4, -5);
2501     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 5, -5);
2502     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 6, -5);
2503     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 0, 10);
2504     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 1, -9);
2505     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 2, -9);
2506     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 10, 0, 10);
2507     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 10, 1, 10);
2508     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 11, 0, 0);
2509     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 0, 10);
2510     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 1, 9);
2511     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 10, 0);
2512     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 19, -9);
2513     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 20, -10);
2514     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 21, -10);
2515     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 0, 10);
2516     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 1, -1);
2517     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 9, -1);
2518     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 18, -1);
2519     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 19, -1);
2520     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 20, -1);
2521     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 0, 10);
2522     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 1, -10);
2523     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 5, -10);
2524     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 9, -10);
2525     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 10, -10);
2526     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 11, -10);
2527     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 0, 10);
2528     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 1, -19);
2529     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 2, -19);
2530     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 20, 0, 10);
2531     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 20, 1, 10);
2532     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 21, 0, 0);
2533     test(S("abcdefghij"), 1, 0, S(""), 0, 0, 0);
2534     test(S("abcdefghij"), 1, 0, S(""), 0, 1, 0);
2535     test(S("abcdefghij"), 1, 0, S(""), 1, 0, 0);
2536     test(S("abcdefghij"), 1, 0, S("abcde"), 0, 0, 0);
2537     test(S("abcdefghij"), 1, 0, S("abcde"), 0, 1, -1);
2538     test(S("abcdefghij"), 1, 0, S("abcde"), 0, 2, -2);
2539     test(S("abcdefghij"), 1, 0, S("abcde"), 0, 4, -4);
2540     test(S("abcdefghij"), 1, 0, S("abcde"), 0, 5, -5);
2541     test(S("abcdefghij"), 1, 0, S("abcde"), 0, 6, -5);
2542     test(S("abcdefghij"), 1, 0, S("abcde"), 1, 0, 0);
2543     test(S("abcdefghij"), 1, 0, S("abcde"), 1, 1, -1);
2544     test(S("abcdefghij"), 1, 0, S("abcde"), 1, 2, -2);
2545     test(S("abcdefghij"), 1, 0, S("abcde"), 1, 3, -3);
2546     test(S("abcdefghij"), 1, 0, S("abcde"), 1, 4, -4);
2547     test(S("abcdefghij"), 1, 0, S("abcde"), 1, 5, -4);
2548     test(S("abcdefghij"), 1, 0, S("abcde"), 2, 0, 0);
2549     test(S("abcdefghij"), 1, 0, S("abcde"), 2, 1, -1);
2550     test(S("abcdefghij"), 1, 0, S("abcde"), 2, 2, -2);
2551     test(S("abcdefghij"), 1, 0, S("abcde"), 2, 3, -3);
2552     test(S("abcdefghij"), 1, 0, S("abcde"), 2, 4, -3);
2553     test(S("abcdefghij"), 1, 0, S("abcde"), 4, 0, 0);
2554     test(S("abcdefghij"), 1, 0, S("abcde"), 4, 1, -1);
2555     test(S("abcdefghij"), 1, 0, S("abcde"), 4, 2, -1);
2556     test(S("abcdefghij"), 1, 0, S("abcde"), 5, 0, 0);
2557     test(S("abcdefghij"), 1, 0, S("abcde"), 5, 1, 0);
2558     test(S("abcdefghij"), 1, 0, S("abcde"), 6, 0, 0);
2559     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 0, 0);
2560     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 1, -1);
2561     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 5, -5);
2562     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 9, -9);
2563     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 10, -10);
2564     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 11, -10);
2565 }
2566
2567 template <class S>
2568 void test24()
2569 {
2570     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 0, 0);
2571     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 1, -1);
2572     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 4, -4);
2573     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 8, -8);
2574     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 9, -9);
2575     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 10, -9);
2576     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 0, 0);
2577     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 1, -1);
2578     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 2, -2);
2579     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 4, -4);
2580     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 5, -5);
2581     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 6, -5);
2582     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 0, 0);
2583     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 1, -1);
2584     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 2, -1);
2585     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 10, 0, 0);
2586     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 10, 1, 0);
2587     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 11, 0, 0);
2588     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
2589     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
2590     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
2591     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
2592     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
2593     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
2594     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
2595     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
2596     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
2597     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
2598     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
2599     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
2600     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
2601     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
2602     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
2603     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
2604     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
2605     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
2606     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
2607     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
2608     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
2609     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
2610     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
2611     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
2612     test(S("abcdefghij"), 1, 1, S(""), 0, 0, 1);
2613     test(S("abcdefghij"), 1, 1, S(""), 0, 1, 1);
2614     test(S("abcdefghij"), 1, 1, S(""), 1, 0, 0);
2615     test(S("abcdefghij"), 1, 1, S("abcde"), 0, 0, 1);
2616     test(S("abcdefghij"), 1, 1, S("abcde"), 0, 1, 1);
2617     test(S("abcdefghij"), 1, 1, S("abcde"), 0, 2, 1);
2618     test(S("abcdefghij"), 1, 1, S("abcde"), 0, 4, 1);
2619     test(S("abcdefghij"), 1, 1, S("abcde"), 0, 5, 1);
2620     test(S("abcdefghij"), 1, 1, S("abcde"), 0, 6, 1);
2621     test(S("abcdefghij"), 1, 1, S("abcde"), 1, 0, 1);
2622     test(S("abcdefghij"), 1, 1, S("abcde"), 1, 1, 0);
2623     test(S("abcdefghij"), 1, 1, S("abcde"), 1, 2, -1);
2624     test(S("abcdefghij"), 1, 1, S("abcde"), 1, 3, -2);
2625     test(S("abcdefghij"), 1, 1, S("abcde"), 1, 4, -3);
2626     test(S("abcdefghij"), 1, 1, S("abcde"), 1, 5, -3);
2627     test(S("abcdefghij"), 1, 1, S("abcde"), 2, 0, 1);
2628     test(S("abcdefghij"), 1, 1, S("abcde"), 2, 1, -1);
2629     test(S("abcdefghij"), 1, 1, S("abcde"), 2, 2, -1);
2630     test(S("abcdefghij"), 1, 1, S("abcde"), 2, 3, -1);
2631     test(S("abcdefghij"), 1, 1, S("abcde"), 2, 4, -1);
2632     test(S("abcdefghij"), 1, 1, S("abcde"), 4, 0, 1);
2633     test(S("abcdefghij"), 1, 1, S("abcde"), 4, 1, -3);
2634     test(S("abcdefghij"), 1, 1, S("abcde"), 4, 2, -3);
2635     test(S("abcdefghij"), 1, 1, S("abcde"), 5, 0, 1);
2636     test(S("abcdefghij"), 1, 1, S("abcde"), 5, 1, 1);
2637     test(S("abcdefghij"), 1, 1, S("abcde"), 6, 0, 0);
2638     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 0, 1);
2639     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 1, 1);
2640     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 5, 1);
2641     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 9, 1);
2642     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 10, 1);
2643     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 11, 1);
2644     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 0, 1);
2645     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 1, 0);
2646     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 4, -3);
2647     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 8, -7);
2648     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 9, -8);
2649     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 10, -8);
2650     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 0, 1);
2651     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 1, -4);
2652     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 2, -4);
2653     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 4, -4);
2654     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 5, -4);
2655     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 6, -4);
2656     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 0, 1);
2657     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 1, -8);
2658     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 2, -8);
2659     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 10, 0, 1);
2660     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 10, 1, 1);
2661     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 11, 0, 0);
2662     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
2663     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1);
2664     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1);
2665     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1);
2666     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1);
2667     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1);
2668     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
2669     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0);
2670 }
2671
2672 template <class S>
2673 void test25()
2674 {
2675     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8);
2676     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17);
2677     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18);
2678     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18);
2679     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
2680     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9);
2681     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9);
2682     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
2683     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
2684     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
2685     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
2686     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18);
2687     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18);
2688     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
2689     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
2690     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
2691     test(S("abcdefghij"), 1, 4, S(""), 0, 0, 4);
2692     test(S("abcdefghij"), 1, 4, S(""), 0, 1, 4);
2693     test(S("abcdefghij"), 1, 4, S(""), 1, 0, 0);
2694     test(S("abcdefghij"), 1, 4, S("abcde"), 0, 0, 4);
2695     test(S("abcdefghij"), 1, 4, S("abcde"), 0, 1, 1);
2696     test(S("abcdefghij"), 1, 4, S("abcde"), 0, 2, 1);
2697     test(S("abcdefghij"), 1, 4, S("abcde"), 0, 4, 1);
2698     test(S("abcdefghij"), 1, 4, S("abcde"), 0, 5, 1);
2699     test(S("abcdefghij"), 1, 4, S("abcde"), 0, 6, 1);
2700     test(S("abcdefghij"), 1, 4, S("abcde"), 1, 0, 4);
2701     test(S("abcdefghij"), 1, 4, S("abcde"), 1, 1, 3);
2702     test(S("abcdefghij"), 1, 4, S("abcde"), 1, 2, 2);
2703     test(S("abcdefghij"), 1, 4, S("abcde"), 1, 3, 1);
2704     test(S("abcdefghij"), 1, 4, S("abcde"), 1, 4, 0);
2705     test(S("abcdefghij"), 1, 4, S("abcde"), 1, 5, 0);
2706     test(S("abcdefghij"), 1, 4, S("abcde"), 2, 0, 4);
2707     test(S("abcdefghij"), 1, 4, S("abcde"), 2, 1, -1);
2708     test(S("abcdefghij"), 1, 4, S("abcde"), 2, 2, -1);
2709     test(S("abcdefghij"), 1, 4, S("abcde"), 2, 3, -1);
2710     test(S("abcdefghij"), 1, 4, S("abcde"), 2, 4, -1);
2711     test(S("abcdefghij"), 1, 4, S("abcde"), 4, 0, 4);
2712     test(S("abcdefghij"), 1, 4, S("abcde"), 4, 1, -3);
2713     test(S("abcdefghij"), 1, 4, S("abcde"), 4, 2, -3);
2714     test(S("abcdefghij"), 1, 4, S("abcde"), 5, 0, 4);
2715     test(S("abcdefghij"), 1, 4, S("abcde"), 5, 1, 4);
2716     test(S("abcdefghij"), 1, 4, S("abcde"), 6, 0, 0);
2717     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 0, 4);
2718     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 1, 1);
2719     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 5, 1);
2720     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 9, 1);
2721     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 10, 1);
2722     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 11, 1);
2723     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 0, 4);
2724     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 1, 3);
2725     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 4, 0);
2726     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 8, -4);
2727     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 9, -5);
2728     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 10, -5);
2729     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 0, 4);
2730     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 1, -4);
2731     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 2, -4);
2732     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 4, -4);
2733     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 5, -4);
2734     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 6, -4);
2735     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 0, 4);
2736     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 1, -8);
2737     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 2, -8);
2738     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 10, 0, 4);
2739     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 10, 1, 4);
2740     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 11, 0, 0);
2741     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
2742     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 1, 1);
2743     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 10, 1);
2744     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 19, 1);
2745     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 20, 1);
2746     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 21, 1);
2747     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
2748     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 1, 3);
2749     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 9, -5);
2750     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 18, -14);
2751     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 19, -15);
2752     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 20, -15);
2753     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
2754     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 1, -9);
2755     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 5, -9);
2756     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 9, -9);
2757     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 10, -9);
2758     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 11, -9);
2759     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
2760     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 1, -18);
2761     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 2, -18);
2762     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
2763     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
2764     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
2765     test(S("abcdefghij"), 1, 8, S(""), 0, 0, 8);
2766     test(S("abcdefghij"), 1, 8, S(""), 0, 1, 8);
2767     test(S("abcdefghij"), 1, 8, S(""), 1, 0, 0);
2768     test(S("abcdefghij"), 1, 8, S("abcde"), 0, 0, 8);
2769     test(S("abcdefghij"), 1, 8, S("abcde"), 0, 1, 1);
2770     test(S("abcdefghij"), 1, 8, S("abcde"), 0, 2, 1);
2771     test(S("abcdefghij"), 1, 8, S("abcde"), 0, 4, 1);
2772     test(S("abcdefghij"), 1, 8, S("abcde"), 0, 5, 1);
2773     test(S("abcdefghij"), 1, 8, S("abcde"), 0, 6, 1);
2774     test(S("abcdefghij"), 1, 8, S("abcde"), 1, 0, 8);
2775 }
2776
2777 template <class S>
2778 void test26()
2779 {
2780     test(S("abcdefghij"), 1, 8, S("abcde"), 1, 1, 7);
2781     test(S("abcdefghij"), 1, 8, S("abcde"), 1, 2, 6);
2782     test(S("abcdefghij"), 1, 8, S("abcde"), 1, 3, 5);
2783     test(S("abcdefghij"), 1, 8, S("abcde"), 1, 4, 4);
2784     test(S("abcdefghij"), 1, 8, S("abcde"), 1, 5, 4);
2785     test(S("abcdefghij"), 1, 8, S("abcde"), 2, 0, 8);
2786     test(S("abcdefghij"), 1, 8, S("abcde"), 2, 1, -1);
2787     test(S("abcdefghij"), 1, 8, S("abcde"), 2, 2, -1);
2788     test(S("abcdefghij"), 1, 8, S("abcde"), 2, 3, -1);
2789     test(S("abcdefghij"), 1, 8, S("abcde"), 2, 4, -1);
2790     test(S("abcdefghij"), 1, 8, S("abcde"), 4, 0, 8);
2791     test(S("abcdefghij"), 1, 8, S("abcde"), 4, 1, -3);
2792     test(S("abcdefghij"), 1, 8, S("abcde"), 4, 2, -3);
2793     test(S("abcdefghij"), 1, 8, S("abcde"), 5, 0, 8);
2794     test(S("abcdefghij"), 1, 8, S("abcde"), 5, 1, 8);
2795     test(S("abcdefghij"), 1, 8, S("abcde"), 6, 0, 0);
2796     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 0, 8);
2797     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 1, 1);
2798     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 5, 1);
2799     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 9, 1);
2800     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 10, 1);
2801     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 11, 1);
2802     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 0, 8);
2803     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 1, 7);
2804     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 4, 4);
2805     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 8, 0);
2806     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 9, -1);
2807     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 10, -1);
2808     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 0, 8);
2809     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 1, -4);
2810     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 2, -4);
2811     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 4, -4);
2812     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 5, -4);
2813     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 6, -4);
2814     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 0, 8);
2815     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 1, -8);
2816     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 2, -8);
2817     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 10, 0, 8);
2818     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 10, 1, 8);
2819     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 11, 0, 0);
2820     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 0, 8);
2821     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 1, 1);
2822     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 10, 1);
2823     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 19, 1);
2824     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 20, 1);
2825     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 21, 1);
2826     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 0, 8);
2827     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 1, 7);
2828     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 9, -1);
2829     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 18, -10);
2830     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 19, -11);
2831     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 20, -11);
2832     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 0, 8);
2833     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 1, -9);
2834     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 5, -9);
2835     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 9, -9);
2836     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 10, -9);
2837     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 11, -9);
2838     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 0, 8);
2839     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 1, -18);
2840     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 2, -18);
2841     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 20, 0, 8);
2842     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 20, 1, 8);
2843     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 21, 0, 0);
2844     test(S("abcdefghij"), 1, 9, S(""), 0, 0, 9);
2845     test(S("abcdefghij"), 1, 9, S(""), 0, 1, 9);
2846     test(S("abcdefghij"), 1, 9, S(""), 1, 0, 0);
2847     test(S("abcdefghij"), 1, 9, S("abcde"), 0, 0, 9);
2848     test(S("abcdefghij"), 1, 9, S("abcde"), 0, 1, 1);
2849     test(S("abcdefghij"), 1, 9, S("abcde"), 0, 2, 1);
2850     test(S("abcdefghij"), 1, 9, S("abcde"), 0, 4, 1);
2851     test(S("abcdefghij"), 1, 9, S("abcde"), 0, 5, 1);
2852     test(S("abcdefghij"), 1, 9, S("abcde"), 0, 6, 1);
2853     test(S("abcdefghij"), 1, 9, S("abcde"), 1, 0, 9);
2854     test(S("abcdefghij"), 1, 9, S("abcde"), 1, 1, 8);
2855     test(S("abcdefghij"), 1, 9, S("abcde"), 1, 2, 7);
2856     test(S("abcdefghij"), 1, 9, S("abcde"), 1, 3, 6);
2857     test(S("abcdefghij"), 1, 9, S("abcde"), 1, 4, 5);
2858     test(S("abcdefghij"), 1, 9, S("abcde"), 1, 5, 5);
2859     test(S("abcdefghij"), 1, 9, S("abcde"), 2, 0, 9);
2860     test(S("abcdefghij"), 1, 9, S("abcde"), 2, 1, -1);
2861     test(S("abcdefghij"), 1, 9, S("abcde"), 2, 2, -1);
2862     test(S("abcdefghij"), 1, 9, S("abcde"), 2, 3, -1);
2863     test(S("abcdefghij"), 1, 9, S("abcde"), 2, 4, -1);
2864     test(S("abcdefghij"), 1, 9, S("abcde"), 4, 0, 9);
2865     test(S("abcdefghij"), 1, 9, S("abcde"), 4, 1, -3);
2866     test(S("abcdefghij"), 1, 9, S("abcde"), 4, 2, -3);
2867     test(S("abcdefghij"), 1, 9, S("abcde"), 5, 0, 9);
2868     test(S("abcdefghij"), 1, 9, S("abcde"), 5, 1, 9);
2869     test(S("abcdefghij"), 1, 9, S("abcde"), 6, 0, 0);
2870     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 0, 9);
2871     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 1, 1);
2872     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 5, 1);
2873     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 9, 1);
2874     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 10, 1);
2875     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 11, 1);
2876     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 0, 9);
2877     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 1, 8);
2878     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 4, 5);
2879     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 8, 1);
2880 }
2881
2882 template <class S>
2883 void test27()
2884 {
2885     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 9, 0);
2886     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 10, 0);
2887     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 0, 9);
2888     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 1, -4);
2889     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 2, -4);
2890     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 4, -4);
2891     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 5, -4);
2892     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 6, -4);
2893     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 0, 9);
2894     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 1, -8);
2895     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 2, -8);
2896     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 10, 0, 9);
2897     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 10, 1, 9);
2898     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 11, 0, 0);
2899     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
2900     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 1, 1);
2901     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 10, 1);
2902     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 19, 1);
2903     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 20, 1);
2904     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 21, 1);
2905     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
2906     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 1, 8);
2907     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 9, 0);
2908     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 18, -9);
2909     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 19, -10);
2910     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 20, -10);
2911     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
2912     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 1, -9);
2913     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 5, -9);
2914     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 9, -9);
2915     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 10, -9);
2916     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 11, -9);
2917     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
2918     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 1, -18);
2919     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 2, -18);
2920     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
2921     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
2922     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
2923     test(S("abcdefghij"), 1, 10, S(""), 0, 0, 9);
2924     test(S("abcdefghij"), 1, 10, S(""), 0, 1, 9);
2925     test(S("abcdefghij"), 1, 10, S(""), 1, 0, 0);
2926     test(S("abcdefghij"), 1, 10, S("abcde"), 0, 0, 9);
2927     test(S("abcdefghij"), 1, 10, S("abcde"), 0, 1, 1);
2928     test(S("abcdefghij"), 1, 10, S("abcde"), 0, 2, 1);
2929     test(S("abcdefghij"), 1, 10, S("abcde"), 0, 4, 1);
2930     test(S("abcdefghij"), 1, 10, S("abcde"), 0, 5, 1);
2931     test(S("abcdefghij"), 1, 10, S("abcde"), 0, 6, 1);
2932     test(S("abcdefghij"), 1, 10, S("abcde"), 1, 0, 9);
2933     test(S("abcdefghij"), 1, 10, S("abcde"), 1, 1, 8);
2934     test(S("abcdefghij"), 1, 10, S("abcde"), 1, 2, 7);
2935     test(S("abcdefghij"), 1, 10, S("abcde"), 1, 3, 6);
2936     test(S("abcdefghij"), 1, 10, S("abcde"), 1, 4, 5);
2937     test(S("abcdefghij"), 1, 10, S("abcde"), 1, 5, 5);
2938     test(S("abcdefghij"), 1, 10, S("abcde"), 2, 0, 9);
2939     test(S("abcdefghij"), 1, 10, S("abcde"), 2, 1, -1);
2940     test(S("abcdefghij"), 1, 10, S("abcde"), 2, 2, -1);
2941     test(S("abcdefghij"), 1, 10, S("abcde"), 2, 3, -1);
2942     test(S("abcdefghij"), 1, 10, S("abcde"), 2, 4, -1);
2943     test(S("abcdefghij"), 1, 10, S("abcde"), 4, 0, 9);
2944     test(S("abcdefghij"), 1, 10, S("abcde"), 4, 1, -3);
2945     test(S("abcdefghij"), 1, 10, S("abcde"), 4, 2, -3);
2946     test(S("abcdefghij"), 1, 10, S("abcde"), 5, 0, 9);
2947     test(S("abcdefghij"), 1, 10, S("abcde"), 5, 1, 9);
2948     test(S("abcdefghij"), 1, 10, S("abcde"), 6, 0, 0);
2949     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 0, 9);
2950     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 1, 1);
2951     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 5, 1);
2952     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 9, 1);
2953     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 10, 1);
2954     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 11, 1);
2955     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 0, 9);
2956     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 1, 8);
2957     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 4, 5);
2958     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 8, 1);
2959     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 9, 0);
2960     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 10, 0);
2961     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 0, 9);
2962     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 1, -4);
2963     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 2, -4);
2964     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 4, -4);
2965     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 5, -4);
2966     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 6, -4);
2967     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 0, 9);
2968     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 1, -8);
2969     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 2, -8);
2970     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 10, 0, 9);
2971     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 10, 1, 9);
2972     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 11, 0, 0);
2973     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 0, 9);
2974     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 1, 1);
2975     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 10, 1);
2976     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 19, 1);
2977     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 20, 1);
2978     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 21, 1);
2979     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 0, 9);
2980     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 1, 8);
2981     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 9, 0);
2982     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 18, -9);
2983     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 19, -10);
2984     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 20, -10);
2985 }
2986
2987 template <class S>
2988 void test28()
2989 {
2990     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 0, 9);
2991     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 1, -9);
2992     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 5, -9);
2993     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 9, -9);
2994     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 10, -9);
2995     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 11, -9);
2996     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 0, 9);
2997     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 1, -18);
2998     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 2, -18);
2999     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 20, 0, 9);
3000     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 20, 1, 9);
3001     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
3002     test(S("abcdefghij"), 5, 0, S(""), 0, 0, 0);
3003     test(S("abcdefghij"), 5, 0, S(""), 0, 1, 0);
3004     test(S("abcdefghij"), 5, 0, S(""), 1, 0, 0);
3005     test(S("abcdefghij"), 5, 0, S("abcde"), 0, 0, 0);
3006     test(S("abcdefghij"), 5, 0, S("abcde"), 0, 1, -1);
3007     test(S("abcdefghij"), 5, 0, S("abcde"), 0, 2, -2);
3008     test(S("abcdefghij"), 5, 0, S("abcde"), 0, 4, -4);
3009     test(S("abcdefghij"), 5, 0, S("abcde"), 0, 5, -5);
3010     test(S("abcdefghij"), 5, 0, S("abcde"), 0, 6, -5);
3011     test(S("abcdefghij"), 5, 0, S("abcde"), 1, 0, 0);
3012     test(S("abcdefghij"), 5, 0, S("abcde"), 1, 1, -1);
3013     test(S("abcdefghij"), 5, 0, S("abcde"), 1, 2, -2);
3014     test(S("abcdefghij"), 5, 0, S("abcde"), 1, 3, -3);
3015     test(S("abcdefghij"), 5, 0, S("abcde"), 1, 4, -4);
3016     test(S("abcdefghij"), 5, 0, S("abcde"), 1, 5, -4);
3017     test(S("abcdefghij"), 5, 0, S("abcde"), 2, 0, 0);
3018     test(S("abcdefghij"), 5, 0, S("abcde"), 2, 1, -1);
3019     test(S("abcdefghij"), 5, 0, S("abcde"), 2, 2, -2);
3020     test(S("abcdefghij"), 5, 0, S("abcde"), 2, 3, -3);
3021     test(S("abcdefghij"), 5, 0, S("abcde"), 2, 4, -3);
3022     test(S("abcdefghij"), 5, 0, S("abcde"), 4, 0, 0);
3023     test(S("abcdefghij"), 5, 0, S("abcde"), 4, 1, -1);
3024     test(S("abcdefghij"), 5, 0, S("abcde"), 4, 2, -1);
3025     test(S("abcdefghij"), 5, 0, S("abcde"), 5, 0, 0);
3026     test(S("abcdefghij"), 5, 0, S("abcde"), 5, 1, 0);
3027     test(S("abcdefghij"), 5, 0, S("abcde"), 6, 0, 0);
3028     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 0, 0);
3029     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 1, -1);
3030     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 5, -5);
3031     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 9, -9);
3032     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 10, -10);
3033     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 11, -10);
3034     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 0, 0);
3035     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 1, -1);
3036     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 4, -4);
3037     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 8, -8);
3038     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 9, -9);
3039     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 10, -9);
3040     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 0, 0);
3041     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 1, -1);
3042     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 2, -2);
3043     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 4, -4);
3044     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 5, -5);
3045     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 6, -5);
3046     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 0, 0);
3047     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 1, -1);
3048     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 2, -1);
3049     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 10, 0, 0);
3050     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 10, 1, 0);
3051     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 11, 0, 0);
3052     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3053     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
3054     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
3055     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
3056     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
3057     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
3058     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3059     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
3060     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
3061     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
3062     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
3063     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
3064     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3065     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
3066     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
3067     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
3068     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
3069     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
3070     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3071     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
3072     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
3073     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3074     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3075     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3076     test(S("abcdefghij"), 5, 1, S(""), 0, 0, 1);
3077     test(S("abcdefghij"), 5, 1, S(""), 0, 1, 1);
3078     test(S("abcdefghij"), 5, 1, S(""), 1, 0, 0);
3079     test(S("abcdefghij"), 5, 1, S("abcde"), 0, 0, 1);
3080     test(S("abcdefghij"), 5, 1, S("abcde"), 0, 1, 5);
3081     test(S("abcdefghij"), 5, 1, S("abcde"), 0, 2, 5);
3082     test(S("abcdefghij"), 5, 1, S("abcde"), 0, 4, 5);
3083     test(S("abcdefghij"), 5, 1, S("abcde"), 0, 5, 5);
3084     test(S("abcdefghij"), 5, 1, S("abcde"), 0, 6, 5);
3085     test(S("abcdefghij"), 5, 1, S("abcde"), 1, 0, 1);
3086     test(S("abcdefghij"), 5, 1, S("abcde"), 1, 1, 4);
3087     test(S("abcdefghij"), 5, 1, S("abcde"), 1, 2, 4);
3088     test(S("abcdefghij"), 5, 1, S("abcde"), 1, 3, 4);
3089     test(S("abcdefghij"), 5, 1, S("abcde"), 1, 4, 4);
3090 }
3091
3092 template <class S>
3093 void test29()
3094 {
3095     test(S("abcdefghij"), 5, 1, S("abcde"), 1, 5, 4);
3096     test(S("abcdefghij"), 5, 1, S("abcde"), 2, 0, 1);
3097     test(S("abcdefghij"), 5, 1, S("abcde"), 2, 1, 3);
3098     test(S("abcdefghij"), 5, 1, S("abcde"), 2, 2, 3);
3099     test(S("abcdefghij"), 5, 1, S("abcde"), 2, 3, 3);
3100     test(S("abcdefghij"), 5, 1, S("abcde"), 2, 4, 3);
3101     test(S("abcdefghij"), 5, 1, S("abcde"), 4, 0, 1);
3102     test(S("abcdefghij"), 5, 1, S("abcde"), 4, 1, 1);
3103     test(S("abcdefghij"), 5, 1, S("abcde"), 4, 2, 1);
3104     test(S("abcdefghij"), 5, 1, S("abcde"), 5, 0, 1);
3105     test(S("abcdefghij"), 5, 1, S("abcde"), 5, 1, 1);
3106     test(S("abcdefghij"), 5, 1, S("abcde"), 6, 0, 0);
3107     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 0, 1);
3108     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 1, 5);
3109     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 5, 5);
3110     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 9, 5);
3111     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 10, 5);
3112     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 11, 5);
3113     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 0, 1);
3114     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 1, 4);
3115     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 4, 4);
3116     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 8, 4);
3117     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 9, 4);
3118     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 10, 4);
3119     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 0, 1);
3120     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 1, 0);
3121     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 2, -1);
3122     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 4, -3);
3123     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 5, -4);
3124     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 6, -4);
3125     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 0, 1);
3126     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 1, -4);
3127     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 2, -4);
3128     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 10, 0, 1);
3129     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 10, 1, 1);
3130     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 11, 0, 0);
3131     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
3132     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 1, 5);
3133     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 10, 5);
3134     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 19, 5);
3135     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 20, 5);
3136     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 21, 5);
3137     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
3138     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 1, 4);
3139     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 9, 4);
3140     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 18, 4);
3141     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 19, 4);
3142     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 20, 4);
3143     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
3144     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 1, -5);
3145     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
3146     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 9, -5);
3147     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 10, -5);
3148     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 11, -5);
3149     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
3150     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 1, -14);
3151     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 2, -14);
3152     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
3153     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
3154     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
3155     test(S("abcdefghij"), 5, 2, S(""), 0, 0, 2);
3156     test(S("abcdefghij"), 5, 2, S(""), 0, 1, 2);
3157     test(S("abcdefghij"), 5, 2, S(""), 1, 0, 0);
3158     test(S("abcdefghij"), 5, 2, S("abcde"), 0, 0, 2);
3159     test(S("abcdefghij"), 5, 2, S("abcde"), 0, 1, 5);
3160     test(S("abcdefghij"), 5, 2, S("abcde"), 0, 2, 5);
3161     test(S("abcdefghij"), 5, 2, S("abcde"), 0, 4, 5);
3162     test(S("abcdefghij"), 5, 2, S("abcde"), 0, 5, 5);
3163     test(S("abcdefghij"), 5, 2, S("abcde"), 0, 6, 5);
3164     test(S("abcdefghij"), 5, 2, S("abcde"), 1, 0, 2);
3165     test(S("abcdefghij"), 5, 2, S("abcde"), 1, 1, 4);
3166     test(S("abcdefghij"), 5, 2, S("abcde"), 1, 2, 4);
3167     test(S("abcdefghij"), 5, 2, S("abcde"), 1, 3, 4);
3168     test(S("abcdefghij"), 5, 2, S("abcde"), 1, 4, 4);
3169     test(S("abcdefghij"), 5, 2, S("abcde"), 1, 5, 4);
3170     test(S("abcdefghij"), 5, 2, S("abcde"), 2, 0, 2);
3171     test(S("abcdefghij"), 5, 2, S("abcde"), 2, 1, 3);
3172     test(S("abcdefghij"), 5, 2, S("abcde"), 2, 2, 3);
3173     test(S("abcdefghij"), 5, 2, S("abcde"), 2, 3, 3);
3174     test(S("abcdefghij"), 5, 2, S("abcde"), 2, 4, 3);
3175     test(S("abcdefghij"), 5, 2, S("abcde"), 4, 0, 2);
3176     test(S("abcdefghij"), 5, 2, S("abcde"), 4, 1, 1);
3177     test(S("abcdefghij"), 5, 2, S("abcde"), 4, 2, 1);
3178     test(S("abcdefghij"), 5, 2, S("abcde"), 5, 0, 2);
3179     test(S("abcdefghij"), 5, 2, S("abcde"), 5, 1, 2);
3180     test(S("abcdefghij"), 5, 2, S("abcde"), 6, 0, 0);
3181     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 0, 2);
3182     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 1, 5);
3183     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 5, 5);
3184     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 9, 5);
3185     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 10, 5);
3186     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 11, 5);
3187     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 0, 2);
3188     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 1, 4);
3189     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 4, 4);
3190     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 8, 4);
3191     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 9, 4);
3192     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 10, 4);
3193     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 0, 2);
3194     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 1, 1);
3195 }
3196
3197 template <class S>
3198 void test30()
3199 {
3200     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 2, 0);
3201     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 4, -2);
3202     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 5, -3);
3203     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 6, -3);
3204     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 0, 2);
3205     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 1, -4);
3206     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 2, -4);
3207     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 10, 0, 2);
3208     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 10, 1, 2);
3209     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 11, 0, 0);
3210     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
3211     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 1, 5);
3212     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 10, 5);
3213     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 19, 5);
3214     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 20, 5);
3215     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 21, 5);
3216     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
3217     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 1, 4);
3218     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 9, 4);
3219     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 18, 4);
3220     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 19, 4);
3221     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 20, 4);
3222     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
3223     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 1, -5);
3224     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 5, -5);
3225     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 9, -5);
3226     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 10, -5);
3227     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 11, -5);
3228     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
3229     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 1, -14);
3230     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 2, -14);
3231     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
3232     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
3233     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
3234     test(S("abcdefghij"), 5, 4, S(""), 0, 0, 4);
3235     test(S("abcdefghij"), 5, 4, S(""), 0, 1, 4);
3236     test(S("abcdefghij"), 5, 4, S(""), 1, 0, 0);
3237     test(S("abcdefghij"), 5, 4, S("abcde"), 0, 0, 4);
3238     test(S("abcdefghij"), 5, 4, S("abcde"), 0, 1, 5);
3239     test(S("abcdefghij"), 5, 4, S("abcde"), 0, 2, 5);
3240     test(S("abcdefghij"), 5, 4, S("abcde"), 0, 4, 5);
3241     test(S("abcdefghij"), 5, 4, S("abcde"), 0, 5, 5);
3242     test(S("abcdefghij"), 5, 4, S("abcde"), 0, 6, 5);
3243     test(S("abcdefghij"), 5, 4, S("abcde"), 1, 0, 4);
3244     test(S("abcdefghij"), 5, 4, S("abcde"), 1, 1, 4);
3245     test(S("abcdefghij"), 5, 4, S("abcde"), 1, 2, 4);
3246     test(S("abcdefghij"), 5, 4, S("abcde"), 1, 3, 4);
3247     test(S("abcdefghij"), 5, 4, S("abcde"), 1, 4, 4);
3248     test(S("abcdefghij"), 5, 4, S("abcde"), 1, 5, 4);
3249     test(S("abcdefghij"), 5, 4, S("abcde"), 2, 0, 4);
3250     test(S("abcdefghij"), 5, 4, S("abcde"), 2, 1, 3);
3251     test(S("abcdefghij"), 5, 4, S("abcde"), 2, 2, 3);
3252     test(S("abcdefghij"), 5, 4, S("abcde"), 2, 3, 3);
3253     test(S("abcdefghij"), 5, 4, S("abcde"), 2, 4, 3);
3254     test(S("abcdefghij"), 5, 4, S("abcde"), 4, 0, 4);
3255     test(S("abcdefghij"), 5, 4, S("abcde"), 4, 1, 1);
3256     test(S("abcdefghij"), 5, 4, S("abcde"), 4, 2, 1);
3257     test(S("abcdefghij"), 5, 4, S("abcde"), 5, 0, 4);
3258     test(S("abcdefghij"), 5, 4, S("abcde"), 5, 1, 4);
3259     test(S("abcdefghij"), 5, 4, S("abcde"), 6, 0, 0);
3260     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 0, 4);
3261     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 1, 5);
3262     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 5, 5);
3263     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 9, 5);
3264     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 10, 5);
3265     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 11, 5);
3266     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 0, 4);
3267     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 1, 4);
3268     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 4, 4);
3269     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 8, 4);
3270     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 9, 4);
3271     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 10, 4);
3272     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 0, 4);
3273     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 1, 3);
3274     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 2, 2);
3275     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 4, 0);
3276     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 5, -1);
3277     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 6, -1);
3278     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 0, 4);
3279     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 1, -4);
3280     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 2, -4);
3281     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 10, 0, 4);
3282     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 10, 1, 4);
3283     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 11, 0, 0);
3284     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
3285     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 1, 5);
3286     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 10, 5);
3287     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 19, 5);
3288     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 20, 5);
3289     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 21, 5);
3290     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
3291     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 1, 4);
3292     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 9, 4);
3293     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 18, 4);
3294     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 19, 4);
3295     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 20, 4);
3296     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
3297     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 1, -5);
3298     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 5, -5);
3299     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 9, -5);
3300 }
3301
3302 template <class S>
3303 void test31()
3304 {
3305     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 10, -5);
3306     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 11, -5);
3307     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
3308     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 1, -14);
3309     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 2, -14);
3310     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
3311     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
3312     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
3313     test(S("abcdefghij"), 5, 5, S(""), 0, 0, 5);
3314     test(S("abcdefghij"), 5, 5, S(""), 0, 1, 5);
3315     test(S("abcdefghij"), 5, 5, S(""), 1, 0, 0);
3316     test(S("abcdefghij"), 5, 5, S("abcde"), 0, 0, 5);
3317     test(S("abcdefghij"), 5, 5, S("abcde"), 0, 1, 5);
3318     test(S("abcdefghij"), 5, 5, S("abcde"), 0, 2, 5);
3319     test(S("abcdefghij"), 5, 5, S("abcde"), 0, 4, 5);
3320     test(S("abcdefghij"), 5, 5, S("abcde"), 0, 5, 5);
3321     test(S("abcdefghij"), 5, 5, S("abcde"), 0, 6, 5);
3322     test(S("abcdefghij"), 5, 5, S("abcde"), 1, 0, 5);
3323     test(S("abcdefghij"), 5, 5, S("abcde"), 1, 1, 4);
3324     test(S("abcdefghij"), 5, 5, S("abcde"), 1, 2, 4);
3325     test(S("abcdefghij"), 5, 5, S("abcde"), 1, 3, 4);
3326     test(S("abcdefghij"), 5, 5, S("abcde"), 1, 4, 4);
3327     test(S("abcdefghij"), 5, 5, S("abcde"), 1, 5, 4);
3328     test(S("abcdefghij"), 5, 5, S("abcde"), 2, 0, 5);
3329     test(S("abcdefghij"), 5, 5, S("abcde"), 2, 1, 3);
3330     test(S("abcdefghij"), 5, 5, S("abcde"), 2, 2, 3);
3331     test(S("abcdefghij"), 5, 5, S("abcde"), 2, 3, 3);
3332     test(S("abcdefghij"), 5, 5, S("abcde"), 2, 4, 3);
3333     test(S("abcdefghij"), 5, 5, S("abcde"), 4, 0, 5);
3334     test(S("abcdefghij"), 5, 5, S("abcde"), 4, 1, 1);
3335     test(S("abcdefghij"), 5, 5, S("abcde"), 4, 2, 1);
3336     test(S("abcdefghij"), 5, 5, S("abcde"), 5, 0, 5);
3337     test(S("abcdefghij"), 5, 5, S("abcde"), 5, 1, 5);
3338     test(S("abcdefghij"), 5, 5, S("abcde"), 6, 0, 0);
3339     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 0, 5);
3340     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 1, 5);
3341     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 5, 5);
3342     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 9, 5);
3343     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 10, 5);
3344     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 11, 5);
3345     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 0, 5);
3346     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 1, 4);
3347     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 4, 4);
3348     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 8, 4);
3349     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 9, 4);
3350     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 10, 4);
3351     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 0, 5);
3352     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 1, 4);
3353     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 2, 3);
3354     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 4, 1);
3355     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 5, 0);
3356     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 6, 0);
3357     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 0, 5);
3358     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 1, -4);
3359     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 2, -4);
3360     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 10, 0, 5);
3361     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 10, 1, 5);
3362     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 11, 0, 0);
3363     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
3364     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 1, 5);
3365     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 10, 5);
3366     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 19, 5);
3367     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 20, 5);
3368     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 21, 5);
3369     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
3370     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 1, 4);
3371     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 9, 4);
3372     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 18, 4);
3373     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 19, 4);
3374     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 20, 4);
3375     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
3376     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 1, -5);
3377     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 5, -5);
3378     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 9, -5);
3379     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 10, -5);
3380     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 11, -5);
3381     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
3382     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 1, -14);
3383     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 2, -14);
3384     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
3385     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
3386     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
3387     test(S("abcdefghij"), 5, 6, S(""), 0, 0, 5);
3388     test(S("abcdefghij"), 5, 6, S(""), 0, 1, 5);
3389     test(S("abcdefghij"), 5, 6, S(""), 1, 0, 0);
3390     test(S("abcdefghij"), 5, 6, S("abcde"), 0, 0, 5);
3391     test(S("abcdefghij"), 5, 6, S("abcde"), 0, 1, 5);
3392     test(S("abcdefghij"), 5, 6, S("abcde"), 0, 2, 5);
3393     test(S("abcdefghij"), 5, 6, S("abcde"), 0, 4, 5);
3394     test(S("abcdefghij"), 5, 6, S("abcde"), 0, 5, 5);
3395     test(S("abcdefghij"), 5, 6, S("abcde"), 0, 6, 5);
3396     test(S("abcdefghij"), 5, 6, S("abcde"), 1, 0, 5);
3397     test(S("abcdefghij"), 5, 6, S("abcde"), 1, 1, 4);
3398     test(S("abcdefghij"), 5, 6, S("abcde"), 1, 2, 4);
3399     test(S("abcdefghij"), 5, 6, S("abcde"), 1, 3, 4);
3400     test(S("abcdefghij"), 5, 6, S("abcde"), 1, 4, 4);
3401     test(S("abcdefghij"), 5, 6, S("abcde"), 1, 5, 4);
3402     test(S("abcdefghij"), 5, 6, S("abcde"), 2, 0, 5);
3403     test(S("abcdefghij"), 5, 6, S("abcde"), 2, 1, 3);
3404     test(S("abcdefghij"), 5, 6, S("abcde"), 2, 2, 3);
3405 }
3406
3407 template <class S>
3408 void test32()
3409 {
3410     test(S("abcdefghij"), 5, 6, S("abcde"), 2, 3, 3);
3411     test(S("abcdefghij"), 5, 6, S("abcde"), 2, 4, 3);
3412     test(S("abcdefghij"), 5, 6, S("abcde"), 4, 0, 5);
3413     test(S("abcdefghij"), 5, 6, S("abcde"), 4, 1, 1);
3414     test(S("abcdefghij"), 5, 6, S("abcde"), 4, 2, 1);
3415     test(S("abcdefghij"), 5, 6, S("abcde"), 5, 0, 5);
3416     test(S("abcdefghij"), 5, 6, S("abcde"), 5, 1, 5);
3417     test(S("abcdefghij"), 5, 6, S("abcde"), 6, 0, 0);
3418     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 0, 5);
3419     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 1, 5);
3420     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 5, 5);
3421     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 9, 5);
3422     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 10, 5);
3423     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 11, 5);
3424     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 0, 5);
3425     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 1, 4);
3426     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 4, 4);
3427     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 8, 4);
3428     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 9, 4);
3429     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 10, 4);
3430     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 0, 5);
3431     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 1, 4);
3432     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 2, 3);
3433     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 4, 1);
3434     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 5, 0);
3435     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 6, 0);
3436     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 0, 5);
3437     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 1, -4);
3438     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 2, -4);
3439     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 10, 0, 5);
3440     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 10, 1, 5);
3441     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 11, 0, 0);
3442     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 0, 5);
3443     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 1, 5);
3444     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 10, 5);
3445     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 19, 5);
3446     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 20, 5);
3447     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 21, 5);
3448     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 0, 5);
3449     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 1, 4);
3450     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 9, 4);
3451     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 18, 4);
3452     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 19, 4);
3453     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 20, 4);
3454     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 0, 5);
3455     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 1, -5);
3456     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 5, -5);
3457     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 9, -5);
3458     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 10, -5);
3459     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 11, -5);
3460     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 0, 5);
3461     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 1, -14);
3462     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 2, -14);
3463     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 20, 0, 5);
3464     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 20, 1, 5);
3465     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 21, 0, 0);
3466     test(S("abcdefghij"), 9, 0, S(""), 0, 0, 0);
3467     test(S("abcdefghij"), 9, 0, S(""), 0, 1, 0);
3468     test(S("abcdefghij"), 9, 0, S(""), 1, 0, 0);
3469     test(S("abcdefghij"), 9, 0, S("abcde"), 0, 0, 0);
3470     test(S("abcdefghij"), 9, 0, S("abcde"), 0, 1, -1);
3471     test(S("abcdefghij"), 9, 0, S("abcde"), 0, 2, -2);
3472     test(S("abcdefghij"), 9, 0, S("abcde"), 0, 4, -4);
3473     test(S("abcdefghij"), 9, 0, S("abcde"), 0, 5, -5);
3474     test(S("abcdefghij"), 9, 0, S("abcde"), 0, 6, -5);
3475     test(S("abcdefghij"), 9, 0, S("abcde"), 1, 0, 0);
3476     test(S("abcdefghij"), 9, 0, S("abcde"), 1, 1, -1);
3477     test(S("abcdefghij"), 9, 0, S("abcde"), 1, 2, -2);
3478     test(S("abcdefghij"), 9, 0, S("abcde"), 1, 3, -3);
3479     test(S("abcdefghij"), 9, 0, S("abcde"), 1, 4, -4);
3480     test(S("abcdefghij"), 9, 0, S("abcde"), 1, 5, -4);
3481     test(S("abcdefghij"), 9, 0, S("abcde"), 2, 0, 0);
3482     test(S("abcdefghij"), 9, 0, S("abcde"), 2, 1, -1);
3483     test(S("abcdefghij"), 9, 0, S("abcde"), 2, 2, -2);
3484     test(S("abcdefghij"), 9, 0, S("abcde"), 2, 3, -3);
3485     test(S("abcdefghij"), 9, 0, S("abcde"), 2, 4, -3);
3486     test(S("abcdefghij"), 9, 0, S("abcde"), 4, 0, 0);
3487     test(S("abcdefghij"), 9, 0, S("abcde"), 4, 1, -1);
3488     test(S("abcdefghij"), 9, 0, S("abcde"), 4, 2, -1);
3489     test(S("abcdefghij"), 9, 0, S("abcde"), 5, 0, 0);
3490     test(S("abcdefghij"), 9, 0, S("abcde"), 5, 1, 0);
3491     test(S("abcdefghij"), 9, 0, S("abcde"), 6, 0, 0);
3492     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 0, 0);
3493     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 1, -1);
3494     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 5, -5);
3495     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 9, -9);
3496     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 10, -10);
3497     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 11, -10);
3498     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 0, 0);
3499     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 1, -1);
3500     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 4, -4);
3501     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 8, -8);
3502     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 9, -9);
3503     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 10, -9);
3504     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 0, 0);
3505     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 1, -1);
3506     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 2, -2);
3507     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 4, -4);
3508     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 5, -5);
3509     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 6, -5);
3510 }
3511
3512 template <class S>
3513 void test33()
3514 {
3515     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 0, 0);
3516     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 1, -1);
3517     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 2, -1);
3518     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 10, 0, 0);
3519     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 10, 1, 0);
3520     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 11, 0, 0);
3521     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3522     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
3523     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
3524     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
3525     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
3526     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
3527     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3528     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
3529     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
3530     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
3531     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
3532     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
3533     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3534     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
3535     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
3536     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
3537     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
3538     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
3539     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3540     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
3541     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
3542     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3543     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3544     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3545     test(S("abcdefghij"), 9, 1, S(""), 0, 0, 1);
3546     test(S("abcdefghij"), 9, 1, S(""), 0, 1, 1);
3547     test(S("abcdefghij"), 9, 1, S(""), 1, 0, 0);
3548     test(S("abcdefghij"), 9, 1, S("abcde"), 0, 0, 1);
3549     test(S("abcdefghij"), 9, 1, S("abcde"), 0, 1, 9);
3550     test(S("abcdefghij"), 9, 1, S("abcde"), 0, 2, 9);
3551     test(S("abcdefghij"), 9, 1, S("abcde"), 0, 4, 9);
3552     test(S("abcdefghij"), 9, 1, S("abcde"), 0, 5, 9);
3553     test(S("abcdefghij"), 9, 1, S("abcde"), 0, 6, 9);
3554     test(S("abcdefghij"), 9, 1, S("abcde"), 1, 0, 1);
3555     test(S("abcdefghij"), 9, 1, S("abcde"), 1, 1, 8);
3556     test(S("abcdefghij"), 9, 1, S("abcde"), 1, 2, 8);
3557     test(S("abcdefghij"), 9, 1, S("abcde"), 1, 3, 8);
3558     test(S("abcdefghij"), 9, 1, S("abcde"), 1, 4, 8);
3559     test(S("abcdefghij"), 9, 1, S("abcde"), 1, 5, 8);
3560     test(S("abcdefghij"), 9, 1, S("abcde"), 2, 0, 1);
3561     test(S("abcdefghij"), 9, 1, S("abcde"), 2, 1, 7);
3562     test(S("abcdefghij"), 9, 1, S("abcde"), 2, 2, 7);
3563     test(S("abcdefghij"), 9, 1, S("abcde"), 2, 3, 7);
3564     test(S("abcdefghij"), 9, 1, S("abcde"), 2, 4, 7);
3565     test(S("abcdefghij"), 9, 1, S("abcde"), 4, 0, 1);
3566     test(S("abcdefghij"), 9, 1, S("abcde"), 4, 1, 5);
3567     test(S("abcdefghij"), 9, 1, S("abcde"), 4, 2, 5);
3568     test(S("abcdefghij"), 9, 1, S("abcde"), 5, 0, 1);
3569     test(S("abcdefghij"), 9, 1, S("abcde"), 5, 1, 1);
3570     test(S("abcdefghij"), 9, 1, S("abcde"), 6, 0, 0);
3571     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 0, 1);
3572     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 1, 9);
3573     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 5, 9);
3574     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 9, 9);
3575     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 10, 9);
3576     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 11, 9);
3577     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 0, 1);
3578     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 1, 8);
3579     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 4, 8);
3580     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 8, 8);
3581     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 9, 8);
3582     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 10, 8);
3583     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 0, 1);
3584     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 1, 4);
3585     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 2, 4);
3586     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 4, 4);
3587     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 5, 4);
3588     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 6, 4);
3589     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 0, 1);
3590     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 1, 0);
3591     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 2, 0);
3592     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 10, 0, 1);
3593     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 10, 1, 1);
3594     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 11, 0, 0);
3595     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
3596     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 1, 9);
3597     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 10, 9);
3598     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 19, 9);
3599     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 20, 9);
3600     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 21, 9);
3601     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
3602     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 1, 8);
3603     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 9, 8);
3604     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 18, 8);
3605     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 19, 8);
3606     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 20, 8);
3607     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
3608     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
3609     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 5, -1);
3610     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 9, -1);
3611     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 10, -1);
3612     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 11, -1);
3613     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
3614     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 1, -10);
3615 }
3616
3617 template <class S>
3618 void test34()
3619 {
3620     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 2, -10);
3621     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
3622     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
3623     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
3624     test(S("abcdefghij"), 9, 2, S(""), 0, 0, 1);
3625     test(S("abcdefghij"), 9, 2, S(""), 0, 1, 1);
3626     test(S("abcdefghij"), 9, 2, S(""), 1, 0, 0);
3627     test(S("abcdefghij"), 9, 2, S("abcde"), 0, 0, 1);
3628     test(S("abcdefghij"), 9, 2, S("abcde"), 0, 1, 9);
3629     test(S("abcdefghij"), 9, 2, S("abcde"), 0, 2, 9);
3630     test(S("abcdefghij"), 9, 2, S("abcde"), 0, 4, 9);
3631     test(S("abcdefghij"), 9, 2, S("abcde"), 0, 5, 9);
3632     test(S("abcdefghij"), 9, 2, S("abcde"), 0, 6, 9);
3633     test(S("abcdefghij"), 9, 2, S("abcde"), 1, 0, 1);
3634     test(S("abcdefghij"), 9, 2, S("abcde"), 1, 1, 8);
3635     test(S("abcdefghij"), 9, 2, S("abcde"), 1, 2, 8);
3636     test(S("abcdefghij"), 9, 2, S("abcde"), 1, 3, 8);
3637     test(S("abcdefghij"), 9, 2, S("abcde"), 1, 4, 8);
3638     test(S("abcdefghij"), 9, 2, S("abcde"), 1, 5, 8);
3639     test(S("abcdefghij"), 9, 2, S("abcde"), 2, 0, 1);
3640     test(S("abcdefghij"), 9, 2, S("abcde"), 2, 1, 7);
3641     test(S("abcdefghij"), 9, 2, S("abcde"), 2, 2, 7);
3642     test(S("abcdefghij"), 9, 2, S("abcde"), 2, 3, 7);
3643     test(S("abcdefghij"), 9, 2, S("abcde"), 2, 4, 7);
3644     test(S("abcdefghij"), 9, 2, S("abcde"), 4, 0, 1);
3645     test(S("abcdefghij"), 9, 2, S("abcde"), 4, 1, 5);
3646     test(S("abcdefghij"), 9, 2, S("abcde"), 4, 2, 5);
3647     test(S("abcdefghij"), 9, 2, S("abcde"), 5, 0, 1);
3648     test(S("abcdefghij"), 9, 2, S("abcde"), 5, 1, 1);
3649     test(S("abcdefghij"), 9, 2, S("abcde"), 6, 0, 0);
3650     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 0, 1);
3651     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 1, 9);
3652     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 5, 9);
3653     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 9, 9);
3654     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 10, 9);
3655     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 11, 9);
3656     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 0, 1);
3657     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 1, 8);
3658     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 4, 8);
3659     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 8, 8);
3660     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 9, 8);
3661     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 10, 8);
3662     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 0, 1);
3663     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 1, 4);
3664     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 2, 4);
3665     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 4, 4);
3666     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 5, 4);
3667     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 6, 4);
3668     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 0, 1);
3669     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 1, 0);
3670     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 2, 0);
3671     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 10, 0, 1);
3672     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 10, 1, 1);
3673     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 11, 0, 0);
3674     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 0, 1);
3675     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 1, 9);
3676     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 10, 9);
3677     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 19, 9);
3678     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 20, 9);
3679     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 21, 9);
3680     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 0, 1);
3681     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 1, 8);
3682     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 9, 8);
3683     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 18, 8);
3684     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 19, 8);
3685     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 20, 8);
3686     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 0, 1);
3687     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 1, -1);
3688     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 5, -1);
3689     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 9, -1);
3690     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 10, -1);
3691     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 11, -1);
3692     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 0, 1);
3693     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 1, -10);
3694     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 2, -10);
3695     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 20, 0, 1);
3696     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 20, 1, 1);
3697     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
3698     test(S("abcdefghij"), 10, 0, S(""), 0, 0, 0);
3699     test(S("abcdefghij"), 10, 0, S(""), 0, 1, 0);
3700     test(S("abcdefghij"), 10, 0, S(""), 1, 0, 0);
3701     test(S("abcdefghij"), 10, 0, S("abcde"), 0, 0, 0);
3702     test(S("abcdefghij"), 10, 0, S("abcde"), 0, 1, -1);
3703     test(S("abcdefghij"), 10, 0, S("abcde"), 0, 2, -2);
3704     test(S("abcdefghij"), 10, 0, S("abcde"), 0, 4, -4);
3705     test(S("abcdefghij"), 10, 0, S("abcde"), 0, 5, -5);
3706     test(S("abcdefghij"), 10, 0, S("abcde"), 0, 6, -5);
3707     test(S("abcdefghij"), 10, 0, S("abcde"), 1, 0, 0);
3708     test(S("abcdefghij"), 10, 0, S("abcde"), 1, 1, -1);
3709     test(S("abcdefghij"), 10, 0, S("abcde"), 1, 2, -2);
3710     test(S("abcdefghij"), 10, 0, S("abcde"), 1, 3, -3);
3711     test(S("abcdefghij"), 10, 0, S("abcde"), 1, 4, -4);
3712     test(S("abcdefghij"), 10, 0, S("abcde"), 1, 5, -4);
3713     test(S("abcdefghij"), 10, 0, S("abcde"), 2, 0, 0);
3714     test(S("abcdefghij"), 10, 0, S("abcde"), 2, 1, -1);
3715     test(S("abcdefghij"), 10, 0, S("abcde"), 2, 2, -2);
3716     test(S("abcdefghij"), 10, 0, S("abcde"), 2, 3, -3);
3717     test(S("abcdefghij"), 10, 0, S("abcde"), 2, 4, -3);
3718     test(S("abcdefghij"), 10, 0, S("abcde"), 4, 0, 0);
3719     test(S("abcdefghij"), 10, 0, S("abcde"), 4, 1, -1);
3720 }
3721
3722 template <class S>
3723 void test35()
3724 {
3725     test(S("abcdefghij"), 10, 0, S("abcde"), 4, 2, -1);
3726     test(S("abcdefghij"), 10, 0, S("abcde"), 5, 0, 0);
3727     test(S("abcdefghij"), 10, 0, S("abcde"), 5, 1, 0);
3728     test(S("abcdefghij"), 10, 0, S("abcde"), 6, 0, 0);
3729     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 0, 0);
3730     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 1, -1);
3731     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 5, -5);
3732     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 9, -9);
3733     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 10, -10);
3734     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 11, -10);
3735     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 0, 0);
3736     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 1, -1);
3737     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 4, -4);
3738     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 8, -8);
3739     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 9, -9);
3740     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 10, -9);
3741     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 0, 0);
3742     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 1, -1);
3743     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 2, -2);
3744     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 4, -4);
3745     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 5, -5);
3746     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 6, -5);
3747     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 0, 0);
3748     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 1, -1);
3749     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 2, -1);
3750     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 10, 0, 0);
3751     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 10, 1, 0);
3752     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 11, 0, 0);
3753     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3754     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
3755     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
3756     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
3757     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
3758     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
3759     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3760     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
3761     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
3762     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
3763     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
3764     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
3765     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3766     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
3767     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
3768     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
3769     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
3770     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
3771     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3772     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
3773     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
3774     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3775     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3776     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3777     test(S("abcdefghij"), 10, 1, S(""), 0, 0, 0);
3778     test(S("abcdefghij"), 10, 1, S(""), 0, 1, 0);
3779     test(S("abcdefghij"), 10, 1, S(""), 1, 0, 0);
3780     test(S("abcdefghij"), 10, 1, S("abcde"), 0, 0, 0);
3781     test(S("abcdefghij"), 10, 1, S("abcde"), 0, 1, -1);
3782     test(S("abcdefghij"), 10, 1, S("abcde"), 0, 2, -2);
3783     test(S("abcdefghij"), 10, 1, S("abcde"), 0, 4, -4);
3784     test(S("abcdefghij"), 10, 1, S("abcde"), 0, 5, -5);
3785     test(S("abcdefghij"), 10, 1, S("abcde"), 0, 6, -5);
3786     test(S("abcdefghij"), 10, 1, S("abcde"), 1, 0, 0);
3787     test(S("abcdefghij"), 10, 1, S("abcde"), 1, 1, -1);
3788     test(S("abcdefghij"), 10, 1, S("abcde"), 1, 2, -2);
3789     test(S("abcdefghij"), 10, 1, S("abcde"), 1, 3, -3);
3790     test(S("abcdefghij"), 10, 1, S("abcde"), 1, 4, -4);
3791     test(S("abcdefghij"), 10, 1, S("abcde"), 1, 5, -4);
3792     test(S("abcdefghij"), 10, 1, S("abcde"), 2, 0, 0);
3793     test(S("abcdefghij"), 10, 1, S("abcde"), 2, 1, -1);
3794     test(S("abcdefghij"), 10, 1, S("abcde"), 2, 2, -2);
3795     test(S("abcdefghij"), 10, 1, S("abcde"), 2, 3, -3);
3796     test(S("abcdefghij"), 10, 1, S("abcde"), 2, 4, -3);
3797     test(S("abcdefghij"), 10, 1, S("abcde"), 4, 0, 0);
3798     test(S("abcdefghij"), 10, 1, S("abcde"), 4, 1, -1);
3799     test(S("abcdefghij"), 10, 1, S("abcde"), 4, 2, -1);
3800     test(S("abcdefghij"), 10, 1, S("abcde"), 5, 0, 0);
3801     test(S("abcdefghij"), 10, 1, S("abcde"), 5, 1, 0);
3802     test(S("abcdefghij"), 10, 1, S("abcde"), 6, 0, 0);
3803     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 0, 0);
3804     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 1, -1);
3805     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 5, -5);
3806     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 9, -9);
3807     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 10, -10);
3808     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 11, -10);
3809     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 0, 0);
3810     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 1, -1);
3811     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 4, -4);
3812     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 8, -8);
3813     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 9, -9);
3814     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 10, -9);
3815     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 0, 0);
3816     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 1, -1);
3817     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 2, -2);
3818     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 4, -4);
3819     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 5, -5);
3820     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 6, -5);
3821     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 0, 0);
3822     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 1, -1);
3823     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 2, -1);
3824     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 10, 0, 0);
3825 }
3826
3827 template <class S>
3828 void test36()
3829 {
3830     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 10, 1, 0);
3831     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 11, 0, 0);
3832     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
3833     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
3834     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
3835     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
3836     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
3837     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
3838     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
3839     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
3840     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
3841     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
3842     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
3843     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
3844     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
3845     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
3846     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
3847     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
3848     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
3849     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
3850     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
3851     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
3852     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
3853     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
3854     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
3855     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
3856     test(S("abcdefghij"), 11, 0, S(""), 0, 0, 0);
3857     test(S("abcdefghij"), 11, 0, S(""), 0, 1, 0);
3858     test(S("abcdefghij"), 11, 0, S(""), 1, 0, 0);
3859     test(S("abcdefghij"), 11, 0, S("abcde"), 0, 0, 0);
3860     test(S("abcdefghij"), 11, 0, S("abcde"), 0, 1, 0);
3861     test(S("abcdefghij"), 11, 0, S("abcde"), 0, 2, 0);
3862     test(S("abcdefghij"), 11, 0, S("abcde"), 0, 4, 0);
3863     test(S("abcdefghij"), 11, 0, S("abcde"), 0, 5, 0);
3864     test(S("abcdefghij"), 11, 0, S("abcde"), 0, 6, 0);
3865     test(S("abcdefghij"), 11, 0, S("abcde"), 1, 0, 0);
3866     test(S("abcdefghij"), 11, 0, S("abcde"), 1, 1, 0);
3867     test(S("abcdefghij"), 11, 0, S("abcde"), 1, 2, 0);
3868     test(S("abcdefghij"), 11, 0, S("abcde"), 1, 3, 0);
3869     test(S("abcdefghij"), 11, 0, S("abcde"), 1, 4, 0);
3870     test(S("abcdefghij"), 11, 0, S("abcde"), 1, 5, 0);
3871     test(S("abcdefghij"), 11, 0, S("abcde"), 2, 0, 0);
3872     test(S("abcdefghij"), 11, 0, S("abcde"), 2, 1, 0);
3873     test(S("abcdefghij"), 11, 0, S("abcde"), 2, 2, 0);
3874     test(S("abcdefghij"), 11, 0, S("abcde"), 2, 3, 0);
3875     test(S("abcdefghij"), 11, 0, S("abcde"), 2, 4, 0);
3876     test(S("abcdefghij"), 11, 0, S("abcde"), 4, 0, 0);
3877     test(S("abcdefghij"), 11, 0, S("abcde"), 4, 1, 0);
3878     test(S("abcdefghij"), 11, 0, S("abcde"), 4, 2, 0);
3879     test(S("abcdefghij"), 11, 0, S("abcde"), 5, 0, 0);
3880     test(S("abcdefghij"), 11, 0, S("abcde"), 5, 1, 0);
3881     test(S("abcdefghij"), 11, 0, S("abcde"), 6, 0, 0);
3882     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 0, 0);
3883     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 1, 0);
3884     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 5, 0);
3885     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 9, 0);
3886     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 10, 0);
3887     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 11, 0);
3888     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 0, 0);
3889     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 1, 0);
3890     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 4, 0);
3891     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 8, 0);
3892     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 9, 0);
3893     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 10, 0);
3894     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 0, 0);
3895     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 1, 0);
3896     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 2, 0);
3897     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 4, 0);
3898     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 5, 0);
3899     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 6, 0);
3900     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 0, 0);
3901     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 1, 0);
3902     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 2, 0);
3903     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 10, 0, 0);
3904     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 10, 1, 0);
3905     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 11, 0, 0);
3906     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3907     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
3908     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
3909     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
3910     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
3911     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
3912     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3913     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
3914     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
3915     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
3916     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
3917     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
3918     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3919     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
3920     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
3921     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
3922     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
3923     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
3924     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3925     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
3926     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
3927     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3928     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3929     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3930 }
3931
3932 template <class S>
3933 void test37()
3934 {
3935     test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0, 0, 0);
3936     test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0, 1, 0);
3937     test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 1, 0, 0);
3938     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 0, 0);
3939     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 1, -1);
3940     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 2, -2);
3941     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 4, -4);
3942     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 5, -5);
3943     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 6, -5);
3944     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 0, 0);
3945     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 1, -1);
3946     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 2, -2);
3947     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 3, -3);
3948     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 4, -4);
3949     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 5, -4);
3950     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 0, 0);
3951     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 1, -1);
3952     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 2, -2);
3953     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 3, -3);
3954     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 4, -3);
3955     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 0, 0);
3956     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 1, -1);
3957     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 2, -1);
3958     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 5, 0, 0);
3959     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 5, 1, 0);
3960     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 6, 0, 0);
3961     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 0, 0);
3962     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 1, -1);
3963     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 5, -5);
3964     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 9, -9);
3965     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 10, -10);
3966     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 11, -10);
3967     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 0, 0);
3968     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 1, -1);
3969     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 4, -4);
3970     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 8, -8);
3971     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 9, -9);
3972     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 10, -9);
3973     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 0, 0);
3974     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 1, -1);
3975     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 2, -2);
3976     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 4, -4);
3977     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 5, -5);
3978     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 6, -5);
3979     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 0, 0);
3980     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 1, -1);
3981     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 2, -1);
3982     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 10, 0, 0);
3983     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 10, 1, 0);
3984     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 11, 0, 0);
3985     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3986     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
3987     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
3988     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
3989     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
3990     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
3991     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3992     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
3993     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
3994     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
3995     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
3996     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
3997     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3998     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
3999     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
4000     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
4001     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
4002     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
4003     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
4004     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
4005     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
4006     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
4007     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
4008     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
4009     test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 0, 0, 1);
4010     test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 0, 1, 1);
4011     test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 1, 0, 0);
4012     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 0, 1);
4013     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 1, 0);
4014     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 2, -1);
4015     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 4, -3);
4016     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 5, -4);
4017     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 6, -4);
4018     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 0, 1);
4019     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 1, -1);
4020     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 2, -1);
4021     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 3, -1);
4022     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 4, -1);
4023     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 5, -1);
4024     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 0, 1);
4025     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 1, -2);
4026     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 2, -2);
4027     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 3, -2);
4028     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 4, -2);
4029     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 0, 1);
4030     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 1, -4);
4031     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 2, -4);
4032     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 5, 0, 1);
4033     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 5, 1, 1);
4034     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 6, 0, 0);
4035 }
4036
4037 template <class S>
4038 void test38()
4039 {
4040     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 0, 1);
4041     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 1, 0);
4042     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 5, -4);
4043     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 9, -8);
4044     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 10, -9);
4045     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 11, -9);
4046     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 0, 1);
4047     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 1, -1);
4048     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 4, -1);
4049     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 8, -1);
4050     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 9, -1);
4051     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 10, -1);
4052     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 0, 1);
4053     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 1, -5);
4054     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 2, -5);
4055     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 4, -5);
4056     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 5, -5);
4057     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 6, -5);
4058     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 0, 1);
4059     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 1, -9);
4060     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 2, -9);
4061     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 10, 0, 1);
4062     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 10, 1, 1);
4063     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 11, 0, 0);
4064     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
4065     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0);
4066     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9);
4067     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18);
4068     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19);
4069     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19);
4070     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
4071     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
4072     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1);
4073     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1);
4074     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1);
4075     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1);
4076     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
4077     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10);
4078     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10);
4079     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10);
4080     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
4081     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
4082     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
4083     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19);
4084     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19);
4085     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
4086     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
4087     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
4088     test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 0, 0, 10);
4089     test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 0, 1, 10);
4090     test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 1, 0, 0);
4091     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 0, 10);
4092     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 1, 9);
4093     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 2, 8);
4094     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 4, 6);
4095     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 5, 5);
4096     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 6, 5);
4097     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 0, 10);
4098     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 1, -1);
4099     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 2, -1);
4100     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 3, -1);
4101     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 4, -1);
4102     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 5, -1);
4103     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 0, 10);
4104     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 1, -2);
4105     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 2, -2);
4106     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 3, -2);
4107     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 4, -2);
4108     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 0, 10);
4109     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 1, -4);
4110     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 2, -4);
4111     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 5, 0, 10);
4112     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 5, 1, 10);
4113     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 6, 0, 0);
4114     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 0, 10);
4115     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 1, 9);
4116     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 5, 5);
4117     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 9, 1);
4118     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 10, 0);
4119     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 11, 0);
4120     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 0, 10);
4121     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 1, -1);
4122     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 4, -1);
4123     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 8, -1);
4124     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 9, -1);
4125     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 10, -1);
4126     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 0, 10);
4127     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 1, -5);
4128     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 2, -5);
4129     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 4, -5);
4130     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 5, -5);
4131     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 6, -5);
4132     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 0, 10);
4133     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 1, -9);
4134     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 2, -9);
4135     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 10, 0, 10);
4136     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 10, 1, 10);
4137     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 11, 0, 0);
4138     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 0, 10);
4139     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 1, 9);
4140 }
4141
4142 template <class S>
4143 void test39()
4144 {
4145     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 10, 0);
4146     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 19, -9);
4147     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 20, -10);
4148     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 21, -10);
4149     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 0, 10);
4150     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 1, -1);
4151     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 9, -1);
4152     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 18, -1);
4153     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 19, -1);
4154     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 20, -1);
4155     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 0, 10);
4156     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 1, -10);
4157     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 5, -10);
4158     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 9, -10);
4159     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 10, -10);
4160     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 11, -10);
4161     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 0, 10);
4162     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 1, -19);
4163     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 2, -19);
4164     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 20, 0, 10);
4165     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 20, 1, 10);
4166     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
4167     test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 0, 0, 19);
4168     test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 0, 1, 19);
4169     test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 1, 0, 0);
4170     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 0, 19);
4171     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 1, 18);
4172     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 2, 17);
4173     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 4, 15);
4174     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 5, 14);
4175     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 6, 14);
4176     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 0, 19);
4177     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 1, -1);
4178     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 2, -1);
4179     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 3, -1);
4180     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 4, -1);
4181     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 5, -1);
4182     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 0, 19);
4183     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 1, -2);
4184     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 2, -2);
4185     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 3, -2);
4186     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 4, -2);
4187     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 0, 19);
4188     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 1, -4);
4189     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 2, -4);
4190     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 5, 0, 19);
4191     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 5, 1, 19);
4192     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 6, 0, 0);
4193     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 0, 19);
4194     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 1, 18);
4195     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 5, 14);
4196     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 9, 10);
4197     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 10, 9);
4198     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 11, 9);
4199     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 0, 19);
4200     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 1, -1);
4201     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 4, -1);
4202     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 8, -1);
4203     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 9, -1);
4204     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 10, -1);
4205     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 0, 19);
4206     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 1, -5);
4207     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 2, -5);
4208     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 4, -5);
4209     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 5, -5);
4210     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 6, -5);
4211     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 0, 19);
4212     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 1, -9);
4213     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 2, -9);
4214     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 10, 0, 19);
4215     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 10, 1, 19);
4216     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 11, 0, 0);
4217     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 0, 19);
4218     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 1, 18);
4219     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 10, 9);
4220     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 19, 0);
4221     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 20, -1);
4222     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 21, -1);
4223     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 0, 19);
4224     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 1, -1);
4225     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 9, -1);
4226     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 18, -1);
4227     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 19, -1);
4228     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 20, -1);
4229     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 0, 19);
4230     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 1, -10);
4231     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 5, -10);
4232     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 9, -10);
4233     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 10, -10);
4234     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 11, -10);
4235     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 0, 19);
4236     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 1, -19);
4237     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 2, -19);
4238     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 20, 0, 19);
4239     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 20, 1, 19);
4240     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 21, 0, 0);
4241     test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 0, 0, 20);
4242     test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 0, 1, 20);
4243     test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 1, 0, 0);
4244     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 0, 20);
4245 }
4246
4247 template <class S>
4248 void test40()
4249 {
4250     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 1, 19);
4251     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 2, 18);
4252     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 4, 16);
4253     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 5, 15);
4254     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 6, 15);
4255     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 0, 20);
4256     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 1, -1);
4257     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 2, -1);
4258     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 3, -1);
4259     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 4, -1);
4260     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 5, -1);
4261     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 0, 20);
4262     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 1, -2);
4263     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 2, -2);
4264     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 3, -2);
4265     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 4, -2);
4266     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 0, 20);
4267     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 1, -4);
4268     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 2, -4);
4269     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 5, 0, 20);
4270     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 5, 1, 20);
4271     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 6, 0, 0);
4272     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 0, 20);
4273     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 1, 19);
4274     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 5, 15);
4275     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 9, 11);
4276     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 10, 10);
4277     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 11, 10);
4278     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 0, 20);
4279     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 1, -1);
4280     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 4, -1);
4281     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 8, -1);
4282     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 9, -1);
4283     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 10, -1);
4284     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 0, 20);
4285     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 1, -5);
4286     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 2, -5);
4287     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 4, -5);
4288     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 5, -5);
4289     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 6, -5);
4290     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 0, 20);
4291     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 1, -9);
4292     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 2, -9);
4293     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 10, 0, 20);
4294     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 10, 1, 20);
4295     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 11, 0, 0);
4296     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 0, 20);
4297     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 1, 19);
4298     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 10, 10);
4299     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 19, 1);
4300     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 20, 0);
4301     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 21, 0);
4302     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 0, 20);
4303     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 1, -1);
4304     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 9, -1);
4305     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 18, -1);
4306     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 19, -1);
4307     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 20, -1);
4308     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 0, 20);
4309     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 1, -10);
4310     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 5, -10);
4311     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 9, -10);
4312     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 10, -10);
4313     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 11, -10);
4314     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 0, 20);
4315     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 1, -19);
4316     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 2, -19);
4317     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 20, 0, 20);
4318     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 20, 1, 20);
4319     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 21, 0, 0);
4320     test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 0, 0, 20);
4321     test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 0, 1, 20);
4322     test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 1, 0, 0);
4323     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 0, 20);
4324     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 1, 19);
4325     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 2, 18);
4326     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 4, 16);
4327     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 5, 15);
4328     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 6, 15);
4329     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 0, 20);
4330     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 1, -1);
4331     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 2, -1);
4332     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 3, -1);
4333     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 4, -1);
4334     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 5, -1);
4335     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 0, 20);
4336     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 1, -2);
4337     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 2, -2);
4338     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 3, -2);
4339     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 4, -2);
4340     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 0, 20);
4341     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 1, -4);
4342     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 2, -4);
4343     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 5, 0, 20);
4344     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 5, 1, 20);
4345     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 6, 0, 0);
4346     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 0, 20);
4347     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 1, 19);
4348     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 5, 15);
4349     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 9, 11);
4350 }
4351
4352 template <class S>
4353 void test41()
4354 {
4355     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 10, 10);
4356     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 11, 10);
4357     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 0, 20);
4358     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 1, -1);
4359     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 4, -1);
4360     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 8, -1);
4361     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 9, -1);
4362     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 10, -1);
4363     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 0, 20);
4364     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 1, -5);
4365     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 2, -5);
4366     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 4, -5);
4367     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 5, -5);
4368     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 6, -5);
4369     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 0, 20);
4370     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 1, -9);
4371     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 2, -9);
4372     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 10, 0, 20);
4373     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 10, 1, 20);
4374     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 11, 0, 0);
4375     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 0, 20);
4376     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 1, 19);
4377     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 10, 10);
4378     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 19, 1);
4379     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 20, 0);
4380     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 21, 0);
4381     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 0, 20);
4382     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 1, -1);
4383     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 9, -1);
4384     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 18, -1);
4385     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 19, -1);
4386     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 20, -1);
4387     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 0, 20);
4388     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 1, -10);
4389     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 5, -10);
4390     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 9, -10);
4391     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 10, -10);
4392     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 11, -10);
4393     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 0, 20);
4394     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 1, -19);
4395     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 2, -19);
4396     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 20, 0, 20);
4397     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 20, 1, 20);
4398     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 21, 0, 0);
4399     test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0, 0, 0);
4400     test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0, 1, 0);
4401     test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 1, 0, 0);
4402     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 0, 0);
4403     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 1, -1);
4404     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 2, -2);
4405     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 4, -4);
4406     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 5, -5);
4407     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 6, -5);
4408     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 0, 0);
4409     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 1, -1);
4410     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 2, -2);
4411     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 3, -3);
4412     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 4, -4);
4413     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 5, -4);
4414     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 0, 0);
4415     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 1, -1);
4416     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 2, -2);
4417     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 3, -3);
4418     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 4, -3);
4419     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 0, 0);
4420     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 1, -1);
4421     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 2, -1);
4422     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 5, 0, 0);
4423     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 5, 1, 0);
4424     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 6, 0, 0);
4425     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 0, 0);
4426     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 1, -1);
4427     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 5, -5);
4428     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 9, -9);
4429     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 10, -10);
4430     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 11, -10);
4431     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 0, 0);
4432     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 1, -1);
4433     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 4, -4);
4434     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 8, -8);
4435     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 9, -9);
4436     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 10, -9);
4437     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 0, 0);
4438     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 1, -1);
4439     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 2, -2);
4440     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 4, -4);
4441     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 5, -5);
4442     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 6, -5);
4443     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 0, 0);
4444     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 1, -1);
4445     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 2, -1);
4446     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 10, 0, 0);
4447     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 10, 1, 0);
4448     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 11, 0, 0);
4449     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
4450     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
4451     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
4452     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
4453     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
4454     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
4455 }
4456
4457 template <class S>
4458 void test42()
4459 {
4460     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
4461     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
4462     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
4463     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
4464     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
4465     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
4466     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
4467     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
4468     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
4469     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
4470     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
4471     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
4472     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
4473     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
4474     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
4475     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
4476     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
4477     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
4478     test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 0, 0, 1);
4479     test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 0, 1, 1);
4480     test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 1, 0, 0);
4481     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 0, 1);
4482     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 1, 1);
4483     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 2, 1);
4484     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 4, 1);
4485     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 5, 1);
4486     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 6, 1);
4487     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 0, 1);
4488     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 1, 0);
4489     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 2, -1);
4490     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 3, -2);
4491     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 4, -3);
4492     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 5, -3);
4493     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 0, 1);
4494     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 1, -1);
4495     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 2, -1);
4496     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 3, -1);
4497     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 4, -1);
4498     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 0, 1);
4499     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 1, -3);
4500     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 2, -3);
4501     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 5, 0, 1);
4502     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 5, 1, 1);
4503     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 6, 0, 0);
4504     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 0, 1);
4505     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 1, 1);
4506     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 5, 1);
4507     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 9, 1);
4508     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 10, 1);
4509     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 11, 1);
4510     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 0, 1);
4511     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 1, 0);
4512     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 4, -3);
4513     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 8, -7);
4514     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 9, -8);
4515     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 10, -8);
4516     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 0, 1);
4517     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 1, -4);
4518     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 2, -4);
4519     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 4, -4);
4520     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 5, -4);
4521     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 6, -4);
4522     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 0, 1);
4523     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 1, -8);
4524     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 2, -8);
4525     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 10, 0, 1);
4526     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 10, 1, 1);
4527     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 11, 0, 0);
4528     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
4529     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1);
4530     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1);
4531     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1);
4532     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1);
4533     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1);
4534     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
4535     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0);
4536     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8);
4537     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17);
4538     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18);
4539     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18);
4540     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
4541     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9);
4542     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9);
4543     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
4544     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
4545     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
4546     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
4547     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18);
4548     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18);
4549     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
4550     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
4551     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
4552     test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 0, 0, 9);
4553     test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 0, 1, 9);
4554     test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 1, 0, 0);
4555     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 0, 9);
4556     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 1, 1);
4557     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 2, 1);
4558     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 4, 1);
4559     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 5, 1);
4560 }
4561
4562 template <class S>
4563 void test43()
4564 {
4565     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 6, 1);
4566     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 0, 9);
4567     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 1, 8);
4568     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 2, 7);
4569     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 3, 6);
4570     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 4, 5);
4571     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 5, 5);
4572     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 0, 9);
4573     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 1, -1);
4574     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 2, -1);
4575     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 3, -1);
4576     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 4, -1);
4577     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 0, 9);
4578     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 1, -3);
4579     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 2, -3);
4580     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 5, 0, 9);
4581     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 5, 1, 9);
4582     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 6, 0, 0);
4583     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 0, 9);
4584     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 1, 1);
4585     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 5, 1);
4586     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 9, 1);
4587     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 10, 1);
4588     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 11, 1);
4589     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 0, 9);
4590     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 1, 8);
4591     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 4, 5);
4592     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 8, 1);
4593     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 9, 0);
4594     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 10, 0);
4595     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 0, 9);
4596     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 1, -4);
4597     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 2, -4);
4598     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 4, -4);
4599     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 5, -4);
4600     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 6, -4);
4601     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 0, 9);
4602     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 1, -8);
4603     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 2, -8);
4604     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 10, 0, 9);
4605     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 10, 1, 9);
4606     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 11, 0, 0);
4607     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
4608     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 1, 1);
4609     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 10, 1);
4610     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 19, 1);
4611     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 20, 1);
4612     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 21, 1);
4613     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
4614     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 1, 8);
4615     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 9, 0);
4616     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 18, -9);
4617     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 19, -10);
4618     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 20, -10);
4619     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
4620     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 1, -9);
4621     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 5, -9);
4622     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 9, -9);
4623     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 10, -9);
4624     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 11, -9);
4625     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
4626     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 1, -18);
4627     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 2, -18);
4628     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
4629     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
4630     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
4631     test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 0, 0, 18);
4632     test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 0, 1, 18);
4633     test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 1, 0, 0);
4634     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 0, 18);
4635     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 1, 1);
4636     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 2, 1);
4637     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 4, 1);
4638     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 5, 1);
4639     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 6, 1);
4640     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 0, 18);
4641     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 1, 17);
4642     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 2, 16);
4643     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 3, 15);
4644     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 4, 14);
4645     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 5, 14);
4646     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 0, 18);
4647     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 1, -1);
4648     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 2, -1);
4649     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 3, -1);
4650     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 4, -1);
4651     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 0, 18);
4652     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 1, -3);
4653     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 2, -3);
4654     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 5, 0, 18);
4655     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 5, 1, 18);
4656     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 6, 0, 0);
4657     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 0, 18);
4658     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 1, 1);
4659     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 5, 1);
4660     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 9, 1);
4661     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 10, 1);
4662     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 11, 1);
4663     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 0, 18);
4664     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 1, 17);
4665 }
4666
4667 template <class S>
4668 void test44()
4669 {
4670     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 4, 14);
4671     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 8, 10);
4672     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 9, 9);
4673     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 10, 9);
4674     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 0, 18);
4675     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 1, -4);
4676     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 2, -4);
4677     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 4, -4);
4678     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 5, -4);
4679     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 6, -4);
4680     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 0, 18);
4681     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 1, -8);
4682     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 2, -8);
4683     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 10, 0, 18);
4684     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 10, 1, 18);
4685     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 11, 0, 0);
4686     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 0, 18);
4687     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 1, 1);
4688     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 10, 1);
4689     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 19, 1);
4690     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 20, 1);
4691     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 21, 1);
4692     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 0, 18);
4693     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 1, 17);
4694     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 9, 9);
4695     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 18, 0);
4696     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 19, -1);
4697     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 20, -1);
4698     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 0, 18);
4699     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 1, -9);
4700     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 5, -9);
4701     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 9, -9);
4702     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 10, -9);
4703     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 11, -9);
4704     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 0, 18);
4705     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 1, -18);
4706     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 2, -18);
4707     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 20, 0, 18);
4708     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 20, 1, 18);
4709     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 21, 0, 0);
4710     test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 0, 0, 19);
4711     test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 0, 1, 19);
4712     test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 1, 0, 0);
4713     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 0, 19);
4714     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 1, 1);
4715     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 2, 1);
4716     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 4, 1);
4717     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 5, 1);
4718     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 6, 1);
4719     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 0, 19);
4720     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 1, 18);
4721     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 2, 17);
4722     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 3, 16);
4723     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 4, 15);
4724     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 5, 15);
4725     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 0, 19);
4726     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 1, -1);
4727     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 2, -1);
4728     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 3, -1);
4729     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 4, -1);
4730     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 0, 19);
4731     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 1, -3);
4732     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 2, -3);
4733     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 5, 0, 19);
4734     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 5, 1, 19);
4735     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 6, 0, 0);
4736     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 0, 19);
4737     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 1, 1);
4738     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 5, 1);
4739     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 9, 1);
4740     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 10, 1);
4741     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 11, 1);
4742     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 0, 19);
4743     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 1, 18);
4744     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 4, 15);
4745     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 8, 11);
4746     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 9, 10);
4747     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 10, 10);
4748     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 0, 19);
4749     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 1, -4);
4750     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 2, -4);
4751     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 4, -4);
4752     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 5, -4);
4753     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 6, -4);
4754     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 0, 19);
4755     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 1, -8);
4756     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 2, -8);
4757     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 10, 0, 19);
4758     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 10, 1, 19);
4759     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 11, 0, 0);
4760     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 0, 19);
4761     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 1, 1);
4762     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 10, 1);
4763     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 19, 1);
4764     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 20, 1);
4765     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 21, 1);
4766     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 0, 19);
4767     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 1, 18);
4768     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 9, 10);
4769     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 18, 1);
4770 }
4771
4772 template <class S>
4773 void test45()
4774 {
4775     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 19, 0);
4776     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 20, 0);
4777     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 0, 19);
4778     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 1, -9);
4779     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 5, -9);
4780     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 9, -9);
4781     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 10, -9);
4782     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 11, -9);
4783     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 0, 19);
4784     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 1, -18);
4785     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 2, -18);
4786     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 20, 0, 19);
4787     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 20, 1, 19);
4788     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 21, 0, 0);
4789     test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 0, 0, 19);
4790     test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 0, 1, 19);
4791     test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 1, 0, 0);
4792     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 0, 19);
4793     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 1, 1);
4794     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 2, 1);
4795     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 4, 1);
4796     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 5, 1);
4797     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 6, 1);
4798     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 0, 19);
4799     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 1, 18);
4800     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 2, 17);
4801     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 3, 16);
4802     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 4, 15);
4803     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 5, 15);
4804     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 0, 19);
4805     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 1, -1);
4806     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 2, -1);
4807     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 3, -1);
4808     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 4, -1);
4809     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 0, 19);
4810     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 1, -3);
4811     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 2, -3);
4812     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 5, 0, 19);
4813     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 5, 1, 19);
4814     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 6, 0, 0);
4815     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 0, 19);
4816     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 1, 1);
4817     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 5, 1);
4818     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 9, 1);
4819     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 10, 1);
4820     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 11, 1);
4821     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 0, 19);
4822     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 1, 18);
4823     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 4, 15);
4824     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 8, 11);
4825     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 9, 10);
4826     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 10, 10);
4827     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 0, 19);
4828     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 1, -4);
4829     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 2, -4);
4830     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 4, -4);
4831     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 5, -4);
4832     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 6, -4);
4833     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 0, 19);
4834     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 1, -8);
4835     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 2, -8);
4836     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 10, 0, 19);
4837     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 10, 1, 19);
4838     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 11, 0, 0);
4839     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 0, 19);
4840     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 1, 1);
4841     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 10, 1);
4842     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 19, 1);
4843     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 20, 1);
4844     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 21, 1);
4845     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 0, 19);
4846     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 1, 18);
4847     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 9, 10);
4848     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 18, 1);
4849     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 19, 0);
4850     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 20, 0);
4851     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 0, 19);
4852     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 1, -9);
4853     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 5, -9);
4854     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 9, -9);
4855     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 10, -9);
4856     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 11, -9);
4857     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 0, 19);
4858     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 1, -18);
4859     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 2, -18);
4860     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 20, 0, 19);
4861     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 20, 1, 19);
4862     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 21, 0, 0);
4863     test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0, 0, 0);
4864     test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0, 1, 0);
4865     test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 1, 0, 0);
4866     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 0, 0);
4867     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 1, -1);
4868     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 2, -2);
4869     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 4, -4);
4870     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 5, -5);
4871     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 6, -5);
4872     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 0, 0);
4873     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 1, -1);
4874     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 2, -2);
4875 }
4876
4877 template <class S>
4878 void test46()
4879 {
4880     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 3, -3);
4881     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 4, -4);
4882     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 5, -4);
4883     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 0, 0);
4884     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 1, -1);
4885     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 2, -2);
4886     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 3, -3);
4887     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 4, -3);
4888     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 0, 0);
4889     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 1, -1);
4890     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 2, -1);
4891     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 5, 0, 0);
4892     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 5, 1, 0);
4893     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 6, 0, 0);
4894     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 0, 0);
4895     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 1, -1);
4896     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 5, -5);
4897     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 9, -9);
4898     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 10, -10);
4899     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 11, -10);
4900     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 0, 0);
4901     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 1, -1);
4902     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 4, -4);
4903     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 8, -8);
4904     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 9, -9);
4905     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 10, -9);
4906     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 0, 0);
4907     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 1, -1);
4908     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 2, -2);
4909     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 4, -4);
4910     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 5, -5);
4911     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 6, -5);
4912     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 0, 0);
4913     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 1, -1);
4914     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 2, -1);
4915     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 10, 0, 0);
4916     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 10, 1, 0);
4917     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 11, 0, 0);
4918     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
4919     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
4920     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
4921     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
4922     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
4923     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
4924     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
4925     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
4926     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
4927     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
4928     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
4929     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
4930     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
4931     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
4932     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
4933     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
4934     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
4935     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
4936     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
4937     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
4938     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
4939     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
4940     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
4941     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
4942     test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 0, 0, 1);
4943     test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 0, 1, 1);
4944     test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 1, 0, 0);
4945     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 0, 1);
4946     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 1, 10);
4947     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 2, 10);
4948     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 4, 10);
4949     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 5, 10);
4950     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 6, 10);
4951     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 0, 1);
4952     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 1, 9);
4953     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 2, 9);
4954     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 3, 9);
4955     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 4, 9);
4956     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 5, 9);
4957     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 0, 1);
4958     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 1, 8);
4959     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 2, 8);
4960     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 3, 8);
4961     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 4, 8);
4962     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 0, 1);
4963     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 1, 6);
4964     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 2, 6);
4965     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 5, 0, 1);
4966     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 5, 1, 1);
4967     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 6, 0, 0);
4968     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 0, 1);
4969     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 1, 10);
4970     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 5, 10);
4971     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 9, 10);
4972     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 10, 10);
4973     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 11, 10);
4974     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 0, 1);
4975     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 1, 9);
4976     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 4, 9);
4977     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 8, 9);
4978     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 9, 9);
4979     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 10, 9);
4980 }
4981
4982 template <class S>
4983 void test47()
4984 {
4985     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 0, 1);
4986     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 1, 5);
4987     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 2, 5);
4988     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 4, 5);
4989     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 5, 5);
4990     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 6, 5);
4991     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 0, 1);
4992     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 1, 1);
4993     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 2, 1);
4994     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 10, 0, 1);
4995     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 10, 1, 1);
4996     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 11, 0, 0);
4997     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
4998     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 1, 10);
4999     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 10, 10);
5000     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 19, 10);
5001     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 20, 10);
5002     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 21, 10);
5003     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
5004     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 1, 9);
5005     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 9, 9);
5006     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 18, 9);
5007     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 19, 9);
5008     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 20, 9);
5009     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
5010     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 1, 0);
5011     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 5, -4);
5012     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 9, -8);
5013     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
5014     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
5015     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
5016     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 1, -9);
5017     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 2, -9);
5018     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
5019     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
5020     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
5021     test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 0, 0, 5);
5022     test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 0, 1, 5);
5023     test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 1, 0, 0);
5024     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 0, 5);
5025     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 1, 10);
5026     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 2, 10);
5027     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 4, 10);
5028     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 5, 10);
5029     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 6, 10);
5030     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 0, 5);
5031     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 1, 9);
5032     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 2, 9);
5033     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 3, 9);
5034     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 4, 9);
5035     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 5, 9);
5036     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 0, 5);
5037     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 1, 8);
5038     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 2, 8);
5039     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 3, 8);
5040     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 4, 8);
5041     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 0, 5);
5042     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 1, 6);
5043     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 2, 6);
5044     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 5, 0, 5);
5045     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 5, 1, 5);
5046     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 6, 0, 0);
5047     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 0, 5);
5048     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 1, 10);
5049     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 5, 10);
5050     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 9, 10);
5051     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 10, 10);
5052     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 11, 10);
5053     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 0, 5);
5054     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 1, 9);
5055     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 4, 9);
5056     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 8, 9);
5057     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 9, 9);
5058     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 10, 9);
5059     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 0, 5);
5060     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 1, 5);
5061     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 2, 5);
5062     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 4, 5);
5063     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 5, 5);
5064     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 6, 5);
5065     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 0, 5);
5066     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 1, 1);
5067     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 2, 1);
5068     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 10, 0, 5);
5069     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 10, 1, 5);
5070     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 11, 0, 0);
5071     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
5072     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 1, 10);
5073     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 10, 10);
5074     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 19, 10);
5075     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 20, 10);
5076     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 21, 10);
5077     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
5078     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 1, 9);
5079     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 9, 9);
5080     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 18, 9);
5081     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 19, 9);
5082     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 20, 9);
5083     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
5084     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 1, 4);
5085 }
5086
5087 template <class S>
5088 void test48()
5089 {
5090     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 5, 0);
5091     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 9, -4);
5092     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 10, -5);
5093     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 11, -5);
5094     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
5095     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 1, -9);
5096     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 2, -9);
5097     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
5098     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
5099     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
5100     test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 0, 0, 9);
5101     test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 0, 1, 9);
5102     test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 1, 0, 0);
5103     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 0, 9);
5104     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 1, 10);
5105     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 2, 10);
5106     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 4, 10);
5107     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 5, 10);
5108     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 6, 10);
5109     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 0, 9);
5110     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 1, 9);
5111     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 2, 9);
5112     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 3, 9);
5113     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 4, 9);
5114     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 5, 9);
5115     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 0, 9);
5116     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 1, 8);
5117     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 2, 8);
5118     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 3, 8);
5119     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 4, 8);
5120     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 0, 9);
5121     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 1, 6);
5122     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 2, 6);
5123     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 5, 0, 9);
5124     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 5, 1, 9);
5125     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 6, 0, 0);
5126     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 0, 9);
5127     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 1, 10);
5128     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 5, 10);
5129     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 9, 10);
5130     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 10, 10);
5131     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 11, 10);
5132     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 0, 9);
5133     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 1, 9);
5134     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 4, 9);
5135     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 8, 9);
5136     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 9, 9);
5137     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 10, 9);
5138     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 0, 9);
5139     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 1, 5);
5140     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 2, 5);
5141     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 4, 5);
5142     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 5, 5);
5143     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 6, 5);
5144     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 0, 9);
5145     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 1, 1);
5146     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 2, 1);
5147     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 10, 0, 9);
5148     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 10, 1, 9);
5149     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 11, 0, 0);
5150     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
5151     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 1, 10);
5152     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 10, 10);
5153     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 19, 10);
5154     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 20, 10);
5155     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 21, 10);
5156     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
5157     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 1, 9);
5158     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 9, 9);
5159     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 18, 9);
5160     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 19, 9);
5161     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 20, 9);
5162     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
5163     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 1, 8);
5164     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 5, 4);
5165     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 9, 0);
5166     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 10, -1);
5167     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 11, -1);
5168     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
5169     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 1, -9);
5170     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 2, -9);
5171     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
5172     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
5173     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
5174     test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 0, 0, 10);
5175     test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 0, 1, 10);
5176     test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 1, 0, 0);
5177     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 0, 10);
5178     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 1, 10);
5179     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 2, 10);
5180     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 4, 10);
5181     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 5, 10);
5182     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 6, 10);
5183     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 0, 10);
5184     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 1, 9);
5185     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 2, 9);
5186     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 3, 9);
5187     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 4, 9);
5188     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 5, 9);
5189     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 0, 10);
5190 }
5191
5192 template <class S>
5193 void test49()
5194 {
5195     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 1, 8);
5196     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 2, 8);
5197     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 3, 8);
5198     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 4, 8);
5199     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 0, 10);
5200     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 1, 6);
5201     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 2, 6);
5202     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 5, 0, 10);
5203     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 5, 1, 10);
5204     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 6, 0, 0);
5205     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 0, 10);
5206     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 1, 10);
5207     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 5, 10);
5208     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 9, 10);
5209     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 10, 10);
5210     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 11, 10);
5211     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 0, 10);
5212     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 1, 9);
5213     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 4, 9);
5214     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 8, 9);
5215     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 9, 9);
5216     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 10, 9);
5217     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 0, 10);
5218     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 1, 5);
5219     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 2, 5);
5220     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 4, 5);
5221     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 5, 5);
5222     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 6, 5);
5223     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 0, 10);
5224     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 1, 1);
5225     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 2, 1);
5226     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 10, 0, 10);
5227     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 10, 1, 10);
5228     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 11, 0, 0);
5229     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 0, 10);
5230     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 1, 10);
5231     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 10, 10);
5232     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 19, 10);
5233     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 20, 10);
5234     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 21, 10);
5235     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 0, 10);
5236     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 1, 9);
5237     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 9, 9);
5238     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 18, 9);
5239     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 19, 9);
5240     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 20, 9);
5241     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 0, 10);
5242     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 1, 9);
5243     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 5, 5);
5244     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 9, 1);
5245     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 10, 0);
5246     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 11, 0);
5247     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 0, 10);
5248     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 1, -9);
5249     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 2, -9);
5250     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 20, 0, 10);
5251     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 20, 1, 10);
5252     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
5253     test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 0, 0, 10);
5254     test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 0, 1, 10);
5255     test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 1, 0, 0);
5256     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 0, 10);
5257     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 1, 10);
5258     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 2, 10);
5259     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 4, 10);
5260     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 5, 10);
5261     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 6, 10);
5262     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 0, 10);
5263     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 1, 9);
5264     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 2, 9);
5265     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 3, 9);
5266     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 4, 9);
5267     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 5, 9);
5268     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 0, 10);
5269     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 1, 8);
5270     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 2, 8);
5271     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 3, 8);
5272     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 4, 8);
5273     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 0, 10);
5274     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 1, 6);
5275     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 2, 6);
5276     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 5, 0, 10);
5277     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 5, 1, 10);
5278     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 6, 0, 0);
5279     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 0, 10);
5280     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 1, 10);
5281     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 5, 10);
5282     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 9, 10);
5283     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 10, 10);
5284     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 11, 10);
5285     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 0, 10);
5286     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 1, 9);
5287     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 4, 9);
5288     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 8, 9);
5289     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 9, 9);
5290     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 10, 9);
5291     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 0, 10);
5292     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 1, 5);
5293     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 2, 5);
5294     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 4, 5);
5295 }
5296
5297 template <class S>
5298 void test50()
5299 {
5300     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 5, 5);
5301     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 6, 5);
5302     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 0, 10);
5303     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 1, 1);
5304     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 2, 1);
5305     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 10, 0, 10);
5306     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 10, 1, 10);
5307     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 11, 0, 0);
5308     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 0, 10);
5309     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 1, 10);
5310     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 10, 10);
5311     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 19, 10);
5312     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 20, 10);
5313     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 21, 10);
5314     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 0, 10);
5315     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 1, 9);
5316     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 9, 9);
5317     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 18, 9);
5318     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 19, 9);
5319     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 20, 9);
5320     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 0, 10);
5321     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 1, 9);
5322     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 5, 5);
5323     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 9, 1);
5324     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 10, 0);
5325     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 11, 0);
5326     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 0, 10);
5327     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 1, -9);
5328     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 2, -9);
5329     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 20, 0, 10);
5330     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 20, 1, 10);
5331     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 21, 0, 0);
5332     test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0, 0, 0);
5333     test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0, 1, 0);
5334     test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 1, 0, 0);
5335     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 0, 0);
5336     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 1, -1);
5337     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 2, -2);
5338     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 4, -4);
5339     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 5, -5);
5340     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 6, -5);
5341     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 0, 0);
5342     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 1, -1);
5343     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 2, -2);
5344     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 3, -3);
5345     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 4, -4);
5346     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 5, -4);
5347     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 0, 0);
5348     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 1, -1);
5349     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 2, -2);
5350     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 3, -3);
5351     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 4, -3);
5352     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 0, 0);
5353     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 1, -1);
5354     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 2, -1);
5355     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 5, 0, 0);
5356     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 5, 1, 0);
5357     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 6, 0, 0);
5358     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 0, 0);
5359     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 1, -1);
5360     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 5, -5);
5361     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 9, -9);
5362     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 10, -10);
5363     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 11, -10);
5364     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 0, 0);
5365     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 1, -1);
5366     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 4, -4);
5367     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 8, -8);
5368     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 9, -9);
5369     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 10, -9);
5370     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 0, 0);
5371     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 1, -1);
5372     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 2, -2);
5373     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 4, -4);
5374     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 5, -5);
5375     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 6, -5);
5376     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 0, 0);
5377     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 1, -1);
5378     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 2, -1);
5379     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 10, 0, 0);
5380     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 10, 1, 0);
5381     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 11, 0, 0);
5382     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
5383     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
5384     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
5385     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
5386     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
5387     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
5388     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
5389     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
5390     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
5391     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
5392     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
5393     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
5394     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
5395     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
5396     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
5397     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
5398     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
5399     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
5400 }
5401
5402 template <class S>
5403 void test51()
5404 {
5405     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
5406     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
5407     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
5408     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
5409     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
5410     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
5411     test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 0, 0, 1);
5412     test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 0, 1, 1);
5413     test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 1, 0, 0);
5414     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 0, 1);
5415     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 1, 19);
5416     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 2, 19);
5417     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 4, 19);
5418     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 5, 19);
5419     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 6, 19);
5420     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 0, 1);
5421     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 1, 18);
5422     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 2, 18);
5423     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 3, 18);
5424     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 4, 18);
5425     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 5, 18);
5426     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 0, 1);
5427     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 1, 17);
5428     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 2, 17);
5429     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 3, 17);
5430     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 4, 17);
5431     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 0, 1);
5432     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 1, 15);
5433     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 2, 15);
5434     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 5, 0, 1);
5435     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 5, 1, 1);
5436     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 6, 0, 0);
5437     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 0, 1);
5438     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 1, 19);
5439     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 5, 19);
5440     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 9, 19);
5441     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 10, 19);
5442     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 11, 19);
5443     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 0, 1);
5444     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 1, 18);
5445     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 4, 18);
5446     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 8, 18);
5447     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 9, 18);
5448     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 10, 18);
5449     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 0, 1);
5450     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 1, 14);
5451     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 2, 14);
5452     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 4, 14);
5453     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 5, 14);
5454     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 6, 14);
5455     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 0, 1);
5456     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 1, 10);
5457     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 2, 10);
5458     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 10, 0, 1);
5459     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 10, 1, 1);
5460     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 11, 0, 0);
5461     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
5462     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 1, 19);
5463     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 10, 19);
5464     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 19, 19);
5465     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 20, 19);
5466     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 21, 19);
5467     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
5468     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 1, 18);
5469     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 9, 18);
5470     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 18, 18);
5471     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 19, 18);
5472     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 20, 18);
5473     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
5474     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 1, 9);
5475     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 5, 9);
5476     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 9, 9);
5477     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 10, 9);
5478     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 11, 9);
5479     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
5480     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 1, 0);
5481     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 2, 0);
5482     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
5483     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
5484     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
5485     test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 0, 0, 1);
5486     test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 0, 1, 1);
5487     test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 1, 0, 0);
5488     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 0, 1);
5489     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 1, 19);
5490     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 2, 19);
5491     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 4, 19);
5492     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 5, 19);
5493     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 6, 19);
5494     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 0, 1);
5495     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 1, 18);
5496     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 2, 18);
5497     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 3, 18);
5498     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 4, 18);
5499     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 5, 18);
5500     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 0, 1);
5501     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 1, 17);
5502     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 2, 17);
5503     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 3, 17);
5504     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 4, 17);
5505 }
5506
5507 template <class S>
5508 void test52()
5509 {
5510     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 0, 1);
5511     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 1, 15);
5512     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 2, 15);
5513     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 5, 0, 1);
5514     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 5, 1, 1);
5515     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 6, 0, 0);
5516     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 0, 1);
5517     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 1, 19);
5518     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 5, 19);
5519     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 9, 19);
5520     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 10, 19);
5521     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 11, 19);
5522     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 0, 1);
5523     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 1, 18);
5524     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 4, 18);
5525     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 8, 18);
5526     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 9, 18);
5527     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 10, 18);
5528     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 0, 1);
5529     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 1, 14);
5530     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 2, 14);
5531     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 4, 14);
5532     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 5, 14);
5533     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 6, 14);
5534     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 0, 1);
5535     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 1, 10);
5536     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 2, 10);
5537     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 10, 0, 1);
5538     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 10, 1, 1);
5539     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 11, 0, 0);
5540     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 0, 1);
5541     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 1, 19);
5542     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 10, 19);
5543     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 19, 19);
5544     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 20, 19);
5545     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 21, 19);
5546     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 0, 1);
5547     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 1, 18);
5548     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 9, 18);
5549     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 18, 18);
5550     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 19, 18);
5551     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 20, 18);
5552     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 0, 1);
5553     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 1, 9);
5554     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 5, 9);
5555     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 9, 9);
5556     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 10, 9);
5557     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 11, 9);
5558     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 0, 1);
5559     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 1, 0);
5560     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 2, 0);
5561     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 20, 0, 1);
5562     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 20, 1, 1);
5563     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
5564     test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0, 0, 0);
5565     test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0, 1, 0);
5566     test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 1, 0, 0);
5567     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 0, 0);
5568     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 1, -1);
5569     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 2, -2);
5570     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 4, -4);
5571     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 5, -5);
5572     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 6, -5);
5573     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 0, 0);
5574     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 1, -1);
5575     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 2, -2);
5576     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 3, -3);
5577     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 4, -4);
5578     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 5, -4);
5579     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 0, 0);
5580     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 1, -1);
5581     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 2, -2);
5582     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 3, -3);
5583     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 4, -3);
5584     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 0, 0);
5585     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 1, -1);
5586     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 2, -1);
5587     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 5, 0, 0);
5588     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 5, 1, 0);
5589     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 6, 0, 0);
5590     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 0, 0);
5591     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 1, -1);
5592     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 5, -5);
5593     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 9, -9);
5594     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 10, -10);
5595     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 11, -10);
5596     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 0, 0);
5597     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 1, -1);
5598     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 4, -4);
5599     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 8, -8);
5600     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 9, -9);
5601     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 10, -9);
5602     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 0, 0);
5603     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 1, -1);
5604     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 2, -2);
5605     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 4, -4);
5606     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 5, -5);
5607     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 6, -5);
5608     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 0, 0);
5609     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 1, -1);
5610 }
5611
5612 template <class S>
5613 void test53()
5614 {
5615     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 2, -1);
5616     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 10, 0, 0);
5617     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 10, 1, 0);
5618     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 11, 0, 0);
5619     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
5620     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
5621     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
5622     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
5623     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
5624     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
5625     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
5626     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
5627     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
5628     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
5629     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
5630     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
5631     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
5632     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
5633     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
5634     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
5635     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
5636     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
5637     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
5638     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
5639     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
5640     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
5641     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
5642     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
5643     test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0, 0, 0);
5644     test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0, 1, 0);
5645     test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 1, 0, 0);
5646     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 0, 0);
5647     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 1, -1);
5648     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 2, -2);
5649     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 4, -4);
5650     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 5, -5);
5651     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 6, -5);
5652     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 0, 0);
5653     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 1, -1);
5654     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 2, -2);
5655     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 3, -3);
5656     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 4, -4);
5657     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 5, -4);
5658     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 0, 0);
5659     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 1, -1);
5660     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 2, -2);
5661     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 3, -3);
5662     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 4, -3);
5663     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 0, 0);
5664     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 1, -1);
5665     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 2, -1);
5666     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 5, 0, 0);
5667     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 5, 1, 0);
5668     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 6, 0, 0);
5669     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 0, 0);
5670     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 1, -1);
5671     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 5, -5);
5672     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 9, -9);
5673     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 10, -10);
5674     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 11, -10);
5675     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 0, 0);
5676     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 1, -1);
5677     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 4, -4);
5678     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 8, -8);
5679     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 9, -9);
5680     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 10, -9);
5681     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 0, 0);
5682     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 1, -1);
5683     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 2, -2);
5684     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 4, -4);
5685     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 5, -5);
5686     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 6, -5);
5687     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 0, 0);
5688     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 1, -1);
5689     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 2, -1);
5690     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 10, 0, 0);
5691     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 10, 1, 0);
5692     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 11, 0, 0);
5693     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
5694     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
5695     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
5696     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
5697     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
5698     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
5699     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
5700     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
5701     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
5702     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
5703     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
5704     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
5705     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
5706     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
5707     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
5708     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
5709     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
5710     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
5711     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
5712     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
5713     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
5714     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
5715 }
5716
5717 template <class S>
5718 void test54()
5719 {
5720     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
5721     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
5722     test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0, 0, 0);
5723     test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0, 1, 0);
5724     test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 1, 0, 0);
5725     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 0, 0);
5726     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 1, 0);
5727     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 2, 0);
5728     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 4, 0);
5729     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 5, 0);
5730     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 6, 0);
5731     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 0, 0);
5732     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 1, 0);
5733     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 2, 0);
5734     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 3, 0);
5735     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 4, 0);
5736     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 5, 0);
5737     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 0, 0);
5738     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 1, 0);
5739     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 2, 0);
5740     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 3, 0);
5741     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 4, 0);
5742     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 0, 0);
5743     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 1, 0);
5744     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 2, 0);
5745     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 5, 0, 0);
5746     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 5, 1, 0);
5747     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 6, 0, 0);
5748     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 0, 0);
5749     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 1, 0);
5750     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 5, 0);
5751     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 9, 0);
5752     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 10, 0);
5753     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 11, 0);
5754     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 0, 0);
5755     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 1, 0);
5756     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 4, 0);
5757     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 8, 0);
5758     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 9, 0);
5759     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 10, 0);
5760     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 0, 0);
5761     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 1, 0);
5762     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 2, 0);
5763     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 4, 0);
5764     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 5, 0);
5765     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 6, 0);
5766     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 0, 0);
5767     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 1, 0);
5768     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 2, 0);
5769     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 10, 0, 0);
5770     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 10, 1, 0);
5771     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 11, 0, 0);
5772     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
5773     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
5774     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
5775     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
5776     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
5777     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
5778     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
5779     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
5780     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
5781     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
5782     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
5783     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
5784     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
5785     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
5786     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
5787     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
5788     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
5789     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
5790     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
5791     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
5792     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
5793     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
5794     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
5795     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
5796 }
5797
5798 int main()
5799 {
5800     {
5801     typedef std::string S;
5802     test0<S>();
5803     test1<S>();
5804     test2<S>();
5805     test3<S>();
5806     test4<S>();
5807     test5<S>();
5808     test6<S>();
5809     test7<S>();
5810     test8<S>();
5811     test9<S>();
5812     test10<S>();
5813     test11<S>();
5814     test12<S>();
5815     test13<S>();
5816     test14<S>();
5817     test15<S>();
5818     test16<S>();
5819     test17<S>();
5820     test18<S>();
5821     test19<S>();
5822     test20<S>();
5823     test21<S>();
5824     test22<S>();
5825     test23<S>();
5826     test24<S>();
5827     test25<S>();
5828     test26<S>();
5829     test27<S>();
5830     test28<S>();
5831     test29<S>();
5832     test30<S>();
5833     test31<S>();
5834     test32<S>();
5835     test33<S>();
5836     test34<S>();
5837     test35<S>();
5838     test36<S>();
5839     test37<S>();
5840     test38<S>();
5841     test39<S>();
5842     test40<S>();
5843     test41<S>();
5844     test42<S>();
5845     test43<S>();
5846     test44<S>();
5847     test45<S>();
5848     test46<S>();
5849     test47<S>();
5850     test48<S>();
5851     test49<S>();
5852     test50<S>();
5853     test51<S>();
5854     test52<S>();
5855     test53<S>();
5856     test54<S>();
5857     }
5858 #if __cplusplus >= 201103L
5859     {
5860     typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
5861     test0<S>();
5862     test1<S>();
5863     test2<S>();
5864     test3<S>();
5865     test4<S>();
5866     test5<S>();
5867     test6<S>();
5868     test7<S>();
5869     test8<S>();
5870     test9<S>();
5871     test10<S>();
5872     test11<S>();
5873     test12<S>();
5874     test13<S>();
5875     test14<S>();
5876     test15<S>();
5877     test16<S>();
5878     test17<S>();
5879     test18<S>();
5880     test19<S>();
5881     test20<S>();
5882     test21<S>();
5883     test22<S>();
5884     test23<S>();
5885     test24<S>();
5886     test25<S>();
5887     test26<S>();
5888     test27<S>();
5889     test28<S>();
5890     test29<S>();
5891     test30<S>();
5892     test31<S>();
5893     test32<S>();
5894     test33<S>();
5895     test34<S>();
5896     test35<S>();
5897     test36<S>();
5898     test37<S>();
5899     test38<S>();
5900     test39<S>();
5901     test40<S>();
5902     test41<S>();
5903     test42<S>();
5904     test43<S>();
5905     test44<S>();
5906     test45<S>();
5907     test46<S>();
5908     test47<S>();
5909     test48<S>();
5910     test49<S>();
5911     test50<S>();
5912     test51<S>();
5913     test52<S>();
5914     test53<S>();
5915     test54<S>();
5916     }
5917 #endif
5918 }