@zip.js/zip.js 2.8.53 → 2.8.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +1 -1
  2. package/deno.json +2 -1
  3. package/dist/zip-core-external.js +737 -491
  4. package/dist/zip-core-external.min.js +1 -1
  5. package/dist/zip-core.js +745 -490
  6. package/dist/zip-core.min.js +1 -1
  7. package/dist/zip-fs-core-external.js +776 -525
  8. package/dist/zip-fs-core-external.min.js +1 -1
  9. package/dist/zip-fs-core.js +738 -510
  10. package/dist/zip-fs-core.min.js +1 -1
  11. package/dist/zip-fs-external.js +776 -525
  12. package/dist/zip-fs-external.min.js +1 -1
  13. package/dist/zip-fs-native.js +790 -525
  14. package/dist/zip-fs-native.min.js +1 -1
  15. package/dist/zip-fs.js +791 -526
  16. package/dist/zip-fs.min.js +1 -1
  17. package/dist/zip-legacy.js +746 -491
  18. package/dist/zip-legacy.min.js +1 -1
  19. package/dist/zip-native.js +746 -491
  20. package/dist/zip-native.min.js +1 -1
  21. package/dist/zip-web-worker-native.js +1 -1
  22. package/dist/zip-web-worker.js +1 -1
  23. package/dist/zip.js +747 -492
  24. package/dist/zip.min.js +1 -1
  25. package/eslint.config.mjs +1 -0
  26. package/index-native.cjs +790 -525
  27. package/index-native.min.js +1 -1
  28. package/index.cjs +791 -526
  29. package/index.d.cts +422 -49
  30. package/index.d.ts +422 -49
  31. package/index.min.js +1 -1
  32. package/lib/core/configuration.js +62 -21
  33. package/lib/core/constants.js +13 -1
  34. package/lib/core/io.js +33 -27
  35. package/lib/core/options.js +44 -2
  36. package/lib/core/streams/aes-crypto-stream.js +12 -12
  37. package/lib/core/util/decode-text.js +11 -2
  38. package/lib/core/web-worker-base.js +3 -2
  39. package/lib/core/web-worker-inline-native.js +1 -1
  40. package/lib/core/web-worker-inline-wasm.js +1 -1
  41. package/lib/core/zip-fs.js +39 -32
  42. package/lib/core/zip-reader.js +100 -38
  43. package/lib/core/zip-writer.js +301 -177
  44. package/lib/core/zlib-streams-inline.js +1 -1
  45. package/lib/zip-core-base.js +6 -1
  46. package/lib/zip-core-reader.js +1 -0
  47. package/lib/zip-core-writer.js +5 -0
  48. package/package.json +8 -2
package/index.cjs CHANGED
@@ -39,6 +39,7 @@ const COMPRESSION_METHOD_AES = 0x63;
39
39
 
40
40
  const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
41
41
  const SPLIT_ZIP_FILE_SIGNATURE = 0x08074b50;
42
+ const TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE = 0x30304b50;
42
43
  const DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE;
43
44
  const ARCHIVE_EXTRA_DATA_SIGNATURE = 0x08064b50;
44
45
  const DIGITAL_SIGNATURE_RECORD_SIGNATURE = 0x05054b50;
@@ -55,6 +56,7 @@ const ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH = END_OF_CENTRAL_DIR_LENGTH + ZIP64_
55
56
  const DATA_DESCRIPTOR_RECORD_LENGTH = 12;
56
57
  const DATA_DESCRIPTOR_RECORD_ZIP_64_LENGTH = 20;
57
58
  const DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH = 4;
59
+ const SPLIT_ZIP_FILE_SIGNATURE_LENGTH = 4;
58
60
 
59
61
  const EXTRAFIELD_TYPE_ZIP64 = 0x0001;
60
62
  const EXTRAFIELD_TYPE_AES = 0x9901;
@@ -77,6 +79,7 @@ const BITFLAG_LEVEL_SUPER_FAST_MASK = 0b110;
77
79
  const BITFLAG_DATA_DESCRIPTOR = 0b1000;
78
80
  const BITFLAG_STRONG_ENCRYPTION = 0b1000000;
79
81
  const BITFLAG_LANG_ENCODING_FLAG = 0b100000000000;
82
+ const BITFLAG_MASKED_LOCAL_HEADERS = 0b10000000000000;
80
83
  const FILE_ATTR_MSDOS_DIR_MASK = 0b10000;
81
84
  const FILE_ATTR_MSDOS_READONLY_MASK = 0x01;
82
85
  const FILE_ATTR_MSDOS_HIDDEN_MASK = 0x02;
@@ -106,6 +109,8 @@ const HEADER_OFFSET_VERSION = 0;
106
109
  const HEADER_OFFSET_SIGNATURE = 10;
107
110
  const HEADER_OFFSET_COMPRESSED_SIZE = 14;
108
111
  const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
112
+ const HEADER_OFFSET_FILENAME_LENGTH = 22;
113
+ const HEADER_OFFSET_EXTRAFIELD_LENGTH = 24;
109
114
  const LOCAL_HEADER_COMMON_OFFSET = 4;
110
115
 
111
116
  const MAX_DATE = new Date(2107, 11, 31, 23, 59, 58);
@@ -118,9 +123,116 @@ const FUNCTION_TYPE = "function";
118
123
  const OBJECT_TYPE = "object";
119
124
  const STRING_TYPE = "string";
120
125
  const NUMBER_TYPE = "number";
126
+ const BOOLEAN_TYPE = "boolean";
121
127
 
122
128
  const EMPTY_UINT8_ARRAY = new Uint8Array();
123
129
 
130
+ /*
131
+ Copyright (c) 2022 Gildas Lormeau. All rights reserved.
132
+
133
+ Redistribution and use in source and binary forms, with or without
134
+ modification, are permitted provided that the following conditions are met:
135
+
136
+ 1. Redistributions of source code must retain the above copyright notice,
137
+ this list of conditions and the following disclaimer.
138
+
139
+ 2. Redistributions in binary form must reproduce the above copyright
140
+ notice, this list of conditions and the following disclaimer in
141
+ the documentation and/or other materials provided with the distribution.
142
+
143
+ 3. The names of the authors may not be used to endorse or promote products
144
+ derived from this software without specific prior written permission.
145
+
146
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
147
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
148
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
149
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
150
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
151
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
152
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
153
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
154
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
155
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
156
+ */
157
+
158
+
159
+ const OPTION_FILENAME_ENCODING = "filenameEncoding";
160
+ const OPTION_COMMENT_ENCODING = "commentEncoding";
161
+ const OPTION_DECODE_TEXT = "decodeText";
162
+ const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
163
+ const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
164
+ const OPTION_PASSWORD = "password";
165
+ const OPTION_RAW_PASSWORD = "rawPassword";
166
+ const OPTION_PASS_THROUGH = "passThrough";
167
+ const OPTION_SIGNAL = "signal";
168
+ const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
169
+ const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
170
+ const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
171
+ const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
172
+ const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
173
+ const OPTION_CHECK_SIGNATURE = "checkSignature";
174
+ const OPTION_CHECK_CRC32 = "checkCrc32";
175
+ const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
176
+ const OPTION_USE_WEB_WORKERS = "useWebWorkers";
177
+ const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
178
+ const OPTION_TRANSFER_STREAMS = "transferStreams";
179
+ const OPTION_PREVENT_CLOSE = "preventClose";
180
+ const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
181
+ const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
182
+ const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
183
+ const OPTION_KEEP_ORDER = "keepOrder";
184
+ const OPTION_LEVEL = "level";
185
+ const OPTION_BUFFERED_WRITE = "bufferedWrite";
186
+ const OPTION_CREATE_TEMP_STREAM = "createTempStream";
187
+ const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
188
+ const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
189
+ const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
190
+ const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
191
+ const OPTION_ENCODE_TEXT = "encodeText";
192
+ const OPTION_OFFSET = "offset";
193
+ const OPTION_USDZ = "usdz";
194
+ const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
195
+ const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
196
+ const OPTION_STRICTNESS = "strictness";
197
+ const OPTION_FILENAME_VALIDATION = "filenameValidation";
198
+ const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
199
+ const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
200
+ const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
201
+ const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
202
+ const TEXT_TYPE_FILENAME = "filename";
203
+ const TEXT_TYPE_COMMENT = "comment";
204
+ const STRICTNESS_STRICT = "strict";
205
+ const STRICTNESS_BALANCED = "balanced";
206
+ const STRICTNESS_TOLERANT = "tolerant";
207
+
208
+ const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
209
+ const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
210
+ const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
211
+
212
+ function checkFunctionOption(value) {
213
+ if (value && typeof value != FUNCTION_TYPE) {
214
+ throw new Error(ERR_INVALID_FUNCTION_OPTION);
215
+ }
216
+ return value;
217
+ }
218
+
219
+ function checkSignalOption(signal) {
220
+ if (signal && (typeof signal.addEventListener != FUNCTION_TYPE || typeof signal.aborted != BOOLEAN_TYPE)) {
221
+ throw new Error(ERR_INVALID_SIGNAL);
222
+ }
223
+ return signal || UNDEFINED_VALUE;
224
+ }
225
+
226
+ function checkPasswordOption(password, rawPassword) {
227
+ if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
228
+ throw new Error(ERR_INVALID_PASSWORD_TYPE);
229
+ }
230
+ }
231
+
232
+ function toNumber(value) {
233
+ return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
234
+ }
235
+
124
236
  /*
125
237
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
126
238
 
@@ -150,7 +262,10 @@ const EMPTY_UINT8_ARRAY = new Uint8Array();
150
262
  */
151
263
 
152
264
 
265
+ const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
153
266
  const MINIMUM_CHUNK_SIZE = 64;
267
+ const MINIMUM_PROPERTY_VALUE = 1;
268
+ const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
154
269
  let maxWorkers = 2;
