@loaders.gl/compression 3.3.0-alpha.5 → 3.3.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es5/brotli/decode.js +3 -423
- package/dist/es5/brotli/decode.js.map +1 -1
- package/dist/es5/bundle.js +0 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/compression-worker.js +3 -6
- package/dist/es5/compression-worker.js.map +1 -1
- package/dist/es5/index.js +16 -26
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/brotli-compression.js +2 -56
- package/dist/es5/lib/brotli-compression.js.map +1 -1
- package/dist/es5/lib/compression.js +15 -34
- package/dist/es5/lib/compression.js.map +1 -1
- package/dist/es5/lib/deflate-compression.js +40 -129
- package/dist/es5/lib/deflate-compression.js.map +1 -1
- package/dist/es5/lib/gzip-compression.js +4 -21
- package/dist/es5/lib/gzip-compression.js.map +1 -1
- package/dist/es5/lib/lz4-compression.js +10 -33
- package/dist/es5/lib/lz4-compression.js.map +1 -1
- package/dist/es5/lib/lzo-compression.js +0 -32
- package/dist/es5/lib/lzo-compression.js.map +1 -1
- package/dist/es5/lib/no-compression.js +4 -29
- package/dist/es5/lib/no-compression.js.map +1 -1
- package/dist/es5/lib/snappy-compression.js +0 -18
- package/dist/es5/lib/snappy-compression.js.map +1 -1
- package/dist/es5/lib/zstd-compression.js +0 -26
- package/dist/es5/lib/zstd-compression.js.map +1 -1
- package/dist/es5/types.js.map +1 -1
- package/dist/es5/workers/worker.js +6 -28
- package/dist/es5/workers/worker.js.map +1 -1
- package/dist/esm/brotli/decode.js +4 -422
- package/dist/esm/brotli/decode.js.map +1 -1
- package/dist/esm/bundle.js +1 -1
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/compression-worker.js +3 -1
- package/dist/esm/compression-worker.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/brotli-compression.js +6 -26
- package/dist/esm/lib/brotli-compression.js.map +1 -1
- package/dist/esm/lib/compression.js +1 -7
- package/dist/esm/lib/compression.js.map +1 -1
- package/dist/esm/lib/deflate-compression.js +7 -42
- package/dist/esm/lib/deflate-compression.js.map +1 -1
- package/dist/esm/lib/gzip-compression.js +5 -7
- package/dist/esm/lib/gzip-compression.js.map +1 -1
- package/dist/esm/lib/lz4-compression.js +3 -19
- package/dist/esm/lib/lz4-compression.js.map +1 -1
- package/dist/esm/lib/lzo-compression.js +5 -13
- package/dist/esm/lib/lzo-compression.js.map +1 -1
- package/dist/esm/lib/no-compression.js +2 -11
- package/dist/esm/lib/no-compression.js.map +1 -1
- package/dist/esm/lib/snappy-compression.js +2 -9
- package/dist/esm/lib/snappy-compression.js.map +1 -1
- package/dist/esm/lib/zstd-compression.js +3 -12
- package/dist/esm/lib/zstd-compression.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/workers/worker.js +8 -10
- package/dist/esm/workers/worker.js.map +1 -1
- package/package.json +4 -4
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.BrotliDecode = void 0;
|
|
7
|
+
|
|
7
8
|
var Options;
|
|
8
9
|
|
|
9
10
|
var makeBrotliDecode = function makeBrotliDecode() {
|
|
@@ -25,57 +26,45 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
25
26
|
{
|
|
26
27
|
unpackCommandLookupTable(CMD_LOOKUP);
|
|
27
28
|
}
|
|
28
|
-
|
|
29
29
|
function log2floor(i) {
|
|
30
30
|
var result = -1;
|
|
31
31
|
var step = 16;
|
|
32
|
-
|
|
33
32
|
while (step > 0) {
|
|
34
33
|
if (i >>> step != 0) {
|
|
35
34
|
result += step;
|
|
36
35
|
i = i >>> step;
|
|
37
36
|
}
|
|
38
|
-
|
|
39
37
|
step = step >> 1;
|
|
40
38
|
}
|
|
41
|
-
|
|
42
39
|
return result + i;
|
|
43
40
|
}
|
|
44
|
-
|
|
45
41
|
function calculateDistanceAlphabetSize(npostfix, ndirect, maxndistbits) {
|
|
46
42
|
return 16 + ndirect + 2 * (maxndistbits << npostfix);
|
|
47
43
|
}
|
|
48
|
-
|
|
49
44
|
function calculateDistanceAlphabetLimit(maxDistance, npostfix, ndirect) {
|
|
50
45
|
if (maxDistance < ndirect + (2 << npostfix)) {
|
|
51
46
|
throw 'maxDistance is too small';
|
|
52
47
|
}
|
|
53
|
-
|
|
54
48
|
var offset = (maxDistance - ndirect >> npostfix) + 4;
|
|
55
49
|
var ndistbits = log2floor(offset) - 1;
|
|
56
50
|
var group = ndistbits - 1 << 1 | offset >> ndistbits & 1;
|
|
57
51
|
return (group - 1 << npostfix) + (1 << npostfix) + ndirect + 16;
|
|
58
52
|
}
|
|
59
|
-
|
|
60
53
|
function unpackCommandLookupTable(cmdLookup) {
|
|
61
54
|
var insertLengthOffsets = new Int16Array(24);
|
|
62
55
|
var copyLengthOffsets = new Int16Array(24);
|
|
63
56
|
copyLengthOffsets[0] = 2;
|
|
64
|
-
|
|
65
57
|
for (var i = 0; i < 23; ++i) {
|
|
66
58
|
insertLengthOffsets[i + 1] = insertLengthOffsets[i] + (1 << INSERT_LENGTH_N_BITS[i]);
|
|
67
59
|
copyLengthOffsets[i + 1] = copyLengthOffsets[i] + (1 << COPY_LENGTH_N_BITS[i]);
|
|
68
60
|
}
|
|
69
|
-
|
|
70
61
|
for (var cmdCode = 0; cmdCode < 704; ++cmdCode) {
|
|
71
62
|
var rangeIdx = cmdCode >>> 6;
|
|
72
63
|
var distanceContextOffset = -4;
|
|
73
|
-
|
|
74
64
|
if (rangeIdx >= 2) {
|
|
75
65
|
rangeIdx -= 2;
|
|
76
66
|
distanceContextOffset = 0;
|
|
77
67
|
}
|
|
78
|
-
|
|
79
68
|
var insertCode = (0x29850 >>> rangeIdx * 2 & 0x3) << 3 | cmdCode >>> 3 & 7;
|
|
80
69
|
var copyCode = (0x26244 >>> rangeIdx * 2 & 0x3) << 3 | cmdCode & 7;
|
|
81
70
|
var copyLengthOffset = copyLengthOffsets[copyCode];
|
|
@@ -87,97 +76,74 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
87
76
|
cmdLookup[index + 3] = distanceContext;
|
|
88
77
|
}
|
|
89
78
|
}
|
|
90
|
-
|
|
91
79
|
function decodeWindowBits(s) {
|
|
92
80
|
var largeWindowEnabled = s.isLargeWindow;
|
|
93
81
|
s.isLargeWindow = 0;
|
|
94
|
-
|
|
95
82
|
if (s.bitOffset >= 16) {
|
|
96
83
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
97
84
|
s.bitOffset -= 16;
|
|
98
85
|
}
|
|
99
|
-
|
|
100
86
|
if (readFewBits(s, 1) == 0) {
|
|
101
87
|
return 16;
|
|
102
88
|
}
|
|
103
|
-
|
|
104
89
|
var n = readFewBits(s, 3);
|
|
105
|
-
|
|
106
90
|
if (n != 0) {
|
|
107
91
|
return 17 + n;
|
|
108
92
|
}
|
|
109
|
-
|
|
110
93
|
n = readFewBits(s, 3);
|
|
111
|
-
|
|
112
94
|
if (n != 0) {
|
|
113
95
|
if (n == 1) {
|
|
114
96
|
if (largeWindowEnabled == 0) {
|
|
115
97
|
return -1;
|
|
116
98
|
}
|
|
117
|
-
|
|
118
99
|
s.isLargeWindow = 1;
|
|
119
|
-
|
|
120
100
|
if (readFewBits(s, 1) == 1) {
|
|
121
101
|
return -1;
|
|
122
102
|
}
|
|
123
|
-
|
|
124
103
|
n = readFewBits(s, 6);
|
|
125
|
-
|
|
126
104
|
if (n < 10 || n > 30) {
|
|
127
105
|
return -1;
|
|
128
106
|
}
|
|
129
|
-
|
|
130
107
|
return n;
|
|
131
108
|
} else {
|
|
132
109
|
return 8 + n;
|
|
133
110
|
}
|
|
134
111
|
}
|
|
135
|
-
|
|
136
112
|
return 17;
|
|
137
113
|
}
|
|
138
|
-
|
|
139
114
|
function enableEagerOutput(s) {
|
|
140
115
|
if (s.runningState != 1) {
|
|
141
116
|
throw 'State MUST be freshly initialized';
|
|
142
117
|
}
|
|
143
|
-
|
|
144
118
|
s.isEager = 1;
|
|
145
119
|
}
|
|
146
|
-
|
|
147
120
|
function enableLargeWindow(s) {
|
|
148
121
|
if (s.runningState != 1) {
|
|
149
122
|
throw 'State MUST be freshly initialized';
|
|
150
123
|
}
|
|
151
|
-
|
|
152
124
|
s.isLargeWindow = 1;
|
|
153
125
|
}
|
|
154
|
-
|
|
155
126
|
function attachDictionaryChunk(s, data) {
|
|
156
127
|
if (s.runningState != 1) {
|
|
157
128
|
throw 'State MUST be freshly initialized';
|
|
158
129
|
}
|
|
159
|
-
|
|
160
130
|
if (s.cdNumChunks == 0) {
|
|
161
131
|
s.cdChunks = new Array(16);
|
|
162
132
|
s.cdChunkOffsets = new Int32Array(16);
|
|
163
133
|
s.cdBlockBits = -1;
|
|
164
134
|
}
|
|
165
|
-
|
|
166
135
|
if (s.cdNumChunks == 15) {
|
|
167
136
|
throw 'Too many dictionary chunks';
|
|
168
137
|
}
|
|
169
|
-
|
|
170
138
|
s.cdChunks[s.cdNumChunks] = data;
|
|
171
139
|
s.cdNumChunks++;
|
|
172
140
|
s.cdTotalSize += data.length;
|
|
173
141
|
s.cdChunkOffsets[s.cdNumChunks] = s.cdTotalSize;
|
|
174
142
|
}
|
|
175
|
-
|
|
176
143
|
function initState(s, input) {
|
|
177
144
|
if (s.runningState != 0) {
|
|
178
145
|
throw 'State MUST be uninitialized';
|
|
179
146
|
}
|
|
180
|
-
|
|
181
147
|
s.blockTrees = new Int32Array(3091);
|
|
182
148
|
s.blockTrees[0] = 7;
|
|
183
149
|
s.distRbIdx = 3;
|
|
@@ -188,85 +154,65 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
188
154
|
initBitReader(s);
|
|
189
155
|
s.runningState = 1;
|
|
190
156
|
}
|
|
191
|
-
|
|
192
157
|
function close(s) {
|
|
193
158
|
if (s.runningState == 0) {
|
|
194
159
|
throw 'State MUST be initialized';
|
|
195
160
|
}
|
|
196
|
-
|
|
197
161
|
if (s.runningState == 11) {
|
|
198
162
|
return;
|
|
199
163
|
}
|
|
200
|
-
|
|
201
164
|
s.runningState = 11;
|
|
202
|
-
|
|
203
165
|
if (s.input != null) {
|
|
204
166
|
closeInput(s.input);
|
|
205
167
|
s.input = null;
|
|
206
168
|
}
|
|
207
169
|
}
|
|
208
|
-
|
|
209
170
|
function decodeVarLenUnsignedByte(s) {
|
|
210
171
|
if (s.bitOffset >= 16) {
|
|
211
172
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
212
173
|
s.bitOffset -= 16;
|
|
213
174
|
}
|
|
214
|
-
|
|
215
175
|
if (readFewBits(s, 1) != 0) {
|
|
216
176
|
var n = readFewBits(s, 3);
|
|
217
|
-
|
|
218
177
|
if (n == 0) {
|
|
219
178
|
return 1;
|
|
220
179
|
} else {
|
|
221
180
|
return readFewBits(s, n) + (1 << n);
|
|
222
181
|
}
|
|
223
182
|
}
|
|
224
|
-
|
|
225
183
|
return 0;
|
|
226
184
|
}
|
|
227
|
-
|
|
228
185
|
function decodeMetaBlockLength(s) {
|
|
229
186
|
if (s.bitOffset >= 16) {
|
|
230
187
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
231
188
|
s.bitOffset -= 16;
|
|
232
189
|
}
|
|
233
|
-
|
|
234
190
|
s.inputEnd = readFewBits(s, 1);
|
|
235
191
|
s.metaBlockLength = 0;
|
|
236
192
|
s.isUncompressed = 0;
|
|
237
193
|
s.isMetadata = 0;
|
|
238
|
-
|
|
239
194
|
if (s.inputEnd != 0 && readFewBits(s, 1) != 0) {
|
|
240
195
|
return;
|
|
241
196
|
}
|
|
242
|
-
|
|
243
197
|
var sizeNibbles = readFewBits(s, 2) + 4;
|
|
244
|
-
|
|
245
198
|
if (sizeNibbles == 7) {
|
|
246
199
|
s.isMetadata = 1;
|
|
247
|
-
|
|
248
200
|
if (readFewBits(s, 1) != 0) {
|
|
249
201
|
throw 'Corrupted reserved bit';
|
|
250
202
|
}
|
|
251
|
-
|
|
252
203
|
var sizeBytes = readFewBits(s, 2);
|
|
253
|
-
|
|
254
204
|
if (sizeBytes == 0) {
|
|
255
205
|
return;
|
|
256
206
|
}
|
|
257
|
-
|
|
258
207
|
for (var i = 0; i < sizeBytes; i++) {
|
|
259
208
|
if (s.bitOffset >= 16) {
|
|
260
209
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
261
210
|
s.bitOffset -= 16;
|
|
262
211
|
}
|
|
263
|
-
|
|
264
212
|
var bits = readFewBits(s, 8);
|
|
265
|
-
|
|
266
213
|
if (bits == 0 && i + 1 == sizeBytes && sizeBytes > 1) {
|
|
267
214
|
throw 'Exuberant nibble';
|
|
268
215
|
}
|
|
269
|
-
|
|
270
216
|
s.metaBlockLength |= bits << i * 8;
|
|
271
217
|
}
|
|
272
218
|
} else {
|
|
@@ -275,87 +221,67 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
275
221
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
276
222
|
s.bitOffset -= 16;
|
|
277
223
|
}
|
|
278
|
-
|
|
279
224
|
var _bits = readFewBits(s, 4);
|
|
280
|
-
|
|
281
225
|
if (_bits == 0 && _i + 1 == sizeNibbles && sizeNibbles > 4) {
|
|
282
226
|
throw 'Exuberant nibble';
|
|
283
227
|
}
|
|
284
|
-
|
|
285
228
|
s.metaBlockLength |= _bits << _i * 4;
|
|
286
229
|
}
|
|
287
230
|
}
|
|
288
|
-
|
|
289
231
|
s.metaBlockLength++;
|
|
290
|
-
|
|
291
232
|
if (s.inputEnd == 0) {
|
|
292
233
|
s.isUncompressed = readFewBits(s, 1);
|
|
293
234
|
}
|
|
294
235
|
}
|
|
295
|
-
|
|
296
236
|
function readSymbol(tableGroup, tableIdx, s) {
|
|
297
237
|
var offset = tableGroup[tableIdx];
|
|
298
238
|
var val = s.accumulator32 >>> s.bitOffset;
|
|
299
239
|
offset += val & 0xff;
|
|
300
240
|
var bits = tableGroup[offset] >> 16;
|
|
301
241
|
var sym = tableGroup[offset] & 0xffff;
|
|
302
|
-
|
|
303
242
|
if (bits <= 8) {
|
|
304
243
|
s.bitOffset += bits;
|
|
305
244
|
return sym;
|
|
306
245
|
}
|
|
307
|
-
|
|
308
246
|
offset += sym;
|
|
309
247
|
var mask = (1 << bits) - 1;
|
|
310
248
|
offset += (val & mask) >>> 8;
|
|
311
249
|
s.bitOffset += (tableGroup[offset] >> 16) + 8;
|
|
312
250
|
return tableGroup[offset] & 0xffff;
|
|
313
251
|
}
|
|
314
|
-
|
|
315
252
|
function readBlockLength(tableGroup, tableIdx, s) {
|
|
316
253
|
if (s.bitOffset >= 16) {
|
|
317
254
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
318
255
|
s.bitOffset -= 16;
|
|
319
256
|
}
|
|
320
|
-
|
|
321
257
|
var code = readSymbol(tableGroup, tableIdx, s);
|
|
322
258
|
var n = BLOCK_LENGTH_N_BITS[code];
|
|
323
|
-
|
|
324
259
|
if (s.bitOffset >= 16) {
|
|
325
260
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
326
261
|
s.bitOffset -= 16;
|
|
327
262
|
}
|
|
328
|
-
|
|
329
263
|
return BLOCK_LENGTH_OFFSET[code] + (n <= 16 ? readFewBits(s, n) : readManyBits(s, n));
|
|
330
264
|
}
|
|
331
|
-
|
|
332
265
|
function moveToFront(v, index) {
|
|
333
266
|
var value = v[index];
|
|
334
|
-
|
|
335
267
|
for (; index > 0; index--) {
|
|
336
268
|
v[index] = v[index - 1];
|
|
337
269
|
}
|
|
338
|
-
|
|
339
270
|
v[0] = value;
|
|
340
271
|
}
|
|
341
|
-
|
|
342
272
|
function inverseMoveToFrontTransform(v, vLen) {
|
|
343
273
|
var mtf = new Int32Array(256);
|
|
344
|
-
|
|
345
274
|
for (var i = 0; i < 256; i++) {
|
|
346
275
|
mtf[i] = i;
|
|
347
276
|
}
|
|
348
|
-
|
|
349
277
|
for (var _i2 = 0; _i2 < vLen; _i2++) {
|
|
350
278
|
var index = v[_i2] & 0xff;
|
|
351
279
|
v[_i2] = mtf[index];
|
|
352
|
-
|
|
353
280
|
if (index != 0) {
|
|
354
281
|
moveToFront(mtf, index);
|
|
355
282
|
}
|
|
356
283
|
}
|
|
357
284
|
}
|
|
358
|
-
|
|
359
285
|
function readHuffmanCodeLengths(codeLengthCodeLengths, numSymbols, codeLengths, s) {
|
|
360
286
|
var symbol = 0;
|
|
361
287
|
var prevCodeLen = 8;
|
|
@@ -365,25 +291,20 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
365
291
|
var table = new Int32Array(32 + 1);
|
|
366
292
|
var tableIdx = table.length - 1;
|
|
367
293
|
buildHuffmanTable(table, tableIdx, 5, codeLengthCodeLengths, 18);
|
|
368
|
-
|
|
369
294
|
while (symbol < numSymbols && space > 0) {
|
|
370
295
|
if (s.halfOffset > 2030) {
|
|
371
296
|
doReadMoreInput(s);
|
|
372
297
|
}
|
|
373
|
-
|
|
374
298
|
if (s.bitOffset >= 16) {
|
|
375
299
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
376
300
|
s.bitOffset -= 16;
|
|
377
301
|
}
|
|
378
|
-
|
|
379
302
|
var p = s.accumulator32 >>> s.bitOffset & 31;
|
|
380
303
|
s.bitOffset += table[p] >> 16;
|
|
381
304
|
var codeLen = table[p] & 0xffff;
|
|
382
|
-
|
|
383
305
|
if (codeLen < 16) {
|
|
384
306
|
repeat = 0;
|
|
385
307
|
codeLengths[symbol++] = codeLen;
|
|
386
|
-
|
|
387
308
|
if (codeLen != 0) {
|
|
388
309
|
prevCodeLen = codeLen;
|
|
389
310
|
space -= 32768 >> codeLen;
|
|
@@ -391,52 +312,40 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
391
312
|
} else {
|
|
392
313
|
var extraBits = codeLen - 14;
|
|
393
314
|
var newLen = 0;
|
|
394
|
-
|
|
395
315
|
if (codeLen == 16) {
|
|
396
316
|
newLen = prevCodeLen;
|
|
397
317
|
}
|
|
398
|
-
|
|
399
318
|
if (repeatCodeLen != newLen) {
|
|
400
319
|
repeat = 0;
|
|
401
320
|
repeatCodeLen = newLen;
|
|
402
321
|
}
|
|
403
|
-
|
|
404
322
|
var oldRepeat = repeat;
|
|
405
|
-
|
|
406
323
|
if (repeat > 0) {
|
|
407
324
|
repeat -= 2;
|
|
408
325
|
repeat <<= extraBits;
|
|
409
326
|
}
|
|
410
|
-
|
|
411
327
|
if (s.bitOffset >= 16) {
|
|
412
328
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
413
329
|
s.bitOffset -= 16;
|
|
414
330
|
}
|
|
415
|
-
|
|
416
331
|
repeat += readFewBits(s, extraBits) + 3;
|
|
417
332
|
var repeatDelta = repeat - oldRepeat;
|
|
418
|
-
|
|
419
333
|
if (symbol + repeatDelta > numSymbols) {
|
|
420
334
|
throw 'symbol + repeatDelta > numSymbols';
|
|
421
335
|
}
|
|
422
|
-
|
|
423
336
|
for (var i = 0; i < repeatDelta; i++) {
|
|
424
337
|
codeLengths[symbol++] = repeatCodeLen;
|
|
425
338
|
}
|
|
426
|
-
|
|
427
339
|
if (repeatCodeLen != 0) {
|
|
428
340
|
space -= repeatDelta << 15 - repeatCodeLen;
|
|
429
341
|
}
|
|
430
342
|
}
|
|
431
343
|
}
|
|
432
|
-
|
|
433
344
|
if (space != 0) {
|
|
434
345
|
throw 'Unused space';
|
|
435
346
|
}
|
|
436
|
-
|
|
437
347
|
codeLengths.fill(0, symbol, numSymbols);
|
|
438
348
|
}
|
|
439
|
-
|
|
440
349
|
function checkDupes(symbols, length) {
|
|
441
350
|
for (var i = 0; i < length - 1; ++i) {
|
|
442
351
|
for (var j = i + 1; j < length; ++j) {
|
|
@@ -446,166 +355,130 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
446
355
|
}
|
|
447
356
|
}
|
|
448
357
|
}
|
|
449
|
-
|
|
450
358
|
function readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) {
|
|
451
359
|
var codeLengths = new Int32Array(alphabetSizeLimit);
|
|
452
360
|
var symbols = new Int32Array(4);
|
|
453
361
|
var maxBits = 1 + log2floor(alphabetSizeMax - 1);
|
|
454
362
|
var numSymbols = readFewBits(s, 2) + 1;
|
|
455
|
-
|
|
456
363
|
for (var i = 0; i < numSymbols; i++) {
|
|
457
364
|
if (s.bitOffset >= 16) {
|
|
458
365
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
459
366
|
s.bitOffset -= 16;
|
|
460
367
|
}
|
|
461
|
-
|
|
462
368
|
var symbol = readFewBits(s, maxBits);
|
|
463
|
-
|
|
464
369
|
if (symbol >= alphabetSizeLimit) {
|
|
465
370
|
throw "Can't readHuffmanCode";
|
|
466
371
|
}
|
|
467
|
-
|
|
468
372
|
symbols[i] = symbol;
|
|
469
373
|
}
|
|
470
|
-
|
|
471
374
|
checkDupes(symbols, numSymbols);
|
|
472
375
|
var histogramId = numSymbols;
|
|
473
|
-
|
|
474
376
|
if (numSymbols == 4) {
|
|
475
377
|
histogramId += readFewBits(s, 1);
|
|
476
378
|
}
|
|
477
|
-
|
|
478
379
|
switch (histogramId) {
|
|
479
380
|
case 1:
|
|
480
381
|
codeLengths[symbols[0]] = 1;
|
|
481
382
|
break;
|
|
482
|
-
|
|
483
383
|
case 2:
|
|
484
384
|
codeLengths[symbols[0]] = 1;
|
|
485
385
|
codeLengths[symbols[1]] = 1;
|
|
486
386
|
break;
|
|
487
|
-
|
|
488
387
|
case 3:
|
|
489
388
|
codeLengths[symbols[0]] = 1;
|
|
490
389
|
codeLengths[symbols[1]] = 2;
|
|
491
390
|
codeLengths[symbols[2]] = 2;
|
|
492
391
|
break;
|
|
493
|
-
|
|
494
392
|
case 4:
|
|
495
393
|
codeLengths[symbols[0]] = 2;
|
|
496
394
|
codeLengths[symbols[1]] = 2;
|
|
497
395
|
codeLengths[symbols[2]] = 2;
|
|
498
396
|
codeLengths[symbols[3]] = 2;
|
|
499
397
|
break;
|
|
500
|
-
|
|
501
398
|
case 5:
|
|
502
399
|
codeLengths[symbols[0]] = 1;
|
|
503
400
|
codeLengths[symbols[1]] = 2;
|
|
504
401
|
codeLengths[symbols[2]] = 3;
|
|
505
402
|
codeLengths[symbols[3]] = 3;
|
|
506
403
|
break;
|
|
507
|
-
|
|
508
404
|
default:
|
|
509
405
|
break;
|
|
510
406
|
}
|
|
511
|
-
|
|
512
407
|
return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit);
|
|
513
408
|
}
|
|
514
|
-
|
|
515
409
|
function readComplexHuffmanCode(alphabetSizeLimit, skip, tableGroup, tableIdx, s) {
|
|
516
410
|
var codeLengths = new Int32Array(alphabetSizeLimit);
|
|
517
411
|
var codeLengthCodeLengths = new Int32Array(18);
|
|
518
412
|
var space = 32;
|
|
519
413
|
var numCodes = 0;
|
|
520
|
-
|
|
521
414
|
for (var i = skip; i < 18 && space > 0; i++) {
|
|
522
415
|
var codeLenIdx = CODE_LENGTH_CODE_ORDER[i];
|
|
523
|
-
|
|
524
416
|
if (s.bitOffset >= 16) {
|
|
525
417
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
526
418
|
s.bitOffset -= 16;
|
|
527
419
|
}
|
|
528
|
-
|
|
529
420
|
var p = s.accumulator32 >>> s.bitOffset & 15;
|
|
530
421
|
s.bitOffset += FIXED_TABLE[p] >> 16;
|
|
531
422
|
var v = FIXED_TABLE[p] & 0xffff;
|
|
532
423
|
codeLengthCodeLengths[codeLenIdx] = v;
|
|
533
|
-
|
|
534
424
|
if (v != 0) {
|
|
535
425
|
space -= 32 >> v;
|
|
536
426
|
numCodes++;
|
|
537
427
|
}
|
|
538
428
|
}
|
|
539
|
-
|
|
540
429
|
if (space != 0 && numCodes != 1) {
|
|
541
430
|
throw 'Corrupted Huffman code histogram';
|
|
542
431
|
}
|
|
543
|
-
|
|
544
432
|
readHuffmanCodeLengths(codeLengthCodeLengths, alphabetSizeLimit, codeLengths, s);
|
|
545
433
|
return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit);
|
|
546
434
|
}
|
|
547
|
-
|
|
548
435
|
function readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) {
|
|
549
436
|
if (s.halfOffset > 2030) {
|
|
550
437
|
doReadMoreInput(s);
|
|
551
438
|
}
|
|
552
|
-
|
|
553
439
|
if (s.bitOffset >= 16) {
|
|
554
440
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
555
441
|
s.bitOffset -= 16;
|
|
556
442
|
}
|
|
557
|
-
|
|
558
443
|
var simpleCodeOrSkip = readFewBits(s, 2);
|
|
559
|
-
|
|
560
444
|
if (simpleCodeOrSkip == 1) {
|
|
561
445
|
return readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s);
|
|
562
446
|
} else {
|
|
563
447
|
return readComplexHuffmanCode(alphabetSizeLimit, simpleCodeOrSkip, tableGroup, tableIdx, s);
|
|
564
448
|
}
|
|
565
449
|
}
|
|
566
|
-
|
|
567
450
|
function decodeContextMap(contextMapSize, contextMap, s) {
|
|
568
451
|
if (s.halfOffset > 2030) {
|
|
569
452
|
doReadMoreInput(s);
|
|
570
453
|
}
|
|
571
|
-
|
|
572
454
|
var numTrees = decodeVarLenUnsignedByte(s) + 1;
|
|
573
|
-
|
|
574
455
|
if (numTrees == 1) {
|
|
575
456
|
contextMap.fill(0, 0, contextMapSize);
|
|
576
457
|
return numTrees;
|
|
577
458
|
}
|
|
578
|
-
|
|
579
459
|
if (s.bitOffset >= 16) {
|
|
580
460
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
581
461
|
s.bitOffset -= 16;
|
|
582
462
|
}
|
|
583
|
-
|
|
584
463
|
var useRleForZeros = readFewBits(s, 1);
|
|
585
464
|
var maxRunLengthPrefix = 0;
|
|
586
|
-
|
|
587
465
|
if (useRleForZeros != 0) {
|
|
588
466
|
maxRunLengthPrefix = readFewBits(s, 4) + 1;
|
|
589
467
|
}
|
|
590
|
-
|
|
591
468
|
var alphabetSize = numTrees + maxRunLengthPrefix;
|
|
592
469
|
var tableSize = MAX_HUFFMAN_TABLE_SIZE[alphabetSize + 31 >> 5];
|
|
593
470
|
var table = new Int32Array(tableSize + 1);
|
|
594
471
|
var tableIdx = table.length - 1;
|
|
595
472
|
readHuffmanCode(alphabetSize, alphabetSize, table, tableIdx, s);
|
|
596
|
-
|
|
597
473
|
for (var i = 0; i < contextMapSize;) {
|
|
598
474
|
if (s.halfOffset > 2030) {
|
|
599
475
|
doReadMoreInput(s);
|
|
600
476
|
}
|
|
601
|
-
|
|
602
477
|
if (s.bitOffset >= 16) {
|
|
603
478
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
604
479
|
s.bitOffset -= 16;
|
|
605
480
|
}
|
|
606
|
-
|
|
607
481
|
var code = readSymbol(table, tableIdx, s);
|
|
608
|
-
|
|
609
482
|
if (code == 0) {
|
|
610
483
|
contextMap[i] = 0;
|
|
611
484
|
i++;
|
|
@@ -614,14 +487,11 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
614
487
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
615
488
|
s.bitOffset -= 16;
|
|
616
489
|
}
|
|
617
|
-
|
|
618
490
|
var reps = (1 << code) + readFewBits(s, code);
|
|
619
|
-
|
|
620
491
|
while (reps != 0) {
|
|
621
492
|
if (i >= contextMapSize) {
|
|
622
493
|
throw 'Corrupted context map';
|
|
623
494
|
}
|
|
624
|
-
|
|
625
495
|
contextMap[i] = 0;
|
|
626
496
|
i++;
|
|
627
497
|
reps--;
|
|
@@ -631,31 +501,24 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
631
501
|
i++;
|
|
632
502
|
}
|
|
633
503
|
}
|
|
634
|
-
|
|
635
504
|
if (s.bitOffset >= 16) {
|
|
636
505
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
637
506
|
s.bitOffset -= 16;
|
|
638
507
|
}
|
|
639
|
-
|
|
640
508
|
if (readFewBits(s, 1) == 1) {
|
|
641
509
|
inverseMoveToFrontTransform(contextMap, contextMapSize);
|
|
642
510
|
}
|
|
643
|
-
|
|
644
511
|
return numTrees;
|
|
645
512
|
}
|
|
646
|
-
|
|
647
513
|
function decodeBlockTypeAndLength(s, treeType, numBlockTypes) {
|
|
648
514
|
var ringBuffers = s.rings;
|
|
649
515
|
var offset = 4 + treeType * 2;
|
|
650
|
-
|
|
651
516
|
if (s.bitOffset >= 16) {
|
|
652
517
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
653
518
|
s.bitOffset -= 16;
|
|
654
519
|
}
|
|
655
|
-
|
|
656
520
|
var blockType = readSymbol(s.blockTrees, 2 * treeType, s);
|
|
657
521
|
var result = readBlockLength(s.blockTrees, 2 * treeType + 1, s);
|
|
658
|
-
|
|
659
522
|
if (blockType == 1) {
|
|
660
523
|
blockType = ringBuffers[offset + 1] + 1;
|
|
661
524
|
} else if (blockType == 0) {
|
|
@@ -663,16 +526,13 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
663
526
|
} else {
|
|
664
527
|
blockType -= 2;
|
|
665
528
|
}
|
|
666
|
-
|
|
667
529
|
if (blockType >= numBlockTypes) {
|
|
668
530
|
blockType -= numBlockTypes;
|
|
669
531
|
}
|
|
670
|
-
|
|
671
532
|
ringBuffers[offset] = ringBuffers[offset + 1];
|
|
672
533
|
ringBuffers[offset + 1] = blockType;
|
|
673
534
|
return result;
|
|
674
535
|
}
|
|
675
|
-
|
|
676
536
|
function decodeLiteralBlockSwitch(s) {
|
|
677
537
|
s.literalBlockLength = decodeBlockTypeAndLength(s, 0, s.numLiteralBlockTypes);
|
|
678
538
|
var literalBlockType = s.rings[5];
|
|
@@ -682,99 +542,76 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
682
542
|
s.contextLookupOffset1 = contextMode << 9;
|
|
683
543
|
s.contextLookupOffset2 = s.contextLookupOffset1 + 256;
|
|
684
544
|
}
|
|
685
|
-
|
|
686
545
|
function decodeCommandBlockSwitch(s) {
|
|
687
546
|
s.commandBlockLength = decodeBlockTypeAndLength(s, 1, s.numCommandBlockTypes);
|
|
688
547
|
s.commandTreeIdx = s.rings[7];
|
|
689
548
|
}
|
|
690
|
-
|
|
691
549
|
function decodeDistanceBlockSwitch(s) {
|
|
692
550
|
s.distanceBlockLength = decodeBlockTypeAndLength(s, 2, s.numDistanceBlockTypes);
|
|
693
551
|
s.distContextMapSlice = s.rings[9] << 2;
|
|
694
552
|
}
|
|
695
|
-
|
|
696
553
|
function maybeReallocateRingBuffer(s) {
|
|
697
554
|
var newSize = s.maxRingBufferSize;
|
|
698
|
-
|
|
699
555
|
if (newSize > s.expectedTotalSize) {
|
|
700
556
|
var minimalNewSize = s.expectedTotalSize;
|
|
701
|
-
|
|
702
557
|
while (newSize >> 1 > minimalNewSize) {
|
|
703
558
|
newSize >>= 1;
|
|
704
559
|
}
|
|
705
|
-
|
|
706
560
|
if (s.inputEnd == 0 && newSize < 16384 && s.maxRingBufferSize >= 16384) {
|
|
707
561
|
newSize = 16384;
|
|
708
562
|
}
|
|
709
563
|
}
|
|
710
|
-
|
|
711
564
|
if (newSize <= s.ringBufferSize) {
|
|
712
565
|
return;
|
|
713
566
|
}
|
|
714
|
-
|
|
715
567
|
var ringBufferSizeWithSlack = newSize + 37;
|
|
716
568
|
var newBuffer = new Int8Array(ringBufferSizeWithSlack);
|
|
717
|
-
|
|
718
569
|
if (s.ringBuffer.length != 0) {
|
|
719
570
|
newBuffer.set(s.ringBuffer.subarray(0, 0 + s.ringBufferSize), 0);
|
|
720
571
|
}
|
|
721
|
-
|
|
722
572
|
s.ringBuffer = newBuffer;
|
|
723
573
|
s.ringBufferSize = newSize;
|
|
724
574
|
}
|
|
725
|
-
|
|
726
575
|
function readNextMetablockHeader(s) {
|
|
727
576
|
if (s.inputEnd != 0) {
|
|
728
577
|
s.nextRunningState = 10;
|
|
729
578
|
s.runningState = 12;
|
|
730
579
|
return;
|
|
731
580
|
}
|
|
732
|
-
|
|
733
581
|
s.literalTreeGroup = new Int32Array(0);
|
|
734
582
|
s.commandTreeGroup = new Int32Array(0);
|
|
735
583
|
s.distanceTreeGroup = new Int32Array(0);
|
|
736
|
-
|
|
737
584
|
if (s.halfOffset > 2030) {
|
|
738
585
|
doReadMoreInput(s);
|
|
739
586
|
}
|
|
740
|
-
|
|
741
587
|
decodeMetaBlockLength(s);
|
|
742
|
-
|
|
743
588
|
if (s.metaBlockLength == 0 && s.isMetadata == 0) {
|
|
744
589
|
return;
|
|
745
590
|
}
|
|
746
|
-
|
|
747
591
|
if (s.isUncompressed != 0 || s.isMetadata != 0) {
|
|
748
592
|
jumpToByteBoundary(s);
|
|
749
593
|
s.runningState = s.isMetadata != 0 ? 5 : 6;
|
|
750
594
|
} else {
|
|
751
595
|
s.runningState = 3;
|
|
752
596
|
}
|
|
753
|
-
|
|
754
597
|
if (s.isMetadata != 0) {
|
|
755
598
|
return;
|
|
756
599
|
}
|
|
757
|
-
|
|
758
600
|
s.expectedTotalSize += s.metaBlockLength;
|
|
759
|
-
|
|
760
601
|
if (s.expectedTotalSize > 1 << 30) {
|
|
761
602
|
s.expectedTotalSize = 1 << 30;
|
|
762
603
|
}
|
|
763
|
-
|
|
764
604
|
if (s.ringBufferSize < s.maxRingBufferSize) {
|
|
765
605
|
maybeReallocateRingBuffer(s);
|
|
766
606
|
}
|
|
767
607
|
}
|
|
768
|
-
|
|
769
608
|
function readMetablockPartition(s, treeType, numBlockTypes) {
|
|
770
609
|
var offset = s.blockTrees[2 * treeType];
|
|
771
|
-
|
|
772
610
|
if (numBlockTypes <= 1) {
|
|
773
611
|
s.blockTrees[2 * treeType + 1] = offset;
|
|
774
612
|
s.blockTrees[2 * treeType + 2] = offset;
|
|
775
613
|
return 1 << 28;
|
|
776
614
|
}
|
|
777
|
-
|
|
778
615
|
var blockTypeAlphabetSize = numBlockTypes + 2;
|
|
779
616
|
offset += readHuffmanCode(blockTypeAlphabetSize, blockTypeAlphabetSize, s.blockTrees, 2 * treeType, s);
|
|
780
617
|
s.blockTrees[2 * treeType + 1] = offset;
|
|
@@ -783,7 +620,6 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
783
620
|
s.blockTrees[2 * treeType + 2] = offset;
|
|
784
621
|
return readBlockLength(s.blockTrees, 2 * treeType + 1, s);
|
|
785
622
|
}
|
|
786
|
-
|
|
787
623
|
function calculateDistanceLut(s, alphabetSizeLimit) {
|
|
788
624
|
var distExtraBits = s.distExtraBits;
|
|
789
625
|
var distOffset = s.distOffset;
|
|
@@ -793,27 +629,22 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
793
629
|
var bits = 1;
|
|
794
630
|
var half = 0;
|
|
795
631
|
var i = 16;
|
|
796
|
-
|
|
797
632
|
for (var j = 0; j < ndirect; ++j) {
|
|
798
633
|
distExtraBits[i] = 0;
|
|
799
634
|
distOffset[i] = j + 1;
|
|
800
635
|
++i;
|
|
801
636
|
}
|
|
802
|
-
|
|
803
637
|
while (i < alphabetSizeLimit) {
|
|
804
638
|
var base = ndirect + ((2 + half << bits) - 4 << npostfix) + 1;
|
|
805
|
-
|
|
806
639
|
for (var _j = 0; _j < postfix; ++_j) {
|
|
807
640
|
distExtraBits[i] = bits;
|
|
808
641
|
distOffset[i] = base + _j;
|
|
809
642
|
++i;
|
|
810
643
|
}
|
|
811
|
-
|
|
812
644
|
bits = bits + half;
|
|
813
645
|
half = half ^ 1;
|
|
814
646
|
}
|
|
815
647
|
}
|
|
816
|
-
|
|
817
648
|
function readMetablockHuffmanCodesAndContextMaps(s) {
|
|
818
649
|
s.numLiteralBlockTypes = decodeVarLenUnsignedByte(s) + 1;
|
|
819
650
|
s.literalBlockLength = readMetablockPartition(s, 0, s.numLiteralBlockTypes);
|
|
@@ -821,60 +652,48 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
821
652
|
s.commandBlockLength = readMetablockPartition(s, 1, s.numCommandBlockTypes);
|
|
822
653
|
s.numDistanceBlockTypes = decodeVarLenUnsignedByte(s) + 1;
|
|
823
654
|
s.distanceBlockLength = readMetablockPartition(s, 2, s.numDistanceBlockTypes);
|
|
824
|
-
|
|
825
655
|
if (s.halfOffset > 2030) {
|
|
826
656
|
doReadMoreInput(s);
|
|
827
657
|
}
|
|
828
|
-
|
|
829
658
|
if (s.bitOffset >= 16) {
|
|
830
659
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
831
660
|
s.bitOffset -= 16;
|
|
832
661
|
}
|
|
833
|
-
|
|
834
662
|
s.distancePostfixBits = readFewBits(s, 2);
|
|
835
663
|
s.numDirectDistanceCodes = readFewBits(s, 4) << s.distancePostfixBits;
|
|
836
664
|
s.contextModes = new Int8Array(s.numLiteralBlockTypes);
|
|
837
|
-
|
|
838
665
|
for (var i = 0; i < s.numLiteralBlockTypes;) {
|
|
839
666
|
var limit = min(i + 96, s.numLiteralBlockTypes);
|
|
840
|
-
|
|
841
667
|
for (; i < limit; ++i) {
|
|
842
668
|
if (s.bitOffset >= 16) {
|
|
843
669
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
844
670
|
s.bitOffset -= 16;
|
|
845
671
|
}
|
|
846
|
-
|
|
847
672
|
s.contextModes[i] = readFewBits(s, 2);
|
|
848
673
|
}
|
|
849
|
-
|
|
850
674
|
if (s.halfOffset > 2030) {
|
|
851
675
|
doReadMoreInput(s);
|
|
852
676
|
}
|
|
853
677
|
}
|
|
854
|
-
|
|
855
678
|
s.contextMap = new Int8Array(s.numLiteralBlockTypes << 6);
|
|
856
679
|
var numLiteralTrees = decodeContextMap(s.numLiteralBlockTypes << 6, s.contextMap, s);
|
|
857
680
|
s.trivialLiteralContext = 1;
|
|
858
|
-
|
|
859
681
|
for (var j = 0; j < s.numLiteralBlockTypes << 6; j++) {
|
|
860
682
|
if (s.contextMap[j] != j >> 6) {
|
|
861
683
|
s.trivialLiteralContext = 0;
|
|
862
684
|
break;
|
|
863
685
|
}
|
|
864
686
|
}
|
|
865
|
-
|
|
866
687
|
s.distContextMap = new Int8Array(s.numDistanceBlockTypes << 2);
|
|
867
688
|
var numDistTrees = decodeContextMap(s.numDistanceBlockTypes << 2, s.distContextMap, s);
|
|
868
689
|
s.literalTreeGroup = decodeHuffmanTreeGroup(256, 256, numLiteralTrees, s);
|
|
869
690
|
s.commandTreeGroup = decodeHuffmanTreeGroup(704, 704, s.numCommandBlockTypes, s);
|
|
870
691
|
var distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 24);
|
|
871
692
|
var distanceAlphabetSizeLimit = distanceAlphabetSizeMax;
|
|
872
|
-
|
|
873
693
|
if (s.isLargeWindow == 1) {
|
|
874
694
|
distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 62);
|
|
875
695
|
distanceAlphabetSizeLimit = calculateDistanceAlphabetLimit(0x7ffffffc, s.distancePostfixBits, s.numDirectDistanceCodes);
|
|
876
696
|
}
|
|
877
|
-
|
|
878
697
|
s.distanceTreeGroup = decodeHuffmanTreeGroup(distanceAlphabetSizeMax, distanceAlphabetSizeLimit, numDistTrees, s);
|
|
879
698
|
calculateDistanceLut(s, distanceAlphabetSizeLimit);
|
|
880
699
|
s.contextMapSlice = 0;
|
|
@@ -890,157 +709,122 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
890
709
|
s.rings[8] = 1;
|
|
891
710
|
s.rings[9] = 0;
|
|
892
711
|
}
|
|
893
|
-
|
|
894
712
|
function copyUncompressedData(s) {
|
|
895
713
|
var ringBuffer = s.ringBuffer;
|
|
896
|
-
|
|
897
714
|
if (s.metaBlockLength <= 0) {
|
|
898
715
|
reload(s);
|
|
899
716
|
s.runningState = 2;
|
|
900
717
|
return;
|
|
901
718
|
}
|
|
902
|
-
|
|
903
719
|
var chunkLength = min(s.ringBufferSize - s.pos, s.metaBlockLength);
|
|
904
720
|
copyRawBytes(s, ringBuffer, s.pos, chunkLength);
|
|
905
721
|
s.metaBlockLength -= chunkLength;
|
|
906
722
|
s.pos += chunkLength;
|
|
907
|
-
|
|
908
723
|
if (s.pos == s.ringBufferSize) {
|
|
909
724
|
s.nextRunningState = 6;
|
|
910
725
|
s.runningState = 12;
|
|
911
726
|
return;
|
|
912
727
|
}
|
|
913
|
-
|
|
914
728
|
reload(s);
|
|
915
729
|
s.runningState = 2;
|
|
916
730
|
}
|
|
917
|
-
|
|
918
731
|
function writeRingBuffer(s) {
|
|
919
732
|
var toWrite = min(s.outputLength - s.outputUsed, s.ringBufferBytesReady - s.ringBufferBytesWritten);
|
|
920
|
-
|
|
921
733
|
if (toWrite != 0) {
|
|
922
734
|
s.output.set(s.ringBuffer.subarray(s.ringBufferBytesWritten, s.ringBufferBytesWritten + toWrite), s.outputOffset + s.outputUsed);
|
|
923
735
|
s.outputUsed += toWrite;
|
|
924
736
|
s.ringBufferBytesWritten += toWrite;
|
|
925
737
|
}
|
|
926
|
-
|
|
927
738
|
if (s.outputUsed < s.outputLength) {
|
|
928
739
|
return 1;
|
|
929
740
|
} else {
|
|
930
741
|
return 0;
|
|
931
742
|
}
|
|
932
743
|
}
|
|
933
|
-
|
|
934
744
|
function decodeHuffmanTreeGroup(alphabetSizeMax, alphabetSizeLimit, n, s) {
|
|
935
745
|
var maxTableSize = MAX_HUFFMAN_TABLE_SIZE[alphabetSizeLimit + 31 >> 5];
|
|
936
746
|
var group = new Int32Array(n + n * maxTableSize);
|
|
937
747
|
var next = n;
|
|
938
|
-
|
|
939
748
|
for (var i = 0; i < n; ++i) {
|
|
940
749
|
group[i] = next;
|
|
941
750
|
next += readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, group, i, s);
|
|
942
751
|
}
|
|
943
|
-
|
|
944
752
|
return group;
|
|
945
753
|
}
|
|
946
|
-
|
|
947
754
|
function calculateFence(s) {
|
|
948
755
|
var result = s.ringBufferSize;
|
|
949
|
-
|
|
950
756
|
if (s.isEager != 0) {
|
|
951
757
|
result = min(result, s.ringBufferBytesWritten + s.outputLength - s.outputUsed);
|
|
952
758
|
}
|
|
953
|
-
|
|
954
759
|
return result;
|
|
955
760
|
}
|
|
956
|
-
|
|
957
761
|
function doUseDictionary(s, fence) {
|
|
958
762
|
if (s.distance > 0x7ffffffc) {
|
|
959
763
|
throw 'Invalid backward reference';
|
|
960
764
|
}
|
|
961
|
-
|
|
962
765
|
var address = s.distance - s.maxDistance - 1 - s.cdTotalSize;
|
|
963
|
-
|
|
964
766
|
if (address < 0) {
|
|
965
767
|
initializeCompoundDictionaryCopy(s, -address - 1, s.copyLength);
|
|
966
768
|
s.runningState = 14;
|
|
967
769
|
} else {
|
|
968
770
|
var dictionaryData = data;
|
|
969
771
|
var wordLength = s.copyLength;
|
|
970
|
-
|
|
971
772
|
if (wordLength > 31) {
|
|
972
773
|
throw 'Invalid backward reference';
|
|
973
774
|
}
|
|
974
|
-
|
|
975
775
|
var shift = sizeBits[wordLength];
|
|
976
|
-
|
|
977
776
|
if (shift == 0) {
|
|
978
777
|
throw 'Invalid backward reference';
|
|
979
778
|
}
|
|
980
|
-
|
|
981
779
|
var offset = offsets[wordLength];
|
|
982
780
|
var mask = (1 << shift) - 1;
|
|
983
781
|
var wordIdx = address & mask;
|
|
984
782
|
var transformIdx = address >>> shift;
|
|
985
783
|
offset += wordIdx * wordLength;
|
|
986
784
|
var transforms = RFC_TRANSFORMS;
|
|
987
|
-
|
|
988
785
|
if (transformIdx >= transforms.numTransforms) {
|
|
989
786
|
throw 'Invalid backward reference';
|
|
990
787
|
}
|
|
991
|
-
|
|
992
788
|
var len = transformDictionaryWord(s.ringBuffer, s.pos, dictionaryData, offset, wordLength, transforms, transformIdx);
|
|
993
789
|
s.pos += len;
|
|
994
790
|
s.metaBlockLength -= len;
|
|
995
|
-
|
|
996
791
|
if (s.pos >= fence) {
|
|
997
792
|
s.nextRunningState = 4;
|
|
998
793
|
s.runningState = 12;
|
|
999
794
|
return;
|
|
1000
795
|
}
|
|
1001
|
-
|
|
1002
796
|
s.runningState = 4;
|
|
1003
797
|
}
|
|
1004
798
|
}
|
|
1005
|
-
|
|
1006
799
|
function initializeCompoundDictionary(s) {
|
|
1007
800
|
s.cdBlockMap = new Int8Array(256);
|
|
1008
801
|
var blockBits = 8;
|
|
1009
|
-
|
|
1010
802
|
while (s.cdTotalSize - 1 >>> blockBits != 0) {
|
|
1011
803
|
blockBits++;
|
|
1012
804
|
}
|
|
1013
|
-
|
|
1014
805
|
blockBits -= 8;
|
|
1015
806
|
s.cdBlockBits = blockBits;
|
|
1016
807
|
var cursor = 0;
|
|
1017
808
|
var index = 0;
|
|
1018
|
-
|
|
1019
809
|
while (cursor < s.cdTotalSize) {
|
|
1020
810
|
while (s.cdChunkOffsets[index + 1] < cursor) {
|
|
1021
811
|
index++;
|
|
1022
812
|
}
|
|
1023
|
-
|
|
1024
813
|
s.cdBlockMap[cursor >>> blockBits] = index;
|
|
1025
814
|
cursor += 1 << blockBits;
|
|
1026
815
|
}
|
|
1027
816
|
}
|
|
1028
|
-
|
|
1029
817
|
function initializeCompoundDictionaryCopy(s, address, length) {
|
|
1030
818
|
if (s.cdBlockBits == -1) {
|
|
1031
819
|
initializeCompoundDictionary(s);
|
|
1032
820
|
}
|
|
1033
|
-
|
|
1034
821
|
var index = s.cdBlockMap[address >>> s.cdBlockBits];
|
|
1035
|
-
|
|
1036
822
|
while (address >= s.cdChunkOffsets[index + 1]) {
|
|
1037
823
|
index++;
|
|
1038
824
|
}
|
|
1039
|
-
|
|
1040
825
|
if (s.cdTotalSize > address + length) {
|
|
1041
826
|
throw 'Invalid backward reference';
|
|
1042
827
|
}
|
|
1043
|
-
|
|
1044
828
|
s.distRbIdx = s.distRbIdx + 1 & 0x3;
|
|
1045
829
|
s.rings[s.distRbIdx] = s.distance;
|
|
1046
830
|
s.metaBlockLength -= length;
|
|
@@ -1049,152 +833,119 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1049
833
|
s.cdBrLength = length;
|
|
1050
834
|
s.cdBrCopied = 0;
|
|
1051
835
|
}
|
|
1052
|
-
|
|
1053
836
|
function copyFromCompoundDictionary(s, fence) {
|
|
1054
837
|
var pos = s.pos;
|
|
1055
838
|
var origPos = pos;
|
|
1056
|
-
|
|
1057
839
|
while (s.cdBrLength != s.cdBrCopied) {
|
|
1058
840
|
var space = fence - pos;
|
|
1059
841
|
var chunkLength = s.cdChunkOffsets[s.cdBrIndex + 1] - s.cdChunkOffsets[s.cdBrIndex];
|
|
1060
842
|
var remChunkLength = chunkLength - s.cdBrOffset;
|
|
1061
843
|
var length = s.cdBrLength - s.cdBrCopied;
|
|
1062
|
-
|
|
1063
844
|
if (length > remChunkLength) {
|
|
1064
845
|
length = remChunkLength;
|
|
1065
846
|
}
|
|
1066
|
-
|
|
1067
847
|
if (length > space) {
|
|
1068
848
|
length = space;
|
|
1069
849
|
}
|
|
1070
|
-
|
|
1071
850
|
copyBytes(s.ringBuffer, pos, s.cdChunks[s.cdBrIndex], s.cdBrOffset, s.cdBrOffset + length);
|
|
1072
851
|
pos += length;
|
|
1073
852
|
s.cdBrOffset += length;
|
|
1074
853
|
s.cdBrCopied += length;
|
|
1075
|
-
|
|
1076
854
|
if (length == remChunkLength) {
|
|
1077
855
|
s.cdBrIndex++;
|
|
1078
856
|
s.cdBrOffset = 0;
|
|
1079
857
|
}
|
|
1080
|
-
|
|
1081
858
|
if (pos >= fence) {
|
|
1082
859
|
break;
|
|
1083
860
|
}
|
|
1084
861
|
}
|
|
1085
|
-
|
|
1086
862
|
return pos - origPos;
|
|
1087
863
|
}
|
|
1088
|
-
|
|
1089
864
|
function decompress(s) {
|
|
1090
865
|
if (s.runningState == 0) {
|
|
1091
866
|
throw "Can't decompress until initialized";
|
|
1092
867
|
}
|
|
1093
|
-
|
|
1094
868
|
if (s.runningState == 11) {
|
|
1095
869
|
throw "Can't decompress after close";
|
|
1096
870
|
}
|
|
1097
|
-
|
|
1098
871
|
if (s.runningState == 1) {
|
|
1099
872
|
var windowBits = decodeWindowBits(s);
|
|
1100
|
-
|
|
1101
873
|
if (windowBits == -1) {
|
|
1102
874
|
throw "Invalid 'windowBits' code";
|
|
1103
875
|
}
|
|
1104
|
-
|
|
1105
876
|
s.maxRingBufferSize = 1 << windowBits;
|
|
1106
877
|
s.maxBackwardDistance = s.maxRingBufferSize - 16;
|
|
1107
878
|
s.runningState = 2;
|
|
1108
879
|
}
|
|
1109
|
-
|
|
1110
880
|
var fence = calculateFence(s);
|
|
1111
881
|
var ringBufferMask = s.ringBufferSize - 1;
|
|
1112
882
|
var ringBuffer = s.ringBuffer;
|
|
1113
|
-
|
|
1114
883
|
while (s.runningState != 10) {
|
|
1115
884
|
switch (s.runningState) {
|
|
1116
885
|
case 2:
|
|
1117
886
|
if (s.metaBlockLength < 0) {
|
|
1118
887
|
throw 'Invalid metablock length';
|
|
1119
888
|
}
|
|
1120
|
-
|
|
1121
889
|
readNextMetablockHeader(s);
|
|
1122
890
|
fence = calculateFence(s);
|
|
1123
891
|
ringBufferMask = s.ringBufferSize - 1;
|
|
1124
892
|
ringBuffer = s.ringBuffer;
|
|
1125
893
|
continue;
|
|
1126
|
-
|
|
1127
894
|
case 3:
|
|
1128
895
|
readMetablockHuffmanCodesAndContextMaps(s);
|
|
1129
896
|
s.runningState = 4;
|
|
1130
|
-
|
|
1131
897
|
case 4:
|
|
1132
898
|
if (s.metaBlockLength <= 0) {
|
|
1133
899
|
s.runningState = 2;
|
|
1134
900
|
continue;
|
|
1135
901
|
}
|
|
1136
|
-
|
|
1137
902
|
if (s.halfOffset > 2030) {
|
|
1138
903
|
doReadMoreInput(s);
|
|
1139
904
|
}
|
|
1140
|
-
|
|
1141
905
|
if (s.commandBlockLength == 0) {
|
|
1142
906
|
decodeCommandBlockSwitch(s);
|
|
1143
907
|
}
|
|
1144
|
-
|
|
1145
908
|
s.commandBlockLength--;
|
|
1146
|
-
|
|
1147
909
|
if (s.bitOffset >= 16) {
|
|
1148
910
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1149
911
|
s.bitOffset -= 16;
|
|
1150
912
|
}
|
|
1151
|
-
|
|
1152
913
|
var cmdCode = readSymbol(s.commandTreeGroup, s.commandTreeIdx, s) << 2;
|
|
1153
914
|
var insertAndCopyExtraBits = CMD_LOOKUP[cmdCode];
|
|
1154
915
|
var insertLengthOffset = CMD_LOOKUP[cmdCode + 1];
|
|
1155
916
|
var copyLengthOffset = CMD_LOOKUP[cmdCode + 2];
|
|
1156
917
|
s.distanceCode = CMD_LOOKUP[cmdCode + 3];
|
|
1157
|
-
|
|
1158
918
|
if (s.bitOffset >= 16) {
|
|
1159
919
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1160
920
|
s.bitOffset -= 16;
|
|
1161
921
|
}
|
|
1162
|
-
|
|
1163
922
|
var insertLengthExtraBits = insertAndCopyExtraBits & 0xff;
|
|
1164
923
|
s.insertLength = insertLengthOffset + (insertLengthExtraBits <= 16 ? readFewBits(s, insertLengthExtraBits) : readManyBits(s, insertLengthExtraBits));
|
|
1165
|
-
|
|
1166
924
|
if (s.bitOffset >= 16) {
|
|
1167
925
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1168
926
|
s.bitOffset -= 16;
|
|
1169
927
|
}
|
|
1170
|
-
|
|
1171
928
|
var copyLengthExtraBits = insertAndCopyExtraBits >> 8;
|
|
1172
929
|
s.copyLength = copyLengthOffset + (copyLengthExtraBits <= 16 ? readFewBits(s, copyLengthExtraBits) : readManyBits(s, copyLengthExtraBits));
|
|
1173
930
|
s.j = 0;
|
|
1174
931
|
s.runningState = 7;
|
|
1175
|
-
|
|
1176
932
|
case 7:
|
|
1177
933
|
if (s.trivialLiteralContext != 0) {
|
|
1178
934
|
while (s.j < s.insertLength) {
|
|
1179
935
|
if (s.halfOffset > 2030) {
|
|
1180
936
|
doReadMoreInput(s);
|
|
1181
937
|
}
|
|
1182
|
-
|
|
1183
938
|
if (s.literalBlockLength == 0) {
|
|
1184
939
|
decodeLiteralBlockSwitch(s);
|
|
1185
940
|
}
|
|
1186
|
-
|
|
1187
941
|
s.literalBlockLength--;
|
|
1188
|
-
|
|
1189
942
|
if (s.bitOffset >= 16) {
|
|
1190
943
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1191
944
|
s.bitOffset -= 16;
|
|
1192
945
|
}
|
|
1193
|
-
|
|
1194
946
|
ringBuffer[s.pos] = readSymbol(s.literalTreeGroup, s.literalTreeIdx, s);
|
|
1195
947
|
s.pos++;
|
|
1196
948
|
s.j++;
|
|
1197
|
-
|
|
1198
949
|
if (s.pos >= fence) {
|
|
1199
950
|
s.nextRunningState = 7;
|
|
1200
951
|
s.runningState = 12;
|
|
@@ -1204,31 +955,25 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1204
955
|
} else {
|
|
1205
956
|
var prevByte1 = ringBuffer[s.pos - 1 & ringBufferMask] & 0xff;
|
|
1206
957
|
var prevByte2 = ringBuffer[s.pos - 2 & ringBufferMask] & 0xff;
|
|
1207
|
-
|
|
1208
958
|
while (s.j < s.insertLength) {
|
|
1209
959
|
if (s.halfOffset > 2030) {
|
|
1210
960
|
doReadMoreInput(s);
|
|
1211
961
|
}
|
|
1212
|
-
|
|
1213
962
|
if (s.literalBlockLength == 0) {
|
|
1214
963
|
decodeLiteralBlockSwitch(s);
|
|
1215
964
|
}
|
|
1216
|
-
|
|
1217
965
|
var literalContext = LOOKUP[s.contextLookupOffset1 + prevByte1] | LOOKUP[s.contextLookupOffset2 + prevByte2];
|
|
1218
966
|
var literalTreeIdx = s.contextMap[s.contextMapSlice + literalContext] & 0xff;
|
|
1219
967
|
s.literalBlockLength--;
|
|
1220
968
|
prevByte2 = prevByte1;
|
|
1221
|
-
|
|
1222
969
|
if (s.bitOffset >= 16) {
|
|
1223
970
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1224
971
|
s.bitOffset -= 16;
|
|
1225
972
|
}
|
|
1226
|
-
|
|
1227
973
|
prevByte1 = readSymbol(s.literalTreeGroup, literalTreeIdx, s);
|
|
1228
974
|
ringBuffer[s.pos] = prevByte1;
|
|
1229
975
|
s.pos++;
|
|
1230
976
|
s.j++;
|
|
1231
|
-
|
|
1232
977
|
if (s.pos >= fence) {
|
|
1233
978
|
s.nextRunningState = 7;
|
|
1234
979
|
s.runningState = 12;
|
|
@@ -1236,52 +981,40 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1236
981
|
}
|
|
1237
982
|
}
|
|
1238
983
|
}
|
|
1239
|
-
|
|
1240
984
|
if (s.runningState != 7) {
|
|
1241
985
|
continue;
|
|
1242
986
|
}
|
|
1243
|
-
|
|
1244
987
|
s.metaBlockLength -= s.insertLength;
|
|
1245
|
-
|
|
1246
988
|
if (s.metaBlockLength <= 0) {
|
|
1247
989
|
s.runningState = 4;
|
|
1248
990
|
continue;
|
|
1249
991
|
}
|
|
1250
|
-
|
|
1251
992
|
var distanceCode = s.distanceCode;
|
|
1252
|
-
|
|
1253
993
|
if (distanceCode < 0) {
|
|
1254
994
|
s.distance = s.rings[s.distRbIdx];
|
|
1255
995
|
} else {
|
|
1256
996
|
if (s.halfOffset > 2030) {
|
|
1257
997
|
doReadMoreInput(s);
|
|
1258
998
|
}
|
|
1259
|
-
|
|
1260
999
|
if (s.distanceBlockLength == 0) {
|
|
1261
1000
|
decodeDistanceBlockSwitch(s);
|
|
1262
1001
|
}
|
|
1263
|
-
|
|
1264
1002
|
s.distanceBlockLength--;
|
|
1265
|
-
|
|
1266
1003
|
if (s.bitOffset >= 16) {
|
|
1267
1004
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1268
1005
|
s.bitOffset -= 16;
|
|
1269
1006
|
}
|
|
1270
|
-
|
|
1271
1007
|
var distTreeIdx = s.distContextMap[s.distContextMapSlice + distanceCode] & 0xff;
|
|
1272
1008
|
distanceCode = readSymbol(s.distanceTreeGroup, distTreeIdx, s);
|
|
1273
|
-
|
|
1274
1009
|
if (distanceCode < 16) {
|
|
1275
1010
|
var index = s.distRbIdx + DISTANCE_SHORT_CODE_INDEX_OFFSET[distanceCode] & 0x3;
|
|
1276
1011
|
s.distance = s.rings[index] + DISTANCE_SHORT_CODE_VALUE_OFFSET[distanceCode];
|
|
1277
|
-
|
|
1278
1012
|
if (s.distance < 0) {
|
|
1279
1013
|
throw 'Negative distance';
|
|
1280
1014
|
}
|
|
1281
1015
|
} else {
|
|
1282
1016
|
var extraBits = s.distExtraBits[distanceCode];
|
|
1283
1017
|
var bits = void 0;
|
|
1284
|
-
|
|
1285
1018
|
if (s.bitOffset + extraBits <= 32) {
|
|
1286
1019
|
bits = readFewBits(s, extraBits);
|
|
1287
1020
|
} else {
|
|
@@ -1289,44 +1022,35 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1289
1022
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1290
1023
|
s.bitOffset -= 16;
|
|
1291
1024
|
}
|
|
1292
|
-
|
|
1293
1025
|
bits = extraBits <= 16 ? readFewBits(s, extraBits) : readManyBits(s, extraBits);
|
|
1294
1026
|
}
|
|
1295
|
-
|
|
1296
1027
|
s.distance = s.distOffset[distanceCode] + (bits << s.distancePostfixBits);
|
|
1297
1028
|
}
|
|
1298
1029
|
}
|
|
1299
|
-
|
|
1300
1030
|
if (s.maxDistance != s.maxBackwardDistance && s.pos < s.maxBackwardDistance) {
|
|
1301
1031
|
s.maxDistance = s.pos;
|
|
1302
1032
|
} else {
|
|
1303
1033
|
s.maxDistance = s.maxBackwardDistance;
|
|
1304
1034
|
}
|
|
1305
|
-
|
|
1306
1035
|
if (s.distance > s.maxDistance) {
|
|
1307
1036
|
s.runningState = 9;
|
|
1308
1037
|
continue;
|
|
1309
1038
|
}
|
|
1310
|
-
|
|
1311
1039
|
if (distanceCode > 0) {
|
|
1312
1040
|
s.distRbIdx = s.distRbIdx + 1 & 0x3;
|
|
1313
1041
|
s.rings[s.distRbIdx] = s.distance;
|
|
1314
1042
|
}
|
|
1315
|
-
|
|
1316
1043
|
if (s.copyLength > s.metaBlockLength) {
|
|
1317
1044
|
throw 'Invalid backward reference';
|
|
1318
1045
|
}
|
|
1319
|
-
|
|
1320
1046
|
s.j = 0;
|
|
1321
1047
|
s.runningState = 8;
|
|
1322
|
-
|
|
1323
1048
|
case 8:
|
|
1324
1049
|
var src = s.pos - s.distance & ringBufferMask;
|
|
1325
1050
|
var dst = s.pos;
|
|
1326
1051
|
var copyLength = s.copyLength - s.j;
|
|
1327
1052
|
var srcEnd = src + copyLength;
|
|
1328
1053
|
var dstEnd = dst + copyLength;
|
|
1329
|
-
|
|
1330
1054
|
if (srcEnd < ringBufferMask && dstEnd < ringBufferMask) {
|
|
1331
1055
|
if (copyLength < 12 || srcEnd > dst && dstEnd > src) {
|
|
1332
1056
|
for (var k = 0; k < copyLength; k += 4) {
|
|
@@ -1338,7 +1062,6 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1338
1062
|
} else {
|
|
1339
1063
|
ringBuffer.copyWithin(dst, src, srcEnd);
|
|
1340
1064
|
}
|
|
1341
|
-
|
|
1342
1065
|
s.j += copyLength;
|
|
1343
1066
|
s.metaBlockLength -= copyLength;
|
|
1344
1067
|
s.pos += copyLength;
|
|
@@ -1348,7 +1071,6 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1348
1071
|
s.metaBlockLength--;
|
|
1349
1072
|
s.pos++;
|
|
1350
1073
|
s.j++;
|
|
1351
|
-
|
|
1352
1074
|
if (s.pos >= fence) {
|
|
1353
1075
|
s.nextRunningState = 8;
|
|
1354
1076
|
s.runningState = 12;
|
|
@@ -1356,86 +1078,66 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1356
1078
|
}
|
|
1357
1079
|
}
|
|
1358
1080
|
}
|
|
1359
|
-
|
|
1360
1081
|
if (s.runningState == 8) {
|
|
1361
1082
|
s.runningState = 4;
|
|
1362
1083
|
}
|
|
1363
|
-
|
|
1364
1084
|
continue;
|
|
1365
|
-
|
|
1366
1085
|
case 9:
|
|
1367
1086
|
doUseDictionary(s, fence);
|
|
1368
1087
|
continue;
|
|
1369
|
-
|
|
1370
1088
|
case 14:
|
|
1371
1089
|
s.pos += copyFromCompoundDictionary(s, fence);
|
|
1372
|
-
|
|
1373
1090
|
if (s.pos >= fence) {
|
|
1374
1091
|
s.nextRunningState = 14;
|
|
1375
1092
|
s.runningState = 12;
|
|
1376
1093
|
return;
|
|
1377
1094
|
}
|
|
1378
|
-
|
|
1379
1095
|
s.runningState = 4;
|
|
1380
1096
|
continue;
|
|
1381
|
-
|
|
1382
1097
|
case 5:
|
|
1383
1098
|
while (s.metaBlockLength > 0) {
|
|
1384
1099
|
if (s.halfOffset > 2030) {
|
|
1385
1100
|
doReadMoreInput(s);
|
|
1386
1101
|
}
|
|
1387
|
-
|
|
1388
1102
|
if (s.bitOffset >= 16) {
|
|
1389
1103
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1390
1104
|
s.bitOffset -= 16;
|
|
1391
1105
|
}
|
|
1392
|
-
|
|
1393
1106
|
readFewBits(s, 8);
|
|
1394
1107
|
s.metaBlockLength--;
|
|
1395
1108
|
}
|
|
1396
|
-
|
|
1397
1109
|
s.runningState = 2;
|
|
1398
1110
|
continue;
|
|
1399
|
-
|
|
1400
1111
|
case 6:
|
|
1401
1112
|
copyUncompressedData(s);
|
|
1402
1113
|
continue;
|
|
1403
|
-
|
|
1404
1114
|
case 12:
|
|
1405
1115
|
s.ringBufferBytesReady = min(s.pos, s.ringBufferSize);
|
|
1406
1116
|
s.runningState = 13;
|
|
1407
|
-
|
|
1408
1117
|
case 13:
|
|
1409
1118
|
if (writeRingBuffer(s) == 0) {
|
|
1410
1119
|
return;
|
|
1411
1120
|
}
|
|
1412
|
-
|
|
1413
1121
|
if (s.pos >= s.maxBackwardDistance) {
|
|
1414
1122
|
s.maxDistance = s.maxBackwardDistance;
|
|
1415
1123
|
}
|
|
1416
|
-
|
|
1417
1124
|
if (s.pos >= s.ringBufferSize) {
|
|
1418
1125
|
if (s.pos > s.ringBufferSize) {
|
|
1419
1126
|
ringBuffer.copyWithin(0, s.ringBufferSize, s.pos);
|
|
1420
1127
|
}
|
|
1421
|
-
|
|
1422
1128
|
s.pos &= ringBufferMask;
|
|
1423
1129
|
s.ringBufferBytesWritten = 0;
|
|
1424
1130
|
}
|
|
1425
|
-
|
|
1426
1131
|
s.runningState = s.nextRunningState;
|
|
1427
1132
|
continue;
|
|
1428
|
-
|
|
1429
1133
|
default:
|
|
1430
1134
|
throw 'Unexpected state ' + s.runningState;
|
|
1431
1135
|
}
|
|
1432
1136
|
}
|
|
1433
|
-
|
|
1434
1137
|
if (s.runningState == 10) {
|
|
1435
1138
|
if (s.metaBlockLength < 0) {
|
|
1436
1139
|
throw 'Invalid metablock length';
|
|
1437
1140
|
}
|
|
1438
|
-
|
|
1439
1141
|
jumpToByteBoundary(s);
|
|
1440
1142
|
checkHealth(s, 1);
|
|
1441
1143
|
}
|
|
@@ -1455,31 +1157,25 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1455
1157
|
}
|
|
1456
1158
|
|
|
1457
1159
|
var RFC_TRANSFORMS = new Transforms(121, 167, 50);
|
|
1458
|
-
|
|
1459
1160
|
function unpackTransforms(prefixSuffix, prefixSuffixHeads, transforms, prefixSuffixSrc, transformsSrc) {
|
|
1460
1161
|
var n = prefixSuffixSrc.length;
|
|
1461
1162
|
var index = 1;
|
|
1462
1163
|
var j = 0;
|
|
1463
|
-
|
|
1464
1164
|
for (var i = 0; i < n; ++i) {
|
|
1465
1165
|
var c = prefixSuffixSrc.charCodeAt(i);
|
|
1466
|
-
|
|
1467
1166
|
if (c == 35) {
|
|
1468
1167
|
prefixSuffixHeads[index++] = j;
|
|
1469
1168
|
} else {
|
|
1470
1169
|
prefixSuffix[j++] = c;
|
|
1471
1170
|
}
|
|
1472
1171
|
}
|
|
1473
|
-
|
|
1474
1172
|
for (var _i3 = 0; _i3 < 363; ++_i3) {
|
|
1475
1173
|
transforms[_i3] = transformsSrc.charCodeAt(_i3) - 32;
|
|
1476
1174
|
}
|
|
1477
1175
|
}
|
|
1478
|
-
|
|
1479
1176
|
{
|
|
1480
1177
|
unpackTransforms(RFC_TRANSFORMS.prefixSuffixStorage, RFC_TRANSFORMS.prefixSuffixHeads, RFC_TRANSFORMS.triplets, '# #s #, #e #.# the #.com/#\xC2\xA0# of # and # in # to #"#">#\n#]# for # a # that #. # with #\'# from # by #. The # on # as # is #ing #\n\t#:#ed #(# at #ly #="# of the #. This #,# not #er #al #=\'#ful #ive #less #est #ize #ous #', ' !! ! , *! &! " ! ) * * - ! # ! #!*! + ,$ ! - % . / # 0 1 . " 2 3!* 4% ! # / 5 6 7 8 0 1 & $ 9 + : ; < \' != > ?! 4 @ 4 2 & A *# ( B C& ) % ) !*# *-% A +! *. D! %\' & E *6 F G% ! *A *% H! D I!+! J!+ K +- *4! A L!*4 M N +6 O!*% +.! K *G P +%( ! G *D +D Q +# *K!*G!+D!+# +G +A +4!+% +K!+4!*D!+K!*K');
|
|
1481
1178
|
}
|
|
1482
|
-
|
|
1483
1179
|
function transformDictionaryWord(dst, dstOffset, src, srcOffset, len, transforms, transformIndex) {
|
|
1484
1180
|
var offset = dstOffset;
|
|
1485
1181
|
var triplets = transforms.triplets;
|
|
@@ -1495,48 +1191,37 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1495
1191
|
var suffixEnd = prefixSuffixHeads[suffixIdx + 1];
|
|
1496
1192
|
var omitFirst = transformType - 11;
|
|
1497
1193
|
var omitLast = transformType - 0;
|
|
1498
|
-
|
|
1499
1194
|
if (omitFirst < 1 || omitFirst > 9) {
|
|
1500
1195
|
omitFirst = 0;
|
|
1501
1196
|
}
|
|
1502
|
-
|
|
1503
1197
|
if (omitLast < 1 || omitLast > 9) {
|
|
1504
1198
|
omitLast = 0;
|
|
1505
1199
|
}
|
|
1506
|
-
|
|
1507
1200
|
while (prefix != prefixEnd) {
|
|
1508
1201
|
dst[offset++] = prefixSuffixStorage[prefix++];
|
|
1509
1202
|
}
|
|
1510
|
-
|
|
1511
1203
|
if (omitFirst > len) {
|
|
1512
1204
|
omitFirst = len;
|
|
1513
1205
|
}
|
|
1514
|
-
|
|
1515
1206
|
srcOffset += omitFirst;
|
|
1516
1207
|
len -= omitFirst;
|
|
1517
1208
|
len -= omitLast;
|
|
1518
1209
|
var i = len;
|
|
1519
|
-
|
|
1520
1210
|
while (i > 0) {
|
|
1521
1211
|
dst[offset++] = src[srcOffset++];
|
|
1522
1212
|
i--;
|
|
1523
1213
|
}
|
|
1524
|
-
|
|
1525
1214
|
if (transformType == 10 || transformType == 11) {
|
|
1526
1215
|
var uppercaseOffset = offset - len;
|
|
1527
|
-
|
|
1528
1216
|
if (transformType == 10) {
|
|
1529
1217
|
len = 1;
|
|
1530
1218
|
}
|
|
1531
|
-
|
|
1532
1219
|
while (len > 0) {
|
|
1533
1220
|
var c0 = dst[uppercaseOffset] & 0xff;
|
|
1534
|
-
|
|
1535
1221
|
if (c0 < 0xc0) {
|
|
1536
1222
|
if (c0 >= 97 && c0 <= 122) {
|
|
1537
1223
|
dst[uppercaseOffset] ^= 32;
|
|
1538
1224
|
}
|
|
1539
|
-
|
|
1540
1225
|
uppercaseOffset += 1;
|
|
1541
1226
|
len -= 1;
|
|
1542
1227
|
} else if (c0 < 0xe0) {
|
|
@@ -1553,12 +1238,9 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1553
1238
|
var shiftOffset = offset - len;
|
|
1554
1239
|
var param = transforms.params[transformIndex];
|
|
1555
1240
|
var scalar = (param & 0x7fff) + (0x1000000 - (param & 0x8000));
|
|
1556
|
-
|
|
1557
1241
|
while (len > 0) {
|
|
1558
1242
|
var step = 1;
|
|
1559
|
-
|
|
1560
1243
|
var _c = dst[shiftOffset] & 0xff;
|
|
1561
|
-
|
|
1562
1244
|
if (_c < 0x80) {
|
|
1563
1245
|
scalar += _c;
|
|
1564
1246
|
dst[shiftOffset] = scalar & 0x7f;
|
|
@@ -1599,57 +1281,44 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1599
1281
|
step = len;
|
|
1600
1282
|
}
|
|
1601
1283
|
}
|
|
1602
|
-
|
|
1603
1284
|
shiftOffset += step;
|
|
1604
1285
|
len -= step;
|
|
1605
|
-
|
|
1606
1286
|
if (transformType == 21) {
|
|
1607
1287
|
len = 0;
|
|
1608
1288
|
}
|
|
1609
1289
|
}
|
|
1610
1290
|
}
|
|
1611
|
-
|
|
1612
1291
|
while (suffix != suffixEnd) {
|
|
1613
1292
|
dst[offset++] = prefixSuffixStorage[suffix++];
|
|
1614
1293
|
}
|
|
1615
|
-
|
|
1616
1294
|
return offset - dstOffset;
|
|
1617
1295
|
}
|
|
1618
1296
|
|
|
1619
1297
|
function getNextKey(key, len) {
|
|
1620
1298
|
var step = 1 << len - 1;
|
|
1621
|
-
|
|
1622
1299
|
while ((key & step) != 0) {
|
|
1623
1300
|
step >>= 1;
|
|
1624
1301
|
}
|
|
1625
|
-
|
|
1626
1302
|
return (key & step - 1) + step;
|
|
1627
1303
|
}
|
|
1628
|
-
|
|
1629
1304
|
function replicateValue(table, offset, step, end, item) {
|
|
1630
1305
|
do {
|
|
1631
1306
|
end -= step;
|
|
1632
1307
|
table[offset + end] = item;
|
|
1633
1308
|
} while (end > 0);
|
|
1634
1309
|
}
|
|
1635
|
-
|
|
1636
1310
|
function nextTableBitSize(count, len, rootBits) {
|
|
1637
1311
|
var left = 1 << len - rootBits;
|
|
1638
|
-
|
|
1639
1312
|
while (len < 15) {
|
|
1640
1313
|
left -= count[len];
|
|
1641
|
-
|
|
1642
1314
|
if (left <= 0) {
|
|
1643
1315
|
break;
|
|
1644
1316
|
}
|
|
1645
|
-
|
|
1646
1317
|
len++;
|
|
1647
1318
|
left <<= 1;
|
|
1648
1319
|
}
|
|
1649
|
-
|
|
1650
1320
|
return len - rootBits;
|
|
1651
1321
|
}
|
|
1652
|
-
|
|
1653
1322
|
function buildHuffmanTable(tableGroup, tableIdx, rootBits, codeLengths, codeLengthsSize) {
|
|
1654
1323
|
var tableOffset = tableGroup[tableIdx];
|
|
1655
1324
|
var key;
|
|
@@ -1657,49 +1326,38 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1657
1326
|
var count = new Int32Array(16);
|
|
1658
1327
|
var offset = new Int32Array(16);
|
|
1659
1328
|
var symbol;
|
|
1660
|
-
|
|
1661
1329
|
for (symbol = 0; symbol < codeLengthsSize; symbol++) {
|
|
1662
1330
|
count[codeLengths[symbol]]++;
|
|
1663
1331
|
}
|
|
1664
|
-
|
|
1665
1332
|
offset[1] = 0;
|
|
1666
|
-
|
|
1667
1333
|
for (var len = 1; len < 15; len++) {
|
|
1668
1334
|
offset[len + 1] = offset[len] + count[len];
|
|
1669
1335
|
}
|
|
1670
|
-
|
|
1671
1336
|
for (symbol = 0; symbol < codeLengthsSize; symbol++) {
|
|
1672
1337
|
if (codeLengths[symbol] != 0) {
|
|
1673
1338
|
sorted[offset[codeLengths[symbol]]++] = symbol;
|
|
1674
1339
|
}
|
|
1675
1340
|
}
|
|
1676
|
-
|
|
1677
1341
|
var tableBits = rootBits;
|
|
1678
1342
|
var tableSize = 1 << tableBits;
|
|
1679
1343
|
var totalSize = tableSize;
|
|
1680
|
-
|
|
1681
1344
|
if (offset[15] == 1) {
|
|
1682
1345
|
for (key = 0; key < totalSize; key++) {
|
|
1683
1346
|
tableGroup[tableOffset + key] = sorted[0];
|
|
1684
1347
|
}
|
|
1685
|
-
|
|
1686
1348
|
return totalSize;
|
|
1687
1349
|
}
|
|
1688
|
-
|
|
1689
1350
|
key = 0;
|
|
1690
1351
|
symbol = 0;
|
|
1691
|
-
|
|
1692
1352
|
for (var _len = 1, step = 2; _len <= rootBits; _len++, step <<= 1) {
|
|
1693
1353
|
for (; count[_len] > 0; count[_len]--) {
|
|
1694
1354
|
replicateValue(tableGroup, tableOffset + key, step, tableSize, _len << 16 | sorted[symbol++]);
|
|
1695
1355
|
key = getNextKey(key, _len);
|
|
1696
1356
|
}
|
|
1697
1357
|
}
|
|
1698
|
-
|
|
1699
1358
|
var mask = totalSize - 1;
|
|
1700
1359
|
var low = -1;
|
|
1701
1360
|
var currentOffset = tableOffset;
|
|
1702
|
-
|
|
1703
1361
|
for (var _len2 = rootBits + 1, _step = 2; _len2 <= 15; _len2++, _step <<= 1) {
|
|
1704
1362
|
for (; count[_len2] > 0; count[_len2]--) {
|
|
1705
1363
|
if ((key & mask) != low) {
|
|
@@ -1710,12 +1368,10 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1710
1368
|
low = key & mask;
|
|
1711
1369
|
tableGroup[tableOffset + low] = tableBits + rootBits << 16 | currentOffset - tableOffset - low;
|
|
1712
1370
|
}
|
|
1713
|
-
|
|
1714
1371
|
replicateValue(tableGroup, currentOffset + (key >> rootBits), _step, tableSize, _len2 - rootBits << 16 | sorted[symbol++]);
|
|
1715
1372
|
key = getNextKey(key, _len2);
|
|
1716
1373
|
}
|
|
1717
1374
|
}
|
|
1718
|
-
|
|
1719
1375
|
return totalSize;
|
|
1720
1376
|
}
|
|
1721
1377
|
|
|
@@ -1724,67 +1380,53 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1724
1380
|
if (halfAvailable(s) >= -2) {
|
|
1725
1381
|
return;
|
|
1726
1382
|
}
|
|
1727
|
-
|
|
1728
1383
|
throw 'No more input';
|
|
1729
1384
|
}
|
|
1730
|
-
|
|
1731
1385
|
var readOffset = s.halfOffset << 1;
|
|
1732
1386
|
var bytesInBuffer = 4096 - readOffset;
|
|
1733
1387
|
s.byteBuffer.copyWithin(0, readOffset, 4096);
|
|
1734
1388
|
s.halfOffset = 0;
|
|
1735
|
-
|
|
1736
1389
|
while (bytesInBuffer < 4096) {
|
|
1737
1390
|
var spaceLeft = 4096 - bytesInBuffer;
|
|
1738
1391
|
var len = readInput(s.input, s.byteBuffer, bytesInBuffer, spaceLeft);
|
|
1739
|
-
|
|
1740
1392
|
if (len <= 0) {
|
|
1741
1393
|
s.endOfStreamReached = 1;
|
|
1742
1394
|
s.tailBytes = bytesInBuffer;
|
|
1743
1395
|
bytesInBuffer += 1;
|
|
1744
1396
|
break;
|
|
1745
1397
|
}
|
|
1746
|
-
|
|
1747
1398
|
bytesInBuffer += len;
|
|
1748
1399
|
}
|
|
1749
|
-
|
|
1750
1400
|
bytesToNibbles(s, bytesInBuffer);
|
|
1751
1401
|
}
|
|
1752
|
-
|
|
1753
1402
|
function checkHealth(s, endOfStream) {
|
|
1754
1403
|
if (s.endOfStreamReached == 0) {
|
|
1755
1404
|
return;
|
|
1756
1405
|
}
|
|
1757
|
-
|
|
1758
1406
|
var byteOffset = (s.halfOffset << 1) + (s.bitOffset + 7 >> 3) - 4;
|
|
1759
|
-
|
|
1760
1407
|
if (byteOffset > s.tailBytes) {
|
|
1761
1408
|
throw 'Read after end';
|
|
1762
1409
|
}
|
|
1763
|
-
|
|
1764
1410
|
if (endOfStream != 0 && byteOffset != s.tailBytes) {
|
|
1765
1411
|
throw 'Unused bytes after end';
|
|
1766
1412
|
}
|
|
1767
1413
|
}
|
|
1768
|
-
|
|
1769
1414
|
function assertAccumulatorHealthy(s) {
|
|
1770
1415
|
if (s.bitOffset > 32) {
|
|
1771
1416
|
throw 'Accumulator underloaded: ' + s.bitOffset;
|
|
1772
1417
|
}
|
|
1773
1418
|
}
|
|
1774
|
-
|
|
1775
1419
|
function readFewBits(s, n) {
|
|
1776
1420
|
var val = s.accumulator32 >>> s.bitOffset & (1 << n) - 1;
|
|
1777
1421
|
s.bitOffset += n;
|
|
1778
1422
|
return val;
|
|
1779
1423
|
}
|
|
1780
|
-
|
|
1781
1424
|
function readManyBits(s, n) {
|
|
1782
1425
|
var low = readFewBits(s, 16);
|
|
1783
1426
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1784
1427
|
s.bitOffset -= 16;
|
|
1785
1428
|
return low | readFewBits(s, n - 16) << 16;
|
|
1786
1429
|
}
|
|
1787
|
-
|
|
1788
1430
|
function initBitReader(s) {
|
|
1789
1431
|
s.byteBuffer = new Int8Array(4160);
|
|
1790
1432
|
s.accumulator32 = 0;
|
|
@@ -1794,64 +1436,50 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1794
1436
|
s.endOfStreamReached = 0;
|
|
1795
1437
|
prepare(s);
|
|
1796
1438
|
}
|
|
1797
|
-
|
|
1798
1439
|
function prepare(s) {
|
|
1799
1440
|
if (s.halfOffset > 2030) {
|
|
1800
1441
|
doReadMoreInput(s);
|
|
1801
1442
|
}
|
|
1802
|
-
|
|
1803
1443
|
checkHealth(s, 0);
|
|
1804
1444
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1805
1445
|
s.bitOffset -= 16;
|
|
1806
1446
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1807
1447
|
s.bitOffset -= 16;
|
|
1808
1448
|
}
|
|
1809
|
-
|
|
1810
1449
|
function reload(s) {
|
|
1811
1450
|
if (s.bitOffset == 32) {
|
|
1812
1451
|
prepare(s);
|
|
1813
1452
|
}
|
|
1814
1453
|
}
|
|
1815
|
-
|
|
1816
1454
|
function jumpToByteBoundary(s) {
|
|
1817
1455
|
var padding = 32 - s.bitOffset & 7;
|
|
1818
|
-
|
|
1819
1456
|
if (padding != 0) {
|
|
1820
1457
|
var paddingBits = readFewBits(s, padding);
|
|
1821
|
-
|
|
1822
1458
|
if (paddingBits != 0) {
|
|
1823
1459
|
throw 'Corrupted padding bits';
|
|
1824
1460
|
}
|
|
1825
1461
|
}
|
|
1826
1462
|
}
|
|
1827
|
-
|
|
1828
1463
|
function halfAvailable(s) {
|
|
1829
1464
|
var limit = 2048;
|
|
1830
|
-
|
|
1831
1465
|
if (s.endOfStreamReached != 0) {
|
|
1832
1466
|
limit = s.tailBytes + 1 >> 1;
|
|
1833
1467
|
}
|
|
1834
|
-
|
|
1835
1468
|
return limit - s.halfOffset;
|
|
1836
1469
|
}
|
|
1837
|
-
|
|
1838
1470
|
function copyRawBytes(s, data, offset, length) {
|
|
1839
1471
|
if ((s.bitOffset & 7) != 0) {
|
|
1840
1472
|
throw 'Unaligned copyBytes';
|
|
1841
1473
|
}
|
|
1842
|
-
|
|
1843
1474
|
while (s.bitOffset != 32 && length != 0) {
|
|
1844
1475
|
data[offset++] = s.accumulator32 >>> s.bitOffset;
|
|
1845
1476
|
s.bitOffset += 8;
|
|
1846
1477
|
length--;
|
|
1847
1478
|
}
|
|
1848
|
-
|
|
1849
1479
|
if (length == 0) {
|
|
1850
1480
|
return;
|
|
1851
1481
|
}
|
|
1852
|
-
|
|
1853
1482
|
var copyNibbles = min(halfAvailable(s), length >> 1);
|
|
1854
|
-
|
|
1855
1483
|
if (copyNibbles > 0) {
|
|
1856
1484
|
var readOffset = s.halfOffset << 1;
|
|
1857
1485
|
var delta = copyNibbles << 1;
|
|
@@ -1860,91 +1488,72 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
1860
1488
|
length -= delta;
|
|
1861
1489
|
s.halfOffset += copyNibbles;
|
|
1862
1490
|
}
|
|
1863
|
-
|
|
1864
1491
|
if (length == 0) {
|
|
1865
1492
|
return;
|
|
1866
1493
|
}
|
|
1867
|
-
|
|
1868
1494
|
if (halfAvailable(s) > 0) {
|
|
1869
1495
|
if (s.bitOffset >= 16) {
|
|
1870
1496
|
s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
|
|
1871
1497
|
s.bitOffset -= 16;
|
|
1872
1498
|
}
|
|
1873
|
-
|
|
1874
1499
|
while (length != 0) {
|
|
1875
1500
|
data[offset++] = s.accumulator32 >>> s.bitOffset;
|
|
1876
1501
|
s.bitOffset += 8;
|
|
1877
1502
|
length--;
|
|
1878
1503
|
}
|
|
1879
|
-
|
|
1880
1504
|
checkHealth(s, 0);
|
|
1881
1505
|
return;
|
|
1882
1506
|
}
|
|
1883
|
-
|
|
1884
1507
|
while (length > 0) {
|
|
1885
1508
|
var len = readInput(s.input, data, offset, length);
|
|
1886
|
-
|
|
1887
1509
|
if (len == -1) {
|
|
1888
1510
|
throw 'Unexpected end of input';
|
|
1889
1511
|
}
|
|
1890
|
-
|
|
1891
1512
|
offset += len;
|
|
1892
1513
|
length -= len;
|
|
1893
1514
|
}
|
|
1894
1515
|
}
|
|
1895
|
-
|
|
1896
1516
|
function bytesToNibbles(s, byteLen) {
|
|
1897
1517
|
var byteBuffer = s.byteBuffer;
|
|
1898
1518
|
var halfLen = byteLen >> 1;
|
|
1899
1519
|
var shortBuffer = s.shortBuffer;
|
|
1900
|
-
|
|
1901
1520
|
for (var i = 0; i < halfLen; ++i) {
|
|
1902
1521
|
shortBuffer[i] = byteBuffer[i * 2] & 0xff | (byteBuffer[i * 2 + 1] & 0xff) << 8;
|
|
1903
1522
|
}
|
|
1904
1523
|
}
|
|
1905
1524
|
|
|
1906
1525
|
var LOOKUP = new Int32Array(2048);
|
|
1907
|
-
|
|
1908
1526
|
function unpackLookupTable(lookup, map, rle) {
|
|
1909
1527
|
for (var i = 0; i < 256; ++i) {
|
|
1910
1528
|
lookup[i] = i & 0x3f;
|
|
1911
1529
|
lookup[512 + i] = i >> 2;
|
|
1912
1530
|
lookup[1792 + i] = 2 + (i >> 6);
|
|
1913
1531
|
}
|
|
1914
|
-
|
|
1915
1532
|
for (var _i4 = 0; _i4 < 128; ++_i4) {
|
|
1916
1533
|
lookup[1024 + _i4] = 4 * (map.charCodeAt(_i4) - 32);
|
|
1917
1534
|
}
|
|
1918
|
-
|
|
1919
1535
|
for (var _i5 = 0; _i5 < 64; ++_i5) {
|
|
1920
1536
|
lookup[1152 + _i5] = _i5 & 1;
|
|
1921
1537
|
lookup[1216 + _i5] = 2 + (_i5 & 1);
|
|
1922
1538
|
}
|
|
1923
|
-
|
|
1924
1539
|
var offset = 1280;
|
|
1925
|
-
|
|
1926
1540
|
for (var k = 0; k < 19; ++k) {
|
|
1927
1541
|
var value = k & 3;
|
|
1928
1542
|
var rep = rle.charCodeAt(k) - 32;
|
|
1929
|
-
|
|
1930
1543
|
for (var _i6 = 0; _i6 < rep; ++_i6) {
|
|
1931
1544
|
lookup[offset++] = value;
|
|
1932
1545
|
}
|
|
1933
1546
|
}
|
|
1934
|
-
|
|
1935
1547
|
for (var _i7 = 0; _i7 < 16; ++_i7) {
|
|
1936
1548
|
lookup[1792 + _i7] = 1;
|
|
1937
1549
|
lookup[2032 + _i7] = 6;
|
|
1938
1550
|
}
|
|
1939
|
-
|
|
1940
1551
|
lookup[1792] = 0;
|
|
1941
1552
|
lookup[2047] = 7;
|
|
1942
|
-
|
|
1943
1553
|
for (var _i8 = 0; _i8 < 256; ++_i8) {
|
|
1944
1554
|
lookup[1536 + _i8] = lookup[1792 + _i8] << 3;
|
|
1945
1555
|
}
|
|
1946
1556
|
}
|
|
1947
|
-
|
|
1948
1557
|
{
|
|
1949
1558
|
unpackLookupTable(LOOKUP, " !! ! \"#$##%#$&'##(#)#++++++++++((&*'##,---,---,-----,-----,-----&#'###.///.///./////./////./////&#'# ", "A/* ': & : $ \x81 @");
|
|
1950
1559
|
}
|
|
@@ -2032,88 +1641,69 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
2032
1641
|
var data = null;
|
|
2033
1642
|
var offsets = new Int32Array(32);
|
|
2034
1643
|
var sizeBits = new Int32Array(32);
|
|
2035
|
-
|
|
2036
1644
|
function setData(newData, newSizeBits) {
|
|
2037
1645
|
if (isDirect(newData) == 0 || isReadOnly(newData) == 0) {
|
|
2038
1646
|
throw 'newData must be a direct read-only byte buffer';
|
|
2039
1647
|
}
|
|
2040
|
-
|
|
2041
1648
|
if (newSizeBits.length > 31) {
|
|
2042
1649
|
throw 'sizeBits length must be at most ' + 31;
|
|
2043
1650
|
}
|
|
2044
|
-
|
|
2045
1651
|
for (var i = 0; i < 4; ++i) {
|
|
2046
1652
|
if (newSizeBits[i] != 0) {
|
|
2047
1653
|
throw 'first ' + 4 + ' must be 0';
|
|
2048
1654
|
}
|
|
2049
1655
|
}
|
|
2050
|
-
|
|
2051
1656
|
var dictionaryOffsets = offsets;
|
|
2052
1657
|
var dictionarySizeBits = sizeBits;
|
|
2053
1658
|
dictionarySizeBits.set(newSizeBits.subarray(0, 0 + newSizeBits.length), 0);
|
|
2054
1659
|
var pos = 0;
|
|
2055
1660
|
var limit = newData.length;
|
|
2056
|
-
|
|
2057
1661
|
for (var _i9 = 0; _i9 < newSizeBits.length; ++_i9) {
|
|
2058
1662
|
dictionaryOffsets[_i9] = pos;
|
|
2059
1663
|
var bits = dictionarySizeBits[_i9];
|
|
2060
|
-
|
|
2061
1664
|
if (bits != 0) {
|
|
2062
1665
|
if (bits >= 31) {
|
|
2063
1666
|
throw 'newSizeBits values must be less than 31';
|
|
2064
1667
|
}
|
|
2065
|
-
|
|
2066
1668
|
pos += _i9 << bits;
|
|
2067
|
-
|
|
2068
1669
|
if (pos <= 0 || pos > limit) {
|
|
2069
1670
|
throw 'newSizeBits is inconsistent: overflow';
|
|
2070
1671
|
}
|
|
2071
1672
|
}
|
|
2072
1673
|
}
|
|
2073
|
-
|
|
2074
1674
|
for (var _i10 = newSizeBits.length; _i10 < 32; ++_i10) {
|
|
2075
1675
|
dictionaryOffsets[_i10] = pos;
|
|
2076
1676
|
}
|
|
2077
|
-
|
|
2078
1677
|
if (pos != limit) {
|
|
2079
1678
|
throw 'newSizeBits is inconsistent: underflow';
|
|
2080
1679
|
}
|
|
2081
|
-
|
|
2082
1680
|
data = newData;
|
|
2083
1681
|
}
|
|
2084
1682
|
|
|
2085
1683
|
function unpackDictionaryData(dictionary, data0, data1, skipFlip, sizeBits, sizeBitsData) {
|
|
2086
1684
|
var dict = toUsAsciiBytes(data0 + data1);
|
|
2087
|
-
|
|
2088
1685
|
if (dict.length != dictionary.length) {
|
|
2089
1686
|
throw 'Corrupted brotli dictionary';
|
|
2090
1687
|
}
|
|
2091
|
-
|
|
2092
1688
|
var offset = 0;
|
|
2093
1689
|
var n = skipFlip.length;
|
|
2094
|
-
|
|
2095
1690
|
for (var i = 0; i < n; i += 2) {
|
|
2096
1691
|
var skip = skipFlip.charCodeAt(i) - 36;
|
|
2097
1692
|
var flip = skipFlip.charCodeAt(i + 1) - 36;
|
|
2098
|
-
|
|
2099
1693
|
for (var j = 0; j < skip; ++j) {
|
|
2100
1694
|
dict[offset] ^= 3;
|
|
2101
1695
|
offset++;
|
|
2102
1696
|
}
|
|
2103
|
-
|
|
2104
1697
|
for (var _j2 = 0; _j2 < flip; ++_j2) {
|
|
2105
1698
|
dict[offset] ^= 236;
|
|
2106
1699
|
offset++;
|
|
2107
1700
|
}
|
|
2108
1701
|
}
|
|
2109
|
-
|
|
2110
1702
|
for (var _i11 = 0; _i11 < sizeBitsData.length; ++_i11) {
|
|
2111
1703
|
sizeBits[_i11] = sizeBitsData.charCodeAt(_i11) - 65;
|
|
2112
1704
|
}
|
|
2113
|
-
|
|
2114
1705
|
dictionary.set(dict);
|
|
2115
1706
|
}
|
|
2116
|
-
|
|
2117
1707
|
{
|
|
2118
1708
|
var dictionaryData = new Int8Array(122784);
|
|
2119
1709
|
var dictionarySizeBits = new Int32Array(25);
|
|
@@ -2155,31 +1745,27 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
2155
1745
|
return 1;
|
|
2156
1746
|
}
|
|
2157
1747
|
|
|
2158
|
-
function flipBuffer(buffer) {
|
|
1748
|
+
function flipBuffer(buffer) {
|
|
1749
|
+
}
|
|
2159
1750
|
|
|
2160
1751
|
function toUsAsciiBytes(src) {
|
|
2161
1752
|
var n = src.length;
|
|
2162
1753
|
var result = new Int8Array(n);
|
|
2163
|
-
|
|
2164
1754
|
for (var i = 0; i < n; ++i) {
|
|
2165
1755
|
result[i] = src.charCodeAt(i);
|
|
2166
1756
|
}
|
|
2167
|
-
|
|
2168
1757
|
return result;
|
|
2169
1758
|
}
|
|
2170
1759
|
|
|
2171
1760
|
function decode(bytes, options) {
|
|
2172
1761
|
var s = new State();
|
|
2173
1762
|
initState(s, new InputStream(bytes));
|
|
2174
|
-
|
|
2175
1763
|
if (options) {
|
|
2176
1764
|
var customDictionary = options['customDictionary'];
|
|
2177
1765
|
if (customDictionary) attachDictionaryChunk(s, customDictionary);
|
|
2178
1766
|
}
|
|
2179
|
-
|
|
2180
1767
|
var totalOutput = 0;
|
|
2181
1768
|
var chunks = [];
|
|
2182
|
-
|
|
2183
1769
|
while (true) {
|
|
2184
1770
|
var chunk = new Int8Array(16384);
|
|
2185
1771
|
chunks.push(chunk);
|
|
@@ -2191,28 +1777,22 @@ var makeBrotliDecode = function makeBrotliDecode() {
|
|
|
2191
1777
|
totalOutput += s.outputUsed;
|
|
2192
1778
|
if (s.outputUsed < 16384) break;
|
|
2193
1779
|
}
|
|
2194
|
-
|
|
2195
1780
|
close(s);
|
|
2196
1781
|
var result = new Int8Array(totalOutput);
|
|
2197
1782
|
var offset = 0;
|
|
2198
|
-
|
|
2199
1783
|
for (var i = 0; i < chunks.length; ++i) {
|
|
2200
1784
|
var _chunk = chunks[i];
|
|
2201
1785
|
var end = min(totalOutput, offset + 16384);
|
|
2202
1786
|
var len = end - offset;
|
|
2203
|
-
|
|
2204
1787
|
if (len < 16384) {
|
|
2205
1788
|
result.set(_chunk.subarray(0, len), offset);
|
|
2206
1789
|
} else {
|
|
2207
1790
|
result.set(_chunk, offset);
|
|
2208
1791
|
}
|
|
2209
|
-
|
|
2210
1792
|
offset += len;
|
|
2211
1793
|
}
|
|
2212
|
-
|
|
2213
1794
|
return result;
|
|
2214
1795
|
}
|
|
2215
|
-
|
|
2216
1796
|
return decode;
|
|
2217
1797
|
};
|
|
2218
1798
|
|