mirror of
				https://github.com/Ylianst/MeshCentral.git
				synced 2025-03-09 15:40:18 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1950 lines
		
	
	
	
		
			88 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			1950 lines
		
	
	
	
		
			88 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* zlib-inflate.js -- JavaScript implementation for the zlib inflate.
 | |
|   Version: 0.2.0
 | |
|   LastModified: Apr 12 2012
 | |
|   Copyright (C) 2012 Masanao Izumo <iz@onicos.co.jp>
 | |
| 
 | |
|   This library is one of the JavaScript zlib implementation.
 | |
|   Some API's are modified from the original.
 | |
|   Only inflate API is implemented.
 | |
| 
 | |
|   The original copyright notice (zlib 1.2.6):
 | |
| 
 | |
|   Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler
 | |
| 
 | |
|   This software is provided 'as-is', without any express or implied
 | |
|   warranty.  In no event will the authors be held liable for any damages
 | |
|   arising from the use of this software.
 | |
| 
 | |
|   Permission is granted to anyone to use this software for any purpose,
 | |
|   including commercial applications, and to alter it and redistribute it
 | |
|   freely, subject to the following restrictions:
 | |
| 
 | |
|   1. The origin of this software must not be misrepresented; you must not
 | |
|      claim that you wrote the original software. If you use this software
 | |
|      in a product, an acknowledgment in the product documentation would be
 | |
|      appreciated but is not required.
 | |
|   2. Altered source versions must be plainly marked as such, and must not be
 | |
|      misrepresented as being the original software.
 | |
|   3. This notice may not be removed or altered from any source distribution.
 | |
| 
 | |
|   Jean-loup Gailly        Mark Adler
 | |
|   jloup@gzip.org          madler@alumni.caltech.edu
 | |
| 
 | |
| 
 | |