155
270
  try {
156
271
  if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
@@ -162,7 +277,7 @@ try {
162
277
  const DEFAULT_CONFIGURATION = {
163
278
  workerURI: "./core/web-worker-wasm.js",
164
279
  wasmURI: "./core/streams/zlib-wasm/zlib-streams.wasm",
165
- chunkSize: 64 * 1024,
280
+ chunkSize: DEFAULT_CHUNK_SIZE$1,
166
281
  maxWorkers,
167
282
  terminateWorkerTimeout: 5000,
168
283
  workerStarvationTimeout: 5000,
@@ -174,24 +289,38 @@ const DEFAULT_CONFIGURATION = {
174
289
  DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
175
290
  };
176
291
 
177
- const CONFIGURABLE_PROPERTY_NAMES = [
292
+ const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
293
+
294
+ const STRING_PROPERTY_NAMES = [
178
295
  "baseURI",
179
296
  "wasmURI",
180
- "workerURI",
181
- "createWorker",
297
+ "workerURI"
298
+ ];
299
+ const BOOLEAN_PROPERTY_NAMES = [
300
+ "useCompressionStream",
301
+ "useWebWorkers",
302
+ "transferStreams"
303
+ ];
304
+ const NUMBER_PROPERTY_NAMES = [
182
305
  "chunkSize",
183
- "maxWorkers",
306
+ PROPERTY_NAME_MAX_WORKERS,
184
307
  "terminateWorkerTimeout",
185
308
  "workerStarvationTimeout",
186
- "workerStartupTimeout",
187
- "useCompressionStream",
188
- "useWebWorkers",
189
- "transferStreams",
309
+ "workerStartupTimeout"
310
+ ];
311
+ const FUNCTION_PROPERTY_NAMES = [
312
+ "createWorker",
190
313
  "CompressionStream",
191
314
  "DecompressionStream",
192
315
  "CompressionStreamFallback",
193
316
  "DecompressionStreamFallback"
194
317
  ];
318
+ const CONFIGURABLE_PROPERTY_NAMES = [
319
+ ...STRING_PROPERTY_NAMES,
320
+ ...BOOLEAN_PROPERTY_NAMES,
321
+ ...NUMBER_PROPERTY_NAMES,
322
+ ...FUNCTION_PROPERTY_NAMES
323
+ ];
195
324
 
196
325
  const config = { ...DEFAULT_CONFIGURATION };
197
326
 
@@ -200,20 +329,43 @@ function getConfiguration() {
200
329
  }
201
330
 
202
331
  function getChunkSize(config) {
203
- return Math.max(config.chunkSize, MINIMUM_CHUNK_SIZE);
332
+ return normalizeChunkSize(config.chunkSize);
333
+ }
334
+
335
+ function normalizeChunkSize(chunkSize) {
336
+ chunkSize = toNumber(chunkSize);
337
+ return Number.isInteger(chunkSize) && chunkSize >= MINIMUM_PROPERTY_VALUE ? Math.max(chunkSize, MINIMUM_CHUNK_SIZE) : DEFAULT_CHUNK_SIZE$1;
204
338
  }
205
339
 
206
340
  function configure(configuration) {
207
- configuration = normalizeConfiguration(configuration);
341
+ Object.assign(config, checkConfiguration(normalizeConfiguration(configuration)));
342
+ }
343
+
344
+ function checkConfiguration(configuration) {
345
+ const checkedConfiguration = {};
208
346
  for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
209
347
  const propertyValue = configuration[propertyName];
210
348
  if (propertyValue !== UNDEFINED_VALUE) {
211
- config[propertyName] = propertyValue;
349
+ checkedConfiguration[propertyName] = checkPropertyValue(propertyName, propertyValue);
212
350
  }
213
351
  }
352
+ return checkedConfiguration;
353
+ }
354
+
355
+ function checkPropertyValue(propertyName, propertyValue) {
356
+ if (NUMBER_PROPERTY_NAMES.includes(propertyName)) {
357
+ propertyValue = toNumber(propertyValue);
358
+ if (propertyName == PROPERTY_NAME_MAX_WORKERS && (!Number.isInteger(propertyValue) || propertyValue < MINIMUM_PROPERTY_VALUE)) {
359
+ throw new Error(ERR_INVALID_MAX_WORKERS);
360
+ }
361
+ } else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
362
+ checkFunctionOption(propertyValue);
363
+ }
364
+ return propertyValue;
214
365
  }
215
366
 
216
367
  function normalizeConfiguration(configuration) {
368
+ configuration = configuration || {};
217
369
  const { CompressionStreamZlib, DecompressionStreamZlib } = configuration;
218
370
  if (CompressionStreamZlib === UNDEFINED_VALUE && DecompressionStreamZlib === UNDEFINED_VALUE) {
219
371
  return configuration;
@@ -229,14 +381,9 @@ function normalizeConfiguration(configuration) {
229
381
  }
230
382
 
231
383
  function setDefaultConfiguration(configuration) {
232
- configuration = normalizeConfiguration(configuration);
233
- for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
234
- const propertyValue = configuration[propertyName];
235
- if (propertyValue !== UNDEFINED_VALUE) {
236
- DEFAULT_CONFIGURATION[propertyName] = propertyValue;
237
- }
238
- }
239
- configure(configuration);
384
+ const checkedConfiguration = checkConfiguration(normalizeConfiguration(configuration));
385
+ Object.assign(DEFAULT_CONFIGURATION, checkedConfiguration);
386
+ Object.assign(config, checkedConfiguration);
240
387
  }
241
388
 
242
389
  function resetConfiguration() {
@@ -246,7 +393,7 @@ function resetConfiguration() {
246
393
  Object.assign(config, DEFAULT_CONFIGURATION);
247
394
  }
248
395
 
249
- const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='(t=>{"function"==typeof define&&define.amd?define(t):t()})(function(){"use strict";const{Array:t,Object:e,Number:n,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:l,Promise:w,TextEncoder:u,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;256>t;t++){let e=t;for(let t=0;8>t;t++)e=1&e?e>>>1^3988292384:e>>>1;C[0][t]=e}for(let t=0;256>t;t++)for(let e=1;8>e;e++){const n=C[e-1][t];C[e][t]=n>>>8^C[0][255&n]}const[A,I,x,M,P,D,F,B]=C;class R{constructor(t){this.o=t||-1}append(t){let e=0|this.o;const n=0|t.length;let s=0;if(n>=8&&t.buffer){const r=new l(t.buffer,t.byteOffset,n),o=n-8;for(;o>=s;s+=8){const t=e^r.getInt32(s,!0),n=r.getInt32(s+4,!0);e=B[255&t]^F[t>>>8&255]^D[t>>>16&255]^P[t>>>24&255]^M[255&n]^x[n>>>8&255]^I[n>>>16&255]^A[n>>>24&255]}}for(;n>s;s++)e=e>>>8^A[255&(e^t[s])];this.o=e}get(){return~this.o}}class U extends d{constructor(){let t;const e=new R;super({transform(t,n){e.append(t),n.enqueue(t)},flush(){const n=new o(4);new l(n.buffer).setUint32(0,e.get()),t.value=n}}),t=this}}function W(t,e){const n=new o(t.length+e.length);return n.set(t),n.set(e,t.length),n}function _(t){return new l(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const n=t[t.length-1],s=T.l(n);return 32===s?t.concat(e):T.h(e,s,0|n,t.slice(0,t.length-1))},bitLength(t){const e=t.length;if(0===e)return 0;const n=t[e-1];return 32*(e-1)+T.l(n)},m(t,e){if(32*t.length<e)return t;const n=(t=t.slice(0,s.ceil(e/32))).length;return e&=31,n>0&&e&&(t[n-1]=T.S(e,t[n-1]&2147483648>>e-1,1)),t},S:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,e,n,s){for(void 0===s&&(s=[]);e>=32;e-=32)s.push(n),n=0;if(0===e)return s.concat(t);for(let r=0;r<t.length;r++)s.push(n|t[r]>>>e),n=t[r]<<32-e;const r=t.length?t[t.length-1]:0,o=T.l(r);return s.push(T.S(e+o&31,e+o>32?n:s.pop(),1)),s}},V={bytes:{v(t){const e=T.bitLength(t)/8,n=new o(e);let s;for(let r=0;e>r;r++)3&r||(s=t[r/4]),n[r]=s>>>24,s<<=8;return n},C(t){const e=[];let n,s=0;for(n=0;n<t.length;n++)s=s<<8|t[n],3&~n||(e.push(s),s=0);return 3&n&&e.push(T.S(8*(3&n),s)),e}}},K=class{constructor(t){const e=this;e.blockSize=512,e.A=[1732584193,4023233417,2562383102,271733878,3285377520],e.I=[1518500249,1859775393,2400959708,3395469782],t?(e.M=t.M.slice(0),e.P=t.P.slice(0),e.D=t.D):e.reset()}reset(){const t=this;return t.M=t.A.slice(0),t.P=[],t.D=0,t}update(t){const e=this;"string"==typeof t&&(t=V.F.C(t));const n=e.P=T.concat(e.P,t),s=e.D,o=e.D=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(n);let a=0;for(let t=e.blockSize+s-(e.blockSize+s&e.blockSize-1);o>=t;t+=e.blockSize)e.B(c.subarray(16*a,16*(a+1))),a+=1;return n.splice(0,16*a),e}R(){const t=this;let e=t.P;const n=t.M;e=T.concat(e,[T.S(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(s.floor(t.D/4294967296)),e.push(0|t.D);e.length;)t.B(e.splice(0,16));return t.reset(),n}U(t,e,n,s){return t>19?t>39?t>59?t>79?void 0:e^n^s:e&n|e&s|n&s:e^n^s:e&n|~e&s}W(t,e){return e<<t|e>>>32-t}B(e){const n=this,r=n.M,o=t(80);for(let t=0;16>t;t++)o[t]=e[t];let c=r[0],i=r[1],a=r[2],f=r[3],l=r[4];for(let t=0;79>=t;t++){16>t||(o[t]=n.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const e=n.W(5,c)+n.U(t,i,a,f)+l+o[t]+n.I[s.floor(t/20)]|0;l=f,f=a,a=n.W(30,i),i=c,c=e}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+l|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,e,n,s){if(n=n||1e4,0>s||0>n)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,w;const u=new ArrayBuffer(o),h=new l(u);let p=0;const d=T;for(e=V.bytes.C(e),w=1;(o||1)>p;w++){for(c=i=t.encrypt(d.concat(e,[w])),a=1;n>a;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;(o||1)>p&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return u.slice(0,s/8)},_:class{constructor(t){const e=this,n=e.V=K,s=[[],[]];e.K=[new n,new n];const r=e.K[0].blockSize/32;t.length>r&&(t=(new n).update(t).R());for(let e=0;r>e;e++)s[0][e]=909522486^t[e],s[1][e]=1549556828^t[e];e.K[0].update(s[0]),e.K[1].update(s[1]),e.L=new n(e.K[0])}reset(){const t=this;t.L=new t.V(t.K[0]),t.O=!1}update(t){this.O=!0,this.L.update(t)}digest(){const t=this,e=t.L.R(),n=new t.V(t.K[1]).update(e).R();return t.reset(),n}encrypt(t){if(this.O)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="Invalid signature",H=j,N="zipjs-abort-check-password";function q(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const G=16,J={name:"PBKDF2"},Q=e.assign({hash:{name:"HMAC"}},J),X=e.assign({iterations:1e3,hash:{name:"SHA-1"}},J),Y=["deriveBits"],Z=[8,12,16],$=[16,24,32],tt=10,et=[0,0,0,0],nt=typeof h!=b,st=nt&&h.subtle,rt=nt&&typeof st!=b,ot=V.bytes,ct=class{constructor(t){const e=this;e.j=[[[],[],[],[],[]],[[],[],[],[],[]]],e.j[0][0][0]||e.H();const n=e.j[0][4],s=e.j[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(e.I=[i=t.slice(0),a=[]],c=o;4*o+28>c;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const e=i[3&t?c:c-4];a[t]=4>=c||4>t?e:s[0][n[e>>>24]]^s[1][n[e>>16&255]]^s[2][n[e>>8&255]]^s[3][n[255&e]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],e=this.j[1],n=t[4],s=e[4],r=[],o=[];let c,i,a,f;for(let t=0;256>t;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let l=c=0;!n[l];l^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,n[l]=o,s[o]=l,f=r[a=r[i=r[l]]];let w=16843009*f^65537*a^257*i^16843008*l,u=257*r[o]^16843008*o;for(let n=0;4>n;n++)t[n][l]=u=u<<24^u>>>8,e[n][o]=w=w<<24^w>>>8}for(let n=0;5>n;n++)t[n]=t[n].slice(0),e[n]=e[n].slice(0)}N(t,e){if(4!==t.length)throw new r("invalid aes block size");const n=this.I[e],s=n.length/4-2,o=[0,0,0,0],c=this.j[e],i=c[0],a=c[1],f=c[2],l=c[3],w=c[4];let u,h,p,d=t[0]^n[0],y=t[e?3:1]^n[1],m=t[2]^n[2],S=t[e?1:3]^n[3],g=4;for(let t=0;s>t;t++)u=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^l[255&S]^n[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^l[255&d]^n[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^l[255&y]^n[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^l[255&m]^n[g+3],g+=4,d=u,y=h,m=p;for(let t=0;4>t;t++)o[e?3&-t:t]=w[d>>>24]<<24^w[y>>16&255]<<16^w[m>>8&255]<<8^w[255&S]^n[g++],u=d,d=y,y=m,m=S,S=u;return o}},it=class{constructor(t,e){this.G=t,this.J=e,this.X=e}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let e=t>>16&255,n=t>>8&255,s=255&t;255===e?(e=0,255===n?(n=0,255===s?s=0:++s):++n):++e,t=0,t+=e<<16,t+=n<<8,t+=s}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,e,n){let s;if(!(s=e.length))return[];const r=T.bitLength(e);for(let r=0;s>r;r+=4){this.$(n);const s=t.encrypt(n);e[r]^=s[0],e[r+1]^=s[1],e[r+2]^=s[2],e[r+3]^=s[3]}return T.m(e,r)}},at=E._;let ft=nt&&rt&&typeof st.importKey==k,lt=nt&&rt&&typeof st.deriveBits==k;class wt extends d{constructor({password:t,rawPassword:e,encryptionStrength:n,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:c,strength:i,et:a,ready:f}=n;c?(await(async(t,e,n,s)=>{const o=await dt(t,e,n,mt(s,0,Z[e])),c=mt(s,Z[e]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)})(n,i,c,mt(t,0,Z[i]+2)),t=mt(t,Z[i]+2),s?e.error(new r(N)):a()):await f;const l=new o(t.length-tt-(t.length-tt)%G);e.enqueue(pt(n,t,l,0,tt,!0))},async flush(t){const{nt:e,st:n,pending:s,ready:o}=this;if(n&&e){await o;const i=mt(s,0,s.length-tt),a=mt(s,s.length-tt);let f=z;if(i.length){const t=gt(ot,i);n.update(t);const s=e.update(t);f=St(ot,s)}const l=mt(St(ot,n.digest()),0,tt);let w=s.length<tt?1:0;for(let t=0;tt>t;t++)w|=l[t]^a[t];if(w&&c)throw new r(H);t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:e,encryptionStrength:n}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:s,strength:r,et:c,ready:i}=n;let a=z;s?(a=await(async(t,e,n)=>{const s=q(new o(Z[e]));return W(s,await dt(t,e,n,s))})(n,r,s),c()):await i;const f=new o(a.length+t.length-t.length%G);f.set(a,0),e.enqueue(pt(n,t,f,a.length,0))},async flush(t){const{nt:e,st:n,pending:s,ready:r}=this;if(n&&e){await r;let o=z;if(s.length){const t=e.update(gt(ot,s));n.update(t),o=St(ot,t)}const c=St(ot,n.digest()).slice(0,tt);t.enqueue(W(o,c))}}})}}function ht(t,n,s,r){e.assign(t,{ready:new w(e=>t.et=e),password:yt(n,s),strength:r-1,pending:z})}function pt(t,e,n,s,r,c){const{nt:i,st:a,pending:f}=t;f.length&&(e=W(f,e));const l=e.length-r;let w;for(n=((t,e)=>{if(e&&e>t.length){const n=t;(t=new o(e)).set(n,0)}return t})(n,s+(l-l%G)),w=0;l-G>=w;w+=G){const t=gt(ot,mt(e,w,w+G));c&&a.update(t);const r=i.update(t);c||a.update(r),n.set(St(ot,r),w+s)}return t.pending=mt(e,w),n}async function dt(n,s,r,c){n.password=null;const i=await(async(t,e,n,s,r)=>{if(!ft)return E.importKey(e);try{return await st.importKey("raw",e,n,!1,r)}catch{return ft=!1,E.importKey(e)}})(0,r,Q,0,Y),a=await(async(t,e,n)=>{if(!lt)return E.T(e,t.salt,X.iterations,n);try{return await st.deriveBits(t,e,n)}catch{return lt=!1,E.T(e,t.salt,X.iterations,n)}})(e.assign({salt:c},X),i,8*(2*$[s]+2)),f=new o(a),l=gt(ot,mt(f,0,$[s])),w=gt(ot,mt(f,$[s],2*$[s])),u=mt(f,2*$[s]);return e.assign(n,{keys:{key:l,ot:w,passwordVerification:u},nt:new it(new ct(l),t.from(et)),st:new at(w)}),u}function yt(t,e){return e===v?(t=>{if(typeof u==b){const e=new o((t=unescape(encodeURIComponent(t))).length);for(let n=0;n<e.length;n++)e[n]=t.charCodeAt(n);return e}return(new u).encode(t)})(t):e}function mt(t,e,n){return t.subarray(e,n)}function St(t,e){return t.v(e)}function gt(t,e){return t.C(e)}class vt extends d{constructor({password:t,rawPassword:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;if(n.password||n.rawPassword){const e=zt(n,t.subarray(0,12));if(n.password=n.rawPassword=null,0!=(e[11]^n.passwordVerification))throw new r(O);t=t.subarray(12)}s?e.error(new r(N)):e.enqueue(zt(n,t))}})}}class bt extends d{constructor({password:t,rawPassword:e,passwordVerification:n}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;let s,r;if(n.password||n.rawPassword){n.password=n.rawPassword=null;const e=q(new o(12));e[11]=n.passwordVerification,s=new o(t.length+e.length),s.set(Ct(n,e),0),r=12}else s=new o(t.length),r=0;s.set(Ct(n,t),r),e.enqueue(s)}})}}function kt(t,n,s,r){e.assign(t,{password:n,rawPassword:s,passwordVerification:r}),((t,n,s)=>{const r=[305419896,591751049,878082192];if(e.assign(t,{keys:r,ct:new R(r[0]),it:new R(r[2])}),s)for(let e=0;e<s.length;e++)At(t,s[e]);else for(let e=0;e<n.length;e++)At(t,n.charCodeAt(e))})(t,n,s)}function zt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=It(t)^e[s],At(t,n[s]);return n}function Ct(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=It(t)^e[s],At(t,e[s]);return n}function At(t,e){let[,n]=t.keys;t.ct.append([e]);const r=~t.ct.get();n=Mt(s.imul(Mt(n+xt(r)),134775813)+1),t.it.append([n>>>24]);const o=~t.it.get();t.keys=[r,n,o]}function It(t){const e=2|t.keys[2];return xt(s.imul(e,1^e)>>>8)}function xt(t){return 255&t}function Mt(t){return 4294967295&t}const Pt=new f;function Dt(t){return Pt.get(t)}const Ft="Invalid uncompressed size",Bt=j,Rt="deflate-raw",Ut="gzip",Wt=[31,139,8];class _t extends d{constructor(t,{chunkSize:e,CompressionStreamFallback:n,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:w,format:u,compressionMethod:h}=t,p=this;let d,y,m,S=super.readable;const g=u&&Dt(u),v=a&&r&&!w&&!g&&(!o||i)&&!(!c||!s);if(o&&!i||!a||v||(d=new U,S=jt(S,d)),r)if(g)S=Ht(S,Lt(g.CompressionStream,u,{level:f,chunkSize:e,compressionMethod:h}));else if(v)m=new Tt,S=Ht(S,new s(Ut)),S=jt(S,m);else try{S=Ot(S,c,{level:f,chunkSize:e},s,n)}catch(t){let e;try{e=new s(Ut)}catch{throw t}S=Ht(S,e),S=jt(S,new Tt)}o&&(i?S=jt(S,new bt(t)):(y=new ut(t),S=jt(S,y))),Et(p,S,()=>{o&&!i||!a||(p.crc32=v?m.crc32:new l(d.value.buffer).getUint32(0))})}}class Tt extends d{constructor(){let t,e=10,n=new o(0);super({transform(t,r){if(e){const n=s.min(e,t.length);if(e-=n,!(t=t.subarray(n)).length)return}const o=n.length+t.length;if(8>=o)return void(n=W(n,t));const c=o-8,i=s.min(c,n.length);r.enqueue(W(n.subarray(0,i),t.subarray(0,c-i))),n=W(n.subarray(i),t.subarray(c-i))},flush(){const e=_(n);t.crc32=e.getUint32(0,!0),t.uncompressedSize=e.getUint32(4,!0)}}),t=this}}class Vt extends d{constructor(t,{chunkSize:e,DecompressionStreamFallback:n,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:u,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=jt(C,new vt(t)):(z=new wt(t),C=jt(C,z))),u){const t=m&&Dt(m);if(t)C=Ht(C,Lt(t.DecompressionStream,m,{chunkSize:e,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=Ot(C,h,{chunkSize:e,deflate64:p},s,n)}catch(t){if(p||b===v)throw t;let e;try{e=new s(Ut)}catch{throw t}C=((t,e,n)=>{const s=new R;let c,i,a,f=0,l=!1;const u=new w((t,e)=>{i=t,a=e});u.catch(()=>{}),n||i();const h=new d({start(t){const e=new o(10);e.set(Wt),t.enqueue(e)},transform(t,e){e.enqueue(t)},async flush(t){l=!0,y();try{await u}finally{m()}const e=new o(8),r=_(e);r.setUint32(0,s.get(),!0),r.setUint32(4,n,!0),t.enqueue(e)},cancel(t){a(t)}}),p=new d({transform(t,e){s.append(t),f+=t.length,n>f?l&&y():i(),e.enqueue(t)},cancel(t){a(t)}});return t=jt(t,h),jt(t=Ht(t,e),p);function y(){m(),c=setTimeout(()=>a(new r(Ft)),5e3)}function m(){clearTimeout(c)}})(C,e,b)}C=(t=>{const e=t.getReader();return new y({async pull(t){let n;try{n=await e.read()}catch(t){if(t&&t.message)throw t;const e=new r("Invalid compressed data");throw e.cause=t,e}const{value:s,done:o}=n;o?t.close():t.enqueue(s)},cancel:t=>e.cancel(t)})})(C)}a&&(k=new U,C=jt(C,k)),Et(this,C,()=>{if(a){const t=new l(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r(Bt)}})}}const Kt=new f;function Et(t,n,s){n=jt(n,new d({flush:s})),e.defineProperty(t,"readable",{get:()=>n})}function Lt(t,e,n){if(!t)throw new r("Compression method not supported");return new t(e,n)}function Ot(t,e,n,s,r){const o=e&&s?s:r||s,c=n.deflate64?"deflate64-raw":Rt;let i;try{i=new o(c,n)}catch(t){if(!e||!r||o==r)throw t;i=new r(c,n)}return Ht(t,i)}function jt(t,e){return(t=>{if(t instanceof y)return t;const e=t.getReader();return new y({async pull(t){const{value:n,done:s}=await e.read();s?t.close():t.enqueue(n)},cancel:t=>e.cancel(t)})})(t).pipeThrough(e)}function Ht(t,e){const n=e.writable.getWriter(),s=t.getReader();return(async()=>{try{for(;;){await n.ready;const t=await s.read();if(t.done){await n.close();break}await n.write(t.value)}}catch(t){await(async(t,e)=>{try{await t.abort(e)}catch{}})(n,t),await(async(t,e)=>{try{await t.cancel(e)}catch{}})(s,t)}})(),e.readable}const Nt="data",qt="close",Gt="deflate";class Jt extends d{constructor(t,n){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Gt)?c=_t:o.startsWith("inflate")&&(c=Vt),s.outputSize=0;let i=0;const a=new c(t,n),f=super.readable,l=new d({transform(t,e){t&&t.length&&(i+=t.length,e.enqueue(t))},flush(){e.assign(s,{inputSize:i})}}),w=new d({transform(e,n){if(e&&e.length&&(n.enqueue(e),s.outputSize+=e.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Ft)},flush(){const{crc32:t}=a;e.assign(s,{crc32:t,inputSize:i})}});e.defineProperty(s,"readable",{get:()=>f.pipeThrough(l).pipeThrough(a).pipeThrough(w)})}}class Qt extends d{constructor(t){const e=[];let s=0;function r(){const n=new o(t);let r=0;for(;t>r;){const s=e[0],o=t-r;s.length>o?(n.set(s.subarray(0,o),r),e[0]=s.subarray(o),r+=o):(n.set(s,r),r+=s.length,e.shift())}return s-=t,n}n.isFinite(t)&&t>=1||(t=65536),super({transform(n,o){for(e.push(n),s+=n.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(((t,e)=>{const n=new o(e);let s=0;for(const e of t)n.set(e,s),s+=e.length;return n})(e,s))}})}}let Xt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Xt=navigator.hardwareConcurrency)}catch{}const Yt=new f,Zt=new f;let $t,te,ee,ne,se,re,oe=0;async function ce(t){let e,o;try{const{options:c,config:i}=t;if(c.format)try{await(async(t,e)=>{!Pt.has(t)&&e&&((t,e)=>{const{CompressionStream:n,DecompressionStream:s}=e;if(typeof n!=k&&typeof s!=k)throw new r("Invalid codec module");Pt.set(t,{CompressionStream:n,DecompressionStream:s})})(t,await(import(e)))})(c.format,c.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream,c.compressed&&!c.format)if(c.useCompressionStream){if(!((t,e)=>{if(!t)return!1;let n=Kt.get(t);n||(n=new f,Kt.set(t,n));let s=n.get(e);if(s===v){try{new t(e),s=!0}catch{s=!1}n.set(e,s)}return s})(c.codecType.startsWith(Gt)?i.CompressionStream:i.DecompressionStream,Rt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{c.useCompressionStream=!0}!i.CompressionStreamFallback&&i.CompressionStreamZlib&&(i.CompressionStreamFallback=i.CompressionStreamZlib),!i.DecompressionStreamFallback&&i.DecompressionStreamZlib&&(i.DecompressionStreamFallback=i.DecompressionStreamZlib);const a={highWaterMark:1},l=t.readable||new y({async pull(t){const e=new w(t=>Yt.set(oe,t));ie({type:"pull",messageId:oe}),oe=(oe+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await e;t.enqueue(s),r&&t.close()}},a);o=t.writable||new m({async write(t){let e;const s=new w(t=>e=t);Zt.set(oe,e),ie({type:Nt,value:t,messageId:oe}),oe=(oe+1)%n.MAX_SAFE_INTEGER,await s}},a),e=new Jt(c,i),$t=new AbortController;const{signal:u}=$t;await l.pipeThrough(e).pipeThrough(new Qt((t=>s.max(t.chunkSize,64))(i))).pipeTo(o,{signal:u,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=e;ie({type:qt,result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=e?e.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}ae(t)}}function ie(t){const{value:e}=t;if(e)if(e.length)try{t.value=(n=e,n.byteOffset||n.byteLength!=n.buffer.byteLength?new o(n):n).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var n}function ae(t=new r("Unknown error")){const{message:e,stack:n,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:e,stack:n,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}function fe(t,e,n={}){if(!te){const t=new r("WASM module not loaded");throw t.cause=re,t}const c="number"==typeof n.level?n.level:-1,i="number"==typeof n.outBuffer?n.outBuffer:65536,a="number"==typeof n.inBufferSize?n.inBufferSize:65536;return new d({start(){try{let n;if(this.ft=ee(i),this.in=ee(a),this.inBufferSize=a,!this.ft||!this.in)throw new r("allocation failed");if(this.lt=new o(i),t?(this.wt=te.deflate_process,this.ut=te.deflate_last_consumed,this.ht=te.deflate_end,this.yt=te.deflate_new(),n="gzip"===e?te.deflate_init_gzip(this.yt,c):"deflate-raw"===e?te.deflate_init_raw(this.yt,c):te.deflate_init(this.yt,c)):"deflate64-raw"===e?(this.wt=te.inflate9_process,this.ut=te.inflate9_last_consumed,this.ht=te.inflate9_end,this.yt=te.inflate9_new(),n=te.inflate9_init_raw(this.yt)):(this.wt=te.inflate_process,this.ut=te.inflate_last_consumed,this.ht=te.inflate_end,this.yt=te.inflate_new(),n="deflate-raw"===e?te.inflate_init_raw(this.yt):"gzip"===e?te.inflate_init_gzip(this.yt):te.inflate_init(this.yt)),0!==n)throw new r("init failed:"+n)}catch(t){throw f(this),t}},transform(e,n){try{const c=e,a=new o(se.buffer),f=this.wt,l=this.ut,w=this.ft,u=this.lt;let h=0;for(;h<c.length;){const e=s.min(c.length-h,32768);if((!this.in||this.inBufferSize<e)&&(this.in&&ne&&(ne(this.in),this.in=0),this.in=ee(e),this.inBufferSize=e,!this.in))throw new r("allocation failed");a.set(c.subarray(h,h+e),this.in);const o=f(this.yt,this.in,e,w,i,0),p=16777215&o;if(p&&(u.set(a.subarray(w,w+p),0),n.enqueue(u.slice(0,p))),!t){const t=o>>24&255,e=128&t?t-256:t;if(0>e)throw new r("process error:"+e)}const d=l(this.yt);if(0===d)break;h+=d}}catch(t){f(this),n.error(t)}},flush(e){try{const n=new o(se.buffer),s=this.wt,c=this.ft,a=this.lt;for(;;){const o=s(this.yt,0,0,c,i,4),f=16777215&o,l=o>>24&255;if(!t){const t=128&l?l-256:l;if(0>t)throw new r("process error:"+t)}if(f&&(a.set(n.subarray(c,c+f),0),e.enqueue(a.slice(0,f))),1===l||0===f)break}}catch(t){e.error(t)}finally{const t=f(this);0!==t&&e.error(new r("end error:"+t))}},cancel(){f(this)}});function f(t){let e=0;return t.yt&&t.ht&&(e=t.ht(t.yt)),t.yt=0,t.in&&ne&&ne(t.in),t.in=0,t.ft&&ne&&ne(t.ft),t.ft=0,e}}addEventListener("message",({data:t})=>{const{type:e,messageId:n,value:s,done:r}=t;try{if("start"==e&&ce(t),e==Nt){const t=Yt.get(n);Yt.delete(n),t({value:s||new o,done:r})}if("ack"==e){const t=Zt.get(n);Zt.delete(n),t()}e==qt&&$t.abort()}catch(t){ae(t)}}),p({type:"ready"});class le{constructor(t="deflate",e){return fe(!0,t,e)}}class we{constructor(t="deflate",e){return fe(!1,t,e)}}le.St=!0,we.St=!0;let ue=!1;((t={})=>{const{init:e}=t,n=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{e&&await e(t),n&&(t.CompressionStreamFallback=n),s&&(t.DecompressionStreamFallback=s)}})({CompressionStreamFallback:le,DecompressionStreamFallback:we,init:t=>(async(t,{baseURI:e})=>{if(!ue)try{await(async(t,e)=>{let n,s;try{try{s=new URL(t,e)}catch{}const r=await fetch(s);n=await r.arrayBuffer()}catch(e){if(!t.startsWith("data:application/wasm;base64,"))throw e;n=(t=>{const e=t.split(",")[1],n=atob(e),s=n.length,r=new o(s);for(let t=0;s>t;++t)r[t]=n.charCodeAt(t);return r.buffer})(t)}(t=>{if(te=t,({malloc:ee,free:ne,memory:se}=te),"function"!=typeof ee||"function"!=typeof ne||!se)throw te=ee=ne=se=null,new r("Invalid WASM module")})((await WebAssembly.instantiate(n)).instance.exports)})(t,e),ue=!0}catch(t){throw(t=>{re=t})(t),t}})(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+(t=>{let n="";const s=t.length;let r=0;for(;s>r+2;r+=3){const s=t[r]<<16|t[r+1]<<8|t[r+2];n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+e[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e[s>>18&63]+e[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+"=";}return n})(s)}});
396
+ const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='(t=>{"function"==typeof define&&define.amd?define(t):t()})(function(){"use strict";const{Array:t,Object:e,Number:n,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:l,Promise:u,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;t<256;t++){let e=t;for(let t=0;t<8;t++)e=1&e?e>>>1^3988292384:e>>>1;C[0][t]=e}for(let t=0;t<256;t++)for(let e=1;e<8;e++){const n=C[e-1][t];C[e][t]=n>>>8^C[0][255&n]}const[I,A,x,M,P,D,F,B]=C;class R{constructor(t){this.o=t||-1}append(t){let e=0|this.o;const n=0|t.length;let s=0;if(n>=8&&t.buffer){const r=new l(t.buffer,t.byteOffset,n),o=n-8;for(;s<=o;s+=8){const t=e^r.getInt32(s,!0),n=r.getInt32(s+4,!0);e=B[255&t]^F[t>>>8&255]^D[t>>>16&255]^P[t>>>24&255]^M[255&n]^x[n>>>8&255]^A[n>>>16&255]^I[n>>>24&255]}}for(;s<n;s++)e=e>>>8^I[255&(e^t[s])];this.o=e}get(){return~this.o}}class U extends d{constructor(){let t;const e=new R;super({transform(t,n){e.append(t),n.enqueue(t)},flush(){const n=new o(4);new l(n.buffer).setUint32(0,e.get()),t.value=n}}),t=this}}function W(t,e){const n=new o(t.length+e.length);return n.set(t),n.set(e,t.length),n}function _(t){return new l(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const n=t[t.length-1],s=T.l(n);return 32===s?t.concat(e):T.h(e,s,0|n,t.slice(0,t.length-1))},bitLength(t){const e=t.length;if(0===e)return 0;const n=t[e-1];return 32*(e-1)+T.l(n)},m(t,e){if(32*t.length<e)return t;const n=(t=t.slice(0,s.ceil(e/32))).length;return e&=31,n>0&&e&&(t[n-1]=T.S(e,t[n-1]&2147483648>>e-1,1)),t},S:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,e,n,s){for(void 0===s&&(s=[]);e>=32;e-=32)s.push(n),n=0;if(0===e)return s.concat(t);for(let r=0;r<t.length;r++)s.push(n|t[r]>>>e),n=t[r]<<32-e;const r=t.length?t[t.length-1]:0,o=T.l(r);return s.push(T.S(e+o&31,e+o>32?n:s.pop(),1)),s}},V={bytes:{v(t){const e=T.bitLength(t)/8,n=new o(e);let s;for(let r=0;r<e;r++)3&r||(s=t[r/4]),n[r]=s>>>24,s<<=8;return n},C(t){const e=[];let n,s=0;for(n=0;n<t.length;n++)s=s<<8|t[n],3&~n||(e.push(s),s=0);return 3&n&&e.push(T.S(8*(3&n),s)),e}}},K=class{constructor(t){const e=this;e.blockSize=512,e.I=[1732584193,4023233417,2562383102,271733878,3285377520],e.A=[1518500249,1859775393,2400959708,3395469782],t?(e.M=t.M.slice(0),e.P=t.P.slice(0),e.D=t.D):e.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.D=0,t}update(t){const e=this;"string"==typeof t&&(t=V.F.C(t));const n=e.P=T.concat(e.P,t),s=e.D,o=e.D=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(n);let a=0;for(let t=e.blockSize+s-(e.blockSize+s&e.blockSize-1);t<=o;t+=e.blockSize)e.B(c.subarray(16*a,16*(a+1))),a+=1;return n.splice(0,16*a),e}R(){const t=this;let e=t.P;const n=t.M;e=T.concat(e,[T.S(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(s.floor(t.D/4294967296)),e.push(0|t.D);e.length;)t.B(e.splice(0,16));return t.reset(),n}U(t,e,n,s){return t<=19?e&n|~e&s:t<=39?e^n^s:t<=59?e&n|e&s|n&s:t<=79?e^n^s:void 0}W(t,e){return e<<t|e>>>32-t}B(e){const n=this,r=n.M,o=t(80);for(let t=0;t<16;t++)o[t]=e[t];let c=r[0],i=r[1],a=r[2],f=r[3],l=r[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=n.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const e=n.W(5,c)+n.U(t,i,a,f)+l+o[t]+n.A[s.floor(t/20)]|0;l=f,f=a,a=n.W(30,i),i=c,c=e}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+l|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,e,n,s){if(n=n||1e4,s<0||n<0)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,u;const w=new ArrayBuffer(o),h=new l(w);let p=0;const d=T;for(e=V.bytes.C(e),u=1;p<(o||1);u++){for(c=i=t.encrypt(d.concat(e,[u])),a=1;a<n;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;p<(o||1)&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return w.slice(0,s/8)},_:class{constructor(t){const e=this,n=e.V=K,s=[[],[]];e.K=[new n,new n];const r=e.K[0].blockSize/32;t.length>r&&(t=(new n).update(t).R());for(let e=0;e<r;e++)s[0][e]=909522486^t[e],s[1][e]=1549556828^t[e];e.K[0].update(s[0]),e.K[1].update(s[1]),e.L=new n(e.K[0])}reset(){const t=this;t.L=new t.V(t.K[0]),t.O=!1}update(t){this.O=!0,this.L.update(t)}digest(){const t=this,e=t.L.R(),n=new t.V(t.K[1]).update(e).R();return t.reset(),n}encrypt(t){if(this.O)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="Invalid signature",H=j,N="zipjs-abort-check-password";function q(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const G=16,J={name:"PBKDF2"},Q=e.assign({hash:{name:"HMAC"}},J),X=e.assign({iterations:1e3,hash:{name:"SHA-1"}},J),Y=["deriveBits"],Z=[8,12,16],$=[16,24,32],tt=10,et=[0,0,0,0],nt=typeof h!=b,st=nt&&h.subtle,rt=nt&&typeof st!=b,ot=V.bytes,ct=class{constructor(t){const e=this;e.j=[[[],[],[],[],[]],[[],[],[],[],[]]],e.j[0][0][0]||e.H();const n=e.j[0][4],s=e.j[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(e.A=[i=t.slice(0),a=[]],c=o;c<4*o+28;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const e=i[3&t?c:c-4];a[t]=c<=4||t<4?e:s[0][n[e>>>24]]^s[1][n[e>>16&255]]^s[2][n[e>>8&255]]^s[3][n[255&e]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],e=this.j[1],n=t[4],s=e[4],r=[],o=[];let c,i,a,f;for(let t=0;t<256;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let l=c=0;!n[l];l^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,n[l]=o,s[o]=l,f=r[a=r[i=r[l]]];let u=16843009*f^65537*a^257*i^16843008*l,w=257*r[o]^16843008*o;for(let n=0;n<4;n++)t[n][l]=w=w<<24^w>>>8,e[n][o]=u=u<<24^u>>>8}for(let n=0;n<5;n++)t[n]=t[n].slice(0),e[n]=e[n].slice(0)}N(t,e){if(4!==t.length)throw new r("invalid aes block size");const n=this.A[e],s=n.length/4-2,o=[0,0,0,0],c=this.j[e],i=c[0],a=c[1],f=c[2],l=c[3],u=c[4];let w,h,p,d=t[0]^n[0],y=t[e?3:1]^n[1],m=t[2]^n[2],S=t[e?1:3]^n[3],g=4;for(let t=0;t<s;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^l[255&S]^n[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^l[255&d]^n[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^l[255&y]^n[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^l[255&m]^n[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[e?3&-t:t]=u[d>>>24]<<24^u[y>>16&255]<<16^u[m>>8&255]<<8^u[255&S]^n[g++],w=d,d=y,y=m,m=S,S=w;return o}},it=class{constructor(t,e){this.G=t,this.J=e,this.X=e}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let e=t>>16&255,n=t>>8&255,s=255&t;255===e?(e=0,255===n?(n=0,255===s?s=0:++s):++n):++e,t=0,t+=e<<16,t+=n<<8,t+=s}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,e,n){let s;if(!(s=e.length))return[];const r=T.bitLength(e);for(let r=0;r<s;r+=4){this.$(n);const s=t.encrypt(n);e[r]^=s[0],e[r+1]^=s[1],e[r+2]^=s[2],e[r+3]^=s[3]}return T.m(e,r)}},at=E._;let ft=nt&&rt&&typeof st.importKey==k,lt=nt&&rt&&typeof st.deriveBits==k;class ut extends d{constructor({password:t,rawPassword:e,encryptionStrength:n,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:c,strength:i,et:a,ready:f}=n;c?(await(async(t,e,n,s)=>{const o=await dt(t,e,n,mt(s,0,Z[e])),c=mt(s,Z[e]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)})(n,i,c,mt(t,0,Z[i]+2)),t=mt(t,Z[i]+2),s?e.error(new r(N)):a()):await f;const l=new o(t.length-tt-(t.length-tt)%G);e.enqueue(pt(n,t,l,0,tt,!0))},async flush(t){const{nt:e,st:n,ot:s,ready:o}=this;if(n&&e){await o;const i=mt(s,0,s.length-tt),a=mt(s,s.length-tt);let f=z;if(i.length){const t=gt(ot,i);n.update(t);const s=e.update(t);f=St(ot,s)}const l=mt(St(ot,n.digest()),0,tt);let u=s.length<tt?1:0;for(let t=0;t<tt;t++)u|=l[t]^a[t];if(u&&c)throw new r(H);t.enqueue(f)}}})}}class wt extends d{constructor({password:t,rawPassword:e,encryptionStrength:n}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:s,strength:r,et:c,ready:i}=n;let a=z;s?(a=await(async(t,e,n)=>{const s=q(new o(Z[e]));return W(s,await dt(t,e,n,s))})(n,r,s),c()):await i;const f=new o(a.length+t.length-t.length%G);f.set(a,0),e.enqueue(pt(n,t,f,a.length,0))},async flush(t){const{nt:e,st:n,ot:s,ready:r}=this;if(n&&e){await r;let o=z;if(s.length){const t=e.update(gt(ot,s));n.update(t),o=St(ot,t)}const c=St(ot,n.digest()).slice(0,tt);t.enqueue(W(o,c))}}})}}function ht(t,n,s,r){e.assign(t,{ready:new u(e=>t.et=e),password:yt(n,s),strength:r-1,ot:z})}function pt(t,e,n,s,r,c){const{nt:i,st:a,ot:f}=t;f.length&&(e=W(f,e));const l=e.length-r;let u;for(n=((t,e)=>{if(e&&e>t.length){const n=t;(t=new o(e)).set(n,0)}return t})(n,s+(l-l%G)),u=0;u<=l-G;u+=G){const t=gt(ot,mt(e,u,u+G));c&&a.update(t);const r=i.update(t);c||a.update(r),n.set(St(ot,r),u+s)}return t.ot=mt(e,u),n}async function dt(n,s,r,c){n.password=null;const i=await(async(t,e,n,s,r)=>{if(!ft)return E.importKey(e);try{return await st.importKey("raw",e,n,!1,r)}catch{return ft=!1,E.importKey(e)}})(0,r,Q,0,Y),a=await(async(t,e,n)=>{if(!lt)return E.T(e,t.salt,X.iterations,n);try{return await st.deriveBits(t,e,n)}catch{return lt=!1,E.T(e,t.salt,X.iterations,n)}})(e.assign({salt:c},X),i,8*(2*$[s]+2)),f=new o(a),l=gt(ot,mt(f,0,$[s])),u=gt(ot,mt(f,$[s],2*$[s])),w=mt(f,2*$[s]);return e.assign(n,{keys:{key:l,ct:u,passwordVerification:w},nt:new it(new ct(l),t.from(et)),st:new at(u)}),w}function yt(t,e){return e===v?(t=>{if(typeof w==b){const e=new o((t=unescape(encodeURIComponent(t))).length);for(let n=0;n<e.length;n++)e[n]=t.charCodeAt(n);return e}return(new w).encode(t)})(t):e}function mt(t,e,n){return t.subarray(e,n)}function St(t,e){return t.v(e)}function gt(t,e){return t.C(e)}class vt extends d{constructor({password:t,rawPassword:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;if(n.password||n.rawPassword){const e=zt(n,t.subarray(0,12));if(n.password=n.rawPassword=null,0!=(e[11]^n.passwordVerification))throw new r(O);t=t.subarray(12)}s?e.error(new r(N)):e.enqueue(zt(n,t))}})}}class bt extends d{constructor({password:t,rawPassword:e,passwordVerification:n}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;let s,r;if(n.password||n.rawPassword){n.password=n.rawPassword=null;const e=q(new o(12));e[11]=n.passwordVerification,s=new o(t.length+e.length),s.set(Ct(n,e),0),r=12}else s=new o(t.length),r=0;s.set(Ct(n,t),r),e.enqueue(s)}})}}function kt(t,n,s,r){e.assign(t,{password:n,rawPassword:s,passwordVerification:r}),((t,n,s)=>{const r=[305419896,591751049,878082192];if(e.assign(t,{keys:r,it:new R(r[0]),ft:new R(r[2])}),s)for(let e=0;e<s.length;e++)It(t,s[e]);else for(let e=0;e<n.length;e++)It(t,n.charCodeAt(e))})(t,n,s)}function zt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=At(t)^e[s],It(t,n[s]);return n}function Ct(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=At(t)^e[s],It(t,e[s]);return n}function It(t,e){let[,n]=t.keys;t.it.append([e]);const r=~t.it.get();n=Mt(s.imul(Mt(n+xt(r)),134775813)+1),t.ft.append([n>>>24]);const o=~t.ft.get();t.keys=[r,n,o]}function At(t){const e=2|t.keys[2];return xt(s.imul(e,1^e)>>>8)}function xt(t){return 255&t}function Mt(t){return 4294967295&t}function Pt(t){if(t instanceof y)return t;const e=t.getReader();return new y({async pull(t){const{value:n,done:s}=await e.read();s?t.close():t.enqueue(n)},cancel:t=>e.cancel(t)})}const Dt=new f;function Ft(t){return Dt.get(t)}const Bt="Invalid uncompressed size",Rt=j,Ut="deflate-raw",Wt="gzip",_t=[31,139,8];class Tt extends d{constructor(t,{chunkSize:e,CompressionStreamFallback:n,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:u,format:w,compressionMethod:h}=t,p=this;let d,y,m,S=super.readable;const g=w&&Ft(w),v=a&&r&&!u&&!g&&(!o||i)&&!(!c||!s);if(o&&!i||!a||v||(d=new U,S=Ht(S,d)),r)if(g)S=Nt(S,Ot(g.CompressionStream,w,{level:f,chunkSize:e,compressionMethod:h}));else if(v)m=new Vt,S=Nt(S,new s(Wt)),S=Ht(S,m);else try{S=jt(S,c,{level:f,chunkSize:e},s,n)}catch(t){let e;try{e=new s(Wt)}catch{throw t}S=Nt(S,e),S=Ht(S,new Vt)}o&&(i?S=Ht(S,new bt(t)):(y=new wt(t),S=Ht(S,y))),Lt(p,S,()=>{o&&!i||!a||(p.crc32=v?m.crc32:new l(d.value.buffer).getUint32(0))})}}class Vt extends d{constructor(){let t,e=10,n=new o(0);super({transform(t,r){if(e){const n=s.min(e,t.length);if(e-=n,!(t=t.subarray(n)).length)return}const o=n.length+t.length;if(o<=8)return void(n=W(n,t));const c=o-8,i=s.min(c,n.length);r.enqueue(W(n.subarray(0,i),t.subarray(0,c-i))),n=W(n.subarray(i),t.subarray(c-i))},flush(){const e=_(n);t.crc32=e.getUint32(0,!0),t.uncompressedSize=e.getUint32(4,!0)}}),t=this}}class Kt extends d{constructor(t,{chunkSize:e,DecompressionStreamFallback:n,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:w,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=Ht(C,new vt(t)):(z=new ut(t),C=Ht(C,z))),w){const t=m&&Ft(m);if(t)C=Nt(C,Ot(t.DecompressionStream,m,{chunkSize:e,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=jt(C,h,{chunkSize:e,deflate64:p},s,n)}catch(t){if(p||b===v)throw t;let e;try{e=new s(Wt)}catch{throw t}C=((t,e,n)=>{const s=new R;let c,i,a,f=0,l=!1;const w=new u((t,e)=>{i=t,a=e});w.catch(()=>{}),n||i();const h=new d({start(t){const e=new o(10);e.set(_t),t.enqueue(e)},transform(t,e){e.enqueue(t)},async flush(t){l=!0,y();try{await w}finally{m()}const e=new o(8),r=_(e);r.setUint32(0,s.get(),!0),r.setUint32(4,n,!0),t.enqueue(e)},cancel(t){a(t)}}),p=new d({transform(t,e){s.append(t),f+=t.length,f>=n?i():l&&y(),e.enqueue(t)},cancel(t){a(t)}});return t=Ht(t,h),Ht(t=Nt(t,e),p);function y(){m(),c=setTimeout(()=>a(new r(Bt)),5e3)}function m(){clearTimeout(c)}})(C,e,b)}C=(t=>{const e=t.getReader();return new y({async pull(t){let n;try{n=await e.read()}catch(t){if(t&&t.message)throw t;const e=new r("Invalid compressed data");throw e.cause=t,e}const{value:s,done:o}=n;o?t.close():t.enqueue(s)},cancel:t=>e.cancel(t)})})(C)}a&&(k=new U,C=Ht(C,k)),Lt(this,C,()=>{if(a){const t=new l(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r(Rt)}})}}const Et=new f;function Lt(t,n,s){n=Ht(n,new d({flush:s})),e.defineProperty(t,"readable",{get:()=>n})}function Ot(t,e,n){if(!t)throw new r("Compression method not supported");return new t(e,n)}function jt(t,e,n,s,r){const o=e&&s?s:r||s,c=n.deflate64?"deflate64-raw":Ut;let i;try{i=new o(c,n)}catch(t){if(!e||!r||o==r)throw t;i=new r(c,n)}return Nt(t,i)}function Ht(t,e){return Pt(t).pipeThrough(e)}function Nt(t,e){const n=e.writable.getWriter(),s=t.getReader();return(async()=>{try{for(;;){await n.ready;const t=await s.read();if(t.done){await n.close();break}await n.write(t.value)}}catch(t){await(async(t,e)=>{try{await t.abort(e)}catch{}})(n,t),await(async(t,e)=>{try{await t.cancel(e)}catch{}})(s,t)}})(),e.readable}const qt="data",Gt="close",Jt="deflate";class Qt extends d{constructor(t,n){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Jt)?c=Tt:o.startsWith("inflate")&&(c=Kt),s.outputSize=0;let i=0;const a=new c(t,n),f=super.readable,l=new d({transform(t,e){t&&t.length&&(i+=t.length,e.enqueue(t))},flush(){e.assign(s,{inputSize:i})}}),u=new d({transform(e,n){if(e&&e.length&&(n.enqueue(e),s.outputSize+=e.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Bt)},flush(){const{crc32:t}=a;e.assign(s,{crc32:t,inputSize:i})}});e.defineProperty(s,"readable",{get:()=>f.pipeThrough(l).pipeThrough(a).pipeThrough(u)})}}class Xt extends d{constructor(t){const e=[];let s=0;function r(){const n=new o(t);let r=0;for(;r<t;){const s=e[0],o=t-r;s.length<=o?(n.set(s,r),r+=s.length,e.shift()):(n.set(s.subarray(0,o),r),e[0]=s.subarray(o),r+=o)}return s-=t,n}(!n.isFinite(t)||t<1)&&(t=65536),super({transform(n,o){for(e.push(n),s+=n.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(((t,e)=>{const n=new o(e);let s=0;for(const e of t)n.set(e,s),s+=e.length;return n})(e,s))}})}}let Yt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Yt=navigator.hardwareConcurrency)}catch{}const Zt=new f,$t=new f;let te,ee,ne,se,re,oe,ce=0;async function ie(t){let e,o;try{const{options:c,config:i}=t;if(c.format)try{await(async(t,e)=>{!Dt.has(t)&&e&&((t,e)=>{const{CompressionStream:n,DecompressionStream:s}=e;if(typeof n!=k&&typeof s!=k)throw new r("Invalid codec module");Dt.set(t,{CompressionStream:n,DecompressionStream:s})})(t,await(import(e)))})(c.format,c.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream,c.compressed&&!c.format)if(c.useCompressionStream){if(!((t,e)=>{if(!t)return!1;let n=Et.get(t);n||(n=new f,Et.set(t,n));let s=n.get(e);if(s===v){try{new t(e),s=!0}catch{s=!1}n.set(e,s)}return s})(c.codecType.startsWith(Jt)?i.CompressionStream:i.DecompressionStream,Ut))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{c.useCompressionStream=!0}!i.CompressionStreamFallback&&i.CompressionStreamZlib&&(i.CompressionStreamFallback=i.CompressionStreamZlib),!i.DecompressionStreamFallback&&i.DecompressionStreamZlib&&(i.DecompressionStreamFallback=i.DecompressionStreamZlib);const a={highWaterMark:1},l=t.readable?Pt(t.readable):new y({async pull(t){const e=new u(t=>Zt.set(ce,t));ae({type:"pull",messageId:ce}),ce=(ce+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await e;t.enqueue(s),r&&t.close()}},a);o=t.writable?(t=>{if(t instanceof m)return t;const e=t.getWriter();return new m({write:t=>e.write(t),close:()=>e.close(),abort:t=>e.abort(t)})})(t.writable):new m({async write(t){let e;const s=new u(t=>e=t);$t.set(ce,e),ae({type:qt,value:t,messageId:ce}),ce=(ce+1)%n.MAX_SAFE_INTEGER,await s}},a),e=new Qt(c,i),te=new AbortController;const{signal:w}=te;await l.pipeThrough(e).pipeThrough(new Xt((t=>{return r="string"==typeof(e=r=t.chunkSize)&&e.trim()?n(e):e,n.isInteger(r)&&r>=1?s.max(r,64):65536;var e,r})(i))).pipeTo(o,{signal:w,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=e;ae({type:Gt,result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=e?e.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}fe(t)}}function ae(t){const{value:e}=t;if(e)if(e.length)try{t.value=(n=e,n.byteOffset||n.byteLength!=n.buffer.byteLength?new o(n):n).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var n}function fe(t=new r("Unknown error")){const{message:e,stack:n,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:e,stack:n,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}function le(t,e,n={}){if(!ee){const t=new r("WASM module not loaded");throw t.cause=oe,t}const c="number"==typeof n.level?n.level:-1,i="number"==typeof n.outBuffer?n.outBuffer:65536,a="number"==typeof n.inBufferSize?n.inBufferSize:65536;return new d({start(){try{let n;if(this.lt=ne(i),this.in=ne(a),this.inBufferSize=a,!this.lt||!this.in)throw new r("allocation failed");if(this.ut=new o(i),t?(this.wt=ee.deflate_process,this.ht=ee.deflate_last_consumed,this.yt=ee.deflate_end,this.St=ee.deflate_new(),n="gzip"===e?ee.deflate_init_gzip(this.St,c):"deflate-raw"===e?ee.deflate_init_raw(this.St,c):ee.deflate_init(this.St,c)):"deflate64-raw"===e?(this.wt=ee.inflate9_process,this.ht=ee.inflate9_last_consumed,this.yt=ee.inflate9_end,this.St=ee.inflate9_new(),n=ee.inflate9_init_raw(this.St)):(this.wt=ee.inflate_process,this.ht=ee.inflate_last_consumed,this.yt=ee.inflate_end,this.St=ee.inflate_new(),n="deflate-raw"===e?ee.inflate_init_raw(this.St):"gzip"===e?ee.inflate_init_gzip(this.St):ee.inflate_init(this.St)),0!==n)throw new r("init failed:"+n)}catch(t){throw f(this),t}},transform(e,n){try{const c=e,a=new o(re.buffer),f=this.wt,l=this.ht,u=this.lt,w=this.ut;let h=0;for(;h<c.length;){const e=s.min(c.length-h,32768);if((!this.in||this.inBufferSize<e)&&(this.in&&se&&(se(this.in),this.in=0),this.in=ne(e),this.inBufferSize=e,!this.in))throw new r("allocation failed");a.set(c.subarray(h,h+e),this.in);const o=f(this.St,this.in,e,u,i,0),p=16777215&o;if(p&&(w.set(a.subarray(u,u+p),0),n.enqueue(w.slice(0,p))),!t){const t=o>>24&255,e=128&t?t-256:t;if(e<0)throw new r("process error:"+e)}const d=l(this.St);if(0===d)break;h+=d}}catch(t){f(this),n.error(t)}},flush(e){try{const n=new o(re.buffer),s=this.wt,c=this.lt,a=this.ut;for(;;){const o=s(this.St,0,0,c,i,4),f=16777215&o,l=o>>24&255;if(!t){const t=128&l?l-256:l;if(t<0)throw new r("process error:"+t)}if(f&&(a.set(n.subarray(c,c+f),0),e.enqueue(a.slice(0,f))),1===l||0===f)break}}catch(t){e.error(t)}finally{const t=f(this);0!==t&&e.error(new r("end error:"+t))}},cancel(){f(this)}});function f(t){let e=0;return t.St&&t.yt&&(e=t.yt(t.St)),t.St=0,t.in&&se&&se(t.in),t.in=0,t.lt&&se&&se(t.lt),t.lt=0,e}}addEventListener("message",({data:t})=>{const{type:e,messageId:n,value:s,done:r}=t;try{if("start"==e&&ie(t),e==qt){const t=Zt.get(n);Zt.delete(n),t({value:s||new o,done:r})}if("ack"==e){const t=$t.get(n);$t.delete(n),t()}e==Gt&&te.abort()}catch(t){fe(t)}}),p({type:"ready"});class ue{constructor(t="deflate",e){return le(!0,t,e)}}class we{constructor(t="deflate",e){return le(!1,t,e)}}ue.gt=!0,we.gt=!0;let he=!1;((t={})=>{const{init:e}=t,n=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{e&&await e(t),n&&(t.CompressionStreamFallback=n),s&&(t.DecompressionStreamFallback=s)}})({CompressionStreamFallback:ue,DecompressionStreamFallback:we,init:t=>(async(t,{baseURI:e})=>{if(!he)try{await(async(t,e)=>{let n,s;try{try{s=new URL(t,e)}catch{}const r=await fetch(s);n=await r.arrayBuffer()}catch(e){if(!t.startsWith("data:application/wasm;base64,"))throw e;n=(t=>{const e=t.split(",")[1],n=atob(e),s=n.length,r=new o(s);for(let t=0;t<s;++t)r[t]=n.charCodeAt(t);return r.buffer})(t)}(t=>{if(ee=t,({malloc:ne,free:se,memory:re}=ee),"function"!=typeof ne||"function"!=typeof se||!re)throw ee=ne=se=re=null,new r("Invalid WASM module")})((await WebAssembly.instantiate(n)).instance.exports)})(t,e),he=!0}catch(t){throw(t=>{oe=t})(t),t}})(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+(t=>{let n="";const s=t.length;let r=0;for(;r+2<s;r+=3){const s=t[r]<<16|t[r+1]<<8|t[r+2];n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+e[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e[s>>18&63]+e[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+"=";}return n})(s)}});
250
397
 
251
398
  /*
252
399
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -1394,13 +1541,13 @@ class AESDecryptionStream extends TransformStream {
1394
1541
  const {
1395
1542
  ctr,
1396
1543
  hmac,
1397
- pending,
1544
+ pendingInput,
1398
1545
  ready
1399
1546
  } = this;
1400
1547
  if (hmac && ctr) {
1401
1548
  await ready;
1402
- const chunkToDecrypt = subarray(pending, 0, pending.length - AUTHENTICATION_CODE_LENGTH);
1403
- const originalAuthenticationCode = subarray(pending, pending.length - AUTHENTICATION_CODE_LENGTH);
1549
+ const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
1550
+ const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
1404
1551
  let decryptedChunkArray = EMPTY_UINT8_ARRAY;
1405
1552
  if (chunkToDecrypt.length) {
1406
1553
  const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
@@ -1409,7 +1556,7 @@ class AESDecryptionStream extends TransformStream {
1409
1556
  decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
1410
1557
  }
1411
1558
  const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
1412
- let invalidAuthenticationCode = pending.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
1559
+ let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
1413
1560
  for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
1414
1561
  invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
1415
1562
  }
@@ -1453,14 +1600,14 @@ class AESEncryptionStream extends TransformStream {
1453
1600
  const {
1454
1601
  ctr,
1455
1602
  hmac,
1456
- pending,
1603
+ pendingInput,
1457
1604
  ready
1458
1605
  } = this;
1459
1606
  if (hmac && ctr) {
1460
1607
  await ready;
1461
1608
  let encryptedChunkArray = EMPTY_UINT8_ARRAY;
1462
- if (pending.length) {
1463
- const encryptedChunk = ctr.update(toBits(codecBytes, pending));
1609
+ if (pendingInput.length) {
1610
+ const encryptedChunk = ctr.update(toBits(codecBytes, pendingInput));
1464
1611
  hmac.update(encryptedChunk);
1465
1612
  encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
1466
1613
  }
@@ -1477,7 +1624,7 @@ function initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength) {
1477
1624
  ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
1478
1625
  password: encodePassword(password, rawPassword),
1479
1626
  strength: encryptionStrength - 1,
1480
- pending: EMPTY_UINT8_ARRAY
1627
+ pendingInput: EMPTY_UINT8_ARRAY
1481
1628
  });
1482
1629
  }
1483
1630
 
@@ -1485,10 +1632,10 @@ function append(aesCrypto, input, output, paddingStart, paddingEnd, verifyAuthen
1485
1632
  const {
1486
1633
  ctr,
1487
1634
  hmac,
1488
- pending
1635
+ pendingInput
1489
1636
  } = aesCrypto;
1490
- if (pending.length) {
1491
- input = concat(pending, input);
1637
+ if (pendingInput.length) {
1638
+ input = concat(pendingInput, input);
1492
1639
  }
1493
1640
  const inputLength = input.length - paddingEnd;
1494
1641
  output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
@@ -1504,7 +1651,7 @@ function append(aesCrypto, input, output, paddingStart, paddingEnd, verifyAuthen
1504
1651
  }
1505
1652
  output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
1506
1653
  }
1507
- aesCrypto.pending = subarray(input, offset);
1654
+ aesCrypto.pendingInput = subarray(input, offset);
1508
1655
  return output;
1509
1656
  }
1510
1657
 
@@ -3281,6 +3428,96 @@ async function terminateWorkers() {
3281
3428
  resetWebWorkerSupport();
3282
3429
  }
3283
3430
 
3431
+ /*
3432
+ Copyright (c) 2022 Gildas Lormeau. All rights reserved.
3433
+
3434
+ Redistribution and use in source and binary forms, with or without
3435
+ modification, are permitted provided that the following conditions are met:
3436
+
3437
+ 1. Redistributions of source code must retain the above copyright notice,
3438
+ this list of conditions and the following disclaimer.
3439
+
3440
+ 2. Redistributions in binary form must reproduce the above copyright
3441
+ notice, this list of conditions and the following disclaimer in
3442
+ the documentation and/or other materials provided with the distribution.
3443
+
3444
+ 3. The names of the authors may not be used to endorse or promote products
3445
+ derived from this software without specific prior written permission.
3446
+
3447
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
3448
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
3449
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
3450
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
3451
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3452
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
3453
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3454
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3455
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
3456
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3457
+ */
3458
+
3459
+ /* global TextDecoder */
3460
+
3461
+ const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
3462
+ const VALID_CP437 = CP437.length == 256;
3463
+
3464
+ function decodeCP437(stringValue) {
3465
+ if (VALID_CP437) {
3466
+ let result = "";
3467
+ for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
3468
+ result += CP437[stringValue[indexCharacter]];
3469
+ }
3470
+ return result;
3471
+ } else {
3472
+ return new TextDecoder().decode(stringValue);
3473
+ }
3474
+ }
3475
+
3476
+ /*
3477
+ Copyright (c) 2022 Gildas Lormeau. All rights reserved.
3478
+
3479
+ Redistribution and use in source and binary forms, with or without
3480
+ modification, are permitted provided that the following conditions are met:
3481
+
3482
+ 1. Redistributions of source code must retain the above copyright notice,
3483
+ this list of conditions and the following disclaimer.
3484
+
3485
+ 2. Redistributions in binary form must reproduce the above copyright
3486
+ notice, this list of conditions and the following disclaimer in
3487
+ the documentation and/or other materials provided with the distribution.
3488
+
3489
+ 3. The names of the authors may not be used to endorse or promote products
3490
+ derived from this software without specific prior written permission.
3491
+
3492
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
3493
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
3494
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
3495
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
3496
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3497
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
3498
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3499
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3500
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
3501
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3502
+ */
3503
+
3504
+
3505
+ function decodeText(value, encoding) {
3506
+ return decode(value, encoding, true);
3507
+ }
3508
+
3509
+ function decodeTextRemovingBOM(value, encoding) {
3510
+ return decode(value, encoding, false);
3511
+ }
3512
+
3513
+ function decode(value, encoding, ignoreBOM) {
3514
+ if (encoding && encoding.trim().toLowerCase() == "cp437") {
3515
+ return decodeCP437(value);
3516
+ } else {
3517
+ return new TextDecoder(encoding, { ignoreBOM }).decode(value);
3518
+ }
3519
+ }
3520
+
3284
3521
  /*
3285
3522
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
3286
3523
 
@@ -3353,6 +3590,7 @@ class Reader extends Stream {
3353
3590
  createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
3354
3591
  const reader = this;
3355
3592
  let chunkOffset = 0;
3593
+ chunkSize = normalizeChunkSize(chunkSize);
3356
3594
  return new ReadableStream({
3357
3595
  async pull(controller) {
3358
3596
  const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
@@ -3360,7 +3598,7 @@ class Reader extends Stream {
3360
3598
  if (data.length) {
3361
3599
  controller.enqueue(data);
3362
3600
  }
3363
- if ((chunkOffset + chunkSize >= size) || (size === UNDEFINED_VALUE && !data.length && dataSize)) {
3601
+ if ((chunkOffset + chunkSize >= size) || (!data.length && dataSize)) {
3364
3602
  controller.close();
3365
3603
  } else {
3366
3604
  chunkOffset += chunkSize;
@@ -3440,31 +3678,31 @@ class Data64URIWriter extends Writer {
3440
3678
  Object.assign(this, {
3441
3679
  contentType,
3442
3680
  data: "data:" + (contentType || "") + ";base64,",
3443
- pending: []
3681
+ pendingCharacters: ""
3444
3682
  });
3445
3683
  }
3446
3684
 
3447
3685
  writeUint8Array(array) {
3448
3686
  const writer = this;
3449
3687
  let indexArray;
3450
- let dataString = writer.pending;
3451
- const delta = writer.pending.length;
3452
- writer.pending = "";
3688
+ let dataString = writer.pendingCharacters;
3689
+ const delta = writer.pendingCharacters.length;
3690
+ writer.pendingCharacters = "";
3453
3691
  for (indexArray = 0; indexArray < (Math.floor((delta + array.length) / 3) * 3) - delta; indexArray++) {
3454
3692
  dataString += String.fromCharCode(array[indexArray]);
3455
3693
  }
3456
3694
  for (; indexArray < array.length; indexArray++) {
3457
- writer.pending += String.fromCharCode(array[indexArray]);
3695
+ writer.pendingCharacters += String.fromCharCode(array[indexArray]);
3458
3696
  }
3459
3697
  if (dataString.length > 2) {
3460
3698
  writer.data += btoa(dataString);
3461
3699
  } else {
3462
- writer.pending = dataString + writer.pending;
3700
+ writer.pendingCharacters = dataString + writer.pendingCharacters;
3463
3701
  }
3464
3702
  }
3465
3703
 
3466
3704
  getData() {
3467
- return this.data + btoa(this.pending);
3705
+ return this.data + btoa(this.pendingCharacters);
3468
3706
  }
3469
3707
  }
3470
3708
 
@@ -3494,7 +3732,7 @@ class BlobReader extends Reader {
3494
3732
  constructor(blob) {
3495
3733
  super();
3496
3734
  Object.assign(this, {
3497
- blob,
3735
+ sourceBlob: blob,
3498
3736
  size: blob.size
3499
3737
  });
3500
3738
  if (!blobSliceProbe) {
@@ -3504,13 +3742,13 @@ class BlobReader extends Reader {
3504
3742
 
3505
3743
  createReadable(options) {
3506
3744
  const reader = this;
3507
- const { blob, size } = reader;
3745
+ const { sourceBlob, size } = reader;
3508
3746
  const { offset = 0, size: readSize = size - offset } = options || {};
3509
3747
  if (!offset && readSize >= size) {
3510
- return toCompatibleReadable(blob.stream());
3748
+ return toCompatibleReadable(sourceBlob.stream());
3511
3749
  }
3512
3750
  if (blobSliceReliable) {
3513
- return toCompatibleReadable(blob.slice(offset, offset + readSize).stream());
3751
+ return toCompatibleReadable(sourceBlob.slice(offset, offset + readSize).stream());
3514
3752
  }
3515
3753
  return super.createReadable(options);
3516
3754
  }
@@ -3519,7 +3757,7 @@ class BlobReader extends Reader {
3519
3757
  const reader = this;
3520
3758
  const offsetEnd = offset + length;
3521
3759
  const readsWholeBlob = !offset && offsetEnd >= reader.size;
3522
- const blob = readsWholeBlob ? reader.blob : reader.blob.slice(offset, offsetEnd);
3760
+ const blob = readsWholeBlob ? reader.sourceBlob : reader.sourceBlob.slice(offset, offsetEnd);
3523
3761
  let arrayBuffer = await blob.arrayBuffer();
3524
3762
  const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
3525
3763
  if (sliceIgnoredByBuggyImplementation) {
@@ -3541,12 +3779,12 @@ class BlobWriter extends Stream {
3541
3779
  }
3542
3780
  });
3543
3781
  writer.contentType = contentType;
3544
- writer.blob = streamToBlob(transformStream.readable, contentType);
3545
- writer.blob.catch(() => { });
3782
+ writer.blobPromise = streamToBlob(transformStream.readable, contentType);
3783
+ writer.blobPromise.catch(() => { });
3546
3784
  }
3547
3785
 
3548
3786
  getData() {
3549
- return this.blob;
3787
+ return this.blobPromise;
3550
3788
  }
3551
3789
  }
3552
3790
 
@@ -3580,7 +3818,7 @@ function getTextSize(text) {
3580
3818
  class TextWriter extends BlobWriter {
3581
3819
 
3582
3820
  constructor(encoding) {
3583
- super(encoding);
3821
+ super();
3584
3822
  Object.assign(this, {
3585
3823
  encoding,
3586
3824
  utf8: !encoding || encoding.toLowerCase() == "utf-8"
@@ -3596,14 +3834,7 @@ class TextWriter extends BlobWriter {
3596
3834
  if (blob.text && utf8) {
3597
3835
  return blob.text();
3598
3836
  } else {
3599
- const reader = new FileReader();
3600
- return new Promise((resolve, reject) => {
3601
- Object.assign(reader, {
3602
- onload: ({ target }) => resolve(target.result),
3603
- onerror: () => reject(reader.error)
3604
- });
3605
- reader.readAsText(blob, encoding);
3606
- });
3837
+ return decodeTextRemovingBOM(new Uint8Array(await blob.arrayBuffer()), encoding);
3607
3838
  }
3608
3839
  }
3609
3840
  }
@@ -4271,85 +4502,13 @@ function readUint8Array(reader, offset, size) {
4271
4502
  return reader.readUint8Array(offset, size);
4272
4503
  }
4273
4504
 
4274
- /*
4275
- Copyright (c) 2022 Gildas Lormeau. All rights reserved.
4276
-
4277
- Redistribution and use in source and binary forms, with or without
4278
- modification, are permitted provided that the following conditions are met:
4279
-
4280
- 1. Redistributions of source code must retain the above copyright notice,
4281
- this list of conditions and the following disclaimer.
4282
-
4283
- 2. Redistributions in binary form must reproduce the above copyright
4284
- notice, this list of conditions and the following disclaimer in
4285
- the documentation and/or other materials provided with the distribution.
4286
-
4287
- 3. The names of the authors may not be used to endorse or promote products
4288
- derived from this software without specific prior written permission.
4289
-
4290
- THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
4291
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
4292
- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
4293
- INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
4294
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4295
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
4296
- OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
4297
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
4298
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
4299
- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4300
- */
4301
-
4302
- /* global TextDecoder */
4303
-
4304
- const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
4305
- const VALID_CP437 = CP437.length == 256;
4306
-
4307
- function decodeCP437(stringValue) {
4308
- if (VALID_CP437) {
4309
- let result = "";
4310
- for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
4311
- result += CP437[stringValue[indexCharacter]];
4312
- }
4313
- return result;
4314
- } else {
4315
- return new TextDecoder().decode(stringValue);
4316
- }
4317
- }
4318
-
4319
- /*
4320
- Copyright (c) 2022 Gildas Lormeau. All rights reserved.
4321
-
4322
- Redistribution and use in source and binary forms, with or without
4323
- modification, are permitted provided that the following conditions are met:
4324
-
4325
- 1. Redistributions of source code must retain the above copyright notice,
4326
- this list of conditions and the following disclaimer.
4327
-
4328
- 2. Redistributions in binary form must reproduce the above copyright
4329
- notice, this list of conditions and the following disclaimer in
4330
- the documentation and/or other materials provided with the distribution.
4331
-
4332
- 3. The names of the authors may not be used to endorse or promote products
4333
- derived from this software without specific prior written permission.
4334
-
4335
- THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
4336
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
4337
- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
4338
- INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
4339
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4340
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
4341
- OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
4342
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
4343
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
4344
- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4345
- */
4346
-
4347
-
4348
- function decodeText(value, encoding) {
4349
- if (encoding && encoding.trim().toLowerCase() == "cp437") {
4350
- return decodeCP437(value);
4505
+ function createReadable(reader, options) {
4506
+ if (reader.createReadable) {
4507
+ return reader.createReadable(options);
4508
+ } else if (reader.readUint8Array) {
4509
+ return Reader.prototype.createReadable.call(reader, options);
4351
4510
  } else {
4352
- return new TextDecoder(encoding, { ignoreBOM: true }).decode(value);
4511
+ return reader.readable;
4353
4512
  }
4354
4513
  }
4355
4514
 
@@ -4509,83 +4668,6 @@ class Entry {
4509
4668
 
4510
4669
  }
4511
4670
 
4512
- /*
4513
- Copyright (c) 2022 Gildas Lormeau. All rights reserved.
4514
-
4515
- Redistribution and use in source and binary forms, with or without
4516
- modification, are permitted provided that the following conditions are met:
4517
-
4518
- 1. Redistributions of source code must retain the above copyright notice,
4519
- this list of conditions and the following disclaimer.
4520
-
4521
- 2. Redistributions in binary form must reproduce the above copyright
4522
- notice, this list of conditions and the following disclaimer in
4523
- the documentation and/or other materials provided with the distribution.
4524
-
4525
- 3. The names of the authors may not be used to endorse or promote products
4526
- derived from this software without specific prior written permission.
4527
-
4528
- THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
4529
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
4530
- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
4531
- INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
4532
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4533
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
4534
- OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
4535
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
4536
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
4537
- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4538
- */
4539
-
4540
- const OPTION_FILENAME_ENCODING = "filenameEncoding";
4541
- const OPTION_COMMENT_ENCODING = "commentEncoding";
4542
- const OPTION_DECODE_TEXT = "decodeText";
4543
- const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
4544
- const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
4545
- const OPTION_PASSWORD = "password";
4546
- const OPTION_RAW_PASSWORD = "rawPassword";
4547
- const OPTION_PASS_THROUGH = "passThrough";
4548
- const OPTION_SIGNAL = "signal";
4549
- const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
4550
- const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
4551
- const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
4552
- const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
4553
- const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
4554
- const OPTION_CHECK_SIGNATURE = "checkSignature";
4555
- const OPTION_CHECK_CRC32 = "checkCrc32";
4556
- const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
4557
- const OPTION_USE_WEB_WORKERS = "useWebWorkers";
4558
- const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
4559
- const OPTION_TRANSFER_STREAMS = "transferStreams";
4560
- const OPTION_PREVENT_CLOSE = "preventClose";
4561
- const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
4562
- const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
4563
- const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
4564
- const OPTION_KEEP_ORDER = "keepOrder";
4565
- const OPTION_LEVEL = "level";
4566
- const OPTION_BUFFERED_WRITE = "bufferedWrite";
4567
- const OPTION_CREATE_TEMP_STREAM = "createTempStream";
4568
- const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
4569
- const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
4570
- const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
4571
- const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
4572
- const OPTION_ENCODE_TEXT = "encodeText";
4573
- const OPTION_OFFSET = "offset";
4574
- const OPTION_USDZ = "usdz";
4575
- const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
4576
- const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
4577
- const OPTION_STRICTNESS = "strictness";
4578
- const OPTION_FILENAME_VALIDATION = "filenameValidation";
4579
- const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
4580
- const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
4581
- const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
4582
- const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
4583
- const TEXT_TYPE_FILENAME = "filename";
4584
- const TEXT_TYPE_COMMENT = "comment";
4585
- const STRICTNESS_STRICT = "strict";
4586
- const STRICTNESS_BALANCED = "balanced";
4587
- const STRICTNESS_TOLERANT = "tolerant";
4588
-
4589
4671
  /*
4590
4672
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
4591
4673
 
@@ -4626,6 +4708,7 @@ const ERR_UNSUPPORTED_ENCRYPTION = "Encryption method not supported";
4626
4708
  const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
4627
4709
  const ERR_SPLIT_ZIP_FILE = "Split zip file";
4628
4710
  const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
4711
+ const ERR_ENTRY_DATA_OUT_OF_BOUNDS = "Entry data out of bounds";
4629
4712
  const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
4630
4713
  const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
4631
4714
  const ERR_UNSAFE_FILENAME = "Unsafe filename";
@@ -4646,7 +4729,7 @@ const ZIP64_PROPERTIES = [
4646
4729
  ];
4647
4730
  const ZIP64_EXTRACTION = {
4648
4731
  [MAX_16_BITS]: {
4649
- getValue: getUint32,
4732
+ getValue: getUint32$1,
4650
4733
  bytes: 4
4651
4734
  },
4652
4735
  [MAX_32_BITS]: {
@@ -4655,6 +4738,7 @@ const ZIP64_EXTRACTION = {
4655
4738
  }
4656
4739
  };
4657
4740
  const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
4741
+ const MAX_DEFLATE_EXPANSION_RATIO = 1032;
4658
4742
  const CENTRAL_DIRECTORY_UNREACHABLE = 0;
4659
4743
  const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
4660
4744
  const CENTRAL_DIRECTORY_REACHABLE = 2;
@@ -4665,7 +4749,6 @@ class ZipReader {
4665
4749
  Object.assign(this, {
4666
4750
  reader: new GenericReader(reader),
4667
4751
  options,
4668
- config: getConfiguration(),
4669
4752
  readRanges: new Map()
4670
4753
  });
4671
4754
  }
@@ -4673,7 +4756,6 @@ class ZipReader {
4673
4756
  async* getEntriesGenerator(options = {}) {
4674
4757
  const zipReader = this;
4675
4758
  let { reader } = zipReader;
4676
- const { config } = zipReader;
4677
4759
  await initStream(reader);
4678
4760
  if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
4679
4761
  reader = new BlobReader(await streamToBlob(reader.readable));
@@ -4690,9 +4772,7 @@ class ZipReader {
4690
4772
  const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
4691
4773
  const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
4692
4774
  if (!endOfDirectoryInfo) {
4693
- const signatureArray = await readUint8Array(reader, 0, 4);
4694
- const signatureView = getDataView(signatureArray);
4695
- if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
4775
+ if (await startsWithSplitZipSignature$1(reader)) {
4696
4776
  throw new Error(ERR_SPLIT_ZIP_FILE);
4697
4777
  } else {
4698
4778
  throw new Error(ERR_EOCDR_NOT_FOUND);
@@ -4702,22 +4782,23 @@ class ZipReader {
4702
4782
  throwAmbiguousArchive("multiple end of central directory records");
4703
4783
  }
4704
4784
  const endOfDirectoryView = getDataView(endOfDirectoryInfo);
4705
- let directoryDataLength = getUint32(endOfDirectoryView, 12);
4706
- let directoryDataOffset = getUint32(endOfDirectoryView, 16);
4785
+ let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
4786
+ let directoryDataOffset = getUint32$1(endOfDirectoryView, 16);
4707
4787
  const commentOffset = endOfDirectoryInfo.offset;
4708
- const commentLength = getUint16(endOfDirectoryView, 20);
4788
+ const commentLength = getUint16$1(endOfDirectoryView, 20);
4709
4789
  const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
4710
4790
  if (reader.size - appendedDataOffset > maxAppendedDataSize) {
4711
4791
  throwAmbiguousArchive("appended data");
4712
4792
  }
4713
- let lastDiskNumber = getUint16(endOfDirectoryView, 4);
4793
+ let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
4714
4794
  const expectedLastDiskNumber = reader.lastDiskNumber || 0;
4715
- let diskNumber = getUint16(endOfDirectoryView, 6);
4716
- let filesLength = getUint16(endOfDirectoryView, 10);
4795
+ let diskNumber = getUint16$1(endOfDirectoryView, 6);
4796
+ let filesLength = getUint16$1(endOfDirectoryView, 10);
4717
4797
  let prependedDataLength = 0;
4718
4798
  let startOffset;
4719
4799
  let zip64EndOfDirectory;
4720
4800
  let zip64EndOfDirectoryVersion2;
4801
+ let zip64EndOfDirectoryLength = ZIP64_END_OF_CENTRAL_DIR_LENGTH;
4721
4802
  let directoryEncryptionInfo;
4722
4803
  const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
4723
4804
  if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
@@ -4729,12 +4810,12 @@ class ZipReader {
4729
4810
  EMPTY_UINT8_ARRAY;
4730
4811
  const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
4731
4812
  if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
4732
- getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
4733
- directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
4813
+ getUint32$1(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
4814
+ directoryDataOffset = getDiskOffset$1(reader, getUint32$1(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
4734
4815
  let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4735
4816
  let endOfDirectoryView = getDataView(endOfDirectoryArray);
4736
4817
  const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
4737
- if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
4818
+ if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
4738
4819
  directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
4739
4820
  const originalDirectoryDataOffset = directoryDataOffset;
4740
4821
  directoryDataOffset = expectedDirectoryDataOffset;
@@ -4744,7 +4825,7 @@ class ZipReader {
4744
4825
  endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4745
4826
  endOfDirectoryView = getDataView(endOfDirectoryArray);
4746
4827
  }
4747
- if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
4828
+ if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
4748
4829
  throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
4749
4830
  }
4750
4831
  zip64EndOfDirectory = true;
@@ -4754,18 +4835,19 @@ class ZipReader {
4754
4835
  Number(getBigUint64(endOfDirectoryView, 4)) - (ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12),
4755
4836
  reader.size - directoryDataOffset - ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4756
4837
  if (extensibleDataLength > 0) {
4838
+ zip64EndOfDirectoryLength += extensibleDataLength;
4757
4839
  const rawExtensibleData = await readUint8Array(reader, directoryDataOffset + ZIP64_END_OF_CENTRAL_DIR_LENGTH, extensibleDataLength);
4758
4840
  directoryEncryptionInfo = getDirectoryEncryptionInfo(rawExtensibleData);
4759
4841
  }
4760
4842
  }
4761
4843
  if (lastDiskNumber == MAX_16_BITS) {
4762
- lastDiskNumber = getUint32(endOfDirectoryView, 16);
4763
- } else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
4844
+ lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
4845
+ } else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
4764
4846
  throwAmbiguousArchive("mismatched zip64 end of central directory record");
4765
4847
  }
4766
4848
  if (diskNumber == MAX_16_BITS) {
4767
- diskNumber = getUint32(endOfDirectoryView, 20);
4768
- } else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
4849
+ diskNumber = getUint32$1(endOfDirectoryView, 20);
4850
+ } else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
4769
4851
  throwAmbiguousArchive("mismatched zip64 end of central directory record");
4770
4852
  }
4771
4853
  if (filesLength == MAX_16_BITS) {
@@ -4783,7 +4865,7 @@ class ZipReader {
4783
4865
  }
4784
4866
  let declaredDirectoryDataLength = directoryDataLength;
4785
4867
  const centralDirectoryEndOffset = endOfDirectoryInfo.offset -
4786
- (zip64EndOfDirectory ? ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
4868
+ (zip64EndOfDirectory ? zip64EndOfDirectoryLength + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
4787
4869
  if (directoryDataOffset >= reader.size) {
4788
4870
  prependedDataLength = reader.size - directoryDataOffset - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
4789
4871
  directoryDataOffset = reader.size - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
@@ -4803,11 +4885,13 @@ class ZipReader {
4803
4885
  }
4804
4886
  const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
4805
4887
  if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
4806
- const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE;
4888
+ const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
4889
+ Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
4890
+ detectEncryptedCentralDirectory(directoryView);
4807
4891
  let reconcile = !storedPointsAtDirectory;
4808
4892
  if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
4809
4893
  const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
4810
- reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
4894
+ reconcile = getUint32$1(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
4811
4895
  }
4812
4896
  if (reconcile) {
4813
4897
  const originalDirectoryDataOffset = directoryDataOffset;
@@ -4831,12 +4915,14 @@ class ZipReader {
4831
4915
  }
4832
4916
  zipReader.directoryOffset = directoryDataOffset;
4833
4917
  zipReader.directoryLength = declaredDirectoryDataLength;
4834
- const decryptCentralDirectory = getOptionValue$1(zipReader, options, OPTION_DECRYPT_CENTRAL_DIRECTORY);
4835
- let decryptedDirectory;
4918
+ const decryptCentralDirectory = getFunctionOptionValue$1(zipReader, options, OPTION_DECRYPT_CENTRAL_DIRECTORY);
4919
+ let decryptedDirectory, dataAfterEncryptedDirectory;
4836
4920
  if (decryptCentralDirectory && filesLength && directoryArray.length >= 4 &&
4837
- getUint32(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
4921
+ getUint32$1(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
4838
4922
  (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
4839
- directoryArray = await decryptCentralDirectory(directoryArray, directoryEncryptionInfo);
4923
+ const encryptedDirectoryDataLength = getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryArray.length);
4924
+ dataAfterEncryptedDirectory = directoryArray.subarray(encryptedDirectoryDataLength);
4925
+ directoryArray = await decryptCentralDirectory(directoryArray.subarray(0, encryptedDirectoryDataLength), directoryEncryptionInfo);
4840
4926
  directoryView = getDataView(directoryArray);
4841
4927
  declaredDirectoryDataLength = directoryArray.length;
4842
4928
  decryptedDirectory = true;
@@ -4847,8 +4933,8 @@ class ZipReader {
4847
4933
  const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
4848
4934
  let duplicateFilename;
4849
4935
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
4850
- const fileEntry = new ZipEntry$1(reader, config, zipReader.options);
4851
- if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
4936
+ const fileEntry = new ZipEntry$1(reader, zipReader.options);
4937
+ if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32$1(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
4852
4938
  if (indexFile == 0 && !decryptedDirectory && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
4853
4939
  throw new Error(ERR_ENCRYPTED_CENTRAL_DIRECTORY);
4854
4940
  }
@@ -4859,16 +4945,16 @@ class ZipReader {
4859
4945
  const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
4860
4946
  const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
4861
4947
  const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
4862
- const versionMadeBy = getUint16(directoryView, offset + 4);
4948
+ const versionMadeBy = getUint16$1(directoryView, offset + 4);
4863
4949
  const msDosCompatible = versionMadeBy >> 8 == 0;
4864
4950
  const unixCompatible = versionMadeBy >> 8 == 3;
4865
4951
  const rawFilename = directoryArray.subarray(filenameOffset, extraFieldOffset);
4866
- const commentLength = getUint16(directoryView, offset + 32);
4952
+ const commentLength = getUint16$1(directoryView, offset + 32);
4867
4953
  const endOffset = commentOffset + commentLength;
4868
4954
  const rawComment = directoryArray.subarray(commentOffset, endOffset);
4869
4955
  const filenameUTF8 = languageEncodingFlag;
4870
4956
  const commentUTF8 = languageEncodingFlag;
4871
- const externalFileAttributes = getUint32(directoryView, offset + 38);
4957
+ const externalFileAttributes = getUint32$1(directoryView, offset + 38);
4872
4958
  const msdosAttributesRaw = externalFileAttributes & MAX_8_BITS;
4873
4959
  const msdosAttributes = {
4874
4960
  readOnly: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_READONLY_MASK),
@@ -4877,8 +4963,8 @@ class ZipReader {
4877
4963
  directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
4878
4964
  archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
4879
4965
  };
4880
- const offsetFileEntry = getUint32(directoryView, offset + 42);
4881
- const decode = getOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
4966
+ const offsetFileEntry = getUint32$1(directoryView, offset + 42);
4967
+ const decode = getFunctionOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
4882
4968
  const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
4883
4969
  const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
4884
4970
  let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
@@ -4902,6 +4988,7 @@ class ZipReader {
4902
4988
  }
4903
4989
  Object.assign(fileEntry, {
4904
4990
  index: indexFile,
4991
+ decryptedDirectory,
4905
4992
  versionMadeBy,
4906
4993
  msDosCompatible,
4907
4994
  zip64: false,
@@ -4909,8 +4996,8 @@ class ZipReader {
4909
4996
  uncompressedSize: 0,
4910
4997
  commentLength,
4911
4998
  offset: offsetFileEntry,
4912
- diskNumberStart: getUint16(directoryView, offset + 34),
4913
- internalFileAttributes: getUint16(directoryView, offset + 36),
4999
+ diskNumberStart: getUint16$1(directoryView, offset + 34),
5000
+ internalFileAttributes: getUint16$1(directoryView, offset + 36),
4914
5001
  externalFileAttributes,
4915
5002
  msdosAttributesRaw,
4916
5003
  msdosAttributes,
@@ -4978,12 +5065,11 @@ class ZipReader {
4978
5065
  yield entry;
4979
5066
  }
4980
5067
  let offsetAfterSignature = offset;
4981
- if (offset + 6 <= directoryArray.length && getUint32(directoryView, offset) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
4982
- const signatureDataLength = getUint16(directoryView, offset + 4);
4983
- if (offset + 6 + signatureDataLength <= directoryArray.length) {
4984
- zipReader.digitalSignature = directoryArray.subarray(offset + 6, offset + 6 + signatureDataLength);
4985
- offsetAfterSignature = offset + 6 + signatureDataLength;
4986
- }
5068
+ const digitalSignature = readDigitalSignature(directoryArray.subarray(offset)) ||
5069
+ (decryptedDirectory ? readDigitalSignature(dataAfterEncryptedDirectory) : UNDEFINED_VALUE);
5070
+ if (digitalSignature) {
5071
+ zipReader.digitalSignature = digitalSignature;
5072
+ offsetAfterSignature = offset + 6 + digitalSignature.length;
4987
5073
  }
4988
5074
  if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
4989
5075
  throwAmbiguousArchive("trailing central directory data");
@@ -4991,13 +5077,17 @@ class ZipReader {
4991
5077
  if (duplicateFilename) {
4992
5078
  throwAmbiguousArchive("duplicate filename");
4993
5079
  }
4994
- if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
4995
- throwAmbiguousArchive("prepended data");
4996
- }
4997
5080
  const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
4998
5081
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
5082
+ const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
5083
+ startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
5084
+ if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
5085
+ throwAmbiguousArchive("prepended data");
5086
+ }
4999
5087
  if (extractPrependedData) {
5000
- zipReader.prependedData = startOffset > 0 ? await readUint8Array(reader, 0, startOffset) : EMPTY_UINT8_ARRAY;
5088
+ zipReader.prependedData = startOffset > splitZipSignatureLength ?
5089
+ await readUint8Array(reader, splitZipSignatureLength, startOffset - splitZipSignatureLength) :
5090
+ EMPTY_UINT8_ARRAY;
5001
5091
  }
5002
5092
  zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : EMPTY_UINT8_ARRAY;
5003
5093
  if (extractAppendedData) {
@@ -5064,16 +5154,16 @@ class ZipReaderStream {
5064
5154
 
5065
5155
  let ZipEntry$1 = class ZipEntry {
5066
5156
 
5067
- constructor(reader, config, options) {
5157
+ constructor(reader, options) {
5068
5158
  Object.assign(this, {
5069
5159
  reader,
5070
- config,
5071
5160
  options
5072
5161
  });
5073
5162
  }
5074
5163
 
5075
5164
  async getData(writer, fileEntry, readRanges, options = {}) {
5076
5165
  const zipEntry = this;
5166
+ const config = getConfiguration();
5077
5167
  const {
5078
5168
  reader,
5079
5169
  index,
@@ -5082,7 +5172,6 @@ let ZipEntry$1 = class ZipEntry {
5082
5172
  extraFieldAES,
5083
5173
  extraFieldZip64,
5084
5174
  compressionMethod,
5085
- config,
5086
5175
  bitFlag,
5087
5176
  rawBitFlag,
5088
5177
  crc32,
@@ -5100,6 +5189,7 @@ let ZipEntry$1 = class ZipEntry {
5100
5189
  let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
5101
5190
  let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
5102
5191
  const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
5192
+ checkPasswordOption(password, rawPassword);
5103
5193
  password = password && password.length && password;
5104
5194
  rawPassword = rawPassword && rawPassword.length && rawPassword;
5105
5195
  if (extraFieldAES) {
@@ -5107,7 +5197,7 @@ let ZipEntry$1 = class ZipEntry {
5107
5197
  throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
5108
5198
  }
5109
5199
  }
5110
- if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
5200
+ if (dataArray.length < HEADER_SIZE || getUint32$1(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
5111
5201
  throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
5112
5202
  }
5113
5203
  readCommonHeader(localDirectory, dataView, 4);
@@ -5169,9 +5259,12 @@ let ZipEntry$1 = class ZipEntry {
5169
5259
  }
5170
5260
  }
5171
5261
  const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
5262
+ if (dataOffset + compressedSize > reader.size) {
5263
+ throw new Error(ERR_ENTRY_DATA_OUT_OF_BOUNDS);
5264
+ }
5172
5265
  const size = compressedSize;
5173
5266
  const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
5174
- const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
5267
+ const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
5175
5268
  const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
5176
5269
  let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
5177
5270
  const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
@@ -5179,6 +5272,8 @@ let ZipEntry$1 = class ZipEntry {
5179
5272
  checkOverlappingEntry = true;
5180
5273
  }
5181
5274
  const { onstart, onprogress, onend } = options;
5275
+ const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
5276
+ const outputSize = passThrough ? compressedSize : uncompressedSize;
5182
5277
  const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
5183
5278
  let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
5184
5279
  if (deflate64) {
@@ -5199,9 +5294,9 @@ let ZipEntry$1 = class ZipEntry {
5199
5294
  checkCrc32,
5200
5295
  checkAuthenticationCode: getOptionValue$1(zipEntry, options, OPTION_CHECK_AUTHENTICATION_CODE),
5201
5296
  passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((crc32 >>> 24) & MAX_8_BITS)),
5202
- outputSize: passThrough ? compressedSize : uncompressedSize,
5297
+ outputSize,
5203
5298
  crc32,
5204
- compressed: compressionMethod != 0 && !passThrough,
5299
+ compressed,
5205
5300
  encrypted,
5206
5301
  useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
5207
5302
  useCompressionStream,
@@ -5238,11 +5333,11 @@ let ZipEntry$1 = class ZipEntry {
5238
5333
  writer = new WritableStream();
5239
5334
  }
5240
5335
  writer = new GenericWriter(writer);
5241
- await initStream(writer, passThrough ? compressedSize : uncompressedSize);
5336
+ await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
5242
5337
  ({ writable } = writer);
5243
- const { outputSize } = await runWorker({ readable, writable }, workerOptions);
5244
- writer.size += outputSize;
5245
- if (outputSize != (passThrough ? compressedSize : uncompressedSize)) {
5338
+ const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
5339
+ writer.size += writtenSize;
5340
+ if (writtenSize != outputSize) {
5246
5341
  throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
5247
5342
  }
5248
5343
  }
@@ -5276,26 +5371,47 @@ let ZipEntry$1 = class ZipEntry {
5276
5371
  function detectEncryptedCentralDirectory(directoryView) {
5277
5372
  const maxOffset = Math.min(directoryView.byteLength, 1024) - 3;
5278
5373
  for (let offset = 0; offset < maxOffset; offset++) {
5279
- if (getUint32(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
5374
+ if (getUint32$1(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
5280
5375
  return true;
5281
5376
  }
5282
5377
  }
5283
5378
  return false;
5284
5379
  }
5285
5380
 
5381
+ function readDigitalSignature(signatureRecordArray) {
5382
+ if (signatureRecordArray.length >= 6) {
5383
+ const signatureRecordView = getDataView(signatureRecordArray);
5384
+ if (getUint32$1(signatureRecordView, 0) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
5385
+ const signatureDataLength = getUint16$1(signatureRecordView, 4);
5386
+ if (6 + signatureDataLength <= signatureRecordArray.length) {
5387
+ return signatureRecordArray.subarray(6, 6 + signatureDataLength);
5388
+ }
5389
+ }
5390
+ }
5391
+ }
5392
+
5393
+ function getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryDataLength) {
5394
+ const encryptedDirectoryDataLength = directoryEncryptionInfo && directoryEncryptionInfo.compressedSize ?
5395
+ directoryEncryptionInfo.compressedSize :
5396
+ declaredDirectoryDataLength;
5397
+ return encryptedDirectoryDataLength > 0 && encryptedDirectoryDataLength <= directoryDataLength ?
5398
+ encryptedDirectoryDataLength :
5399
+ directoryDataLength;
5400
+ }
5401
+
5286
5402
  function getDirectoryEncryptionInfo(rawExtensibleData) {
5287
5403
  const directoryEncryptionInfo = { rawExtensibleData };
5288
5404
  if (rawExtensibleData.length >= 28) {
5289
5405
  const extensibleDataView = getDataView(rawExtensibleData);
5290
- const hashDataLength = getUint16(extensibleDataView, 26);
5406
+ const hashDataLength = getUint16$1(extensibleDataView, 26);
5291
5407
  Object.assign(directoryEncryptionInfo, {
5292
- compressionMethod: getUint16(extensibleDataView, 0),
5408
+ compressionMethod: getUint16$1(extensibleDataView, 0),
5293
5409
  compressedSize: Number(getBigUint64(extensibleDataView, 2)),
5294
5410
  uncompressedSize: Number(getBigUint64(extensibleDataView, 10)),
5295
- encryptionAlgorithm: getUint16(extensibleDataView, 18),
5296
- bitLength: getUint16(extensibleDataView, 20),
5297
- flags: getUint16(extensibleDataView, 22),
5298
- hashAlgorithm: getUint16(extensibleDataView, 24),
5411
+ encryptionAlgorithm: getUint16$1(extensibleDataView, 18),
5412
+ bitLength: getUint16$1(extensibleDataView, 20),
5413
+ flags: getUint16$1(extensibleDataView, 22),
5414
+ hashAlgorithm: getUint16$1(extensibleDataView, 24),
5299
5415
  hashData: rawExtensibleData.subarray(28, 28 + hashDataLength)
5300
5416
  });
5301
5417
  }
@@ -5303,12 +5419,12 @@ function getDirectoryEncryptionInfo(rawExtensibleData) {
5303
5419
  }
5304
5420
 
5305
5421
  function readCommonHeader(directory, dataView, offset) {
5306
- const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
5422
+ const rawBitFlag = directory.rawBitFlag = getUint16$1(dataView, offset + 2);
5307
5423
  const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
5308
- const rawLastModDate = getUint32(dataView, offset + 6);
5424
+ const rawLastModDate = getUint32$1(dataView, offset + 6);
5309
5425
  Object.assign(directory, {
5310
5426
  encrypted,
5311
- version: getUint16(dataView, offset),
5427
+ version: getUint16$1(dataView, offset),
5312
5428
  bitFlag: {
5313
5429
  level: (rawBitFlag & BITFLAG_LEVEL) >> 1,
5314
5430
  dataDescriptor: (rawBitFlag & BITFLAG_DATA_DESCRIPTOR) == BITFLAG_DATA_DESCRIPTOR,
@@ -5316,8 +5432,8 @@ function readCommonHeader(directory, dataView, offset) {
5316
5432
  },
5317
5433
  rawLastModDate,
5318
5434
  lastModDate: getDate(rawLastModDate),
5319
- filenameLength: getUint16(dataView, offset + 22),
5320
- extraFieldLength: getUint16(dataView, offset + 24)
5435
+ filenameLength: getUint16$1(dataView, offset + 22),
5436
+ extraFieldLength: getUint16$1(dataView, offset + 24)
5321
5437
  });
5322
5438
  }
5323
5439
 
@@ -5328,8 +5444,8 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5328
5444
  let offsetExtraField = 0;
5329
5445
  try {
5330
5446
  while (offsetExtraField < rawExtraField.length) {
5331
- const type = getUint16(rawExtraFieldView, offsetExtraField);
5332
- const size = getUint16(rawExtraFieldView, offsetExtraField + 2);
5447
+ const type = getUint16$1(rawExtraFieldView, offsetExtraField);
5448
+ const size = getUint16$1(rawExtraFieldView, offsetExtraField + 2);
5333
5449
  extraField.set(type, {
5334
5450
  type,
5335
5451
  data: rawExtraField.slice(offsetExtraField + 4, offsetExtraField + 4 + size)
@@ -5339,12 +5455,12 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
5339
5455
  } catch {
5340
5456
  // ignored
5341
5457
  }
5342
- const compressionMethod = getUint16(dataView, offset + 4);
5458
+ const compressionMethod = getUint16$1(dataView, offset + 4);
5343
5459
  Object.assign(directory, {
5344
- signature: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
5345
- crc32: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
5346
- compressedSize: getUint32(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
5347
- uncompressedSize: getUint32(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
5460
+ signature: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
5461
+ crc32: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
5462
+ compressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
5463
+ uncompressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
5348
5464
  });
5349
5465
  const extraFieldZip64 = extraField.get(EXTRAFIELD_TYPE_ZIP64);
5350
5466
  if (extraFieldZip64) {
@@ -5433,11 +5549,11 @@ function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName,
5433
5549
  computedCrc32.append(fileEntry[rawPropertyName]);
5434
5550
  const computedCrc32View = getDataView(new Uint8Array(4));
5435
5551
  computedCrc32View.setUint32(0, computedCrc32.get(), true);
5436
- const nameCrc32 = getUint32(extraFieldView, 1);
5552
+ const nameCrc32 = getUint32$1(extraFieldView, 1);
5437
5553
  Object.assign(extraFieldUnicode, {
5438
5554
  version: getUint8(extraFieldView, 0),
5439
5555
  [propertyName]: decodeText(extraFieldUnicode.data.subarray(5)),
5440
- valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32(computedCrc32View, 0)
5556
+ valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32$1(computedCrc32View, 0)
5441
5557
  });
5442
5558
  if (extraFieldUnicode.valid) {
5443
5559
  directory[propertyName] = extraFieldUnicode[propertyName];
@@ -5453,7 +5569,7 @@ function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
5453
5569
  vendorId: getUint8(extraFieldView, 2),
5454
5570
  strength,
5455
5571
  originalCompressionMethod: compressionMethod,
5456
- compressionMethod: getUint16(extraFieldView, 5)
5572
+ compressionMethod: getUint16$1(extraFieldView, 5)
5457
5573
  });
5458
5574
  directory.compressionMethod = extraFieldAES.compressionMethod;
5459
5575
  if (extraFieldAES.vendorVersion != VENDOR_VERSION_AE_1$1) {
@@ -5467,8 +5583,8 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
5467
5583
  let tag1Data;
5468
5584
  try {
5469
5585
  while (offsetExtraField < extraFieldNTFS.data.length && !tag1Data) {
5470
- const tagValue = getUint16(extraFieldView, offsetExtraField);
5471
- const attributeSize = getUint16(extraFieldView, offsetExtraField + 2);
5586
+ const tagValue = getUint16$1(extraFieldView, offsetExtraField);
5587
+ const attributeSize = getUint16$1(extraFieldView, offsetExtraField + 2);
5472
5588
  if (tagValue == EXTRAFIELD_TYPE_NTFS_TAG1) {
5473
5589
  tag1Data = extraFieldNTFS.data.slice(offsetExtraField + 4, offsetExtraField + 4 + attributeSize);
5474
5590
  }
@@ -5501,12 +5617,12 @@ function readExtraFieldUnixDates(extraField, directory) {
5501
5617
  return;
5502
5618
  }
5503
5619
  const extraFieldView = getDataView(extraField.data);
5504
- const lastAccessDate = new Date((getUint32(extraFieldView, 0) | 0) * 1000);
5505
- const lastModDate = new Date((getUint32(extraFieldView, 4) | 0) * 1000);
5620
+ const lastAccessDate = new Date((getUint32$1(extraFieldView, 0) | 0) * 1000);
5621
+ const lastModDate = new Date((getUint32$1(extraFieldView, 4) | 0) * 1000);
5506
5622
  const extraFieldData = { lastAccessDate, lastModDate };
5507
5623
  if (extraField.data.length >= 12) {
5508
- extraFieldData.uid = getUint16(extraFieldView, 8);
5509
- extraFieldData.gid = getUint16(extraFieldView, 10);
5624
+ extraFieldData.uid = getUint16$1(extraFieldView, 8);
5625
+ extraFieldData.gid = getUint16$1(extraFieldView, 10);
5510
5626
  }
5511
5627
  Object.assign(extraField, extraFieldData);
5512
5628
  Object.assign(directory, extraFieldData);
@@ -5526,8 +5642,8 @@ function readExtraFieldUnix(extraField, directory, isInfoZip) {
5526
5642
  gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
5527
5643
  Object.assign(extraField, { version, uid, gid });
5528
5644
  } else if (extraField.data.length >= 4) {
5529
- uid = getUint16(view, 0);
5530
- gid = getUint16(view, 2);
5645
+ uid = getUint16$1(view, 0);
5646
+ gid = getUint16$1(view, 2);
5531
5647
  Object.assign(extraField, { uid, gid });
5532
5648
  }
5533
5649
  if (uid !== UNDEFINED_VALUE) {
@@ -5577,7 +5693,7 @@ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory,
5577
5693
  let offset = 1;
5578
5694
  timeProperties.forEach((propertyName, indexProperty) => {
5579
5695
  if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
5580
- const time = getUint32(extraFieldView, offset);
5696
+ const time = getUint32$1(extraFieldView, offset);
5581
5697
  directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
5582
5698
  const rawPropertyName = timeRawProperties[indexProperty];
5583
5699
  extraFieldExtendedTimestamp[rawPropertyName] = time;
@@ -5611,7 +5727,7 @@ async function detectOverlappingEntry({
5611
5727
  const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
5612
5728
  const dataDescriptorView = getDataView(dataDescriptorArray);
5613
5729
  let signature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
5614
- getUint32(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
5730
+ getUint32$1(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
5615
5731
  if (signature) {
5616
5732
  const signedDataDescriptor = readDataDescriptor(dataDescriptorView, DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, extraFieldZip64);
5617
5733
  const matchCrc32 = (fileEntry.encrypted && !fileEntry.zipCrypto) || signedDataDescriptor.crc32 == crc32;
@@ -5645,15 +5761,15 @@ async function detectOverlappingEntry({
5645
5761
  }
5646
5762
 
5647
5763
  function readDataDescriptor(dataDescriptorView, offset, extraFieldZip64) {
5648
- const crc32 = getUint32(dataDescriptorView, offset);
5764
+ const crc32 = getUint32$1(dataDescriptorView, offset);
5649
5765
  let compressedSize;
5650
5766
  let uncompressedSize;
5651
5767
  if (extraFieldZip64) {
5652
5768
  compressedSize = getBigUint64(dataDescriptorView, offset + 4);
5653
5769
  uncompressedSize = getBigUint64(dataDescriptorView, offset + 12);
5654
5770
  } else {
5655
- compressedSize = getUint32(dataDescriptorView, offset + 4);
5656
- uncompressedSize = getUint32(dataDescriptorView, offset + 8);
5771
+ compressedSize = getUint32$1(dataDescriptorView, offset + 4);
5772
+ uncompressedSize = getUint32$1(dataDescriptorView, offset + 8);
5657
5773
  }
5658
5774
  return { crc32, compressedSize, uncompressedSize };
5659
5775
  }
@@ -5662,10 +5778,28 @@ function getDiskOffset$1(reader, diskNumber) {
5662
5778
  return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
5663
5779
  }
5664
5780
 
5781
+ async function startsWithSplitZipSignature$1(reader) {
5782
+ return await getFirstSignature(reader) == SPLIT_ZIP_FILE_SIGNATURE;
5783
+ }
5784
+
5785
+ async function startsWithSplitZipMarker(reader) {
5786
+ const signature = await getFirstSignature(reader);
5787
+ return signature == SPLIT_ZIP_FILE_SIGNATURE || signature == TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE;
5788
+ }
5789
+
5790
+ async function getFirstSignature(reader) {
5791
+ const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
5792
+ return getUint32$1(getDataView(signatureArray));
5793
+ }
5794
+
5665
5795
  function isStrictnessValue(value) {
5666
5796
  return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
5667
5797
  }
5668
5798
 
5799
+ function getDecodableOutputSize(outputSize, compressedSize, compressed) {
5800
+ return Math.min(outputSize, compressed ? compressedSize * MAX_DEFLATE_EXPANSION_RATIO : compressedSize);
5801
+ }
5802
+
5669
5803
  function getStrictness(options, inheritedOptions) {
5670
5804
  return resolveStrictness(options, resolveStrictness(inheritedOptions, STRICTNESS_BALANCED));
5671
5805
  }
@@ -5728,7 +5862,7 @@ function isUnsafeFilename(filename, filenameValidation) {
5728
5862
 
5729
5863
  function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
5730
5864
  if (maxAppendedDataSize !== UNDEFINED_VALUE) {
5731
- const size = toNumber$1(maxAppendedDataSize);
5865
+ const size = toNumber(maxAppendedDataSize);
5732
5866
  if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
5733
5867
  throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
5734
5868
  }
@@ -5751,7 +5885,7 @@ async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDat
5751
5885
  let plausibleEndOfDirectoryInfo;
5752
5886
  let endOfDirectoryReachingEndCount = 0;
5753
5887
  for await (const [anchoredView, anchoredOffset, anchoredArray, indexByte, offset] of scanEndOfCentralDirectory(reader, anchoredLength)) {
5754
- const commentLength = getUint16(anchoredView, indexByte + 20);
5888
+ const commentLength = getUint16$1(anchoredView, indexByte + 20);
5755
5889
  if (offset + END_OF_CENTRAL_DIR_LENGTH + commentLength == size) {
5756
5890
  const reachability = await getCentralDirectoryReachability(reader, anchoredView, anchoredOffset, indexByte, offset, size, remoteProbeBudget);
5757
5891
  if (reachability == CENTRAL_DIRECTORY_REACHABLE) {
@@ -5802,7 +5936,7 @@ async function* scanEndOfCentralDirectory(reader, scanLength) {
5802
5936
  const scanArray = await readUint8Array(reader, scanOffset, scanLength);
5803
5937
  const scanView = getDataView(scanArray);
5804
5938
  for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
5805
- if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
5939
+ if (getUint32$1(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
5806
5940
  yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
5807
5941
  }
5808
5942
  }
@@ -5813,9 +5947,9 @@ function getEndOfCentralDirectoryInfo(scanArray, indexByte, offset) {
5813
5947
  }
5814
5948
 
5815
5949
  async function getCentralDirectoryReachability(reader, view, anchoredOffset, indexByte, offset, size, remoteProbeBudget) {
5816
- const filesLength = getUint16(view, indexByte + 10);
5817
- const directoryDataLength = getUint32(view, indexByte + 12);
5818
- const directoryDataOffset = getUint32(view, indexByte + 16);
5950
+ const filesLength = getUint16$1(view, indexByte + 10);
5951
+ const directoryDataLength = getUint32$1(view, indexByte + 12);
5952
+ const directoryDataOffset = getUint32$1(view, indexByte + 16);
5819
5953
  if (filesLength == MAX_16_BITS || directoryDataLength == MAX_32_BITS || directoryDataOffset == MAX_32_BITS) {
5820
5954
  const locatorSignature = await readSignature(reader, view, anchoredOffset, offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, size, remoteProbeBudget);
5821
5955
  return locatorSignature == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE ? CENTRAL_DIRECTORY_REACHABLE : CENTRAL_DIRECTORY_UNREACHABLE;
@@ -5823,7 +5957,7 @@ async function getCentralDirectoryReachability(reader, view, anchoredOffset, ind
5823
5957
  if (!filesLength && !directoryDataLength) {
5824
5958
  return CENTRAL_DIRECTORY_PLAUSIBLE;
5825
5959
  }
5826
- const directoryDiskNumber = getUint16(view, indexByte + 6);
5960
+ const directoryDiskNumber = getUint16$1(view, indexByte + 6);
5827
5961
  for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
5828
5962
  if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
5829
5963
  return CENTRAL_DIRECTORY_REACHABLE;
@@ -5837,19 +5971,21 @@ async function readSignature(reader, view, anchoredOffset, signatureOffset, size
5837
5971
  return UNDEFINED_VALUE;
5838
5972
  }
5839
5973
  if (signatureOffset >= anchoredOffset) {
5840
- return getUint32(view, signatureOffset - anchoredOffset);
5974
+ return getUint32$1(view, signatureOffset - anchoredOffset);
5841
5975
  }
5842
5976
  if (remoteProbeBudget.count > 0) {
5843
5977
  remoteProbeBudget.count--;
5844
5978
  const signatureArray = await readUint8Array(reader, signatureOffset, 4);
5845
- return getUint32(getDataView(signatureArray), 0);
5979
+ return getUint32$1(getDataView(signatureArray), 0);
5846
5980
  }
5847
5981
  return UNDEFINED_VALUE;
5848
5982
  }
5849
5983
 
5850
5984
  function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
5851
5985
  const { rawFilename } = zipEntry;
5852
- if (checkLocalFilename &&
5986
+ const maskedLocalDirectory = zipEntry.decryptedDirectory &&
5987
+ (localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
5988
+ if (checkLocalFilename && !maskedLocalDirectory &&
5853
5989
  (rawLocalFilename.length != rawFilename.length ||
5854
5990
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
5855
5991
  throwAmbiguousArchive("mismatched local file header (filename)");
@@ -5860,7 +5996,7 @@ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, chec
5860
5996
  if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
5861
5997
  throwAmbiguousArchive("mismatched local file header (compression method)");
5862
5998
  }
5863
- if (!localDirectory.bitFlag.dataDescriptor &&
5999
+ if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
5864
6000
  (localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
5865
6001
  (localDirectory.crc32 != zipEntry.crc32 ||
5866
6002
  localDirectory.compressedSize != zipEntry.compressedSize ||
@@ -5879,10 +6015,11 @@ function getOptionValue$1(zipReader, options, name) {
5879
6015
  return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
5880
6016
  }
5881
6017
 
5882
- function toNumber$1(value) {
5883
- return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
6018
+ function getFunctionOptionValue$1(zipReader, options, name) {
6019
+ return checkFunctionOption(getOptionValue$1(zipReader, options, name));
5884
6020
  }
5885
6021
 
6022
+
5886
6023
  function getDate(timeRaw) {
5887
6024
  const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
5888
6025
  return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
@@ -5896,11 +6033,11 @@ function getUint8(view, offset) {
5896
6033
  return view.getUint8(offset);
5897
6034
  }
5898
6035
 
5899
- function getUint16(view, offset) {
6036
+ function getUint16$1(view, offset) {
5900
6037
  return view.getUint16(offset, true);
5901
6038
  }
5902
6039
 
5903
- function getUint32(view, offset) {
6040
+ function getUint32$1(view, offset) {
5904
6041
  return view.getUint32(offset, true);
5905
6042
  }
5906
6043
 
@@ -5915,6 +6052,7 @@ var zipReader = /*#__PURE__*/Object.freeze({
5915
6052
  ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
5916
6053
  ERR_ENCRYPTED: ERR_ENCRYPTED,
5917
6054
  ERR_ENCRYPTED_CENTRAL_DIRECTORY: ERR_ENCRYPTED_CENTRAL_DIRECTORY,
6055
+ ERR_ENTRY_DATA_OUT_OF_BOUNDS: ERR_ENTRY_DATA_OUT_OF_BOUNDS,
5918
6056
  ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
5919
6057
  ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
5920
6058
  ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
@@ -5971,12 +6109,16 @@ const ERR_DUPLICATED_NAME = "File already exists";
5971
6109
  const ERR_INVALID_COMMENT = "Zip file comment exceeds 64KB";
5972
6110
  const ERR_INVALID_COMMENT_TYPE = "Invalid zip file comment (must be a Uint8Array)";
5973
6111
  const ERR_INVALID_ENTRY_COMMENT = "File entry comment exceeds 64KB";
6112
+ const ERR_INVALID_ENTRY_COMMENT_TYPE = "Invalid file entry comment (must be a string)";
6113
+ const ERR_INVALID_DATE = "Invalid date (must be a valid Date instance)";
5974
6114
  const ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB";
5975
6115
  const ERR_INVALID_VERSION = "Version exceeds 65535";
5976
6116
  const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
5977
6117
  const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
5978
6118
  const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
5979
- const ERR_INVALID_EXTRAFIELD_TYPE = "Extra field type exceeds 65535";
6119
+ const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
6120
+ const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
6121
+ const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
5980
6122
  const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
5981
6123
  const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
5982
6124
  const MIN_UNIX_TIME = -2147483648;
@@ -5985,6 +6127,7 @@ const MIN_NTFS_TIME = BigInt(0);
5985
6127
  const MAX_NTFS_TIME = BigInt("0x7fffffffffffffff");
5986
6128
  const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
5987
6129
  const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
6130
+ const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
5988
6131
  const ERR_UNDETERMINED_SIZE = "Undetermined size";
5989
6132
  const ERR_UNDEFINED_READER = "Undefined reader";
5990
6133
  const ERR_ZIP_NOT_EMPTY = "Zip file not empty";
@@ -5996,7 +6139,6 @@ const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldTyp
5996
6139
  const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
5997
6140
  const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
5998
6141
  const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
5999
- const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
6000
6142
  const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
6001
6143
 
6002
6144
  const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
@@ -6021,8 +6163,7 @@ class ZipWriter {
6021
6163
  writer,
6022
6164
  addSplitZipSignature,
6023
6165
  options,
6024
- config: getConfiguration(),
6025
- files: new Map(),
6166
+ fileEntries: new Map(),
6026
6167
  filenames: new Set(),
6027
6168
  offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
6028
6169
  initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
@@ -6043,14 +6184,23 @@ class ZipWriter {
6043
6184
  await initStream(reader);
6044
6185
  }
6045
6186
  const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
6046
- const zipReader$1 = new ZipReader(reader.readable);
6187
+ const zipReader$1 = new ZipReader(reader);
6047
6188
  const entries = await zipReader$1.getEntries();
6048
6189
  await zipReader$1.close();
6049
6190
  await initStream(this.writer);
6050
- await reader.readable.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
6051
- this.writer.size = this.offset = reader.size;
6191
+ const { directoryOffset } = zipReader$1;
6192
+ let splitZipSignatureLength = 0;
6193
+ if (this.addSplitZipSignature) {
6194
+ delete this.addSplitZipSignature;
6195
+ if (!await startsWithSplitZipSignature(reader)) {
6196
+ await writeData(this.writer, getSplitZipSignatureArray());
6197
+ splitZipSignatureLength = SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
6198
+ this.offset += splitZipSignatureLength;
6199
+ }
6200
+ }
6201
+ const entryPositions = await copyZipData(this, reader, entries, directoryOffset, splitZipSignatureLength);
6052
6202
  this.filenames = new Set(entries.map(entry => entry.filename));
6053
- this.files = new Map(entries.map(entry => {
6203
+ this.fileEntries = new Map(entries.map(entry => {
6054
6204
  const {
6055
6205
  version,
6056
6206
  rawLastModDate,
@@ -6105,11 +6255,12 @@ class ZipWriter {
6105
6255
  if (crc32 !== UNDEFINED_VALUE) {
6106
6256
  setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
6107
6257
  }
6258
+ const { offset, diskNumberStart } = entryPositions.get(entry);
6108
6259
  Object.assign(entry, {
6109
6260
  zip64UncompressedSize,
6110
6261
  zip64CompressedSize,
6111
- zip64Offset: zip64 && entry.offset >= MAX_32_BITS,
6112
- diskNumberStart: 0,
6262
+ offset,
6263
+ diskNumberStart,
6113
6264
  zip64DiskNumberStart: false,
6114
6265
  rawExtraFieldZip64,
6115
6266
  rawExtraFieldAES,
@@ -6129,11 +6280,8 @@ class ZipWriter {
6129
6280
  async add(name = "", reader, options = {}) {
6130
6281
  const zipWriter = this;
6131
6282
  options = Object.assign({}, options);
6132
- const {
6133
- pendingAddFileCalls,
6134
- config
6135
- } = zipWriter;
6136
- if (workers < config.maxWorkers) {
6283
+ const { pendingAddFileCalls } = zipWriter;
6284
+ if (workers < getConfiguration().maxWorkers) {
6137
6285
  workers++;
6138
6286
  } else {
6139
6287
  await new Promise(resolve => pendingEntries.push(resolve));
@@ -6170,16 +6318,16 @@ class ZipWriter {
6170
6318
  }
6171
6319
 
6172
6320
  remove(entry) {
6173
- const { filenames, files } = this;
6321
+ const { filenames, fileEntries } = this;
6174
6322
  // deno-lint-ignore valid-typeof
6175
6323
  if (typeof entry == STRING_TYPE) {
6176
- entry = files.get(entry);
6324
+ entry = fileEntries.get(entry);
6177
6325
  }
6178
6326
  if (entry && entry.filename !== UNDEFINED_VALUE) {
6179
6327
  const { filename } = entry;
6180
- if (filenames.has(filename) && files.has(filename)) {
6328
+ if (filenames.has(filename) && fileEntries.has(filename)) {
6181
6329
  filenames.delete(filename);
6182
- files.delete(filename);
6330
+ fileEntries.delete(filename);
6183
6331
  return true;
6184
6332
  }
6185
6333
  }
@@ -6276,12 +6424,12 @@ async function addFile(zipWriter, name, reader, options) {
6276
6424
  const metadataInfo = resolveMetadata(zipWriter, name, options);
6277
6425
  const { comment } = metadataInfo;
6278
6426
  const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
6279
- zipWriter.files.set(name, UNDEFINED_VALUE);
6427
+ zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
6280
6428
  let fileEntry;
6281
6429
  try {
6282
6430
  const { resolvedOptions } = metadataInfo;
6283
6431
  if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
6284
- !resolvedOptions.passThrough && !(await supportsDeflate(zipWriter.config))) {
6432
+ !resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
6285
6433
  resolvedOptions.level = 0;
6286
6434
  }
6287
6435
  const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
@@ -6299,7 +6447,7 @@ async function addFile(zipWriter, name, reader, options) {
6299
6447
  const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
6300
6448
  fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
6301
6449
  } catch (error) {
6302
- zipWriter.files.delete(name);
6450
+ zipWriter.fileEntries.delete(name);
6303
6451
  throw error;
6304
6452
  }
6305
6453
  Object.assign(fileEntry, {
@@ -6343,9 +6491,9 @@ function resolveAttributes(zipWriter, name, options) {
6343
6491
  if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
6344
6492
  unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE$1;
6345
6493
  }
6346
- let msdosAttributesRaw = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
6494
+ let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
6347
6495
  let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
6348
- const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
6496
+ const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType || executable;
6349
6497
  const hasMsDosProvided = msdosAttributesRaw !== UNDEFINED_VALUE || msdosAttributes !== UNDEFINED_VALUE;
6350
6498
  if (hasUnixMetadata) {
6351
6499
  msDosCompatible = false;
@@ -6354,10 +6502,10 @@ function resolveAttributes(zipWriter, name, options) {
6354
6502
  msDosCompatible = true;
6355
6503
  versionMadeBy = (versionMadeBy & MAX_8_BITS);
6356
6504
  }
6357
- if (msdosAttributesRaw !== UNDEFINED_VALUE && (msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
6505
+ if (msdosAttributesRaw !== UNDEFINED_VALUE && (!Number.isInteger(msdosAttributesRaw) || msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
6358
6506
  throw new Error(ERR_INVALID_MSDOS_ATTRIBUTES);
6359
6507
  }
6360
- if (msdosAttributes && typeof msdosAttributes !== OBJECT_TYPE) {
6508
+ if (msdosAttributes && (typeof msdosAttributes !== OBJECT_TYPE || Array.isArray(msdosAttributes))) {
6361
6509
  throw new Error(ERR_INVALID_MSDOS_DATA);
6362
6510
  }
6363
6511
  if (versionMadeBy > MAX_16_BITS) {
@@ -6445,7 +6593,7 @@ function resolveAttributes(zipWriter, name, options) {
6445
6593
  }
6446
6594
 
6447
6595
  function resolveMetadata(zipWriter, name, options) {
6448
- const encode = getOptionValue(zipWriter, options, OPTION_ENCODE_TEXT, encodeText);
6596
+ const encode = getFunctionOptionValue(zipWriter, options, OPTION_ENCODE_TEXT) || encodeText;
6449
6597
  let rawFilename = encode(name, TEXT_TYPE_FILENAME);
6450
6598
  if (rawFilename === UNDEFINED_VALUE) {
6451
6599
  rawFilename = encodeText(name);
@@ -6454,6 +6602,10 @@ function resolveMetadata(zipWriter, name, options) {
6454
6602
  throw new Error(ERR_INVALID_ENTRY_NAME);
6455
6603
  }
6456
6604
  const comment = options[PROPERTY_NAME_COMMENT] || "";
6605
+ // deno-lint-ignore valid-typeof
6606
+ if (typeof comment != STRING_TYPE) {
6607
+ throw new Error(ERR_INVALID_ENTRY_COMMENT_TYPE);
6608
+ }
6457
6609
  let rawComment = encode(comment, TEXT_TYPE_COMMENT);
6458
6610
  if (rawComment === UNDEFINED_VALUE) {
6459
6611
  rawComment = encodeText(comment);
@@ -6465,16 +6617,14 @@ function resolveMetadata(zipWriter, name, options) {
6465
6617
  if (version > MAX_16_BITS) {
6466
6618
  throw new Error(ERR_INVALID_VERSION);
6467
6619
  }
6468
- const lastModDate = getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE, new Date());
6469
- const lastAccessDate = getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
6470
- const creationDate = getOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
6620
+ const lastModDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE, new Date());
6621
+ const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
6622
+ const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
6471
6623
  const internalFileAttributes = getAliasedOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, PROPERTY_NAME_DEPRECATED_INTERNAL_FILE_ATTRIBUTES, 0);
6472
6624
  const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
6473
6625
  const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
6474
6626
  const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
6475
- if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
6476
- throw new Error(ERR_INVALID_PASSWORD_TYPE);
6477
- }
6627
+ checkPasswordOption(password, rawPassword);
6478
6628
  const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
6479
6629
  const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
6480
6630
  const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
@@ -6483,9 +6633,9 @@ function resolveMetadata(zipWriter, name, options) {
6483
6633
  const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
6484
6634
  const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
6485
6635
  const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
6486
- const createTempStream = getOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
6636
+ const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
6487
6637
  const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
6488
- const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
6638
+ const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
6489
6639
  const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
6490
6640
  const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
6491
6641
  const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
@@ -6505,6 +6655,9 @@ function resolveMetadata(zipWriter, name, options) {
6505
6655
  level = 0;
6506
6656
  }
6507
6657
  }
6658
+ if (passThrough) {
6659
+ level = UNDEFINED_VALUE;
6660
+ }
6508
6661
  let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
6509
6662
  let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
6510
6663
  if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
@@ -6565,18 +6718,26 @@ function serializeExtraField(extraField) {
6565
6718
  if (!extraField) {
6566
6719
  return EMPTY_UINT8_ARRAY;
6567
6720
  }
6721
+ if (!(extraField instanceof Map)) {
6722
+ throw new Error(ERR_INVALID_EXTRAFIELD);
6723
+ }
6568
6724
  let extraFieldSize = 0;
6569
6725
  let offset = 0;
6570
- extraField.forEach(data => extraFieldSize += 4 + getLength(data));
6571
- const rawExtraField = new Uint8Array(extraFieldSize);
6572
- const rawExtraFieldView = getDataView(rawExtraField);
6573
6726
  extraField.forEach((data, type) => {
6574
- if (type > MAX_16_BITS) {
6727
+ if (!Number.isInteger(type) || type < 0 || type > MAX_16_BITS) {
6575
6728
  throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
6576
6729
  }
6730
+ if (!(data instanceof Uint8Array)) {
6731
+ throw new Error(ERR_INVALID_EXTRAFIELD_DATA_TYPE);
6732
+ }
6577
6733
  if (getLength(data) > MAX_16_BITS) {
6578
6734
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
6579
6735
  }
6736
+ extraFieldSize += 4 + getLength(data);
6737
+ });
6738
+ const rawExtraField = new Uint8Array(extraFieldSize);
6739
+ const rawExtraFieldView = getDataView(rawExtraField);
6740
+ extraField.forEach((data, type) => {
6580
6741
  setUint16(rawExtraFieldView, offset, type);
6581
6742
  setUint16(rawExtraFieldView, offset + 2, getLength(data));
6582
6743
  arraySet(rawExtraField, data, offset + 4);
@@ -6608,6 +6769,9 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
6608
6769
  if (uncompressedSize === UNDEFINED_VALUE) {
6609
6770
  throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
6610
6771
  }
6772
+ if (compressionMethod === UNDEFINED_VALUE) {
6773
+ throw new Error(ERR_UNDEFINED_COMPRESSION_METHOD);
6774
+ }
6611
6775
  }
6612
6776
  const zip64Enabled = zip64 === true;
6613
6777
  const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
@@ -6663,8 +6827,8 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
6663
6827
  }
6664
6828
 
6665
6829
  async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comment) {
6666
- const zipWriter = { options: writerOptions, config: getConfiguration() };
6667
- if (writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY]) {
6830
+ const zipWriter = { options: writerOptions };
6831
+ if (checkFunctionOption(writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY])) {
6668
6832
  throw new Error(ERR_UNDETERMINED_SIZE);
6669
6833
  }
6670
6834
  if (comment !== UNDEFINED_VALUE && !(comment instanceof Uint8Array)) {
@@ -6690,7 +6854,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
6690
6854
  ({ name } = attributesInfo);
6691
6855
  const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
6692
6856
  if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
6693
- !metadata.passThrough && !(await supportsDeflate(zipWriter.config))) {
6857
+ !metadata.passThrough && !(await supportsDeflate(getConfiguration()))) {
6694
6858
  metadata.level = 0;
6695
6859
  }
6696
6860
  const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
@@ -6739,7 +6903,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
6739
6903
 
6740
6904
  async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
6741
6905
  const {
6742
- files,
6906
+ fileEntries,
6743
6907
  writer
6744
6908
  } = zipWriter;
6745
6909
  const {
@@ -6761,12 +6925,12 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
6761
6925
  let writerSizeBeforeEntry;
6762
6926
  let flushedBufferedSize = 0;
6763
6927
  let fileWriter;
6764
- files.set(name, fileEntry);
6928
+ fileEntries.set(name, fileEntry);
6765
6929
  zipWriter.lastFileEntry = fileEntry;
6766
6930
  try {
6767
6931
  let lockPreviousFileEntry;
6768
6932
  if (keepOrder) {
6769
- lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
6933
+ lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
6770
6934
  requestLockCurrentFileEntry();
6771
6935
  }
6772
6936
  if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
@@ -6787,11 +6951,8 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
6787
6951
  const diskOffset = getDiskOffset(writer);
6788
6952
  if (zipWriter.addSplitZipSignature) {
6789
6953
  delete zipWriter.addSplitZipSignature;
6790
- const signatureArray = new Uint8Array(4);
6791
- const signatureArrayView = getDataView(signatureArray);
6792
- setUint32(signatureArrayView, 0, SPLIT_ZIP_FILE_SIGNATURE);
6793
- await writeData(writer, signatureArray);
6794
- zipWriter.offset += 4;
6954
+ await writeData(writer, getSplitZipSignatureArray());
6955
+ zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
6795
6956
  }
6796
6957
  if (usdz && !bufferedWrite) {
6797
6958
  appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
@@ -6809,11 +6970,11 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
6809
6970
  writerSizeBeforeEntry = writer.size;
6810
6971
  await writeData(fileWriter, localHeaderArray);
6811
6972
  }
6812
- fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, zipWriter.config, options);
6973
+ fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, getConfiguration(), options);
6813
6974
  if (!bufferedWrite) {
6814
6975
  writingEntryData = false;
6815
6976
  }
6816
- files.set(name, fileEntry);
6977
+ fileEntries.set(name, fileEntry);
6817
6978
  fileEntry.filename = name;
6818
6979
  if (bufferedWrite) {
6819
6980
  await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
@@ -6854,7 +7015,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
6854
7015
  zipWriter.offset += flushedBufferedSize;
6855
7016
  }
6856
7017
  }
6857
- files.delete(name);
7018
+ fileEntries.delete(name);
6858
7019
  throw error;
6859
7020
  } finally {
6860
7021
  if (bufferedWrite) {
@@ -6876,7 +7037,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
6876
7037
  }
6877
7038
 
6878
7039
  function requestLockCurrentFileEntry() {
6879
- fileEntry.lock = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
7040
+ fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
6880
7041
  }
6881
7042
 
6882
7043
  async function requestLockWriter() {
@@ -6896,7 +7057,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
6896
7057
  }
6897
7058
  }
6898
7059
 
6899
- async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryInfo, config, options) {
7060
+ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry }, entryInfo, config, options) {
6900
7061
  const {
6901
7062
  headerInfo,
6902
7063
  dataDescriptorInfo,
@@ -6964,7 +7125,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
6964
7125
  codecURI
6965
7126
  } = options;
6966
7127
  const fileEntry = {
6967
- lock,
7128
+ lockFileEntry,
6968
7129
  versionMadeBy,
6969
7130
  zip64,
6970
7131
  directory: Boolean(directory),
@@ -7006,7 +7167,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
7006
7167
  }
7007
7168
  const { writable } = writer;
7008
7169
  if (reader) {
7009
- const readable = toCompatibleReadable(reader.createReadable ? reader.createReadable() : reader.readable);
7170
+ const readable = toCompatibleReadable(createReadable(reader));
7010
7171
  const size = reader.size;
7011
7172
  const workerOptions = {
7012
7173
  options: {
@@ -7118,14 +7279,14 @@ function getHeaderInfo(options) {
7118
7279
  if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
7119
7280
  const length = 4 + 16;
7120
7281
  const extraFieldZip64 = createRecordWriter(length);
7121
- extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
7122
- extraFieldZip64.uint16(length - 4);
7282
+ extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
7283
+ extraFieldZip64.writeUint16(length - 4);
7123
7284
  rawLocalExtraFieldZip64 = extraFieldZip64.array;
7124
7285
  if (zip64ExtraFieldComplete) {
7125
- extraFieldZip64.uint64(uncompressedSize);
7286
+ extraFieldZip64.writeUint64(uncompressedSize);
7126
7287
  if (uncompressedFile) {
7127
7288
  const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
7128
- extraFieldZip64.uint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
7289
+ extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
7129
7290
  }
7130
7291
  }
7131
7292
  } else {
@@ -7134,8 +7295,8 @@ function getHeaderInfo(options) {
7134
7295
  let rawExtraFieldAES;
7135
7296
  if (encrypted && !zipCrypto) {
7136
7297
  const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
7137
- extraFieldAES.uint16(EXTRAFIELD_TYPE_AES);
7138
- extraFieldAES.bytes(EXTRAFIELD_DATA_AES);
7298
+ extraFieldAES.writeUint16(EXTRAFIELD_TYPE_AES);
7299
+ extraFieldAES.writeBytes(EXTRAFIELD_DATA_AES);
7139
7300
  rawExtraFieldAES = extraFieldAES.array;
7140
7301
  rawExtraFieldAES[8] = encryptionStrength;
7141
7302
  } else {
@@ -7151,15 +7312,15 @@ function getHeaderInfo(options) {
7151
7312
  const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
7152
7313
  const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
7153
7314
  extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
7154
- extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7155
- extraFieldTimestamp.uint16(extraFieldTimestampLength - 4);
7156
- extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
7157
- extraFieldTimestamp.uint32(lastModTimeUnix);
7315
+ extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7316
+ extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
7317
+ extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
7318
+ extraFieldTimestamp.writeUint32(lastModTimeUnix);
7158
7319
  if (lastAccessDate) {
7159
- extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(lastAccessDate)));
7320
+ extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(lastAccessDate)));
7160
7321
  }
7161
7322
  if (creationDate) {
7162
- extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(creationDate)));
7323
+ extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(creationDate)));
7163
7324
  }
7164
7325
  rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
7165
7326
  } else {
@@ -7172,14 +7333,14 @@ function getHeaderInfo(options) {
7172
7333
  try {
7173
7334
  const lastModTimeNTFS = getTimeNTFS(lastModDate);
7174
7335
  const extraFieldNTFS = createRecordWriter(36);
7175
- extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS);
7176
- extraFieldNTFS.uint16(32);
7336
+ extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS);
7337
+ extraFieldNTFS.writeUint16(32);
7177
7338
  extraFieldNTFS.skip(4);
7178
- extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS_TAG1);
7179
- extraFieldNTFS.uint16(24);
7180
- extraFieldNTFS.uint64(lastModTimeNTFS);
7181
- extraFieldNTFS.uint64(lastAccessDate ? getTimeNTFS(lastAccessDate) : lastModTimeNTFS);
7182
- extraFieldNTFS.uint64(creationDate ? getTimeNTFS(creationDate) : lastModTimeNTFS);
7339
+ extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS_TAG1);
7340
+ extraFieldNTFS.writeUint16(24);
7341
+ extraFieldNTFS.writeUint64(lastModTimeNTFS);
7342
+ extraFieldNTFS.writeUint64(lastAccessDate ? getTimeNTFS(lastAccessDate) : lastModTimeNTFS);
7343
+ extraFieldNTFS.writeUint64(creationDate ? getTimeNTFS(creationDate) : lastModTimeNTFS);
7183
7344
  rawExtraFieldNTFS = extraFieldNTFS.array;
7184
7345
  } catch {
7185
7346
  rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
@@ -7198,20 +7359,20 @@ function getHeaderInfo(options) {
7198
7359
  const gidBytes = packUnixId(gid);
7199
7360
  const payloadLength = 3 + uidBytes.length + gidBytes.length;
7200
7361
  const extraFieldUnix = createRecordWriter(4 + payloadLength);
7201
- extraFieldUnix.uint16(EXTRAFIELD_TYPE_INFOZIP);
7202
- extraFieldUnix.uint16(payloadLength);
7203
- extraFieldUnix.uint8(1);
7204
- extraFieldUnix.uint8(uidBytes.length);
7205
- extraFieldUnix.bytes(uidBytes);
7206
- extraFieldUnix.uint8(gidBytes.length);
7207
- extraFieldUnix.bytes(gidBytes);
7362
+ extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_INFOZIP);
7363
+ extraFieldUnix.writeUint16(payloadLength);
7364
+ extraFieldUnix.writeUint8(1);
7365
+ extraFieldUnix.writeUint8(uidBytes.length);
7366
+ extraFieldUnix.writeBytes(uidBytes);
7367
+ extraFieldUnix.writeUint8(gidBytes.length);
7368
+ extraFieldUnix.writeBytes(gidBytes);
7208
7369
  rawExtraFieldUnix = extraFieldUnix.array;
7209
7370
  } else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
7210
7371
  const extraFieldUnix = createRecordWriter(8);
7211
- extraFieldUnix.uint16(EXTRAFIELD_TYPE_UNIX);
7212
- extraFieldUnix.uint16(4);
7213
- extraFieldUnix.uint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
7214
- extraFieldUnix.uint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
7372
+ extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
7373
+ extraFieldUnix.writeUint16(4);
7374
+ extraFieldUnix.writeUint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
7375
+ extraFieldUnix.writeUint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
7215
7376
  rawExtraFieldUnix = extraFieldUnix.array;
7216
7377
  } else {
7217
7378
  rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
@@ -7261,18 +7422,18 @@ function getHeaderInfo(options) {
7261
7422
  const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
7262
7423
  const localHeaderArray = localHeader.array;
7263
7424
  const localHeaderView = getDataView(localHeaderArray);
7264
- localHeader.uint32(LOCAL_FILE_HEADER_SIGNATURE);
7265
- localHeader.bytes(headerArray);
7266
- localHeader.bytes(rawFilename);
7425
+ localHeader.writeUint32(LOCAL_FILE_HEADER_SIGNATURE);
7426
+ localHeader.writeBytes(headerArray);
7427
+ localHeader.writeBytes(rawFilename);
7267
7428
  if (writeLocalExtraFieldZip64) {
7268
- localHeader.bytes(rawLocalExtraFieldZip64);
7269
- }
7270
- localHeader.bytes(rawExtraFieldAES);
7271
- localHeader.bytes(rawExtraFieldExtendedTimestamp);
7272
- localHeader.bytes(rawExtraFieldNTFS);
7273
- localHeader.bytes(rawExtraFieldUnix);
7274
- localHeader.bytes(rawExtraField);
7275
- localHeader.bytes(rawLocalExtraField);
7429
+ localHeader.writeBytes(rawLocalExtraFieldZip64);
7430
+ }
7431
+ localHeader.writeBytes(rawExtraFieldAES);
7432
+ localHeader.writeBytes(rawExtraFieldExtendedTimestamp);
7433
+ localHeader.writeBytes(rawExtraFieldNTFS);
7434
+ localHeader.writeBytes(rawExtraFieldUnix);
7435
+ localHeader.writeBytes(rawExtraField);
7436
+ localHeader.writeBytes(rawLocalExtraField);
7276
7437
  if (dataDescriptor) {
7277
7438
  if (!zip64CompressedSize) {
7278
7439
  setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
@@ -7462,7 +7623,7 @@ function updateLocalHeader({
7462
7623
 
7463
7624
 
7464
7625
  async function closeFile(zipWriter, comment, options) {
7465
- const directoryDataLength = createDirectoryRecords(zipWriter.files);
7626
+ const directoryDataLength = createDirectoryRecords(zipWriter.fileEntries);
7466
7627
  const { directoryStart, directoryArray } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
7467
7628
  const signatureLength = await writeDigitalSignatureRecord(zipWriter, directoryArray, options);
7468
7629
  await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength, signatureLength });
@@ -7492,19 +7653,19 @@ function createDirectoryRecords(files) {
7492
7653
  if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
7493
7654
  const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
7494
7655
  const extraFieldZip64 = createRecordWriter(length);
7495
- extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
7496
- extraFieldZip64.uint16(length - 4);
7656
+ extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
7657
+ extraFieldZip64.writeUint16(length - 4);
7497
7658
  if (zip64UncompressedSize) {
7498
- extraFieldZip64.uint64(uncompressedSize);
7659
+ extraFieldZip64.writeUint64(uncompressedSize);
7499
7660
  }
7500
7661
  if (zip64CompressedSize) {
7501
- extraFieldZip64.uint64(compressedSize);
7662
+ extraFieldZip64.writeUint64(compressedSize);
7502
7663
  }
7503
7664
  if (zip64Offset) {
7504
- extraFieldZip64.uint64(fileEntry.offset);
7665
+ extraFieldZip64.writeUint64(fileEntry.offset);
7505
7666
  }
7506
7667
  if (zip64DiskNumberStart) {
7507
- extraFieldZip64.uint32(fileEntry.diskNumberStart);
7668
+ extraFieldZip64.writeUint32(fileEntry.diskNumberStart);
7508
7669
  }
7509
7670
  rawExtraFieldZip64 = extraFieldZip64.array;
7510
7671
  } else {
@@ -7517,10 +7678,10 @@ function createDirectoryRecords(files) {
7517
7678
  const lastModTimeUnix = getTimeUnix(lastModDate);
7518
7679
  if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
7519
7680
  const extraFieldTimestamp = createRecordWriter(9);
7520
- extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7521
- extraFieldTimestamp.uint16(5);
7522
- extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
7523
- extraFieldTimestamp.uint32(lastModTimeUnix);
7681
+ extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7682
+ extraFieldTimestamp.writeUint16(5);
7683
+ extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
7684
+ extraFieldTimestamp.writeUint32(lastModTimeUnix);
7524
7685
  rawExtraFieldTimestamp = extraFieldTimestamp.array;
7525
7686
  } else {
7526
7687
  rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
@@ -7542,14 +7703,14 @@ function createDirectoryRecords(files) {
7542
7703
  }
7543
7704
 
7544
7705
  async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7545
- const { files, writer } = zipWriter;
7706
+ const { fileEntries, writer } = zipWriter;
7546
7707
  const directoryArray = new Uint8Array(directoryDataLength);
7547
7708
  await initStream(writer);
7548
7709
  let offset = 0;
7549
7710
  let directoryDiskOffset = 0;
7550
7711
  let directoryStartDiskNumber = getDiskNumber(writer);
7551
7712
  let directoryStartDiskOffset = getDiskOffset(writer);
7552
- for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
7713
+ for (const [indexFileEntry, fileEntry] of Array.from(fileEntries.values()).entries()) {
7553
7714
  const {
7554
7715
  offset: fileEntryOffset,
7555
7716
  rawFilename,
@@ -7594,28 +7755,28 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7594
7755
  setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
7595
7756
  }
7596
7757
  const directoryRecord = createRecordWriter(directoryRecordLength);
7597
- directoryRecord.uint32(CENTRAL_FILE_HEADER_SIGNATURE);
7598
- directoryRecord.uint16(versionMadeBy);
7599
- directoryRecord.bytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
7600
- directoryRecord.uint16(extraFieldLength);
7601
- directoryRecord.uint16(getLength(rawComment));
7602
- directoryRecord.uint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
7603
- directoryRecord.uint16(internalFileAttributes);
7604
- directoryRecord.uint32(externalFileAttributes);
7605
- directoryRecord.uint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
7606
- directoryRecord.bytes(rawFilename);
7607
- directoryRecord.bytes(rawExtraFieldZip64);
7608
- directoryRecord.bytes(rawExtraFieldAES);
7609
- directoryRecord.bytes(rawExtraFieldExtendedTimestamp);
7610
- directoryRecord.bytes(rawExtraFieldNTFS);
7611
- directoryRecord.bytes(rawExtraFieldUnix);
7612
- directoryRecord.bytes(rawExtraField);
7613
- directoryRecord.bytes(rawComment);
7758
+ directoryRecord.writeUint32(CENTRAL_FILE_HEADER_SIGNATURE);
7759
+ directoryRecord.writeUint16(versionMadeBy);
7760
+ directoryRecord.writeBytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
7761
+ directoryRecord.writeUint16(extraFieldLength);
7762
+ directoryRecord.writeUint16(getLength(rawComment));
7763
+ directoryRecord.writeUint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
7764
+ directoryRecord.writeUint16(internalFileAttributes);
7765
+ directoryRecord.writeUint32(externalFileAttributes);
7766
+ directoryRecord.writeUint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
7767
+ directoryRecord.writeBytes(rawFilename);
7768
+ directoryRecord.writeBytes(rawExtraFieldZip64);
7769
+ directoryRecord.writeBytes(rawExtraFieldAES);
7770
+ directoryRecord.writeBytes(rawExtraFieldExtendedTimestamp);
7771
+ directoryRecord.writeBytes(rawExtraFieldNTFS);
7772
+ directoryRecord.writeBytes(rawExtraFieldUnix);
7773
+ directoryRecord.writeBytes(rawExtraField);
7774
+ directoryRecord.writeBytes(rawComment);
7614
7775
  arraySet(directoryArray, directoryRecord.array, offset);
7615
7776
  offset += directoryRecordLength;
7616
7777
  if (options.onprogress) {
7617
7778
  try {
7618
- await options.onprogress(indexFileEntry + 1, files.size, new Entry(fileEntry));
7779
+ await options.onprogress(indexFileEntry + 1, fileEntries.size, new Entry(fileEntry));
7619
7780
  } catch {
7620
7781
  // ignored
7621
7782
  }
@@ -7629,7 +7790,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7629
7790
  }
7630
7791
 
7631
7792
  async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
7632
- const signCentralDirectory = getOptionValue(zipWriter, options, OPTION_SIGN_CENTRAL_DIRECTORY);
7793
+ const signCentralDirectory = getFunctionOptionValue(zipWriter, options, OPTION_SIGN_CENTRAL_DIRECTORY);
7633
7794
  if (signCentralDirectory) {
7634
7795
  const signatureData = await signCentralDirectory(directoryArray);
7635
7796
  const signatureDataLength = getLength(signatureData);
@@ -7637,9 +7798,9 @@ async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
7637
7798
  throw new Error(ERR_INVALID_SIGNATURE_DATA);
7638
7799
  }
7639
7800
  const signatureRecord = createRecordWriter(6 + signatureDataLength);
7640
- signatureRecord.uint32(DIGITAL_SIGNATURE_RECORD_SIGNATURE);
7641
- signatureRecord.uint16(signatureDataLength);
7642
- signatureRecord.bytes(signatureData);
7801
+ signatureRecord.writeUint32(DIGITAL_SIGNATURE_RECORD_SIGNATURE);
7802
+ signatureRecord.writeUint16(signatureDataLength);
7803
+ signatureRecord.writeBytes(signatureData);
7643
7804
  await writeData(zipWriter.writer, signatureRecord.array);
7644
7805
  return 6 + signatureDataLength;
7645
7806
  }
@@ -7650,7 +7811,7 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
7650
7811
  const { writer } = zipWriter;
7651
7812
  const { directoryStart, signatureLength } = cdInfo;
7652
7813
  let { directoryDataLength } = cdInfo;
7653
- let filesLength = zipWriter.files.size;
7814
+ let fileEntriesLength = zipWriter.fileEntries.size;
7654
7815
  let diskNumber = directoryStart.diskNumber;
7655
7816
  let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
7656
7817
  let lastDiskNumber = getDiskNumber(writer);
@@ -7658,7 +7819,7 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
7658
7819
  lastDiskNumber++;
7659
7820
  }
7660
7821
  let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
7661
- if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || filesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
7822
+ if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || fileEntriesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
7662
7823
  if (zip64 === false) {
7663
7824
  throw new Error(ERR_UNSUPPORTED_FORMAT);
7664
7825
  } else {
@@ -7675,37 +7836,37 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
7675
7836
  }
7676
7837
  lastDiskNumber = getDiskNumber(writer);
7677
7838
  if (zip64) {
7678
- endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
7679
- endOfdirectoryRecord.uint64(44);
7680
- endOfdirectoryRecord.uint16(45);
7681
- endOfdirectoryRecord.uint16(45);
7682
- endOfdirectoryRecord.uint32(lastDiskNumber);
7683
- endOfdirectoryRecord.uint32(diskNumber);
7684
- endOfdirectoryRecord.uint64(filesLength);
7685
- endOfdirectoryRecord.uint64(filesLength);
7686
- endOfdirectoryRecord.uint64(directoryDataLength);
7687
- endOfdirectoryRecord.uint64(directoryOffset);
7688
- endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
7689
- endOfdirectoryRecord.uint32(lastDiskNumber);
7690
- endOfdirectoryRecord.uint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength) + BigInt(signatureLength));
7691
- endOfdirectoryRecord.uint32(lastDiskNumber + 1);
7839
+ endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
7840
+ endOfdirectoryRecord.writeUint64(44);
7841
+ endOfdirectoryRecord.writeUint16(45);
7842
+ endOfdirectoryRecord.writeUint16(45);
7843
+ endOfdirectoryRecord.writeUint32(lastDiskNumber);
7844
+ endOfdirectoryRecord.writeUint32(diskNumber);
7845
+ endOfdirectoryRecord.writeUint64(fileEntriesLength);
7846
+ endOfdirectoryRecord.writeUint64(fileEntriesLength);
7847
+ endOfdirectoryRecord.writeUint64(directoryDataLength);
7848
+ endOfdirectoryRecord.writeUint64(directoryOffset);
7849
+ endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
7850
+ endOfdirectoryRecord.writeUint32(lastDiskNumber);
7851
+ endOfdirectoryRecord.writeUint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength) + BigInt(signatureLength));
7852
+ endOfdirectoryRecord.writeUint32(lastDiskNumber + 1);
7692
7853
  const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
7693
7854
  if (supportZip64SplitFile) {
7694
7855
  lastDiskNumber = MAX_16_BITS;
7695
7856
  diskNumber = MAX_16_BITS;
7696
7857
  }
7697
- filesLength = MAX_16_BITS;
7858
+ fileEntriesLength = MAX_16_BITS;
7698
7859
  directoryOffset = MAX_32_BITS;
7699
7860
  directoryDataLength = MAX_32_BITS;
7700
7861
  }
7701
- endOfdirectoryRecord.uint32(END_OF_CENTRAL_DIR_SIGNATURE);
7702
- endOfdirectoryRecord.uint16(lastDiskNumber);
7703
- endOfdirectoryRecord.uint16(diskNumber);
7704
- endOfdirectoryRecord.uint16(filesLength);
7705
- endOfdirectoryRecord.uint16(filesLength);
7706
- endOfdirectoryRecord.uint32(directoryDataLength);
7707
- endOfdirectoryRecord.uint32(directoryOffset);
7708
- endOfdirectoryRecord.uint16(commentLength);
7862
+ endOfdirectoryRecord.writeUint32(END_OF_CENTRAL_DIR_SIGNATURE);
7863
+ endOfdirectoryRecord.writeUint16(lastDiskNumber);
7864
+ endOfdirectoryRecord.writeUint16(diskNumber);
7865
+ endOfdirectoryRecord.writeUint16(fileEntriesLength);
7866
+ endOfdirectoryRecord.writeUint16(fileEntriesLength);
7867
+ endOfdirectoryRecord.writeUint32(directoryDataLength);
7868
+ endOfdirectoryRecord.writeUint32(directoryOffset);
7869
+ endOfdirectoryRecord.writeUint16(commentLength);
7709
7870
  await writeData(writer, endOfdirectoryRecord.array);
7710
7871
  if (commentLength) {
7711
7872
  await writeData(writer, comment);
@@ -7718,11 +7879,11 @@ function createRecordWriter(length) {
7718
7879
  let offset = 0;
7719
7880
  return {
7720
7881
  array,
7721
- uint8: value => { setUint8(view, offset, value); offset += 1; },
7722
- uint16: value => { setUint16(view, offset, value); offset += 2; },
7723
- uint32: value => { setUint32(view, offset, value); offset += 4; },
7724
- uint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
7725
- bytes: value => { arraySet(array, value, offset); offset += getLength(value); },
7882
+ writeUint8: value => { setUint8(view, offset, value); offset += 1; },
7883
+ writeUint16: value => { setUint16(view, offset, value); offset += 2; },
7884
+ writeUint32: value => { setUint32(view, offset, value); offset += 4; },
7885
+ writeUint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
7886
+ writeBytes: value => { arraySet(array, value, offset); offset += getLength(value); },
7726
7887
  skip: count => offset += count
7727
7888
  };
7728
7889
  }
@@ -7746,6 +7907,71 @@ function getSegmentOffset(zipWriter, { diskNumber = 0, diskOffset = 0 }) {
7746
7907
  return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
7747
7908
  }
7748
7909
 
7910
+ async function startsWithSplitZipSignature(reader) {
7911
+ const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
7912
+ return getUint32(getDataView(signatureArray), 0) == SPLIT_ZIP_FILE_SIGNATURE;
7913
+ }
7914
+
7915
+ async function copyZipData(zipWriter, reader, entries, directoryOffset, splitZipSignatureLength) {
7916
+ const { writer } = zipWriter;
7917
+ const entryPositions = new Map();
7918
+ if (writer.closeDisk) {
7919
+ const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
7920
+ getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
7921
+ let copiedLength = 0;
7922
+ for (const entry of sortedEntries) {
7923
+ const sourceOffset = getSourceOffset(reader, entry);
7924
+ await copyData(zipWriter, reader, copiedLength, sourceOffset - copiedLength);
7925
+ if (exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
7926
+ await writer.closeDisk();
7927
+ }
7928
+ entryPositions.set(entry, {
7929
+ offset: getSegmentOffset(zipWriter, writer),
7930
+ diskNumberStart: getDiskNumber(writer)
7931
+ });
7932
+ copiedLength = sourceOffset;
7933
+ }
7934
+ await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
7935
+ } else {
7936
+ await copyData(zipWriter, reader, 0, directoryOffset);
7937
+ entries.forEach(entry => entryPositions.set(entry, {
7938
+ offset: splitZipSignatureLength + getSourceOffset(reader, entry),
7939
+ diskNumberStart: 0
7940
+ }));
7941
+ }
7942
+ return entryPositions;
7943
+ }
7944
+
7945
+ async function copyData(zipWriter, reader, offset, size) {
7946
+ if (size > 0) {
7947
+ const { writer } = zipWriter;
7948
+ await createReadable(reader, { offset, size }).pipeTo(writer.writable, { preventClose: true, preventAbort: true });
7949
+ writer.size += size;
7950
+ zipWriter.offset += size;
7951
+ }
7952
+ }
7953
+
7954
+ async function getLocalHeaderLength(reader, offset) {
7955
+ const headerArray = await readUint8Array(reader, offset, HEADER_SIZE);
7956
+ if (getLength(headerArray) < HEADER_SIZE) {
7957
+ return HEADER_SIZE;
7958
+ }
7959
+ const headerView = getDataView(headerArray);
7960
+ return HEADER_SIZE +
7961
+ getUint16(headerView, HEADER_OFFSET_FILENAME_LENGTH + LOCAL_HEADER_COMMON_OFFSET) +
7962
+ getUint16(headerView, HEADER_OFFSET_EXTRAFIELD_LENGTH + LOCAL_HEADER_COMMON_OFFSET);
7963
+ }
7964
+
7965
+ function getSourceOffset(reader, { offset, diskNumberStart }) {
7966
+ return offset + (reader.getDiskOffset ? reader.getDiskOffset(diskNumberStart) : 0);
7967
+ }
7968
+
7969
+ function getSplitZipSignatureArray() {
7970
+ const signatureArray = new Uint8Array(SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
7971
+ setUint32(getDataView(signatureArray), 0, SPLIT_ZIP_FILE_SIGNATURE);
7972
+ return signatureArray;
7973
+ }
7974
+
7749
7975
  async function writeData(writer, array) {
7750
7976
  const { writable } = writer;
7751
7977
  const streamWriter = writable.getWriter();
@@ -7797,6 +8023,21 @@ function getOptionValue(zipWriter, options, name, defaultValue) {
7797
8023
  return result === UNDEFINED_VALUE ? defaultValue : result;
7798
8024
  }
7799
8025
 
8026
+ function getDateOptionValue(zipWriter, options, name, defaultValue) {
8027
+ const date = getOptionValue(zipWriter, options, name, defaultValue);
8028
+ if (date === null) {
8029
+ return defaultValue;
8030
+ }
8031
+ if (date !== UNDEFINED_VALUE && (typeof date.getTime != FUNCTION_TYPE || Number.isNaN(date.getTime()))) {
8032
+ throw new Error(ERR_INVALID_DATE);
8033
+ }
8034
+ return date;
8035
+ }
8036
+
8037
+ function getFunctionOptionValue(zipWriter, options, name) {
8038
+ return checkFunctionOption(getOptionValue(zipWriter, options, name));
8039
+ }
8040
+
7800
8041
  function getAliasedOptionValue(zipWriter, options, name, deprecatedName, defaultValue) {
7801
8042
  const value = getAliasedValue(options, name, deprecatedName);
7802
8043
  const result = value === UNDEFINED_VALUE ? getAliasedValue(zipWriter.options, name, deprecatedName) : value;
@@ -7811,9 +8052,6 @@ function getNumberOptionValue(zipWriter, options, name, defaultValue) {
7811
8052
  return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
7812
8053
  }
7813
8054
 
7814
- function toNumber(value) {
7815
- return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
7816
- }
7817
8055
 
7818
8056
  function getMaximumCompressedSize(uncompressedSize) {
7819
8057
  return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
@@ -7825,6 +8063,14 @@ function isCompressed(compressionMethod, level) {
7825
8063
  : compressionMethod !== COMPRESSION_METHOD_STORE;
7826
8064
  }
7827
8065
 
8066
+ function getUint16(view, offset) {
8067
+ return view.getUint16(offset, true);
8068
+ }
8069
+
8070
+ function getUint32(view, offset) {
8071
+ return view.getUint32(offset, true);
8072
+ }
8073
+
7828
8074
  function setUint8(view, offset, value) {
7829
8075
  view.setUint8(offset, value);
7830
8076
  }
@@ -7868,9 +8114,9 @@ function getHeaderArrayData({
7868
8114
  const headerRecord = createRecordWriter(HEADER_SIZE - 4);
7869
8115
  const headerArray = headerRecord.array;
7870
8116
  const headerView = getDataView(headerArray);
7871
- headerRecord.uint16(version);
7872
- headerRecord.uint16(bitFlag);
7873
- headerRecord.uint16(compressionMethod);
8117
+ headerRecord.writeUint16(version);
8118
+ headerRecord.writeUint16(bitFlag);
8119
+ headerRecord.writeUint16(compressionMethod);
7874
8120
  if (rawLastModDate === UNDEFINED_VALUE) {
7875
8121
  const dateArray = new Uint32Array(1);
7876
8122
  const dateView = getDataView(dateArray);
@@ -7878,20 +8124,20 @@ function getHeaderArrayData({
7878
8124
  setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
7879
8125
  rawLastModDate = dateArray[0];
7880
8126
  }
7881
- headerRecord.uint32(rawLastModDate);
8127
+ headerRecord.writeUint32(rawLastModDate);
7882
8128
  headerRecord.skip(4);
7883
8129
  if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
7884
- headerRecord.uint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
8130
+ headerRecord.writeUint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
7885
8131
  } else {
7886
8132
  headerRecord.skip(4);
7887
8133
  }
7888
8134
  if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
7889
- headerRecord.uint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
8135
+ headerRecord.writeUint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
7890
8136
  } else {
7891
8137
  headerRecord.skip(4);
7892
8138
  }
7893
- headerRecord.uint16(getLength(rawFilename));
7894
- headerRecord.uint16(extraFieldLength);
8139
+ headerRecord.writeUint16(getLength(rawFilename));
8140
+ headerRecord.writeUint16(extraFieldLength);
7895
8141
  return {
7896
8142
  headerArray,
7897
8143
  headerView,
@@ -8404,7 +8650,7 @@ try {
8404
8650
  // ignored
8405
8651
  }
8406
8652
 
8407
- const n=[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],c=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],s=[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],f=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],z=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],t=new Uint8Array(288);t.fill(8,0,144),t.fill(9,144,256),t.fill(7,256,280),t.fill(8,280,288);const u=new Uint8Array(30).fill(5);function r(n){const c=new Uint16Array(16);for(const s of n)c[s]++;c[0]=0;const s=new Uint16Array(17);for(let n=1;15>=n;n++)s[n+1]=s[n]+c[n];const f=new Uint16Array(n.length);for(let c=0;c<n.length;c++)n[c]&&(f[s[n[c]]++]=c);return {l:c,symbols:f}}const l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function U(U){let e;U({wasmURI:()=>(e||(e="data:application/wasm;base64,"+(n=>{let c="";const s=n.length;let f=0;for(;s>f+2;f+=3){const s=n[f]<<16|n[f+1]<<8|n[f+2];c+=l[s>>18&63]+l[s>>12&63]+l[s>>6&63]+l[63&s];}const z=s-f;if(1===z){const s=n[f]<<16;c+=l[s>>18&63]+l[s>>12&63]+"==";}else if(2===z){const s=n[f]<<16|n[f+1]<<8;c+=l[s>>18&63]+l[s>>12&63]+l[s>>6&63]+"=";}return c})((l=>{let U=0,e=0,o=0,a=new Uint8Array(1024),y=0,i=0;for(;!i;){i=w(1);const n=w(2);if(0==n)V();else if(1==n)j(r(t),r(u));else {if(2!=n)throw Error("invalid deflate block type");j(...m());}}return a.subarray(0,y);function b(){if(U>=l.length)throw Error("unexpected end of deflate data");return l[U++]}function w(n){for(;n>o;)e|=b()<<o,o+=8;const c=e&(1<<n)-1;return e>>>=n,o-=n,c}function V(){e=0,o=0;const n=b()|b()<<8;U+=2,L(y+n);for(let c=0;n>c;c++)a[y++]=b();}function j(z,t){let u=q(z);for(;256!=u;){if(256>u)L(y+1),a[y++]=u;else {const z=u-257,r=n[z]+w(c[z]),l=q(t),U=s[l]+w(f[l]);L(y+r);const e=y-U;for(let n=0;r>n;n++)a[y++]=a[e+n];}u=q(z);}}function m(){const n=w(5)+257,c=w(5)+1,s=w(4)+4,f=new Uint8Array(19);for(let n=0;s>n;n++)f[z[n]]=w(3);const t=r(f),u=new Uint8Array(n+c);let l=0;for(;l<u.length;){const n=q(t);if(16>n)u[l++]=n;else if(16==n){const n=u[l-1];let c=w(2)+3;for(;c--;)u[l++]=n;}else l+=17==n?w(3)+3:w(7)+11;}return [r(u.subarray(0,n)),r(u.subarray(n))]}function q(n){const{l:c,symbols:s}=n;let f=0,z=0,t=0;for(let n=1;15>=n;n++){f|=w(1);const u=c[n];if(u>f-z)return s[t+(f-z)];t+=u,z=z+u<<1,f<<=1;}throw Error("invalid huffman code")}function L(n){if(a.length<n){let c=2*a.length;for(;n>c;)c*=2;const s=new Uint8Array(c);s.set(a.subarray(0,y)),a=s;}}})((n=>{const c=(n=(n+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,s=[];for(let f=0;c>f;f+=4){const c=l.indexOf(n[f])<<18|l.indexOf(n[f+1])<<12|(63&l.indexOf(n[f+2]))<<6|63&l.indexOf(n[f+3]);s.push(c>>16&255),"="!==n[f+2]&&s.push(c>>8&255),"="!==n[f+3]&&s.push(255&c);}return new Uint8Array(s)})("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")))),e)});}
8653
+ const n=[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],c=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],s=[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],f=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],z=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],t=new Uint8Array(288);t.fill(8,0,144),t.fill(9,144,256),t.fill(7,256,280),t.fill(8,280,288);const u=new Uint8Array(30).fill(5);function r(n){const c=new Uint16Array(16);for(const s of n)c[s]++;c[0]=0;const s=new Uint16Array(17);for(let n=1;n<=15;n++)s[n+1]=s[n]+c[n];const f=new Uint16Array(n.length);for(let c=0;c<n.length;c++)n[c]&&(f[s[n[c]]++]=c);return {l:c,symbols:f}}const l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function U(U){let e;U({wasmURI:()=>(e||(e="data:application/wasm;base64,"+(n=>{let c="";const s=n.length;let f=0;for(;f+2<s;f+=3){const s=n[f]<<16|n[f+1]<<8|n[f+2];c+=l[s>>18&63]+l[s>>12&63]+l[s>>6&63]+l[63&s];}const z=s-f;if(1===z){const s=n[f]<<16;c+=l[s>>18&63]+l[s>>12&63]+"==";}else if(2===z){const s=n[f]<<16|n[f+1]<<8;c+=l[s>>18&63]+l[s>>12&63]+l[s>>6&63]+"=";}return c})((l=>{let U=0,e=0,o=0,a=new Uint8Array(1024),y=0,i=0;for(;!i;){i=w(1);const n=w(2);if(0==n)V();else if(1==n)j(r(t),r(u));else {if(2!=n)throw Error("invalid deflate block type");j(...m());}}return a.subarray(0,y);function b(){if(U>=l.length)throw Error("unexpected end of deflate data");return l[U++]}function w(n){for(;o<n;)e|=b()<<o,o+=8;const c=e&(1<<n)-1;return e>>>=n,o-=n,c}function V(){e=0,o=0;const n=b()|b()<<8;U+=2,L(y+n);for(let c=0;c<n;c++)a[y++]=b();}function j(z,t){let u=q(z);for(;256!=u;){if(u<256)L(y+1),a[y++]=u;else {const z=u-257,r=n[z]+w(c[z]),l=q(t),U=s[l]+w(f[l]);L(y+r);const e=y-U;for(let n=0;n<r;n++)a[y++]=a[e+n];}u=q(z);}}function m(){const n=w(5)+257,c=w(5)+1,s=w(4)+4,f=new Uint8Array(19);for(let n=0;n<s;n++)f[z[n]]=w(3);const t=r(f),u=new Uint8Array(n+c);let l=0;for(;l<u.length;){const n=q(t);if(n<16)u[l++]=n;else if(16==n){const n=u[l-1];let c=w(2)+3;for(;c--;)u[l++]=n;}else l+=17==n?w(3)+3:w(7)+11;}return [r(u.subarray(0,n)),r(u.subarray(n))]}function q(n){const{l:c,symbols:s}=n;let f=0,z=0,t=0;for(let n=1;n<=15;n++){f|=w(1);const u=c[n];if(f-z<u)return s[t+(f-z)];t+=u,z=z+u<<1,f<<=1;}throw Error("invalid huffman code")}function L(n){if(a.length<n){let c=2*a.length;for(;c<n;)c*=2;const s=new Uint8Array(c);s.set(a.subarray(0,y)),a=s;}}})((n=>{const c=(n=(n+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,s=[];for(let f=0;f<c;f+=4){const c=l.indexOf(n[f])<<18|l.indexOf(n[f+1])<<12|(63&l.indexOf(n[f+2]))<<6|63&l.indexOf(n[f+3]);s.push(c>>16&255),"="!==n[f+2]&&s.push(c>>8&255),"="!==n[f+3]&&s.push(255&c);}return new Uint8Array(s)})("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")))),e)});}
8408
8654
 
8409
8655
  /*
8410
8656
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -8839,6 +9085,7 @@ U(setDefaultConfiguration);
8839
9085
  const ERR_ENTRY_EXISTS = "Entry filename already exists";
8840
9086
  const ERR_READABLE_CONSUMED = "Readable stream already consumed";
8841
9087
  const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
9088
+ const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
8842
9089
  const ERR_ABORT_EXPORT = "zipjs-abort-export";
8843
9090
  const ERR_ABORTED = "The operation was aborted";
8844
9091
  const ABORT_ERROR_NAME = "AbortError";
@@ -8871,13 +9118,14 @@ class ZipEntry {
8871
9118
  fs,
8872
9119
  name,
8873
9120
  data: params.data,
8874
- options: params.options,
9121
+ options: params.options && Object.assign({}, params.options),
8875
9122
  id: fs.entryIdCounter++,
8876
9123
  parent,
8877
9124
  children: [],
8878
9125
  uncompressedSize: params.uncompressedSize || 0,
8879
9126
  undeterminedSize: params.undeterminedSize || params.uncompressedSize === UNDEFINED_VALUE,
8880
- passThrough: params.passThrough
9127
+ passThrough: params.passThrough,
9128
+ defaultLastModDate: params.defaultLastModDate || new Date()
8881
9129
  });
8882
9130
  if (parent || !fs.root) {
8883
9131
  fs.entries[zipEntry.id] = zipEntry;
@@ -8887,12 +9135,6 @@ class ZipEntry {
8887
9135
  }
8888
9136
  }
8889
9137
 
8890
- moveTo(target) {
8891
- // deprecated
8892
- const zipEntry = this;
8893
- zipEntry.fs.move(zipEntry, target);
8894
- }
8895
-
8896
9138
  getFullname() {
8897
9139
  return this.getRelativeName();
8898
9140
  }
@@ -8924,6 +9166,11 @@ class ZipEntry {
8924
9166
  this.name = name;
8925
9167
  }
8926
9168
  }
9169
+
9170
+ setOptions(options) {
9171
+ const entryOptions = Object.assign({}, this.options, options);
9172
+ this.options = Object.fromEntries(Object.entries(entryOptions).filter(([, value]) => value !== UNDEFINED_VALUE));
9173
+ }
8927
9174
  }
8928
9175
 
8929
9176
  class ZipFileEntry extends ZipEntry {
@@ -8950,7 +9197,7 @@ class ZipFileEntry extends ZipEntry {
8950
9197
  const reader = zipEntry.reader = createReader(zipEntry.Reader, zipEntry.data, options);
8951
9198
  const dataSize = zipEntry.uncompressedSize || reader.size;
8952
9199
  await Promise.all([initStream(reader), initStream(writer, dataSize)]);
8953
- const { signal } = options;
9200
+ const signal = checkSignalOption(options.signal);
8954
9201
  const readable = createProgressReadable(zipEntry, reader, options, signal);
8955
9202
  const preventClose = !ownsWritable(writer) && Boolean(options.preventClose);
8956
9203
  zipEntry.uncompressedSize = reader.size;
@@ -9168,10 +9415,6 @@ class ZipDirectoryEntry extends ZipEntry {
9168
9415
  });
9169
9416
  }
9170
9417
 
9171
- addData(name, params) {
9172
- return addChild(this, name, params);
9173
- }
9174
-
9175
9418
  importBlob(blob, options) {
9176
9419
  return this.importZip(new BlobReader(blob), options);
9177
9420
  }
@@ -9285,7 +9528,7 @@ class ZipDirectoryEntry extends ZipEntry {
9285
9528
  if (options.bufferedWrite === UNDEFINED_VALUE) {
9286
9529
  options.bufferedWrite = true;
9287
9530
  }
9288
- const [readers] = await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
9531
+ const [readers] = await Promise.all([initReaders(zipEntry, checkReaderOptions(options.readerOptions)), initStream(writer)]);
9289
9532
  const zipWriter = new ZipWriter(writer, options);
9290
9533
  await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
9291
9534
  await zipWriter.close(options.globalComment);
@@ -9295,12 +9538,13 @@ class ZipDirectoryEntry extends ZipEntry {
9295
9538
  getExportedSize(options = {}) {
9296
9539
  const zipEntry = this;
9297
9540
  options = Object.assign({}, options);
9541
+ checkReaderOptions(options.readerOptions);
9298
9542
  if (options.bufferedWrite === UNDEFINED_VALUE) {
9299
9543
  options.bufferedWrite = true;
9300
9544
  }
9301
9545
  const writeOrderGuaranteed = !options.bufferedWrite ||
9302
9546
  (options.keepOrder !== false && zipEntry.children.every(child => !child.children.length));
9303
- return getEntriesSize(options, Array.from(zipEntry.getChildren({ recursive: true }), child => {
9547
+ return getEntriesSize(options, zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
9304
9548
  const { name, entryOptions } = getChildEntryOptions(child, zipEntry, options);
9305
9549
  return { name, size: child.directory ? 0 : getDeterminedSize(child, isPassThrough(child, options)), options: entryOptions };
9306
9550
  }), writeOrderGuaranteed, options.globalComment);
@@ -9339,7 +9583,7 @@ class ZipDirectoryEntry extends ZipEntry {
9339
9583
  }
9340
9584
 
9341
9585
 
9342
- class FS {
9586
+ class ZipFS {
9343
9587
 
9344
9588
  constructor() {
9345
9589
  resetFS(this);
@@ -9455,10 +9699,6 @@ class FS {
9455
9699
  return this.root.addFile(file, options);
9456
9700
  }
9457
9701
 
9458
- addData(name, params) {
9459
- return this.root.addData(name, params);
9460
- }
9461
-
9462
9702
  importBlob(blob, options) {
9463
9703
  resetFS(this);
9464
9704
  return this.root.importBlob(blob, options);
@@ -9526,7 +9766,7 @@ class FS {
9526
9766
  }
9527
9767
  }
9528
9768
 
9529
- const fs = { FS, ZipDirectoryEntry, ZipFileEntry };
9769
+ const fs = { FS: ZipFS, ZipDirectoryEntry, ZipFileEntry };
9530
9770
 
9531
9771
  function getTotalSize(entries, getEntrySize) {
9532
9772
  let size = 0;
@@ -9670,7 +9910,7 @@ function detach(entry) {
9670
9910
  }
9671
9911
 
9672
9912
  function forwardAbort(signal, abortController) {
9673
- if (!signal) {
9913
+ if (!checkSignalOption(signal)) {
9674
9914
  return () => { };
9675
9915
  }
9676
9916
  if (signal.aborted) {
@@ -9747,10 +9987,7 @@ function getChildEntryOptions(child, selectedEntry, options) {
9747
9987
  });
9748
9988
  }
9749
9989
  if (isPassThrough(child, options)) {
9750
- let level, encryptionStrength;
9751
- if (compressionMethod === 0) {
9752
- level = 0;
9753
- }
9990
+ let encryptionStrength;
9754
9991
  if (extraFieldAES) {
9755
9992
  encryptionStrength = extraFieldAES.strength;
9756
9993
  }
@@ -9760,13 +9997,12 @@ function getChildEntryOptions(child, selectedEntry, options) {
9760
9997
  zipCrypto,
9761
9998
  crc32,
9762
9999
  uncompressedSize,
9763
- level,
9764
10000
  encryptionStrength,
9765
10001
  compressionMethod
9766
10002
  };
9767
10003
  }
9768
10004
  }
9769
- const entryOptions = Object.assign({}, zipEntryMetadata, options, passThroughOptions, childOptions, { directory: child.directory });
10005
+ const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
9770
10006
  if (!child.directory && entryOptions.passThrough && entryOptions.uncompressedSize === UNDEFINED_VALUE) {
9771
10007
  throw new Error(ERR_INVALID_PASS_THROUGH);
9772
10008
  }
@@ -9781,11 +10017,22 @@ function getDeterminedSize(child, passThrough) {
9781
10017
  return child.undeterminedSize ? UNDEFINED_VALUE : getExtractedSize(child, passThrough);
9782
10018
  }
9783
10019
 
10020
+ function checkReaderOptions(readerOptions) {
10021
+ if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
10022
+ throw new Error(ERR_INVALID_READER_OPTIONS);
10023
+ }
10024
+ return readerOptions;
10025
+ }
10026
+
9784
10027
  function isPassThrough(child, options) {
9785
10028
  const { readerOptions } = options;
9786
10029
  return Boolean(!child.directory && (child.passThrough || (readerOptions && readerOptions.passThrough)));
9787
10030
  }
9788
10031
 
10032
+ function isImplicitDirectory(child) {
10033
+ return child.directory && child.data === null;
10034
+ }
10035
+
9789
10036
  function getUserExtraField(extraField) {
9790
10037
  if (extraField) {
9791
10038
  const userExtraField = new Map();
@@ -9803,7 +10050,7 @@ function getUserExtraField(extraField) {
9803
10050
  async function exportZip(zipWriter, entry, totalSize, options, readers) {
9804
10051
  const { onstart, onprogress, onend, onentryprogress } = options;
9805
10052
  const selectedEntry = entry;
9806
- const totalEntries = getTotalSize(entry.children, () => 1);
10053
+ const totalEntries = getTotalSize(entry.children, child => isImplicitDirectory(child) ? 0 : 1);
9807
10054
  let writtenSize = 0;
9808
10055
  let writtenEntries = 0;
9809
10056
  if (onstart) {
@@ -9832,6 +10079,9 @@ async function exportZip(zipWriter, entry, totalSize, options, readers) {
9832
10079
  }
9833
10080
 
9834
10081
  async function addChild(child) {
10082
+ if (isImplicitDirectory(child)) {
10083
+ return;
10084
+ }
9835
10085
  const { name, entryOptions } = getChildEntryOptions(child, selectedEntry, options);
9836
10086
  let entryWrittenSize = 0;
9837
10087
  const entryMetadata = await zipWriter.add(name, readers.get(child), Object.assign(entryOptions, {
@@ -9865,7 +10115,7 @@ function addFileSystemHandle(zipEntry, handle, options) {
9865
10115
  if (handle.kind == "file") {
9866
10116
  const file = await handle.getFile();
9867
10117
  addedEntries.push(
9868
- parentEntry.addData(file.name, {
10118
+ addChild(parentEntry, file.name, {
9869
10119
  Reader: function () {
9870
10120
  const readable = file.stream();
9871
10121
  const size = file.size;
@@ -9899,10 +10149,11 @@ function addFileSystemHandle(zipEntry, handle, options) {
9899
10149
 
9900
10150
  async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
9901
10151
  const { onstart, onprogress, onend } = options;
10152
+ const readerOptions = checkReaderOptions(options.readerOptions);
9902
10153
  const abortController = new AbortController();
9903
10154
  const { signal } = abortController;
9904
10155
  const releaseSignal = forwardAbort(options.signal, abortController);
9905
- const getDataOptions = Object.assign({}, options, options.readerOptions, {
10156
+ const getDataOptions = Object.assign({}, options, readerOptions, {
9906
10157
  signal,
9907
10158
  onstart: UNDEFINED_VALUE,
9908
10159
  onprogress: UNDEFINED_VALUE,
@@ -10202,6 +10453,7 @@ exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
10202
10453
  exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
10203
10454
  exports.ERR_ENCRYPTED = ERR_ENCRYPTED;
10204
10455
  exports.ERR_ENCRYPTED_CENTRAL_DIRECTORY = ERR_ENCRYPTED_CENTRAL_DIRECTORY;
10456
+ exports.ERR_ENTRY_DATA_OUT_OF_BOUNDS = ERR_ENTRY_DATA_OUT_OF_BOUNDS;
10205
10457
  exports.ERR_ENTRY_EXISTS = ERR_ENTRY_EXISTS;
10206
10458
  exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
10207
10459
  exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
@@ -10215,20 +10467,28 @@ exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
10215
10467
  exports.ERR_INVALID_COMMENT_TYPE = ERR_INVALID_COMMENT_TYPE;
10216
10468
  exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
10217
10469
  exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
10470
+ exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
10218
10471
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
10219
10472
  exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
10473
+ exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
10220
10474
  exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
10475
+ exports.ERR_INVALID_EXTRAFIELD = ERR_INVALID_EXTRAFIELD;
10221
10476
  exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
10477
+ exports.ERR_INVALID_EXTRAFIELD_DATA_TYPE = ERR_INVALID_EXTRAFIELD_DATA_TYPE;
10222
10478
  exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
10223
10479
  exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
10480
+ exports.ERR_INVALID_FUNCTION_OPTION = ERR_INVALID_FUNCTION_OPTION;
10224
10481
  exports.ERR_INVALID_GID = ERR_INVALID_GID;
10225
10482
  exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
10226
10483
  exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
10484
+ exports.ERR_INVALID_MAX_WORKERS = ERR_INVALID_MAX_WORKERS;
10227
10485
  exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
10228
10486
  exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
10229
10487
  exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
10230
10488
  exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
10231
10489
  exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
10490
+ exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
10491
+ exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
10232
10492
  exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
10233
10493
  exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
10234
10494
  exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
@@ -10244,6 +10504,7 @@ exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
10244
10504
  exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
10245
10505
  exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
10246
10506
  exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
10507
+ exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
10247
10508
  exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
10248
10509
  exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
10249
10510
  exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
@@ -10268,6 +10529,10 @@ exports.TextWriter = TextWriter;
10268
10529
  exports.Uint8ArrayReader = Uint8ArrayReader;
10269
10530
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
10270
10531
  exports.Writer = Writer;
10532
+ exports.ZipDirectoryEntry = ZipDirectoryEntry;
10533
+ exports.ZipEntry = ZipEntry;
10534
+ exports.ZipFS = ZipFS;
10535
+ exports.ZipFileEntry = ZipFileEntry;
10271
10536
  exports.ZipReader = ZipReader;
10272
10537
  exports.ZipReaderStream = ZipReaderStream;
10273
10538
  exports.ZipWriter = ZipWriter;