2352 lines
20 KiB
Go
2352 lines
20 KiB
Go
package brotli
|
|
|
|
/**
|
|
* Sets the specified parameter to the given decoder instance.
|
|
*
|
|
* @param state decoder instance
|
|
* @param param parameter to set
|
|
* @param value new parameter value
|
|
* @returns ::false if parameter is unrecognized, or value is invalid
|
|
* @returns ::true if value is accepted
|
|
*/
|
|
|
|
/**
|
|
* Creates an instance of ::BrotliDecoderState and initializes it.
|
|
*
|
|
* The instance can be used once for decoding and should then be destroyed with
|
|
* ::BrotliDecoderDestroyInstance, it cannot be reused for a new decoding
|
|
* session.
|
|
*
|
|
* @p alloc_func and @p free_func @b MUST be both zero or both non-zero. In the
|
|
* case they are both zero, default memory allocators are used. @p opaque is
|
|
* passed to @p alloc_func and @p free_func when they are called. @p free_func
|
|
* has to return without doing anything when asked to free a NULL pointer.
|
|
*
|
|
* @param alloc_func custom memory allocation function
|
|
* @param free_func custom memory free function
|
|
* @param opaque custom memory manager handle
|
|
* @returns @c 0 if instance can not be allocated or initialized
|
|
* @returns pointer to initialized ::BrotliDecoderState otherwise
|
|
*/
|
|
|
|
/**
|
|
* Deinitializes and frees ::BrotliDecoderState instance.
|
|
*
|
|
* @param state decoder instance to be cleaned up and deallocated
|
|
*/
|
|
|
|
/**
|
|
* Performs one-shot memory-to-memory decompression.
|
|
*
|
|
* Decompresses the data in @p encoded_buffer into @p decoded_buffer, and sets
|
|
* @p *decoded_size to the decompressed length.
|
|
*
|
|
* @param encoded_size size of @p encoded_buffer
|
|
* @param encoded_buffer compressed data buffer with at least @p encoded_size
|
|
* addressable bytes
|
|
* @param[in, out] decoded_size @b in: size of @p decoded_buffer; \n
|
|
* @b out: length of decompressed data written to
|
|
* @p decoded_buffer
|
|
* @param decoded_buffer decompressed data destination buffer
|
|
* @returns ::BROTLI_DECODER_RESULT_ERROR if input is corrupted, memory
|
|
* allocation failed, or @p decoded_buffer is not large enough;
|
|
* @returns ::BROTLI_DECODER_RESULT_SUCCESS otherwise
|
|
*/
|
|
|
|
/**
|
|
* Decompresses the input stream to the output stream.
|
|
*
|
|
* The values @p *available_in and @p *available_out must specify the number of
|
|
* bytes addressable at @p *next_in and @p *next_out respectively.
|
|
* When @p *available_out is @c 0, @p next_out is allowed to be @c NULL.
|
|
*
|
|
* After each call, @p *available_in will be decremented by the amount of input
|
|
* bytes consumed, and the @p *next_in pointer will be incremented by that
|
|
* amount. Similarly, @p *available_out will be decremented by the amount of
|
|
* output bytes written, and the @p *next_out pointer will be incremented by
|
|
* that amount.
|
|
*
|
|
* @p total_out, if it is not a null-pointer, will be set to the number
|
|
* of bytes decompressed since the last @p state initialization.
|
|
*
|
|
* @note Input is never overconsumed, so @p next_in and @p available_in could be
|
|
* passed to the next consumer after decoding is complete.
|
|
*
|
|
* @param state decoder instance
|
|
* @param[in, out] available_in @b in: amount of available input; \n
|
|
* @b out: amount of unused input
|
|
* @param[in, out] next_in pointer to the next compressed byte
|
|
* @param[in, out] available_out @b in: length of output buffer; \n
|
|
* @b out: remaining size of output buffer
|
|
* @param[in, out] next_out output buffer cursor;
|
|
* can be @c NULL if @p available_out is @c 0
|
|
* @param[out] total_out number of bytes decompressed so far; can be @c NULL
|
|
* @returns ::BROTLI_DECODER_RESULT_ERROR if input is corrupted, memory
|
|
* allocation failed, arguments were invalid, etc.;
|
|
* use ::BrotliDecoderGetErrorCode to get detailed error code
|
|
* @returns ::BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT decoding is blocked until
|
|
* more input data is provided
|
|
* @returns ::BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT decoding is blocked until
|
|
* more output space is provided
|
|
* @returns ::BROTLI_DECODER_RESULT_SUCCESS decoding is finished, no more
|
|
* input might be consumed and no more output will be produced
|
|
*/
|
|
|
|
/**
|
|
* Checks if decoder has more output.
|
|
*
|
|
* @param state decoder instance
|
|
* @returns ::true, if decoder has some unconsumed output
|
|
* @returns ::false otherwise
|
|
*/
|
|
|
|
/**
|
|
* Acquires pointer to internal output buffer.
|
|
*
|
|
* This method is used to make language bindings easier and more efficient:
|
|
* -# push data to ::BrotliDecoderDecompressStream,
|
|
* until ::BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT is reported
|
|
* -# use ::BrotliDecoderTakeOutput to peek bytes and copy to language-specific
|
|
* entity
|
|
*
|
|
* Also this could be useful if there is an output stream that is able to
|
|
* consume all the provided data (e.g. when data is saved to file system).
|
|
*
|
|
* @attention After every call to ::BrotliDecoderTakeOutput @p *size bytes of
|
|
* output are considered consumed for all consecutive calls to the
|
|
* instance methods; returned pointer becomes invalidated as well.
|
|
*
|
|
* @note Decoder output is not guaranteed to be contiguous. This means that
|
|
* after the size-unrestricted call to ::BrotliDecoderTakeOutput,
|
|
* immediate next call to ::BrotliDecoderTakeOutput may return more data.
|
|
*
|
|
* @param state decoder instance
|
|
* @param[in, out] size @b in: number of bytes caller is ready to take, @c 0 if
|
|
* any amount could be handled; \n
|
|
* @b out: amount of data pointed by returned pointer and
|
|
* considered consumed; \n
|
|
* out value is never greater than in value, unless it is @c 0
|
|
* @returns pointer to output data
|
|
*/
|
|
|
|
/**
|
|
* Checks if instance has already consumed input.
|
|
*
|
|
* Instance that returns ::false is considered "fresh" and could be
|
|
* reused.
|
|
*
|
|
* @param state decoder instance
|
|
* @returns ::true if decoder has already used some input bytes
|
|
* @returns ::false otherwise
|
|
*/
|
|
|
|
/**
|
|
* Checks if decoder instance reached the final state.
|
|
*
|
|
* @param state decoder instance
|
|
* @returns ::true if decoder is in a state where it reached the end of
|
|
* the input and produced all of the output
|
|
* @returns ::false otherwise
|
|
*/
|
|
|
|
/**
|
|
* Acquires a detailed error code.
|
|
*
|
|
* Should be used only after ::BrotliDecoderDecompressStream returns
|
|
* ::BROTLI_DECODER_RESULT_ERROR.
|
|
*
|
|
* See also ::BrotliDecoderErrorString
|
|
*
|
|
* @param state decoder instance
|
|
* @returns last saved error code
|
|
*/
|
|
|
|
/**
|
|
* Converts error code to a c-string.
|
|
*/
|
|
|
|
/**
|
|
* Gets a decoder library version.
|
|
*
|
|
* Look at BROTLI_VERSION for more information.
|
|
*/
|
|
/* Copyright 2013 Google Inc. All Rights Reserved.
|
|
|
|
Distributed under MIT license.
|
|
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
/* Lookup table to map the previous two bytes to a context id.
|
|
|
|
There are four different context modeling modes defined here:
|
|
contextLSB6: context id is the least significant 6 bits of the last byte,
|
|
contextMSB6: context id is the most significant 6 bits of the last byte,
|
|
contextUTF8: second-order context model tuned for UTF8-encoded text,
|
|
contextSigned: second-order context model tuned for signed integers.
|
|
|
|
If |p1| and |p2| are the previous two bytes, and |mode| is current context
|
|
mode, we calculate the context as:
|
|
|
|
context = ContextLut(mode)[p1] | ContextLut(mode)[p2 + 256].
|
|
|
|
For contextUTF8 mode, if the previous two bytes are ASCII characters
|
|
(i.e. < 128), this will be equivalent to
|
|
|
|
context = 4 * context1(p1) + context2(p2),
|
|
|
|
where context1 is based on the previous byte in the following way:
|
|
|
|
0 : non-ASCII control
|
|
1 : \t, \n, \r
|
|
2 : space
|
|
3 : other punctuation
|
|
4 : " '
|
|
5 : %
|
|
6 : ( < [ {
|
|
7 : ) > ] }
|
|
8 : , ; :
|
|
9 : .
|
|
10 : =
|
|
11 : number
|
|
12 : upper-case vowel
|
|
13 : upper-case consonant
|
|
14 : lower-case vowel
|
|
15 : lower-case consonant
|
|
|
|
and context2 is based on the second last byte:
|
|
|
|
0 : control, space
|
|
1 : punctuation
|
|
2 : upper-case letter, number
|
|
3 : lower-case letter
|
|
|
|
If the last byte is ASCII, and the second last byte is not (in a valid UTF8
|
|
stream it will be a continuation byte, value between 128 and 191), the
|
|
context is the same as if the second last byte was an ASCII control or space.
|
|
|
|
If the last byte is a UTF8 lead byte (value >= 192), then the next byte will
|
|
be a continuation byte and the context id is 2 or 3 depending on the LSB of
|
|
the last byte and to a lesser extent on the second last byte if it is ASCII.
|
|
|
|
If the last byte is a UTF8 continuation byte, the second last byte can be:
|
|
- continuation byte: the next byte is probably ASCII or lead byte (assuming
|
|
4-byte UTF8 characters are rare) and the context id is 0 or 1.
|
|
- lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1
|
|
- lead byte (208 - 255): next byte is continuation byte, context is 2 or 3
|
|
|
|
The possible value combinations of the previous two bytes, the range of
|
|
context ids and the type of the next byte is summarized in the table below:
|
|
|
|
|--------\-----------------------------------------------------------------|
|
|
| \ Last byte |
|
|
| Second \---------------------------------------------------------------|
|
|
| last byte \ ASCII | cont. byte | lead byte |
|
|
| \ (0-127) | (128-191) | (192-) |
|
|
|=============|===================|=====================|==================|
|
|
| ASCII | next: ASCII/lead | not valid | next: cont. |
|
|
| (0-127) | context: 4 - 63 | | context: 2 - 3 |
|
|
|-------------|-------------------|---------------------|------------------|
|
|
| cont. byte | next: ASCII/lead | next: ASCII/lead | next: cont. |
|
|
| (128-191) | context: 4 - 63 | context: 0 - 1 | context: 2 - 3 |
|
|
|-------------|-------------------|---------------------|------------------|
|
|
| lead byte | not valid | next: ASCII/lead | not valid |
|
|
| (192-207) | | context: 0 - 1 | |
|
|
|-------------|-------------------|---------------------|------------------|
|
|
| lead byte | not valid | next: cont. | not valid |
|
|
| (208-) | | context: 2 - 3 | |
|
|
|-------------|-------------------|---------------------|------------------|
|
|
*/
|
|
const (
|
|
contextLSB6 = 0
|
|
contextMSB6 = 1
|
|
contextUTF8 = 2
|
|
contextSigned = 3
|
|
)
|
|
|
|
/* Common context lookup table for all context modes. */
|
|
var kContextLookup = [2048]byte{
|
|
/* CONTEXT_LSB6, last byte. */
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
16,
|
|
17,
|
|
18,
|
|
19,
|
|
20,
|
|
21,
|
|
22,
|
|
23,
|
|
24,
|
|
25,
|
|
26,
|
|
27,
|
|
28,
|
|
29,
|
|
30,
|
|
31,
|
|
32,
|
|
33,
|
|
34,
|
|
35,
|
|
36,
|
|
37,
|
|
38,
|
|
39,
|
|
40,
|
|
41,
|
|
42,
|
|
43,
|
|
44,
|
|
45,
|
|
46,
|
|
47,
|
|
48,
|
|
49,
|
|
50,
|
|
51,
|
|
52,
|
|
53,
|
|
54,
|
|
55,
|
|
56,
|
|
57,
|
|
58,
|
|
59,
|
|
60,
|
|
61,
|
|
62,
|
|
63,
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
16,
|
|
17,
|
|
18,
|
|
19,
|
|
20,
|
|
21,
|
|
22,
|
|
23,
|
|
24,
|
|
25,
|
|
26,
|
|
27,
|
|
28,
|
|
29,
|
|
30,
|
|
31,
|
|
32,
|
|
33,
|
|
34,
|
|
35,
|
|
36,
|
|
37,
|
|
38,
|
|
39,
|
|
40,
|
|
41,
|
|
42,
|
|
43,
|
|
44,
|
|
45,
|
|
46,
|
|
47,
|
|
48,
|
|
49,
|
|
50,
|
|
51,
|
|
52,
|
|
53,
|
|
54,
|
|
55,
|
|
56,
|
|
57,
|
|
58,
|
|
59,
|
|
60,
|
|
61,
|
|
62,
|
|
63,
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
16,
|
|
17,
|
|
18,
|
|
19,
|
|
20,
|
|
21,
|
|
22,
|
|
23,
|
|
24,
|
|
25,
|
|
26,
|
|
27,
|
|
28,
|
|
29,
|
|
30,
|
|
31,
|
|
32,
|
|
33,
|
|
34,
|
|
35,
|
|
36,
|
|
37,
|
|
38,
|
|
39,
|
|
40,
|
|
41,
|
|
42,
|
|
43,
|
|
44,
|
|
45,
|
|
46,
|
|
47,
|
|
48,
|
|
49,
|
|
50,
|
|
51,
|
|
52,
|
|
53,
|
|
54,
|
|
55,
|
|
56,
|
|
57,
|
|
58,
|
|
59,
|
|
60,
|
|
61,
|
|
62,
|
|
63,
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
16,
|
|
17,
|
|
18,
|
|
19,
|
|
20,
|
|
21,
|
|
22,
|
|
23,
|
|
24,
|
|
25,
|
|
26,
|
|
27,
|
|
28,
|
|
29,
|
|
30,
|
|
31,
|
|
32,
|
|
33,
|
|
34,
|
|
35,
|
|
36,
|
|
37,
|
|
38,
|
|
39,
|
|
40,
|
|
41,
|
|
42,
|
|
43,
|
|
44,
|
|
45,
|
|
46,
|
|
47,
|
|
48,
|
|
49,
|
|
50,
|
|
51,
|
|
52,
|
|
53,
|
|
54,
|
|
55,
|
|
56,
|
|
57,
|
|
58,
|
|
59,
|
|
60,
|
|
61,
|
|
62,
|
|
63,
|
|
|
|
/* CONTEXT_LSB6, second last byte, */
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
|
|
/* CONTEXT_MSB6, last byte. */
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
7,
|
|
7,
|
|
7,
|
|
7,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
9,
|
|
9,
|
|
9,
|
|
9,
|
|
10,
|
|
10,
|
|
10,
|
|
10,
|
|
11,
|
|
11,
|
|
11,
|
|
11,
|
|
12,
|
|
12,
|
|
12,
|
|
12,
|
|
13,
|
|
13,
|
|
13,
|
|
13,
|
|
14,
|
|
14,
|
|
14,
|
|
14,
|
|
15,
|
|
15,
|
|
15,
|
|
15,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
17,
|
|
17,
|
|
17,
|
|
17,
|
|
18,
|
|
18,
|
|
18,
|
|
18,
|
|
19,
|
|
19,
|
|
19,
|
|
19,
|
|
20,
|
|
20,
|
|
20,
|
|
20,
|
|
21,
|
|
21,
|
|
21,
|
|
21,
|
|
22,
|
|
22,
|
|
22,
|
|
22,
|
|
23,
|
|
23,
|
|
23,
|
|
23,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
25,
|
|
25,
|
|
25,
|
|
25,
|
|
26,
|
|
26,
|
|
26,
|
|
26,
|
|
27,
|
|
27,
|
|
27,
|
|
27,
|
|
28,
|
|
28,
|
|
28,
|
|
28,
|
|
29,
|
|
29,
|
|
29,
|
|
29,
|
|
30,
|
|
30,
|
|
30,
|
|
30,
|
|
31,
|
|
31,
|
|
31,
|
|
31,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
33,
|
|
33,
|
|
33,
|
|
33,
|
|
34,
|
|
34,
|
|
34,
|
|
34,
|
|
35,
|
|
35,
|
|
35,
|
|
35,
|
|
36,
|
|
36,
|
|
36,
|
|
36,
|
|
37,
|
|
37,
|
|
37,
|
|
37,
|
|
38,
|
|
38,
|
|
38,
|
|
38,
|
|
39,
|
|
39,
|
|
39,
|
|
39,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
41,
|
|
41,
|
|
41,
|
|
41,
|
|
42,
|
|
42,
|
|
42,
|
|
42,
|
|
43,
|
|
43,
|
|
43,
|
|
43,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
45,
|
|
45,
|
|
45,
|
|
45,
|
|
46,
|
|
46,
|
|
46,
|
|
46,
|
|
47,
|
|
47,
|
|
47,
|
|
47,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
49,
|
|
49,
|
|
49,
|
|
49,
|
|
50,
|
|
50,
|
|
50,
|
|
50,
|
|
51,
|
|
51,
|
|
51,
|
|
51,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
53,
|
|
53,
|
|
53,
|
|
53,
|
|
54,
|
|
54,
|
|
54,
|
|
54,
|
|
55,
|
|
55,
|
|
55,
|
|
55,
|
|
56,
|
|
56,
|
|
56,
|
|
56,
|
|
57,
|
|
57,
|
|
57,
|
|
57,
|
|
58,
|
|
58,
|
|
58,
|
|
58,
|
|
59,
|
|
59,
|
|
59,
|
|
59,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
61,
|
|
61,
|
|
61,
|
|
61,
|
|
62,
|
|
62,
|
|
62,
|
|
62,
|
|
63,
|
|
63,
|
|
63,
|
|
63,
|
|
|
|
/* CONTEXT_MSB6, second last byte, */
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
|
|
/* CONTEXT_UTF8, last byte. */
|
|
/* ASCII range. */
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
4,
|
|
4,
|
|
0,
|
|
0,
|
|
4,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
8,
|
|
12,
|
|
16,
|
|
12,
|
|
12,
|
|
20,
|
|
12,
|
|
16,
|
|
24,
|
|
28,
|
|
12,
|
|
12,
|
|
32,
|
|
12,
|
|
36,
|
|
12,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
32,
|
|
32,
|
|
24,
|
|
40,
|
|
28,
|
|
12,
|
|
12,
|
|
48,
|
|
52,
|
|
52,
|
|
52,
|
|
48,
|
|
52,
|
|
52,
|
|
52,
|
|
48,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
48,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
48,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
24,
|
|
12,
|
|
28,
|
|
12,
|
|
12,
|
|
12,
|
|
56,
|
|
60,
|
|
60,
|
|
60,
|
|
56,
|
|
60,
|
|
60,
|
|
60,
|
|
56,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
56,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
56,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
24,
|
|
12,
|
|
28,
|
|
12,
|
|
0,
|
|
|
|
/* UTF8 continuation byte range. */
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
|
|
/* UTF8 lead byte range. */
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
|
|
/* CONTEXT_UTF8 second last byte. */
|
|
/* ASCII range. */
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
0,
|
|
|
|
/* UTF8 continuation byte range. */
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
|
|
/* UTF8 lead byte range. */
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
|
|
/* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */
|
|
0,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
56,
|
|
|
|
/* CONTEXT_SIGNED, second last byte. */
|
|
0,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
7,
|
|
}
|
|
|
|
type contextLUT []byte
|
|
|
|
func getContextLUT(mode int) contextLUT {
|
|
return kContextLookup[mode<<9:]
|
|
}
|
|
|
|
func getContext(p1 byte, p2 byte, lut contextLUT) byte {
|
|
return lut[p1] | lut[256+int(p2)]
|
|
}
|