|   The data format used by the zlib library is described by RFCs (Request for
 | |
|   Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950
 | |
|   (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).
 | |
| */
 | |
| 
 | |
| /*
 | |
|                        API documentation
 | |
| ==============================================================================
 | |
| Usage: z_stream = ZLIB.inflateInit([windowBits]);
 | |
| 
 | |
|      Create the stream object for decompression.
 | |
|      See zlib.h for windowBits information.
 | |
| 
 | |
| ==============================================================================
 | |
| Usage: decoded_string = z_stream.inflate(encoded_string [, {OPTIONS...}]);
 | |
| 
 | |
| OPTIONS:
 | |
|     next_in: decode start offset for encoded_string.
 | |
| 
 | |
|     avail_in: // TODO document.  See zlib.h for the information.
 | |
| 
 | |
|     avail_out: // TODO document.  See zlib.h for the information.
 | |
| 
 | |
|     flush: // TODO document.  See zlib.h for the information.
 | |
| 
 | |
| Ex: decoded_string = z_stream.inflate(encoded_string);
 | |
|     decoded_string = z_stream.inflate(encoded_string,
 | |
|                          {next_in: 0,
 | |
|                           avail_in: encoded_string.length,
 | |
|                           avail_out: 1024,
 | |
|                           flush: ZLIB.Z_NO_FLUSH});
 | |
| 
 | |
|      See zlib.h for more information.
 | |
| 
 | |
| ==============================================================================
 | |
| Usage: z_stream.inflateReset();
 | |
|     TODO document
 | |
| 
 | |
| */
 | |
| 
 | |
| if( typeof ZLIB === 'undefined' ) {
 | |
|     alert('ZLIB is not defined.  SRC zlib.js before zlib-inflate.js')
 | |
| }
 | |
| 
 | |
| (function() {
 | |
| 
 | |
| /* inflate.c -- zlib decompression
 | |
|  * Copyright (C) 1995-2011 Mark Adler
 | |
|  * For conditions of distribution and use, see copyright notice in zlib.h
 | |
|  */
 | |
| 
 | |
| var DEF_WBITS = 15;
 | |
| 
 | |
| // inflate_mode
 | |
| var HEAD     =  0; /* i: waiting for magic header */
 | |
| var FLAGS    =  1; /* i: waiting for method and flags (gzip) */
 | |
| var TIME     =  2; /* i: waiting for modification time (gzip) */
 | |
| var OS       =  3; /* i: waiting for extra flags and operating system (gzip) */
 | |
| var EXLEN    =  4; /* i: waiting for extra length (gzip) */
 | |
| var EXTRA    =  5; /* i: waiting for extra bytes (gzip) */
 | |
| var NAME     =  6; /* i: waiting for end of file name (gzip) */
 | |
| var COMMENT  =  7; /* i: waiting for end of comment (gzip) */
 | |
| var HCRC     =  8; /* i: waiting for header crc (gzip) */
 | |
| var DICTID   =  9; /* i: waiting for dictionary check value */
 | |
| var DICT     = 10; /* waiting for inflateSetDictionary() call */
 | |
| var TYPE     = 11; /* i: waiting for type bits, including last-flag bit */
 | |
| var TYPEDO   = 12; /* i: same, but skip check to exit inflate on new block */
 | |
| var STORED   = 13; /* i: waiting for stored size (length and complement) */
 | |
| var COPY_    = 14; /* i/o: same as COPY below, but only first time in */
 | |
| var COPY     = 15; /* i/o: waiting for input or output to copy stored block */
 | |
| var TABLE    = 16; /* i: waiting for dynamic block table lengths */
 | |
| var LENLENS  = 17; /* i: waiting for code length code lengths */
 | |
| var CODELENS = 18; /* i: waiting for length/lit and distance code lengths */
 | |
| var LEN_     = 19; /* i: same as LEN below, but only first time in */
 | |
| var LEN      = 20; /* i: waiting for length/lit/eob code */
 | |
| var LENEXT   = 21; /* i: waiting for length extra bits */
 | |
| var DIST     = 22; /* i: waiting for distance code */
 | |
| var DISTEXT  = 23; /* i: waiting for distance extra bits */
 | |
| var MATCH    = 24; /* o: waiting for output space to copy string */
 | |
| var LIT      = 25; /* o: waiting for output space to write literal */
 | |
| var CHECK    = 26; /* i: waiting for 32-bit check value */
 | |
| var LENGTH   = 27; /* i: waiting for 32-bit length (gzip) */
 | |
| var DONE     = 28; /* finished check, done -- remain here until reset */
 | |
| var BAD      = 29; /* got a data error -- remain here until reset */
 | |
| var MEM      = 30; /* got an inflate() memory error -- remain here until reset */
 | |
| var SYNC     = 31; /* looking for synchronization bytes to restart inflate() */
 | |
| 
 | |
| /* Maximum size of the dynamic table.  The maximum number of code structures is
 | |
|    1444, which is the sum of 852 for literal/length codes and 592 for distance
 | |
|    codes.  These values were found by exhaustive searches using the program
 | |
|    examples/enough.c found in the zlib distribtution.  The arguments to that
 | |
|    program are the number of symbols, the initial root table size, and the
 | |
|    maximum bit length of a code.  "enough 286 9 15" for literal/length codes
 | |
|    returns returns 852, and "enough 30 6 15" for distance codes returns 592.
 | |
|    The initial root table size (9 or 6) is found in the fifth argument of the
 | |
|    inflate_table() calls in inflate.c and infback.c.  If the root table size is
 | |
|    changed, then these maximum sizes would be need to be recalculated and
 | |
|    updated. */
 | |
| var ENOUGH_LENS = 852;
 | |
| var ENOUGH_DISTS = 592;
 | |
| var ENOUGH = (ENOUGH_LENS + ENOUGH_DISTS);
 | |
| 
 | |
| /* Type of code to build for inflate_table() */
 | |
| var CODES = 0;
 | |
| var LENS = 1;
 | |
| var DISTS = 2;
 | |
| 
 | |
| 
 | |
| 
 | |
| var inflate_table_lbase = [ /* Length codes 257..285 base */
 | |
|     3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
 | |
|     35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0];
 | |
| var inflate_table_lext = [ /* Length codes 257..285 extra */
 | |
|     16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
 | |
|     19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 69];
 | |
| var inflate_table_dbase = [ /* Distance codes 0..29 base */
 | |
|     1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
 | |
|     257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
 | |
|     8193, 12289, 16385, 24577, 0, 0];
 | |
| var inflate_table_dext = [ /* Distance codes 0..29 extra */
 | |
|     16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
 | |
|     23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
 | |
|     28, 28, 29, 29, 64, 64];
 | |
| 
 | |
| /* inftrees.c -- generate Huffman trees for efficient decoding
 | |
|  * Copyright (C) 1995-2012 Mark Adler
 | |
|  * For conditions of distribution and use, see copyright notice in zlib.h
 | |
|  */
 | |
| 
 | |
| ZLIB.inflate_copyright =
 | |
|    ' inflate 1.2.6 Copyright 1995-2012 Mark Adler ';
 | |
| /*
 | |
|   If you use the zlib library in a product, an acknowledgment is welcome
 | |
|   in the documentation of your product. If for some reason you cannot
 | |
|   include such an acknowledgment, I would appreciate that you keep this
 | |
|   copyright string in the executable of your product.
 | |
|  */
 | |
| 
 | |
| /*
 | |
|   Build a set of tables to decode the provided canonical Huffman code.
 | |
|   The code lengths are lens[0..codes-1].  The result starts at *table,
 | |
|   whose indices are 0..2^bits-1.  work is a writable array of at least
 | |
|   lens shorts, which is used as a work area.  type is the type of code
 | |
|   to be generated, CODES, LENS, or DISTS.  On return, zero is success,
 | |
|   -1 is an invalid code, and +1 means that ENOUGH isn't enough.  table
 | |
|   on return points to the next available entry's address.  bits is the
 | |
|   requested root table index bits, and on return it is the actual root
 | |
|   table index bits.  It will differ if the request is greater than the
 | |
|   longest code or if it is less than the shortest code.
 | |
| */
 | |
| function inflate_table(state, type)
 | |
| {
 | |
|     var MAXBITS = 15;
 | |
|     var table = state.next;
 | |
|     var bits = (type == DISTS ? state.distbits : state.lenbits);
 | |
|     var work = state.work;
 | |
|     var lens = state.lens;
 | |
|     var lens_offset = (type == DISTS ? state.nlen : 0);
 | |
|     var state_codes = state.codes;
 | |
|     var codes;
 | |
|     if(type == LENS)
 | |
|         codes = state.nlen;
 | |
|     else if(type == DISTS)
 | |
|         codes = state.ndist;
 | |
|     else // CODES
 | |
|         codes = 19;
 | |
| 
 | |
|     var len;               /* a code's length in bits */
 | |
|     var sym;               /* index of code symbols */
 | |
|     var min, max;          /* minimum and maximum code lengths */
 | |
|     var root;              /* number of index bits for root table */
 | |
|     var curr;              /* number of index bits for current table */
 | |
|     var drop;              /* code bits to drop for sub-table */
 | |
|     var left;              /* number of prefix codes available */
 | |
|     var used;              /* code entries in table used */
 | |
|     var huff;              /* Huffman code */
 | |
|     var incr;              /* for incrementing code, index */
 | |
|     var fill;              /* index for replicating entries */
 | |
|     var low;               /* low bits for current root entry */
 | |
|     var mask;              /* mask for low root bits */
 | |
|     var here;              /* table entry for duplication */
 | |
|     var next;              /* next available space in table */
 | |
|     var base;              /* base value table to use */
 | |
|     var base_offset;
 | |
|     var extra;             /* extra bits table to use */
 | |
|     var extra_offset;
 | |
|     var end;                    /* use base and extra for symbol > end */
 | |
|     var count = new Array(MAXBITS+1);    /* number of codes of each length */
 | |
|     var offs = new Array(MAXBITS+1);     /* offsets in table for each length */
 | |
| 
 | |
|     /*
 | |
|       Process a set of code lengths to create a canonical Huffman code.  The
 | |
|       code lengths are lens[0..codes-1].  Each length corresponds to the
 | |
|       symbols 0..codes-1.  The Huffman code is generated by first sorting the
 | |
|       symbols by length from short to long, and retaining the symbol order
 | |
|       for codes with equal lengths.  Then the code starts with all zero bits
 | |
|       for the first code of the shortest length, and the codes are integer
 | |
|       increments for the same length, and zeros are appended as the length
 | |
|       increases.  For the deflate format, these bits are stored backwards
 | |
|       from their more natural integer increment ordering, and so when the
 | |
|       decoding tables are built in the large loop below, the integer codes
 | |
|       are incremented backwards.
 | |
| 
 | |
|       This routine assumes, but does not check, that all of the entries in
 | |
|       lens[] are in the range 0..MAXBITS.  The caller must assure this.
 | |
|       1..MAXBITS is interpreted as that code length.  zero means that that
 | |
|       symbol does not occur in this code.
 | |
| 
 | |
|       The codes are sorted by computing a count of codes for each length,
 | |
|       creating from that a table of starting indices for each length in the
 | |
|       sorted table, and then entering the symbols in order in the sorted
 | |
|       table.  The sorted table is work[], with that space being provided by
 | |
|       the caller.
 | |
| 
 | |
|       The length counts are used for other purposes as well, i.e. finding
 | |
|       the minimum and maximum length codes, determining if there are any
 | |
|       codes at all, checking for a valid set of lengths, and looking ahead
 | |
|       at length counts to determine sub-table sizes when building the
 | |
|       decoding tables.
 | |
|     */
 | |
| 
 | |
|     /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
 | |
|     for (len = 0; len <= MAXBITS; len++)
 | |
|         count[len] = 0;
 | |
|     for (sym = 0; sym < codes; sym++)
 | |
|         count[lens[lens_offset + sym]]++;
 | |
| 
 | |
|     /* bound code lengths, force root to be within code lengths */
 | |
|     root = bits;
 | |
| 
 | |
|     for (max = MAXBITS; max >= 1; max--)
 | |
|         if (count[max] != 0) break;
 | |
|     if (root > max) root = max;
 | |
|     if (max == 0) {
 | |
|         /* no symbols to code at all */
 | |
|         /* invalid code marker */
 | |
|         here = {op:64, bits:1, val:0};
 | |
|         state_codes[table++] = here; /* make a table to force an error */
 | |
|         state_codes[table++] = here;
 | |
|         if(type == DISTS) state.distbits = 1; else state.lenbits = 1; // *bits = 1;
 | |
|         state.next = table;
 | |
|         return 0;     /* no symbols, but wait for decoding to report error */
 | |
|     }
 | |
|     for (min = 1; min < max; min++)
 | |
|         if (count[min] != 0) break;
 | |
|     if (root < min) root = min;
 | |
| 
 | |
|     /* check for an over-subscribed or incomplete set of lengths */
 | |
|     left = 1;
 | |
|     for (len = 1; len <= MAXBITS; len++) {
 | |
|         left <<= 1;
 | |
|         left -= count[len];
 | |
|         if (left < 0) return -1;        /* over-subscribed */
 | |
|     }
 | |
|     if (left > 0 && (type == CODES || max != 1)) {
 | |
|         state.next = table;
 | |
|         return -1;                      /* incomplete set */
 | |
|     }
 | |
| 
 | |
|     /* generate offsets into symbol table for each length for sorting */
 | |
|     offs[1] = 0;
 | |
|     for (len = 1; len < MAXBITS; len++)
 | |
|         offs[len + 1] = offs[len] + count[len];
 | |
| 
 | |
|     /* sort symbols by length, by symbol order within each length */
 | |
|     for (sym = 0; sym < codes; sym++)
 | |
|         if (lens[lens_offset + sym] != 0) work[offs[lens[lens_offset + sym]]++] = sym;
 | |
| 
 | |
|     /*
 | |
|       Create and fill in decoding tables.  In this loop, the table being
 | |
|       filled is at next and has curr index bits.  The code being used is huff
 | |
|       with length len.  That code is converted to an index by dropping drop
 | |
|       bits off of the bottom.  For codes where len is less than drop + curr,
 | |
|       those top drop + curr - len bits are incremented through all values to
 | |
|       fill the table with replicated entries.
 | |
| 
 | |
|       root is the number of index bits for the root table.  When len exceeds
 | |
|       root, sub-tables are created pointed to by the root entry with an index
 | |
|       of the low root bits of huff.  This is saved in low to check for when a
 | |
|       new sub-table should be started.  drop is zero when the root table is
 | |
|       being filled, and drop is root when sub-tables are being filled.
 | |
| 
 | |
|       When a new sub-table is needed, it is necessary to look ahead in the
 | |
|       code lengths to determine what size sub-table is needed.  The length
 | |
|       counts are used for this, and so count[] is decremented as codes are
 | |
|       entered in the tables.
 | |
| 
 | |
|       used keeps track of how many table entries have been allocated from the
 | |
|       provided *table space.  It is checked for LENS and DIST tables against
 | |
|       the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
 | |
|       the initial root table size constants.  See the comments in inftrees.h
 | |
|       for more information.
 | |
| 
 | |
|       sym increments through all symbols, and the loop terminates when
 | |
|       all codes of length max, i.e. all codes, have been processed.  This
 | |
|       routine permits incomplete codes, so another loop after this one fills
 | |
|       in the rest of the decoding tables with invalid code markers.
 | |
|     */
 | |
| 
 | |
|     /* set up for code type */
 | |
|     switch (type) {
 | |
|     case CODES:
 | |
|         base = extra = work;    /* dummy value--not used */
 | |
|         base_offset = 0;
 | |
|         extra_offset = 0;
 | |
|         end = 19;
 | |
|         break;
 | |
|     case LENS:
 | |
|         base = inflate_table_lbase;
 | |
|         base_offset = -257; // base -= 257;
 | |
|         extra = inflate_table_lext;
 | |
|         extra_offset = -257; // extra -= 257;
 | |
|         end = 256;
 | |
|         break;
 | |
|     default:            /* DISTS */
 | |
|         base = inflate_table_dbase;
 | |
|         extra = inflate_table_dext;
 | |
|         base_offset = 0;
 | |
|         extra_offset = 0;
 | |
|         end = -1;
 | |
|     }
 | |
| 
 | |
|     /* initialize state for loop */
 | |
|     huff = 0;                   /* starting code */
 | |
|     sym = 0;                    /* starting code symbol */
 | |
|     len = min;                  /* starting code length */
 | |
|     next = table;               /* current table to fill in */
 | |
|     curr = root;                /* current table index bits */
 | |
|     drop = 0;                   /* current bits to drop from code for index */
 | |
|     low = -1;                   /* trigger new sub-table when len > root */
 | |
|     used = 1 << root;           /* use root table entries */
 | |
|     mask = used - 1;            /* mask for comparing low */
 | |
| 
 | |
|     /* check available table space */
 | |
|     if ((type == LENS && used >= ENOUGH_LENS) ||
 | |
|         (type == DISTS && used >= ENOUGH_DISTS)) {
 | |
|         state.next = table;
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     /* process all codes and make table entries */
 | |
|     for (;;) {
 | |
|         /* create table entry */
 | |
|         here = {op:0, bits:len - drop, val:0};
 | |
|         if (work[sym] < end) {
 | |
|             here.val = work[sym];
 | |
|         }
 | |
|         else if (work[sym] > end) {
 | |
|             here.op = extra[extra_offset + work[sym]];
 | |
|             here.val = base[base_offset + work[sym]];
 | |
|         }
 | |
|         else {
 | |
|             here.op = 32 + 64;         /* end of block */
 | |
|         }
 | |
| 
 | |
|         /* replicate for those indices with low len bits equal to huff */
 | |
|         incr = 1 << (len - drop);
 | |
|         fill = 1 << curr;
 | |
|         min = fill;                 /* save offset to next table */
 | |
|         do {
 | |
|             fill -= incr;
 | |
|             state_codes[next + (huff >>> drop) + fill] = here;
 | |
|         } while (fill != 0);
 | |
| 
 | |
|         /* backwards increment the len-bit code huff */
 | |
|         incr = 1 << (len - 1);
 | |
|         while (huff & incr)
 | |
|             incr >>>= 1;
 | |
|         if (incr != 0) {
 | |
|             huff &= incr - 1;
 | |
|             huff += incr;
 | |
|         }
 | |
|         else
 | |
|             huff = 0;
 | |
| 
 | |
|         /* go to next symbol, update count, len */
 | |
|         sym++;
 | |
|         if (--(count[len]) == 0) {
 | |
|             if (len == max) break;
 | |
|             len = lens[lens_offset + work[sym]];
 | |
|         }
 | |
| 
 | |
|         /* create new sub-table if needed */
 | |
|         if (len > root && (huff & mask) != low) {
 | |
|             /* if first time, transition to sub-tables */
 | |
|             if (drop == 0)
 | |
|                 drop = root;
 | |
| 
 | |
|             /* increment past last table */
 | |
|             next += min;            /* here min is 1 << curr */
 | |
| 
 | |
|             /* determine length of next table */
 | |
|             curr = len - drop;
 | |
|             left = (1 << curr);
 | |
|             while (curr + drop < max) {
 | |
|                 left -= count[curr + drop];
 | |
|                 if (left <= 0) break;
 | |
|                 curr++;
 | |
|                 left <<= 1;
 | |
|             }
 | |
| 
 | |
|             /* check for enough space */
 | |
|             used += 1 << curr;
 | |
|             if ((type == LENS && used >= ENOUGH_LENS) ||
 | |
|                 (type == DISTS && used >= ENOUGH_DISTS)) {
 | |
|                 state.next = table;
 | |
|                 return 1;
 | |
|             }
 | |
| 
 | |
|             /* point entry in root table to sub-table */
 | |
|             low = huff & mask;
 | |
|             state_codes[table + low] = {op:curr, bits:root, val:next - table};
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /* fill in remaining table entry if code is incomplete (guaranteed to have
 | |
|        at most one remaining entry, since if the code is incomplete, the
 | |
|        maximum code length that was allowed to get this far is one bit) */
 | |
|     if (huff != 0) {
 | |
|         state_codes[next + huff] = {op:64, bits:len - drop, val:0};
 | |
|     }
 | |
| 
 | |
|     /* set return parameters */
 | |
|     state.next = table + used;
 | |
|     if(type == DISTS) state.distbits = root; else state.lenbits = root; //*bits = root;
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| /* inffast.c -- fast decoding
 | |
|  * Copyright (C) 1995-2008, 2010 Mark Adler
 | |
|  * For conditions of distribution and use, see copyright notice in zlib.h
 | |
|  */
 | |
| 
 | |
| /*
 | |
|    Decode literal, length, and distance codes and write out the resulting
 | |
|    literal and match bytes until either not enough input or output is
 | |
|    available, an end-of-block is encountered, or a data error is encountered.
 | |
|    When large enough input and output buffers are supplied to inflate(), for
 | |
|    example, a 16K input buffer and a 64K output buffer, more than 95% of the
 | |
|    inflate execution time is spent in this routine.
 | |
| 
 | |
|    Entry assumptions:
 | |
| 
 | |
|         state->mode == LEN
 | |
|         strm->avail_in >= 6
 | |
|         strm->avail_out >= 258
 | |
|         start >= strm->avail_out
 | |
|         state->bits < 8
 | |
| 
 | |
|    On return, state->mode is one of:
 | |
| 
 | |
|         LEN -- ran out of enough output space or enough available input
 | |
|         TYPE -- reached end of block code, inflate() to interpret next block
 | |
|         BAD -- error in block data
 | |
| 
 | |
|    Notes:
 | |
| 
 | |
|     - The maximum input bits used by a length/distance pair is 15 bits for the
 | |
|       length code, 5 bits for the length extra, 15 bits for the distance code,
 | |
|       and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
 | |
|       Therefore if strm->avail_in >= 6, then there is enough input to avoid
 | |
|       checking for available input while decoding.
 | |
| 
 | |
|     - The maximum bytes that a single length/distance pair can output is 258
 | |
|       bytes, which is the maximum length that can be coded.  inflate_fast()
 | |
|       requires strm->avail_out >= 258 for each loop to avoid checking for
 | |
|       output space.
 | |
|  */
 | |
| function inflate_fast(strm,
 | |
|                       start) /* inflate()'s starting value for strm->avail_out */
 | |
| {
 | |
|     var state;
 | |
|     var input_data;      /* local strm->input_data */
 | |
|     var next_in;      /* zlib.js: index of input_data */
 | |
|     var last;    /* while next_in < last, enough input available */
 | |
|     var out;     /* local strm.next_out */
 | |
|     var beg;     /* inflate()'s initial strm.next_out */
 | |
|     var end;     /* while out < end, enough space available */
 | |
| //NOSPRT #ifdef INFLATE_STRICT
 | |
| //    unsigned dmax;              /* maximum distance from zlib header */
 | |
| //#endif
 | |
|     var wsize;             /* window size or zero if not using window */
 | |
|     var whave;             /* valid bytes in the window */
 | |
|     var wnext;             /* window write index */
 | |
|     var window;  /* allocated sliding window, if wsize != 0 */
 | |
|     var hold;         /* local strm->hold */
 | |
|     var bits;              /* local strm->bits */
 | |
|     var codes;             /* zlib.js: local state.codes */
 | |
|     var lcode;      /* local strm->lencode */
 | |
|     var dcode;      /* local strm->distcode */
 | |
|     var lmask;             /* mask for first level of length codes */
 | |
|     var dmask;             /* mask for first level of distance codes */
 | |
|     var here;                  /* retrieved table entry */
 | |
|     var op;                /* code bits, operation, extra bits, or */
 | |
|     /*  window position, window bytes to copy */
 | |
|     var len;               /* match length, unused bytes */
 | |
|     var dist;              /* match distance */
 | |
|     //    var from;    /* where to copy match from */
 | |
|     var from_window_offset = -1; /* index of window[] */
 | |
|     var from_out_offset = -1; /* index of next_out[] */
 | |
| 
 | |
|     /* copy state to local variables */
 | |
|     state = strm.state;
 | |
|     input_data = strm.input_data;
 | |
|     next_in = strm.next_in;
 | |
|     last = next_in + strm.avail_in - 5;
 | |
|     out = strm.next_out;
 | |
|     beg = out - (start - strm.avail_out);
 | |
|     end = out + (strm.avail_out - 257);
 | |
| //NOSPRT #ifdef INFLATE_STRICT
 | |
| //    dmax = state->dmax;
 | |
| //#endif
 | |
|     wsize = state.wsize;
 | |
|     whave = state.whave;
 | |
|     wnext = state.wnext;
 | |
|     window = state.window;
 | |
|     hold = state.hold;
 | |
|     bits = state.bits;
 | |
|     codes = state.codes;
 | |
|     lcode = state.lencode;
 | |
|     dcode = state.distcode;
 | |
|     lmask = (1 << state.lenbits) - 1;
 | |
|     dmask = (1 << state.distbits) - 1;
 | |
| 
 | |
|     /* decode literals and length/distances until end-of-block or not enough
 | |
|        input data or output space */
 | |
| loop: do {
 | |
|         if (bits < 15) {
 | |
|             hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
 | |
|             bits += 8;
 | |
|             hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
 | |
|             bits += 8;
 | |
|         }
 | |
|         here = codes[lcode + (hold & lmask)];
 | |
|     dolen: while(true) {
 | |
|             op = here.bits;
 | |
|             hold >>>= op;
 | |
|             bits -= op;
 | |
|             op = here.op;
 | |
|             if (op == 0) {                          /* literal */
 | |
| //            Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
 | |
| //                    "inflate:         literal '%c'\n" :
 | |
| //                    "inflate:         literal 0x%02x\n", here.val));
 | |
|                 strm.output_data += String.fromCharCode(here.val);
 | |
|                 out++;
 | |
|             }
 | |
|             else if (op & 16) {                     /* length base */
 | |
|                 len = here.val;
 | |
|                 op &= 15;                           /* number of extra bits */
 | |
|                 if (op) {
 | |
|                     if (bits < op) {
 | |
|                         hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
 | |
|                         bits += 8;
 | |
|                     }
 | |
|                     len += hold & ((1 << op) - 1);
 | |
|                     hold >>>= op;
 | |
|                     bits -= op;
 | |
|                 }
 | |
| //            Tracevv((stderr, "inflate:         length %u\n", len));
 | |
|                 if (bits < 15) {
 | |
|                     hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
 | |
|                     bits += 8;
 | |
|                     hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
 | |
|                     bits += 8;
 | |
|                 }
 | |
|                 here = codes[dcode + (hold & dmask)];
 | |
|             dodist: while(true) {
 | |
|                     op = here.bits;
 | |
|                     hold >>>= op;
 | |
|                     bits -= op;
 | |
|                     op = here.op;
 | |
|                     if (op & 16) {                      /* distance base */
 | |
|                         dist = here.val;
 | |
|                         op &= 15;                       /* number of extra bits */
 | |
|                         if (bits < op) {
 | |
|                             hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
 | |
|                             bits += 8;
 | |
|                             if (bits < op) {
 | |
|                                 hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
 | |
|                                 bits += 8;
 | |
|                             }
 | |
|                         }
 | |
|                         dist += hold & ((1 << op) - 1);
 | |
| //NOSPRT #ifdef INFLATE_STRICT
 | |
| //                if (dist > dmax) {
 | |
| //                    strm->msg = (char *)"invalid distance too far back";
 | |
| //                    state->mode = BAD;
 | |
| //                    break loop;
 | |
| //                }
 | |
| //#endif
 | |
|                         hold >>>= op;
 | |
|                         bits -= op;
 | |
| //                Tracevv((stderr, "inflate:         distance %u\n", dist));
 | |
|                         op = out - beg;                 /* max distance in output */
 | |
|                         if (dist > op) {                /* see if copy from window */
 | |
|                             op = dist - op;             /* distance back in window */
 | |
|                             if (op > whave) {
 | |
|                                 if (state.sane) {
 | |
|                                     strm.msg = 'invalid distance too far back';
 | |
|                                     state.mode = BAD;
 | |
|                                     break loop;
 | |
|                                 }
 | |
| //NOSPRT #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
 | |
| //                        if (len <= op - whave) {
 | |
| //                            do {
 | |
| //                                PUP(out) = 0;
 | |
| //                            } while (--len);
 | |
| //                            continue;
 | |
| //                        }
 | |
| //                        len -= op - whave;
 | |
| //                        do {
 | |
| //                            PUP(out) = 0;
 | |
| //                        } while (--op > whave);
 | |
| //                        if (op == 0) {
 | |
| //                            from = out - dist;
 | |
| //                            do {
 | |
| //                                PUP(out) = PUP(from);
 | |
| //                            } while (--len);
 | |
| //                            continue;
 | |
| //                        }
 | |
| //#endif
 | |
|                             } // if (op > whave)
 | |
| 
 | |
|                             from_window_offset = 0;
 | |
|                             from_out_offset = -1;
 | |
| 							if (wnext == 0) {           /* very common case */
 | |
| 								from_window_offset += wsize - op;
 | |
| 								if (op < len) {         /* some from window */
 | |
| 									len -= op;
 | |
| 									strm.output_data += window.substring(from_window_offset, from_window_offset + op);
 | |
| 									out += op;
 | |
| 									op = 0;
 | |
| 									from_window_offset = -1;
 | |
| 									from_out_offset = out - dist;  /* rest from output */
 | |
| 								}
 | |
| 							}
 | |
| //NOTREACHED else if (wnext < op) {      /* wrap around window */
 | |
| //NOTREACHED     from += wsize + wnext - op;
 | |
| //NOTREACHED     op -= wnext;
 | |
| //NOTREACHED     if (op < len) {         /* some from end of window */
 | |
| //NOTREACHED         len -= op;
 | |
| //NOTREACHED         do {
 | |
| //NOTREACHED             PUP(out) = PUP(from);
 | |
| //NOTREACHED         } while (--op);
 | |
| //NOTREACHED         from = window - OFF;
 | |
| //NOTREACHED         if (wnext < len) {  /* some from start of window */
 | |
| //NOTREACHED             op = wnext;
 | |
| //NOTREACHED             len -= op;
 | |
| //NOTREACHED             do {
 | |
| //NOTREACHED                 PUP(out) = PUP(from);
 | |
| //NOTREACHED             } while (--op);
 | |
| //NOTREACHED             from = out - dist;      /* rest from output */
 | |
| //NOTREACHED         }
 | |
| //NOTREACHED     }
 | |
| //NOTREACHED }
 | |
| 							else {                      /* contiguous in window */
 | |
| 								from_window_offset += wnext - op;
 | |
| 								if (op < len) {         /* some from window */
 | |
| 									len -= op;
 | |
| 									strm.output_data += window.substring(from_window_offset, from_window_offset + op);
 | |
| 									out += op;
 | |
| 									from_window_offset = -1;
 | |
| 									from_out_offset = out - dist;  /* rest from output */
 | |
| 								}
 | |
| 							}
 | |
|                         }
 | |
|                         else {
 | |
|                             from_window_offset = -1;
 | |
|                             from_out_offset = out - dist;          /* copy direct from output */
 | |
|                         }
 | |
| 
 | |
|                         if (from_window_offset >= 0) {
 | |
|                             strm.output_data += window.substring(from_window_offset, from_window_offset + len);
 | |
|                             out += len;
 | |
|                             from_window_offset += len;
 | |
|                         } else {
 | |
|                             var len_inner = len;
 | |
|                             if(len_inner > out - from_out_offset)
 | |
|                               len_inner = out - from_out_offset;
 | |
|                             strm.output_data += strm.output_data.substring(
 | |
|                                 from_out_offset, from_out_offset + len_inner);
 | |
|                             out += len_inner;
 | |
|                             len -= len_inner;
 | |
|                             from_out_offset += len_inner;
 | |
|                             out += len;
 | |
|                             while (len > 2) {
 | |
|                                 strm.output_data += strm.output_data.charAt(from_out_offset++);
 | |
|                                 strm.output_data += strm.output_data.charAt(from_out_offset++);
 | |
|                                 strm.output_data += strm.output_data.charAt(from_out_offset++);
 | |
|                                 len -= 3;
 | |
|                             }
 | |
|                             if (len) {
 | |
|                                 strm.output_data += strm.output_data.charAt(from_out_offset++);
 | |
|                                 if (len > 1)
 | |
|                                     strm.output_data += strm.output_data.charAt(from_out_offset++);
 | |
|                             }
 | |
|                         }
 | |
|                     }
 | |
|                     else if ((op & 64) == 0) {          /* 2nd level distance code */
 | |
|                         here = codes[dcode + (here.val + (hold & ((1 << op) - 1)))];
 | |
|                         continue dodist; // goto dodist
 | |
|                     }
 | |
|                     else {
 | |
|                         strm.msg = 'invalid distance code';
 | |
|                         state.mode = BAD;
 | |
|                         break loop;
 | |
|                     }
 | |
|                     break dodist; }
 | |
|             }
 | |
|             else if ((op & 64) == 0) {              /* 2nd level length code */
 | |
|                 here = codes[lcode + (here.val + (hold & ((1 << op) - 1)))];
 | |
|                 continue dolen; // goto dolen;
 | |
|             }
 | |
|             else if (op & 32) {                     /* end-of-block */
 | |
|                 //            Tracevv((stderr, "inflate:         end of block\n"));
 | |
|                 state.mode = TYPE;
 | |
|                 break loop;
 | |
|             }
 | |
|             else {
 | |
|                 strm.msg = 'invalid literal/length code';
 | |
|                 state.mode = BAD;
 | |
|                 break loop;
 | |
|             }
 | |
|             break dolen; }
 | |
|     } while (next_in < last && out < end);
 | |
| 
 | |
|     /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
 | |
|     len = bits >>> 3;
 | |
|     next_in -= len;
 | |
|     bits -= len << 3;
 | |
|     hold &= (1 << bits) - 1;
 | |
| 
 | |
|     /* update state and return */
 | |
|     strm.next_in = next_in;
 | |
|     strm.next_out = out;
 | |
|     strm.avail_in = (next_in < last ? 5 + (last - next_in) : 5 - (next_in - last));
 | |
|     strm.avail_out = (out < end ?
 | |
|                       257 + (end - out) : 257 - (out - end));
 | |
|     state.hold = hold;
 | |
|     state.bits = bits;
 | |
| }
 | |
| 
 | |
| function new_array(size)
 | |
| {
 | |
|     var i;
 | |
|     var ary = new Array(size);
 | |
|     for(i = 0; i < size; i++)
 | |
|         ary[i] = 0;
 | |
|     return ary;
 | |
| }
 | |
| 
 | |
| function getarg(opts, name, def_value)
 | |
| {
 | |
|     return (opts && (name in opts)) ? opts[name] : def_value;
 | |
| }
 | |
| 
 | |
| function checksum_none()
 | |
| {
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * z_stream constructor
 | |
|  * @constructor
 | |
|  */
 | |
| function inflate_state()
 | |
| {
 | |
|     var i;
 | |
| 
 | |
|     this.mode = 0;              /* current inflate mode */
 | |
|     this.last = 0;              /* true if processing last block */
 | |
|     this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
 | |
|     this.havedict = 0;          /* true if dictionary provided */
 | |
|     this.flags = 0;             /* gzip header method and flags (0 if zlib) */
 | |
|     this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */
 | |
|     this.check = 0;             /* protected copy of check value */
 | |
|     this.total = 0;             /* protected copy of output count */
 | |
|     this.head = null;           /* where to save gzip header information */
 | |
|     /* sliding window */
 | |
|     this.wbits = 0;             /* log base 2 of requested window size */
 | |
|     this.wsize = 0;             /* window size or zero if not using window */
 | |
|     this.whave = 0;             /* valid bytes in the window */
 | |
|     this.wnext = 0;             /* window write index (TODO remove) */
 | |
|     this.window = null;         /* allocated sliding window, if needed */
 | |
|     /* bit accumulator */
 | |
|     this.hold = 0;              /* input bit accumulator */
 | |
|     this.bits = 0;              /* number of bits in "in" */
 | |
|     /* for string and stored block copying */
 | |
|     this.length = 0;            /* literal or length of data to copy */
 | |
|     this.offset = 0;            /* distance back to copy string from */
 | |
|     /* for table and code decoding */
 | |
|     this.extra = 0;             /* extra bits needed */
 | |
|     /* fixed and dynamic code tables */
 | |
| 
 | |
|     /* zlib.js: modified implementation: lencode, distcode, next are offset of codes[] */
 | |
|     this.lencode = 0;           /* starting table for length/literal codes */
 | |
|     this.distcode = 0;          /* starting table for distance codes */
 | |
|     this.lenbits = 0;           /* index bits for lencode */
 | |
|     this.distbits = 0;          /* index bits for distcode */
 | |
|     /* dynamic table building */
 | |
|     this.ncode = 0;             /* number of code length code lengths */
 | |
|     this.nlen = 0;              /* number of length code lengths */
 | |
|     this.ndist = 0;             /* number of distance code lengths */
 | |
|     this.have = 0;              /* number of code lengths in lens[] */
 | |
|     this.next = 0;              /* next available space in codes[] */
 | |
|     this.lens = new_array(320); /* temporary storage for code lengths */
 | |
|     this.work = new_array(288); /* work area for code table building */
 | |
|     this.codes = new Array(ENOUGH);         /* space for code tables */
 | |
|     var c = {op:0, bits:0, val:0};
 | |
|     for(i = 0; i < ENOUGH; i++)
 | |
|         this.codes[i] = c;
 | |
|     this.sane = 0;              /* if false, allow invalid distance too far */
 | |
|     this.back = 0;              /* bits back of last unprocessed length/lit */
 | |
|     this.was = 0;               /* initial length of match */
 | |
| }
 | |
| 
 | |
| ZLIB.inflateResetKeep = function(strm)
 | |
| {
 | |
|     var state;
 | |
| 
 | |
|     if (!strm || !strm.state) return ZLIB.Z_STREAM_ERROR;
 | |
|     state = strm.state;
 | |
|     strm.total_in = strm.total_out = state.total = 0;
 | |
|     strm.msg = null;
 | |
|     if (state.wrap) {        /* to support ill-conceived Java test suite */
 | |
|         strm.adler = state.wrap & 1;
 | |
|     }
 | |
| 
 | |
|     state.mode = HEAD;
 | |
|     state.last = 0;
 | |
|     state.havedict = 0;
 | |
|     state.dmax = 32768;
 | |
|     state.head = null;
 | |
|     state.hold = 0;
 | |
|     state.bits = 0;
 | |
|     state.lencode = 0;
 | |
|     state.distcode = 0;
 | |
|     state.next = 0;
 | |
|     state.sane = 1;
 | |
|     state.back = -1;
 | |
|     return ZLIB.Z_OK;
 | |
| };
 | |
| 
 | |
| // Usage: strm = ZLIB.inflateReset(z_stream [, windowBits]);
 | |
| ZLIB.inflateReset = function(strm, windowBits)
 | |
| {
 | |
|     var wrap;
 | |
|     var state;
 | |
| 
 | |
|     /* get the state */
 | |
|     if (!strm || !strm.state) return ZLIB.Z_STREAM_ERROR;
 | |
|     state = strm.state;
 | |
| 
 | |
| 	if(typeof windowBits === "undefined")
 | |
| 		windowBits = DEF_WBITS;
 | |
| 
 | |
|     /* extract wrap request from windowBits parameter */
 | |
|     if (windowBits < 0) {
 | |
|         wrap = 0;
 | |
|         windowBits = -windowBits;
 | |
|     }
 | |
|     else {
 | |
|         wrap = (windowBits >>> 4) + 1;
 | |
|         if (windowBits < 48)
 | |
|             windowBits &= 15;
 | |
|     }
 | |
| 
 | |
| 	if(wrap == 1 && (typeof ZLIB.adler32 === 'function')) {
 | |
| 		strm.checksum_function = ZLIB.adler32;
 | |
| 	} else if(wrap == 2 && (typeof ZLIB.crc32 === 'function')) {
 | |
| 		strm.checksum_function = ZLIB.crc32;
 | |
| 	} else {
 | |
| 		strm.checksum_function = checksum_none;
 | |
| 	}
 | |
| 
 | |
|     /* set number of window bits, free window if different */
 | |
|     if (windowBits && (windowBits < 8 || windowBits > 15))
 | |
|         return ZLIB.Z_STREAM_ERROR;
 | |
|     if (state.window && state.wbits != windowBits) {
 | |
|         state.window = null;
 | |
|     }
 | |
| 
 | |
|     /* update state and reset the rest of it */
 | |
|     state.wrap = wrap;
 | |
|     state.wbits = windowBits;
 | |
|     state.wsize = 0;
 | |
|     state.whave = 0;
 | |
|     state.wnext = 0;
 | |
|     return ZLIB.inflateResetKeep(strm);
 | |
| };
 | |
| 
 | |
| // Usage: strm = ZLIB.inflateInit([windowBits]);
 | |
| ZLIB.inflateInit = function(windowBits)
 | |
| {
 | |
|     var strm = new ZLIB.z_stream();
 | |
|     strm.state = new inflate_state();
 | |
|     ZLIB.inflateReset(strm, windowBits);
 | |
|     return strm;
 | |
| };
 | |
| 
 | |
| ZLIB.inflatePrime = function(strm, bits, value)
 | |
| {
 | |
|     var state;
 | |
| 
 | |
|     if (!strm || !strm.state) return ZLIB.Z_STREAM_ERROR;
 | |
|     state = strm.state;
 | |
|     if (bits < 0) {
 | |
|         state.hold = 0;
 | |
|         state.bits = 0;
 | |
|         return ZLIB.Z_OK;
 | |
|     }
 | |
|     if (bits > 16 || state.bits + bits > 32) return ZLIB.Z_STREAM_ERROR;
 | |
|     value &= (1 << bits) - 1;
 | |
|     state.hold += value << state.bits;
 | |
|     state.bits += bits;
 | |
|     return ZLIB.Z_OK;
 | |
| };
 | |
| 
 | |
| var lenfix_ary = null;
 | |
| var distfix_ary = null;
 | |
| function fixedtables(state)
 | |
| {
 | |
|     var i;
 | |
|     if (!lenfix_ary) lenfix_ary = [ { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 80 }, { op: 0, bits: 8, val: 16 }, { op: 20, bits: 8, val: 115 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 112 }, { op: 0, bits: 8, val: 48 }, { op: 0, bits: 9, val: 192 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 96 }, { op: 0, bits: 8, val: 32 }, { op: 0, bits: 9, val: 160 }, { op: 0, bits: 8, val: 0 }, { op: 0, bits: 8, val: 128 }, { op: 0, bits: 8, val: 64 }, { op: 0, bits: 9, val: 224 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 88 }, { op: 0, bits: 8, val: 24 }, { op: 0, bits: 9, val: 144 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 120 }, { op: 0, bits: 8, val: 56 }, { op: 0, bits: 9, val: 208 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 104 }, { op: 0, bits: 8, val: 40 }, { op: 0, bits: 9, val: 176 }, { op: 0, bits: 8, val: 8 }, { op: 0, bits: 8, val: 136 }, { op: 0, bits: 8, val: 72 }, { op: 0, bits: 9, val: 240 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 84 }, { op: 0, bits: 8, val: 20 }, { op: 21, bits: 8, val: 227 }, { op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 116 }, { op: 0, bits: 8, val: 52 }, { op: 0, bits: 9, val: 200 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 100 }, { op: 0, bits: 8, val: 36 }, { op: 0, bits: 9, val: 168 }, { op: 0, bits: 8, val: 4 }, { op: 0, bits: 8, val: 132 }, { op: 0, bits: 8, val: 68 }, { op: 0, bits: 9, val: 232 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 92 }, { op: 0, bits: 8, val: 28 }, { op: 0, bits: 9, val: 152 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 124 }, { op: 0, bits: 8, val: 60 }, { op: 0, bits: 9, val: 216 }, { op: 18, bits: 7, val: 23 }, { op: 0, bits: 8, val: 108 }, { op: 0, bits: 8, val: 44 }, { op: 0, bits: 9, val: 184 }, { op: 0, bits: 8, val: 12 }, { op: 0, bits: 8, val: 140 }, { op: 0, bits: 8, val: 76 }, { op: 0, bits: 9, val: 248 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 82 }, { op: 0, bits: 8, val: 18 }, { op: 21, bits: 8, val: 163 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 114 }, { op: 0, bits: 8, val: 50 }, { op: 0, bits: 9, val: 196 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 98 }, { op: 0, bits: 8, val: 34 }, { op: 0, bits: 9, val: 164 }, { op: 0, bits: 8, val: 2 }, { op: 0, bits: 8, val: 130 }, { op: 0, bits: 8, val: 66 }, { op: 0, bits: 9, val: 228 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 90 }, { op: 0, bits: 8, val: 26 }, { op: 0, bits: 9, val: 148 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 122 }, { op: 0, bits: 8, val: 58 }, { op: 0, bits: 9, val: 212 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 106 }, { op: 0, bits: 8, val: 42 }, { op: 0, bits: 9, val: 180 }, { op: 0, bits: 8, val: 10 }, { op: 0, bits: 8, val: 138 }, { op: 0, bits: 8, val: 74 }, { op: 0, bits: 9, val: 244 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 86 }, { op: 0, bits: 8, val: 22 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 }, { op: 0, bits: 8, val: 118 }, { op: 0, bits: 8, val: 54 }, { op: 0, bits: 9, val: 204 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 102 }, { op: 0, bits: 8, val: 38 }, { op: 0, bits: 9, val: 172 }, { op: 0, bits: 8, val: 6 }, { op: 0, bits: 8, val: 134 }, { op: 0, bits: 8, val: 70 }, { op: 0, bits: 9, val: 236 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 94 }, { op: 0, bits: 8, val: 30 }, { op: 0, bits: 9, val: 156 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 126 }, { op: 0, bits: 8, val: 62 }, { op: 0, bits: 9, val: 220 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 110 }, { op: 0, bits: 8, val: 46 }, { op: 0, bits: 9, val: 188 }, { op: 0, bits: 8, val: 14 }, { op: 0, bits: 8, val: 142 }, { op: 0, bits: 8, val: 78 }, { op: 0, bits: 9, val: 252 }, { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 81 }, { op: 0, bits: 8, val: 17 }, { op: 21, bits: 8, val: 131 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 113 }, { op: 0, bits: 8, val: 49 }, { op: 0, bits: 9, val: 194 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 97 }, { op: 0, bits: 8, val: 33 }, { op: 0, bits: 9, val: 162 }, { op: 0, bits: 8, val: 1 }, { op: 0, bits: 8, val: 129 }, { op: 0, bits: 8, val: 65 }, { op: 0, bits: 9, val: 226 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 89 }, { op: 0, bits: 8, val: 25 }, { op: 0, bits: 9, val: 146 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 121 }, { op: 0, bits: 8, val: 57 }, { op: 0, bits: 9, val: 210 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 105 }, { op: 0, bits: 8, val: 41 }, { op: 0, bits: 9, val: 178 }, { op: 0, bits: 8, val: 9 }, { op: 0, bits: 8, val: 137 }, { op: 0, bits: 8, val: 73 }, { op: 0, bits: 9, val: 242 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 85 }, { op: 0, bits: 8, val: 21 }, { op: 16, bits: 8, val: 258 }, { op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 117 }, { op: 0, bits: 8, val: 53 }, { op: 0, bits: 9, val: 202 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 101 }, { op: 0, bits: 8, val: 37 }, { op: 0, bits: 9, val: 170 }, { op: 0, bits: 8, val: 5 }, { op: 0, bits: 8, val: 133 }, { op: 0, bits: 8, val: 69 }, { op: 0, bits: 9, val: 234 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 93 }, { op: 0, bits: 8, val: 29 }, { op: 0, bits: 9, val: 154 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 125 }, { op: 0, bits: 8, val: 61 }, { op: 0, bits: 9, val: 218 }, { op: 18, bits: 7, val: 23 }, { op: 0, bits: 8, val: 109 }, { op: 0, bits: 8, val: 45 }, { op: 0, bits: 9, val: 186 }, { op: 0, bits: 8, val: 13 }, { op: 0, bits: 8, val: 141 }, { op: 0, bits: 8, val: 77 }, { op: 0, bits: 9, val: 250 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 83 }, { op: 0, bits: 8, val: 19 }, { op: 21, bits: 8, val: 195 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 115 }, { op: 0, bits: 8, val: 51 }, { op: 0, bits: 9, val: 198 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 99 }, { op: 0, bits: 8, val: 35 }, { op: 0, bits: 9, val: 166 }, { op: 0, bits: 8, val: 3 }, { op: 0, bits: 8, val: 131 }, { op: 0, bits: 8, val: 67 }, { op: 0, bits: 9, val: 230 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 91 }, { op: 0, bits: 8, val: 27 }, { op: 0, bits: 9, val: 150 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 123 }, { op: 0, bits: 8, val: 59 }, { op: 0, bits: 9, val: 214 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 107 }, { op: 0, bits: 8, val: 43 }, { op: 0, bits: 9, val: 182 }, { op: 0, bits: 8, val: 11 }, { op: 0, bits: 8, val: 139 }, { op: 0, bits: 8, val: 75 }, { op: 0, bits: 9, val: 246 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 87 }, { op: 0, bits: 8, val: 23 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 }, { op: 0, bits: 8, val: 119 }, { op: 0, bits: 8, val: 55 }, { op: 0, bits: 9, val: 206 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 103 }, { op: 0, bits: 8, val: 39 }, { op: 0, bits: 9, val: 174 }, { op: 0, bits: 8, val: 7 }, { op: 0, bits: 8, val: 135 }, { op: 0, bits: 8, val: 71 }, { op: 0, bits: 9, val: 238 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 95 }, { op: 0, bits: 8, val: 31 }, { op: 0, bits: 9, val: 158 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 127 }, { op: 0, bits: 8, val: 63 }, { op: 0, bits: 9, val: 222 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 111 }, { op: 0, bits: 8, val: 47 }, { op: 0, bits: 9, val: 190 }, { op: 0, bits: 8, val: 15 }, { op: 0, bits: 8, val: 143 }, { op: 0, bits: 8, val: 79 }, { op: 0, bits: 9, val: 254 }, { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 80 }, { op: 0, bits: 8, val: 16 }, { op: 20, bits: 8, val: 115 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 112 }, { op: 0, bits: 8, val: 48 }, { op: 0, bits: 9, val: 193 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 96 }, { op: 0, bits: 8, val: 32 }, { op: 0, bits: 9, val: 161 }, { op: 0, bits: 8, val: 0 }, { op: 0, bits: 8, val: 128 }, { op: 0, bits: 8, val: 64 }, { op: 0, bits: 9, val: 225 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 88 }, { op: 0, bits: 8, val: 24 }, { op: 0, bits: 9, val: 145 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 120 }, { op: 0, bits: 8, val: 56 }, { op: 0, bits: 9, val: 209 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 104 }, { op: 0, bits: 8, val: 40 }, { op: 0, bits: 9, val: 177 }, { op: 0, bits: 8, val: 8 }, { op: 0, bits: 8, val: 136 }, { op: 0, bits: 8, val: 72 }, { op: 0, bits: 9, val: 241 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 84 }, { op: 0, bits: 8, val: 20 }, { op: 21, bits: 8, val: 227 }, { op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 116 }, { op: 0, bits: 8, val: 52 }, { op: 0, bits: 9, val: 201 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 100 }, { op: 0, bits: 8, val: 36 }, { op: 0, bits: 9, val: 169 }, { op: 0, bits: 8, val: 4 }, { op: 0, bits: 8, val: 132 }, { op: 0, bits: 8, val: 68 }, { op: 0, bits: 9, val: 233 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 92 }, { op: 0, bits: 8, val: 28 }, { op: 0, bits: 9, val: 153 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 124 }, { op: 0, bits: 8, val: 60 }, { op: 0, bits: 9, val: 217 }, { op: 18, bits: 7, val: 23 }, { op: 0, bits: 8, val: 108 }, { op: 0, bits: 8, val: 44 }, { op: 0, bits: 9, val: 185 }, { op: 0, bits: 8, val: 12 }, { op: 0, bits: 8, val: 140 }, { op: 0, bits: 8, val: 76 }, { op: 0, bits: 9, val: 249 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 82 }, { op: 0, bits: 8, val: 18 }, { op: 21, bits: 8, val: 163 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 114 }, { op: 0, bits: 8, val: 50 }, { op: 0, bits: 9, val: 197 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 98 }, { op: 0, bits: 8, val: 34 }, { op: 0, bits: 9, val: 165 }, { op: 0, bits: 8, val: 2 }, { op: 0, bits: 8, val: 130 }, { op: 0, bits: 8, val: 66 }, { op: 0, bits: 9, val: 229 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 90 }, { op: 0, bits: 8, val: 26 }, { op: 0, bits: 9, val: 149 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 122 }, { op: 0, bits: 8, val: 58 },{ op: 0, bits: 9, val: 213 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 106 }, { op: 0, bits: 8, val: 42 }, { op: 0, bits: 9, val: 181 }, { op: 0, bits: 8, val: 10 }, { op: 0, bits: 8, val: 138 },{ op: 0, bits: 8, val: 74 }, { op: 0, bits: 9, val: 245 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 86 }, { op: 0, bits: 8, val: 22 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 },{ op: 0, bits: 8, val: 118 }, { op: 0, bits: 8, val: 54 }, { op: 0, bits: 9, val: 205 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 102 }, { op: 0, bits: 8, val: 38 }, { op: 0, bits: 9, val: 173 },{ op: 0, bits: 8, val: 6 }, { op: 0, bits: 8, val: 134 }, { op: 0, bits: 8, val: 70 }, { op: 0, bits: 9, val: 237 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 94 }, { op: 0, bits: 8, val: 30 },{ op: 0, bits: 9, val: 157 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 126 }, { op: 0, bits: 8, val: 62 }, { op: 0, bits: 9, val: 221 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 110 }, { op: 0, bits: 8, val: 46 }, { op: 0, bits: 9, val: 189 }, { op: 0, bits: 8, val: 14 }, { op: 0, bits: 8, val: 142 }, { op: 0, bits: 8, val: 78 }, { op: 0, bits: 9, val: 253 }, { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 81 }, { op: 0, bits: 8, val: 17 }, { op: 21, bits: 8, val: 131 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 113 }, { op: 0, bits: 8, val: 49 }, { op: 0, bits: 9, val: 195 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 97 }, { op: 0, bits: 8, val: 33 }, { op: 0, bits: 9, val: 163 }, { op: 0, bits: 8, val: 1 }, { op: 0, bits: 8, val: 129 }, { op: 0, bits: 8, val: 65 }, { op: 0, bits: 9, val: 227 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 89 }, { op: 0, bits: 8, val: 25 }, { op: 0, bits: 9, val: 147 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 121 }, { op: 0, bits: 8, val: 57 }, { op: 0, bits: 9, val: 211 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 105 }, { op: 0, bits: 8, val: 41 }, { op: 0, bits: 9, val: 179 }, { op: 0, bits: 8, val: 9 },{ op: 0, bits: 8, val: 137 }, { op: 0, bits: 8, val: 73 }, { op: 0, bits: 9, val: 243 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 85 }, { op: 0, bits: 8, val: 21 }, { op: 16, bits: 8, val: 258 },{ op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 117 }, { op: 0, bits: 8, val: 53 }, { op: 0, bits: 9, val: 203 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 101 }, { op: 0, bits: 8, val: 37 },{ op: 0, bits: 9, val: 171 }, { op: 0, bits: 8, val: 5 }, { op: 0, bits: 8, val: 133 }, { op: 0, bits: 8, val: 69 }, { op: 0, bits: 9, val: 235 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 93 },{ op: 0, bits: 8, val: 29 }, { op: 0, bits: 9, val: 155 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 125 }, { op: 0, bits: 8, val: 61 }, { op: 0, bits: 9, val: 219 }, { op: 18, bits: 7, val: 23 },{ op: 0, bits: 8, val: 109 }, { op: 0, bits: 8, val: 45 }, { op: 0, bits: 9, val: 187 }, { op: 0, bits: 8, val: 13 }, { op: 0, bits: 8, val: 141 }, { op: 0, bits: 8, val: 77 }, { op: 0, bits: 9, val: 251 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 83 }, { op: 0, bits: 8, val: 19 }, { op: 21, bits: 8, val: 195 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 115 }, { op: 0, bits: 8, val: 51 }, { op: 0, bits: 9, val: 199 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 99 }, { op: 0, bits: 8, val: 35 }, { op: 0, bits: 9, val: 167 }, { op: 0, bits: 8, val: 3 }, { op: 0, bits: 8, val: 131 }, { op: 0, bits: 8, val: 67 }, { op: 0, bits: 9, val: 231 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 91 }, { op: 0, bits: 8, val: 27 }, { op: 0, bits: 9, val: 151 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 123 }, { op: 0, bits: 8, val: 59 }, { op: 0, bits: 9, val: 215 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 107 }, { op: 0, bits: 8, val: 43 }, { op: 0, bits: 9, val: 183 }, { op: 0, bits: 8, val: 11 }, { op: 0, bits: 8, val: 139 }, { op: 0, bits: 8, val: 75 }, { op: 0, bits: 9, val: 247 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 87 }, { op: 0, bits: 8, val: 23 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 }, { op: 0, bits: 8, val: 119 }, { op: 0, bits: 8, val: 55 }, { op: 0, bits: 9, val: 207 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 103 }, { op: 0, bits: 8, val: 39 }, { op: 0, bits: 9, val: 175 }, { op: 0, bits: 8, val: 7 }, { op: 0, bits: 8, val: 135 }, { op: 0, bits: 8, val: 71 }, { op: 0, bits: 9, val: 239 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 95 }, { op: 0, bits: 8, val: 31 }, { op: 0, bits: 9, val: 159 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 127 }, { op: 0, bits: 8, val: 63 }, { op: 0, bits: 9, val: 223 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 111 }, { op: 0, bits: 8, val: 47 }, { op: 0, bits: 9, val: 191 }, { op: 0, bits: 8, val: 15 }, { op: 0, bits: 8, val: 143 }, { op: 0, bits: 8, val: 79 }, { op: 0, bits: 9, val: 255 } ];
 | |
|     if (!distfix_ary) distfix_ary = [ { op: 16, bits: 5, val: 1 }, { op: 23, bits: 5, val: 257 }, { op: 19, bits: 5, val: 17 }, { op: 27, bits: 5, val: 4097 }, { op: 17, bits: 5, val: 5 }, { op: 25, bits: 5, val: 1025 }, { op: 21, bits: 5, val: 65 }, { op: 29, bits: 5, val: 16385 }, { op: 16, bits: 5, val: 3 }, { op: 24, bits: 5, val: 513 }, { op: 20, bits: 5, val: 33 }, { op: 28, bits: 5, val: 8193 }, { op: 18, bits: 5, val: 9 }, { op: 26, bits: 5, val: 2049 }, { op: 22, bits: 5, val: 129 }, { op: 64, bits: 5, val: 0 }, { op: 16, bits: 5, val: 2 }, { op: 23, bits: 5, val: 385 }, { op: 19, bits: 5, val: 25 }, { op: 27, bits: 5, val: 6145 }, { op: 17, bits: 5, val: 7 }, { op: 25, bits: 5, val: 1537 }, { op: 21, bits: 5, val: 97 }, { op: 29, bits: 5, val: 24577 }, { op: 16, bits: 5, val: 4 }, { op: 24, bits: 5, val: 769 }, { op: 20, bits: 5, val: 49 }, { op: 28, bits: 5, val: 12289 }, { op: 18, bits: 5, val: 13 }, { op: 26, bits: 5, val: 3073 }, { op: 22, bits: 5, val: 193 }, { op: 64, bits: 5, val: 0 } ];
 | |
|     state.lencode = 0;
 | |
|     state.distcode = 512;
 | |
|     for (i = 0; i < 512; i++) { state.codes[i] = lenfix_ary[i]; }
 | |
|     for (i = 0; i < 32; i++) { state.codes[i + 512] = distfix_ary[i]; }
 | |
|     state.lenbits = 9;
 | |
|     state.distbits = 5;
 | |
| }
 | |
| 
 | |
| /*
 | |
|   Update the window with the last wsize (normally 32K) bytes written before
 | |
|   returning.  If window does not exist yet, create it.  This is only called
 | |
|   when a window is already in use, or when output has been written during this
 | |
|   inflate call, but the end of the deflate stream has not been reached yet.
 | |
|   It is also called to create a window for dictionary data when a dictionary
 | |
|   is loaded.
 | |
| 
 | |
|   Providing output buffers larger than 32K to inflate() should provide a speed
 | |
|   advantage, since only the last 32K of output is copied to the sliding window
 | |
|   upon return from inflate(), and since all distances after the first 32K of
 | |
|   output will fall in the output data, making match copies simpler and faster.
 | |
|   The advantage may be dependent on the size of the processor's data caches.
 | |
| */
 | |
| function updatewindow(strm)
 | |
| {
 | |
|     var state = strm.state;
 | |
| 	var out = strm.output_data.length;
 | |
| 
 | |
|     /* if it hasn't been done already, allocate space for the window */
 | |
|     if (state.window === null) {
 | |
|         state.window = '';
 | |
| 	}
 | |
| 
 | |
|     /* if window not in use yet, initialize */
 | |
|     if (state.wsize == 0) {
 | |
|         state.wsize = 1 << state.wbits;
 | |
| 	}
 | |
| 
 | |
|     // zlib.js: Sliding window
 | |
|     if (out >= state.wsize) {
 | |
|         state.window = strm.output_data.substring(out - state.wsize);
 | |
| 	} else {
 | |
| 		if(state.whave + out < state.wsize) {
 | |
| 			state.window += strm.output_data;
 | |
| 		} else {
 | |
| 			state.window = state.window.substring(state.whave - (state.wsize - out)) + strm.output_data;
 | |
| 		}
 | |
| 	}
 | |
|     state.whave = state.window.length;
 | |
| 	if(state.whave < state.wsize) {
 | |
| 		state.wnext = state.whave;
 | |
| 	} else {
 | |
| 		state.wnext = 0;
 | |
| 	}
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| // #ifdef GUNZIP
 | |
| function CRC2(strm, word)
 | |
| {
 | |
| 	var hbuf = [word & 0xff, (word >>> 8) & 0xff];
 | |
| 	strm.state.check = strm.checksum_function(strm.state.check, hbuf, 0, 2);
 | |
| }
 | |
| 
 | |
| function CRC4(strm, word)
 | |
| {
 | |
| 	var hbuf = [word & 0xff,
 | |
| 				(word >>> 8) & 0xff,
 | |
| 				(word >>> 16) & 0xff,
 | |
| 				(word >>> 24) & 0xff];
 | |
| 	strm.state.check = strm.checksum_function(strm.state.check, hbuf, 0, 4);
 | |
| }
 | |
| 
 | |
| /* Load registers with state in inflate() for speed */
 | |
| function LOAD(strm, s)
 | |
| {
 | |
|     s.strm = strm;            /* z_stream */
 | |
|     s.left = strm.avail_out;  /* available output */
 | |
|     s.next = strm.next_in; /* next input */
 | |
|     s.have = strm.avail_in;   /* available input */
 | |
|     s.hold = strm.state.hold; /* bit buffer */
 | |
|     s.bits = strm.state.bits; /* bits in bit buffer */
 | |
|     return s;
 | |
| }
 | |
| 
 | |
| /* Restore state from registers in inflate() */
 | |
| function RESTORE(s)
 | |
| {
 | |
|     var strm = s.strm;
 | |
|     strm.next_in = s.next;
 | |
|     strm.avail_out = s.left;
 | |
|     strm.avail_in = s.have;
 | |
|     strm.state.hold = s.hold;
 | |
|     strm.state.bits = s.bits;
 | |
| }
 | |
| 
 | |
| /* Clear the input bit accumulator */
 | |
| function INITBITS(s)
 | |
| {
 | |
|     s.hold = 0;
 | |
|     s.bits = 0;
 | |
| }
 | |
| 
 | |
| /* Get a byte of input into the bit accumulator, or return from inflate()
 | |
|    if there is no input available. */
 | |
| function PULLBYTE(s)
 | |
| {
 | |
|     if (s.have == 0) return false;
 | |
|     s.have--;
 | |
|     s.hold += (s.strm.input_data.charCodeAt(s.next++) & 0xff) << s.bits;
 | |
|     s.bits += 8;
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| /* Assure that there are at least n bits in the bit accumulator.  If there is
 | |
|    not enough available input to do that, then return from inflate(). */
 | |
| function NEEDBITS(s, n)
 | |
| {
 | |
|     // if(typeof n != 'number') throw 'ERROR';
 | |
|     while (s.bits < n) {
 | |
|         if(!PULLBYTE(s))
 | |
|             return false;
 | |
|     }
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| /* Return the low n bits of the bit accumulator (n < 16) */
 | |
| function BITS(s, n)
 | |
| {
 | |
|     return s.hold & ((1 << n) - 1);
 | |
| }
 | |
| 
 | |
| /* Remove n bits from the bit accumulator */
 | |
| function DROPBITS(s, n)
 | |
| {
 | |
|     // if(typeof n != 'number') throw 'ERROR';
 | |
|     s.hold >>>= n;
 | |
|     s.bits -= n;
 | |
| }
 | |
| 
 | |
| /* Remove zero to seven bits as needed to go to a byte boundary */
 | |
| function BYTEBITS(s)
 | |
| {
 | |
|     s.hold >>>= s.bits & 7;
 | |
|     s.bits -= s.bits & 7;
 | |
| }
 | |
| 
 | |
| /* Reverse the bytes in a 32-bit value */
 | |
| function REVERSE(q)
 | |
| {
 | |
|     return ((q >>> 24) & 0xff) +
 | |
| 		((q >>> 8) & 0xff00) +
 | |
| 		((q & 0xff00) << 8) +
 | |
| 		((q & 0xff) << 24);
 | |
| }
 | |
| 
 | |
| /*
 | |
|    inflate() uses a state machine to process as much input data and generate as
 | |
|    much output data as possible before returning.  The state machine is
 | |
|    structured roughly as follows:
 | |
| 
 | |
|     for (;;) switch (state) {
 | |
|     ...
 | |
|     case STATEn:
 | |
|         if (not enough input data or output space to make progress)
 | |
|             return;
 | |
|         ... make progress ...
 | |
|         state = STATEm;
 | |
|         break;
 | |
|     ...
 | |
|     }
 | |
| 
 | |
|    so when inflate() is called again, the same case is attempted again, and
 | |
|    if the appropriate resources are provided, the machine proceeds to the
 | |
|    next state.  The NEEDBITS() macro is usually the way the state evaluates
 | |
|    whether it can proceed or should return.  NEEDBITS() does the return if
 | |
|    the requested bits are not available.  The typical use of the BITS macros
 | |
|    is:
 | |
| 
 | |
|         NEEDBITS(n);
 | |
|         ... do something with BITS(n) ...
 | |
|         DROPBITS(n);
 | |
| 
 | |
|    where NEEDBITS(n) either returns from inflate() if there isn't enough
 | |
|    input left to load n bits into the accumulator, or it continues.  BITS(n)
 | |
|    gives the low n bits in the accumulator.  When done, DROPBITS(n) drops
 | |
|    the low n bits off the accumulator.  INITBITS() clears the accumulator
 | |
|    and sets the number of available bits to zero.  BYTEBITS() discards just
 | |
|    enough bits to put the accumulator on a byte boundary.  After BYTEBITS()
 | |
|    and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
 | |
| 
 | |
|    NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
 | |
|    if there is no input available.  The decoding of variable length codes uses
 | |
|    PULLBYTE() directly in order to pull just enough bytes to decode the next
 | |
|    code, and no more.
 | |
| 
 | |
|    Some states loop until they get enough input, making sure that enough
 | |
|    state information is maintained to continue the loop where it left off
 | |
|    if NEEDBITS() returns in the loop.  For example, want, need, and keep
 | |
|    would all have to actually be part of the saved state in case NEEDBITS()
 | |
|    returns:
 | |
| 
 | |
|     case STATEw:
 | |
|         while (want < need) {
 | |
|             NEEDBITS(n);
 | |
|             keep[want++] = BITS(n);
 | |
|             DROPBITS(n);
 | |
|         }
 | |
|         state = STATEx;
 | |
|     case STATEx:
 | |
| 
 | |
|    As shown above, if the next state is also the next case, then the break
 | |
|    is omitted.
 | |
| 
 | |
|    A state may also return if there is not enough output space available to
 | |
|    complete that state.  Those states are copying stored data, writing a
 | |
|    literal byte, and copying a matching string.
 | |
| 
 | |
|    When returning, a "goto inf_leave" is used to update the total counters,
 | |
|    update the check value, and determine whether any progress has been made
 | |
|    during that inflate() call in order to return the proper return code.
 | |
|    Progress is defined as a change in either strm->avail_in or strm->avail_out.
 | |
|    When there is a window, goto inf_leave will update the window with the last
 | |
|    output written.  If a goto inf_leave occurs in the middle of decompression
 | |
|    and there is no window currently, goto inf_leave will create one and copy
 | |
|    output to the window for the next call of inflate().
 | |
| 
 | |
|    In this implementation, the flush parameter of inflate() only affects the
 | |
|    return code (per zlib.h).  inflate() always writes as much as possible to
 | |
|    strm->next_out, given the space available and the provided input--the effect
 | |
|    documented in zlib.h of Z_SYNC_FLUSH.  Furthermore, inflate() always defers
 | |
|    the allocation of and copying into a sliding window until necessary, which
 | |
|    provides the effect documented in zlib.h for Z_FINISH when the entire input
 | |
|    stream available.  So the only thing the flush parameter actually does is:
 | |
|    when flush is set to Z_FINISH, inflate() cannot return Z_OK.  Instead it
 | |
|    will return Z_BUF_ERROR if it has not reached the end of the stream.
 | |
|  */
 | |
| 
 | |
| /* permutation of code lengths */
 | |
| var inflate_order = [
 | |
|     16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
 | |
| ZLIB.inflate = function(strm, flush)
 | |
| {
 | |
|     var state;
 | |
|     var s;
 | |
|     var _in, out;          /* save starting available input and output */
 | |
|     var copy;              /* number of stored or match bytes to copy */
 | |
|     var from_window_offset = -1; /* index of window[] */
 | |
|     var from_out_offset = -1; /* index of next_out[] */
 | |
|     var here;              /* current decoding table entry */
 | |
|     var last;              /* parent table entry */
 | |
|     var len;               /* length to copy for repeats, bits to drop */
 | |
|     var ret;               /* return code */
 | |
| 
 | |
|     if (!strm || !strm.state ||
 | |
|         (!strm.input_data && strm.avail_in != 0))
 | |
|         return ZLIB.Z_STREAM_ERROR;
 | |
| 
 | |
|     state = strm.state;
 | |
|     if (state.mode == TYPE) state.mode = TYPEDO;      /* skip check */
 | |
| 
 | |
|     // LOAD
 | |
|     s = {};
 | |
|     LOAD(strm, s);
 | |
| 
 | |
|     _in = s.have;
 | |
|     out = s.left;
 | |
|     ret = ZLIB.Z_OK;
 | |
| inf_leave: for (;;) {
 | |
|         switch (state.mode) {
 | |
|         case HEAD:
 | |
|             if (state.wrap == 0) {
 | |
|                 state.mode = TYPEDO;
 | |
|                 break;
 | |
|             }
 | |
|             if(!NEEDBITS(s, 16)) break inf_leave;
 | |
| // #ifdef GUNZIP
 | |
|             if ((state.wrap & 2) && s.hold == 0x8b1f) {  /* gzip header */
 | |
|                 state.check = strm.checksum_function(0, null, 0, 0);
 | |
|                 CRC2(strm, s.hold);
 | |
|                 INITBITS(s);
 | |
|                 state.mode = FLAGS;
 | |
|                 break;
 | |
|             }
 | |
|             state.flags = 0;           /* expect zlib header */
 | |
|             if (state.head !== null)
 | |
|                 state.head.done = -1;
 | |
|             if (!(state.wrap & 1) ||   /* check if zlib header allowed */
 | |
| //#else
 | |
| //          if (
 | |
| //#endif
 | |
|                 ((BITS(s, 8) << 8) + (s.hold >>> 8)) % 31) {
 | |
|                 strm.msg = 'incorrect header check';
 | |
|                 state.mode = BAD;
 | |
|                 break;
 | |
|             }
 | |
|             if (BITS(s, 4) != ZLIB.Z_DEFLATED) {
 | |
|                 strm.msg = 'unknown compression method';
 | |
|                 state.mode = BAD;
 | |
|                 break;
 | |
|             }
 | |
| 
 | |
|             DROPBITS(s, 4);
 | |
|             len = BITS(s, 4) + 8;
 | |
|             if (state.wbits == 0)
 | |
|                 state.wbits = len;
 | |
|             else if (len > state.wbits) {
 | |
|                 strm.msg = 'invalid window size';
 | |
|                 state.mode = BAD;
 | |
|                 break;
 | |
|             }
 | |
|             state.dmax = 1 << len;
 | |
| //            Tracev((stderr, "inflate:   zlib header ok\n"));
 | |
| 			strm.adler = state.check = strm.checksum_function(0, null, 0, 0);
 | |
|             state.mode = s.hold & 0x200 ? DICTID : TYPE;
 | |
|             INITBITS(s);
 | |
|             break;
 | |
| // #ifdef GUNZIP
 | |
|         case FLAGS:
 | |
|             if(!NEEDBITS(s, 16)) break inf_leave;
 | |
|             state.flags = s.hold;
 | |
|             if ((state.flags & 0xff) != ZLIB.Z_DEFLATED) {
 | |
|                 strm.msg = "unknown compression method";
 | |
|                 state.mode = BAD;
 | |
|                 break;
 | |
|             }
 | |
|             if (state.flags & 0xe000) {
 | |
|                 strm.msg = "unknown header flags set";
 | |
|                 state.mode = BAD;
 | |
|                 break;
 | |
|             }
 | |
|             if (state.head !== null)
 | |
|                 state.head.text = (s.hold >>> 8) & 1;
 | |
|             if (state.flags & 0x0200) {
 | |
| 				CRC2(strm, s.hold);
 | |
| 			}
 | |
|             INITBITS(s);
 | |
|             state.mode = TIME;
 | |
|         case TIME:
 | |
|             if(!NEEDBITS(s, 32)) break inf_leave;
 | |
|             if (state.head !== null)
 | |
|                 state.head.time = s.hold;
 | |
|             if (state.flags & 0x0200) {
 | |
| 				CRC4(strm, s.hold);
 | |
| 			}
 | |
|             INITBITS(s);
 | |
|             state.mode = OS;
 | |
|         case OS:
 | |
|             if(!NEEDBITS(s, 16)) break inf_leave;
 | |
|             if (state.head !== null) {
 | |
|                 state.head.xflags = s.hold & 0xff;
 | |
|                 state.head.os = s.hold >>> 8;
 | |
|             }
 | |
|             if (state.flags & 0x0200) {
 | |
| 				CRC2(strm, s.hold);
 | |
| 			}
 | |
|             INITBITS(s);
 | |
|             state.mode = EXLEN;
 | |
|         case EXLEN:
 | |
|             if (state.flags & 0x0400) {
 | |
|                 if(!NEEDBITS(s, 16)) break inf_leave;
 | |
|                 state.length = s.hold;
 | |
|                 if (state.head !== null) {
 | |
|                     state.head.extra_len = s.hold;
 | |
| 				}
 | |
|                 if (state.flags & 0x0200) {
 | |
| 					CRC2(strm, s.hold);
 | |
| 				}
 | |
|                 INITBITS(s);
 | |
| 				state.head.extra = "";
 | |
|             }
 | |
|             else if (state.head !== null) {
 | |
|                 state.head.extra = null;
 | |
| 			}
 | |
|             state.mode = EXTRA;
 | |
|         case EXTRA:
 | |
|             if (state.flags & 0x0400) {
 | |
|                 copy = state.length;
 | |
|                 if (copy > s.have) copy = s.have;
 | |
|                 if (copy) {
 | |
|                     if (state.head !== null &&
 | |
|                         state.head.extra !== null) {
 | |
|                         len = state.head.extra_len - state.length;
 | |
| /*
 | |
|                         zmemcpy(state->head->extra + len, next,
 | |
|                                 len + copy > state->head->extra_max ?
 | |
|                                 state->head->extra_max - len : copy);
 | |
| */
 | |
| 						state.head.extra += strm.input_data.substring(
 | |
| 							s.next, s.next + (len + copy > state.head.extra_max ?
 | |
| 											  state.head.extra_max - len : copy));
 | |
| 						
 | |
|                     }
 | |
|                     if (state.flags & 0x0200)
 | |
|                         state.check = strm.checksum_function(state.check, strm.input_data, s.next, copy);
 | |
|                     s.have -= copy;
 | |
|                     s.next += copy;
 | |
|                     state.length -= copy;
 | |
|                 }
 | |
|                 if (state.length) break inf_leave;
 | |
|             }
 | |
|             state.length = 0;
 | |
|             state.mode = NAME;
 | |
|         case NAME:
 | |
|             if (state.flags & 0x0800) {
 | |
|                 if (s.have == 0) break inf_leave;
 | |
| 				if (state.head !== null && state.head.name === null) {
 | |
| 					state.head.name = "";
 | |
| 				}
 | |
|                 copy = 0;
 | |
| 				// TODO end = strm.input_data.indexOf("\0", s.next);
 | |
| 				// TODO state.length => state.head.name.length
 | |
|                 do {
 | |
|                     len = strm.input_data.charAt(s.next + copy); copy++;
 | |
| 					if(len === "\0")
 | |
| 						break;
 | |
|                     if (state.head !== null &&
 | |
| 						state.length < state.head.name_max) {
 | |
|                         state.head.name += len;
 | |
| 						state.length++;
 | |
| 					}
 | |
|                 } while (copy < s.have);
 | |
|                 if (state.flags & 0x0200) {
 | |
|                     state.check = strm.checksum_function(state.check, strm.input_data, s.next, copy);
 | |
| 				}
 | |
|                 s.have -= copy;
 | |
|                 s.next += copy;
 | |
|                 if (len !== "\0") break inf_leave;
 | |
|             }
 | |
|             else if (state.head !== null)
 | |
|                 state.head.name = null;
 | |
|             state.length = 0;
 | |
|             state.mode = COMMENT;
 | |
|         case COMMENT:
 | |
|             if (state.flags & 0x1000) {
 | |
|                 if (s.have == 0) break inf_leave;
 | |
|                 copy = 0;
 | |
| 				if (state.head !== null && state.head.comment === null) {
 | |
| 					state.head.comment = "";
 | |
| 				}
 | |
| 				// TODO end = strm.input_data.indexOf("\0", s.next);
 | |
| 				// TODO state.length => state.head.comment.length
 | |
|                 do {
 | |
|                     len = strm.input_data.charAt(s.next + copy); copy++;
 | |
| 					if(len === "\0")
 | |
| 						break;
 | |
|                     if (state.head !== null &&
 | |
| 						state.length < state.head.comm_max) {
 | |
|                         state.head.comment += len;
 | |
| 						state.length++;
 | |
| 					}
 | |
|                 } while (copy < s.have);
 | |
|                 if (state.flags & 0x0200)
 | |
|                     state.check = strm.checksum_function(state.check, strm.input_data, s.next, copy);
 | |
|                 s.have -= copy;
 | |
|                 s.next += copy;
 | |
|                 if (len !== "\0") break inf_leave;
 | |
|             }
 | |
|             else if (state.head !== null)
 | |
|                 state.head.comment = null;
 | |
|             state.mode = HCRC;
 | |
|         case HCRC:
 | |
|             if (state.flags & 0x0200) {
 | |
|                 if(!NEEDBITS(s, 16)) break inf_leave;
 | |
|                 if (s.hold != (state.check & 0xffff)) {
 | |
|                     strm.msg = "header crc mismatch";
 | |
|                     state.mode = BAD;
 | |
|                     break;
 | |
|                 }
 | |
|                 INITBITS(s);
 | |
|             }
 | |
|             if (state.head !== null) {
 | |
|                 state.head.hcrc = (state.flags >>> 9) & 1;
 | |
|                 state.head.done = 1;
 | |
|             }
 | |
|             strm.adler = state.check = strm.checksum_function(0, null, 0, 0);
 | |
|             state.mode = TYPE;
 | |
|             break;
 | |
| //#endif
 | |
|         case DICTID:
 | |
|             if(!NEEDBITS(s, 32)) break inf_leave;
 | |
|             strm.adler = state.check = REVERSE(s.hold);
 | |
|             INITBITS(s);
 | |
|             state.mode = DICT;
 | |
|         case DICT:
 | |
|             if (state.havedict == 0) {
 | |
|                 RESTORE(s);
 | |
|                 return ZLIB.Z_NEED_DICT;
 | |
|             }
 | |
| 			strm.adler = state.check = strm.checksum_function(0, null, 0, 0);
 | |
|             state.mode = TYPE;
 | |
|         case TYPE:
 | |
|             if (flush == ZLIB.Z_BLOCK || flush == ZLIB.Z_TREES) break inf_leave;
 | |
|         case TYPEDO:
 | |
|             if (state.last) {
 | |
|                 BYTEBITS(s);
 | |
|                 state.mode = CHECK;
 | |
|                 break;
 | |
|             }
 | |
|             if(!NEEDBITS(s, 3)) break inf_leave;
 | |
|             state.last = BITS(s, 1);
 | |
|             DROPBITS(s, 1);
 | |
|             switch (BITS(s, 2)) {
 | |
|             case 0:                             /* stored block */
 | |
| //                Tracev((stderr, "inflate:     stored block%s\n",
 | |
| //                        state->last ? " (last)" : ""));
 | |
|                 state.mode = STORED;
 | |
|                 break;
 | |
|             case 1:                             /* fixed block */
 | |
|                 fixedtables(state);
 | |
| //                Tracev((stderr, "inflate:     fixed codes block%s\n",
 | |
| //                        state->last ? " (last)" : ""));
 | |
|                 state.mode = LEN_;             /* decode codes */
 | |
|                 if (flush == ZLIB.Z_TREES) {
 | |
|                     DROPBITS(s, 2);
 | |
|                     break inf_leave;
 | |
|                 }
 | |
|                 break;
 | |
|             case 2:                             /* dynamic block */
 | |
| //                Tracev((stderr, "inflate:     dynamic codes block%s\n",
 | |
| //                        state->last ? " (last)" : ""));
 | |
|                 state.mode = TABLE;
 | |
|                 break;
 | |
|             case 3:
 | |
|                 strm.msg = 'invalid block type';
 | |
|                 state.mode = BAD;
 | |
|             }
 | |
|             DROPBITS(s, 2);
 | |
|             break;
 | |
|         case STORED:
 | |
|             BYTEBITS(s);                         /* go to byte boundary */
 | |
|             if(!NEEDBITS(s, 32)) break inf_leave;
 | |
|             if ((s.hold & 0xffff) != (((s.hold >>> 16) & 0xffff) ^ 0xffff)) {
 | |
|                 strm.msg = 'invalid stored block lengths';
 | |
|                 state.mode = BAD;
 | |
|                 break;
 | |
|             }
 | |
|             state.length = s.hold & 0xffff;
 | |
| //            Tracev((stderr, "inflate:       stored length %u\n",
 | |
| //                    state->length));
 | |
|             INITBITS(s);
 | |
|             state.mode = COPY_;
 | |
|             if (flush == ZLIB.Z_TREES) break inf_leave;
 | |
|         case COPY_:
 | |
|             state.mode = COPY;
 | |
|         case COPY:
 | |
|             copy = state.length;
 | |
|             if (copy) {
 | |
|                 if (copy > s.have) copy = s.have;
 | |
|                 if (copy > s.left) copy = s.left;
 | |
|                 if (copy == 0) break inf_leave;
 | |
|                 strm.output_data += strm.input_data.substring(s.next, s.next + copy);
 | |
|                 strm.next_out += copy;
 | |
|                 s.have -= copy;
 | |
|                 s.next += copy;
 | |
|                 s.left -= copy;
 | |
|                 state.length -= copy;
 | |
|                 break;
 | |
|             }
 | |
| //            Tracev((stderr, "inflate:       stored end\n"));
 | |
|             state.mode = TYPE;
 | |
|             break;
 | |
|         case TABLE:
 | |
|             if(!NEEDBITS(s, 14)) break inf_leave;
 | |
|             state.nlen = BITS(s, 5) + 257;
 | |
|             DROPBITS(s, 5);
 | |
|             state.ndist = BITS(s, 5) + 1;
 | |
|             DROPBITS(s, 5);
 | |
|             state.ncode = BITS(s, 4) + 4;
 | |
|             DROPBITS(s, 4);
 | |
| //#ifndef PKZIP_BUG_WORKAROUND
 | |
|             if (state.nlen > 286 || state.ndist > 30) {
 | |
|                 strm.msg = 'too many length or distance symbols';
 | |
|                 state.mode = BAD;
 | |
|                 break;
 | |
|             }
 | |
| //#endif
 | |
| //            Tracev((stderr, "inflate:       table sizes ok\n"));
 | |
|             state.have = 0;
 | |
|             state.mode = LENLENS;
 | |
|         case LENLENS:
 | |
|             while (state.have < state.ncode) {
 | |
|                 if(!NEEDBITS(s, 3)) break inf_leave;
 | |
|                 var tmp = BITS(s, 3);
 | |
|                 state.lens[inflate_order[state.have++]] = tmp;
 | |
|                 DROPBITS(s, 3);
 | |
|             }
 | |
|             while (state.have < 19)
 | |
|                 state.lens[inflate_order[state.have++]] = 0;
 | |
|             state.next = 0;
 | |
|             state.lencode = 0;
 | |
|             state.lenbits = 7;
 | |
| 
 | |
| //            ret = inflate_table(CODES, state->lens, 19, &(state->next),
 | |
| //                                &(state->lenbits), state->work);
 | |
|             ret = inflate_table(state, CODES);
 | |
| 
 | |
|             if (ret) {
 | |
|                 strm.msg = 'invalid code lengths set';
 | |
|                 state.mode = BAD;
 | |
|                 break;
 | |
|             }
 | |
| //            Tracev((stderr, "inflate:       code lengths ok\n"));
 | |
|             state.have = 0;
 | |
|             state.mode = CODELENS;
 | |
|         case CODELENS:
 | |
|             while (state.have < state.nlen + state.ndist) {
 | |
|                 for (;;) {
 | |
|                     here = state.codes[state.lencode + BITS(s, state.lenbits)];
 | |
|                     if (here.bits <= s.bits) break;
 | |
|                     if(!PULLBYTE(s)) break inf_leave;
 | |
|                 }
 | |
|                 if (here.val < 16) {
 | |
|                     DROPBITS(s, here.bits);
 | |
|                     state.lens[state.have++] = here.val;
 | |
|                 }
 | |
|                 else {
 | |
|                     if (here.val == 16) {
 | |
|                         if(!NEEDBITS(s, here.bits + 2)) break inf_leave;
 | |
|                         DROPBITS(s, here.bits);
 | |
|                         if (state.have == 0) {
 | |
|                             strm.msg = 'invalid bit length repeat';
 | |
|                             state.mode = BAD;
 | |
|                             break;
 | |
|                         }
 | |
|                         len = state.lens[state.have - 1];
 | |
|                         copy = 3 + BITS(s, 2);
 | |
|                         DROPBITS(s, 2);
 | |
|                     }
 | |
|                     else if (here.val == 17) {
 | |
|                         if(!NEEDBITS(s, here.bits + 3)) break inf_leave;
 | |
|                         DROPBITS(s, here.bits);
 | |
|                         len = 0;
 | |
|                         copy = 3 + BITS(s, 3);
 | |
|                         DROPBITS(s, 3);
 | |
|                     }
 | |
|                     else {
 | |
|                         if(!NEEDBITS(s, here.bits + 7)) break inf_leave;
 | |
|                         DROPBITS(s, here.bits);
 | |
|                         len = 0;
 | |
|                         copy = 11 + BITS(s, 7);
 | |
|                         DROPBITS(s, 7);
 | |
|                     }
 | |
|                     if (state.have + copy > state.nlen + state.ndist) {
 | |
|                         strm.msg = 'invalid bit length repeat';
 | |
|                         state.mode = BAD;
 | |
|                         break;
 | |
|                     }
 | |
|                     while (copy--)
 | |
|                         state.lens[state.have++] = len;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             /* handle error breaks in while */
 | |
|             if (state.mode == BAD) break;
 | |
| 
 | |
|             /* check for end-of-block code (better have one) */
 | |
|             if (state.lens[256] == 0) {
 | |
|                 strm.msg = 'invalid code -- missing end-of-block';
 | |
|                 state.mode = BAD;
 | |
|                 break;
 | |
|             }
 | |
| 
 | |
|             /* build code tables -- note: do not change the lenbits or distbits
 | |
|                values here (9 and 6) without reading the comments in inftrees.h
 | |
|                concerning the ENOUGH constants, which depend on those values */
 | |
|             state.next = 0;
 | |
|             state.lencode = state.next;
 | |
|             state.lenbits = 9;
 | |
| //            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
 | |
| //                                &(state->lenbits), state->work);
 | |
|             ret = inflate_table(state, LENS);
 | |
|             if (ret) {
 | |
|                 strm.msg = 'invalid literal/lengths set';
 | |
|                 state.mode = BAD;
 | |
|                 break;
 | |
|             }
 | |
|             state.distcode = state.next;
 | |
|             state.distbits = 6;
 | |
| //            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next),
 | |
| //                                                                &(state->distbits), state->work);
 | |
|             ret = inflate_table(state, DISTS);
 | |
|             if (ret) {
 | |
|                 strm.msg = 'invalid distances set';
 | |
|                 state.mode = BAD;
 | |
|                 break;
 | |
|             }
 | |
| //            Tracev((stderr, "inflate:       codes ok\n"));
 | |
|             state.mode = LEN_;
 | |
|             if (flush == ZLIB.Z_TREES) break inf_leave;
 | |
|         case LEN_:
 | |
|             state.mode = LEN;
 | |
|         case LEN:
 | |
|             if (s.have >= 6 && s.left >= 258) {
 | |
|                 RESTORE(s);
 | |
|                 inflate_fast(strm, out);
 | |
|                 LOAD(strm, s);
 | |
|                 if (state.mode == TYPE)
 | |
|                     state.back = -1;
 | |
|                 break;
 | |
|             }
 | |
|             state.back = 0;
 | |
|             for (;;) {
 | |
|                 here = state.codes[state.lencode + BITS(s, state.lenbits)];
 | |
|                 if (here.bits <= s.bits) break;
 | |
|                 if(!PULLBYTE(s)) break inf_leave;
 | |
|             }
 | |
|             if (here.op && (here.op & 0xf0) == 0) {
 | |
|                 last = here;
 | |
|                 for (;;) {
 | |
|                     here = state.codes[state.lencode + last.val +
 | |
|                                        (BITS(s, last.bits + last.op) >>> last.bits)];
 | |
|                     if (last.bits + here.bits <= s.bits) break;
 | |
|                     if(!PULLBYTE(s)) break inf_leave;
 | |
|                 }
 | |
|                 DROPBITS(s, last.bits);
 | |
|                 state.back += last.bits;
 | |
|             }
 | |
|             DROPBITS(s, here.bits);
 | |
|             state.back += here.bits;
 | |
|             state.length = here.val;
 | |
|             if (here.op == 0) {
 | |
| //              Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
 | |
| //                        "inflate:         literal '%c'\n" :
 | |
| //                        "inflate:         literal 0x%02x\n", here.val));
 | |
|                 state.mode = LIT;
 | |
|                 break;
 | |
|             }
 | |
|             if (here.op & 32) {
 | |
| //                Tracevv((stderr, "inflate:         end of block\n"));
 | |
|                 state.back = -1;
 | |
|                 state.mode = TYPE;
 | |
|                 break;
 | |
|             }
 | |
|             if (here.op & 64) {
 | |
|                 strm.msg = 'invalid literal/length code';
 | |
|                 state.mode = BAD;
 | |
|                 break;
 | |
|             }
 | |
|             state.extra = here.op & 15;
 | |
|             state.mode = LENEXT;
 | |
|         case LENEXT:
 | |
|             if (state.extra) {
 | |
|                 if(!NEEDBITS(s, state.extra)) break inf_leave;
 | |
|                 state.length += BITS(s, state.extra);
 | |
|                 DROPBITS(s, state.extra);
 | |
|                 state.back += state.extra;
 | |
|             }
 | |
|             //Tracevv((stderr, "inflate:         length %u\n", state->length));
 | |
|             state.was = state.length;
 | |
|             state.mode = DIST;
 | |
|         case DIST:
 | |
|             for (;;) {
 | |
|                 here = state.codes[state.distcode + BITS(s, state.distbits)];
 | |
|                 if (here.bits <= s.bits) break;
 | |
|                 if(!PULLBYTE(s)) break inf_leave;
 | |
|             }
 | |
|             if ((here.op & 0xf0) == 0) {
 | |
|                 last = here;
 | |
|                 for (;;) {
 | |
|                     here = state.codes[state.distcode + last.val +
 | |
|                                        (BITS(s, last.bits + last.op) >>> last.bits)];
 | |
|                     if ((last.bits + here.bits) <= s.bits) break;
 | |
|                     if(!PULLBYTE(s)) break inf_leave;
 | |
|                 }
 | |
|                 DROPBITS(s, last.bits);
 | |
|                 state.back += last.bits;
 | |
|             }
 | |
|             DROPBITS(s, here.bits);
 | |
|             state.back += here.bits;
 | |
|             if (here.op & 64) {
 | |
|                 strm.msg = 'invalid distance code';
 | |
|                 state.mode = BAD;
 | |
|                 break;
 | |
|             }
 | |
|             state.offset = here.val;
 | |
|             state.extra = here.op & 15;
 | |
|             state.mode = DISTEXT;
 | |
|         case DISTEXT:
 | |
|             if (state.extra) {
 | |
|                 if(!NEEDBITS(s, state.extra)) break inf_leave;
 | |
|                 state.offset += BITS(s, state.extra);
 | |
|                 DROPBITS(s, state.extra);
 | |
|                 state.back += state.extra;
 | |
|             }
 | |
| //NOSPRT #ifdef INFLATE_STRICT
 | |
| //            if (state->offset > state->dmax) {
 | |
| //                strm->msg = (char *)"invalid distance too far back";
 | |
| //                state->mode = BAD;
 | |
| //                break;
 | |
| //            }
 | |
| //#endif
 | |
| //            Tracevv((stderr, "inflate:         distance %u\n", state->offset));
 | |
|             state.mode = MATCH;
 | |
|         case MATCH:
 | |
|             if (s.left == 0) break inf_leave;
 | |
|             copy = out - s.left;
 | |
|             if (state.offset > copy) {         /* copy from window */
 | |
|                 copy = state.offset - copy;
 | |
|                 if (copy > state.whave) {
 | |
|                     if (state.sane) {
 | |
|                         strm.msg = 'invalid distance too far back';
 | |
|                         state.mode = BAD;
 | |
|                         break;
 | |
|                     }
 | |
| //NOSPRT #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
 | |
| //                    Trace((stderr, "inflate.c too far\n"));
 | |
| //                    copy -= state->whave;
 | |
| //                    if (copy > state->length) copy = state->length;
 | |
| //                    if (copy > left) copy = left;
 | |
| //                    left -= copy;
 | |
| //                    state->length -= copy;
 | |
| //                    do {
 | |
| //                        *put++ = 0;
 | |
| //                    } while (--copy);
 | |
| //                    if (state->length == 0) state->mode = LEN;
 | |
| //                    break;
 | |
| //#endif
 | |
|                 }
 | |
|                 if (copy > state.wnext) {
 | |
|                     copy -= state.wnext;
 | |
|                     // from = state->window + (state->wsize - copy);
 | |
|                     from_window_offset = state.wsize - copy;
 | |
|                     from_out_offset = -1;
 | |
|                 }
 | |
|                 else {
 | |
|                     // from = state->window + (state->wnext - copy);
 | |
|                     from_window_offset = state.wnext - copy;
 | |
|                     from_out_offset = -1;
 | |
|                 }
 | |
|                 if (copy > state.length) copy = state.length;
 | |
|             }
 | |
|             else {                              /* copy from output */
 | |
|                 // from = put - state->offset;
 | |
|                 from_window_offset = -1;
 | |
|                 from_out_offset = strm.next_out - state.offset;
 | |
|                 copy = state.length;
 | |
|             }
 | |
|             if (copy > s.left) copy = s.left;
 | |
|             s.left -= copy;
 | |
|             state.length -= copy;
 | |
|             if( from_window_offset >= 0 ) {
 | |
|                 strm.output_data += state.window.substring(from_window_offset, from_window_offset + copy);
 | |
|                 strm.next_out += copy;
 | |
|                 copy = 0;
 | |
|             } else {
 | |
|                 strm.next_out += copy;
 | |
|                 do {
 | |
|                     strm.output_data += strm.output_data.charAt(from_out_offset++);
 | |
|                 } while (--copy);
 | |
|             }
 | |
|             if (state.length == 0) state.mode = LEN;
 | |
|             break;
 | |
|         case LIT:
 | |
|             if (s.left == 0) break inf_leave;
 | |
| 
 | |
|             strm.output_data += String.fromCharCode(state.length);
 | |
|             strm.next_out++;
 | |
|             //*put++ = (unsigned char)(state->length);
 | |
| 
 | |
|             s.left--;
 | |
|             state.mode = LEN;
 | |
|             break;
 | |
|         case CHECK:
 | |
|             if (state.wrap) {
 | |
|                 if(!NEEDBITS(s, 32)) break inf_leave;
 | |
|                 out -= s.left;
 | |
|                 strm.total_out += out;
 | |
|                 state.total += out;
 | |
|                 if (out)
 | |
|                     strm.adler = state.check =
 | |
|                         strm.checksum_function(state.check, strm.output_data, strm.output_data.length - out, out);
 | |
|                 out = s.left;
 | |
|                 if ((
 | |
| // #ifdef GUNZIP
 | |
|                      state.flags ? s.hold :
 | |
| //#endif
 | |
|                      REVERSE(s.hold)) != state.check) {
 | |
|                     strm.msg = "incorrect data check";
 | |
|                     state.mode = BAD;
 | |
|                     break;
 | |
|                 }
 | |
|                 INITBITS(s);
 | |
| //debug("## inflate:   check matches trailer\n");
 | |
| //                Tracev((stderr, "inflate:   check matches trailer\n"));
 | |
|             }
 | |
| //#ifdef GUNZIP
 | |
|             state.mode = LENGTH;
 | |
|         case LENGTH:
 | |
|             if (state.wrap && state.flags) {
 | |
|                 if(!NEEDBITS(s, 32)) break inf_leave;
 | |
|                 if (s.hold != (state.total & 0xffffffff)) {
 | |
|                     strm.msg = 'incorrect length check';
 | |
|                     state.mode = BAD;
 | |
|                     break;
 | |
|                 }
 | |
|                 INITBITS(s);
 | |
|                 //Tracev((stderr, "inflate:   length matches trailer\n"));
 | |
|             }
 | |
| //#endif
 | |
|             state.mode = DONE;
 | |
|         case DONE:
 | |
|             ret = ZLIB.Z_STREAM_END;
 | |
|             break inf_leave;
 | |
|         case BAD:
 | |
|             ret = ZLIB.Z_DATA_ERROR;
 | |
|             break inf_leave;
 | |
|         case MEM:
 | |
|             return ZLIB.Z_MEM_ERROR;
 | |
|         case SYNC:
 | |
|         default:
 | |
|             return ZLIB.Z_STREAM_ERROR;
 | |
|         } }
 | |
| 
 | |
|     /*
 | |
|       Return from inflate(), updating the total counts and the check value.
 | |
|       If there was no progress during the inflate() call, return a buffer
 | |
|       error.  Call updatewindow() to create and/or update the window state.
 | |
|       Note: a memory error from inflate() is non-recoverable.
 | |
|     */
 | |
| inf_leave:
 | |
|     RESTORE(s);
 | |
|     if (state.wsize || (out != strm.avail_out && state.mode < BAD &&
 | |
|                         (state.mode < CHECK || flush != ZLIB.Z_FINISH)))
 | |
|         if (updatewindow(strm)) {
 | |
|             state.mode = MEM;
 | |
|             return ZLIB.Z_MEM_ERROR;
 | |
|         }
 | |
|     _in -= strm.avail_in;
 | |
|     out -= strm.avail_out;
 | |
|     strm.total_in += _in;
 | |
|     strm.total_out += out;
 | |
|     state.total += out;
 | |
|     if (state.wrap && out)
 | |
| 	    strm.adler = state.check = strm.checksum_function(state.check, strm.output_data, 0, strm.output_data.length);
 | |
|     strm.data_type = state.bits + (state.last ? 64 : 0) +
 | |
| 	    (state.mode == TYPE ? 128 : 0) +
 | |
| 	    (state.mode == LEN_ || state.mode == COPY_ ? 256 : 0);
 | |
|     if (((_in == 0 && out == 0) || flush == ZLIB.Z_FINISH) && ret == ZLIB.Z_OK)
 | |
|         ret = ZLIB.Z_BUF_ERROR;
 | |
|     return ret;
 | |
| };
 | |
| 
 | |
| ZLIB.inflateEnd = function(strm)
 | |
| {
 | |
|     var state;
 | |
|     if (!strm || !strm.state )
 | |
|         return ZLIB.Z_STREAM_ERROR;
 | |
|     state = strm.state;
 | |
|     state.window = null;
 | |
|     strm.state = null;
 | |
|     //    Tracev((stderr, "inflate: end\n"));
 | |
|     return ZLIB.Z_OK;
 | |
| };
 | |
| 
 | |
| ZLIB.z_stream.prototype.inflate = function(input_string, opts)
 | |
| {
 | |
|     var flush;
 | |
|     var avail_out;
 | |
| 	var DEFAULT_BUFFER_SIZE = 16384;
 | |
| 
 | |
|     this.input_data = input_string;
 | |
|     this.next_in = getarg(opts, 'next_in', 0);
 | |
|     this.avail_in = getarg(opts, 'avail_in', input_string.length - this.next_in);
 | |
| 
 | |
|     flush = getarg(opts, 'flush', ZLIB.Z_SYNC_FLUSH);
 | |
|     avail_out = getarg(opts, 'avail_out', -1);
 | |
| 
 | |
|     var result = '';
 | |
|     do {
 | |
|         this.avail_out = (avail_out >= 0 ? avail_out : DEFAULT_BUFFER_SIZE);
 | |
|         this.output_data = '';
 | |
|         this.next_out = 0;
 | |
|         this.error = ZLIB.inflate(this, flush);
 | |
|         if(avail_out >= 0) {
 | |
|             return this.output_data;
 | |
|         }
 | |
|         result += this.output_data;
 | |
| 		if(this.avail_out > 0) {
 | |
| 			break;
 | |
| 		}
 | |
|     } while(this.error == ZLIB.Z_OK);
 | |
| 
 | |
|     return result;
 | |
| };
 | |
| 
 | |
| ZLIB.z_stream.prototype.inflateReset = function(windowBits)
 | |
| {
 | |
|     return ZLIB.inflateReset(this, windowBits);
 | |
| };
 | |
| 
 | |
| }());
 |