debug printout cleanup
[zxing.git] / cpp / core / src / qrcode / decoder / Version.cpp
1 /*
2  *  Version.cpp
3  *  zxing
4  *
5  *  Created by Christian Brunschen on 14/05/2008.
6  *  Copyright 2008 ZXing authors All rights reserved.
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20
21 #include "Version.h"
22 #include <cstdarg>
23 #include <limits>
24 #include "FormatInformation.h"
25 #include <iostream>
26
27 namespace qrcode {
28   namespace decoder {
29     unsigned int Version::VERSION_DECODE_INFO[] = {
30     0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6,
31     0x0C762, 0x0D847, 0x0E60D, 0x0F928, 0x10B78,
32     0x1145D, 0x12A17, 0x13532, 0x149A6, 0x15683,
33     0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB,
34     0x1B08E, 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250,
35     0x209D5, 0x216F0, 0x228BA, 0x2379F, 0x24B0B,
36     0x2542E, 0x26A64, 0x27541, 0x28C69
37     };
38     int Version::N_VERSION_DECODE_INFOS = 34;
39     vector<Version*> Version::VERSIONS;
40     static int N_VERSIONS = Version::buildVersions();
41     
42     
43     int Version::getVersionNumber() {
44       return versionNumber_; 
45     }
46     
47     valarray<int> &Version::getAlignmentPatternCenters() { 
48       return alignmentPatternCenters_; 
49     }
50     
51     int Version::getTotalCodewords() { 
52       return totalCodewords_; 
53     }
54     
55     int Version::getDimensionForVersion() { 
56       return 17 + 4 * versionNumber_;
57     }
58     
59     Version::ECBlocks& 
60     Version::getECBlocksForLevel(ErrorCorrectionLevel &ecLevel) {
61       return *ecBlocks_[ecLevel.ordinal()];
62     }
63     
64     Version *Version::getProvisionalVersionForDimension(int dimension) {
65       if (dimension %4 != 1) { 
66         throw new ReaderException("Dimension must be 1 mod 4");
67       }
68       return Version::getVersionForNumber((dimension - 17) >> 2);
69     }
70     
71     Version *Version::getVersionForNumber(int versionNumber) {
72       if (versionNumber < 1 || versionNumber > 40) {
73         throw new ReaderException("versionNumber must be between 1 and 40");
74       }
75       N_VERSIONS;
76       return VERSIONS[versionNumber - 1];
77     }
78     
79     Version::Version(int versionNumber,
80                      valarray<int> *alignmentPatternCenters,
81                      ECBlocks *ecBlocks1,
82                      ECBlocks *ecBlocks2,
83                      ECBlocks *ecBlocks3,
84                      ECBlocks *ecBlocks4) :
85     versionNumber_(versionNumber),
86     alignmentPatternCenters_(*alignmentPatternCenters),
87     ecBlocks_(4)
88     {
89       ecBlocks_[0] = ecBlocks1;
90       ecBlocks_[1] = ecBlocks2;
91       ecBlocks_[2] = ecBlocks3;
92       ecBlocks_[3] = ecBlocks4;
93       
94       int total = 0;
95       int ecCodewords = ecBlocks1->getECCodewords();
96       vector<ECB*> &ecbArray = ecBlocks1->getECBlocks();
97       for (size_t i = 0; i < ecbArray.size(); i++) {
98         ECB *ecBlock = ecbArray[i];
99         total += ecBlock->getCount() * 
100           (ecBlock->getDataCodewords() + ecCodewords);
101       }
102       totalCodewords_ = total;
103     }
104     
105     
106     Version *Version::decodeVersionInformation(unsigned int versionBits) {
107       int bestDifference = numeric_limits<int>::max();
108       size_t bestVersion = 0;
109       for (int i = 0; i < N_VERSION_DECODE_INFOS; i++) {
110         unsigned targetVersion = VERSION_DECODE_INFO[i];
111         // Do the version info bits match exactly? done.
112         if (targetVersion == versionBits) {
113           return getVersionForNumber(i + 7);
114         }
115         // Otherwise see if this is the closest to a real version info bit
116         // string we have seen so far
117         int bitsDifference = 
118           FormatInformation::numBitsDiffering(versionBits, targetVersion);
119         if (bitsDifference < bestDifference) {
120           bestVersion = i + 7;
121         }
122       }
123       // We can tolerate up to 3 bits of error since no two version info codewords will
124       // differ in less than 4 bits.
125       if (bestDifference <= 3) {
126         return getVersionForNumber(bestVersion);
127       }
128       // If we didn't find a close enough match, fail
129       return 0;
130     }
131     
132     Ref<BitMatrix> Version::buildFunctionPattern() {
133       int dimension = getDimensionForVersion();
134       Ref<BitMatrix> functionPattern(new BitMatrix(dimension));
135       
136       // Top left finder pattern + separator + format
137       functionPattern->setRegion(0, 0, 9, 9);
138       // Top right finder pattern + separator + format
139       functionPattern->setRegion(0, dimension - 8, 9, 8);
140       // Bottom left finder pattern + separator + format
141       functionPattern->setRegion(dimension - 8, 0, 8, 9);
142       
143       // Alignment patterns
144       size_t max = alignmentPatternCenters_.size();
145       for (size_t x = 0; x < max; x++) {
146         int i = alignmentPatternCenters_[x] - 2;
147         for (size_t y = 0; y < max; y++) {
148           if ((x == 0 && (y == 0 || y == max - 1)) || 
149               (x == max - 1 && y == 0)) {
150             // No alignment patterns near the three finder patterns
151             continue;
152           }
153           functionPattern->setRegion(i, alignmentPatternCenters_[y] - 2, 5, 5);
154         }
155       }
156       
157       // Vertical timing pattern
158       functionPattern->setRegion(9, 6, dimension - 17, 1);
159       // Horizontal timing pattern
160       functionPattern->setRegion(6, 9, 1, dimension - 17);
161       
162       if (versionNumber_ > 6) {
163         // Version info, top right
164         functionPattern->setRegion(0, dimension - 11, 6, 3);
165         // Version info, bottom left
166         functionPattern->setRegion(dimension - 11, 0, 3, 6);
167       }
168       
169 #ifdef DEBUG
170       cout << "version " << versionNumber_ << " built function pattern:\n";
171       cout << *functionPattern;
172 #endif
173       
174       return functionPattern;
175     }
176     
177     static valarray<int> *intArray(size_t n ...) {
178       va_list ap;
179       va_start(ap, n);
180       valarray<int> *result = new valarray<int>(n);
181       for (size_t i = 0; i < n; i++) {
182         (*result)[i] = va_arg(ap, int);
183       }
184       va_end(ap);
185       return result;
186     }
187     
188     int Version::buildVersions() {
189       VERSIONS.push_back(new Version(1, intArray(0),
190                                      new ECBlocks(7, new ECB(1, 19)),
191                                      new ECBlocks(10, new ECB(1, 16)),
192                                      new ECBlocks(13, new ECB(1, 13)),
193                                      new ECBlocks(17, new ECB(1, 9))));
194       VERSIONS.push_back(new Version(2, intArray(2, 6, 18),
195                                      new ECBlocks(10, new ECB(1, 34)),
196                                      new ECBlocks(16, new ECB(1, 28)),
197                                      new ECBlocks(22, new ECB(1, 22)),
198                                      new ECBlocks(28, new ECB(1, 16))));
199       VERSIONS.push_back(new Version(3, intArray(2, 6, 22),
200                                      new ECBlocks(15, new ECB(1, 55)),
201                                      new ECBlocks(26, new ECB(1, 44)),
202                                      new ECBlocks(18, new ECB(2, 17)),
203                                      new ECBlocks(22, new ECB(2, 13))));
204       VERSIONS.push_back(new Version(4, intArray(2, 6, 26),
205                                      new ECBlocks(20, new ECB(1, 80)),
206                                      new ECBlocks(18, new ECB(2, 32)),
207                                      new ECBlocks(26, new ECB(2, 24)),
208                                      new ECBlocks(16, new ECB(4, 9))));
209       VERSIONS.push_back(new Version(5, intArray(2, 6, 30),
210                                      new ECBlocks(26, new ECB(1, 108)),
211                                      new ECBlocks(24, new ECB(2, 43)),
212                                      new ECBlocks(18, new ECB(2, 15),
213                                                   new ECB(2, 16)),
214                                      new ECBlocks(22, new ECB(2, 11),
215                                                   new ECB(2, 12))));
216       VERSIONS.push_back(new Version(6, intArray(2, 6, 34),
217                                      new ECBlocks(18, new ECB(2, 68)),
218                                      new ECBlocks(16, new ECB(4, 27)),
219                                      new ECBlocks(24, new ECB(4, 19)),
220                                      new ECBlocks(28, new ECB(4, 15))));
221       VERSIONS.push_back(new Version(7, intArray(3, 6, 22, 38),
222                                      new ECBlocks(20, new ECB(2, 78)),
223                                      new ECBlocks(18, new ECB(4, 31)),
224                                      new ECBlocks(18, new ECB(2, 14),
225                                                   new ECB(4, 15)),
226                                      new ECBlocks(26, new ECB(4, 13),
227                                                   new ECB(1, 14))));
228       VERSIONS.push_back(new Version(8, intArray(3, 6, 24, 42),
229                                      new ECBlocks(24, new ECB(2, 97)),
230                                      new ECBlocks(22, new ECB(2, 38),
231                                                   new ECB(2, 39)),
232                                      new ECBlocks(22, new ECB(4, 18),
233                                                   new ECB(2, 19)),
234                                      new ECBlocks(26, new ECB(4, 14),
235                                                   new ECB(2, 15))));
236       VERSIONS.push_back(new Version(9, intArray(3, 6, 26, 46),
237                                      new ECBlocks(30, new ECB(2, 116)),
238                                      new ECBlocks(22, new ECB(3, 36),
239                                                   new ECB(2, 37)),
240                                      new ECBlocks(20, new ECB(4, 16),
241                                                   new ECB(4, 17)),
242                                      new ECBlocks(24, new ECB(4, 12),
243                                                   new ECB(4, 13))));
244       VERSIONS.push_back(new Version(10, intArray(3, 6, 28, 50),
245                                      new ECBlocks(18, new ECB(2, 68),
246                                                   new ECB(2, 69)),
247                                      new ECBlocks(26, new ECB(4, 43),
248                                                   new ECB(1, 44)),
249                                      new ECBlocks(24, new ECB(6, 19),
250                                                   new ECB(2, 20)),
251                                      new ECBlocks(28, new ECB(6, 15),
252                                                   new ECB(2, 16))));
253       VERSIONS.push_back(new Version(11, intArray(3, 6, 30, 54),
254                                      new ECBlocks(20, new ECB(4, 81)),
255                                      new ECBlocks(30, new ECB(1, 50),
256                                                   new ECB(4, 51)),
257                                      new ECBlocks(28, new ECB(4, 22),
258                                                   new ECB(4, 23)),
259                                      new ECBlocks(24, new ECB(3, 12),
260                                                   new ECB(8, 13))));
261       VERSIONS.push_back(new Version(12, intArray(3, 6, 32, 58),
262                                      new ECBlocks(24, new ECB(2, 92),
263                                                   new ECB(2, 93)),
264                                      new ECBlocks(22, new ECB(6, 36),
265                                                   new ECB(2, 37)),
266                                      new ECBlocks(26, new ECB(4, 20),
267                                                   new ECB(6, 21)),
268                                      new ECBlocks(28, new ECB(7, 14),
269                                                   new ECB(4, 15))));
270       VERSIONS.push_back(new Version(13, intArray(3, 6, 34, 62),
271                                      new ECBlocks(26, new ECB(4, 107)),
272                                      new ECBlocks(22, new ECB(8, 37),
273                                                   new ECB(1, 38)),
274                                      new ECBlocks(24, new ECB(8, 20),
275                                                   new ECB(4, 21)),
276                                      new ECBlocks(22, new ECB(12, 11),
277                                                   new ECB(4, 12))));
278       VERSIONS.push_back(new Version(14, intArray(4, 6, 26, 46, 66),
279                                      new ECBlocks(30, new ECB(3, 115),
280                                                   new ECB(1, 116)),
281                                      new ECBlocks(24, new ECB(4, 40),
282                                                   new ECB(5, 41)),
283                                      new ECBlocks(20, new ECB(11, 16),
284                                                   new ECB(5, 17)),
285                                      new ECBlocks(24, new ECB(11, 12),
286                                                   new ECB(5, 13))));
287       VERSIONS.push_back(new Version(15, intArray(4, 6, 26, 48, 70),
288                                      new ECBlocks(22, new ECB(5, 87),
289                                                   new ECB(1, 88)),
290                                      new ECBlocks(24, new ECB(5, 41),
291                                                   new ECB(5, 42)),
292                                      new ECBlocks(30, new ECB(5, 24),
293                                                   new ECB(7, 25)),
294                                      new ECBlocks(24, new ECB(11, 12),
295                                                   new ECB(7, 13))));
296       VERSIONS.push_back(new Version(16, intArray(4, 6, 26, 50, 74),
297                                      new ECBlocks(24, new ECB(5, 98),
298                                                   new ECB(1, 99)),
299                                      new ECBlocks(28, new ECB(7, 45),
300                                                   new ECB(3, 46)),
301                                      new ECBlocks(24, new ECB(15, 19),
302                                                   new ECB(2, 20)),
303                                      new ECBlocks(30, new ECB(3, 15),
304                                                   new ECB(13, 16))));
305       VERSIONS.push_back(new Version(17, intArray(4, 6, 30, 54, 78),
306                                      new ECBlocks(28, new ECB(1, 107),
307                                                   new ECB(5, 108)),
308                                      new ECBlocks(28, new ECB(10, 46),
309                                                   new ECB(1, 47)),
310                                      new ECBlocks(28, new ECB(1, 22),
311                                                   new ECB(15, 23)),
312                                      new ECBlocks(28, new ECB(2, 14),
313                                                   new ECB(17, 15))));
314       VERSIONS.push_back(new Version(18, intArray(4, 6, 30, 56, 82),
315                                      new ECBlocks(30, new ECB(5, 120),
316                                                   new ECB(1, 121)),
317                                      new ECBlocks(26, new ECB(9, 43),
318                                                   new ECB(4, 44)),
319                                      new ECBlocks(28, new ECB(17, 22),
320                                                   new ECB(1, 23)),
321                                      new ECBlocks(28, new ECB(2, 14),
322                                                   new ECB(19, 15))));
323       VERSIONS.push_back(new Version(19, intArray(4, 6, 30, 58, 86),
324                                      new ECBlocks(28, new ECB(3, 113),
325                                                   new ECB(4, 114)),
326                                      new ECBlocks(26, new ECB(3, 44),
327                                                   new ECB(11, 45)),
328                                      new ECBlocks(26, new ECB(17, 21),
329                                                   new ECB(4, 22)),
330                                      new ECBlocks(26, new ECB(9, 13),
331                                                   new ECB(16, 14))));
332       VERSIONS.push_back(new Version(20, intArray(4, 6, 34, 62, 90),
333                                      new ECBlocks(28, new ECB(3, 107),
334                                                   new ECB(5, 108)),
335                                      new ECBlocks(26, new ECB(3, 41),
336                                                   new ECB(13, 42)),
337                                      new ECBlocks(30, new ECB(15, 24),
338                                                   new ECB(5, 25)),
339                                      new ECBlocks(28, new ECB(15, 15),
340                                                   new ECB(10, 16))));
341       VERSIONS.push_back(new Version(21, intArray(5, 6, 28, 50, 72, 94),
342                                      new ECBlocks(28, new ECB(4, 116),
343                                                   new ECB(4, 117)),
344                                      new ECBlocks(26, new ECB(17, 42)),
345                                      new ECBlocks(28, new ECB(17, 22),
346                                                   new ECB(6, 23)),
347                                      new ECBlocks(30, new ECB(19, 16),
348                                                   new ECB(6, 17))));
349       VERSIONS.push_back(new Version(22, intArray(5, 6, 26, 50, 74, 98),
350                                      new ECBlocks(28, new ECB(2, 111),
351                                                   new ECB(7, 112)),
352                                      new ECBlocks(28, new ECB(17, 46)),
353                                      new ECBlocks(30, new ECB(7, 24),
354                                                   new ECB(16, 25)),
355                                      new ECBlocks(24, new ECB(34, 13))));
356       VERSIONS.push_back(new Version(23, intArray(5, 6, 30, 54, 74, 102),
357                                      new ECBlocks(30, new ECB(4, 121),
358                                                   new ECB(5, 122)),
359                                      new ECBlocks(28, new ECB(4, 47),
360                                                   new ECB(14, 48)),
361                                      new ECBlocks(30, new ECB(11, 24),
362                                                   new ECB(14, 25)),
363                                      new ECBlocks(30, new ECB(16, 15),
364                                                   new ECB(14, 16))));
365       VERSIONS.push_back(new Version(24, intArray(5, 6, 28, 54, 80, 106),
366                                      new ECBlocks(30, new ECB(6, 117),
367                                                   new ECB(4, 118)),
368                                      new ECBlocks(28, new ECB(6, 45),
369                                                   new ECB(14, 46)),
370                                      new ECBlocks(30, new ECB(11, 24),
371                                                   new ECB(16, 25)),
372                                      new ECBlocks(30, new ECB(30, 16),
373                                                   new ECB(2, 17))));
374       VERSIONS.push_back(new Version(25, intArray(5, 6, 32, 58, 84, 110),
375                                      new ECBlocks(26, new ECB(8, 106),
376                                                   new ECB(4, 107)),
377                                      new ECBlocks(28, new ECB(8, 47),
378                                                   new ECB(13, 48)),
379                                      new ECBlocks(30, new ECB(7, 24),
380                                                   new ECB(22, 25)),
381                                      new ECBlocks(30, new ECB(22, 15),
382                                                   new ECB(13, 16))));
383       VERSIONS.push_back(new Version(26, intArray(5, 6, 30, 58, 86, 114),
384                                      new ECBlocks(28, new ECB(10, 114),
385                                                   new ECB(2, 115)),
386                                      new ECBlocks(28, new ECB(19, 46),
387                                                   new ECB(4, 47)),
388                                      new ECBlocks(28, new ECB(28, 22),
389                                                   new ECB(6, 23)),
390                                      new ECBlocks(30, new ECB(33, 16),
391                                                   new ECB(4, 17))));
392       VERSIONS.push_back(new Version(27, intArray(5, 6, 34, 62, 90, 118),
393                                      new ECBlocks(30, new ECB(8, 122),
394                                                   new ECB(4, 123)),
395                                      new ECBlocks(28, new ECB(22, 45),
396                                                   new ECB(3, 46)),
397                                      new ECBlocks(30, new ECB(8, 23),
398                                                   new ECB(26, 24)),
399                                      new ECBlocks(30, new ECB(12, 15),
400                                                   new ECB(28, 16))));
401       VERSIONS.push_back(new Version(28, intArray(6, 6, 26, 50, 74, 98, 122),
402                                      new ECBlocks(30, new ECB(3, 117),
403                                                   new ECB(10, 118)),
404                                      new ECBlocks(28, new ECB(3, 45),
405                                                   new ECB(23, 46)),
406                                      new ECBlocks(30, new ECB(4, 24),
407                                                   new ECB(31, 25)),
408                                      new ECBlocks(30, new ECB(11, 15),
409                                                   new ECB(31, 16))));
410       VERSIONS.push_back(new Version(29, intArray(6, 6, 30, 54, 78, 102, 126),
411                                      new ECBlocks(30, new ECB(7, 116),
412                                                   new ECB(7, 117)),
413                                      new ECBlocks(28, new ECB(21, 45),
414                                                   new ECB(7, 46)),
415                                      new ECBlocks(30, new ECB(1, 23),
416                                                   new ECB(37, 24)),
417                                      new ECBlocks(30, new ECB(19, 15),
418                                                   new ECB(26, 16))));
419       VERSIONS.push_back(new Version(30, intArray(6, 6, 26, 52, 78, 104, 130),
420                                      new ECBlocks(30, new ECB(5, 115),
421                                                   new ECB(10, 116)),
422                                      new ECBlocks(28, new ECB(19, 47),
423                                                   new ECB(10, 48)),
424                                      new ECBlocks(30, new ECB(15, 24),
425                                                   new ECB(25, 25)),
426                                      new ECBlocks(30, new ECB(23, 15),
427                                                   new ECB(25, 16))));
428       VERSIONS.push_back(new Version(31, intArray(6, 6, 30, 56, 82, 108, 134),
429                                      new ECBlocks(30, new ECB(13, 115),
430                                                   new ECB(3, 116)),
431                                      new ECBlocks(28, new ECB(2, 46),
432                                                   new ECB(29, 47)),
433                                      new ECBlocks(30, new ECB(42, 24),
434                                                   new ECB(1, 25)),
435                                      new ECBlocks(30, new ECB(23, 15),
436                                                   new ECB(28, 16))));
437       VERSIONS.push_back(new Version(32, intArray(6, 6, 34, 60, 86, 112, 138),
438                                      new ECBlocks(30, new ECB(17, 115)),
439                                      new ECBlocks(28, new ECB(10, 46),
440                                                   new ECB(23, 47)),
441                                      new ECBlocks(30, new ECB(10, 24),
442                                                   new ECB(35, 25)),
443                                      new ECBlocks(30, new ECB(19, 15),
444                                                   new ECB(35, 16))));
445       VERSIONS.push_back(new Version(33, intArray(6, 6, 30, 58, 86, 114, 142),
446                                      new ECBlocks(30, new ECB(17, 115),
447                                                   new ECB(1, 116)),
448                                      new ECBlocks(28, new ECB(14, 46),
449                                                   new ECB(21, 47)),
450                                      new ECBlocks(30, new ECB(29, 24),
451                                                   new ECB(19, 25)),
452                                      new ECBlocks(30, new ECB(11, 15),
453                                                   new ECB(46, 16))));
454       VERSIONS.push_back(new Version(34, intArray(6, 6, 34, 62, 90, 118, 146),
455                                      new ECBlocks(30, new ECB(13, 115),
456                                                   new ECB(6, 116)),
457                                      new ECBlocks(28, new ECB(14, 46),
458                                                   new ECB(23, 47)),
459                                      new ECBlocks(30, new ECB(44, 24),
460                                                   new ECB(7, 25)),
461                                      new ECBlocks(30, new ECB(59, 16),
462                                                   new ECB(1, 17))));
463       VERSIONS.push_back(new Version(35, intArray(7, 6, 30, 54, 78, 
464                                                   102, 126, 150),
465                                      new ECBlocks(30, new ECB(12, 121),
466                                                   new ECB(7, 122)),
467                                      new ECBlocks(28, new ECB(12, 47),
468                                                   new ECB(26, 48)),
469                                      new ECBlocks(30, new ECB(39, 24),
470                                                   new ECB(14, 25)),
471                                      new ECBlocks(30, new ECB(22, 15),
472                                                   new ECB(41, 16))));
473       VERSIONS.push_back(new Version(36, intArray(7, 6, 24, 50, 76,
474                                                   102, 128, 154),
475                                      new ECBlocks(30, new ECB(6, 121),
476                                                   new ECB(14, 122)),
477                                      new ECBlocks(28, new ECB(6, 47),
478                                                   new ECB(34, 48)),
479                                      new ECBlocks(30, new ECB(46, 24),
480                                                   new ECB(10, 25)),
481                                      new ECBlocks(30, new ECB(2, 15),
482                                                   new ECB(64, 16))));
483       VERSIONS.push_back(new Version(37, intArray(7, 6, 28, 54, 80, 
484                                                   106, 132, 158),
485                                      new ECBlocks(30, new ECB(17, 122),
486                                                   new ECB(4, 123)),
487                                      new ECBlocks(28, new ECB(29, 46),
488                                                   new ECB(14, 47)),
489                                      new ECBlocks(30, new ECB(49, 24),
490                                                   new ECB(10, 25)),
491                                      new ECBlocks(30, new ECB(24, 15),
492                                                   new ECB(46, 16))));
493       VERSIONS.push_back(new Version(38, intArray(7, 6, 32, 58, 84, 
494                                                   110, 136, 162),
495                                      new ECBlocks(30, new ECB(4, 122),
496                                                   new ECB(18, 123)),
497                                      new ECBlocks(28, new ECB(13, 46),
498                                                   new ECB(32, 47)),
499                                      new ECBlocks(30, new ECB(48, 24),
500                                                   new ECB(14, 25)),
501                                      new ECBlocks(30, new ECB(42, 15),
502                                                   new ECB(32, 16))));
503       VERSIONS.push_back(new Version(39, intArray(7, 6, 26, 54, 82, 
504                                                   110, 138, 166),
505                                      new ECBlocks(30, new ECB(20, 117),
506                                                   new ECB(4, 118)),
507                                      new ECBlocks(28, new ECB(40, 47),
508                                                   new ECB(7, 48)),
509                                      new ECBlocks(30, new ECB(43, 24),
510                                                   new ECB(22, 25)),
511                                      new ECBlocks(30, new ECB(10, 15),
512                                                   new ECB(67, 16))));
513       VERSIONS.push_back(new Version(40, intArray(7, 6, 30, 58, 86, 
514                                                   114, 142, 170),
515                                      new ECBlocks(30, new ECB(19, 118),
516                                                   new ECB(6, 119)),
517                                      new ECBlocks(28, new ECB(18, 47),
518                                                   new ECB(31, 48)),
519                                      new ECBlocks(30, new ECB(34, 24),
520                                                   new ECB(34, 25)),
521                                      new ECBlocks(30, new ECB(20, 15),
522                                                   new ECB(61, 16))));
523       return VERSIONS.size();
524     }
525   }  
526 }