From 6c8f6ac515a2218552820cd169147f341a2716d8 Mon Sep 17 00:00:00 2001 From: Arne H Juul Date: Thu, 4 May 2017 09:45:41 +0200 Subject: reindent --- fastlib/src/vespa/fastlib/io/bufferedfile.cpp | 6 +- fastlib/src/vespa/fastlib/io/bufferedfile.h | 1 - .../src/vespa/fastlib/io/bufferedinputstream.cpp | 362 +-- fastlib/src/vespa/fastlib/io/bufferedinputstream.h | 8 +- .../src/vespa/fastlib/io/bufferedoutputstream.cpp | 208 +- .../src/vespa/fastlib/io/bufferedoutputstream.h | 6 +- fastlib/src/vespa/fastlib/io/fileinputstream.cpp | 4 +- fastlib/src/vespa/fastlib/io/fileinputstream.h | 11 +- fastlib/src/vespa/fastlib/io/fileoutputstream.h | 14 +- fastlib/src/vespa/fastlib/io/filterinputstream.h | 8 +- fastlib/src/vespa/fastlib/io/filteroutputstream.h | 8 +- fastlib/src/vespa/fastlib/io/inputstream.h | 4 +- fastlib/src/vespa/fastlib/io/outputstream.h | 5 +- .../vespa/fastlib/io/tests/bufferedfiletest.cpp | 160 +- .../vespa/fastlib/io/tests/bufferedstreamtest.cpp | 332 +- .../vespa/fastlib/net/httpchunkedinputstream.cpp | 270 +- .../src/vespa/fastlib/net/httpchunkedinputstream.h | 9 +- .../vespa/fastlib/net/httpchunkedoutputstream.cpp | 184 +- .../vespa/fastlib/net/httpchunkedoutputstream.h | 9 +- fastlib/src/vespa/fastlib/net/httpheaderparser.cpp | 230 +- fastlib/src/vespa/fastlib/net/httpheaderparser.h | 4 +- fastlib/src/vespa/fastlib/net/httpserver.cpp | 1546 ++++----- fastlib/src/vespa/fastlib/net/httpserver.h | 61 +- fastlib/src/vespa/fastlib/net/socket.cpp | 56 +- fastlib/src/vespa/fastlib/net/socket.h | 20 +- .../fastlib/net/tests/httpheaderparsertest.cpp | 69 +- fastlib/src/vespa/fastlib/net/url.cpp | 58 +- fastlib/src/vespa/fastlib/net/url.h | 6 +- fastlib/src/vespa/fastlib/testsuite/suite.h | 225 +- fastlib/src/vespa/fastlib/testsuite/test.cpp | 129 +- fastlib/src/vespa/fastlib/testsuite/test.h | 102 +- fastlib/src/vespa/fastlib/text/apps/extcase.cpp | 268 +- .../fastlib/text/apps/unicode_propertydump.cpp | 10 +- .../fastlib/text/apps/unicode_tolowerdump.cpp | 10 +- fastlib/src/vespa/fastlib/text/latintokenizer.h | 269 +- fastlib/src/vespa/fastlib/text/normwordfolder.cpp | 2102 ++++++------- fastlib/src/vespa/fastlib/text/normwordfolder.h | 287 +- .../fastlib/text/tests/characterclasstest.cpp | 9 +- .../fastlib/text/tests/latintokenizertest.cpp | 8 +- .../vespa/fastlib/text/tests/latintokenizertest.h | 566 ++-- .../vespa/fastlib/text/tests/unicodeutiltest.cpp | 9 +- .../src/vespa/fastlib/text/tests/unicodeutiltest.h | 58 +- .../vespa/fastlib/text/tests/wordfolderstest.cpp | 9 +- .../src/vespa/fastlib/text/tests/wordfolderstest.h | 200 +- .../vespa/fastlib/text/unicodeutil-charprops.cpp | 3328 ++++++++++---------- .../vespa/fastlib/text/unicodeutil-lowercase.cpp | 1280 ++++---- fastlib/src/vespa/fastlib/text/unicodeutil.cpp | 385 ++- fastlib/src/vespa/fastlib/text/unicodeutil.h | 112 +- fastlib/src/vespa/fastlib/text/wordfolder.h | 15 +- fastlib/src/vespa/fastlib/util/bag.h | 771 +++-- fastlib/src/vespa/fastlib/util/base64.cpp | 260 +- fastlib/src/vespa/fastlib/util/base64.h | 71 +- fastlib/src/vespa/fastlib/util/tests/bagtest.cpp | 2 +- fastlib/src/vespa/fastlib/util/tests/bagtest.h | 688 ++-- .../src/vespa/fastlib/util/tests/base64test.cpp | 156 +- .../fastlib/util/tests/wildcard_match_test.cpp | 56 +- fastlib/src/vespa/fastlib/util/wildcard_match.h | 63 +- 57 files changed, 7527 insertions(+), 7580 deletions(-) (limited to 'fastlib') diff --git a/fastlib/src/vespa/fastlib/io/bufferedfile.cpp b/fastlib/src/vespa/fastlib/io/bufferedfile.cpp index 8d5aef0c097..ae498595e35 100644 --- a/fastlib/src/vespa/fastlib/io/bufferedfile.cpp +++ b/fastlib/src/vespa/fastlib/io/bufferedfile.cpp @@ -204,8 +204,8 @@ const char * Fast_BufferedFile::GetFileName(void) const { return (_file.get() == NULL) - ? "" - : _file->GetFileName(); + ? "" + : _file->GetFileName(); } char * @@ -382,7 +382,7 @@ size_t computeBufLen(size_t buflen) buflen = 1 << (bitCount - 1); if (buflen & (MIN_ALIGNMENT-1)) { - buflen = std::max(MIN_ALIGNMENT, buflen & ~(MIN_ALIGNMENT-1)); + buflen = std::max(MIN_ALIGNMENT, buflen & ~(MIN_ALIGNMENT-1)); } return buflen; } diff --git a/fastlib/src/vespa/fastlib/io/bufferedfile.h b/fastlib/src/vespa/fastlib/io/bufferedfile.h index 377965dff0d..a25bd82d602 100644 --- a/fastlib/src/vespa/fastlib/io/bufferedfile.h +++ b/fastlib/src/vespa/fastlib/io/bufferedfile.h @@ -251,4 +251,3 @@ public: void alignEndForDirectIO(); }; - diff --git a/fastlib/src/vespa/fastlib/io/bufferedinputstream.cpp b/fastlib/src/vespa/fastlib/io/bufferedinputstream.cpp index 7b1da7b3293..26bab632aeb 100644 --- a/fastlib/src/vespa/fastlib/io/bufferedinputstream.cpp +++ b/fastlib/src/vespa/fastlib/io/bufferedinputstream.cpp @@ -3,243 +3,243 @@ #include "bufferedinputstream.h" Fast_BufferedInputStream::Fast_BufferedInputStream(Fast_InputStream &in, size_t bufferSize) - : Fast_FilterInputStream(in), - _buffer(new char[bufferSize]), - _bufferSize((_buffer != NULL) ? bufferSize : 0), - _bufferUsed(0), - _bufferRead(0), - _nextWillFail(false) + : Fast_FilterInputStream(in), + _buffer(new char[bufferSize]), + _bufferSize((_buffer != NULL) ? bufferSize : 0), + _bufferUsed(0), + _bufferRead(0), + _nextWillFail(false) { } Fast_BufferedInputStream::~Fast_BufferedInputStream() { - delete [] _buffer; + delete [] _buffer; } ssize_t Fast_BufferedInputStream::Available() { - return _in->Available() + _bufferUsed - _bufferRead; + return _in->Available() + _bufferUsed - _bufferRead; } bool Fast_BufferedInputStream::Close() { - return _in->Close(); + return _in->Close(); } ssize_t Fast_BufferedInputStream::Skip(size_t skipNBytes) { - ssize_t numBytesSkipped = 0; - - if (_nextWillFail) { - _nextWillFail = false; - return -1; - } - - if (skipNBytes > _bufferUsed - _bufferRead) { - // First, skip all bytes in buffer - numBytesSkipped = _bufferUsed - _bufferRead; - _bufferUsed = _bufferRead = 0; - - // Skip rest of bytes in slave stream - ssize_t slaveSkipped = _in->Skip(skipNBytes - numBytesSkipped); - if (slaveSkipped < 0) { - if (numBytesSkipped > 0) { - _nextWillFail = true; - } else { - numBytesSkipped = slaveSkipped; - } - } else { - numBytesSkipped += slaveSkipped; + ssize_t numBytesSkipped = 0; + + if (_nextWillFail) { + _nextWillFail = false; + return -1; } - } else { - // Skip all skipNBytes in buffer - _bufferRead += skipNBytes; - if (_bufferRead == _bufferUsed) { - _bufferUsed = _bufferRead = 0; + if (skipNBytes > _bufferUsed - _bufferRead) { + // First, skip all bytes in buffer + numBytesSkipped = _bufferUsed - _bufferRead; + _bufferUsed = _bufferRead = 0; + + // Skip rest of bytes in slave stream + ssize_t slaveSkipped = _in->Skip(skipNBytes - numBytesSkipped); + if (slaveSkipped < 0) { + if (numBytesSkipped > 0) { + _nextWillFail = true; + } else { + numBytesSkipped = slaveSkipped; + } + } else { + numBytesSkipped += slaveSkipped; + } + + } else { + // Skip all skipNBytes in buffer + _bufferRead += skipNBytes; + if (_bufferRead == _bufferUsed) { + _bufferUsed = _bufferRead = 0; + } + numBytesSkipped = skipNBytes; } - numBytesSkipped = skipNBytes; - } - return numBytesSkipped; + return numBytesSkipped; } ssize_t Fast_BufferedInputStream::Read(void *targetBuffer, size_t length) { - // This function will under no circumstance read more than once from - // its slave stream, in order to prevent blocking on input. - - if (_nextWillFail) { - _nextWillFail = false; - return -1; - } - - ssize_t numBytesRead = 0; - char* to = static_cast(targetBuffer); - size_t bufferRemain = _bufferUsed - _bufferRead; + // This function will under no circumstance read more than once from + // its slave stream, in order to prevent blocking on input. - if (length <= bufferRemain) { - memcpy(to, &_buffer[_bufferRead], length); - numBytesRead += length; - _bufferRead += length; - if (_bufferRead == _bufferUsed) { - _bufferRead = _bufferUsed = 0; + if (_nextWillFail) { + _nextWillFail = false; + return -1; } - } else { - // Use the data currently in the buffer, then read from slave stream. - if (bufferRemain > 0) { - memcpy(to, &_buffer[_bufferRead], bufferRemain); - numBytesRead += bufferRemain; - length -= bufferRemain; - to += bufferRemain; - } - _bufferUsed = 0; - _bufferRead = 0; - ssize_t slaveRead; - - // If remaining data to be read can fit in the buffer, put it - // there, otherwise read directly to receiver and empty the buffer. - if (length < _bufferSize) { - slaveRead = Fast_FilterInputStream::Read(_buffer, _bufferSize); + ssize_t numBytesRead = 0; + char* to = static_cast(targetBuffer); + size_t bufferRemain = _bufferUsed - _bufferRead; + + if (length <= bufferRemain) { + memcpy(to, &_buffer[_bufferRead], length); + numBytesRead += length; + _bufferRead += length; + if (_bufferRead == _bufferUsed) { + _bufferRead = _bufferUsed = 0; + } } else { - slaveRead = Fast_FilterInputStream::Read(to, length); - } + // Use the data currently in the buffer, then read from slave stream. - if (slaveRead > 0) { - if (length < _bufferSize) { - // We read to buffer, so copy from buffer to receiver. - if (length < static_cast(slaveRead)) { - memcpy(to, _buffer, length); - numBytesRead += length; - _bufferUsed = slaveRead; - _bufferRead = length; + if (bufferRemain > 0) { + memcpy(to, &_buffer[_bufferRead], bufferRemain); + numBytesRead += bufferRemain; + length -= bufferRemain; + to += bufferRemain; + } + _bufferUsed = 0; + _bufferRead = 0; + ssize_t slaveRead; + + // If remaining data to be read can fit in the buffer, put it + // there, otherwise read directly to receiver and empty the buffer. + if (length < _bufferSize) { + slaveRead = Fast_FilterInputStream::Read(_buffer, _bufferSize); } else { - memcpy(to, _buffer, slaveRead); - numBytesRead += slaveRead; + slaveRead = Fast_FilterInputStream::Read(to, length); } - } else { - // We read directly to receiver, no need to copy. - numBytesRead += slaveRead; - } - } else if (slaveRead == 0) { - // Do nothing - } else { - // slaveRead < 0, so an error occurred while reading from the - // slave. If there was data in the buffer, report success and - // fail on next operation instead. - if (numBytesRead > 0) { - _nextWillFail = true; - } else { - numBytesRead = slaveRead; - } - } - } // End of slave read + if (slaveRead > 0) { + if (length < _bufferSize) { + // We read to buffer, so copy from buffer to receiver. + if (length < static_cast(slaveRead)) { + memcpy(to, _buffer, length); + numBytesRead += length; + _bufferUsed = slaveRead; + _bufferRead = length; + } else { + memcpy(to, _buffer, slaveRead); + numBytesRead += slaveRead; + } + } else { + // We read directly to receiver, no need to copy. + numBytesRead += slaveRead; + } + } else if (slaveRead == 0) { + // Do nothing + } else { + // slaveRead < 0, so an error occurred while reading from the + // slave. If there was data in the buffer, report success and + // fail on next operation instead. + if (numBytesRead > 0) { + _nextWillFail = true; + } else { + numBytesRead = slaveRead; + } + } - return numBytesRead; + } // End of slave read + + return numBytesRead; } ssize_t Fast_BufferedInputStream::ReadBufferFullUntil(void *targetBuffer, size_t maxlength, char stopChar) { - if (maxlength > _bufferSize) - maxlength = _bufferSize; - - // This function will under no circumstance read more than once from - // its slave stream, in order to prevent blocking on input. + if (maxlength > _bufferSize) + maxlength = _bufferSize; - if (_nextWillFail) { - _nextWillFail = false; - return -1; - } + // This function will under no circumstance read more than once from + // its slave stream, in order to prevent blocking on input. - uint32_t offset = 0; - ssize_t numBytesRead = 0; - char* to = static_cast(targetBuffer); - size_t bufferRemain = _bufferUsed - _bufferRead; - - // Check if we should scan for stopChar in buffer - if (bufferRemain > 0) { - for (offset = _bufferRead; offset < _bufferUsed; offset++) { - if(_buffer[offset] == stopChar) { - break; - } - } - // Found character in buffer - if (offset < _bufferUsed) { - maxlength = offset - _bufferRead + 1; + if (_nextWillFail) { + _nextWillFail = false; + return -1; } - } - - if (maxlength <= bufferRemain) { - memcpy(to, &_buffer[_bufferRead], maxlength); - numBytesRead += maxlength; - _bufferRead += maxlength; - if (_bufferRead == _bufferUsed) { - _bufferRead = _bufferUsed = 0; - } - } else { - // Use the data currently in the buffer, then read from slave stream. + uint32_t offset = 0; + ssize_t numBytesRead = 0; + char* to = static_cast(targetBuffer); + size_t bufferRemain = _bufferUsed - _bufferRead; + + // Check if we should scan for stopChar in buffer if (bufferRemain > 0) { - memcpy(to, &_buffer[_bufferRead], bufferRemain); - numBytesRead += bufferRemain; - maxlength -= bufferRemain; - to += bufferRemain; + for (offset = _bufferRead; offset < _bufferUsed; offset++) { + if(_buffer[offset] == stopChar) { + break; + } + } + // Found character in buffer + if (offset < _bufferUsed) { + maxlength = offset - _bufferRead + 1; + } } - _bufferUsed = 0; - _bufferRead = 0; - ssize_t slaveRead; - - slaveRead = Fast_FilterInputStream::Read(_buffer, _bufferSize); - if (slaveRead > 0) { - for (offset = 0; offset < static_cast(slaveRead); offset++) { - if(_buffer[offset] == stopChar) { - break; + + if (maxlength <= bufferRemain) { + memcpy(to, &_buffer[_bufferRead], maxlength); + numBytesRead += maxlength; + _bufferRead += maxlength; + if (_bufferRead == _bufferUsed) { + _bufferRead = _bufferUsed = 0; } - } + } else { + // Use the data currently in the buffer, then read from slave stream. - if (offset >= maxlength) { - // Discard data if character was not present - numBytesRead = -1; - } else { - // Found character in buffer - if (offset < static_cast(slaveRead)) { - maxlength = offset + 1; + if (bufferRemain > 0) { + memcpy(to, &_buffer[_bufferRead], bufferRemain); + numBytesRead += bufferRemain; + maxlength -= bufferRemain; + to += bufferRemain; } - // We read to buffer, so copy from buffer to receiver. - if (maxlength < static_cast(slaveRead)) { - memcpy(to, _buffer, maxlength); - numBytesRead += maxlength; - _bufferUsed = slaveRead; - _bufferRead = maxlength; + _bufferUsed = 0; + _bufferRead = 0; + ssize_t slaveRead; + + slaveRead = Fast_FilterInputStream::Read(_buffer, _bufferSize); + if (slaveRead > 0) { + for (offset = 0; offset < static_cast(slaveRead); offset++) { + if(_buffer[offset] == stopChar) { + break; + } + } + + if (offset >= maxlength) { + // Discard data if character was not present + numBytesRead = -1; + } else { + // Found character in buffer + if (offset < static_cast(slaveRead)) { + maxlength = offset + 1; + } + // We read to buffer, so copy from buffer to receiver. + if (maxlength < static_cast(slaveRead)) { + memcpy(to, _buffer, maxlength); + numBytesRead += maxlength; + _bufferUsed = slaveRead; + _bufferRead = maxlength; + } else { + memcpy(to, _buffer, slaveRead); + numBytesRead += slaveRead; + } + } + } else if (slaveRead == 0) { + // Do nothing } else { - memcpy(to, _buffer, slaveRead); - numBytesRead += slaveRead; + // slaveRead < 0, so an error occurred while reading from the + // slave. If there was data in the buffer, report success and + // fail on next operation instead. + if (numBytesRead > 0) { + _nextWillFail = true; + } else { + numBytesRead = slaveRead; + } } - } - } else if (slaveRead == 0) { - // Do nothing - } else { - // slaveRead < 0, so an error occurred while reading from the - // slave. If there was data in the buffer, report success and - // fail on next operation instead. - if (numBytesRead > 0) { - _nextWillFail = true; - } else { - numBytesRead = slaveRead; - } - } - } // End of slave read + } // End of slave read - return numBytesRead; + return numBytesRead; } diff --git a/fastlib/src/vespa/fastlib/io/bufferedinputstream.h b/fastlib/src/vespa/fastlib/io/bufferedinputstream.h index b102bd98abc..8d98abfff33 100644 --- a/fastlib/src/vespa/fastlib/io/bufferedinputstream.h +++ b/fastlib/src/vespa/fastlib/io/bufferedinputstream.h @@ -5,7 +5,7 @@ class Fast_BufferedInputStream : public Fast_FilterInputStream { - protected: +protected: // Buffer attributes char *_buffer; const size_t _bufferSize; @@ -14,7 +14,7 @@ class Fast_BufferedInputStream : public Fast_FilterInputStream bool _nextWillFail; - public: +public: Fast_BufferedInputStream(const Fast_BufferedInputStream &) = delete; Fast_BufferedInputStream & operator = (const Fast_BufferedInputStream &) = delete; @@ -33,7 +33,3 @@ class Fast_BufferedInputStream : public Fast_FilterInputStream // Additional methods ssize_t ReadBufferFullUntil(void *targetBuffer, size_t maxlength, char stopChar); }; - - - - diff --git a/fastlib/src/vespa/fastlib/io/bufferedoutputstream.cpp b/fastlib/src/vespa/fastlib/io/bufferedoutputstream.cpp index b98d8111cfe..7025c85514e 100644 --- a/fastlib/src/vespa/fastlib/io/bufferedoutputstream.cpp +++ b/fastlib/src/vespa/fastlib/io/bufferedoutputstream.cpp @@ -22,12 +22,12 @@ Fast_BufferedOutputStream::Fast_BufferedOutputStream(Fast_OutputStream &out, size_t bufferSize) - : Fast_FilterOutputStream(out), - _buffer(new char[bufferSize]), - _bufferSize((_buffer != NULL) ? bufferSize : 0), - _bufferUsed(0), - _bufferWritten(0), - _nextWillFail(false) + : Fast_FilterOutputStream(out), + _buffer(new char[bufferSize]), + _bufferSize((_buffer != NULL) ? bufferSize : 0), + _bufferUsed(0), + _bufferWritten(0), + _nextWillFail(false) { } @@ -35,43 +35,43 @@ Fast_BufferedOutputStream::Fast_BufferedOutputStream(Fast_OutputStream &out, Fast_BufferedOutputStream::~Fast_BufferedOutputStream(void) { - delete [] _buffer; + delete [] _buffer; }; bool Fast_BufferedOutputStream::Close(void) { - Flush(); - return Fast_FilterOutputStream::Close(); + Flush(); + return Fast_FilterOutputStream::Close(); } void Fast_BufferedOutputStream::Flush(void) { - if (_nextWillFail) - { - _nextWillFail = false; - return; - } - while (_bufferWritten < _bufferUsed) - { - ssize_t slaveWritten; - slaveWritten = Fast_FilterOutputStream::Write(&_buffer[_bufferWritten], _bufferUsed - _bufferWritten); - if (slaveWritten >= 0) + if (_nextWillFail) { - _bufferWritten += slaveWritten; + _nextWillFail = false; + return; } - else + while (_bufferWritten < _bufferUsed) { - break; + ssize_t slaveWritten; + slaveWritten = Fast_FilterOutputStream::Write(&_buffer[_bufferWritten], _bufferUsed - _bufferWritten); + if (slaveWritten >= 0) + { + _bufferWritten += slaveWritten; + } + else + { + break; + } } - } - _bufferUsed = 0; - _bufferWritten = 0; + _bufferUsed = 0; + _bufferWritten = 0; - Fast_FilterOutputStream::Flush(); + Fast_FilterOutputStream::Flush(); } @@ -79,91 +79,91 @@ void Fast_BufferedOutputStream::Flush(void) ssize_t Fast_BufferedOutputStream::Write(const void *sourceBuffer, size_t length) { - // This function will under no circumstance write more than once to - // its slave stream, in order to prevent blocking on output. - - if (_nextWillFail) - { - _nextWillFail = false; - return -1; - } - ssize_t numBytesWritten = 0; - const char* from = static_cast(sourceBuffer); - size_t bufferRemain = _bufferUsed - _bufferWritten; - - if (length <= _bufferSize - _bufferUsed) - { - memcpy(&_buffer[_bufferUsed], from, length); - numBytesWritten += length; - _bufferUsed += length; - } - else if (length <= _bufferSize - bufferRemain) - { - memmove(_buffer, &_buffer[_bufferWritten], bufferRemain); - memcpy(&_buffer[bufferRemain], from, length); - _bufferUsed = bufferRemain + length; - _bufferWritten = 0; - } - else - { - ssize_t slaveWritten; - bool writeFromBuffer = bufferRemain > 0; + // This function will under no circumstance write more than once to + // its slave stream, in order to prevent blocking on output. - if (writeFromBuffer) + if (_nextWillFail) { - // Fill up buffer before write. - memcpy(&_buffer[_bufferUsed], from, _bufferSize - _bufferUsed); - from += _bufferSize - _bufferUsed; - length -= _bufferSize - _bufferUsed; - numBytesWritten += _bufferSize - _bufferUsed; - - slaveWritten = Fast_FilterOutputStream::Write(_buffer, _bufferSize); + _nextWillFail = false; + return -1; } - else + ssize_t numBytesWritten = 0; + const char* from = static_cast(sourceBuffer); + size_t bufferRemain = _bufferUsed - _bufferWritten; + + if (length <= _bufferSize - _bufferUsed) { - slaveWritten = Fast_FilterOutputStream::Write(from, length); + memcpy(&_buffer[_bufferUsed], from, length); + numBytesWritten += length; + _bufferUsed += length; } - - if (slaveWritten >= 0) + else if (length <= _bufferSize - bufferRemain) { - if (writeFromBuffer) - { - // We wrote from buffer, so shuffle remainder of buffer before - // filling it up. - memmove(_buffer, &_buffer[slaveWritten], _bufferSize - slaveWritten); - _bufferUsed = _bufferSize - slaveWritten; - } - else - { - // Buffer was empty, all data written from sender. - numBytesWritten += slaveWritten; - from += slaveWritten; - length -= slaveWritten; - _bufferUsed = 0; - } - size_t freeBuffer = _bufferSize - _bufferUsed; - size_t refill = (length < freeBuffer) ? length : freeBuffer; - memcpy(&_buffer[_bufferUsed], from, refill); - numBytesWritten += refill; - _bufferUsed += refill; - _bufferWritten = 0; + memmove(_buffer, &_buffer[_bufferWritten], bufferRemain); + memcpy(&_buffer[bufferRemain], from, length); + _bufferUsed = bufferRemain + length; + _bufferWritten = 0; } else { - // slaveWritten < 0, so an error occurred while writing to the - // slave. If there was data in the buffer, report success and - // fail on next operation instead. - if (numBytesWritten > 0) - { - _nextWillFail = true; - } - else - { - numBytesWritten = slaveWritten; - } - } - - } // End of slave write - - return numBytesWritten; + ssize_t slaveWritten; + bool writeFromBuffer = bufferRemain > 0; + + if (writeFromBuffer) + { + // Fill up buffer before write. + memcpy(&_buffer[_bufferUsed], from, _bufferSize - _bufferUsed); + from += _bufferSize - _bufferUsed; + length -= _bufferSize - _bufferUsed; + numBytesWritten += _bufferSize - _bufferUsed; + + slaveWritten = Fast_FilterOutputStream::Write(_buffer, _bufferSize); + } + else + { + slaveWritten = Fast_FilterOutputStream::Write(from, length); + } + + if (slaveWritten >= 0) + { + if (writeFromBuffer) + { + // We wrote from buffer, so shuffle remainder of buffer before + // filling it up. + memmove(_buffer, &_buffer[slaveWritten], _bufferSize - slaveWritten); + _bufferUsed = _bufferSize - slaveWritten; + } + else + { + // Buffer was empty, all data written from sender. + numBytesWritten += slaveWritten; + from += slaveWritten; + length -= slaveWritten; + _bufferUsed = 0; + } + size_t freeBuffer = _bufferSize - _bufferUsed; + size_t refill = (length < freeBuffer) ? length : freeBuffer; + memcpy(&_buffer[_bufferUsed], from, refill); + numBytesWritten += refill; + _bufferUsed += refill; + _bufferWritten = 0; + } + else + { + // slaveWritten < 0, so an error occurred while writing to the + // slave. If there was data in the buffer, report success and + // fail on next operation instead. + if (numBytesWritten > 0) + { + _nextWillFail = true; + } + else + { + numBytesWritten = slaveWritten; + } + } + + } // End of slave write + + return numBytesWritten; } diff --git a/fastlib/src/vespa/fastlib/io/bufferedoutputstream.h b/fastlib/src/vespa/fastlib/io/bufferedoutputstream.h index 789f7074f51..aabc787543e 100644 --- a/fastlib/src/vespa/fastlib/io/bufferedoutputstream.h +++ b/fastlib/src/vespa/fastlib/io/bufferedoutputstream.h @@ -6,14 +6,14 @@ class Fast_BufferedOutputStream : public Fast_FilterOutputStream { - private: +private: // Prevent use of: Fast_BufferedOutputStream(const Fast_BufferedOutputStream &); Fast_BufferedOutputStream & operator=(const Fast_BufferedOutputStream &); - protected: +protected: // Buffer attributes char *_buffer; @@ -23,7 +23,7 @@ class Fast_BufferedOutputStream : public Fast_FilterOutputStream bool _nextWillFail; - public: +public: // Constructor Fast_BufferedOutputStream(Fast_OutputStream &out, size_t bufferSize = 1024); diff --git a/fastlib/src/vespa/fastlib/io/fileinputstream.cpp b/fastlib/src/vespa/fastlib/io/fileinputstream.cpp index c1da475c5d2..b1002595aea 100644 --- a/fastlib/src/vespa/fastlib/io/fileinputstream.cpp +++ b/fastlib/src/vespa/fastlib/io/fileinputstream.cpp @@ -20,8 +20,8 @@ Fast_FileInputStream::Fast_FileInputStream(const char *fileName) - : _theFile(new FastOS_File(fileName)), - _fileOpenedOk(false) + : _theFile(new FastOS_File(fileName)), + _fileOpenedOk(false) { _fileOpenedOk = _theFile->OpenReadOnly(); } diff --git a/fastlib/src/vespa/fastlib/io/fileinputstream.h b/fastlib/src/vespa/fastlib/io/fileinputstream.h index 045fc61500f..58662ba75c7 100644 --- a/fastlib/src/vespa/fastlib/io/fileinputstream.h +++ b/fastlib/src/vespa/fastlib/io/fileinputstream.h @@ -8,10 +8,10 @@ class Fast_FileInputStream : public Fast_InputStream { private: - Fast_FileInputStream(const Fast_FileInputStream&); - Fast_FileInputStream& operator=(const Fast_FileInputStream&); + Fast_FileInputStream(const Fast_FileInputStream&); + Fast_FileInputStream& operator=(const Fast_FileInputStream&); - protected: +protected: /** Pointer to the physical file object*/ FastOS_FileInterface *_theFile; @@ -19,7 +19,7 @@ private: /** File opened ok flag */ bool _fileOpenedOk; - public: +public: Fast_FileInputStream(const char *fileName); ~Fast_FileInputStream(); @@ -30,6 +30,3 @@ private: ssize_t Available() override; ssize_t Skip(size_t) override; }; - - - diff --git a/fastlib/src/vespa/fastlib/io/fileoutputstream.h b/fastlib/src/vespa/fastlib/io/fileoutputstream.h index 8f9b2ebfb2b..eb97b3f8207 100644 --- a/fastlib/src/vespa/fastlib/io/fileoutputstream.h +++ b/fastlib/src/vespa/fastlib/io/fileoutputstream.h @@ -7,22 +7,22 @@ class Fast_FileOutputStream : public Fast_OutputStream { private: - Fast_FileOutputStream(const Fast_FileOutputStream&); - Fast_FileOutputStream& operator=(const Fast_FileOutputStream&); + Fast_FileOutputStream(const Fast_FileOutputStream&); + Fast_FileOutputStream& operator=(const Fast_FileOutputStream&); - protected: +protected: /** Pointer to the physical file object*/ FastOS_FileInterface *_theFile; - public: +public: Fast_FileOutputStream(const char *fileName); ~Fast_FileOutputStream(); ssize_t Write(const void *sourceBuffer, size_t bufferSize) override { - return _theFile->CheckedWrite(sourceBuffer, bufferSize) ? - static_cast(bufferSize) : - static_cast(-1); + return _theFile->CheckedWrite(sourceBuffer, bufferSize) ? + static_cast(bufferSize) : + static_cast(-1); }; bool Close() override { return _theFile->Close(); } diff --git a/fastlib/src/vespa/fastlib/io/filterinputstream.h b/fastlib/src/vespa/fastlib/io/filterinputstream.h index 116a16ff89d..0c4f5160529 100644 --- a/fastlib/src/vespa/fastlib/io/filterinputstream.h +++ b/fastlib/src/vespa/fastlib/io/filterinputstream.h @@ -20,7 +20,7 @@ class Fast_FilterInputStream : public Fast_InputStream { - private: +private: // Prevent use of: Fast_FilterInputStream(void); @@ -28,13 +28,13 @@ class Fast_FilterInputStream : public Fast_InputStream Fast_FilterInputStream &operator=(const Fast_FilterInputStream &); - protected: +protected: /** The stream to forward data to */ Fast_InputStream *_in; - public: +public: // Constructors Fast_FilterInputStream(Fast_InputStream &in) : _in(&in) {} @@ -46,6 +46,6 @@ class Fast_FilterInputStream : public Fast_InputStream ssize_t Skip(size_t skipNBytes) override { return _in->Skip(skipNBytes); } ssize_t Read(void *targetBuffer, size_t length) override { - return _in->Read(targetBuffer, length); + return _in->Read(targetBuffer, length); } }; diff --git a/fastlib/src/vespa/fastlib/io/filteroutputstream.h b/fastlib/src/vespa/fastlib/io/filteroutputstream.h index c3ec9d28399..8a778ddd38f 100644 --- a/fastlib/src/vespa/fastlib/io/filteroutputstream.h +++ b/fastlib/src/vespa/fastlib/io/filteroutputstream.h @@ -6,17 +6,17 @@ class Fast_FilterOutputStream : public Fast_OutputStream { - private: +private: // Prevent use of: Fast_FilterOutputStream(); Fast_FilterOutputStream(Fast_FilterOutputStream &); Fast_FilterOutputStream &operator=(const Fast_FilterOutputStream &); - protected: +protected: /** The stream to forward data to */ Fast_OutputStream *_out; - public: +public: Fast_FilterOutputStream(Fast_OutputStream &out) : _out(&out) {} ~Fast_FilterOutputStream() {} @@ -24,6 +24,6 @@ class Fast_FilterOutputStream : public Fast_OutputStream void Flush() override { _out->Flush(); } ssize_t Write(const void *sourceBuffer, size_t length) override { - return _out->Write(sourceBuffer, length); + return _out->Write(sourceBuffer, length); } }; diff --git a/fastlib/src/vespa/fastlib/io/inputstream.h b/fastlib/src/vespa/fastlib/io/inputstream.h index d7b443d28ee..61026172a95 100644 --- a/fastlib/src/vespa/fastlib/io/inputstream.h +++ b/fastlib/src/vespa/fastlib/io/inputstream.h @@ -5,7 +5,7 @@ class Fast_InputStream { - public: +public: virtual ~Fast_InputStream() { } virtual ssize_t Available() = 0; @@ -13,5 +13,3 @@ class Fast_InputStream virtual ssize_t Read(void *targetBuffer, size_t bufferSize) = 0; virtual ssize_t Skip(size_t skipNBytes) = 0; }; - - diff --git a/fastlib/src/vespa/fastlib/io/outputstream.h b/fastlib/src/vespa/fastlib/io/outputstream.h index 9e6f42fd4c5..8594c209cf7 100644 --- a/fastlib/src/vespa/fastlib/io/outputstream.h +++ b/fastlib/src/vespa/fastlib/io/outputstream.h @@ -21,7 +21,7 @@ class Fast_OutputStream { - public: +public: virtual ~Fast_OutputStream() { } @@ -29,6 +29,3 @@ class Fast_OutputStream virtual void Flush(void) = 0; virtual ssize_t Write(const void *sourceBuffer, size_t bufferSize) = 0; }; - - - diff --git a/fastlib/src/vespa/fastlib/io/tests/bufferedfiletest.cpp b/fastlib/src/vespa/fastlib/io/tests/bufferedfiletest.cpp index a9054cfb01b..81a31bd4b77 100644 --- a/fastlib/src/vespa/fastlib/io/tests/bufferedfiletest.cpp +++ b/fastlib/src/vespa/fastlib/io/tests/bufferedfiletest.cpp @@ -5,96 +5,96 @@ TEST("main") { - int i = 0; - int j = 0; - int value = 0; - FastOS_StatInfo statInfo; + int i = 0; + int j = 0; + int value = 0; + FastOS_StatInfo statInfo; - FastOS_File::Delete("testfile1"); - FastOS_File::Delete("testfile2"); - FastOS_File::Delete("testfile3"); - FastOS_File::Delete("testfile4"); - FastOS_File::Delete("testfile5"); + FastOS_File::Delete("testfile1"); + FastOS_File::Delete("testfile2"); + FastOS_File::Delete("testfile3"); + FastOS_File::Delete("testfile4"); + FastOS_File::Delete("testfile5"); - Fast_BufferedFile bufFile(4096); + Fast_BufferedFile bufFile(4096); - // test 1 - printf ("testing 11 byte long file\n"); - bufFile.WriteOpen("testfile1"); - bufFile.addNum(1,10,' '); - bufFile.CheckedWrite("\n",1); - bufFile.Close(); - FastOS_File::Stat("testfile1", &statInfo); - if (statInfo._size != 11) { - printf (" -- FAILURE\n\n"); - TEST_FATAL("exit 1"); - } - printf (" -- SUCCESS\n\n"); + // test 1 + printf ("testing 11 byte long file\n"); + bufFile.WriteOpen("testfile1"); + bufFile.addNum(1,10,' '); + bufFile.CheckedWrite("\n",1); + bufFile.Close(); + FastOS_File::Stat("testfile1", &statInfo); + if (statInfo._size != 11) { + printf (" -- FAILURE\n\n"); + TEST_FATAL("exit 1"); + } + printf (" -- SUCCESS\n\n"); - // test 2 - printf ("testing 4095 byte long file\n"); - bufFile.WriteOpen("testfile2"); - char buf[8192]; // allocate 8K buffer - memset(buf,0xff,8192); - bufFile.CheckedWrite(buf,4095); // write almost 4K - bufFile.Close(); - FastOS_File::Stat("testfile2", &statInfo); - if (statInfo._size != 4095) { - printf (" -- FAILURE\n\n"); - TEST_FATAL("exit 1"); - } - printf (" -- SUCCESS\n\n"); + // test 2 + printf ("testing 4095 byte long file\n"); + bufFile.WriteOpen("testfile2"); + char buf[8192]; // allocate 8K buffer + memset(buf,0xff,8192); + bufFile.CheckedWrite(buf,4095); // write almost 4K + bufFile.Close(); + FastOS_File::Stat("testfile2", &statInfo); + if (statInfo._size != 4095) { + printf (" -- FAILURE\n\n"); + TEST_FATAL("exit 1"); + } + printf (" -- SUCCESS\n\n"); - // test 3 - printf ("testing 4096 byte long file\n"); - bufFile.WriteOpen("testfile3"); - bufFile.CheckedWrite(buf,4096); // write exactly 4K - bufFile.Close(); - FastOS_File::Stat("testfile3", &statInfo); - if (statInfo._size != 4096) { - printf (" -- FAILURE\n\n"); - TEST_FATAL("exit 1"); - } - printf (" -- SUCCESS\n\n"); + // test 3 + printf ("testing 4096 byte long file\n"); + bufFile.WriteOpen("testfile3"); + bufFile.CheckedWrite(buf,4096); // write exactly 4K + bufFile.Close(); + FastOS_File::Stat("testfile3", &statInfo); + if (statInfo._size != 4096) { + printf (" -- FAILURE\n\n"); + TEST_FATAL("exit 1"); + } + printf (" -- SUCCESS\n\n"); - // test 4 - printf ("testing 4097 byte long file\n"); - bufFile.WriteOpen("testfile4"); - bufFile.CheckedWrite(buf,4097); // write a bit over 4K - bufFile.Close(); - FastOS_File::Stat("testfile4", &statInfo); - if (statInfo._size != 4097) { - printf (" -- FAILURE\n\n"); - TEST_FATAL("exit 1"); - } - printf (" -- SUCCESS\n\n"); + // test 4 + printf ("testing 4097 byte long file\n"); + bufFile.WriteOpen("testfile4"); + bufFile.CheckedWrite(buf,4097); // write a bit over 4K + bufFile.Close(); + FastOS_File::Stat("testfile4", &statInfo); + if (statInfo._size != 4097) { + printf (" -- FAILURE\n\n"); + TEST_FATAL("exit 1"); + } + printf (" -- SUCCESS\n\n"); - // test 5 - printf ("testing 610000 byte long file with repeated addNum\n"); - bufFile.WriteOpen("testfile5"); - for (i = 0; i < 10000; i++) { - for (j = 0; j < 10; j++) { - bufFile.addNum(value,6,' '); - value++; + // test 5 + printf ("testing 610000 byte long file with repeated addNum\n"); + bufFile.WriteOpen("testfile5"); + for (i = 0; i < 10000; i++) { + for (j = 0; j < 10; j++) { + bufFile.addNum(value,6,' '); + value++; + } + bufFile.CheckedWrite("\n",1); } - bufFile.CheckedWrite("\n",1); - } - bufFile.Close(); - FastOS_File::Stat("testfile5", &statInfo); - if (statInfo._size != 610000) { - printf (" -- FAILURE\n\n"); - TEST_FATAL("exit 1"); - } - printf (" -- SUCCESS\n\n"); + bufFile.Close(); + FastOS_File::Stat("testfile5", &statInfo); + if (statInfo._size != 610000) { + printf (" -- FAILURE\n\n"); + TEST_FATAL("exit 1"); + } + printf (" -- SUCCESS\n\n"); - FastOS_File::Delete("testfile1"); - FastOS_File::Delete("testfile2"); - FastOS_File::Delete("testfile3"); - FastOS_File::Delete("testfile4"); - FastOS_File::Delete("testfile5"); + FastOS_File::Delete("testfile1"); + FastOS_File::Delete("testfile2"); + FastOS_File::Delete("testfile3"); + FastOS_File::Delete("testfile4"); + FastOS_File::Delete("testfile5"); - printf ("All tests OK for bufferedfiletest\n"); - printf (" -- SUCCESS\n\n"); + printf ("All tests OK for bufferedfiletest\n"); + printf (" -- SUCCESS\n\n"); } TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/fastlib/src/vespa/fastlib/io/tests/bufferedstreamtest.cpp b/fastlib/src/vespa/fastlib/io/tests/bufferedstreamtest.cpp index 7ca6f8da8c2..b246d7afac6 100644 --- a/fastlib/src/vespa/fastlib/io/tests/bufferedstreamtest.cpp +++ b/fastlib/src/vespa/fastlib/io/tests/bufferedstreamtest.cpp @@ -14,204 +14,204 @@ using namespace std; static bool ReadFile(const char *tag, Fast_InputStream &input, char *buffer, int64_t fileSize, size_t chunkSize) { - char *pos; - clock_t start, ticks; - - cout << "Starting to read file (" << tag << ")..." << endl; - start = clock(); - - pos = buffer; - // Slurp file - ssize_t numRead; - while (pos - buffer < fileSize && - (numRead = input.Read(pos, chunkSize)) > 0) - pos += numRead; - if (pos - buffer != fileSize) - { - cerr << "Read " << pos - buffer << " bytes, " - << " expected " << static_cast(fileSize) << " bytes.\n"; - return false; - } - - ticks = clock() - start; - cout << "Done, used " << ticks << " ticks " - << "(" << static_cast(ticks) / CLOCKS_PER_SEC << " seconds)\n\n" - << ends; - - return true; + char *pos; + clock_t start, ticks; + + cout << "Starting to read file (" << tag << ")..." << endl; + start = clock(); + + pos = buffer; + // Slurp file + ssize_t numRead; + while (pos - buffer < fileSize && + (numRead = input.Read(pos, chunkSize)) > 0) + pos += numRead; + if (pos - buffer != fileSize) + { + cerr << "Read " << pos - buffer << " bytes, " + << " expected " << static_cast(fileSize) << " bytes.\n"; + return false; + } + + ticks = clock() - start; + cout << "Done, used " << ticks << " ticks " + << "(" << static_cast(ticks) / CLOCKS_PER_SEC << " seconds)\n\n" + << ends; + + return true; } static bool WriteAndReadBackFile(const char *tag, Fast_OutputStream &output, char *buffer, int64_t fileSize, const char *fileName, size_t chunkSize) { - char *pos; - clock_t start, ticks; - - cout << "Starting to write file (" << tag << ")..." << endl; - start = clock(); - - pos = buffer; - // Dump file - ssize_t numWritten; - size_t numToWrite = (fileSize < static_cast(chunkSize)) ? - static_cast(fileSize) : chunkSize; - while (pos - buffer < fileSize && - (numWritten = output.Write(pos, numToWrite)) > 0) - { - pos += numWritten; - if ((fileSize - (pos - buffer)) < static_cast(chunkSize)) { - numToWrite = (fileSize - (pos - buffer)); + char *pos; + clock_t start, ticks; + + cout << "Starting to write file (" << tag << ")..." << endl; + start = clock(); + + pos = buffer; + // Dump file + ssize_t numWritten; + size_t numToWrite = (fileSize < static_cast(chunkSize)) ? + static_cast(fileSize) : chunkSize; + while (pos - buffer < fileSize && + (numWritten = output.Write(pos, numToWrite)) > 0) + { + pos += numWritten; + if ((fileSize - (pos - buffer)) < static_cast(chunkSize)) { + numToWrite = (fileSize - (pos - buffer)); + } + else { + numToWrite = chunkSize; + } + } + output.Flush(); + + if (pos - buffer != fileSize) + { + cerr << "Wrote " << pos - buffer << " bytes, " \ + << " expected " << static_cast(fileSize) << " bytes.\n"; + return false; } - else { - numToWrite = chunkSize; + + ticks = clock() - start; + cout << "Done, used " << ticks << " ticks " + << "(" << static_cast(ticks) / CLOCKS_PER_SEC << " seconds)\n\n" + << ends; + + output.Close(); + + FastOS_File readBackFile; + readBackFile.OpenReadOnly(fileName); + if (readBackFile.Read(buffer, fileSize) != fileSize) + { + cerr << "Error reading data back from " << fileName << ".\n"; + return false; } - } - output.Flush(); - - if (pos - buffer != fileSize) - { - cerr << "Wrote " << pos - buffer << " bytes, " \ - << " expected " << static_cast(fileSize) << " bytes.\n"; - return false; - } - - ticks = clock() - start; - cout << "Done, used " << ticks << " ticks " - << "(" << static_cast(ticks) / CLOCKS_PER_SEC << " seconds)\n\n" - << ends; - - output.Close(); - - FastOS_File readBackFile; - readBackFile.OpenReadOnly(fileName); - if (readBackFile.Read(buffer, fileSize) != fileSize) - { - cerr << "Error reading data back from " << fileName << ".\n"; - return false; - } - - return true; + + return true; } int main(int argc, char **argv) { - if (argc < 2 || argc > 4) - { - cerr << "Usage: " << argv[0] << " [ []]\n"; - return 1; - } + if (argc < 2 || argc > 4) + { + cerr << "Usage: " << argv[0] << " [ []]\n"; + return 1; + } - const char *fileName = argv[1]; - unsigned long bufferSize = (argc >= 3) ? strtoul(argv[2], NULL, 10) : 1024; - unsigned long chunkSize = (argc >= 4) ? strtoul(argv[3], NULL, 10) : 1; + const char *fileName = argv[1]; + unsigned long bufferSize = (argc >= 3) ? strtoul(argv[2], NULL, 10) : 1024; + unsigned long chunkSize = (argc >= 4) ? strtoul(argv[3], NULL, 10) : 1; - FastOS_StatInfo statInfo; - if (!FastOS_File::Stat(fileName, &statInfo)) - { - cerr << "Failed to stat " << fileName << "\n"; - return 1; - } + FastOS_StatInfo statInfo; + if (!FastOS_File::Stat(fileName, &statInfo)) + { + cerr << "Failed to stat " << fileName << "\n"; + return 1; + } - int64_t fileSize = statInfo._size; + int64_t fileSize = statInfo._size; - char *unbufferedData = new char[fileSize]; - assert(unbufferedData != NULL); + char *unbufferedData = new char[fileSize]; + assert(unbufferedData != NULL); - char *bufferedData = new char[fileSize]; - assert(bufferedData != NULL); + char *bufferedData = new char[fileSize]; + assert(bufferedData != NULL); - ///////////////////////////////////////////////////////////////////// - // Start of input test + ///////////////////////////////////////////////////////////////////// + // Start of input test - Fast_FileInputStream unbufferedInputFile(fileName); - // run unneeded functions for coverage - unbufferedInputFile.Skip(unbufferedInputFile.Available()); + Fast_FileInputStream unbufferedInputFile(fileName); + // run unneeded functions for coverage + unbufferedInputFile.Skip(unbufferedInputFile.Available()); - if (!ReadFile("unbuffered", unbufferedInputFile, unbufferedData, fileSize, chunkSize)) - { - cerr << "Unbuffered read failed" << endl; - delete [] unbufferedData; - delete [] bufferedData; - return 1; - } + if (!ReadFile("unbuffered", unbufferedInputFile, unbufferedData, fileSize, chunkSize)) + { + cerr << "Unbuffered read failed" << endl; + delete [] unbufferedData; + delete [] bufferedData; + return 1; + } - Fast_FileInputStream slaveInputFile(fileName); - Fast_BufferedInputStream bufferedInputFile(slaveInputFile, bufferSize); + Fast_FileInputStream slaveInputFile(fileName); + Fast_BufferedInputStream bufferedInputFile(slaveInputFile, bufferSize); - if (!ReadFile("buffered", bufferedInputFile, bufferedData, fileSize, chunkSize)) - { - cerr << "Buffered read failed" << endl; - delete [] unbufferedData; - delete [] bufferedData; - return 1; - } - - if (memcmp(unbufferedData, bufferedData, fileSize) == 0) - { - cout << "Buffered and unbuffered data equal -- success!\n"; - } - else - { - cout << "Buffered and unbuffered data differs -- error!\n"; - cout << "Contents of unbuffered data:\n"; - cout.write(unbufferedData, fileSize); - cout << "Contents of buffered data:\n"; - cout.write(bufferedData, fileSize); + if (!ReadFile("buffered", bufferedInputFile, bufferedData, fileSize, chunkSize)) + { + cerr << "Buffered read failed" << endl; + delete [] unbufferedData; + delete [] bufferedData; + return 1; + } - delete [] unbufferedData; - delete [] bufferedData; - return 1; - } + if (memcmp(unbufferedData, bufferedData, fileSize) == 0) + { + cout << "Buffered and unbuffered data equal -- success!\n"; + } + else + { + cout << "Buffered and unbuffered data differs -- error!\n"; + cout << "Contents of unbuffered data:\n"; + cout.write(unbufferedData, fileSize); + cout << "Contents of buffered data:\n"; + cout.write(bufferedData, fileSize); + + delete [] unbufferedData; + delete [] bufferedData; + return 1; + } - ///////////////////////////////////////////////////////////////////// - // Start of output test + ///////////////////////////////////////////////////////////////////// + // Start of output test - const char *tempFile = "bufferedstreamtest.tmp"; + const char *tempFile = "bufferedstreamtest.tmp"; - Fast_FileOutputStream unbufferedOutputFile(tempFile); + Fast_FileOutputStream unbufferedOutputFile(tempFile); - if (!WriteAndReadBackFile("unbuffered", unbufferedOutputFile, - unbufferedData, fileSize, tempFile, chunkSize)) - { - cerr << "Unbuffered write and read back failed" << endl; + if (!WriteAndReadBackFile("unbuffered", unbufferedOutputFile, + unbufferedData, fileSize, tempFile, chunkSize)) + { + cerr << "Unbuffered write and read back failed" << endl; - delete [] unbufferedData; - delete [] bufferedData; - return 1; - } + delete [] unbufferedData; + delete [] bufferedData; + return 1; + } - Fast_FileOutputStream slaveOutputFile(tempFile); - Fast_BufferedOutputStream bufferedOutputFile(slaveOutputFile, bufferSize); + Fast_FileOutputStream slaveOutputFile(tempFile); + Fast_BufferedOutputStream bufferedOutputFile(slaveOutputFile, bufferSize); - if (!WriteAndReadBackFile("buffered", bufferedOutputFile, - bufferedData, fileSize, tempFile, chunkSize)) - { - cerr << "Buffered write and read back failed" << endl; + if (!WriteAndReadBackFile("buffered", bufferedOutputFile, + bufferedData, fileSize, tempFile, chunkSize)) + { + cerr << "Buffered write and read back failed" << endl; - delete [] unbufferedData; - delete [] bufferedData; - return 1; - } - - if (memcmp(unbufferedData, bufferedData, fileSize) == 0) - { - cout << "Buffered and unbuffered data equal -- success!\n"; - } - else - { - cout << "Buffered and unbuffered data differs -- error!\n"; - cout << "Contents of unbuffered data:\n"; - cout.write(unbufferedData, fileSize); - cout << "Contents of buffered data:\n"; - cout.write(bufferedData, fileSize); + delete [] unbufferedData; + delete [] bufferedData; + return 1; + } + + if (memcmp(unbufferedData, bufferedData, fileSize) == 0) + { + cout << "Buffered and unbuffered data equal -- success!\n"; + } + else + { + cout << "Buffered and unbuffered data differs -- error!\n"; + cout << "Contents of unbuffered data:\n"; + cout.write(unbufferedData, fileSize); + cout << "Contents of buffered data:\n"; + cout.write(bufferedData, fileSize); + + delete [] unbufferedData; + delete [] bufferedData; + return 1; + } delete [] unbufferedData; delete [] bufferedData; - return 1; - } - - delete [] unbufferedData; - delete [] bufferedData; - return 0; + return 0; } diff --git a/fastlib/src/vespa/fastlib/net/httpchunkedinputstream.cpp b/fastlib/src/vespa/fastlib/net/httpchunkedinputstream.cpp index a59ec16d386..7b521e17718 100644 --- a/fastlib/src/vespa/fastlib/net/httpchunkedinputstream.cpp +++ b/fastlib/src/vespa/fastlib/net/httpchunkedinputstream.cpp @@ -20,8 +20,8 @@ #include Fast_HTTPChunkedInputStream::Fast_HTTPChunkedInputStream(Fast_InputStream &in) - : Fast_FilterInputStream(in), _chunkSize(0), _inChunk(false), - _isClosed(false) + : Fast_FilterInputStream(in), _chunkSize(0), _inChunk(false), + _isClosed(false) { } @@ -37,78 +37,78 @@ Fast_HTTPChunkedInputStream::~Fast_HTTPChunkedInputStream(void) bool Fast_HTTPChunkedInputStream::ReadChunkHeader(void) { - char chunkHeader[100]; - char *pos = chunkHeader; + char chunkHeader[100]; + char *pos = chunkHeader; - // Read chunk size into chunkHeader. - for (;;) - { - if (Fast_FilterInputStream::Read(pos, 1) != 1) + // Read chunk size into chunkHeader. + for (;;) { - return false; - } - if (*pos == ';' || *pos == '\n') - { - break; - } - pos++; - if (static_cast(pos - chunkHeader) > sizeof(chunkHeader)) - { - return false; + if (Fast_FilterInputStream::Read(pos, 1) != 1) + { + return false; + } + if (*pos == ';' || *pos == '\n') + { + break; + } + pos++; + if (static_cast(pos - chunkHeader) > sizeof(chunkHeader)) + { + return false; + } } - } - _chunkSize = strtoul(chunkHeader, NULL, 16); + _chunkSize = strtoul(chunkHeader, NULL, 16); - // Finish reading eventual extensions. - char c = *pos; - while (c != '\n') - { - if (Fast_FilterInputStream::Read(&c, 1) != 1) + // Finish reading eventual extensions. + char c = *pos; + while (c != '\n') { - return false; - } - } - - // If this was the last chunk, read optional trailer and final CRLF. - if (_chunkSize == 0) - { - for (;;) { - if (Fast_FilterInputStream::Read(&c, 1) != 1) - { - return false; - } - if (c == '\r') - { if (Fast_FilterInputStream::Read(&c, 1) != 1) { - return false; + return false; } - } - if (c == '\n') - { - // Empty line, end of last chunk. - break; - } - - // In trailing header; read rest of line. - do - { - if (Fast_FilterInputStream::Read(&c, 1) != 1) - { - return false; + } + + // If this was the last chunk, read optional trailer and final CRLF. + if (_chunkSize == 0) + { + for (;;) { + if (Fast_FilterInputStream::Read(&c, 1) != 1) + { + return false; + } + if (c == '\r') + { + if (Fast_FilterInputStream::Read(&c, 1) != 1) + { + return false; + } + } + if (c == '\n') + { + // Empty line, end of last chunk. + break; + } + + // In trailing header; read rest of line. + do + { + if (Fast_FilterInputStream::Read(&c, 1) != 1) + { + return false; + } + } while (c != '\n'); } - } while (c != '\n'); + _inChunk = false; + _isClosed = true; + } + else + { + _inChunk = true; } - _inChunk = false; - _isClosed = true; - } - else - { - _inChunk = true; - } - return true; + return true; } @@ -116,21 +116,21 @@ bool Fast_HTTPChunkedInputStream::ReadChunkHeader(void) ssize_t Fast_HTTPChunkedInputStream::Available(void) { - if (_isClosed || !_inChunk) - { - return 0; - } - - ssize_t slaveAvailable = Fast_FilterInputStream::Available(); - if (slaveAvailable < 0) - { - return slaveAvailable; - } - else - { - return (static_cast(slaveAvailable) < _chunkSize) - ? slaveAvailable : _chunkSize; - } + if (_isClosed || !_inChunk) + { + return 0; + } + + ssize_t slaveAvailable = Fast_FilterInputStream::Available(); + if (slaveAvailable < 0) + { + return slaveAvailable; + } + else + { + return (static_cast(slaveAvailable) < _chunkSize) + ? slaveAvailable : _chunkSize; + } } @@ -138,8 +138,8 @@ ssize_t Fast_HTTPChunkedInputStream::Available(void) bool Fast_HTTPChunkedInputStream::Close(void) { - _isClosed = true; - return true; + _isClosed = true; + return true; } @@ -147,61 +147,61 @@ bool Fast_HTTPChunkedInputStream::Close(void) ssize_t Fast_HTTPChunkedInputStream::Read(void *targetBuffer, size_t length) { - if (_isClosed) - { - return 0; - } - - if (!_inChunk) - { - // Read new header chunk, check if end of chunked entity is reached. - if (!ReadChunkHeader()) + if (_isClosed) { - _isClosed = true; - return -1; + return 0; } - else if (_isClosed) + + if (!_inChunk) { - return 0; + // Read new header chunk, check if end of chunked entity is reached. + if (!ReadChunkHeader()) + { + _isClosed = true; + return -1; + } + else if (_isClosed) + { + return 0; + } } - } - - size_t blockLength = (length < _chunkSize) ? length : _chunkSize; - ssize_t numBytesRead = _in->Read(targetBuffer, blockLength); - if (numBytesRead > 0) - { - _chunkSize -= numBytesRead; - } - else - { - _isClosed = true; - _inChunk = false; - return (numBytesRead < 0) ? numBytesRead : -1; - } - if (_chunkSize == 0) - { - // End of chunk reached. Mark this, and read CRLF following - // chunk. - - _inChunk = false; - - bool ok; - char c; - ok = _in->Read(&c, 1) == 1; - if (ok && c == '\r') + size_t blockLength = (length < _chunkSize) ? length : _chunkSize; + ssize_t numBytesRead = _in->Read(targetBuffer, blockLength); + if (numBytesRead > 0) { - ok = _in->Read(&c, 1) == 1; + _chunkSize -= numBytesRead; } - ok = ok && c == '\n'; - if (!ok) + else { _isClosed = true; - return -1; + _inChunk = false; + return (numBytesRead < 0) ? numBytesRead : -1; + } + + if (_chunkSize == 0) + { + // End of chunk reached. Mark this, and read CRLF following + // chunk. + + _inChunk = false; + + bool ok; + char c; + ok = _in->Read(&c, 1) == 1; + if (ok && c == '\r') + { + ok = _in->Read(&c, 1) == 1; + } + ok = ok && c == '\n'; + if (!ok) + { + _isClosed = true; + return -1; + } } - } - return numBytesRead; + return numBytesRead; } @@ -209,16 +209,16 @@ ssize_t Fast_HTTPChunkedInputStream::Read(void *targetBuffer, size_t length) ssize_t Fast_HTTPChunkedInputStream::Skip(size_t skipNBytes) { - if (_isClosed) - { - return -1; - } - else if (!_inChunk) - { - return 0; - } - else - { - return _in->Skip((skipNBytes < _chunkSize) ? skipNBytes : _chunkSize); - } + if (_isClosed) + { + return -1; + } + else if (!_inChunk) + { + return 0; + } + else + { + return _in->Skip((skipNBytes < _chunkSize) ? skipNBytes : _chunkSize); + } } diff --git a/fastlib/src/vespa/fastlib/net/httpchunkedinputstream.h b/fastlib/src/vespa/fastlib/net/httpchunkedinputstream.h index 122d1bb1eca..5517e912637 100644 --- a/fastlib/src/vespa/fastlib/net/httpchunkedinputstream.h +++ b/fastlib/src/vespa/fastlib/net/httpchunkedinputstream.h @@ -6,17 +6,17 @@ class Fast_HTTPChunkedInputStream : public Fast_FilterInputStream { - private: +private: // Prevent use of: Fast_HTTPChunkedInputStream(const Fast_HTTPChunkedInputStream &); Fast_HTTPChunkedInputStream & operator=(const Fast_HTTPChunkedInputStream &); - protected: +protected: size_t _chunkSize; bool _inChunk; bool _isClosed; bool ReadChunkHeader(void); - public: +public: Fast_HTTPChunkedInputStream(Fast_InputStream &in); ~Fast_HTTPChunkedInputStream(); @@ -27,6 +27,3 @@ class Fast_HTTPChunkedInputStream : public Fast_FilterInputStream ssize_t Read(void *targetBuffer, size_t length) override; ssize_t Skip(size_t skipNBytes) override; }; - - - diff --git a/fastlib/src/vespa/fastlib/net/httpchunkedoutputstream.cpp b/fastlib/src/vespa/fastlib/net/httpchunkedoutputstream.cpp index d0b0cc2075f..3db0946e852 100644 --- a/fastlib/src/vespa/fastlib/net/httpchunkedoutputstream.cpp +++ b/fastlib/src/vespa/fastlib/net/httpchunkedoutputstream.cpp @@ -21,105 +21,105 @@ Fast_HTTPChunkedOutputStream::Fast_HTTPChunkedOutputStream(Fast_OutputStream &out, size_t chunkSize) - : Fast_FilterOutputStream(out), - _chunkSize(chunkSize), - _buffer(NULL), - _bufferUsed(0), - _writeHasFailed(false) + : Fast_FilterOutputStream(out), + _chunkSize(chunkSize), + _buffer(NULL), + _bufferUsed(0), + _writeHasFailed(false) { - _buffer = new char[_chunkSize+2]; // Leave room for CRLF at end of chunk - assert(_buffer != NULL); + _buffer = new char[_chunkSize+2]; // Leave room for CRLF at end of chunk + assert(_buffer != NULL); } Fast_HTTPChunkedOutputStream::~Fast_HTTPChunkedOutputStream(void) { - delete [] _buffer; + delete [] _buffer; } bool Fast_HTTPChunkedOutputStream::WriteChunk(void) { - // Don't write an empty block, as this will end the entity. - if (_bufferUsed == 0) - { - return true; - } - - if (_writeHasFailed) - return false; - - char chunkHeader[100]; - char *from; - size_t bytesLeft; - ssize_t bytesWritten; - bytesLeft = sprintf(chunkHeader, "%x\r\n", - static_cast(_bufferUsed)); - from = chunkHeader; - while (bytesLeft > 0) - { - bytesWritten = Fast_FilterOutputStream::Write(from, bytesLeft); - if (bytesWritten < 0) - { - _writeHasFailed = true; - return false; - } - else + // Don't write an empty block, as this will end the entity. + if (_bufferUsed == 0) { - from += bytesWritten; - bytesLeft -= bytesWritten; + return true; } - } - - _buffer[_bufferUsed++] = '\r'; - _buffer[_bufferUsed++] = '\n'; - bytesLeft = _bufferUsed; - from = _buffer; - while (bytesLeft > 0) - { - bytesWritten = Fast_FilterOutputStream::Write(from, bytesLeft); - if (bytesWritten < 0) + + if (_writeHasFailed) + return false; + + char chunkHeader[100]; + char *from; + size_t bytesLeft; + ssize_t bytesWritten; + bytesLeft = sprintf(chunkHeader, "%x\r\n", + static_cast(_bufferUsed)); + from = chunkHeader; + while (bytesLeft > 0) { - _bufferUsed -= 2; - _writeHasFailed = true; - return false; + bytesWritten = Fast_FilterOutputStream::Write(from, bytesLeft); + if (bytesWritten < 0) + { + _writeHasFailed = true; + return false; + } + else + { + from += bytesWritten; + bytesLeft -= bytesWritten; + } } - else + + _buffer[_bufferUsed++] = '\r'; + _buffer[_bufferUsed++] = '\n'; + bytesLeft = _bufferUsed; + from = _buffer; + while (bytesLeft > 0) { - from += bytesWritten; - bytesLeft -= bytesWritten; + bytesWritten = Fast_FilterOutputStream::Write(from, bytesLeft); + if (bytesWritten < 0) + { + _bufferUsed -= 2; + _writeHasFailed = true; + return false; + } + else + { + from += bytesWritten; + bytesLeft -= bytesWritten; + } } - } - _bufferUsed = 0; - return true; + _bufferUsed = 0; + return true; } bool Fast_HTTPChunkedOutputStream::Close(void) { - WriteChunk(); - char chunkHeader[] = { '0', '\r', '\n', '\r', '\n' }; - char *from = chunkHeader; - size_t bytesLeft = sizeof(chunkHeader); - ssize_t bytesWritten; - while (bytesLeft > 0) - { - bytesWritten = Fast_FilterOutputStream::Write(from, bytesLeft); - if (bytesWritten < 0) - { - break; - } - else + WriteChunk(); + char chunkHeader[] = { '0', '\r', '\n', '\r', '\n' }; + char *from = chunkHeader; + size_t bytesLeft = sizeof(chunkHeader); + ssize_t bytesWritten; + while (bytesLeft > 0) { - from += bytesWritten; - bytesLeft -= bytesWritten; + bytesWritten = Fast_FilterOutputStream::Write(from, bytesLeft); + if (bytesWritten < 0) + { + break; + } + else + { + from += bytesWritten; + bytesLeft -= bytesWritten; + } } - } - return (bytesLeft == 0); + return (bytesLeft == 0); } @@ -127,27 +127,27 @@ bool Fast_HTTPChunkedOutputStream::Close(void) ssize_t Fast_HTTPChunkedOutputStream::Write(const void *sourceBuffer, size_t length) { - const char *from = static_cast(sourceBuffer); - size_t numBytesWritten = length; - while (length > 0) - { - size_t bufferRemain = _chunkSize - _bufferUsed; - if (bufferRemain > 0) { - size_t blockLength = (length < bufferRemain) ? length : bufferRemain; - memcpy(_buffer + _bufferUsed, from, blockLength); - _bufferUsed += blockLength; - from += blockLength; - length -= blockLength; - } - if (length > 0) + const char *from = static_cast(sourceBuffer); + size_t numBytesWritten = length; + while (length > 0) { - if (!WriteChunk()) - { - return -1; - } + size_t bufferRemain = _chunkSize - _bufferUsed; + if (bufferRemain > 0) { + size_t blockLength = (length < bufferRemain) ? length : bufferRemain; + memcpy(_buffer + _bufferUsed, from, blockLength); + _bufferUsed += blockLength; + from += blockLength; + length -= blockLength; + } + if (length > 0) + { + if (!WriteChunk()) + { + return -1; + } + } } - } - return numBytesWritten; + return numBytesWritten; } @@ -155,6 +155,6 @@ Fast_HTTPChunkedOutputStream::Write(const void *sourceBuffer, size_t length) void Fast_HTTPChunkedOutputStream::Flush(void) { - WriteChunk(); - Fast_FilterOutputStream::Flush(); + WriteChunk(); + Fast_FilterOutputStream::Flush(); } diff --git a/fastlib/src/vespa/fastlib/net/httpchunkedoutputstream.h b/fastlib/src/vespa/fastlib/net/httpchunkedoutputstream.h index bc34d6f4dc7..f54b6c06922 100644 --- a/fastlib/src/vespa/fastlib/net/httpchunkedoutputstream.h +++ b/fastlib/src/vespa/fastlib/net/httpchunkedoutputstream.h @@ -6,18 +6,18 @@ class Fast_HTTPChunkedOutputStream : public Fast_FilterOutputStream { - private: +private: // Prevent use of: Fast_HTTPChunkedOutputStream(const Fast_HTTPChunkedOutputStream &); Fast_HTTPChunkedOutputStream & operator=(const Fast_HTTPChunkedOutputStream &); - protected: +protected: size_t _chunkSize; char *_buffer; size_t _bufferUsed; bool _writeHasFailed; bool WriteChunk(void); - public: +public: Fast_HTTPChunkedOutputStream(Fast_OutputStream &out, size_t chunkSize = 1024); ~Fast_HTTPChunkedOutputStream(); @@ -27,6 +27,3 @@ class Fast_HTTPChunkedOutputStream : public Fast_FilterOutputStream ssize_t Write(const void *sourceBuffer, size_t length) override; void Flush() override; }; - - - diff --git a/fastlib/src/vespa/fastlib/net/httpheaderparser.cpp b/fastlib/src/vespa/fastlib/net/httpheaderparser.cpp index aa56372277c..8f1dadef052 100644 --- a/fastlib/src/vespa/fastlib/net/httpheaderparser.cpp +++ b/fastlib/src/vespa/fastlib/net/httpheaderparser.cpp @@ -4,11 +4,11 @@ #include Fast_HTTPHeaderParser::Fast_HTTPHeaderParser(Fast_BufferedInputStream &in) - : _pushBack(0), - _isPushBacked(false), - _bufferSize(16384), - _lineBuffer(new char[_bufferSize]), - _input(&in) + : _pushBack(0), + _isPushBacked(false), + _bufferSize(16384), + _lineBuffer(new char[_bufferSize]), + _input(&in) { } @@ -20,134 +20,134 @@ Fast_HTTPHeaderParser::~Fast_HTTPHeaderParser(void) bool Fast_HTTPHeaderParser::ReadRequestLine(const char *&method, const char *&url, int &versionMajor, int &versionMinor) { - // Read a single line from input. Repeat if line is blank, to cope - // with buggy HTTP/1.1 clients that print extra empty lines at the - // end of requests. + // Read a single line from input. Repeat if line is blank, to cope + // with buggy HTTP/1.1 clients that print extra empty lines at the + // end of requests. + + do { + size_t idx = 0; + ssize_t readLen = _input->ReadBufferFullUntil(_lineBuffer, _bufferSize, '\n'); + if (readLen <= 0) { + return false; + } + idx = readLen-1; + + if (idx == 0 || _lineBuffer[idx] != '\n') { + return false; + } + _lineBuffer[idx--] = '\0'; + if (_lineBuffer[idx] == '\r') { + _lineBuffer[idx] = '\0'; + } + } while (_lineBuffer[0] == '\0'); + + // Parse request line. - do { - size_t idx = 0; - ssize_t readLen = _input->ReadBufferFullUntil(_lineBuffer, _bufferSize, '\n'); - if (readLen <= 0) { - return false; - } - idx = readLen-1; - - if (idx == 0 || _lineBuffer[idx] != '\n') { - return false; - } - _lineBuffer[idx--] = '\0'; - if (_lineBuffer[idx] == '\r') { - _lineBuffer[idx] = '\0'; - } - } while (_lineBuffer[0] == '\0'); - - // Parse request line. - - char *p = _lineBuffer; - const char *version = ""; + char *p = _lineBuffer; + const char *version = ""; - method = p; - p = strchr(p, ' '); - if (p != NULL) { - *p++ = '\0'; - url = p; + method = p; p = strchr(p, ' '); if (p != NULL) { - *p++ = '\0'; - version = p; + *p++ = '\0'; + url = p; + p = strchr(p, ' '); + if (p != NULL) { + *p++ = '\0'; + version = p; + } } - } - if (sscanf(version, "HTTP/%d.%d", &versionMajor, &versionMinor) != 2) { - versionMajor = versionMinor = -1; - return false; - } + if (sscanf(version, "HTTP/%d.%d", &versionMajor, &versionMinor) != 2) { + versionMajor = versionMinor = -1; + return false; + } - return true; + return true; } bool Fast_HTTPHeaderParser::ReadHeader(const char *&name, const char *&value) { - size_t idx = 0; - - name = NULL; - value = NULL; - - if (_isPushBacked) { - idx = 0; - _lineBuffer[idx] = _pushBack; - _isPushBacked = false; - idx++; - } - - constexpr size_t ROOM_FOR_PUSH_BACK = 1u; - while ((idx + ROOM_FOR_PUSH_BACK) < _bufferSize) { - ssize_t readLen = _input->ReadBufferFullUntil(&_lineBuffer[idx], _bufferSize - idx - ROOM_FOR_PUSH_BACK, '\n'); - if (readLen <= 0) { - return false; - } - idx += readLen - 1; - // Empty line == end of headers. - // handle case with \r\n as \n - if (idx == 0 || (_lineBuffer[0] == '\r' && idx == 1)) { - idx = 0; - break; - } + size_t idx = 0; - // Ignore double return 0xD, 0xA) - if (idx >= 1) { - if (_lineBuffer[idx - 1] == '\r') { - idx--; - _lineBuffer[idx] = '\n'; - } - } + name = NULL; + value = NULL; - // Check if header continues on next line. - if (_input->Read(&_pushBack, 1) != 1) { - break; + if (_isPushBacked) { + idx = 0; + _lineBuffer[idx] = _pushBack; + _isPushBacked = false; + idx++; } - if (_pushBack == ' ' || _pushBack == '\t') { - // Header does continue on next line. - // Replace newline with horizontal whitespace. - _lineBuffer[idx] = _pushBack; - idx++; - } else { - _isPushBacked = true; - // break out of while loop - break; + + constexpr size_t ROOM_FOR_PUSH_BACK = 1u; + while ((idx + ROOM_FOR_PUSH_BACK) < _bufferSize) { + ssize_t readLen = _input->ReadBufferFullUntil(&_lineBuffer[idx], _bufferSize - idx - ROOM_FOR_PUSH_BACK, '\n'); + if (readLen <= 0) { + return false; + } + idx += readLen - 1; + // Empty line == end of headers. + // handle case with \r\n as \n + if (idx == 0 || (_lineBuffer[0] == '\r' && idx == 1)) { + idx = 0; + break; + } + + // Ignore double return 0xD, 0xA) + if (idx >= 1) { + if (_lineBuffer[idx - 1] == '\r') { + idx--; + _lineBuffer[idx] = '\n'; + } + } + + // Check if header continues on next line. + if (_input->Read(&_pushBack, 1) != 1) { + break; + } + if (_pushBack == ' ' || _pushBack == '\t') { + // Header does continue on next line. + // Replace newline with horizontal whitespace. + _lineBuffer[idx] = _pushBack; + idx++; + } else { + _isPushBacked = true; + // break out of while loop + break; + } } - } - if (idx != 0) { - _lineBuffer[idx] = '\0'; - char *p = _lineBuffer; - name = p; + if (idx != 0) { + _lineBuffer[idx] = '\0'; + char *p = _lineBuffer; + name = p; + + // Find end of header name. + while (*p != ':' && *p != '\0') { + p++; + } + + // If end of header name is not end of header, parse header value. + if (*p != '\0') { + // Terminate header name. + *p++ = '\0'; + + // Skip leading whitespace before header value. + while (*p == ' ' || *p == '\t') { + p++; + } + value = p; + // Strip trailing whitespace. + p += strlen(p); + while (p > value && (*(p-1) == ' ' || *(p-1) == '\t')) { + p--; + } + *p = '\0'; + } // End of header parsing (idx != 0). - // Find end of header name. - while (*p != ':' && *p != '\0') { - p++; } - // If end of header name is not end of header, parse header value. - if (*p != '\0') { - // Terminate header name. - *p++ = '\0'; - - // Skip leading whitespace before header value. - while (*p == ' ' || *p == '\t') { - p++; - } - value = p; - // Strip trailing whitespace. - p += strlen(p); - while (p > value && (*(p-1) == ' ' || *(p-1) == '\t')) { - p--; - } - *p = '\0'; - } // End of header parsing (idx != 0). - - } - - return (idx != 0); + return (idx != 0); } diff --git a/fastlib/src/vespa/fastlib/net/httpheaderparser.h b/fastlib/src/vespa/fastlib/net/httpheaderparser.h index 59c5cb01f8a..ccd6c24ed37 100644 --- a/fastlib/src/vespa/fastlib/net/httpheaderparser.h +++ b/fastlib/src/vespa/fastlib/net/httpheaderparser.h @@ -6,7 +6,7 @@ class Fast_BufferedInputStream; class Fast_HTTPHeaderParser { - public: +public: Fast_HTTPHeaderParser(const Fast_HTTPHeaderParser &) = delete; Fast_HTTPHeaderParser & operator = (const Fast_HTTPHeaderParser &) = delete; Fast_HTTPHeaderParser(Fast_BufferedInputStream &in); @@ -15,7 +15,7 @@ class Fast_HTTPHeaderParser // Methods bool ReadRequestLine(const char *&method, const char *&url, int &versionMajor, int &versionMinor); bool ReadHeader(const char *&name, const char *&value); - private: +private: char _pushBack; bool _isPushBacked; const size_t _bufferSize; diff --git a/fastlib/src/vespa/fastlib/net/httpserver.cpp b/fastlib/src/vespa/fastlib/net/httpserver.cpp index 92e95cede03..c5570356707 100644 --- a/fastlib/src/vespa/fastlib/net/httpserver.cpp +++ b/fastlib/src/vespa/fastlib/net/httpserver.cpp @@ -25,26 +25,26 @@ class Fast_HTTPPersistentInputFilter : public Fast_FilterInputStream { - private: +private: // Prevent use of: Fast_HTTPPersistentInputFilter(const Fast_HTTPPersistentInputFilter &); Fast_HTTPPersistentInputFilter & operator=(const Fast_HTTPPersistentInputFilter &); - protected: +protected: Fast_HTTPChunkedInputStream *_chunkedInput; bool _useChunkedInput; size_t _remainingBytes; - public: +public: Fast_HTTPPersistentInputFilter(Fast_InputStream &in) - : Fast_FilterInputStream(in), - _chunkedInput(NULL), - _useChunkedInput(false), - _remainingBytes(0) + : Fast_FilterInputStream(in), + _chunkedInput(NULL), + _useChunkedInput(false), + _remainingBytes(0) { } ~Fast_HTTPPersistentInputFilter() { - delete _chunkedInput; + delete _chunkedInput; } // Methods @@ -60,59 +60,59 @@ class Fast_HTTPPersistentInputFilter : public Fast_FilterInputStream ssize_t Fast_HTTPPersistentInputFilter::Available() { - if (_useChunkedInput) { - return _chunkedInput->Available(); - } else { - ssize_t slaveAvailable = _in->Available(); - if (slaveAvailable < 0) { - return slaveAvailable; + if (_useChunkedInput) { + return _chunkedInput->Available(); } else { - return ((static_cast(slaveAvailable) < _remainingBytes)) - ? slaveAvailable : _remainingBytes; + ssize_t slaveAvailable = _in->Available(); + if (slaveAvailable < 0) { + return slaveAvailable; + } else { + return ((static_cast(slaveAvailable) < _remainingBytes)) + ? slaveAvailable : _remainingBytes; + } } - } } bool Fast_HTTPPersistentInputFilter::Close() { - // Do nothing. - return true; + // Do nothing. + return true; } ssize_t Fast_HTTPPersistentInputFilter::Read(void *targetBuffer, size_t length) { - if (_useChunkedInput) { - return _chunkedInput->Read(targetBuffer, length); - } else { - if (_remainingBytes == 0) { - return 0; + if (_useChunkedInput) { + return _chunkedInput->Read(targetBuffer, length); } else { - ssize_t numBytesRead; - numBytesRead = _in->Read(targetBuffer, (length < _remainingBytes) - ? length : _remainingBytes); - if (numBytesRead > 0) { - _remainingBytes -= numBytesRead; - } else { - _remainingBytes = 0; - } - return numBytesRead; + if (_remainingBytes == 0) { + return 0; + } else { + ssize_t numBytesRead; + numBytesRead = _in->Read(targetBuffer, (length < _remainingBytes) + ? length : _remainingBytes); + if (numBytesRead > 0) { + _remainingBytes -= numBytesRead; + } else { + _remainingBytes = 0; + } + return numBytesRead; + } } - } } ssize_t Fast_HTTPPersistentInputFilter::Skip(size_t skipNBytes) { - if (_useChunkedInput) { - return _chunkedInput->Skip(skipNBytes); - } else { - return _in->Skip((skipNBytes < _remainingBytes) ? skipNBytes : _remainingBytes); - } + if (_useChunkedInput) { + return _chunkedInput->Skip(skipNBytes); + } else { + return _in->Skip((skipNBytes < _remainingBytes) ? skipNBytes : _remainingBytes); + } } @@ -120,20 +120,20 @@ ssize_t Fast_HTTPPersistentInputFilter::Skip(size_t skipNBytes) void Fast_HTTPPersistentInputFilter::SetEntityLength(size_t entityLength) { - _useChunkedInput = false; - _remainingBytes = entityLength; + _useChunkedInput = false; + _remainingBytes = entityLength; } void Fast_HTTPPersistentInputFilter::SetChunkedEncoding() { - _useChunkedInput = true; - // TODO: If input stream interface is expanded to enable resetting - // streams, we can reuse a single chunked input stream instance - // instead of allocating a new each time. - delete _chunkedInput; - _chunkedInput = new Fast_HTTPChunkedInputStream(*_in); + _useChunkedInput = true; + // TODO: If input stream interface is expanded to enable resetting + // streams, we can reuse a single chunked input stream instance + // instead of allocating a new each time. + delete _chunkedInput; + _chunkedInput = new Fast_HTTPChunkedInputStream(*_in); } @@ -150,11 +150,11 @@ void Fast_HTTPPersistentInputFilter::SetChunkedEncoding() class Fast_HTTPPersistentOutputFilter : public Fast_FilterOutputStream { - private: +private: // Prevent use of: Fast_HTTPPersistentOutputFilter(const Fast_HTTPPersistentOutputFilter &); Fast_HTTPPersistentOutputFilter & operator=(const Fast_HTTPPersistentOutputFilter &); - protected: +protected: Fast_HTTPChunkedOutputStream *_chunkedOutput; Fast_OutputStream *_entityOutput; @@ -165,16 +165,16 @@ class Fast_HTTPPersistentOutputFilter : public Fast_FilterOutputStream size_t _linePos; bool FlushHeader(void); - public: +public: Fast_HTTPPersistentOutputFilter(Fast_OutputStream &out) : - Fast_FilterOutputStream(out), - _chunkedOutput(NULL), _entityOutput(NULL), - _inHeaderRegion(true), _cleanHeader(false), _useChunkedOutput(true), - _linePos(0) + Fast_FilterOutputStream(out), + _chunkedOutput(NULL), _entityOutput(NULL), + _inHeaderRegion(true), _cleanHeader(false), _useChunkedOutput(true), + _linePos(0) { } ~Fast_HTTPPersistentOutputFilter() { - delete _chunkedOutput; + delete _chunkedOutput; } // Methods @@ -187,148 +187,148 @@ class Fast_HTTPPersistentOutputFilter : public Fast_FilterOutputStream bool Fast_HTTPPersistentOutputFilter::FlushHeader() { - assert(_inHeaderRegion); - size_t i = 0; - while (i < _linePos) { - ssize_t numBytesWritten = Fast_FilterOutputStream::Write(_line, _linePos - i); - if (numBytesWritten >= 0) { - i += numBytesWritten; - } else { - return false; + assert(_inHeaderRegion); + size_t i = 0; + while (i < _linePos) { + ssize_t numBytesWritten = Fast_FilterOutputStream::Write(_line, _linePos - i); + if (numBytesWritten >= 0) { + i += numBytesWritten; + } else { + return false; + } } - } - _linePos = 0; - return true; + _linePos = 0; + return true; } bool Fast_HTTPPersistentOutputFilter::Close() { - bool retVal = true; - if (_inHeaderRegion) { - FlushHeader(); - } else if (_useChunkedOutput) { - retVal = _chunkedOutput->Close(); - delete _chunkedOutput; - _chunkedOutput = NULL; - } else { - // Do nothing. In particular, do not close _entityOutput, as that - // would close the slave stream. - } - Fast_FilterOutputStream::Flush(); - _inHeaderRegion = true; - _useChunkedOutput = true; - return retVal; + bool retVal = true; + if (_inHeaderRegion) { + FlushHeader(); + } else if (_useChunkedOutput) { + retVal = _chunkedOutput->Close(); + delete _chunkedOutput; + _chunkedOutput = NULL; + } else { + // Do nothing. In particular, do not close _entityOutput, as that + // would close the slave stream. + } + Fast_FilterOutputStream::Flush(); + _inHeaderRegion = true; + _useChunkedOutput = true; + return retVal; } ssize_t Fast_HTTPPersistentOutputFilter::Write(const void *sourceBuffer, size_t length) { - if (length == 0) { - return 0; - } - - ssize_t numBytesWritten = 0; - const char *from = static_cast(sourceBuffer); - - while (_inHeaderRegion && length > 0) { - // Read a line at a time from the source buffer and check for - // problematic headers and the end of the header region. - - bool endOfHeader = false; - - while (length > 0 && _linePos < sizeof(_line)) { - _line[_linePos++] = *from++; - length--; - numBytesWritten++; - if (_line[_linePos-1] == '\n') { - endOfHeader = true; - break; - } + if (length == 0) { + return 0; } - // We can safely flush if the header is known to be unproblematic - // or is at least as long as the line buffer (the headers we are - // scared of are never that long). - if (_cleanHeader || _linePos == sizeof(_line)) { - _cleanHeader = !endOfHeader; - FlushHeader(); - } else if (endOfHeader) { - // Check for suspicious headers and end of header region. - if (_linePos == 1 || (_linePos == 2 && _line[0] == '\r')) { - // Empty line, end of headers reached. - if (_useChunkedOutput) { - //Add chunking header. - strcpy(_line, "Transfer-Encoding: chunked\r\n\r\n"); - _linePos = strlen(_line); + ssize_t numBytesWritten = 0; + const char *from = static_cast(sourceBuffer); + + while (_inHeaderRegion && length > 0) { + // Read a line at a time from the source buffer and check for + // problematic headers and the end of the header region. + + bool endOfHeader = false; + + while (length > 0 && _linePos < sizeof(_line)) { + _line[_linePos++] = *from++; + length--; + numBytesWritten++; + if (_line[_linePos-1] == '\n') { + endOfHeader = true; + break; + } } - FlushHeader(); - sourceBuffer = from; - _inHeaderRegion = false; - } else { - // Terminate header line. - // (We know that _linepos < sizeof(_line), so this is safe.) - _line[_linePos] = '\0'; - - size_t headerLength = strcspn(_line, " \t\r\n:"); - if (headerLength == 10 && strncasecmp(_line, "connection", 10) == 0) { - // Don't copy this header, just reset line buffer - _linePos = 0; - } else if (headerLength == 14 && strncasecmp(_line, "content-length", 14) == 0) { - _useChunkedOutput = false; - FlushHeader(); - } else if (strcasecmp(_line, "Transfer-Encoding: 8bit\n") == 0) { - // Backward compatibility hack: older versions of - // Fast_HTTPServer set this invalid header, and there might - // exist subclasses that still do. Just discard it. - _linePos = 0; - } else { - FlushHeader(); + // We can safely flush if the header is known to be unproblematic + // or is at least as long as the line buffer (the headers we are + // scared of are never that long). + if (_cleanHeader || _linePos == sizeof(_line)) { + _cleanHeader = !endOfHeader; + FlushHeader(); + } else if (endOfHeader) { + // Check for suspicious headers and end of header region. + if (_linePos == 1 || (_linePos == 2 && _line[0] == '\r')) { + // Empty line, end of headers reached. + if (_useChunkedOutput) { + //Add chunking header. + strcpy(_line, "Transfer-Encoding: chunked\r\n\r\n"); + _linePos = strlen(_line); + } + FlushHeader(); + sourceBuffer = from; + _inHeaderRegion = false; + } else { + // Terminate header line. + // (We know that _linepos < sizeof(_line), so this is safe.) + _line[_linePos] = '\0'; + + size_t headerLength = strcspn(_line, " \t\r\n:"); + if (headerLength == 10 && strncasecmp(_line, "connection", 10) == 0) { + // Don't copy this header, just reset line buffer + _linePos = 0; + } else if (headerLength == 14 && strncasecmp(_line, "content-length", 14) == 0) { + _useChunkedOutput = false; + FlushHeader(); + } else if (strcasecmp(_line, "Transfer-Encoding: 8bit\n") == 0) { + // Backward compatibility hack: older versions of + // Fast_HTTPServer set this invalid header, and there might + // exist subclasses that still do. Just discard it. + _linePos = 0; + + } else { + FlushHeader(); + } + } } - } - } - if (!_inHeaderRegion) { - // End of header region was found, set up entity output stream. - if (_useChunkedOutput) { - // Free old (if it exists) - if (_chunkedOutput != NULL) - delete _chunkedOutput; - - _chunkedOutput = new Fast_HTTPChunkedOutputStream(*_out); - assert(_chunkedOutput != NULL); - _entityOutput = _chunkedOutput; - } else { - _entityOutput = _out; - } + if (!_inHeaderRegion) { + // End of header region was found, set up entity output stream. + if (_useChunkedOutput) { + // Free old (if it exists) + if (_chunkedOutput != NULL) + delete _chunkedOutput; + + _chunkedOutput = new Fast_HTTPChunkedOutputStream(*_out); + assert(_chunkedOutput != NULL); + _entityOutput = _chunkedOutput; + } else { + _entityOutput = _out; + } + } } - } - if (length > 0) { - ssize_t slaveWritten = _entityOutput->Write(sourceBuffer, length); - if (slaveWritten >= 0) { - numBytesWritten += slaveWritten; - } else { - numBytesWritten = slaveWritten; + if (length > 0) { + ssize_t slaveWritten = _entityOutput->Write(sourceBuffer, length); + if (slaveWritten >= 0) { + numBytesWritten += slaveWritten; + } else { + numBytesWritten = slaveWritten; + } } - } - return numBytesWritten; + return numBytesWritten; } void Fast_HTTPPersistentOutputFilter::Flush(void) { - if (_inHeaderRegion) { - FlushHeader(); - Fast_FilterOutputStream::Flush(); - } else { - _entityOutput->Flush(); - } + if (_inHeaderRegion) { + FlushHeader(); + Fast_FilterOutputStream::Flush(); + } else { + _entityOutput->Flush(); + } } Fast_HTTPServer::Fast_HTTPServer(int portNumber, @@ -336,444 +336,444 @@ Fast_HTTPServer::Fast_HTTPServer(int portNumber, int backlog, bool decode, int stackSize, int maxThreads, int clientReadTimeout /* = -1 no timeout */) -: _connections(10), - _connectionCond(), - _threadPool(NULL), - _acceptThread(NULL), - _isRunning(false), - _isListening(false), - _stopSignalled(false), - _runningMutex(), - _maxThreads(maxThreads), - _baseDir(), - _allowUpRelativePath(false), - _serverSocket(portNumber, backlog, - &_serverSocketFactory, - strictBindHostName), - _decode(decode), - _keepAlive(true), - _serverSocketFactory(clientReadTimeout), - _inBufSize(FASTLIB_HTTPSERVER_INBUFSIZE), - _outBufSize(FASTLIB_HTTPSERVER_OUTBUFSIZE) + : _connections(10), + _connectionCond(), + _threadPool(NULL), + _acceptThread(NULL), + _isRunning(false), + _isListening(false), + _stopSignalled(false), + _runningMutex(), + _maxThreads(maxThreads), + _baseDir(), + _allowUpRelativePath(false), + _serverSocket(portNumber, backlog, + &_serverSocketFactory, + strictBindHostName), + _decode(decode), + _keepAlive(true), + _serverSocketFactory(clientReadTimeout), + _inBufSize(FASTLIB_HTTPSERVER_INBUFSIZE), + _outBufSize(FASTLIB_HTTPSERVER_OUTBUFSIZE) { - _threadPool = new FastOS_ThreadPool(stackSize, maxThreads); + _threadPool = new FastOS_ThreadPool(stackSize, maxThreads); } int Fast_HTTPServer::Start(void) { - int retCode = FASTLIB_SUCCESS; - - _runningMutex.Lock(); - if (!_isRunning) { - // Try listening - retCode = Listen(); - - // Start worker thread - if (retCode == FASTLIB_SUCCESS) { - _acceptThread = static_cast(_threadPool->NewThread(this)); - if (_acceptThread == NULL) { - retCode = FASTLIB_HTTPSERVER_NEWTHREADFAILED; - } + int retCode = FASTLIB_SUCCESS; + + _runningMutex.Lock(); + if (!_isRunning) { + // Try listening + retCode = Listen(); + + // Start worker thread + if (retCode == FASTLIB_SUCCESS) { + _acceptThread = static_cast(_threadPool->NewThread(this)); + if (_acceptThread == NULL) { + retCode = FASTLIB_HTTPSERVER_NEWTHREADFAILED; + } + } + } else { + retCode = FASTLIB_HTTPSERVER_ALREADYSTARTED; } - } else { - retCode = FASTLIB_HTTPSERVER_ALREADYSTARTED; - } - _runningMutex.Unlock(); + _runningMutex.Unlock(); - return retCode; + return retCode; } void Fast_HTTPServer::Stop(void) { - _runningMutex.Lock(); - _stopSignalled = true; - if (_acceptThread) { - _acceptThread->SetBreakFlag(); - } - _runningMutex.Unlock(); - if (_acceptThread) { - _acceptThread->Join(); - } + _runningMutex.Lock(); + _stopSignalled = true; + if (_acceptThread) { + _acceptThread->SetBreakFlag(); + } + _runningMutex.Unlock(); + if (_acceptThread) { + _acceptThread->Join(); + } } bool Fast_HTTPServer::StopSignalled(void) { - bool retVal; - _runningMutex.Lock(); - retVal = _stopSignalled; - _runningMutex.Unlock(); - return retVal; + bool retVal; + _runningMutex.Lock(); + retVal = _stopSignalled; + _runningMutex.Unlock(); + return retVal; } Fast_HTTPServer::~Fast_HTTPServer(void) { - Stop(); + Stop(); - _connectionCond.Lock(); + _connectionCond.Lock(); - for (Fast_BagIterator i(_connections); !i.End(); i.Next()) - i.GetCurrent()->Interrupt(); + for (Fast_BagIterator i(_connections); !i.End(); i.Next()) + i.GetCurrent()->Interrupt(); - while (_connections.NumberOfElements() > 0) - _connectionCond.Wait(); + while (_connections.NumberOfElements() > 0) + _connectionCond.Wait(); - _connectionCond.Unlock(); - delete _threadPool; + _connectionCond.Unlock(); + delete _threadPool; } int Fast_HTTPServer::Listen(void) { - int retCode = FASTLIB_SUCCESS; + int retCode = FASTLIB_SUCCESS; - if(!_isListening) { - if (_serverSocket.Listen()) { - _isListening = true; - } else { - std::string errorMsg = FastOS_Socket::getErrorString(FastOS_Socket::GetLastError()); - retCode = FASTLIB_HTTPSERVER_BADLISTEN; + if(!_isListening) { + if (_serverSocket.Listen()) { + _isListening = true; + } else { + std::string errorMsg = FastOS_Socket::getErrorString(FastOS_Socket::GetLastError()); + retCode = FASTLIB_HTTPSERVER_BADLISTEN; + } } - } - return retCode; + return retCode; } void Fast_HTTPServer::Run(FastOS_ThreadInterface *thisThread, void *params) { - (void) thisThread; - (void) params; - Fast_Socket *mySocket; - - - _runningMutex.Lock(); - _isRunning = true; - _stopSignalled = false; - _runningMutex.Unlock(); - - if (Listen() == FASTLIB_SUCCESS) { - FastOS_SocketEvent socketEvent; - if (_serverSocket.SetSocketEvent(&socketEvent)) { - _serverSocket.EnableReadEvent(true); - while (!thisThread->GetBreakFlag()) { - bool waitError; - if (!socketEvent.Wait(waitError, 500)) { - if (waitError) { + (void) thisThread; + (void) params; + Fast_Socket *mySocket; + + + _runningMutex.Lock(); + _isRunning = true; + _stopSignalled = false; + _runningMutex.Unlock(); + + if (Listen() == FASTLIB_SUCCESS) { + FastOS_SocketEvent socketEvent; + if (_serverSocket.SetSocketEvent(&socketEvent)) { + _serverSocket.EnableReadEvent(true); + while (!thisThread->GetBreakFlag()) { + bool waitError; + if (!socketEvent.Wait(waitError, 500)) { + if (waitError) { // fprintf(stderr, "HTTPServer: ERROR: Wait on server socket failed.\n"); - } - continue; - } - - // If number of threads is limited, ensure that the limit is - // not breached. Starvation is impossible, since threads are - // only allocated here. - if (_maxThreads != 0) { - while (_threadPool->GetNumActiveThreads() == _maxThreads) { - FastOS_Thread::Sleep(50); - } - } - - mySocket = static_cast(_serverSocket.Accept()); - - if (mySocket != NULL) { - mySocket->SetNoDelay(true); - Fast_HTTPConnection *connectionHandler = - new Fast_HTTPConnection(mySocket, // Takes ownership - _decode, - _inBufSize, - _outBufSize); - - if (_keepAlive == false) { - connectionHandler->SetKeepAlive(false); - } - - auto* thread = _threadPool->NewThread(connectionHandler, this); - if (thread == nullptr) { - // Thread pool has been shut down; cannot service request. - delete connectionHandler; - } + } + continue; + } + + // If number of threads is limited, ensure that the limit is + // not breached. Starvation is impossible, since threads are + // only allocated here. + if (_maxThreads != 0) { + while (_threadPool->GetNumActiveThreads() == _maxThreads) { + FastOS_Thread::Sleep(50); + } + } + + mySocket = static_cast(_serverSocket.Accept()); + + if (mySocket != NULL) { + mySocket->SetNoDelay(true); + Fast_HTTPConnection *connectionHandler = + new Fast_HTTPConnection(mySocket, // Takes ownership + _decode, + _inBufSize, + _outBufSize); + + if (_keepAlive == false) { + connectionHandler->SetKeepAlive(false); + } + + auto* thread = _threadPool->NewThread(connectionHandler, this); + if (thread == nullptr) { + // Thread pool has been shut down; cannot service request. + delete connectionHandler; + } + } else { + FastOS_Thread::Sleep(1000); + // fprintf(stderr, "HTTPServer: ERROR: Accept did not return a valid socket. Terminating\n"); + } + } + _serverSocket.EnableReadEvent(false); } else { - FastOS_Thread::Sleep(1000); - // fprintf(stderr, "HTTPServer: ERROR: Accept did not return a valid socket. Terminating\n"); - } - } - _serverSocket.EnableReadEvent(false); - } else { // fprintf(stderr, "HTTPServer: ERROR: Unable to set socket event handler.\n"); + } + _serverSocket.SetSocketEvent(NULL); } - _serverSocket.SetSocketEvent(NULL); - } - _runningMutex.Lock(); - _isRunning = false; - _runningMutex.Unlock(); + _runningMutex.Lock(); + _isRunning = false; + _runningMutex.Unlock(); } void Fast_HTTPConnection::Run(FastOS_ThreadInterface *thisThread, void *params) { - (void) thisThread; - vespalib::string fLine, contentType; - vespalib::string url, host; - - enum request_type { HTTPSERVER_UNSUPPORTEDREQUEST, - HTTPSERVER_GETREQUEST, - HTTPSERVER_POSTREQUEST, - HTTPSERVER_PUTREQUEST, - HTTPSERVER_DELETEREQUEST - } requestType = HTTPSERVER_UNSUPPORTEDREQUEST; + (void) thisThread; + vespalib::string fLine, contentType; + vespalib::string url, host; + enum request_type { HTTPSERVER_UNSUPPORTEDREQUEST, + HTTPSERVER_GETREQUEST, + HTTPSERVER_POSTREQUEST, + HTTPSERVER_PUTREQUEST, + HTTPSERVER_DELETEREQUEST + } requestType = HTTPSERVER_UNSUPPORTEDREQUEST; - _server = static_cast(params); - _server->AddConnection(this); - Fast_InputStream *originalInput = _input; - Fast_HTTPPersistentInputFilter *persistentInput = NULL; - Fast_OutputStream *originalOutput = _output; - Fast_HTTPPersistentOutputFilter *persistentOutput = NULL; + _server = static_cast(params); + _server->AddConnection(this); - Fast_HTTPHeaderParser headerParser(static_cast(*_input)); + Fast_InputStream *originalInput = _input; + Fast_HTTPPersistentInputFilter *persistentInput = NULL; + Fast_OutputStream *originalOutput = _output; + Fast_HTTPPersistentOutputFilter *persistentOutput = NULL; - do { + Fast_HTTPHeaderParser headerParser(static_cast(*_input)); - bool printContinue = false; // RFC2616, 8.2.3 - bool chunkedInput = false; - int contentLength = 0; + do { - // Get request line. + bool printContinue = false; // RFC2616, 8.2.3 + bool chunkedInput = false; + int contentLength = 0; - const char *requestCStr, *urlCStr; - int versionMajor, versionMinor; + // Get request line. - if (! headerParser.ReadRequestLine(requestCStr, urlCStr, versionMajor, versionMinor)) - break; - - if (strcmp(requestCStr, "POST") == 0) { - requestType = HTTPSERVER_POSTREQUEST; - } else if (strcmp(requestCStr, "GET") == 0) { - requestType = HTTPSERVER_GETREQUEST; - } else if (strcmp(requestCStr, "PUT") == 0) { - requestType = HTTPSERVER_PUTREQUEST; - } else if (strcmp(requestCStr, "DELETE") == 0) { - requestType = HTTPSERVER_DELETEREQUEST; - } else { - requestType = HTTPSERVER_UNSUPPORTEDREQUEST; - } + const char *requestCStr, *urlCStr; + int versionMajor, versionMinor; - if (_decode) { - vespalib::string encodedURL(urlCStr); - int bufferLength = encodedURL.length()+10; - char *decodedURL = new char[bufferLength]; - Fast_URL urlCodec; - urlCodec.decode(encodedURL.c_str(), decodedURL, bufferLength); - urlCodec.DecodeQueryString(decodedURL); - url = decodedURL; - delete [] decodedURL; - } else { - url = urlCStr; - } + if (! headerParser.ReadRequestLine(requestCStr, urlCStr, versionMajor, versionMinor)) + break; - if (versionMajor != 1) { - requestType = HTTPSERVER_UNSUPPORTEDREQUEST; - } - if (versionMinor < 1) { - _keepAlive = false; // No keepAlive for HTTP/1.0 and HTTP/0.9 - } - _versionMajor = versionMajor; - _versionMinor = versionMinor; - _httpVersion = vespalib::make_string("HTTP/%d.%d", _versionMajor, _versionMinor); - - const char *headerName, *headerValue; - while(headerParser.ReadHeader(headerName, headerValue)) { - if (strcasecmp(headerName, "content-length") == 0) { - contentLength = atoi(headerValue); - //printf("Found content length: %i\n", contentLength); - } - - if (strcasecmp(headerName, "content-type") == 0) { - contentType = headerValue; - } + if (strcmp(requestCStr, "POST") == 0) { + requestType = HTTPSERVER_POSTREQUEST; + } else if (strcmp(requestCStr, "GET") == 0) { + requestType = HTTPSERVER_GETREQUEST; + } else if (strcmp(requestCStr, "PUT") == 0) { + requestType = HTTPSERVER_PUTREQUEST; + } else if (strcmp(requestCStr, "DELETE") == 0) { + requestType = HTTPSERVER_DELETEREQUEST; + } else { + requestType = HTTPSERVER_UNSUPPORTEDREQUEST; + } - if (strcasecmp(headerName, "connection") == 0) { - if (strcasecmp(headerValue, "close") == 0) { - _keepAlive = false; + if (_decode) { + vespalib::string encodedURL(urlCStr); + int bufferLength = encodedURL.length()+10; + char *decodedURL = new char[bufferLength]; + Fast_URL urlCodec; + urlCodec.decode(encodedURL.c_str(), decodedURL, bufferLength); + urlCodec.DecodeQueryString(decodedURL); + url = decodedURL; + delete [] decodedURL; + } else { + url = urlCStr; } - } - if (strcasecmp(headerName, "host") == 0) { - host = headerValue; - } + if (versionMajor != 1) { + requestType = HTTPSERVER_UNSUPPORTEDREQUEST; + } + if (versionMinor < 1) { + _keepAlive = false; // No keepAlive for HTTP/1.0 and HTTP/0.9 + } + _versionMajor = versionMajor; + _versionMinor = versionMinor; + _httpVersion = vespalib::make_string("HTTP/%d.%d", _versionMajor, _versionMinor); + + const char *headerName, *headerValue; + while(headerParser.ReadHeader(headerName, headerValue)) { + if (strcasecmp(headerName, "content-length") == 0) { + contentLength = atoi(headerValue); + //printf("Found content length: %i\n", contentLength); + } + + if (strcasecmp(headerName, "content-type") == 0) { + contentType = headerValue; + } + + if (strcasecmp(headerName, "connection") == 0) { + if (strcasecmp(headerValue, "close") == 0) { + _keepAlive = false; + } + } + + if (strcasecmp(headerName, "host") == 0) { + host = headerValue; + } + + if (strcasecmp(headerName, "cookie") == 0) { + _cookies = headerValue; + } + + if (strcasecmp(headerName, "expect") == 0) { + if (strcasecmp(headerValue, "100-continue") == 0) { + printContinue = true; + } else { + // TODO: Return reponse code 417 instead of 505. + requestType = HTTPSERVER_UNSUPPORTEDREQUEST; + } + } + + if (strcasecmp(headerName, "transfer-encoding") == 0) { + if (strcasecmp(headerValue, "chunked") == 0) { + chunkedInput = true; + } else { + // Only chunked is supported so far. + requestType = HTTPSERVER_UNSUPPORTEDREQUEST; + } + } + + if (strcasecmp(headerName, "authorization") == 0) { + if (strncasecmp(headerValue, "basic",5) == 0) { + char *auth = new char[strlen(headerValue)-4]; + int len = Fast_Base64::Decode(headerValue+5,strlen(headerValue)-5,auth); + if(len>=0) auth[len]=0; + char *pass=strchr(auth,':'); + if(pass!=NULL){ + *pass++=0; + _auth_user=auth; + _auth_pass=pass; + } + delete[] auth; + } + } + } - if (strcasecmp(headerName, "cookie") == 0) { - _cookies = headerValue; - } - if (strcasecmp(headerName, "expect") == 0) { - if (strcasecmp(headerValue, "100-continue") == 0) { - printContinue = true; + if (_keepAlive) { + // Set up filters for persistent input and output. + + if (persistentInput == NULL) { + persistentInput = new Fast_HTTPPersistentInputFilter(*originalInput); + assert(persistentInput != NULL); + } + if (chunkedInput) { + // If chunked input is specified in headers, ignore content-length + // and use chunked encoding, according to RFC. + persistentInput->SetChunkedEncoding(); + } else { + // Works as intended if content length == 0 (i.e. no entity body). + persistentInput->SetEntityLength(contentLength); + } + _input = persistentInput; + + if (persistentOutput == NULL) { + persistentOutput = new Fast_HTTPPersistentOutputFilter(*originalOutput); + assert(persistentOutput != NULL); + } + _output = persistentOutput; } else { - // TODO: Return reponse code 417 instead of 505. - requestType = HTTPSERVER_UNSUPPORTEDREQUEST; + _input = originalInput; + _output = originalOutput; } - } - if (strcasecmp(headerName, "transfer-encoding") == 0) { - if (strcasecmp(headerValue, "chunked") == 0) { - chunkedInput = true; - } else { - // Only chunked is supported so far. - requestType = HTTPSERVER_UNSUPPORTEDREQUEST; - } - } - - if (strcasecmp(headerName, "authorization") == 0) { - if (strncasecmp(headerValue, "basic",5) == 0) { - char *auth = new char[strlen(headerValue)-4]; - int len = Fast_Base64::Decode(headerValue+5,strlen(headerValue)-5,auth); - if(len>=0) auth[len]=0; - char *pass=strchr(auth,':'); - if(pass!=NULL){ - *pass++=0; - _auth_user=auth; - _auth_pass=pass; - } - delete[] auth; + if (printContinue) { + Output(_httpVersion.c_str()); + Output(" 100 Continue\r\n"); } - } - } - if (_keepAlive) { - // Set up filters for persistent input and output. - - if (persistentInput == NULL) { - persistentInput = new Fast_HTTPPersistentInputFilter(*originalInput); - assert(persistentInput != NULL); - } - if (chunkedInput) { - // If chunked input is specified in headers, ignore content-length - // and use chunked encoding, according to RFC. - persistentInput->SetChunkedEncoding(); - } else { - // Works as intended if content length == 0 (i.e. no entity body). - persistentInput->SetEntityLength(contentLength); - } - _input = persistentInput; - - if (persistentOutput == NULL) { - persistentOutput = new Fast_HTTPPersistentOutputFilter(*originalOutput); - assert(persistentOutput != NULL); - } - _output = persistentOutput; - } else { - _input = originalInput; - _output = originalOutput; - } + switch(requestType) { + case HTTPSERVER_GETREQUEST: + { + _server->onGetRequest(url, host, *this); + break; + } - if (printContinue) { - Output(_httpVersion.c_str()); - Output(" 100 Continue\r\n"); - } + case HTTPSERVER_POSTREQUEST: + { + _server->OnPostRequest(url, host, contentType, contentLength, + *this, *_input, *_output); + break; + } + case HTTPSERVER_PUTREQUEST: + { + _server->OnPutRequest(url, host, contentType, contentLength, + *this, *_input, *_output); + break; + } - switch(requestType) { - case HTTPSERVER_GETREQUEST: - { - _server->onGetRequest(url, host, *this); - break; - } - - case HTTPSERVER_POSTREQUEST: - { - _server->OnPostRequest(url, host, contentType, contentLength, - *this, *_input, *_output); - break; - } - - case HTTPSERVER_PUTREQUEST: - { - _server->OnPutRequest(url, host, contentType, contentLength, - *this, *_input, *_output); - break; - } - - case HTTPSERVER_DELETEREQUEST: - { - _server->OnDeleteRequest(url, host, *this); - break; - } - - case HTTPSERVER_UNSUPPORTEDREQUEST: - default: - { - _server->OnUnsupportedRequest(url, host, *this); - _keepAlive = false; - break; - } - } + case HTTPSERVER_DELETEREQUEST: + { + _server->OnDeleteRequest(url, host, *this); + break; + } - // Ensure all of request entity body is read if connection is - // persistent. - if (_keepAlive) { - ssize_t numBytesRead; - char buffer[1024]; - while ((numBytesRead = _input->Read(buffer, sizeof(buffer))) > 0) { - // Keep reading - } - _keepAlive = (numBytesRead == 0); - _input = originalInput; - } + case HTTPSERVER_UNSUPPORTEDREQUEST: + default: + { + _server->OnUnsupportedRequest(url, host, *this); + _keepAlive = false; + break; + } + } + + // Ensure all of request entity body is read if connection is + // persistent. + if (_keepAlive) { + ssize_t numBytesRead; + char buffer[1024]; + while ((numBytesRead = _input->Read(buffer, sizeof(buffer))) > 0) { + // Keep reading + } + _keepAlive = (numBytesRead == 0); + _input = originalInput; + } - _output->Flush(); - _output->Close(); + _output->Flush(); + _output->Close(); - } while (_keepAlive && !_server->StopSignalled()); + } while (_keepAlive && !_server->StopSignalled()); - // Close connection - _socket->Close(); + // Close connection + _socket->Close(); - _input = originalInput; // To be deleted by destructor - delete persistentInput; + _input = originalInput; // To be deleted by destructor + delete persistentInput; - _output = originalOutput; // To be deleted by destructor - delete persistentOutput; + _output = originalOutput; // To be deleted by destructor + delete persistentOutput; - delete this; + delete this; } void Fast_HTTPServer::onGetRequest(const string & tmpurl, const string & host, Fast_HTTPConnection& conn) { - // Trim leading / if it exists - string url(tmpurl); - if (url.length()>0) { - if (url[0]=='/') { - url = url.substr(1); + // Trim leading / if it exists + string url(tmpurl); + if (url.length()>0) { + if (url[0]=='/') { + url = url.substr(1); + } } - } - - if (IsFileRequest(url)) { - HandleFileRequest(url, conn); - } else { - // Output html content header - conn.Output(conn.GetHTTPVersion().c_str()); - conn.Output(" 200 OK\r\n"); - conn.Output("Server: FAST-HTTP-Server/1.0 (Fast Generic HTTP server)\r\n"); - if (conn.GetKeepAlive() == false) - conn.Output("Connection: close\r\n"); - conn.Output("Content-Type: text/html\r\n\r\n"); - // Output user specific body - OnWriteBody(url, host, conn); - } + if (IsFileRequest(url)) { + HandleFileRequest(url, conn); + } else { + // Output html content header + conn.Output(conn.GetHTTPVersion().c_str()); + conn.Output(" 200 OK\r\n"); + conn.Output("Server: FAST-HTTP-Server/1.0 (Fast Generic HTTP server)\r\n"); + if (conn.GetKeepAlive() == false) + conn.Output("Connection: close\r\n"); + conn.Output("Content-Type: text/html\r\n\r\n"); + + // Output user specific body + OnWriteBody(url, host, conn); + } } @@ -787,32 +787,32 @@ void Fast_HTTPServer::OnPostRequest(const string & url, Fast_OutputStream& outputStream) { - // Ignore all parameters - (void) url; - (void) host; - (void) contentType; - (void) contentLength; - (void) inputStream; - (void) outputStream; - (void) contentLength; - - // Output html content header - conn.Output(conn.GetHTTPVersion().c_str()); - conn.Output(" 200 OK\r\n"); - conn.Output("Server: FAST-HTTP-Server/1.0 (Fast Generic HTTP server)\r\n"); - if (conn.GetKeepAlive() == false) - conn.Output("Connection: close\r\n"); - conn.Output("Content-Type: text/html\r\n\r\n"); - - // Body output example - conn.Output(" \r\n"); - conn.Output(" \r\n"); - conn.Output("Test title \r\n"); - conn.Output(" \r\n"); - conn.Output(" \r\n"); - conn.Output("

Implement the virtual function 'OnPostRequest()' to change this page!

\r\n"); - conn.Output(" \r\n"); - conn.Output(" \r\n\r\n"); + // Ignore all parameters + (void) url; + (void) host; + (void) contentType; + (void) contentLength; + (void) inputStream; + (void) outputStream; + (void) contentLength; + + // Output html content header + conn.Output(conn.GetHTTPVersion().c_str()); + conn.Output(" 200 OK\r\n"); + conn.Output("Server: FAST-HTTP-Server/1.0 (Fast Generic HTTP server)\r\n"); + if (conn.GetKeepAlive() == false) + conn.Output("Connection: close\r\n"); + conn.Output("Content-Type: text/html\r\n\r\n"); + + // Body output example + conn.Output(" \r\n"); + conn.Output(" \r\n"); + conn.Output("Test title \r\n"); + conn.Output(" \r\n"); + conn.Output(" \r\n"); + conn.Output("

Implement the virtual function 'OnPostRequest()' to change this page!

\r\n"); + conn.Output(" \r\n"); + conn.Output(" \r\n\r\n"); } @@ -827,240 +827,240 @@ void Fast_HTTPServer::OnPutRequest(const string & url, Fast_OutputStream& outputStream) { - // Ignore parameters not passed on to OnUnsupportedRequest() - (void) contentType; - (void) contentLength; - (void) inputStream; - (void) outputStream; - (void) contentLength; + // Ignore parameters not passed on to OnUnsupportedRequest() + (void) contentType; + (void) contentLength; + (void) inputStream; + (void) outputStream; + (void) contentLength; - OnUnsupportedRequest(url, host, conn); + OnUnsupportedRequest(url, host, conn); } void Fast_HTTPServer::OnDeleteRequest(const string & url, const string & host, Fast_HTTPConnection& conn) { - OnUnsupportedRequest(url, host, conn); + OnUnsupportedRequest(url, host, conn); } void Fast_HTTPServer::OnUnsupportedRequest(const string & url, const string & host, Fast_HTTPConnection& conn) { - (void) url; - (void) host; + (void) url; + (void) host; - conn.Output(conn.GetHTTPVersion().c_str()); - conn.Output(" 501 Not Implemented\r\n\r\n"); + conn.Output(conn.GetHTTPVersion().c_str()); + conn.Output(" 501 Not Implemented\r\n\r\n"); } void Fast_HTTPServer::OnWriteBody(const string & url, const string & host, Fast_HTTPConnection& conn) { - (void) url; - (void) host; - - // Body output example - conn.Output(" \r\n"); - conn.Output(" \r\n"); - conn.Output("Test title \r\n"); - conn.Output(" \r\n"); - conn.Output(" \r\n"); - conn.Output("

Implement the virtual function 'OnWriteBody()' to change this page!

\r\n"); - conn.Output(" \r\n"); - conn.Output(" \r\n\r\n"); + (void) url; + (void) host; + + // Body output example + conn.Output(" \r\n"); + conn.Output(" \r\n"); + conn.Output("Test title \r\n"); + conn.Output(" \r\n"); + conn.Output(" \r\n"); + conn.Output("

Implement the virtual function 'OnWriteBody()' to change this page!

\r\n"); + conn.Output(" \r\n"); + conn.Output(" \r\n\r\n"); } void Fast_HTTPConnection::OutputData(const void *data, size_t len) { - const char *dataPosition = static_cast(data); + const char *dataPosition = static_cast(data); - while (len > 0) { - ssize_t numBytesWritten = _output->Write(dataPosition, len); - if (numBytesWritten >= 0) { - dataPosition += numBytesWritten; - len -= numBytesWritten; - } else { - break; + while (len > 0) { + ssize_t numBytesWritten = _output->Write(dataPosition, len); + if (numBytesWritten >= 0) { + dataPosition += numBytesWritten; + len -= numBytesWritten; + } else { + break; + } } - } } void Fast_HTTPConnection::Output(const char *text) { - size_t length = strlen(text); - - while (length > 0) { - ssize_t numBytesWritten = _output->Write(text, length); - if (numBytesWritten >= 0) { - text += numBytesWritten; - length -= numBytesWritten; - } else { - break; - } - } + size_t length = strlen(text); + + while (length > 0) { + ssize_t numBytesWritten = _output->Write(text, length); + if (numBytesWritten >= 0) { + text += numBytesWritten; + length -= numBytesWritten; + } else { + break; + } + } } bool Fast_HTTPServer::IsFileRequest(const string & url) { - bool retVal = false; + bool retVal = false; - // Check if the request is for a file (stupid test now) - if (url.length() > 4) { - if (url[url.length()-4]=='.') retVal = true; + // Check if the request is for a file (stupid test now) + if (url.length() > 4) { + if (url[url.length()-4]=='.') retVal = true; - if (url.length() > 5) { - if (url[url.length()-5]=='.') retVal = true; + if (url.length() > 5) { + if (url[url.length()-5]=='.') retVal = true; - if (url.length() > 6) { - if (url[url.length()-6]=='.') retVal = true; - } - } - } + if (url.length() > 6) { + if (url[url.length()-6]=='.') retVal = true; + } + } + } - return retVal; + return retVal; } void Fast_HTTPServer::PushHtml(const string & url, Fast_HTTPConnection& conn) { - // Add base dir to relative path and file name - string fileName = _baseDir + url; + // Add base dir to relative path and file name + string fileName = _baseDir + url; - FastOS_File file; + FastOS_File file; - if (file.OpenReadOnly(fileName.c_str())) { - conn.OutputFile(&file); - } else { - OutputNotFound(conn, &url, false); - } + if (file.OpenReadOnly(fileName.c_str())) { + conn.OutputFile(&file); + } else { + OutputNotFound(conn, &url, false); + } - file.Close(); + file.Close(); } void Fast_HTTPServer::HandleFileRequest(const string & url, Fast_HTTPConnection& conn) { - string status403; - vespalib::string upRelative(FastOS_File::GetPathSeparator()); - upRelative += ".."; - upRelative += FastOS_File::GetPathSeparator(); - vespalib::string upRelative2("/../"); - - bool isUpRelative = - _allowUpRelativePath == false && - (vespalib::contains(url, upRelative) || - vespalib::contains(url, upRelative2) || - vespalib::starts_with(url, "../") || - vespalib::starts_with(url, "..\\")); - - // Security policy: - // Do not allow file requests if _baseDir is not set. - // Do not allow UpRelative paths if not explicitly enabled with - // SetAllowUpRelativePath(true); - if (_baseDir.length() == 0 || isUpRelative ) { - conn.Output(conn.GetHTTPVersion().c_str()); - conn.Output(" 403 FORBIDDEN\r\n"); - conn.Output("Server: FAST-HTTP-Server/1.0 (Fast Generic HTTP server)\r\n"); - conn.Output("Content-Type: text/html\r\n"); - conn.Output("Connection: close\r\n"); - - status403.append(" \r\n"); - status403.append(" \r\n"); - status403.append("Error 403 \r\n"); - status403.append(" \r\n"); - status403.append(" \r\n"); - status403.append("

HTTP Error 403

\r\n"); - status403.append("

403 Forbidden

\r\n"); - status403.append("\r\n\r\n"); - - conn.Output(vespalib::make_string("Content-Length: %ld\r\n\r\n", status403.length()).c_str()); - conn.Output(status403.c_str()); - return; - } - - // Add base dir to relative path and file name - string fileName = _baseDir + url; - - FastOS_File file; - - if (file.OpenReadOnly(fileName.c_str())) { - bool contentTypeKnown = false; - - conn.Output(conn.GetHTTPVersion().c_str()); - conn.Output(" 200 OK\r\n"); - conn.Output("Server: FAST-HTTP-Server/1.0 (Fast Generic HTTP server)\r\n"); - conn.Output("Content-Length: "); - conn.Output(vespalib::make_string("%ld", file.GetSize()).c_str()); - conn.Output("\r\n"); - - if (conn.GetKeepAlive() == false) + string status403; + vespalib::string upRelative(FastOS_File::GetPathSeparator()); + upRelative += ".."; + upRelative += FastOS_File::GetPathSeparator(); + vespalib::string upRelative2("/../"); + + bool isUpRelative = + _allowUpRelativePath == false && + (vespalib::contains(url, upRelative) || + vespalib::contains(url, upRelative2) || + vespalib::starts_with(url, "../") || + vespalib::starts_with(url, "..\\")); + + // Security policy: + // Do not allow file requests if _baseDir is not set. + // Do not allow UpRelative paths if not explicitly enabled with + // SetAllowUpRelativePath(true); + if (_baseDir.length() == 0 || isUpRelative ) { + conn.Output(conn.GetHTTPVersion().c_str()); + conn.Output(" 403 FORBIDDEN\r\n"); + conn.Output("Server: FAST-HTTP-Server/1.0 (Fast Generic HTTP server)\r\n"); + conn.Output("Content-Type: text/html\r\n"); conn.Output("Connection: close\r\n"); - if (ends_with(url, ".gif")) { - conn.Output("Content-Type: image/gif\r\n"); - contentTypeKnown = true; - } + status403.append(" \r\n"); + status403.append(" \r\n"); + status403.append("Error 403 \r\n"); + status403.append(" \r\n"); + status403.append(" \r\n"); + status403.append("

HTTP Error 403

\r\n"); + status403.append("

403 Forbidden

\r\n"); + status403.append("\r\n\r\n"); + + conn.Output(vespalib::make_string("Content-Length: %ld\r\n\r\n", status403.length()).c_str()); + conn.Output(status403.c_str()); + return; + } + + // Add base dir to relative path and file name + string fileName = _baseDir + url; - if (ends_with(url, ".html") || ends_with(url, ".htm")) { - conn.Output("Content-Type: text/html\r\n"); - contentTypeKnown = true; - } + FastOS_File file; - if (ends_with(url, ".jpeg") || ends_with(url, ".jpg")) { - conn.Output("Content-Type: image/jpeg\r\n"); - contentTypeKnown = true; - } + if (file.OpenReadOnly(fileName.c_str())) { + bool contentTypeKnown = false; - if (!contentTypeKnown) { - conn.Output("Content-Type: application/octet-stream\r\n"); - } + conn.Output(conn.GetHTTPVersion().c_str()); + conn.Output(" 200 OK\r\n"); + conn.Output("Server: FAST-HTTP-Server/1.0 (Fast Generic HTTP server)\r\n"); + conn.Output("Content-Length: "); + conn.Output(vespalib::make_string("%ld", file.GetSize()).c_str()); + conn.Output("\r\n"); - conn.Output("\r\n"); - conn.OutputFile(&file); + if (conn.GetKeepAlive() == false) + conn.Output("Connection: close\r\n"); - } else { - OutputNotFound(conn, &url); - } + if (ends_with(url, ".gif")) { + conn.Output("Content-Type: image/gif\r\n"); + contentTypeKnown = true; + } + + if (ends_with(url, ".html") || ends_with(url, ".htm")) { + conn.Output("Content-Type: text/html\r\n"); + contentTypeKnown = true; + } - file.Close(); + if (ends_with(url, ".jpeg") || ends_with(url, ".jpg")) { + conn.Output("Content-Type: image/jpeg\r\n"); + contentTypeKnown = true; + } + + if (!contentTypeKnown) { + conn.Output("Content-Type: application/octet-stream\r\n"); + } + + conn.Output("\r\n"); + conn.OutputFile(&file); + + } else { + OutputNotFound(conn, &url); + } + + file.Close(); } void Fast_HTTPServer::SetBaseDir(const char *baseDir) { - _runningMutex.Lock(); - if (!_isRunning) { - _baseDir = baseDir; - - if (_baseDir.length() > 0) { - // Add '/' if it was not supplied - if (_baseDir[_baseDir.length()-1] != '/') { - _baseDir.append("/"); - } + _runningMutex.Lock(); + if (!_isRunning) { + _baseDir = baseDir; + + if (_baseDir.length() > 0) { + // Add '/' if it was not supplied + if (_baseDir[_baseDir.length()-1] != '/') { + _baseDir.append("/"); + } + } + } else { + fprintf(stderr, "HTTPServer: Tried to set base dir after the server had been started. Request denied.\r\n"); } - } else { - fprintf(stderr, "HTTPServer: Tried to set base dir after the server had been started. Request denied.\r\n"); - } - _runningMutex.Unlock(); + _runningMutex.Unlock(); } void Fast_HTTPServer::SetAllowUpRelativePath(bool allowUpRelativePath) { - _allowUpRelativePath = allowUpRelativePath; + _allowUpRelativePath = allowUpRelativePath; } bool Fast_HTTPServer::GetAllowUpRelativePath() { - return _allowUpRelativePath; + return _allowUpRelativePath; } @@ -1068,64 +1068,64 @@ Fast_HTTPConnection::Fast_HTTPConnection(Fast_Socket *sock, bool decode, size_t inBufSize, size_t outBufSize) - : _decode(decode), - _socket(sock), - _input(NULL), - _output(NULL), - _server(NULL), - _chunkedInput(false), - _chunkedOutput(false), - _keepAlive(true), // Per default, keepalive is true for HTTP/1.1 - _auth_user(), - _auth_pass(), - _versionMajor(1), // Default HTTP version is 1.1 - _versionMinor(1), - _httpVersion(), - _cookies() + : _decode(decode), + _socket(sock), + _input(NULL), + _output(NULL), + _server(NULL), + _chunkedInput(false), + _chunkedOutput(false), + _keepAlive(true), // Per default, keepalive is true for HTTP/1.1 + _auth_user(), + _auth_pass(), + _versionMajor(1), // Default HTTP version is 1.1 + _versionMinor(1), + _httpVersion(), + _cookies() { - _input = new Fast_BufferedInputStream(*_socket, inBufSize); - _output = new Fast_BufferedOutputStream(*_socket, outBufSize); + _input = new Fast_BufferedInputStream(*_socket, inBufSize); + _output = new Fast_BufferedOutputStream(*_socket, outBufSize); - _httpVersion = vespalib::make_string("HTTP/%d.%d", _versionMajor, _versionMinor); + _httpVersion = vespalib::make_string("HTTP/%d.%d", _versionMajor, _versionMinor); } Fast_HTTPConnection::~Fast_HTTPConnection(void) { - if (_server) { - _server->RemoveConnection(this); - } + if (_server) { + _server->RemoveConnection(this); + } - delete _input; - delete _output; - delete _socket; + delete _input; + delete _output; + delete _socket; } void Fast_HTTPConnection::OutputFile(FastOS_FileInterface *file) { - const int bufferSize = 2048; - char buffer[bufferSize]; - int bytesRead; - - file->SetPosition (0); // Try to read from start of file - - while ((bytesRead=file->Read(buffer, 2048)) > 0) { - ssize_t bytesLeft = bytesRead; - char * bufferPos = buffer; - - while (bytesLeft > 0) { - ssize_t numBytesWritten = _output->Write(bufferPos, bytesLeft); - if (numBytesWritten >= 0) { - bufferPos += numBytesWritten; - bytesLeft -= numBytesWritten; - } else { - return; - } - } - } + const int bufferSize = 2048; + char buffer[bufferSize]; + int bytesRead; + + file->SetPosition (0); // Try to read from start of file + + while ((bytesRead=file->Read(buffer, 2048)) > 0) { + ssize_t bytesLeft = bytesRead; + char * bufferPos = buffer; + + while (bytesLeft > 0) { + ssize_t numBytesWritten = _output->Write(bufferPos, bytesLeft); + if (numBytesWritten >= 0) { + bufferPos += numBytesWritten; + bytesLeft -= numBytesWritten; + } else { + return; + } + } + } } @@ -1134,64 +1134,64 @@ void Fast_HTTPServer::OutputNotFound(Fast_HTTPConnection& conn, const string *url /* = NULL */, bool addHeaders /* = true */) { - string status404; + string status404; - if (addHeaders) { - conn.Output(conn.GetHTTPVersion().c_str()); - conn.Output(" 404 Not Found\r\n"); - conn.Output("Server: FAST-HTTP-Server/1.0 (Fast Generic HTTP server)\r\n"); - conn.Output("Content-Type: text/html\r\n"); + if (addHeaders) { + conn.Output(conn.GetHTTPVersion().c_str()); + conn.Output(" 404 Not Found\r\n"); + conn.Output("Server: FAST-HTTP-Server/1.0 (Fast Generic HTTP server)\r\n"); + conn.Output("Content-Type: text/html\r\n"); - status404.append(" \r\n"); - status404.append(" \r\n"); - status404.append("Error 404 \r\n"); - status404.append("\r\n"); - status404.append("\r\n"); - status404.append(" \r\n"); - status404.append(" \r\n"); + status404.append(" \r\n"); + status404.append(" \r\n"); + status404.append("Error 404 \r\n"); + status404.append("\r\n"); + status404.append("\r\n"); + status404.append(" \r\n"); + status404.append(" \r\n"); - status404.append("

HTTP Error 404

\r\n"); - status404.append("

404 Not Found

\r\n"); + status404.append("

HTTP Error 404

\r\n"); + status404.append("

404 Not Found

\r\n"); - } + } - if (url == NULL) - status404.append("

The Web server cannot find the file or script you asked for.

\r\n"); - else - status404.append(vespalib::make_string("

The Web server cannot find %s.

\r\n", url->c_str())); + if (url == NULL) + status404.append("

The Web server cannot find the file or script you asked for.

\r\n"); + else + status404.append(vespalib::make_string("

The Web server cannot find %s.

\r\n", url->c_str())); - status404.append("

Please check the URL to ensure that the path is correct.

\r\n"); - status404.append("

Contact the server's administrator if this problem persists.

\r\n"); + status404.append("

Please check the URL to ensure that the path is correct.

\r\n"); + status404.append("

Contact the server's administrator if this problem persists.

\r\n"); - if (addHeaders) { - status404.append(" \r\n"); - status404.append(" \r\n\r\n"); + if (addHeaders) { + status404.append(" \r\n"); + status404.append(" \r\n\r\n"); - conn.Output(vespalib::make_string("Content-Length: %ld\r\n\r\n", status404.length()).c_str()); - } + conn.Output(vespalib::make_string("Content-Length: %ld\r\n\r\n", status404.length()).c_str()); + } - conn.Output(status404.c_str()); + conn.Output(status404.c_str()); } void Fast_HTTPServer::AddConnection(Fast_HTTPConnection* connection) { - _connectionCond.Lock(); - _connections.Insert(connection); - _connectionCond.Unlock(); + _connectionCond.Lock(); + _connections.Insert(connection); + _connectionCond.Unlock(); } void Fast_HTTPServer::RemoveConnection(Fast_HTTPConnection* connection) { - _connectionCond.Lock(); - _connections.RemoveElement(connection); - _connectionCond.Signal(); - _connectionCond.Unlock(); + _connectionCond.Lock(); + _connections.RemoveElement(connection); + _connectionCond.Signal(); + _connectionCond.Unlock(); } void Fast_HTTPConnection::Interrupt() { - _socket->Interrupt(); + _socket->Interrupt(); } diff --git a/fastlib/src/vespa/fastlib/net/httpserver.h b/fastlib/src/vespa/fastlib/net/httpserver.h index f23650d434f..edc1078ae6f 100644 --- a/fastlib/src/vespa/fastlib/net/httpserver.h +++ b/fastlib/src/vespa/fastlib/net/httpserver.h @@ -61,10 +61,10 @@ class Fast_HTTPServer; class Fast_HTTPConnection : public FastOS_Runnable { private: - Fast_HTTPConnection(const Fast_HTTPConnection&); - Fast_HTTPConnection& operator=(const Fast_HTTPConnection&); + Fast_HTTPConnection(const Fast_HTTPConnection&); + Fast_HTTPConnection& operator=(const Fast_HTTPConnection&); - protected: +protected: bool _decode; // Decode incoming URLs? Fast_Socket *_socket; @@ -83,7 +83,7 @@ private: vespalib::string _httpVersion; vespalib::string _cookies; - public: +public: Fast_HTTPConnection(Fast_Socket *sock, bool decode = true, @@ -121,19 +121,19 @@ private: class Fast_HTTPServerSocketFactory : public FastOS_SocketFactory { - private: - int _readTimeout; // Timeout value for reads. +private: + int _readTimeout; // Timeout value for reads. - public: +public: - Fast_HTTPServerSocketFactory(int readTimeout = -1 /* no timeout */) - : _readTimeout(readTimeout) {} + Fast_HTTPServerSocketFactory(int readTimeout = -1 /* no timeout */) + : _readTimeout(readTimeout) {} /** - * Create a streaming socket object - */ + * Create a streaming socket object + */ FastOS_SocketInterface *CreateSocket() override { - return new Fast_Socket(_readTimeout); + return new Fast_Socket(_readTimeout); } }; @@ -155,11 +155,11 @@ class Fast_HTTPServerSocketFactory : public FastOS_SocketFactory class Fast_HTTPServer : public FastOS_Runnable { private: - Fast_HTTPServer(const Fast_HTTPServer&); - Fast_HTTPServer& operator=(const Fast_HTTPServer&); + Fast_HTTPServer(const Fast_HTTPServer&); + Fast_HTTPServer& operator=(const Fast_HTTPServer&); - Fast_Bag _connections; - FastOS_Cond _connectionCond; + Fast_Bag _connections; + FastOS_Cond _connectionCond; protected: typedef vespalib::string string; @@ -211,7 +211,7 @@ protected: int Listen(void); - public: +public: Fast_HTTPServer(int portNumber, const char* strictBindHostName = NULL, int backlog = 10, bool decode = true, @@ -296,12 +296,12 @@ protected: * to the client. */ virtual void OnPostRequest( const string & url, - const string & host, - const string & contentType, - int contentLength, - Fast_HTTPConnection& conn, - Fast_InputStream& inputStream, - Fast_OutputStream& outputStream); + const string & host, + const string & contentType, + int contentLength, + Fast_HTTPConnection& conn, + Fast_InputStream& inputStream, + Fast_OutputStream& outputStream); /** * Callback for receiving all data from a PUT request, and writing @@ -323,12 +323,12 @@ protected: * to the client. */ virtual void OnPutRequest( const string & url, - const string & host, - const string & contentType, - int contentLength, - Fast_HTTPConnection& conn, - Fast_InputStream& inputStream, - Fast_OutputStream& outputStream); + const string & host, + const string & contentType, + int contentLength, + Fast_HTTPConnection& conn, + Fast_InputStream& inputStream, + Fast_OutputStream& outputStream); /** * Callback for receiving all headers for a DELETE request, and writing @@ -365,6 +365,3 @@ protected: void RemoveConnection(Fast_HTTPConnection* connection); }; - - - diff --git a/fastlib/src/vespa/fastlib/net/socket.cpp b/fastlib/src/vespa/fastlib/net/socket.cpp index d9a6c910e4c..1c7d915dc10 100644 --- a/fastlib/src/vespa/fastlib/net/socket.cpp +++ b/fastlib/src/vespa/fastlib/net/socket.cpp @@ -9,52 +9,52 @@ Fast_Socket::~Fast_Socket() bool Fast_Socket::Close(void) { - return FastOS_Socket::Close(); + return FastOS_Socket::Close(); } ssize_t Fast_Socket::Read(void* targetBuffer, size_t bufferSize) { - bool oldReadEventEnabled = _readEventEnabled; - FastOS_SocketEvent* oldSocketEvent = _socketEvent; - void* oldEventAttribute = _eventAttribute; - bool err = false; - bool eventOcc = false; - ssize_t rtrn = -1; + bool oldReadEventEnabled = _readEventEnabled; + FastOS_SocketEvent* oldSocketEvent = _socketEvent; + void* oldEventAttribute = _eventAttribute; + bool err = false; + bool eventOcc = false; + ssize_t rtrn = -1; - errno = 0; - _lastReadTimedOut = false; + errno = 0; + _lastReadTimedOut = false; - if (_event.GetCreateSuccess() == false) - return rtrn; + if (_event.GetCreateSuccess() == false) + return rtrn; - if (SetSocketEvent(&_event) == true) - { - EnableReadEvent(true); - eventOcc = _event.Wait(err, _readTimeout); - if (eventOcc == true && err == false) - { - rtrn = FastOS_Socket::Read(targetBuffer, bufferSize); - _eof = (rtrn == 0); - } - else if(!eventOcc && !err) + if (SetSocketEvent(&_event) == true) { - _lastReadTimedOut = true; + EnableReadEvent(true); + eventOcc = _event.Wait(err, _readTimeout); + if (eventOcc == true && err == false) + { + rtrn = FastOS_Socket::Read(targetBuffer, bufferSize); + _eof = (rtrn == 0); + } + else if(!eventOcc && !err) + { + _lastReadTimedOut = true; + } } - } - SetSocketEvent(oldSocketEvent, oldEventAttribute); + SetSocketEvent(oldSocketEvent, oldEventAttribute); - if (oldSocketEvent != 0) - EnableReadEvent(oldReadEventEnabled); + if (oldSocketEvent != 0) + EnableReadEvent(oldReadEventEnabled); - return rtrn; + return rtrn; } void Fast_Socket::Interrupt() { - _event.AsyncWakeUp(); + _event.AsyncWakeUp(); } ssize_t diff --git a/fastlib/src/vespa/fastlib/net/socket.h b/fastlib/src/vespa/fastlib/net/socket.h index f7fa9c9457c..f784c4d606c 100644 --- a/fastlib/src/vespa/fastlib/net/socket.h +++ b/fastlib/src/vespa/fastlib/net/socket.h @@ -10,15 +10,15 @@ class Fast_Socket : public FastOS_Socket, public Fast_OutputStream { private: - Fast_Socket(const Fast_Socket&); - Fast_Socket& operator=(const Fast_Socket&); + Fast_Socket(const Fast_Socket&); + Fast_Socket& operator=(const Fast_Socket&); - FastOS_SocketEvent _event; - int _readTimeout; - bool _lastReadTimedOut; - bool _eof; + FastOS_SocketEvent _event; + int _readTimeout; + bool _lastReadTimedOut; + bool _eof; - public: +public: /** * The Fast_Socket constructor creates a new socket instance @@ -55,9 +55,3 @@ private: void Interrupt(); }; - - - - - - diff --git a/fastlib/src/vespa/fastlib/net/tests/httpheaderparsertest.cpp b/fastlib/src/vespa/fastlib/net/tests/httpheaderparsertest.cpp index 5c8f8d4d8f2..8124ed63966 100644 --- a/fastlib/src/vespa/fastlib/net/tests/httpheaderparsertest.cpp +++ b/fastlib/src/vespa/fastlib/net/tests/httpheaderparsertest.cpp @@ -6,40 +6,40 @@ class HeaderReaderApp : public FastOS_Application { - public: +public: int Main() override { - if (_argc != 2) - { - fprintf(stderr, "Usage: %s
\n", _argv[0]); - return 1; - } - Fast_FileInputStream fileinput(_argv[1]); - Fast_BufferedInputStream input(fileinput, 32768); - Fast_HTTPHeaderParser headerParser(input); - - const char *headerName, *headerValue; - while (headerParser.ReadHeader(headerName, headerValue)) - { - printf("Header name: \"%s\"\n", headerName); - printf("Header value: \"%s\"\n", headerValue); - printf("\n"); - } - - char buffer[1024]; - size_t bytesRead = 0; - ssize_t lastRead; - printf("------> Remaining data in file: <------\n"); - while ((lastRead = input.Read(buffer, sizeof(buffer))) > 0) - { - fwrite(buffer, 1, lastRead, stdout); - bytesRead += lastRead; - } - printf("------> End of remaining data <--------\n"); - printf("Total remaining data: %u bytes\n", - static_cast(bytesRead)); - - return 0; + if (_argc != 2) + { + fprintf(stderr, "Usage: %s
\n", _argv[0]); + return 1; + } + Fast_FileInputStream fileinput(_argv[1]); + Fast_BufferedInputStream input(fileinput, 32768); + Fast_HTTPHeaderParser headerParser(input); + + const char *headerName, *headerValue; + while (headerParser.ReadHeader(headerName, headerValue)) + { + printf("Header name: \"%s\"\n", headerName); + printf("Header value: \"%s\"\n", headerValue); + printf("\n"); + } + + char buffer[1024]; + size_t bytesRead = 0; + ssize_t lastRead; + printf("------> Remaining data in file: <------\n"); + while ((lastRead = input.Read(buffer, sizeof(buffer))) > 0) + { + fwrite(buffer, 1, lastRead, stdout); + bytesRead += lastRead; + } + printf("------> End of remaining data <--------\n"); + printf("Total remaining data: %u bytes\n", + static_cast(bytesRead)); + + return 0; } }; @@ -48,8 +48,7 @@ class HeaderReaderApp : public FastOS_Application int main (int argc, char *argv[]) { - HeaderReaderApp app; + HeaderReaderApp app; - return app.Entry(argc, argv); + return app.Entry(argc, argv); } - diff --git a/fastlib/src/vespa/fastlib/net/url.cpp b/fastlib/src/vespa/fastlib/net/url.cpp index 6019d0d9932..4d3f82c0770 100644 --- a/fastlib/src/vespa/fastlib/net/url.cpp +++ b/fastlib/src/vespa/fastlib/net/url.cpp @@ -23,44 +23,44 @@ void Fast_URL::decode(const char *encodedURL, char *decodedURL, int bufsize) { - const char *tmpPtr; - unsigned int charVal; - char *bufend = decodedURL + bufsize; + const char *tmpPtr; + unsigned int charVal; + char *bufend = decodedURL + bufsize; - tmpPtr = encodedURL; + tmpPtr = encodedURL; - /* Parse the whole encodedURL */ - while(decodedURL < bufend && *tmpPtr != '\0') { - /* Check if an encoded character is the next one */ - if(*tmpPtr == '%') { - tmpPtr++; /* Skip % character */ - sscanf(tmpPtr,"%02X", &charVal); - *decodedURL = static_cast(charVal); - tmpPtr += 2; + /* Parse the whole encodedURL */ + while(decodedURL < bufend && *tmpPtr != '\0') { + /* Check if an encoded character is the next one */ + if(*tmpPtr == '%') { + tmpPtr++; /* Skip % character */ + sscanf(tmpPtr,"%02X", &charVal); + *decodedURL = static_cast(charVal); + tmpPtr += 2; + } + else + { + *decodedURL = *tmpPtr; + tmpPtr++; + } + decodedURL++; } - else - { - *decodedURL = *tmpPtr; - tmpPtr++; - } - decodedURL++; - } - if (decodedURL < bufend) - *decodedURL = '\0'; + if (decodedURL < bufend) + *decodedURL = '\0'; } int Fast_URL::DecodeQueryString(char *queryString) { - int numReplaced = 0; + int numReplaced = 0; - for(int i=0; queryString[i] != '\0'; i++) - { - if (queryString[i] == '+') + for(int i=0; queryString[i] != '\0'; i++) { - queryString[i] = ' '; - numReplaced ++; + if (queryString[i] == '+') + { + queryString[i] = ' '; + numReplaced ++; + } } - } - return numReplaced; + return numReplaced; } diff --git a/fastlib/src/vespa/fastlib/net/url.h b/fastlib/src/vespa/fastlib/net/url.h index 78214cfbe57..3ecc3e999b9 100644 --- a/fastlib/src/vespa/fastlib/net/url.h +++ b/fastlib/src/vespa/fastlib/net/url.h @@ -19,14 +19,10 @@ class Fast_URL { - public: +public: void decode(const char *encodedURL, char *unencodedURL, int bufsize); /* bufsize is the length of the unencodedURL buffer */ /* Both methods return the number of chars replaced */ int DecodeQueryString(char *queryString); }; - - - - diff --git a/fastlib/src/vespa/fastlib/testsuite/suite.h b/fastlib/src/vespa/fastlib/testsuite/suite.h index 9ea242bb84d..9ba3fee163b 100644 --- a/fastlib/src/vespa/fastlib/testsuite/suite.h +++ b/fastlib/src/vespa/fastlib/testsuite/suite.h @@ -78,57 +78,57 @@ class TestSuiteError; class Suite { public: - Suite(const std::string& name, std::ostream* osptr = 0); + Suite(const std::string& name, std::ostream* osptr = 0); - std::string GetName() const; - long GetNumPassed() const; - long GetNumFailed() const; - const std::ostream* GetStream() const; - void SetStream(std::ostream* osptr); + std::string GetName() const; + long GetNumPassed() const; + long GetNumFailed() const; + const std::ostream* GetStream() const; + void SetStream(std::ostream* osptr); - void AddTest(Test* t); //throw (TestSuiteError); - void AddSuite(const Suite&); //throw(TestSuiteError); - void Run(); // Calls Test::run() repeatedly - long Report() const; - void Free(); // deletes tests - virtual ~Suite(void) { } + void AddTest(Test* t); //throw (TestSuiteError); + void AddSuite(const Suite&); //throw(TestSuiteError); + void Run(); // Calls Test::run() repeatedly + long Report() const; + void Free(); // deletes tests + virtual ~Suite(void) { } private: - std::string m_name; - std::ostream* m_osptr; - std::vector m_tests; - void Reset(); - int GetLongestName() const; - - // Disallowed ops: - Suite(const Suite&); - Suite& operator=(const Suite&); + std::string m_name; + std::ostream* m_osptr; + std::vector m_tests; + void Reset(); + int GetLongestName() const; + + // Disallowed ops: + Suite(const Suite&); + Suite& operator=(const Suite&); }; inline Suite::Suite(const std::string& name, std::ostream* osptr) - : m_name(name), - m_osptr(osptr), - m_tests() + : m_name(name), + m_osptr(osptr), + m_tests() { } inline std::string Suite::GetName() const { - return m_name; + return m_name; } inline const std::ostream* Suite::GetStream() const { - return m_osptr; + return m_osptr; } inline void Suite::SetStream(std::ostream* osptr) { - m_osptr = osptr; + m_osptr = osptr; } @@ -142,127 +142,124 @@ void Suite::SetStream(std::ostream* osptr) void Suite::AddTest(Test* t) //throw(TestSuiteError) { - // Make sure test has a stream: - if (t == 0) {} - //throw TestSuiteError("Null test in Suite::addTest"); - else if (m_osptr != 0 && t->GetStream() == 0) - t->SetStream(m_osptr); - - m_tests.push_back(t); - t->Reset(); + // Make sure test has a stream: + if (t == 0) {} + //throw TestSuiteError("Null test in Suite::addTest"); + else if (m_osptr != 0 && t->GetStream() == 0) + t->SetStream(m_osptr); + + m_tests.push_back(t); + t->Reset(); } void Suite::AddSuite(const Suite& s) //throw(TestSuiteError) { - for (size_t i = 0; i < s.m_tests.size(); ++i) - AddTest(s.m_tests[i]); + for (size_t i = 0; i < s.m_tests.size(); ++i) + AddTest(s.m_tests[i]); } void Suite::Free() { - // This is not a destructor because tests - // don't have to be on the heap. - for (size_t i = 0; i < m_tests.size(); ++i) - { - delete m_tests[i]; - m_tests[i] = 0; - } + // This is not a destructor because tests + // don't have to be on the heap. + for (size_t i = 0; i < m_tests.size(); ++i) + { + delete m_tests[i]; + m_tests[i] = 0; + } } void Suite::Run() { - Reset(); - int longestName = GetLongestName(); - const char *nm; - int x = 0; - for (size_t i = 0; i < m_tests.size(); ++i) { - assert(m_tests[i]); - nm = m_tests[i]->get_name(); - if (nm) { - *m_osptr << std::endl << nm << ": "; - for (x = longestName - strlen(nm); x > 0; --x) - *m_osptr << ' '; - *m_osptr << std::flush; + Reset(); + int longestName = GetLongestName(); + const char *nm; + int x = 0; + for (size_t i = 0; i < m_tests.size(); ++i) { + assert(m_tests[i]); + nm = m_tests[i]->get_name(); + if (nm) { + *m_osptr << std::endl << nm << ": "; + for (x = longestName - strlen(nm); x > 0; --x) + *m_osptr << ' '; + *m_osptr << std::flush; + } + m_tests[i]->Run(); } - m_tests[i]->Run(); - } } // Find the longest test name int Suite::GetLongestName() const { - int longestName = 0, len = 0; - const char *nm; - for (size_t i = 0; i < m_tests.size(); ++i) { - assert(m_tests[i]); - nm = m_tests[i]->get_name(); - if ( nm != NULL && (len = strlen(nm)) > longestName ) - longestName = len; - } - return longestName; + int longestName = 0, len = 0; + const char *nm; + for (size_t i = 0; i < m_tests.size(); ++i) { + assert(m_tests[i]); + nm = m_tests[i]->get_name(); + if ( nm != NULL && (len = strlen(nm)) > longestName ) + longestName = len; + } + return longestName; } long Suite::Report() const { - if (m_osptr) { - int longestName = GetLongestName(); - int lineLength = longestName + 8 + 16 + 10; - long totFail = 0; - int x = 0; - *m_osptr << std::endl << std::endl - << "Suite \"" << m_name << "\"" << std::endl; - for (x = 0; x < lineLength; ++x) - *m_osptr << '='; - *m_osptr << "="; - - // Write the individual reports - for (size_t i = 0; i < m_tests.size(); ++i) { - assert(m_tests[i]); - const char *nm = m_tests[i]->get_name(); - totFail += m_tests[i]->Report(longestName - - (nm ? strlen(nm) : longestName)); + if (m_osptr) { + int longestName = GetLongestName(); + int lineLength = longestName + 8 + 16 + 10; + long totFail = 0; + int x = 0; + *m_osptr << std::endl << std::endl + << "Suite \"" << m_name << "\"" << std::endl; + for (x = 0; x < lineLength; ++x) + *m_osptr << '='; + *m_osptr << "="; + + // Write the individual reports + for (size_t i = 0; i < m_tests.size(); ++i) { + assert(m_tests[i]); + const char *nm = m_tests[i]->get_name(); + totFail += m_tests[i]->Report(longestName - + (nm ? strlen(nm) : longestName)); + } + + for (x = 0; x < lineLength; ++x) + *m_osptr << '='; + *m_osptr << "=\n"; + return totFail; } - - for (x = 0; x < lineLength; ++x) - *m_osptr << '='; - *m_osptr << "=\n"; - return totFail; - } - else - return GetNumFailed(); + else + return GetNumFailed(); } long Suite::GetNumPassed() const { - long totPass = 0; - for (size_t i = 0; i < m_tests.size(); ++i) - { - assert(m_tests[i]); - totPass += m_tests[i]->GetNumPassed(); - } - return totPass; + long totPass = 0; + for (size_t i = 0; i < m_tests.size(); ++i) + { + assert(m_tests[i]); + totPass += m_tests[i]->GetNumPassed(); + } + return totPass; } long Suite::GetNumFailed() const { - long totFail = 0; - for (size_t i = 0; i < m_tests.size(); ++i) - { - assert(m_tests[i]); - totFail += m_tests[i]->GetNumFailed(); - } - return totFail; + long totFail = 0; + for (size_t i = 0; i < m_tests.size(); ++i) + { + assert(m_tests[i]); + totFail += m_tests[i]->GetNumFailed(); + } + return totFail; } void Suite::Reset() { - for (size_t i = 0; i < m_tests.size(); ++i) - { - assert(m_tests[i]); - m_tests[i]->Reset(); - } + for (size_t i = 0; i < m_tests.size(); ++i) + { + assert(m_tests[i]); + m_tests[i]->Reset(); + } } - - - diff --git a/fastlib/src/vespa/fastlib/testsuite/test.cpp b/fastlib/src/vespa/fastlib/testsuite/test.cpp index 3e5261d8222..dce4a24ea71 100644 --- a/fastlib/src/vespa/fastlib/testsuite/test.cpp +++ b/fastlib/src/vespa/fastlib/testsuite/test.cpp @@ -3,136 +3,135 @@ #include "test.h" Test::Test(std::ostream* osptr, const char*name) : - m_osptr(osptr), - name_(name), - m_nPass(0), - m_nFail(0), - m_index(0), - m_description() + m_osptr(osptr), + name_(name), + m_nPass(0), + m_nFail(0), + m_index(0), + m_description() { - m_pchar[0]= '|'; - m_pchar[1]= '-'; + m_pchar[0]= '|'; + m_pchar[1]= '-'; } Test::Test(const char*name) : - Test(nullptr, name) + Test(nullptr, name) { } const char *Test::get_name() const { - return (name_ == NULL) ? "Test " : name_; + return (name_ == NULL) ? "Test " : name_; } const std::string& Test::GetSourceDirectory() { - static const std::string srcDir = [] () { - std::string dir("."); - const char* env = getenv("SOURCE_DIRECTORY"); - if (env) { - dir = env; - } - if (*dir.rbegin() != '/') { - dir += "/"; - } - return dir; - } (); - return srcDir; + static const std::string srcDir = [] () { + std::string dir("."); + const char* env = getenv("SOURCE_DIRECTORY"); + if (env) { + dir = env; + } + if (*dir.rbegin() != '/') { + dir += "/"; + } + return dir; + } (); + return srcDir; } long Test::GetNumPassed() const { - return m_nPass; + return m_nPass; } long Test::GetNumFailed() const { - return m_nFail; + return m_nFail; } const std::ostream* Test::GetStream() const { - return m_osptr; + return m_osptr; } void Test::SetStream(std::ostream* osptr) { - m_osptr = osptr; + m_osptr = osptr; } void Test::_Succeed() { - ++m_nPass; + ++m_nPass; } void Test::Reset() { - m_nPass = m_nFail = 0; + m_nPass = m_nFail = 0; } void Test::PushDesc(const std::string& desc) { - m_description.push_back(desc); + m_description.push_back(desc); } void Test::PopDesc() { - m_description.pop_back(); + m_description.pop_back(); } size_t Test::print_desc() const { - std::copy(m_description.begin(), m_description.end(), - std::ostream_iterator(*m_osptr)); - return m_description.size(); + std::copy(m_description.begin(), m_description.end(), + std::ostream_iterator(*m_osptr)); + return m_description.size(); } void Test::print_progress() { - ++m_index; - m_index = m_index % 2; - *m_osptr << '\b' <<'\b' <<'\b'; - *m_osptr <<' ' << m_pchar[m_index] << ' ' << std::flush; + ++m_index; + m_index = m_index % 2; + *m_osptr << '\b' <<'\b' <<'\b'; + *m_osptr <<' ' << m_pchar[m_index] << ' ' << std::flush; } bool Test::do_fail(const std::string& lbl, const char* fname, long lineno, bool addEndl) { - ++m_nFail; - if (m_osptr) { - *m_osptr << std::endl - << fname << ':' << lineno << ": " - << get_name() << " failure: (" << lbl << ")" - << std::endl; - if (addEndl && print_desc() > 0) - *m_osptr << std::endl << std::endl; - } - return false; + ++m_nFail; + if (m_osptr) { + *m_osptr << std::endl + << fname << ':' << lineno << ": " + << get_name() << " failure: (" << lbl << ")" + << std::endl; + if (addEndl && print_desc() > 0) + *m_osptr << std::endl << std::endl; + } + return false; } bool Test::do_test(bool cond, const std::string& lbl, const char* fname, long lineno) { - if (!cond) { - return do_fail(lbl, fname, lineno); - } - else { - _Succeed(); - print_progress(); - return true; - } + if (!cond) { + return do_fail(lbl, fname, lineno); + } + else { + _Succeed(); + print_progress(); + return true; + } } long Test::Report(int padSpaces) const { - if (m_osptr) { - *m_osptr << std::endl << get_name(); + if (m_osptr) { + *m_osptr << std::endl << get_name(); - // Pad the name with the given number of spaces - for (int i= 0; i < padSpaces; ++i) *m_osptr << ' '; + // Pad the name with the given number of spaces + for (int i= 0; i < padSpaces; ++i) *m_osptr << ' '; - *m_osptr << "\tPassed: " << m_nPass - << "\tFailed: " << m_nFail - << std::endl; - } - return m_nFail; + *m_osptr << "\tPassed: " << m_nPass + << "\tFailed: " << m_nFail + << std::endl; + } + return m_nFail; } - diff --git a/fastlib/src/vespa/fastlib/testsuite/test.h b/fastlib/src/vespa/fastlib/testsuite/test.h index 02e05f48444..598a16da9c2 100644 --- a/fastlib/src/vespa/fastlib/testsuite/test.h +++ b/fastlib/src/vespa/fastlib/testsuite/test.h @@ -75,77 +75,77 @@ // (and it's impolite to usurp other users' functions!). // For consistency, _succeed() also has an underscore. #define _test(cond) do_test((cond), #cond, __FILE__, __LINE__) -#define _test_equal(lhs, rhs) \ - do_equality_test((lhs), (rhs), #lhs, __FILE__, __LINE__) +#define _test_equal(lhs, rhs) \ + do_equality_test((lhs), (rhs), #lhs, __FILE__, __LINE__) #define _fail(str) do_fail((str), __FILE__, __LINE__) class Test { public: - explicit Test(std::ostream* osptr = 0, const char *name = NULL); - explicit Test(const char *name); - virtual ~Test(){} - virtual void Run() = 0; + explicit Test(std::ostream* osptr = 0, const char *name = NULL); + explicit Test(const char *name); + virtual ~Test(){} + virtual void Run() = 0; - const char *get_name() const; - static const std::string& GetSourceDirectory(); - long GetNumPassed() const; - long GetNumFailed() const; - const std::ostream* GetStream() const; - void SetStream(std::ostream* osptr); + const char *get_name() const; + static const std::string& GetSourceDirectory(); + long GetNumPassed() const; + long GetNumFailed() const; + const std::ostream* GetStream() const; + void SetStream(std::ostream* osptr); - void _Succeed(); - long Report(int padSpaces = 1) const; - virtual void Reset(); + void _Succeed(); + long Report(int padSpaces = 1) const; + virtual void Reset(); - void PushDesc(const std::string& desc); - void PopDesc(); + void PushDesc(const std::string& desc); + void PopDesc(); protected: - std::ostream* m_osptr; - const char *name_; + std::ostream* m_osptr; + const char *name_; - bool do_test(bool cond, const std::string& lbl, - const char* fname, long lineno); - bool do_fail(const std::string& lbl, const char* fname, long lineno, - bool addEndl = true); - template - bool do_equality_test(const t1& lhs, const t2& rhs, - const char* lbl, const char* fname, long lineno); - virtual void print_progress(); + bool do_test(bool cond, const std::string& lbl, + const char* fname, long lineno); + bool do_fail(const std::string& lbl, const char* fname, long lineno, + bool addEndl = true); + template + bool do_equality_test(const t1& lhs, const t2& rhs, + const char* lbl, const char* fname, long lineno); + virtual void print_progress(); private: - long m_nPass; - long m_nFail; - int m_index; - char m_pchar[4]; + long m_nPass; + long m_nFail; + int m_index; + char m_pchar[4]; - std::vector m_description; + std::vector m_description; - size_t print_desc() const; + size_t print_desc() const; - // Disallowed: - Test(const Test&); - Test& operator=(const Test&); + // Disallowed: + Test(const Test&); + Test& operator=(const Test&); }; template bool Test::do_equality_test(const t1& lhs, const t2& rhs, const char* lbl, const char* fname, long lineno) { - if (lhs == rhs) { - _Succeed(); - print_progress(); - return true; - } - do_fail(std::string(lbl), fname, lineno, false); - if (m_osptr) { - *m_osptr << "Equality test failed: " - << "Expected '" << rhs - << "' got '" << lhs << "'" - << std::endl; - if (print_desc() > 0) - *m_osptr << std::endl << std::endl; - } - return false; + if (lhs == rhs) { + _Succeed(); + print_progress(); + return true; + } + do_fail(std::string(lbl), fname, lineno, false); + if (m_osptr) { + *m_osptr << "Equality test failed: " + << "Expected '" << rhs + << "' got '" << lhs << "'" + << std::endl; + if (print_desc() > 0) + *m_osptr << std::endl << std::endl; + } + return false; } diff --git a/fastlib/src/vespa/fastlib/text/apps/extcase.cpp b/fastlib/src/vespa/fastlib/text/apps/extcase.cpp index 3f3f27dcecd..1200465331c 100644 --- a/fastlib/src/vespa/fastlib/text/apps/extcase.cpp +++ b/fastlib/src/vespa/fastlib/text/apps/extcase.cpp @@ -26,153 +26,153 @@ char linebuf[1024]; static int hexval(char cp) { - if (cp >= '0' && cp <= '9') - return cp - '0'; - if (cp >= 'a' && cp <= 'f') - return cp - 'a' + 10; - if (cp >= 'A' && cp <= 'F') - return cp - 'A' + 10; - return -1; + if (cp >= '0' && cp <= '9') + return cp - '0'; + if (cp >= 'a' && cp <= 'f') + return cp - 'a' + 10; + if (cp >= 'A' && cp <= 'F') + return cp - 'A' + 10; + return -1; } void DumpCase(void) { - Fast_BufferedFile file; - unsigned int code; - int xpage, checkpage, allocpage; - - file.WriteOpen("unicodeutil-lowercase.cpp.NEW"); - - allocpage = 0; - for (xpage = 0; xpage < 256; xpage++) { - for (checkpage = (xpage == 0) ? 0 : 1; checkpage < xpage; checkpage++) { - for (code = 0; code < 256; code++) - if (lowercase[code + 256 * xpage] != lowercase[code + 256 * checkpage]) - break; - if (code >= 256) - break; + Fast_BufferedFile file; + unsigned int code; + int xpage, checkpage, allocpage; + + file.WriteOpen("unicodeutil-lowercase.cpp.NEW"); + + allocpage = 0; + for (xpage = 0; xpage < 256; xpage++) { + for (checkpage = (xpage == 0) ? 0 : 1; checkpage < xpage; checkpage++) { + for (code = 0; code < 256; code++) + if (lowercase[code + 256 * xpage] != lowercase[code + 256 * checkpage]) + break; + if (code >= 256) + break; + } + pages[xpage] = checkpage; + if (checkpage >= xpage) { + pageoff[xpage] = allocpage * 256; + allocpage++; + } else + pageoff[xpage] = pageoff[checkpage]; } - pages[xpage] = checkpage; - if (checkpage >= xpage) { - pageoff[xpage] = allocpage * 256; - allocpage++; - } else - pageoff[xpage] = pageoff[checkpage]; - } - printf("allocpage=%d\n", allocpage); - - file.WriteString("/*\n" - " * This file is auto-generated by extcase.cpp\n" - " */\n" - "\n" - "static unsigned short Fast_intCompLowerCase["); - file.addNum(256 * allocpage, 0, ' '); - file.WriteString("]={\n"); - for (xpage = 0; xpage < 256; xpage++) { - if (pages[xpage] == xpage) { - for (code = 0; code < 256; code++) { - if ((code & 7) == 0) - file.WriteString(" "); - file.WriteString("0x"); - file.addHexNum(lowercase[code + 256 * xpage], 4, '0'); - file.WriteString("u"); - if (code + 1 < static_cast(256 * allocpage)) - file.WriteString(","); - if ((code & 7) < 7) - file.WriteString(" "); - else - file.WriteString("\n"); - } + printf("allocpage=%d\n", allocpage); + + file.WriteString("/*\n" + " * This file is auto-generated by extcase.cpp\n" + " */\n" + "\n" + "static unsigned short Fast_intCompLowerCase["); + file.addNum(256 * allocpage, 0, ' '); + file.WriteString("]={\n"); + for (xpage = 0; xpage < 256; xpage++) { + if (pages[xpage] == xpage) { + for (code = 0; code < 256; code++) { + if ((code & 7) == 0) + file.WriteString(" "); + file.WriteString("0x"); + file.addHexNum(lowercase[code + 256 * xpage], 4, '0'); + file.WriteString("u"); + if (code + 1 < static_cast(256 * allocpage)) + file.WriteString(","); + if ((code & 7) < 7) + file.WriteString(" "); + else + file.WriteString("\n"); + } + } } - } - file.WriteString("};\n" - "\n" - "unsigned short *" - "Fast_UnicodeUtil::_compLowerCase[256]={\n"); - - for (xpage = 0; xpage < 256; xpage++) { - file.WriteString(" Fast_intCompLowerCase+0x"); - file.addHexNum(pageoff[xpage], 4, '0'); - if (xpage < 255) - file.WriteString(","); - else - file.WriteString(" "); - file.WriteString(" /* Page 0x"); - file.addHexNum(xpage, 2, '0'); - file.WriteString(" */\n"); - } - file.WriteString("};\n" - "\n" - "/* End of auto-generated file */\n"); - file.Close(); - - rename("unicodeutil-lowercase.cpp.NEW", "unicodeutil-lowercase.cpp"); + file.WriteString("};\n" + "\n" + "unsigned short *" + "Fast_UnicodeUtil::_compLowerCase[256]={\n"); + + for (xpage = 0; xpage < 256; xpage++) { + file.WriteString(" Fast_intCompLowerCase+0x"); + file.addHexNum(pageoff[xpage], 4, '0'); + if (xpage < 255) + file.WriteString(","); + else + file.WriteString(" "); + file.WriteString(" /* Page 0x"); + file.addHexNum(xpage, 2, '0'); + file.WriteString(" */\n"); + } + file.WriteString("};\n" + "\n" + "/* End of auto-generated file */\n"); + file.Close(); + + rename("unicodeutil-lowercase.cpp.NEW", "unicodeutil-lowercase.cpp"); } int main(int argc, char **argv) { - (void)argc; - (void)argv; - - Fast_BufferedFile file; - size_t len; - int lowcode, code, i, j; - bool badline; - int semcnt; - - file.ReadOpenExisting("UnicodeData-4.0.0.txt"); - - while (!file.Eof()) { - (void) file.ReadLine(linebuf, sizeof(linebuf)); - len = strlen(linebuf); - if (len > 0 && linebuf[len - 1] == '\n') - len--; - if (len > 0 && linebuf[len - 1] == '\r') - len--; - linebuf[len] = '\0'; - - badline = false; - if (hexval(linebuf[0]) >= 0) { - code = 0; - for (i = 0; i < 4; i++) { - if (hexval(linebuf[i]) < 0) - badline = true; - code = code * 16 + hexval(linebuf[i]); - } - - if (linebuf[4] == ';') { - semcnt = 0; - i = 4; - while (linebuf[i] != '\0') { - if (linebuf[i] == ';') { - semcnt++; - } - i++; - if (semcnt >= 13) - break; - } - lowcode = 0; - if (hexval(linebuf[i]) >= 0) { - for (j = 0; j < 4; j++) { - if (hexval(linebuf[i + j]) < 0) - badline = true; - lowcode = lowcode * 16 + hexval(linebuf[i + j]); - } - } else - badline = true; - if (!badline) { - lowercase[code] = lowcode; - } else { - } + (void)argc; + (void)argv; + + Fast_BufferedFile file; + size_t len; + int lowcode, code, i, j; + bool badline; + int semcnt; + + file.ReadOpenExisting("UnicodeData-4.0.0.txt"); + + while (!file.Eof()) { + (void) file.ReadLine(linebuf, sizeof(linebuf)); + len = strlen(linebuf); + if (len > 0 && linebuf[len - 1] == '\n') + len--; + if (len > 0 && linebuf[len - 1] == '\r') + len--; + linebuf[len] = '\0'; + + badline = false; + if (hexval(linebuf[0]) >= 0) { + code = 0; + for (i = 0; i < 4; i++) { + if (hexval(linebuf[i]) < 0) + badline = true; + code = code * 16 + hexval(linebuf[i]); + } + + if (linebuf[4] == ';') { + semcnt = 0; + i = 4; + while (linebuf[i] != '\0') { + if (linebuf[i] == ';') { + semcnt++; + } + i++; + if (semcnt >= 13) + break; + } + lowcode = 0; + if (hexval(linebuf[i]) >= 0) { + for (j = 0; j < 4; j++) { + if (hexval(linebuf[i + j]) < 0) + badline = true; + lowcode = lowcode * 16 + hexval(linebuf[i + j]); + } + } else + badline = true; + if (!badline) { + lowercase[code] = lowcode; + } else { + } - } + } + } } - } - file.Close(); + file.Close(); - DumpCase(); + DumpCase(); - exit(0); - return 0; + exit(0); + return 0; } diff --git a/fastlib/src/vespa/fastlib/text/apps/unicode_propertydump.cpp b/fastlib/src/vespa/fastlib/text/apps/unicode_propertydump.cpp index 639c493e0cf..a0ee05b9b5d 100644 --- a/fastlib/src/vespa/fastlib/text/apps/unicode_propertydump.cpp +++ b/fastlib/src/vespa/fastlib/text/apps/unicode_propertydump.cpp @@ -5,15 +5,15 @@ class UnicodePropertyDumpApp : public FastOS_Application { public: - virtual int Main(); + virtual int Main(); }; int UnicodePropertyDumpApp::Main() { - for (ucs4_t testchar = 0; testchar < 0x10000; testchar++) { - printf("%08x %04x\n", testchar, Fast_UnicodeUtil::GetProperty(testchar)); - } - return 0; + for (ucs4_t testchar = 0; testchar < 0x10000; testchar++) { + printf("%08x %04x\n", testchar, Fast_UnicodeUtil::GetProperty(testchar)); + } + return 0; } FASTOS_MAIN(UnicodePropertyDumpApp) diff --git a/fastlib/src/vespa/fastlib/text/apps/unicode_tolowerdump.cpp b/fastlib/src/vespa/fastlib/text/apps/unicode_tolowerdump.cpp index ca10ec0fc37..ffea4d735ba 100644 --- a/fastlib/src/vespa/fastlib/text/apps/unicode_tolowerdump.cpp +++ b/fastlib/src/vespa/fastlib/text/apps/unicode_tolowerdump.cpp @@ -5,15 +5,15 @@ class UnicodeToLowerDumpApp : public FastOS_Application { public: - virtual int Main(); + virtual int Main(); }; int UnicodeToLowerDumpApp::Main() { - for (ucs4_t testchar = 0; testchar < 0x10000; testchar++) { - printf("%08x %08x\n", testchar, Fast_UnicodeUtil::ToLower(testchar)); - } - return 0; + for (ucs4_t testchar = 0; testchar < 0x10000; testchar++) { + printf("%08x %08x\n", testchar, Fast_UnicodeUtil::ToLower(testchar)); + } + return 0; } FASTOS_MAIN(UnicodeToLowerDumpApp) diff --git a/fastlib/src/vespa/fastlib/text/latintokenizer.h b/fastlib/src/vespa/fastlib/text/latintokenizer.h index f15ef04f07d..1378b7d6299 100644 --- a/fastlib/src/vespa/fastlib/text/latintokenizer.h +++ b/fastlib/src/vespa/fastlib/text/latintokenizer.h @@ -51,77 +51,77 @@ template class Fast_LatinTokenizer { private: - Fast_LatinTokenizer(const Fast_LatinTokenizer &); - Fast_LatinTokenizer& operator=(const Fast_LatinTokenizer &); + Fast_LatinTokenizer(const Fast_LatinTokenizer &); + Fast_LatinTokenizer& operator=(const Fast_LatinTokenizer &); public: - /** Helper class. */ - class Fast_Token { - public: - - /** Member variables. */ - char *first; // Points to start of token. Named 'first' for std::pair compatibility. - char *second; // Points to end of token. Named 'second' for std::pair compatibility. - bool _punctuation; // Is the token a punctuation symbol? - - /** Constructors. */ - Fast_Token(char *begin, char *end, bool punctuation) : first(begin), second(end), _punctuation(punctuation) {} - Fast_Token() : first(NULL), second(NULL), _punctuation(false) {} - Fast_Token(const Fast_Token &other) - : first(other.first), - second(other.second), - _punctuation(other._punctuation) - { - } - Fast_Token& operator=(const Fast_Token &other) - { - first = other.first; - second = other.second; - _punctuation = other._punctuation; - return *this; - } - - }; - - /** Constructors/destructor. */ - Fast_LatinTokenizer(); - explicit Fast_LatinTokenizer(char *text); - Fast_LatinTokenizer(char *text, size_t length); - virtual ~Fast_LatinTokenizer(); - - /** Constructors, sort of. */ - void SetNewText(char *text); - void SetNewText(char *text, size_t length); - - /** Are there any more tokens left? */ - bool MoreTokens(); - - /** Return next token. */ - Fast_Token GetNextToken(); - - /** Return text buffer. */ - char *GetOriginalText(); - - /** Observers in case we need not perform some action specific - * to the IsSeparator or IsPunctuation implementations - * (such as extra initialization or statistics gathering or...) - */ - IsPunctuation& GetIsPunctuation() { return _isPunctuation; } - IsSeparator& GetIsSeparator() { return _isSeparator; } + /** Helper class. */ + class Fast_Token { + public: + + /** Member variables. */ + char *first; // Points to start of token. Named 'first' for std::pair compatibility. + char *second; // Points to end of token. Named 'second' for std::pair compatibility. + bool _punctuation; // Is the token a punctuation symbol? + + /** Constructors. */ + Fast_Token(char *begin, char *end, bool punctuation) : first(begin), second(end), _punctuation(punctuation) {} + Fast_Token() : first(NULL), second(NULL), _punctuation(false) {} + Fast_Token(const Fast_Token &other) + : first(other.first), + second(other.second), + _punctuation(other._punctuation) + { + } + Fast_Token& operator=(const Fast_Token &other) + { + first = other.first; + second = other.second; + _punctuation = other._punctuation; + return *this; + } + + }; + + /** Constructors/destructor. */ + Fast_LatinTokenizer(); + explicit Fast_LatinTokenizer(char *text); + Fast_LatinTokenizer(char *text, size_t length); + virtual ~Fast_LatinTokenizer(); + + /** Constructors, sort of. */ + void SetNewText(char *text); + void SetNewText(char *text, size_t length); + + /** Are there any more tokens left? */ + bool MoreTokens(); + + /** Return next token. */ + Fast_Token GetNextToken(); + + /** Return text buffer. */ + char *GetOriginalText(); + + /** Observers in case we need not perform some action specific + * to the IsSeparator or IsPunctuation implementations + * (such as extra initialization or statistics gathering or...) + */ + IsPunctuation& GetIsPunctuation() { return _isPunctuation; } + IsSeparator& GetIsSeparator() { return _isSeparator; } private: - /** Member variables. */ - char *_org; // Holds the original text buffer. - char *_next; // Points to the current buffer position. - char *_end; // Points to the end of the buffer. - bool _moreTokens; // More text to process? - IsSeparator _isSeparator; // Separator symbol predicate. - IsPunctuation _isPunctuation; // Punctuation symbol predicate. + /** Member variables. */ + char *_org; // Holds the original text buffer. + char *_next; // Points to the current buffer position. + char *_end; // Points to the end of the buffer. + bool _moreTokens; // More text to process? + IsSeparator _isSeparator; // Separator symbol predicate. + IsPunctuation _isPunctuation; // Punctuation symbol predicate. - /** Helper methods. */ - void SkipBlanks(); + /** Helper methods. */ + void SkipBlanks(); }; @@ -134,12 +134,12 @@ private: template Fast_LatinTokenizer::Fast_LatinTokenizer() : - _org(NULL), - _next(NULL), - _end(NULL), - _moreTokens(false), - _isSeparator(), - _isPunctuation() + _org(NULL), + _next(NULL), + _end(NULL), + _moreTokens(false), + _isSeparator(), + _isPunctuation() { } @@ -153,14 +153,14 @@ Fast_LatinTokenizer::Fast_LatinTokenizer() : template Fast_LatinTokenizer::Fast_LatinTokenizer(char *text) : - _org(NULL), - _next(NULL), - _end(NULL), - _moreTokens(false), - _isSeparator(), - _isPunctuation() + _org(NULL), + _next(NULL), + _end(NULL), + _moreTokens(false), + _isSeparator(), + _isPunctuation() { - SetNewText(text); + SetNewText(text); } /** @@ -174,14 +174,14 @@ Fast_LatinTokenizer::Fast_LatinTokenizer(char *text) template Fast_LatinTokenizer::Fast_LatinTokenizer(char *text, size_t length) - : _org(NULL), - _next(NULL), - _end(NULL), - _moreTokens(false), - _isSeparator(), - _isPunctuation() + : _org(NULL), + _next(NULL), + _end(NULL), + _moreTokens(false), + _isSeparator(), + _isPunctuation() { - SetNewText(text, length); + SetNewText(text, length); } /** @@ -207,10 +207,10 @@ template void Fast_LatinTokenizer::SetNewText(char *text) { - _org = text; - _next = text; - _moreTokens = text != NULL; - _end = NULL; + _org = text; + _next = text; + _moreTokens = text != NULL; + _end = NULL; } /** @@ -226,10 +226,10 @@ template void Fast_LatinTokenizer::SetNewText(char *text, size_t length) { - _org = text; - _next = text; - _moreTokens = text != NULL; - _end = (_next ? _next + length : NULL); + _org = text; + _next = text; + _moreTokens = text != NULL; + _end = (_next ? _next + length : NULL); } /** @@ -243,26 +243,26 @@ template void Fast_LatinTokenizer::SkipBlanks() { - if (!_moreTokens) return; - // Initialized with '\0' terminated buffer? - if (_end == NULL) { - while (*_next != '\0' && _isSeparator(*_next)) { - ++_next; + if (!_moreTokens) return; + // Initialized with '\0' terminated buffer? + if (_end == NULL) { + while (*_next != '\0' && _isSeparator(*_next)) { + ++_next; + } + if (*_next == '\0') { + _moreTokens = false; + } } - if (*_next == '\0') { - _moreTokens = false; - } - } - // Initialized with specified buffer length. - else { - while (_next != _end && _isSeparator(*_next)) { - ++_next; - } - if (_next == _end) { - _moreTokens = false; + // Initialized with specified buffer length. + else { + while (_next != _end && _isSeparator(*_next)) { + ++_next; + } + if (_next == _end) { + _moreTokens = false; + } } - } } @@ -276,8 +276,8 @@ Fast_LatinTokenizer::SkipBlanks() { template bool Fast_LatinTokenizer::MoreTokens() { - SkipBlanks(); - return _moreTokens; + SkipBlanks(); + return _moreTokens; } /** @@ -291,34 +291,34 @@ template typename Fast_LatinTokenizer::Fast_Token Fast_LatinTokenizer::GetNextToken() { - char *prev = _next; + char *prev = _next; - // Skip all blanks and flag if there are no more tokens. - SkipBlanks(); + // Skip all blanks and flag if there are no more tokens. + SkipBlanks(); - // Initialized with '\0' terminated buffer? Find the next blank or punctuation. - if (_end == NULL) { - while (*_next != '\0' && !_isSeparator(*_next) && !_isPunctuation(*_next)) { - ++_next; - } + // Initialized with '\0' terminated buffer? Find the next blank or punctuation. + if (_end == NULL) { + while (*_next != '\0' && !_isSeparator(*_next) && !_isPunctuation(*_next)) { + ++_next; + } - // Initialized with specified buffer length. - } else { - while (_next != _end && !_isSeparator(*_next) && !_isPunctuation(*_next)) { - ++_next; + // Initialized with specified buffer length. + } else { + while (_next != _end && !_isSeparator(*_next) && !_isPunctuation(*_next)) { + ++_next; + } } - } - // Check if this token is a punctuation symbol, and generate token. - bool isToken = ((_next - prev == 0) && _isPunctuation(*prev)); + // Check if this token is a punctuation symbol, and generate token. + bool isToken = ((_next - prev == 0) && _isPunctuation(*prev)); - if (isToken) { - ++_next; - } + if (isToken) { + ++_next; + } - Fast_Token token(prev, _next, isToken); + Fast_Token token(prev, _next, isToken); - return token; + return token; } @@ -332,7 +332,7 @@ Fast_LatinTokenizer::GetNextToken() { template char * Fast_LatinTokenizer::GetOriginalText() { - return _org; + return _org; } /** @@ -349,7 +349,7 @@ Fast_LatinTokenizer::GetOriginalText() { *****************************************************************************/ struct Fast_IsSpace { - bool operator()(char c) {return (isspace(static_cast(c)) != 0);} + bool operator()(char c) {return (isspace(static_cast(c)) != 0);} }; /** @@ -366,7 +366,7 @@ struct Fast_IsSpace { *****************************************************************************/ struct Fast_IsPunctuation { - bool operator()(char c) {return (ispunct(static_cast(c)) != 0);} + bool operator()(char c) {return (ispunct(static_cast(c)) != 0);} }; /** @@ -380,4 +380,3 @@ struct Fast_IsPunctuation { *****************************************************************************/ typedef Fast_LatinTokenizer Fast_SimpleLatinTokenizer; - diff --git a/fastlib/src/vespa/fastlib/text/normwordfolder.cpp b/fastlib/src/vespa/fastlib/text/normwordfolder.cpp index 94a2f8f2f28..93debb0a0e2 100644 --- a/fastlib/src/vespa/fastlib/text/normwordfolder.cpp +++ b/fastlib/src/vespa/fastlib/text/normwordfolder.cpp @@ -26,7 +26,7 @@ ucs4_t Fast_NormalizeWordFolder::_halfwidth_fullwidthMap[240]; void Fast_NormalizeWordFolder::Setup(uint32_t flags) { - // Only allow setting these when not initialized or initializing... + // Only allow setting these when not initialized or initializing... _initMutex.Lock(); _doAccentRemoval = (DO_ACCENT_REMOVAL & flags) != 0; // _doSmallToNormalKana = (DO_SMALL_TO_NORMAL_KANA & flags) != 0; @@ -44,675 +44,675 @@ Fast_NormalizeWordFolder::Setup(uint32_t flags) void Fast_NormalizeWordFolder::Initialize() { - unsigned int i; - if (!_isInitialized) { - _initMutex.Lock(); + unsigned int i; if (!_isInitialized) { + _initMutex.Lock(); + if (!_isInitialized) { - for (i = 0; i < 128; i++) - _isWord[i] = Fast_UnicodeUtil::IsWordChar(i); - for (i = 0; i < 767; i++) { - _foldCase[i] = Fast_UnicodeUtil::ToLower(i); - _keepCase[i] = i; - } + for (i = 0; i < 128; i++) + _isWord[i] = Fast_UnicodeUtil::IsWordChar(i); + for (i = 0; i < 767; i++) { + _foldCase[i] = Fast_UnicodeUtil::ToLower(i); + _keepCase[i] = i; + } - for (i = 0x1E00; i < 0x1F00; i++) { - _foldCaseHighAscii[i - 0x1E00] = Fast_UnicodeUtil::ToLower(i); - _keepCaseHighAscii[i - 0x1E00] = i; - } + for (i = 0x1E00; i < 0x1F00; i++) { + _foldCaseHighAscii[i - 0x1E00] = Fast_UnicodeUtil::ToLower(i); + _keepCaseHighAscii[i - 0x1E00] = i; + } - if (_doAccentRemoval) { - _foldCase[0xc0] = 'a'; - _foldCase[0xc1] = 'a'; - _foldCase[0xc2] = 'a'; - _foldCase[0xc3] = 'a'; // A tilde - _foldCase[0xc7] = 'c'; - _foldCase[0xc8] = 'e'; - _foldCase[0xc9] = 'e'; - _foldCase[0xca] = 'e'; - _foldCase[0xcb] = 'e'; - _foldCase[0xcc] = 'i'; // I grave - _foldCase[0xcd] = 'i'; - _foldCase[0xce] = 'i'; - _foldCase[0xcf] = 'i'; - _foldCase[0xd1] = 'n'; - _foldCase[0xd2] = 'o'; - _foldCase[0xd3] = 'o'; - _foldCase[0xd4] = 'o'; - _foldCase[0xd5] = 'o'; - _foldCase[0xd9] = 'u'; - _foldCase[0xda] = 'u'; - _foldCase[0xdb] = 'u'; - _foldCase[0xdd] = 'y'; + if (_doAccentRemoval) { + _foldCase[0xc0] = 'a'; + _foldCase[0xc1] = 'a'; + _foldCase[0xc2] = 'a'; + _foldCase[0xc3] = 'a'; // A tilde + _foldCase[0xc7] = 'c'; + _foldCase[0xc8] = 'e'; + _foldCase[0xc9] = 'e'; + _foldCase[0xca] = 'e'; + _foldCase[0xcb] = 'e'; + _foldCase[0xcc] = 'i'; // I grave + _foldCase[0xcd] = 'i'; + _foldCase[0xce] = 'i'; + _foldCase[0xcf] = 'i'; + _foldCase[0xd1] = 'n'; + _foldCase[0xd2] = 'o'; + _foldCase[0xd3] = 'o'; + _foldCase[0xd4] = 'o'; + _foldCase[0xd5] = 'o'; + _foldCase[0xd9] = 'u'; + _foldCase[0xda] = 'u'; + _foldCase[0xdb] = 'u'; + _foldCase[0xdd] = 'y'; - _foldCase[0xe0] = 'a'; - _foldCase[0xe1] = 'a'; - _foldCase[0xe2] = 'a'; - _foldCase[0xe3] = 'a'; // a tilde - _foldCase[0xe7] = 'c'; - _foldCase[0xe8] = 'e'; - _foldCase[0xe9] = 'e'; - _foldCase[0xea] = 'e'; - _foldCase[0xeb] = 'e'; - _foldCase[0xec] = 'i'; // i grave - _foldCase[0xed] = 'i'; - _foldCase[0xee] = 'i'; - _foldCase[0xef] = 'i'; - _foldCase[0xf1] = 'n'; - _foldCase[0xf2] = 'o'; - _foldCase[0xf3] = 'o'; - _foldCase[0xf4] = 'o'; - _foldCase[0xf5] = 'o'; - _foldCase[0xf9] = 'u'; - _foldCase[0xfa] = 'u'; - _foldCase[0xfb] = 'u'; - _foldCase[0xfd] = 'y'; - _foldCase[0xff] = 'y'; - _foldCase[0x102] = 'a'; - _foldCase[0x103] = 'a'; - _foldCase[0x110] = 'd'; - _foldCase[0x111] = 'd'; - _foldCase[0x128] = 'i'; - _foldCase[0x129] = 'i'; - _foldCase[0x178] = 'y'; - _foldCase[0x1a0] = 'o'; - _foldCase[0x1a1] = 'o'; - _foldCase[0x1af] = 'u'; - _foldCase[0x1b0] = 'u'; + _foldCase[0xe0] = 'a'; + _foldCase[0xe1] = 'a'; + _foldCase[0xe2] = 'a'; + _foldCase[0xe3] = 'a'; // a tilde + _foldCase[0xe7] = 'c'; + _foldCase[0xe8] = 'e'; + _foldCase[0xe9] = 'e'; + _foldCase[0xea] = 'e'; + _foldCase[0xeb] = 'e'; + _foldCase[0xec] = 'i'; // i grave + _foldCase[0xed] = 'i'; + _foldCase[0xee] = 'i'; + _foldCase[0xef] = 'i'; + _foldCase[0xf1] = 'n'; + _foldCase[0xf2] = 'o'; + _foldCase[0xf3] = 'o'; + _foldCase[0xf4] = 'o'; + _foldCase[0xf5] = 'o'; + _foldCase[0xf9] = 'u'; + _foldCase[0xfa] = 'u'; + _foldCase[0xfb] = 'u'; + _foldCase[0xfd] = 'y'; + _foldCase[0xff] = 'y'; + _foldCase[0x102] = 'a'; + _foldCase[0x103] = 'a'; + _foldCase[0x110] = 'd'; + _foldCase[0x111] = 'd'; + _foldCase[0x128] = 'i'; + _foldCase[0x129] = 'i'; + _foldCase[0x178] = 'y'; + _foldCase[0x1a0] = 'o'; + _foldCase[0x1a1] = 'o'; + _foldCase[0x1af] = 'u'; + _foldCase[0x1b0] = 'u'; - // Superscript spacing modifiers - _foldCase[0x2b0] = 'h'; - _foldCase[0x2b1] = 0x266; - _foldCase[0x2b2] = 'j'; - _foldCase[0x2b3] = 'r'; - _foldCase[0x2b4] = 0x279; - _foldCase[0x2b5] = 0x27b; - _foldCase[0x2b6] = 0x281; - _foldCase[0x2b7] = 'w'; - _foldCase[0x2b8] = 'y'; - _foldCase[0x2e0] = 0x263; - _foldCase[0x2e1] = 'l'; - _foldCase[0x2e2] = 's'; - _foldCase[0x2e3] = 'x'; - _foldCase[0x2e4] = 0x295; + // Superscript spacing modifiers + _foldCase[0x2b0] = 'h'; + _foldCase[0x2b1] = 0x266; + _foldCase[0x2b2] = 'j'; + _foldCase[0x2b3] = 'r'; + _foldCase[0x2b4] = 0x279; + _foldCase[0x2b5] = 0x27b; + _foldCase[0x2b6] = 0x281; + _foldCase[0x2b7] = 'w'; + _foldCase[0x2b8] = 'y'; + _foldCase[0x2e0] = 0x263; + _foldCase[0x2e1] = 'l'; + _foldCase[0x2e2] = 's'; + _foldCase[0x2e3] = 'x'; + _foldCase[0x2e4] = 0x295; - _keepCase[0xc0] = 'A'; - _keepCase[0xc1] = 'A'; - _keepCase[0xc2] = 'A'; - _keepCase[0xc3] = 'A'; // A tilde - _keepCase[0xc7] = 'C'; - _keepCase[0xc8] = 'E'; - _keepCase[0xc9] = 'E'; - _keepCase[0xca] = 'E'; - _keepCase[0xcb] = 'E'; - _keepCase[0xcc] = 'I'; // I grave - _keepCase[0xcd] = 'I'; - _keepCase[0xce] = 'I'; - _keepCase[0xcf] = 'I'; - _keepCase[0xd1] = 'N'; - _keepCase[0xd2] = 'O'; - _keepCase[0xd3] = 'O'; - _keepCase[0xd4] = 'O'; - _keepCase[0xd5] = 'O'; - _keepCase[0xd9] = 'U'; - _keepCase[0xda] = 'U'; - _keepCase[0xdb] = 'U'; - _keepCase[0xdd] = 'Y'; + _keepCase[0xc0] = 'A'; + _keepCase[0xc1] = 'A'; + _keepCase[0xc2] = 'A'; + _keepCase[0xc3] = 'A'; // A tilde + _keepCase[0xc7] = 'C'; + _keepCase[0xc8] = 'E'; + _keepCase[0xc9] = 'E'; + _keepCase[0xca] = 'E'; + _keepCase[0xcb] = 'E'; + _keepCase[0xcc] = 'I'; // I grave + _keepCase[0xcd] = 'I'; + _keepCase[0xce] = 'I'; + _keepCase[0xcf] = 'I'; + _keepCase[0xd1] = 'N'; + _keepCase[0xd2] = 'O'; + _keepCase[0xd3] = 'O'; + _keepCase[0xd4] = 'O'; + _keepCase[0xd5] = 'O'; + _keepCase[0xd9] = 'U'; + _keepCase[0xda] = 'U'; + _keepCase[0xdb] = 'U'; + _keepCase[0xdd] = 'Y'; - _keepCase[0xe0] = 'a'; - _keepCase[0xe1] = 'a'; - _keepCase[0xe2] = 'a'; - _keepCase[0xe3] = 'a'; // a tilde - _keepCase[0xe7] = 'c'; - _keepCase[0xe8] = 'e'; - _keepCase[0xe9] = 'e'; - _keepCase[0xea] = 'e'; - _keepCase[0xeb] = 'e'; - _keepCase[0xec] = 'i'; // i grave - _keepCase[0xed] = 'i'; - _keepCase[0xee] = 'i'; - _keepCase[0xef] = 'i'; - _keepCase[0xf1] = 'n'; - _keepCase[0xf2] = 'o'; - _keepCase[0xf3] = 'o'; - _keepCase[0xf4] = 'o'; - _keepCase[0xf5] = 'o'; - _keepCase[0xf9] = 'u'; - _keepCase[0xfa] = 'u'; - _keepCase[0xfb] = 'u'; - _keepCase[0xfd] = 'y'; - _keepCase[0xff] = 'y'; + _keepCase[0xe0] = 'a'; + _keepCase[0xe1] = 'a'; + _keepCase[0xe2] = 'a'; + _keepCase[0xe3] = 'a'; // a tilde + _keepCase[0xe7] = 'c'; + _keepCase[0xe8] = 'e'; + _keepCase[0xe9] = 'e'; + _keepCase[0xea] = 'e'; + _keepCase[0xeb] = 'e'; + _keepCase[0xec] = 'i'; // i grave + _keepCase[0xed] = 'i'; + _keepCase[0xee] = 'i'; + _keepCase[0xef] = 'i'; + _keepCase[0xf1] = 'n'; + _keepCase[0xf2] = 'o'; + _keepCase[0xf3] = 'o'; + _keepCase[0xf4] = 'o'; + _keepCase[0xf5] = 'o'; + _keepCase[0xf9] = 'u'; + _keepCase[0xfa] = 'u'; + _keepCase[0xfb] = 'u'; + _keepCase[0xfd] = 'y'; + _keepCase[0xff] = 'y'; - _keepCase[0x102] = 'A'; - _keepCase[0x103] = 'a'; - _keepCase[0x110] = 'D'; - _keepCase[0x111] = 'd'; - _keepCase[0x128] = 'I'; - _keepCase[0x129] = 'i'; - _keepCase[0x178] = 'Y'; - _keepCase[0x1a0] = 'O'; - _keepCase[0x1a1] = 'o'; - _keepCase[0x1af] = 'U'; - _keepCase[0x1b0] = 'u'; + _keepCase[0x102] = 'A'; + _keepCase[0x103] = 'a'; + _keepCase[0x110] = 'D'; + _keepCase[0x111] = 'd'; + _keepCase[0x128] = 'I'; + _keepCase[0x129] = 'i'; + _keepCase[0x178] = 'Y'; + _keepCase[0x1a0] = 'O'; + _keepCase[0x1a1] = 'o'; + _keepCase[0x1af] = 'U'; + _keepCase[0x1b0] = 'u'; - // Superscript spacing modifiers - _foldCase[0x2b0] = 'h'; - _foldCase[0x2b1] = 0x266; - _foldCase[0x2b2] = 'j'; - _foldCase[0x2b3] = 'r'; - _foldCase[0x2b4] = 0x279; - _foldCase[0x2b5] = 0x27b; - _foldCase[0x2b6] = 0x281; - _foldCase[0x2b7] = 'w'; - _foldCase[0x2b8] = 'y'; - _foldCase[0x2e0] = 0x263; - _foldCase[0x2e1] = 'l'; - _foldCase[0x2e2] = 's'; - _foldCase[0x2e3] = 'x'; - _foldCase[0x2e4] = 0x295; + // Superscript spacing modifiers + _foldCase[0x2b0] = 'h'; + _foldCase[0x2b1] = 0x266; + _foldCase[0x2b2] = 'j'; + _foldCase[0x2b3] = 'r'; + _foldCase[0x2b4] = 0x279; + _foldCase[0x2b5] = 0x27b; + _foldCase[0x2b6] = 0x281; + _foldCase[0x2b7] = 'w'; + _foldCase[0x2b8] = 'y'; + _foldCase[0x2e0] = 0x263; + _foldCase[0x2e1] = 'l'; + _foldCase[0x2e2] = 's'; + _foldCase[0x2e3] = 'x'; + _foldCase[0x2e4] = 0x295; - // Deaccenting-table for Ascii Extended Additional - _foldCaseHighAscii[0x1ea0 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1ea1 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1ea2 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1ea3 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1ea4 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1ea5 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1ea6 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1ea7 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1ea8 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1ea9 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eaa - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eab - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eac - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1ead - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eae - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eaf - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eb0 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eb1 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eb2 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eb3 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eb4 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eb5 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eb6 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eb7 - 0x1e00] = 'a'; - _foldCaseHighAscii[0x1eb8 - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1eb9 - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1eba - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ebb - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ebc - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ebd - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ebe - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ebf - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ec0 - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ec1 - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ec2 - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ec3 - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ec4 - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ec5 - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ec6 - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ec7 - 0x1e00] = 'e'; - _foldCaseHighAscii[0x1ec8 - 0x1e00] = 'i'; - _foldCaseHighAscii[0x1ec9 - 0x1e00] = 'i'; - _foldCaseHighAscii[0x1eca - 0x1e00] = 'i'; - _foldCaseHighAscii[0x1ecb - 0x1e00] = 'i'; - _foldCaseHighAscii[0x1ecc - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ecd - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ece - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ecf - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ed0 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ed1 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ed2 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ed3 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ed4 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ed5 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ed6 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ed7 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ed8 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ed9 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1eda - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1edb - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1edc - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1edd - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ede - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1edf - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ee0 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ee1 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ee2 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ee3 - 0x1e00] = 'o'; - _foldCaseHighAscii[0x1ee4 - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1ee5 - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1ee6 - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1ee7 - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1ee8 - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1ee9 - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1eea - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1eeb - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1eec - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1eed - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1eee - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1eef - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1ef0 - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1ef1 - 0x1e00] = 'u'; - _foldCaseHighAscii[0x1ef2 - 0x1e00] = 'y'; - _foldCaseHighAscii[0x1ef3 - 0x1e00] = 'y'; - _foldCaseHighAscii[0x1ef4 - 0x1e00] = 'y'; - _foldCaseHighAscii[0x1ef5 - 0x1e00] = 'y'; - _foldCaseHighAscii[0x1ef6 - 0x1e00] = 'y'; - _foldCaseHighAscii[0x1ef7 - 0x1e00] = 'y'; - _foldCaseHighAscii[0x1ef8 - 0x1e00] = 'y'; - _foldCaseHighAscii[0x1ef9 - 0x1e00] = 'y'; + // Deaccenting-table for Ascii Extended Additional + _foldCaseHighAscii[0x1ea0 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1ea1 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1ea2 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1ea3 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1ea4 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1ea5 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1ea6 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1ea7 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1ea8 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1ea9 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eaa - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eab - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eac - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1ead - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eae - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eaf - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eb0 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eb1 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eb2 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eb3 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eb4 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eb5 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eb6 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eb7 - 0x1e00] = 'a'; + _foldCaseHighAscii[0x1eb8 - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1eb9 - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1eba - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ebb - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ebc - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ebd - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ebe - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ebf - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ec0 - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ec1 - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ec2 - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ec3 - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ec4 - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ec5 - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ec6 - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ec7 - 0x1e00] = 'e'; + _foldCaseHighAscii[0x1ec8 - 0x1e00] = 'i'; + _foldCaseHighAscii[0x1ec9 - 0x1e00] = 'i'; + _foldCaseHighAscii[0x1eca - 0x1e00] = 'i'; + _foldCaseHighAscii[0x1ecb - 0x1e00] = 'i'; + _foldCaseHighAscii[0x1ecc - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ecd - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ece - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ecf - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ed0 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ed1 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ed2 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ed3 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ed4 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ed5 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ed6 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ed7 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ed8 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ed9 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1eda - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1edb - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1edc - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1edd - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ede - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1edf - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ee0 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ee1 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ee2 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ee3 - 0x1e00] = 'o'; + _foldCaseHighAscii[0x1ee4 - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1ee5 - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1ee6 - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1ee7 - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1ee8 - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1ee9 - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1eea - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1eeb - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1eec - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1eed - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1eee - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1eef - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1ef0 - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1ef1 - 0x1e00] = 'u'; + _foldCaseHighAscii[0x1ef2 - 0x1e00] = 'y'; + _foldCaseHighAscii[0x1ef3 - 0x1e00] = 'y'; + _foldCaseHighAscii[0x1ef4 - 0x1e00] = 'y'; + _foldCaseHighAscii[0x1ef5 - 0x1e00] = 'y'; + _foldCaseHighAscii[0x1ef6 - 0x1e00] = 'y'; + _foldCaseHighAscii[0x1ef7 - 0x1e00] = 'y'; + _foldCaseHighAscii[0x1ef8 - 0x1e00] = 'y'; + _foldCaseHighAscii[0x1ef9 - 0x1e00] = 'y'; - _keepCaseHighAscii[0x1ea0 - 0x1e00] = 'A'; - _keepCaseHighAscii[0x1ea1 - 0x1e00] = 'a'; - _keepCaseHighAscii[0x1ea2 - 0x1e00] = 'A'; - _keepCaseHighAscii[0x1ea3 - 0x1e00] = 'a'; - _keepCaseHighAscii[0x1ea4 - 0x1e00] = 'A'; - _keepCaseHighAscii[0x1ea5 - 0x1e00] = 'a'; - _keepCaseHighAscii[0x1ea6 - 0x1e00] = 'A'; - _keepCaseHighAscii[0x1ea7 - 0x1e00] = 'a'; - _keepCaseHighAscii[0x1ea8 - 0x1e00] = 'A'; - _keepCaseHighAscii[0x1ea9 - 0x1e00] = 'a'; - _keepCaseHighAscii[0x1eaa - 0x1e00] = 'A'; - _keepCaseHighAscii[0x1eab - 0x1e00] = 'a'; - _keepCaseHighAscii[0x1eac - 0x1e00] = 'A'; - _keepCaseHighAscii[0x1ead - 0x1e00] = 'a'; - _keepCaseHighAscii[0x1eae - 0x1e00] = 'A'; - _keepCaseHighAscii[0x1eaf - 0x1e00] = 'a'; - _keepCaseHighAscii[0x1eb0 - 0x1e00] = 'A'; - _keepCaseHighAscii[0x1eb1 - 0x1e00] = 'a'; - _keepCaseHighAscii[0x1eb2 - 0x1e00] = 'A'; - _keepCaseHighAscii[0x1eb3 - 0x1e00] = 'a'; - _keepCaseHighAscii[0x1eb4 - 0x1e00] = 'A'; - _keepCaseHighAscii[0x1eb5 - 0x1e00] = 'a'; - _keepCaseHighAscii[0x1eb6 - 0x1e00] = 'A'; - _keepCaseHighAscii[0x1eb7 - 0x1e00] = 'a'; - _keepCaseHighAscii[0x1eb8 - 0x1e00] = 'E'; - _keepCaseHighAscii[0x1eb9 - 0x1e00] = 'e'; - _keepCaseHighAscii[0x1eba - 0x1e00] = 'E'; - _keepCaseHighAscii[0x1ebb - 0x1e00] = 'e'; - _keepCaseHighAscii[0x1ebc - 0x1e00] = 'E'; - _keepCaseHighAscii[0x1ebd - 0x1e00] = 'e'; - _keepCaseHighAscii[0x1ebe - 0x1e00] = 'E'; - _keepCaseHighAscii[0x1ebf - 0x1e00] = 'e'; - _keepCaseHighAscii[0x1ec0 - 0x1e00] = 'E'; - _keepCaseHighAscii[0x1ec1 - 0x1e00] = 'e'; - _keepCaseHighAscii[0x1ec2 - 0x1e00] = 'E'; - _keepCaseHighAscii[0x1ec3 - 0x1e00] = 'e'; - _keepCaseHighAscii[0x1ec4 - 0x1e00] = 'E'; - _keepCaseHighAscii[0x1ec5 - 0x1e00] = 'e'; - _keepCaseHighAscii[0x1ec6 - 0x1e00] = 'E'; - _keepCaseHighAscii[0x1ec7 - 0x1e00] = 'e'; - _keepCaseHighAscii[0x1ec8 - 0x1e00] = 'I'; - _keepCaseHighAscii[0x1ec9 - 0x1e00] = 'i'; - _keepCaseHighAscii[0x1eca - 0x1e00] = 'I'; - _keepCaseHighAscii[0x1ecb - 0x1e00] = 'i'; - _keepCaseHighAscii[0x1ecc - 0x1e00] = 'O'; - _keepCaseHighAscii[0x1ecd - 0x1e00] = 'o'; - _keepCaseHighAscii[0x1ece - 0x1e00] = 'O'; - _keepCaseHighAscii[0x1ecf - 0x1e00] = 'o'; - _keepCaseHighAscii[0x1ed0 - 0x1e00] = 'O'; - _keepCaseHighAscii[0x1ed1 - 0x1e00] = 'o'; - _keepCaseHighAscii[0x1ed2 - 0x1e00] = 'O'; - _keepCaseHighAscii[0x1ed3 - 0x1e00] = 'o'; - _keepCaseHighAscii[0x1ed4 - 0x1e00] = 'O'; - _keepCaseHighAscii[0x1ed5 - 0x1e00] = 'o'; - _keepCaseHighAscii[0x1ed6 - 0x1e00] = 'O'; - _keepCaseHighAscii[0x1ed7 - 0x1e00] = 'o'; - _keepCaseHighAscii[0x1ed8 - 0x1e00] = 'O'; - _keepCaseHighAscii[0x1ed9 - 0x1e00] = 'o'; - _keepCaseHighAscii[0x1eda - 0x1e00] = 'O'; - _keepCaseHighAscii[0x1edb - 0x1e00] = 'o'; - _keepCaseHighAscii[0x1edc - 0x1e00] = 'O'; - _keepCaseHighAscii[0x1edd - 0x1e00] = 'o'; - _keepCaseHighAscii[0x1ede - 0x1e00] = 'O'; - _keepCaseHighAscii[0x1edf - 0x1e00] = 'o'; - _keepCaseHighAscii[0x1ee0 - 0x1e00] = 'O'; - _keepCaseHighAscii[0x1ee1 - 0x1e00] = 'o'; - _keepCaseHighAscii[0x1ee2 - 0x1e00] = 'O'; - _keepCaseHighAscii[0x1ee3 - 0x1e00] = 'o'; - _keepCaseHighAscii[0x1ee4 - 0x1e00] = 'U'; - _keepCaseHighAscii[0x1ee5 - 0x1e00] = 'u'; - _keepCaseHighAscii[0x1ee6 - 0x1e00] = 'U'; - _keepCaseHighAscii[0x1ee7 - 0x1e00] = 'u'; - _keepCaseHighAscii[0x1ee8 - 0x1e00] = 'U'; - _keepCaseHighAscii[0x1ee9 - 0x1e00] = 'u'; - _keepCaseHighAscii[0x1eea - 0x1e00] = 'U'; - _keepCaseHighAscii[0x1eeb - 0x1e00] = 'u'; - _keepCaseHighAscii[0x1eec - 0x1e00] = 'U'; - _keepCaseHighAscii[0x1eed - 0x1e00] = 'u'; - _keepCaseHighAscii[0x1eee - 0x1e00] = 'U'; - _keepCaseHighAscii[0x1eef - 0x1e00] = 'u'; - _keepCaseHighAscii[0x1ef0 - 0x1e00] = 'U'; - _keepCaseHighAscii[0x1ef1 - 0x1e00] = 'u'; - _keepCaseHighAscii[0x1ef2 - 0x1e00] = 'Y'; - _keepCaseHighAscii[0x1ef3 - 0x1e00] = 'y'; - _keepCaseHighAscii[0x1ef4 - 0x1e00] = 'Y'; - _keepCaseHighAscii[0x1ef5 - 0x1e00] = 'y'; - _keepCaseHighAscii[0x1ef6 - 0x1e00] = 'Y'; - _keepCaseHighAscii[0x1ef7 - 0x1e00] = 'y'; - _keepCaseHighAscii[0x1ef8 - 0x1e00] = 'Y'; - _keepCaseHighAscii[0x1ef9 - 0x1e00] = 'y'; + _keepCaseHighAscii[0x1ea0 - 0x1e00] = 'A'; + _keepCaseHighAscii[0x1ea1 - 0x1e00] = 'a'; + _keepCaseHighAscii[0x1ea2 - 0x1e00] = 'A'; + _keepCaseHighAscii[0x1ea3 - 0x1e00] = 'a'; + _keepCaseHighAscii[0x1ea4 - 0x1e00] = 'A'; + _keepCaseHighAscii[0x1ea5 - 0x1e00] = 'a'; + _keepCaseHighAscii[0x1ea6 - 0x1e00] = 'A'; + _keepCaseHighAscii[0x1ea7 - 0x1e00] = 'a'; + _keepCaseHighAscii[0x1ea8 - 0x1e00] = 'A'; + _keepCaseHighAscii[0x1ea9 - 0x1e00] = 'a'; + _keepCaseHighAscii[0x1eaa - 0x1e00] = 'A'; + _keepCaseHighAscii[0x1eab - 0x1e00] = 'a'; + _keepCaseHighAscii[0x1eac - 0x1e00] = 'A'; + _keepCaseHighAscii[0x1ead - 0x1e00] = 'a'; + _keepCaseHighAscii[0x1eae - 0x1e00] = 'A'; + _keepCaseHighAscii[0x1eaf - 0x1e00] = 'a'; + _keepCaseHighAscii[0x1eb0 - 0x1e00] = 'A'; + _keepCaseHighAscii[0x1eb1 - 0x1e00] = 'a'; + _keepCaseHighAscii[0x1eb2 - 0x1e00] = 'A'; + _keepCaseHighAscii[0x1eb3 - 0x1e00] = 'a'; + _keepCaseHighAscii[0x1eb4 - 0x1e00] = 'A'; + _keepCaseHighAscii[0x1eb5 - 0x1e00] = 'a'; + _keepCaseHighAscii[0x1eb6 - 0x1e00] = 'A'; + _keepCaseHighAscii[0x1eb7 - 0x1e00] = 'a'; + _keepCaseHighAscii[0x1eb8 - 0x1e00] = 'E'; + _keepCaseHighAscii[0x1eb9 - 0x1e00] = 'e'; + _keepCaseHighAscii[0x1eba - 0x1e00] = 'E'; + _keepCaseHighAscii[0x1ebb - 0x1e00] = 'e'; + _keepCaseHighAscii[0x1ebc - 0x1e00] = 'E'; + _keepCaseHighAscii[0x1ebd - 0x1e00] = 'e'; + _keepCaseHighAscii[0x1ebe - 0x1e00] = 'E'; + _keepCaseHighAscii[0x1ebf - 0x1e00] = 'e'; + _keepCaseHighAscii[0x1ec0 - 0x1e00] = 'E'; + _keepCaseHighAscii[0x1ec1 - 0x1e00] = 'e'; + _keepCaseHighAscii[0x1ec2 - 0x1e00] = 'E'; + _keepCaseHighAscii[0x1ec3 - 0x1e00] = 'e'; + _keepCaseHighAscii[0x1ec4 - 0x1e00] = 'E'; + _keepCaseHighAscii[0x1ec5 - 0x1e00] = 'e'; + _keepCaseHighAscii[0x1ec6 - 0x1e00] = 'E'; + _keepCaseHighAscii[0x1ec7 - 0x1e00] = 'e'; + _keepCaseHighAscii[0x1ec8 - 0x1e00] = 'I'; + _keepCaseHighAscii[0x1ec9 - 0x1e00] = 'i'; + _keepCaseHighAscii[0x1eca - 0x1e00] = 'I'; + _keepCaseHighAscii[0x1ecb - 0x1e00] = 'i'; + _keepCaseHighAscii[0x1ecc - 0x1e00] = 'O'; + _keepCaseHighAscii[0x1ecd - 0x1e00] = 'o'; + _keepCaseHighAscii[0x1ece - 0x1e00] = 'O'; + _keepCaseHighAscii[0x1ecf - 0x1e00] = 'o'; + _keepCaseHighAscii[0x1ed0 - 0x1e00] = 'O'; + _keepCaseHighAscii[0x1ed1 - 0x1e00] = 'o'; + _keepCaseHighAscii[0x1ed2 - 0x1e00] = 'O'; + _keepCaseHighAscii[0x1ed3 - 0x1e00] = 'o'; + _keepCaseHighAscii[0x1ed4 - 0x1e00] = 'O'; + _keepCaseHighAscii[0x1ed5 - 0x1e00] = 'o'; + _keepCaseHighAscii[0x1ed6 - 0x1e00] = 'O'; + _keepCaseHighAscii[0x1ed7 - 0x1e00] = 'o'; + _keepCaseHighAscii[0x1ed8 - 0x1e00] = 'O'; + _keepCaseHighAscii[0x1ed9 - 0x1e00] = 'o'; + _keepCaseHighAscii[0x1eda - 0x1e00] = 'O'; + _keepCaseHighAscii[0x1edb - 0x1e00] = 'o'; + _keepCaseHighAscii[0x1edc - 0x1e00] = 'O'; + _keepCaseHighAscii[0x1edd - 0x1e00] = 'o'; + _keepCaseHighAscii[0x1ede - 0x1e00] = 'O'; + _keepCaseHighAscii[0x1edf - 0x1e00] = 'o'; + _keepCaseHighAscii[0x1ee0 - 0x1e00] = 'O'; + _keepCaseHighAscii[0x1ee1 - 0x1e00] = 'o'; + _keepCaseHighAscii[0x1ee2 - 0x1e00] = 'O'; + _keepCaseHighAscii[0x1ee3 - 0x1e00] = 'o'; + _keepCaseHighAscii[0x1ee4 - 0x1e00] = 'U'; + _keepCaseHighAscii[0x1ee5 - 0x1e00] = 'u'; + _keepCaseHighAscii[0x1ee6 - 0x1e00] = 'U'; + _keepCaseHighAscii[0x1ee7 - 0x1e00] = 'u'; + _keepCaseHighAscii[0x1ee8 - 0x1e00] = 'U'; + _keepCaseHighAscii[0x1ee9 - 0x1e00] = 'u'; + _keepCaseHighAscii[0x1eea - 0x1e00] = 'U'; + _keepCaseHighAscii[0x1eeb - 0x1e00] = 'u'; + _keepCaseHighAscii[0x1eec - 0x1e00] = 'U'; + _keepCaseHighAscii[0x1eed - 0x1e00] = 'u'; + _keepCaseHighAscii[0x1eee - 0x1e00] = 'U'; + _keepCaseHighAscii[0x1eef - 0x1e00] = 'u'; + _keepCaseHighAscii[0x1ef0 - 0x1e00] = 'U'; + _keepCaseHighAscii[0x1ef1 - 0x1e00] = 'u'; + _keepCaseHighAscii[0x1ef2 - 0x1e00] = 'Y'; + _keepCaseHighAscii[0x1ef3 - 0x1e00] = 'y'; + _keepCaseHighAscii[0x1ef4 - 0x1e00] = 'Y'; + _keepCaseHighAscii[0x1ef5 - 0x1e00] = 'y'; + _keepCaseHighAscii[0x1ef6 - 0x1e00] = 'Y'; + _keepCaseHighAscii[0x1ef7 - 0x1e00] = 'y'; + _keepCaseHighAscii[0x1ef8 - 0x1e00] = 'Y'; + _keepCaseHighAscii[0x1ef9 - 0x1e00] = 'y'; - } + } - // Base case hiragana - hiragana ID - for (i = 0; i < 96; i++) { - _kanaMap[i] = 0x3040 + i; - } + // Base case hiragana - hiragana ID + for (i = 0; i < 96; i++) { + _kanaMap[i] = 0x3040 + i; + } - // Modify some hiragana - hiragana - if (_doSmallToNormalKana) { - // A I U E O YA YU YO WA, and TSU (previously we did not convert TSU) - _kanaMap[0x3041 - 0x3040] = 0x3042; - _kanaMap[0x3043 - 0x3040] = 0x3044; - _kanaMap[0x3045 - 0x3040] = 0x3046; - _kanaMap[0x3047 - 0x3040] = 0x3048; - _kanaMap[0x3049 - 0x3040] = 0x304A; - _kanaMap[0x3063 - 0x3040] = 0x3064; - _kanaMap[0x3083 - 0x3040] = 0x3084; - _kanaMap[0x3085 - 0x3040] = 0x3086; - _kanaMap[0x3087 - 0x3040] = 0x3088; - _kanaMap[0x308E - 0x3040] = 0x308F; - } + // Modify some hiragana - hiragana + if (_doSmallToNormalKana) { + // A I U E O YA YU YO WA, and TSU (previously we did not convert TSU) + _kanaMap[0x3041 - 0x3040] = 0x3042; + _kanaMap[0x3043 - 0x3040] = 0x3044; + _kanaMap[0x3045 - 0x3040] = 0x3046; + _kanaMap[0x3047 - 0x3040] = 0x3048; + _kanaMap[0x3049 - 0x3040] = 0x304A; + _kanaMap[0x3063 - 0x3040] = 0x3064; + _kanaMap[0x3083 - 0x3040] = 0x3084; + _kanaMap[0x3085 - 0x3040] = 0x3086; + _kanaMap[0x3087 - 0x3040] = 0x3088; + _kanaMap[0x308E - 0x3040] = 0x308F; + } - if (_doKatakanaToHiragana) { - // base katakana to hiragana - for (i = 96; i < 192; i++) { - _kanaMap[i] = 0x3040 + i - 0x60; - } + if (_doKatakanaToHiragana) { + // base katakana to hiragana + for (i = 96; i < 192; i++) { + _kanaMap[i] = 0x3040 + i - 0x60; + } - // modify some katakana - hiragana + // modify some katakana - hiragana - // 0x30A0 -> id - _kanaMap[0x30A0 - 0x3040] = 0x30A0; - // 0x30F7 to 0x30FC -> id - _kanaMap[0x30F7 - 0x3040] = 0x30F7; - _kanaMap[0x30F8 - 0x3040] = 0x30F8; - _kanaMap[0x30F9 - 0x3040] = 0x30F9; - _kanaMap[0x30FA - 0x3040] = 0x30FA; - _kanaMap[0x30FB - 0x3040] = 0x30FB; - _kanaMap[0x30FC - 0x3040] = 0x30FC; - // 0x30FF -> id - _kanaMap[0x30FF - 0x3040] = 0x30FF; + // 0x30A0 -> id + _kanaMap[0x30A0 - 0x3040] = 0x30A0; + // 0x30F7 to 0x30FC -> id + _kanaMap[0x30F7 - 0x3040] = 0x30F7; + _kanaMap[0x30F8 - 0x3040] = 0x30F8; + _kanaMap[0x30F9 - 0x3040] = 0x30F9; + _kanaMap[0x30FA - 0x3040] = 0x30FA; + _kanaMap[0x30FB - 0x3040] = 0x30FB; + _kanaMap[0x30FC - 0x3040] = 0x30FC; + // 0x30FF -> id + _kanaMap[0x30FF - 0x3040] = 0x30FF; - if (_doSmallToNormalKana) { - // A I U E O YA YU YO WA, and TSU (previously we did not convert TSU) - _kanaMap[0x30A1 - 0x3040] = 0x3042; - _kanaMap[0x30A3 - 0x3040] = 0x3044; - _kanaMap[0x30A5 - 0x3040] = 0x3046; - _kanaMap[0x30A7 - 0x3040] = 0x3048; - _kanaMap[0x30A9 - 0x3040] = 0x304A; - _kanaMap[0x30C3 - 0x3040] = 0x30C4; - _kanaMap[0x30E3 - 0x3040] = 0x3084; - _kanaMap[0x30E5 - 0x3040] = 0x3086; - _kanaMap[0x30E7 - 0x3040] = 0x3088; - _kanaMap[0x30EE - 0x3040] = 0x308F; - // KA KE - _kanaMap[0x30F5 - 0x3040] = 0x304B; - _kanaMap[0x30F6 - 0x3040] = 0x3051; - } else { // !_doSmallToNormalKana - // A I U E O YA YU YO WA, not TSU is normal katakana - hiragana - // KA KE; No small hiragana exists, so id - _kanaMap[0x30F5 - 0x3040] = 0x30F5; - _kanaMap[0x30F6 - 0x3040] = 0x30F6; - } - } else { // !_doKatakanaToHiragana - // katakana - katakana ID - for (i = 96; i < 192; i++) { - _kanaMap[i] = 0x3040 + i; - } + if (_doSmallToNormalKana) { + // A I U E O YA YU YO WA, and TSU (previously we did not convert TSU) + _kanaMap[0x30A1 - 0x3040] = 0x3042; + _kanaMap[0x30A3 - 0x3040] = 0x3044; + _kanaMap[0x30A5 - 0x3040] = 0x3046; + _kanaMap[0x30A7 - 0x3040] = 0x3048; + _kanaMap[0x30A9 - 0x3040] = 0x304A; + _kanaMap[0x30C3 - 0x3040] = 0x30C4; + _kanaMap[0x30E3 - 0x3040] = 0x3084; + _kanaMap[0x30E5 - 0x3040] = 0x3086; + _kanaMap[0x30E7 - 0x3040] = 0x3088; + _kanaMap[0x30EE - 0x3040] = 0x308F; + // KA KE + _kanaMap[0x30F5 - 0x3040] = 0x304B; + _kanaMap[0x30F6 - 0x3040] = 0x3051; + } else { // !_doSmallToNormalKana + // A I U E O YA YU YO WA, not TSU is normal katakana - hiragana + // KA KE; No small hiragana exists, so id + _kanaMap[0x30F5 - 0x3040] = 0x30F5; + _kanaMap[0x30F6 - 0x3040] = 0x30F6; + } + } else { // !_doKatakanaToHiragana + // katakana - katakana ID + for (i = 96; i < 192; i++) { + _kanaMap[i] = 0x3040 + i; + } - // modify some katakana - katakana - if (_doSmallToNormalKana) { - // A I U E O YA YU YO WA, not TSU - _kanaMap[0x30A1 - 0x3040] = 0x30A2; - _kanaMap[0x30A3 - 0x3040] = 0x30A4; - _kanaMap[0x30A5 - 0x3040] = 0x30A6; - _kanaMap[0x30A7 - 0x3040] = 0x30A8; - _kanaMap[0x30A9 - 0x3040] = 0x30AA; - _kanaMap[0x30E3 - 0x3040] = 0x30E4; - _kanaMap[0x30E5 - 0x3040] = 0x30E6; - _kanaMap[0x30E7 - 0x3040] = 0x30E8; - _kanaMap[0x30EE - 0x3040] = 0x30EF; - // KA KE - _kanaMap[0x30F5 - 0x3040] = 0x30AB; - _kanaMap[0x30F6 - 0x3040] = 0x30B1; - } - } + // modify some katakana - katakana + if (_doSmallToNormalKana) { + // A I U E O YA YU YO WA, not TSU + _kanaMap[0x30A1 - 0x3040] = 0x30A2; + _kanaMap[0x30A3 - 0x3040] = 0x30A4; + _kanaMap[0x30A5 - 0x3040] = 0x30A6; + _kanaMap[0x30A7 - 0x3040] = 0x30A8; + _kanaMap[0x30A9 - 0x3040] = 0x30AA; + _kanaMap[0x30E3 - 0x3040] = 0x30E4; + _kanaMap[0x30E5 - 0x3040] = 0x30E6; + _kanaMap[0x30E7 - 0x3040] = 0x30E8; + _kanaMap[0x30EE - 0x3040] = 0x30EF; + // KA KE + _kanaMap[0x30F5 - 0x3040] = 0x30AB; + _kanaMap[0x30F6 - 0x3040] = 0x30B1; + } + } - // Fullwidth ASCII - for (i = 0; i < 0x21; i++) - _halfwidth_fullwidthMap[i] = 0x20 + i; - for (i = 0x21; i < 0x3B; i++) // full uppercase to half lowercase - _halfwidth_fullwidthMap[i] = 0x40 + i; - for (i = 0x3B; i < 0x5F; i++) - _halfwidth_fullwidthMap[i] = 0x20 + i; - // 0xFF00, 0xFF5F -> id - _halfwidth_fullwidthMap[0x00] = 0xFF00; - _halfwidth_fullwidthMap[0x5F] = 0xFF5F; + // Fullwidth ASCII + for (i = 0; i < 0x21; i++) + _halfwidth_fullwidthMap[i] = 0x20 + i; + for (i = 0x21; i < 0x3B; i++) // full uppercase to half lowercase + _halfwidth_fullwidthMap[i] = 0x40 + i; + for (i = 0x3B; i < 0x5F; i++) + _halfwidth_fullwidthMap[i] = 0x20 + i; + // 0xFF00, 0xFF5F -> id + _halfwidth_fullwidthMap[0x00] = 0xFF00; + _halfwidth_fullwidthMap[0x5F] = 0xFF5F; - // Halfwidth CJK Punctuation - // 0xFF60 -> id - _halfwidth_fullwidthMap[0x60] = 0xFF60; - _halfwidth_fullwidthMap[0x61] = 0x3002; - _halfwidth_fullwidthMap[0x62] = 0x300C; - _halfwidth_fullwidthMap[0x63] = 0x300D; - _halfwidth_fullwidthMap[0x64] = 0x3001; + // Halfwidth CJK Punctuation + // 0xFF60 -> id + _halfwidth_fullwidthMap[0x60] = 0xFF60; + _halfwidth_fullwidthMap[0x61] = 0x3002; + _halfwidth_fullwidthMap[0x62] = 0x300C; + _halfwidth_fullwidthMap[0x63] = 0x300D; + _halfwidth_fullwidthMap[0x64] = 0x3001; - // Halfwidth katakana (maps directly to hiragana) + // Halfwidth katakana (maps directly to hiragana) - // Common cases for halfwidth katakana - _halfwidth_fullwidthMap[0x65] = 0x30FB; + // Common cases for halfwidth katakana + _halfwidth_fullwidthMap[0x65] = 0x30FB; - if (_doKatakanaToHiragana) { - _halfwidth_fullwidthMap[0x66] = 0x3092; - _halfwidth_fullwidthMap[0x6F] = 0x3063; - _halfwidth_fullwidthMap[0x70] = 0x30FC; - _halfwidth_fullwidthMap[0x71] = 0x3042; - _halfwidth_fullwidthMap[0x72] = 0x3044; - _halfwidth_fullwidthMap[0x73] = 0x3046; - _halfwidth_fullwidthMap[0x74] = 0x3048; - _halfwidth_fullwidthMap[0x75] = 0x304A; - _halfwidth_fullwidthMap[0x76] = 0x304B; - _halfwidth_fullwidthMap[0x77] = 0x304D; - _halfwidth_fullwidthMap[0x78] = 0x304F; - _halfwidth_fullwidthMap[0x79] = 0x3051; - _halfwidth_fullwidthMap[0x7A] = 0x3053; - _halfwidth_fullwidthMap[0x7B] = 0x3055; - _halfwidth_fullwidthMap[0x7C] = 0x3057; - _halfwidth_fullwidthMap[0x7D] = 0x3059; - _halfwidth_fullwidthMap[0x7E] = 0x305B; - _halfwidth_fullwidthMap[0x7F] = 0x305D; - _halfwidth_fullwidthMap[0x80] = 0x305F; - _halfwidth_fullwidthMap[0x81] = 0x3061; - _halfwidth_fullwidthMap[0x82] = 0x3064; - _halfwidth_fullwidthMap[0x83] = 0x3066; - _halfwidth_fullwidthMap[0x84] = 0x3068; - _halfwidth_fullwidthMap[0x85] = 0x306A; - _halfwidth_fullwidthMap[0x86] = 0x306B; - _halfwidth_fullwidthMap[0x87] = 0x306C; - _halfwidth_fullwidthMap[0x88] = 0x306D; - _halfwidth_fullwidthMap[0x89] = 0x306E; - _halfwidth_fullwidthMap[0x8A] = 0x306F; - _halfwidth_fullwidthMap[0x8B] = 0x3072; - _halfwidth_fullwidthMap[0x8C] = 0x3075; - _halfwidth_fullwidthMap[0x8D] = 0x3078; - _halfwidth_fullwidthMap[0x8E] = 0x307B; - _halfwidth_fullwidthMap[0x8F] = 0x307E; - _halfwidth_fullwidthMap[0x90] = 0x307F; - _halfwidth_fullwidthMap[0x91] = 0x3080; - _halfwidth_fullwidthMap[0x92] = 0x3081; - _halfwidth_fullwidthMap[0x93] = 0x3082; - _halfwidth_fullwidthMap[0x94] = 0x3084; - _halfwidth_fullwidthMap[0x95] = 0x3086; - _halfwidth_fullwidthMap[0x96] = 0x3088; - _halfwidth_fullwidthMap[0x97] = 0x3089; - _halfwidth_fullwidthMap[0x98] = 0x308A; - _halfwidth_fullwidthMap[0x99] = 0x308B; - _halfwidth_fullwidthMap[0x9A] = 0x308C; - _halfwidth_fullwidthMap[0x9B] = 0x308D; - _halfwidth_fullwidthMap[0x9C] = 0x308F; - _halfwidth_fullwidthMap[0x9D] = 0x3093; - _halfwidth_fullwidthMap[0x9E] = 0x3099; - _halfwidth_fullwidthMap[0x9F] = 0x309A; - if (_doSmallToNormalKana) { - _halfwidth_fullwidthMap[0x67] = 0x3042; - _halfwidth_fullwidthMap[0x68] = 0x3044; - _halfwidth_fullwidthMap[0x69] = 0x3046; - _halfwidth_fullwidthMap[0x6A] = 0x3048; - _halfwidth_fullwidthMap[0x6B] = 0x304A; - _halfwidth_fullwidthMap[0x6C] = 0x3084; - _halfwidth_fullwidthMap[0x6D] = 0x3086; - _halfwidth_fullwidthMap[0x6E] = 0x3088; - } else { // !_doSmallToNormalKana - _halfwidth_fullwidthMap[0x67] = 0x3041; - _halfwidth_fullwidthMap[0x68] = 0x3043; - _halfwidth_fullwidthMap[0x69] = 0x3045; - _halfwidth_fullwidthMap[0x6A] = 0x3047; - _halfwidth_fullwidthMap[0x6B] = 0x3049; - _halfwidth_fullwidthMap[0x6C] = 0x3083; - _halfwidth_fullwidthMap[0x6D] = 0x3085; - _halfwidth_fullwidthMap[0x6E] = 0x3087; - } - } else { // !_doKatakanaToHiragana - _halfwidth_fullwidthMap[0x66] = 0x30F2; - _halfwidth_fullwidthMap[0x6F] = 0x30C3; - _halfwidth_fullwidthMap[0x70] = 0x30FC; - _halfwidth_fullwidthMap[0x71] = 0x30A2; - _halfwidth_fullwidthMap[0x72] = 0x30A4; - _halfwidth_fullwidthMap[0x73] = 0x30A6; - _halfwidth_fullwidthMap[0x74] = 0x30A8; - _halfwidth_fullwidthMap[0x75] = 0x30AA; - _halfwidth_fullwidthMap[0x76] = 0x30AB; - _halfwidth_fullwidthMap[0x77] = 0x30AD; - _halfwidth_fullwidthMap[0x78] = 0x30AF; - _halfwidth_fullwidthMap[0x79] = 0x30B1; - _halfwidth_fullwidthMap[0x7A] = 0x30B3; - _halfwidth_fullwidthMap[0x7B] = 0x30B5; - _halfwidth_fullwidthMap[0x7C] = 0x30B7; - _halfwidth_fullwidthMap[0x7D] = 0x30B9; - _halfwidth_fullwidthMap[0x7E] = 0x30BB; - _halfwidth_fullwidthMap[0x7F] = 0x30BD; - _halfwidth_fullwidthMap[0x80] = 0x30BF; - _halfwidth_fullwidthMap[0x81] = 0x30C1; - _halfwidth_fullwidthMap[0x82] = 0x30C4; - _halfwidth_fullwidthMap[0x83] = 0x30C6; - _halfwidth_fullwidthMap[0x84] = 0x30C8; - _halfwidth_fullwidthMap[0x85] = 0x30CA; - _halfwidth_fullwidthMap[0x86] = 0x30CB; - _halfwidth_fullwidthMap[0x87] = 0x30CC; - _halfwidth_fullwidthMap[0x88] = 0x30CD; - _halfwidth_fullwidthMap[0x89] = 0x30CE; - _halfwidth_fullwidthMap[0x8A] = 0x30CF; - _halfwidth_fullwidthMap[0x8B] = 0x30D2; - _halfwidth_fullwidthMap[0x8C] = 0x30D5; - _halfwidth_fullwidthMap[0x8D] = 0x30D8; - _halfwidth_fullwidthMap[0x8E] = 0x30DB; - _halfwidth_fullwidthMap[0x8F] = 0x30DE; - _halfwidth_fullwidthMap[0x90] = 0x30DF; - _halfwidth_fullwidthMap[0x91] = 0x30E0; - _halfwidth_fullwidthMap[0x92] = 0x30E1; - _halfwidth_fullwidthMap[0x93] = 0x30E2; - _halfwidth_fullwidthMap[0x94] = 0x30E4; - _halfwidth_fullwidthMap[0x95] = 0x30E6; - _halfwidth_fullwidthMap[0x96] = 0x30E8; - _halfwidth_fullwidthMap[0x97] = 0x30E9; - _halfwidth_fullwidthMap[0x98] = 0x30EA; - _halfwidth_fullwidthMap[0x99] = 0x30EB; - _halfwidth_fullwidthMap[0x9A] = 0x30EC; - _halfwidth_fullwidthMap[0x9B] = 0x30ED; - _halfwidth_fullwidthMap[0x9C] = 0x30EF; - _halfwidth_fullwidthMap[0x9D] = 0x30F3; - _halfwidth_fullwidthMap[0x9E] = 0x3099; - _halfwidth_fullwidthMap[0x9F] = 0x309A; - if (_doSmallToNormalKana) { - _halfwidth_fullwidthMap[0x67] = 0x30a2; - _halfwidth_fullwidthMap[0x68] = 0x30a4; - _halfwidth_fullwidthMap[0x69] = 0x30a6; - _halfwidth_fullwidthMap[0x6A] = 0x30a8; - _halfwidth_fullwidthMap[0x6B] = 0x30aA; - _halfwidth_fullwidthMap[0x6C] = 0x30e4; - _halfwidth_fullwidthMap[0x6D] = 0x30e6; - _halfwidth_fullwidthMap[0x6E] = 0x30e8; - } else { // !_doSmallToNormalKana - _halfwidth_fullwidthMap[0x67] = 0x30a1; - _halfwidth_fullwidthMap[0x68] = 0x30a3; - _halfwidth_fullwidthMap[0x69] = 0x30a5; - _halfwidth_fullwidthMap[0x6A] = 0x30a7; - _halfwidth_fullwidthMap[0x6B] = 0x30a9; - _halfwidth_fullwidthMap[0x6C] = 0x30e3; - _halfwidth_fullwidthMap[0x6D] = 0x30e5; - _halfwidth_fullwidthMap[0x6E] = 0x30e7; - } - } + if (_doKatakanaToHiragana) { + _halfwidth_fullwidthMap[0x66] = 0x3092; + _halfwidth_fullwidthMap[0x6F] = 0x3063; + _halfwidth_fullwidthMap[0x70] = 0x30FC; + _halfwidth_fullwidthMap[0x71] = 0x3042; + _halfwidth_fullwidthMap[0x72] = 0x3044; + _halfwidth_fullwidthMap[0x73] = 0x3046; + _halfwidth_fullwidthMap[0x74] = 0x3048; + _halfwidth_fullwidthMap[0x75] = 0x304A; + _halfwidth_fullwidthMap[0x76] = 0x304B; + _halfwidth_fullwidthMap[0x77] = 0x304D; + _halfwidth_fullwidthMap[0x78] = 0x304F; + _halfwidth_fullwidthMap[0x79] = 0x3051; + _halfwidth_fullwidthMap[0x7A] = 0x3053; + _halfwidth_fullwidthMap[0x7B] = 0x3055; + _halfwidth_fullwidthMap[0x7C] = 0x3057; + _halfwidth_fullwidthMap[0x7D] = 0x3059; + _halfwidth_fullwidthMap[0x7E] = 0x305B; + _halfwidth_fullwidthMap[0x7F] = 0x305D; + _halfwidth_fullwidthMap[0x80] = 0x305F; + _halfwidth_fullwidthMap[0x81] = 0x3061; + _halfwidth_fullwidthMap[0x82] = 0x3064; + _halfwidth_fullwidthMap[0x83] = 0x3066; + _halfwidth_fullwidthMap[0x84] = 0x3068; + _halfwidth_fullwidthMap[0x85] = 0x306A; + _halfwidth_fullwidthMap[0x86] = 0x306B; + _halfwidth_fullwidthMap[0x87] = 0x306C; + _halfwidth_fullwidthMap[0x88] = 0x306D; + _halfwidth_fullwidthMap[0x89] = 0x306E; + _halfwidth_fullwidthMap[0x8A] = 0x306F; + _halfwidth_fullwidthMap[0x8B] = 0x3072; + _halfwidth_fullwidthMap[0x8C] = 0x3075; + _halfwidth_fullwidthMap[0x8D] = 0x3078; + _halfwidth_fullwidthMap[0x8E] = 0x307B; + _halfwidth_fullwidthMap[0x8F] = 0x307E; + _halfwidth_fullwidthMap[0x90] = 0x307F; + _halfwidth_fullwidthMap[0x91] = 0x3080; + _halfwidth_fullwidthMap[0x92] = 0x3081; + _halfwidth_fullwidthMap[0x93] = 0x3082; + _halfwidth_fullwidthMap[0x94] = 0x3084; + _halfwidth_fullwidthMap[0x95] = 0x3086; + _halfwidth_fullwidthMap[0x96] = 0x3088; + _halfwidth_fullwidthMap[0x97] = 0x3089; + _halfwidth_fullwidthMap[0x98] = 0x308A; + _halfwidth_fullwidthMap[0x99] = 0x308B; + _halfwidth_fullwidthMap[0x9A] = 0x308C; + _halfwidth_fullwidthMap[0x9B] = 0x308D; + _halfwidth_fullwidthMap[0x9C] = 0x308F; + _halfwidth_fullwidthMap[0x9D] = 0x3093; + _halfwidth_fullwidthMap[0x9E] = 0x3099; + _halfwidth_fullwidthMap[0x9F] = 0x309A; + if (_doSmallToNormalKana) { + _halfwidth_fullwidthMap[0x67] = 0x3042; + _halfwidth_fullwidthMap[0x68] = 0x3044; + _halfwidth_fullwidthMap[0x69] = 0x3046; + _halfwidth_fullwidthMap[0x6A] = 0x3048; + _halfwidth_fullwidthMap[0x6B] = 0x304A; + _halfwidth_fullwidthMap[0x6C] = 0x3084; + _halfwidth_fullwidthMap[0x6D] = 0x3086; + _halfwidth_fullwidthMap[0x6E] = 0x3088; + } else { // !_doSmallToNormalKana + _halfwidth_fullwidthMap[0x67] = 0x3041; + _halfwidth_fullwidthMap[0x68] = 0x3043; + _halfwidth_fullwidthMap[0x69] = 0x3045; + _halfwidth_fullwidthMap[0x6A] = 0x3047; + _halfwidth_fullwidthMap[0x6B] = 0x3049; + _halfwidth_fullwidthMap[0x6C] = 0x3083; + _halfwidth_fullwidthMap[0x6D] = 0x3085; + _halfwidth_fullwidthMap[0x6E] = 0x3087; + } + } else { // !_doKatakanaToHiragana + _halfwidth_fullwidthMap[0x66] = 0x30F2; + _halfwidth_fullwidthMap[0x6F] = 0x30C3; + _halfwidth_fullwidthMap[0x70] = 0x30FC; + _halfwidth_fullwidthMap[0x71] = 0x30A2; + _halfwidth_fullwidthMap[0x72] = 0x30A4; + _halfwidth_fullwidthMap[0x73] = 0x30A6; + _halfwidth_fullwidthMap[0x74] = 0x30A8; + _halfwidth_fullwidthMap[0x75] = 0x30AA; + _halfwidth_fullwidthMap[0x76] = 0x30AB; + _halfwidth_fullwidthMap[0x77] = 0x30AD; + _halfwidth_fullwidthMap[0x78] = 0x30AF; + _halfwidth_fullwidthMap[0x79] = 0x30B1; + _halfwidth_fullwidthMap[0x7A] = 0x30B3; + _halfwidth_fullwidthMap[0x7B] = 0x30B5; + _halfwidth_fullwidthMap[0x7C] = 0x30B7; + _halfwidth_fullwidthMap[0x7D] = 0x30B9; + _halfwidth_fullwidthMap[0x7E] = 0x30BB; + _halfwidth_fullwidthMap[0x7F] = 0x30BD; + _halfwidth_fullwidthMap[0x80] = 0x30BF; + _halfwidth_fullwidthMap[0x81] = 0x30C1; + _halfwidth_fullwidthMap[0x82] = 0x30C4; + _halfwidth_fullwidthMap[0x83] = 0x30C6; + _halfwidth_fullwidthMap[0x84] = 0x30C8; + _halfwidth_fullwidthMap[0x85] = 0x30CA; + _halfwidth_fullwidthMap[0x86] = 0x30CB; + _halfwidth_fullwidthMap[0x87] = 0x30CC; + _halfwidth_fullwidthMap[0x88] = 0x30CD; + _halfwidth_fullwidthMap[0x89] = 0x30CE; + _halfwidth_fullwidthMap[0x8A] = 0x30CF; + _halfwidth_fullwidthMap[0x8B] = 0x30D2; + _halfwidth_fullwidthMap[0x8C] = 0x30D5; + _halfwidth_fullwidthMap[0x8D] = 0x30D8; + _halfwidth_fullwidthMap[0x8E] = 0x30DB; + _halfwidth_fullwidthMap[0x8F] = 0x30DE; + _halfwidth_fullwidthMap[0x90] = 0x30DF; + _halfwidth_fullwidthMap[0x91] = 0x30E0; + _halfwidth_fullwidthMap[0x92] = 0x30E1; + _halfwidth_fullwidthMap[0x93] = 0x30E2; + _halfwidth_fullwidthMap[0x94] = 0x30E4; + _halfwidth_fullwidthMap[0x95] = 0x30E6; + _halfwidth_fullwidthMap[0x96] = 0x30E8; + _halfwidth_fullwidthMap[0x97] = 0x30E9; + _halfwidth_fullwidthMap[0x98] = 0x30EA; + _halfwidth_fullwidthMap[0x99] = 0x30EB; + _halfwidth_fullwidthMap[0x9A] = 0x30EC; + _halfwidth_fullwidthMap[0x9B] = 0x30ED; + _halfwidth_fullwidthMap[0x9C] = 0x30EF; + _halfwidth_fullwidthMap[0x9D] = 0x30F3; + _halfwidth_fullwidthMap[0x9E] = 0x3099; + _halfwidth_fullwidthMap[0x9F] = 0x309A; + if (_doSmallToNormalKana) { + _halfwidth_fullwidthMap[0x67] = 0x30a2; + _halfwidth_fullwidthMap[0x68] = 0x30a4; + _halfwidth_fullwidthMap[0x69] = 0x30a6; + _halfwidth_fullwidthMap[0x6A] = 0x30a8; + _halfwidth_fullwidthMap[0x6B] = 0x30aA; + _halfwidth_fullwidthMap[0x6C] = 0x30e4; + _halfwidth_fullwidthMap[0x6D] = 0x30e6; + _halfwidth_fullwidthMap[0x6E] = 0x30e8; + } else { // !_doSmallToNormalKana + _halfwidth_fullwidthMap[0x67] = 0x30a1; + _halfwidth_fullwidthMap[0x68] = 0x30a3; + _halfwidth_fullwidthMap[0x69] = 0x30a5; + _halfwidth_fullwidthMap[0x6A] = 0x30a7; + _halfwidth_fullwidthMap[0x6B] = 0x30a9; + _halfwidth_fullwidthMap[0x6C] = 0x30e3; + _halfwidth_fullwidthMap[0x6D] = 0x30e5; + _halfwidth_fullwidthMap[0x6E] = 0x30e7; + } + } - // Halfwidth Hangul - _halfwidth_fullwidthMap[0xA0] = 0x3164; - // fill in 0xFFA1 - 0xFFBE => 0x3131 - 0x314E - for (i = 0xA1; i < 0xBF; i++) - _halfwidth_fullwidthMap[i] = 0x3090 + i; - _halfwidth_fullwidthMap[0xBF] = 0xFFBF; - _halfwidth_fullwidthMap[0xC0] = 0xFFC0; - _halfwidth_fullwidthMap[0xC1] = 0xFFC1; - // fill in 0xFFC2 - 0xFFC7 => 0x314F - 0x3154 - for (i = 0xC2; i < 0xC8; i++) - _halfwidth_fullwidthMap[i] = 0x308D + i; - _halfwidth_fullwidthMap[0xC8] = 0xFFC8; - _halfwidth_fullwidthMap[0xC9] = 0xFFC9; - // fill in 0xFFCA - 0xFFCF => 0x3155 - 0x315A - for (i = 0xCA; i < 0xD0; i++) - _halfwidth_fullwidthMap[i] = 0x308B + i; - _halfwidth_fullwidthMap[0xD0] = 0xFFD0; - _halfwidth_fullwidthMap[0xD1] = 0xFFD1; - // fill in 0xFFD2 - 0xFFD7 => 0x315B - 0x3160 - for (i = 0xD2; i < 0xD8; i++) - _halfwidth_fullwidthMap[i] = 0x3089 + i; - _halfwidth_fullwidthMap[0xD8] = 0xFFD8; - _halfwidth_fullwidthMap[0xD9] = 0xFFD9; - // fill in 0xFFDA - 0xFFDC => 0x3161 - 0x3163 - for (i = 0xDA; i < 0xDD; i++) - _halfwidth_fullwidthMap[i] = 0x3087 + i; + // Halfwidth Hangul + _halfwidth_fullwidthMap[0xA0] = 0x3164; + // fill in 0xFFA1 - 0xFFBE => 0x3131 - 0x314E + for (i = 0xA1; i < 0xBF; i++) + _halfwidth_fullwidthMap[i] = 0x3090 + i; + _halfwidth_fullwidthMap[0xBF] = 0xFFBF; + _halfwidth_fullwidthMap[0xC0] = 0xFFC0; + _halfwidth_fullwidthMap[0xC1] = 0xFFC1; + // fill in 0xFFC2 - 0xFFC7 => 0x314F - 0x3154 + for (i = 0xC2; i < 0xC8; i++) + _halfwidth_fullwidthMap[i] = 0x308D + i; + _halfwidth_fullwidthMap[0xC8] = 0xFFC8; + _halfwidth_fullwidthMap[0xC9] = 0xFFC9; + // fill in 0xFFCA - 0xFFCF => 0x3155 - 0x315A + for (i = 0xCA; i < 0xD0; i++) + _halfwidth_fullwidthMap[i] = 0x308B + i; + _halfwidth_fullwidthMap[0xD0] = 0xFFD0; + _halfwidth_fullwidthMap[0xD1] = 0xFFD1; + // fill in 0xFFD2 - 0xFFD7 => 0x315B - 0x3160 + for (i = 0xD2; i < 0xD8; i++) + _halfwidth_fullwidthMap[i] = 0x3089 + i; + _halfwidth_fullwidthMap[0xD8] = 0xFFD8; + _halfwidth_fullwidthMap[0xD9] = 0xFFD9; + // fill in 0xFFDA - 0xFFDC => 0x3161 - 0x3163 + for (i = 0xDA; i < 0xDD; i++) + _halfwidth_fullwidthMap[i] = 0x3087 + i; - // Fullwidth symbols - _halfwidth_fullwidthMap[0xE0] = 0x00A2; - _halfwidth_fullwidthMap[0xE1] = 0x00A3; - _halfwidth_fullwidthMap[0xE2] = 0x00AC; - _halfwidth_fullwidthMap[0xE3] = 0x00AF; - _halfwidth_fullwidthMap[0xE4] = 0x00A6; - _halfwidth_fullwidthMap[0xE5] = 0x00A5; - _halfwidth_fullwidthMap[0xE6] = 0x20A9; + // Fullwidth symbols + _halfwidth_fullwidthMap[0xE0] = 0x00A2; + _halfwidth_fullwidthMap[0xE1] = 0x00A3; + _halfwidth_fullwidthMap[0xE2] = 0x00AC; + _halfwidth_fullwidthMap[0xE3] = 0x00AF; + _halfwidth_fullwidthMap[0xE4] = 0x00A6; + _halfwidth_fullwidthMap[0xE5] = 0x00A5; + _halfwidth_fullwidthMap[0xE6] = 0x20A9; - // 0xFFE7 -> id - _halfwidth_fullwidthMap[0xE7] = 0xFFE7; + // 0xFFE7 -> id + _halfwidth_fullwidthMap[0xE7] = 0xFFE7; - // Halfwidth symbols - _halfwidth_fullwidthMap[0xE8] = 0x2502; - _halfwidth_fullwidthMap[0xE9] = 0x2190; - _halfwidth_fullwidthMap[0xEA] = 0x2191; - _halfwidth_fullwidthMap[0xEB] = 0x2192; - _halfwidth_fullwidthMap[0xEC] = 0x2193; - _halfwidth_fullwidthMap[0xED] = 0x25A0; - _halfwidth_fullwidthMap[0xEE] = 0x25CB; + // Halfwidth symbols + _halfwidth_fullwidthMap[0xE8] = 0x2502; + _halfwidth_fullwidthMap[0xE9] = 0x2190; + _halfwidth_fullwidthMap[0xEA] = 0x2191; + _halfwidth_fullwidthMap[0xEB] = 0x2192; + _halfwidth_fullwidthMap[0xEC] = 0x2193; + _halfwidth_fullwidthMap[0xED] = 0x25A0; + _halfwidth_fullwidthMap[0xEE] = 0x25CB; - // 0xFFEF -> id - _halfwidth_fullwidthMap[0xEF] = 0xFFEF; + // 0xFFEF -> id + _halfwidth_fullwidthMap[0xEF] = 0xFFEF; - // - // DONE - // - _isInitialized = true; + // + // DONE + // + _isInitialized = true; + } + _initMutex.Unlock(); } - _initMutex.Unlock(); - } } Fast_NormalizeWordFolder::Fast_NormalizeWordFolder() { - Initialize(); + Initialize(); } @@ -723,259 +723,259 @@ Fast_NormalizeWordFolder::~Fast_NormalizeWordFolder(void) size_t Fast_NormalizeWordFolder::FoldedSizeAsUTF8(const char *word) const { - ucs4_t c; - size_t res; - const unsigned char *uword; + ucs4_t c; + size_t res; + const unsigned char *uword; - res = 0; - uword = reinterpret_cast(word); - c = Fast_UnicodeUtil::GetUTF8Char(uword); - while (c != 0) { - if (c != Fast_UnicodeUtil::_BadUTF8Char) { - const char *repl = ReplacementString(c); - if (repl != NULL) { - res += strlen(repl); - } else { - c = ToFold(c); - res += Fast_UnicodeUtil::utf8clen(c); - } - } + res = 0; + uword = reinterpret_cast(word); c = Fast_UnicodeUtil::GetUTF8Char(uword); - } - return res; + while (c != 0) { + if (c != Fast_UnicodeUtil::_BadUTF8Char) { + const char *repl = ReplacementString(c); + if (repl != NULL) { + res += strlen(repl); + } else { + c = ToFold(c); + res += Fast_UnicodeUtil::utf8clen(c); + } + } + c = Fast_UnicodeUtil::GetUTF8Char(uword); + } + return res; } char * Fast_NormalizeWordFolder::FoldUTF8WordToUTF8Quick(char *wordbufpos, - const char *word) - const + const char *word) + const { - ucs4_t c; - const unsigned char *uword; + ucs4_t c; + const unsigned char *uword; - uword = reinterpret_cast(word); - c = Fast_UnicodeUtil::GetUTF8Char(uword); - while (c != 0) { - if (c != Fast_UnicodeUtil::_BadUTF8Char) { - const char *repl = ReplacementString(c); - if (repl != NULL) { - size_t repllen = strlen(repl); - if (repllen > 0) - memcpy(wordbufpos, repl, repllen); - wordbufpos += repllen; - } else { - c = ToFold(c); - wordbufpos = Fast_UnicodeUtil::utf8cput(wordbufpos, c); - } - } + uword = reinterpret_cast(word); c = Fast_UnicodeUtil::GetUTF8Char(uword); - } - return wordbufpos; + while (c != 0) { + if (c != Fast_UnicodeUtil::_BadUTF8Char) { + const char *repl = ReplacementString(c); + if (repl != NULL) { + size_t repllen = strlen(repl); + if (repllen > 0) + memcpy(wordbufpos, repl, repllen); + wordbufpos += repllen; + } else { + c = ToFold(c); + wordbufpos = Fast_UnicodeUtil::utf8cput(wordbufpos, c); + } + } + c = Fast_UnicodeUtil::GetUTF8Char(uword); + } + return wordbufpos; } const char* Fast_NormalizeWordFolder::Tokenize(const char *buf, - const char *bufend, - char *dstbuf, - char *dstbufend, - const char*& origstart, - size_t& tokenlen) const + const char *bufend, + char *dstbuf, + char *dstbufend, + const char*& origstart, + size_t& tokenlen) const { - ucs4_t c = 0; - const unsigned char *p; - char *q = NULL; - char *eq = NULL; - const unsigned char *ep; - p = reinterpret_cast(buf); - ep = reinterpret_cast(bufend); + ucs4_t c = 0; + const unsigned char *p; + char *q = NULL; + char *eq = NULL; + const unsigned char *ep; + p = reinterpret_cast(buf); + ep = reinterpret_cast(bufend); - // Skip characters between words - for (;;) { - if (p >= ep) { // End of input buffer, no more words - *dstbuf = 0; - return reinterpret_cast(p); - } - if (*p < 128) { // Common case, ASCII - c = *p++; - if (_isWord[c]) - { - origstart = reinterpret_cast(p) - 1; - break; - } - } else { - const unsigned char* prev_p = p; - c = Fast_UnicodeUtil::GetUTF8Char(p); - if (IsWordCharOrIA(c)) - { - origstart = reinterpret_cast(prev_p); - break; - } + // Skip characters between words + for (;;) { + if (p >= ep) { // End of input buffer, no more words + *dstbuf = 0; + return reinterpret_cast(p); + } + if (*p < 128) { // Common case, ASCII + c = *p++; + if (_isWord[c]) + { + origstart = reinterpret_cast(p) - 1; + break; + } + } else { + const unsigned char* prev_p = p; + c = Fast_UnicodeUtil::GetUTF8Char(p); + if (IsWordCharOrIA(c)) + { + origstart = reinterpret_cast(prev_p); + break; + } + } } - } - // Start saving word. - q = dstbuf; - eq = dstbufend - 6; // Make room for long UTF8 char and NUL - // Doesn't check for space for the first char, assumes that - // word buffer is at least 13 characters - if (c < 128) { // Common case, ASCII - *q++ = _foldCase[c]; - } else { - const char *repl = ReplacementString(c); - if (repl != NULL) { - size_t repllen = strlen(repl); - if (repllen > 0) - memcpy(q, repl, repllen); - q += repllen; + // Start saving word. + q = dstbuf; + eq = dstbufend - 6; // Make room for long UTF8 char and NUL + // Doesn't check for space for the first char, assumes that + // word buffer is at least 13 characters + if (c < 128) { // Common case, ASCII + *q++ = _foldCase[c]; } else { - c = ToFold(c); - q = Fast_UnicodeUtil::utf8cput(q, c); + const char *repl = ReplacementString(c); + if (repl != NULL) { + size_t repllen = strlen(repl); + if (repllen > 0) + memcpy(q, repl, repllen); + q += repllen; + } else { + c = ToFold(c); + q = Fast_UnicodeUtil::utf8cput(q, c); + } } - } - // Special case for interlinear annotation - if (c == 0xFFF9) { // ANCHOR - // Collect up to and including terminator - for(;;) { - if (p >= ep) { - c = 0; - break; - } - if (*p < 128) { // Note, no exit on plain ASCII - c = *p++; - *q++ = c; - if (q >= eq) { // Junk rest of annotation block - for (;;) { - if (p >= ep) { // End of input buffer - c = 0; - break; - } - if (*p < 128) { // Common case, ASCII - c = *p++; - } else { - c = Fast_UnicodeUtil::GetUTF8Char(p); - if (c == 0xFFFB) { - break; // out of junking loop - } - } - } - break; // out of annotation block processing - } - } else { - c = Fast_UnicodeUtil::GetUTF8Char(p); - q = Fast_UnicodeUtil::utf8cput(q, c); - if (c == 0xFFFB) { // TERMINATOR => Exit condition - break; - } - if (q >= eq) { // Junk rest of word - for (;;) { - if (p >= ep) { // End of input buffer - c = 0; - break; - } - if (*p < 128) { // Common case, ASCII - c = *p++; - } else { - c = Fast_UnicodeUtil::GetUTF8Char(p); - if (c == 0xFFFB) { - break; - } - } - } - break; - } - } - } - } else + // Special case for interlinear annotation + if (c == 0xFFF9) { // ANCHOR + // Collect up to and including terminator + for(;;) { + if (p >= ep) { + c = 0; + break; + } + if (*p < 128) { // Note, no exit on plain ASCII + c = *p++; + *q++ = c; + if (q >= eq) { // Junk rest of annotation block + for (;;) { + if (p >= ep) { // End of input buffer + c = 0; + break; + } + if (*p < 128) { // Common case, ASCII + c = *p++; + } else { + c = Fast_UnicodeUtil::GetUTF8Char(p); + if (c == 0xFFFB) { + break; // out of junking loop + } + } + } + break; // out of annotation block processing + } + } else { + c = Fast_UnicodeUtil::GetUTF8Char(p); + q = Fast_UnicodeUtil::utf8cput(q, c); + if (c == 0xFFFB) { // TERMINATOR => Exit condition + break; + } + if (q >= eq) { // Junk rest of word + for (;;) { + if (p >= ep) { // End of input buffer + c = 0; + break; + } + if (*p < 128) { // Common case, ASCII + c = *p++; + } else { + c = Fast_UnicodeUtil::GetUTF8Char(p); + if (c == 0xFFFB) { + break; + } + } + } + break; + } + } + } + } else - for (;;) { - if (p >= ep) { // End of input buffer - c = 0; - break; - } - if (*p < 128) { // Common case, ASCII - c = *p++; - if (!_isWord[c]) - { - p--; - break; - } - *q++ = _foldCase[c]; - if (q >= eq) { // Junk rest of word - for (;;) { - if (p >= ep) { // End of input buffer - c = 0; - break; - } - if (*p < 128) { // Common case, ASCII - c = *p++; - if (!_isWord[c]) - { - p--; - break; - } - } else { - const unsigned char* prev_p = p; - c = Fast_UnicodeUtil::GetUTF8Char(p); - if (!Fast_UnicodeUtil::IsWordChar(c)) - { - p = prev_p; - break; - } - } - } - break; - } - } else { - const unsigned char* prev_p = p; - c = Fast_UnicodeUtil::GetUTF8Char(p); - if (!Fast_UnicodeUtil::IsWordChar(c)) - { - p = prev_p; - break; - } - const char *repl = ReplacementString(c); - if (repl != NULL) { - size_t repllen = strlen(repl); - if (repllen > 0) - memcpy(q, repl, repllen); - q += repllen; - } else { - c = ToFold(c); - q = Fast_UnicodeUtil::utf8cput(q, c); - } - if (q >= eq) { // Junk rest of word - for (;;) { - if (p >= ep) { // End of input buffer - c = 0; - break; - } - if (*p < 128) { // Common case, ASCII - c = *p++; - if (!_isWord[c]) - { - p--; - break; - } - } else { - const unsigned char* xprev_p = p; - c = Fast_UnicodeUtil::GetUTF8Char(p); - if (!Fast_UnicodeUtil::IsWordChar(c)) - { - p = xprev_p; - break; - } - } - } - break; - } - } - } - *q = 0; - tokenlen = q - dstbuf; - return reinterpret_cast(p); + for (;;) { + if (p >= ep) { // End of input buffer + c = 0; + break; + } + if (*p < 128) { // Common case, ASCII + c = *p++; + if (!_isWord[c]) + { + p--; + break; + } + *q++ = _foldCase[c]; + if (q >= eq) { // Junk rest of word + for (;;) { + if (p >= ep) { // End of input buffer + c = 0; + break; + } + if (*p < 128) { // Common case, ASCII + c = *p++; + if (!_isWord[c]) + { + p--; + break; + } + } else { + const unsigned char* prev_p = p; + c = Fast_UnicodeUtil::GetUTF8Char(p); + if (!Fast_UnicodeUtil::IsWordChar(c)) + { + p = prev_p; + break; + } + } + } + break; + } + } else { + const unsigned char* prev_p = p; + c = Fast_UnicodeUtil::GetUTF8Char(p); + if (!Fast_UnicodeUtil::IsWordChar(c)) + { + p = prev_p; + break; + } + const char *repl = ReplacementString(c); + if (repl != NULL) { + size_t repllen = strlen(repl); + if (repllen > 0) + memcpy(q, repl, repllen); + q += repllen; + } else { + c = ToFold(c); + q = Fast_UnicodeUtil::utf8cput(q, c); + } + if (q >= eq) { // Junk rest of word + for (;;) { + if (p >= ep) { // End of input buffer + c = 0; + break; + } + if (*p < 128) { // Common case, ASCII + c = *p++; + if (!_isWord[c]) + { + p--; + break; + } + } else { + const unsigned char* xprev_p = p; + c = Fast_UnicodeUtil::GetUTF8Char(p); + if (!Fast_UnicodeUtil::IsWordChar(c)) + { + p = xprev_p; + break; + } + } + } + break; + } + } + } + *q = 0; + tokenlen = q - dstbuf; + return reinterpret_cast(p); } @@ -988,207 +988,207 @@ Fast_NormalizeWordFolder::UCS4Tokenize(const char *buf, const char*& origstart, size_t& tokenlen) const { - return Tokenize(buf, bufend, dstbuf, dstbufend, origstart, tokenlen); + return Tokenize(buf, bufend, dstbuf, dstbufend, origstart, tokenlen); } const char* Fast_NormalizeWordFolder::Tokenize(const char *buf, - const char *bufend, - ucs4_t *dstbuf, - ucs4_t *dstbufend, - const char*& origstart, - size_t& tokenlen) const + const char *bufend, + ucs4_t *dstbuf, + ucs4_t *dstbufend, + const char*& origstart, + size_t& tokenlen) const { - ucs4_t c = 0; - const unsigned char *p; - ucs4_t *q = NULL; - ucs4_t *eq = NULL; - const unsigned char *ep; - p = reinterpret_cast(buf); - ep = reinterpret_cast(bufend); + ucs4_t c = 0; + const unsigned char *p; + ucs4_t *q = NULL; + ucs4_t *eq = NULL; + const unsigned char *ep; + p = reinterpret_cast(buf); + ep = reinterpret_cast(bufend); - // Skip characters between words - for (;;) { - if (p >= ep) { // End of input buffer, no more words - *dstbuf = 0; - return reinterpret_cast(p); - } - if (*p < 128) { // Common case, ASCII - c = *p++; - if (_isWord[c]) - { - origstart = reinterpret_cast(p) - 1; - break; - } - } else { - const unsigned char* prev_p = p; - c = Fast_UnicodeUtil::GetUTF8Char(p); - if (IsWordCharOrIA(c)) - { - origstart = reinterpret_cast(prev_p); - break; - } + // Skip characters between words + for (;;) { + if (p >= ep) { // End of input buffer, no more words + *dstbuf = 0; + return reinterpret_cast(p); + } + if (*p < 128) { // Common case, ASCII + c = *p++; + if (_isWord[c]) + { + origstart = reinterpret_cast(p) - 1; + break; + } + } else { + const unsigned char* prev_p = p; + c = Fast_UnicodeUtil::GetUTF8Char(p); + if (IsWordCharOrIA(c)) + { + origstart = reinterpret_cast(prev_p); + break; + } + } } - } - // Start saving word. - q = dstbuf; - eq = dstbufend - 3; // Make room for UCS4 char replacement string and NUL - // Doesn't check for space for the first char, assumes that - // word buffer is at least 13 characters - if (c < 128) { // Common case, ASCII - *q++ = _foldCase[c]; - } else { - const char *repl = ReplacementString(c); - if (repl != NULL) { - size_t repllen = strlen(repl); - if (repllen > 0) - q = Fast_UnicodeUtil::ucs4copy(q,repl); + // Start saving word. + q = dstbuf; + eq = dstbufend - 3; // Make room for UCS4 char replacement string and NUL + // Doesn't check for space for the first char, assumes that + // word buffer is at least 13 characters + if (c < 128) { // Common case, ASCII + *q++ = _foldCase[c]; } else { - c = ToFold(c); - *q++ = c; + const char *repl = ReplacementString(c); + if (repl != NULL) { + size_t repllen = strlen(repl); + if (repllen > 0) + q = Fast_UnicodeUtil::ucs4copy(q,repl); + } else { + c = ToFold(c); + *q++ = c; + } } - } - // Special case for interlinear annotation - if (c == 0xFFF9) { // ANCHOR - // Collect up to and including terminator - for(;;) { - if (p >= ep) { - c = 0; - break; - } - if (*p < 128) { // Note, no exit on plain ASCII - c = *p++; - *q++ = c; - if (q >= eq) { // Junk rest of annotation block - for (;;) { - if (p >= ep) { // End of input buffer - c = 0; - break; - } - if (*p < 128) { // Common case, ASCII - c = *p++; - } else { - c = Fast_UnicodeUtil::GetUTF8Char(p); - if (c == 0xFFFB) { - break; // out of junking loop - } - } - } - break; // out of annotation block processing - } - } else { - c = Fast_UnicodeUtil::GetUTF8Char(p); - *q++ = c; - if (c == 0xFFFB) { // TERMINATOR => Exit condition - break; - } - if (q >= eq) { // Junk rest of word - for (;;) { - if (p >= ep) { // End of input buffer - c = 0; - break; - } - if (*p < 128) { // Common case, ASCII - c = *p++; - } else { - c = Fast_UnicodeUtil::GetUTF8Char(p); - if (c == 0xFFFB) { - break; - } - } - } - break; - } - } - } - } else + // Special case for interlinear annotation + if (c == 0xFFF9) { // ANCHOR + // Collect up to and including terminator + for(;;) { + if (p >= ep) { + c = 0; + break; + } + if (*p < 128) { // Note, no exit on plain ASCII + c = *p++; + *q++ = c; + if (q >= eq) { // Junk rest of annotation block + for (;;) { + if (p >= ep) { // End of input buffer + c = 0; + break; + } + if (*p < 128) { // Common case, ASCII + c = *p++; + } else { + c = Fast_UnicodeUtil::GetUTF8Char(p); + if (c == 0xFFFB) { + break; // out of junking loop + } + } + } + break; // out of annotation block processing + } + } else { + c = Fast_UnicodeUtil::GetUTF8Char(p); + *q++ = c; + if (c == 0xFFFB) { // TERMINATOR => Exit condition + break; + } + if (q >= eq) { // Junk rest of word + for (;;) { + if (p >= ep) { // End of input buffer + c = 0; + break; + } + if (*p < 128) { // Common case, ASCII + c = *p++; + } else { + c = Fast_UnicodeUtil::GetUTF8Char(p); + if (c == 0xFFFB) { + break; + } + } + } + break; + } + } + } + } else - for (;;) { - if (p >= ep) { // End of input buffer - c = 0; - break; - } - if (*p < 128) { // Common case, ASCII - c = *p++; - if (!_isWord[c]) - { - p--; - break; - } - *q++ = _foldCase[c]; - if (q >= eq) { // Junk rest of word - for (;;) { - if (p >= ep) { // End of input buffer - c = 0; - break; - } - if (*p < 128) { // Common case, ASCII - c = *p++; - if (!_isWord[c]) - { - p--; - break; - } - } else { - const unsigned char* prev_p = p; - c = Fast_UnicodeUtil::GetUTF8Char(p); - if (!Fast_UnicodeUtil::IsWordChar(c)) - { - p = prev_p; - break; - } - } - } - break; - } - } else { - const unsigned char* prev_p = p; - c = Fast_UnicodeUtil::GetUTF8Char(p); - if (!Fast_UnicodeUtil::IsWordChar(c)) - { - p = prev_p; - break; - } - const char *repl = ReplacementString(c); - if (repl != NULL) { - size_t repllen = strlen(repl); - if (repllen > 0) - q = Fast_UnicodeUtil::ucs4copy(q,repl); - } else { - c = ToFold(c); - *q++ = c; - } - if (q >= eq) { // Junk rest of word - for (;;) { - if (p >= ep) { // End of input buffer - c = 0; - break; - } - if (*p < 128) { // Common case, ASCII - c = *p++; - if (!_isWord[c]) - { - p--; - break; - } - } else { - const unsigned char* xprev_p = p; - c = Fast_UnicodeUtil::GetUTF8Char(p); - if (!Fast_UnicodeUtil::IsWordChar(c)) - { - p = xprev_p; - break; - } - } - } - break; - } - } - } - *q = 0; - tokenlen = q - dstbuf; - return reinterpret_cast(p); + for (;;) { + if (p >= ep) { // End of input buffer + c = 0; + break; + } + if (*p < 128) { // Common case, ASCII + c = *p++; + if (!_isWord[c]) + { + p--; + break; + } + *q++ = _foldCase[c]; + if (q >= eq) { // Junk rest of word + for (;;) { + if (p >= ep) { // End of input buffer + c = 0; + break; + } + if (*p < 128) { // Common case, ASCII + c = *p++; + if (!_isWord[c]) + { + p--; + break; + } + } else { + const unsigned char* prev_p = p; + c = Fast_UnicodeUtil::GetUTF8Char(p); + if (!Fast_UnicodeUtil::IsWordChar(c)) + { + p = prev_p; + break; + } + } + } + break; + } + } else { + const unsigned char* prev_p = p; + c = Fast_UnicodeUtil::GetUTF8Char(p); + if (!Fast_UnicodeUtil::IsWordChar(c)) + { + p = prev_p; + break; + } + const char *repl = ReplacementString(c); + if (repl != NULL) { + size_t repllen = strlen(repl); + if (repllen > 0) + q = Fast_UnicodeUtil::ucs4copy(q,repl); + } else { + c = ToFold(c); + *q++ = c; + } + if (q >= eq) { // Junk rest of word + for (;;) { + if (p >= ep) { // End of input buffer + c = 0; + break; + } + if (*p < 128) { // Common case, ASCII + c = *p++; + if (!_isWord[c]) + { + p--; + break; + } + } else { + const unsigned char* xprev_p = p; + c = Fast_UnicodeUtil::GetUTF8Char(p); + if (!Fast_UnicodeUtil::IsWordChar(c)) + { + p = xprev_p; + break; + } + } + } + break; + } + } + } + *q = 0; + tokenlen = q - dstbuf; + return reinterpret_cast(p); } diff --git a/fastlib/src/vespa/fastlib/text/normwordfolder.h b/fastlib/src/vespa/fastlib/text/normwordfolder.h index d368b6177db..65163c851af 100644 --- a/fastlib/src/vespa/fastlib/text/normwordfolder.h +++ b/fastlib/src/vespa/fastlib/text/normwordfolder.h @@ -12,161 +12,161 @@ class Fast_NormalizeWordFolder : public Fast_WordFolder { private: - static bool _isInitialized; - - /** Features */ - static bool _doAccentRemoval; - static bool _doSmallToNormalKana; - static bool _doKatakanaToHiragana; - static bool _doKanaAccentCollapsing; - static bool _doFullwidthToBasicLatin; - static bool _doSharpSSubstitution; - static bool _doLigatureSubstitution; - static bool _doMulticharExpansion; - - /** - * Freeze the config, either from call to Setup, environment - * or defaults. - */ - static void Initialize(); + static bool _isInitialized; + + /** Features */ + static bool _doAccentRemoval; + static bool _doSmallToNormalKana; + static bool _doKatakanaToHiragana; + static bool _doKanaAccentCollapsing; + static bool _doFullwidthToBasicLatin; + static bool _doSharpSSubstitution; + static bool _doLigatureSubstitution; + static bool _doMulticharExpansion; + + /** + * Freeze the config, either from call to Setup, environment + * or defaults. + */ + static void Initialize(); public: - enum { - DO_ACCENT_REMOVAL = 0x1 << 0, - DO_SMALL_TO_NORMAL_KANA = 0x1 << 1, - DO_KATAKANA_TO_HIRAGANA = 0x1 << 2, - DO_KANA_ACCENT_COLLAPSING = 0x1 << 3, // Code not implemented - DO_FULLWIDTH_TO_BASIC_LATIN = 0x1 << 4, // Code not implemented - DO_SHARP_S_SUBSTITUTION = 0x1 << 5, - DO_LIGATURE_SUBSTITUTION = 0x1 << 6, - DO_MULTICHAR_EXPANSION = 0x1 << 7 - }; - /** - * Setup behaviour prior to constructing an object. - * Not needed if default behaviour is wanted. The default is - * DO_ACCENT_REMOVAL + DO_SHARP_S_SUBSTITUTION + DO_LIGATURE_SUBSTITUTION. - * - * @param flags The flags should be taken from the DO_ constants, - * added together. - */ - static void Setup(uint32_t flags); + enum { + DO_ACCENT_REMOVAL = 0x1 << 0, + DO_SMALL_TO_NORMAL_KANA = 0x1 << 1, + DO_KATAKANA_TO_HIRAGANA = 0x1 << 2, + DO_KANA_ACCENT_COLLAPSING = 0x1 << 3, // Code not implemented + DO_FULLWIDTH_TO_BASIC_LATIN = 0x1 << 4, // Code not implemented + DO_SHARP_S_SUBSTITUTION = 0x1 << 5, + DO_LIGATURE_SUBSTITUTION = 0x1 << 6, + DO_MULTICHAR_EXPANSION = 0x1 << 7 + }; + /** + * Setup behaviour prior to constructing an object. + * Not needed if default behaviour is wanted. The default is + * DO_ACCENT_REMOVAL + DO_SHARP_S_SUBSTITUTION + DO_LIGATURE_SUBSTITUTION. + * + * @param flags The flags should be taken from the DO_ constants, + * added together. + */ + static void Setup(uint32_t flags); public: - /** character tables */ - static bool _isWord[128]; - static ucs4_t _foldCase[767]; // Up to Spacing Modifiers, inclusize (0x02FF) - static ucs4_t _foldCaseHighAscii[256]; // Latin Extended Additional (0x1E00 - 0x1F00) (incl. vietnamese) + /** character tables */ + static bool _isWord[128]; + static ucs4_t _foldCase[767]; // Up to Spacing Modifiers, inclusize (0x02FF) + static ucs4_t _foldCaseHighAscii[256]; // Latin Extended Additional (0x1E00 - 0x1F00) (incl. vietnamese) private: - static ucs4_t _keepCase[767]; - static ucs4_t _keepCaseHighAscii[256]; - /** Map the values from range 0x3040 (0) - 0x30FF (191). */ - static ucs4_t _kanaMap[192]; - static ucs4_t _halfwidth_fullwidthMap[240]; + static ucs4_t _keepCase[767]; + static ucs4_t _keepCaseHighAscii[256]; + /** Map the values from range 0x3040 (0) - 0x30FF (191). */ + static ucs4_t _kanaMap[192]; + static ucs4_t _halfwidth_fullwidthMap[240]; public: - static ucs4_t ToFold(ucs4_t testchar) { - if (testchar < 767) - return _foldCase[testchar]; - else if (testchar >= 0x1E00 && testchar < 0x1F00) - return _foldCaseHighAscii[testchar - 0x1E00]; - else - if (testchar >= 0x3040 && testchar < 0x3100) - return _kanaMap[testchar - 0x3040]; + static ucs4_t ToFold(ucs4_t testchar) { + if (testchar < 767) + return _foldCase[testchar]; + else if (testchar >= 0x1E00 && testchar < 0x1F00) + return _foldCaseHighAscii[testchar - 0x1E00]; else - if (testchar >= 0xFF00 && testchar < 0xFFF0) - return _halfwidth_fullwidthMap[testchar - 0xFF00]; - else - return Fast_UnicodeUtil::ToLower(testchar); -} + if (testchar >= 0x3040 && testchar < 0x3100) + return _kanaMap[testchar - 0x3040]; + else + if (testchar >= 0xFF00 && testchar < 0xFFF0) + return _halfwidth_fullwidthMap[testchar - 0xFF00]; + else + return Fast_UnicodeUtil::ToLower(testchar); + } public: - static const char *ReplacementString(ucs4_t testchar) { - if (testchar < 0xc4 || testchar > 0x1f3) { - return nullptr; - } - if (testchar == 0xdf && _doSharpSSubstitution) { - return "ss"; + static const char *ReplacementString(ucs4_t testchar) { + if (testchar < 0xc4 || testchar > 0x1f3) { + return nullptr; + } + if (testchar == 0xdf && _doSharpSSubstitution) { + return "ss"; + } + if (_doLigatureSubstitution) { + switch (testchar) { + case 0x132: + case 0x133: + return "ij"; + case 0x13f: + case 0x140: + return "l"; // Latin L with middlepoint + case 0x149: + return "n"; // Latin small n preceded by apostrophe + case 0x17f: + return "s"; // Latin small letter long s + case 0x1c7: + case 0x1c8: + case 0x1c9: + return "lj"; + case 0x1ca: + case 0x1cb: + case 0x1cc: + return "nj"; + case 0x1f1: + case 0x1f2: + case 0x1f3: + return "dz"; + } + } + if (_doMulticharExpansion) { + switch(testchar) { + case 0xc4: + case 0xe4: // A/a with diaeresis + return "ae"; + + case 0xc5: + case 0xe5: // A/a with ring + return "aa"; + + case 0xc6: + case 0xe6: // Letter/ligature AE/ae + return "ae"; + + case 0xd6: + case 0xf6: // O/o with diaeresis + return "oe"; + + case 0xd8: + case 0xf8: // O/o with stroke + return "oe"; + + case 0xdc: + case 0xfc: // U/u with diaeresis + return "ue"; + + case 0xd0: + case 0xf0: // norse "eth" + return "d"; + + case 0xde: + case 0xfe: // norse "thorn" + return "th"; + + default: + return nullptr; + + } + + } + return nullptr; } - if (_doLigatureSubstitution) { - switch (testchar) { - case 0x132: - case 0x133: - return "ij"; - case 0x13f: - case 0x140: - return "l"; // Latin L with middlepoint - case 0x149: - return "n"; // Latin small n preceded by apostrophe - case 0x17f: - return "s"; // Latin small letter long s - case 0x1c7: - case 0x1c8: - case 0x1c9: - return "lj"; - case 0x1ca: - case 0x1cb: - case 0x1cc: - return "nj"; - case 0x1f1: - case 0x1f2: - case 0x1f3: - return "dz"; - } +private: + /** + * Check if the given char is a word character or used + * for interlinear annotation. + * @param c The character to check. + * @return true if c is a word character, or interlinear annotation syntax characters. + */ + static bool IsWordCharOrIA(ucs4_t c) { + return Fast_UnicodeUtil::IsWordChar(c) + || c == 0xFFF9 || c == 0xFFFA || c == 0xFFFB; } - if (_doMulticharExpansion) { - switch(testchar) { - case 0xc4: - case 0xe4: // A/a with diaeresis - return "ae"; - - case 0xc5: - case 0xe5: // A/a with ring - return "aa"; - - case 0xc6: - case 0xe6: // Letter/ligature AE/ae - return "ae"; - - case 0xd6: - case 0xf6: // O/o with diaeresis - return "oe"; - - case 0xd8: - case 0xf8: // O/o with stroke - return "oe"; - - case 0xdc: - case 0xfc: // U/u with diaeresis - return "ue"; - case 0xd0: - case 0xf0: // norse "eth" - return "d"; - - case 0xde: - case 0xfe: // norse "thorn" - return "th"; - - default: - return nullptr; - - } - - } - return nullptr; - } - private: - /** - * Check if the given char is a word character or used - * for interlinear annotation. - * @param c The character to check. - * @return true if c is a word character, or interlinear annotation syntax characters. - */ - static bool IsWordCharOrIA(ucs4_t c) { - return Fast_UnicodeUtil::IsWordChar(c) - || c == 0xFFF9 || c == 0xFFFA || c == 0xFFFB; - } - - public: +public: Fast_NormalizeWordFolder(); virtual ~Fast_NormalizeWordFolder(); virtual size_t FoldedSizeAsUTF8(const char *word) const; @@ -178,4 +178,3 @@ public: const char* UCS4Tokenize(const char *buf, const char *bufend, ucs4_t *dstbuf, ucs4_t *dstbufend, const char*& origstart, size_t& tokenlen) const override; }; - diff --git a/fastlib/src/vespa/fastlib/text/tests/characterclasstest.cpp b/fastlib/src/vespa/fastlib/text/tests/characterclasstest.cpp index 5772f66a087..fed5ab14e5f 100644 --- a/fastlib/src/vespa/fastlib/text/tests/characterclasstest.cpp +++ b/fastlib/src/vespa/fastlib/text/tests/characterclasstest.cpp @@ -4,11 +4,10 @@ int character_class_test_app::Main() { - character_class_test t("Test for the character_class"); - t.SetStream(&std::cout); - t.Run(); - return t.Report(); + character_class_test t("Test for the character_class"); + t.SetStream(&std::cout); + t.Run(); + return t.Report(); } FASTOS_MAIN(character_class_test_app) - diff --git a/fastlib/src/vespa/fastlib/text/tests/latintokenizertest.cpp b/fastlib/src/vespa/fastlib/text/tests/latintokenizertest.cpp index 848ef82db88..6b812ccd74d 100644 --- a/fastlib/src/vespa/fastlib/text/tests/latintokenizertest.cpp +++ b/fastlib/src/vespa/fastlib/text/tests/latintokenizertest.cpp @@ -4,10 +4,10 @@ int LatinTokenizerTestApp::Main() { - LatinTokenizerTest lta; - lta.SetStream(&std::cout); - lta.Run(); - return lta.Report(); + LatinTokenizerTest lta; + lta.SetStream(&std::cout); + lta.Run(); + return lta.Report(); } FASTOS_MAIN(LatinTokenizerTestApp); diff --git a/fastlib/src/vespa/fastlib/text/tests/latintokenizertest.h b/fastlib/src/vespa/fastlib/text/tests/latintokenizertest.h index 082ab62a75e..88275199bca 100644 --- a/fastlib/src/vespa/fastlib/text/tests/latintokenizertest.h +++ b/fastlib/src/vespa/fastlib/text/tests/latintokenizertest.h @@ -8,35 +8,35 @@ class Mapel_Pucntuation { private: - /** Member variables. */ - static bool *_lookup; + /** Member variables. */ + static bool *_lookup; public: - /** Constructors */ - Mapel_Pucntuation(); + /** Constructors */ + Mapel_Pucntuation(); - /** Punctuation predicate. */ - bool operator()(char c) const { - return _lookup[static_cast(c)]; - } + /** Punctuation predicate. */ + bool operator()(char c) const { + return _lookup[static_cast(c)]; + } }; class Maple_Space { private: - /** Member variables. */ - static bool *_lookup; + /** Member variables. */ + static bool *_lookup; public: - /** Constructors */ - Maple_Space(); + /** Constructors */ + Maple_Space(); - /** Space predicate. */ - bool operator()(char c) const { - return _lookup[static_cast(c)]; - } + /** Space predicate. */ + bool operator()(char c) const { + return _lookup[static_cast(c)]; + } }; @@ -45,101 +45,101 @@ bool *Mapel_Pucntuation::_lookup = NULL; Mapel_Pucntuation::Mapel_Pucntuation() { - // Initialize lookup table. - if (_lookup == NULL) { + // Initialize lookup table. + if (_lookup == NULL) { + + _lookup = new bool[256]; + + for (unsigned int i = 0; i < 256; ++i) { + _lookup[i] = false; + } + + _lookup[static_cast('.')] = true; + _lookup[static_cast(',')] = true; + _lookup[static_cast(':')] = true; + _lookup[static_cast(';')] = true; + _lookup[static_cast('|')] = true; + _lookup[static_cast('!')] = true; + _lookup[static_cast('?')] = true; + _lookup[static_cast('@')] = true; + _lookup[static_cast('/')] = true; + _lookup[static_cast('(')] = true; + _lookup[static_cast(')')] = true; + _lookup[static_cast('[')] = true; + _lookup[static_cast(']')] = true; + _lookup[static_cast('{')] = true; + _lookup[static_cast('}')] = true; + _lookup[static_cast('<')] = true; + _lookup[static_cast('>')] = true; + _lookup[static_cast('*')] = true; + _lookup[static_cast('=')] = true; + _lookup[static_cast('%')] = true; + _lookup[static_cast('\\')] = true; - _lookup = new bool[256]; - - for (unsigned int i = 0; i < 256; ++i) { - _lookup[i] = false; } - _lookup[static_cast('.')] = true; - _lookup[static_cast(',')] = true; - _lookup[static_cast(':')] = true; - _lookup[static_cast(';')] = true; - _lookup[static_cast('|')] = true; - _lookup[static_cast('!')] = true; - _lookup[static_cast('?')] = true; - _lookup[static_cast('@')] = true; - _lookup[static_cast('/')] = true; - _lookup[static_cast('(')] = true; - _lookup[static_cast(')')] = true; - _lookup[static_cast('[')] = true; - _lookup[static_cast(']')] = true; - _lookup[static_cast('{')] = true; - _lookup[static_cast('}')] = true; - _lookup[static_cast('<')] = true; - _lookup[static_cast('>')] = true; - _lookup[static_cast('*')] = true; - _lookup[static_cast('=')] = true; - _lookup[static_cast('%')] = true; - _lookup[static_cast('\\')] = true; - - } - } Maple_Space::Maple_Space() { - // Initialize lookup table. - if (_lookup == NULL) { + // Initialize lookup table. + if (_lookup == NULL) { - _lookup = new bool[256]; + _lookup = new bool[256]; - for (unsigned int i = 0; i < 256; ++i) { - _lookup[i] = false; - } + for (unsigned int i = 0; i < 256; ++i) { + _lookup[i] = false; + } - _lookup[static_cast(' ')] = true; - _lookup[static_cast('\n')] = true; - _lookup[static_cast('\t')] = true; - _lookup[static_cast('\r')] = true; - _lookup[static_cast('"')] = true; - _lookup[static_cast('\'')] = true; - _lookup[static_cast('`')] = true; - _lookup[static_cast('_')] = true; + _lookup[static_cast(' ')] = true; + _lookup[static_cast('\n')] = true; + _lookup[static_cast('\t')] = true; + _lookup[static_cast('\r')] = true; + _lookup[static_cast('"')] = true; + _lookup[static_cast('\'')] = true; + _lookup[static_cast('`')] = true; + _lookup[static_cast('_')] = true; - } + } } class LatinTokenizerTest : public Test { private: - void TestSimple(); - void TestSimpleLength(); - void TestEnding(); - void TestEndingLength(); - void TestNull(); - void TestNullLength(); - void TestEmpty(); - void TestEmptyLength(); - void TestMapelURL(); - - template - void TestWord(Fast_LatinTokenizer* lt, - const char* correct, - bool punct = false) - { - typename Fast_LatinTokenizer::Fast_Token token; - _test(lt->MoreTokens()); - - token = lt->GetNextToken(); - char temp = *token.second; - *token.second = '\0'; - vespalib::string word = vespalib::make_string("%s", token.first); - *token.second = temp; - - PushDesc(vespalib::make_string("%s%s == %s", "word: ", word.c_str(), correct).c_str()); - - _test(word == correct); - - _test(token._punctuation == punct); + void TestSimple(); + void TestSimpleLength(); + void TestEnding(); + void TestEndingLength(); + void TestNull(); + void TestNullLength(); + void TestEmpty(); + void TestEmptyLength(); + void TestMapelURL(); + + template + void TestWord(Fast_LatinTokenizer* lt, + const char* correct, + bool punct = false) + { + typename Fast_LatinTokenizer::Fast_Token token; + _test(lt->MoreTokens()); - PopDesc(); - } + token = lt->GetNextToken(); + char temp = *token.second; + *token.second = '\0'; + vespalib::string word = vespalib::make_string("%s", token.first); + *token.second = temp; + + PushDesc(vespalib::make_string("%s%s == %s", "word: ", word.c_str(), correct).c_str()); - void TestTypeparamObservers(); + _test(word == correct); + + _test(token._punctuation == punct); + + PopDesc(); + } + + void TestTypeparamObservers(); public: LatinTokenizerTest(); @@ -162,292 +162,292 @@ LatinTokenizerTest::~LatinTokenizerTest() void LatinTokenizerTest::TestSimple() { - PushDesc("Simple"); - - Fast_SimpleLatinTokenizer lt; - std::string s("This is. my . test String."); - lt.SetNewText(const_cast(s.c_str())); - - PushDesc("This"); - TestWord(<, "This"); - PopDesc(); - PushDesc("is"); - TestWord(<, "is"); - PopDesc(); - PushDesc("."); - TestWord(<, ".", true); - PopDesc(); - PushDesc("my"); - TestWord(<, "my"); - PopDesc(); - PushDesc("."); - TestWord(<, ".", true); - PopDesc(); - PushDesc("test"); - TestWord(<, "test"); - PopDesc(); - PushDesc("String"); - TestWord(<, "String"); - PopDesc(); - PushDesc("."); - TestWord(<, ".", true); - PopDesc(); - - _test(!lt.MoreTokens()); - - PopDesc(); + PushDesc("Simple"); + + Fast_SimpleLatinTokenizer lt; + std::string s("This is. my . test String."); + lt.SetNewText(const_cast(s.c_str())); + + PushDesc("This"); + TestWord(<, "This"); + PopDesc(); + PushDesc("is"); + TestWord(<, "is"); + PopDesc(); + PushDesc("."); + TestWord(<, ".", true); + PopDesc(); + PushDesc("my"); + TestWord(<, "my"); + PopDesc(); + PushDesc("."); + TestWord(<, ".", true); + PopDesc(); + PushDesc("test"); + TestWord(<, "test"); + PopDesc(); + PushDesc("String"); + TestWord(<, "String"); + PopDesc(); + PushDesc("."); + TestWord(<, ".", true); + PopDesc(); + + _test(!lt.MoreTokens()); + + PopDesc(); } void LatinTokenizerTest::TestSimpleLength() { - PushDesc("Simple"); - - Fast_SimpleLatinTokenizer lt; - std::string s("This is. my . test String."); - lt.SetNewText(const_cast(s.c_str()), - s.length()); - - PushDesc("This"); - TestWord(<, "This"); - PopDesc(); - PushDesc("is"); - TestWord(<, "is"); - PopDesc(); - PushDesc("."); - TestWord(<, ".", true); - PopDesc(); - PushDesc("my"); - TestWord(<, "my"); - PopDesc(); - PushDesc("."); - TestWord(<, ".", true); - PopDesc(); - PushDesc("test"); - TestWord(<, "test"); - PopDesc(); - PushDesc("String"); - TestWord(<, "String"); - PopDesc(); - PushDesc("."); - TestWord(<, ".", true); - PopDesc(); - - _test(!lt.MoreTokens()); - - PopDesc(); + PushDesc("Simple"); + + Fast_SimpleLatinTokenizer lt; + std::string s("This is. my . test String."); + lt.SetNewText(const_cast(s.c_str()), + s.length()); + + PushDesc("This"); + TestWord(<, "This"); + PopDesc(); + PushDesc("is"); + TestWord(<, "is"); + PopDesc(); + PushDesc("."); + TestWord(<, ".", true); + PopDesc(); + PushDesc("my"); + TestWord(<, "my"); + PopDesc(); + PushDesc("."); + TestWord(<, ".", true); + PopDesc(); + PushDesc("test"); + TestWord(<, "test"); + PopDesc(); + PushDesc("String"); + TestWord(<, "String"); + PopDesc(); + PushDesc("."); + TestWord(<, ".", true); + PopDesc(); + + _test(!lt.MoreTokens()); + + PopDesc(); } void LatinTokenizerTest::TestEnding() { - PushDesc("Ending\n"); + PushDesc("Ending\n"); - std::string text("This is my test String "); - Fast_SimpleLatinTokenizer* lt = new Fast_SimpleLatinTokenizer(const_cast(text.c_str())); + std::string text("This is my test String "); + Fast_SimpleLatinTokenizer* lt = new Fast_SimpleLatinTokenizer(const_cast(text.c_str())); - TestWord(lt, "This"); - TestWord(lt, "is"); - TestWord(lt, "my"); - TestWord(lt, "test"); - TestWord(lt, "String"); + TestWord(lt, "This"); + TestWord(lt, "is"); + TestWord(lt, "my"); + TestWord(lt, "test"); + TestWord(lt, "String"); - _test(!lt->MoreTokens()); + _test(!lt->MoreTokens()); - _test(text == lt->GetOriginalText()); + _test(text == lt->GetOriginalText()); - delete lt; + delete lt; - PopDesc(); + PopDesc(); } void LatinTokenizerTest::TestEndingLength() { - PushDesc("Ending\n"); + PushDesc("Ending\n"); - std::string text("This is my test String "); - Fast_SimpleLatinTokenizer* lt = new Fast_SimpleLatinTokenizer(const_cast(text.c_str()), - text.length()); + std::string text("This is my test String "); + Fast_SimpleLatinTokenizer* lt = new Fast_SimpleLatinTokenizer(const_cast(text.c_str()), + text.length()); - TestWord(lt, "This"); - TestWord(lt, "is"); - TestWord(lt, "my"); - TestWord(lt, "test"); - TestWord(lt, "String"); + TestWord(lt, "This"); + TestWord(lt, "is"); + TestWord(lt, "my"); + TestWord(lt, "test"); + TestWord(lt, "String"); - _test(!lt->MoreTokens()); + _test(!lt->MoreTokens()); - _test(text == std::string(lt->GetOriginalText())); + _test(text == std::string(lt->GetOriginalText())); - delete lt; + delete lt; - PopDesc(); + PopDesc(); } void LatinTokenizerTest::TestNull() { - PushDesc("Null\n"); + PushDesc("Null\n"); - Fast_SimpleLatinTokenizer* lt = new Fast_SimpleLatinTokenizer(NULL); + Fast_SimpleLatinTokenizer* lt = new Fast_SimpleLatinTokenizer(NULL); - _test(!lt->MoreTokens()); + _test(!lt->MoreTokens()); - _test(lt->GetOriginalText() == NULL); + _test(lt->GetOriginalText() == NULL); - delete lt; + delete lt; - PopDesc(); + PopDesc(); } void LatinTokenizerTest::TestNullLength() { - PushDesc("Null\n"); + PushDesc("Null\n"); - Fast_SimpleLatinTokenizer* lt = new Fast_SimpleLatinTokenizer(NULL, 0); + Fast_SimpleLatinTokenizer* lt = new Fast_SimpleLatinTokenizer(NULL, 0); - _test(!lt->MoreTokens()); + _test(!lt->MoreTokens()); - _test(lt->GetOriginalText() == NULL); + _test(lt->GetOriginalText() == NULL); - delete lt; + delete lt; - PopDesc(); + PopDesc(); } void LatinTokenizerTest::TestEmpty() { - PushDesc("Empty\n"); + PushDesc("Empty\n"); - std::string text(" "); - Fast_SimpleLatinTokenizer* lt = new Fast_SimpleLatinTokenizer(const_cast(text.c_str())); + std::string text(" "); + Fast_SimpleLatinTokenizer* lt = new Fast_SimpleLatinTokenizer(const_cast(text.c_str())); - _test(!lt->MoreTokens()); + _test(!lt->MoreTokens()); - delete lt; + delete lt; - PopDesc(); + PopDesc(); } void LatinTokenizerTest::TestEmptyLength() { - PushDesc("Empty\n"); + PushDesc("Empty\n"); - std::string text(" "); - Fast_SimpleLatinTokenizer* lt = new Fast_SimpleLatinTokenizer(const_cast(text.c_str()), - text.length()); + std::string text(" "); + Fast_SimpleLatinTokenizer* lt = new Fast_SimpleLatinTokenizer(const_cast(text.c_str()), + text.length()); - _test(!lt->MoreTokens()); + _test(!lt->MoreTokens()); - delete lt; + delete lt; - PopDesc(); + PopDesc(); } - class TPS - { - private: +class TPS +{ +private: TPS(const TPS &); TPS& operator=(const TPS &); - public: +public: TPS() : _myfunc(NULL) {} void Init(int (*myfunc)(int c)) { - _myfunc = myfunc; + _myfunc = myfunc; } bool operator()(char c) { // LatinTokenizerTest::_test(_myfunc); - return (_myfunc(c) != 0); + return (_myfunc(c) != 0); } - private: +private: int (*_myfunc)(int c); - }; +}; void LatinTokenizerTest::TestTypeparamObservers() { - typedef Fast_LatinTokenizer MyTokenizer; + typedef Fast_LatinTokenizer MyTokenizer; - PushDesc("TypeparamObservers\n"); - std::string text("4Some6text"); - MyTokenizer* tok = new MyTokenizer(const_cast(text.c_str())); - tok->GetIsPunctuation().Init(ispunct); - tok->GetIsSeparator().Init(isdigit); + PushDesc("TypeparamObservers\n"); + std::string text("4Some6text"); + MyTokenizer* tok = new MyTokenizer(const_cast(text.c_str())); + tok->GetIsPunctuation().Init(ispunct); + tok->GetIsSeparator().Init(isdigit); - TestWord(tok,"Some"); - TestWord(tok,"text"); - _test(!tok->MoreTokens()); - PopDesc(); + TestWord(tok,"Some"); + TestWord(tok,"text"); + _test(!tok->MoreTokens()); + PopDesc(); - delete tok; + delete tok; } void LatinTokenizerTest::TestMapelURL() { - typedef Fast_LatinTokenizer MyTokenizer; - - PushDesc("MapelURL\n"); - std::string text("http://search.msn.co.uk/results.asp?q= cfg=SMCBROWSE rn=1825822 dp=1873075 v=166:"); - MyTokenizer* tok = new MyTokenizer(const_cast(text.c_str())); - - TestWord(tok,"http", false); - TestWord(tok,":", true); - TestWord(tok,"/", true); - TestWord(tok,"/", true); - TestWord(tok,"search", false); - TestWord(tok,".", true); - TestWord(tok,"msn", false); - TestWord(tok,".", true); - TestWord(tok,"co", false); - TestWord(tok,".", true); - TestWord(tok,"uk", false); - TestWord(tok,"/", true); - TestWord(tok,"results", false); - TestWord(tok,".", true); - TestWord(tok,"asp", false); - TestWord(tok,"?", true); - TestWord(tok,"q", false); - TestWord(tok,"=", true); - TestWord(tok,"cfg", false); - TestWord(tok,"=", true); - TestWord(tok,"SMCBROWSE", false); - TestWord(tok,"rn", false); - TestWord(tok,"=", true); - TestWord(tok,"1825822", false); - TestWord(tok,"dp", false); - TestWord(tok,"=", true); - TestWord(tok,"1873075", false); - TestWord(tok,"v", false); - TestWord(tok,"=", true); - TestWord(tok,"166", false); - TestWord(tok,":", true); - _test(!tok->MoreTokens()); - PopDesc(); - - delete tok; + typedef Fast_LatinTokenizer MyTokenizer; + + PushDesc("MapelURL\n"); + std::string text("http://search.msn.co.uk/results.asp?q= cfg=SMCBROWSE rn=1825822 dp=1873075 v=166:"); + MyTokenizer* tok = new MyTokenizer(const_cast(text.c_str())); + + TestWord(tok,"http", false); + TestWord(tok,":", true); + TestWord(tok,"/", true); + TestWord(tok,"/", true); + TestWord(tok,"search", false); + TestWord(tok,".", true); + TestWord(tok,"msn", false); + TestWord(tok,".", true); + TestWord(tok,"co", false); + TestWord(tok,".", true); + TestWord(tok,"uk", false); + TestWord(tok,"/", true); + TestWord(tok,"results", false); + TestWord(tok,".", true); + TestWord(tok,"asp", false); + TestWord(tok,"?", true); + TestWord(tok,"q", false); + TestWord(tok,"=", true); + TestWord(tok,"cfg", false); + TestWord(tok,"=", true); + TestWord(tok,"SMCBROWSE", false); + TestWord(tok,"rn", false); + TestWord(tok,"=", true); + TestWord(tok,"1825822", false); + TestWord(tok,"dp", false); + TestWord(tok,"=", true); + TestWord(tok,"1873075", false); + TestWord(tok,"v", false); + TestWord(tok,"=", true); + TestWord(tok,"166", false); + TestWord(tok,":", true); + _test(!tok->MoreTokens()); + PopDesc(); + + delete tok; } void LatinTokenizerTest::Run() { - TestSimple(); - TestSimpleLength(); - TestEnding(); - TestEndingLength(); - TestNull(); - TestNullLength(); - TestEmpty(); - TestEmptyLength(); - TestTypeparamObservers(); - TestMapelURL(); + TestSimple(); + TestSimpleLength(); + TestEnding(); + TestEndingLength(); + TestNull(); + TestNullLength(); + TestEmpty(); + TestEmptyLength(); + TestTypeparamObservers(); + TestMapelURL(); } @@ -460,5 +460,3 @@ class LatinTokenizerTestApp : public FastOS_Application public: int Main() override; }; - - diff --git a/fastlib/src/vespa/fastlib/text/tests/unicodeutiltest.cpp b/fastlib/src/vespa/fastlib/text/tests/unicodeutiltest.cpp index 98860410eef..6f66bd2ace6 100644 --- a/fastlib/src/vespa/fastlib/text/tests/unicodeutiltest.cpp +++ b/fastlib/src/vespa/fastlib/text/tests/unicodeutiltest.cpp @@ -3,11 +3,10 @@ int UnicodeUtilTestApp::Main() { - UnicodeUtilTest t; - t.SetStream(&std::cout); - t.Run(); - return t.Report(); + UnicodeUtilTest t; + t.SetStream(&std::cout); + t.Run(); + return t.Report(); } FASTOS_MAIN(UnicodeUtilTestApp) - diff --git a/fastlib/src/vespa/fastlib/text/tests/unicodeutiltest.h b/fastlib/src/vespa/fastlib/text/tests/unicodeutiltest.h index a18728c51a9..aaebe145958 100644 --- a/fastlib/src/vespa/fastlib/text/tests/unicodeutiltest.h +++ b/fastlib/src/vespa/fastlib/text/tests/unicodeutiltest.h @@ -5,39 +5,39 @@ class UnicodeUtilTest : public Test { - bool GetUTF8Char_WrongInput() { - const char *testdata = "ab\xF8"; + bool GetUTF8Char_WrongInput() { + const char *testdata = "ab\xF8"; - ucs4_t the_char = 0; + ucs4_t the_char = 0; - const unsigned char *src = reinterpret_cast(testdata); - while (*src != 0) { - the_char = Fast_UnicodeUtil::GetUTF8Char(src); - // fprintf(stderr, "GetUTF8Char_WrongInput(): the_char = U+%04X\n", the_char); + const unsigned char *src = reinterpret_cast(testdata); + while (*src != 0) { + the_char = Fast_UnicodeUtil::GetUTF8Char(src); + // fprintf(stderr, "GetUTF8Char_WrongInput(): the_char = U+%04X\n", the_char); + } + return (the_char == Fast_UnicodeUtil::_BadUTF8Char); + } + bool IsTerminalPunctuationChar(char ch, bool b) { + if (Fast_UnicodeUtil::IsTerminalPunctuationChar(ch) != b) { + printf("expected char '%c' %s terminal punctuation char\n", ch, b ? "to be" : "not to be"); + return false; + } + return true; } - return (the_char == Fast_UnicodeUtil::_BadUTF8Char); - } - bool IsTerminalPunctuationChar(char ch, bool b) { - if (Fast_UnicodeUtil::IsTerminalPunctuationChar(ch) != b) { - printf("expected char '%c' %s terminal punctuation char\n", ch, b ? "to be" : "not to be"); - return false; - } - return true; - } - bool IsTerminalPunctuationChar() { - // test a small selection - bool retval = true; - retval &= IsTerminalPunctuationChar('!', true); - retval &= IsTerminalPunctuationChar(',', true); - retval &= IsTerminalPunctuationChar('.', true); - retval &= IsTerminalPunctuationChar(':', true); - retval &= IsTerminalPunctuationChar(';', true); - retval &= IsTerminalPunctuationChar(' ', false); - retval &= IsTerminalPunctuationChar('a', false); - retval &= IsTerminalPunctuationChar('A', false); - return retval; - } + bool IsTerminalPunctuationChar() { + // test a small selection + bool retval = true; + retval &= IsTerminalPunctuationChar('!', true); + retval &= IsTerminalPunctuationChar(',', true); + retval &= IsTerminalPunctuationChar('.', true); + retval &= IsTerminalPunctuationChar(':', true); + retval &= IsTerminalPunctuationChar(';', true); + retval &= IsTerminalPunctuationChar(' ', false); + retval &= IsTerminalPunctuationChar('a', false); + retval &= IsTerminalPunctuationChar('A', false); + return retval; + } public: void Run() override { diff --git a/fastlib/src/vespa/fastlib/text/tests/wordfolderstest.cpp b/fastlib/src/vespa/fastlib/text/tests/wordfolderstest.cpp index d3db8a38f90..c4372f2e3ac 100644 --- a/fastlib/src/vespa/fastlib/text/tests/wordfolderstest.cpp +++ b/fastlib/src/vespa/fastlib/text/tests/wordfolderstest.cpp @@ -4,11 +4,10 @@ int WordFoldersTestApp::Main() { - WordFoldersTest t; - t.SetStream(&std::cout); - t.Run(); - return t.Report(); + WordFoldersTest t; + t.SetStream(&std::cout); + t.Run(); + return t.Report(); } FASTOS_MAIN(WordFoldersTestApp) - diff --git a/fastlib/src/vespa/fastlib/text/tests/wordfolderstest.h b/fastlib/src/vespa/fastlib/text/tests/wordfolderstest.h index c4eb6867dbd..3224426f51d 100644 --- a/fastlib/src/vespa/fastlib/text/tests/wordfolderstest.h +++ b/fastlib/src/vespa/fastlib/text/tests/wordfolderstest.h @@ -5,110 +5,110 @@ class WordFoldersTest : public Test { bool NormalizeWordFolderConstruction() { - Fast_NormalizeWordFolder::Setup( - Fast_NormalizeWordFolder::DO_ACCENT_REMOVAL - | Fast_NormalizeWordFolder::DO_KATAKANA_TO_HIRAGANA - | Fast_NormalizeWordFolder::DO_SMALL_TO_NORMAL_KANA - | Fast_NormalizeWordFolder::DO_SHARP_S_SUBSTITUTION - | Fast_NormalizeWordFolder::DO_LIGATURE_SUBSTITUTION - | Fast_NormalizeWordFolder::DO_MULTICHAR_EXPANSION); - - Fast_NormalizeWordFolder *nwf = new Fast_NormalizeWordFolder(); - delete nwf; - - return true; - } - - bool TokenizeAnnotatedBuffer() { - Fast_NormalizeWordFolder *nwf = new Fast_NormalizeWordFolder(); - const char *testinput = "This is a " - "\xEF\xBF\xB9" "café" "\xEF\xBF\xBA" "cafe" "\xEF\xBF\xBB" - " superduperextrafeaturecoolandlongplainword fun " - "\xEF\xBF\xB9" "www" "\xEF\xBF\xBA" - "world wide web extra long annotation block" "\xEF\xBF\xBB" - " test\nIt is cool.\n"; - const char *correct[] = { - "this", "is", "a", - "\xEF\xBF\xB9" "café" "\xEF\xBF\xBA" "cafe" "\xEF\xBF\xBB", - "superduperextrafeaturecool", "fun", - "\xEF\xBF\xB9" "www" "\xEF\xBF\xBA" "world wide web ex", - "test", "it", "is", "cool" }; - const char *teststart = testinput; - const char *testend = testinput + strlen(testinput); - char destbuf[32]; - char *destbufend = destbuf + 32; - const char *origstart = testinput; - size_t tokenlen = 0; - - int tokencounter = 0; - bool success = true; - while ( - (teststart - = nwf->Tokenize(teststart, testend, - destbuf, destbufend, - origstart, tokenlen)) < testend) { - // printf("found: %s, correct: %s\n", destbuf, correct[tokencounter]); - success &= strcmp(destbuf, correct[tokencounter++]) == 0; + Fast_NormalizeWordFolder::Setup( + Fast_NormalizeWordFolder::DO_ACCENT_REMOVAL + | Fast_NormalizeWordFolder::DO_KATAKANA_TO_HIRAGANA + | Fast_NormalizeWordFolder::DO_SMALL_TO_NORMAL_KANA + | Fast_NormalizeWordFolder::DO_SHARP_S_SUBSTITUTION + | Fast_NormalizeWordFolder::DO_LIGATURE_SUBSTITUTION + | Fast_NormalizeWordFolder::DO_MULTICHAR_EXPANSION); + + Fast_NormalizeWordFolder *nwf = new Fast_NormalizeWordFolder(); + delete nwf; + + return true; } - delete nwf; - - return success; - } - - bool TokenizeAnnotatedUCS4Buffer() { - Fast_NormalizeWordFolder *nwf = new Fast_NormalizeWordFolder(); - const char *testinput = "This is a " - "\xEF\xBF\xB9" "café" "\xEF\xBF\xBA" "cafe" "\xEF\xBF\xBB" - " superduperextrafeaturecoolandlongplainword fun " - "\xEF\xBF\xB9" "www" "\xEF\xBF\xBA" - "world wide web extra long annotation block" "\xEF\xBF\xBB" - " test\nIt is cool.\n"; - const char *correct[] = { - "this", "is", "a", - "\xEF\xBF\xB9" "café" "\xEF\xBF\xBA" "cafe" "\xEF\xBF\xBB", - "superduperextrafeaturecooland", "fun", - "\xEF\xBF\xB9" "www" "\xEF\xBF\xBA" "world wide web extra lon", - "test", "it", "is", "cool" }; - - const char *teststart = testinput; - const char *testend = testinput + strlen(testinput); - ucs4_t destbuf[32]; - ucs4_t *destbufend = destbuf + 32; - - const char *origstart = testinput; - size_t tokenlen = 0; - - int tokencounter = 0; - bool success = true; - while ( - (teststart - = nwf->UCS4Tokenize(teststart, testend, - destbuf, destbufend, - origstart, tokenlen)) < testend) { - success &= Fast_UnicodeUtil::utf8cmp(correct[tokencounter++], destbuf) == 0; + bool TokenizeAnnotatedBuffer() { + Fast_NormalizeWordFolder *nwf = new Fast_NormalizeWordFolder(); + const char *testinput = "This is a " + "\xEF\xBF\xB9" "café" "\xEF\xBF\xBA" "cafe" "\xEF\xBF\xBB" + " superduperextrafeaturecoolandlongplainword fun " + "\xEF\xBF\xB9" "www" "\xEF\xBF\xBA" + "world wide web extra long annotation block" "\xEF\xBF\xBB" + " test\nIt is cool.\n"; + const char *correct[] = { + "this", "is", "a", + "\xEF\xBF\xB9" "café" "\xEF\xBF\xBA" "cafe" "\xEF\xBF\xBB", + "superduperextrafeaturecool", "fun", + "\xEF\xBF\xB9" "www" "\xEF\xBF\xBA" "world wide web ex", + "test", "it", "is", "cool" }; + const char *teststart = testinput; + const char *testend = testinput + strlen(testinput); + char destbuf[32]; + char *destbufend = destbuf + 32; + const char *origstart = testinput; + size_t tokenlen = 0; + + int tokencounter = 0; + bool success = true; + while ( + (teststart + = nwf->Tokenize(teststart, testend, + destbuf, destbufend, + origstart, tokenlen)) < testend) { + // printf("found: %s, correct: %s\n", destbuf, correct[tokencounter]); + success &= strcmp(destbuf, correct[tokencounter++]) == 0; + } + + delete nwf; + + return success; } - delete nwf; - - return success; - } - - bool AccentRemovalTest() { - auto freefunction = [] (char * ptr) { free(ptr); }; - auto input = std::unique_ptr(Fast_UnicodeUtil::strdupLAT1("¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþpþ!"), - freefunction); - auto yelloutput = std::unique_ptr(Fast_UnicodeUtil::strdupLAT1("¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿AAAAAEAAAECEEEEIIIIDNOOOOOE×OEUUUUEYTHssaaaaaeaaaeceeeeiiiidnoooooe÷oeuuuueythpth!"), - freefunction); - Fast_NormalizeWordFolder wordfolder; - int len = wordfolder.FoldedSizeAsUTF8(input.get()); - auto fastliboutput = std::unique_ptr(new char[len + 1]); - wordfolder.FoldUTF8WordToUTF8Quick(fastliboutput.get(), input.get()); - fastliboutput[len] = '\0'; - printf("\n%s\n", yelloutput.get()); - printf("%s\n", fastliboutput.get()); - return strcasecmp(yelloutput.get(), fastliboutput.get()) == 0; - } + bool TokenizeAnnotatedUCS4Buffer() { + Fast_NormalizeWordFolder *nwf = new Fast_NormalizeWordFolder(); + const char *testinput = "This is a " + "\xEF\xBF\xB9" "café" "\xEF\xBF\xBA" "cafe" "\xEF\xBF\xBB" + " superduperextrafeaturecoolandlongplainword fun " + "\xEF\xBF\xB9" "www" "\xEF\xBF\xBA" + "world wide web extra long annotation block" "\xEF\xBF\xBB" + " test\nIt is cool.\n"; + const char *correct[] = { + "this", "is", "a", + "\xEF\xBF\xB9" "café" "\xEF\xBF\xBA" "cafe" "\xEF\xBF\xBB", + "superduperextrafeaturecooland", "fun", + "\xEF\xBF\xB9" "www" "\xEF\xBF\xBA" "world wide web extra lon", + "test", "it", "is", "cool" }; + + const char *teststart = testinput; + const char *testend = testinput + strlen(testinput); + ucs4_t destbuf[32]; + ucs4_t *destbufend = destbuf + 32; + + const char *origstart = testinput; + size_t tokenlen = 0; + + int tokencounter = 0; + bool success = true; + while ( + (teststart + = nwf->UCS4Tokenize(teststart, testend, + destbuf, destbufend, + origstart, tokenlen)) < testend) { + success &= Fast_UnicodeUtil::utf8cmp(correct[tokencounter++], destbuf) == 0; + } + + delete nwf; + + return success; + } + + bool AccentRemovalTest() { + auto freefunction = [] (char * ptr) { free(ptr); }; + auto input = std::unique_ptr(Fast_UnicodeUtil::strdupLAT1("¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþpþ!"), + freefunction); + auto yelloutput = std::unique_ptr(Fast_UnicodeUtil::strdupLAT1("¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿AAAAAEAAAECEEEEIIIIDNOOOOOE×OEUUUUEYTHssaaaaaeaaaeceeeeiiiidnoooooe÷oeuuuueythpth!"), + freefunction); + Fast_NormalizeWordFolder wordfolder; + int len = wordfolder.FoldedSizeAsUTF8(input.get()); + auto fastliboutput = std::unique_ptr(new char[len + 1]); + wordfolder.FoldUTF8WordToUTF8Quick(fastliboutput.get(), input.get()); + fastliboutput[len] = '\0'; + printf("\n%s\n", yelloutput.get()); + printf("%s\n", fastliboutput.get()); + return strcasecmp(yelloutput.get(), fastliboutput.get()) == 0; + } public: diff --git a/fastlib/src/vespa/fastlib/text/unicodeutil-charprops.cpp b/fastlib/src/vespa/fastlib/text/unicodeutil-charprops.cpp index 71686781c90..ce458d8fa28 100644 --- a/fastlib/src/vespa/fastlib/text/unicodeutil-charprops.cpp +++ b/fastlib/src/vespa/fastlib/text/unicodeutil-charprops.cpp @@ -11,1673 +11,1673 @@ */ static unsigned char Fast_intCompCharProps[11264]={ - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x20, 0x20, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x01, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, - 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x10, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x20, - 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, - 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x20, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x00, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x00, 0x20, 0x00, 0x00, 0x10, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x20, 0x20, 0x0A, 0x0A, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x0A, 0x0A, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, - 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x0A, 0x0A, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, - 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, - 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, - 0x12, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x20, 0x20, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x20, 0x20, 0x20, 0x02, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x10, 0x10, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x20, 0x20, 0x20, 0x02, - 0x00, 0x00, 0x20, 0x00, 0x02, 0x02, 0x00, 0x00, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, - 0x20, 0x20, 0x00, 0x10, 0x10, 0x10, 0x01, 0x00, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x0A, 0x0A, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x10, 0x10, 0x10, 0x10, 0x10, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x20, 0x20, 0x00, 0x00, 0x02, 0x06, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x06, 0x06, 0x06, 0x02, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x12, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x20, 0x00, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x10, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x20, 0x20, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x12, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, - 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x20, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x01, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, + 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x10, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x20, + 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x20, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x10, 0x00, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x00, 0x20, 0x00, 0x00, 0x10, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x20, 0x20, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, + 0x12, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x20, 0x20, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x20, 0x20, 0x20, 0x02, 0x02, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x10, 0x10, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x20, 0x20, 0x20, 0x02, + 0x00, 0x00, 0x20, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, + 0x20, 0x20, 0x00, 0x10, 0x10, 0x10, 0x01, 0x00, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x0A, 0x0A, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x10, 0x10, 0x10, 0x10, 0x10, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x20, 0x20, 0x00, 0x00, 0x02, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x06, 0x06, 0x06, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x12, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x20, 0x20, 0x00, 0x20, 0x20, 0x20, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x10, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, + 0x0A, 0x0A, 0x20, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x12, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }; unsigned char *Fast_UnicodeUtil::_compCharProps[256]={ - Fast_intCompCharProps+0x0000, /* Page 0x00 */ - Fast_intCompCharProps+0x0100, /* Page 0x01 */ - Fast_intCompCharProps+0x0200, /* Page 0x02 */ - Fast_intCompCharProps+0x0300, /* Page 0x03 */ - Fast_intCompCharProps+0x0400, /* Page 0x04 */ - Fast_intCompCharProps+0x0500, /* Page 0x05 */ - Fast_intCompCharProps+0x0600, /* Page 0x06 */ - Fast_intCompCharProps+0x0700, /* Page 0x07 */ - Fast_intCompCharProps+0x0800, /* Page 0x08 */ - Fast_intCompCharProps+0x0900, /* Page 0x09 */ - Fast_intCompCharProps+0x0A00, /* Page 0x0A */ - Fast_intCompCharProps+0x0B00, /* Page 0x0B */ - Fast_intCompCharProps+0x0C00, /* Page 0x0C */ - Fast_intCompCharProps+0x0D00, /* Page 0x0D */ - Fast_intCompCharProps+0x0E00, /* Page 0x0E */ - Fast_intCompCharProps+0x0F00, /* Page 0x0F */ - Fast_intCompCharProps+0x1000, /* Page 0x10 */ - Fast_intCompCharProps+0x1100, /* Page 0x11 */ - Fast_intCompCharProps+0x1200, /* Page 0x12 */ - Fast_intCompCharProps+0x1300, /* Page 0x13 */ - Fast_intCompCharProps+0x1400, /* Page 0x14 */ - Fast_intCompCharProps+0x0100, /* Page 0x15 */ - Fast_intCompCharProps+0x1500, /* Page 0x16 */ - Fast_intCompCharProps+0x1600, /* Page 0x17 */ - Fast_intCompCharProps+0x1700, /* Page 0x18 */ - Fast_intCompCharProps+0x1800, /* Page 0x19 */ - Fast_intCompCharProps+0x0800, /* Page 0x1A */ - Fast_intCompCharProps+0x0800, /* Page 0x1B */ - Fast_intCompCharProps+0x0800, /* Page 0x1C */ - Fast_intCompCharProps+0x1900, /* Page 0x1D */ - Fast_intCompCharProps+0x1A00, /* Page 0x1E */ - Fast_intCompCharProps+0x1B00, /* Page 0x1F */ - Fast_intCompCharProps+0x1C00, /* Page 0x20 */ - Fast_intCompCharProps+0x1D00, /* Page 0x21 */ - Fast_intCompCharProps+0x0800, /* Page 0x22 */ - Fast_intCompCharProps+0x0800, /* Page 0x23 */ - Fast_intCompCharProps+0x0800, /* Page 0x24 */ - Fast_intCompCharProps+0x0800, /* Page 0x25 */ - Fast_intCompCharProps+0x0800, /* Page 0x26 */ - Fast_intCompCharProps+0x0800, /* Page 0x27 */ - Fast_intCompCharProps+0x0800, /* Page 0x28 */ - Fast_intCompCharProps+0x0800, /* Page 0x29 */ - Fast_intCompCharProps+0x0800, /* Page 0x2A */ - Fast_intCompCharProps+0x0800, /* Page 0x2B */ - Fast_intCompCharProps+0x0800, /* Page 0x2C */ - Fast_intCompCharProps+0x0800, /* Page 0x2D */ - Fast_intCompCharProps+0x0800, /* Page 0x2E */ - Fast_intCompCharProps+0x0800, /* Page 0x2F */ - Fast_intCompCharProps+0x1E00, /* Page 0x30 */ - Fast_intCompCharProps+0x1F00, /* Page 0x31 */ - Fast_intCompCharProps+0x2000, /* Page 0x32 */ - Fast_intCompCharProps+0x0800, /* Page 0x33 */ - Fast_intCompCharProps+0x2100, /* Page 0x34 */ - Fast_intCompCharProps+0x2100, /* Page 0x35 */ - Fast_intCompCharProps+0x2100, /* Page 0x36 */ - Fast_intCompCharProps+0x2100, /* Page 0x37 */ - Fast_intCompCharProps+0x2100, /* Page 0x38 */ - Fast_intCompCharProps+0x2100, /* Page 0x39 */ - Fast_intCompCharProps+0x2100, /* Page 0x3A */ - Fast_intCompCharProps+0x2100, /* Page 0x3B */ - Fast_intCompCharProps+0x2100, /* Page 0x3C */ - Fast_intCompCharProps+0x2100, /* Page 0x3D */ - Fast_intCompCharProps+0x2100, /* Page 0x3E */ - Fast_intCompCharProps+0x2100, /* Page 0x3F */ - Fast_intCompCharProps+0x2100, /* Page 0x40 */ - Fast_intCompCharProps+0x2100, /* Page 0x41 */ - Fast_intCompCharProps+0x2100, /* Page 0x42 */ - Fast_intCompCharProps+0x2100, /* Page 0x43 */ - Fast_intCompCharProps+0x2100, /* Page 0x44 */ - Fast_intCompCharProps+0x2100, /* Page 0x45 */ - Fast_intCompCharProps+0x2100, /* Page 0x46 */ - Fast_intCompCharProps+0x2100, /* Page 0x47 */ - Fast_intCompCharProps+0x2100, /* Page 0x48 */ - Fast_intCompCharProps+0x2100, /* Page 0x49 */ - Fast_intCompCharProps+0x2100, /* Page 0x4A */ - Fast_intCompCharProps+0x2100, /* Page 0x4B */ - Fast_intCompCharProps+0x2100, /* Page 0x4C */ - Fast_intCompCharProps+0x2200, /* Page 0x4D */ - Fast_intCompCharProps+0x2100, /* Page 0x4E */ - Fast_intCompCharProps+0x2100, /* Page 0x4F */ - Fast_intCompCharProps+0x2100, /* Page 0x50 */ - Fast_intCompCharProps+0x2100, /* Page 0x51 */ - Fast_intCompCharProps+0x2100, /* Page 0x52 */ - Fast_intCompCharProps+0x2100, /* Page 0x53 */ - Fast_intCompCharProps+0x2100, /* Page 0x54 */ - Fast_intCompCharProps+0x2100, /* Page 0x55 */ - Fast_intCompCharProps+0x2100, /* Page 0x56 */ - Fast_intCompCharProps+0x2100, /* Page 0x57 */ - Fast_intCompCharProps+0x2100, /* Page 0x58 */ - Fast_intCompCharProps+0x2100, /* Page 0x59 */ - Fast_intCompCharProps+0x2100, /* Page 0x5A */ - Fast_intCompCharProps+0x2100, /* Page 0x5B */ - Fast_intCompCharProps+0x2100, /* Page 0x5C */ - Fast_intCompCharProps+0x2100, /* Page 0x5D */ - Fast_intCompCharProps+0x2100, /* Page 0x5E */ - Fast_intCompCharProps+0x2100, /* Page 0x5F */ - Fast_intCompCharProps+0x2100, /* Page 0x60 */ - Fast_intCompCharProps+0x2100, /* Page 0x61 */ - Fast_intCompCharProps+0x2100, /* Page 0x62 */ - Fast_intCompCharProps+0x2100, /* Page 0x63 */ - Fast_intCompCharProps+0x2100, /* Page 0x64 */ - Fast_intCompCharProps+0x2100, /* Page 0x65 */ - Fast_intCompCharProps+0x2100, /* Page 0x66 */ - Fast_intCompCharProps+0x2100, /* Page 0x67 */ - Fast_intCompCharProps+0x2100, /* Page 0x68 */ - Fast_intCompCharProps+0x2100, /* Page 0x69 */ - Fast_intCompCharProps+0x2100, /* Page 0x6A */ - Fast_intCompCharProps+0x2100, /* Page 0x6B */ - Fast_intCompCharProps+0x2100, /* Page 0x6C */ - Fast_intCompCharProps+0x2100, /* Page 0x6D */ - Fast_intCompCharProps+0x2100, /* Page 0x6E */ - Fast_intCompCharProps+0x2100, /* Page 0x6F */ - Fast_intCompCharProps+0x2100, /* Page 0x70 */ - Fast_intCompCharProps+0x2100, /* Page 0x71 */ - Fast_intCompCharProps+0x2100, /* Page 0x72 */ - Fast_intCompCharProps+0x2100, /* Page 0x73 */ - Fast_intCompCharProps+0x2100, /* Page 0x74 */ - Fast_intCompCharProps+0x2100, /* Page 0x75 */ - Fast_intCompCharProps+0x2100, /* Page 0x76 */ - Fast_intCompCharProps+0x2100, /* Page 0x77 */ - Fast_intCompCharProps+0x2100, /* Page 0x78 */ - Fast_intCompCharProps+0x2100, /* Page 0x79 */ - Fast_intCompCharProps+0x2100, /* Page 0x7A */ - Fast_intCompCharProps+0x2100, /* Page 0x7B */ - Fast_intCompCharProps+0x2100, /* Page 0x7C */ - Fast_intCompCharProps+0x2100, /* Page 0x7D */ - Fast_intCompCharProps+0x2100, /* Page 0x7E */ - Fast_intCompCharProps+0x2100, /* Page 0x7F */ - Fast_intCompCharProps+0x2100, /* Page 0x80 */ - Fast_intCompCharProps+0x2100, /* Page 0x81 */ - Fast_intCompCharProps+0x2100, /* Page 0x82 */ - Fast_intCompCharProps+0x2100, /* Page 0x83 */ - Fast_intCompCharProps+0x2100, /* Page 0x84 */ - Fast_intCompCharProps+0x2100, /* Page 0x85 */ - Fast_intCompCharProps+0x2100, /* Page 0x86 */ - Fast_intCompCharProps+0x2100, /* Page 0x87 */ - Fast_intCompCharProps+0x2100, /* Page 0x88 */ - Fast_intCompCharProps+0x2100, /* Page 0x89 */ - Fast_intCompCharProps+0x2100, /* Page 0x8A */ - Fast_intCompCharProps+0x2100, /* Page 0x8B */ - Fast_intCompCharProps+0x2100, /* Page 0x8C */ - Fast_intCompCharProps+0x2100, /* Page 0x8D */ - Fast_intCompCharProps+0x2100, /* Page 0x8E */ - Fast_intCompCharProps+0x2100, /* Page 0x8F */ - Fast_intCompCharProps+0x2100, /* Page 0x90 */ - Fast_intCompCharProps+0x2100, /* Page 0x91 */ - Fast_intCompCharProps+0x2100, /* Page 0x92 */ - Fast_intCompCharProps+0x2100, /* Page 0x93 */ - Fast_intCompCharProps+0x2100, /* Page 0x94 */ - Fast_intCompCharProps+0x2100, /* Page 0x95 */ - Fast_intCompCharProps+0x2100, /* Page 0x96 */ - Fast_intCompCharProps+0x2100, /* Page 0x97 */ - Fast_intCompCharProps+0x2100, /* Page 0x98 */ - Fast_intCompCharProps+0x2100, /* Page 0x99 */ - Fast_intCompCharProps+0x2100, /* Page 0x9A */ - Fast_intCompCharProps+0x2100, /* Page 0x9B */ - Fast_intCompCharProps+0x2100, /* Page 0x9C */ - Fast_intCompCharProps+0x2100, /* Page 0x9D */ - Fast_intCompCharProps+0x2100, /* Page 0x9E */ - Fast_intCompCharProps+0x2300, /* Page 0x9F */ - Fast_intCompCharProps+0x0100, /* Page 0xA0 */ - Fast_intCompCharProps+0x0100, /* Page 0xA1 */ - Fast_intCompCharProps+0x0100, /* Page 0xA2 */ - Fast_intCompCharProps+0x0100, /* Page 0xA3 */ - Fast_intCompCharProps+0x2400, /* Page 0xA4 */ - Fast_intCompCharProps+0x0800, /* Page 0xA5 */ - Fast_intCompCharProps+0x0800, /* Page 0xA6 */ - Fast_intCompCharProps+0x0800, /* Page 0xA7 */ - Fast_intCompCharProps+0x0800, /* Page 0xA8 */ - Fast_intCompCharProps+0x0800, /* Page 0xA9 */ - Fast_intCompCharProps+0x0800, /* Page 0xAA */ - Fast_intCompCharProps+0x0800, /* Page 0xAB */ - Fast_intCompCharProps+0x0100, /* Page 0xAC */ - Fast_intCompCharProps+0x0100, /* Page 0xAD */ - Fast_intCompCharProps+0x0100, /* Page 0xAE */ - Fast_intCompCharProps+0x0100, /* Page 0xAF */ - Fast_intCompCharProps+0x0100, /* Page 0xB0 */ - Fast_intCompCharProps+0x0100, /* Page 0xB1 */ - Fast_intCompCharProps+0x0100, /* Page 0xB2 */ - Fast_intCompCharProps+0x0100, /* Page 0xB3 */ - Fast_intCompCharProps+0x0100, /* Page 0xB4 */ - Fast_intCompCharProps+0x0100, /* Page 0xB5 */ - Fast_intCompCharProps+0x0100, /* Page 0xB6 */ - Fast_intCompCharProps+0x0100, /* Page 0xB7 */ - Fast_intCompCharProps+0x0100, /* Page 0xB8 */ - Fast_intCompCharProps+0x0100, /* Page 0xB9 */ - Fast_intCompCharProps+0x0100, /* Page 0xBA */ - Fast_intCompCharProps+0x0100, /* Page 0xBB */ - Fast_intCompCharProps+0x0100, /* Page 0xBC */ - Fast_intCompCharProps+0x0100, /* Page 0xBD */ - Fast_intCompCharProps+0x0100, /* Page 0xBE */ - Fast_intCompCharProps+0x0100, /* Page 0xBF */ - Fast_intCompCharProps+0x0100, /* Page 0xC0 */ - Fast_intCompCharProps+0x0100, /* Page 0xC1 */ - Fast_intCompCharProps+0x0100, /* Page 0xC2 */ - Fast_intCompCharProps+0x0100, /* Page 0xC3 */ - Fast_intCompCharProps+0x0100, /* Page 0xC4 */ - Fast_intCompCharProps+0x0100, /* Page 0xC5 */ - Fast_intCompCharProps+0x0100, /* Page 0xC6 */ - Fast_intCompCharProps+0x0100, /* Page 0xC7 */ - Fast_intCompCharProps+0x0100, /* Page 0xC8 */ - Fast_intCompCharProps+0x0100, /* Page 0xC9 */ - Fast_intCompCharProps+0x0100, /* Page 0xCA */ - Fast_intCompCharProps+0x0100, /* Page 0xCB */ - Fast_intCompCharProps+0x0100, /* Page 0xCC */ - Fast_intCompCharProps+0x0100, /* Page 0xCD */ - Fast_intCompCharProps+0x0100, /* Page 0xCE */ - Fast_intCompCharProps+0x0100, /* Page 0xCF */ - Fast_intCompCharProps+0x0100, /* Page 0xD0 */ - Fast_intCompCharProps+0x0100, /* Page 0xD1 */ - Fast_intCompCharProps+0x0100, /* Page 0xD2 */ - Fast_intCompCharProps+0x0100, /* Page 0xD3 */ - Fast_intCompCharProps+0x0100, /* Page 0xD4 */ - Fast_intCompCharProps+0x0100, /* Page 0xD5 */ - Fast_intCompCharProps+0x0100, /* Page 0xD6 */ - Fast_intCompCharProps+0x2500, /* Page 0xD7 */ - Fast_intCompCharProps+0x2600, /* Page 0xD8 */ - Fast_intCompCharProps+0x2600, /* Page 0xD9 */ - Fast_intCompCharProps+0x2600, /* Page 0xDA */ - Fast_intCompCharProps+0x2600, /* Page 0xDB */ - Fast_intCompCharProps+0x2600, /* Page 0xDC */ - Fast_intCompCharProps+0x2600, /* Page 0xDD */ - Fast_intCompCharProps+0x2600, /* Page 0xDE */ - Fast_intCompCharProps+0x2600, /* Page 0xDF */ - Fast_intCompCharProps+0x0100, /* Page 0xE0 */ - Fast_intCompCharProps+0x0100, /* Page 0xE1 */ - Fast_intCompCharProps+0x0100, /* Page 0xE2 */ - Fast_intCompCharProps+0x0100, /* Page 0xE3 */ - Fast_intCompCharProps+0x0100, /* Page 0xE4 */ - Fast_intCompCharProps+0x0100, /* Page 0xE5 */ - Fast_intCompCharProps+0x0100, /* Page 0xE6 */ - Fast_intCompCharProps+0x0100, /* Page 0xE7 */ - Fast_intCompCharProps+0x0100, /* Page 0xE8 */ - Fast_intCompCharProps+0x0100, /* Page 0xE9 */ - Fast_intCompCharProps+0x0100, /* Page 0xEA */ - Fast_intCompCharProps+0x0100, /* Page 0xEB */ - Fast_intCompCharProps+0x0100, /* Page 0xEC */ - Fast_intCompCharProps+0x0100, /* Page 0xED */ - Fast_intCompCharProps+0x0100, /* Page 0xEE */ - Fast_intCompCharProps+0x0100, /* Page 0xEF */ - Fast_intCompCharProps+0x0100, /* Page 0xF0 */ - Fast_intCompCharProps+0x0100, /* Page 0xF1 */ - Fast_intCompCharProps+0x0100, /* Page 0xF2 */ - Fast_intCompCharProps+0x0100, /* Page 0xF3 */ - Fast_intCompCharProps+0x0100, /* Page 0xF4 */ - Fast_intCompCharProps+0x0100, /* Page 0xF5 */ - Fast_intCompCharProps+0x0100, /* Page 0xF6 */ - Fast_intCompCharProps+0x0100, /* Page 0xF7 */ - Fast_intCompCharProps+0x0100, /* Page 0xF8 */ - Fast_intCompCharProps+0x2100, /* Page 0xF9 */ - Fast_intCompCharProps+0x2700, /* Page 0xFA */ - Fast_intCompCharProps+0x2800, /* Page 0xFB */ - Fast_intCompCharProps+0x0100, /* Page 0xFC */ - Fast_intCompCharProps+0x2900, /* Page 0xFD */ - Fast_intCompCharProps+0x2A00, /* Page 0xFE */ - Fast_intCompCharProps+0x2B00 /* Page 0xFF */ + Fast_intCompCharProps+0x0000, /* Page 0x00 */ + Fast_intCompCharProps+0x0100, /* Page 0x01 */ + Fast_intCompCharProps+0x0200, /* Page 0x02 */ + Fast_intCompCharProps+0x0300, /* Page 0x03 */ + Fast_intCompCharProps+0x0400, /* Page 0x04 */ + Fast_intCompCharProps+0x0500, /* Page 0x05 */ + Fast_intCompCharProps+0x0600, /* Page 0x06 */ + Fast_intCompCharProps+0x0700, /* Page 0x07 */ + Fast_intCompCharProps+0x0800, /* Page 0x08 */ + Fast_intCompCharProps+0x0900, /* Page 0x09 */ + Fast_intCompCharProps+0x0A00, /* Page 0x0A */ + Fast_intCompCharProps+0x0B00, /* Page 0x0B */ + Fast_intCompCharProps+0x0C00, /* Page 0x0C */ + Fast_intCompCharProps+0x0D00, /* Page 0x0D */ + Fast_intCompCharProps+0x0E00, /* Page 0x0E */ + Fast_intCompCharProps+0x0F00, /* Page 0x0F */ + Fast_intCompCharProps+0x1000, /* Page 0x10 */ + Fast_intCompCharProps+0x1100, /* Page 0x11 */ + Fast_intCompCharProps+0x1200, /* Page 0x12 */ + Fast_intCompCharProps+0x1300, /* Page 0x13 */ + Fast_intCompCharProps+0x1400, /* Page 0x14 */ + Fast_intCompCharProps+0x0100, /* Page 0x15 */ + Fast_intCompCharProps+0x1500, /* Page 0x16 */ + Fast_intCompCharProps+0x1600, /* Page 0x17 */ + Fast_intCompCharProps+0x1700, /* Page 0x18 */ + Fast_intCompCharProps+0x1800, /* Page 0x19 */ + Fast_intCompCharProps+0x0800, /* Page 0x1A */ + Fast_intCompCharProps+0x0800, /* Page 0x1B */ + Fast_intCompCharProps+0x0800, /* Page 0x1C */ + Fast_intCompCharProps+0x1900, /* Page 0x1D */ + Fast_intCompCharProps+0x1A00, /* Page 0x1E */ + Fast_intCompCharProps+0x1B00, /* Page 0x1F */ + Fast_intCompCharProps+0x1C00, /* Page 0x20 */ + Fast_intCompCharProps+0x1D00, /* Page 0x21 */ + Fast_intCompCharProps+0x0800, /* Page 0x22 */ + Fast_intCompCharProps+0x0800, /* Page 0x23 */ + Fast_intCompCharProps+0x0800, /* Page 0x24 */ + Fast_intCompCharProps+0x0800, /* Page 0x25 */ + Fast_intCompCharProps+0x0800, /* Page 0x26 */ + Fast_intCompCharProps+0x0800, /* Page 0x27 */ + Fast_intCompCharProps+0x0800, /* Page 0x28 */ + Fast_intCompCharProps+0x0800, /* Page 0x29 */ + Fast_intCompCharProps+0x0800, /* Page 0x2A */ + Fast_intCompCharProps+0x0800, /* Page 0x2B */ + Fast_intCompCharProps+0x0800, /* Page 0x2C */ + Fast_intCompCharProps+0x0800, /* Page 0x2D */ + Fast_intCompCharProps+0x0800, /* Page 0x2E */ + Fast_intCompCharProps+0x0800, /* Page 0x2F */ + Fast_intCompCharProps+0x1E00, /* Page 0x30 */ + Fast_intCompCharProps+0x1F00, /* Page 0x31 */ + Fast_intCompCharProps+0x2000, /* Page 0x32 */ + Fast_intCompCharProps+0x0800, /* Page 0x33 */ + Fast_intCompCharProps+0x2100, /* Page 0x34 */ + Fast_intCompCharProps+0x2100, /* Page 0x35 */ + Fast_intCompCharProps+0x2100, /* Page 0x36 */ + Fast_intCompCharProps+0x2100, /* Page 0x37 */ + Fast_intCompCharProps+0x2100, /* Page 0x38 */ + Fast_intCompCharProps+0x2100, /* Page 0x39 */ + Fast_intCompCharProps+0x2100, /* Page 0x3A */ + Fast_intCompCharProps+0x2100, /* Page 0x3B */ + Fast_intCompCharProps+0x2100, /* Page 0x3C */ + Fast_intCompCharProps+0x2100, /* Page 0x3D */ + Fast_intCompCharProps+0x2100, /* Page 0x3E */ + Fast_intCompCharProps+0x2100, /* Page 0x3F */ + Fast_intCompCharProps+0x2100, /* Page 0x40 */ + Fast_intCompCharProps+0x2100, /* Page 0x41 */ + Fast_intCompCharProps+0x2100, /* Page 0x42 */ + Fast_intCompCharProps+0x2100, /* Page 0x43 */ + Fast_intCompCharProps+0x2100, /* Page 0x44 */ + Fast_intCompCharProps+0x2100, /* Page 0x45 */ + Fast_intCompCharProps+0x2100, /* Page 0x46 */ + Fast_intCompCharProps+0x2100, /* Page 0x47 */ + Fast_intCompCharProps+0x2100, /* Page 0x48 */ + Fast_intCompCharProps+0x2100, /* Page 0x49 */ + Fast_intCompCharProps+0x2100, /* Page 0x4A */ + Fast_intCompCharProps+0x2100, /* Page 0x4B */ + Fast_intCompCharProps+0x2100, /* Page 0x4C */ + Fast_intCompCharProps+0x2200, /* Page 0x4D */ + Fast_intCompCharProps+0x2100, /* Page 0x4E */ + Fast_intCompCharProps+0x2100, /* Page 0x4F */ + Fast_intCompCharProps+0x2100, /* Page 0x50 */ + Fast_intCompCharProps+0x2100, /* Page 0x51 */ + Fast_intCompCharProps+0x2100, /* Page 0x52 */ + Fast_intCompCharProps+0x2100, /* Page 0x53 */ + Fast_intCompCharProps+0x2100, /* Page 0x54 */ + Fast_intCompCharProps+0x2100, /* Page 0x55 */ + Fast_intCompCharProps+0x2100, /* Page 0x56 */ + Fast_intCompCharProps+0x2100, /* Page 0x57 */ + Fast_intCompCharProps+0x2100, /* Page 0x58 */ + Fast_intCompCharProps+0x2100, /* Page 0x59 */ + Fast_intCompCharProps+0x2100, /* Page 0x5A */ + Fast_intCompCharProps+0x2100, /* Page 0x5B */ + Fast_intCompCharProps+0x2100, /* Page 0x5C */ + Fast_intCompCharProps+0x2100, /* Page 0x5D */ + Fast_intCompCharProps+0x2100, /* Page 0x5E */ + Fast_intCompCharProps+0x2100, /* Page 0x5F */ + Fast_intCompCharProps+0x2100, /* Page 0x60 */ + Fast_intCompCharProps+0x2100, /* Page 0x61 */ + Fast_intCompCharProps+0x2100, /* Page 0x62 */ + Fast_intCompCharProps+0x2100, /* Page 0x63 */ + Fast_intCompCharProps+0x2100, /* Page 0x64 */ + Fast_intCompCharProps+0x2100, /* Page 0x65 */ + Fast_intCompCharProps+0x2100, /* Page 0x66 */ + Fast_intCompCharProps+0x2100, /* Page 0x67 */ + Fast_intCompCharProps+0x2100, /* Page 0x68 */ + Fast_intCompCharProps+0x2100, /* Page 0x69 */ + Fast_intCompCharProps+0x2100, /* Page 0x6A */ + Fast_intCompCharProps+0x2100, /* Page 0x6B */ + Fast_intCompCharProps+0x2100, /* Page 0x6C */ + Fast_intCompCharProps+0x2100, /* Page 0x6D */ + Fast_intCompCharProps+0x2100, /* Page 0x6E */ + Fast_intCompCharProps+0x2100, /* Page 0x6F */ + Fast_intCompCharProps+0x2100, /* Page 0x70 */ + Fast_intCompCharProps+0x2100, /* Page 0x71 */ + Fast_intCompCharProps+0x2100, /* Page 0x72 */ + Fast_intCompCharProps+0x2100, /* Page 0x73 */ + Fast_intCompCharProps+0x2100, /* Page 0x74 */ + Fast_intCompCharProps+0x2100, /* Page 0x75 */ + Fast_intCompCharProps+0x2100, /* Page 0x76 */ + Fast_intCompCharProps+0x2100, /* Page 0x77 */ + Fast_intCompCharProps+0x2100, /* Page 0x78 */ + Fast_intCompCharProps+0x2100, /* Page 0x79 */ + Fast_intCompCharProps+0x2100, /* Page 0x7A */ + Fast_intCompCharProps+0x2100, /* Page 0x7B */ + Fast_intCompCharProps+0x2100, /* Page 0x7C */ + Fast_intCompCharProps+0x2100, /* Page 0x7D */ + Fast_intCompCharProps+0x2100, /* Page 0x7E */ + Fast_intCompCharProps+0x2100, /* Page 0x7F */ + Fast_intCompCharProps+0x2100, /* Page 0x80 */ + Fast_intCompCharProps+0x2100, /* Page 0x81 */ + Fast_intCompCharProps+0x2100, /* Page 0x82 */ + Fast_intCompCharProps+0x2100, /* Page 0x83 */ + Fast_intCompCharProps+0x2100, /* Page 0x84 */ + Fast_intCompCharProps+0x2100, /* Page 0x85 */ + Fast_intCompCharProps+0x2100, /* Page 0x86 */ + Fast_intCompCharProps+0x2100, /* Page 0x87 */ + Fast_intCompCharProps+0x2100, /* Page 0x88 */ + Fast_intCompCharProps+0x2100, /* Page 0x89 */ + Fast_intCompCharProps+0x2100, /* Page 0x8A */ + Fast_intCompCharProps+0x2100, /* Page 0x8B */ + Fast_intCompCharProps+0x2100, /* Page 0x8C */ + Fast_intCompCharProps+0x2100, /* Page 0x8D */ + Fast_intCompCharProps+0x2100, /* Page 0x8E */ + Fast_intCompCharProps+0x2100, /* Page 0x8F */ + Fast_intCompCharProps+0x2100, /* Page 0x90 */ + Fast_intCompCharProps+0x2100, /* Page 0x91 */ + Fast_intCompCharProps+0x2100, /* Page 0x92 */ + Fast_intCompCharProps+0x2100, /* Page 0x93 */ + Fast_intCompCharProps+0x2100, /* Page 0x94 */ + Fast_intCompCharProps+0x2100, /* Page 0x95 */ + Fast_intCompCharProps+0x2100, /* Page 0x96 */ + Fast_intCompCharProps+0x2100, /* Page 0x97 */ + Fast_intCompCharProps+0x2100, /* Page 0x98 */ + Fast_intCompCharProps+0x2100, /* Page 0x99 */ + Fast_intCompCharProps+0x2100, /* Page 0x9A */ + Fast_intCompCharProps+0x2100, /* Page 0x9B */ + Fast_intCompCharProps+0x2100, /* Page 0x9C */ + Fast_intCompCharProps+0x2100, /* Page 0x9D */ + Fast_intCompCharProps+0x2100, /* Page 0x9E */ + Fast_intCompCharProps+0x2300, /* Page 0x9F */ + Fast_intCompCharProps+0x0100, /* Page 0xA0 */ + Fast_intCompCharProps+0x0100, /* Page 0xA1 */ + Fast_intCompCharProps+0x0100, /* Page 0xA2 */ + Fast_intCompCharProps+0x0100, /* Page 0xA3 */ + Fast_intCompCharProps+0x2400, /* Page 0xA4 */ + Fast_intCompCharProps+0x0800, /* Page 0xA5 */ + Fast_intCompCharProps+0x0800, /* Page 0xA6 */ + Fast_intCompCharProps+0x0800, /* Page 0xA7 */ + Fast_intCompCharProps+0x0800, /* Page 0xA8 */ + Fast_intCompCharProps+0x0800, /* Page 0xA9 */ + Fast_intCompCharProps+0x0800, /* Page 0xAA */ + Fast_intCompCharProps+0x0800, /* Page 0xAB */ + Fast_intCompCharProps+0x0100, /* Page 0xAC */ + Fast_intCompCharProps+0x0100, /* Page 0xAD */ + Fast_intCompCharProps+0x0100, /* Page 0xAE */ + Fast_intCompCharProps+0x0100, /* Page 0xAF */ + Fast_intCompCharProps+0x0100, /* Page 0xB0 */ + Fast_intCompCharProps+0x0100, /* Page 0xB1 */ + Fast_intCompCharProps+0x0100, /* Page 0xB2 */ + Fast_intCompCharProps+0x0100, /* Page 0xB3 */ + Fast_intCompCharProps+0x0100, /* Page 0xB4 */ + Fast_intCompCharProps+0x0100, /* Page 0xB5 */ + Fast_intCompCharProps+0x0100, /* Page 0xB6 */ + Fast_intCompCharProps+0x0100, /* Page 0xB7 */ + Fast_intCompCharProps+0x0100, /* Page 0xB8 */ + Fast_intCompCharProps+0x0100, /* Page 0xB9 */ + Fast_intCompCharProps+0x0100, /* Page 0xBA */ + Fast_intCompCharProps+0x0100, /* Page 0xBB */ + Fast_intCompCharProps+0x0100, /* Page 0xBC */ + Fast_intCompCharProps+0x0100, /* Page 0xBD */ + Fast_intCompCharProps+0x0100, /* Page 0xBE */ + Fast_intCompCharProps+0x0100, /* Page 0xBF */ + Fast_intCompCharProps+0x0100, /* Page 0xC0 */ + Fast_intCompCharProps+0x0100, /* Page 0xC1 */ + Fast_intCompCharProps+0x0100, /* Page 0xC2 */ + Fast_intCompCharProps+0x0100, /* Page 0xC3 */ + Fast_intCompCharProps+0x0100, /* Page 0xC4 */ + Fast_intCompCharProps+0x0100, /* Page 0xC5 */ + Fast_intCompCharProps+0x0100, /* Page 0xC6 */ + Fast_intCompCharProps+0x0100, /* Page 0xC7 */ + Fast_intCompCharProps+0x0100, /* Page 0xC8 */ + Fast_intCompCharProps+0x0100, /* Page 0xC9 */ + Fast_intCompCharProps+0x0100, /* Page 0xCA */ + Fast_intCompCharProps+0x0100, /* Page 0xCB */ + Fast_intCompCharProps+0x0100, /* Page 0xCC */ + Fast_intCompCharProps+0x0100, /* Page 0xCD */ + Fast_intCompCharProps+0x0100, /* Page 0xCE */ + Fast_intCompCharProps+0x0100, /* Page 0xCF */ + Fast_intCompCharProps+0x0100, /* Page 0xD0 */ + Fast_intCompCharProps+0x0100, /* Page 0xD1 */ + Fast_intCompCharProps+0x0100, /* Page 0xD2 */ + Fast_intCompCharProps+0x0100, /* Page 0xD3 */ + Fast_intCompCharProps+0x0100, /* Page 0xD4 */ + Fast_intCompCharProps+0x0100, /* Page 0xD5 */ + Fast_intCompCharProps+0x0100, /* Page 0xD6 */ + Fast_intCompCharProps+0x2500, /* Page 0xD7 */ + Fast_intCompCharProps+0x2600, /* Page 0xD8 */ + Fast_intCompCharProps+0x2600, /* Page 0xD9 */ + Fast_intCompCharProps+0x2600, /* Page 0xDA */ + Fast_intCompCharProps+0x2600, /* Page 0xDB */ + Fast_intCompCharProps+0x2600, /* Page 0xDC */ + Fast_intCompCharProps+0x2600, /* Page 0xDD */ + Fast_intCompCharProps+0x2600, /* Page 0xDE */ + Fast_intCompCharProps+0x2600, /* Page 0xDF */ + Fast_intCompCharProps+0x0100, /* Page 0xE0 */ + Fast_intCompCharProps+0x0100, /* Page 0xE1 */ + Fast_intCompCharProps+0x0100, /* Page 0xE2 */ + Fast_intCompCharProps+0x0100, /* Page 0xE3 */ + Fast_intCompCharProps+0x0100, /* Page 0xE4 */ + Fast_intCompCharProps+0x0100, /* Page 0xE5 */ + Fast_intCompCharProps+0x0100, /* Page 0xE6 */ + Fast_intCompCharProps+0x0100, /* Page 0xE7 */ + Fast_intCompCharProps+0x0100, /* Page 0xE8 */ + Fast_intCompCharProps+0x0100, /* Page 0xE9 */ + Fast_intCompCharProps+0x0100, /* Page 0xEA */ + Fast_intCompCharProps+0x0100, /* Page 0xEB */ + Fast_intCompCharProps+0x0100, /* Page 0xEC */ + Fast_intCompCharProps+0x0100, /* Page 0xED */ + Fast_intCompCharProps+0x0100, /* Page 0xEE */ + Fast_intCompCharProps+0x0100, /* Page 0xEF */ + Fast_intCompCharProps+0x0100, /* Page 0xF0 */ + Fast_intCompCharProps+0x0100, /* Page 0xF1 */ + Fast_intCompCharProps+0x0100, /* Page 0xF2 */ + Fast_intCompCharProps+0x0100, /* Page 0xF3 */ + Fast_intCompCharProps+0x0100, /* Page 0xF4 */ + Fast_intCompCharProps+0x0100, /* Page 0xF5 */ + Fast_intCompCharProps+0x0100, /* Page 0xF6 */ + Fast_intCompCharProps+0x0100, /* Page 0xF7 */ + Fast_intCompCharProps+0x0100, /* Page 0xF8 */ + Fast_intCompCharProps+0x2100, /* Page 0xF9 */ + Fast_intCompCharProps+0x2700, /* Page 0xFA */ + Fast_intCompCharProps+0x2800, /* Page 0xFB */ + Fast_intCompCharProps+0x0100, /* Page 0xFC */ + Fast_intCompCharProps+0x2900, /* Page 0xFD */ + Fast_intCompCharProps+0x2A00, /* Page 0xFE */ + Fast_intCompCharProps+0x2B00 /* Page 0xFF */ }; /* End of auto-generated file */ diff --git a/fastlib/src/vespa/fastlib/text/unicodeutil-lowercase.cpp b/fastlib/src/vespa/fastlib/text/unicodeutil-lowercase.cpp index ffc2044a759..c1230a2fb56 100644 --- a/fastlib/src/vespa/fastlib/text/unicodeutil-lowercase.cpp +++ b/fastlib/src/vespa/fastlib/text/unicodeutil-lowercase.cpp @@ -4,649 +4,649 @@ */ static unsigned short Fast_intCompLowerCase[3072]={ - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0061u, 0x0062u, 0x0063u, 0x0064u, 0x0065u, 0x0066u, 0x0067u, - 0x0068u, 0x0069u, 0x006Au, 0x006Bu, 0x006Cu, 0x006Du, 0x006Eu, 0x006Fu, - 0x0070u, 0x0071u, 0x0072u, 0x0073u, 0x0074u, 0x0075u, 0x0076u, 0x0077u, - 0x0078u, 0x0079u, 0x007Au, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x00E0u, 0x00E1u, 0x00E2u, 0x00E3u, 0x00E4u, 0x00E5u, 0x00E6u, 0x00E7u, - 0x00E8u, 0x00E9u, 0x00EAu, 0x00EBu, 0x00ECu, 0x00EDu, 0x00EEu, 0x00EFu, - 0x00F0u, 0x00F1u, 0x00F2u, 0x00F3u, 0x00F4u, 0x00F5u, 0x00F6u, 0x0000u, - 0x00F8u, 0x00F9u, 0x00FAu, 0x00FBu, 0x00FCu, 0x00FDu, 0x00FEu, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0101u, 0x0000u, 0x0103u, 0x0000u, 0x0105u, 0x0000u, 0x0107u, 0x0000u, - 0x0109u, 0x0000u, 0x010Bu, 0x0000u, 0x010Du, 0x0000u, 0x010Fu, 0x0000u, - 0x0111u, 0x0000u, 0x0113u, 0x0000u, 0x0115u, 0x0000u, 0x0117u, 0x0000u, - 0x0119u, 0x0000u, 0x011Bu, 0x0000u, 0x011Du, 0x0000u, 0x011Fu, 0x0000u, - 0x0121u, 0x0000u, 0x0123u, 0x0000u, 0x0125u, 0x0000u, 0x0127u, 0x0000u, - 0x0129u, 0x0000u, 0x012Bu, 0x0000u, 0x012Du, 0x0000u, 0x012Fu, 0x0000u, - 0x0069u, 0x0000u, 0x0133u, 0x0000u, 0x0135u, 0x0000u, 0x0137u, 0x0000u, - 0x0000u, 0x013Au, 0x0000u, 0x013Cu, 0x0000u, 0x013Eu, 0x0000u, 0x0140u, - 0x0000u, 0x0142u, 0x0000u, 0x0144u, 0x0000u, 0x0146u, 0x0000u, 0x0148u, - 0x0000u, 0x0000u, 0x014Bu, 0x0000u, 0x014Du, 0x0000u, 0x014Fu, 0x0000u, - 0x0151u, 0x0000u, 0x0153u, 0x0000u, 0x0155u, 0x0000u, 0x0157u, 0x0000u, - 0x0159u, 0x0000u, 0x015Bu, 0x0000u, 0x015Du, 0x0000u, 0x015Fu, 0x0000u, - 0x0161u, 0x0000u, 0x0163u, 0x0000u, 0x0165u, 0x0000u, 0x0167u, 0x0000u, - 0x0169u, 0x0000u, 0x016Bu, 0x0000u, 0x016Du, 0x0000u, 0x016Fu, 0x0000u, - 0x0171u, 0x0000u, 0x0173u, 0x0000u, 0x0175u, 0x0000u, 0x0177u, 0x0000u, - 0x00FFu, 0x017Au, 0x0000u, 0x017Cu, 0x0000u, 0x017Eu, 0x0000u, 0x0000u, - 0x0000u, 0x0253u, 0x0183u, 0x0000u, 0x0185u, 0x0000u, 0x0254u, 0x0188u, - 0x0000u, 0x0256u, 0x0257u, 0x018Cu, 0x0000u, 0x0000u, 0x01DDu, 0x0259u, - 0x025Bu, 0x0192u, 0x0000u, 0x0260u, 0x0263u, 0x0000u, 0x0269u, 0x0268u, - 0x0199u, 0x0000u, 0x0000u, 0x0000u, 0x026Fu, 0x0272u, 0x0000u, 0x0275u, - 0x01A1u, 0x0000u, 0x01A3u, 0x0000u, 0x01A5u, 0x0000u, 0x0280u, 0x01A8u, - 0x0000u, 0x0283u, 0x0000u, 0x0000u, 0x01ADu, 0x0000u, 0x0288u, 0x01B0u, - 0x0000u, 0x028Au, 0x028Bu, 0x01B4u, 0x0000u, 0x01B6u, 0x0000u, 0x0292u, - 0x01B9u, 0x0000u, 0x0000u, 0x0000u, 0x01BDu, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x01C6u, 0x01C6u, 0x0000u, 0x01C9u, - 0x01C9u, 0x0000u, 0x01CCu, 0x01CCu, 0x0000u, 0x01CEu, 0x0000u, 0x01D0u, - 0x0000u, 0x01D2u, 0x0000u, 0x01D4u, 0x0000u, 0x01D6u, 0x0000u, 0x01D8u, - 0x0000u, 0x01DAu, 0x0000u, 0x01DCu, 0x0000u, 0x0000u, 0x01DFu, 0x0000u, - 0x01E1u, 0x0000u, 0x01E3u, 0x0000u, 0x01E5u, 0x0000u, 0x01E7u, 0x0000u, - 0x01E9u, 0x0000u, 0x01EBu, 0x0000u, 0x01EDu, 0x0000u, 0x01EFu, 0x0000u, - 0x0000u, 0x01F3u, 0x01F3u, 0x0000u, 0x01F5u, 0x0000u, 0x0195u, 0x01BFu, - 0x01F9u, 0x0000u, 0x01FBu, 0x0000u, 0x01FDu, 0x0000u, 0x01FFu, 0x0000u, - 0x0201u, 0x0000u, 0x0203u, 0x0000u, 0x0205u, 0x0000u, 0x0207u, 0x0000u, - 0x0209u, 0x0000u, 0x020Bu, 0x0000u, 0x020Du, 0x0000u, 0x020Fu, 0x0000u, - 0x0211u, 0x0000u, 0x0213u, 0x0000u, 0x0215u, 0x0000u, 0x0217u, 0x0000u, - 0x0219u, 0x0000u, 0x021Bu, 0x0000u, 0x021Du, 0x0000u, 0x021Fu, 0x0000u, - 0x019Eu, 0x0000u, 0x0223u, 0x0000u, 0x0225u, 0x0000u, 0x0227u, 0x0000u, - 0x0229u, 0x0000u, 0x022Bu, 0x0000u, 0x022Du, 0x0000u, 0x022Fu, 0x0000u, - 0x0231u, 0x0000u, 0x0233u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x03ACu, 0x0000u, - 0x03ADu, 0x03AEu, 0x03AFu, 0x0000u, 0x03CCu, 0x0000u, 0x03CDu, 0x03CEu, - 0x0000u, 0x03B1u, 0x03B2u, 0x03B3u, 0x03B4u, 0x03B5u, 0x03B6u, 0x03B7u, - 0x03B8u, 0x03B9u, 0x03BAu, 0x03BBu, 0x03BCu, 0x03BDu, 0x03BEu, 0x03BFu, - 0x03C0u, 0x03C1u, 0x0000u, 0x03C3u, 0x03C4u, 0x03C5u, 0x03C6u, 0x03C7u, - 0x03C8u, 0x03C9u, 0x03CAu, 0x03CBu, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x03D9u, 0x0000u, 0x03DBu, 0x0000u, 0x03DDu, 0x0000u, 0x03DFu, 0x0000u, - 0x03E1u, 0x0000u, 0x03E3u, 0x0000u, 0x03E5u, 0x0000u, 0x03E7u, 0x0000u, - 0x03E9u, 0x0000u, 0x03EBu, 0x0000u, 0x03EDu, 0x0000u, 0x03EFu, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x03B8u, 0x0000u, 0x0000u, 0x03F8u, - 0x0000u, 0x03F2u, 0x03FBu, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0450u, 0x0451u, 0x0452u, 0x0453u, 0x0454u, 0x0455u, 0x0456u, 0x0457u, - 0x0458u, 0x0459u, 0x045Au, 0x045Bu, 0x045Cu, 0x045Du, 0x045Eu, 0x045Fu, - 0x0430u, 0x0431u, 0x0432u, 0x0433u, 0x0434u, 0x0435u, 0x0436u, 0x0437u, - 0x0438u, 0x0439u, 0x043Au, 0x043Bu, 0x043Cu, 0x043Du, 0x043Eu, 0x043Fu, - 0x0440u, 0x0441u, 0x0442u, 0x0443u, 0x0444u, 0x0445u, 0x0446u, 0x0447u, - 0x0448u, 0x0449u, 0x044Au, 0x044Bu, 0x044Cu, 0x044Du, 0x044Eu, 0x044Fu, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0461u, 0x0000u, 0x0463u, 0x0000u, 0x0465u, 0x0000u, 0x0467u, 0x0000u, - 0x0469u, 0x0000u, 0x046Bu, 0x0000u, 0x046Du, 0x0000u, 0x046Fu, 0x0000u, - 0x0471u, 0x0000u, 0x0473u, 0x0000u, 0x0475u, 0x0000u, 0x0477u, 0x0000u, - 0x0479u, 0x0000u, 0x047Bu, 0x0000u, 0x047Du, 0x0000u, 0x047Fu, 0x0000u, - 0x0481u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x048Bu, 0x0000u, 0x048Du, 0x0000u, 0x048Fu, 0x0000u, - 0x0491u, 0x0000u, 0x0493u, 0x0000u, 0x0495u, 0x0000u, 0x0497u, 0x0000u, - 0x0499u, 0x0000u, 0x049Bu, 0x0000u, 0x049Du, 0x0000u, 0x049Fu, 0x0000u, - 0x04A1u, 0x0000u, 0x04A3u, 0x0000u, 0x04A5u, 0x0000u, 0x04A7u, 0x0000u, - 0x04A9u, 0x0000u, 0x04ABu, 0x0000u, 0x04ADu, 0x0000u, 0x04AFu, 0x0000u, - 0x04B1u, 0x0000u, 0x04B3u, 0x0000u, 0x04B5u, 0x0000u, 0x04B7u, 0x0000u, - 0x04B9u, 0x0000u, 0x04BBu, 0x0000u, 0x04BDu, 0x0000u, 0x04BFu, 0x0000u, - 0x0000u, 0x04C2u, 0x0000u, 0x04C4u, 0x0000u, 0x04C6u, 0x0000u, 0x04C8u, - 0x0000u, 0x04CAu, 0x0000u, 0x04CCu, 0x0000u, 0x04CEu, 0x0000u, 0x0000u, - 0x04D1u, 0x0000u, 0x04D3u, 0x0000u, 0x04D5u, 0x0000u, 0x04D7u, 0x0000u, - 0x04D9u, 0x0000u, 0x04DBu, 0x0000u, 0x04DDu, 0x0000u, 0x04DFu, 0x0000u, - 0x04E1u, 0x0000u, 0x04E3u, 0x0000u, 0x04E5u, 0x0000u, 0x04E7u, 0x0000u, - 0x04E9u, 0x0000u, 0x04EBu, 0x0000u, 0x04EDu, 0x0000u, 0x04EFu, 0x0000u, - 0x04F1u, 0x0000u, 0x04F3u, 0x0000u, 0x04F5u, 0x0000u, 0x0000u, 0x0000u, - 0x04F9u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0501u, 0x0000u, 0x0503u, 0x0000u, 0x0505u, 0x0000u, 0x0507u, 0x0000u, - 0x0509u, 0x0000u, 0x050Bu, 0x0000u, 0x050Du, 0x0000u, 0x050Fu, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0561u, 0x0562u, 0x0563u, 0x0564u, 0x0565u, 0x0566u, 0x0567u, - 0x0568u, 0x0569u, 0x056Au, 0x056Bu, 0x056Cu, 0x056Du, 0x056Eu, 0x056Fu, - 0x0570u, 0x0571u, 0x0572u, 0x0573u, 0x0574u, 0x0575u, 0x0576u, 0x0577u, - 0x0578u, 0x0579u, 0x057Au, 0x057Bu, 0x057Cu, 0x057Du, 0x057Eu, 0x057Fu, - 0x0580u, 0x0581u, 0x0582u, 0x0583u, 0x0584u, 0x0585u, 0x0586u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1E01u, 0x0000u, 0x1E03u, 0x0000u, 0x1E05u, 0x0000u, 0x1E07u, 0x0000u, - 0x1E09u, 0x0000u, 0x1E0Bu, 0x0000u, 0x1E0Du, 0x0000u, 0x1E0Fu, 0x0000u, - 0x1E11u, 0x0000u, 0x1E13u, 0x0000u, 0x1E15u, 0x0000u, 0x1E17u, 0x0000u, - 0x1E19u, 0x0000u, 0x1E1Bu, 0x0000u, 0x1E1Du, 0x0000u, 0x1E1Fu, 0x0000u, - 0x1E21u, 0x0000u, 0x1E23u, 0x0000u, 0x1E25u, 0x0000u, 0x1E27u, 0x0000u, - 0x1E29u, 0x0000u, 0x1E2Bu, 0x0000u, 0x1E2Du, 0x0000u, 0x1E2Fu, 0x0000u, - 0x1E31u, 0x0000u, 0x1E33u, 0x0000u, 0x1E35u, 0x0000u, 0x1E37u, 0x0000u, - 0x1E39u, 0x0000u, 0x1E3Bu, 0x0000u, 0x1E3Du, 0x0000u, 0x1E3Fu, 0x0000u, - 0x1E41u, 0x0000u, 0x1E43u, 0x0000u, 0x1E45u, 0x0000u, 0x1E47u, 0x0000u, - 0x1E49u, 0x0000u, 0x1E4Bu, 0x0000u, 0x1E4Du, 0x0000u, 0x1E4Fu, 0x0000u, - 0x1E51u, 0x0000u, 0x1E53u, 0x0000u, 0x1E55u, 0x0000u, 0x1E57u, 0x0000u, - 0x1E59u, 0x0000u, 0x1E5Bu, 0x0000u, 0x1E5Du, 0x0000u, 0x1E5Fu, 0x0000u, - 0x1E61u, 0x0000u, 0x1E63u, 0x0000u, 0x1E65u, 0x0000u, 0x1E67u, 0x0000u, - 0x1E69u, 0x0000u, 0x1E6Bu, 0x0000u, 0x1E6Du, 0x0000u, 0x1E6Fu, 0x0000u, - 0x1E71u, 0x0000u, 0x1E73u, 0x0000u, 0x1E75u, 0x0000u, 0x1E77u, 0x0000u, - 0x1E79u, 0x0000u, 0x1E7Bu, 0x0000u, 0x1E7Du, 0x0000u, 0x1E7Fu, 0x0000u, - 0x1E81u, 0x0000u, 0x1E83u, 0x0000u, 0x1E85u, 0x0000u, 0x1E87u, 0x0000u, - 0x1E89u, 0x0000u, 0x1E8Bu, 0x0000u, 0x1E8Du, 0x0000u, 0x1E8Fu, 0x0000u, - 0x1E91u, 0x0000u, 0x1E93u, 0x0000u, 0x1E95u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1EA1u, 0x0000u, 0x1EA3u, 0x0000u, 0x1EA5u, 0x0000u, 0x1EA7u, 0x0000u, - 0x1EA9u, 0x0000u, 0x1EABu, 0x0000u, 0x1EADu, 0x0000u, 0x1EAFu, 0x0000u, - 0x1EB1u, 0x0000u, 0x1EB3u, 0x0000u, 0x1EB5u, 0x0000u, 0x1EB7u, 0x0000u, - 0x1EB9u, 0x0000u, 0x1EBBu, 0x0000u, 0x1EBDu, 0x0000u, 0x1EBFu, 0x0000u, - 0x1EC1u, 0x0000u, 0x1EC3u, 0x0000u, 0x1EC5u, 0x0000u, 0x1EC7u, 0x0000u, - 0x1EC9u, 0x0000u, 0x1ECBu, 0x0000u, 0x1ECDu, 0x0000u, 0x1ECFu, 0x0000u, - 0x1ED1u, 0x0000u, 0x1ED3u, 0x0000u, 0x1ED5u, 0x0000u, 0x1ED7u, 0x0000u, - 0x1ED9u, 0x0000u, 0x1EDBu, 0x0000u, 0x1EDDu, 0x0000u, 0x1EDFu, 0x0000u, - 0x1EE1u, 0x0000u, 0x1EE3u, 0x0000u, 0x1EE5u, 0x0000u, 0x1EE7u, 0x0000u, - 0x1EE9u, 0x0000u, 0x1EEBu, 0x0000u, 0x1EEDu, 0x0000u, 0x1EEFu, 0x0000u, - 0x1EF1u, 0x0000u, 0x1EF3u, 0x0000u, 0x1EF5u, 0x0000u, 0x1EF7u, 0x0000u, - 0x1EF9u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1F00u, 0x1F01u, 0x1F02u, 0x1F03u, 0x1F04u, 0x1F05u, 0x1F06u, 0x1F07u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1F10u, 0x1F11u, 0x1F12u, 0x1F13u, 0x1F14u, 0x1F15u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1F20u, 0x1F21u, 0x1F22u, 0x1F23u, 0x1F24u, 0x1F25u, 0x1F26u, 0x1F27u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1F30u, 0x1F31u, 0x1F32u, 0x1F33u, 0x1F34u, 0x1F35u, 0x1F36u, 0x1F37u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1F40u, 0x1F41u, 0x1F42u, 0x1F43u, 0x1F44u, 0x1F45u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x1F51u, 0x0000u, 0x1F53u, 0x0000u, 0x1F55u, 0x0000u, 0x1F57u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1F60u, 0x1F61u, 0x1F62u, 0x1F63u, 0x1F64u, 0x1F65u, 0x1F66u, 0x1F67u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1F80u, 0x1F81u, 0x1F82u, 0x1F83u, 0x1F84u, 0x1F85u, 0x1F86u, 0x1F87u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1F90u, 0x1F91u, 0x1F92u, 0x1F93u, 0x1F94u, 0x1F95u, 0x1F96u, 0x1F97u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1FA0u, 0x1FA1u, 0x1FA2u, 0x1FA3u, 0x1FA4u, 0x1FA5u, 0x1FA6u, 0x1FA7u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1FB0u, 0x1FB1u, 0x1F70u, 0x1F71u, 0x1FB3u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1F72u, 0x1F73u, 0x1F74u, 0x1F75u, 0x1FC3u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1FD0u, 0x1FD1u, 0x1F76u, 0x1F77u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1FE0u, 0x1FE1u, 0x1F7Au, 0x1F7Bu, 0x1FE5u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x1F78u, 0x1F79u, 0x1F7Cu, 0x1F7Du, 0x1FF3u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x03C9u, 0x0000u, - 0x0000u, 0x0000u, 0x006Bu, 0x00E5u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x2170u, 0x2171u, 0x2172u, 0x2173u, 0x2174u, 0x2175u, 0x2176u, 0x2177u, - 0x2178u, 0x2179u, 0x217Au, 0x217Bu, 0x217Cu, 0x217Du, 0x217Eu, 0x217Fu, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x24D0u, 0x24D1u, - 0x24D2u, 0x24D3u, 0x24D4u, 0x24D5u, 0x24D6u, 0x24D7u, 0x24D8u, 0x24D9u, - 0x24DAu, 0x24DBu, 0x24DCu, 0x24DDu, 0x24DEu, 0x24DFu, 0x24E0u, 0x24E1u, - 0x24E2u, 0x24E3u, 0x24E4u, 0x24E5u, 0x24E6u, 0x24E7u, 0x24E8u, 0x24E9u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0xFF41u, 0xFF42u, 0xFF43u, 0xFF44u, 0xFF45u, 0xFF46u, 0xFF47u, - 0xFF48u, 0xFF49u, 0xFF4Au, 0xFF4Bu, 0xFF4Cu, 0xFF4Du, 0xFF4Eu, 0xFF4Fu, - 0xFF50u, 0xFF51u, 0xFF52u, 0xFF53u, 0xFF54u, 0xFF55u, 0xFF56u, 0xFF57u, - 0xFF58u, 0xFF59u, 0xFF5Au, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, - 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0061u, 0x0062u, 0x0063u, 0x0064u, 0x0065u, 0x0066u, 0x0067u, + 0x0068u, 0x0069u, 0x006Au, 0x006Bu, 0x006Cu, 0x006Du, 0x006Eu, 0x006Fu, + 0x0070u, 0x0071u, 0x0072u, 0x0073u, 0x0074u, 0x0075u, 0x0076u, 0x0077u, + 0x0078u, 0x0079u, 0x007Au, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x00E0u, 0x00E1u, 0x00E2u, 0x00E3u, 0x00E4u, 0x00E5u, 0x00E6u, 0x00E7u, + 0x00E8u, 0x00E9u, 0x00EAu, 0x00EBu, 0x00ECu, 0x00EDu, 0x00EEu, 0x00EFu, + 0x00F0u, 0x00F1u, 0x00F2u, 0x00F3u, 0x00F4u, 0x00F5u, 0x00F6u, 0x0000u, + 0x00F8u, 0x00F9u, 0x00FAu, 0x00FBu, 0x00FCu, 0x00FDu, 0x00FEu, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0101u, 0x0000u, 0x0103u, 0x0000u, 0x0105u, 0x0000u, 0x0107u, 0x0000u, + 0x0109u, 0x0000u, 0x010Bu, 0x0000u, 0x010Du, 0x0000u, 0x010Fu, 0x0000u, + 0x0111u, 0x0000u, 0x0113u, 0x0000u, 0x0115u, 0x0000u, 0x0117u, 0x0000u, + 0x0119u, 0x0000u, 0x011Bu, 0x0000u, 0x011Du, 0x0000u, 0x011Fu, 0x0000u, + 0x0121u, 0x0000u, 0x0123u, 0x0000u, 0x0125u, 0x0000u, 0x0127u, 0x0000u, + 0x0129u, 0x0000u, 0x012Bu, 0x0000u, 0x012Du, 0x0000u, 0x012Fu, 0x0000u, + 0x0069u, 0x0000u, 0x0133u, 0x0000u, 0x0135u, 0x0000u, 0x0137u, 0x0000u, + 0x0000u, 0x013Au, 0x0000u, 0x013Cu, 0x0000u, 0x013Eu, 0x0000u, 0x0140u, + 0x0000u, 0x0142u, 0x0000u, 0x0144u, 0x0000u, 0x0146u, 0x0000u, 0x0148u, + 0x0000u, 0x0000u, 0x014Bu, 0x0000u, 0x014Du, 0x0000u, 0x014Fu, 0x0000u, + 0x0151u, 0x0000u, 0x0153u, 0x0000u, 0x0155u, 0x0000u, 0x0157u, 0x0000u, + 0x0159u, 0x0000u, 0x015Bu, 0x0000u, 0x015Du, 0x0000u, 0x015Fu, 0x0000u, + 0x0161u, 0x0000u, 0x0163u, 0x0000u, 0x0165u, 0x0000u, 0x0167u, 0x0000u, + 0x0169u, 0x0000u, 0x016Bu, 0x0000u, 0x016Du, 0x0000u, 0x016Fu, 0x0000u, + 0x0171u, 0x0000u, 0x0173u, 0x0000u, 0x0175u, 0x0000u, 0x0177u, 0x0000u, + 0x00FFu, 0x017Au, 0x0000u, 0x017Cu, 0x0000u, 0x017Eu, 0x0000u, 0x0000u, + 0x0000u, 0x0253u, 0x0183u, 0x0000u, 0x0185u, 0x0000u, 0x0254u, 0x0188u, + 0x0000u, 0x0256u, 0x0257u, 0x018Cu, 0x0000u, 0x0000u, 0x01DDu, 0x0259u, + 0x025Bu, 0x0192u, 0x0000u, 0x0260u, 0x0263u, 0x0000u, 0x0269u, 0x0268u, + 0x0199u, 0x0000u, 0x0000u, 0x0000u, 0x026Fu, 0x0272u, 0x0000u, 0x0275u, + 0x01A1u, 0x0000u, 0x01A3u, 0x0000u, 0x01A5u, 0x0000u, 0x0280u, 0x01A8u, + 0x0000u, 0x0283u, 0x0000u, 0x0000u, 0x01ADu, 0x0000u, 0x0288u, 0x01B0u, + 0x0000u, 0x028Au, 0x028Bu, 0x01B4u, 0x0000u, 0x01B6u, 0x0000u, 0x0292u, + 0x01B9u, 0x0000u, 0x0000u, 0x0000u, 0x01BDu, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x01C6u, 0x01C6u, 0x0000u, 0x01C9u, + 0x01C9u, 0x0000u, 0x01CCu, 0x01CCu, 0x0000u, 0x01CEu, 0x0000u, 0x01D0u, + 0x0000u, 0x01D2u, 0x0000u, 0x01D4u, 0x0000u, 0x01D6u, 0x0000u, 0x01D8u, + 0x0000u, 0x01DAu, 0x0000u, 0x01DCu, 0x0000u, 0x0000u, 0x01DFu, 0x0000u, + 0x01E1u, 0x0000u, 0x01E3u, 0x0000u, 0x01E5u, 0x0000u, 0x01E7u, 0x0000u, + 0x01E9u, 0x0000u, 0x01EBu, 0x0000u, 0x01EDu, 0x0000u, 0x01EFu, 0x0000u, + 0x0000u, 0x01F3u, 0x01F3u, 0x0000u, 0x01F5u, 0x0000u, 0x0195u, 0x01BFu, + 0x01F9u, 0x0000u, 0x01FBu, 0x0000u, 0x01FDu, 0x0000u, 0x01FFu, 0x0000u, + 0x0201u, 0x0000u, 0x0203u, 0x0000u, 0x0205u, 0x0000u, 0x0207u, 0x0000u, + 0x0209u, 0x0000u, 0x020Bu, 0x0000u, 0x020Du, 0x0000u, 0x020Fu, 0x0000u, + 0x0211u, 0x0000u, 0x0213u, 0x0000u, 0x0215u, 0x0000u, 0x0217u, 0x0000u, + 0x0219u, 0x0000u, 0x021Bu, 0x0000u, 0x021Du, 0x0000u, 0x021Fu, 0x0000u, + 0x019Eu, 0x0000u, 0x0223u, 0x0000u, 0x0225u, 0x0000u, 0x0227u, 0x0000u, + 0x0229u, 0x0000u, 0x022Bu, 0x0000u, 0x022Du, 0x0000u, 0x022Fu, 0x0000u, + 0x0231u, 0x0000u, 0x0233u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x03ACu, 0x0000u, + 0x03ADu, 0x03AEu, 0x03AFu, 0x0000u, 0x03CCu, 0x0000u, 0x03CDu, 0x03CEu, + 0x0000u, 0x03B1u, 0x03B2u, 0x03B3u, 0x03B4u, 0x03B5u, 0x03B6u, 0x03B7u, + 0x03B8u, 0x03B9u, 0x03BAu, 0x03BBu, 0x03BCu, 0x03BDu, 0x03BEu, 0x03BFu, + 0x03C0u, 0x03C1u, 0x0000u, 0x03C3u, 0x03C4u, 0x03C5u, 0x03C6u, 0x03C7u, + 0x03C8u, 0x03C9u, 0x03CAu, 0x03CBu, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x03D9u, 0x0000u, 0x03DBu, 0x0000u, 0x03DDu, 0x0000u, 0x03DFu, 0x0000u, + 0x03E1u, 0x0000u, 0x03E3u, 0x0000u, 0x03E5u, 0x0000u, 0x03E7u, 0x0000u, + 0x03E9u, 0x0000u, 0x03EBu, 0x0000u, 0x03EDu, 0x0000u, 0x03EFu, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x03B8u, 0x0000u, 0x0000u, 0x03F8u, + 0x0000u, 0x03F2u, 0x03FBu, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0450u, 0x0451u, 0x0452u, 0x0453u, 0x0454u, 0x0455u, 0x0456u, 0x0457u, + 0x0458u, 0x0459u, 0x045Au, 0x045Bu, 0x045Cu, 0x045Du, 0x045Eu, 0x045Fu, + 0x0430u, 0x0431u, 0x0432u, 0x0433u, 0x0434u, 0x0435u, 0x0436u, 0x0437u, + 0x0438u, 0x0439u, 0x043Au, 0x043Bu, 0x043Cu, 0x043Du, 0x043Eu, 0x043Fu, + 0x0440u, 0x0441u, 0x0442u, 0x0443u, 0x0444u, 0x0445u, 0x0446u, 0x0447u, + 0x0448u, 0x0449u, 0x044Au, 0x044Bu, 0x044Cu, 0x044Du, 0x044Eu, 0x044Fu, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0461u, 0x0000u, 0x0463u, 0x0000u, 0x0465u, 0x0000u, 0x0467u, 0x0000u, + 0x0469u, 0x0000u, 0x046Bu, 0x0000u, 0x046Du, 0x0000u, 0x046Fu, 0x0000u, + 0x0471u, 0x0000u, 0x0473u, 0x0000u, 0x0475u, 0x0000u, 0x0477u, 0x0000u, + 0x0479u, 0x0000u, 0x047Bu, 0x0000u, 0x047Du, 0x0000u, 0x047Fu, 0x0000u, + 0x0481u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x048Bu, 0x0000u, 0x048Du, 0x0000u, 0x048Fu, 0x0000u, + 0x0491u, 0x0000u, 0x0493u, 0x0000u, 0x0495u, 0x0000u, 0x0497u, 0x0000u, + 0x0499u, 0x0000u, 0x049Bu, 0x0000u, 0x049Du, 0x0000u, 0x049Fu, 0x0000u, + 0x04A1u, 0x0000u, 0x04A3u, 0x0000u, 0x04A5u, 0x0000u, 0x04A7u, 0x0000u, + 0x04A9u, 0x0000u, 0x04ABu, 0x0000u, 0x04ADu, 0x0000u, 0x04AFu, 0x0000u, + 0x04B1u, 0x0000u, 0x04B3u, 0x0000u, 0x04B5u, 0x0000u, 0x04B7u, 0x0000u, + 0x04B9u, 0x0000u, 0x04BBu, 0x0000u, 0x04BDu, 0x0000u, 0x04BFu, 0x0000u, + 0x0000u, 0x04C2u, 0x0000u, 0x04C4u, 0x0000u, 0x04C6u, 0x0000u, 0x04C8u, + 0x0000u, 0x04CAu, 0x0000u, 0x04CCu, 0x0000u, 0x04CEu, 0x0000u, 0x0000u, + 0x04D1u, 0x0000u, 0x04D3u, 0x0000u, 0x04D5u, 0x0000u, 0x04D7u, 0x0000u, + 0x04D9u, 0x0000u, 0x04DBu, 0x0000u, 0x04DDu, 0x0000u, 0x04DFu, 0x0000u, + 0x04E1u, 0x0000u, 0x04E3u, 0x0000u, 0x04E5u, 0x0000u, 0x04E7u, 0x0000u, + 0x04E9u, 0x0000u, 0x04EBu, 0x0000u, 0x04EDu, 0x0000u, 0x04EFu, 0x0000u, + 0x04F1u, 0x0000u, 0x04F3u, 0x0000u, 0x04F5u, 0x0000u, 0x0000u, 0x0000u, + 0x04F9u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0501u, 0x0000u, 0x0503u, 0x0000u, 0x0505u, 0x0000u, 0x0507u, 0x0000u, + 0x0509u, 0x0000u, 0x050Bu, 0x0000u, 0x050Du, 0x0000u, 0x050Fu, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0561u, 0x0562u, 0x0563u, 0x0564u, 0x0565u, 0x0566u, 0x0567u, + 0x0568u, 0x0569u, 0x056Au, 0x056Bu, 0x056Cu, 0x056Du, 0x056Eu, 0x056Fu, + 0x0570u, 0x0571u, 0x0572u, 0x0573u, 0x0574u, 0x0575u, 0x0576u, 0x0577u, + 0x0578u, 0x0579u, 0x057Au, 0x057Bu, 0x057Cu, 0x057Du, 0x057Eu, 0x057Fu, + 0x0580u, 0x0581u, 0x0582u, 0x0583u, 0x0584u, 0x0585u, 0x0586u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1E01u, 0x0000u, 0x1E03u, 0x0000u, 0x1E05u, 0x0000u, 0x1E07u, 0x0000u, + 0x1E09u, 0x0000u, 0x1E0Bu, 0x0000u, 0x1E0Du, 0x0000u, 0x1E0Fu, 0x0000u, + 0x1E11u, 0x0000u, 0x1E13u, 0x0000u, 0x1E15u, 0x0000u, 0x1E17u, 0x0000u, + 0x1E19u, 0x0000u, 0x1E1Bu, 0x0000u, 0x1E1Du, 0x0000u, 0x1E1Fu, 0x0000u, + 0x1E21u, 0x0000u, 0x1E23u, 0x0000u, 0x1E25u, 0x0000u, 0x1E27u, 0x0000u, + 0x1E29u, 0x0000u, 0x1E2Bu, 0x0000u, 0x1E2Du, 0x0000u, 0x1E2Fu, 0x0000u, + 0x1E31u, 0x0000u, 0x1E33u, 0x0000u, 0x1E35u, 0x0000u, 0x1E37u, 0x0000u, + 0x1E39u, 0x0000u, 0x1E3Bu, 0x0000u, 0x1E3Du, 0x0000u, 0x1E3Fu, 0x0000u, + 0x1E41u, 0x0000u, 0x1E43u, 0x0000u, 0x1E45u, 0x0000u, 0x1E47u, 0x0000u, + 0x1E49u, 0x0000u, 0x1E4Bu, 0x0000u, 0x1E4Du, 0x0000u, 0x1E4Fu, 0x0000u, + 0x1E51u, 0x0000u, 0x1E53u, 0x0000u, 0x1E55u, 0x0000u, 0x1E57u, 0x0000u, + 0x1E59u, 0x0000u, 0x1E5Bu, 0x0000u, 0x1E5Du, 0x0000u, 0x1E5Fu, 0x0000u, + 0x1E61u, 0x0000u, 0x1E63u, 0x0000u, 0x1E65u, 0x0000u, 0x1E67u, 0x0000u, + 0x1E69u, 0x0000u, 0x1E6Bu, 0x0000u, 0x1E6Du, 0x0000u, 0x1E6Fu, 0x0000u, + 0x1E71u, 0x0000u, 0x1E73u, 0x0000u, 0x1E75u, 0x0000u, 0x1E77u, 0x0000u, + 0x1E79u, 0x0000u, 0x1E7Bu, 0x0000u, 0x1E7Du, 0x0000u, 0x1E7Fu, 0x0000u, + 0x1E81u, 0x0000u, 0x1E83u, 0x0000u, 0x1E85u, 0x0000u, 0x1E87u, 0x0000u, + 0x1E89u, 0x0000u, 0x1E8Bu, 0x0000u, 0x1E8Du, 0x0000u, 0x1E8Fu, 0x0000u, + 0x1E91u, 0x0000u, 0x1E93u, 0x0000u, 0x1E95u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1EA1u, 0x0000u, 0x1EA3u, 0x0000u, 0x1EA5u, 0x0000u, 0x1EA7u, 0x0000u, + 0x1EA9u, 0x0000u, 0x1EABu, 0x0000u, 0x1EADu, 0x0000u, 0x1EAFu, 0x0000u, + 0x1EB1u, 0x0000u, 0x1EB3u, 0x0000u, 0x1EB5u, 0x0000u, 0x1EB7u, 0x0000u, + 0x1EB9u, 0x0000u, 0x1EBBu, 0x0000u, 0x1EBDu, 0x0000u, 0x1EBFu, 0x0000u, + 0x1EC1u, 0x0000u, 0x1EC3u, 0x0000u, 0x1EC5u, 0x0000u, 0x1EC7u, 0x0000u, + 0x1EC9u, 0x0000u, 0x1ECBu, 0x0000u, 0x1ECDu, 0x0000u, 0x1ECFu, 0x0000u, + 0x1ED1u, 0x0000u, 0x1ED3u, 0x0000u, 0x1ED5u, 0x0000u, 0x1ED7u, 0x0000u, + 0x1ED9u, 0x0000u, 0x1EDBu, 0x0000u, 0x1EDDu, 0x0000u, 0x1EDFu, 0x0000u, + 0x1EE1u, 0x0000u, 0x1EE3u, 0x0000u, 0x1EE5u, 0x0000u, 0x1EE7u, 0x0000u, + 0x1EE9u, 0x0000u, 0x1EEBu, 0x0000u, 0x1EEDu, 0x0000u, 0x1EEFu, 0x0000u, + 0x1EF1u, 0x0000u, 0x1EF3u, 0x0000u, 0x1EF5u, 0x0000u, 0x1EF7u, 0x0000u, + 0x1EF9u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1F00u, 0x1F01u, 0x1F02u, 0x1F03u, 0x1F04u, 0x1F05u, 0x1F06u, 0x1F07u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1F10u, 0x1F11u, 0x1F12u, 0x1F13u, 0x1F14u, 0x1F15u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1F20u, 0x1F21u, 0x1F22u, 0x1F23u, 0x1F24u, 0x1F25u, 0x1F26u, 0x1F27u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1F30u, 0x1F31u, 0x1F32u, 0x1F33u, 0x1F34u, 0x1F35u, 0x1F36u, 0x1F37u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1F40u, 0x1F41u, 0x1F42u, 0x1F43u, 0x1F44u, 0x1F45u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x1F51u, 0x0000u, 0x1F53u, 0x0000u, 0x1F55u, 0x0000u, 0x1F57u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1F60u, 0x1F61u, 0x1F62u, 0x1F63u, 0x1F64u, 0x1F65u, 0x1F66u, 0x1F67u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1F80u, 0x1F81u, 0x1F82u, 0x1F83u, 0x1F84u, 0x1F85u, 0x1F86u, 0x1F87u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1F90u, 0x1F91u, 0x1F92u, 0x1F93u, 0x1F94u, 0x1F95u, 0x1F96u, 0x1F97u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1FA0u, 0x1FA1u, 0x1FA2u, 0x1FA3u, 0x1FA4u, 0x1FA5u, 0x1FA6u, 0x1FA7u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1FB0u, 0x1FB1u, 0x1F70u, 0x1F71u, 0x1FB3u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1F72u, 0x1F73u, 0x1F74u, 0x1F75u, 0x1FC3u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1FD0u, 0x1FD1u, 0x1F76u, 0x1F77u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1FE0u, 0x1FE1u, 0x1F7Au, 0x1F7Bu, 0x1FE5u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x1F78u, 0x1F79u, 0x1F7Cu, 0x1F7Du, 0x1FF3u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x03C9u, 0x0000u, + 0x0000u, 0x0000u, 0x006Bu, 0x00E5u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x2170u, 0x2171u, 0x2172u, 0x2173u, 0x2174u, 0x2175u, 0x2176u, 0x2177u, + 0x2178u, 0x2179u, 0x217Au, 0x217Bu, 0x217Cu, 0x217Du, 0x217Eu, 0x217Fu, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x24D0u, 0x24D1u, + 0x24D2u, 0x24D3u, 0x24D4u, 0x24D5u, 0x24D6u, 0x24D7u, 0x24D8u, 0x24D9u, + 0x24DAu, 0x24DBu, 0x24DCu, 0x24DDu, 0x24DEu, 0x24DFu, 0x24E0u, 0x24E1u, + 0x24E2u, 0x24E3u, 0x24E4u, 0x24E5u, 0x24E6u, 0x24E7u, 0x24E8u, 0x24E9u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0xFF41u, 0xFF42u, 0xFF43u, 0xFF44u, 0xFF45u, 0xFF46u, 0xFF47u, + 0xFF48u, 0xFF49u, 0xFF4Au, 0xFF4Bu, 0xFF4Cu, 0xFF4Du, 0xFF4Eu, 0xFF4Fu, + 0xFF50u, 0xFF51u, 0xFF52u, 0xFF53u, 0xFF54u, 0xFF55u, 0xFF56u, 0xFF57u, + 0xFF58u, 0xFF59u, 0xFF5Au, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, + 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, }; unsigned short *Fast_UnicodeUtil::_compLowerCase[256]={ - Fast_intCompLowerCase+0x0000, /* Page 0x00 */ - Fast_intCompLowerCase+0x0100, /* Page 0x01 */ - Fast_intCompLowerCase+0x0200, /* Page 0x02 */ - Fast_intCompLowerCase+0x0300, /* Page 0x03 */ - Fast_intCompLowerCase+0x0400, /* Page 0x04 */ - Fast_intCompLowerCase+0x0500, /* Page 0x05 */ - Fast_intCompLowerCase+0x0600, /* Page 0x06 */ - Fast_intCompLowerCase+0x0600, /* Page 0x07 */ - Fast_intCompLowerCase+0x0600, /* Page 0x08 */ - Fast_intCompLowerCase+0x0600, /* Page 0x09 */ - Fast_intCompLowerCase+0x0600, /* Page 0x0A */ - Fast_intCompLowerCase+0x0600, /* Page 0x0B */ - Fast_intCompLowerCase+0x0600, /* Page 0x0C */ - Fast_intCompLowerCase+0x0600, /* Page 0x0D */ - Fast_intCompLowerCase+0x0600, /* Page 0x0E */ - Fast_intCompLowerCase+0x0600, /* Page 0x0F */ - Fast_intCompLowerCase+0x0600, /* Page 0x10 */ - Fast_intCompLowerCase+0x0600, /* Page 0x11 */ - Fast_intCompLowerCase+0x0600, /* Page 0x12 */ - Fast_intCompLowerCase+0x0600, /* Page 0x13 */ - Fast_intCompLowerCase+0x0600, /* Page 0x14 */ - Fast_intCompLowerCase+0x0600, /* Page 0x15 */ - Fast_intCompLowerCase+0x0600, /* Page 0x16 */ - Fast_intCompLowerCase+0x0600, /* Page 0x17 */ - Fast_intCompLowerCase+0x0600, /* Page 0x18 */ - Fast_intCompLowerCase+0x0600, /* Page 0x19 */ - Fast_intCompLowerCase+0x0600, /* Page 0x1A */ - Fast_intCompLowerCase+0x0600, /* Page 0x1B */ - Fast_intCompLowerCase+0x0600, /* Page 0x1C */ - Fast_intCompLowerCase+0x0600, /* Page 0x1D */ - Fast_intCompLowerCase+0x0700, /* Page 0x1E */ - Fast_intCompLowerCase+0x0800, /* Page 0x1F */ - Fast_intCompLowerCase+0x0600, /* Page 0x20 */ - Fast_intCompLowerCase+0x0900, /* Page 0x21 */ - Fast_intCompLowerCase+0x0600, /* Page 0x22 */ - Fast_intCompLowerCase+0x0600, /* Page 0x23 */ - Fast_intCompLowerCase+0x0A00, /* Page 0x24 */ - Fast_intCompLowerCase+0x0600, /* Page 0x25 */ - Fast_intCompLowerCase+0x0600, /* Page 0x26 */ - Fast_intCompLowerCase+0x0600, /* Page 0x27 */ - Fast_intCompLowerCase+0x0600, /* Page 0x28 */ - Fast_intCompLowerCase+0x0600, /* Page 0x29 */ - Fast_intCompLowerCase+0x0600, /* Page 0x2A */ - Fast_intCompLowerCase+0x0600, /* Page 0x2B */ - Fast_intCompLowerCase+0x0600, /* Page 0x2C */ - Fast_intCompLowerCase+0x0600, /* Page 0x2D */ - Fast_intCompLowerCase+0x0600, /* Page 0x2E */ - Fast_intCompLowerCase+0x0600, /* Page 0x2F */ - Fast_intCompLowerCase+0x0600, /* Page 0x30 */ - Fast_intCompLowerCase+0x0600, /* Page 0x31 */ - Fast_intCompLowerCase+0x0600, /* Page 0x32 */ - Fast_intCompLowerCase+0x0600, /* Page 0x33 */ - Fast_intCompLowerCase+0x0600, /* Page 0x34 */ - Fast_intCompLowerCase+0x0600, /* Page 0x35 */ - Fast_intCompLowerCase+0x0600, /* Page 0x36 */ - Fast_intCompLowerCase+0x0600, /* Page 0x37 */ - Fast_intCompLowerCase+0x0600, /* Page 0x38 */ - Fast_intCompLowerCase+0x0600, /* Page 0x39 */ - Fast_intCompLowerCase+0x0600, /* Page 0x3A */ - Fast_intCompLowerCase+0x0600, /* Page 0x3B */ - Fast_intCompLowerCase+0x0600, /* Page 0x3C */ - Fast_intCompLowerCase+0x0600, /* Page 0x3D */ - Fast_intCompLowerCase+0x0600, /* Page 0x3E */ - Fast_intCompLowerCase+0x0600, /* Page 0x3F */ - Fast_intCompLowerCase+0x0600, /* Page 0x40 */ - Fast_intCompLowerCase+0x0600, /* Page 0x41 */ - Fast_intCompLowerCase+0x0600, /* Page 0x42 */ - Fast_intCompLowerCase+0x0600, /* Page 0x43 */ - Fast_intCompLowerCase+0x0600, /* Page 0x44 */ - Fast_intCompLowerCase+0x0600, /* Page 0x45 */ - Fast_intCompLowerCase+0x0600, /* Page 0x46 */ - Fast_intCompLowerCase+0x0600, /* Page 0x47 */ - Fast_intCompLowerCase+0x0600, /* Page 0x48 */ - Fast_intCompLowerCase+0x0600, /* Page 0x49 */ - Fast_intCompLowerCase+0x0600, /* Page 0x4A */ - Fast_intCompLowerCase+0x0600, /* Page 0x4B */ - Fast_intCompLowerCase+0x0600, /* Page 0x4C */ - Fast_intCompLowerCase+0x0600, /* Page 0x4D */ - Fast_intCompLowerCase+0x0600, /* Page 0x4E */ - Fast_intCompLowerCase+0x0600, /* Page 0x4F */ - Fast_intCompLowerCase+0x0600, /* Page 0x50 */ - Fast_intCompLowerCase+0x0600, /* Page 0x51 */ - Fast_intCompLowerCase+0x0600, /* Page 0x52 */ - Fast_intCompLowerCase+0x0600, /* Page 0x53 */ - Fast_intCompLowerCase+0x0600, /* Page 0x54 */ - Fast_intCompLowerCase+0x0600, /* Page 0x55 */ - Fast_intCompLowerCase+0x0600, /* Page 0x56 */ - Fast_intCompLowerCase+0x0600, /* Page 0x57 */ - Fast_intCompLowerCase+0x0600, /* Page 0x58 */ - Fast_intCompLowerCase+0x0600, /* Page 0x59 */ - Fast_intCompLowerCase+0x0600, /* Page 0x5A */ - Fast_intCompLowerCase+0x0600, /* Page 0x5B */ - Fast_intCompLowerCase+0x0600, /* Page 0x5C */ - Fast_intCompLowerCase+0x0600, /* Page 0x5D */ - Fast_intCompLowerCase+0x0600, /* Page 0x5E */ - Fast_intCompLowerCase+0x0600, /* Page 0x5F */ - Fast_intCompLowerCase+0x0600, /* Page 0x60 */ - Fast_intCompLowerCase+0x0600, /* Page 0x61 */ - Fast_intCompLowerCase+0x0600, /* Page 0x62 */ - Fast_intCompLowerCase+0x0600, /* Page 0x63 */ - Fast_intCompLowerCase+0x0600, /* Page 0x64 */ - Fast_intCompLowerCase+0x0600, /* Page 0x65 */ - Fast_intCompLowerCase+0x0600, /* Page 0x66 */ - Fast_intCompLowerCase+0x0600, /* Page 0x67 */ - Fast_intCompLowerCase+0x0600, /* Page 0x68 */ - Fast_intCompLowerCase+0x0600, /* Page 0x69 */ - Fast_intCompLowerCase+0x0600, /* Page 0x6A */ - Fast_intCompLowerCase+0x0600, /* Page 0x6B */ - Fast_intCompLowerCase+0x0600, /* Page 0x6C */ - Fast_intCompLowerCase+0x0600, /* Page 0x6D */ - Fast_intCompLowerCase+0x0600, /* Page 0x6E */ - Fast_intCompLowerCase+0x0600, /* Page 0x6F */ - Fast_intCompLowerCase+0x0600, /* Page 0x70 */ - Fast_intCompLowerCase+0x0600, /* Page 0x71 */ - Fast_intCompLowerCase+0x0600, /* Page 0x72 */ - Fast_intCompLowerCase+0x0600, /* Page 0x73 */ - Fast_intCompLowerCase+0x0600, /* Page 0x74 */ - Fast_intCompLowerCase+0x0600, /* Page 0x75 */ - Fast_intCompLowerCase+0x0600, /* Page 0x76 */ - Fast_intCompLowerCase+0x0600, /* Page 0x77 */ - Fast_intCompLowerCase+0x0600, /* Page 0x78 */ - Fast_intCompLowerCase+0x0600, /* Page 0x79 */ - Fast_intCompLowerCase+0x0600, /* Page 0x7A */ - Fast_intCompLowerCase+0x0600, /* Page 0x7B */ - Fast_intCompLowerCase+0x0600, /* Page 0x7C */ - Fast_intCompLowerCase+0x0600, /* Page 0x7D */ - Fast_intCompLowerCase+0x0600, /* Page 0x7E */ - Fast_intCompLowerCase+0x0600, /* Page 0x7F */ - Fast_intCompLowerCase+0x0600, /* Page 0x80 */ - Fast_intCompLowerCase+0x0600, /* Page 0x81 */ - Fast_intCompLowerCase+0x0600, /* Page 0x82 */ - Fast_intCompLowerCase+0x0600, /* Page 0x83 */ - Fast_intCompLowerCase+0x0600, /* Page 0x84 */ - Fast_intCompLowerCase+0x0600, /* Page 0x85 */ - Fast_intCompLowerCase+0x0600, /* Page 0x86 */ - Fast_intCompLowerCase+0x0600, /* Page 0x87 */ - Fast_intCompLowerCase+0x0600, /* Page 0x88 */ - Fast_intCompLowerCase+0x0600, /* Page 0x89 */ - Fast_intCompLowerCase+0x0600, /* Page 0x8A */ - Fast_intCompLowerCase+0x0600, /* Page 0x8B */ - Fast_intCompLowerCase+0x0600, /* Page 0x8C */ - Fast_intCompLowerCase+0x0600, /* Page 0x8D */ - Fast_intCompLowerCase+0x0600, /* Page 0x8E */ - Fast_intCompLowerCase+0x0600, /* Page 0x8F */ - Fast_intCompLowerCase+0x0600, /* Page 0x90 */ - Fast_intCompLowerCase+0x0600, /* Page 0x91 */ - Fast_intCompLowerCase+0x0600, /* Page 0x92 */ - Fast_intCompLowerCase+0x0600, /* Page 0x93 */ - Fast_intCompLowerCase+0x0600, /* Page 0x94 */ - Fast_intCompLowerCase+0x0600, /* Page 0x95 */ - Fast_intCompLowerCase+0x0600, /* Page 0x96 */ - Fast_intCompLowerCase+0x0600, /* Page 0x97 */ - Fast_intCompLowerCase+0x0600, /* Page 0x98 */ - Fast_intCompLowerCase+0x0600, /* Page 0x99 */ - Fast_intCompLowerCase+0x0600, /* Page 0x9A */ - Fast_intCompLowerCase+0x0600, /* Page 0x9B */ - Fast_intCompLowerCase+0x0600, /* Page 0x9C */ - Fast_intCompLowerCase+0x0600, /* Page 0x9D */ - Fast_intCompLowerCase+0x0600, /* Page 0x9E */ - Fast_intCompLowerCase+0x0600, /* Page 0x9F */ - Fast_intCompLowerCase+0x0600, /* Page 0xA0 */ - Fast_intCompLowerCase+0x0600, /* Page 0xA1 */ - Fast_intCompLowerCase+0x0600, /* Page 0xA2 */ - Fast_intCompLowerCase+0x0600, /* Page 0xA3 */ - Fast_intCompLowerCase+0x0600, /* Page 0xA4 */ - Fast_intCompLowerCase+0x0600, /* Page 0xA5 */ - Fast_intCompLowerCase+0x0600, /* Page 0xA6 */ - Fast_intCompLowerCase+0x0600, /* Page 0xA7 */ - Fast_intCompLowerCase+0x0600, /* Page 0xA8 */ - Fast_intCompLowerCase+0x0600, /* Page 0xA9 */ - Fast_intCompLowerCase+0x0600, /* Page 0xAA */ - Fast_intCompLowerCase+0x0600, /* Page 0xAB */ - Fast_intCompLowerCase+0x0600, /* Page 0xAC */ - Fast_intCompLowerCase+0x0600, /* Page 0xAD */ - Fast_intCompLowerCase+0x0600, /* Page 0xAE */ - Fast_intCompLowerCase+0x0600, /* Page 0xAF */ - Fast_intCompLowerCase+0x0600, /* Page 0xB0 */ - Fast_intCompLowerCase+0x0600, /* Page 0xB1 */ - Fast_intCompLowerCase+0x0600, /* Page 0xB2 */ - Fast_intCompLowerCase+0x0600, /* Page 0xB3 */ - Fast_intCompLowerCase+0x0600, /* Page 0xB4 */ - Fast_intCompLowerCase+0x0600, /* Page 0xB5 */ - Fast_intCompLowerCase+0x0600, /* Page 0xB6 */ - Fast_intCompLowerCase+0x0600, /* Page 0xB7 */ - Fast_intCompLowerCase+0x0600, /* Page 0xB8 */ - Fast_intCompLowerCase+0x0600, /* Page 0xB9 */ - Fast_intCompLowerCase+0x0600, /* Page 0xBA */ - Fast_intCompLowerCase+0x0600, /* Page 0xBB */ - Fast_intCompLowerCase+0x0600, /* Page 0xBC */ - Fast_intCompLowerCase+0x0600, /* Page 0xBD */ - Fast_intCompLowerCase+0x0600, /* Page 0xBE */ - Fast_intCompLowerCase+0x0600, /* Page 0xBF */ - Fast_intCompLowerCase+0x0600, /* Page 0xC0 */ - Fast_intCompLowerCase+0x0600, /* Page 0xC1 */ - Fast_intCompLowerCase+0x0600, /* Page 0xC2 */ - Fast_intCompLowerCase+0x0600, /* Page 0xC3 */ - Fast_intCompLowerCase+0x0600, /* Page 0xC4 */ - Fast_intCompLowerCase+0x0600, /* Page 0xC5 */ - Fast_intCompLowerCase+0x0600, /* Page 0xC6 */ - Fast_intCompLowerCase+0x0600, /* Page 0xC7 */ - Fast_intCompLowerCase+0x0600, /* Page 0xC8 */ - Fast_intCompLowerCase+0x0600, /* Page 0xC9 */ - Fast_intCompLowerCase+0x0600, /* Page 0xCA */ - Fast_intCompLowerCase+0x0600, /* Page 0xCB */ - Fast_intCompLowerCase+0x0600, /* Page 0xCC */ - Fast_intCompLowerCase+0x0600, /* Page 0xCD */ - Fast_intCompLowerCase+0x0600, /* Page 0xCE */ - Fast_intCompLowerCase+0x0600, /* Page 0xCF */ - Fast_intCompLowerCase+0x0600, /* Page 0xD0 */ - Fast_intCompLowerCase+0x0600, /* Page 0xD1 */ - Fast_intCompLowerCase+0x0600, /* Page 0xD2 */ - Fast_intCompLowerCase+0x0600, /* Page 0xD3 */ - Fast_intCompLowerCase+0x0600, /* Page 0xD4 */ - Fast_intCompLowerCase+0x0600, /* Page 0xD5 */ - Fast_intCompLowerCase+0x0600, /* Page 0xD6 */ - Fast_intCompLowerCase+0x0600, /* Page 0xD7 */ - Fast_intCompLowerCase+0x0600, /* Page 0xD8 */ - Fast_intCompLowerCase+0x0600, /* Page 0xD9 */ - Fast_intCompLowerCase+0x0600, /* Page 0xDA */ - Fast_intCompLowerCase+0x0600, /* Page 0xDB */ - Fast_intCompLowerCase+0x0600, /* Page 0xDC */ - Fast_intCompLowerCase+0x0600, /* Page 0xDD */ - Fast_intCompLowerCase+0x0600, /* Page 0xDE */ - Fast_intCompLowerCase+0x0600, /* Page 0xDF */ - Fast_intCompLowerCase+0x0600, /* Page 0xE0 */ - Fast_intCompLowerCase+0x0600, /* Page 0xE1 */ - Fast_intCompLowerCase+0x0600, /* Page 0xE2 */ - Fast_intCompLowerCase+0x0600, /* Page 0xE3 */ - Fast_intCompLowerCase+0x0600, /* Page 0xE4 */ - Fast_intCompLowerCase+0x0600, /* Page 0xE5 */ - Fast_intCompLowerCase+0x0600, /* Page 0xE6 */ - Fast_intCompLowerCase+0x0600, /* Page 0xE7 */ - Fast_intCompLowerCase+0x0600, /* Page 0xE8 */ - Fast_intCompLowerCase+0x0600, /* Page 0xE9 */ - Fast_intCompLowerCase+0x0600, /* Page 0xEA */ - Fast_intCompLowerCase+0x0600, /* Page 0xEB */ - Fast_intCompLowerCase+0x0600, /* Page 0xEC */ - Fast_intCompLowerCase+0x0600, /* Page 0xED */ - Fast_intCompLowerCase+0x0600, /* Page 0xEE */ - Fast_intCompLowerCase+0x0600, /* Page 0xEF */ - Fast_intCompLowerCase+0x0600, /* Page 0xF0 */ - Fast_intCompLowerCase+0x0600, /* Page 0xF1 */ - Fast_intCompLowerCase+0x0600, /* Page 0xF2 */ - Fast_intCompLowerCase+0x0600, /* Page 0xF3 */ - Fast_intCompLowerCase+0x0600, /* Page 0xF4 */ - Fast_intCompLowerCase+0x0600, /* Page 0xF5 */ - Fast_intCompLowerCase+0x0600, /* Page 0xF6 */ - Fast_intCompLowerCase+0x0600, /* Page 0xF7 */ - Fast_intCompLowerCase+0x0600, /* Page 0xF8 */ - Fast_intCompLowerCase+0x0600, /* Page 0xF9 */ - Fast_intCompLowerCase+0x0600, /* Page 0xFA */ - Fast_intCompLowerCase+0x0600, /* Page 0xFB */ - Fast_intCompLowerCase+0x0600, /* Page 0xFC */ - Fast_intCompLowerCase+0x0600, /* Page 0xFD */ - Fast_intCompLowerCase+0x0600, /* Page 0xFE */ - Fast_intCompLowerCase+0x0B00 /* Page 0xFF */ + Fast_intCompLowerCase+0x0000, /* Page 0x00 */ + Fast_intCompLowerCase+0x0100, /* Page 0x01 */ + Fast_intCompLowerCase+0x0200, /* Page 0x02 */ + Fast_intCompLowerCase+0x0300, /* Page 0x03 */ + Fast_intCompLowerCase+0x0400, /* Page 0x04 */ + Fast_intCompLowerCase+0x0500, /* Page 0x05 */ + Fast_intCompLowerCase+0x0600, /* Page 0x06 */ + Fast_intCompLowerCase+0x0600, /* Page 0x07 */ + Fast_intCompLowerCase+0x0600, /* Page 0x08 */ + Fast_intCompLowerCase+0x0600, /* Page 0x09 */ + Fast_intCompLowerCase+0x0600, /* Page 0x0A */ + Fast_intCompLowerCase+0x0600, /* Page 0x0B */ + Fast_intCompLowerCase+0x0600, /* Page 0x0C */ + Fast_intCompLowerCase+0x0600, /* Page 0x0D */ + Fast_intCompLowerCase+0x0600, /* Page 0x0E */ + Fast_intCompLowerCase+0x0600, /* Page 0x0F */ + Fast_intCompLowerCase+0x0600, /* Page 0x10 */ + Fast_intCompLowerCase+0x0600, /* Page 0x11 */ + Fast_intCompLowerCase+0x0600, /* Page 0x12 */ + Fast_intCompLowerCase+0x0600, /* Page 0x13 */ + Fast_intCompLowerCase+0x0600, /* Page 0x14 */ + Fast_intCompLowerCase+0x0600, /* Page 0x15 */ + Fast_intCompLowerCase+0x0600, /* Page 0x16 */ + Fast_intCompLowerCase+0x0600, /* Page 0x17 */ + Fast_intCompLowerCase+0x0600, /* Page 0x18 */ + Fast_intCompLowerCase+0x0600, /* Page 0x19 */ + Fast_intCompLowerCase+0x0600, /* Page 0x1A */ + Fast_intCompLowerCase+0x0600, /* Page 0x1B */ + Fast_intCompLowerCase+0x0600, /* Page 0x1C */ + Fast_intCompLowerCase+0x0600, /* Page 0x1D */ + Fast_intCompLowerCase+0x0700, /* Page 0x1E */ + Fast_intCompLowerCase+0x0800, /* Page 0x1F */ + Fast_intCompLowerCase+0x0600, /* Page 0x20 */ + Fast_intCompLowerCase+0x0900, /* Page 0x21 */ + Fast_intCompLowerCase+0x0600, /* Page 0x22 */ + Fast_intCompLowerCase+0x0600, /* Page 0x23 */ + Fast_intCompLowerCase+0x0A00, /* Page 0x24 */ + Fast_intCompLowerCase+0x0600, /* Page 0x25 */ + Fast_intCompLowerCase+0x0600, /* Page 0x26 */ + Fast_intCompLowerCase+0x0600, /* Page 0x27 */ + Fast_intCompLowerCase+0x0600, /* Page 0x28 */ + Fast_intCompLowerCase+0x0600, /* Page 0x29 */ + Fast_intCompLowerCase+0x0600, /* Page 0x2A */ + Fast_intCompLowerCase+0x0600, /* Page 0x2B */ + Fast_intCompLowerCase+0x0600, /* Page 0x2C */ + Fast_intCompLowerCase+0x0600, /* Page 0x2D */ + Fast_intCompLowerCase+0x0600, /* Page 0x2E */ + Fast_intCompLowerCase+0x0600, /* Page 0x2F */ + Fast_intCompLowerCase+0x0600, /* Page 0x30 */ + Fast_intCompLowerCase+0x0600, /* Page 0x31 */ + Fast_intCompLowerCase+0x0600, /* Page 0x32 */ + Fast_intCompLowerCase+0x0600, /* Page 0x33 */ + Fast_intCompLowerCase+0x0600, /* Page 0x34 */ + Fast_intCompLowerCase+0x0600, /* Page 0x35 */ + Fast_intCompLowerCase+0x0600, /* Page 0x36 */ + Fast_intCompLowerCase+0x0600, /* Page 0x37 */ + Fast_intCompLowerCase+0x0600, /* Page 0x38 */ + Fast_intCompLowerCase+0x0600, /* Page 0x39 */ + Fast_intCompLowerCase+0x0600, /* Page 0x3A */ + Fast_intCompLowerCase+0x0600, /* Page 0x3B */ + Fast_intCompLowerCase+0x0600, /* Page 0x3C */ + Fast_intCompLowerCase+0x0600, /* Page 0x3D */ + Fast_intCompLowerCase+0x0600, /* Page 0x3E */ + Fast_intCompLowerCase+0x0600, /* Page 0x3F */ + Fast_intCompLowerCase+0x0600, /* Page 0x40 */ + Fast_intCompLowerCase+0x0600, /* Page 0x41 */ + Fast_intCompLowerCase+0x0600, /* Page 0x42 */ + Fast_intCompLowerCase+0x0600, /* Page 0x43 */ + Fast_intCompLowerCase+0x0600, /* Page 0x44 */ + Fast_intCompLowerCase+0x0600, /* Page 0x45 */ + Fast_intCompLowerCase+0x0600, /* Page 0x46 */ + Fast_intCompLowerCase+0x0600, /* Page 0x47 */ + Fast_intCompLowerCase+0x0600, /* Page 0x48 */ + Fast_intCompLowerCase+0x0600, /* Page 0x49 */ + Fast_intCompLowerCase+0x0600, /* Page 0x4A */ + Fast_intCompLowerCase+0x0600, /* Page 0x4B */ + Fast_intCompLowerCase+0x0600, /* Page 0x4C */ + Fast_intCompLowerCase+0x0600, /* Page 0x4D */ + Fast_intCompLowerCase+0x0600, /* Page 0x4E */ + Fast_intCompLowerCase+0x0600, /* Page 0x4F */ + Fast_intCompLowerCase+0x0600, /* Page 0x50 */ + Fast_intCompLowerCase+0x0600, /* Page 0x51 */ + Fast_intCompLowerCase+0x0600, /* Page 0x52 */ + Fast_intCompLowerCase+0x0600, /* Page 0x53 */ + Fast_intCompLowerCase+0x0600, /* Page 0x54 */ + Fast_intCompLowerCase+0x0600, /* Page 0x55 */ + Fast_intCompLowerCase+0x0600, /* Page 0x56 */ + Fast_intCompLowerCase+0x0600, /* Page 0x57 */ + Fast_intCompLowerCase+0x0600, /* Page 0x58 */ + Fast_intCompLowerCase+0x0600, /* Page 0x59 */ + Fast_intCompLowerCase+0x0600, /* Page 0x5A */ + Fast_intCompLowerCase+0x0600, /* Page 0x5B */ + Fast_intCompLowerCase+0x0600, /* Page 0x5C */ + Fast_intCompLowerCase+0x0600, /* Page 0x5D */ + Fast_intCompLowerCase+0x0600, /* Page 0x5E */ + Fast_intCompLowerCase+0x0600, /* Page 0x5F */ + Fast_intCompLowerCase+0x0600, /* Page 0x60 */ + Fast_intCompLowerCase+0x0600, /* Page 0x61 */ + Fast_intCompLowerCase+0x0600, /* Page 0x62 */ + Fast_intCompLowerCase+0x0600, /* Page 0x63 */ + Fast_intCompLowerCase+0x0600, /* Page 0x64 */ + Fast_intCompLowerCase+0x0600, /* Page 0x65 */ + Fast_intCompLowerCase+0x0600, /* Page 0x66 */ + Fast_intCompLowerCase+0x0600, /* Page 0x67 */ + Fast_intCompLowerCase+0x0600, /* Page 0x68 */ + Fast_intCompLowerCase+0x0600, /* Page 0x69 */ + Fast_intCompLowerCase+0x0600, /* Page 0x6A */ + Fast_intCompLowerCase+0x0600, /* Page 0x6B */ + Fast_intCompLowerCase+0x0600, /* Page 0x6C */ + Fast_intCompLowerCase+0x0600, /* Page 0x6D */ + Fast_intCompLowerCase+0x0600, /* Page 0x6E */ + Fast_intCompLowerCase+0x0600, /* Page 0x6F */ + Fast_intCompLowerCase+0x0600, /* Page 0x70 */ + Fast_intCompLowerCase+0x0600, /* Page 0x71 */ + Fast_intCompLowerCase+0x0600, /* Page 0x72 */ + Fast_intCompLowerCase+0x0600, /* Page 0x73 */ + Fast_intCompLowerCase+0x0600, /* Page 0x74 */ + Fast_intCompLowerCase+0x0600, /* Page 0x75 */ + Fast_intCompLowerCase+0x0600, /* Page 0x76 */ + Fast_intCompLowerCase+0x0600, /* Page 0x77 */ + Fast_intCompLowerCase+0x0600, /* Page 0x78 */ + Fast_intCompLowerCase+0x0600, /* Page 0x79 */ + Fast_intCompLowerCase+0x0600, /* Page 0x7A */ + Fast_intCompLowerCase+0x0600, /* Page 0x7B */ + Fast_intCompLowerCase+0x0600, /* Page 0x7C */ + Fast_intCompLowerCase+0x0600, /* Page 0x7D */ + Fast_intCompLowerCase+0x0600, /* Page 0x7E */ + Fast_intCompLowerCase+0x0600, /* Page 0x7F */ + Fast_intCompLowerCase+0x0600, /* Page 0x80 */ + Fast_intCompLowerCase+0x0600, /* Page 0x81 */ + Fast_intCompLowerCase+0x0600, /* Page 0x82 */ + Fast_intCompLowerCase+0x0600, /* Page 0x83 */ + Fast_intCompLowerCase+0x0600, /* Page 0x84 */ + Fast_intCompLowerCase+0x0600, /* Page 0x85 */ + Fast_intCompLowerCase+0x0600, /* Page 0x86 */ + Fast_intCompLowerCase+0x0600, /* Page 0x87 */ + Fast_intCompLowerCase+0x0600, /* Page 0x88 */ + Fast_intCompLowerCase+0x0600, /* Page 0x89 */ + Fast_intCompLowerCase+0x0600, /* Page 0x8A */ + Fast_intCompLowerCase+0x0600, /* Page 0x8B */ + Fast_intCompLowerCase+0x0600, /* Page 0x8C */ + Fast_intCompLowerCase+0x0600, /* Page 0x8D */ + Fast_intCompLowerCase+0x0600, /* Page 0x8E */ + Fast_intCompLowerCase+0x0600, /* Page 0x8F */ + Fast_intCompLowerCase+0x0600, /* Page 0x90 */ + Fast_intCompLowerCase+0x0600, /* Page 0x91 */ + Fast_intCompLowerCase+0x0600, /* Page 0x92 */ + Fast_intCompLowerCase+0x0600, /* Page 0x93 */ + Fast_intCompLowerCase+0x0600, /* Page 0x94 */ + Fast_intCompLowerCase+0x0600, /* Page 0x95 */ + Fast_intCompLowerCase+0x0600, /* Page 0x96 */ + Fast_intCompLowerCase+0x0600, /* Page 0x97 */ + Fast_intCompLowerCase+0x0600, /* Page 0x98 */ + Fast_intCompLowerCase+0x0600, /* Page 0x99 */ + Fast_intCompLowerCase+0x0600, /* Page 0x9A */ + Fast_intCompLowerCase+0x0600, /* Page 0x9B */ + Fast_intCompLowerCase+0x0600, /* Page 0x9C */ + Fast_intCompLowerCase+0x0600, /* Page 0x9D */ + Fast_intCompLowerCase+0x0600, /* Page 0x9E */ + Fast_intCompLowerCase+0x0600, /* Page 0x9F */ + Fast_intCompLowerCase+0x0600, /* Page 0xA0 */ + Fast_intCompLowerCase+0x0600, /* Page 0xA1 */ + Fast_intCompLowerCase+0x0600, /* Page 0xA2 */ + Fast_intCompLowerCase+0x0600, /* Page 0xA3 */ + Fast_intCompLowerCase+0x0600, /* Page 0xA4 */ + Fast_intCompLowerCase+0x0600, /* Page 0xA5 */ + Fast_intCompLowerCase+0x0600, /* Page 0xA6 */ + Fast_intCompLowerCase+0x0600, /* Page 0xA7 */ + Fast_intCompLowerCase+0x0600, /* Page 0xA8 */ + Fast_intCompLowerCase+0x0600, /* Page 0xA9 */ + Fast_intCompLowerCase+0x0600, /* Page 0xAA */ + Fast_intCompLowerCase+0x0600, /* Page 0xAB */ + Fast_intCompLowerCase+0x0600, /* Page 0xAC */ + Fast_intCompLowerCase+0x0600, /* Page 0xAD */ + Fast_intCompLowerCase+0x0600, /* Page 0xAE */ + Fast_intCompLowerCase+0x0600, /* Page 0xAF */ + Fast_intCompLowerCase+0x0600, /* Page 0xB0 */ + Fast_intCompLowerCase+0x0600, /* Page 0xB1 */ + Fast_intCompLowerCase+0x0600, /* Page 0xB2 */ + Fast_intCompLowerCase+0x0600, /* Page 0xB3 */ + Fast_intCompLowerCase+0x0600, /* Page 0xB4 */ + Fast_intCompLowerCase+0x0600, /* Page 0xB5 */ + Fast_intCompLowerCase+0x0600, /* Page 0xB6 */ + Fast_intCompLowerCase+0x0600, /* Page 0xB7 */ + Fast_intCompLowerCase+0x0600, /* Page 0xB8 */ + Fast_intCompLowerCase+0x0600, /* Page 0xB9 */ + Fast_intCompLowerCase+0x0600, /* Page 0xBA */ + Fast_intCompLowerCase+0x0600, /* Page 0xBB */ + Fast_intCompLowerCase+0x0600, /* Page 0xBC */ + Fast_intCompLowerCase+0x0600, /* Page 0xBD */ + Fast_intCompLowerCase+0x0600, /* Page 0xBE */ + Fast_intCompLowerCase+0x0600, /* Page 0xBF */ + Fast_intCompLowerCase+0x0600, /* Page 0xC0 */ + Fast_intCompLowerCase+0x0600, /* Page 0xC1 */ + Fast_intCompLowerCase+0x0600, /* Page 0xC2 */ + Fast_intCompLowerCase+0x0600, /* Page 0xC3 */ + Fast_intCompLowerCase+0x0600, /* Page 0xC4 */ + Fast_intCompLowerCase+0x0600, /* Page 0xC5 */ + Fast_intCompLowerCase+0x0600, /* Page 0xC6 */ + Fast_intCompLowerCase+0x0600, /* Page 0xC7 */ + Fast_intCompLowerCase+0x0600, /* Page 0xC8 */ + Fast_intCompLowerCase+0x0600, /* Page 0xC9 */ + Fast_intCompLowerCase+0x0600, /* Page 0xCA */ + Fast_intCompLowerCase+0x0600, /* Page 0xCB */ + Fast_intCompLowerCase+0x0600, /* Page 0xCC */ + Fast_intCompLowerCase+0x0600, /* Page 0xCD */ + Fast_intCompLowerCase+0x0600, /* Page 0xCE */ + Fast_intCompLowerCase+0x0600, /* Page 0xCF */ + Fast_intCompLowerCase+0x0600, /* Page 0xD0 */ + Fast_intCompLowerCase+0x0600, /* Page 0xD1 */ + Fast_intCompLowerCase+0x0600, /* Page 0xD2 */ + Fast_intCompLowerCase+0x0600, /* Page 0xD3 */ + Fast_intCompLowerCase+0x0600, /* Page 0xD4 */ + Fast_intCompLowerCase+0x0600, /* Page 0xD5 */ + Fast_intCompLowerCase+0x0600, /* Page 0xD6 */ + Fast_intCompLowerCase+0x0600, /* Page 0xD7 */ + Fast_intCompLowerCase+0x0600, /* Page 0xD8 */ + Fast_intCompLowerCase+0x0600, /* Page 0xD9 */ + Fast_intCompLowerCase+0x0600, /* Page 0xDA */ + Fast_intCompLowerCase+0x0600, /* Page 0xDB */ + Fast_intCompLowerCase+0x0600, /* Page 0xDC */ + Fast_intCompLowerCase+0x0600, /* Page 0xDD */ + Fast_intCompLowerCase+0x0600, /* Page 0xDE */ + Fast_intCompLowerCase+0x0600, /* Page 0xDF */ + Fast_intCompLowerCase+0x0600, /* Page 0xE0 */ + Fast_intCompLowerCase+0x0600, /* Page 0xE1 */ + Fast_intCompLowerCase+0x0600, /* Page 0xE2 */ + Fast_intCompLowerCase+0x0600, /* Page 0xE3 */ + Fast_intCompLowerCase+0x0600, /* Page 0xE4 */ + Fast_intCompLowerCase+0x0600, /* Page 0xE5 */ + Fast_intCompLowerCase+0x0600, /* Page 0xE6 */ + Fast_intCompLowerCase+0x0600, /* Page 0xE7 */ + Fast_intCompLowerCase+0x0600, /* Page 0xE8 */ + Fast_intCompLowerCase+0x0600, /* Page 0xE9 */ + Fast_intCompLowerCase+0x0600, /* Page 0xEA */ + Fast_intCompLowerCase+0x0600, /* Page 0xEB */ + Fast_intCompLowerCase+0x0600, /* Page 0xEC */ + Fast_intCompLowerCase+0x0600, /* Page 0xED */ + Fast_intCompLowerCase+0x0600, /* Page 0xEE */ + Fast_intCompLowerCase+0x0600, /* Page 0xEF */ + Fast_intCompLowerCase+0x0600, /* Page 0xF0 */ + Fast_intCompLowerCase+0x0600, /* Page 0xF1 */ + Fast_intCompLowerCase+0x0600, /* Page 0xF2 */ + Fast_intCompLowerCase+0x0600, /* Page 0xF3 */ + Fast_intCompLowerCase+0x0600, /* Page 0xF4 */ + Fast_intCompLowerCase+0x0600, /* Page 0xF5 */ + Fast_intCompLowerCase+0x0600, /* Page 0xF6 */ + Fast_intCompLowerCase+0x0600, /* Page 0xF7 */ + Fast_intCompLowerCase+0x0600, /* Page 0xF8 */ + Fast_intCompLowerCase+0x0600, /* Page 0xF9 */ + Fast_intCompLowerCase+0x0600, /* Page 0xFA */ + Fast_intCompLowerCase+0x0600, /* Page 0xFB */ + Fast_intCompLowerCase+0x0600, /* Page 0xFC */ + Fast_intCompLowerCase+0x0600, /* Page 0xFD */ + Fast_intCompLowerCase+0x0600, /* Page 0xFE */ + Fast_intCompLowerCase+0x0B00 /* Page 0xFF */ }; /* End of auto-generated file */ diff --git a/fastlib/src/vespa/fastlib/text/unicodeutil.cpp b/fastlib/src/vespa/fastlib/text/unicodeutil.cpp index 0dca87a5701..822f8044ded 100644 --- a/fastlib/src/vespa/fastlib/text/unicodeutil.cpp +++ b/fastlib/src/vespa/fastlib/text/unicodeutil.cpp @@ -24,144 +24,144 @@ Initialize _G_Initializer; void Fast_UnicodeUtil::InitTables(void) { - /** - * Hack for Katakana accent marks (torgeir) - */ - _compCharProps[(0xFF9E >> 8)][(0xFF9E & 255)] |= 32; - _compCharProps[(0xFF9F >> 8)][(0xFF9F & 255)] |= 32; - - for (uint32_t i = 0; i < 256; i++) { _utf8header[i] = 0; } - - // Initialize _utf8header array - for (uint32_t i = 0x00; i <= 0x7F; i++) { _utf8header[i] = 1; } - for (uint32_t i = 0xC0; i <= 0xDF; i++) { _utf8header[i] = 2; } - for (uint32_t i = 0xE0; i <= 0xEF; i++) { _utf8header[i] = 3; } - for (uint32_t i = 0xF0; i <= 0xF7; i++) { _utf8header[i] = 4; } - for (uint32_t i = 0xF8; i <= 0xFB; i++) { _utf8header[i] = 5; } - for (uint32_t i = 0xFC; i <= 0xFD; i++) { _utf8header[i] = 6; } + /** + * Hack for Katakana accent marks (torgeir) + */ + _compCharProps[(0xFF9E >> 8)][(0xFF9E & 255)] |= 32; + _compCharProps[(0xFF9F >> 8)][(0xFF9F & 255)] |= 32; + + for (uint32_t i = 0; i < 256; i++) { _utf8header[i] = 0; } + + // Initialize _utf8header array + for (uint32_t i = 0x00; i <= 0x7F; i++) { _utf8header[i] = 1; } + for (uint32_t i = 0xC0; i <= 0xDF; i++) { _utf8header[i] = 2; } + for (uint32_t i = 0xE0; i <= 0xEF; i++) { _utf8header[i] = 3; } + for (uint32_t i = 0xF0; i <= 0xF7; i++) { _utf8header[i] = 4; } + for (uint32_t i = 0xF8; i <= 0xFB; i++) { _utf8header[i] = 5; } + for (uint32_t i = 0xFC; i <= 0xFD; i++) { _utf8header[i] = 6; } } char * Fast_UnicodeUtil::utf8ncopy(char *dst, const ucs4_t *src, - int maxdst, int maxsrc) + int maxdst, int maxsrc) { - char * p = dst; - char * edst = dst + maxdst; - - for (const ucs4_t *esrc(src + maxsrc); (src < esrc) && (*src != 0) && (p < edst); src++) { - ucs4_t i(*src); - if (i < 128) - *p++ = i; - else if (i < 0x800) { - if (p + 1 >= edst) - break; - *p++ = (i >> 6) | 0xc0; - *p++ = (i & 63) | 0x80; - } else if (i < 0x10000) { - if (p + 2 >= edst) - break; - *p++ = (i >> 12) | 0xe0; - *p++ = ((i >> 6) & 63) | 0x80; - *p++ = (i & 63) | 0x80; - } else if (i < 0x200000) { - if (p + 3 >= edst) - break; - *p++ = (i >> 18) | 0xf0; - *p++ = ((i >> 12) & 63) | 0x80; - *p++ = ((i >> 6) & 63) | 0x80; - *p++ = (i & 63) | 0x80; - } else if (i < 0x4000000) { - if (p + 4 >= edst) - break; - *p++ = (i >> 24) | 0xf8; - *p++ = ((i >> 18) & 63) | 0x80; - *p++ = ((i >> 12) & 63) | 0x80; - *p++ = ((i >> 6) & 63) | 0x80; - *p++ = (i & 63) | 0x80; - } else { - if (p + 5 >= edst) - break; - *p++ = (i >> 30) | 0xfc; - *p++ = ((i >> 24) & 63) | 0x80; - *p++ = ((i >> 18) & 63) | 0x80; - *p++ = ((i >> 12) & 63) | 0x80; - *p++ = ((i >> 6) & 63) | 0x80; - *p++ = (i & 63) | 0x80; + char * p = dst; + char * edst = dst + maxdst; + + for (const ucs4_t *esrc(src + maxsrc); (src < esrc) && (*src != 0) && (p < edst); src++) { + ucs4_t i(*src); + if (i < 128) + *p++ = i; + else if (i < 0x800) { + if (p + 1 >= edst) + break; + *p++ = (i >> 6) | 0xc0; + *p++ = (i & 63) | 0x80; + } else if (i < 0x10000) { + if (p + 2 >= edst) + break; + *p++ = (i >> 12) | 0xe0; + *p++ = ((i >> 6) & 63) | 0x80; + *p++ = (i & 63) | 0x80; + } else if (i < 0x200000) { + if (p + 3 >= edst) + break; + *p++ = (i >> 18) | 0xf0; + *p++ = ((i >> 12) & 63) | 0x80; + *p++ = ((i >> 6) & 63) | 0x80; + *p++ = (i & 63) | 0x80; + } else if (i < 0x4000000) { + if (p + 4 >= edst) + break; + *p++ = (i >> 24) | 0xf8; + *p++ = ((i >> 18) & 63) | 0x80; + *p++ = ((i >> 12) & 63) | 0x80; + *p++ = ((i >> 6) & 63) | 0x80; + *p++ = (i & 63) | 0x80; + } else { + if (p + 5 >= edst) + break; + *p++ = (i >> 30) | 0xfc; + *p++ = ((i >> 24) & 63) | 0x80; + *p++ = ((i >> 18) & 63) | 0x80; + *p++ = ((i >> 12) & 63) | 0x80; + *p++ = ((i >> 6) & 63) | 0x80; + *p++ = (i & 63) | 0x80; + } } - } - if (p < edst) - *p = 0; - return p; + if (p < edst) + *p = 0; + return p; } int Fast_UnicodeUtil::utf8cmp(const char *s1, const ucs4_t *s2) { - ucs4_t i1; - ucs4_t i2; - - const unsigned char *ps1 = reinterpret_cast(s1); - do { - i1 = GetUTF8Char(ps1); - i2 = *s2++; - } while (i1 != 0 && i1 == i2); - if (i1 > i2) - return 1; - if (i1 < i2) - return -1; - return 0; + ucs4_t i1; + ucs4_t i2; + + const unsigned char *ps1 = reinterpret_cast(s1); + do { + i1 = GetUTF8Char(ps1); + i2 = *s2++; + } while (i1 != 0 && i1 == i2); + if (i1 > i2) + return 1; + if (i1 < i2) + return -1; + return 0; } size_t Fast_UnicodeUtil::ucs4strlen(const ucs4_t *str) { - const ucs4_t *p = str; - while (*p++ != 0) { - /* Do nothing */ - } - return p - 1 - str; + const ucs4_t *p = str; + while (*p++ != 0) { + /* Do nothing */ + } + return p - 1 - str; } ucs4_t * Fast_UnicodeUtil::ucs4copy(ucs4_t *dst, const char *src) { - ucs4_t i; - ucs4_t *p; - const unsigned char *psrc = reinterpret_cast(src); - - p = dst; - while ((i = GetUTF8Char(psrc)) != 0) { - if (i != _BadUTF8Char) - *p++ = i; - } - *p = 0; - return p; + ucs4_t i; + ucs4_t *p; + const unsigned char *psrc = reinterpret_cast(src); + + p = dst; + while ((i = GetUTF8Char(psrc)) != 0) { + if (i != _BadUTF8Char) + *p++ = i; + } + *p = 0; + return p; } char * Fast_UnicodeUtil::strdupLAT1(const char *src) { - char *res; - size_t reslen; - ucs4_t i; - const unsigned char *p; - char *q; - - reslen = 0; - p = reinterpret_cast(src); - while ((i = *p++) != 0) { - reslen += utf8clen(i); - } - res = static_cast(malloc(reslen + 1)); - p = reinterpret_cast(src); - q = res; - while ((i = *p++) != 0) { - q = utf8cput(q, i); - } - assert(q == res + reslen); - *q = 0; - return res; + char *res; + size_t reslen; + ucs4_t i; + const unsigned char *p; + char *q; + + reslen = 0; + p = reinterpret_cast(src); + while ((i = *p++) != 0) { + reslen += utf8clen(i); + } + res = static_cast(malloc(reslen + 1)); + p = reinterpret_cast(src); + q = res; + while ((i = *p++) != 0) { + q = utf8cput(q, i); + } + assert(q == res + reslen); + *q = 0; + return res; } ucs4_t @@ -199,11 +199,11 @@ Fast_UnicodeUtil::GetUTF8CharNonAscii(unsigned const char *&src) return _BadUTF8Char; } else { /* 0xfc..0xfd: 6 bytes */ retval = ((src[0] & 1) << 30) | - ((src[1] & 63) << 24) | - ((src[2] & 63) << 18) | - ((src[3] & 63) << 12) | - ((src[4] & 63) << 6) | - (src[5] & 63); + ((src[1] & 63) << 24) | + ((src[2] & 63) << 18) | + ((src[3] & 63) << 12) | + ((src[4] & 63) << 6) | + (src[5] & 63); if (retval < 0x4000000u) { /* 6 bytes: >= 0x4000000 */ retval = _BadUTF8Char; } @@ -212,10 +212,10 @@ Fast_UnicodeUtil::GetUTF8CharNonAscii(unsigned const char *&src) } } else { /* 0xf8..0xfb: 5 bytes */ retval = ((src[0] & 3) << 24) | - ((src[1] & 63) << 18) | - ((src[2] & 63) << 12) | - ((src[3] & 63) << 6) | - (src[4] & 63); + ((src[1] & 63) << 18) | + ((src[2] & 63) << 12) | + ((src[3] & 63) << 6) | + (src[4] & 63); if (retval < 0x200000u) { /* 5 bytes: >= 0x200000 */ retval = _BadUTF8Char; } @@ -224,9 +224,9 @@ Fast_UnicodeUtil::GetUTF8CharNonAscii(unsigned const char *&src) } } else { /* 0xf0..0xf7: 4 bytes */ retval = ((src[0] & 7) << 18) | - ((src[1] & 63) << 12) | - ((src[2] & 63) << 6) | - (src[3] & 63); + ((src[1] & 63) << 12) | + ((src[2] & 63) << 6) | + (src[3] & 63); if (retval < 0x10000) { /* 4 bytes: >= 0x10000 */ retval = _BadUTF8Char; } @@ -235,8 +235,8 @@ Fast_UnicodeUtil::GetUTF8CharNonAscii(unsigned const char *&src) } } else { /* 0xe0..0xef: 3 bytes */ retval = ((src[0] & 15) << 12) | - ((src[1] & 63) << 6) | - (src[2] & 63); + ((src[1] & 63) << 6) | + (src[2] & 63); if (retval < 0x800) { /* 3 bytes: >= 0x800 */ retval = _BadUTF8Char; } @@ -246,7 +246,7 @@ Fast_UnicodeUtil::GetUTF8CharNonAscii(unsigned const char *&src) } else { /* 0xc0..0xdf: 2 bytes */ retval = ((src[0] & 31) << 6) | - (src[1] & 63); + (src[1] & 63); if (retval < 0x80) { /* 2 bytes: >= 0x80 */ retval = _BadUTF8Char; } @@ -263,82 +263,81 @@ ucs4_t Fast_UnicodeUtil::GetUTF8Char(unsigned const char *&src) { return (*src >= 0x80) - ? GetUTF8CharNonAscii(src) - : *src++; + ? GetUTF8CharNonAscii(src) + : *src++; } - /** Move forwards or backwards a number of characters within an UTF8 buffer - * Modify pos to yield new position if possible - * @param start A pointer to the start of the UTF8 buffer - * @param length The length of the UTF8 buffer - * @param pos A pointer to the current position within the UTF8 buffer, - * updated to reflect new position upon return. @param pos will - * point to the start of the offset'th character before or after the character - * currently pointed to. - * @param offset An offset (+/-) in number of UTF8 characters. - * Offset 0 consequently yields a move to the start of the current character. - * @return Number of bytes moved, or -1 if out of range. - * If -1 is returned, pos is unchanged. - */ +/** Move forwards or backwards a number of characters within an UTF8 buffer + * Modify pos to yield new position if possible + * @param start A pointer to the start of the UTF8 buffer + * @param length The length of the UTF8 buffer + * @param pos A pointer to the current position within the UTF8 buffer, + * updated to reflect new position upon return. @param pos will + * point to the start of the offset'th character before or after the character + * currently pointed to. + * @param offset An offset (+/-) in number of UTF8 characters. + * Offset 0 consequently yields a move to the start of the current character. + * @return Number of bytes moved, or -1 if out of range. + * If -1 is returned, pos is unchanged. + */ #define UTF8_STARTCHAR(c) (!((c) & 0x80) || ((c) & 0x40)) int Fast_UnicodeUtil::UTF8move(unsigned const char* start, size_t length, - unsigned const char*& pos, off_t offset) + unsigned const char*& pos, off_t offset) { - int increment = offset > 0 ? 1 : -1; - unsigned const char* p = pos; - - /* If running backward we first need to get to the start of - * the current character, that's an extra step. - * Similarly, if we are running forward an are at the start of a character, - * we count that character as a step. - */ - - if (increment < 0) - { - // Already at start? - if (p < start) return -1; - if (!offset) + int increment = offset > 0 ? 1 : -1; + unsigned const char* p = pos; + + /* If running backward we first need to get to the start of + * the current character, that's an extra step. + * Similarly, if we are running forward an are at the start of a character, + * we count that character as a step. + */ + + if (increment < 0) { - if (p > start + length) return -1; + // Already at start? + if (p < start) return -1; + if (!offset) + { + if (p > start + length) return -1; + } + else if (p == start) return -1; + + // Initially pointing to the first invalid char? + if (p == start + length) + p += increment; + else + offset += increment; } - else if (p == start) return -1; + else if (p >= start + length) + return -1; + else if (UTF8_STARTCHAR(*p)) + offset += increment; - // Initially pointing to the first invalid char? - if (p == start + length) - p += increment; + + for (; p >= start && p < start+length; p += increment) + { + /** Are we at start of a character? (both highest bits or none of them set) */ + if (UTF8_STARTCHAR(*p)) + offset -= increment; // We have "eaten" another character (independent of dir) + if (offset == 0) break; + } + + if (offset != 0) + { + offset -= increment; + if (increment < 0) + p -= increment; + } + + if (offset == 0) // Enough room to make it.. + { + int moved = std::abs(p - pos); + pos = p; + return moved; + } else - offset += increment; - } - else if (p >= start + length) - return -1; - else if (UTF8_STARTCHAR(*p)) - offset += increment; - - - for (; p >= start && p < start+length; p += increment) - { - /** Are we at start of a character? (both highest bits or none of them set) */ - if (UTF8_STARTCHAR(*p)) - offset -= increment; // We have "eaten" another character (independent of dir) - if (offset == 0) break; - } - - if (offset != 0) - { - offset -= increment; - if (increment < 0) - p -= increment; - } - - if (offset == 0) // Enough room to make it.. - { - int moved = std::abs(p - pos); - pos = p; - return moved; - } - else - return -1; + return -1; } - diff --git a/fastlib/src/vespa/fastlib/text/unicodeutil.h b/fastlib/src/vespa/fastlib/text/unicodeutil.h index f314f9b1c68..1bb638270fa 100644 --- a/fastlib/src/vespa/fastlib/text/unicodeutil.h +++ b/fastlib/src/vespa/fastlib/text/unicodeutil.h @@ -21,36 +21,36 @@ typedef unsigned int ucs4_t; */ class Fast_UnicodeUtil { private: - /** - * Table for easy lookup of UTF8 character length in bytes - */ - static unsigned char _utf8header[256]; - /** - * Is true when the tables have been initialized. Is set by - * InitTables, and should be protected by the _initMutex before - * inspection. - */ + /** + * Table for easy lookup of UTF8 character length in bytes + */ + static unsigned char _utf8header[256]; + /** + * Is true when the tables have been initialized. Is set by + * InitTables, and should be protected by the _initMutex before + * inspection. + */ - /** Two-level lowercase table. 256 pages, 256 elements each. - * This table is defined in unicode-lowercase.cpp, which is - * autogenerated by the extcase application. */ - static unsigned short *_compLowerCase[256]; + /** Two-level lowercase table. 256 pages, 256 elements each. + * This table is defined in unicode-lowercase.cpp, which is + * autogenerated by the extcase application. */ + static unsigned short *_compLowerCase[256]; - /** Two-level character property table. 256 pages with 256 elements each. - * This table is defined in unicode-charprops.cpp, which is - * autogenerated by the extprop applicatoin. */ - static unsigned char *_compCharProps[256]; + /** Two-level character property table. 256 pages with 256 elements each. + * This table is defined in unicode-charprops.cpp, which is + * autogenerated by the extprop applicatoin. */ + static unsigned char *_compCharProps[256]; - /** The property bit identificators */ - enum { - _spaceProp = 1, - _wordcharProp = 2, - _ideographicProp = 4, - _decimalDigitCharProp = 8, - _ignorableControlCharProp = 16, - _terminalPunctuationCharProp = 32 - }; + /** The property bit identificators */ + enum { + _spaceProp = 1, + _wordcharProp = 2, + _ideographicProp = 4, + _decimalDigitCharProp = 8, + _ignorableControlCharProp = 16, + _terminalPunctuationCharProp = 32 + }; public: virtual ~Fast_UnicodeUtil() { } @@ -102,35 +102,35 @@ public: * @return Pointer to the next position in dst after the putted byte(s). */ static char *utf8cput(char *dst, ucs4_t i) { - if (i < 128) - *dst++ = i; - else if (i < 0x800) { - *dst++ = (i >> 6) | 0xc0; - *dst++ = (i & 63) | 0x80; - } else if (i < 0x10000) { - *dst++ = (i >> 12) | 0xe0; - *dst++ = ((i >> 6) & 63) | 0x80; - *dst++ = (i & 63) | 0x80; - } else if (i < 0x200000) { - *dst++ = (i >> 18) | 0xf0; - *dst++ = ((i >> 12) & 63) | 0x80; - *dst++ = ((i >> 6) & 63) | 0x80; - *dst++ = (i & 63) | 0x80; - } else if (i < 0x4000000) { - *dst++ = (i >> 24) | 0xf8; - *dst++ = ((i >> 18) & 63) | 0x80; - *dst++ = ((i >> 12) & 63) | 0x80; - *dst++ = ((i >> 6) & 63) | 0x80; - *dst++ = (i & 63) | 0x80; - } else { - *dst++ = (i >> 30) | 0xfc; - *dst++ = ((i >> 24) & 63) | 0x80; - *dst++ = ((i >> 18) & 63) | 0x80; - *dst++ = ((i >> 12) & 63) | 0x80; - *dst++ = ((i >> 6) & 63) | 0x80; - *dst++ = (i & 63) | 0x80; - } - return dst; + if (i < 128) + *dst++ = i; + else if (i < 0x800) { + *dst++ = (i >> 6) | 0xc0; + *dst++ = (i & 63) | 0x80; + } else if (i < 0x10000) { + *dst++ = (i >> 12) | 0xe0; + *dst++ = ((i >> 6) & 63) | 0x80; + *dst++ = (i & 63) | 0x80; + } else if (i < 0x200000) { + *dst++ = (i >> 18) | 0xf0; + *dst++ = ((i >> 12) & 63) | 0x80; + *dst++ = ((i >> 6) & 63) | 0x80; + *dst++ = (i & 63) | 0x80; + } else if (i < 0x4000000) { + *dst++ = (i >> 24) | 0xf8; + *dst++ = ((i >> 18) & 63) | 0x80; + *dst++ = ((i >> 12) & 63) | 0x80; + *dst++ = ((i >> 6) & 63) | 0x80; + *dst++ = (i & 63) | 0x80; + } else { + *dst++ = (i >> 30) | 0xfc; + *dst++ = ((i >> 24) & 63) | 0x80; + *dst++ = ((i >> 18) & 63) | 0x80; + *dst++ = ((i >> 12) & 63) | 0x80; + *dst++ = ((i >> 6) & 63) | 0x80; + *dst++ = (i & 63) | 0x80; + } + return dst; } /** @@ -258,5 +258,3 @@ public: return res; } }; - - diff --git a/fastlib/src/vespa/fastlib/text/wordfolder.h b/fastlib/src/vespa/fastlib/text/wordfolder.h index f40961a27c8..969ae0cd7ea 100644 --- a/fastlib/src/vespa/fastlib/text/wordfolder.h +++ b/fastlib/src/vespa/fastlib/text/wordfolder.h @@ -6,12 +6,11 @@ class Fast_WordFolder { public: - virtual ~Fast_WordFolder(void); - virtual const char* UCS4Tokenize(const char *buf, - const char *bufend, - ucs4_t *dstbuf, - ucs4_t *dstbufend, - const char*& origstart, - size_t& tokenlen) const = 0; + virtual ~Fast_WordFolder(void); + virtual const char* UCS4Tokenize(const char *buf, + const char *bufend, + ucs4_t *dstbuf, + ucs4_t *dstbufend, + const char*& origstart, + size_t& tokenlen) const = 0; }; - diff --git a/fastlib/src/vespa/fastlib/util/bag.h b/fastlib/src/vespa/fastlib/util/bag.h index 33c684da7e9..9ec9bd91e64 100644 --- a/fastlib/src/vespa/fastlib/util/bag.h +++ b/fastlib/src/vespa/fastlib/util/bag.h @@ -1,13 +1,13 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. //************************************************************************** /** -* @author B�rd Kvalheim -* @version $Id$ -* @file -*/ + * @author B�rd Kvalheim + * @version $Id$ + * @file + */ /* -* @date Creation date: 2000-03-22 -**************************************************************************/ + * @date Creation date: 2000-03-22 + **************************************************************************/ #pragma once @@ -15,397 +15,397 @@ template class Fast_BagIterator; /** -* A Fast_Bag is a collection which can contain duplicates. The -* only way to access the elements in a bag is via the -* Fast_BagIterator. The Fast_BagIterator is also capable of -* removing the current element. -* -* The Fast_BagIterator is used to iterate over the elements in -* the bag. It can be initiated by a pointer or a reference to a -* bag. The recomended use is to init the Fast_BagIterator of the -* stack and not on the heap - to avoid new and potential memory leaks. -* -* The Fast_BagIterator can be new'ed with the empty constructor -* or initialized with a pointer or a reference to a bag. It can be -* rewind with the Start() method accepting a bag pointer or reference. -* -* The internal array are resized with the private Grow() method. -* Choose the block size carefully to avoid overhead, since the Grow -* method is costly: If an array grows or are copied the elements in -* the array are copied with the = operator. In other words, the copy -* constructor of the objects are used. -* -* The amount the bag size are double each time the bag grows. The next -* grow-amount can be set with the void SetBlocksize(int bs) -* method. -* -* Example of use: -*
-*  // Init. 10 is start size. It grows as needed.
-*  Fast_Bag bag(10);
-*
-*  // Insert 4 elements
-*  bag.Insert(1);
-*  bag.Insert(2);
-*  bag.Insert(3);
-*  bag.Insert(4);
-*
-*  // Iterate through and delete element equal to  2.
-*  for(Fast_BagIterator iter(bag);
-*  	   !iter.End();
-*  	   iter.Next()) {
-*    if(iter.GetCurrent() == 2) {
-*      iter.RemoveCurrent();
-*    }
-*  }
-* 
-*/ + * A Fast_Bag is a collection which can contain duplicates. The + * only way to access the elements in a bag is via the + * Fast_BagIterator. The Fast_BagIterator is also capable of + * removing the current element. + * + * The Fast_BagIterator is used to iterate over the elements in + * the bag. It can be initiated by a pointer or a reference to a + * bag. The recomended use is to init the Fast_BagIterator of the + * stack and not on the heap - to avoid new and potential memory leaks. + * + * The Fast_BagIterator can be new'ed with the empty constructor + * or initialized with a pointer or a reference to a bag. It can be + * rewind with the Start() method accepting a bag pointer or reference. + * + * The internal array are resized with the private Grow() method. + * Choose the block size carefully to avoid overhead, since the Grow + * method is costly: If an array grows or are copied the elements in + * the array are copied with the = operator. In other words, the copy + * constructor of the objects are used. + * + * The amount the bag size are double each time the bag grows. The next + * grow-amount can be set with the void SetBlocksize(int bs) + * method. + * + * Example of use: + *
+ *  // Init. 10 is start size. It grows as needed.
+ *  Fast_Bag bag(10);
+ *
+ *  // Insert 4 elements
+ *  bag.Insert(1);
+ *  bag.Insert(2);
+ *  bag.Insert(3);
+ *  bag.Insert(4);
+ *
+ *  // Iterate through and delete element equal to  2.
+ *  for(Fast_BagIterator iter(bag);
+ *  	   !iter.End();
+ *  	   iter.Next()) {
+ *    if(iter.GetCurrent() == 2) {
+ *      iter.RemoveCurrent();
+ *    }
+ *  }
+ * 
+ */ template class Fast_Bag { - friend class Fast_BagIterator; + friend class Fast_BagIterator; protected: - /** - * The current capacity of the bag - */ - int _capacity; - - /** - * The actual array - */ - Type* _array; - - /** - * The block size used when the bag is growing - */ - int _blocksize; - - /** - * The number of elements in the bag - */ - int _numElements; + /** + * The current capacity of the bag + */ + int _capacity; + + /** + * The actual array + */ + Type* _array; + + /** + * The block size used when the bag is growing + */ + int _blocksize; + + /** + * The number of elements in the bag + */ + int _numElements; private: - /** - * Increases the bag size with _blocksize - */ - void Grow(); + /** + * Increases the bag size with _blocksize + */ + void Grow(); public: - typedef Type value_type; - - /** - * Default constructor. Sets the capacity to 0 and the - * _blocksize to 1. Very inefficient. Should only be used for - * testing - */ - Fast_Bag(); - - /** - * Copy constructor. Uses the element's = operator to make the - * copy. Hence, a deep copy are only done when actual objects are - * stored in the array and they implement a proper copy constructor. - * @param source the orginal array to copy from. - */ - Fast_Bag(const Fast_Bag& source); - - /** - * Constructor setting the _capacity . The _blocksize is - * set to capacity. - * @param capacity the initial capacity of the bag - */ - Fast_Bag(const int capacity); - - /** - * Constructor setting the _capacity and the _blocksize - * @param capacity the initial _capacity of the bag - * @param blocksize the initial _blocksize of the bag */ - Fast_Bag(const int capacity, const int blocksize); - - ~Fast_Bag(); - - /** - * Assignment operator. - * @param other the orginal array to assign from - * @return reference to the newly assigned bag - */ - Fast_Bag& operator=(const Fast_Bag& other); - - /** - * Comparison operator - * @param other the right side of == - * @return true/false - */ - bool operator==(const Fast_Bag& other) const; - - - /** - * The _blocksize is the size the bag grows with when it grows - * @return the _blocksize - */ - inline int GetBlocksize() const { return _blocksize; } - - /** - * Set a new _blocksize - * @param blocksize the new _blocksize - */ - void SetBlocksize(const int blocksize); - - /** - * @return the number of elements in the bag - */ - inline int NumberOfElements() const { return _numElements; } - - /** - * Adds a new element to the bag - * @param element the element to add - */ - void Insert(const Type element); - - /** - * Removes all the elements in the bag - */ - void RemoveAllElements(); - - /** - * Removes a element for the bag. - * @param element the element to be removed. - */ - void RemoveElement(const Type element); - - /** - * Returns true iff the element is in the bag - * @param element the element to look up. - */ - bool HasElement(const Type element); + typedef Type value_type; + + /** + * Default constructor. Sets the capacity to 0 and the + * _blocksize to 1. Very inefficient. Should only be used for + * testing + */ + Fast_Bag(); + + /** + * Copy constructor. Uses the element's = operator to make the + * copy. Hence, a deep copy are only done when actual objects are + * stored in the array and they implement a proper copy constructor. + * @param source the orginal array to copy from. + */ + Fast_Bag(const Fast_Bag& source); + + /** + * Constructor setting the _capacity . The _blocksize is + * set to capacity. + * @param capacity the initial capacity of the bag + */ + Fast_Bag(const int capacity); + + /** + * Constructor setting the _capacity and the _blocksize + * @param capacity the initial _capacity of the bag + * @param blocksize the initial _blocksize of the bag */ + Fast_Bag(const int capacity, const int blocksize); + + ~Fast_Bag(); + + /** + * Assignment operator. + * @param other the orginal array to assign from + * @return reference to the newly assigned bag + */ + Fast_Bag& operator=(const Fast_Bag& other); + + /** + * Comparison operator + * @param other the right side of == + * @return true/false + */ + bool operator==(const Fast_Bag& other) const; + + + /** + * The _blocksize is the size the bag grows with when it grows + * @return the _blocksize + */ + inline int GetBlocksize() const { return _blocksize; } + + /** + * Set a new _blocksize + * @param blocksize the new _blocksize + */ + void SetBlocksize(const int blocksize); + + /** + * @return the number of elements in the bag + */ + inline int NumberOfElements() const { return _numElements; } + + /** + * Adds a new element to the bag + * @param element the element to add + */ + void Insert(const Type element); + + /** + * Removes all the elements in the bag + */ + void RemoveAllElements(); + + /** + * Removes a element for the bag. + * @param element the element to be removed. + */ + void RemoveElement(const Type element); + + /** + * Returns true iff the element is in the bag + * @param element the element to look up. + */ + bool HasElement(const Type element); }; //************************************************************************** /** -* A Fast_BagIterator. The Fast_BagIterator can delete the -* current element from the Fast_Bag. Ensures that all elements -* are visited before the end is reached. The Fast_BagIterator can -* reused with calls to Start(Fast_Bag*) or -* Start(Fast_Bag&) -* -* Example of use: -*
-*  // Init. 10 is start size. It grows as needed.
-*  Fast_Bag bag(10);
-*
-*  // Insert 4 elements
-*  bag.Insert(1);
-*  bag.Insert(2);
-*  bag.Insert(3);
-*  bag.Insert(4);
-*
-*  // Iterate through and delete element equal to  2.
-*  for(Fast_BagIterator iter(bag);
-*  	   !iter.End();
-*  	   iter.Next()) {
-*    if(iter.GetCurrent() == 2) {
-*      iter.RemoveCurrent();
-*    }
-*  }
-* 
-*/ + * A Fast_BagIterator. The Fast_BagIterator can delete the + * current element from the Fast_Bag. Ensures that all elements + * are visited before the end is reached. The Fast_BagIterator can + * reused with calls to Start(Fast_Bag*) or + * Start(Fast_Bag&) + * + * Example of use: + *
+ *  // Init. 10 is start size. It grows as needed.
+ *  Fast_Bag bag(10);
+ *
+ *  // Insert 4 elements
+ *  bag.Insert(1);
+ *  bag.Insert(2);
+ *  bag.Insert(3);
+ *  bag.Insert(4);
+ *
+ *  // Iterate through and delete element equal to  2.
+ *  for(Fast_BagIterator iter(bag);
+ *  	   !iter.End();
+ *  	   iter.Next()) {
+ *    if(iter.GetCurrent() == 2) {
+ *      iter.RemoveCurrent();
+ *    }
+ *  }
+ * 
+ */ template class Fast_BagIterator { - friend class Fast_Bag; + friend class Fast_Bag; private: - /** - * Pointer to the Fast_Bag. - */ - Fast_Bag* _bag; + /** + * Pointer to the Fast_Bag. + */ + Fast_Bag* _bag; - /** - * Pointer to the array used to represent the Fast_Bag. - */ - Type* _array; + /** + * Pointer to the array used to represent the Fast_Bag. + */ + Type* _array; - /** - * The point in the Fast_Bag the iterator has come to. - */ - int _index; + /** + * The point in the Fast_Bag the iterator has come to. + */ + int _index; - /** - * Flag used to indicate if the iterator has reached the "end". The - * value of GetCurrent() will still be the "last" element in - * the Fast_Bag. - */ - bool _end; + /** + * Flag used to indicate if the iterator has reached the "end". The + * value of GetCurrent() will still be the "last" element in + * the Fast_Bag. + */ + bool _end; public: - /** - * Private copy-constructor the avoid usage. - */ - Fast_BagIterator(const Fast_BagIterator& source) : - _bag(source._bag), - _array(source._array), - _index(source._index), + /** + * Private copy-constructor the avoid usage. + */ + Fast_BagIterator(const Fast_BagIterator& source) : + _bag(source._bag), + _array(source._array), + _index(source._index), _end(source._end) {} - Fast_BagIterator &operator=(const Fast_BagIterator& source) - { - _bag = source._bag; - _array = source._array; - _index = source._index; - _end = source._end; - return *this; - } - /** - * Default constructor, the iterator if not initialized with a - * Fast_Bag - */ - Fast_BagIterator(void) : + Fast_BagIterator &operator=(const Fast_BagIterator& source) + { + _bag = source._bag; + _array = source._array; + _index = source._index; + _end = source._end; + return *this; + } + /** + * Default constructor, the iterator if not initialized with a + * Fast_Bag + */ + Fast_BagIterator(void) : _bag(NULL), _array(NULL), _index(0), _end(true) - { - - } - - /** - * Contructor that inits the Fast_bag with a pointer to a Fast_Bag - * @param bag pointer to a Fast_Bag of the same Type as the iterator - */ - inline Fast_BagIterator(Fast_Bag* bag) : - _bag(bag), - _array(bag->_array), - _index(0), - _end(bag->NumberOfElements() == 0) - { - } - - - /** - * Contructor that inits the Fast_BagIterator with a reference to a Fast_Bag - * @param bag reference to a Fast_Bag of the same Type as the iterator - */ - inline Fast_BagIterator(Fast_Bag& bag) : - _bag(&bag), - _array(bag._array), - _index(0), - _end(bag.NumberOfElements() == 0) - { - } - - /** - * Destructor - nothing to do - (commented out because having it generated warning) - ~Fast_BagIterator(void){}; - */ - - /** - * Reinits (or intis) the Fast_BagIterator with another - * Fast_Bag Alows the user to reuse a Fast_BagIterator - * @param bag the Fast_Bag to init the Fast_BagIterator with - */ - inline void Start(Fast_Bag* bag) { + { + + } + + /** + * Contructor that inits the Fast_bag with a pointer to a Fast_Bag + * @param bag pointer to a Fast_Bag of the same Type as the iterator + */ + inline Fast_BagIterator(Fast_Bag* bag) : + _bag(bag), + _array(bag->_array), + _index(0), + _end(bag->NumberOfElements() == 0) + { + } + + + /** + * Contructor that inits the Fast_BagIterator with a reference to a Fast_Bag + * @param bag reference to a Fast_Bag of the same Type as the iterator + */ + inline Fast_BagIterator(Fast_Bag& bag) : + _bag(&bag), + _array(bag._array), + _index(0), + _end(bag.NumberOfElements() == 0) + { + } + + /** + * Destructor - nothing to do + (commented out because having it generated warning) + ~Fast_BagIterator(void){}; + */ + + /** + * Reinits (or intis) the Fast_BagIterator with another + * Fast_Bag Alows the user to reuse a Fast_BagIterator + * @param bag the Fast_Bag to init the Fast_BagIterator with + */ + inline void Start(Fast_Bag* bag) { _bag = bag; _array = bag->_array; _index = 0; if(_bag->NumberOfElements() == 0) { - _end = true; + _end = true; } else { - _end = false; + _end = false; } - } - - /** - * Reinits (or intis) the Fast_BagIterator with another - * Fast_Bag. Alows the user to reuse a Fast_BagIterator. - * @param bag the Fast_Bag to init the Fast_BagIterator with - */ - inline void Start(Fast_Bag& bag) { + } + + /** + * Reinits (or intis) the Fast_BagIterator with another + * Fast_Bag. Alows the user to reuse a Fast_BagIterator. + * @param bag the Fast_Bag to init the Fast_BagIterator with + */ + inline void Start(Fast_Bag& bag) { _bag = &bag; _array = bag._array; _index = 0; if(_bag->NumberOfElements() == 0) { - _end = true; + _end = true; } else { - _end = false; + _end = false; } - } + } - /** - * @return the current element - */ - inline Type GetCurrent() { + /** + * @return the current element + */ + inline Type GetCurrent() { return _array[_index]; - } + } - /** - * Moves the Fast_BagIterator to the next element. If the - * Fast_BagIterator already are at the end the _end flag is set to - * true. - */ - inline void Next() { + /** + * Moves the Fast_BagIterator to the next element. If the + * Fast_BagIterator already are at the end the _end flag is set to + * true. + */ + inline void Next() { // If we are at the end and should return. if(_end) { - return; + return; } _index = _index + 1; if(_index == _bag->NumberOfElements()) { - // Now the return value from GetCurrent are undefined. - _end = true; + // Now the return value from GetCurrent are undefined. + _end = true; } - } + } - /** - * Deletes the current element in the Fast_Bag and moves the - * Fast_BagIterator to the previous - */ - inline void RemoveCurrent() { - _bag->_numElements = _bag->_numElements - 1; + /** + * Deletes the current element in the Fast_Bag and moves the + * Fast_BagIterator to the previous + */ + inline void RemoveCurrent() { + _bag->_numElements = _bag->_numElements - 1; - _array[_index] = _array[_bag->NumberOfElements()]; + _array[_index] = _array[_bag->NumberOfElements()]; _index = _index - 1; - } + } - /** - * @return true if the Fast_BagIterator is at the end - */ - inline bool End() const { return _end; } + /** + * @return true if the Fast_BagIterator is at the end + */ + inline bool End() const { return _end; } }; template Fast_BagIterator& operator++(Fast_BagIterator& bi) { - bi.Next(); - return bi; + bi.Next(); + return bi; } template Fast_BagIterator operator++(Fast_BagIterator& bi, int) { - Fast_BagIterator old = bi; - bi.Next(); - return old; + Fast_BagIterator old = bi; + bi.Next(); + return old; } template Fast_Bag::Fast_Bag() : - _capacity(1), - _array(new Type[_capacity]), - _blocksize(1), - _numElements(0) + _capacity(1), + _array(new Type[_capacity]), + _blocksize(1), + _numElements(0) { } @@ -413,28 +413,28 @@ Fast_Bag::Fast_Bag() : template Fast_Bag::Fast_Bag(const Fast_Bag& source) : - _capacity(source._capacity), - _array(NULL), - _blocksize(source._blocksize), - _numElements(source._numElements) + _capacity(source._capacity), + _array(NULL), + _blocksize(source._blocksize), + _numElements(source._numElements) { - // Self assignment - if(this == &source) return; + // Self assignment + if(this == &source) return; - _array = new Type[_capacity]; + _array = new Type[_capacity]; - for(int i = 0; i < _capacity; i++) { + for(int i = 0; i < _capacity; i++) { _array[i] = source._array[i]; - } + } } template Fast_Bag::Fast_Bag(const int capacity) : - _capacity(capacity), - _array(new Type[capacity]), - _blocksize(capacity), - _numElements(0) + _capacity(capacity), + _array(new Type[capacity]), + _blocksize(capacity), + _numElements(0) { } @@ -442,10 +442,10 @@ Fast_Bag::Fast_Bag(const int capacity) : template Fast_Bag::Fast_Bag(const int capacity, const int blocksize) : - _capacity(capacity), - _array(new Type[capacity]), - _blocksize(blocksize), - _numElements(0) + _capacity(capacity), + _array(new Type[capacity]), + _blocksize(blocksize), + _numElements(0) { } @@ -454,123 +454,120 @@ Fast_Bag::Fast_Bag(const int capacity, const int blocksize) : template Fast_Bag::~Fast_Bag() { - delete[] _array; + delete[] _array; } template inline Fast_Bag& Fast_Bag::operator=(const Fast_Bag& other) { - // Self assignment - if(this == &other) return *this; + // Self assignment + if(this == &other) return *this; - if(_array != NULL) { + if(_array != NULL) { delete[] _array; - } + } - _numElements = other._numElements; - _capacity = other._capacity; - _blocksize = other._blocksize; - _array = new Type[_capacity]; + _numElements = other._numElements; + _capacity = other._capacity; + _blocksize = other._blocksize; + _array = new Type[_capacity]; - for(int i = 0; i < _numElements; i++) { + for(int i = 0; i < _numElements; i++) { _array[i] = other._array[i]; - } + } - return *this; + return *this; } template inline bool Fast_Bag::operator==(const Fast_Bag& other) const { - if(_numElements == other._numElements && - _capacity == other._capacity && - _blocksize == other._blocksize) - { + if(_numElements == other._numElements && + _capacity == other._capacity && + _blocksize == other._blocksize) + { for(int i = 0; i < _numElements; i++) { - if (!(_array[i] == other._array[i])) return false; + if (!(_array[i] == other._array[i])) return false; } return true; - } else { + } else { return false; - } + } } template void Fast_Bag::Grow() { - int newCapacity = _capacity + _blocksize; + int newCapacity = _capacity + _blocksize; - // Grow exponentially - _blocksize = newCapacity; + // Grow exponentially + _blocksize = newCapacity; - Type* newArray = new Type[newCapacity]; + Type* newArray = new Type[newCapacity]; - for(int i = 0; i < _capacity; i++) { + for(int i = 0; i < _capacity; i++) { newArray[i] = _array[i]; - } + } - _capacity = newCapacity; + _capacity = newCapacity; - delete[] _array; - _array = newArray; + delete[] _array; + _array = newArray; } template inline void Fast_Bag::SetBlocksize(const int blocksize) { - if(blocksize > 0 ) { + if(blocksize > 0 ) { _blocksize = blocksize; - } + } } template inline void Fast_Bag::Insert(const Type element) { - if(_numElements == _capacity) Grow(); - _array[_numElements++] = element; + if(_numElements == _capacity) Grow(); + _array[_numElements++] = element; } template void Fast_Bag::RemoveAllElements() { - delete[] _array; - _numElements = 0; - _array = new Type[_capacity]; + delete[] _array; + _numElements = 0; + _array = new Type[_capacity]; } template void Fast_Bag::RemoveElement(const Type element) { - for(Fast_BagIterator it(this); - !it.End(); - it.Next()) { - if(it.GetCurrent() == element) { - it.RemoveCurrent(); + for(Fast_BagIterator it(this); + !it.End(); + it.Next()) { + if(it.GetCurrent() == element) { + it.RemoveCurrent(); + } } - } } template bool Fast_Bag::HasElement(const Type element) { - bool retVal=false; - for(Fast_BagIterator it(this); - !it.End(); - it.Next()) { - if(it.GetCurrent() == element) { - retVal=true; - break; + bool retVal=false; + for(Fast_BagIterator it(this); + !it.End(); + it.Next()) { + if(it.GetCurrent() == element) { + retVal=true; + break; + } } - } - return retVal; + return retVal; } - - - diff --git a/fastlib/src/vespa/fastlib/util/base64.cpp b/fastlib/src/vespa/fastlib/util/base64.cpp index cf90ba623f1..f5842812073 100644 --- a/fastlib/src/vespa/fastlib/util/base64.cpp +++ b/fastlib/src/vespa/fastlib/util/base64.cpp @@ -25,100 +25,100 @@ static const char _base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw int Fast_Base64::Decode(const char *source, unsigned int length, char *destination) { - unsigned int i; - - // Sanity checks. - if (!source || !destination) - return -1; - - int state = 0; - int index = 0; - char symbol; - - // Process all source symbols. - for (i = 0; i < length; ++i) { - - symbol = source[i]; - - // Skip whitespace. - if (isspace(symbol)) - continue; - - // Are we at the end? - if (symbol == '=') - break; - - // Lookup symbol in base-64 table. - if ((symbol >= 'A') && (symbol <= 'Z')) - symbol = symbol - 'A'; - else if ((symbol >= 'a') && (symbol <= 'z')) - symbol = symbol - 'a' + 26; - else if ((symbol >= '0') && (symbol <= '9')) - symbol = symbol - '0' + 52; - else if (symbol == '+') - symbol = 62; - else if (symbol == '/') - symbol = 63; - else - return -1; - - // Write stuff into the destination buffer. - switch (state) { - case 0: destination[index] = symbol << 2; - state = 1; - break; - case 1: destination[index] |= symbol >> 4; - destination[++index] = (symbol & 0x0f) << 4; - state = 2; - break; - case 2: destination[index] |= symbol >> 2; - destination[++index] = (symbol & 0x03) << 6; - state = 3; - break; - case 3: destination[index++] |= symbol; - state = 0; - break; - } + unsigned int i; + + // Sanity checks. + if (!source || !destination) + return -1; + + int state = 0; + int index = 0; + char symbol; + + // Process all source symbols. + for (i = 0; i < length; ++i) { + + symbol = source[i]; + + // Skip whitespace. + if (isspace(symbol)) + continue; + + // Are we at the end? + if (symbol == '=') + break; + + // Lookup symbol in base-64 table. + if ((symbol >= 'A') && (symbol <= 'Z')) + symbol = symbol - 'A'; + else if ((symbol >= 'a') && (symbol <= 'z')) + symbol = symbol - 'a' + 26; + else if ((symbol >= '0') && (symbol <= '9')) + symbol = symbol - '0' + 52; + else if (symbol == '+') + symbol = 62; + else if (symbol == '/') + symbol = 63; + else + return -1; + + // Write stuff into the destination buffer. + switch (state) { + case 0: destination[index] = symbol << 2; + state = 1; + break; + case 1: destination[index] |= symbol >> 4; + destination[++index] = (symbol & 0x0f) << 4; + state = 2; + break; + case 2: destination[index] |= symbol >> 2; + destination[++index] = (symbol & 0x03) << 6; + state = 3; + break; + case 3: destination[index++] |= symbol; + state = 0; + break; + } - } + } - // Did we end on a byte boundary, and/or with erroneous trailing characters? - if (i < length) { + // Did we end on a byte boundary, and/or with erroneous trailing characters? + if (i < length) { - // We've got a pad character. Skip it, and get the next symbol. - symbol = source[++i]; + // We've got a pad character. Skip it, and get the next symbol. + symbol = source[++i]; - // Check state. - switch (state) { - case 0: - case 1: return -1; - case 2: for (; i < length; ++i) { + // Check state. + switch (state) { + case 0: + case 1: return -1; + case 2: for (; i < length; ++i) { symbol = source[i]; if (!isspace(symbol)) - break; - } - if (symbol != '=' || i == length) + break; + } + if (symbol != '=' || i == length) return -1; - symbol = source[++i]; - case 3: for (; i < length; ++i) { + symbol = source[++i]; + case 3: for (; i < length; ++i) { symbol = source[i]; if (symbol == '\0') - break; + break; if (!isspace(symbol)) - return -1; - } - if (destination[index] != '\0') + return -1; + } + if (destination[index] != '\0') return -1; + } } - } - // We ended by seeing the end of the string. Make sure we have no partial bytes lying around. - else { - if (state != 0) - return -1; - } + // We ended by seeing the end of the string. Make sure we have no partial bytes lying around. + else { + if (state != 0) + return -1; + } - return index; + return index; } @@ -126,55 +126,55 @@ Fast_Base64::Decode(const char *source, unsigned int length, char *destination) int Fast_Base64::Encode(const char *source, unsigned int length, char *destination) { - unsigned int i; - - // Sanity checks. - if (!source || !destination) - return -1; - - char a, b, c, d; // Holds encoded bytes. - const char *p = source; // Points into the current location in the source buffer. - char *q = destination; // Points into the current location in the destination buffer. - unsigned int n = length / 3; // Number of 4-byte encodings. - unsigned int m = length - 3 * n; // Remainder if length is not divisible by 3. - - // Encode symbols. Three source symbols translates into four destination synbols. - for (i = 0; i < n; ++i) { - a = ((p[0] & 0xfc) >> 2); - b = ((p[0] & 0x03) << 4) | ((p[1] & 0xf0) >> 4); - c = ((p[1] & 0x0f) << 2) | ((p[2] & 0xc0) >> 6); - d = p[2] & 0x3f; - p += 3; - sprintf(q, "%c%c%c%c", - _base64[static_cast(a)], - _base64[static_cast(b)], - _base64[static_cast(c)], - _base64[static_cast(d)]); - q += 4; - } - - // Handle remaining symbols, if any. - if (m == 0) { - } - else if (m == 1) { - a = ((p[0] & 0xfc) >> 2); - b = ((p[0] & 0x03) << 4); - sprintf(q, "%c%c==", - _base64[static_cast(a)], - _base64[static_cast(b)]); - q += 4; - } - else { - a = ((p[0] & 0xfc) >> 2); - b = ((p[0] & 0x03) << 4) | ((p[1] & 0xf0) >> 4); - c = ((p[1] & 0x0f) << 2); - sprintf(q, "%c%c%c=", - _base64[static_cast(a)], - _base64[static_cast(b)], - _base64[static_cast(c)]); - q += 4; - } - - return q - destination + 1; + unsigned int i; + + // Sanity checks. + if (!source || !destination) + return -1; + + char a, b, c, d; // Holds encoded bytes. + const char *p = source; // Points into the current location in the source buffer. + char *q = destination; // Points into the current location in the destination buffer. + unsigned int n = length / 3; // Number of 4-byte encodings. + unsigned int m = length - 3 * n; // Remainder if length is not divisible by 3. + + // Encode symbols. Three source symbols translates into four destination synbols. + for (i = 0; i < n; ++i) { + a = ((p[0] & 0xfc) >> 2); + b = ((p[0] & 0x03) << 4) | ((p[1] & 0xf0) >> 4); + c = ((p[1] & 0x0f) << 2) | ((p[2] & 0xc0) >> 6); + d = p[2] & 0x3f; + p += 3; + sprintf(q, "%c%c%c%c", + _base64[static_cast(a)], + _base64[static_cast(b)], + _base64[static_cast(c)], + _base64[static_cast(d)]); + q += 4; + } + + // Handle remaining symbols, if any. + if (m == 0) { + } + else if (m == 1) { + a = ((p[0] & 0xfc) >> 2); + b = ((p[0] & 0x03) << 4); + sprintf(q, "%c%c==", + _base64[static_cast(a)], + _base64[static_cast(b)]); + q += 4; + } + else { + a = ((p[0] & 0xfc) >> 2); + b = ((p[0] & 0x03) << 4) | ((p[1] & 0xf0) >> 4); + c = ((p[1] & 0x0f) << 2); + sprintf(q, "%c%c%c=", + _base64[static_cast(a)], + _base64[static_cast(b)], + _base64[static_cast(c)]); + q += 4; + } + + return q - destination + 1; } diff --git a/fastlib/src/vespa/fastlib/util/base64.h b/fastlib/src/vespa/fastlib/util/base64.h index 1df209ee143..1138d7c0aaa 100644 --- a/fastlib/src/vespa/fastlib/util/base64.h +++ b/fastlib/src/vespa/fastlib/util/base64.h @@ -23,42 +23,41 @@ class Fast_Base64 { public: - /** - ***************************************************************************** - * Encodes source in base64 into destination. - * Returns the number of data bytes stored in destination, or -1 on error. - * - * @param source is the source buffer - * @param length is the length of the source string - * @param destination is the destination buffer - * @return Length of the destination string, INCLUDING the trailing '\0' byte. - * Returns -1 on error. - * @author Aleksander �hrn - ***************************************************************************/ - static int Encode(const char *source, - unsigned int length, - char *destination); + /** + ***************************************************************************** + * Encodes source in base64 into destination. + * Returns the number of data bytes stored in destination, or -1 on error. + * + * @param source is the source buffer + * @param length is the length of the source string + * @param destination is the destination buffer + * @return Length of the destination string, INCLUDING the trailing '\0' byte. + * Returns -1 on error. + * @author Aleksander �hrn + ***************************************************************************/ + static int Encode(const char *source, + unsigned int length, + char *destination); - /** - *************************************************************************** - * Decodes the base64 encoded source into destination. - * Returns the number of data bytes stored in destination, or -1 on error. - * Note that there is no trailing '\0' byte automatically padded to the - * destination buffer. So the length returned is the same as was originally - * used for length the Encode() call. - * - * @param source is the source buffer - * @param length is the length of the source string, - * NOT including the terminating '\0' byte - * @param destination is the destination buffer, identical to the buffer - * that originally went into Encode(). - * @return Length of the destination string. - * Returns -1 on error. - * @author Aleksander �hrn - **************************************************************************/ - static int Decode(const char *source, - unsigned int length, - char *destination); + /** + *************************************************************************** + * Decodes the base64 encoded source into destination. + * Returns the number of data bytes stored in destination, or -1 on error. + * Note that there is no trailing '\0' byte automatically padded to the + * destination buffer. So the length returned is the same as was originally + * used for length the Encode() call. + * + * @param source is the source buffer + * @param length is the length of the source string, + * NOT including the terminating '\0' byte + * @param destination is the destination buffer, identical to the buffer + * that originally went into Encode(). + * @return Length of the destination string. + * Returns -1 on error. + * @author Aleksander �hrn + **************************************************************************/ + static int Decode(const char *source, + unsigned int length, + char *destination); }; - diff --git a/fastlib/src/vespa/fastlib/util/tests/bagtest.cpp b/fastlib/src/vespa/fastlib/util/tests/bagtest.cpp index ba53e971357..b06319c238a 100644 --- a/fastlib/src/vespa/fastlib/util/tests/bagtest.cpp +++ b/fastlib/src/vespa/fastlib/util/tests/bagtest.cpp @@ -9,7 +9,7 @@ int BagTest::Main() { bt.SetStream(&std::cout); bt.Run(); if (bt.Report() > 0) { - return 1; + return 1; } return 0; diff --git a/fastlib/src/vespa/fastlib/util/tests/bagtest.h b/fastlib/src/vespa/fastlib/util/tests/bagtest.h index 597317bf38e..7da461c0189 100644 --- a/fastlib/src/vespa/fastlib/util/tests/bagtest.h +++ b/fastlib/src/vespa/fastlib/util/tests/bagtest.h @@ -10,520 +10,520 @@ class Tester { private: - bool _isTouched; + bool _isTouched; - int _i; + int _i; protected: - Tester() : _isTouched(false), _i() { } + Tester() : _isTouched(false), _i() { } public: - Tester(int i) : _isTouched(false), _i(i) { } + Tester(int i) : _isTouched(false), _i(i) { } - ~Tester() { } + ~Tester() { } - bool IsTouched() const { return _isTouched; } + bool IsTouched() const { return _isTouched; } - void Touch() { - if(_isTouched) { _isTouched = false; } - else { _isTouched = true; } - } + void Touch() { + if(_isTouched) { _isTouched = false; } + else { _isTouched = true; } + } - int GetI() { return _i; } + int GetI() { return _i; } }; std::ostream& operator<<(std::ostream& s, const Tester* t) { - return s << static_cast(t) << ": " << (t->IsTouched()?"X":"-"); + return s << static_cast(t) << ": " << (t->IsTouched()?"X":"-"); } //Print method, not used when thing works template void PrintBag(Fast_Bag* bag) { - for (Fast_BagIterator bagIterator(bag); - !bagIterator.End(); - bagIterator.Next()) { - std::cout << bagIterator.GetCurrent() << " "; - } - std::cout << std::endl; + for (Fast_BagIterator bagIterator(bag); + !bagIterator.End(); + bagIterator.Next()) { + std::cout << bagIterator.GetCurrent() << " "; + } + std::cout << std::endl; } //Print method, not used when thing works template void PrintArray(T* array, int n) { - for(int i = 0; i < n; i++) { - std::cout << array[i] << " "; - } - std::cout << std::endl; + for(int i = 0; i < n; i++) { + std::cout << array[i] << " "; + } + std::cout << std::endl; } class BagTester : public Test { private: - BagTester(const BagTester &other); - BagTester& operator=(const BagTester &other); + BagTester(const BagTester &other); + BagTester& operator=(const BagTester &other); - Tester** _array; - Fast_Bag* _bag; + Tester** _array; + Fast_Bag* _bag; - int _elements; + int _elements; - void RunTest(void (BagTester::*testFunc)()) { - StartUp(); - (this->*testFunc)(); - TearDown(); - } + void RunTest(void (BagTester::*testFunc)()) { + StartUp(); + (this->*testFunc)(); + TearDown(); + } protected: - /** Touches all elemenets in the bag */ - void TouchBag(Fast_Bag* bag) { - for(Fast_BagIterator bagIterator(bag); - !bagIterator.End(); - bagIterator.Next()) { - bagIterator.GetCurrent()->Touch(); + /** Touches all elemenets in the bag */ + void TouchBag(Fast_Bag* bag) { + for(Fast_BagIterator bagIterator(bag); + !bagIterator.End(); + bagIterator.Next()) { + bagIterator.GetCurrent()->Touch(); + } } - } - /** Generate a test bag with num tester and init cap of max */ - void InitArray(int num, int maxCapacity = 0) { - if (maxCapacity == 0) maxCapacity = num; - _bag = new Fast_Bag(maxCapacity); - for(int i = 0; i < num; i++) { - Tester* tester = new Tester(i); - _array[i] = tester; - _bag->Insert(tester); + /** Generate a test bag with num tester and init cap of max */ + void InitArray(int num, int maxCapacity = 0) { + if (maxCapacity == 0) maxCapacity = num; + _bag = new Fast_Bag(maxCapacity); + for(int i = 0; i < num; i++) { + Tester* tester = new Tester(i); + _array[i] = tester; + _bag->Insert(tester); + } + _elements = num; } - _elements = num; - } public: - BagTester(void) - : _array(NULL), - _bag(NULL), - _elements(0) - { - } + BagTester(void) + : _array(NULL), + _bag(NULL), + _elements(0) + { + } + + + /** Checks if the iterator new'ed with a bagpointer works */ + void IterPtrInitTest(void) { + bool ok = true; + int num = 10; + InitArray(num); - /** Checks if the iterator new'ed with a bagpointer works */ - void IterPtrInitTest(void) { - bool ok = true; - int num = 10; + TouchBag(_bag); - InitArray(num); + for(int i = 0 ; i < num; i++) { + if(!_array[i]->IsTouched()) { + ok = false; + } + } - TouchBag(_bag); + delete _bag; - for(int i = 0 ; i < num; i++) { - if(!_array[i]->IsTouched()) { - ok = false; - } + _test(ok); } - delete _bag; + /** Checks if the iterator new'ed with a bagref works */ + void IterRefInitTest(void) { + bool ok = true; + int num = 10; - _test(ok); - } + InitArray(num); - /** Checks if the iterator new'ed with a bagref works */ - void IterRefInitTest(void) { - bool ok = true; - int num = 10; + for(Fast_BagIterator bagIterator(*_bag); + !bagIterator.End(); + bagIterator.Next()) { + bagIterator.GetCurrent()->Touch(); + } - InitArray(num); + for(int i = 0 ; i < num; i++) { + if(!_array[i]->IsTouched()) { + ok = false; + } + } - for(Fast_BagIterator bagIterator(*_bag); - !bagIterator.End(); - bagIterator.Next()) { - bagIterator.GetCurrent()->Touch(); - } + delete _bag; - for(int i = 0 ; i < num; i++) { - if(!_array[i]->IsTouched()) { - ok = false; - } + _test(ok); } - delete _bag; + void IterPPOperTest(void) { + bool ok = true; + int num = 10; - _test(ok); - } + InitArray(num); - void IterPPOperTest(void) { - bool ok = true; - int num = 10; + for(Fast_BagIterator bagIterator(*_bag); + !bagIterator.End(); + ++bagIterator, + bagIterator++) { + bagIterator.GetCurrent()->Touch(); + } - InitArray(num); + for(int i = 0 ; i < num; i = i + 2) { + if(!_array[i]->IsTouched()) { + ok = false; + } + } - for(Fast_BagIterator bagIterator(*_bag); - !bagIterator.End(); - ++bagIterator, - bagIterator++) { - bagIterator.GetCurrent()->Touch(); - } + delete _bag; - for(int i = 0 ; i < num; i = i + 2) { - if(!_array[i]->IsTouched()) { - ok = false; - } + _test(ok); } - delete _bag; - _test(ok); - } + /** Checks if the iterator new'ed with a bagref works */ + void IterPtrStartTest(void) { + bool ok = true; + int num = 10; + InitArray(num); - /** Checks if the iterator new'ed with a bagref works */ - void IterPtrStartTest(void) { - bool ok = true; - int num = 10; + Fast_BagIterator bagIterator; - InitArray(num); + for(bagIterator.Start(*_bag); + !bagIterator.End(); + bagIterator.Next()) { + bagIterator.GetCurrent()->Touch(); + } - Fast_BagIterator bagIterator; + for(int i = 0 ; i < num; i++) { + if(!_array[i]->IsTouched()) { + ok = false; + } + } - for(bagIterator.Start(*_bag); - !bagIterator.End(); - bagIterator.Next()) { - bagIterator.GetCurrent()->Touch(); - } + delete _bag; - for(int i = 0 ; i < num; i++) { - if(!_array[i]->IsTouched()) { - ok = false; - } + _test(ok); } - delete _bag; - _test(ok); - } + /** Checks if the iterator new'ed with a bagref works */ + void IterRefStartTest(void) { + bool ok = true; + int num = 10; + InitArray(num); - /** Checks if the iterator new'ed with a bagref works */ - void IterRefStartTest(void) { - bool ok = true; - int num = 10; + Fast_BagIterator bagIterator; - InitArray(num); + for(bagIterator.Start(_bag); + !bagIterator.End(); + bagIterator.Next()) { + bagIterator.GetCurrent()->Touch(); + } - Fast_BagIterator bagIterator; + for(int i = 0 ; i < num; i++) { + if(!_array[i]->IsTouched()) { + ok = false; + } + } - for(bagIterator.Start(_bag); - !bagIterator.End(); - bagIterator.Next()) { - bagIterator.GetCurrent()->Touch(); - } + delete _bag; - for(int i = 0 ; i < num; i++) { - if(!_array[i]->IsTouched()) { - ok = false; - } + _test(ok); } - delete _bag; - _test(ok); - } + void IterStartOverTest(void) { + bool ok = true; + int num = 10; + InitArray(num); - void IterStartOverTest(void) { - bool ok = true; - int num = 10; + int n = 0; + Fast_BagIterator bagIterator; + for(bagIterator.Start(_bag); + !bagIterator.End(); + bagIterator.Next()) { + if(n>4) break; + n++; + } - InitArray(num); + for(bagIterator.Start(_bag); + !bagIterator.End(); + bagIterator.Next()) { + bagIterator.GetCurrent()->Touch(); + } - int n = 0; - Fast_BagIterator bagIterator; - for(bagIterator.Start(_bag); - !bagIterator.End(); - bagIterator.Next()) { - if(n>4) break; - n++; - } + for(int i = 0 ; i < num; i++) { + if(!_array[i]->IsTouched()) { + ok = false; + } + } - for(bagIterator.Start(_bag); - !bagIterator.End(); - bagIterator.Next()) { - bagIterator.GetCurrent()->Touch(); - } + delete _bag; - for(int i = 0 ; i < num; i++) { - if(!_array[i]->IsTouched()) { - ok = false; - } + _test(ok); } - delete _bag; - _test(ok); - } + /** Checks if the delete in iterator works */ + void DeleteEnumTest(void) { + bool ok = true; + int num = 10; + InitArray(num); + Tester* del = NULL; - /** Checks if the delete in iterator works */ - void DeleteEnumTest(void) { - bool ok = true; - int num = 10; - InitArray(num); + for(Fast_BagIterator bagIterator(_bag); + !bagIterator.End(); + bagIterator.Next()) { + if(bagIterator.GetCurrent()->GetI() == 5) { + del = bagIterator.GetCurrent(); + bagIterator.RemoveCurrent(); + } + } - Tester* del = NULL; + // - for(Fast_BagIterator bagIterator(_bag); - !bagIterator.End(); - bagIterator.Next()) { - if(bagIterator.GetCurrent()->GetI() == 5) { - del = bagIterator.GetCurrent(); - bagIterator.RemoveCurrent(); - } - } + TouchBag(_bag); - // + for(int i = 0 ; i < num; i++) { + if(!_array[i]->IsTouched()) { + if(_array[i] != del) { + ok = false; + } + } + } - TouchBag(_bag); + delete _bag; - for(int i = 0 ; i < num; i++) { - if(!_array[i]->IsTouched()) { - if(_array[i] != del) { - ok = false; - } - } + _test(ok); } - delete _bag; + /** Checks is the RemoveElement method in bag.*/ + void RemoveTest(void) { + bool ok = true; + int num = 10; + InitArray(num, num+num); - _test(ok); - } + Tester* del = NULL; - /** Checks is the RemoveElement method in bag.*/ - void RemoveTest(void) { - bool ok = true; - int num = 10; - InitArray(num, num+num); + for(Fast_BagIterator bagIterator(_bag); + !bagIterator.End(); + bagIterator.Next()) { + if(bagIterator.GetCurrent()->GetI() == 5) { + del = bagIterator.GetCurrent(); + } + } - Tester* del = NULL; + _bag->RemoveElement(del); - for(Fast_BagIterator bagIterator(_bag); - !bagIterator.End(); - bagIterator.Next()) { - if(bagIterator.GetCurrent()->GetI() == 5) { - del = bagIterator.GetCurrent(); - } - } + // - _bag->RemoveElement(del); + TouchBag(_bag); - // + for(int i = 0 ; i < 10; i++) { + if(!_array[i]->IsTouched()) { + if(_array[i] != del) { + ok = false; + } + } + } - TouchBag(_bag); + delete _bag; - for(int i = 0 ; i < 10; i++) { - if(!_array[i]->IsTouched()) { - if(_array[i] != del) { - ok = false; - } - } + _test(ok); } - delete _bag; - _test(ok); - } + /**Test the HasElement method in bag.*/ + void HasElementTest(void) { + bool ok = true; + int num = 10; + InitArray(num, num+num); + Tester* current= NULL; - /**Test the HasElement method in bag.*/ - void HasElementTest(void) { - bool ok = true; - int num = 10; - InitArray(num, num+num); + for(Fast_BagIterator bagIterator(_bag); + !bagIterator.End(); + bagIterator.Next()) { + current=bagIterator.GetCurrent(); + if(!_bag->HasElement(current)) { + ok=false; + } + } + Tester* t=new Tester(4); + if(_bag->HasElement(t) ) { + ok=false; + } - Tester* current= NULL; + delete t; + delete _bag; - for(Fast_BagIterator bagIterator(_bag); - !bagIterator.End(); - bagIterator.Next()) { - current=bagIterator.GetCurrent(); - if(!_bag->HasElement(current)) { - ok=false; - } - } - Tester* t=new Tester(4); - if(_bag->HasElement(t) ) { - ok=false; + _test(ok); } - delete t; - delete _bag; + void GrowTest(void) { + bool ok = true; + int num = 10; + InitArray(num, 2); - _test(ok); - } + // + TouchBag(_bag); - void GrowTest(void) { - bool ok = true; - int num = 10; - InitArray(num, 2); + for(int i = 0 ; i < num; i++) { + if(!_array[i]->IsTouched()) { + ok = false; + } + } - // - TouchBag(_bag); + delete _bag; - for(int i = 0 ; i < num; i++) { - if(!_array[i]->IsTouched()) { - ok = false; - } + _test(ok); } - delete _bag; - - _test(ok); - } + void CopyConstTest(void) { + bool ok = true; + int num = 10; + InitArray(num); + Fast_Bag bag(*_bag); + TouchBag(&bag); + + for(int i = 0 ; i < num; i++) { + if(!_array[i]->IsTouched()) { + ok = false; + } + } - void CopyConstTest(void) { - bool ok = true; - int num = 10; - InitArray(num); - Fast_Bag bag(*_bag); - TouchBag(&bag); + delete _bag; - for(int i = 0 ; i < num; i++) { - if(!_array[i]->IsTouched()) { - ok = false; - } + _test(ok); } - delete _bag; + void AssignTest(void) { + bool ok = true; + int num = 10; + InitArray(num); - _test(ok); - } + Fast_Bag bag; + bag = *_bag; - void AssignTest(void) { - bool ok = true; - int num = 10; - InitArray(num); + TouchBag(&bag); - Fast_Bag bag; - bag = *_bag; + for(int i = 0 ; i < num; i++) { + if(!_array[i]->IsTouched()) { + ok = false; + } + } - TouchBag(&bag); + delete _bag; - for(int i = 0 ; i < num; i++) { - if(!_array[i]->IsTouched()) { - ok = false; - } + _test(ok); } - delete _bag; - _test(ok); - } + void EqualTest(void) { + bool ok = true; + int num = 10; + InitArray(num); + Fast_Bag equalBag; + equalBag = *_bag; - void EqualTest(void) { - bool ok = true; - int num = 10; + if(!(equalBag == *_bag)) { ok = false; } - InitArray(num); - Fast_Bag equalBag; - equalBag = *_bag; + Tester *elem1 = new Tester(4); + equalBag.Insert(elem1); - if(!(equalBag == *_bag)) { ok = false; } + if(equalBag == *_bag) { ok = false; } - Tester *elem1 = new Tester(4); - equalBag.Insert(elem1); + equalBag.RemoveElement(elem1); + delete elem1; + delete _bag; - if(equalBag == *_bag) { ok = false; } + _test(ok); + } - equalBag.RemoveElement(elem1); - delete elem1; - delete _bag; - _test(ok); - } + void RemoveAllElementsTest(void) { + bool ok = true; + int num = 10; + InitArray(num); + _bag->RemoveAllElements(); + TouchBag(_bag); - void RemoveAllElementsTest(void) { - bool ok = true; - int num = 10; - InitArray(num); - _bag->RemoveAllElements(); + for(int i = 0 ; i < num; i++) { + if(_array[i]->IsTouched()) { + ok = false; + } + } - TouchBag(_bag); + delete _bag; - for(int i = 0 ; i < num; i++) { - if(_array[i]->IsTouched()) { - ok = false; - } + _test(ok); } - delete _bag; + void GetBlocksizeTest(void) { + bool ok = true; + int num = 10; + InitArray(num); + if(_bag->GetBlocksize() != num) { + ok = false; + } - _test(ok); - } + delete _bag; - void GetBlocksizeTest(void) { - bool ok = true; - int num = 10; - InitArray(num); - if(_bag->GetBlocksize() != num) { - ok = false; + _test(ok); } - delete _bag; + void SetBlocksizeTest(void) { + bool ok = true; + int num = 10; + InitArray(num); + _bag->SetBlocksize(19); + if(_bag->GetBlocksize() != 19) { + ok = false; + } - _test(ok); - } + delete _bag; - void SetBlocksizeTest(void) { - bool ok = true; - int num = 10; - InitArray(num); - _bag->SetBlocksize(19); - if(_bag->GetBlocksize() != 19) { - ok = false; + _test(ok); } - delete _bag; + void NumberOfElementsTest(void) { + bool ok = true; + int num = 10; + InitArray(num); + if(_bag->NumberOfElements() != num) { + ok= false; + } + _bag->RemoveAllElements(); + if(_bag->NumberOfElements() != 0) { + ok = false; + } - _test(ok); - } + delete _bag; - void NumberOfElementsTest(void) { - bool ok = true; - int num = 10; - InitArray(num); - if(_bag->NumberOfElements() != num) { - ok= false; - } - _bag->RemoveAllElements(); - if(_bag->NumberOfElements() != 0) { - ok = false; + _test(ok); } - delete _bag; - - _test(ok); - } - - void StartUp(void) { - _array = new Tester*[1024]; - } + void StartUp(void) { + _array = new Tester*[1024]; + } - void TearDown(void) { - for(int i = 0; i < _elements; i++) { - delete _array[i]; + void TearDown(void) { + for(int i = 0; i < _elements; i++) { + delete _array[i]; + } + delete[] _array; } - delete[] _array; - } void Run() override { RunTest(&BagTester::IterPtrInitTest); diff --git a/fastlib/src/vespa/fastlib/util/tests/base64test.cpp b/fastlib/src/vespa/fastlib/util/tests/base64test.cpp index 92cc2fee719..531f22a6e27 100644 --- a/fastlib/src/vespa/fastlib/util/tests/base64test.cpp +++ b/fastlib/src/vespa/fastlib/util/tests/base64test.cpp @@ -12,86 +12,86 @@ public: int Base64Test::Main(void) { - char buffer0[1024]; // Original text. - char buffer1[1024]; // Encoded text. - char buffer2[1024]; // Decoded text. - - sprintf(buffer0, "Hello, world! This is a test. 123."); - - int length0 = strlen(buffer0); - int length1 = Fast_Base64::Encode(buffer0, length0, buffer1); - - assert(length1 != -1); - - int length2 = Fast_Base64::Decode(buffer1, length1, buffer2); - - assert(length2 != -1); - assert(length2 == length0); - assert(0 == strncmp(buffer0, buffer2, length0)); - - printf("Original = '%.*s'\n", length0, buffer0); - printf("Encoded = '%.*s'\n", length1, buffer1); - printf("Decoded = '%.*s'\n", length2, buffer2); - - - // Big file test - vespalib::string filename("base64test"); - - if (_argc > 1) { - filename.assign(_argv[1]); - } - - FastOS_StatInfo statInfo; - int filesize = 0; - if (FastOS_File::Stat(filename.c_str(), &statInfo)) { - filesize = statInfo._size; - } else { - printf("FAILURE: Could not stat file %s\n", filename.c_str()); - exit(1); - } - - FastOS_File testFile; - if (!testFile.OpenReadOnly(filename.c_str())) { - printf ("FAILURE: Could not open file %s for reading\n", filename.c_str()); - exit(1); - } - - - auto unencoded = std::make_unique(filesize); - auto encoded = std::make_unique(filesize * 2); - auto decoded = std::make_unique(filesize + 1); - testFile.ReadBuf(unencoded.get(), filesize); - - int encLen = Fast_Base64::Encode(unencoded.get(), filesize, encoded.get()); - if (encLen == -1) { - printf("FAILURE: Encoding failed\n"); - exit(1); - } - - // encLen is including the trailing '\0' byte, so subtract one - int decLen = Fast_Base64::Decode(encoded.get(), encLen - 1, decoded.get()); - if (decLen == -1) { - printf("FAILURE: Decoding failed\n"); - exit(1); - } - - if (filesize != decLen) { - printf("FAILURE: decoded length != original filesize, filesize = %d, decLen = %d\n", filesize, decLen); - exit(1); - } - char *uencP = unencoded.get(); - char *decP = decoded.get(); - for (int i = 0; i < filesize; i++) { - if (*uencP != *decP) { - printf ("FAILURE: Encode or Decode ERROR! at byte offset %d\n", i); - exit(1); + char buffer0[1024]; // Original text. + char buffer1[1024]; // Encoded text. + char buffer2[1024]; // Decoded text. + + sprintf(buffer0, "Hello, world! This is a test. 123."); + + int length0 = strlen(buffer0); + int length1 = Fast_Base64::Encode(buffer0, length0, buffer1); + + assert(length1 != -1); + + int length2 = Fast_Base64::Decode(buffer1, length1, buffer2); + + assert(length2 != -1); + assert(length2 == length0); + assert(0 == strncmp(buffer0, buffer2, length0)); + + printf("Original = '%.*s'\n", length0, buffer0); + printf("Encoded = '%.*s'\n", length1, buffer1); + printf("Decoded = '%.*s'\n", length2, buffer2); + + + // Big file test + vespalib::string filename("base64test"); + + if (_argc > 1) { + filename.assign(_argv[1]); + } + + FastOS_StatInfo statInfo; + int filesize = 0; + if (FastOS_File::Stat(filename.c_str(), &statInfo)) { + filesize = statInfo._size; + } else { + printf("FAILURE: Could not stat file %s\n", filename.c_str()); + exit(1); + } + + FastOS_File testFile; + if (!testFile.OpenReadOnly(filename.c_str())) { + printf ("FAILURE: Could not open file %s for reading\n", filename.c_str()); + exit(1); + } + + + auto unencoded = std::make_unique(filesize); + auto encoded = std::make_unique(filesize * 2); + auto decoded = std::make_unique(filesize + 1); + testFile.ReadBuf(unencoded.get(), filesize); + + int encLen = Fast_Base64::Encode(unencoded.get(), filesize, encoded.get()); + if (encLen == -1) { + printf("FAILURE: Encoding failed\n"); + exit(1); + } + + // encLen is including the trailing '\0' byte, so subtract one + int decLen = Fast_Base64::Decode(encoded.get(), encLen - 1, decoded.get()); + if (decLen == -1) { + printf("FAILURE: Decoding failed\n"); + exit(1); + } + + if (filesize != decLen) { + printf("FAILURE: decoded length != original filesize, filesize = %d, decLen = %d\n", filesize, decLen); + exit(1); + } + char *uencP = unencoded.get(); + char *decP = decoded.get(); + for (int i = 0; i < filesize; i++) { + if (*uencP != *decP) { + printf ("FAILURE: Encode or Decode ERROR! at byte offset %d\n", i); + exit(1); + } + uencP++; + decP++; } - uencP++; - decP++; - } - printf("SUCCESS: Encode/decode OK\n"); + printf("SUCCESS: Encode/decode OK\n"); - return 0; + return 0; } diff --git a/fastlib/src/vespa/fastlib/util/tests/wildcard_match_test.cpp b/fastlib/src/vespa/fastlib/util/tests/wildcard_match_test.cpp index 0678cebf2b6..a4d8320a29c 100644 --- a/fastlib/src/vespa/fastlib/util/tests/wildcard_match_test.cpp +++ b/fastlib/src/vespa/fastlib/util/tests/wildcard_match_test.cpp @@ -5,44 +5,44 @@ namespace { - template - bool Test(const T* word, const T* pattern, bool expect) - { +template +bool Test(const T* word, const T* pattern, bool expect) +{ if (fast::util::wildcard_match(word, pattern) != expect) { - if (expect == true) - std::cout << "ERROR: " << word << " didn't match " << pattern << std::endl; - else - std::cout << "ERROR: " << word << " matched " << pattern << std::endl; + if (expect == true) + std::cout << "ERROR: " << word << " didn't match " << pattern << std::endl; + else + std::cout << "ERROR: " << word << " matched " << pattern << std::endl; - return false; + return false; } return true; - } +} } int main(int, char **) { - bool success = - Test("a", "b", false) && - Test("b", "b", true) && - Test("abc", "def", false) && - Test("def", "def", true) && - Test("def", "d?f", true) && - Test("def", "d?d", false) && - Test("def", "??d", false) && - Test("def", "d??", true) && - Test("abcdef", "a*e", false) && - Test("abcdef", "a*f", true) && - Test("abcdef", "a?c*f", true) && - Test("abcdef", "a?b*f", false) && - Test("abcdef", "a*b*f", true) && - Test("abcdef", "abc*", true) && - Test("abcdef", "*def", true); + bool success = + Test("a", "b", false) && + Test("b", "b", true) && + Test("abc", "def", false) && + Test("def", "def", true) && + Test("def", "d?f", true) && + Test("def", "d?d", false) && + Test("def", "??d", false) && + Test("def", "d??", true) && + Test("abcdef", "a*e", false) && + Test("abcdef", "a*f", true) && + Test("abcdef", "a?c*f", true) && + Test("abcdef", "a?b*f", false) && + Test("abcdef", "a*b*f", true) && + Test("abcdef", "abc*", true) && + Test("abcdef", "*def", true); - if (success == true) - std::cout << "wildcard_match_test: SUCCESS" << std::endl; + if (success == true) + std::cout << "wildcard_match_test: SUCCESS" << std::endl; - return 0; + return 0; } diff --git a/fastlib/src/vespa/fastlib/util/wildcard_match.h b/fastlib/src/vespa/fastlib/util/wildcard_match.h index c65330be80f..03b006610f7 100644 --- a/fastlib/src/vespa/fastlib/util/wildcard_match.h +++ b/fastlib/src/vespa/fastlib/util/wildcard_match.h @@ -3,53 +3,52 @@ namespace fast { - namespace util - { - template - bool wildcard_match(const T* word, const T* pattern, T multiple = '*', - T single = '?') - { - while (*word != 0) - if (*pattern == 0) +namespace util +{ +template +bool wildcard_match(const T* word, const T* pattern, T multiple = '*', + T single = '?') +{ + while (*word != 0) + if (*pattern == 0) return false; - else if (*pattern == multiple) - { + else if (*pattern == multiple) + { // advance past occurrences of multiple while (*pattern == multiple) - ++pattern; + ++pattern; // if pattern ended with multiple, we're done if (*pattern == 0) - return true; + return true; while (*word != 0) { - // does this position in the word match - if (*pattern == single || *pattern == *word) - { - // test the rest of the word - if (wildcard_match(word, pattern, multiple, single) == true) + // does this position in the word match + if (*pattern == single || *pattern == *word) { - // it matched - return true; + // test the rest of the word + if (wildcard_match(word, pattern, multiple, single) == true) + { + // it matched + return true; + } } - } - // try next character - ++word; + // try next character + ++word; } - } - else if (*pattern != single && *pattern != *word) + } + else if (*pattern != single && *pattern != *word) return false; - else - { + else + { ++word; ++pattern; - } + } - // should be at end of pattern too if the word matched - return *pattern == 0; - } - } + // should be at end of pattern too if the word matched + return *pattern == 0; +} +} } - -- cgit v1.2.3