Update JSON API
[src/app-framework-demo.git] / afm-client / bower_components / jszip / dist / jszip.js
1 /*!
2
3 JSZip - A Javascript class for generating and reading zip files
4 <http://stuartk.com/jszip>
5
6 (c) 2009-2014 Stuart Knightley <stuart [at] stuartk.com>
7 Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.
8
9 JSZip uses the library pako released under the MIT license :
10 https://github.com/nodeca/pako/blob/master/LICENSE
11 */
12 !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.JSZip=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
13 'use strict';
14 // private property
15 var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
16
17
18 // public method for encoding
19 exports.encode = function(input, utf8) {
20     var output = "";
21     var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
22     var i = 0;
23
24     while (i < input.length) {
25
26         chr1 = input.charCodeAt(i++);
27         chr2 = input.charCodeAt(i++);
28         chr3 = input.charCodeAt(i++);
29
30         enc1 = chr1 >> 2;
31         enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
32         enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
33         enc4 = chr3 & 63;
34
35         if (isNaN(chr2)) {
36             enc3 = enc4 = 64;
37         }
38         else if (isNaN(chr3)) {
39             enc4 = 64;
40         }
41
42         output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
43
44     }
45
46     return output;
47 };
48
49 // public method for decoding
50 exports.decode = function(input, utf8) {
51     var output = "";
52     var chr1, chr2, chr3;
53     var enc1, enc2, enc3, enc4;
54     var i = 0;
55
56     input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
57
58     while (i < input.length) {
59
60         enc1 = _keyStr.indexOf(input.charAt(i++));
61         enc2 = _keyStr.indexOf(input.charAt(i++));
62         enc3 = _keyStr.indexOf(input.charAt(i++));
63         enc4 = _keyStr.indexOf(input.charAt(i++));
64
65         chr1 = (enc1 << 2) | (enc2 >> 4);
66         chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
67         chr3 = ((enc3 & 3) << 6) | enc4;
68
69         output = output + String.fromCharCode(chr1);
70
71         if (enc3 != 64) {
72             output = output + String.fromCharCode(chr2);
73         }
74         if (enc4 != 64) {
75             output = output + String.fromCharCode(chr3);
76         }
77
78     }
79
80     return output;
81
82 };
83
84 },{}],2:[function(_dereq_,module,exports){
85 'use strict';
86 function CompressedObject() {
87     this.compressedSize = 0;
88     this.uncompressedSize = 0;
89     this.crc32 = 0;
90     this.compressionMethod = null;
91     this.compressedContent = null;
92 }
93
94 CompressedObject.prototype = {
95     /**
96      * Return the decompressed content in an unspecified format.
97      * The format will depend on the decompressor.
98      * @return {Object} the decompressed content.
99      */
100     getContent: function() {
101         return null; // see implementation
102     },
103     /**
104      * Return the compressed content in an unspecified format.
105      * The format will depend on the compressed conten source.
106      * @return {Object} the compressed content.
107      */
108     getCompressedContent: function() {
109         return null; // see implementation
110     }
111 };
112 module.exports = CompressedObject;
113
114 },{}],3:[function(_dereq_,module,exports){
115 'use strict';
116 exports.STORE = {
117     magic: "\x00\x00",
118     compress: function(content, compressionOptions) {
119         return content; // no compression
120     },
121     uncompress: function(content) {
122         return content; // no compression
123     },
124     compressInputType: null,
125     uncompressInputType: null
126 };
127 exports.DEFLATE = _dereq_('./flate');
128
129 },{"./flate":8}],4:[function(_dereq_,module,exports){
130 'use strict';
131
132 var utils = _dereq_('./utils');
133
134 var table = [
135     0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
136     0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
137     0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
138     0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
139     0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
140     0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
141     0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
142     0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
143     0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
144     0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
145     0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
146     0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
147     0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
148     0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
149     0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
150     0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
151     0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
152     0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
153     0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
154     0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
155     0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
156     0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
157     0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
158     0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
159     0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
160     0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
161     0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
162     0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
163     0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
164     0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
165     0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
166     0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
167     0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
168     0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
169     0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
170     0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
171     0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
172     0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
173     0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
174     0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
175     0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
176     0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
177     0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
178     0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
179     0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
180     0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
181     0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
182     0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
183     0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
184     0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
185     0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
186     0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
187     0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
188     0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
189     0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
190     0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
191     0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
192     0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
193     0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
194     0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
195     0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
196     0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
197     0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
198     0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
199 ];
200
201 /**
202  *
203  *  Javascript crc32
204  *  http://www.webtoolkit.info/
205  *
206  */
207 module.exports = function crc32(input, crc) {
208     if (typeof input === "undefined" || !input.length) {
209         return 0;
210     }
211
212     var isArray = utils.getTypeOf(input) !== "string";
213
214     if (typeof(crc) == "undefined") {
215         crc = 0;
216     }
217     var x = 0;
218     var y = 0;
219     var b = 0;
220
221     crc = crc ^ (-1);
222     for (var i = 0, iTop = input.length; i < iTop; i++) {
223         b = isArray ? input[i] : input.charCodeAt(i);
224         y = (crc ^ b) & 0xFF;
225         x = table[y];
226         crc = (crc >>> 8) ^ x;
227     }
228
229     return crc ^ (-1);
230 };
231 // vim: set shiftwidth=4 softtabstop=4:
232
233 },{"./utils":21}],5:[function(_dereq_,module,exports){
234 'use strict';
235 var utils = _dereq_('./utils');
236
237 function DataReader(data) {
238     this.data = null; // type : see implementation
239     this.length = 0;
240     this.index = 0;
241 }
242 DataReader.prototype = {
243     /**
244      * Check that the offset will not go too far.
245      * @param {string} offset the additional offset to check.
246      * @throws {Error} an Error if the offset is out of bounds.
247      */
248     checkOffset: function(offset) {
249         this.checkIndex(this.index + offset);
250     },
251     /**
252      * Check that the specifed index will not be too far.
253      * @param {string} newIndex the index to check.
254      * @throws {Error} an Error if the index is out of bounds.
255      */
256     checkIndex: function(newIndex) {
257         if (this.length < newIndex || newIndex < 0) {
258             throw new Error("End of data reached (data length = " + this.length + ", asked index = " + (newIndex) + "). Corrupted zip ?");
259         }
260     },
261     /**
262      * Change the index.
263      * @param {number} newIndex The new index.
264      * @throws {Error} if the new index is out of the data.
265      */
266     setIndex: function(newIndex) {
267         this.checkIndex(newIndex);
268         this.index = newIndex;
269     },
270     /**
271      * Skip the next n bytes.
272      * @param {number} n the number of bytes to skip.
273      * @throws {Error} if the new index is out of the data.
274      */
275     skip: function(n) {
276         this.setIndex(this.index + n);
277     },
278     /**
279      * Get the byte at the specified index.
280      * @param {number} i the index to use.
281      * @return {number} a byte.
282      */
283     byteAt: function(i) {
284         // see implementations
285     },
286     /**
287      * Get the next number with a given byte size.
288      * @param {number} size the number of bytes to read.
289      * @return {number} the corresponding number.
290      */
291     readInt: function(size) {
292         var result = 0,
293             i;
294         this.checkOffset(size);
295         for (i = this.index + size - 1; i >= this.index; i--) {
296             result = (result << 8) + this.byteAt(i);
297         }
298         this.index += size;
299         return result;
300     },
301     /**
302      * Get the next string with a given byte size.
303      * @param {number} size the number of bytes to read.
304      * @return {string} the corresponding string.
305      */
306     readString: function(size) {
307         return utils.transformTo("string", this.readData(size));
308     },
309     /**
310      * Get raw data without conversion, <size> bytes.
311      * @param {number} size the number of bytes to read.
312      * @return {Object} the raw data, implementation specific.
313      */
314     readData: function(size) {
315         // see implementations
316     },
317     /**
318      * Find the last occurence of a zip signature (4 bytes).
319      * @param {string} sig the signature to find.
320      * @return {number} the index of the last occurence, -1 if not found.
321      */
322     lastIndexOfSignature: function(sig) {
323         // see implementations
324     },
325     /**
326      * Get the next date.
327      * @return {Date} the date.
328      */
329     readDate: function() {
330         var dostime = this.readInt(4);
331         return new Date(
332         ((dostime >> 25) & 0x7f) + 1980, // year
333         ((dostime >> 21) & 0x0f) - 1, // month
334         (dostime >> 16) & 0x1f, // day
335         (dostime >> 11) & 0x1f, // hour
336         (dostime >> 5) & 0x3f, // minute
337         (dostime & 0x1f) << 1); // second
338     }
339 };
340 module.exports = DataReader;
341
342 },{"./utils":21}],6:[function(_dereq_,module,exports){
343 'use strict';
344 exports.base64 = false;
345 exports.binary = false;
346 exports.dir = false;
347 exports.createFolders = false;
348 exports.date = null;
349 exports.compression = null;
350 exports.compressionOptions = null;
351 exports.comment = null;
352 exports.unixPermissions = null;
353 exports.dosPermissions = null;
354
355 },{}],7:[function(_dereq_,module,exports){
356 'use strict';
357 var utils = _dereq_('./utils');
358
359 /**
360  * @deprecated
361  * This function will be removed in a future version without replacement.
362  */
363 exports.string2binary = function(str) {
364     return utils.string2binary(str);
365 };
366
367 /**
368  * @deprecated
369  * This function will be removed in a future version without replacement.
370  */
371 exports.string2Uint8Array = function(str) {
372     return utils.transformTo("uint8array", str);
373 };
374
375 /**
376  * @deprecated
377  * This function will be removed in a future version without replacement.
378  */
379 exports.uint8Array2String = function(array) {
380     return utils.transformTo("string", array);
381 };
382
383 /**
384  * @deprecated
385  * This function will be removed in a future version without replacement.
386  */
387 exports.string2Blob = function(str) {
388     var buffer = utils.transformTo("arraybuffer", str);
389     return utils.arrayBuffer2Blob(buffer);
390 };
391
392 /**
393  * @deprecated
394  * This function will be removed in a future version without replacement.
395  */
396 exports.arrayBuffer2Blob = function(buffer) {
397     return utils.arrayBuffer2Blob(buffer);
398 };
399
400 /**
401  * @deprecated
402  * This function will be removed in a future version without replacement.
403  */
404 exports.transformTo = function(outputType, input) {
405     return utils.transformTo(outputType, input);
406 };
407
408 /**
409  * @deprecated
410  * This function will be removed in a future version without replacement.
411  */
412 exports.getTypeOf = function(input) {
413     return utils.getTypeOf(input);
414 };
415
416 /**
417  * @deprecated
418  * This function will be removed in a future version without replacement.
419  */
420 exports.checkSupport = function(type) {
421     return utils.checkSupport(type);
422 };
423
424 /**
425  * @deprecated
426  * This value will be removed in a future version without replacement.
427  */
428 exports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS;
429
430 /**
431  * @deprecated
432  * This value will be removed in a future version without replacement.
433  */
434 exports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS;
435
436
437 /**
438  * @deprecated
439  * This function will be removed in a future version without replacement.
440  */
441 exports.pretty = function(str) {
442     return utils.pretty(str);
443 };
444
445 /**
446  * @deprecated
447  * This function will be removed in a future version without replacement.
448  */
449 exports.findCompression = function(compressionMethod) {
450     return utils.findCompression(compressionMethod);
451 };
452
453 /**
454  * @deprecated
455  * This function will be removed in a future version without replacement.
456  */
457 exports.isRegExp = function (object) {
458     return utils.isRegExp(object);
459 };
460
461
462 },{"./utils":21}],8:[function(_dereq_,module,exports){
463 'use strict';
464 var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');
465
466 var pako = _dereq_("pako");
467 exports.uncompressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
468 exports.compressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
469
470 exports.magic = "\x08\x00";
471 exports.compress = function(input, compressionOptions) {
472     return pako.deflateRaw(input, {
473         level : compressionOptions.level || -1 // default compression
474     });
475 };
476 exports.uncompress =  function(input) {
477     return pako.inflateRaw(input);
478 };
479
480 },{"pako":24}],9:[function(_dereq_,module,exports){
481 'use strict';
482
483 var base64 = _dereq_('./base64');
484
485 /**
486 Usage:
487    zip = new JSZip();
488    zip.file("hello.txt", "Hello, World!").file("tempfile", "nothing");
489    zip.folder("images").file("smile.gif", base64Data, {base64: true});
490    zip.file("Xmas.txt", "Ho ho ho !", {date : new Date("December 25, 2007 00:00:01")});
491    zip.remove("tempfile");
492
493    base64zip = zip.generate();
494
495 **/
496
497 /**
498  * Representation a of zip file in js
499  * @constructor
500  * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional).
501  * @param {Object=} options the options for creating this objects (optional).
502  */
503 function JSZip(data, options) {
504     // if this constructor is used without `new`, it adds `new` before itself:
505     if(!(this instanceof JSZip)) return new JSZip(data, options);
506
507     // object containing the files :
508     // {
509     //   "folder/" : {...},
510     //   "folder/data.txt" : {...}
511     // }
512     this.files = {};
513
514     this.comment = null;
515
516     // Where we are in the hierarchy
517     this.root = "";
518     if (data) {
519         this.load(data, options);
520     }
521     this.clone = function() {
522         var newObj = new JSZip();
523         for (var i in this) {
524             if (typeof this[i] !== "function") {
525                 newObj[i] = this[i];
526             }
527         }
528         return newObj;
529     };
530 }
531 JSZip.prototype = _dereq_('./object');
532 JSZip.prototype.load = _dereq_('./load');
533 JSZip.support = _dereq_('./support');
534 JSZip.defaults = _dereq_('./defaults');
535
536 /**
537  * @deprecated
538  * This namespace will be removed in a future version without replacement.
539  */
540 JSZip.utils = _dereq_('./deprecatedPublicUtils');
541
542 JSZip.base64 = {
543     /**
544      * @deprecated
545      * This method will be removed in a future version without replacement.
546      */
547     encode : function(input) {
548         return base64.encode(input);
549     },
550     /**
551      * @deprecated
552      * This method will be removed in a future version without replacement.
553      */
554     decode : function(input) {
555         return base64.decode(input);
556     }
557 };
558 JSZip.compressions = _dereq_('./compressions');
559 module.exports = JSZip;
560
561 },{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(_dereq_,module,exports){
562 'use strict';
563 var base64 = _dereq_('./base64');
564 var ZipEntries = _dereq_('./zipEntries');
565 module.exports = function(data, options) {
566     var files, zipEntries, i, input;
567     options = options || {};
568     if (options.base64) {
569         data = base64.decode(data);
570     }
571
572     zipEntries = new ZipEntries(data, options);
573     files = zipEntries.files;
574     for (i = 0; i < files.length; i++) {
575         input = files[i];
576         this.file(input.fileName, input.decompressed, {
577             binary: true,
578             optimizedBinaryString: true,
579             date: input.date,
580             dir: input.dir,
581             comment : input.fileComment.length ? input.fileComment : null,
582             unixPermissions : input.unixPermissions,
583             dosPermissions : input.dosPermissions,
584             createFolders: options.createFolders
585         });
586     }
587     if (zipEntries.zipComment.length) {
588         this.comment = zipEntries.zipComment;
589     }
590
591     return this;
592 };
593
594 },{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){
595 (function (Buffer){
596 'use strict';
597 module.exports = function(data, encoding){
598     return new Buffer(data, encoding);
599 };
600 module.exports.test = function(b){
601     return Buffer.isBuffer(b);
602 };
603
604 }).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined))
605 },{}],12:[function(_dereq_,module,exports){
606 'use strict';
607 var Uint8ArrayReader = _dereq_('./uint8ArrayReader');
608
609 function NodeBufferReader(data) {
610     this.data = data;
611     this.length = this.data.length;
612     this.index = 0;
613 }
614 NodeBufferReader.prototype = new Uint8ArrayReader();
615
616 /**
617  * @see DataReader.readData
618  */
619 NodeBufferReader.prototype.readData = function(size) {
620     this.checkOffset(size);
621     var result = this.data.slice(this.index, this.index + size);
622     this.index += size;
623     return result;
624 };
625 module.exports = NodeBufferReader;
626
627 },{"./uint8ArrayReader":18}],13:[function(_dereq_,module,exports){
628 'use strict';
629 var support = _dereq_('./support');
630 var utils = _dereq_('./utils');
631 var crc32 = _dereq_('./crc32');
632 var signature = _dereq_('./signature');
633 var defaults = _dereq_('./defaults');
634 var base64 = _dereq_('./base64');
635 var compressions = _dereq_('./compressions');
636 var CompressedObject = _dereq_('./compressedObject');
637 var nodeBuffer = _dereq_('./nodeBuffer');
638 var utf8 = _dereq_('./utf8');
639 var StringWriter = _dereq_('./stringWriter');
640 var Uint8ArrayWriter = _dereq_('./uint8ArrayWriter');
641
642 /**
643  * Returns the raw data of a ZipObject, decompress the content if necessary.
644  * @param {ZipObject} file the file to use.
645  * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.
646  */
647 var getRawData = function(file) {
648     if (file._data instanceof CompressedObject) {
649         file._data = file._data.getContent();
650         file.options.binary = true;
651         file.options.base64 = false;
652
653         if (utils.getTypeOf(file._data) === "uint8array") {
654             var copy = file._data;
655             // when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array.
656             // if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file).
657             file._data = new Uint8Array(copy.length);
658             // with an empty Uint8Array, Opera fails with a "Offset larger than array size"
659             if (copy.length !== 0) {
660                 file._data.set(copy, 0);
661             }
662         }
663     }
664     return file._data;
665 };
666
667 /**
668  * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it.
669  * @param {ZipObject} file the file to use.
670  * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.
671  */
672 var getBinaryData = function(file) {
673     var result = getRawData(file),
674         type = utils.getTypeOf(result);
675     if (type === "string") {
676         if (!file.options.binary) {
677             // unicode text !
678             // unicode string => binary string is a painful process, check if we can avoid it.
679             if (support.nodebuffer) {
680                 return nodeBuffer(result, "utf-8");
681             }
682         }
683         return file.asBinary();
684     }
685     return result;
686 };
687
688 /**
689  * Transform this._data into a string.
690  * @param {function} filter a function String -> String, applied if not null on the result.
691  * @return {String} the string representing this._data.
692  */
693 var dataToString = function(asUTF8) {
694     var result = getRawData(this);
695     if (result === null || typeof result === "undefined") {
696         return "";
697     }
698     // if the data is a base64 string, we decode it before checking the encoding !
699     if (this.options.base64) {
700         result = base64.decode(result);
701     }
702     if (asUTF8 && this.options.binary) {
703         // JSZip.prototype.utf8decode supports arrays as input
704         // skip to array => string step, utf8decode will do it.
705         result = out.utf8decode(result);
706     }
707     else {
708         // no utf8 transformation, do the array => string step.
709         result = utils.transformTo("string", result);
710     }
711
712     if (!asUTF8 && !this.options.binary) {
713         result = utils.transformTo("string", out.utf8encode(result));
714     }
715     return result;
716 };
717 /**
718  * A simple object representing a file in the zip file.
719  * @constructor
720  * @param {string} name the name of the file
721  * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data
722  * @param {Object} options the options of the file
723  */
724 var ZipObject = function(name, data, options) {
725     this.name = name;
726     this.dir = options.dir;
727     this.date = options.date;
728     this.comment = options.comment;
729     this.unixPermissions = options.unixPermissions;
730     this.dosPermissions = options.dosPermissions;
731
732     this._data = data;
733     this.options = options;
734
735     /*
736      * This object contains initial values for dir and date.
737      * With them, we can check if the user changed the deprecated metadata in
738      * `ZipObject#options` or not.
739      */
740     this._initialMetadata = {
741       dir : options.dir,
742       date : options.date
743     };
744 };
745
746 ZipObject.prototype = {
747     /**
748      * Return the content as UTF8 string.
749      * @return {string} the UTF8 string.
750      */
751     asText: function() {
752         return dataToString.call(this, true);
753     },
754     /**
755      * Returns the binary content.
756      * @return {string} the content as binary.
757      */
758     asBinary: function() {
759         return dataToString.call(this, false);
760     },
761     /**
762      * Returns the content as a nodejs Buffer.
763      * @return {Buffer} the content as a Buffer.
764      */
765     asNodeBuffer: function() {
766         var result = getBinaryData(this);
767         return utils.transformTo("nodebuffer", result);
768     },
769     /**
770      * Returns the content as an Uint8Array.
771      * @return {Uint8Array} the content as an Uint8Array.
772      */
773     asUint8Array: function() {
774         var result = getBinaryData(this);
775         return utils.transformTo("uint8array", result);
776     },
777     /**
778      * Returns the content as an ArrayBuffer.
779      * @return {ArrayBuffer} the content as an ArrayBufer.
780      */
781     asArrayBuffer: function() {
782         return this.asUint8Array().buffer;
783     }
784 };
785
786 /**
787  * Transform an integer into a string in hexadecimal.
788  * @private
789  * @param {number} dec the number to convert.
790  * @param {number} bytes the number of bytes to generate.
791  * @returns {string} the result.
792  */
793 var decToHex = function(dec, bytes) {
794     var hex = "",
795         i;
796     for (i = 0; i < bytes; i++) {
797         hex += String.fromCharCode(dec & 0xff);
798         dec = dec >>> 8;
799     }
800     return hex;
801 };
802
803 /**
804  * Merge the objects passed as parameters into a new one.
805  * @private
806  * @param {...Object} var_args All objects to merge.
807  * @return {Object} a new object with the data of the others.
808  */
809 var extend = function() {
810     var result = {}, i, attr;
811     for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers
812         for (attr in arguments[i]) {
813             if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") {
814                 result[attr] = arguments[i][attr];
815             }
816         }
817     }
818     return result;
819 };
820
821 /**
822  * Transforms the (incomplete) options from the user into the complete
823  * set of options to create a file.
824  * @private
825  * @param {Object} o the options from the user.
826  * @return {Object} the complete set of options.
827  */
828 var prepareFileAttrs = function(o) {
829     o = o || {};
830     if (o.base64 === true && (o.binary === null || o.binary === undefined)) {
831         o.binary = true;
832     }
833     o = extend(o, defaults);
834     o.date = o.date || new Date();
835     if (o.compression !== null) o.compression = o.compression.toUpperCase();
836
837     return o;
838 };
839
840 /**
841  * Add a file in the current folder.
842  * @private
843  * @param {string} name the name of the file
844  * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file
845  * @param {Object} o the options of the file
846  * @return {Object} the new file.
847  */
848 var fileAdd = function(name, data, o) {
849     // be sure sub folders exist
850     var dataType = utils.getTypeOf(data),
851         parent;
852
853     o = prepareFileAttrs(o);
854
855     if (typeof o.unixPermissions === "string") {
856         o.unixPermissions = parseInt(o.unixPermissions, 8);
857     }
858
859     // UNX_IFDIR  0040000 see zipinfo.c
860     if (o.unixPermissions && (o.unixPermissions & 0x4000)) {
861         o.dir = true;
862     }
863     // Bit 4    Directory
864     if (o.dosPermissions && (o.dosPermissions & 0x0010)) {
865         o.dir = true;
866     }
867
868     if (o.dir) {
869         name = forceTrailingSlash(name);
870     }
871
872     if (o.createFolders && (parent = parentFolder(name))) {
873         folderAdd.call(this, parent, true);
874     }
875
876     if (o.dir || data === null || typeof data === "undefined") {
877         o.base64 = false;
878         o.binary = false;
879         data = null;
880         dataType = null;
881     }
882     else if (dataType === "string") {
883         if (o.binary && !o.base64) {
884             // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask
885             if (o.optimizedBinaryString !== true) {
886                 // this is a string, not in a base64 format.
887                 // Be sure that this is a correct "binary string"
888                 data = utils.string2binary(data);
889             }
890         }
891     }
892     else { // arraybuffer, uint8array, ...
893         o.base64 = false;
894         o.binary = true;
895
896         if (!dataType && !(data instanceof CompressedObject)) {
897             throw new Error("The data of '" + name + "' is in an unsupported format !");
898         }
899
900         // special case : it's way easier to work with Uint8Array than with ArrayBuffer
901         if (dataType === "arraybuffer") {
902             data = utils.transformTo("uint8array", data);
903         }
904     }
905
906     var object = new ZipObject(name, data, o);
907     this.files[name] = object;
908     return object;
909 };
910
911 /**
912  * Find the parent folder of the path.
913  * @private
914  * @param {string} path the path to use
915  * @return {string} the parent folder, or ""
916  */
917 var parentFolder = function (path) {
918     if (path.slice(-1) == '/') {
919         path = path.substring(0, path.length - 1);
920     }
921     var lastSlash = path.lastIndexOf('/');
922     return (lastSlash > 0) ? path.substring(0, lastSlash) : "";
923 };
924
925
926 /**
927  * Returns the path with a slash at the end.
928  * @private
929  * @param {String} path the path to check.
930  * @return {String} the path with a trailing slash.
931  */
932 var forceTrailingSlash = function(path) {
933     // Check the name ends with a /
934     if (path.slice(-1) != "/") {
935         path += "/"; // IE doesn't like substr(-1)
936     }
937     return path;
938 };
939 /**
940  * Add a (sub) folder in the current folder.
941  * @private
942  * @param {string} name the folder's name
943  * @param {boolean=} [createFolders] If true, automatically create sub
944  *  folders. Defaults to false.
945  * @return {Object} the new folder.
946  */
947 var folderAdd = function(name, createFolders) {
948     createFolders = (typeof createFolders !== 'undefined') ? createFolders : false;
949
950     name = forceTrailingSlash(name);
951
952     // Does this folder already exist?
953     if (!this.files[name]) {
954         fileAdd.call(this, name, null, {
955             dir: true,
956             createFolders: createFolders
957         });
958     }
959     return this.files[name];
960 };
961
962 /**
963  * Generate a JSZip.CompressedObject for a given zipOject.
964  * @param {ZipObject} file the object to read.
965  * @param {JSZip.compression} compression the compression to use.
966  * @param {Object} compressionOptions the options to use when compressing.
967  * @return {JSZip.CompressedObject} the compressed result.
968  */
969 var generateCompressedObjectFrom = function(file, compression, compressionOptions) {
970     var result = new CompressedObject(),
971         content;
972
973     // the data has not been decompressed, we might reuse things !
974     if (file._data instanceof CompressedObject) {
975         result.uncompressedSize = file._data.uncompressedSize;
976         result.crc32 = file._data.crc32;
977
978         if (result.uncompressedSize === 0 || file.dir) {
979             compression = compressions['STORE'];
980             result.compressedContent = "";
981             result.crc32 = 0;
982         }
983         else if (file._data.compressionMethod === compression.magic) {
984             result.compressedContent = file._data.getCompressedContent();
985         }
986         else {
987             content = file._data.getContent();
988             // need to decompress / recompress
989             result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);
990         }
991     }
992     else {
993         // have uncompressed data
994         content = getBinaryData(file);
995         if (!content || content.length === 0 || file.dir) {
996             compression = compressions['STORE'];
997             content = "";
998         }
999         result.uncompressedSize = content.length;
1000         result.crc32 = crc32(content);
1001         result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);
1002     }
1003
1004     result.compressedSize = result.compressedContent.length;
1005     result.compressionMethod = compression.magic;
1006
1007     return result;
1008 };
1009
1010
1011
1012
1013 /**
1014  * Generate the UNIX part of the external file attributes.
1015  * @param {Object} unixPermissions the unix permissions or null.
1016  * @param {Boolean} isDir true if the entry is a directory, false otherwise.
1017  * @return {Number} a 32 bit integer.
1018  *
1019  * adapted from http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute :
1020  *
1021  * TTTTsstrwxrwxrwx0000000000ADVSHR
1022  * ^^^^____________________________ file type, see zipinfo.c (UNX_*)
1023  *     ^^^_________________________ setuid, setgid, sticky
1024  *        ^^^^^^^^^________________ permissions
1025  *                 ^^^^^^^^^^______ not used ?
1026  *                           ^^^^^^ DOS attribute bits : Archive, Directory, Volume label, System file, Hidden, Read only
1027  */
1028 var generateUnixExternalFileAttr = function (unixPermissions, isDir) {
1029
1030     var result = unixPermissions;
1031     if (!unixPermissions) {
1032         // I can't use octal values in strict mode, hence the hexa.
1033         //  040775 => 0x41fd
1034         // 0100664 => 0x81b4
1035         result = isDir ? 0x41fd : 0x81b4;
1036     }
1037
1038     return (result & 0xFFFF) << 16;
1039 };
1040
1041 /**
1042  * Generate the DOS part of the external file attributes.
1043  * @param {Object} dosPermissions the dos permissions or null.
1044  * @param {Boolean} isDir true if the entry is a directory, false otherwise.
1045  * @return {Number} a 32 bit integer.
1046  *
1047  * Bit 0     Read-Only
1048  * Bit 1     Hidden
1049  * Bit 2     System
1050  * Bit 3     Volume Label
1051  * Bit 4     Directory
1052  * Bit 5     Archive
1053  */
1054 var generateDosExternalFileAttr = function (dosPermissions, isDir) {
1055
1056     // the dir flag is already set for compatibility
1057
1058     return (dosPermissions || 0)  & 0x3F;
1059 };
1060
1061 /**
1062  * Generate the various parts used in the construction of the final zip file.
1063  * @param {string} name the file name.
1064  * @param {ZipObject} file the file content.
1065  * @param {JSZip.CompressedObject} compressedObject the compressed object.
1066  * @param {number} offset the current offset from the start of the zip file.
1067  * @param {String} platform let's pretend we are this platform (change platform dependents fields)
1068  * @return {object} the zip parts.
1069  */
1070 var generateZipParts = function(name, file, compressedObject, offset, platform) {
1071     var data = compressedObject.compressedContent,
1072         utfEncodedFileName = utils.transformTo("string", utf8.utf8encode(file.name)),
1073         comment = file.comment || "",
1074         utfEncodedComment = utils.transformTo("string", utf8.utf8encode(comment)),
1075         useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,
1076         useUTF8ForComment = utfEncodedComment.length !== comment.length,
1077         o = file.options,
1078         dosTime,
1079         dosDate,
1080         extraFields = "",
1081         unicodePathExtraField = "",
1082         unicodeCommentExtraField = "",
1083         dir, date;
1084
1085
1086     // handle the deprecated options.dir
1087     if (file._initialMetadata.dir !== file.dir) {
1088         dir = file.dir;
1089     } else {
1090         dir = o.dir;
1091     }
1092
1093     // handle the deprecated options.date
1094     if(file._initialMetadata.date !== file.date) {
1095         date = file.date;
1096     } else {
1097         date = o.date;
1098     }
1099
1100     var extFileAttr = 0;
1101     var versionMadeBy = 0;
1102     if (dir) {
1103         // dos or unix, we set the dos dir flag
1104         extFileAttr |= 0x00010;
1105     }
1106     if(platform === "UNIX") {
1107         versionMadeBy = 0x031E; // UNIX, version 3.0
1108         extFileAttr |= generateUnixExternalFileAttr(file.unixPermissions, dir);
1109     } else { // DOS or other, fallback to DOS
1110         versionMadeBy = 0x0014; // DOS, version 2.0
1111         extFileAttr |= generateDosExternalFileAttr(file.dosPermissions, dir);
1112     }
1113
1114     // date
1115     // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html
1116     // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html
1117     // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html
1118
1119     dosTime = date.getHours();
1120     dosTime = dosTime << 6;
1121     dosTime = dosTime | date.getMinutes();
1122     dosTime = dosTime << 5;
1123     dosTime = dosTime | date.getSeconds() / 2;
1124
1125     dosDate = date.getFullYear() - 1980;
1126     dosDate = dosDate << 4;
1127     dosDate = dosDate | (date.getMonth() + 1);
1128     dosDate = dosDate << 5;
1129     dosDate = dosDate | date.getDate();
1130
1131     if (useUTF8ForFileName) {
1132         // set the unicode path extra field. unzip needs at least one extra
1133         // field to correctly handle unicode path, so using the path is as good
1134         // as any other information. This could improve the situation with
1135         // other archive managers too.
1136         // This field is usually used without the utf8 flag, with a non
1137         // unicode path in the header (winrar, winzip). This helps (a bit)
1138         // with the messy Windows' default compressed folders feature but
1139         // breaks on p7zip which doesn't seek the unicode path extra field.
1140         // So for now, UTF-8 everywhere !
1141         unicodePathExtraField =
1142             // Version
1143             decToHex(1, 1) +
1144             // NameCRC32
1145             decToHex(crc32(utfEncodedFileName), 4) +
1146             // UnicodeName
1147             utfEncodedFileName;
1148
1149         extraFields +=
1150             // Info-ZIP Unicode Path Extra Field
1151             "\x75\x70" +
1152             // size
1153             decToHex(unicodePathExtraField.length, 2) +
1154             // content
1155             unicodePathExtraField;
1156     }
1157
1158     if(useUTF8ForComment) {
1159
1160         unicodeCommentExtraField =
1161             // Version
1162             decToHex(1, 1) +
1163             // CommentCRC32
1164             decToHex(this.crc32(utfEncodedComment), 4) +
1165             // UnicodeName
1166             utfEncodedComment;
1167
1168         extraFields +=
1169             // Info-ZIP Unicode Path Extra Field
1170             "\x75\x63" +
1171             // size
1172             decToHex(unicodeCommentExtraField.length, 2) +
1173             // content
1174             unicodeCommentExtraField;
1175     }
1176
1177     var header = "";
1178
1179     // version needed to extract
1180     header += "\x0A\x00";
1181     // general purpose bit flag
1182     // set bit 11 if utf8
1183     header += (useUTF8ForFileName || useUTF8ForComment) ? "\x00\x08" : "\x00\x00";
1184     // compression method
1185     header += compressedObject.compressionMethod;
1186     // last mod file time
1187     header += decToHex(dosTime, 2);
1188     // last mod file date
1189     header += decToHex(dosDate, 2);
1190     // crc-32
1191     header += decToHex(compressedObject.crc32, 4);
1192     // compressed size
1193     header += decToHex(compressedObject.compressedSize, 4);
1194     // uncompressed size
1195     header += decToHex(compressedObject.uncompressedSize, 4);
1196     // file name length
1197     header += decToHex(utfEncodedFileName.length, 2);
1198     // extra field length
1199     header += decToHex(extraFields.length, 2);
1200
1201
1202     var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields;
1203
1204     var dirRecord = signature.CENTRAL_FILE_HEADER +
1205     // version made by (00: DOS)
1206     decToHex(versionMadeBy, 2) +
1207     // file header (common to file and central directory)
1208     header +
1209     // file comment length
1210     decToHex(utfEncodedComment.length, 2) +
1211     // disk number start
1212     "\x00\x00" +
1213     // internal file attributes TODO
1214     "\x00\x00" +
1215     // external file attributes
1216     decToHex(extFileAttr, 4) +
1217     // relative offset of local header
1218     decToHex(offset, 4) +
1219     // file name
1220     utfEncodedFileName +
1221     // extra field
1222     extraFields +
1223     // file comment
1224     utfEncodedComment;
1225
1226     return {
1227         fileRecord: fileRecord,
1228         dirRecord: dirRecord,
1229         compressedObject: compressedObject
1230     };
1231 };
1232
1233
1234 // return the actual prototype of JSZip
1235 var out = {
1236     /**
1237      * Read an existing zip and merge the data in the current JSZip object.
1238      * The implementation is in jszip-load.js, don't forget to include it.
1239      * @param {String|ArrayBuffer|Uint8Array|Buffer} stream  The stream to load
1240      * @param {Object} options Options for loading the stream.
1241      *  options.base64 : is the stream in base64 ? default : false
1242      * @return {JSZip} the current JSZip object
1243      */
1244     load: function(stream, options) {
1245         throw new Error("Load method is not defined. Is the file jszip-load.js included ?");
1246     },
1247
1248     /**
1249      * Filter nested files/folders with the specified function.
1250      * @param {Function} search the predicate to use :
1251      * function (relativePath, file) {...}
1252      * It takes 2 arguments : the relative path and the file.
1253      * @return {Array} An array of matching elements.
1254      */
1255     filter: function(search) {
1256         var result = [],
1257             filename, relativePath, file, fileClone;
1258         for (filename in this.files) {
1259             if (!this.files.hasOwnProperty(filename)) {
1260                 continue;
1261             }
1262             file = this.files[filename];
1263             // return a new object, don't let the user mess with our internal objects :)
1264             fileClone = new ZipObject(file.name, file._data, extend(file.options));
1265             relativePath = filename.slice(this.root.length, filename.length);
1266             if (filename.slice(0, this.root.length) === this.root && // the file is in the current root
1267             search(relativePath, fileClone)) { // and the file matches the function
1268                 result.push(fileClone);
1269             }
1270         }
1271         return result;
1272     },
1273
1274     /**
1275      * Add a file to the zip file, or search a file.
1276      * @param   {string|RegExp} name The name of the file to add (if data is defined),
1277      * the name of the file to find (if no data) or a regex to match files.
1278      * @param   {String|ArrayBuffer|Uint8Array|Buffer} data  The file data, either raw or base64 encoded
1279      * @param   {Object} o     File options
1280      * @return  {JSZip|Object|Array} this JSZip object (when adding a file),
1281      * a file (when searching by string) or an array of files (when searching by regex).
1282      */
1283     file: function(name, data, o) {
1284         if (arguments.length === 1) {
1285             if (utils.isRegExp(name)) {
1286                 var regexp = name;
1287                 return this.filter(function(relativePath, file) {
1288                     return !file.dir && regexp.test(relativePath);
1289                 });
1290             }
1291             else { // text
1292                 return this.filter(function(relativePath, file) {
1293                     return !file.dir && relativePath === name;
1294                 })[0] || null;
1295             }
1296         }
1297         else { // more than one argument : we have data !
1298             name = this.root + name;
1299             fileAdd.call(this, name, data, o);
1300         }
1301         return this;
1302     },
1303
1304     /**
1305      * Add a directory to the zip file, or search.
1306      * @param   {String|RegExp} arg The name of the directory to add, or a regex to search folders.
1307      * @return  {JSZip} an object with the new directory as the root, or an array containing matching folders.
1308      */
1309     folder: function(arg) {
1310         if (!arg) {
1311             return this;
1312         }
1313
1314         if (utils.isRegExp(arg)) {
1315             return this.filter(function(relativePath, file) {
1316                 return file.dir && arg.test(relativePath);
1317             });
1318         }
1319
1320         // else, name is a new folder
1321         var name = this.root + arg;
1322         var newFolder = folderAdd.call(this, name);
1323
1324         // Allow chaining by returning a new object with this folder as the root
1325         var ret = this.clone();
1326         ret.root = newFolder.name;
1327         return ret;
1328     },
1329
1330     /**
1331      * Delete a file, or a directory and all sub-files, from the zip
1332      * @param {string} name the name of the file to delete
1333      * @return {JSZip} this JSZip object
1334      */
1335     remove: function(name) {
1336         name = this.root + name;
1337         var file = this.files[name];
1338         if (!file) {
1339             // Look for any folders
1340             if (name.slice(-1) != "/") {
1341                 name += "/";
1342             }
1343             file = this.files[name];
1344         }
1345
1346         if (file && !file.dir) {
1347             // file
1348             delete this.files[name];
1349         } else {
1350             // maybe a folder, delete recursively
1351             var kids = this.filter(function(relativePath, file) {
1352                 return file.name.slice(0, name.length) === name;
1353             });
1354             for (var i = 0; i < kids.length; i++) {
1355                 delete this.files[kids[i].name];
1356             }
1357         }
1358
1359         return this;
1360     },
1361
1362     /**
1363      * Generate the complete zip file
1364      * @param {Object} options the options to generate the zip file :
1365      * - base64, (deprecated, use type instead) true to generate base64.
1366      * - compression, "STORE" by default.
1367      * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob.
1368      * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file
1369      */
1370     generate: function(options) {
1371         options = extend(options || {}, {
1372             base64: true,
1373             compression: "STORE",
1374             compressionOptions : null,
1375             type: "base64",
1376             platform: "DOS",
1377             comment: null,
1378             mimeType: 'application/zip'
1379         });
1380
1381         utils.checkSupport(options.type);
1382
1383         // accept nodejs `process.platform`
1384         if(
1385           options.platform === 'darwin' ||
1386           options.platform === 'freebsd' ||
1387           options.platform === 'linux' ||
1388           options.platform === 'sunos'
1389         ) {
1390           options.platform = "UNIX";
1391         }
1392         if (options.platform === 'win32') {
1393           options.platform = "DOS";
1394         }
1395
1396         var zipData = [],
1397             localDirLength = 0,
1398             centralDirLength = 0,
1399             writer, i,
1400             utfEncodedComment = utils.transformTo("string", this.utf8encode(options.comment || this.comment || ""));
1401
1402         // first, generate all the zip parts.
1403         for (var name in this.files) {
1404             if (!this.files.hasOwnProperty(name)) {
1405                 continue;
1406             }
1407             var file = this.files[name];
1408
1409             var compressionName = file.options.compression || options.compression.toUpperCase();
1410             var compression = compressions[compressionName];
1411             if (!compression) {
1412                 throw new Error(compressionName + " is not a valid compression method !");
1413             }
1414             var compressionOptions = file.options.compressionOptions || options.compressionOptions || {};
1415
1416             var compressedObject = generateCompressedObjectFrom.call(this, file, compression, compressionOptions);
1417
1418             var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength, options.platform);
1419             localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;
1420             centralDirLength += zipPart.dirRecord.length;
1421             zipData.push(zipPart);
1422         }
1423
1424         var dirEnd = "";
1425
1426         // end of central dir signature
1427         dirEnd = signature.CENTRAL_DIRECTORY_END +
1428         // number of this disk
1429         "\x00\x00" +
1430         // number of the disk with the start of the central directory
1431         "\x00\x00" +
1432         // total number of entries in the central directory on this disk
1433         decToHex(zipData.length, 2) +
1434         // total number of entries in the central directory
1435         decToHex(zipData.length, 2) +
1436         // size of the central directory   4 bytes
1437         decToHex(centralDirLength, 4) +
1438         // offset of start of central directory with respect to the starting disk number
1439         decToHex(localDirLength, 4) +
1440         // .ZIP file comment length
1441         decToHex(utfEncodedComment.length, 2) +
1442         // .ZIP file comment
1443         utfEncodedComment;
1444
1445
1446         // we have all the parts (and the total length)
1447         // time to create a writer !
1448         var typeName = options.type.toLowerCase();
1449         if(typeName==="uint8array"||typeName==="arraybuffer"||typeName==="blob"||typeName==="nodebuffer") {
1450             writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);
1451         }else{
1452             writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);
1453         }
1454
1455         for (i = 0; i < zipData.length; i++) {
1456             writer.append(zipData[i].fileRecord);
1457             writer.append(zipData[i].compressedObject.compressedContent);
1458         }
1459         for (i = 0; i < zipData.length; i++) {
1460             writer.append(zipData[i].dirRecord);
1461         }
1462
1463         writer.append(dirEnd);
1464
1465         var zip = writer.finalize();
1466
1467
1468
1469         switch(options.type.toLowerCase()) {
1470             // case "zip is an Uint8Array"
1471             case "uint8array" :
1472             case "arraybuffer" :
1473             case "nodebuffer" :
1474                return utils.transformTo(options.type.toLowerCase(), zip);
1475             case "blob" :
1476                return utils.arrayBuffer2Blob(utils.transformTo("arraybuffer", zip), options.mimeType);
1477             // case "zip is a string"
1478             case "base64" :
1479                return (options.base64) ? base64.encode(zip) : zip;
1480             default : // case "string" :
1481                return zip;
1482          }
1483
1484     },
1485
1486     /**
1487      * @deprecated
1488      * This method will be removed in a future version without replacement.
1489      */
1490     crc32: function (input, crc) {
1491         return crc32(input, crc);
1492     },
1493
1494     /**
1495      * @deprecated
1496      * This method will be removed in a future version without replacement.
1497      */
1498     utf8encode: function (string) {
1499         return utils.transformTo("string", utf8.utf8encode(string));
1500     },
1501
1502     /**
1503      * @deprecated
1504      * This method will be removed in a future version without replacement.
1505      */
1506     utf8decode: function (input) {
1507         return utf8.utf8decode(input);
1508     }
1509 };
1510 module.exports = out;
1511
1512 },{"./base64":1,"./compressedObject":2,"./compressions":3,"./crc32":4,"./defaults":6,"./nodeBuffer":11,"./signature":14,"./stringWriter":16,"./support":17,"./uint8ArrayWriter":19,"./utf8":20,"./utils":21}],14:[function(_dereq_,module,exports){
1513 'use strict';
1514 exports.LOCAL_FILE_HEADER = "PK\x03\x04";
1515 exports.CENTRAL_FILE_HEADER = "PK\x01\x02";
1516 exports.CENTRAL_DIRECTORY_END = "PK\x05\x06";
1517 exports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x06\x07";
1518 exports.ZIP64_CENTRAL_DIRECTORY_END = "PK\x06\x06";
1519 exports.DATA_DESCRIPTOR = "PK\x07\x08";
1520
1521 },{}],15:[function(_dereq_,module,exports){
1522 'use strict';
1523 var DataReader = _dereq_('./dataReader');
1524 var utils = _dereq_('./utils');
1525
1526 function StringReader(data, optimizedBinaryString) {
1527     this.data = data;
1528     if (!optimizedBinaryString) {
1529         this.data = utils.string2binary(this.data);
1530     }
1531     this.length = this.data.length;
1532     this.index = 0;
1533 }
1534 StringReader.prototype = new DataReader();
1535 /**
1536  * @see DataReader.byteAt
1537  */
1538 StringReader.prototype.byteAt = function(i) {
1539     return this.data.charCodeAt(i);
1540 };
1541 /**
1542  * @see DataReader.lastIndexOfSignature
1543  */
1544 StringReader.prototype.lastIndexOfSignature = function(sig) {
1545     return this.data.lastIndexOf(sig);
1546 };
1547 /**
1548  * @see DataReader.readData
1549  */
1550 StringReader.prototype.readData = function(size) {
1551     this.checkOffset(size);
1552     // this will work because the constructor applied the "& 0xff" mask.
1553     var result = this.data.slice(this.index, this.index + size);
1554     this.index += size;
1555     return result;
1556 };
1557 module.exports = StringReader;
1558
1559 },{"./dataReader":5,"./utils":21}],16:[function(_dereq_,module,exports){
1560 'use strict';
1561
1562 var utils = _dereq_('./utils');
1563
1564 /**
1565  * An object to write any content to a string.
1566  * @constructor
1567  */
1568 var StringWriter = function() {
1569     this.data = [];
1570 };
1571 StringWriter.prototype = {
1572     /**
1573      * Append any content to the current string.
1574      * @param {Object} input the content to add.
1575      */
1576     append: function(input) {
1577         input = utils.transformTo("string", input);
1578         this.data.push(input);
1579     },
1580     /**
1581      * Finalize the construction an return the result.
1582      * @return {string} the generated string.
1583      */
1584     finalize: function() {
1585         return this.data.join("");
1586     }
1587 };
1588
1589 module.exports = StringWriter;
1590
1591 },{"./utils":21}],17:[function(_dereq_,module,exports){
1592 (function (Buffer){
1593 'use strict';
1594 exports.base64 = true;
1595 exports.array = true;
1596 exports.string = true;
1597 exports.arraybuffer = typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined";
1598 // contains true if JSZip can read/generate nodejs Buffer, false otherwise.
1599 // Browserify will provide a Buffer implementation for browsers, which is
1600 // an augmented Uint8Array (i.e., can be used as either Buffer or U8).
1601 exports.nodebuffer = typeof Buffer !== "undefined";
1602 // contains true if JSZip can read/generate Uint8Array, false otherwise.
1603 exports.uint8array = typeof Uint8Array !== "undefined";
1604
1605 if (typeof ArrayBuffer === "undefined") {
1606     exports.blob = false;
1607 }
1608 else {
1609     var buffer = new ArrayBuffer(0);
1610     try {
1611         exports.blob = new Blob([buffer], {
1612             type: "application/zip"
1613         }).size === 0;
1614     }
1615     catch (e) {
1616         try {
1617             var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
1618             var builder = new Builder();
1619             builder.append(buffer);
1620             exports.blob = builder.getBlob('application/zip').size === 0;
1621         }
1622         catch (e) {
1623             exports.blob = false;
1624         }
1625     }
1626 }
1627
1628 }).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined))
1629 },{}],18:[function(_dereq_,module,exports){
1630 'use strict';
1631 var DataReader = _dereq_('./dataReader');
1632
1633 function Uint8ArrayReader(data) {
1634     if (data) {
1635         this.data = data;
1636         this.length = this.data.length;
1637         this.index = 0;
1638     }
1639 }
1640 Uint8ArrayReader.prototype = new DataReader();
1641 /**
1642  * @see DataReader.byteAt
1643  */
1644 Uint8ArrayReader.prototype.byteAt = function(i) {
1645     return this.data[i];
1646 };
1647 /**
1648  * @see DataReader.lastIndexOfSignature
1649  */
1650 Uint8ArrayReader.prototype.lastIndexOfSignature = function(sig) {
1651     var sig0 = sig.charCodeAt(0),
1652         sig1 = sig.charCodeAt(1),
1653         sig2 = sig.charCodeAt(2),
1654         sig3 = sig.charCodeAt(3);
1655     for (var i = this.length - 4; i >= 0; --i) {
1656         if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {
1657             return i;
1658         }
1659     }
1660
1661     return -1;
1662 };
1663 /**
1664  * @see DataReader.readData
1665  */
1666 Uint8ArrayReader.prototype.readData = function(size) {
1667     this.checkOffset(size);
1668     if(size === 0) {
1669         // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].
1670         return new Uint8Array(0);
1671     }
1672     var result = this.data.subarray(this.index, this.index + size);
1673     this.index += size;
1674     return result;
1675 };
1676 module.exports = Uint8ArrayReader;
1677
1678 },{"./dataReader":5}],19:[function(_dereq_,module,exports){
1679 'use strict';
1680
1681 var utils = _dereq_('./utils');
1682
1683 /**
1684  * An object to write any content to an Uint8Array.
1685  * @constructor
1686  * @param {number} length The length of the array.
1687  */
1688 var Uint8ArrayWriter = function(length) {
1689     this.data = new Uint8Array(length);
1690     this.index = 0;
1691 };
1692 Uint8ArrayWriter.prototype = {
1693     /**
1694      * Append any content to the current array.
1695      * @param {Object} input the content to add.
1696      */
1697     append: function(input) {
1698         if (input.length !== 0) {
1699             // with an empty Uint8Array, Opera fails with a "Offset larger than array size"
1700             input = utils.transformTo("uint8array", input);
1701             this.data.set(input, this.index);
1702             this.index += input.length;
1703         }
1704     },
1705     /**
1706      * Finalize the construction an return the result.
1707      * @return {Uint8Array} the generated array.
1708      */
1709     finalize: function() {
1710         return this.data;
1711     }
1712 };
1713
1714 module.exports = Uint8ArrayWriter;
1715
1716 },{"./utils":21}],20:[function(_dereq_,module,exports){
1717 'use strict';
1718
1719 var utils = _dereq_('./utils');
1720 var support = _dereq_('./support');
1721 var nodeBuffer = _dereq_('./nodeBuffer');
1722
1723 /**
1724  * The following functions come from pako, from pako/lib/utils/strings
1725  * released under the MIT license, see pako https://github.com/nodeca/pako/
1726  */
1727
1728 // Table with utf8 lengths (calculated by first byte of sequence)
1729 // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
1730 // because max possible codepoint is 0x10ffff
1731 var _utf8len = new Array(256);
1732 for (var i=0; i<256; i++) {
1733   _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);
1734 }
1735 _utf8len[254]=_utf8len[254]=1; // Invalid sequence start
1736
1737 // convert string to array (typed, when possible)
1738 var string2buf = function (str) {
1739     var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
1740
1741     // count binary size
1742     for (m_pos = 0; m_pos < str_len; m_pos++) {
1743         c = str.charCodeAt(m_pos);
1744         if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
1745             c2 = str.charCodeAt(m_pos+1);
1746             if ((c2 & 0xfc00) === 0xdc00) {
1747                 c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
1748                 m_pos++;
1749             }
1750         }
1751         buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
1752     }
1753
1754     // allocate buffer
1755     if (support.uint8array) {
1756         buf = new Uint8Array(buf_len);
1757     } else {
1758         buf = new Array(buf_len);
1759     }
1760
1761     // convert
1762     for (i=0, m_pos = 0; i < buf_len; m_pos++) {
1763         c = str.charCodeAt(m_pos);
1764         if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
1765             c2 = str.charCodeAt(m_pos+1);
1766             if ((c2 & 0xfc00) === 0xdc00) {
1767                 c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
1768                 m_pos++;
1769             }
1770         }
1771         if (c < 0x80) {
1772             /* one byte */
1773             buf[i++] = c;
1774         } else if (c < 0x800) {
1775             /* two bytes */
1776             buf[i++] = 0xC0 | (c >>> 6);
1777             buf[i++] = 0x80 | (c & 0x3f);
1778         } else if (c < 0x10000) {
1779             /* three bytes */
1780             buf[i++] = 0xE0 | (c >>> 12);
1781             buf[i++] = 0x80 | (c >>> 6 & 0x3f);
1782             buf[i++] = 0x80 | (c & 0x3f);
1783         } else {
1784             /* four bytes */
1785             buf[i++] = 0xf0 | (c >>> 18);
1786             buf[i++] = 0x80 | (c >>> 12 & 0x3f);
1787             buf[i++] = 0x80 | (c >>> 6 & 0x3f);
1788             buf[i++] = 0x80 | (c & 0x3f);
1789         }
1790     }
1791
1792     return buf;
1793 };
1794
1795 // Calculate max possible position in utf8 buffer,
1796 // that will not break sequence. If that's not possible
1797 // - (very small limits) return max size as is.
1798 //
1799 // buf[] - utf8 bytes array
1800 // max   - length limit (mandatory);
1801 var utf8border = function(buf, max) {
1802     var pos;
1803
1804     max = max || buf.length;
1805     if (max > buf.length) { max = buf.length; }
1806
1807     // go back from last position, until start of sequence found
1808     pos = max-1;
1809     while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
1810
1811     // Fuckup - very small and broken sequence,
1812     // return max, because we should return something anyway.
1813     if (pos < 0) { return max; }
1814
1815     // If we came to start of buffer - that means vuffer is too small,
1816     // return max too.
1817     if (pos === 0) { return max; }
1818
1819     return (pos + _utf8len[buf[pos]] > max) ? pos : max;
1820 };
1821
1822 // convert array to string
1823 var buf2string = function (buf) {
1824     var str, i, out, c, c_len;
1825     var len = buf.length;
1826
1827     // Reserve max possible length (2 words per char)
1828     // NB: by unknown reasons, Array is significantly faster for
1829     //     String.fromCharCode.apply than Uint16Array.
1830     var utf16buf = new Array(len*2);
1831
1832     for (out=0, i=0; i<len;) {
1833         c = buf[i++];
1834         // quick process ascii
1835         if (c < 0x80) { utf16buf[out++] = c; continue; }
1836
1837         c_len = _utf8len[c];
1838         // skip 5 & 6 byte codes
1839         if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }
1840
1841         // apply mask on first byte
1842         c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
1843         // join the rest
1844         while (c_len > 1 && i < len) {
1845             c = (c << 6) | (buf[i++] & 0x3f);
1846             c_len--;
1847         }
1848
1849         // terminated by end of string?
1850         if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
1851
1852         if (c < 0x10000) {
1853             utf16buf[out++] = c;
1854         } else {
1855             c -= 0x10000;
1856             utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
1857             utf16buf[out++] = 0xdc00 | (c & 0x3ff);
1858         }
1859     }
1860
1861     // shrinkBuf(utf16buf, out)
1862     if (utf16buf.length !== out) {
1863         if(utf16buf.subarray) {
1864             utf16buf = utf16buf.subarray(0, out);
1865         } else {
1866             utf16buf.length = out;
1867         }
1868     }
1869
1870     // return String.fromCharCode.apply(null, utf16buf);
1871     return utils.applyFromCharCode(utf16buf);
1872 };
1873
1874
1875 // That's all for the pako functions.
1876
1877
1878 /**
1879  * Transform a javascript string into an array (typed if possible) of bytes,
1880  * UTF-8 encoded.
1881  * @param {String} str the string to encode
1882  * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.
1883  */
1884 exports.utf8encode = function utf8encode(str) {
1885     if (support.nodebuffer) {
1886         return nodeBuffer(str, "utf-8");
1887     }
1888
1889     return string2buf(str);
1890 };
1891
1892
1893 /**
1894  * Transform a bytes array (or a representation) representing an UTF-8 encoded
1895  * string into a javascript string.
1896  * @param {Array|Uint8Array|Buffer} buf the data de decode
1897  * @return {String} the decoded string.
1898  */
1899 exports.utf8decode = function utf8decode(buf) {
1900     if (support.nodebuffer) {
1901         return utils.transformTo("nodebuffer", buf).toString("utf-8");
1902     }
1903
1904     buf = utils.transformTo(support.uint8array ? "uint8array" : "array", buf);
1905
1906     // return buf2string(buf);
1907     // Chrome prefers to work with "small" chunks of data
1908     // for the method buf2string.
1909     // Firefox and Chrome has their own shortcut, IE doesn't seem to really care.
1910     var result = [], k = 0, len = buf.length, chunk = 65536;
1911     while (k < len) {
1912         var nextBoundary = utf8border(buf, Math.min(k + chunk, len));
1913         if (support.uint8array) {
1914             result.push(buf2string(buf.subarray(k, nextBoundary)));
1915         } else {
1916             result.push(buf2string(buf.slice(k, nextBoundary)));
1917         }
1918         k = nextBoundary;
1919     }
1920     return result.join("");
1921
1922 };
1923 // vim: set shiftwidth=4 softtabstop=4:
1924
1925 },{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(_dereq_,module,exports){
1926 'use strict';
1927 var support = _dereq_('./support');
1928 var compressions = _dereq_('./compressions');
1929 var nodeBuffer = _dereq_('./nodeBuffer');
1930 /**
1931  * Convert a string to a "binary string" : a string containing only char codes between 0 and 255.
1932  * @param {string} str the string to transform.
1933  * @return {String} the binary string.
1934  */
1935 exports.string2binary = function(str) {
1936     var result = "";
1937     for (var i = 0; i < str.length; i++) {
1938         result += String.fromCharCode(str.charCodeAt(i) & 0xff);
1939     }
1940     return result;
1941 };
1942 exports.arrayBuffer2Blob = function(buffer, mimeType) {
1943     exports.checkSupport("blob");
1944         mimeType = mimeType || 'application/zip';
1945
1946     try {
1947         // Blob constructor
1948         return new Blob([buffer], {
1949             type: mimeType
1950         });
1951     }
1952     catch (e) {
1953
1954         try {
1955             // deprecated, browser only, old way
1956             var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
1957             var builder = new Builder();
1958             builder.append(buffer);
1959             return builder.getBlob(mimeType);
1960         }
1961         catch (e) {
1962
1963             // well, fuck ?!
1964             throw new Error("Bug : can't construct the Blob.");
1965         }
1966     }
1967
1968
1969 };
1970 /**
1971  * The identity function.
1972  * @param {Object} input the input.
1973  * @return {Object} the same input.
1974  */
1975 function identity(input) {
1976     return input;
1977 }
1978
1979 /**
1980  * Fill in an array with a string.
1981  * @param {String} str the string to use.
1982  * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).
1983  * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.
1984  */
1985 function stringToArrayLike(str, array) {
1986     for (var i = 0; i < str.length; ++i) {
1987         array[i] = str.charCodeAt(i) & 0xFF;
1988     }
1989     return array;
1990 }
1991
1992 /**
1993  * Transform an array-like object to a string.
1994  * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.
1995  * @return {String} the result.
1996  */
1997 function arrayLikeToString(array) {
1998     // Performances notes :
1999     // --------------------
2000     // String.fromCharCode.apply(null, array) is the fastest, see
2001     // see http://jsperf.com/converting-a-uint8array-to-a-string/2
2002     // but the stack is limited (and we can get huge arrays !).
2003     //
2004     // result += String.fromCharCode(array[i]); generate too many strings !
2005     //
2006     // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2
2007     var chunk = 65536;
2008     var result = [],
2009         len = array.length,
2010         type = exports.getTypeOf(array),
2011         k = 0,
2012         canUseApply = true;
2013       try {
2014          switch(type) {
2015             case "uint8array":
2016                String.fromCharCode.apply(null, new Uint8Array(0));
2017                break;
2018             case "nodebuffer":
2019                String.fromCharCode.apply(null, nodeBuffer(0));
2020                break;
2021          }
2022       } catch(e) {
2023          canUseApply = false;
2024       }
2025
2026       // no apply : slow and painful algorithm
2027       // default browser on android 4.*
2028       if (!canUseApply) {
2029          var resultStr = "";
2030          for(var i = 0; i < array.length;i++) {
2031             resultStr += String.fromCharCode(array[i]);
2032          }
2033     return resultStr;
2034     }
2035     while (k < len && chunk > 1) {
2036         try {
2037             if (type === "array" || type === "nodebuffer") {
2038                 result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));
2039             }
2040             else {
2041                 result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));
2042             }
2043             k += chunk;
2044         }
2045         catch (e) {
2046             chunk = Math.floor(chunk / 2);
2047         }
2048     }
2049     return result.join("");
2050 }
2051
2052 exports.applyFromCharCode = arrayLikeToString;
2053
2054
2055 /**
2056  * Copy the data from an array-like to an other array-like.
2057  * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.
2058  * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.
2059  * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.
2060  */
2061 function arrayLikeToArrayLike(arrayFrom, arrayTo) {
2062     for (var i = 0; i < arrayFrom.length; i++) {
2063         arrayTo[i] = arrayFrom[i];
2064     }
2065     return arrayTo;
2066 }
2067
2068 // a matrix containing functions to transform everything into everything.
2069 var transform = {};
2070
2071 // string to ?
2072 transform["string"] = {
2073     "string": identity,
2074     "array": function(input) {
2075         return stringToArrayLike(input, new Array(input.length));
2076     },
2077     "arraybuffer": function(input) {
2078         return transform["string"]["uint8array"](input).buffer;
2079     },
2080     "uint8array": function(input) {
2081         return stringToArrayLike(input, new Uint8Array(input.length));
2082     },
2083     "nodebuffer": function(input) {
2084         return stringToArrayLike(input, nodeBuffer(input.length));
2085     }
2086 };
2087
2088 // array to ?
2089 transform["array"] = {
2090     "string": arrayLikeToString,
2091     "array": identity,
2092     "arraybuffer": function(input) {
2093         return (new Uint8Array(input)).buffer;
2094     },
2095     "uint8array": function(input) {
2096         return new Uint8Array(input);
2097     },
2098     "nodebuffer": function(input) {
2099         return nodeBuffer(input);
2100     }
2101 };
2102
2103 // arraybuffer to ?
2104 transform["arraybuffer"] = {
2105     "string": function(input) {
2106         return arrayLikeToString(new Uint8Array(input));
2107     },
2108     "array": function(input) {
2109         return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));
2110     },
2111     "arraybuffer": identity,
2112     "uint8array": function(input) {
2113         return new Uint8Array(input);
2114     },
2115     "nodebuffer": function(input) {
2116         return nodeBuffer(new Uint8Array(input));
2117     }
2118 };
2119
2120 // uint8array to ?
2121 transform["uint8array"] = {
2122     "string": arrayLikeToString,
2123     "array": function(input) {
2124         return arrayLikeToArrayLike(input, new Array(input.length));
2125     },
2126     "arraybuffer": function(input) {
2127         return input.buffer;
2128     },
2129     "uint8array": identity,
2130     "nodebuffer": function(input) {
2131         return nodeBuffer(input);
2132     }
2133 };
2134
2135 // nodebuffer to ?
2136 transform["nodebuffer"] = {
2137     "string": arrayLikeToString,
2138     "array": function(input) {
2139         return arrayLikeToArrayLike(input, new Array(input.length));
2140     },
2141     "arraybuffer": function(input) {
2142         return transform["nodebuffer"]["uint8array"](input).buffer;
2143     },
2144     "uint8array": function(input) {
2145         return arrayLikeToArrayLike(input, new Uint8Array(input.length));
2146     },
2147     "nodebuffer": identity
2148 };
2149
2150 /**
2151  * Transform an input into any type.
2152  * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.
2153  * If no output type is specified, the unmodified input will be returned.
2154  * @param {String} outputType the output type.
2155  * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.
2156  * @throws {Error} an Error if the browser doesn't support the requested output type.
2157  */
2158 exports.transformTo = function(outputType, input) {
2159     if (!input) {
2160         // undefined, null, etc
2161         // an empty string won't harm.
2162         input = "";
2163     }
2164     if (!outputType) {
2165         return input;
2166     }
2167     exports.checkSupport(outputType);
2168     var inputType = exports.getTypeOf(input);
2169     var result = transform[inputType][outputType](input);
2170     return result;
2171 };
2172
2173 /**
2174  * Return the type of the input.
2175  * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.
2176  * @param {Object} input the input to identify.
2177  * @return {String} the (lowercase) type of the input.
2178  */
2179 exports.getTypeOf = function(input) {
2180     if (typeof input === "string") {
2181         return "string";
2182     }
2183     if (Object.prototype.toString.call(input) === "[object Array]") {
2184         return "array";
2185     }
2186     if (support.nodebuffer && nodeBuffer.test(input)) {
2187         return "nodebuffer";
2188     }
2189     if (support.uint8array && input instanceof Uint8Array) {
2190         return "uint8array";
2191     }
2192     if (support.arraybuffer && input instanceof ArrayBuffer) {
2193         return "arraybuffer";
2194     }
2195 };
2196
2197 /**
2198  * Throw an exception if the type is not supported.
2199  * @param {String} type the type to check.
2200  * @throws {Error} an Error if the browser doesn't support the requested type.
2201  */
2202 exports.checkSupport = function(type) {
2203     var supported = support[type.toLowerCase()];
2204     if (!supported) {
2205         throw new Error(type + " is not supported by this browser");
2206     }
2207 };
2208 exports.MAX_VALUE_16BITS = 65535;
2209 exports.MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1
2210
2211 /**
2212  * Prettify a string read as binary.
2213  * @param {string} str the string to prettify.
2214  * @return {string} a pretty string.
2215  */
2216 exports.pretty = function(str) {
2217     var res = '',
2218         code, i;
2219     for (i = 0; i < (str || "").length; i++) {
2220         code = str.charCodeAt(i);
2221         res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase();
2222     }
2223     return res;
2224 };
2225
2226 /**
2227  * Find a compression registered in JSZip.
2228  * @param {string} compressionMethod the method magic to find.
2229  * @return {Object|null} the JSZip compression object, null if none found.
2230  */
2231 exports.findCompression = function(compressionMethod) {
2232     for (var method in compressions) {
2233         if (!compressions.hasOwnProperty(method)) {
2234             continue;
2235         }
2236         if (compressions[method].magic === compressionMethod) {
2237             return compressions[method];
2238         }
2239     }
2240     return null;
2241 };
2242 /**
2243 * Cross-window, cross-Node-context regular expression detection
2244 * @param  {Object}  object Anything
2245 * @return {Boolean}        true if the object is a regular expression,
2246 * false otherwise
2247 */
2248 exports.isRegExp = function (object) {
2249     return Object.prototype.toString.call(object) === "[object RegExp]";
2250 };
2251
2252
2253 },{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(_dereq_,module,exports){
2254 'use strict';
2255 var StringReader = _dereq_('./stringReader');
2256 var NodeBufferReader = _dereq_('./nodeBufferReader');
2257 var Uint8ArrayReader = _dereq_('./uint8ArrayReader');
2258 var utils = _dereq_('./utils');
2259 var sig = _dereq_('./signature');
2260 var ZipEntry = _dereq_('./zipEntry');
2261 var support = _dereq_('./support');
2262 var jszipProto = _dereq_('./object');
2263 //  class ZipEntries {{{
2264 /**
2265  * All the entries in the zip file.
2266  * @constructor
2267  * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load.
2268  * @param {Object} loadOptions Options for loading the stream.
2269  */
2270 function ZipEntries(data, loadOptions) {
2271     this.files = [];
2272     this.loadOptions = loadOptions;
2273     if (data) {
2274         this.load(data);
2275     }
2276 }
2277 ZipEntries.prototype = {
2278     /**
2279      * Check that the reader is on the speficied signature.
2280      * @param {string} expectedSignature the expected signature.
2281      * @throws {Error} if it is an other signature.
2282      */
2283     checkSignature: function(expectedSignature) {
2284         var signature = this.reader.readString(4);
2285         if (signature !== expectedSignature) {
2286             throw new Error("Corrupted zip or bug : unexpected signature " + "(" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")");
2287         }
2288     },
2289     /**
2290      * Read the end of the central directory.
2291      */
2292     readBlockEndOfCentral: function() {
2293         this.diskNumber = this.reader.readInt(2);
2294         this.diskWithCentralDirStart = this.reader.readInt(2);
2295         this.centralDirRecordsOnThisDisk = this.reader.readInt(2);
2296         this.centralDirRecords = this.reader.readInt(2);
2297         this.centralDirSize = this.reader.readInt(4);
2298         this.centralDirOffset = this.reader.readInt(4);
2299
2300         this.zipCommentLength = this.reader.readInt(2);
2301         // warning : the encoding depends of the system locale
2302         // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.
2303         // On a windows machine, this field is encoded with the localized windows code page.
2304         this.zipComment = this.reader.readString(this.zipCommentLength);
2305         // To get consistent behavior with the generation part, we will assume that
2306         // this is utf8 encoded.
2307         this.zipComment = jszipProto.utf8decode(this.zipComment);
2308     },
2309     /**
2310      * Read the end of the Zip 64 central directory.
2311      * Not merged with the method readEndOfCentral :
2312      * The end of central can coexist with its Zip64 brother,
2313      * I don't want to read the wrong number of bytes !
2314      */
2315     readBlockZip64EndOfCentral: function() {
2316         this.zip64EndOfCentralSize = this.reader.readInt(8);
2317         this.versionMadeBy = this.reader.readString(2);
2318         this.versionNeeded = this.reader.readInt(2);
2319         this.diskNumber = this.reader.readInt(4);
2320         this.diskWithCentralDirStart = this.reader.readInt(4);
2321         this.centralDirRecordsOnThisDisk = this.reader.readInt(8);
2322         this.centralDirRecords = this.reader.readInt(8);
2323         this.centralDirSize = this.reader.readInt(8);
2324         this.centralDirOffset = this.reader.readInt(8);
2325
2326         this.zip64ExtensibleData = {};
2327         var extraDataSize = this.zip64EndOfCentralSize - 44,
2328             index = 0,
2329             extraFieldId,
2330             extraFieldLength,
2331             extraFieldValue;
2332         while (index < extraDataSize) {
2333             extraFieldId = this.reader.readInt(2);
2334             extraFieldLength = this.reader.readInt(4);
2335             extraFieldValue = this.reader.readString(extraFieldLength);
2336             this.zip64ExtensibleData[extraFieldId] = {
2337                 id: extraFieldId,
2338                 length: extraFieldLength,
2339                 value: extraFieldValue
2340             };
2341         }
2342     },
2343     /**
2344      * Read the end of the Zip 64 central directory locator.
2345      */
2346     readBlockZip64EndOfCentralLocator: function() {
2347         this.diskWithZip64CentralDirStart = this.reader.readInt(4);
2348         this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);
2349         this.disksCount = this.reader.readInt(4);
2350         if (this.disksCount > 1) {
2351             throw new Error("Multi-volumes zip are not supported");
2352         }
2353     },
2354     /**
2355      * Read the local files, based on the offset read in the central part.
2356      */
2357     readLocalFiles: function() {
2358         var i, file;
2359         for (i = 0; i < this.files.length; i++) {
2360             file = this.files[i];
2361             this.reader.setIndex(file.localHeaderOffset);
2362             this.checkSignature(sig.LOCAL_FILE_HEADER);
2363             file.readLocalPart(this.reader);
2364             file.handleUTF8();
2365             file.processAttributes();
2366         }
2367     },
2368     /**
2369      * Read the central directory.
2370      */
2371     readCentralDir: function() {
2372         var file;
2373
2374         this.reader.setIndex(this.centralDirOffset);
2375         while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) {
2376             file = new ZipEntry({
2377                 zip64: this.zip64
2378             }, this.loadOptions);
2379             file.readCentralPart(this.reader);
2380             this.files.push(file);
2381         }
2382     },
2383     /**
2384      * Read the end of central directory.
2385      */
2386     readEndOfCentral: function() {
2387         var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);
2388         if (offset === -1) {
2389             // Check if the content is a truncated zip or complete garbage.
2390             // A "LOCAL_FILE_HEADER" is not required at the beginning (auto
2391             // extractible zip for example) but it can give a good hint.
2392             // If an ajax request was used without responseType, we will also
2393             // get unreadable data.
2394             var isGarbage = true;
2395             try {
2396                 this.reader.setIndex(0);
2397                 this.checkSignature(sig.LOCAL_FILE_HEADER);
2398                 isGarbage = false;
2399             } catch (e) {}
2400
2401             if (isGarbage) {
2402                 throw new Error("Can't find end of central directory : is this a zip file ? " +
2403                                 "If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html");
2404             } else {
2405                 throw new Error("Corrupted zip : can't find end of central directory");
2406             }
2407         }
2408         this.reader.setIndex(offset);
2409         this.checkSignature(sig.CENTRAL_DIRECTORY_END);
2410         this.readBlockEndOfCentral();
2411
2412
2413         /* extract from the zip spec :
2414             4)  If one of the fields in the end of central directory
2415                 record is too small to hold required data, the field
2416                 should be set to -1 (0xFFFF or 0xFFFFFFFF) and the
2417                 ZIP64 format record should be created.
2418             5)  The end of central directory record and the
2419                 Zip64 end of central directory locator record must
2420                 reside on the same disk when splitting or spanning
2421                 an archive.
2422          */
2423         if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) {
2424             this.zip64 = true;
2425
2426             /*
2427             Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from
2428             the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents
2429             all numbers as 64-bit double precision IEEE 754 floating point numbers.
2430             So, we have 53bits for integers and bitwise operations treat everything as 32bits.
2431             see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators
2432             and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5
2433             */
2434
2435             // should look for a zip64 EOCD locator
2436             offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
2437             if (offset === -1) {
2438                 throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");
2439             }
2440             this.reader.setIndex(offset);
2441             this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
2442             this.readBlockZip64EndOfCentralLocator();
2443
2444             // now the zip64 EOCD record
2445             this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);
2446             this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);
2447             this.readBlockZip64EndOfCentral();
2448         }
2449     },
2450     prepareReader: function(data) {
2451         var type = utils.getTypeOf(data);
2452         if (type === "string" && !support.uint8array) {
2453             this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString);
2454         }
2455         else if (type === "nodebuffer") {
2456             this.reader = new NodeBufferReader(data);
2457         }
2458         else {
2459             this.reader = new Uint8ArrayReader(utils.transformTo("uint8array", data));
2460         }
2461     },
2462     /**
2463      * Read a zip file and create ZipEntries.
2464      * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.
2465      */
2466     load: function(data) {
2467         this.prepareReader(data);
2468         this.readEndOfCentral();
2469         this.readCentralDir();
2470         this.readLocalFiles();
2471     }
2472 };
2473 // }}} end of ZipEntries
2474 module.exports = ZipEntries;
2475
2476 },{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(_dereq_,module,exports){
2477 'use strict';
2478 var StringReader = _dereq_('./stringReader');
2479 var utils = _dereq_('./utils');
2480 var CompressedObject = _dereq_('./compressedObject');
2481 var jszipProto = _dereq_('./object');
2482
2483 var MADE_BY_DOS = 0x00;
2484 var MADE_BY_UNIX = 0x03;
2485
2486 // class ZipEntry {{{
2487 /**
2488  * An entry in the zip file.
2489  * @constructor
2490  * @param {Object} options Options of the current file.
2491  * @param {Object} loadOptions Options for loading the stream.
2492  */
2493 function ZipEntry(options, loadOptions) {
2494     this.options = options;
2495     this.loadOptions = loadOptions;
2496 }
2497 ZipEntry.prototype = {
2498     /**
2499      * say if the file is encrypted.
2500      * @return {boolean} true if the file is encrypted, false otherwise.
2501      */
2502     isEncrypted: function() {
2503         // bit 1 is set
2504         return (this.bitFlag & 0x0001) === 0x0001;
2505     },
2506     /**
2507      * say if the file has utf-8 filename/comment.
2508      * @return {boolean} true if the filename/comment is in utf-8, false otherwise.
2509      */
2510     useUTF8: function() {
2511         // bit 11 is set
2512         return (this.bitFlag & 0x0800) === 0x0800;
2513     },
2514     /**
2515      * Prepare the function used to generate the compressed content from this ZipFile.
2516      * @param {DataReader} reader the reader to use.
2517      * @param {number} from the offset from where we should read the data.
2518      * @param {number} length the length of the data to read.
2519      * @return {Function} the callback to get the compressed content (the type depends of the DataReader class).
2520      */
2521     prepareCompressedContent: function(reader, from, length) {
2522         return function() {
2523             var previousIndex = reader.index;
2524             reader.setIndex(from);
2525             var compressedFileData = reader.readData(length);
2526             reader.setIndex(previousIndex);
2527
2528             return compressedFileData;
2529         };
2530     },
2531     /**
2532      * Prepare the function used to generate the uncompressed content from this ZipFile.
2533      * @param {DataReader} reader the reader to use.
2534      * @param {number} from the offset from where we should read the data.
2535      * @param {number} length the length of the data to read.
2536      * @param {JSZip.compression} compression the compression used on this file.
2537      * @param {number} uncompressedSize the uncompressed size to expect.
2538      * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class).
2539      */
2540     prepareContent: function(reader, from, length, compression, uncompressedSize) {
2541         return function() {
2542
2543             var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent());
2544             var uncompressedFileData = compression.uncompress(compressedFileData);
2545
2546             if (uncompressedFileData.length !== uncompressedSize) {
2547                 throw new Error("Bug : uncompressed data size mismatch");
2548             }
2549
2550             return uncompressedFileData;
2551         };
2552     },
2553     /**
2554      * Read the local part of a zip file and add the info in this object.
2555      * @param {DataReader} reader the reader to use.
2556      */
2557     readLocalPart: function(reader) {
2558         var compression, localExtraFieldsLength;
2559
2560         // we already know everything from the central dir !
2561         // If the central dir data are false, we are doomed.
2562         // On the bright side, the local part is scary  : zip64, data descriptors, both, etc.
2563         // The less data we get here, the more reliable this should be.
2564         // Let's skip the whole header and dash to the data !
2565         reader.skip(22);
2566         // in some zip created on windows, the filename stored in the central dir contains \ instead of /.
2567         // Strangely, the filename here is OK.
2568         // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes
2569         // or APPNOTE#4.4.17.1, "All slashes MUST be forward slashes '/'") but there are a lot of bad zip generators...
2570         // Search "unzip mismatching "local" filename continuing with "central" filename version" on
2571         // the internet.
2572         //
2573         // I think I see the logic here : the central directory is used to display
2574         // content and the local directory is used to extract the files. Mixing / and \
2575         // may be used to display \ to windows users and use / when extracting the files.
2576         // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394
2577         this.fileNameLength = reader.readInt(2);
2578         localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir
2579         this.fileName = reader.readString(this.fileNameLength);
2580         reader.skip(localExtraFieldsLength);
2581
2582         if (this.compressedSize == -1 || this.uncompressedSize == -1) {
2583             throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + "(compressedSize == -1 || uncompressedSize == -1)");
2584         }
2585
2586         compression = utils.findCompression(this.compressionMethod);
2587         if (compression === null) { // no compression found
2588             throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + this.fileName + ")");
2589         }
2590         this.decompressed = new CompressedObject();
2591         this.decompressed.compressedSize = this.compressedSize;
2592         this.decompressed.uncompressedSize = this.uncompressedSize;
2593         this.decompressed.crc32 = this.crc32;
2594         this.decompressed.compressionMethod = this.compressionMethod;
2595         this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);
2596         this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);
2597
2598         // we need to compute the crc32...
2599         if (this.loadOptions.checkCRC32) {
2600             this.decompressed = utils.transformTo("string", this.decompressed.getContent());
2601             if (jszipProto.crc32(this.decompressed) !== this.crc32) {
2602                 throw new Error("Corrupted zip : CRC32 mismatch");
2603             }
2604         }
2605     },
2606
2607     /**
2608      * Read the central part of a zip file and add the info in this object.
2609      * @param {DataReader} reader the reader to use.
2610      */
2611     readCentralPart: function(reader) {
2612         this.versionMadeBy = reader.readInt(2);
2613         this.versionNeeded = reader.readInt(2);
2614         this.bitFlag = reader.readInt(2);
2615         this.compressionMethod = reader.readString(2);
2616         this.date = reader.readDate();
2617         this.crc32 = reader.readInt(4);
2618         this.compressedSize = reader.readInt(4);
2619         this.uncompressedSize = reader.readInt(4);
2620         this.fileNameLength = reader.readInt(2);
2621         this.extraFieldsLength = reader.readInt(2);
2622         this.fileCommentLength = reader.readInt(2);
2623         this.diskNumberStart = reader.readInt(2);
2624         this.internalFileAttributes = reader.readInt(2);
2625         this.externalFileAttributes = reader.readInt(4);
2626         this.localHeaderOffset = reader.readInt(4);
2627
2628         if (this.isEncrypted()) {
2629             throw new Error("Encrypted zip are not supported");
2630         }
2631
2632         this.fileName = reader.readString(this.fileNameLength);
2633         this.readExtraFields(reader);
2634         this.parseZIP64ExtraField(reader);
2635         this.fileComment = reader.readString(this.fileCommentLength);
2636     },
2637
2638     /**
2639      * Parse the external file attributes and get the unix/dos permissions.
2640      */
2641     processAttributes: function () {
2642         this.unixPermissions = null;
2643         this.dosPermissions = null;
2644         var madeBy = this.versionMadeBy >> 8;
2645
2646         // Check if we have the DOS directory flag set.
2647         // We look for it in the DOS and UNIX permissions
2648         // but some unknown platform could set it as a compatibility flag.
2649         this.dir = this.externalFileAttributes & 0x0010 ? true : false;
2650
2651         if(madeBy === MADE_BY_DOS) {
2652             // first 6 bits (0 to 5)
2653             this.dosPermissions = this.externalFileAttributes & 0x3F;
2654         }
2655
2656         if(madeBy === MADE_BY_UNIX) {
2657             this.unixPermissions = (this.externalFileAttributes >> 16) & 0xFFFF;
2658             // the octal permissions are in (this.unixPermissions & 0x01FF).toString(8);
2659         }
2660
2661         // fail safe : if the name ends with a / it probably means a folder
2662         if (!this.dir && this.fileName.slice(-1) === '/') {
2663             this.dir = true;
2664         }
2665     },
2666
2667     /**
2668      * Parse the ZIP64 extra field and merge the info in the current ZipEntry.
2669      * @param {DataReader} reader the reader to use.
2670      */
2671     parseZIP64ExtraField: function(reader) {
2672
2673         if (!this.extraFields[0x0001]) {
2674             return;
2675         }
2676
2677         // should be something, preparing the extra reader
2678         var extraReader = new StringReader(this.extraFields[0x0001].value);
2679
2680         // I really hope that these 64bits integer can fit in 32 bits integer, because js
2681         // won't let us have more.
2682         if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {
2683             this.uncompressedSize = extraReader.readInt(8);
2684         }
2685         if (this.compressedSize === utils.MAX_VALUE_32BITS) {
2686             this.compressedSize = extraReader.readInt(8);
2687         }
2688         if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {
2689             this.localHeaderOffset = extraReader.readInt(8);
2690         }
2691         if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {
2692             this.diskNumberStart = extraReader.readInt(4);
2693         }
2694     },
2695     /**
2696      * Read the central part of a zip file and add the info in this object.
2697      * @param {DataReader} reader the reader to use.
2698      */
2699     readExtraFields: function(reader) {
2700         var start = reader.index,
2701             extraFieldId,
2702             extraFieldLength,
2703             extraFieldValue;
2704
2705         this.extraFields = this.extraFields || {};
2706
2707         while (reader.index < start + this.extraFieldsLength) {
2708             extraFieldId = reader.readInt(2);
2709             extraFieldLength = reader.readInt(2);
2710             extraFieldValue = reader.readString(extraFieldLength);
2711
2712             this.extraFields[extraFieldId] = {
2713                 id: extraFieldId,
2714                 length: extraFieldLength,
2715                 value: extraFieldValue
2716             };
2717         }
2718     },
2719     /**
2720      * Apply an UTF8 transformation if needed.
2721      */
2722     handleUTF8: function() {
2723         if (this.useUTF8()) {
2724             this.fileName = jszipProto.utf8decode(this.fileName);
2725             this.fileComment = jszipProto.utf8decode(this.fileComment);
2726         } else {
2727             var upath = this.findExtraFieldUnicodePath();
2728             if (upath !== null) {
2729                 this.fileName = upath;
2730             }
2731             var ucomment = this.findExtraFieldUnicodeComment();
2732             if (ucomment !== null) {
2733                 this.fileComment = ucomment;
2734             }
2735         }
2736     },
2737
2738     /**
2739      * Find the unicode path declared in the extra field, if any.
2740      * @return {String} the unicode path, null otherwise.
2741      */
2742     findExtraFieldUnicodePath: function() {
2743         var upathField = this.extraFields[0x7075];
2744         if (upathField) {
2745             var extraReader = new StringReader(upathField.value);
2746
2747             // wrong version
2748             if (extraReader.readInt(1) !== 1) {
2749                 return null;
2750             }
2751
2752             // the crc of the filename changed, this field is out of date.
2753             if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) {
2754                 return null;
2755             }
2756
2757             return jszipProto.utf8decode(extraReader.readString(upathField.length - 5));
2758         }
2759         return null;
2760     },
2761
2762     /**
2763      * Find the unicode comment declared in the extra field, if any.
2764      * @return {String} the unicode comment, null otherwise.
2765      */
2766     findExtraFieldUnicodeComment: function() {
2767         var ucommentField = this.extraFields[0x6375];
2768         if (ucommentField) {
2769             var extraReader = new StringReader(ucommentField.value);
2770
2771             // wrong version
2772             if (extraReader.readInt(1) !== 1) {
2773                 return null;
2774             }
2775
2776             // the crc of the comment changed, this field is out of date.
2777             if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) {
2778                 return null;
2779             }
2780
2781             return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5));
2782         }
2783         return null;
2784     }
2785 };
2786 module.exports = ZipEntry;
2787
2788 },{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(_dereq_,module,exports){
2789 // Top level file is just a mixin of submodules & constants
2790 'use strict';
2791
2792 var assign    = _dereq_('./lib/utils/common').assign;
2793
2794 var deflate   = _dereq_('./lib/deflate');
2795 var inflate   = _dereq_('./lib/inflate');
2796 var constants = _dereq_('./lib/zlib/constants');
2797
2798 var pako = {};
2799
2800 assign(pako, deflate, inflate, constants);
2801
2802 module.exports = pako;
2803 },{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(_dereq_,module,exports){
2804 'use strict';
2805
2806
2807 var zlib_deflate = _dereq_('./zlib/deflate.js');
2808 var utils = _dereq_('./utils/common');
2809 var strings = _dereq_('./utils/strings');
2810 var msg = _dereq_('./zlib/messages');
2811 var zstream = _dereq_('./zlib/zstream');
2812
2813
2814 /* Public constants ==========================================================*/
2815 /* ===========================================================================*/
2816
2817 var Z_NO_FLUSH      = 0;
2818 var Z_FINISH        = 4;
2819
2820 var Z_OK            = 0;
2821 var Z_STREAM_END    = 1;
2822
2823 var Z_DEFAULT_COMPRESSION = -1;
2824
2825 var Z_DEFAULT_STRATEGY    = 0;
2826
2827 var Z_DEFLATED  = 8;
2828
2829 /* ===========================================================================*/
2830
2831
2832 /**
2833  * class Deflate
2834  *
2835  * Generic JS-style wrapper for zlib calls. If you don't need
2836  * streaming behaviour - use more simple functions: [[deflate]],
2837  * [[deflateRaw]] and [[gzip]].
2838  **/
2839
2840 /* internal
2841  * Deflate.chunks -> Array
2842  *
2843  * Chunks of output data, if [[Deflate#onData]] not overriden.
2844  **/
2845
2846 /**
2847  * Deflate.result -> Uint8Array|Array
2848  *
2849  * Compressed result, generated by default [[Deflate#onData]]
2850  * and [[Deflate#onEnd]] handlers. Filled after you push last chunk
2851  * (call [[Deflate#push]] with `Z_FINISH` / `true` param).
2852  **/
2853
2854 /**
2855  * Deflate.err -> Number
2856  *
2857  * Error code after deflate finished. 0 (Z_OK) on success.
2858  * You will not need it in real life, because deflate errors
2859  * are possible only on wrong options or bad `onData` / `onEnd`
2860  * custom handlers.
2861  **/
2862
2863 /**
2864  * Deflate.msg -> String
2865  *
2866  * Error message, if [[Deflate.err]] != 0
2867  **/
2868
2869
2870 /**
2871  * new Deflate(options)
2872  * - options (Object): zlib deflate options.
2873  *
2874  * Creates new deflator instance with specified params. Throws exception
2875  * on bad params. Supported options:
2876  *
2877  * - `level`
2878  * - `windowBits`
2879  * - `memLevel`
2880  * - `strategy`
2881  *
2882  * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
2883  * for more information on these.
2884  *
2885  * Additional options, for internal needs:
2886  *
2887  * - `chunkSize` - size of generated data chunks (16K by default)
2888  * - `raw` (Boolean) - do raw deflate
2889  * - `gzip` (Boolean) - create gzip wrapper
2890  * - `to` (String) - if equal to 'string', then result will be "binary string"
2891  *    (each char code [0..255])
2892  * - `header` (Object) - custom header for gzip
2893  *   - `text` (Boolean) - true if compressed data believed to be text
2894  *   - `time` (Number) - modification time, unix timestamp
2895  *   - `os` (Number) - operation system code
2896  *   - `extra` (Array) - array of bytes with extra data (max 65536)
2897  *   - `name` (String) - file name (binary string)
2898  *   - `comment` (String) - comment (binary string)
2899  *   - `hcrc` (Boolean) - true if header crc should be added
2900  *
2901  * ##### Example:
2902  *
2903  * ```javascript
2904  * var pako = require('pako')
2905  *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
2906  *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
2907  *
2908  * var deflate = new pako.Deflate({ level: 3});
2909  *
2910  * deflate.push(chunk1, false);
2911  * deflate.push(chunk2, true);  // true -> last chunk
2912  *
2913  * if (deflate.err) { throw new Error(deflate.err); }
2914  *
2915  * console.log(deflate.result);
2916  * ```
2917  **/
2918 var Deflate = function(options) {
2919
2920   this.options = utils.assign({
2921     level: Z_DEFAULT_COMPRESSION,
2922     method: Z_DEFLATED,
2923     chunkSize: 16384,
2924     windowBits: 15,
2925     memLevel: 8,
2926     strategy: Z_DEFAULT_STRATEGY,
2927     to: ''
2928   }, options || {});
2929
2930   var opt = this.options;
2931
2932   if (opt.raw && (opt.windowBits > 0)) {
2933     opt.windowBits = -opt.windowBits;
2934   }
2935
2936   else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {
2937     opt.windowBits += 16;
2938   }
2939
2940   this.err    = 0;      // error code, if happens (0 = Z_OK)
2941   this.msg    = '';     // error message
2942   this.ended  = false;  // used to avoid multiple onEnd() calls
2943   this.chunks = [];     // chunks of compressed data
2944
2945   this.strm = new zstream();
2946   this.strm.avail_out = 0;
2947
2948   var status = zlib_deflate.deflateInit2(
2949     this.strm,
2950     opt.level,
2951     opt.method,
2952     opt.windowBits,
2953     opt.memLevel,
2954     opt.strategy
2955   );
2956
2957   if (status !== Z_OK) {
2958     throw new Error(msg[status]);
2959   }
2960
2961   if (opt.header) {
2962     zlib_deflate.deflateSetHeader(this.strm, opt.header);
2963   }
2964 };
2965
2966 /**
2967  * Deflate#push(data[, mode]) -> Boolean
2968  * - data (Uint8Array|Array|String): input data. Strings will be converted to
2969  *   utf8 byte sequence.
2970  * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
2971  *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
2972  *
2973  * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
2974  * new compressed chunks. Returns `true` on success. The last data block must have
2975  * mode Z_FINISH (or `true`). That flush internal pending buffers and call
2976  * [[Deflate#onEnd]].
2977  *
2978  * On fail call [[Deflate#onEnd]] with error code and return false.
2979  *
2980  * We strongly recommend to use `Uint8Array` on input for best speed (output
2981  * array format is detected automatically). Also, don't skip last param and always
2982  * use the same type in your code (boolean or number). That will improve JS speed.
2983  *
2984  * For regular `Array`-s make sure all elements are [0..255].
2985  *
2986  * ##### Example
2987  *
2988  * ```javascript
2989  * push(chunk, false); // push one of data chunks
2990  * ...
2991  * push(chunk, true);  // push last chunk
2992  * ```
2993  **/
2994 Deflate.prototype.push = function(data, mode) {
2995   var strm = this.strm;
2996   var chunkSize = this.options.chunkSize;
2997   var status, _mode;
2998
2999   if (this.ended) { return false; }
3000
3001   _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);
3002
3003   // Convert data if needed
3004   if (typeof data === 'string') {
3005     // If we need to compress text, change encoding to utf8.
3006     strm.input = strings.string2buf(data);
3007   } else {
3008     strm.input = data;
3009   }
3010
3011   strm.next_in = 0;
3012   strm.avail_in = strm.input.length;
3013
3014   do {
3015     if (strm.avail_out === 0) {
3016       strm.output = new utils.Buf8(chunkSize);
3017       strm.next_out = 0;
3018       strm.avail_out = chunkSize;
3019     }
3020     status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */
3021
3022     if (status !== Z_STREAM_END && status !== Z_OK) {
3023       this.onEnd(status);
3024       this.ended = true;
3025       return false;
3026     }
3027     if (strm.avail_out === 0 || (strm.avail_in === 0 && _mode === Z_FINISH)) {
3028       if (this.options.to === 'string') {
3029         this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));
3030       } else {
3031         this.onData(utils.shrinkBuf(strm.output, strm.next_out));
3032       }
3033     }
3034   } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);
3035
3036   // Finalize on the last chunk.
3037   if (_mode === Z_FINISH) {
3038     status = zlib_deflate.deflateEnd(this.strm);
3039     this.onEnd(status);
3040     this.ended = true;
3041     return status === Z_OK;
3042   }
3043
3044   return true;
3045 };
3046
3047
3048 /**
3049  * Deflate#onData(chunk) -> Void
3050  * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
3051  *   on js engine support. When string output requested, each chunk
3052  *   will be string.
3053  *
3054  * By default, stores data blocks in `chunks[]` property and glue
3055  * those in `onEnd`. Override this handler, if you need another behaviour.
3056  **/
3057 Deflate.prototype.onData = function(chunk) {
3058   this.chunks.push(chunk);
3059 };
3060
3061
3062 /**
3063  * Deflate#onEnd(status) -> Void
3064  * - status (Number): deflate status. 0 (Z_OK) on success,
3065  *   other if not.
3066  *
3067  * Called once after you tell deflate that input stream complete
3068  * or error happenned. By default - join collected chunks,
3069  * free memory and fill `results` / `err` properties.
3070  **/
3071 Deflate.prototype.onEnd = function(status) {
3072   // On success - join
3073   if (status === Z_OK) {
3074     if (this.options.to === 'string') {
3075       this.result = this.chunks.join('');
3076     } else {
3077       this.result = utils.flattenChunks(this.chunks);
3078     }
3079   }
3080   this.chunks = [];
3081   this.err = status;
3082   this.msg = this.strm.msg;
3083 };
3084
3085
3086 /**
3087  * deflate(data[, options]) -> Uint8Array|Array|String
3088  * - data (Uint8Array|Array|String): input data to compress.
3089  * - options (Object): zlib deflate options.
3090  *
3091  * Compress `data` with deflate alrorythm and `options`.
3092  *
3093  * Supported options are:
3094  *
3095  * - level
3096  * - windowBits
3097  * - memLevel
3098  * - strategy
3099  *
3100  * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
3101  * for more information on these.
3102  *
3103  * Sugar (options):
3104  *
3105  * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
3106  *   negative windowBits implicitly.
3107  * - `to` (String) - if equal to 'string', then result will be "binary string"
3108  *    (each char code [0..255])
3109  *
3110  * ##### Example:
3111  *
3112  * ```javascript
3113  * var pako = require('pako')
3114  *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);
3115  *
3116  * console.log(pako.deflate(data));
3117  * ```
3118  **/
3119 function deflate(input, options) {
3120   var deflator = new Deflate(options);
3121
3122   deflator.push(input, true);
3123
3124   // That will never happens, if you don't cheat with options :)
3125   if (deflator.err) { throw deflator.msg; }
3126
3127   return deflator.result;
3128 }
3129
3130
3131 /**
3132  * deflateRaw(data[, options]) -> Uint8Array|Array|String
3133  * - data (Uint8Array|Array|String): input data to compress.
3134  * - options (Object): zlib deflate options.
3135  *
3136  * The same as [[deflate]], but creates raw data, without wrapper
3137  * (header and adler32 crc).
3138  **/
3139 function deflateRaw(input, options) {
3140   options = options || {};
3141   options.raw = true;
3142   return deflate(input, options);
3143 }
3144
3145
3146 /**
3147  * gzip(data[, options]) -> Uint8Array|Array|String
3148  * - data (Uint8Array|Array|String): input data to compress.
3149  * - options (Object): zlib deflate options.
3150  *
3151  * The same as [[deflate]], but create gzip wrapper instead of
3152  * deflate one.
3153  **/
3154 function gzip(input, options) {
3155   options = options || {};
3156   options.gzip = true;
3157   return deflate(input, options);
3158 }
3159
3160
3161 exports.Deflate = Deflate;
3162 exports.deflate = deflate;
3163 exports.deflateRaw = deflateRaw;
3164 exports.gzip = gzip;
3165 },{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(_dereq_,module,exports){
3166 'use strict';
3167
3168
3169 var zlib_inflate = _dereq_('./zlib/inflate.js');
3170 var utils = _dereq_('./utils/common');
3171 var strings = _dereq_('./utils/strings');
3172 var c = _dereq_('./zlib/constants');
3173 var msg = _dereq_('./zlib/messages');
3174 var zstream = _dereq_('./zlib/zstream');
3175 var gzheader = _dereq_('./zlib/gzheader');
3176
3177
3178 /**
3179  * class Inflate
3180  *
3181  * Generic JS-style wrapper for zlib calls. If you don't need
3182  * streaming behaviour - use more simple functions: [[inflate]]
3183  * and [[inflateRaw]].
3184  **/
3185
3186 /* internal
3187  * inflate.chunks -> Array
3188  *
3189  * Chunks of output data, if [[Inflate#onData]] not overriden.
3190  **/
3191
3192 /**
3193  * Inflate.result -> Uint8Array|Array|String
3194  *
3195  * Uncompressed result, generated by default [[Inflate#onData]]
3196  * and [[Inflate#onEnd]] handlers. Filled after you push last chunk
3197  * (call [[Inflate#push]] with `Z_FINISH` / `true` param).
3198  **/
3199
3200 /**
3201  * Inflate.err -> Number
3202  *
3203  * Error code after inflate finished. 0 (Z_OK) on success.
3204  * Should be checked if broken data possible.
3205  **/
3206
3207 /**
3208  * Inflate.msg -> String
3209  *
3210  * Error message, if [[Inflate.err]] != 0
3211  **/
3212
3213
3214 /**
3215  * new Inflate(options)
3216  * - options (Object): zlib inflate options.
3217  *
3218  * Creates new inflator instance with specified params. Throws exception
3219  * on bad params. Supported options:
3220  *
3221  * - `windowBits`
3222  *
3223  * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
3224  * for more information on these.
3225  *
3226  * Additional options, for internal needs:
3227  *
3228  * - `chunkSize` - size of generated data chunks (16K by default)
3229  * - `raw` (Boolean) - do raw inflate
3230  * - `to` (String) - if equal to 'string', then result will be converted
3231  *   from utf8 to utf16 (javascript) string. When string output requested,
3232  *   chunk length can differ from `chunkSize`, depending on content.
3233  *
3234  * By default, when no options set, autodetect deflate/gzip data format via
3235  * wrapper header.
3236  *
3237  * ##### Example:
3238  *
3239  * ```javascript
3240  * var pako = require('pako')
3241  *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
3242  *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
3243  *
3244  * var inflate = new pako.Inflate({ level: 3});
3245  *
3246  * inflate.push(chunk1, false);
3247  * inflate.push(chunk2, true);  // true -> last chunk
3248  *
3249  * if (inflate.err) { throw new Error(inflate.err); }
3250  *
3251  * console.log(inflate.result);
3252  * ```
3253  **/
3254 var Inflate = function(options) {
3255
3256   this.options = utils.assign({
3257     chunkSize: 16384,
3258     windowBits: 0,
3259     to: ''
3260   }, options || {});
3261
3262   var opt = this.options;
3263
3264   // Force window size for `raw` data, if not set directly,
3265   // because we have no header for autodetect.
3266   if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
3267     opt.windowBits = -opt.windowBits;
3268     if (opt.windowBits === 0) { opt.windowBits = -15; }
3269   }
3270
3271   // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
3272   if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
3273       !(options && options.windowBits)) {
3274     opt.windowBits += 32;
3275   }
3276
3277   // Gzip header has no info about windows size, we can do autodetect only
3278   // for deflate. So, if window size not set, force it to max when gzip possible
3279   if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
3280     // bit 3 (16) -> gzipped data
3281     // bit 4 (32) -> autodetect gzip/deflate
3282     if ((opt.windowBits & 15) === 0) {
3283       opt.windowBits |= 15;
3284     }
3285   }
3286
3287   this.err    = 0;      // error code, if happens (0 = Z_OK)
3288   this.msg    = '';     // error message
3289   this.ended  = false;  // used to avoid multiple onEnd() calls
3290   this.chunks = [];     // chunks of compressed data
3291
3292   this.strm   = new zstream();
3293   this.strm.avail_out = 0;
3294
3295   var status  = zlib_inflate.inflateInit2(
3296     this.strm,
3297     opt.windowBits
3298   );
3299
3300   if (status !== c.Z_OK) {
3301     throw new Error(msg[status]);
3302   }
3303
3304   this.header = new gzheader();
3305
3306   zlib_inflate.inflateGetHeader(this.strm, this.header);
3307 };
3308
3309 /**
3310  * Inflate#push(data[, mode]) -> Boolean
3311  * - data (Uint8Array|Array|String): input data
3312  * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
3313  *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
3314  *
3315  * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
3316  * new output chunks. Returns `true` on success. The last data block must have
3317  * mode Z_FINISH (or `true`). That flush internal pending buffers and call
3318  * [[Inflate#onEnd]].
3319  *
3320  * On fail call [[Inflate#onEnd]] with error code and return false.
3321  *
3322  * We strongly recommend to use `Uint8Array` on input for best speed (output
3323  * format is detected automatically). Also, don't skip last param and always
3324  * use the same type in your code (boolean or number). That will improve JS speed.
3325  *
3326  * For regular `Array`-s make sure all elements are [0..255].
3327  *
3328  * ##### Example
3329  *
3330  * ```javascript
3331  * push(chunk, false); // push one of data chunks
3332  * ...
3333  * push(chunk, true);  // push last chunk
3334  * ```
3335  **/
3336 Inflate.prototype.push = function(data, mode) {
3337   var strm = this.strm;
3338   var chunkSize = this.options.chunkSize;
3339   var status, _mode;
3340   var next_out_utf8, tail, utf8str;
3341
3342   if (this.ended) { return false; }
3343   _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);
3344
3345   // Convert data if needed
3346   if (typeof data === 'string') {
3347     // Only binary strings can be decompressed on practice
3348     strm.input = strings.binstring2buf(data);
3349   } else {
3350     strm.input = data;
3351   }
3352
3353   strm.next_in = 0;
3354   strm.avail_in = strm.input.length;
3355
3356   do {
3357     if (strm.avail_out === 0) {
3358       strm.output = new utils.Buf8(chunkSize);
3359       strm.next_out = 0;
3360       strm.avail_out = chunkSize;
3361     }
3362
3363     status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */
3364
3365     if (status !== c.Z_STREAM_END && status !== c.Z_OK) {
3366       this.onEnd(status);
3367       this.ended = true;
3368       return false;
3369     }
3370
3371     if (strm.next_out) {
3372       if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && _mode === c.Z_FINISH)) {
3373
3374         if (this.options.to === 'string') {
3375
3376           next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
3377
3378           tail = strm.next_out - next_out_utf8;
3379           utf8str = strings.buf2string(strm.output, next_out_utf8);
3380
3381           // move tail
3382           strm.next_out = tail;
3383           strm.avail_out = chunkSize - tail;
3384           if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }
3385
3386           this.onData(utf8str);
3387
3388         } else {
3389           this.onData(utils.shrinkBuf(strm.output, strm.next_out));
3390         }
3391       }
3392     }
3393   } while ((strm.avail_in > 0) && status !== c.Z_STREAM_END);
3394
3395   if (status === c.Z_STREAM_END) {
3396     _mode = c.Z_FINISH;
3397   }
3398   // Finalize on the last chunk.
3399   if (_mode === c.Z_FINISH) {
3400     status = zlib_inflate.inflateEnd(this.strm);
3401     this.onEnd(status);
3402     this.ended = true;
3403     return status === c.Z_OK;
3404   }
3405
3406   return true;
3407 };
3408
3409
3410 /**
3411  * Inflate#onData(chunk) -> Void
3412  * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
3413  *   on js engine support. When string output requested, each chunk
3414  *   will be string.
3415  *
3416  * By default, stores data blocks in `chunks[]` property and glue
3417  * those in `onEnd`. Override this handler, if you need another behaviour.
3418  **/
3419 Inflate.prototype.onData = function(chunk) {
3420   this.chunks.push(chunk);
3421 };
3422
3423
3424 /**
3425  * Inflate#onEnd(status) -> Void
3426  * - status (Number): inflate status. 0 (Z_OK) on success,
3427  *   other if not.
3428  *
3429  * Called once after you tell inflate that input stream complete
3430  * or error happenned. By default - join collected chunks,
3431  * free memory and fill `results` / `err` properties.
3432  **/
3433 Inflate.prototype.onEnd = function(status) {
3434   // On success - join
3435   if (status === c.Z_OK) {
3436     if (this.options.to === 'string') {
3437       // Glue & convert here, until we teach pako to send
3438       // utf8 alligned strings to onData
3439       this.result = this.chunks.join('');
3440     } else {
3441       this.result = utils.flattenChunks(this.chunks);
3442     }
3443   }
3444   this.chunks = [];
3445   this.err = status;
3446   this.msg = this.strm.msg;
3447 };
3448
3449
3450 /**
3451  * inflate(data[, options]) -> Uint8Array|Array|String
3452  * - data (Uint8Array|Array|String): input data to decompress.
3453  * - options (Object): zlib inflate options.
3454  *
3455  * Decompress `data` with inflate/ungzip and `options`. Autodetect
3456  * format via wrapper header by default. That's why we don't provide
3457  * separate `ungzip` method.
3458  *
3459  * Supported options are:
3460  *
3461  * - windowBits
3462  *
3463  * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
3464  * for more information.
3465  *
3466  * Sugar (options):
3467  *
3468  * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
3469  *   negative windowBits implicitly.
3470  * - `to` (String) - if equal to 'string', then result will be converted
3471  *   from utf8 to utf16 (javascript) string. When string output requested,
3472  *   chunk length can differ from `chunkSize`, depending on content.
3473  *
3474  *
3475  * ##### Example:
3476  *
3477  * ```javascript
3478  * var pako = require('pako')
3479  *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])
3480  *   , output;
3481  *
3482  * try {
3483  *   output = pako.inflate(input);
3484  * } catch (err)
3485  *   console.log(err);
3486  * }
3487  * ```
3488  **/
3489 function inflate(input, options) {
3490   var inflator = new Inflate(options);
3491
3492   inflator.push(input, true);
3493
3494   // That will never happens, if you don't cheat with options :)
3495   if (inflator.err) { throw inflator.msg; }
3496
3497   return inflator.result;
3498 }
3499
3500
3501 /**
3502  * inflateRaw(data[, options]) -> Uint8Array|Array|String
3503  * - data (Uint8Array|Array|String): input data to decompress.
3504  * - options (Object): zlib inflate options.
3505  *
3506  * The same as [[inflate]], but creates raw data, without wrapper
3507  * (header and adler32 crc).
3508  **/
3509 function inflateRaw(input, options) {
3510   options = options || {};
3511   options.raw = true;
3512   return inflate(input, options);
3513 }
3514
3515
3516 /**
3517  * ungzip(data[, options]) -> Uint8Array|Array|String
3518  * - data (Uint8Array|Array|String): input data to decompress.
3519  * - options (Object): zlib inflate options.
3520  *
3521  * Just shortcut to [[inflate]], because it autodetects format
3522  * by header.content. Done for convenience.
3523  **/
3524
3525
3526 exports.Inflate = Inflate;
3527 exports.inflate = inflate;
3528 exports.inflateRaw = inflateRaw;
3529 exports.ungzip  = inflate;
3530
3531 },{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(_dereq_,module,exports){
3532 'use strict';
3533
3534
3535 var TYPED_OK =  (typeof Uint8Array !== 'undefined') &&
3536                 (typeof Uint16Array !== 'undefined') &&
3537                 (typeof Int32Array !== 'undefined');
3538
3539
3540 exports.assign = function (obj /*from1, from2, from3, ...*/) {
3541   var sources = Array.prototype.slice.call(arguments, 1);
3542   while (sources.length) {
3543     var source = sources.shift();
3544     if (!source) { continue; }
3545
3546     if (typeof(source) !== 'object') {
3547       throw new TypeError(source + 'must be non-object');
3548     }
3549
3550     for (var p in source) {
3551       if (source.hasOwnProperty(p)) {
3552         obj[p] = source[p];
3553       }
3554     }
3555   }
3556
3557   return obj;
3558 };
3559
3560
3561 // reduce buffer size, avoiding mem copy
3562 exports.shrinkBuf = function (buf, size) {
3563   if (buf.length === size) { return buf; }
3564   if (buf.subarray) { return buf.subarray(0, size); }
3565   buf.length = size;
3566   return buf;
3567 };
3568
3569
3570 var fnTyped = {
3571   arraySet: function (dest, src, src_offs, len, dest_offs) {
3572     if (src.subarray && dest.subarray) {
3573       dest.set(src.subarray(src_offs, src_offs+len), dest_offs);
3574       return;
3575     }
3576     // Fallback to ordinary array
3577     for(var i=0; i<len; i++) {
3578       dest[dest_offs + i] = src[src_offs + i];
3579     }
3580   },
3581   // Join array of chunks to single array.
3582   flattenChunks: function(chunks) {
3583     var i, l, len, pos, chunk, result;
3584
3585     // calculate data length
3586     len = 0;
3587     for (i=0, l=chunks.length; i<l; i++) {
3588       len += chunks[i].length;
3589     }
3590
3591     // join chunks
3592     result = new Uint8Array(len);
3593     pos = 0;
3594     for (i=0, l=chunks.length; i<l; i++) {
3595       chunk = chunks[i];
3596       result.set(chunk, pos);
3597       pos += chunk.length;
3598     }
3599
3600     return result;
3601   }
3602 };
3603
3604 var fnUntyped = {
3605   arraySet: function (dest, src, src_offs, len, dest_offs) {
3606     for(var i=0; i<len; i++) {
3607       dest[dest_offs + i] = src[src_offs + i];
3608     }
3609   },
3610   // Join array of chunks to single array.
3611   flattenChunks: function(chunks) {
3612     return [].concat.apply([], chunks);
3613   }
3614 };
3615
3616
3617 // Enable/Disable typed arrays use, for testing
3618 //
3619 exports.setTyped = function (on) {
3620   if (on) {
3621     exports.Buf8  = Uint8Array;
3622     exports.Buf16 = Uint16Array;
3623     exports.Buf32 = Int32Array;
3624     exports.assign(exports, fnTyped);
3625   } else {
3626     exports.Buf8  = Array;
3627     exports.Buf16 = Array;
3628     exports.Buf32 = Array;
3629     exports.assign(exports, fnUntyped);
3630   }
3631 };
3632
3633 exports.setTyped(TYPED_OK);
3634 },{}],28:[function(_dereq_,module,exports){
3635 // String encode/decode helpers
3636 'use strict';
3637
3638
3639 var utils = _dereq_('./common');
3640
3641
3642 // Quick check if we can use fast array to bin string conversion
3643 //
3644 // - apply(Array) can fail on Android 2.2
3645 // - apply(Uint8Array) can fail on iOS 5.1 Safary
3646 //
3647 var STR_APPLY_OK = true;
3648 var STR_APPLY_UIA_OK = true;
3649
3650 try { String.fromCharCode.apply(null, [0]); } catch(__) { STR_APPLY_OK = false; }
3651 try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch(__) { STR_APPLY_UIA_OK = false; }
3652
3653
3654 // Table with utf8 lengths (calculated by first byte of sequence)
3655 // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
3656 // because max possible codepoint is 0x10ffff
3657 var _utf8len = new utils.Buf8(256);
3658 for (var i=0; i<256; i++) {
3659   _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);
3660 }
3661 _utf8len[254]=_utf8len[254]=1; // Invalid sequence start
3662
3663
3664 // convert string to array (typed, when possible)
3665 exports.string2buf = function (str) {
3666   var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
3667
3668   // count binary size
3669   for (m_pos = 0; m_pos < str_len; m_pos++) {
3670     c = str.charCodeAt(m_pos);
3671     if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
3672       c2 = str.charCodeAt(m_pos+1);
3673       if ((c2 & 0xfc00) === 0xdc00) {
3674         c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
3675         m_pos++;
3676       }
3677     }
3678     buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
3679   }
3680
3681   // allocate buffer
3682   buf = new utils.Buf8(buf_len);
3683
3684   // convert
3685   for (i=0, m_pos = 0; i < buf_len; m_pos++) {
3686     c = str.charCodeAt(m_pos);
3687     if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
3688       c2 = str.charCodeAt(m_pos+1);
3689       if ((c2 & 0xfc00) === 0xdc00) {
3690         c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
3691         m_pos++;
3692       }
3693     }
3694     if (c < 0x80) {
3695       /* one byte */
3696       buf[i++] = c;
3697     } else if (c < 0x800) {
3698       /* two bytes */
3699       buf[i++] = 0xC0 | (c >>> 6);
3700       buf[i++] = 0x80 | (c & 0x3f);
3701     } else if (c < 0x10000) {
3702       /* three bytes */
3703       buf[i++] = 0xE0 | (c >>> 12);
3704       buf[i++] = 0x80 | (c >>> 6 & 0x3f);
3705       buf[i++] = 0x80 | (c & 0x3f);
3706     } else {
3707       /* four bytes */
3708       buf[i++] = 0xf0 | (c >>> 18);
3709       buf[i++] = 0x80 | (c >>> 12 & 0x3f);
3710       buf[i++] = 0x80 | (c >>> 6 & 0x3f);
3711       buf[i++] = 0x80 | (c & 0x3f);
3712     }
3713   }
3714
3715   return buf;
3716 };
3717
3718 // Helper (used in 2 places)
3719 function buf2binstring(buf, len) {
3720   // use fallback for big arrays to avoid stack overflow
3721   if (len < 65537) {
3722     if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {
3723       return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));
3724     }
3725   }
3726
3727   var result = '';
3728   for(var i=0; i < len; i++) {
3729     result += String.fromCharCode(buf[i]);
3730   }
3731   return result;
3732 }
3733
3734
3735 // Convert byte array to binary string
3736 exports.buf2binstring = function(buf) {
3737   return buf2binstring(buf, buf.length);
3738 };
3739
3740
3741 // Convert binary string (typed, when possible)
3742 exports.binstring2buf = function(str) {
3743   var buf = new utils.Buf8(str.length);
3744   for(var i=0, len=buf.length; i < len; i++) {
3745     buf[i] = str.charCodeAt(i);
3746   }
3747   return buf;
3748 };
3749
3750
3751 // convert array to string
3752 exports.buf2string = function (buf, max) {
3753   var i, out, c, c_len;
3754   var len = max || buf.length;
3755
3756   // Reserve max possible length (2 words per char)
3757   // NB: by unknown reasons, Array is significantly faster for
3758   //     String.fromCharCode.apply than Uint16Array.
3759   var utf16buf = new Array(len*2);
3760
3761   for (out=0, i=0; i<len;) {
3762     c = buf[i++];
3763     // quick process ascii
3764     if (c < 0x80) { utf16buf[out++] = c; continue; }
3765
3766     c_len = _utf8len[c];
3767     // skip 5 & 6 byte codes
3768     if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }
3769
3770     // apply mask on first byte
3771     c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
3772     // join the rest
3773     while (c_len > 1 && i < len) {
3774       c = (c << 6) | (buf[i++] & 0x3f);
3775       c_len--;
3776     }
3777
3778     // terminated by end of string?
3779     if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
3780
3781     if (c < 0x10000) {
3782       utf16buf[out++] = c;
3783     } else {
3784       c -= 0x10000;
3785       utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
3786       utf16buf[out++] = 0xdc00 | (c & 0x3ff);
3787     }
3788   }
3789
3790   return buf2binstring(utf16buf, out);
3791 };
3792
3793
3794 // Calculate max possible position in utf8 buffer,
3795 // that will not break sequence. If that's not possible
3796 // - (very small limits) return max size as is.
3797 //
3798 // buf[] - utf8 bytes array
3799 // max   - length limit (mandatory);
3800 exports.utf8border = function(buf, max) {
3801   var pos;
3802
3803   max = max || buf.length;
3804   if (max > buf.length) { max = buf.length; }
3805
3806   // go back from last position, until start of sequence found
3807   pos = max-1;
3808   while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
3809
3810   // Fuckup - very small and broken sequence,
3811   // return max, because we should return something anyway.
3812   if (pos < 0) { return max; }
3813
3814   // If we came to start of buffer - that means vuffer is too small,
3815   // return max too.
3816   if (pos === 0) { return max; }
3817
3818   return (pos + _utf8len[buf[pos]] > max) ? pos : max;
3819 };
3820
3821 },{"./common":27}],29:[function(_dereq_,module,exports){
3822 'use strict';
3823
3824 // Note: adler32 takes 12% for level 0 and 2% for level 6.
3825 // It doesn't worth to make additional optimizationa as in original.
3826 // Small size is preferable.
3827
3828 function adler32(adler, buf, len, pos) {
3829   var s1 = (adler & 0xffff) |0
3830     , s2 = ((adler >>> 16) & 0xffff) |0
3831     , n = 0;
3832
3833   while (len !== 0) {
3834     // Set limit ~ twice less than 5552, to keep
3835     // s2 in 31-bits, because we force signed ints.
3836     // in other case %= will fail.
3837     n = len > 2000 ? 2000 : len;
3838     len -= n;
3839
3840     do {
3841       s1 = (s1 + buf[pos++]) |0;
3842       s2 = (s2 + s1) |0;
3843     } while (--n);
3844
3845     s1 %= 65521;
3846     s2 %= 65521;
3847   }
3848
3849   return (s1 | (s2 << 16)) |0;
3850 }
3851
3852
3853 module.exports = adler32;
3854 },{}],30:[function(_dereq_,module,exports){
3855 module.exports = {
3856
3857   /* Allowed flush values; see deflate() and inflate() below for details */
3858   Z_NO_FLUSH:         0,
3859   Z_PARTIAL_FLUSH:    1,
3860   Z_SYNC_FLUSH:       2,
3861   Z_FULL_FLUSH:       3,
3862   Z_FINISH:           4,
3863   Z_BLOCK:            5,
3864   Z_TREES:            6,
3865
3866   /* Return codes for the compression/decompression functions. Negative values
3867   * are errors, positive values are used for special but normal events.
3868   */
3869   Z_OK:               0,
3870   Z_STREAM_END:       1,
3871   Z_NEED_DICT:        2,
3872   Z_ERRNO:           -1,
3873   Z_STREAM_ERROR:    -2,
3874   Z_DATA_ERROR:      -3,
3875   //Z_MEM_ERROR:     -4,
3876   Z_BUF_ERROR:       -5,
3877   //Z_VERSION_ERROR: -6,
3878
3879   /* compression levels */
3880   Z_NO_COMPRESSION:         0,
3881   Z_BEST_SPEED:             1,
3882   Z_BEST_COMPRESSION:       9,
3883   Z_DEFAULT_COMPRESSION:   -1,
3884
3885
3886   Z_FILTERED:               1,
3887   Z_HUFFMAN_ONLY:           2,
3888   Z_RLE:                    3,
3889   Z_FIXED:                  4,
3890   Z_DEFAULT_STRATEGY:       0,
3891
3892   /* Possible values of the data_type field (though see inflate()) */
3893   Z_BINARY:                 0,
3894   Z_TEXT:                   1,
3895   //Z_ASCII:                1, // = Z_TEXT (deprecated)
3896   Z_UNKNOWN:                2,
3897
3898   /* The deflate compression method */
3899   Z_DEFLATED:               8
3900   //Z_NULL:                 null // Use -1 or null inline, depending on var type
3901 };
3902 },{}],31:[function(_dereq_,module,exports){
3903 'use strict';
3904
3905 // Note: we can't get significant speed boost here.
3906 // So write code to minimize size - no pregenerated tables
3907 // and array tools dependencies.
3908
3909
3910 // Use ordinary array, since untyped makes no boost here
3911 function makeTable() {
3912   var c, table = [];
3913
3914   for(var n =0; n < 256; n++){
3915     c = n;
3916     for(var k =0; k < 8; k++){
3917       c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
3918     }
3919     table[n] = c;
3920   }
3921
3922   return table;
3923 }
3924
3925 // Create table on load. Just 255 signed longs. Not a problem.
3926 var crcTable = makeTable();
3927
3928
3929 function crc32(crc, buf, len, pos) {
3930   var t = crcTable
3931     , end = pos + len;
3932
3933   crc = crc ^ (-1);
3934
3935   for (var i = pos; i < end; i++ ) {
3936     crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
3937   }
3938
3939   return (crc ^ (-1)); // >>> 0;
3940 }
3941
3942
3943 module.exports = crc32;
3944 },{}],32:[function(_dereq_,module,exports){
3945 'use strict';
3946
3947 var utils   = _dereq_('../utils/common');
3948 var trees   = _dereq_('./trees');
3949 var adler32 = _dereq_('./adler32');
3950 var crc32   = _dereq_('./crc32');
3951 var msg   = _dereq_('./messages');
3952
3953 /* Public constants ==========================================================*/
3954 /* ===========================================================================*/
3955
3956
3957 /* Allowed flush values; see deflate() and inflate() below for details */
3958 var Z_NO_FLUSH      = 0;
3959 var Z_PARTIAL_FLUSH = 1;
3960 //var Z_SYNC_FLUSH    = 2;
3961 var Z_FULL_FLUSH    = 3;
3962 var Z_FINISH        = 4;
3963 var Z_BLOCK         = 5;
3964 //var Z_TREES         = 6;
3965
3966
3967 /* Return codes for the compression/decompression functions. Negative values
3968  * are errors, positive values are used for special but normal events.
3969  */
3970 var Z_OK            = 0;
3971 var Z_STREAM_END    = 1;
3972 //var Z_NEED_DICT     = 2;
3973 //var Z_ERRNO         = -1;
3974 var Z_STREAM_ERROR  = -2;
3975 var Z_DATA_ERROR    = -3;
3976 //var Z_MEM_ERROR     = -4;
3977 var Z_BUF_ERROR     = -5;
3978 //var Z_VERSION_ERROR = -6;
3979
3980
3981 /* compression levels */
3982 //var Z_NO_COMPRESSION      = 0;
3983 //var Z_BEST_SPEED          = 1;
3984 //var Z_BEST_COMPRESSION    = 9;
3985 var Z_DEFAULT_COMPRESSION = -1;
3986
3987
3988 var Z_FILTERED            = 1;
3989 var Z_HUFFMAN_ONLY        = 2;
3990 var Z_RLE                 = 3;
3991 var Z_FIXED               = 4;
3992 var Z_DEFAULT_STRATEGY    = 0;
3993
3994 /* Possible values of the data_type field (though see inflate()) */
3995 //var Z_BINARY              = 0;
3996 //var Z_TEXT                = 1;
3997 //var Z_ASCII               = 1; // = Z_TEXT
3998 var Z_UNKNOWN             = 2;
3999
4000
4001 /* The deflate compression method */
4002 var Z_DEFLATED  = 8;
4003
4004 /*============================================================================*/
4005
4006
4007 var MAX_MEM_LEVEL = 9;
4008 /* Maximum value for memLevel in deflateInit2 */
4009 var MAX_WBITS = 15;
4010 /* 32K LZ77 window */
4011 var DEF_MEM_LEVEL = 8;
4012
4013
4014 var LENGTH_CODES  = 29;
4015 /* number of length codes, not counting the special END_BLOCK code */
4016 var LITERALS      = 256;
4017 /* number of literal bytes 0..255 */
4018 var L_CODES       = LITERALS + 1 + LENGTH_CODES;
4019 /* number of Literal or Length codes, including the END_BLOCK code */
4020 var D_CODES       = 30;
4021 /* number of distance codes */
4022 var BL_CODES      = 19;
4023 /* number of codes used to transfer the bit lengths */
4024 var HEAP_SIZE     = 2*L_CODES + 1;
4025 /* maximum heap size */
4026 var MAX_BITS  = 15;
4027 /* All codes must not exceed MAX_BITS bits */
4028
4029 var MIN_MATCH = 3;
4030 var MAX_MATCH = 258;
4031 var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
4032
4033 var PRESET_DICT = 0x20;
4034
4035 var INIT_STATE = 42;
4036 var EXTRA_STATE = 69;
4037 var NAME_STATE = 73;
4038 var COMMENT_STATE = 91;
4039 var HCRC_STATE = 103;
4040 var BUSY_STATE = 113;
4041 var FINISH_STATE = 666;
4042
4043 var BS_NEED_MORE      = 1; /* block not completed, need more input or more output */
4044 var BS_BLOCK_DONE     = 2; /* block flush performed */
4045 var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
4046 var BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */
4047
4048 var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
4049
4050 function err(strm, errorCode) {
4051   strm.msg = msg[errorCode];
4052   return errorCode;
4053 }
4054
4055 function rank(f) {
4056   return ((f) << 1) - ((f) > 4 ? 9 : 0);
4057 }
4058
4059 function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
4060
4061
4062 /* =========================================================================
4063  * Flush as much pending output as possible. All deflate() output goes
4064  * through this function so some applications may wish to modify it
4065  * to avoid allocating a large strm->output buffer and copying into it.
4066  * (See also read_buf()).
4067  */
4068 function flush_pending(strm) {
4069   var s = strm.state;
4070
4071   //_tr_flush_bits(s);
4072   var len = s.pending;
4073   if (len > strm.avail_out) {
4074     len = strm.avail_out;
4075   }
4076   if (len === 0) { return; }
4077
4078   utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
4079   strm.next_out += len;
4080   s.pending_out += len;
4081   strm.total_out += len;
4082   strm.avail_out -= len;
4083   s.pending -= len;
4084   if (s.pending === 0) {
4085     s.pending_out = 0;
4086   }
4087 }
4088
4089
4090 function flush_block_only (s, last) {
4091   trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
4092   s.block_start = s.strstart;
4093   flush_pending(s.strm);
4094 }
4095
4096
4097 function put_byte(s, b) {
4098   s.pending_buf[s.pending++] = b;
4099 }
4100
4101
4102 /* =========================================================================
4103  * Put a short in the pending buffer. The 16-bit value is put in MSB order.
4104  * IN assertion: the stream state is correct and there is enough room in
4105  * pending_buf.
4106  */
4107 function putShortMSB(s, b) {
4108 //  put_byte(s, (Byte)(b >> 8));
4109 //  put_byte(s, (Byte)(b & 0xff));
4110   s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
4111   s.pending_buf[s.pending++] = b & 0xff;
4112 }
4113
4114
4115 /* ===========================================================================
4116  * Read a new buffer from the current input stream, update the adler32
4117  * and total number of bytes read.  All deflate() input goes through
4118  * this function so some applications may wish to modify it to avoid
4119  * allocating a large strm->input buffer and copying from it.
4120  * (See also flush_pending()).
4121  */
4122 function read_buf(strm, buf, start, size) {
4123   var len = strm.avail_in;
4124
4125   if (len > size) { len = size; }
4126   if (len === 0) { return 0; }
4127
4128   strm.avail_in -= len;
4129
4130   utils.arraySet(buf, strm.input, strm.next_in, len, start);
4131   if (strm.state.wrap === 1) {
4132     strm.adler = adler32(strm.adler, buf, len, start);
4133   }
4134
4135   else if (strm.state.wrap === 2) {
4136     strm.adler = crc32(strm.adler, buf, len, start);
4137   }
4138
4139   strm.next_in += len;
4140   strm.total_in += len;
4141
4142   return len;
4143 }
4144
4145
4146 /* ===========================================================================
4147  * Set match_start to the longest match starting at the given string and
4148  * return its length. Matches shorter or equal to prev_length are discarded,
4149  * in which case the result is equal to prev_length and match_start is
4150  * garbage.
4151  * IN assertions: cur_match is the head of the hash chain for the current
4152  *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
4153  * OUT assertion: the match length is not greater than s->lookahead.
4154  */
4155 function longest_match(s, cur_match) {
4156   var chain_length = s.max_chain_length;      /* max hash chain length */
4157   var scan = s.strstart; /* current string */
4158   var match;                       /* matched string */
4159   var len;                           /* length of current match */
4160   var best_len = s.prev_length;              /* best match length so far */
4161   var nice_match = s.nice_match;             /* stop if match long enough */
4162   var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
4163       s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
4164
4165   var _win = s.window; // shortcut
4166
4167   var wmask = s.w_mask;
4168   var prev  = s.prev;
4169
4170   /* Stop when cur_match becomes <= limit. To simplify the code,
4171    * we prevent matches with the string of window index 0.
4172    */
4173
4174   var strend = s.strstart + MAX_MATCH;
4175   var scan_end1  = _win[scan + best_len - 1];
4176   var scan_end   = _win[scan + best_len];
4177
4178   /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
4179    * It is easy to get rid of this optimization if necessary.
4180    */
4181   // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
4182
4183   /* Do not waste too much time if we already have a good match: */
4184   if (s.prev_length >= s.good_match) {
4185     chain_length >>= 2;
4186   }
4187   /* Do not look for matches beyond the end of the input. This is necessary
4188    * to make deflate deterministic.
4189    */
4190   if (nice_match > s.lookahead) { nice_match = s.lookahead; }
4191
4192   // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
4193
4194   do {
4195     // Assert(cur_match < s->strstart, "no future");
4196     match = cur_match;
4197
4198     /* Skip to next match if the match length cannot increase
4199      * or if the match length is less than 2.  Note that the checks below
4200      * for insufficient lookahead only occur occasionally for performance
4201      * reasons.  Therefore uninitialized memory will be accessed, and
4202      * conditional jumps will be made that depend on those values.
4203      * However the length of the match is limited to the lookahead, so
4204      * the output of deflate is not affected by the uninitialized values.
4205      */
4206
4207     if (_win[match + best_len]     !== scan_end  ||
4208         _win[match + best_len - 1] !== scan_end1 ||
4209         _win[match]                !== _win[scan] ||
4210         _win[++match]              !== _win[scan + 1]) {
4211       continue;
4212     }
4213
4214     /* The check at best_len-1 can be removed because it will be made
4215      * again later. (This heuristic is not always a win.)
4216      * It is not necessary to compare scan[2] and match[2] since they
4217      * are always equal when the other bytes match, given that
4218      * the hash keys are equal and that HASH_BITS >= 8.
4219      */
4220     scan += 2;
4221     match++;
4222     // Assert(*scan == *match, "match[2]?");
4223
4224     /* We check for insufficient lookahead only every 8th comparison;
4225      * the 256th check will be made at strstart+258.
4226      */
4227     do {
4228       /*jshint noempty:false*/
4229     } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
4230              _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
4231              _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
4232              _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
4233              scan < strend);
4234
4235     // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
4236
4237     len = MAX_MATCH - (strend - scan);
4238     scan = strend - MAX_MATCH;
4239
4240     if (len > best_len) {
4241       s.match_start = cur_match;
4242       best_len = len;
4243       if (len >= nice_match) {
4244         break;
4245       }
4246       scan_end1  = _win[scan + best_len - 1];
4247       scan_end   = _win[scan + best_len];
4248     }
4249   } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
4250
4251   if (best_len <= s.lookahead) {
4252     return best_len;
4253   }
4254   return s.lookahead;
4255 }
4256
4257
4258 /* ===========================================================================
4259  * Fill the window when the lookahead becomes insufficient.
4260  * Updates strstart and lookahead.
4261  *
4262  * IN assertion: lookahead < MIN_LOOKAHEAD
4263  * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
4264  *    At least one byte has been read, or avail_in == 0; reads are
4265  *    performed for at least two bytes (required for the zip translate_eol
4266  *    option -- not supported here).
4267  */
4268 function fill_window(s) {
4269   var _w_size = s.w_size;
4270   var p, n, m, more, str;
4271
4272   //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
4273
4274   do {
4275     more = s.window_size - s.lookahead - s.strstart;
4276
4277     // JS ints have 32 bit, block below not needed
4278     /* Deal with !@#$% 64K limit: */
4279     //if (sizeof(int) <= 2) {
4280     //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
4281     //        more = wsize;
4282     //
4283     //  } else if (more == (unsigned)(-1)) {
4284     //        /* Very unlikely, but possible on 16 bit machine if
4285     //         * strstart == 0 && lookahead == 1 (input done a byte at time)
4286     //         */
4287     //        more--;
4288     //    }
4289     //}
4290
4291
4292     /* If the window is almost full and there is insufficient lookahead,
4293      * move the upper half to the lower one to make room in the upper half.
4294      */
4295     if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
4296
4297       utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
4298       s.match_start -= _w_size;
4299       s.strstart -= _w_size;
4300       /* we now have strstart >= MAX_DIST */
4301       s.block_start -= _w_size;
4302
4303       /* Slide the hash table (could be avoided with 32 bit values
4304        at the expense of memory usage). We slide even when level == 0
4305        to keep the hash table consistent if we switch back to level > 0
4306        later. (Using level 0 permanently is not an optimal usage of
4307        zlib, so we don't care about this pathological case.)
4308        */
4309
4310       n = s.hash_size;
4311       p = n;
4312       do {
4313         m = s.head[--p];
4314         s.head[p] = (m >= _w_size ? m - _w_size : 0);
4315       } while (--n);
4316
4317       n = _w_size;
4318       p = n;
4319       do {
4320         m = s.prev[--p];
4321         s.prev[p] = (m >= _w_size ? m - _w_size : 0);
4322         /* If n is not on any hash chain, prev[n] is garbage but
4323          * its value will never be used.
4324          */
4325       } while (--n);
4326
4327       more += _w_size;
4328     }
4329     if (s.strm.avail_in === 0) {
4330       break;
4331     }
4332
4333     /* If there was no sliding:
4334      *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
4335      *    more == window_size - lookahead - strstart
4336      * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
4337      * => more >= window_size - 2*WSIZE + 2
4338      * In the BIG_MEM or MMAP case (not yet supported),
4339      *   window_size == input_size + MIN_LOOKAHEAD  &&
4340      *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
4341      * Otherwise, window_size == 2*WSIZE so more >= 2.
4342      * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
4343      */
4344     //Assert(more >= 2, "more < 2");
4345     n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
4346     s.lookahead += n;
4347
4348     /* Initialize the hash value now that we have some input: */
4349     if (s.lookahead + s.insert >= MIN_MATCH) {
4350       str = s.strstart - s.insert;
4351       s.ins_h = s.window[str];
4352
4353       /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
4354       s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
4355 //#if MIN_MATCH != 3
4356 //        Call update_hash() MIN_MATCH-3 more times
4357 //#endif
4358       while (s.insert) {
4359         /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
4360         s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH-1]) & s.hash_mask;
4361
4362         s.prev[str & s.w_mask] = s.head[s.ins_h];
4363         s.head[s.ins_h] = str;
4364         str++;
4365         s.insert--;
4366         if (s.lookahead + s.insert < MIN_MATCH) {
4367           break;
4368         }
4369       }
4370     }
4371     /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
4372      * but this is not important since only literal bytes will be emitted.
4373      */
4374
4375   } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
4376
4377   /* If the WIN_INIT bytes after the end of the current data have never been
4378    * written, then zero those bytes in order to avoid memory check reports of
4379    * the use of uninitialized (or uninitialised as Julian writes) bytes by
4380    * the longest match routines.  Update the high water mark for the next
4381    * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
4382    * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
4383    */
4384 //  if (s.high_water < s.window_size) {
4385 //    var curr = s.strstart + s.lookahead;
4386 //    var init = 0;
4387 //
4388 //    if (s.high_water < curr) {
4389 //      /* Previous high water mark below current data -- zero WIN_INIT
4390 //       * bytes or up to end of window, whichever is less.
4391 //       */
4392 //      init = s.window_size - curr;
4393 //      if (init > WIN_INIT)
4394 //        init = WIN_INIT;
4395 //      zmemzero(s->window + curr, (unsigned)init);
4396 //      s->high_water = curr + init;
4397 //    }
4398 //    else if (s->high_water < (ulg)curr + WIN_INIT) {
4399 //      /* High water mark at or above current data, but below current data
4400 //       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
4401 //       * to end of window, whichever is less.
4402 //       */
4403 //      init = (ulg)curr + WIN_INIT - s->high_water;
4404 //      if (init > s->window_size - s->high_water)
4405 //        init = s->window_size - s->high_water;
4406 //      zmemzero(s->window + s->high_water, (unsigned)init);
4407 //      s->high_water += init;
4408 //    }
4409 //  }
4410 //
4411 //  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
4412 //    "not enough room for search");
4413 }
4414
4415 /* ===========================================================================
4416  * Copy without compression as much as possible from the input stream, return
4417  * the current block state.
4418  * This function does not insert new strings in the dictionary since
4419  * uncompressible data is probably not useful. This function is used
4420  * only for the level=0 compression option.
4421  * NOTE: this function should be optimized to avoid extra copying from
4422  * window to pending_buf.
4423  */
4424 function deflate_stored(s, flush) {
4425   /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
4426    * to pending_buf_size, and each stored block has a 5 byte header:
4427    */
4428   var max_block_size = 0xffff;
4429
4430   if (max_block_size > s.pending_buf_size - 5) {
4431     max_block_size = s.pending_buf_size - 5;
4432   }
4433
4434   /* Copy as much as possible from input to output: */
4435   for (;;) {
4436     /* Fill the window as much as possible: */
4437     if (s.lookahead <= 1) {
4438
4439       //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
4440       //  s->block_start >= (long)s->w_size, "slide too late");
4441 //      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
4442 //        s.block_start >= s.w_size)) {
4443 //        throw  new Error("slide too late");
4444 //      }
4445
4446       fill_window(s);
4447       if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
4448         return BS_NEED_MORE;
4449       }
4450
4451       if (s.lookahead === 0) {
4452         break;
4453       }
4454       /* flush the current block */
4455     }
4456     //Assert(s->block_start >= 0L, "block gone");
4457 //    if (s.block_start < 0) throw new Error("block gone");
4458
4459     s.strstart += s.lookahead;
4460     s.lookahead = 0;
4461
4462     /* Emit a stored block if pending_buf will be full: */
4463     var max_start = s.block_start + max_block_size;
4464
4465     if (s.strstart === 0 || s.strstart >= max_start) {
4466       /* strstart == 0 is possible when wraparound on 16-bit machine */
4467       s.lookahead = s.strstart - max_start;
4468       s.strstart = max_start;
4469       /*** FLUSH_BLOCK(s, 0); ***/
4470       flush_block_only(s, false);
4471       if (s.strm.avail_out === 0) {
4472         return BS_NEED_MORE;
4473       }
4474       /***/
4475
4476
4477     }
4478     /* Flush if we may have to slide, otherwise block_start may become
4479      * negative and the data will be gone:
4480      */
4481     if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
4482       /*** FLUSH_BLOCK(s, 0); ***/
4483       flush_block_only(s, false);
4484       if (s.strm.avail_out === 0) {
4485         return BS_NEED_MORE;
4486       }
4487       /***/
4488     }
4489   }
4490
4491   s.insert = 0;
4492
4493   if (flush === Z_FINISH) {
4494     /*** FLUSH_BLOCK(s, 1); ***/
4495     flush_block_only(s, true);
4496     if (s.strm.avail_out === 0) {
4497       return BS_FINISH_STARTED;
4498     }
4499     /***/
4500     return BS_FINISH_DONE;
4501   }
4502
4503   if (s.strstart > s.block_start) {
4504     /*** FLUSH_BLOCK(s, 0); ***/
4505     flush_block_only(s, false);
4506     if (s.strm.avail_out === 0) {
4507       return BS_NEED_MORE;
4508     }
4509     /***/
4510   }
4511
4512   return BS_NEED_MORE;
4513 }
4514
4515 /* ===========================================================================
4516  * Compress as much as possible from the input stream, return the current
4517  * block state.
4518  * This function does not perform lazy evaluation of matches and inserts
4519  * new strings in the dictionary only for unmatched strings or for short
4520  * matches. It is used only for the fast compression options.
4521  */
4522 function deflate_fast(s, flush) {
4523   var hash_head;        /* head of the hash chain */
4524   var bflush;           /* set if current block must be flushed */
4525
4526   for (;;) {
4527     /* Make sure that we always have enough lookahead, except
4528      * at the end of the input file. We need MAX_MATCH bytes
4529      * for the next match, plus MIN_MATCH bytes to insert the
4530      * string following the next match.
4531      */
4532     if (s.lookahead < MIN_LOOKAHEAD) {
4533       fill_window(s);
4534       if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
4535         return BS_NEED_MORE;
4536       }
4537       if (s.lookahead === 0) {
4538         break; /* flush the current block */
4539       }
4540     }
4541
4542     /* Insert the string window[strstart .. strstart+2] in the
4543      * dictionary, and set hash_head to the head of the hash chain:
4544      */
4545     hash_head = 0/*NIL*/;
4546     if (s.lookahead >= MIN_MATCH) {
4547       /*** INSERT_STRING(s, s.strstart, hash_head); ***/
4548       s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
4549       hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
4550       s.head[s.ins_h] = s.strstart;
4551       /***/
4552     }
4553
4554     /* Find the longest match, discarding those <= prev_length.
4555      * At this point we have always match_length < MIN_MATCH
4556      */
4557     if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
4558       /* To simplify the code, we prevent matches with the string
4559        * of window index 0 (in particular we have to avoid a match
4560        * of the string with itself at the start of the input file).
4561        */
4562       s.match_length = longest_match(s, hash_head);
4563       /* longest_match() sets match_start */
4564     }
4565     if (s.match_length >= MIN_MATCH) {
4566       // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
4567
4568       /*** _tr_tally_dist(s, s.strstart - s.match_start,
4569                      s.match_length - MIN_MATCH, bflush); ***/
4570       bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
4571
4572       s.lookahead -= s.match_length;
4573
4574       /* Insert new strings in the hash table only if the match length
4575        * is not too large. This saves time but degrades compression.
4576        */
4577       if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
4578         s.match_length--; /* string at strstart already in table */
4579         do {
4580           s.strstart++;
4581           /*** INSERT_STRING(s, s.strstart, hash_head); ***/
4582           s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
4583           hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
4584           s.head[s.ins_h] = s.strstart;
4585           /***/
4586           /* strstart never exceeds WSIZE-MAX_MATCH, so there are
4587            * always MIN_MATCH bytes ahead.
4588            */
4589         } while (--s.match_length !== 0);
4590         s.strstart++;
4591       } else
4592       {
4593         s.strstart += s.match_length;
4594         s.match_length = 0;
4595         s.ins_h = s.window[s.strstart];
4596         /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
4597         s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
4598
4599 //#if MIN_MATCH != 3
4600 //                Call UPDATE_HASH() MIN_MATCH-3 more times
4601 //#endif
4602         /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
4603          * matter since it will be recomputed at next deflate call.
4604          */
4605       }
4606     } else {
4607       /* No match, output a literal byte */
4608       //Tracevv((stderr,"%c", s.window[s.strstart]));
4609       /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
4610       bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
4611
4612       s.lookahead--;
4613       s.strstart++;
4614     }
4615     if (bflush) {
4616       /*** FLUSH_BLOCK(s, 0); ***/
4617       flush_block_only(s, false);
4618       if (s.strm.avail_out === 0) {
4619         return BS_NEED_MORE;
4620       }
4621       /***/
4622     }
4623   }
4624   s.insert = ((s.strstart < (MIN_MATCH-1)) ? s.strstart : MIN_MATCH-1);
4625   if (flush === Z_FINISH) {
4626     /*** FLUSH_BLOCK(s, 1); ***/
4627     flush_block_only(s, true);
4628     if (s.strm.avail_out === 0) {
4629       return BS_FINISH_STARTED;
4630     }
4631     /***/
4632     return BS_FINISH_DONE;
4633   }
4634   if (s.last_lit) {
4635     /*** FLUSH_BLOCK(s, 0); ***/
4636     flush_block_only(s, false);
4637     if (s.strm.avail_out === 0) {
4638       return BS_NEED_MORE;
4639     }
4640     /***/
4641   }
4642   return BS_BLOCK_DONE;
4643 }
4644
4645 /* ===========================================================================
4646  * Same as above, but achieves better compression. We use a lazy
4647  * evaluation for matches: a match is finally adopted only if there is
4648  * no better match at the next window position.
4649  */
4650 function deflate_slow(s, flush) {
4651   var hash_head;          /* head of hash chain */
4652   var bflush;              /* set if current block must be flushed */
4653
4654   var max_insert;
4655
4656   /* Process the input block. */
4657   for (;;) {
4658     /* Make sure that we always have enough lookahead, except
4659      * at the end of the input file. We need MAX_MATCH bytes
4660      * for the next match, plus MIN_MATCH bytes to insert the
4661      * string following the next match.
4662      */
4663     if (s.lookahead < MIN_LOOKAHEAD) {
4664       fill_window(s);
4665       if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
4666         return BS_NEED_MORE;
4667       }
4668       if (s.lookahead === 0) { break; } /* flush the current block */
4669     }
4670
4671     /* Insert the string window[strstart .. strstart+2] in the
4672      * dictionary, and set hash_head to the head of the hash chain:
4673      */
4674     hash_head = 0/*NIL*/;
4675     if (s.lookahead >= MIN_MATCH) {
4676       /*** INSERT_STRING(s, s.strstart, hash_head); ***/
4677       s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
4678       hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
4679       s.head[s.ins_h] = s.strstart;
4680       /***/
4681     }
4682
4683     /* Find the longest match, discarding those <= prev_length.
4684      */
4685     s.prev_length = s.match_length;
4686     s.prev_match = s.match_start;
4687     s.match_length = MIN_MATCH-1;
4688
4689     if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
4690         s.strstart - hash_head <= (s.w_size-MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
4691       /* To simplify the code, we prevent matches with the string
4692        * of window index 0 (in particular we have to avoid a match
4693        * of the string with itself at the start of the input file).
4694        */
4695       s.match_length = longest_match(s, hash_head);
4696       /* longest_match() sets match_start */
4697
4698       if (s.match_length <= 5 &&
4699          (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
4700
4701         /* If prev_match is also MIN_MATCH, match_start is garbage
4702          * but we will ignore the current match anyway.
4703          */
4704         s.match_length = MIN_MATCH-1;
4705       }
4706     }
4707     /* If there was a match at the previous step and the current
4708      * match is not better, output the previous match:
4709      */
4710     if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
4711       max_insert = s.strstart + s.lookahead - MIN_MATCH;
4712       /* Do not insert strings in hash table beyond this. */
4713
4714       //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
4715
4716       /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
4717                      s.prev_length - MIN_MATCH, bflush);***/
4718       bflush = trees._tr_tally(s, s.strstart - 1- s.prev_match, s.prev_length - MIN_MATCH);
4719       /* Insert in hash table all strings up to the end of the match.
4720        * strstart-1 and strstart are already inserted. If there is not
4721        * enough lookahead, the last two strings are not inserted in
4722        * the hash table.
4723        */
4724       s.lookahead -= s.prev_length-1;
4725       s.prev_length -= 2;
4726       do {
4727         if (++s.strstart <= max_insert) {
4728           /*** INSERT_STRING(s, s.strstart, hash_head); ***/
4729           s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
4730           hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
4731           s.head[s.ins_h] = s.strstart;
4732           /***/
4733         }
4734       } while (--s.prev_length !== 0);
4735       s.match_available = 0;
4736       s.match_length = MIN_MATCH-1;
4737       s.strstart++;
4738
4739       if (bflush) {
4740         /*** FLUSH_BLOCK(s, 0); ***/
4741         flush_block_only(s, false);
4742         if (s.strm.avail_out === 0) {
4743           return BS_NEED_MORE;
4744         }
4745         /***/
4746       }
4747
4748     } else if (s.match_available) {
4749       /* If there was no match at the previous position, output a
4750        * single literal. If there was a match but the current match
4751        * is longer, truncate the previous match to a single literal.
4752        */
4753       //Tracevv((stderr,"%c", s->window[s->strstart-1]));
4754       /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
4755       bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);
4756
4757       if (bflush) {
4758         /*** FLUSH_BLOCK_ONLY(s, 0) ***/
4759         flush_block_only(s, false);
4760         /***/
4761       }
4762       s.strstart++;
4763       s.lookahead--;
4764       if (s.strm.avail_out === 0) {
4765         return BS_NEED_MORE;
4766       }
4767     } else {
4768       /* There is no previous match to compare with, wait for
4769        * the next step to decide.
4770        */
4771       s.match_available = 1;
4772       s.strstart++;
4773       s.lookahead--;
4774     }
4775   }
4776   //Assert (flush != Z_NO_FLUSH, "no flush?");
4777   if (s.match_available) {
4778     //Tracevv((stderr,"%c", s->window[s->strstart-1]));
4779     /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
4780     bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);
4781
4782     s.match_available = 0;
4783   }
4784   s.insert = s.strstart < MIN_MATCH-1 ? s.strstart : MIN_MATCH-1;
4785   if (flush === Z_FINISH) {
4786     /*** FLUSH_BLOCK(s, 1); ***/
4787     flush_block_only(s, true);
4788     if (s.strm.avail_out === 0) {
4789       return BS_FINISH_STARTED;
4790     }
4791     /***/
4792     return BS_FINISH_DONE;
4793   }
4794   if (s.last_lit) {
4795     /*** FLUSH_BLOCK(s, 0); ***/
4796     flush_block_only(s, false);
4797     if (s.strm.avail_out === 0) {
4798       return BS_NEED_MORE;
4799     }
4800     /***/
4801   }
4802
4803   return BS_BLOCK_DONE;
4804 }
4805
4806
4807 /* ===========================================================================
4808  * For Z_RLE, simply look for runs of bytes, generate matches only of distance
4809  * one.  Do not maintain a hash table.  (It will be regenerated if this run of
4810  * deflate switches away from Z_RLE.)
4811  */
4812 function deflate_rle(s, flush) {
4813   var bflush;            /* set if current block must be flushed */
4814   var prev;              /* byte at distance one to match */
4815   var scan, strend;      /* scan goes up to strend for length of run */
4816
4817   var _win = s.window;
4818
4819   for (;;) {
4820     /* Make sure that we always have enough lookahead, except
4821      * at the end of the input file. We need MAX_MATCH bytes
4822      * for the longest run, plus one for the unrolled loop.
4823      */
4824     if (s.lookahead <= MAX_MATCH) {
4825       fill_window(s);
4826       if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
4827         return BS_NEED_MORE;
4828       }
4829       if (s.lookahead === 0) { break; } /* flush the current block */
4830     }
4831
4832     /* See how many times the previous byte repeats */
4833     s.match_length = 0;
4834     if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
4835       scan = s.strstart - 1;
4836       prev = _win[scan];
4837       if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
4838         strend = s.strstart + MAX_MATCH;
4839         do {
4840           /*jshint noempty:false*/
4841         } while (prev === _win[++scan] && prev === _win[++scan] &&
4842                  prev === _win[++scan] && prev === _win[++scan] &&
4843                  prev === _win[++scan] && prev === _win[++scan] &&
4844                  prev === _win[++scan] && prev === _win[++scan] &&
4845                  scan < strend);
4846         s.match_length = MAX_MATCH - (strend - scan);
4847         if (s.match_length > s.lookahead) {
4848           s.match_length = s.lookahead;
4849         }
4850       }
4851       //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
4852     }
4853
4854     /* Emit match if have run of MIN_MATCH or longer, else emit literal */
4855     if (s.match_length >= MIN_MATCH) {
4856       //check_match(s, s.strstart, s.strstart - 1, s.match_length);
4857
4858       /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
4859       bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
4860
4861       s.lookahead -= s.match_length;
4862       s.strstart += s.match_length;
4863       s.match_length = 0;
4864     } else {
4865       /* No match, output a literal byte */
4866       //Tracevv((stderr,"%c", s->window[s->strstart]));
4867       /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
4868       bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
4869
4870       s.lookahead--;
4871       s.strstart++;
4872     }
4873     if (bflush) {
4874       /*** FLUSH_BLOCK(s, 0); ***/
4875       flush_block_only(s, false);
4876       if (s.strm.avail_out === 0) {
4877         return BS_NEED_MORE;
4878       }
4879       /***/
4880     }
4881   }
4882   s.insert = 0;
4883   if (flush === Z_FINISH) {
4884     /*** FLUSH_BLOCK(s, 1); ***/
4885     flush_block_only(s, true);
4886     if (s.strm.avail_out === 0) {
4887       return BS_FINISH_STARTED;
4888     }
4889     /***/
4890     return BS_FINISH_DONE;
4891   }
4892   if (s.last_lit) {
4893     /*** FLUSH_BLOCK(s, 0); ***/
4894     flush_block_only(s, false);
4895     if (s.strm.avail_out === 0) {
4896       return BS_NEED_MORE;
4897     }
4898     /***/
4899   }
4900   return BS_BLOCK_DONE;
4901 }
4902
4903 /* ===========================================================================
4904  * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
4905  * (It will be regenerated if this run of deflate switches away from Huffman.)
4906  */
4907 function deflate_huff(s, flush) {
4908   var bflush;             /* set if current block must be flushed */
4909
4910   for (;;) {
4911     /* Make sure that we have a literal to write. */
4912     if (s.lookahead === 0) {
4913       fill_window(s);
4914       if (s.lookahead === 0) {
4915         if (flush === Z_NO_FLUSH) {
4916           return BS_NEED_MORE;
4917         }
4918         break;      /* flush the current block */
4919       }
4920     }
4921
4922     /* Output a literal byte */
4923     s.match_length = 0;
4924     //Tracevv((stderr,"%c", s->window[s->strstart]));
4925     /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
4926     bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
4927     s.lookahead--;
4928     s.strstart++;
4929     if (bflush) {
4930       /*** FLUSH_BLOCK(s, 0); ***/
4931       flush_block_only(s, false);
4932       if (s.strm.avail_out === 0) {
4933         return BS_NEED_MORE;
4934       }
4935       /***/
4936     }
4937   }
4938   s.insert = 0;
4939   if (flush === Z_FINISH) {
4940     /*** FLUSH_BLOCK(s, 1); ***/
4941     flush_block_only(s, true);
4942     if (s.strm.avail_out === 0) {
4943       return BS_FINISH_STARTED;
4944     }
4945     /***/
4946     return BS_FINISH_DONE;
4947   }
4948   if (s.last_lit) {
4949     /*** FLUSH_BLOCK(s, 0); ***/
4950     flush_block_only(s, false);
4951     if (s.strm.avail_out === 0) {
4952       return BS_NEED_MORE;
4953     }
4954     /***/
4955   }
4956   return BS_BLOCK_DONE;
4957 }
4958
4959 /* Values for max_lazy_match, good_match and max_chain_length, depending on
4960  * the desired pack level (0..9). The values given below have been tuned to
4961  * exclude worst case performance for pathological files. Better values may be
4962  * found for specific files.
4963  */
4964 var Config = function (good_length, max_lazy, nice_length, max_chain, func) {
4965   this.good_length = good_length;
4966   this.max_lazy = max_lazy;
4967   this.nice_length = nice_length;
4968   this.max_chain = max_chain;
4969   this.func = func;
4970 };
4971
4972 var configuration_table;
4973
4974 configuration_table = [
4975   /*      good lazy nice chain */
4976   new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */
4977   new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */
4978   new Config(4, 5, 16, 8, deflate_fast),           /* 2 */
4979   new Config(4, 6, 32, 32, deflate_fast),          /* 3 */
4980
4981   new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */
4982   new Config(8, 16, 32, 32, deflate_slow),         /* 5 */
4983   new Config(8, 16, 128, 128, deflate_slow),       /* 6 */
4984   new Config(8, 32, 128, 256, deflate_slow),       /* 7 */
4985   new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */
4986   new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */
4987 ];
4988
4989
4990 /* ===========================================================================
4991  * Initialize the "longest match" routines for a new zlib stream
4992  */
4993 function lm_init(s) {
4994   s.window_size = 2 * s.w_size;
4995
4996   /*** CLEAR_HASH(s); ***/
4997   zero(s.head); // Fill with NIL (= 0);
4998
4999   /* Set the default configuration parameters:
5000    */
5001   s.max_lazy_match = configuration_table[s.level].max_lazy;
5002   s.good_match = configuration_table[s.level].good_length;
5003   s.nice_match = configuration_table[s.level].nice_length;
5004   s.max_chain_length = configuration_table[s.level].max_chain;
5005
5006   s.strstart = 0;
5007   s.block_start = 0;
5008   s.lookahead = 0;
5009   s.insert = 0;
5010   s.match_length = s.prev_length = MIN_MATCH - 1;
5011   s.match_available = 0;
5012   s.ins_h = 0;
5013 }
5014
5015
5016 function DeflateState() {
5017   this.strm = null;            /* pointer back to this zlib stream */
5018   this.status = 0;            /* as the name implies */
5019   this.pending_buf = null;      /* output still pending */
5020   this.pending_buf_size = 0;  /* size of pending_buf */
5021   this.pending_out = 0;       /* next pending byte to output to the stream */
5022   this.pending = 0;           /* nb of bytes in the pending buffer */
5023   this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
5024   this.gzhead = null;         /* gzip header information to write */
5025   this.gzindex = 0;           /* where in extra, name, or comment */
5026   this.method = Z_DEFLATED; /* can only be DEFLATED */
5027   this.last_flush = -1;   /* value of flush param for previous deflate call */
5028
5029   this.w_size = 0;  /* LZ77 window size (32K by default) */
5030   this.w_bits = 0;  /* log2(w_size)  (8..16) */
5031   this.w_mask = 0;  /* w_size - 1 */
5032
5033   this.window = null;
5034   /* Sliding window. Input bytes are read into the second half of the window,
5035    * and move to the first half later to keep a dictionary of at least wSize
5036    * bytes. With this organization, matches are limited to a distance of
5037    * wSize-MAX_MATCH bytes, but this ensures that IO is always
5038    * performed with a length multiple of the block size.
5039    */
5040
5041   this.window_size = 0;
5042   /* Actual size of window: 2*wSize, except when the user input buffer
5043    * is directly used as sliding window.
5044    */
5045
5046   this.prev = null;
5047   /* Link to older string with same hash index. To limit the size of this
5048    * array to 64K, this link is maintained only for the last 32K strings.
5049    * An index in this array is thus a window index modulo 32K.
5050    */
5051
5052   this.head = null;   /* Heads of the hash chains or NIL. */
5053
5054   this.ins_h = 0;       /* hash index of string to be inserted */
5055   this.hash_size = 0;   /* number of elements in hash table */
5056   this.hash_bits = 0;   /* log2(hash_size) */
5057   this.hash_mask = 0;   /* hash_size-1 */
5058
5059   this.hash_shift = 0;
5060   /* Number of bits by which ins_h must be shifted at each input
5061    * step. It must be such that after MIN_MATCH steps, the oldest
5062    * byte no longer takes part in the hash key, that is:
5063    *   hash_shift * MIN_MATCH >= hash_bits
5064    */
5065
5066   this.block_start = 0;
5067   /* Window position at the beginning of the current output block. Gets
5068    * negative when the window is moved backwards.
5069    */
5070
5071   this.match_length = 0;      /* length of best match */
5072   this.prev_match = 0;        /* previous match */
5073   this.match_available = 0;   /* set if previous match exists */
5074   this.strstart = 0;          /* start of string to insert */
5075   this.match_start = 0;       /* start of matching string */
5076   this.lookahead = 0;         /* number of valid bytes ahead in window */
5077
5078   this.prev_length = 0;
5079   /* Length of the best match at previous step. Matches not greater than this
5080    * are discarded. This is used in the lazy match evaluation.
5081    */
5082
5083   this.max_chain_length = 0;
5084   /* To speed up deflation, hash chains are never searched beyond this
5085    * length.  A higher limit improves compression ratio but degrades the
5086    * speed.
5087    */
5088
5089   this.max_lazy_match = 0;
5090   /* Attempt to find a better match only when the current match is strictly
5091    * smaller than this value. This mechanism is used only for compression
5092    * levels >= 4.
5093    */
5094   // That's alias to max_lazy_match, don't use directly
5095   //this.max_insert_length = 0;
5096   /* Insert new strings in the hash table only if the match length is not
5097    * greater than this length. This saves time but degrades compression.
5098    * max_insert_length is used only for compression levels <= 3.
5099    */
5100
5101   this.level = 0;     /* compression level (1..9) */
5102   this.strategy = 0;  /* favor or force Huffman coding*/
5103
5104   this.good_match = 0;
5105   /* Use a faster search when the previous match is longer than this */
5106
5107   this.nice_match = 0; /* Stop searching when current match exceeds this */
5108
5109               /* used by trees.c: */
5110
5111   /* Didn't use ct_data typedef below to suppress compiler warning */
5112
5113   // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
5114   // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
5115   // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
5116
5117   // Use flat array of DOUBLE size, with interleaved fata,
5118   // because JS does not support effective
5119   this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);
5120   this.dyn_dtree  = new utils.Buf16((2*D_CODES+1) * 2);
5121   this.bl_tree    = new utils.Buf16((2*BL_CODES+1) * 2);
5122   zero(this.dyn_ltree);
5123   zero(this.dyn_dtree);
5124   zero(this.bl_tree);
5125
5126   this.l_desc   = null;         /* desc. for literal tree */
5127   this.d_desc   = null;         /* desc. for distance tree */
5128   this.bl_desc  = null;         /* desc. for bit length tree */
5129
5130   //ush bl_count[MAX_BITS+1];
5131   this.bl_count = new utils.Buf16(MAX_BITS+1);
5132   /* number of codes at each bit length for an optimal tree */
5133
5134   //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
5135   this.heap = new utils.Buf16(2*L_CODES+1);  /* heap used to build the Huffman trees */
5136   zero(this.heap);
5137
5138   this.heap_len = 0;               /* number of elements in the heap */
5139   this.heap_max = 0;               /* element of largest frequency */
5140   /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
5141    * The same heap array is used to build all trees.
5142    */
5143
5144   this.depth = new utils.Buf16(2*L_CODES+1); //uch depth[2*L_CODES+1];
5145   zero(this.depth);
5146   /* Depth of each subtree used as tie breaker for trees of equal frequency
5147    */
5148
5149   this.l_buf = 0;          /* buffer index for literals or lengths */
5150
5151   this.lit_bufsize = 0;
5152   /* Size of match buffer for literals/lengths.  There are 4 reasons for
5153    * limiting lit_bufsize to 64K:
5154    *   - frequencies can be kept in 16 bit counters
5155    *   - if compression is not successful for the first block, all input
5156    *     data is still in the window so we can still emit a stored block even
5157    *     when input comes from standard input.  (This can also be done for
5158    *     all blocks if lit_bufsize is not greater than 32K.)
5159    *   - if compression is not successful for a file smaller than 64K, we can
5160    *     even emit a stored file instead of a stored block (saving 5 bytes).
5161    *     This is applicable only for zip (not gzip or zlib).
5162    *   - creating new Huffman trees less frequently may not provide fast
5163    *     adaptation to changes in the input data statistics. (Take for
5164    *     example a binary file with poorly compressible code followed by
5165    *     a highly compressible string table.) Smaller buffer sizes give
5166    *     fast adaptation but have of course the overhead of transmitting
5167    *     trees more frequently.
5168    *   - I can't count above 4
5169    */
5170
5171   this.last_lit = 0;      /* running index in l_buf */
5172
5173   this.d_buf = 0;
5174   /* Buffer index for distances. To simplify the code, d_buf and l_buf have
5175    * the same number of elements. To use different lengths, an extra flag
5176    * array would be necessary.
5177    */
5178
5179   this.opt_len = 0;       /* bit length of current block with optimal trees */
5180   this.static_len = 0;    /* bit length of current block with static trees */
5181   this.matches = 0;       /* number of string matches in current block */
5182   this.insert = 0;        /* bytes at end of window left to insert */
5183
5184
5185   this.bi_buf = 0;
5186   /* Output buffer. bits are inserted starting at the bottom (least
5187    * significant bits).
5188    */
5189   this.bi_valid = 0;
5190   /* Number of valid bits in bi_buf.  All bits above the last valid bit
5191    * are always zero.
5192    */
5193
5194   // Used for window memory init. We safely ignore it for JS. That makes
5195   // sense only for pointers and memory check tools.
5196   //this.high_water = 0;
5197   /* High water mark offset in window for initialized bytes -- bytes above
5198    * this are set to zero in order to avoid memory check warnings when
5199    * longest match routines access bytes past the input.  This is then
5200    * updated to the new high water mark.
5201    */
5202 }
5203
5204
5205 function deflateResetKeep(strm) {
5206   var s;
5207
5208   if (!strm || !strm.state) {
5209     return err(strm, Z_STREAM_ERROR);
5210   }
5211
5212   strm.total_in = strm.total_out = 0;
5213   strm.data_type = Z_UNKNOWN;
5214
5215   s = strm.state;
5216   s.pending = 0;
5217   s.pending_out = 0;
5218
5219   if (s.wrap < 0) {
5220     s.wrap = -s.wrap;
5221     /* was made negative by deflate(..., Z_FINISH); */
5222   }
5223   s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
5224   strm.adler = (s.wrap === 2) ?
5225     0  // crc32(0, Z_NULL, 0)
5226   :
5227     1; // adler32(0, Z_NULL, 0)
5228   s.last_flush = Z_NO_FLUSH;
5229   trees._tr_init(s);
5230   return Z_OK;
5231 }
5232
5233
5234 function deflateReset(strm) {
5235   var ret = deflateResetKeep(strm);
5236   if (ret === Z_OK) {
5237     lm_init(strm.state);
5238   }
5239   return ret;
5240 }
5241
5242
5243 function deflateSetHeader(strm, head) {
5244   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
5245   if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
5246   strm.state.gzhead = head;
5247   return Z_OK;
5248 }
5249
5250
5251 function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
5252   if (!strm) { // === Z_NULL
5253     return Z_STREAM_ERROR;
5254   }
5255   var wrap = 1;
5256
5257   if (level === Z_DEFAULT_COMPRESSION) {
5258     level = 6;
5259   }
5260
5261   if (windowBits < 0) { /* suppress zlib wrapper */
5262     wrap = 0;
5263     windowBits = -windowBits;
5264   }
5265
5266   else if (windowBits > 15) {
5267     wrap = 2;           /* write gzip wrapper instead */
5268     windowBits -= 16;
5269   }
5270
5271
5272   if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
5273     windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
5274     strategy < 0 || strategy > Z_FIXED) {
5275     return err(strm, Z_STREAM_ERROR);
5276   }
5277
5278
5279   if (windowBits === 8) {
5280     windowBits = 9;
5281   }
5282   /* until 256-byte window bug fixed */
5283
5284   var s = new DeflateState();
5285
5286   strm.state = s;
5287   s.strm = strm;
5288
5289   s.wrap = wrap;
5290   s.gzhead = null;
5291   s.w_bits = windowBits;
5292   s.w_size = 1 << s.w_bits;
5293   s.w_mask = s.w_size - 1;
5294
5295   s.hash_bits = memLevel + 7;
5296   s.hash_size = 1 << s.hash_bits;
5297   s.hash_mask = s.hash_size - 1;
5298   s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
5299
5300   s.window = new utils.Buf8(s.w_size * 2);
5301   s.head = new utils.Buf16(s.hash_size);
5302   s.prev = new utils.Buf16(s.w_size);
5303
5304   // Don't need mem init magic for JS.
5305   //s.high_water = 0;  /* nothing written to s->window yet */
5306
5307   s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
5308
5309   s.pending_buf_size = s.lit_bufsize * 4;
5310   s.pending_buf = new utils.Buf8(s.pending_buf_size);
5311
5312   s.d_buf = s.lit_bufsize >> 1;
5313   s.l_buf = (1 + 2) * s.lit_bufsize;
5314
5315   s.level = level;
5316   s.strategy = strategy;
5317   s.method = method;
5318
5319   return deflateReset(strm);
5320 }
5321
5322 function deflateInit(strm, level) {
5323   return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
5324 }
5325
5326
5327 function deflate(strm, flush) {
5328   var old_flush, s;
5329   var beg, val; // for gzip header write only
5330
5331   if (!strm || !strm.state ||
5332     flush > Z_BLOCK || flush < 0) {
5333     return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
5334   }
5335
5336   s = strm.state;
5337
5338   if (!strm.output ||
5339       (!strm.input && strm.avail_in !== 0) ||
5340       (s.status === FINISH_STATE && flush !== Z_FINISH)) {
5341     return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
5342   }
5343
5344   s.strm = strm; /* just in case */
5345   old_flush = s.last_flush;
5346   s.last_flush = flush;
5347
5348   /* Write the header */
5349   if (s.status === INIT_STATE) {
5350
5351     if (s.wrap === 2) { // GZIP header
5352       strm.adler = 0;  //crc32(0L, Z_NULL, 0);
5353       put_byte(s, 31);
5354       put_byte(s, 139);
5355       put_byte(s, 8);
5356       if (!s.gzhead) { // s->gzhead == Z_NULL
5357         put_byte(s, 0);
5358         put_byte(s, 0);
5359         put_byte(s, 0);
5360         put_byte(s, 0);
5361         put_byte(s, 0);
5362         put_byte(s, s.level === 9 ? 2 :
5363                     (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
5364                      4 : 0));
5365         put_byte(s, OS_CODE);
5366         s.status = BUSY_STATE;
5367       }
5368       else {
5369         put_byte(s, (s.gzhead.text ? 1 : 0) +
5370                     (s.gzhead.hcrc ? 2 : 0) +
5371                     (!s.gzhead.extra ? 0 : 4) +
5372                     (!s.gzhead.name ? 0 : 8) +
5373                     (!s.gzhead.comment ? 0 : 16)
5374                 );
5375         put_byte(s, s.gzhead.time & 0xff);
5376         put_byte(s, (s.gzhead.time >> 8) & 0xff);
5377         put_byte(s, (s.gzhead.time >> 16) & 0xff);
5378         put_byte(s, (s.gzhead.time >> 24) & 0xff);
5379         put_byte(s, s.level === 9 ? 2 :
5380                     (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
5381                      4 : 0));
5382         put_byte(s, s.gzhead.os & 0xff);
5383         if (s.gzhead.extra && s.gzhead.extra.length) {
5384           put_byte(s, s.gzhead.extra.length & 0xff);
5385           put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
5386         }
5387         if (s.gzhead.hcrc) {
5388           strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
5389         }
5390         s.gzindex = 0;
5391         s.status = EXTRA_STATE;
5392       }
5393     }
5394     else // DEFLATE header
5395     {
5396       var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
5397       var level_flags = -1;
5398
5399       if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
5400         level_flags = 0;
5401       } else if (s.level < 6) {
5402         level_flags = 1;
5403       } else if (s.level === 6) {
5404         level_flags = 2;
5405       } else {
5406         level_flags = 3;
5407       }
5408       header |= (level_flags << 6);
5409       if (s.strstart !== 0) { header |= PRESET_DICT; }
5410       header += 31 - (header % 31);
5411
5412       s.status = BUSY_STATE;
5413       putShortMSB(s, header);
5414
5415       /* Save the adler32 of the preset dictionary: */
5416       if (s.strstart !== 0) {
5417         putShortMSB(s, strm.adler >>> 16);
5418         putShortMSB(s, strm.adler & 0xffff);
5419       }
5420       strm.adler = 1; // adler32(0L, Z_NULL, 0);
5421     }
5422   }
5423
5424 //#ifdef GZIP
5425   if (s.status === EXTRA_STATE) {
5426     if (s.gzhead.extra/* != Z_NULL*/) {
5427       beg = s.pending;  /* start of bytes to update crc */
5428
5429       while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
5430         if (s.pending === s.pending_buf_size) {
5431           if (s.gzhead.hcrc && s.pending > beg) {
5432             strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5433           }
5434           flush_pending(strm);
5435           beg = s.pending;
5436           if (s.pending === s.pending_buf_size) {
5437             break;
5438           }
5439         }
5440         put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
5441         s.gzindex++;
5442       }
5443       if (s.gzhead.hcrc && s.pending > beg) {
5444         strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5445       }
5446       if (s.gzindex === s.gzhead.extra.length) {
5447         s.gzindex = 0;
5448         s.status = NAME_STATE;
5449       }
5450     }
5451     else {
5452       s.status = NAME_STATE;
5453     }
5454   }
5455   if (s.status === NAME_STATE) {
5456     if (s.gzhead.name/* != Z_NULL*/) {
5457       beg = s.pending;  /* start of bytes to update crc */
5458       //int val;
5459
5460       do {
5461         if (s.pending === s.pending_buf_size) {
5462           if (s.gzhead.hcrc && s.pending > beg) {
5463             strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5464           }
5465           flush_pending(strm);
5466           beg = s.pending;
5467           if (s.pending === s.pending_buf_size) {
5468             val = 1;
5469             break;
5470           }
5471         }
5472         // JS specific: little magic to add zero terminator to end of string
5473         if (s.gzindex < s.gzhead.name.length) {
5474           val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
5475         } else {
5476           val = 0;
5477         }
5478         put_byte(s, val);
5479       } while (val !== 0);
5480
5481       if (s.gzhead.hcrc && s.pending > beg){
5482         strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5483       }
5484       if (val === 0) {
5485         s.gzindex = 0;
5486         s.status = COMMENT_STATE;
5487       }
5488     }
5489     else {
5490       s.status = COMMENT_STATE;
5491     }
5492   }
5493   if (s.status === COMMENT_STATE) {
5494     if (s.gzhead.comment/* != Z_NULL*/) {
5495       beg = s.pending;  /* start of bytes to update crc */
5496       //int val;
5497
5498       do {
5499         if (s.pending === s.pending_buf_size) {
5500           if (s.gzhead.hcrc && s.pending > beg) {
5501             strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5502           }
5503           flush_pending(strm);
5504           beg = s.pending;
5505           if (s.pending === s.pending_buf_size) {
5506             val = 1;
5507             break;
5508           }
5509         }
5510         // JS specific: little magic to add zero terminator to end of string
5511         if (s.gzindex < s.gzhead.comment.length) {
5512           val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
5513         } else {
5514           val = 0;
5515         }
5516         put_byte(s, val);
5517       } while (val !== 0);
5518
5519       if (s.gzhead.hcrc && s.pending > beg) {
5520         strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
5521       }
5522       if (val === 0) {
5523         s.status = HCRC_STATE;
5524       }
5525     }
5526     else {
5527       s.status = HCRC_STATE;
5528     }
5529   }
5530   if (s.status === HCRC_STATE) {
5531     if (s.gzhead.hcrc) {
5532       if (s.pending + 2 > s.pending_buf_size) {
5533         flush_pending(strm);
5534       }
5535       if (s.pending + 2 <= s.pending_buf_size) {
5536         put_byte(s, strm.adler & 0xff);
5537         put_byte(s, (strm.adler >> 8) & 0xff);
5538         strm.adler = 0; //crc32(0L, Z_NULL, 0);
5539         s.status = BUSY_STATE;
5540       }
5541     }
5542     else {
5543       s.status = BUSY_STATE;
5544     }
5545   }
5546 //#endif
5547
5548   /* Flush as much pending output as possible */
5549   if (s.pending !== 0) {
5550     flush_pending(strm);
5551     if (strm.avail_out === 0) {
5552       /* Since avail_out is 0, deflate will be called again with
5553        * more output space, but possibly with both pending and
5554        * avail_in equal to zero. There won't be anything to do,
5555        * but this is not an error situation so make sure we
5556        * return OK instead of BUF_ERROR at next call of deflate:
5557        */
5558       s.last_flush = -1;
5559       return Z_OK;
5560     }
5561
5562     /* Make sure there is something to do and avoid duplicate consecutive
5563      * flushes. For repeated and useless calls with Z_FINISH, we keep
5564      * returning Z_STREAM_END instead of Z_BUF_ERROR.
5565      */
5566   } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
5567     flush !== Z_FINISH) {
5568     return err(strm, Z_BUF_ERROR);
5569   }
5570
5571   /* User must not provide more input after the first FINISH: */
5572   if (s.status === FINISH_STATE && strm.avail_in !== 0) {
5573     return err(strm, Z_BUF_ERROR);
5574   }
5575
5576   /* Start a new block or continue the current one.
5577    */
5578   if (strm.avail_in !== 0 || s.lookahead !== 0 ||
5579     (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
5580     var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
5581       (s.strategy === Z_RLE ? deflate_rle(s, flush) :
5582         configuration_table[s.level].func(s, flush));
5583
5584     if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
5585       s.status = FINISH_STATE;
5586     }
5587     if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
5588       if (strm.avail_out === 0) {
5589         s.last_flush = -1;
5590         /* avoid BUF_ERROR next call, see above */
5591       }
5592       return Z_OK;
5593       /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
5594        * of deflate should use the same flush parameter to make sure
5595        * that the flush is complete. So we don't have to output an
5596        * empty block here, this will be done at next call. This also
5597        * ensures that for a very small output buffer, we emit at most
5598        * one empty block.
5599        */
5600     }
5601     if (bstate === BS_BLOCK_DONE) {
5602       if (flush === Z_PARTIAL_FLUSH) {
5603         trees._tr_align(s);
5604       }
5605       else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
5606
5607         trees._tr_stored_block(s, 0, 0, false);
5608         /* For a full flush, this empty block will be recognized
5609          * as a special marker by inflate_sync().
5610          */
5611         if (flush === Z_FULL_FLUSH) {
5612           /*** CLEAR_HASH(s); ***/             /* forget history */
5613           zero(s.head); // Fill with NIL (= 0);
5614
5615           if (s.lookahead === 0) {
5616             s.strstart = 0;
5617             s.block_start = 0;
5618             s.insert = 0;
5619           }
5620         }
5621       }
5622       flush_pending(strm);
5623       if (strm.avail_out === 0) {
5624         s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
5625         return Z_OK;
5626       }
5627     }
5628   }
5629   //Assert(strm->avail_out > 0, "bug2");
5630   //if (strm.avail_out <= 0) { throw new Error("bug2");}
5631
5632   if (flush !== Z_FINISH) { return Z_OK; }
5633   if (s.wrap <= 0) { return Z_STREAM_END; }
5634
5635   /* Write the trailer */
5636   if (s.wrap === 2) {
5637     put_byte(s, strm.adler & 0xff);
5638     put_byte(s, (strm.adler >> 8) & 0xff);
5639     put_byte(s, (strm.adler >> 16) & 0xff);
5640     put_byte(s, (strm.adler >> 24) & 0xff);
5641     put_byte(s, strm.total_in & 0xff);
5642     put_byte(s, (strm.total_in >> 8) & 0xff);
5643     put_byte(s, (strm.total_in >> 16) & 0xff);
5644     put_byte(s, (strm.total_in >> 24) & 0xff);
5645   }
5646   else
5647   {
5648     putShortMSB(s, strm.adler >>> 16);
5649     putShortMSB(s, strm.adler & 0xffff);
5650   }
5651
5652   flush_pending(strm);
5653   /* If avail_out is zero, the application will call deflate again
5654    * to flush the rest.
5655    */
5656   if (s.wrap > 0) { s.wrap = -s.wrap; }
5657   /* write the trailer only once! */
5658   return s.pending !== 0 ? Z_OK : Z_STREAM_END;
5659 }
5660
5661 function deflateEnd(strm) {
5662   var status;
5663
5664   if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
5665     return Z_STREAM_ERROR;
5666   }
5667
5668   status = strm.state.status;
5669   if (status !== INIT_STATE &&
5670     status !== EXTRA_STATE &&
5671     status !== NAME_STATE &&
5672     status !== COMMENT_STATE &&
5673     status !== HCRC_STATE &&
5674     status !== BUSY_STATE &&
5675     status !== FINISH_STATE
5676   ) {
5677     return err(strm, Z_STREAM_ERROR);
5678   }
5679
5680   strm.state = null;
5681
5682   return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
5683 }
5684
5685 /* =========================================================================
5686  * Copy the source state to the destination state
5687  */
5688 //function deflateCopy(dest, source) {
5689 //
5690 //}
5691
5692 exports.deflateInit = deflateInit;
5693 exports.deflateInit2 = deflateInit2;
5694 exports.deflateReset = deflateReset;
5695 exports.deflateResetKeep = deflateResetKeep;
5696 exports.deflateSetHeader = deflateSetHeader;
5697 exports.deflate = deflate;
5698 exports.deflateEnd = deflateEnd;
5699 exports.deflateInfo = 'pako deflate (from Nodeca project)';
5700
5701 /* Not implemented
5702 exports.deflateBound = deflateBound;
5703 exports.deflateCopy = deflateCopy;
5704 exports.deflateSetDictionary = deflateSetDictionary;
5705 exports.deflateParams = deflateParams;
5706 exports.deflatePending = deflatePending;
5707 exports.deflatePrime = deflatePrime;
5708 exports.deflateTune = deflateTune;
5709 */
5710 },{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(_dereq_,module,exports){
5711 'use strict';
5712
5713
5714 function GZheader() {
5715   /* true if compressed data believed to be text */
5716   this.text       = 0;
5717   /* modification time */
5718   this.time       = 0;
5719   /* extra flags (not used when writing a gzip file) */
5720   this.xflags     = 0;
5721   /* operating system */
5722   this.os         = 0;
5723   /* pointer to extra field or Z_NULL if none */
5724   this.extra      = null;
5725   /* extra field length (valid if extra != Z_NULL) */
5726   this.extra_len  = 0; // Actually, we don't need it in JS,
5727                        // but leave for few code modifications
5728
5729   //
5730   // Setup limits is not necessary because in js we should not preallocate memory 
5731   // for inflate use constant limit in 65536 bytes
5732   //
5733
5734   /* space at extra (only when reading header) */
5735   // this.extra_max  = 0;
5736   /* pointer to zero-terminated file name or Z_NULL */
5737   this.name       = '';
5738   /* space at name (only when reading header) */
5739   // this.name_max   = 0;
5740   /* pointer to zero-terminated comment or Z_NULL */
5741   this.comment    = '';
5742   /* space at comment (only when reading header) */
5743   // this.comm_max   = 0;
5744   /* true if there was or will be a header crc */
5745   this.hcrc       = 0;
5746   /* true when done reading gzip header (not used when writing a gzip file) */
5747   this.done       = false;
5748 }
5749
5750 module.exports = GZheader;
5751 },{}],34:[function(_dereq_,module,exports){
5752 'use strict';
5753
5754 // See state defs from inflate.js
5755 var BAD = 30;       /* got a data error -- remain here until reset */
5756 var TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
5757
5758 /*
5759    Decode literal, length, and distance codes and write out the resulting
5760    literal and match bytes until either not enough input or output is
5761    available, an end-of-block is encountered, or a data error is encountered.
5762    When large enough input and output buffers are supplied to inflate(), for
5763    example, a 16K input buffer and a 64K output buffer, more than 95% of the
5764    inflate execution time is spent in this routine.
5765
5766    Entry assumptions:
5767
5768         state.mode === LEN
5769         strm.avail_in >= 6
5770         strm.avail_out >= 258
5771         start >= strm.avail_out
5772         state.bits < 8
5773
5774    On return, state.mode is one of:
5775
5776         LEN -- ran out of enough output space or enough available input
5777         TYPE -- reached end of block code, inflate() to interpret next block
5778         BAD -- error in block data
5779
5780    Notes:
5781
5782     - The maximum input bits used by a length/distance pair is 15 bits for the
5783       length code, 5 bits for the length extra, 15 bits for the distance code,
5784       and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
5785       Therefore if strm.avail_in >= 6, then there is enough input to avoid
5786       checking for available input while decoding.
5787
5788     - The maximum bytes that a single length/distance pair can output is 258
5789       bytes, which is the maximum length that can be coded.  inflate_fast()
5790       requires strm.avail_out >= 258 for each loop to avoid checking for
5791       output space.
5792  */
5793 module.exports = function inflate_fast(strm, start) {
5794   var state;
5795   var _in;                    /* local strm.input */
5796   var last;                   /* have enough input while in < last */
5797   var _out;                   /* local strm.output */
5798   var beg;                    /* inflate()'s initial strm.output */
5799   var end;                    /* while out < end, enough space available */
5800 //#ifdef INFLATE_STRICT
5801   var dmax;                   /* maximum distance from zlib header */
5802 //#endif
5803   var wsize;                  /* window size or zero if not using window */
5804   var whave;                  /* valid bytes in the window */
5805   var wnext;                  /* window write index */
5806   var window;                 /* allocated sliding window, if wsize != 0 */
5807   var hold;                   /* local strm.hold */
5808   var bits;                   /* local strm.bits */
5809   var lcode;                  /* local strm.lencode */
5810   var dcode;                  /* local strm.distcode */
5811   var lmask;                  /* mask for first level of length codes */
5812   var dmask;                  /* mask for first level of distance codes */
5813   var here;                   /* retrieved table entry */
5814   var op;                     /* code bits, operation, extra bits, or */
5815                               /*  window position, window bytes to copy */
5816   var len;                    /* match length, unused bytes */
5817   var dist;                   /* match distance */
5818   var from;                   /* where to copy match from */
5819   var from_source;
5820
5821
5822   var input, output; // JS specific, because we have no pointers
5823
5824   /* copy state to local variables */
5825   state = strm.state;
5826   //here = state.here;
5827   _in = strm.next_in;
5828   input = strm.input;
5829   last = _in + (strm.avail_in - 5);
5830   _out = strm.next_out;
5831   output = strm.output;
5832   beg = _out - (start - strm.avail_out);
5833   end = _out + (strm.avail_out - 257);
5834 //#ifdef INFLATE_STRICT
5835   dmax = state.dmax;
5836 //#endif
5837   wsize = state.wsize;
5838   whave = state.whave;
5839   wnext = state.wnext;
5840   window = state.window;
5841   hold = state.hold;
5842   bits = state.bits;
5843   lcode = state.lencode;
5844   dcode = state.distcode;
5845   lmask = (1 << state.lenbits) - 1;
5846   dmask = (1 << state.distbits) - 1;
5847
5848
5849   /* decode literals and length/distances until end-of-block or not enough
5850      input data or output space */
5851
5852   top:
5853   do {
5854     if (bits < 15) {
5855       hold += input[_in++] << bits;
5856       bits += 8;
5857       hold += input[_in++] << bits;
5858       bits += 8;
5859     }
5860
5861     here = lcode[hold & lmask];
5862
5863     dolen:
5864     for (;;) { // Goto emulation
5865       op = here >>> 24/*here.bits*/;
5866       hold >>>= op;
5867       bits -= op;
5868       op = (here >>> 16) & 0xff/*here.op*/;
5869       if (op === 0) {                          /* literal */
5870         //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
5871         //        "inflate:         literal '%c'\n" :
5872         //        "inflate:         literal 0x%02x\n", here.val));
5873         output[_out++] = here & 0xffff/*here.val*/;
5874       }
5875       else if (op & 16) {                     /* length base */
5876         len = here & 0xffff/*here.val*/;
5877         op &= 15;                           /* number of extra bits */
5878         if (op) {
5879           if (bits < op) {
5880             hold += input[_in++] << bits;
5881             bits += 8;
5882           }
5883           len += hold & ((1 << op) - 1);
5884           hold >>>= op;
5885           bits -= op;
5886         }
5887         //Tracevv((stderr, "inflate:         length %u\n", len));
5888         if (bits < 15) {
5889           hold += input[_in++] << bits;
5890           bits += 8;
5891           hold += input[_in++] << bits;
5892           bits += 8;
5893         }
5894         here = dcode[hold & dmask];
5895
5896         dodist:
5897         for (;;) { // goto emulation
5898           op = here >>> 24/*here.bits*/;
5899           hold >>>= op;
5900           bits -= op;
5901           op = (here >>> 16) & 0xff/*here.op*/;
5902
5903           if (op & 16) {                      /* distance base */
5904             dist = here & 0xffff/*here.val*/;
5905             op &= 15;                       /* number of extra bits */
5906             if (bits < op) {
5907               hold += input[_in++] << bits;
5908               bits += 8;
5909               if (bits < op) {
5910                 hold += input[_in++] << bits;
5911                 bits += 8;
5912               }
5913             }
5914             dist += hold & ((1 << op) - 1);
5915 //#ifdef INFLATE_STRICT
5916             if (dist > dmax) {
5917               strm.msg = 'invalid distance too far back';
5918               state.mode = BAD;
5919               break top;
5920             }
5921 //#endif
5922             hold >>>= op;
5923             bits -= op;
5924             //Tracevv((stderr, "inflate:         distance %u\n", dist));
5925             op = _out - beg;                /* max distance in output */
5926             if (dist > op) {                /* see if copy from window */
5927               op = dist - op;               /* distance back in window */
5928               if (op > whave) {
5929                 if (state.sane) {
5930                   strm.msg = 'invalid distance too far back';
5931                   state.mode = BAD;
5932                   break top;
5933                 }
5934
5935 // (!) This block is disabled in zlib defailts,
5936 // don't enable it for binary compatibility
5937 //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
5938 //                if (len <= op - whave) {
5939 //                  do {
5940 //                    output[_out++] = 0;
5941 //                  } while (--len);
5942 //                  continue top;
5943 //                }
5944 //                len -= op - whave;
5945 //                do {
5946 //                  output[_out++] = 0;
5947 //                } while (--op > whave);
5948 //                if (op === 0) {
5949 //                  from = _out - dist;
5950 //                  do {
5951 //                    output[_out++] = output[from++];
5952 //                  } while (--len);
5953 //                  continue top;
5954 //                }
5955 //#endif
5956               }
5957               from = 0; // window index
5958               from_source = window;
5959               if (wnext === 0) {           /* very common case */
5960                 from += wsize - op;
5961                 if (op < len) {         /* some from window */
5962                   len -= op;
5963                   do {
5964                     output[_out++] = window[from++];
5965                   } while (--op);
5966                   from = _out - dist;  /* rest from output */
5967                   from_source = output;
5968                 }
5969               }
5970               else if (wnext < op) {      /* wrap around window */
5971                 from += wsize + wnext - op;
5972                 op -= wnext;
5973                 if (op < len) {         /* some from end of window */
5974                   len -= op;
5975                   do {
5976                     output[_out++] = window[from++];
5977                   } while (--op);
5978                   from = 0;
5979                   if (wnext < len) {  /* some from start of window */
5980                     op = wnext;
5981                     len -= op;
5982                     do {
5983                       output[_out++] = window[from++];
5984                     } while (--op);
5985                     from = _out - dist;      /* rest from output */
5986                     from_source = output;
5987                   }
5988                 }
5989               }
5990               else {                      /* contiguous in window */
5991                 from += wnext - op;
5992                 if (op < len) {         /* some from window */
5993                   len -= op;
5994                   do {
5995                     output[_out++] = window[from++];
5996                   } while (--op);
5997                   from = _out - dist;  /* rest from output */
5998                   from_source = output;
5999                 }
6000               }
6001               while (len > 2) {
6002                 output[_out++] = from_source[from++];
6003                 output[_out++] = from_source[from++];
6004                 output[_out++] = from_source[from++];
6005                 len -= 3;
6006               }
6007               if (len) {
6008                 output[_out++] = from_source[from++];
6009                 if (len > 1) {
6010                   output[_out++] = from_source[from++];
6011                 }
6012               }
6013             }
6014             else {
6015               from = _out - dist;          /* copy direct from output */
6016               do {                        /* minimum length is three */
6017                 output[_out++] = output[from++];
6018                 output[_out++] = output[from++];
6019                 output[_out++] = output[from++];
6020                 len -= 3;
6021               } while (len > 2);
6022               if (len) {
6023                 output[_out++] = output[from++];
6024                 if (len > 1) {
6025                   output[_out++] = output[from++];
6026                 }
6027               }
6028             }
6029           }
6030           else if ((op & 64) === 0) {          /* 2nd level distance code */
6031             here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
6032             continue dodist;
6033           }
6034           else {
6035             strm.msg = 'invalid distance code';
6036             state.mode = BAD;
6037             break top;
6038           }
6039
6040           break; // need to emulate goto via "continue"
6041         }
6042       }
6043       else if ((op & 64) === 0) {              /* 2nd level length code */
6044         here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
6045         continue dolen;
6046       }
6047       else if (op & 32) {                     /* end-of-block */
6048         //Tracevv((stderr, "inflate:         end of block\n"));
6049         state.mode = TYPE;
6050         break top;
6051       }
6052       else {
6053         strm.msg = 'invalid literal/length code';
6054         state.mode = BAD;
6055         break top;
6056       }
6057
6058       break; // need to emulate goto via "continue"
6059     }
6060   } while (_in < last && _out < end);
6061
6062   /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
6063   len = bits >> 3;
6064   _in -= len;
6065   bits -= len << 3;
6066   hold &= (1 << bits) - 1;
6067
6068   /* update state and return */
6069   strm.next_in = _in;
6070   strm.next_out = _out;
6071   strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
6072   strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
6073   state.hold = hold;
6074   state.bits = bits;
6075   return;
6076 };
6077
6078 },{}],35:[function(_dereq_,module,exports){
6079 'use strict';
6080
6081
6082 var utils = _dereq_('../utils/common');
6083 var adler32 = _dereq_('./adler32');
6084 var crc32   = _dereq_('./crc32');
6085 var inflate_fast = _dereq_('./inffast');
6086 var inflate_table = _dereq_('./inftrees');
6087
6088 var CODES = 0;
6089 var LENS = 1;
6090 var DISTS = 2;
6091
6092 /* Public constants ==========================================================*/
6093 /* ===========================================================================*/
6094
6095
6096 /* Allowed flush values; see deflate() and inflate() below for details */
6097 //var Z_NO_FLUSH      = 0;
6098 //var Z_PARTIAL_FLUSH = 1;
6099 //var Z_SYNC_FLUSH    = 2;
6100 //var Z_FULL_FLUSH    = 3;
6101 var Z_FINISH        = 4;
6102 var Z_BLOCK         = 5;
6103 var Z_TREES         = 6;
6104
6105
6106 /* Return codes for the compression/decompression functions. Negative values
6107  * are errors, positive values are used for special but normal events.
6108  */
6109 var Z_OK            = 0;
6110 var Z_STREAM_END    = 1;
6111 var Z_NEED_DICT     = 2;
6112 //var Z_ERRNO         = -1;
6113 var Z_STREAM_ERROR  = -2;
6114 var Z_DATA_ERROR    = -3;
6115 var Z_MEM_ERROR     = -4;
6116 var Z_BUF_ERROR     = -5;
6117 //var Z_VERSION_ERROR = -6;
6118
6119 /* The deflate compression method */
6120 var Z_DEFLATED  = 8;
6121
6122
6123 /* STATES ====================================================================*/
6124 /* ===========================================================================*/
6125
6126
6127 var    HEAD = 1;       /* i: waiting for magic header */
6128 var    FLAGS = 2;      /* i: waiting for method and flags (gzip) */
6129 var    TIME = 3;       /* i: waiting for modification time (gzip) */
6130 var    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */
6131 var    EXLEN = 5;      /* i: waiting for extra length (gzip) */
6132 var    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */
6133 var    NAME = 7;       /* i: waiting for end of file name (gzip) */
6134 var    COMMENT = 8;    /* i: waiting for end of comment (gzip) */
6135 var    HCRC = 9;       /* i: waiting for header crc (gzip) */
6136 var    DICTID = 10;    /* i: waiting for dictionary check value */
6137 var    DICT = 11;      /* waiting for inflateSetDictionary() call */
6138 var        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
6139 var        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */
6140 var        STORED = 14;    /* i: waiting for stored size (length and complement) */
6141 var        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */
6142 var        COPY = 16;      /* i/o: waiting for input or output to copy stored block */
6143 var        TABLE = 17;     /* i: waiting for dynamic block table lengths */
6144 var        LENLENS = 18;   /* i: waiting for code length code lengths */
6145 var        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */
6146 var            LEN_ = 20;      /* i: same as LEN below, but only first time in */
6147 var            LEN = 21;       /* i: waiting for length/lit/eob code */
6148 var            LENEXT = 22;    /* i: waiting for length extra bits */
6149 var            DIST = 23;      /* i: waiting for distance code */
6150 var            DISTEXT = 24;   /* i: waiting for distance extra bits */
6151 var            MATCH = 25;     /* o: waiting for output space to copy string */
6152 var            LIT = 26;       /* o: waiting for output space to write literal */
6153 var    CHECK = 27;     /* i: waiting for 32-bit check value */
6154 var    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */
6155 var    DONE = 29;      /* finished check, done -- remain here until reset */
6156 var    BAD = 30;       /* got a data error -- remain here until reset */
6157 var    MEM = 31;       /* got an inflate() memory error -- remain here until reset */
6158 var    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */
6159
6160 /* ===========================================================================*/
6161
6162
6163
6164 var ENOUGH_LENS = 852;
6165 var ENOUGH_DISTS = 592;
6166 //var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);
6167
6168 var MAX_WBITS = 15;
6169 /* 32K LZ77 window */
6170 var DEF_WBITS = MAX_WBITS;
6171
6172
6173 function ZSWAP32(q) {
6174   return  (((q >>> 24) & 0xff) +
6175           ((q >>> 8) & 0xff00) +
6176           ((q & 0xff00) << 8) +
6177           ((q & 0xff) << 24));
6178 }
6179
6180
6181 function InflateState() {
6182   this.mode = 0;             /* current inflate mode */
6183   this.last = false;          /* true if processing last block */
6184   this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
6185   this.havedict = false;      /* true if dictionary provided */
6186   this.flags = 0;             /* gzip header method and flags (0 if zlib) */
6187   this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */
6188   this.check = 0;             /* protected copy of check value */
6189   this.total = 0;             /* protected copy of output count */
6190   // TODO: may be {}
6191   this.head = null;           /* where to save gzip header information */
6192
6193   /* sliding window */
6194   this.wbits = 0;             /* log base 2 of requested window size */
6195   this.wsize = 0;             /* window size or zero if not using window */
6196   this.whave = 0;             /* valid bytes in the window */
6197   this.wnext = 0;             /* window write index */
6198   this.window = null;         /* allocated sliding window, if needed */
6199
6200   /* bit accumulator */
6201   this.hold = 0;              /* input bit accumulator */
6202   this.bits = 0;              /* number of bits in "in" */
6203
6204   /* for string and stored block copying */
6205   this.length = 0;            /* literal or length of data to copy */
6206   this.offset = 0;            /* distance back to copy string from */
6207
6208   /* for table and code decoding */
6209   this.extra = 0;             /* extra bits needed */
6210
6211   /* fixed and dynamic code tables */
6212   this.lencode = null;          /* starting table for length/literal codes */
6213   this.distcode = null;         /* starting table for distance codes */
6214   this.lenbits = 0;           /* index bits for lencode */
6215   this.distbits = 0;          /* index bits for distcode */
6216
6217   /* dynamic table building */
6218   this.ncode = 0;             /* number of code length code lengths */
6219   this.nlen = 0;              /* number of length code lengths */
6220   this.ndist = 0;             /* number of distance code lengths */
6221   this.have = 0;              /* number of code lengths in lens[] */
6222   this.next = null;              /* next available space in codes[] */
6223
6224   this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
6225   this.work = new utils.Buf16(288); /* work area for code table building */
6226
6227   /*
6228    because we don't have pointers in js, we use lencode and distcode directly
6229    as buffers so we don't need codes
6230   */
6231   //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */
6232   this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */
6233   this.distdyn = null;             /* dynamic table for distance codes (JS specific) */
6234   this.sane = 0;                   /* if false, allow invalid distance too far */
6235   this.back = 0;                   /* bits back of last unprocessed length/lit */
6236   this.was = 0;                    /* initial length of match */
6237 }
6238
6239 function inflateResetKeep(strm) {
6240   var state;
6241
6242   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
6243   state = strm.state;
6244   strm.total_in = strm.total_out = state.total = 0;
6245   strm.msg = ''; /*Z_NULL*/
6246   if (state.wrap) {       /* to support ill-conceived Java test suite */
6247     strm.adler = state.wrap & 1;
6248   }
6249   state.mode = HEAD;
6250   state.last = 0;
6251   state.havedict = 0;
6252   state.dmax = 32768;
6253   state.head = null/*Z_NULL*/;
6254   state.hold = 0;
6255   state.bits = 0;
6256   //state.lencode = state.distcode = state.next = state.codes;
6257   state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
6258   state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
6259
6260   state.sane = 1;
6261   state.back = -1;
6262   //Tracev((stderr, "inflate: reset\n"));
6263   return Z_OK;
6264 }
6265
6266 function inflateReset(strm) {
6267   var state;
6268
6269   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
6270   state = strm.state;
6271   state.wsize = 0;
6272   state.whave = 0;
6273   state.wnext = 0;
6274   return inflateResetKeep(strm);
6275
6276 }
6277
6278 function inflateReset2(strm, windowBits) {
6279   var wrap;
6280   var state;
6281
6282   /* get the state */
6283   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
6284   state = strm.state;
6285
6286   /* extract wrap request from windowBits parameter */
6287   if (windowBits < 0) {
6288     wrap = 0;
6289     windowBits = -windowBits;
6290   }
6291   else {
6292     wrap = (windowBits >> 4) + 1;
6293     if (windowBits < 48) {
6294       windowBits &= 15;
6295     }
6296   }
6297
6298   /* set number of window bits, free window if different */
6299   if (windowBits && (windowBits < 8 || windowBits > 15)) {
6300     return Z_STREAM_ERROR;
6301   }
6302   if (state.window !== null && state.wbits !== windowBits) {
6303     state.window = null;
6304   }
6305
6306   /* update state and reset the rest of it */
6307   state.wrap = wrap;
6308   state.wbits = windowBits;
6309   return inflateReset(strm);
6310 }
6311
6312 function inflateInit2(strm, windowBits) {
6313   var ret;
6314   var state;
6315
6316   if (!strm) { return Z_STREAM_ERROR; }
6317   //strm.msg = Z_NULL;                 /* in case we return an error */
6318
6319   state = new InflateState();
6320
6321   //if (state === Z_NULL) return Z_MEM_ERROR;
6322   //Tracev((stderr, "inflate: allocated\n"));
6323   strm.state = state;
6324   state.window = null/*Z_NULL*/;
6325   ret = inflateReset2(strm, windowBits);
6326   if (ret !== Z_OK) {
6327     strm.state = null/*Z_NULL*/;
6328   }
6329   return ret;
6330 }
6331
6332 function inflateInit(strm) {
6333   return inflateInit2(strm, DEF_WBITS);
6334 }
6335
6336
6337 /*
6338  Return state with length and distance decoding tables and index sizes set to
6339  fixed code decoding.  Normally this returns fixed tables from inffixed.h.
6340  If BUILDFIXED is defined, then instead this routine builds the tables the
6341  first time it's called, and returns those tables the first time and
6342  thereafter.  This reduces the size of the code by about 2K bytes, in
6343  exchange for a little execution time.  However, BUILDFIXED should not be
6344  used for threaded applications, since the rewriting of the tables and virgin
6345  may not be thread-safe.
6346  */
6347 var virgin = true;
6348
6349 var lenfix, distfix; // We have no pointers in JS, so keep tables separate
6350
6351 function fixedtables(state) {
6352   /* build fixed huffman tables if first call (may not be thread safe) */
6353   if (virgin) {
6354     var sym;
6355
6356     lenfix = new utils.Buf32(512);
6357     distfix = new utils.Buf32(32);
6358
6359     /* literal/length table */
6360     sym = 0;
6361     while (sym < 144) { state.lens[sym++] = 8; }
6362     while (sym < 256) { state.lens[sym++] = 9; }
6363     while (sym < 280) { state.lens[sym++] = 7; }
6364     while (sym < 288) { state.lens[sym++] = 8; }
6365
6366     inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, {bits: 9});
6367
6368     /* distance table */
6369     sym = 0;
6370     while (sym < 32) { state.lens[sym++] = 5; }
6371
6372     inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, {bits: 5});
6373
6374     /* do this just once */
6375     virgin = false;
6376   }
6377
6378   state.lencode = lenfix;
6379   state.lenbits = 9;
6380   state.distcode = distfix;
6381   state.distbits = 5;
6382 }
6383
6384
6385 /*
6386  Update the window with the last wsize (normally 32K) bytes written before
6387  returning.  If window does not exist yet, create it.  This is only called
6388  when a window is already in use, or when output has been written during this
6389  inflate call, but the end of the deflate stream has not been reached yet.
6390  It is also called to create a window for dictionary data when a dictionary
6391  is loaded.
6392
6393  Providing output buffers larger than 32K to inflate() should provide a speed
6394  advantage, since only the last 32K of output is copied to the sliding window
6395  upon return from inflate(), and since all distances after the first 32K of
6396  output will fall in the output data, making match copies simpler and faster.
6397  The advantage may be dependent on the size of the processor's data caches.
6398  */
6399 function updatewindow(strm, src, end, copy) {
6400   var dist;
6401   var state = strm.state;
6402
6403   /* if it hasn't been done already, allocate space for the window */
6404   if (state.window === null) {
6405     state.wsize = 1 << state.wbits;
6406     state.wnext = 0;
6407     state.whave = 0;
6408
6409     state.window = new utils.Buf8(state.wsize);
6410   }
6411
6412   /* copy state->wsize or less output bytes into the circular window */
6413   if (copy >= state.wsize) {
6414     utils.arraySet(state.window,src, end - state.wsize, state.wsize, 0);
6415     state.wnext = 0;
6416     state.whave = state.wsize;
6417   }
6418   else {
6419     dist = state.wsize - state.wnext;
6420     if (dist > copy) {
6421       dist = copy;
6422     }
6423     //zmemcpy(state->window + state->wnext, end - copy, dist);
6424     utils.arraySet(state.window,src, end - copy, dist, state.wnext);
6425     copy -= dist;
6426     if (copy) {
6427       //zmemcpy(state->window, end - copy, copy);
6428       utils.arraySet(state.window,src, end - copy, copy, 0);
6429       state.wnext = copy;
6430       state.whave = state.wsize;
6431     }
6432     else {
6433       state.wnext += dist;
6434       if (state.wnext === state.wsize) { state.wnext = 0; }
6435       if (state.whave < state.wsize) { state.whave += dist; }
6436     }
6437   }
6438   return 0;
6439 }
6440
6441 function inflate(strm, flush) {
6442   var state;
6443   var input, output;          // input/output buffers
6444   var next;                   /* next input INDEX */
6445   var put;                    /* next output INDEX */
6446   var have, left;             /* available input and output */
6447   var hold;                   /* bit buffer */
6448   var bits;                   /* bits in bit buffer */
6449   var _in, _out;              /* save starting available input and output */
6450   var copy;                   /* number of stored or match bytes to copy */
6451   var from;                   /* where to copy match bytes from */
6452   var from_source;
6453   var here = 0;               /* current decoding table entry */
6454   var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
6455   //var last;                   /* parent table entry */
6456   var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
6457   var len;                    /* length to copy for repeats, bits to drop */
6458   var ret;                    /* return code */
6459   var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */
6460   var opts;
6461
6462   var n; // temporary var for NEED_BITS
6463
6464   var order = /* permutation of code lengths */
6465     [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
6466
6467
6468   if (!strm || !strm.state || !strm.output ||
6469       (!strm.input && strm.avail_in !== 0)) {
6470     return Z_STREAM_ERROR;
6471   }
6472
6473   state = strm.state;
6474   if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */
6475
6476
6477   //--- LOAD() ---
6478   put = strm.next_out;
6479   output = strm.output;
6480   left = strm.avail_out;
6481   next = strm.next_in;
6482   input = strm.input;
6483   have = strm.avail_in;
6484   hold = state.hold;
6485   bits = state.bits;
6486   //---
6487
6488   _in = have;
6489   _out = left;
6490   ret = Z_OK;
6491
6492   inf_leave: // goto emulation
6493   for (;;) {
6494     switch (state.mode) {
6495     case HEAD:
6496       if (state.wrap === 0) {
6497         state.mode = TYPEDO;
6498         break;
6499       }
6500       //=== NEEDBITS(16);
6501       while (bits < 16) {
6502         if (have === 0) { break inf_leave; }
6503         have--;
6504         hold += input[next++] << bits;
6505         bits += 8;
6506       }
6507       //===//
6508       if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */
6509         state.check = 0/*crc32(0L, Z_NULL, 0)*/;
6510         //=== CRC2(state.check, hold);
6511         hbuf[0] = hold & 0xff;
6512         hbuf[1] = (hold >>> 8) & 0xff;
6513         state.check = crc32(state.check, hbuf, 2, 0);
6514         //===//
6515
6516         //=== INITBITS();
6517         hold = 0;
6518         bits = 0;
6519         //===//
6520         state.mode = FLAGS;
6521         break;
6522       }
6523       state.flags = 0;           /* expect zlib header */
6524       if (state.head) {
6525         state.head.done = false;
6526       }
6527       if (!(state.wrap & 1) ||   /* check if zlib header allowed */
6528         (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
6529         strm.msg = 'incorrect header check';
6530         state.mode = BAD;
6531         break;
6532       }
6533       if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
6534         strm.msg = 'unknown compression method';
6535         state.mode = BAD;
6536         break;
6537       }
6538       //--- DROPBITS(4) ---//
6539       hold >>>= 4;
6540       bits -= 4;
6541       //---//
6542       len = (hold & 0x0f)/*BITS(4)*/ + 8;
6543       if (state.wbits === 0) {
6544         state.wbits = len;
6545       }
6546       else if (len > state.wbits) {
6547         strm.msg = 'invalid window size';
6548         state.mode = BAD;
6549         break;
6550       }
6551       state.dmax = 1 << len;
6552       //Tracev((stderr, "inflate:   zlib header ok\n"));
6553       strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
6554       state.mode = hold & 0x200 ? DICTID : TYPE;
6555       //=== INITBITS();
6556       hold = 0;
6557       bits = 0;
6558       //===//
6559       break;
6560     case FLAGS:
6561       //=== NEEDBITS(16); */
6562       while (bits < 16) {
6563         if (have === 0) { break inf_leave; }
6564         have--;
6565         hold += input[next++] << bits;
6566         bits += 8;
6567       }
6568       //===//
6569       state.flags = hold;
6570       if ((state.flags & 0xff) !== Z_DEFLATED) {
6571         strm.msg = 'unknown compression method';
6572         state.mode = BAD;
6573         break;
6574       }
6575       if (state.flags & 0xe000) {
6576         strm.msg = 'unknown header flags set';
6577         state.mode = BAD;
6578         break;
6579       }
6580       if (state.head) {
6581         state.head.text = ((hold >> 8) & 1);
6582       }
6583       if (state.flags & 0x0200) {
6584         //=== CRC2(state.check, hold);
6585         hbuf[0] = hold & 0xff;
6586         hbuf[1] = (hold >>> 8) & 0xff;
6587         state.check = crc32(state.check, hbuf, 2, 0);
6588         //===//
6589       }
6590       //=== INITBITS();
6591       hold = 0;
6592       bits = 0;
6593       //===//
6594       state.mode = TIME;
6595       /* falls through */
6596     case TIME:
6597       //=== NEEDBITS(32); */
6598       while (bits < 32) {
6599         if (have === 0) { break inf_leave; }
6600         have--;
6601         hold += input[next++] << bits;
6602         bits += 8;
6603       }
6604       //===//
6605       if (state.head) {
6606         state.head.time = hold;
6607       }
6608       if (state.flags & 0x0200) {
6609         //=== CRC4(state.check, hold)
6610         hbuf[0] = hold & 0xff;
6611         hbuf[1] = (hold >>> 8) & 0xff;
6612         hbuf[2] = (hold >>> 16) & 0xff;
6613         hbuf[3] = (hold >>> 24) & 0xff;
6614         state.check = crc32(state.check, hbuf, 4, 0);
6615         //===
6616       }
6617       //=== INITBITS();
6618       hold = 0;
6619       bits = 0;
6620       //===//
6621       state.mode = OS;
6622       /* falls through */
6623     case OS:
6624       //=== NEEDBITS(16); */
6625       while (bits < 16) {
6626         if (have === 0) { break inf_leave; }
6627         have--;
6628         hold += input[next++] << bits;
6629         bits += 8;
6630       }
6631       //===//
6632       if (state.head) {
6633         state.head.xflags = (hold & 0xff);
6634         state.head.os = (hold >> 8);
6635       }
6636       if (state.flags & 0x0200) {
6637         //=== CRC2(state.check, hold);
6638         hbuf[0] = hold & 0xff;
6639         hbuf[1] = (hold >>> 8) & 0xff;
6640         state.check = crc32(state.check, hbuf, 2, 0);
6641         //===//
6642       }
6643       //=== INITBITS();
6644       hold = 0;
6645       bits = 0;
6646       //===//
6647       state.mode = EXLEN;
6648       /* falls through */
6649     case EXLEN:
6650       if (state.flags & 0x0400) {
6651         //=== NEEDBITS(16); */
6652         while (bits < 16) {
6653           if (have === 0) { break inf_leave; }
6654           have--;
6655           hold += input[next++] << bits;
6656           bits += 8;
6657         }
6658         //===//
6659         state.length = hold;
6660         if (state.head) {
6661           state.head.extra_len = hold;
6662         }
6663         if (state.flags & 0x0200) {
6664           //=== CRC2(state.check, hold);
6665           hbuf[0] = hold & 0xff;
6666           hbuf[1] = (hold >>> 8) & 0xff;
6667           state.check = crc32(state.check, hbuf, 2, 0);
6668           //===//
6669         }
6670         //=== INITBITS();
6671         hold = 0;
6672         bits = 0;
6673         //===//
6674       }
6675       else if (state.head) {
6676         state.head.extra = null/*Z_NULL*/;
6677       }
6678       state.mode = EXTRA;
6679       /* falls through */
6680     case EXTRA:
6681       if (state.flags & 0x0400) {
6682         copy = state.length;
6683         if (copy > have) { copy = have; }
6684         if (copy) {
6685           if (state.head) {
6686             len = state.head.extra_len - state.length;
6687             if (!state.head.extra) {
6688               // Use untyped array for more conveniend processing later
6689               state.head.extra = new Array(state.head.extra_len);
6690             }
6691             utils.arraySet(
6692               state.head.extra,
6693               input,
6694               next,
6695               // extra field is limited to 65536 bytes
6696               // - no need for additional size check
6697               copy,
6698               /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
6699               len
6700             );
6701             //zmemcpy(state.head.extra + len, next,
6702             //        len + copy > state.head.extra_max ?
6703             //        state.head.extra_max - len : copy);
6704           }
6705           if (state.flags & 0x0200) {
6706             state.check = crc32(state.check, input, copy, next);
6707           }
6708           have -= copy;
6709           next += copy;
6710           state.length -= copy;
6711         }
6712         if (state.length) { break inf_leave; }
6713       }
6714       state.length = 0;
6715       state.mode = NAME;
6716       /* falls through */
6717     case NAME:
6718       if (state.flags & 0x0800) {
6719         if (have === 0) { break inf_leave; }
6720         copy = 0;
6721         do {
6722           // TODO: 2 or 1 bytes?
6723           len = input[next + copy++];
6724           /* use constant limit because in js we should not preallocate memory */
6725           if (state.head && len &&
6726               (state.length < 65536 /*state.head.name_max*/)) {
6727             state.head.name += String.fromCharCode(len);
6728           }
6729         } while (len && copy < have);
6730
6731         if (state.flags & 0x0200) {
6732           state.check = crc32(state.check, input, copy, next);
6733         }
6734         have -= copy;
6735         next += copy;
6736         if (len) { break inf_leave; }
6737       }
6738       else if (state.head) {
6739         state.head.name = null;
6740       }
6741       state.length = 0;
6742       state.mode = COMMENT;
6743       /* falls through */
6744     case COMMENT:
6745       if (state.flags & 0x1000) {
6746         if (have === 0) { break inf_leave; }
6747         copy = 0;
6748         do {
6749           len = input[next + copy++];
6750           /* use constant limit because in js we should not preallocate memory */
6751           if (state.head && len &&
6752               (state.length < 65536 /*state.head.comm_max*/)) {
6753             state.head.comment += String.fromCharCode(len);
6754           }
6755         } while (len && copy < have);
6756         if (state.flags & 0x0200) {
6757           state.check = crc32(state.check, input, copy, next);
6758         }
6759         have -= copy;
6760         next += copy;
6761         if (len) { break inf_leave; }
6762       }
6763       else if (state.head) {
6764         state.head.comment = null;
6765       }
6766       state.mode = HCRC;
6767       /* falls through */
6768     case HCRC:
6769       if (state.flags & 0x0200) {
6770         //=== NEEDBITS(16); */
6771         while (bits < 16) {
6772           if (have === 0) { break inf_leave; }
6773           have--;
6774           hold += input[next++] << bits;
6775           bits += 8;
6776         }
6777         //===//
6778         if (hold !== (state.check & 0xffff)) {
6779           strm.msg = 'header crc mismatch';
6780           state.mode = BAD;
6781           break;
6782         }
6783         //=== INITBITS();
6784         hold = 0;
6785         bits = 0;
6786         //===//
6787       }
6788       if (state.head) {
6789         state.head.hcrc = ((state.flags >> 9) & 1);
6790         state.head.done = true;
6791       }
6792       strm.adler = state.check = 0 /*crc32(0L, Z_NULL, 0)*/;
6793       state.mode = TYPE;
6794       break;
6795     case DICTID:
6796       //=== NEEDBITS(32); */
6797       while (bits < 32) {
6798         if (have === 0) { break inf_leave; }
6799         have--;
6800         hold += input[next++] << bits;
6801         bits += 8;
6802       }
6803       //===//
6804       strm.adler = state.check = ZSWAP32(hold);
6805       //=== INITBITS();
6806       hold = 0;
6807       bits = 0;
6808       //===//
6809       state.mode = DICT;
6810       /* falls through */
6811     case DICT:
6812       if (state.havedict === 0) {
6813         //--- RESTORE() ---
6814         strm.next_out = put;
6815         strm.avail_out = left;
6816         strm.next_in = next;
6817         strm.avail_in = have;
6818         state.hold = hold;
6819         state.bits = bits;
6820         //---
6821         return Z_NEED_DICT;
6822       }
6823       strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
6824       state.mode = TYPE;
6825       /* falls through */
6826     case TYPE:
6827       if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
6828       /* falls through */
6829     case TYPEDO:
6830       if (state.last) {
6831         //--- BYTEBITS() ---//
6832         hold >>>= bits & 7;
6833         bits -= bits & 7;
6834         //---//
6835         state.mode = CHECK;
6836         break;
6837       }
6838       //=== NEEDBITS(3); */
6839       while (bits < 3) {
6840         if (have === 0) { break inf_leave; }
6841         have--;
6842         hold += input[next++] << bits;
6843         bits += 8;
6844       }
6845       //===//
6846       state.last = (hold & 0x01)/*BITS(1)*/;
6847       //--- DROPBITS(1) ---//
6848       hold >>>= 1;
6849       bits -= 1;
6850       //---//
6851
6852       switch ((hold & 0x03)/*BITS(2)*/) {
6853       case 0:                             /* stored block */
6854         //Tracev((stderr, "inflate:     stored block%s\n",
6855         //        state.last ? " (last)" : ""));
6856         state.mode = STORED;
6857         break;
6858       case 1:                             /* fixed block */
6859         fixedtables(state);
6860         //Tracev((stderr, "inflate:     fixed codes block%s\n",
6861         //        state.last ? " (last)" : ""));
6862         state.mode = LEN_;             /* decode codes */
6863         if (flush === Z_TREES) {
6864           //--- DROPBITS(2) ---//
6865           hold >>>= 2;
6866           bits -= 2;
6867           //---//
6868           break inf_leave;
6869         }
6870         break;
6871       case 2:                             /* dynamic block */
6872         //Tracev((stderr, "inflate:     dynamic codes block%s\n",
6873         //        state.last ? " (last)" : ""));
6874         state.mode = TABLE;
6875         break;
6876       case 3:
6877         strm.msg = 'invalid block type';
6878         state.mode = BAD;
6879       }
6880       //--- DROPBITS(2) ---//
6881       hold >>>= 2;
6882       bits -= 2;
6883       //---//
6884       break;
6885     case STORED:
6886       //--- BYTEBITS() ---// /* go to byte boundary */
6887       hold >>>= bits & 7;
6888       bits -= bits & 7;
6889       //---//
6890       //=== NEEDBITS(32); */
6891       while (bits < 32) {
6892         if (have === 0) { break inf_leave; }
6893         have--;
6894         hold += input[next++] << bits;
6895         bits += 8;
6896       }
6897       //===//
6898       if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
6899         strm.msg = 'invalid stored block lengths';
6900         state.mode = BAD;
6901         break;
6902       }
6903       state.length = hold & 0xffff;
6904       //Tracev((stderr, "inflate:       stored length %u\n",
6905       //        state.length));
6906       //=== INITBITS();
6907       hold = 0;
6908       bits = 0;
6909       //===//
6910       state.mode = COPY_;
6911       if (flush === Z_TREES) { break inf_leave; }
6912       /* falls through */
6913     case COPY_:
6914       state.mode = COPY;
6915       /* falls through */
6916     case COPY:
6917       copy = state.length;
6918       if (copy) {
6919         if (copy > have) { copy = have; }
6920         if (copy > left) { copy = left; }
6921         if (copy === 0) { break inf_leave; }
6922         //--- zmemcpy(put, next, copy); ---
6923         utils.arraySet(output, input, next, copy, put);
6924         //---//
6925         have -= copy;
6926         next += copy;
6927         left -= copy;
6928         put += copy;
6929         state.length -= copy;
6930         break;
6931       }
6932       //Tracev((stderr, "inflate:       stored end\n"));
6933       state.mode = TYPE;
6934       break;
6935     case TABLE:
6936       //=== NEEDBITS(14); */
6937       while (bits < 14) {
6938         if (have === 0) { break inf_leave; }
6939         have--;
6940         hold += input[next++] << bits;
6941         bits += 8;
6942       }
6943       //===//
6944       state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
6945       //--- DROPBITS(5) ---//
6946       hold >>>= 5;
6947       bits -= 5;
6948       //---//
6949       state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
6950       //--- DROPBITS(5) ---//
6951       hold >>>= 5;
6952       bits -= 5;
6953       //---//
6954       state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
6955       //--- DROPBITS(4) ---//
6956       hold >>>= 4;
6957       bits -= 4;
6958       //---//
6959 //#ifndef PKZIP_BUG_WORKAROUND
6960       if (state.nlen > 286 || state.ndist > 30) {
6961         strm.msg = 'too many length or distance symbols';
6962         state.mode = BAD;
6963         break;
6964       }
6965 //#endif
6966       //Tracev((stderr, "inflate:       table sizes ok\n"));
6967       state.have = 0;
6968       state.mode = LENLENS;
6969       /* falls through */
6970     case LENLENS:
6971       while (state.have < state.ncode) {
6972         //=== NEEDBITS(3);
6973         while (bits < 3) {
6974           if (have === 0) { break inf_leave; }
6975           have--;
6976           hold += input[next++] << bits;
6977           bits += 8;
6978         }
6979         //===//
6980         state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
6981         //--- DROPBITS(3) ---//
6982         hold >>>= 3;
6983         bits -= 3;
6984         //---//
6985       }
6986       while (state.have < 19) {
6987         state.lens[order[state.have++]] = 0;
6988       }
6989       // We have separate tables & no pointers. 2 commented lines below not needed.
6990       //state.next = state.codes;
6991       //state.lencode = state.next;
6992       // Switch to use dynamic table
6993       state.lencode = state.lendyn;
6994       state.lenbits = 7;
6995
6996       opts = {bits: state.lenbits};
6997       ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
6998       state.lenbits = opts.bits;
6999
7000       if (ret) {
7001         strm.msg = 'invalid code lengths set';
7002         state.mode = BAD;
7003         break;
7004       }
7005       //Tracev((stderr, "inflate:       code lengths ok\n"));
7006       state.have = 0;
7007       state.mode = CODELENS;
7008       /* falls through */
7009     case CODELENS:
7010       while (state.have < state.nlen + state.ndist) {
7011         for (;;) {
7012           here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
7013           here_bits = here >>> 24;
7014           here_op = (here >>> 16) & 0xff;
7015           here_val = here & 0xffff;
7016
7017           if ((here_bits) <= bits) { break; }
7018           //--- PULLBYTE() ---//
7019           if (have === 0) { break inf_leave; }
7020           have--;
7021           hold += input[next++] << bits;
7022           bits += 8;
7023           //---//
7024         }
7025         if (here_val < 16) {
7026           //--- DROPBITS(here.bits) ---//
7027           hold >>>= here_bits;
7028           bits -= here_bits;
7029           //---//
7030           state.lens[state.have++] = here_val;
7031         }
7032         else {
7033           if (here_val === 16) {
7034             //=== NEEDBITS(here.bits + 2);
7035             n = here_bits + 2;
7036             while (bits < n) {
7037               if (have === 0) { break inf_leave; }
7038               have--;
7039               hold += input[next++] << bits;
7040               bits += 8;
7041             }
7042             //===//
7043             //--- DROPBITS(here.bits) ---//
7044             hold >>>= here_bits;
7045             bits -= here_bits;
7046             //---//
7047             if (state.have === 0) {
7048               strm.msg = 'invalid bit length repeat';
7049               state.mode = BAD;
7050               break;
7051             }
7052             len = state.lens[state.have - 1];
7053             copy = 3 + (hold & 0x03);//BITS(2);
7054             //--- DROPBITS(2) ---//
7055             hold >>>= 2;
7056             bits -= 2;
7057             //---//
7058           }
7059           else if (here_val === 17) {
7060             //=== NEEDBITS(here.bits + 3);
7061             n = here_bits + 3;
7062             while (bits < n) {
7063               if (have === 0) { break inf_leave; }
7064               have--;
7065               hold += input[next++] << bits;
7066               bits += 8;
7067             }
7068             //===//
7069             //--- DROPBITS(here.bits) ---//
7070             hold >>>= here_bits;
7071             bits -= here_bits;
7072             //---//
7073             len = 0;
7074             copy = 3 + (hold & 0x07);//BITS(3);
7075             //--- DROPBITS(3) ---//
7076             hold >>>= 3;
7077             bits -= 3;
7078             //---//
7079           }
7080           else {
7081             //=== NEEDBITS(here.bits + 7);
7082             n = here_bits + 7;
7083             while (bits < n) {
7084               if (have === 0) { break inf_leave; }
7085               have--;
7086               hold += input[next++] << bits;
7087               bits += 8;
7088             }
7089             //===//
7090             //--- DROPBITS(here.bits) ---//
7091             hold >>>= here_bits;
7092             bits -= here_bits;
7093             //---//
7094             len = 0;
7095             copy = 11 + (hold & 0x7f);//BITS(7);
7096             //--- DROPBITS(7) ---//
7097             hold >>>= 7;
7098             bits -= 7;
7099             //---//
7100           }
7101           if (state.have + copy > state.nlen + state.ndist) {
7102             strm.msg = 'invalid bit length repeat';
7103             state.mode = BAD;
7104             break;
7105           }
7106           while (copy--) {
7107             state.lens[state.have++] = len;
7108           }
7109         }
7110       }
7111
7112       /* handle error breaks in while */
7113       if (state.mode === BAD) { break; }
7114
7115       /* check for end-of-block code (better have one) */
7116       if (state.lens[256] === 0) {
7117         strm.msg = 'invalid code -- missing end-of-block';
7118         state.mode = BAD;
7119         break;
7120       }
7121
7122       /* build code tables -- note: do not change the lenbits or distbits
7123          values here (9 and 6) without reading the comments in inftrees.h
7124          concerning the ENOUGH constants, which depend on those values */
7125       state.lenbits = 9;
7126
7127       opts = {bits: state.lenbits};
7128       ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
7129       // We have separate tables & no pointers. 2 commented lines below not needed.
7130       // state.next_index = opts.table_index;
7131       state.lenbits = opts.bits;
7132       // state.lencode = state.next;
7133
7134       if (ret) {
7135         strm.msg = 'invalid literal/lengths set';
7136         state.mode = BAD;
7137         break;
7138       }
7139
7140       state.distbits = 6;
7141       //state.distcode.copy(state.codes);
7142       // Switch to use dynamic table
7143       state.distcode = state.distdyn;
7144       opts = {bits: state.distbits};
7145       ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
7146       // We have separate tables & no pointers. 2 commented lines below not needed.
7147       // state.next_index = opts.table_index;
7148       state.distbits = opts.bits;
7149       // state.distcode = state.next;
7150
7151       if (ret) {
7152         strm.msg = 'invalid distances set';
7153         state.mode = BAD;
7154         break;
7155       }
7156       //Tracev((stderr, 'inflate:       codes ok\n'));
7157       state.mode = LEN_;
7158       if (flush === Z_TREES) { break inf_leave; }
7159       /* falls through */
7160     case LEN_:
7161       state.mode = LEN;
7162       /* falls through */
7163     case LEN:
7164       if (have >= 6 && left >= 258) {
7165         //--- RESTORE() ---
7166         strm.next_out = put;
7167         strm.avail_out = left;
7168         strm.next_in = next;
7169         strm.avail_in = have;
7170         state.hold = hold;
7171         state.bits = bits;
7172         //---
7173         inflate_fast(strm, _out);
7174         //--- LOAD() ---
7175         put = strm.next_out;
7176         output = strm.output;
7177         left = strm.avail_out;
7178         next = strm.next_in;
7179         input = strm.input;
7180         have = strm.avail_in;
7181         hold = state.hold;
7182         bits = state.bits;
7183         //---
7184
7185         if (state.mode === TYPE) {
7186           state.back = -1;
7187         }
7188         break;
7189       }
7190       state.back = 0;
7191       for (;;) {
7192         here = state.lencode[hold & ((1 << state.lenbits) -1)];  /*BITS(state.lenbits)*/
7193         here_bits = here >>> 24;
7194         here_op = (here >>> 16) & 0xff;
7195         here_val = here & 0xffff;
7196
7197         if (here_bits <= bits) { break; }
7198         //--- PULLBYTE() ---//
7199         if (have === 0) { break inf_leave; }
7200         have--;
7201         hold += input[next++] << bits;
7202         bits += 8;
7203         //---//
7204       }
7205       if (here_op && (here_op & 0xf0) === 0) {
7206         last_bits = here_bits;
7207         last_op = here_op;
7208         last_val = here_val;
7209         for (;;) {
7210           here = state.lencode[last_val +
7211                   ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];
7212           here_bits = here >>> 24;
7213           here_op = (here >>> 16) & 0xff;
7214           here_val = here & 0xffff;
7215
7216           if ((last_bits + here_bits) <= bits) { break; }
7217           //--- PULLBYTE() ---//
7218           if (have === 0) { break inf_leave; }
7219           have--;
7220           hold += input[next++] << bits;
7221           bits += 8;
7222           //---//
7223         }
7224         //--- DROPBITS(last.bits) ---//
7225         hold >>>= last_bits;
7226         bits -= last_bits;
7227         //---//
7228         state.back += last_bits;
7229       }
7230       //--- DROPBITS(here.bits) ---//
7231       hold >>>= here_bits;
7232       bits -= here_bits;
7233       //---//
7234       state.back += here_bits;
7235       state.length = here_val;
7236       if (here_op === 0) {
7237         //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
7238         //        "inflate:         literal '%c'\n" :
7239         //        "inflate:         literal 0x%02x\n", here.val));
7240         state.mode = LIT;
7241         break;
7242       }
7243       if (here_op & 32) {
7244         //Tracevv((stderr, "inflate:         end of block\n"));
7245         state.back = -1;
7246         state.mode = TYPE;
7247         break;
7248       }
7249       if (here_op & 64) {
7250         strm.msg = 'invalid literal/length code';
7251         state.mode = BAD;
7252         break;
7253       }
7254       state.extra = here_op & 15;
7255       state.mode = LENEXT;
7256       /* falls through */
7257     case LENEXT:
7258       if (state.extra) {
7259         //=== NEEDBITS(state.extra);
7260         n = state.extra;
7261         while (bits < n) {
7262           if (have === 0) { break inf_leave; }
7263           have--;
7264           hold += input[next++] << bits;
7265           bits += 8;
7266         }
7267         //===//
7268         state.length += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;
7269         //--- DROPBITS(state.extra) ---//
7270         hold >>>= state.extra;
7271         bits -= state.extra;
7272         //---//
7273         state.back += state.extra;
7274       }
7275       //Tracevv((stderr, "inflate:         length %u\n", state.length));
7276       state.was = state.length;
7277       state.mode = DIST;
7278       /* falls through */
7279     case DIST:
7280       for (;;) {
7281         here = state.distcode[hold & ((1 << state.distbits) -1)];/*BITS(state.distbits)*/
7282         here_bits = here >>> 24;
7283         here_op = (here >>> 16) & 0xff;
7284         here_val = here & 0xffff;
7285
7286         if ((here_bits) <= bits) { break; }
7287         //--- PULLBYTE() ---//
7288         if (have === 0) { break inf_leave; }
7289         have--;
7290         hold += input[next++] << bits;
7291         bits += 8;
7292         //---//
7293       }
7294       if ((here_op & 0xf0) === 0) {
7295         last_bits = here_bits;
7296         last_op = here_op;
7297         last_val = here_val;
7298         for (;;) {
7299           here = state.distcode[last_val +
7300                   ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];
7301           here_bits = here >>> 24;
7302           here_op = (here >>> 16) & 0xff;
7303           here_val = here & 0xffff;
7304
7305           if ((last_bits + here_bits) <= bits) { break; }
7306           //--- PULLBYTE() ---//
7307           if (have === 0) { break inf_leave; }
7308           have--;
7309           hold += input[next++] << bits;
7310           bits += 8;
7311           //---//
7312         }
7313         //--- DROPBITS(last.bits) ---//
7314         hold >>>= last_bits;
7315         bits -= last_bits;
7316         //---//
7317         state.back += last_bits;
7318       }
7319       //--- DROPBITS(here.bits) ---//
7320       hold >>>= here_bits;
7321       bits -= here_bits;
7322       //---//
7323       state.back += here_bits;
7324       if (here_op & 64) {
7325         strm.msg = 'invalid distance code';
7326         state.mode = BAD;
7327         break;
7328       }
7329       state.offset = here_val;
7330       state.extra = (here_op) & 15;
7331       state.mode = DISTEXT;
7332       /* falls through */
7333     case DISTEXT:
7334       if (state.extra) {
7335         //=== NEEDBITS(state.extra);
7336         n = state.extra;
7337         while (bits < n) {
7338           if (have === 0) { break inf_leave; }
7339           have--;
7340           hold += input[next++] << bits;
7341           bits += 8;
7342         }
7343         //===//
7344         state.offset += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;
7345         //--- DROPBITS(state.extra) ---//
7346         hold >>>= state.extra;
7347         bits -= state.extra;
7348         //---//
7349         state.back += state.extra;
7350       }
7351 //#ifdef INFLATE_STRICT
7352       if (state.offset > state.dmax) {
7353         strm.msg = 'invalid distance too far back';
7354         state.mode = BAD;
7355         break;
7356       }
7357 //#endif
7358       //Tracevv((stderr, "inflate:         distance %u\n", state.offset));
7359       state.mode = MATCH;
7360       /* falls through */
7361     case MATCH:
7362       if (left === 0) { break inf_leave; }
7363       copy = _out - left;
7364       if (state.offset > copy) {         /* copy from window */
7365         copy = state.offset - copy;
7366         if (copy > state.whave) {
7367           if (state.sane) {
7368             strm.msg = 'invalid distance too far back';
7369             state.mode = BAD;
7370             break;
7371           }
7372 // (!) This block is disabled in zlib defailts,
7373 // don't enable it for binary compatibility
7374 //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
7375 //          Trace((stderr, "inflate.c too far\n"));
7376 //          copy -= state.whave;
7377 //          if (copy > state.length) { copy = state.length; }
7378 //          if (copy > left) { copy = left; }
7379 //          left -= copy;
7380 //          state.length -= copy;
7381 //          do {
7382 //            output[put++] = 0;
7383 //          } while (--copy);
7384 //          if (state.length === 0) { state.mode = LEN; }
7385 //          break;
7386 //#endif
7387         }
7388         if (copy > state.wnext) {
7389           copy -= state.wnext;
7390           from = state.wsize - copy;
7391         }
7392         else {
7393           from = state.wnext - copy;
7394         }
7395         if (copy > state.length) { copy = state.length; }
7396         from_source = state.window;
7397       }
7398       else {                              /* copy from output */
7399         from_source = output;
7400         from = put - state.offset;
7401         copy = state.length;
7402       }
7403       if (copy > left) { copy = left; }
7404       left -= copy;
7405       state.length -= copy;
7406       do {
7407         output[put++] = from_source[from++];
7408       } while (--copy);
7409       if (state.length === 0) { state.mode = LEN; }
7410       break;
7411     case LIT:
7412       if (left === 0) { break inf_leave; }
7413       output[put++] = state.length;
7414       left--;
7415       state.mode = LEN;
7416       break;
7417     case CHECK:
7418       if (state.wrap) {
7419         //=== NEEDBITS(32);
7420         while (bits < 32) {
7421           if (have === 0) { break inf_leave; }
7422           have--;
7423           // Use '|' insdead of '+' to make sure that result is signed
7424           hold |= input[next++] << bits;
7425           bits += 8;
7426         }
7427         //===//
7428         _out -= left;
7429         strm.total_out += _out;
7430         state.total += _out;
7431         if (_out) {
7432           strm.adler = state.check =
7433               /*UPDATE(state.check, put - _out, _out);*/
7434               (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
7435
7436         }
7437         _out = left;
7438         // NB: crc32 stored as signed 32-bit int, ZSWAP32 returns signed too
7439         if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) {
7440           strm.msg = 'incorrect data check';
7441           state.mode = BAD;
7442           break;
7443         }
7444         //=== INITBITS();
7445         hold = 0;
7446         bits = 0;
7447         //===//
7448         //Tracev((stderr, "inflate:   check matches trailer\n"));
7449       }
7450       state.mode = LENGTH;
7451       /* falls through */
7452     case LENGTH:
7453       if (state.wrap && state.flags) {
7454         //=== NEEDBITS(32);
7455         while (bits < 32) {
7456           if (have === 0) { break inf_leave; }
7457           have--;
7458           hold += input[next++] << bits;
7459           bits += 8;
7460         }
7461         //===//
7462         if (hold !== (state.total & 0xffffffff)) {
7463           strm.msg = 'incorrect length check';
7464           state.mode = BAD;
7465           break;
7466         }
7467         //=== INITBITS();
7468         hold = 0;
7469         bits = 0;
7470         //===//
7471         //Tracev((stderr, "inflate:   length matches trailer\n"));
7472       }
7473       state.mode = DONE;
7474       /* falls through */
7475     case DONE:
7476       ret = Z_STREAM_END;
7477       break inf_leave;
7478     case BAD:
7479       ret = Z_DATA_ERROR;
7480       break inf_leave;
7481     case MEM:
7482       return Z_MEM_ERROR;
7483     case SYNC:
7484       /* falls through */
7485     default:
7486       return Z_STREAM_ERROR;
7487     }
7488   }
7489
7490   // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
7491
7492   /*
7493      Return from inflate(), updating the total counts and the check value.
7494      If there was no progress during the inflate() call, return a buffer
7495      error.  Call updatewindow() to create and/or update the window state.
7496      Note: a memory error from inflate() is non-recoverable.
7497    */
7498
7499   //--- RESTORE() ---
7500   strm.next_out = put;
7501   strm.avail_out = left;
7502   strm.next_in = next;
7503   strm.avail_in = have;
7504   state.hold = hold;
7505   state.bits = bits;
7506   //---
7507
7508   if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
7509                       (state.mode < CHECK || flush !== Z_FINISH))) {
7510     if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
7511       state.mode = MEM;
7512       return Z_MEM_ERROR;
7513     }
7514   }
7515   _in -= strm.avail_in;
7516   _out -= strm.avail_out;
7517   strm.total_in += _in;
7518   strm.total_out += _out;
7519   state.total += _out;
7520   if (state.wrap && _out) {
7521     strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
7522       (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
7523   }
7524   strm.data_type = state.bits + (state.last ? 64 : 0) +
7525                     (state.mode === TYPE ? 128 : 0) +
7526                     (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
7527   if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
7528     ret = Z_BUF_ERROR;
7529   }
7530   return ret;
7531 }
7532
7533 function inflateEnd(strm) {
7534
7535   if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
7536     return Z_STREAM_ERROR;
7537   }
7538
7539   var state = strm.state;
7540   if (state.window) {
7541     state.window = null;
7542   }
7543   strm.state = null;
7544   return Z_OK;
7545 }
7546
7547 function inflateGetHeader(strm, head) {
7548   var state;
7549
7550   /* check state */
7551   if (!strm || !strm.state) { return Z_STREAM_ERROR; }
7552   state = strm.state;
7553   if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
7554
7555   /* save header structure */
7556   state.head = head;
7557   head.done = false;
7558   return Z_OK;
7559 }
7560
7561
7562 exports.inflateReset = inflateReset;
7563 exports.inflateReset2 = inflateReset2;
7564 exports.inflateResetKeep = inflateResetKeep;
7565 exports.inflateInit = inflateInit;
7566 exports.inflateInit2 = inflateInit2;
7567 exports.inflate = inflate;
7568 exports.inflateEnd = inflateEnd;
7569 exports.inflateGetHeader = inflateGetHeader;
7570 exports.inflateInfo = 'pako inflate (from Nodeca project)';
7571
7572 /* Not implemented
7573 exports.inflateCopy = inflateCopy;
7574 exports.inflateGetDictionary = inflateGetDictionary;
7575 exports.inflateMark = inflateMark;
7576 exports.inflatePrime = inflatePrime;
7577 exports.inflateSetDictionary = inflateSetDictionary;
7578 exports.inflateSync = inflateSync;
7579 exports.inflateSyncPoint = inflateSyncPoint;
7580 exports.inflateUndermine = inflateUndermine;
7581 */
7582 },{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(_dereq_,module,exports){
7583 'use strict';
7584
7585
7586 var utils = _dereq_('../utils/common');
7587
7588 var MAXBITS = 15;
7589 var ENOUGH_LENS = 852;
7590 var ENOUGH_DISTS = 592;
7591 //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
7592
7593 var CODES = 0;
7594 var LENS = 1;
7595 var DISTS = 2;
7596
7597 var lbase = [ /* Length codes 257..285 base */
7598   3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
7599   35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
7600 ];
7601
7602 var lext = [ /* Length codes 257..285 extra */
7603   16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
7604   19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
7605 ];
7606
7607 var dbase = [ /* Distance codes 0..29 base */
7608   1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
7609   257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
7610   8193, 12289, 16385, 24577, 0, 0
7611 ];
7612
7613 var dext = [ /* Distance codes 0..29 extra */
7614   16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
7615   23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
7616   28, 28, 29, 29, 64, 64
7617 ];
7618
7619 module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
7620 {
7621   var bits = opts.bits;
7622       //here = opts.here; /* table entry for duplication */
7623
7624   var len = 0;               /* a code's length in bits */
7625   var sym = 0;               /* index of code symbols */
7626   var min = 0, max = 0;          /* minimum and maximum code lengths */
7627   var root = 0;              /* number of index bits for root table */
7628   var curr = 0;              /* number of index bits for current table */
7629   var drop = 0;              /* code bits to drop for sub-table */
7630   var left = 0;                   /* number of prefix codes available */
7631   var used = 0;              /* code entries in table used */
7632   var huff = 0;              /* Huffman code */
7633   var incr;              /* for incrementing code, index */
7634   var fill;              /* index for replicating entries */
7635   var low;               /* low bits for current root entry */
7636   var mask;              /* mask for low root bits */
7637   var next;             /* next available space in table */
7638   var base = null;     /* base value table to use */
7639   var base_index = 0;
7640 //  var shoextra;    /* extra bits table to use */
7641   var end;                    /* use base and extra for symbol > end */
7642   var count = new utils.Buf16(MAXBITS+1); //[MAXBITS+1];    /* number of codes of each length */
7643   var offs = new utils.Buf16(MAXBITS+1); //[MAXBITS+1];     /* offsets in table for each length */
7644   var extra = null;
7645   var extra_index = 0;
7646
7647   var here_bits, here_op, here_val;
7648
7649   /*
7650    Process a set of code lengths to create a canonical Huffman code.  The
7651    code lengths are lens[0..codes-1].  Each length corresponds to the
7652    symbols 0..codes-1.  The Huffman code is generated by first sorting the
7653    symbols by length from short to long, and retaining the symbol order
7654    for codes with equal lengths.  Then the code starts with all zero bits
7655    for the first code of the shortest length, and the codes are integer
7656    increments for the same length, and zeros are appended as the length
7657    increases.  For the deflate format, these bits are stored backwards
7658    from their more natural integer increment ordering, and so when the
7659    decoding tables are built in the large loop below, the integer codes
7660    are incremented backwards.
7661
7662    This routine assumes, but does not check, that all of the entries in
7663    lens[] are in the range 0..MAXBITS.  The caller must assure this.
7664    1..MAXBITS is interpreted as that code length.  zero means that that
7665    symbol does not occur in this code.
7666
7667    The codes are sorted by computing a count of codes for each length,
7668    creating from that a table of starting indices for each length in the
7669    sorted table, and then entering the symbols in order in the sorted
7670    table.  The sorted table is work[], with that space being provided by
7671    the caller.
7672
7673    The length counts are used for other purposes as well, i.e. finding
7674    the minimum and maximum length codes, determining if there are any
7675    codes at all, checking for a valid set of lengths, and looking ahead
7676    at length counts to determine sub-table sizes when building the
7677    decoding tables.
7678    */
7679
7680   /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
7681   for (len = 0; len <= MAXBITS; len++) {
7682     count[len] = 0;
7683   }
7684   for (sym = 0; sym < codes; sym++) {
7685     count[lens[lens_index + sym]]++;
7686   }
7687
7688   /* bound code lengths, force root to be within code lengths */
7689   root = bits;
7690   for (max = MAXBITS; max >= 1; max--) {
7691     if (count[max] !== 0) { break; }
7692   }
7693   if (root > max) {
7694     root = max;
7695   }
7696   if (max === 0) {                     /* no symbols to code at all */
7697     //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */
7698     //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;
7699     //table.val[opts.table_index++] = 0;   //here.val = (var short)0;
7700     table[table_index++] = (1 << 24) | (64 << 16) | 0;
7701
7702
7703     //table.op[opts.table_index] = 64;
7704     //table.bits[opts.table_index] = 1;
7705     //table.val[opts.table_index++] = 0;
7706     table[table_index++] = (1 << 24) | (64 << 16) | 0;
7707
7708     opts.bits = 1;
7709     return 0;     /* no symbols, but wait for decoding to report error */
7710   }
7711   for (min = 1; min < max; min++) {
7712     if (count[min] !== 0) { break; }
7713   }
7714   if (root < min) {
7715     root = min;
7716   }
7717
7718   /* check for an over-subscribed or incomplete set of lengths */
7719   left = 1;
7720   for (len = 1; len <= MAXBITS; len++) {
7721     left <<= 1;
7722     left -= count[len];
7723     if (left < 0) {
7724       return -1;
7725     }        /* over-subscribed */
7726   }
7727   if (left > 0 && (type === CODES || max !== 1)) {
7728     return -1;                      /* incomplete set */
7729   }
7730
7731   /* generate offsets into symbol table for each length for sorting */
7732   offs[1] = 0;
7733   for (len = 1; len < MAXBITS; len++) {
7734     offs[len + 1] = offs[len] + count[len];
7735   }
7736
7737   /* sort symbols by length, by symbol order within each length */
7738   for (sym = 0; sym < codes; sym++) {
7739     if (lens[lens_index + sym] !== 0) {
7740       work[offs[lens[lens_index + sym]]++] = sym;
7741     }
7742   }
7743
7744   /*
7745    Create and fill in decoding tables.  In this loop, the table being
7746    filled is at next and has curr index bits.  The code being used is huff
7747    with length len.  That code is converted to an index by dropping drop
7748    bits off of the bottom.  For codes where len is less than drop + curr,
7749    those top drop + curr - len bits are incremented through all values to
7750    fill the table with replicated entries.
7751
7752    root is the number of index bits for the root table.  When len exceeds
7753    root, sub-tables are created pointed to by the root entry with an index
7754    of the low root bits of huff.  This is saved in low to check for when a
7755    new sub-table should be started.  drop is zero when the root table is
7756    being filled, and drop is root when sub-tables are being filled.
7757
7758    When a new sub-table is needed, it is necessary to look ahead in the
7759    code lengths to determine what size sub-table is needed.  The length
7760    counts are used for this, and so count[] is decremented as codes are
7761    entered in the tables.
7762
7763    used keeps track of how many table entries have been allocated from the
7764    provided *table space.  It is checked for LENS and DIST tables against
7765    the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
7766    the initial root table size constants.  See the comments in inftrees.h
7767    for more information.
7768
7769    sym increments through all symbols, and the loop terminates when
7770    all codes of length max, i.e. all codes, have been processed.  This
7771    routine permits incomplete codes, so another loop after this one fills
7772    in the rest of the decoding tables with invalid code markers.
7773    */
7774
7775   /* set up for code type */
7776   // poor man optimization - use if-else instead of switch,
7777   // to avoid deopts in old v8
7778   if (type === CODES) {
7779       base = extra = work;    /* dummy value--not used */
7780       end = 19;
7781   } else if (type === LENS) {
7782       base = lbase;
7783       base_index -= 257;
7784       extra = lext;
7785       extra_index -= 257;
7786       end = 256;
7787   } else {                    /* DISTS */
7788       base = dbase;
7789       extra = dext;
7790       end = -1;
7791   }
7792
7793   /* initialize opts for loop */
7794   huff = 0;                   /* starting code */
7795   sym = 0;                    /* starting code symbol */
7796   len = min;                  /* starting code length */
7797   next = table_index;              /* current table to fill in */
7798   curr = root;                /* current table index bits */
7799   drop = 0;                   /* current bits to drop from code for index */
7800   low = -1;                   /* trigger new sub-table when len > root */
7801   used = 1 << root;          /* use root table entries */
7802   mask = used - 1;            /* mask for comparing low */
7803
7804   /* check available table space */
7805   if ((type === LENS && used > ENOUGH_LENS) ||
7806     (type === DISTS && used > ENOUGH_DISTS)) {
7807     return 1;
7808   }
7809
7810   var i=0;
7811   /* process all codes and make table entries */
7812   for (;;) {
7813     i++;
7814     /* create table entry */
7815     here_bits = len - drop;
7816     if (work[sym] < end) {
7817       here_op = 0;
7818       here_val = work[sym];
7819     }
7820     else if (work[sym] > end) {
7821       here_op = extra[extra_index + work[sym]];
7822       here_val = base[base_index + work[sym]];
7823     }
7824     else {
7825       here_op = 32 + 64;         /* end of block */
7826       here_val = 0;
7827     }
7828
7829     /* replicate for those indices with low len bits equal to huff */
7830     incr = 1 << (len - drop);
7831     fill = 1 << curr;
7832     min = fill;                 /* save offset to next table */
7833     do {
7834       fill -= incr;
7835       table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
7836     } while (fill !== 0);
7837
7838     /* backwards increment the len-bit code huff */
7839     incr = 1 << (len - 1);
7840     while (huff & incr) {
7841       incr >>= 1;
7842     }
7843     if (incr !== 0) {
7844       huff &= incr - 1;
7845       huff += incr;
7846     } else {
7847       huff = 0;
7848     }
7849
7850     /* go to next symbol, update count, len */
7851     sym++;
7852     if (--count[len] === 0) {
7853       if (len === max) { break; }
7854       len = lens[lens_index + work[sym]];
7855     }
7856
7857     /* create new sub-table if needed */
7858     if (len > root && (huff & mask) !== low) {
7859       /* if first time, transition to sub-tables */
7860       if (drop === 0) {
7861         drop = root;
7862       }
7863
7864       /* increment past last table */
7865       next += min;            /* here min is 1 << curr */
7866
7867       /* determine length of next table */
7868       curr = len - drop;
7869       left = 1 << curr;
7870       while (curr + drop < max) {
7871         left -= count[curr + drop];
7872         if (left <= 0) { break; }
7873         curr++;
7874         left <<= 1;
7875       }
7876
7877       /* check for enough space */
7878       used += 1 << curr;
7879       if ((type === LENS && used > ENOUGH_LENS) ||
7880         (type === DISTS && used > ENOUGH_DISTS)) {
7881         return 1;
7882       }
7883
7884       /* point entry in root table to sub-table */
7885       low = huff & mask;
7886       /*table.op[low] = curr;
7887       table.bits[low] = root;
7888       table.val[low] = next - opts.table_index;*/
7889       table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
7890     }
7891   }
7892
7893   /* fill in remaining table entry if code is incomplete (guaranteed to have
7894    at most one remaining entry, since if the code is incomplete, the
7895    maximum code length that was allowed to get this far is one bit) */
7896   if (huff !== 0) {
7897     //table.op[next + huff] = 64;            /* invalid code marker */
7898     //table.bits[next + huff] = len - drop;
7899     //table.val[next + huff] = 0;
7900     table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
7901   }
7902
7903   /* set return parameters */
7904   //opts.table_index += used;
7905   opts.bits = root;
7906   return 0;
7907 };
7908
7909 },{"../utils/common":27}],37:[function(_dereq_,module,exports){
7910 'use strict';
7911
7912 module.exports = {
7913   '2':    'need dictionary',     /* Z_NEED_DICT       2  */
7914   '1':    'stream end',          /* Z_STREAM_END      1  */
7915   '0':    '',                    /* Z_OK              0  */
7916   '-1':   'file error',          /* Z_ERRNO         (-1) */
7917   '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */
7918   '-3':   'data error',          /* Z_DATA_ERROR    (-3) */
7919   '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */
7920   '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */
7921   '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */
7922 };
7923 },{}],38:[function(_dereq_,module,exports){
7924 'use strict';
7925
7926
7927 var utils = _dereq_('../utils/common');
7928
7929 /* Public constants ==========================================================*/
7930 /* ===========================================================================*/
7931
7932
7933 //var Z_FILTERED          = 1;
7934 //var Z_HUFFMAN_ONLY      = 2;
7935 //var Z_RLE               = 3;
7936 var Z_FIXED               = 4;
7937 //var Z_DEFAULT_STRATEGY  = 0;
7938
7939 /* Possible values of the data_type field (though see inflate()) */
7940 var Z_BINARY              = 0;
7941 var Z_TEXT                = 1;
7942 //var Z_ASCII             = 1; // = Z_TEXT
7943 var Z_UNKNOWN             = 2;
7944
7945 /*============================================================================*/
7946
7947
7948 function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
7949
7950 // From zutil.h
7951
7952 var STORED_BLOCK = 0;
7953 var STATIC_TREES = 1;
7954 var DYN_TREES    = 2;
7955 /* The three kinds of block type */
7956
7957 var MIN_MATCH    = 3;
7958 var MAX_MATCH    = 258;
7959 /* The minimum and maximum match lengths */
7960
7961 // From deflate.h
7962 /* ===========================================================================
7963  * Internal compression state.
7964  */
7965
7966 var LENGTH_CODES  = 29;
7967 /* number of length codes, not counting the special END_BLOCK code */
7968
7969 var LITERALS      = 256;
7970 /* number of literal bytes 0..255 */
7971
7972 var L_CODES       = LITERALS + 1 + LENGTH_CODES;
7973 /* number of Literal or Length codes, including the END_BLOCK code */
7974
7975 var D_CODES       = 30;
7976 /* number of distance codes */
7977
7978 var BL_CODES      = 19;
7979 /* number of codes used to transfer the bit lengths */
7980
7981 var HEAP_SIZE     = 2*L_CODES + 1;
7982 /* maximum heap size */
7983
7984 var MAX_BITS      = 15;
7985 /* All codes must not exceed MAX_BITS bits */
7986
7987 var Buf_size      = 16;
7988 /* size of bit buffer in bi_buf */
7989
7990
7991 /* ===========================================================================
7992  * Constants
7993  */
7994
7995 var MAX_BL_BITS = 7;
7996 /* Bit length codes must not exceed MAX_BL_BITS bits */
7997
7998 var END_BLOCK   = 256;
7999 /* end of block literal code */
8000
8001 var REP_3_6     = 16;
8002 /* repeat previous bit length 3-6 times (2 bits of repeat count) */
8003
8004 var REPZ_3_10   = 17;
8005 /* repeat a zero length 3-10 times  (3 bits of repeat count) */
8006
8007 var REPZ_11_138 = 18;
8008 /* repeat a zero length 11-138 times  (7 bits of repeat count) */
8009
8010 var extra_lbits =   /* extra bits for each length code */
8011   [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];
8012
8013 var extra_dbits =   /* extra bits for each distance code */
8014   [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];
8015
8016 var extra_blbits =  /* extra bits for each bit length code */
8017   [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
8018
8019 var bl_order =
8020   [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
8021 /* The lengths of the bit length codes are sent in order of decreasing
8022  * probability, to avoid transmitting the lengths for unused bit length codes.
8023  */
8024
8025 /* ===========================================================================
8026  * Local data. These are initialized only once.
8027  */
8028
8029 // We pre-fill arrays with 0 to avoid uninitialized gaps
8030
8031 var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
8032
8033 // !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1
8034 var static_ltree  = new Array((L_CODES+2) * 2);
8035 zero(static_ltree);
8036 /* The static literal tree. Since the bit lengths are imposed, there is no
8037  * need for the L_CODES extra codes used during heap construction. However
8038  * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
8039  * below).
8040  */
8041
8042 var static_dtree  = new Array(D_CODES * 2);
8043 zero(static_dtree);
8044 /* The static distance tree. (Actually a trivial tree since all codes use
8045  * 5 bits.)
8046  */
8047
8048 var _dist_code    = new Array(DIST_CODE_LEN);
8049 zero(_dist_code);
8050 /* Distance codes. The first 256 values correspond to the distances
8051  * 3 .. 258, the last 256 values correspond to the top 8 bits of
8052  * the 15 bit distances.
8053  */
8054
8055 var _length_code  = new Array(MAX_MATCH-MIN_MATCH+1);
8056 zero(_length_code);
8057 /* length code for each normalized match length (0 == MIN_MATCH) */
8058
8059 var base_length   = new Array(LENGTH_CODES);
8060 zero(base_length);
8061 /* First normalized length for each code (0 = MIN_MATCH) */
8062
8063 var base_dist     = new Array(D_CODES);
8064 zero(base_dist);
8065 /* First normalized distance for each code (0 = distance of 1) */
8066
8067
8068 var StaticTreeDesc = function (static_tree, extra_bits, extra_base, elems, max_length) {
8069
8070   this.static_tree  = static_tree;  /* static tree or NULL */
8071   this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */
8072   this.extra_base   = extra_base;   /* base index for extra_bits */
8073   this.elems        = elems;        /* max number of elements in the tree */
8074   this.max_length   = max_length;   /* max bit length for the codes */
8075
8076   // show if `static_tree` has data or dummy - needed for monomorphic objects
8077   this.has_stree    = static_tree && static_tree.length;
8078 };
8079
8080
8081 var static_l_desc;
8082 var static_d_desc;
8083 var static_bl_desc;
8084
8085
8086 var TreeDesc = function(dyn_tree, stat_desc) {
8087   this.dyn_tree = dyn_tree;     /* the dynamic tree */
8088   this.max_code = 0;            /* largest code with non zero frequency */
8089   this.stat_desc = stat_desc;   /* the corresponding static tree */
8090 };
8091
8092
8093
8094 function d_code(dist) {
8095   return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
8096 }
8097
8098
8099 /* ===========================================================================
8100  * Output a short LSB first on the stream.
8101  * IN assertion: there is enough room in pendingBuf.
8102  */
8103 function put_short (s, w) {
8104 //    put_byte(s, (uch)((w) & 0xff));
8105 //    put_byte(s, (uch)((ush)(w) >> 8));
8106   s.pending_buf[s.pending++] = (w) & 0xff;
8107   s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
8108 }
8109
8110
8111 /* ===========================================================================
8112  * Send a value on a given number of bits.
8113  * IN assertion: length <= 16 and value fits in length bits.
8114  */
8115 function send_bits(s, value, length) {
8116   if (s.bi_valid > (Buf_size - length)) {
8117     s.bi_buf |= (value << s.bi_valid) & 0xffff;
8118     put_short(s, s.bi_buf);
8119     s.bi_buf = value >> (Buf_size - s.bi_valid);
8120     s.bi_valid += length - Buf_size;
8121   } else {
8122     s.bi_buf |= (value << s.bi_valid) & 0xffff;
8123     s.bi_valid += length;
8124   }
8125 }
8126
8127
8128 function send_code(s, c, tree) {
8129   send_bits(s, tree[c*2]/*.Code*/, tree[c*2 + 1]/*.Len*/);
8130 }
8131
8132
8133 /* ===========================================================================
8134  * Reverse the first len bits of a code, using straightforward code (a faster
8135  * method would use a table)
8136  * IN assertion: 1 <= len <= 15
8137  */
8138 function bi_reverse(code, len) {
8139   var res = 0;
8140   do {
8141     res |= code & 1;
8142     code >>>= 1;
8143     res <<= 1;
8144   } while (--len > 0);
8145   return res >>> 1;
8146 }
8147
8148
8149 /* ===========================================================================
8150  * Flush the bit buffer, keeping at most 7 bits in it.
8151  */
8152 function bi_flush(s) {
8153   if (s.bi_valid === 16) {
8154     put_short(s, s.bi_buf);
8155     s.bi_buf = 0;
8156     s.bi_valid = 0;
8157
8158   } else if (s.bi_valid >= 8) {
8159     s.pending_buf[s.pending++] = s.bi_buf & 0xff;
8160     s.bi_buf >>= 8;
8161     s.bi_valid -= 8;
8162   }
8163 }
8164
8165
8166 /* ===========================================================================
8167  * Compute the optimal bit lengths for a tree and update the total bit length
8168  * for the current block.
8169  * IN assertion: the fields freq and dad are set, heap[heap_max] and
8170  *    above are the tree nodes sorted by increasing frequency.
8171  * OUT assertions: the field len is set to the optimal bit length, the
8172  *     array bl_count contains the frequencies for each bit length.
8173  *     The length opt_len is updated; static_len is also updated if stree is
8174  *     not null.
8175  */
8176 function gen_bitlen(s, desc)
8177 //    deflate_state *s;
8178 //    tree_desc *desc;    /* the tree descriptor */
8179 {
8180   var tree            = desc.dyn_tree;
8181   var max_code        = desc.max_code;
8182   var stree           = desc.stat_desc.static_tree;
8183   var has_stree       = desc.stat_desc.has_stree;
8184   var extra           = desc.stat_desc.extra_bits;
8185   var base            = desc.stat_desc.extra_base;
8186   var max_length      = desc.stat_desc.max_length;
8187   var h;              /* heap index */
8188   var n, m;           /* iterate over the tree elements */
8189   var bits;           /* bit length */
8190   var xbits;          /* extra bits */
8191   var f;              /* frequency */
8192   var overflow = 0;   /* number of elements with bit length too large */
8193
8194   for (bits = 0; bits <= MAX_BITS; bits++) {
8195     s.bl_count[bits] = 0;
8196   }
8197
8198   /* In a first pass, compute the optimal bit lengths (which may
8199    * overflow in the case of the bit length tree).
8200    */
8201   tree[s.heap[s.heap_max]*2 + 1]/*.Len*/ = 0; /* root of the heap */
8202
8203   for (h = s.heap_max+1; h < HEAP_SIZE; h++) {
8204     n = s.heap[h];
8205     bits = tree[tree[n*2 +1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
8206     if (bits > max_length) {
8207       bits = max_length;
8208       overflow++;
8209     }
8210     tree[n*2 + 1]/*.Len*/ = bits;
8211     /* We overwrite tree[n].Dad which is no longer needed */
8212
8213     if (n > max_code) { continue; } /* not a leaf node */
8214
8215     s.bl_count[bits]++;
8216     xbits = 0;
8217     if (n >= base) {
8218       xbits = extra[n-base];
8219     }
8220     f = tree[n * 2]/*.Freq*/;
8221     s.opt_len += f * (bits + xbits);
8222     if (has_stree) {
8223       s.static_len += f * (stree[n*2 + 1]/*.Len*/ + xbits);
8224     }
8225   }
8226   if (overflow === 0) { return; }
8227
8228   // Trace((stderr,"\nbit length overflow\n"));
8229   /* This happens for example on obj2 and pic of the Calgary corpus */
8230
8231   /* Find the first bit length which could increase: */
8232   do {
8233     bits = max_length-1;
8234     while (s.bl_count[bits] === 0) { bits--; }
8235     s.bl_count[bits]--;      /* move one leaf down the tree */
8236     s.bl_count[bits+1] += 2; /* move one overflow item as its brother */
8237     s.bl_count[max_length]--;
8238     /* The brother of the overflow item also moves one step up,
8239      * but this does not affect bl_count[max_length]
8240      */
8241     overflow -= 2;
8242   } while (overflow > 0);
8243
8244   /* Now recompute all bit lengths, scanning in increasing frequency.
8245    * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
8246    * lengths instead of fixing only the wrong ones. This idea is taken
8247    * from 'ar' written by Haruhiko Okumura.)
8248    */
8249   for (bits = max_length; bits !== 0; bits--) {
8250     n = s.bl_count[bits];
8251     while (n !== 0) {
8252       m = s.heap[--h];
8253       if (m > max_code) { continue; }
8254       if (tree[m*2 + 1]/*.Len*/ !== bits) {
8255         // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
8256         s.opt_len += (bits - tree[m*2 + 1]/*.Len*/)*tree[m*2]/*.Freq*/;
8257         tree[m*2 + 1]/*.Len*/ = bits;
8258       }
8259       n--;
8260     }
8261   }
8262 }
8263
8264
8265 /* ===========================================================================
8266  * Generate the codes for a given tree and bit counts (which need not be
8267  * optimal).
8268  * IN assertion: the array bl_count contains the bit length statistics for
8269  * the given tree and the field len is set for all tree elements.
8270  * OUT assertion: the field code is set for all tree elements of non
8271  *     zero code length.
8272  */
8273 function gen_codes(tree, max_code, bl_count)
8274 //    ct_data *tree;             /* the tree to decorate */
8275 //    int max_code;              /* largest code with non zero frequency */
8276 //    ushf *bl_count;            /* number of codes at each bit length */
8277 {
8278   var next_code = new Array(MAX_BITS+1); /* next code value for each bit length */
8279   var code = 0;              /* running code value */
8280   var bits;                  /* bit index */
8281   var n;                     /* code index */
8282
8283   /* The distribution counts are first used to generate the code values
8284    * without bit reversal.
8285    */
8286   for (bits = 1; bits <= MAX_BITS; bits++) {
8287     next_code[bits] = code = (code + bl_count[bits-1]) << 1;
8288   }
8289   /* Check that the bit counts in bl_count are consistent. The last code
8290    * must be all ones.
8291    */
8292   //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
8293   //        "inconsistent bit counts");
8294   //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
8295
8296   for (n = 0;  n <= max_code; n++) {
8297     var len = tree[n*2 + 1]/*.Len*/;
8298     if (len === 0) { continue; }
8299     /* Now reverse the bits */
8300     tree[n*2]/*.Code*/ = bi_reverse(next_code[len]++, len);
8301
8302     //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
8303     //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
8304   }
8305 }
8306
8307
8308 /* ===========================================================================
8309  * Initialize the various 'constant' tables.
8310  */
8311 function tr_static_init() {
8312   var n;        /* iterates over tree elements */
8313   var bits;     /* bit counter */
8314   var length;   /* length value */
8315   var code;     /* code value */
8316   var dist;     /* distance index */
8317   var bl_count = new Array(MAX_BITS+1);
8318   /* number of codes at each bit length for an optimal tree */
8319
8320   // do check in _tr_init()
8321   //if (static_init_done) return;
8322
8323   /* For some embedded targets, global variables are not initialized: */
8324 /*#ifdef NO_INIT_GLOBAL_POINTERS
8325   static_l_desc.static_tree = static_ltree;
8326   static_l_desc.extra_bits = extra_lbits;
8327   static_d_desc.static_tree = static_dtree;
8328   static_d_desc.extra_bits = extra_dbits;
8329   static_bl_desc.extra_bits = extra_blbits;
8330 #endif*/
8331
8332   /* Initialize the mapping length (0..255) -> length code (0..28) */
8333   length = 0;
8334   for (code = 0; code < LENGTH_CODES-1; code++) {
8335     base_length[code] = length;
8336     for (n = 0; n < (1<<extra_lbits[code]); n++) {
8337       _length_code[length++] = code;
8338     }
8339   }
8340   //Assert (length == 256, "tr_static_init: length != 256");
8341   /* Note that the length 255 (match length 258) can be represented
8342    * in two different ways: code 284 + 5 bits or code 285, so we
8343    * overwrite length_code[255] to use the best encoding:
8344    */
8345   _length_code[length-1] = code;
8346
8347   /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
8348   dist = 0;
8349   for (code = 0 ; code < 16; code++) {
8350     base_dist[code] = dist;
8351     for (n = 0; n < (1<<extra_dbits[code]); n++) {
8352       _dist_code[dist++] = code;
8353     }
8354   }
8355   //Assert (dist == 256, "tr_static_init: dist != 256");
8356   dist >>= 7; /* from now on, all distances are divided by 128 */
8357   for ( ; code < D_CODES; code++) {
8358     base_dist[code] = dist << 7;
8359     for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
8360       _dist_code[256 + dist++] = code;
8361     }
8362   }
8363   //Assert (dist == 256, "tr_static_init: 256+dist != 512");
8364
8365   /* Construct the codes of the static literal tree */
8366   for (bits = 0; bits <= MAX_BITS; bits++) {
8367     bl_count[bits] = 0;
8368   }
8369
8370   n = 0;
8371   while (n <= 143) {
8372     static_ltree[n*2 + 1]/*.Len*/ = 8;
8373     n++;
8374     bl_count[8]++;
8375   }
8376   while (n <= 255) {
8377     static_ltree[n*2 + 1]/*.Len*/ = 9;
8378     n++;
8379     bl_count[9]++;
8380   }
8381   while (n <= 279) {
8382     static_ltree[n*2 + 1]/*.Len*/ = 7;
8383     n++;
8384     bl_count[7]++;
8385   }
8386   while (n <= 287) {
8387     static_ltree[n*2 + 1]/*.Len*/ = 8;
8388     n++;
8389     bl_count[8]++;
8390   }
8391   /* Codes 286 and 287 do not exist, but we must include them in the
8392    * tree construction to get a canonical Huffman tree (longest code
8393    * all ones)
8394    */
8395   gen_codes(static_ltree, L_CODES+1, bl_count);
8396
8397   /* The static distance tree is trivial: */
8398   for (n = 0; n < D_CODES; n++) {
8399     static_dtree[n*2 + 1]/*.Len*/ = 5;
8400     static_dtree[n*2]/*.Code*/ = bi_reverse(n, 5);
8401   }
8402
8403   // Now data ready and we can init static trees
8404   static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS);
8405   static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);
8406   static_bl_desc =new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);
8407
8408   //static_init_done = true;
8409 }
8410
8411
8412 /* ===========================================================================
8413  * Initialize a new block.
8414  */
8415 function init_block(s) {
8416   var n; /* iterates over tree elements */
8417
8418   /* Initialize the trees. */
8419   for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n*2]/*.Freq*/ = 0; }
8420   for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n*2]/*.Freq*/ = 0; }
8421   for (n = 0; n < BL_CODES; n++) { s.bl_tree[n*2]/*.Freq*/ = 0; }
8422
8423   s.dyn_ltree[END_BLOCK*2]/*.Freq*/ = 1;
8424   s.opt_len = s.static_len = 0;
8425   s.last_lit = s.matches = 0;
8426 }
8427
8428
8429 /* ===========================================================================
8430  * Flush the bit buffer and align the output on a byte boundary
8431  */
8432 function bi_windup(s)
8433 {
8434   if (s.bi_valid > 8) {
8435     put_short(s, s.bi_buf);
8436   } else if (s.bi_valid > 0) {
8437     //put_byte(s, (Byte)s->bi_buf);
8438     s.pending_buf[s.pending++] = s.bi_buf;
8439   }
8440   s.bi_buf = 0;
8441   s.bi_valid = 0;
8442 }
8443
8444 /* ===========================================================================
8445  * Copy a stored block, storing first the length and its
8446  * one's complement if requested.
8447  */
8448 function copy_block(s, buf, len, header)
8449 //DeflateState *s;
8450 //charf    *buf;    /* the input data */
8451 //unsigned len;     /* its length */
8452 //int      header;  /* true if block header must be written */
8453 {
8454   bi_windup(s);        /* align on byte boundary */
8455
8456   if (header) {
8457     put_short(s, len);
8458     put_short(s, ~len);
8459   }
8460 //  while (len--) {
8461 //    put_byte(s, *buf++);
8462 //  }
8463   utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
8464   s.pending += len;
8465 }
8466
8467 /* ===========================================================================
8468  * Compares to subtrees, using the tree depth as tie breaker when
8469  * the subtrees have equal frequency. This minimizes the worst case length.
8470  */
8471 function smaller(tree, n, m, depth) {
8472   var _n2 = n*2;
8473   var _m2 = m*2;
8474   return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
8475          (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
8476 }
8477
8478 /* ===========================================================================
8479  * Restore the heap property by moving down the tree starting at node k,
8480  * exchanging a node with the smallest of its two sons if necessary, stopping
8481  * when the heap property is re-established (each father smaller than its
8482  * two sons).
8483  */
8484 function pqdownheap(s, tree, k)
8485 //    deflate_state *s;
8486 //    ct_data *tree;  /* the tree to restore */
8487 //    int k;               /* node to move down */
8488 {
8489   var v = s.heap[k];
8490   var j = k << 1;  /* left son of k */
8491   while (j <= s.heap_len) {
8492     /* Set j to the smallest of the two sons: */
8493     if (j < s.heap_len &&
8494       smaller(tree, s.heap[j+1], s.heap[j], s.depth)) {
8495       j++;
8496     }
8497     /* Exit if v is smaller than both sons */
8498     if (smaller(tree, v, s.heap[j], s.depth)) { break; }
8499
8500     /* Exchange v with the smallest son */
8501     s.heap[k] = s.heap[j];
8502     k = j;
8503
8504     /* And continue down the tree, setting j to the left son of k */
8505     j <<= 1;
8506   }
8507   s.heap[k] = v;
8508 }
8509
8510
8511 // inlined manually
8512 // var SMALLEST = 1;
8513
8514 /* ===========================================================================
8515  * Send the block data compressed using the given Huffman trees
8516  */
8517 function compress_block(s, ltree, dtree)
8518 //    deflate_state *s;
8519 //    const ct_data *ltree; /* literal tree */
8520 //    const ct_data *dtree; /* distance tree */
8521 {
8522   var dist;           /* distance of matched string */
8523   var lc;             /* match length or unmatched char (if dist == 0) */
8524   var lx = 0;         /* running index in l_buf */
8525   var code;           /* the code to send */
8526   var extra;          /* number of extra bits to send */
8527
8528   if (s.last_lit !== 0) {
8529     do {
8530       dist = (s.pending_buf[s.d_buf + lx*2] << 8) | (s.pending_buf[s.d_buf + lx*2 + 1]);
8531       lc = s.pending_buf[s.l_buf + lx];
8532       lx++;
8533
8534       if (dist === 0) {
8535         send_code(s, lc, ltree); /* send a literal byte */
8536         //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
8537       } else {
8538         /* Here, lc is the match length - MIN_MATCH */
8539         code = _length_code[lc];
8540         send_code(s, code+LITERALS+1, ltree); /* send the length code */
8541         extra = extra_lbits[code];
8542         if (extra !== 0) {
8543           lc -= base_length[code];
8544           send_bits(s, lc, extra);       /* send the extra length bits */
8545         }
8546         dist--; /* dist is now the match distance - 1 */
8547         code = d_code(dist);
8548         //Assert (code < D_CODES, "bad d_code");
8549
8550         send_code(s, code, dtree);       /* send the distance code */
8551         extra = extra_dbits[code];
8552         if (extra !== 0) {
8553           dist -= base_dist[code];
8554           send_bits(s, dist, extra);   /* send the extra distance bits */
8555         }
8556       } /* literal or match pair ? */
8557
8558       /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
8559       //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
8560       //       "pendingBuf overflow");
8561
8562     } while (lx < s.last_lit);
8563   }
8564
8565   send_code(s, END_BLOCK, ltree);
8566 }
8567
8568
8569 /* ===========================================================================
8570  * Construct one Huffman tree and assigns the code bit strings and lengths.
8571  * Update the total bit length for the current block.
8572  * IN assertion: the field freq is set for all tree elements.
8573  * OUT assertions: the fields len and code are set to the optimal bit length
8574  *     and corresponding code. The length opt_len is updated; static_len is
8575  *     also updated if stree is not null. The field max_code is set.
8576  */
8577 function build_tree(s, desc)
8578 //    deflate_state *s;
8579 //    tree_desc *desc; /* the tree descriptor */
8580 {
8581   var tree     = desc.dyn_tree;
8582   var stree    = desc.stat_desc.static_tree;
8583   var has_stree = desc.stat_desc.has_stree;
8584   var elems    = desc.stat_desc.elems;
8585   var n, m;          /* iterate over heap elements */
8586   var max_code = -1; /* largest code with non zero frequency */
8587   var node;          /* new node being created */
8588
8589   /* Construct the initial heap, with least frequent element in
8590    * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
8591    * heap[0] is not used.
8592    */
8593   s.heap_len = 0;
8594   s.heap_max = HEAP_SIZE;
8595
8596   for (n = 0; n < elems; n++) {
8597     if (tree[n * 2]/*.Freq*/ !== 0) {
8598       s.heap[++s.heap_len] = max_code = n;
8599       s.depth[n] = 0;
8600
8601     } else {
8602       tree[n*2 + 1]/*.Len*/ = 0;
8603     }
8604   }
8605
8606   /* The pkzip format requires that at least one distance code exists,
8607    * and that at least one bit should be sent even if there is only one
8608    * possible code. So to avoid special checks later on we force at least
8609    * two codes of non zero frequency.
8610    */
8611   while (s.heap_len < 2) {
8612     node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
8613     tree[node * 2]/*.Freq*/ = 1;
8614     s.depth[node] = 0;
8615     s.opt_len--;
8616
8617     if (has_stree) {
8618       s.static_len -= stree[node*2 + 1]/*.Len*/;
8619     }
8620     /* node is 0 or 1 so it does not have extra bits */
8621   }
8622   desc.max_code = max_code;
8623
8624   /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
8625    * establish sub-heaps of increasing lengths:
8626    */
8627   for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
8628
8629   /* Construct the Huffman tree by repeatedly combining the least two
8630    * frequent nodes.
8631    */
8632   node = elems;              /* next internal node of the tree */
8633   do {
8634     //pqremove(s, tree, n);  /* n = node of least frequency */
8635     /*** pqremove ***/
8636     n = s.heap[1/*SMALLEST*/];
8637     s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
8638     pqdownheap(s, tree, 1/*SMALLEST*/);
8639     /***/
8640
8641     m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
8642
8643     s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
8644     s.heap[--s.heap_max] = m;
8645
8646     /* Create a new node father of n and m */
8647     tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
8648     s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
8649     tree[n*2 + 1]/*.Dad*/ = tree[m*2 + 1]/*.Dad*/ = node;
8650
8651     /* and insert the new node in the heap */
8652     s.heap[1/*SMALLEST*/] = node++;
8653     pqdownheap(s, tree, 1/*SMALLEST*/);
8654
8655   } while (s.heap_len >= 2);
8656
8657   s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
8658
8659   /* At this point, the fields freq and dad are set. We can now
8660    * generate the bit lengths.
8661    */
8662   gen_bitlen(s, desc);
8663
8664   /* The field len is now set, we can generate the bit codes */
8665   gen_codes(tree, max_code, s.bl_count);
8666 }
8667
8668
8669 /* ===========================================================================
8670  * Scan a literal or distance tree to determine the frequencies of the codes
8671  * in the bit length tree.
8672  */
8673 function scan_tree(s, tree, max_code)
8674 //    deflate_state *s;
8675 //    ct_data *tree;   /* the tree to be scanned */
8676 //    int max_code;    /* and its largest code of non zero frequency */
8677 {
8678   var n;                     /* iterates over all tree elements */
8679   var prevlen = -1;          /* last emitted length */
8680   var curlen;                /* length of current code */
8681
8682   var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */
8683
8684   var count = 0;             /* repeat count of the current code */
8685   var max_count = 7;         /* max repeat count */
8686   var min_count = 4;         /* min repeat count */
8687
8688   if (nextlen === 0) {
8689     max_count = 138;
8690     min_count = 3;
8691   }
8692   tree[(max_code+1)*2 + 1]/*.Len*/ = 0xffff; /* guard */
8693
8694   for (n = 0; n <= max_code; n++) {
8695     curlen = nextlen;
8696     nextlen = tree[(n+1)*2 + 1]/*.Len*/;
8697
8698     if (++count < max_count && curlen === nextlen) {
8699       continue;
8700
8701     } else if (count < min_count) {
8702       s.bl_tree[curlen * 2]/*.Freq*/ += count;
8703
8704     } else if (curlen !== 0) {
8705
8706       if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
8707       s.bl_tree[REP_3_6*2]/*.Freq*/++;
8708
8709     } else if (count <= 10) {
8710       s.bl_tree[REPZ_3_10*2]/*.Freq*/++;
8711
8712     } else {
8713       s.bl_tree[REPZ_11_138*2]/*.Freq*/++;
8714     }
8715
8716     count = 0;
8717     prevlen = curlen;
8718
8719     if (nextlen === 0) {
8720       max_count = 138;
8721       min_count = 3;
8722
8723     } else if (curlen === nextlen) {
8724       max_count = 6;
8725       min_count = 3;
8726
8727     } else {
8728       max_count = 7;
8729       min_count = 4;
8730     }
8731   }
8732 }
8733
8734
8735 /* ===========================================================================
8736  * Send a literal or distance tree in compressed form, using the codes in
8737  * bl_tree.
8738  */
8739 function send_tree(s, tree, max_code)
8740 //    deflate_state *s;
8741 //    ct_data *tree; /* the tree to be scanned */
8742 //    int max_code;       /* and its largest code of non zero frequency */
8743 {
8744   var n;                     /* iterates over all tree elements */
8745   var prevlen = -1;          /* last emitted length */
8746   var curlen;                /* length of current code */
8747
8748   var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */
8749
8750   var count = 0;             /* repeat count of the current code */
8751   var max_count = 7;         /* max repeat count */
8752   var min_count = 4;         /* min repeat count */
8753
8754   /* tree[max_code+1].Len = -1; */  /* guard already set */
8755   if (nextlen === 0) {
8756     max_count = 138;
8757     min_count = 3;
8758   }
8759
8760   for (n = 0; n <= max_code; n++) {
8761     curlen = nextlen;
8762     nextlen = tree[(n+1)*2 + 1]/*.Len*/;
8763
8764     if (++count < max_count && curlen === nextlen) {
8765       continue;
8766
8767     } else if (count < min_count) {
8768       do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
8769
8770     } else if (curlen !== 0) {
8771       if (curlen !== prevlen) {
8772         send_code(s, curlen, s.bl_tree);
8773         count--;
8774       }
8775       //Assert(count >= 3 && count <= 6, " 3_6?");
8776       send_code(s, REP_3_6, s.bl_tree);
8777       send_bits(s, count-3, 2);
8778
8779     } else if (count <= 10) {
8780       send_code(s, REPZ_3_10, s.bl_tree);
8781       send_bits(s, count-3, 3);
8782
8783     } else {
8784       send_code(s, REPZ_11_138, s.bl_tree);
8785       send_bits(s, count-11, 7);
8786     }
8787
8788     count = 0;
8789     prevlen = curlen;
8790     if (nextlen === 0) {
8791       max_count = 138;
8792       min_count = 3;
8793
8794     } else if (curlen === nextlen) {
8795       max_count = 6;
8796       min_count = 3;
8797
8798     } else {
8799       max_count = 7;
8800       min_count = 4;
8801     }
8802   }
8803 }
8804
8805
8806 /* ===========================================================================
8807  * Construct the Huffman tree for the bit lengths and return the index in
8808  * bl_order of the last bit length code to send.
8809  */
8810 function build_bl_tree(s) {
8811   var max_blindex;  /* index of last bit length code of non zero freq */
8812
8813   /* Determine the bit length frequencies for literal and distance trees */
8814   scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
8815   scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
8816
8817   /* Build the bit length tree: */
8818   build_tree(s, s.bl_desc);
8819   /* opt_len now includes the length of the tree representations, except
8820    * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
8821    */
8822
8823   /* Determine the number of bit length codes to send. The pkzip format
8824    * requires that at least 4 bit length codes be sent. (appnote.txt says
8825    * 3 but the actual value used is 4.)
8826    */
8827   for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
8828     if (s.bl_tree[bl_order[max_blindex]*2 + 1]/*.Len*/ !== 0) {
8829       break;
8830     }
8831   }
8832   /* Update opt_len to include the bit length tree and counts */
8833   s.opt_len += 3*(max_blindex+1) + 5+5+4;
8834   //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
8835   //        s->opt_len, s->static_len));
8836
8837   return max_blindex;
8838 }
8839
8840
8841 /* ===========================================================================
8842  * Send the header for a block using dynamic Huffman trees: the counts, the
8843  * lengths of the bit length codes, the literal tree and the distance tree.
8844  * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
8845  */
8846 function send_all_trees(s, lcodes, dcodes, blcodes)
8847 //    deflate_state *s;
8848 //    int lcodes, dcodes, blcodes; /* number of codes for each tree */
8849 {
8850   var rank;                    /* index in bl_order */
8851
8852   //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
8853   //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
8854   //        "too many codes");
8855   //Tracev((stderr, "\nbl counts: "));
8856   send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
8857   send_bits(s, dcodes-1,   5);
8858   send_bits(s, blcodes-4,  4); /* not -3 as stated in appnote.txt */
8859   for (rank = 0; rank < blcodes; rank++) {
8860     //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
8861     send_bits(s, s.bl_tree[bl_order[rank]*2 + 1]/*.Len*/, 3);
8862   }
8863   //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
8864
8865   send_tree(s, s.dyn_ltree, lcodes-1); /* literal tree */
8866   //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
8867
8868   send_tree(s, s.dyn_dtree, dcodes-1); /* distance tree */
8869   //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
8870 }
8871
8872
8873 /* ===========================================================================
8874  * Check if the data type is TEXT or BINARY, using the following algorithm:
8875  * - TEXT if the two conditions below are satisfied:
8876  *    a) There are no non-portable control characters belonging to the
8877  *       "black list" (0..6, 14..25, 28..31).
8878  *    b) There is at least one printable character belonging to the
8879  *       "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
8880  * - BINARY otherwise.
8881  * - The following partially-portable control characters form a
8882  *   "gray list" that is ignored in this detection algorithm:
8883  *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
8884  * IN assertion: the fields Freq of dyn_ltree are set.
8885  */
8886 function detect_data_type(s) {
8887   /* black_mask is the bit mask of black-listed bytes
8888    * set bits 0..6, 14..25, and 28..31
8889    * 0xf3ffc07f = binary 11110011111111111100000001111111
8890    */
8891   var black_mask = 0xf3ffc07f;
8892   var n;
8893
8894   /* Check for non-textual ("black-listed") bytes. */
8895   for (n = 0; n <= 31; n++, black_mask >>>= 1) {
8896     if ((black_mask & 1) && (s.dyn_ltree[n*2]/*.Freq*/ !== 0)) {
8897       return Z_BINARY;
8898     }
8899   }
8900
8901   /* Check for textual ("white-listed") bytes. */
8902   if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
8903       s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
8904     return Z_TEXT;
8905   }
8906   for (n = 32; n < LITERALS; n++) {
8907     if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
8908       return Z_TEXT;
8909     }
8910   }
8911
8912   /* There are no "black-listed" or "white-listed" bytes:
8913    * this stream either is empty or has tolerated ("gray-listed") bytes only.
8914    */
8915   return Z_BINARY;
8916 }
8917
8918
8919 var static_init_done = false;
8920
8921 /* ===========================================================================
8922  * Initialize the tree data structures for a new zlib stream.
8923  */
8924 function _tr_init(s)
8925 {
8926
8927   if (!static_init_done) {
8928     tr_static_init();
8929     static_init_done = true;
8930   }
8931
8932   s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);
8933   s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);
8934   s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
8935
8936   s.bi_buf = 0;
8937   s.bi_valid = 0;
8938
8939   /* Initialize the first block of the first file: */
8940   init_block(s);
8941 }
8942
8943
8944 /* ===========================================================================
8945  * Send a stored block
8946  */
8947 function _tr_stored_block(s, buf, stored_len, last)
8948 //DeflateState *s;
8949 //charf *buf;       /* input block */
8950 //ulg stored_len;   /* length of input block */
8951 //int last;         /* one if this is the last block for a file */
8952 {
8953   send_bits(s, (STORED_BLOCK<<1)+(last ? 1 : 0), 3);    /* send block type */
8954   copy_block(s, buf, stored_len, true); /* with header */
8955 }
8956
8957
8958 /* ===========================================================================
8959  * Send one empty static block to give enough lookahead for inflate.
8960  * This takes 10 bits, of which 7 may remain in the bit buffer.
8961  */
8962 function _tr_align(s) {
8963   send_bits(s, STATIC_TREES<<1, 3);
8964   send_code(s, END_BLOCK, static_ltree);
8965   bi_flush(s);
8966 }
8967
8968
8969 /* ===========================================================================
8970  * Determine the best encoding for the current block: dynamic trees, static
8971  * trees or store, and output the encoded block to the zip file.
8972  */
8973 function _tr_flush_block(s, buf, stored_len, last)
8974 //DeflateState *s;
8975 //charf *buf;       /* input block, or NULL if too old */
8976 //ulg stored_len;   /* length of input block */
8977 //int last;         /* one if this is the last block for a file */
8978 {
8979   var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */
8980   var max_blindex = 0;        /* index of last bit length code of non zero freq */
8981
8982   /* Build the Huffman trees unless a stored block is forced */
8983   if (s.level > 0) {
8984
8985     /* Check if the file is binary or text */
8986     if (s.strm.data_type === Z_UNKNOWN) {
8987       s.strm.data_type = detect_data_type(s);
8988     }
8989
8990     /* Construct the literal and distance trees */
8991     build_tree(s, s.l_desc);
8992     // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
8993     //        s->static_len));
8994
8995     build_tree(s, s.d_desc);
8996     // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
8997     //        s->static_len));
8998     /* At this point, opt_len and static_len are the total bit lengths of
8999      * the compressed block data, excluding the tree representations.
9000      */
9001
9002     /* Build the bit length tree for the above two trees, and get the index
9003      * in bl_order of the last bit length code to send.
9004      */
9005     max_blindex = build_bl_tree(s);
9006
9007     /* Determine the best encoding. Compute the block lengths in bytes. */
9008     opt_lenb = (s.opt_len+3+7) >>> 3;
9009     static_lenb = (s.static_len+3+7) >>> 3;
9010
9011     // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
9012     //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
9013     //        s->last_lit));
9014
9015     if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
9016
9017   } else {
9018     // Assert(buf != (char*)0, "lost buf");
9019     opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
9020   }
9021
9022   if ((stored_len+4 <= opt_lenb) && (buf !== -1)) {
9023     /* 4: two words for the lengths */
9024
9025     /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
9026      * Otherwise we can't have processed more than WSIZE input bytes since
9027      * the last block flush, because compression would have been
9028      * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
9029      * transform a block into a stored block.
9030      */
9031     _tr_stored_block(s, buf, stored_len, last);
9032
9033   } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
9034
9035     send_bits(s, (STATIC_TREES<<1) + (last ? 1 : 0), 3);
9036     compress_block(s, static_ltree, static_dtree);
9037
9038   } else {
9039     send_bits(s, (DYN_TREES<<1) + (last ? 1 : 0), 3);
9040     send_all_trees(s, s.l_desc.max_code+1, s.d_desc.max_code+1, max_blindex+1);
9041     compress_block(s, s.dyn_ltree, s.dyn_dtree);
9042   }
9043   // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
9044   /* The above check is made mod 2^32, for files larger than 512 MB
9045    * and uLong implemented on 32 bits.
9046    */
9047   init_block(s);
9048
9049   if (last) {
9050     bi_windup(s);
9051   }
9052   // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
9053   //       s->compressed_len-7*last));
9054 }
9055
9056 /* ===========================================================================
9057  * Save the match info and tally the frequency counts. Return true if
9058  * the current block must be flushed.
9059  */
9060 function _tr_tally(s, dist, lc)
9061 //    deflate_state *s;
9062 //    unsigned dist;  /* distance of matched string */
9063 //    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
9064 {
9065   //var out_length, in_length, dcode;
9066
9067   s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;
9068   s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
9069
9070   s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
9071   s.last_lit++;
9072
9073   if (dist === 0) {
9074     /* lc is the unmatched char */
9075     s.dyn_ltree[lc*2]/*.Freq*/++;
9076   } else {
9077     s.matches++;
9078     /* Here, lc is the match length - MIN_MATCH */
9079     dist--;             /* dist = match distance - 1 */
9080     //Assert((ush)dist < (ush)MAX_DIST(s) &&
9081     //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
9082     //       (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
9083
9084     s.dyn_ltree[(_length_code[lc]+LITERALS+1) * 2]/*.Freq*/++;
9085     s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
9086   }
9087
9088 // (!) This block is disabled in zlib defailts,
9089 // don't enable it for binary compatibility
9090
9091 //#ifdef TRUNCATE_BLOCK
9092 //  /* Try to guess if it is profitable to stop the current block here */
9093 //  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
9094 //    /* Compute an upper bound for the compressed length */
9095 //    out_length = s.last_lit*8;
9096 //    in_length = s.strstart - s.block_start;
9097 //
9098 //    for (dcode = 0; dcode < D_CODES; dcode++) {
9099 //      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
9100 //    }
9101 //    out_length >>>= 3;
9102 //    //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
9103 //    //       s->last_lit, in_length, out_length,
9104 //    //       100L - out_length*100L/in_length));
9105 //    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
9106 //      return true;
9107 //    }
9108 //  }
9109 //#endif
9110
9111   return (s.last_lit === s.lit_bufsize-1);
9112   /* We avoid equality with lit_bufsize because of wraparound at 64K
9113    * on 16 bit machines and because stored blocks are restricted to
9114    * 64K-1 bytes.
9115    */
9116 }
9117
9118 exports._tr_init  = _tr_init;
9119 exports._tr_stored_block = _tr_stored_block;
9120 exports._tr_flush_block  = _tr_flush_block;
9121 exports._tr_tally = _tr_tally;
9122 exports._tr_align = _tr_align;
9123 },{"../utils/common":27}],39:[function(_dereq_,module,exports){
9124 'use strict';
9125
9126
9127 function ZStream() {
9128   /* next input byte */
9129   this.input = null; // JS specific, because we have no pointers
9130   this.next_in = 0;
9131   /* number of bytes available at input */
9132   this.avail_in = 0;
9133   /* total number of input bytes read so far */
9134   this.total_in = 0;
9135   /* next output byte should be put there */
9136   this.output = null; // JS specific, because we have no pointers
9137   this.next_out = 0;
9138   /* remaining free space at output */
9139   this.avail_out = 0;
9140   /* total number of bytes output so far */
9141   this.total_out = 0;
9142   /* last error message, NULL if no error */
9143   this.msg = ''/*Z_NULL*/;
9144   /* not visible by applications */
9145   this.state = null;
9146   /* best guess about the data type: binary or text */
9147   this.data_type = 2/*Z_UNKNOWN*/;
9148   /* adler32 value of the uncompressed data */
9149   this.adler = 0;
9150 }
9151
9152 module.exports = ZStream;
9153 },{}]},{},[9])
9154 (9)
9155 });