@zip.js/zip.js 2.8.26 → 2.8.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BENCHMARKS.md +168 -0
- package/README.md +2 -2
- package/deno.json +1 -1
- package/dist/zip-core.js +1113 -574
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core.js +1209 -622
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-native.js +1270 -632
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +1347 -686
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +1114 -575
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-module.wasm +0 -0
- package/dist/zip-native.js +1116 -577
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip-web-worker.js +1 -1
- package/dist/zip.js +1193 -631
- package/dist/zip.min.js +1 -1
- package/eslint.config.mjs +6 -1
- package/index-native.cjs +1270 -632
- package/index-native.min.js +1 -1
- package/index.cjs +1347 -686
- package/index.d.ts +2451 -2355
- package/index.min.js +1 -1
- package/lib/core/codec-pool.js +39 -1
- package/lib/core/codec-worker.js +130 -35
- package/lib/core/configuration.js +3 -0
- package/lib/core/constants.js +6 -0
- package/lib/core/io.js +55 -25
- package/lib/core/options.js +2 -0
- package/lib/core/streams/aes-crypto-stream.js +12 -12
- package/lib/core/streams/codec-stream.js +11 -5
- package/lib/core/streams/codecs/sjcl.js +1 -33
- package/lib/core/streams/common-crypto.js +4 -4
- package/lib/core/streams/zip-crypto-stream.js +25 -15
- package/lib/core/streams/zip-entry-stream.js +89 -5
- package/lib/core/streams/zlib-js/zlib-streams.min.js +1 -1
- package/lib/core/streams/zlib-wasm/zlib-streams.js +79 -56
- package/lib/core/streams/zlib-wasm/zlib-streams.wasm +0 -0
- package/lib/core/util/decode-cp437.js +1 -1
- package/lib/core/util/decode-text.js +2 -1
- package/lib/core/web-worker-base.js +12 -4
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-fs.js +154 -55
- package/lib/core/zip-reader.js +185 -67
- package/lib/core/zip-writer.js +613 -376
- package/lib/core/zlib-streams-inline.js +1 -1
- package/lib/zip-core-reader.js +3 -1
- package/lib/zip-core-writer.js +1 -0
- package/package.json +20 -6
package/index-native.cjs
CHANGED
|
@@ -44,6 +44,7 @@ const CENTRAL_FILE_HEADER_SIGNATURE = 0x02014b50;
|
|
|
44
44
|
const END_OF_CENTRAL_DIR_SIGNATURE = 0x06054b50;
|
|
45
45
|
const ZIP64_END_OF_CENTRAL_DIR_SIGNATURE = 0x06064b50;
|
|
46
46
|
const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE = 0x07064b50;
|
|
47
|
+
const CENTRAL_FILE_HEADER_LENGTH = 46;
|
|
47
48
|
const END_OF_CENTRAL_DIR_LENGTH = 22;
|
|
48
49
|
const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH = 20;
|
|
49
50
|
const ZIP64_END_OF_CENTRAL_DIR_LENGTH = 56;
|
|
@@ -91,9 +92,11 @@ const VERSION_AES = 0x33;
|
|
|
91
92
|
const DIRECTORY_SIGNATURE = "/";
|
|
92
93
|
|
|
93
94
|
const HEADER_SIZE = 30;
|
|
95
|
+
const HEADER_OFFSET_VERSION = 0;
|
|
94
96
|
const HEADER_OFFSET_SIGNATURE = 10;
|
|
95
97
|
const HEADER_OFFSET_COMPRESSED_SIZE = 14;
|
|
96
98
|
const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
|
|
99
|
+
const LOCAL_HEADER_COMMON_OFFSET = 4;
|
|
97
100
|
|
|
98
101
|
const MAX_DATE = new Date(2107, 11, 31);
|
|
99
102
|
const MIN_DATE = new Date(1980, 0, 1);
|
|
@@ -148,6 +151,7 @@ const DEFAULT_CONFIGURATION = {
|
|
|
148
151
|
chunkSize: 64 * 1024,
|
|
149
152
|
maxWorkers,
|
|
150
153
|
terminateWorkerTimeout: 5000,
|
|
154
|
+
workerStarvationTimeout: 5000,
|
|
151
155
|
useWebWorkers: true,
|
|
152
156
|
useCompressionStream: true,
|
|
153
157
|
CompressionStream: typeof CompressionStream != UNDEFINED_TYPE && CompressionStream,
|
|
@@ -170,6 +174,7 @@ function configure(configuration) {
|
|
|
170
174
|
chunkSize,
|
|
171
175
|
maxWorkers,
|
|
172
176
|
terminateWorkerTimeout,
|
|
177
|
+
workerStarvationTimeout,
|
|
173
178
|
useCompressionStream,
|
|
174
179
|
useWebWorkers,
|
|
175
180
|
CompressionStream,
|
|
@@ -185,6 +190,7 @@ function configure(configuration) {
|
|
|
185
190
|
setIfDefined("chunkSize", chunkSize);
|
|
186
191
|
setIfDefined("maxWorkers", maxWorkers);
|
|
187
192
|
setIfDefined("terminateWorkerTimeout", terminateWorkerTimeout);
|
|
193
|
+
setIfDefined("workerStarvationTimeout", workerStarvationTimeout);
|
|
188
194
|
setIfDefined("useCompressionStream", useCompressionStream);
|
|
189
195
|
setIfDefined("useWebWorkers", useWebWorkers);
|
|
190
196
|
setIfDefined("CompressionStream", CompressionStream);
|
|
@@ -199,7 +205,7 @@ function setIfDefined(propertyName, propertyValue) {
|
|
|
199
205
|
}
|
|
200
206
|
}
|
|
201
207
|
|
|
202
|
-
const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function g$1(g){g({workerURI:g=>{const B="text/javascript",I=(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,I=[];for(let C=0;B>C;C+=4){const B=A.indexOf(g[C])<<18|A.indexOf(g[C+1])<<12|(63&A.indexOf(g[C+2]))<<6|63&A.indexOf(g[C+3]);I.push(B>>16&255),"="!==g[C+2]&&I.push(B>>8&255),"="!==g[C+3]&&I.push(255&B);}return new Uint8Array(I)})(g);let B=new Uint8Array(1024),I=0;for(let A=0;A<g.length;){const E=g[A++];if(128&E){const Q=3+(127&E),Y=g[A++]<<8|g[A++],F=I-Y;C(I+Q);for(let A=0;Q>A;A++)B[I++]=B[F+A];}else {const Q=E;C(I+Q);for(let C=0;Q>C&&A<g.length;C++)B[I++]=g[A++];}}return (g=>{let B="";const I=g.length;let C=0;for(;I>C+2;C+=3){const I=g[C]<<16|g[C+1]<<8|g[C+2];B+=A[I>>18&63]+A[I>>12&63]+A[I>>6&63]+A[63&I];}const E=I-C;if(1===E){const I=g[C]<<16;B+=A[I>>18&63]+A[I>>12&63]+"==";}else if(2===E){const I=g[C]<<16|g[C+1]<<8;B+=A[I>>18&63]+A[I>>12&63]+A[I>>6&63]+"=";}return B})(new Uint8Array(B.buffer.slice(0,I)));function C(A){if(B.length<A){let g=2*B.length;for(;A>g;)g*=2;const C=new Uint8Array(g);C.set(B.subarray(0,I)),B=C;}}})("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");if(g){const A=atob(I),g=new Blob([A],{type:B});return URL.createObjectURL(g)}return "data:"+B+";base64,"+I}});}
|
|
208
|
+
const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function g$1(g){g({workerURI:g=>{const B="text/javascript",I=(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,I=[];for(let C=0;B>C;C+=4){const B=A.indexOf(g[C])<<18|A.indexOf(g[C+1])<<12|(63&A.indexOf(g[C+2]))<<6|63&A.indexOf(g[C+3]);I.push(B>>16&255),"="!==g[C+2]&&I.push(B>>8&255),"="!==g[C+3]&&I.push(255&B);}return new Uint8Array(I)})(g);let B=new Uint8Array(1024),I=0;for(let A=0;A<g.length;){const E=g[A++];if(128&E){const Q=3+(127&E),Y=g[A++]<<8|g[A++],D=I-Y;C(I+Q);for(let A=0;Q>A;A++)B[I++]=B[D+A];}else {const Q=E;C(I+Q);for(let C=0;Q>C&&A<g.length;C++)B[I++]=g[A++];}}return (g=>{let B="";const I=g.length;let C=0;for(;I>C+2;C+=3){const I=g[C]<<16|g[C+1]<<8|g[C+2];B+=A[I>>18&63]+A[I>>12&63]+A[I>>6&63]+A[63&I];}const E=I-C;if(1===E){const I=g[C]<<16;B+=A[I>>18&63]+A[I>>12&63]+"==";}else if(2===E){const I=g[C]<<16|g[C+1]<<8;B+=A[I>>18&63]+A[I>>12&63]+A[I>>6&63]+"=";}return B})(new Uint8Array(B.buffer.slice(0,I)));function C(A){if(B.length<A){let g=2*B.length;for(;A>g;)g*=2;const C=new Uint8Array(g);C.set(B.subarray(0,I)),B=C;}}})("IChlPT57ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmgwAIBS5hbWQ/gwALCihlKTplKCl9KSiFADVEKCl7InVzZSBzdHJpY3QiO2NvbnN0e0FycmF5OmUsT2JqZWN0OnQsTnVtYmVyOnIsTWF0aDpuLEVycm9yOmksVWludDiDAC4Bb4IADQIxNoMADgFmggAOAjMygwAOA3MsSYcADQFsgABFInA6YSxEYXRhVmlldzpjLFByb21pc2U6dSxUZXh0RW5jb2SAAG4zdyxjcnlwdG86aCxwb3N0TWVzc2FnZTpkLFRyYW5zZm9ybVN0cmVhbTpwLFJlYWRhYmxlhAARBnksV3JpdIgAEQdrLENvbXBygABCgAD0hAAUBWIsRGVjjgAWFm19PXNlbGYsdj12b2lkIDAsZz0idW6DAT8FZCIsUz2HAXAGLHo9W107gACIFChsZXQgZT0wOzI1Nj5lO2UrKyl7gQATA3Q9ZYoAHwE4hAAdFzEmdD90PXQ+Pj4xXjM5ODgyOTIzODQ6gQAREj0xO3pbZV09dH1jbGFzcyBDe4IBkgRydWN0gABJCGUpe3RoaXMugABZC3x8LTF9YXBwZW5kgQAXgwBvAjB8gwAfhgB2BXI9MCxugAAXDmUubGVuZ3RoO24+cjtygACDgwB/EjheelsyNTUmKHReZVtyXSldO4QAXwV0fWdldIACHAdyZXR1cm5+gwAWAX2EAJQCWCCAAaWAAHgDcyBwigCegwCGAWWDAkSAAI4ObmV3IEM7c3VwZXIoe3SFAbQEKGUscoAAxwEuhgC8CSxyLmVucXVldYECnwd9LGZsdXNogABMgwBGAXKCAEYFbyg0KTuBAAkPYyhyLmJ1ZmZlcikuc2V0gwJkBSgwLHQuggCwDSksZS52YWx1ZT1yfX2AAA0BPYEAuYAAt4IASwJQPYEAVANjYXSAAIIKdCl7aWYoMD09PYUBGgJ8fIEADgF0hAAOASmDAPkDIGUuhAAzAnQphADXBHI9ZVuFADQDLTFdgAFeB1AuaShyKTuEADICMzKAAEcCbj+IADkMOlAubyh0LG4sMHxygACgBXNsaWNlgACzhwBFASmAAPYBbIEBxYUBOYYBroQApAF0hQCPATCIAIUBdIAAfocAdQIqKIAAEAIpK4MAjAN9LHWGAOSAABuFAE8BPIYASIUBpAJyPYAEQ4cAkw5uLmNlaWwodC8zMikpKYUAhYQANA90Jj0zMSxyPjAmJnQmJiiAAjCAAIGAAP0BaIAA3IMADQ0mMjE0NzQ4MzY0OD4+gACPASyAANoGLGV9LGg6gQCOgAH2Aj0+ggEeB2U/dDoocj+AAq0cOnQ8PDMyLWUpKzEwOTk1MTE2Mjc3NzYqZSxpOoAE3ARuLnJvgAN8AyhlL4oAHwcpfHwzMixvgwBVBCxuKXuBAu6DA66BAXyAAJ0BboADmQopO3Q+PTMyO3QtgAAGBCluLnCBAlcBcoACboADiY0BWIAA+YQCGgEphgM7AWmBACgBPIcBi4ADNYUARQV8ZVtpXYADPwF0gQBOgQAMggDGAXSEAVUBaYYBwAE/igIrBDowLG+CAi0BaYYCLYQAUYIBRQMrbyaAAWCAAAeAASUDP3I6gAAbBG9wKCmCAUQPbn19LF89e2J5dGVzOntwiQIrAlAugQI6Ai84gACJgwMpgAKpgQC+AW6KAMgDdD5pggDBBTMmaXx8gAEegAC0Ay80XYAAvoAAvAI9boAAyggyNCxuPDw9OIUAmQRyfSxriQBngAToggRPgQRNggBagQFGAXKHAR6BBFMCbj2AAEMBOIABHAdyXSwzJn5ygABqAXSDAOABboAAwwI9MIcDIwImcoACRIcA+wM4KiiAABOAACSAAOuABGUEfSx4PYIEaY0E+4UAjYED1RA7dC5ibG9ja1NpemU9NTEygAQCGW09WzE3MzI1ODQxOTMsNDAyMzIzMzQxNyyABZaABWAHMzEwMiwyN4AAIxAzODc4LDMyODUzNzc1MjBdgAA8AXaAADwKNTE4NTAwMjQ5LIAACQE5gAAbATOAAEcFMjQwMDmAAA4BMIAAMg0zOTU0Njk3ODJdLGU/gADcAVOAAekBU4UDPYAAuwIuQ4AAEQFDiQARAViAABEFWCk6dC6ABmSBBKABfYQACIQAy4MEoIUBF4AATYAALwFthwBAgABNgAF5gAAHAViABcYHZX11cGRhdIEFJIsBCQEigQe7Am5nhwf+gAf5gAPWBF8uUC6BAcOHBLiBAKABUIYElwMuQyyABXsBboAAFgFYgAKXgQCrAW6ABD6BAk2BAx4Lbz45MDA3MTk5MjWAA9OAA30IMSl0aHJvdyCBAmUnaSgiQ2Fubm90IGhhc2ggbW9yZSB0aGFuIDJeNTMgLSAxIGJpdHMihQB6AWaCApoBc4EFJIECRAFshAJCgwcViAHHAytuLYAAl4gAD4ACJIYADoAE3QM7bz6AB1ACZSuJADQLKXQuXyhmLnN1YmGBCFwGKDE2KmwsgAAFAyhsK4ADOQQpLGwrgAdRhQLUAy5zcIQE6YEAJ4ECbAFSjQGLhAe2Ai5DhwVpAy5TO4EDZ4UBOAIsW4ECs4EE3IAEYokAyIMDCgYrMjsxNSaDB+eEAuOAAvmBACiFAwwELmZsb4EC0A0uWC80Mjk0OTY3Mjk2gQL6hAAugAesAViABLyFA1oCKWWAAOIBdIkAu4AB04YCMoQCUAQscn1BhwUPhQAeBz4xOT9lPjOBAAUBNYEABQM3OT+DBSYROnRecl5uOnQmcnx0Jm58ciaAAAyGABIBfoAAEwJ9SYMGQIUF+wQ8PGV8gQgwgQWsAX2AAI+HB56BATYGLGk9ci5TgAJGA2UoOIQA7YUI8gExhQkQAW+CCNWAAAWCAWMEZj1pW4ADeAFzgAAHgAdDAWyAAAeAA1QBYYAABwQzXSxjgAAHATSLCVcCNzmDAfqACVeBAFGABFmCAE8Dci5JgAGJgAALBC0zXV6BAAcBOIMABwIxNIQACAI2XYYC/wF0ggAuBzUsZikrci6BASwJcyxsLGEpK2MrgQBLgAAUAnZbhgGaBi8yMCldfIAHbAI9YYAAlQFsgACggQA8BTMwLHMpgACzA2YsZoAJH4EAwIIAxQUrZnwwLIEAx4IAzAIrc4IADgEygQAOBDJdK2yCAA4BM4EADgQzXSthggAOATSBAA4GNF0rY3wwgATrC1I9e2ltcG9ydEtlgAtxgAbzgAMrBlIuTyhfLoIF7oMDwwIsVYcB3YADnQJyPYAFXAcxZTQsMD5ugAi3Aj5yiwOcAmlugAkDgAHnEHBhcmFtcyB0byBwYmtkZjKGA5EFbz0xKyiABfYFNSk8PDKDAZCDAQ8CLHWEACIBd4IDs4ILrwFCggluBShvKSxoggAVA2Mod4MDyAFkgAGZgwAuA3A9UIMC4oAEdYUAtoAHGwF1gAN7AihvgACqBSk+ZDt1gQG9gQAlA2Y9c4ADVAJlboIL2wIocIgDWAF1gAGugAFsgAOwBD5sO2yAADCBAC+JAC2AAX8BYYAAdQNhPHOFAx0BYYEAJgZbYV1ePXOAAAaDAjSAACKFAHYFJiZsPGaFACyBAFIBaIEKNYIMiwYoZCxmW2yABwMEZCs9NIAFl4IC6AF3hwkKAi84gAlGAk86ngaIgAd4BXQuSD14gAVKAVuABawCW12AC0MELkQ9W4EBK4ABsIEABgFdhggYgAAagAIyhwS+gAloATuFB0MCPmmCBbcBKIIAMwIpLoYF7QEugASkhwNUgAvjBjtpPnQ7dIEHcIAATAVbdF09OYAGoQUyMjQ4NoALxAF0gAqRgAKHgQAXCjE1NDk1NTY4MjiCABiBAJeBAH2EAFmBAD2BBHQBRIAALocAFAExggAUAVSCAemBBLKBADKUBrUBZYQAJwNlLkiABMyCACmABqoEVj0hMYgGqYIMOIAAFIALoYEACgFUhwDXBn1kaWdlc40AVgEsgQV8AVSBAPOECNCFAF6AAJmFADwBdIIBE5EFA4UCKIAAeYADJoMAfIsDG4QAIgYgb24gYWyADe8DZHkggwBWDmQgaG1hYyBjYWxsZWQhgAMqhQT6gQBFhgC1gwDGhAC6gADEgAPAAUGFB3YEaCE9Z4AI1oQADYEMjwdSYW5kb21WgQyPCXM9PVMsST0iSYYDmwVzc3dvcoAOUAFPhwAVBXNpZ25hgAB2DmUiLFU9InppcGpzLWFigAQbBy1jaGVjay2GADUBO4UOggEggAEdggDsAUGFCsmOAHmBB9CLB7qCD1MFIEFQSSCBB8KADZ6BBH6ADtsBKYQNJxhEPTE2LFQ9e25hbWU6IlBCS0RGMiJ9LFaAAr6AAIGAAKQCKHuBB/cBOoQAIQVITUFDIoABCQRUKSxXiAAjBWl0ZXJhgQCkBnM6MWUzLIkAMgVTSEEtMYQAMwRNPVsigA/rBGl2ZUKBCDMHXSxCPVs4LIAJz4AFvAIsRYAJlQE2gAmCgAmsDF0sUT0xMCxLPVswLIIAAgNdLGqJAXoGLEw9aiYmgAPfB3VidGxlLE6BAA6EAB8BTIEAHwFahQSbAixxogpcAVeAA86CA8+GAAOAAASMABGBCjgBV4EDhIIAAwV8fHQuTYACmIcJboIAHAE0gQ4igQAMgAbogAchhgSNhwV1gATxgAHCCDQhPT1vJiY2gwAHATiBAAeTBdYHYWVzIGtleYACLgJ6ZYACqIMIWoAKv4EFKYYKOgFsgAo4AV2ABqgMbzs0Km8rMjg+ZjtmhRCVAWWABSwBZoEOPAQoZiVvgA0FBDB8fDiAAAeAAHaDABACNCmCBIkDcltlggwYgAzcAzI0XoIADgMxNiaAEC2AABECMTaDABEBOIQAEAE4gAAPgRBHAWWAAHSDAFSCAEMBZYEAGoMARgJeYYEAR4AA7YAACAsxXjI4MyooYT4+N4EJo4AAjgFdggCTBW9dXmV9iQf3AWaBB/MELGYtLYcBnwpzWzMmZT9mOmYtgAgjAWyBCAUIND49Znx8ND6BDlWCBRICcluBCKqAALkCXV6CBQuCABCEALuBABMBMoQAE4MAvYEAEgEzgQASgQDABHRdXX2JBEaJBAUBQoAHgwEwgAS3AWWWAB4DMSl9gAIBigTQggIEgATVhAAMgAIEgQ4wgwIUgQAHAWmBC+ABb4UNXoQCEZQSUgRvWyhpgQDxgAFWhAFCgAFbgAFCAV6BABSGADQDYz1mgAA2BCFyW2OABneABxeABwmBAgiAAWSBBxOCAgEFbz1mXmaBAEWAAAUBMoEABQEzgQAFBTQ7bz1vgRISgQEJBG9eOTmADh0EY109b4AGUARvXT1jggmegQmpgQm0AWOAAv2CALKAB+MENjg0M4ANIwUqYV42NYANUQIqbIAAQQQ3KnNehAAZBjgqYyx3PYEAEwFpgABIhwAWAW+JEqMCOzSEEpaBDjyBAHYDdz13ggJ3AXeBEqQCLHSBABaAAIUDdT11ggAWAXWBABaGAiqBAEABNYgAQIABYQJyXYgNhYEAE4EABYYAEwF9gQGtgxEdgQN2hQOUlwNvggewhQNxiQr5gAo1gQdxgAofgwBDAy80LYAQmIgEpIAKKoMB+oAAJ4AKOoECDQFsgAAHgAIIAWGAAAeABNaAAa+BCvQBdYAAB4EC0YAAzwd3LGgsZCxwgADGAjBdgANXgAAyAXmBEe0EPzM6MYEAEIAAOwFrgAAQATKBAAyAAEABYoIAHAIxOoALAQFygQBJA209NIoCPwFuhAI9AXeAAzoBcIMDFwRebFt5hgMRBF5hW2uFAwsCXmOCAwUBYoEASwJtXYAJ7wFzgQAphAAzgAAmhwAzAWKMADMBcIIAMwErgACcAWSAADWAACuEADWAACiHADWAAH+KADUBeYMANYIAxQFzgQArhAA1gAAohwA1gACBigA1AWuDADWBAOqACbiAAScBd4ABHwFogAETAWSKAPeABA+EAzSAATkEJi1lOoADJAF1hQEBgwJEiAEFggTRAXWHAQmBBLcBdYgBDAMrK12AAsQBcIAAbgF5gABuAWuAAG4BYoAAtAF3hQgkAW+ABssBJJEGVoECZYICAAJLPYAADIEACYAGtIMACQFMgAxDhQlXhQARggAhiAk9iQRgAU6DCM8CSyyEAEkETCl9WoQH/IEAqAF+gQQMBDI0KSmADx4BMYEA4AU7ZWxzZYUWhIUA6YEEfYQA5IACtYIFsYAEYAE1gRMJgBDPgBBkgwANAnI/gRHehAANAm4/gBG6BTorK24pgAAFAXKBAAWAE+6BEI+AD4eBATiBAAkBcoABMYEACAFuhQtIA2V9cYEAnYETY4AUKIANKYIAtIAAsYEKJoIGX4ENMIYAFYAJ3QMpfU6EFCSCALUBboEHEwEhgBKphhWQhAjhgAUqhQtNgRCtgBLtiRLnAW6CEueABsKDAVQBcYEQc4MAL4AS84YMR4AAFQF0gBL4Al49gQYvgAQgAWmAArmBAA2AAr+BAA2AA1uAAA2AApeBAA2AA1iAAA0CM12FANoDUC51gAyrAWmACfsDLEY9gA2oggOzAUeBCG4BTocIcQEuhg3SgQn3AUqNAB6HCPCAAB8BO4MXUwFZlBdTAXuFCfWAGY0EcmF3UIUADoAWSYMAzoQYuYEBJIAZl4IKKYUAJQNPbmyAGYgDfSl7hBeCBHN0YXKCAnCFCaWCC3KAAmeACwcBOoEE94AWNQI9PoIBOgIkPYAK7YYAe4EaOIABmgQsRjpugBXVgRe2gBJwggAyAm99gA0mBmFzeW5jIIkX4I0QIIcAxgFugABFA3MsJIAaBIMAdw5hfT1yO24/KGF3YWl0KIIASoYO64Aa3IUOsIIAHwIgcoEAiIEAHAFvgAysgAVhAUKABVeACEGABt+BABCCAA6CEryAAdcBIYIFbQN8fG+AAdaBAAyAAmOJBd8BSYEbAwFygAdvAW6BAEyAB9mAAD4Dc10rgBb2gALdggAShAAQBixmP3QuZYEa7YINmQdpKFUpKTpsgA2SATqDAJMBYYQCYAFjhBV+hhXvAlEtiAAMAyklRIER0oUY5oAD34ABwAIsY4AAdwRRLCEwgRf/gwFEgxj7hQqOAntHgBt5AUqAAeuGAXKEATUCZn2DCqeBEAuAAlgCKXuDAIwBZoQAjAFzgwEQgRfPhgCBgAZ3ggAViAATggK7AWGDALiBAEuFD1WHCMIEc2UoWoAQ9AI7cocNAoYDTwF0iAAUgAbMgQAqAW6FDEIBY4EAbIIAEwFyhQ0tgAFZgADtgwB0AnU9hQCGAjxRgAa7iRQOAzA7UYQFugR1fD1jgAjugAYQgBIzgACeAXWKAcACTymADoCFAU8BYYENiYAABIMDSgJlZcIDS4ADN4IEVoUav/8DPYMDPQFpgAM9AWaEAggBc4EDPYMVU4MBxoADSQFsgwMsiQNLhwNJA249SIICxwJvKIMDO4UGwgFpgQIbjANkgBeNggMkAWmAAAoCLGaHAvIBc4QCA4QCOgIobIUU+YYC74UACYEC9QFhgRFxAihsgAs6gA0tjAMAAmEshQA8gAAfxgMEgQEQAXOHAtaFAmuIC5iFArqCAt+AAOeJAuCBCaaBABeAD90CaS6GD5GDABSIAs2GEiiAA1qHAomAAUeAFQyHADeAANWBHIaAEfiCHIaGD7aBAGqDAWSAAV4BZocA6gFzgADqAWyGAOqABRsBZYABQIMAv4AHNAJ0PYAAYAFhgAIfhQOFAWOGBx4CLWmDA1mEGZoBKIICRoAB9oERBoABHQE+hgrjhgJaAmU7gAKvhRoxgh1LgAGTgAsbhgfBgQH7Bm4rKGMtY4ABx4ETzIAT7QUtRD49dYATygI9RIwEJIAD7wZ0LHUsdSuAACsCO2aAE3aOBDECaT2IEUcBO4ANsYYAIwFpgR4AgQCAggFkgAAOAXWACGyGAIgBLoQBDoEEUoAAY4ER5oQCJ4UBTYACsYYBSQJyLoUDLAU9bnVsbIYFEJAGXoAAaoMBIQIhR4URPAFShwe4gQhZA3RyeYUJg4MCXIgH2AIoIoAEQgEiggBKAiExgQgPgBTDAmNohQAvAUeAEwUBLIsAToACCIACLgNpLFaABQcBTYEFjpIDpoEAjwFKhwCPAVWBHVoILnNhbHQsVy6HEVGAACyRAJ2HCFeEAFGLAJUBSoMAlZcAVIEAo4cRwIEAIoADZQIsV4ADEwEsgBuhBTIqRVtugwcihgP6ASmADL+FAgABYYAA2YEAIoICLIcAFYEAEwEsgwA8gAAaAXeBAccBYYUAEIYTZIUAdQNyLHuAENqAHOKAAAaAIhUBWYAiD4UB0AFWgADdAmZpgADRgACtBTp3fSxHggVCASSCBM4DcShjgQOGAWaAIkQCKEuAAGYBSoIAHAFGgAYzgAN9AXeHA3eCBYqIGNWACp4Cdj+CI0OBAyiDCZ4Edz09Z4cQboMA6IAAIwd1bmVzY2FwgABBgiKbA1VSSYEiTwRvbmVugRAKhh8rhwqOgx0fhhnFgiFygg6cBi5jaGFyQ4AARAFBggqJhQCMhALxggDQAncpgQqrgAAjgRRjASmBI7MBdIcAxYAEBIIAxYMAZQFlhxUHhAWGhQBzgAQxhR4SjgAchQNygRDRhAALgQIVhQtqgANkhgBvggkMgguXhgBphhtsggJkhgAqgAO/iQFegAO6gQL3hgAfgAITiwAfgRgjhAezAWyvB7OSAhiRCwCAB2WcCwCsAGSBAlSABIyBADuBB9gCfSyYB7yCBp6GBJQEfHxyLogAYocCZ4AGSoIiGYUBWYAb5YADaIsAPYAQZIgAPIIE3wQsMCE9gQOyAnQogB0dAV6HACuJALABKYwK9wE7giHvhh0uBDIpfW+QCuGHB6uDAJuBBsmGCWEBYcUBrvoBmoIOZgEsgA4vmgGimgGAhhxahQlVggG2A3RbMYAO3JMBjoAPdpYDkwFuggOIgAFzAXKAAKyBA5kFaT0xMn2BD8eACbeLADaBAByADu2HADGACLiABzmHAbaAB0GBAbCGA32AAcaKAQKEB/mOBLaBId0BbocEtgFugAS2AXKABaoBPYIEiwJedIEFzAFoggrPiQW/iAQugSXCyQBogQAKkQBogAHngACFgR0OhQheBFszMDWAIfcLODk2LDU5MTc1MTCAIceAIecGMDgyMTkyggxChgJdAWWEBmcEaSxlZYIGKwFDgBVZghsOhwAPATKAGveBIpGJG3gCdDyFCk2CG3+CAKIBboIOdYIBposAK4UUE4cAKwFyiQX7gAl1hwDPgwDsggXUAlssggYlgQCggQzigCm8gycmggBnhQDtAX6CABqCJvEEO3I9eYAB8IAIbAN1bCiAAAoCciuABqUBaYAFxAMxMzSAIsIDODEzgCVbgQceAXSHAEsBcoMTB4ceDoAAUIAAH4MAUIMAfAM9W2mBD2cBXYcApIIBm4YEsgEygCClgQAogAEohQGfgAB4hACHBnQsMV50KYEVpIgA5IEHPIYF/oISe4cAHIAAuIcAHIYhFIEAI4MEcgFrlQRygAHKBGNodW6CHUyADCgCcmWABByPKeiIBGkBfYQA9YAARoMAJgJlZIECB4MOAIAADAJvLIArDI8AQgJmLIAbjoMbOYALpYECRYAALIAgGARldmVsgguogAj0hgRWghXBAT2CAHGAHJyDKpcBO4AZXgEhgBeMAiFsgCC8gx9dAViAACUCZ2WAHocBd4ABroEd/ANkPXaBAA8CZiyAAgiCAFiABs6GANwBfYAKsoINlAEsgABKAyhzP4QAPIEASQFhgQE+Ayk6KIMfnwFlggzGhAAfgAfNBiksbWUodYAWUgEogQphgymgggCNghmigBsxhgytgQBahgCkgwwdgB/sgylPhil0gAIlhSl0gQnqiA0jgAwzhQYiAWKkAbABboEBsJErhJEBsocBggFviAGxgBkzgwGOgwGXggCLgAGaiAHfgCDVkQHTgAETA2VmbIAMgQI2NIAKUIAJSYEBG4MXeowBu4AM0AQobz9wgQFSAXCCAXEBbIQBcYAGBoAADgFZgQFwhAAeAWSBAXABYYAAMAFwgQHMAXCADROKAPCJAHKEAdCAADqCCoKFA1mCA4eBLM2AAPyHKCaAAGcDeSh7gwz5AXCABnqFK/EBcoMMCIQTH4EmZgJhZIAmZYIL+IQWHoAmDYAmVIMtOoQIDIsroYAY7IUegYcBNgEggA2bAWGAGO2DADEEdC5jYYABRYEWxYMR4gF7ggIVgAlwAWSACwOACWOAEIcBb4Eq8gJsb4AJ54AuYokGiQUsY2FuY4ACz4ERHoAASIEADIIK2IAK2gFwgRO9gAJ1gCGugQJ5hALCAViFAU6BCouAAr2CB9EBcIMCwIAA0QIoIYAOPgFvgBZFAXOHDoWDAqwBaIsCrIEF9AJsIYMBUoYsKAEhgCYWixJJiwcqgABwhAZaAXKBAIWDIcIDcCh7ghCWgQKYgQdngy4NgC60gAIoAnR5gAAxASKFAi0DIix7gABuATqBAKwBcoAAWIYAV4ACDocP8gFvhQC5gBoeAiYmgBdhATqAKZUBb4AQeoAQYYUCIgE/gB8WhAALAS2BDmsBOoUAEIIADoMR9YIB/YMR+4ATvoYN8YQB+QIhdIYB74AADgJpKYMAKQFpggApgxgegQAlhR5lgAMAhAeugw4LhAyPhRBJhx7VAXeEL1iBAVaBL2SBAqiACNeRAriEDt6BAECBAKqBByACOzuFEamDA2EBeYQCiwFlhALDgCvxggLDgQCzAmUugQJehwAwhAJeAjtigAAjAmt9hQAWgQCQgAFdgwH7gQSChQEDjA9hhQCGgwA4gAcNgSFZggyDgg8lgQ79gglInAA3hALBigA4AW6BEi6AAAiBAhuFAgmBDbgCLGyIAgKAAk2MDR8EaXBlVIABfAJ1Z4Ar/IUVOgRTZT0iggN7ASyAKtYBIoIA8oAxk4MwCZcFVYANnowFLoEVoYILQ4EORwJjVIAO3IEDpoME5QRmO28uggtxBnNXaXRoKIUCWQYiKT9mPWuAACiKAB0CaW6EAB2ABNUDZj1igSoyBy5vdXRwdXSCK3kBMIQTb4UmCoUCjoIU8gFhjAVKgBAuhANOjAuZggSkhg63AnMrhh2TiArTgQyEhjAbhgnLBW4se2luhACNgBUPgQGHgAeLjgBmgg7BhBMNiA8ghxSRiwDXgSpihACBAWWIABeAHiwBdoADsIgAEoATWYcADYsEWYYFVYACAYcFV4MeRIww5AF7hwa6A2V9PYAD14gA3ogAGwEsjQDqgAApjASKAW6SBIoBYYoCbAJjKYoADwFsiwAPgRE0hjHnlgJyhDJvAzsxPoMsbIEf+gE2gBIpjDHqgC/lgxnHgQF7iwWuhwwWgCl7hQwfgA6agRCLgQqvgxSRiBCxgQZ9gg12AX2FG+2CBFCFAD0CLWmAGDiAL6CFAdKAENaCFaIEaSxpK4EpQYAcFgFlgCvHAmk/hgAZAik6gC7khhZtigIahwbAghO5AX2CAHMDUGU9gDBMgAQLhBIqBm5hdmlnYYABD4Il+IYADgEugAvkBGR3YXKACHMEbmN1coAYTwJjeYABJIAAPpoAI4YEUIMBJQJfZYAqF4AlKwMuL2OALV0FL3dlYi2ADkwNa2VyLXdhc20uanMiLIEACYASiIYAJIABnoAI2AVzL3psaYAALYAAHYMACoQAFwEugQASASKIClKCAbOAE6QIOlBlLGZlOjWAJaSANYCBAAcDbGU6gCewkgk1gAAYjwAVhAEQAWKCAQiTNVSEACMBbYIAIwJtfYcC4gF7gDDYhhYkAXiDAhsBYYA1zYMACYIEXQRBZSxJgQRpjBX3AU+CDDSCAoeAD8aBAZiDA0wBb4IZyAFzgAolgAAQA2ZpZ4EYKYIHAgMhby6RANQBKYcF3oE19wkuaW5pdE1vZHWBCeWBKpyAAEOFAZyTAEGAKN0DfWYujwAXggBOjgAXAyxmLpABIYMALZAAGYYWwgZ7aGlnaFeABYoHck1hcms6MYA0MYAFJoUD7QJ8fJIKI4kJ54IanwF4gwNZAkllgRHTAztVZYADrIEGGwEigQAxASKACWyCCiYESWQ6SYAGwIEBdoAAKoAOPhMlci5NQVhfU0FGRV9JTlRFR0VShAuUigoHAml9hQqIiBucgArigAzchgobgB83gBxQgTMhhQhIgwC7AWuFALuEB8+FBGGFBs2HG2GAG1wCO1KGAMeABCyGAMYDU2UsgwCQAWWpAMqEGveBM2KALF+ENrQDZShvgBhPAixBgwKIAUGBCCuAA6wDdHJvgCoeAXKEAPyCBZqCDf4BQYAZp4IARQFsjAfVigAPggrbAWWBFk2ANNcDbWF4gQJfhQOOAiw2gCG7AihmgRZJggAzAW+ABLiGAGEBLIACEwF2gBZpAUOBAUOBA4OEABCCAJeAABCAAOGDAH8BaYkJlIYJL40GYwFjiAZIAncshwa/AjpogBtShwIUgACVgAKKAXWAGAWjADyABSeKDHeJCCaAOO2IAA+ANQeAAhMDIWkugSVWAmVkiAOBkgDBhQUZAUiCFw+HCVGAAKqDAieEAoYBdIQD6AJ0KYIR7IUl1IEFsYYa6YY4HoAyQoIMJQEsgDZcASyANaSCABaAEfODAGyBOJWDE3qBAAqDEd6CABSHK3iAAH2FDT4GVW5rbm93gAnTgRVFAiIphQfVhAKEgA33gAlQAmNrgA7qgQmMgAMtgisFAW+JAT6CBKMDZCh7ggBCATqrADqAAXgEYWRkRYECEQNMaXOAB66AATwBIoQAQgQiLCh7gQpOgAhXhgvFgwHeAXSIAyMBcoQDN4cDx4AHKoABN4ABR4A0W4AKC4E0WgImJoIFcYADIQI9U4YEWgJlPYAEUYESN4AMUoAACgJkZYABjoAHe4ABZwEohQQbggF5gAQFhABbgB1WgABWgADVgQBUhwBHgAPRhABHgAAKiQBHAil9gABxAXqACGUBQYULsogCZ4QCEgYpO3ZhcnuIPIkCRGWKPIoBVIAGQYc8fQJWZY48PgJXZYM81gJNZYQ81wNCZSyDAC0BRYAJkAdnbG9iYWxUgQtOAlFlgiyRgDZSAjE4gBrvBjgsNyw5LIAAEAgwLDUsMTEsNIEsuAEzgBN6ASyALL+AAA0GLDE1XSxLgwIoAUSCKIwBaoMADQFUggANAUyAAE6LMueFKeoBTIAMHoIImAEsgCVCBGU/ODqAOv2FABSAGByCAPECIE6OAD8BMYUm9gFOiwBAAzQ6MoMAMwFahgB/gCiiATGAAKaANyaAAMCELXCDLWkDLDQ4gASOASyAFUgCMTKAABkBOYA3MwM1NiyAPJ4BLIE3ZQI3NoAAFIA3I4AA24AIPgIyMIAALQMzMDeAADUBMIAAMQY2MTQ0LDiBADMEMTIyOIAAKQE2gQA3BDI0NTeAM4gCLHGRAH0BNYAAfwE3gQCBgRjzggE1gQBWgQCKgAB9gQCNATCBAJCAAIGAAJMCODCCAJaBACiBAJoBNoAAM4EAnoAALIAVvIcvEwEkiA9rhTvlAWmEHVSCCFGALYYCIGmAAniBDcqACJUDRGU/gwKogAGjhRA8gAQogS4tA09mZoAGaIQADQFMhAqKA2Y9cowAP4AKU4UZUYADpAErgApahABPhTyrgBX7hwBPASuBAJiBDYOBHvOABsGHBFUBRoYbbIAZ2YAg1QEouQCoBCkuZmmACAaAMXmAOlOJG6gBR4ADVoQOhgV7YWU6S4ANl4EFk4ADrQEwgBk/gAAFAWiCABWABHGABmqBAAUBeYEABYAOGQQiIixigQALgASEAzAsdoEABYAEpIM2UIgFlwFKihyggCiMAXSEEA4Ce1OBB5qABLSFAR0DKSxDgRQAAViBBI4BUIEATwFfgQAFAXiBAAUBUoAABYgAVAFZhwgSiQL0jjqDAj0yhCg+giwDgBklgAAHgCfcigMlgQwoiDechyBrhAKdgAGRgQMrAWWAG5aYKdGACBqEKYmACFyEKdMBT4AAX4AIRgF0lAA6hQKSggAsAVWGAEABSIYAQAFEgC90hDMngAMrgwAKBlZlPWl9fYcC3YAFAYcXKgRSdFstgjcOBmU+Mj85OoA3m4Am8QIiIoge8YQ+6oEFzoEXsAE9iBDygAGAgwAUASKBDCeDBr0PICIrdCsiICgiK3IrIikihQEaiR5+hABShB5+gBfkgkBfigFigCJvggFigjwPBDF8MSaAAwCDQNmFAWqIHl+EAFADZS5XgT0rAU2AADiBQPuHHlWEACCCACiCL6KAFqeCABSBGF+BKsmJHmOCABmGKkOCKuGAJMCCDp6AADqCMX8CQmWAJKgBRYgfN4AAeIAuWoEAK4AYCIIADoACMgI9aYUAX4UAFIA30YAR54AAOgMrPTOAAFMEaS0xJoIAV4AAFARLZVtWgRqpAytndIAAOwIuUYEwtAdlLmplW2N0gA5mhgARAkVlgS5rAUyIGPcBbIoBTYIA3oITSpEApIAbHYFAMoEACoEAoIYADIAAmIEEBoMAmIIAjIAu6ZYAcoI+4YcSgwRDZS1tiAFtgACwiRmjgAJbAj9XgTmyATqAAAaAAA8BK4MwcIgaFAF1ggAxgwOYBHl0KzeAD6aBA/GAAMUBKIEACAEpgCbwA2k9TYAhmoI5V4A+4gFrgUCkAi9rgQHFgQAqAzgreYYEHgMuLi6CBDsEMTUpLIIEKgdOZTo0MixagQQPAXGFBGgLLCRlOjMyNzY3LEaBBDYBR4EEQAFKgQi6AVmACF0BLIAQ74QDxYEAJAE4gAithgARgT/3AXSACTsBV4YEf4QAIwJudIEKjwF0ggBWAzgsTYEAbgFvgQATAWaBAAUBc4EABYALAgIwLIBFBIAFIwJ0OoAv3wF3gQALAWiBAAUBZIEABQF5gQAFAWuBAAUBYoEABQF2gQAFAWeBAAUBU4EABQF6gQAFAUOBAAUBWIEABQFQgQAFAV+BAAUBeIMAmwJWZYAjWQFTgAI4AyksUoMAEoAAm4UAEgFBhgC/AVCCABABRYEAngFMgQAFAkl0gQWjAUKBAAsBT4EATgFVgQAFBkh0OjgsRIUAywFUgQATAVaBAAUBV4EABQFLgwD5BEVlKFiADJiDBhsBKYAMhwJwKIESIgMoe1GBAEwBTYEAKgFCgQAFAUWAAAWBFuwBaoYANwMyKnqBAIWnADsBUYMAvoIAOwFDqwA7BEt0OmSBN9IBaoQACAFMgwAIiAYSAXeIAnqwBhKAAn8BaIEc7QNvLk2ADB0ELG8uRYASG4U9gQFvhgYTiAMcgQAvhQc2kQC2iB0phwAqggZUgAfngDPkgQAKA3R0KIIht4ABu4IyH4keA4M0UoEMzoIL7AF0gBGGgiqIAnJ9gxoggwDrgANMgQ46gAMsgUU2gglQgAFgiQFdhzopASCBQAoCKXSBQ6+ANO8DXSsrgyDzhQA1hiBMhQA6gAEdkABQgAEqiQXeATGBQ1SEMVsDPW8rgDYFgDZJgAXmgDzXgDFihzPUgx8EhgGJgR8EhQY0gTqLhAjggR89gDROAXKAAJ2FAXSDAP8BboUA/wFlgRdYgkCnhAMKh0TNgyEFhQBxgQCnAW+HAHEBb4c27QFygAXggD0lgTOLgwAKAjtugC/YgAZnAmU/gAbOAWaAEQqAAcSFABOMCA2ACB6BCA0EeXQ9OIAD5IAFYgFigB77BzU4LG10PWKBBM4CKzGAA/GAAAuAA/KAABgBNoAD9AE9gQYFAysyOYAD+gE9gD4xBUN0PTE5gAP8AT2DA9SABAGAO5eABAKCAC4DeHQ9gAUiAVKAAsIDIm5lgRt0gEmBgAIMBWFyeSIsgUHVgAycASCAFX6AAA2AAAOAAZCAFY+CDmOHAB2EAA+BDeSGAA2ACjOAChwDaWNpgA4SgBrPgEGdgQBPgwowhgAlgDlpA0F0PYAJWAFMgAFdAUmCAAoBToAACgFPgw8rgAD6BTE5KTtPgCLLATaABxyAABeAQ1kBXYAA/4EACQQ4XT03ggxOA1V0PYACtoIDyoQBa4UD8AI4OJACkIIMoQIzPoAQZIECDoECB4BEbocAHoAMPIEyjIoAIAE5iAAggAExAjsygUAIiAAgATeJACABOIA3LAI4N4wAYIgqz4AEWAFIggCyhACmATOABIqCAKUBNYAAGgNEdD2ABFMBVYAGmQFUggAKAUiAAAoCVnSHK0mFBF2LIsGHSVWFAm+AK+uAB6sBP4EG/oAACAE6gECdgALxgAgbgAgwgEK+gQL0AXKAOdgBfYACRIQADYAACoRFsIUOJ4AEoIsy1QNyPj2DRb2WBOaEAH2AQ8aAA0yDAH0BcoEAfQFmggT2ghv/gDklgDngBCtvLTGAAE4CKXuAAvCACDmEG0uGAvWAASYBcYAO+4AA/AFXgAD8hwR3hACagA4BgheJhkbSigEPgQgxAW6CAQqBAPuARlUBcoBG/oAAh4EBAIgAKYEByIAA0oMAKoQBWIBAiwE3gCU4gghkAnI+gAIGAT+AAAQDOnIpgTfLAW6ACHCGBH+AOEcBO4AAhoQKYYAN2YEIn4EtG4RCXYAEjYgpUwEpgAKd0wHA/wGxhgGxAVqAEN6BLhOGBkoBTYoJ5AElgAqmAjIxgQuohwZsAUKGCyiAAGmGSTcDdHx8hgAMAXKFLIQBMYQCnIEL6oA2RIIK84IdnAEmgwtWAiwxhwAtASiBGziBJUgBPoEAHAIyMYEOwQEtgwALgAXBgBmAAixuhwAaAW6GABoBKIEMJgM2fGWBJDGCSZmAQ+KAAJuLAVGDAVCBAEWBAGQBaYYkdQFlkgBsAT2AAQSAEnSKAFqCAkaBAZsBNYAAJYAehgJyLYMACoMAZIYKpYAlNgQpO2RvhgB/gQG7gQCRg0jhhACAgAGjgDvTiUZ1BCl9d2iABaEDKC0tgA/cAWWBAICCBrWCAIiBEvOEANGBAIACMTaDAH6AAAiuAGWcARWNAHmFLFSJAQeBBbqACO6RBbcCNTaLBa+BA9KDBU6EA0CHTleJTs2AC/UDJnI/h07HAV6BDe4CMTqCAAYBO4IFiIEACwEwiTBbiAKvAVGAALKADM+FAo+AILaEACgCMDuHAo+CA3iJHA2BCQkBaYEuMYcAFQFlgCbHggJDiQPkAXKEBJOAD2+CTu4BRYEEZoBO7wFlgihlgE7vhAEjhyZ1AV6FAi+FAKEBS4IDUAIxNoENTAFSgEn3gg6TA2UueIABaIEABoINi4AasQEwgSL3AVKAApABOIEkL4sAJIAO/YA5IIAAHgItPYknEwFqggBaggA2Ajg/hwBXgwBIgAm3igBGgAebgEW1ggBFAzEmN4wAfIcAVAFMhgPcggBGAzE2LYA5zoIALIMPBoIADAF8gUfQgAAfgBLNjADNgj8qgDPBAlJlhg7fAVKBOeGAR0uAJPGXAEiEACeIAN0BToIA3Y0KEAFLigoTgg6wAXSBDrCIBZuFACsBaowAK4APUZUAKwFRhipKgwArAlF0hgArggBjAV+DAA4BMYEwJYElYwFzgTrsgg8ggABkgAAMhwC2AVqGAT+FKnWAACMBeIAI9oFLhoIACIMAEIBE6QZ0LS1dLCSDADCABHWIKp4BcYQARYlJi4MAkQE8hA+fgBGzhACigz6tAVGAFuKBCw0BPIA6bAFyiA9hhABfhhDSggB8ggzIgDtzgwd/gE6jgAAXAVaBT5KBTq2BAAmAAICBFA2AACuBOtqEAAqBAAgCUnSAIceABDQCLCGCACOBENGIABsBKYFKa4IAYIMAaIAAGAFygA0WAWmATheAA8iEABqIEbwBRokQv4Mk2YADpIAdr4ALaoATF4AS5IAk04IACoAXggFsgArrggCwgQCjgxC/A3Q9WIAA24ABpAFzhAT6gAwWAW+DAQ6CArMDdFsrgBEIAVaABECASYCCAKOBAIGAA2iCACWABMSEIAOACA+AACYCOymBHFaIADUHMj5sPysrbIEP0YAAy4UCAIAARYAHSYEAgAFmgAHBgSZ+gABrAXOAUCMBZoEAJQFFhDxQAXSBE82AOqOHBhiBAFQBL4AXR4EFwQI7coBCkoIBmwFvgSVMgDTbgQYyAnI9ggI9gQATghHGiAI2AS2AA1IBV4EFCIsAD4AOeYQAmoQA94BKiwFugQAIhgCogQPwgQD2gQNmggiZhAAIgQQjgQAYgCvcgABEgAA8AkJ0gABEgAA8gAAIgRLHgwKqgQHqhACngEKbgwahgQDIAT6ADxaDAdGFAIqFAK6LCTCDAdSAKpGAQpaDAdoBYYAABwFPgSPIhQHhgCr3gQAKAkhlgDPbggAKgBl8AWiDAAqAGWmBSiKBAU+BDZ0BUIAAdwFvgg2YA2UuQYENioUDyIADTIIDUYAAiIMB1oIKYwFXgA0uAztYdIUHFIYC+gVvPWxbbIMA6oEALoEBAAE+gSPMgA/RgEnKASuANVqBAB2AAEcDbyxhgApmggHfggBvgURJgVUMAz49d4IkywV1W24td4AYlwFzgABRhQF1CWZ0Kz1zKihvK4Ad/AFjhAIaggASAWODAFWAABiDMZeAAqqAMB2ECCeAAHuAAtyBGWqDAGoFOylvLS2AAWCCAA2AAmSDAAqAA4qAEI6DAA0BaIEAFwRkLT0yhAGVAmQ+hA0pgABLgQ8cgAEogAJigQARgQD5gwBVgAAXAW6GAuQCLS2AAQuAAOCBLDcBbIMCuYAANoIAsoEAxAMoby2EABYCKSqCAAmAAN6EABGACr4CLG6AAF2CD1iBHz+CAfODNn6CBGSCA8eAELGBREaDAIIBMYIBvIMHSANmPWaAD/WAOsmCD/WBAnMBPYBGWoAAJ4NSZYQK+IVAeIMAc4EAu4NUMYAAD4ARcIAPdoBBl4EBkYEvBYAAiAFvgAfGgAJWgQDqiRioiwT8ggCYgA8vgQ/HgErGAUWAHR2AAc8DbD03gAKVg0LzgAGCgQPPgExBAjM4gAAVATOCQ/uBFZKAAPaDBs2DCBKEAMsBaYNNyYIVUIEATwYoKytzPj2ALPwBaYA+MIEm7wNhPnOAA3CABkyCAUGAAggBOoAAyQNpPyiAACCAAWuIABqBFWyAAA2ADyyCAA4GKTpzPjEwgwA7gA8uggAUgAOxgQAOATeEADCBALsBb4ADqoEAs4E7s4UAsgI6aYQAEQE2gwAPgAAKggDgiRIqAUqNARiBARaBDEqDARaBAuUBc4AANgFsgAEWgABfgi4uggBgAWyAAFGGBzqBTUeAAQoBYYJNQYE7JoADMIEARAFhhAENBCsrZj6BRjwBboAA7IIJmARsPmYpgALwgghfggDMgAMRAU2BBmaDAAuAAmqEAsyAASQDLS1mhB81gQK1Aj8ogABFgQKpmAA8gkfkgBPnhQAhgQFLhQAigQAMgQAjggAeAmYtgB1dgC18AWaBAWKIAFKBAWiGADGAAAyIADGAHZmARyUBOokALYABh4YALYAADIoAXgEzgQ1MgAFEgBMOgQGfAm8/iAE/AjpuhAARATaDAA+AAAqCAWmJFJoBWYYH/YESoAEpgwEyATCAG/WAApCCCfGDCXSABiWCAAgBfoEWmoJXUYEcuIAX1IAAl4AeiIAk1IEAI4IZEoBYy4YAXoAf3Y0DFYEFoIEa2IIEloEI1YEBqIRD3gMuSXSAQMeBDX2CRCaDABCAAeOAT/gBOIEVDYMAEIBC64ApdAEzgQDvAm4/gwpBgwOrgwAIgAEfATqABJqAGOSACBKEAB8Bb4QY7YIAJIUADYIByQE9ggSvgTabgQONBGktPXGBGWGDADiBO6SCBH+AAmyAGG2ADaOCABeBE6KBAEqCAAiDAEWAAJiHAEWADiwBWocARQFugQBFhQJuAXOABxqAAPIBO4QAl4EJ6YIAk4EACYEClIEM7gx0cj1be050OnZyLFqBFbABcYEABQEkgQAFAUaBFboBLIEAHAFnggAcATSBABwBNIEAHAE4gQAcATSJABwBNYEAHAE1gQAcgB6jgAAdATiJAB0BNoEAHYAAGIAAHoAetYAAHgIzMoMAHwFTjABYgwA8AjE2iQAegAAUgAAfATiHAB+LAD2DAB+JAF2AHv+JACGAABWAACGAAAaBAEGAHxqAACKADbqKAEOAABaBAESAAAeAACSBFHuBAEaAH8eJACWBFNiAACWBAAeCACWDAQOAH9gBfYARv4YcgIIp/YUaIwIqZYBC5QI+NIAcfIA+OoccdoYCpIUuRYIMJwVZZV5yKYACgwFKjQ1hAWmEHVmAIgSAEmuBAA2BAAqAAAUBeoALJQIrKIIaNIAR14QWPwEugDUkAXSAAEcBJIFK9gIudIEIOgFngBZShhrUhQASgB1WiTrHggC4hAAeAUeBEiiAA+OBH3CAABKAF4uAAAiBABUBKYAWXRR0dC5CWVRFU19QRVJfRUxFTUVOVIk65ocq/oED5IFWKoNLfIEMWAFHgCM5gA6BASmBClqBAKuAAG6ASfiEAAiCExIEMDpyLYNZmoAA64sALYEA2IEALYIACIcALYgc34YeR4USrANlLnWGHCYCaT6BCO2ABLaAODyAIPGAAD2AANUBdYAOcoBCMYE/O4EKfAFhgQFbAWOAA4iANh+BCK8EZ2UuWoAgVoAyHwE9gRIUgAAIghiogBLUhiUggAAJhyC6gB1NgThpATqAW8SEAD2CCHOAAD+BD8alAD+BBNcBY4AE14EKqQF3ggAIgD9Ahx0VkQFhgATSglT3gApgAXSACrMBZIEABQFogAG5ghAbggl6AWiABUKCAAkDZHQ/gBRRAjotgRKZgBj6ggmAAWiBCMABK4Ic/YAAsYIFaYAm34EMBYAAB4AhswEtggVrAVSADAaBDRMBaIQACAF3hAAIAWOBQUCBAGCBJ7KBAecBaIEEo4EApwEsgBphgwFwgFglgQFuASmCE6CCJoYBPYEBr4AAFoMAZYEANYAMmAFkgQMXgAANAWSACaWBAuKAAAiCAGABPYAdE4UJNYEAgIEAFYQNLoADFIMDCoECHJEDIYEU84EAMIIAoJEAIYEDQYJTnJIDOoMCn4UDM4APQIIA8oIBN4kAngQ7KTt9hgxDBGR0PG2BAXCBBnCDAPiDMbABUIAO4YABooYBv4IAzYIA94AAooAAHYAQi4EAzoABxIACGgI+doEAswN0PXaAAU6CA4qBKHKBCpKBACsDPXIrgAZ2gwA1ASuEACmBAAmAARqALLCBAZGCAgkBUIECgYQAU4EADocASoMAKIMATYABbIkHogFhggJigQj1gBuNgAG7hBJxASGDMMyDNYOEA1YBIYAVFYBb54Av+oAPswI0MoAKyAIuToAAcwI1N4UACgI2OYUACgI3M4UACgI5MYUACgIxMIYAFQIxMYYACwI2NoBR5YEAC4gfeoQFA4Ug24AemYgg8ogfcYkDHYMAqYIXp4ISpIEywoEnoYAq5IMBIwFwhQEeAXCAARmEC4WCAv0BaIEBIAFkgTqSgAhwA3Iub4AB+IICloEBKoIAEIMCngF5ggAQgQA/AS2CABgBTYIACIEDdYAAC4IxQAFvgQBuAW6KOswBd4QAy4UFr4EBTAIucYAAL4EABgIuR4MCp48EMoEAi4clLgJudIBMZoIAcYFfYoMACIk7MIkAZIQ0fYECgoIB2oABsgI+NYFZFodf3YEBSwEtgA70gRRggQD+gAAegQK7AXWAAJaAABABYYAAEIABlIAI/YIBn4BQE5IAOoID5oABSooAGwE1gz+mgAA7AXWAEVCAAAWBASGACvWAALOCAmOCAbGDBCGIADuBACgBeIAAKYMqZIUAXIEAj4AHYAR0KTw9gAAHgAcskACLgwBwiACuhADJkQAmATSABaeEACWBAAmCBa2BABABPYACjAIpLIUAHocCTwE4gFoUAi5YgFtFgFIMgQohgwTHA24ueoEQMQN8fDKALLcCU3SABliAGeeBAAkCMTqCAIWAAAoGMjozLHJ8gU4PATaDAP2CBS2AABKAYXeBBSMFMzEtciWAYNuAAuaAOPWCAouEACSCABKBAgeBFHeAD3SBAA+DFGCBABWCBiqAAisBMYABWoMAtwEshAFQhAFijgFQgACyAjU3hADYggSSgwJpgR7HgApvAiwzgBOoggAJAzEzOYQACoEiA4ACmQEpggANgAEAgAKkAUqBANwCMCmBAQ6CArKAAOCCAA6CBC6CABQBWYEBBwE0iwAUAWWBB7ABOIsAFAF0gQAUgV2wgwBsgQPOggAYAXKAAQWCABKEAA6GJMyNABaDT7eOABcCMjSIABcBOYYBho0BqwE0gAC4jAB6AW6BEp2AAKGBAUGCAMmDFq2IACIBaYoAnAFphwCcgwEpkQPCgQRGggGQgQAjgB4WgUx5gAGwAjY5gw4FgU2SgQBRhQCNnQAIpADRgQBtogIWggMyggBVgQLugkoTgQSQigEHhQd+gQBBgAMLASiDAoWFAREBLYEA14MUbYEAIQErgBhWgEc7gBnHgwmHgQANgAAjAU2CBISABWGGARGDATIBWYEEGgFVgVA1ggAVggAvASyEBSeCABqBCQOcAMOCExeACcwBfZcAX4EB2oMOL4oAXYAW3oIBKAI3M4EDHgI3M48BCIMCvoYACYZKK4UEGIIA2oMJgoIAwIIAwYIAQYIAaIAAeJwAvYAV5IAtx4QAX4BfZoAA8oBTUYIByIkQN4AIZYUAUYkAuQI5MYEAuQE5gAnQkQC5AXSFALkBdNsAuQF0ogC5gwCygAf3gQCzgAAHkwC0AUeDAIWCAa6BAtoBaYEDU4sAi48AjIYDpoIFGoMAhYMFOoUEPIcE7oEAfqgFM4QGRIIHFgFugAmtggAJgACUggiphwYkgAEOhAOaAXaBBaiACaCCBkMBeoBUPIsfZwEhhBiagAMhhQbcAWSBAOOCC9uDBw0BZIAH0IQAHYgb8YMe3oIFuYAjc4EWCYIpI4IKyIEKS4IKxoAL/YML1IAKq4QRCAN0PWuBAYCAPdyCTfKCA9mGAFeAZlGCAFKAC7uALk2IAHCDADQFMCk/PzODCr+AEEmhAE+FHxuCO/qAAQaCAeaOAQaDFz2JAQmCCziAJC2DE1CCAQyFABOCB6OIAQmHATeDDFKIARSBABWBC5KBFIKADNiBW2mBDgmADDWAByeDDCuAEaeAEqkCKyuAE3WLAAiAAXSBKwSAATsCYnSBAxmEAsOTAC2nAAgCbz6BHvWBAJ8DYnQtgBZ8gATpgQAOgAqCggH3ggAaggDMhQDHAjxrgAEunQHdghxwgA3lhAAFAXmBA9KCK+KBGccDeXQtgSpGggAxgABcgAAdggA1hQALgQEqgAh7/wIegElLgQQ5AVOAEo+AHRGBABGBADUBKIADOYBjwoACOYEJ5oMDq4ADbYIDHIAAGIEAHoYCDIMKO4IAJoIDs4AAJYIhJYMfFoAAB4ABS4EMA4ITAoAxVYQTVAFEhhMNhAAKgRNYhQwngFfMATWDDA+AFK6AB+qCSkyBB4CAAJKCCBKAA+CCAI2BBA6CAHsBaIMH1gF3gwAHgQEtgULqiwrejwRchAARgQrHgAkJgQqDAT6AFbaCBDaAEHiHCHmWBNOJABOKCQyEABSKCQmDAEoBd4cASgF3jwBKggATjABKggAUhABKgAJ1iAqUhiLzkQqbgwD9gwDVggEkgDNegAgGAVqHBW2BCf0BKYA5q4cqG4UOeoIMqYQBMAEtgyKEgw54gmROAU6GEdUBdIADHQE9gCovgD8HA3Q9aoEACIAwXoIACAFXhAAYgCe8ggAIgChMhCxQglNqgChVggAXgCflggAvhh94gSFrhx9bggAOhh8+ggAOgDOnhC1sAXSADYeCABOADeaBAAcBQoEgcIAGUoFaIQItM4AVOocqvYsNkIIWWgFQgy9wgAO8gCTVAi5rgRmvgGjYgCrYggAVAT6CEY2AEnuABLiCAAuAFY4BYYITBYAcXYEQo4AcWoIEGoAV9gF3hAAKgR7MAWiFAAyBYMGAHGCFAA6AIvyAAGSAKpsCLkOCHwqAIXKADHwBc4UEg4EAfIAEgIYSSIQRHAFygAA5gBvKgB+OhAAOgABVAiE9gHAKgwAQgAAMAXWGAByBABoCdymAMdQDdGlugBN2hiQ3gSKHgCoBggBggADdATKEH5UCPmyBBaGCAJ0CbF2BAyGCAEUBbIAcHYBmh4IEOYAeYAFugBlVgwYagCh2gQEpgAOMgBl3hBJGlgDshRGJgA2eAWGAEdIBY4AlcoAAboIZeYduWgFmggD8gAFigC6mAWaISWuEAauEG/eEGKaEBrWFGEyAEdaABlqCA6qCEeEBYoMT6IIACogoGIACrYAWIAYzNjI0NDSDKYuBH5QBM4AmsYIkNoEx9gI9MYENiIAkIIQOqoUh8IsG64QAGgE5gyEbhQAPATGAGtGKABABM4kAOoMIZIArZQQyO2d0hCSniABMigBmhjJ6gC5egQN5gBbaggZ6AUuBEnuDAAsBaoAACwFziADcggBeghyDgQBPggAsgBykAikshAATgANVgQA0ggAThABCAUyAAEIDdD1DgAeIgnB4hBSPgBpjAVGBAI6CHQmABt2IZriBHaoDMTQrgGHIgi/egSiwgQS8gAA1gAAaAzMrN4BrboIDPIAehIQADoBtloJi7IICUIEhzIAZl4AZDQE6gAAGgBMeATWAHwuAAAcBNIAaTgE/iRqGgBsughq3gwYigxqKghpIAkR0gCruhhsbATSDABqGAhmFAhUBaYIBC4MZYQEtgCmBASyABQ6DGbeACHKFAAwFbi00LDSETpeEJpiHG3CAAQEBaYIBAYAAYAE7ghy/ggFUgRfYASyEAA+AAVCAAE+CUu6FAWyAH9uEAWOAAAqAGrWEALWEAY8BaoEBx4IkZAEsgBb4ghtZhAA9hBVugBQQAXeAEtiBBeCCCCmABruCBI6BBbeAAsqIEk6CB8+HRZqDAyKCEAOGFdoBcIBkXYEQBwE6gkKBgRpVAmJygx5UhxkbAW2LAEeACP+AN7CIMEKACzWOIy+BADSBDj2BJWgBQ4EcG4IdvYQVVYYErgFigTTFgiViAjQygQIHhACTATyBccuBABmCAA4BLYBZqIUWPYAA+YAOo4AVeYIASIInPYYADoAJF4JqaoAj24ACbYIq04MXR4EHpoJ1BIAABoBC1IcAMQEphASQAmY9gQkggBKkgAfAhQAdgQEnASyCAm2ECEWAITqGNcyAZaOCIvOFAA+AbQeABBOBJwqFABKANL4BfokAIoAZlwF+ggAjhQGmgQHdgGyqgjAtgAkVgRjLggB6ghTCgAAIgBTFhAHygAD0gAi0hAAVgBeXhQEmgxfEgAALgRTOgxfXgQAIgA9NgAAvgQBYhxeoiwBYghephABOgQCkhABOhAALgQBOgA3whA4EgB+2ggnZAXOBCo2CARmAQE2BAb2BHKCAAdmEFqEBaIAL7YJNeIIYZIEAGoMA0YcYjYIAFIMYYoEk1wFsggvnAWyFF5aPGIiEARKEAvSDAJuCGeaAAAgDY2UtgE0VgQDGgQsagFMUgAA2ASuBAnOBAAuANfuBABCESgqCJweHCIiDAD2CGXqJAKCDAFyBAGaBAqyBAFeDAMSGAI8BfYYDZ4dZwIIYFIQAtoAX2IQZPoEl4YAo0oA75IAH+oIKi4ECf4QFNIQCtoIAYYAADwF3gQONggLphAFFgwCLAnVlgQLIgQAfggf3gwajgRm0hgFErQFjgUYkhQDQkQFrgDo7hgNShAN4gQNQgQNOjhntgRHugwF5gRrnhAF5gQALhQF5gxibkAEcigPrAWmGBCMDaSxigROahwBHgyZmhQPwgAMlAT2ATUcBKIBwEIIMxoIHcIwBUYAuVAFugQY1AXKBAEWBBhmABHCDA9OJACaBA9+HA9eEGZeAMyeGBUiBAw+FA6CCTcCEAcyBAdeBFSuISvSMF6iLEBmEGkiNDw+CGlqeDw6BZKGHDwuBBM6DBh2CAamDNF+CAR0Dcjw9hRv4gg4XggqrAXKCAX6CDoiAJlubDoeGFMSEAnoBVIQOjQFugw6NhAGChAAWjw6Vgg8HAV+ABVOCANyAAB+ODqiAAAeFG+SCAICDABCMG8aCADaCG+qDA6+AAGsBLYEGIIURCIgA/4kjiIEAKYEPm4EAJYISFasPEoIEsoEcP4ILqQE6gQAKyw8khgIqAVP0AiqBDDaFAY2ANdyGAcmAACyAAOyFAkgBa4EsZQFfhBFzlQJTASyANLyBABCAG+yDCaCFACCCIMGDAGuAAU2BAgqCAhWAAgyCANuAHQCCFA6MAoiCHbSABv6CCI+CeAyCAeqEApyHCJmGAP2DGk2BAFCCKumIAC6KaAyFHZKAAquCAhmCAPmCAJ2KAtMBMYACPIQAGIoC1YIBGIIAB4AGMIACgYErboEG144BW4sCh4EeQoQA7oIBj4UBYoQAqKQCmIMCmYIeD5IBL4MAX4IgYOACvYEKBwF6gBs3BDUyLEOAK/2BOZuAe5oCPT6BSGkDLFhygCT5iVvSgAIEhwAhgAtoA1ByPYBDp4EAEgFXgAI8AV+GAA4BTYAsUgFQgFo+gTqKgEL1gA7GAV+EAA4BMYA9D4RDyQN4cj2ARBCFYoSAHKGGAEkBUpIAGoEAVQF4hQBHgENEAiw3gESngENpgURNgAAzhQBggUS0gEPNgAAFgENggwBqAUGDOmaBQ7aAOnYCWHKAEWaBRPuBWS4BSY0AG4AmQoIAGQJPcoE4UAF4gACOAVWCAAoBUoAACgFIigAtAUOAYmyCACsBRI0AF4E8vQQ5LDQ5gERggAAfAVSCAEABUIAAQAFWggAKAV+AAMiGBDQBV4wLcQIlMoALcYABfQE2hwRXAU2UACOAJUGHNQ6QHk2CB4WAIymBDY2ACguBDYaACPqBC5qACiGAUOSBBxWAYQaCMduAQQKAUNiBMW2BAAuBZtwBc4AZgoFm4wFygBCvgT8JA24uYYAaRAExgA/DgwAOAWOCAA4BcIAAIwFDgwA1AXmAAAsBUIMACwFrgAALAV+DAAsBYoEeVgFygG3SAW+AexeAA0SBH8YBdoA7dYACq4AKiYANigEpgIKbAWmBAA+AI+eBPzaAA1oBeoAABAFDgAAEgHwxATuAgymDLKGAepECPmODBUqBNleFGSiCBSKAU/kCYSuBLv2AGNoHPDxjLGMrPYNvWgFygC0iBGEmaF2EBYMBQ4Af6QJ3coAsdIAP1ARDLGMtgAAFgQATAWiAAckDPT1DgFKAgBCagDtBgFTChTalgQ/4AjYmgAAbgAAJAVOCABkDLEMmgTr+gAATggCWAUORAJUBe4B+94A0UQE2gAKcgwBIgDQwjwChBFMrPWGAFP0DPDxDgQFKiACVgzXmkwDwowBbgwD8AXeAAPwBZJ8A/IYA4QF6zADhAXqWAOGDBKIBU4ACaQNvLW2BBKEDej51hRmgA3otdYIgjwE+gFByAWKFQ9+FcMkBZIBKHoFGS4B6EANvIGaBDsOBSYeAFMGEAI8BOYYAj4MHRgFrggC7A1g9cIAjrYAsK4ADIo1D5YAF/AEphAH4A2xbWIAAB4FMbIITH4AARYkALQFykgAtgAZDgEX+gADHAXqGIQgCcj6AAHaAAHMDK2stg2jZgCQJAS2CJVCANVm1AIKBEpUBZYASIoBuuowALYAAWIEG1YEDLoAjMYAAe4kAYAFrlQC1AWuEALWCALaDASSAAK/eASSCAlMCdD6AOLyEACMBc4IAI4B1P5cADoGC+wE7ghUBiwAXAT6BOTGKABSAB7GCAM+BAGaCAHDaAGuGBCICNjSBA0GUAqmBQAuSAqGBA6CBA3ACKyiHAyWARJiMAFaAAAkCMzKBAAmEAEIDMTkxhgBCiwByAWyCZwgCbC+DA6OZAHgBdZEAeIQI6wFngQ6QA3Y+b4MqqwNQPWOADcEBO4AtAQFQgQO5AVCAdWaAXBqCBgIBY4ED1IEGYIIOHAFkgDP/gAAHgE6VgABBCT9nLWkrNTo1LYAtOgFngQjJAXCAF48FPm8/di2ARoMCNTeAK5cBN4EbYgF2gRh5gDeMgQQZgRmRgDgEgABuiStVAUWJBtaBMdCAWBEBP4AH4gI2OoAABQE0jUV1gAk0gkV0AnBygCKvATGAS2kDeXI6gGgugkV9AWuCAAsCYnKBSfqBAAUBdoEABQFngQAFgEnMgBOMAVOCAAuBAAUBWYJFNIGKJQFsgQAFAWGBABQBY4EABQFDgQAFAViBAAUBUIEABQFfgQAFAVKBACMBQYCE54VFsoAAhAFJhgAPgUBDgAhIhURCAW6EP6uBCY2HREABUYBQJoEIZIFFm4AApYBFAoEACwFEgQAFAlRygBN7hwEOgAAqgjplgh5UgC+VhAD/AmhygAD0AXeAACsCLGSAAI6IADABS4EAMIB3LocAKIAJi4AAKYA004AAXogAKQFqghnShCzoghqBgX9TATSAX0CFGnqCO3yBAA+EGnaChSKFGnCCCkQETHI9e4AAsIABZQVWcjpBcoCKugI6T4CLaApyOkhyLEJyOlRygE6WATqATRUBUYAABoAVfwFLgQDgBGpyOjWATP0BTIIANwFOgQD9AX2AAAeDAEiARfcDcjpJggBIAVWCAEgBRIIASAFWggBIgEKOggBIATaBAEiAAoeCAEkBNIIASQEwggBJATGISm4BWoICRYVctoEYHYMCUYGAKgFjgF7dhHarFix5LGssYixtLHYsZyxTLHosQyxYLFCAhrGFQkyAHNoBeIkADQRSPXM/gABsAkxygzKQgTz+gA09g3/0AV+Af5WENHuDMqWDMqQCX1uAMp0BXYFExoEAGgV3PWkuWoAQhoAHbgI7dYAYZYIOCAFfgIBBAjt1gRdjgAP6A3c+dYAEeAJ3PYBsMoAAGwF1h2tUAU6AKoUCUz2AAeGBPimAAEWBdJ4BU4MACoAUfgFTgG2/AVqAA/eAAxKAAR6CAGwBY4A1AQJ1PoA2D4IAY4F5VoAAj4MAGgE+gTZLAnc9gGp+AXCAADOBgLqHAMiAAIQBcIE5OgMscC2AADcBbIAwzQI+cIUb8oJ78QFwghw3gQ3JgHmZgBpqhhwQgwB3AXiBAI+BNOGCAFWDAFQCeFuAhNYCXT2AAAcCXSuBAFSOASaBEfSAASeBGBkCW3iFATIIXT1hKTtzd2mEUTYCY2GBM5kDOkM9gAXnAixQgHTEAUWECbIBO4IAGgExgAAaAlIugAItAViAAAcCV3KCACIBUYUAIoBabwFhgVQTgQAjAU2DACMBQoMAIwJLcoEFeQFrgACygACQgAC2AWOACosBZoEBpAFogHeigDgIgAq6gAJuAXmBSfYBd4AKtwF5gYodgAD7gACqCFIuTHI/eT49gARDBHk+enKAKcCBGneIABkCUi6AAqUCeT6BAAeGHmSHEB8DUz1xgDc4gXBMgAKLAWWEAnsDUi5UgAw0AWKBAG4DbC1kgAtDgAAJAWiAC6cBbYEOswRtLT1ihAhdASiAd/MEZCkrbYAl14ACAAJ6K4AtGoEFFAFThQXTgAFQAW2DAeyEAEwHMTtrJmI7KYB4rYN9toAAIQdiPyhrJj1igADRBmsrPWIpOoIBBIAO1IAB2gItLYEBpoMQt4EChYMBRYA5TAJbb4EBm4EBMgFsggJEB2smZykhPXaDCD+AADmAgrmAYl4DdyksgAoIggC7Amg9gQDIgAJmgAANgAKOAmgrgQAiggJagAALAl0sgAJMgC2iAWiAAHaCAnSBAJoBeYQAOrsBZgJ2PYAAm4MDHoEBzgIrdoABIYAFDgFogQUNgAHYBHI6ei2BABiDD5uAAQ0Ba4I4toIDYIAAsQEpgTf7AWuAAaWCANeAHWqHAOuCAOGBAikBd4kCKQFTgAtoAT2AbleEAY+DAZ+FAZSFAdCKAYSTAYGFD6WCALSAebWCA9UBd4Agkoc9pI4E24BfroIE3QFhgmI4gES8gD2PAXOARL6AOKoGMTxzKWE9gAZFgSeFgBhEh2f0hgArAT6DACuBHb6BABSCEgWAQ7eEMaiAABqBDbGAdSmAAEWBPGqCAEiBO/6ECXeDACiDAEuCAEkCLXOWAC2AN72BWEaBHbaAgYoCcjqAUxWHBpuAWEeAAC6GHGYBYYIGYgEkgAYaAXGCBeIBJIYHUwI1NIAbsANGcjqACBsBR4EABoB40KEAJocGHQFHggb7gx0thC8ugWRtgi5xgA9CASGAQcuILz2AhFWCIrCBCYaAZAgBcIAi54EABoAHFoAJYYACjgEhhwAhATiALbuKACEBMYGJyok5AocAeoETsgJyP4AAoQEkgAuBAz17WoEBA4Np7AFxiTckhDrKgUiCATSAQhKBPIOAI5eBBRuDSIOERr2IABiDSHuASFKAh2OJABiDHuiAABgBOJEASIULzYABN4ZSZwEkgEslAV2BAcuATG+AId2AAKkCdC6AAWsBb4AQZAE5hIkMgQC4AW+AWoCCAAkBaYFb24QAyoEAVIAHhYEKLoAIGYFVVIECqYA3t4AJY4EWjIIYEoIDPoFzYIAAB4A9lYADQYEACoEA7gEzgCheiQClgEW7gAAEgzoAggAlAWOFAHsBdYQAe4AvrIADKgJhLIAAdYI8rIERkYIH64IAdIEAYIEAdAN0LkeAAMGEEmYBYYEAEAFxgSf2gAtWAXOBIsABRoI0bANyPTmAAAcBbIEAEQFHgQARA2NyPYEc54AAoIEAZIICmAJZcoNTK4ZgZwJCZYpTNoVi1wIiToFLH4KMZ4JagIBhQogCiQFlgWvSix1ZgwPQkwimhUe3gFdUgAIpggLGgAJ/gRHaggAHAWGOL1WAI6GBO7CDBtiBEe2BUvOACvmAHu2AAX6AAAmBHbaDMOuAEBGAAuCBMSEBcIJEtIUMeYATxgFDgE7IgHMZgBIaAWyABMmADh2HZRKEB5yBAC6EB5+CAwYBOoMPiIABLoEKY4YAS4cRXwF4gglNATKAMVqBL9wEMzU2MYB9sQFhgn13AXKAL8mCAIEBWIAKyIASHICK3wFyhC8KggALAVOAABuAORCAAbwBUIGHOoQAXQE4hA0hghc3giqwggAHAy5KcoAHvQEpgAPTgCHJgQCOgBpoBChSKDiBCsyALvGADIUDOCkpgC/hhw3JgGCRAXKAljiAbNmBZhEBIIJxlgEihQBnhg1SgQBngITpAVKAAYuFADuAXRCCW0yIXwmATMQDdGhvgE0GkQA/AUGAADyAEzSBAEMBK4AUmIsA+QFrgAAbAj4xgDIMAms+gQAQjQ5oAndpgIcmgI6YgWOTjwBdA3IubYJSzgFrgVe9gxhEgCtfggE9gDcsggFIgAAygEqNAyZhP4EBOwE5gQ06ATmATeKFZqKECU+BAVaBAcqDAa2CAEwCYSyAAPaCDC6BAA+2APwFNTczNDSDAEOMAEKEAXeAZboCZ3OAYNYBdJIA34gB34AkSIEMr4AB44EA0IEAUoAdkIQCV4ICKYcCMIwCMQEyhwDmAzI6eIANxoEAHIcAWgFygADtlwBVAXqUAFUBM4cAVQEzgABVgwE4hwBVgAQ2gQE8AWGCABWAMNKCAL2vALsBNIcAZgE0gjsNggA+AT+GAakBU4EBqYkAeAFpmgDNiwBngGRdiQCygSeOiAB7ATWHAHsBNYECHIYAfoAAMQFogY9LgAkOAT6BICmAg4OAjXeEAEeENUOBMbSCAAkBZYEhHAFrgAAvggCcAS2BADcBKYBwd4QAGoAe9oQAL4AE94EFFYBJI5UAvIAEGYIAvYAWu4UYsYFlOIAAMoFrg4Ag1QFogR8cAWiCARWAAA2DAR6GCiYBdoFp8YEBL4AFBoUA4gE2hwDiATaBAOKBXCqEAquDBNYBc4kAPoAoeoELmYAW/IAVBoAKxoAI8ocA8AF0gADNgQBfgwDbgQAOgwDZgDBLgQAXgQbYAWuFGm4Ba4BsFgE+gGZJgQMevADsAWuIAKGDCXeJAdICZXKBAdKOAPcBN4cA9wE3gQD3gT0/tAD3AXKKAPeBAA6DAHqALFD3APeAP0uDAPeEAPABOIcA8AE4gQDwhQB+ggDvgwNJhQCHAWGABPODK0CBAIiGBPWFBiIDcmMggJwBAW2BWpqQBK6AA1KKBLIBR4E4eAFigCQqAjkmgJiShAajgnLnhQWkhQbsixP6hwCvATmEBK6HADKAEcuMBw8BOYBq1oQAMAE5ggeOBCFyLmuGLZoBWIAAKoGPvpAGFoMAcoYAPIIGAIAHm4ALEIA3M4YcS4ECA4YAJAEygQAkA3IueYABOwFJhwCDAzIwNoQBAoQIJIAAtYEAHQF5gAlvAiFSgRDDAUGBAAUCUiiAQxSFD9mGAIIBM4sP14AAYIALOYFCb4UAIYBgvIgAjwFBgABFASyBAJSIADYBMocAToQAiYMAGAEzgDubiQdLg4khgWJaiQG9gJSTgBywiwF5AjkzgQCJgQDjgwGAhAIUAWGADhSBCEmAC++CikeALYqMB64Bc4AKEYAKBYMAaoMVqYBpBZEHGIIDlYQAV4sB0IBg7ZUBgAE0hwDqhwWeATmCBZ6FBZKCAtWJBZiBK3aAAAuADrCAA9qGnDKBAFeABX2BCoSEBXeHA14BbIEACgFmiAVLhgeOlAKoATmCBT6AA0qACOeACMQBcoAI6gI1KYEWCoAB+YIJ14AeR4IAEwExhQARgB6LggkOATSAABGEADUEPjI4NoAK3AFygg1igQAzAT6AVPyEXhGBDT8BIoEaEgRtYW55hAFYgHBtjAASgEFAhxeXBnN5bWJvbJEBfQJyLoAeyIcFDwE5hwUPAzk3OoIK7YEAIoAE0gRDcjsphALLgAycgCoggQAYgATTAV2AALyAABYBQYAABYMNaAIxOYAJuwFfgAAujgApgBL1AS6AHu0Cci6AFSyAYYGBAAqADGyBABSAAA+ADH0BN4SEa4EM2IEAFgF9gAv6gwAMAWGAAAwBT4gOLAJiPYAM7oEAtoAM7oAVHwF1gBTJgJXvA3IsT4AAB4EM7oIAaAF1gQ0vggBZAW2BAAqOG16BGDSFApeWCXOLAR6HBT0COTiKAR4CWHKAbRQBUIAA9YMMIQFwgADWBHNyW1KAAtmAHkiAEe2AESWBHFoBX4NxJ4BSOQFwgBiUAilBgJVMAXeCAK+AASqEAScBPYEAGoZx7YFQxIIAK4MFnoEAL4GG4oUAOYILPoAfYowA2oCZy4UCBgVyZXBlYZEA24EIhoQAdoEurARoPTMrgQSUgABbgHxhggZGATGAO5eBAHyBCWCCAHmCAeeDAHmBEzKDADOEAfyALJOEACaAHuSLACYCMTGAACeCABaAR9WDe72AAOoBaIEL4YMBNrEAv4IBZwFogCMpgwJnhQE9gFVpggE2gAApgw3Th0HfggEsgAArgBA4gBPgkAILAi0tgQbQAXOAgrqBWcMELW9mLYIEupICF4cCx4EPNYICuAFViAK4AUiIArgBRIUCuIICtYEG/IACtYEA/AQsVSxIgwK3AUSJArcBVYYCtwFIgAAKggBbA1Q9RIEAC4IBO4IDN4AiAIUiMICTkY4C2osbHZcC3YAP4AE2ggBhAVaCARuHCGiCAJ+HAaCAlCaHANwBTYQADAFjgAAMAUKCAAwBVIcDlAEygIMugQAzBCxXLE2DANwBQokA3AFXgwDcgAB4AU2DAAqEBACEAM6RAMyFBMSVAMaCARWSBx6KBi0BOYUGLYEfxYQAFoAAC4QII4EFZoBMSgE2gIUHgDKGgFngAXuBCCuCImeAFdKBEAiNECaAIx2BnN+HAo2CABMBMJ0D+gFwgCCDgEDCASiAnqMBJoEADIAHNIEAPQN5PXCFADoBeYIcrQNSKHmBA0wBeYEAIwI+PoEADIAATIIAE4kAUQFBggAmgQFcAUiBFTSAAAyDD2GFBFaBABaBAAyDDRuBA8yBBDKCAHiFEJ4DMjA1hwFJgB18hQAdggDgjgmNhB2qgwAloB2RkAJ0gA1ZggEFgAEhgAbIAzMxOoMQ7IQAKIYJg4AAC4ABsoI+7QF4gAArgD3vggDFASuABm6DAA4BQYYAFoEA5oUADIAknYIH+oYAUYYO7oAAC4MFsoEBaAFsgwGigCPWjgGilgGcgAA00gGclAFQjB9TkAFKgCbJggHTggFUgJ7BgQBGhwAohg+SgAALjwFKAXqeAUqEAEeGD3OAAAuEEt4BbIkDYYIJbQJ3LYBTeYAAVIAM0YIJcYAARQN6ci2AGQOABeSBRfCAia2XAOCLItyOAOiBAEQBX4A4egFogCFXgAAJgBqZgAiMBWUtaCk6gQAKAV+AAAqCAGcBU4cPiYkJ54oV4wFohCGwgZVag2ZqgSiLgBmMgE87gAAEAWSDF9gDZD1mgA+ZAXqBGN6ED9efAE0Bb4kARogKZYIKPYQKOIMHrYIAqIcEi4wLbIADjpEBZYAAZIMlqoAAjwFsgUp8jCSQhwA/ggp8gxR/gggxgQuwAnctgBTAgzD/AXeAADsBZ4AB5QF3hg3kAXeFF5aAFhyFBf4DZi13gDIViA0oAWeDDomAQQOCPBCBFRCIDquAEYICYTqCDYuBINCADBaCDi6OFFmCYPKVFFeDDi6EABWGCoSAAAuFANCBAkWGDqWBANaJDqWIgICBAOCIDImFAH2FBJahAH+GCeWAAAsBOoQBhoAayIINaYYAGoAGUIUAGoBQgokAGwExgA3QgxaFATSGHX2FFpaIeuyAAMmKbCwBWYYOpoEATYR74og0i4AXWoAAM4EGl4EDAAN8fHeBFvGBPGaCAI6AAwKEBpmABVWCALqCABKAFOGAAhSCAAuAFgKCRpyEAe8Bd4IonoI82oMbVoZUToIXFoMFCoEpNYIXW4EACYQnDoEwsYE644QXk4IpHoAVqYAQpoF5T4cch4MCx4EpMIEr+4AAB4EVmoEAK4AAKoB3K4EjA4AxQIEPf4AAFoAxG4Vc2YED3YEAIoAmAIJtUIQ0Q4IpwIEAGIFtHYVgzoJ7/oAbPYBKEQE/g0PGgjI0igAigkKbgABxgRFIgXfSgQBsATqAACoBX4ADD4QAjIcApoEAmYEAMIAx5oYAFIFKjYF6yoILFJIAZYEAK4AANYIx4IgA3IEAEoo4xoEtO4gsYYEkSAEtgjqHgXGlhgE7hQKIgG9gAS2GoOYBdYEtyYA0o4ADzIEBuIAANYFNh4EZ5JQD14IuyowDwJAAfwF3hAB/gYLRgjorgAmOAWWAYdKAEK8BP4CA9IFHRYgI+gE/gCuGhgAUhAthgCEKgQ+MhAAhgAtdgTeFgQH7gCHNgAAGgACJgAAGAWKDMuODAAyBL4aAAzaAB/cBYogyeIIChodbfoIEV4FGr4IAFgE6hGEAgF8hhzCAiiwoAW2BIhWDa5ABbYKWqYZsDoIARQFtgC2HiyVuAXqkAD8BbYGkGYKt94OXkAFtgaQbg5yuiQBfATSMAF+ACjSDQbmDLIuALJKBPUaAAbqBA2CALJmELK6BLKCAAdcBYYABPgF4gVmlgQF/hwBFgAPugTIvgyZugCZ1gTPTgCZegQXOAWGBbnCGJpGAJoqAgASCJl+BC2mAJluHAEWABNwBe4EbCYAbBYcAFYAIooYU34d9AwRZcjtzgAZfgCrcghjrgWLBgBoxgHZCgCCmgirRgABGgitxhQBHgHcShA7yAWWECPiHABwBUohSd4MnfAFlgCdFhwAggKXRgACZgQBWgAD5gALXhwAagBJrgwAZAjcmgCtcAS2BAAeJkYqAHDyGAFmCHAwCPy2ANMSCHJ4Ccm6DfNgDLG5ukW/SgANXgU1tgAJmgm+qgAAlgB8lggALAWaAAZeMapOEPimAO2aAFT6BHheDADOEcISEUTWABBgBc4AAJIIAVIcqvYUAK4ZldYAyyoAcP4GfFYMAYIQAIYFpWIIG4IMAKYABCoYwtIQAQoSoQ4Rer4QAHYVyUoFiLgJsZYAGd4EBEYsAdAE8hADWgDxZiQC3gXV8hx2GgLJKhh+VgQBUAm5ugAdaASyAAMuBR4mBiy2HVCCCAGKBd5iAesCFAHOGgU+IAJcBV4B2R4WMGomLzYKDQoINbIcgBgFsgLLJgwMPgIw9hVukgACygQAGiAKVAkJlgYDTgZQoAWGAFzkCZDqAcPKBIS0BPYFynYAoMYMfj4AJG4EDTYReXwJzPIB4qoNgXoUBcoQBzoUAGIA5Z4RuToCfIIcFFIA5fYBzeYIARQFmgQNjAWyAe/yAA2OAOySBA2OFlPsBO4EADoFUCIUBzgEugAIEgTgGgDUDgh4kgQOzgDeBgQOzgQA7gAOzhopbhQdjAmNugGrIgAUqgYRChACTgQApgjqSgAlFhAcOgCgqBW49e3VugAvBiDKYgBTJhAGGgoAsAXuBqV2AACyBQfGFAZ6ACQSAAeqAAJKAHvCJhdqGAWWAJr+NAWUDcHJvgA9ngB/agndRggFnAX2AgKuApV+AeFmAWliBsKUBfYBYdoAkO4R/hYN1rYAB1IMCAoR1q4EBjIYl7IoBIgFmhQEiAW+DASIBb4MBIgFvlQEiAW+BPqGIASKBACnLASKAAJKAWjiMASKBSriIEjiPASqCARYCaXqCjiCSAS+AP/KDAS+DAp6AB66AAM2FAuOAOX+BAAaMAFSAEnOIAuIBZoKAxYdWw4G19KADZ4IG04MDqIaDhQIudYAER4ShR4cAooF+iYMBCYF94YWC3IEAdYEFSAFzkwU/hoR4hyynhQCjkwAeAiJngIoDgHo4AWWBD+mKhw+BABQDLTE1gA/+gSznBCYmIm6Ctq6HrxKBCV6Ai1OAfIeDi1uABUaEAQGAAG0De2xuggHZiWcTgXclh0GqAWeAlAGCQGuCZrwDLGFugYjNhArrgDzEgF8jATWAA7GAOEWAYOmFAEQBZoMnhwEhiCJGgQumggxLASKANg6DR2qAXpqAFXkBPoOr14EiSIAAx4AADoYAMwFugEZThJAEgCDKgAAxAWaAYESAWxCAG1qCFfwBPoADTANpPjmApcKADSqAAAaBrBCBACqCUwCBUwqAABsCMD6APBkDbz40gqXngwOuAWaHAGKDABSAJR2AbfGBALgBc4MA64UA/QFzgT2qgAEAgATNgAOKgAdegKCLAmU9gDaKgCRvgQhEgJ9lhkYxAXOBIXUBboAAB4MLoIEAD4AADQEkgAA9gQuIgEHFAi5GgAhigHQnAXOAWSqDACIBRoEAIgFKgQAigVmAgAAMAVmAKZWBABeGdCuAABSHDCECMiqBAEuAA8eBRxCELFGFABKARxqGABIBR4IAEoEME4AABwFygBDRBTw8aSs2gAAMgEc3hSP/gABLAXKBQ/WAPV0BPYMADYIAa4ATvIAAXYEABgF0ggAGAVeAEC+Ad+aAV9CBVKKHBd2EAD2ARxWABxICdCuEAECAe9SAQ9CBAA2BIzGAATOBRdiAAFeBYpCAd+yACDCAWmyGbViIRG+FCNyFCIOBPsyBPhIBeYNn5YMCNoILVYCy6oMkbICob4Iu1YFHoIFHrIACSAF0gw9HgQAHAj0tgQAGgSWcgAGwgCnsgQAOAT+AMEKAAbuCC8yFABOCHSmBCxOCSDiASbqAdOOFlxSBQ2yBOvWGSD4BPoBls4qRE4BjooRvcINFdYNzV4Q8pYB8+4hznI4AL4MIRoEAMYRMGQFqggBthkidgBU9g3R0iQBCgwAThgBGgmgVigB1gH1jjAB1jgAzjgB5AVGCO9uGSQiBAHmCdLKLAEaBABOGAEaCaGOKAHkBUYp0ipIAM4kAeYFE5oOPsYFTR4AmRoR0IoBFlQFBgXJQgBvSAVOAexiDPKUBaogAK4BFK4QAK4A8rAFJgVy+AXqGACgBTIgAKAFRgY9gh3R1AU+BACoCQ3SBYQyAACmIajyAAAeAP76AL/2ERUSClH2CRoyGDnCDBKyBAhWBQYSAAR6CQSeBBcaBAEyAcs6AIJWBSDQDXS5agkIeiAARAXGBABGAcwCGABEBJIEAEYBzB4YAEQFGg028ggCJgkxggTxrggAHgk2UhE4+gD2nhDwxhDxCgD8kgg8IgAMKhUc8gWGRhE1LgwMzgAbTAS2AB/WCS3eADwCAACGADwWBDzyAVfiAKM2AJjGAS9kCbjqAFOoEd246ZIGNsYIG9YO7BIWEoYI3/YMAC4ML34WFdYAAGYUAC4qD6YEHYIEHCAFsnAb4hQq9gSvNhwAVhgQdoQbvkQbGhwRfiQbFgbsgAT2ANBUDdCwhgAaTggExjI5igVsKhAbbhweIiClYjQbOhASVhEsKgABWgV4SAVSAZ7CECFqBAG6CXmuBQyCBdOqABuqCBkuBVluCBkuCNWIBboMSZYEhJoM0e4iev4Yp0oYpqooHTYQ7rIIAQoMAYoGXNIBsqYAABgE1gQUOggdWgIoahRnGgAA3gR2CgAArgESrgiLcBD01KyiAD4CAAiUBIYEAR4AjNgI4PoIHmIE5yYcBPYAAEoAAGIEHUAFpgwWeiBLEgTHHgRKLg09RghLPgSXtgk4QgRIogAcUgEOfjgXqhg5thS0xgLeRgwXPgga3gLbXgQAHoAA4hwYpgAHkgyipgwYuhAYNg1lDgIregwYOgAFzgS1rigFzAXSCIlGAunyAIt+DAAiAKKaAA22AuVOEAC6CDwmEelqDg6CAAlKAdCyATnmDAK6CBEqAC5qBADCAHMuABUuGAAqAG6uEAAoBdYAAXoEAJoMaEIQEZogABoFWtAFygwOEgQOYAmVugQOYAXSAcuaDBI+LA5eHkIuMA5eHj4WRA5cBO4yJ5gE9gwTXgJTBAXOBEQQBboANmoCIDAMpOwo=");if(g){const A=atob(I),g=new Blob([A],{type:B});return URL.createObjectURL(g)}return "data:"+B+";base64,"+I}});}
|
|
203
209
|
|
|
204
210
|
/*
|
|
205
211
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -948,37 +954,6 @@ cipher.aes = class {
|
|
|
948
954
|
}
|
|
949
955
|
};
|
|
950
956
|
|
|
951
|
-
/**
|
|
952
|
-
* Random values
|
|
953
|
-
* @namespace
|
|
954
|
-
*/
|
|
955
|
-
const random = {
|
|
956
|
-
/**
|
|
957
|
-
* Generate random words with pure js, cryptographically not as strong & safe as native implementation.
|
|
958
|
-
* @param {TypedArray} typedArray The array to fill.
|
|
959
|
-
* @return {TypedArray} The random values.
|
|
960
|
-
*/
|
|
961
|
-
getRandomValues(typedArray) {
|
|
962
|
-
const words = new Uint32Array(typedArray.buffer);
|
|
963
|
-
const r = (m_w) => {
|
|
964
|
-
let m_z = 0x3ade68b1;
|
|
965
|
-
const mask = 0xffffffff;
|
|
966
|
-
return function () {
|
|
967
|
-
m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;
|
|
968
|
-
m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;
|
|
969
|
-
const result = ((((m_z << 0x10) + m_w) & mask) / 0x100000000) + .5;
|
|
970
|
-
return result * (Math.random() > .5 ? 1 : -1);
|
|
971
|
-
};
|
|
972
|
-
};
|
|
973
|
-
for (let i = 0, rcache; i < typedArray.length; i += 4) {
|
|
974
|
-
const _r = r((rcache || Math.random()) * 0x100000000);
|
|
975
|
-
rcache = _r() * 0x3ade67b7;
|
|
976
|
-
words[i / 4] = (_r() * 0x100000000) | 0;
|
|
977
|
-
}
|
|
978
|
-
return typedArray;
|
|
979
|
-
}
|
|
980
|
-
};
|
|
981
|
-
|
|
982
957
|
/** @fileOverview CTR mode implementation.
|
|
983
958
|
*
|
|
984
959
|
* Special thanks to Roy Nicholson for pointing out a bug in our
|
|
@@ -1209,12 +1184,15 @@ const GET_RANDOM_VALUES_SUPPORTED = typeof crypto != UNDEFINED_TYPE && typeof cr
|
|
|
1209
1184
|
const ERR_INVALID_PASSWORD = "Invalid password";
|
|
1210
1185
|
const ERR_INVALID_SIGNATURE = "Invalid signature";
|
|
1211
1186
|
const ERR_ABORT_CHECK_PASSWORD = "zipjs-abort-check-password";
|
|
1187
|
+
const ERR_UNSUPPORTED_CRYPTO_API = "Crypto API not supported";
|
|
1212
1188
|
|
|
1213
1189
|
function getRandomValues(array) {
|
|
1214
1190
|
if (GET_RANDOM_VALUES_SUPPORTED) {
|
|
1215
1191
|
return crypto.getRandomValues(array);
|
|
1216
1192
|
} else {
|
|
1217
|
-
|
|
1193
|
+
// all supported runtimes expose crypto.getRandomValues; failing hard beats
|
|
1194
|
+
// silently generating predictable encryption salts
|
|
1195
|
+
throw new Error(ERR_UNSUPPORTED_CRYPTO_API);
|
|
1218
1196
|
}
|
|
1219
1197
|
}
|
|
1220
1198
|
|
|
@@ -1273,13 +1251,12 @@ let DERIVE_BITS_SUPPORTED = CRYPTO_API_SUPPORTED && SUBTLE_API_SUPPORTED && type
|
|
|
1273
1251
|
|
|
1274
1252
|
class AESDecryptionStream extends TransformStream {
|
|
1275
1253
|
|
|
1276
|
-
constructor({ password, rawPassword,
|
|
1254
|
+
constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly }) {
|
|
1277
1255
|
super({
|
|
1278
1256
|
start() {
|
|
1279
1257
|
Object.assign(this, {
|
|
1280
1258
|
ready: new Promise(resolve => this.resolveReady = resolve),
|
|
1281
1259
|
password: encodePassword(password, rawPassword),
|
|
1282
|
-
signed,
|
|
1283
1260
|
strength: encryptionStrength - 1,
|
|
1284
1261
|
pending: new Uint8Array()
|
|
1285
1262
|
});
|
|
@@ -1308,7 +1285,6 @@ class AESDecryptionStream extends TransformStream {
|
|
|
1308
1285
|
},
|
|
1309
1286
|
async flush(controller) {
|
|
1310
1287
|
const {
|
|
1311
|
-
signed,
|
|
1312
1288
|
ctr,
|
|
1313
1289
|
hmac,
|
|
1314
1290
|
pending,
|
|
@@ -1325,13 +1301,15 @@ class AESDecryptionStream extends TransformStream {
|
|
|
1325
1301
|
const decryptedChunk = ctr.update(encryptedChunk);
|
|
1326
1302
|
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1327
1303
|
}
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1304
|
+
const signature = subarray(fromBits(codecBytes, hmac.digest()), 0, SIGNATURE_LENGTH);
|
|
1305
|
+
// branch-free comparison: accumulate the differences instead of
|
|
1306
|
+
// short-circuiting on the first mismatching byte
|
|
1307
|
+
let invalidSignature = pending.length < SIGNATURE_LENGTH ? 1 : 0;
|
|
1308
|
+
for (let indexSignature = 0; indexSignature < SIGNATURE_LENGTH; indexSignature++) {
|
|
1309
|
+
invalidSignature |= signature[indexSignature] ^ originalSignature[indexSignature];
|
|
1310
|
+
}
|
|
1311
|
+
if (invalidSignature) {
|
|
1312
|
+
throw new Error(ERR_INVALID_SIGNATURE);
|
|
1335
1313
|
}
|
|
1336
1314
|
controller.enqueue(decryptedChunkArray);
|
|
1337
1315
|
}
|
|
@@ -1403,11 +1381,11 @@ function append(aesCrypto, input, output, paddingStart, paddingEnd, verifySignat
|
|
|
1403
1381
|
hmac,
|
|
1404
1382
|
pending
|
|
1405
1383
|
} = aesCrypto;
|
|
1406
|
-
const inputLength = input.length - paddingEnd;
|
|
1407
1384
|
if (pending.length) {
|
|
1408
1385
|
input = concat(pending, input);
|
|
1409
|
-
output = expand(output, inputLength - (inputLength % BLOCK_LENGTH));
|
|
1410
1386
|
}
|
|
1387
|
+
const inputLength = input.length - paddingEnd;
|
|
1388
|
+
output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
|
|
1411
1389
|
let offset;
|
|
1412
1390
|
for (offset = 0; offset <= inputLength - BLOCK_LENGTH; offset += BLOCK_LENGTH) {
|
|
1413
1391
|
const inputChunk = toBits(codecBytes, subarray(input, offset, offset + BLOCK_LENGTH));
|
|
@@ -1555,21 +1533,24 @@ const HEADER_LENGTH = 12;
|
|
|
1555
1533
|
|
|
1556
1534
|
class ZipCryptoDecryptionStream extends TransformStream {
|
|
1557
1535
|
|
|
1558
|
-
constructor({ password, passwordVerification, checkPasswordOnly }) {
|
|
1536
|
+
constructor({ password, rawPassword, passwordVerification, checkPasswordOnly }) {
|
|
1559
1537
|
super({
|
|
1560
1538
|
start() {
|
|
1561
1539
|
Object.assign(this, {
|
|
1562
1540
|
password,
|
|
1541
|
+
rawPassword,
|
|
1563
1542
|
passwordVerification
|
|
1564
1543
|
});
|
|
1565
|
-
createKeys(this, password);
|
|
1544
|
+
createKeys(this, password, rawPassword);
|
|
1566
1545
|
},
|
|
1567
1546
|
transform(chunk, controller) {
|
|
1568
1547
|
const zipCrypto = this;
|
|
1569
|
-
if (zipCrypto.password) {
|
|
1548
|
+
if (zipCrypto.password || zipCrypto.rawPassword) {
|
|
1570
1549
|
const decryptedHeader = decrypt(zipCrypto, chunk.subarray(0, HEADER_LENGTH));
|
|
1571
|
-
zipCrypto.password = null;
|
|
1572
|
-
|
|
1550
|
+
zipCrypto.password = zipCrypto.rawPassword = null;
|
|
1551
|
+
// verify the password with a branch-free comparison of the verification byte, mirroring
|
|
1552
|
+
// the constant-time AES HMAC signature check
|
|
1553
|
+
if ((decryptedHeader.at(-1) ^ zipCrypto.passwordVerification) != 0) {
|
|
1573
1554
|
throw new Error(ERR_INVALID_PASSWORD);
|
|
1574
1555
|
}
|
|
1575
1556
|
chunk = chunk.subarray(HEADER_LENGTH);
|
|
@@ -1586,21 +1567,22 @@ class ZipCryptoDecryptionStream extends TransformStream {
|
|
|
1586
1567
|
|
|
1587
1568
|
class ZipCryptoEncryptionStream extends TransformStream {
|
|
1588
1569
|
|
|
1589
|
-
constructor({ password, passwordVerification }) {
|
|
1570
|
+
constructor({ password, rawPassword, passwordVerification }) {
|
|
1590
1571
|
super({
|
|
1591
1572
|
start() {
|
|
1592
1573
|
Object.assign(this, {
|
|
1593
1574
|
password,
|
|
1575
|
+
rawPassword,
|
|
1594
1576
|
passwordVerification
|
|
1595
1577
|
});
|
|
1596
|
-
createKeys(this, password);
|
|
1578
|
+
createKeys(this, password, rawPassword);
|
|
1597
1579
|
},
|
|
1598
1580
|
transform(chunk, controller) {
|
|
1599
1581
|
const zipCrypto = this;
|
|
1600
1582
|
let output;
|
|
1601
1583
|
let offset;
|
|
1602
|
-
if (zipCrypto.password) {
|
|
1603
|
-
zipCrypto.password = null;
|
|
1584
|
+
if (zipCrypto.password || zipCrypto.rawPassword) {
|
|
1585
|
+
zipCrypto.password = zipCrypto.rawPassword = null;
|
|
1604
1586
|
const header = getRandomValues(new Uint8Array(HEADER_LENGTH));
|
|
1605
1587
|
header[HEADER_LENGTH - 1] = zipCrypto.passwordVerification;
|
|
1606
1588
|
output = new Uint8Array(chunk.length + header.length);
|
|
@@ -1635,25 +1617,31 @@ function encrypt(target, input) {
|
|
|
1635
1617
|
return output;
|
|
1636
1618
|
}
|
|
1637
1619
|
|
|
1638
|
-
function createKeys(target, password) {
|
|
1620
|
+
function createKeys(target, password, rawPassword) {
|
|
1639
1621
|
const keys = [0x12345678, 0x23456789, 0x34567890];
|
|
1640
1622
|
Object.assign(target, {
|
|
1641
1623
|
keys,
|
|
1642
1624
|
crcKey0: new Crc32(keys[0]),
|
|
1643
1625
|
crcKey2: new Crc32(keys[2])
|
|
1644
1626
|
});
|
|
1645
|
-
|
|
1646
|
-
|
|
1627
|
+
if (rawPassword) {
|
|
1628
|
+
for (let index = 0; index < rawPassword.length; index++) {
|
|
1629
|
+
updateKeys(target, rawPassword[index]);
|
|
1630
|
+
}
|
|
1631
|
+
} else {
|
|
1632
|
+
for (let index = 0; index < password.length; index++) {
|
|
1633
|
+
updateKeys(target, password.charCodeAt(index));
|
|
1634
|
+
}
|
|
1647
1635
|
}
|
|
1648
1636
|
}
|
|
1649
1637
|
|
|
1650
1638
|
function updateKeys(target, byte) {
|
|
1651
|
-
let [
|
|
1639
|
+
let [, key1] = target.keys;
|
|
1652
1640
|
target.crcKey0.append([byte]);
|
|
1653
|
-
key0 = ~target.crcKey0.get();
|
|
1641
|
+
const key0 = ~target.crcKey0.get();
|
|
1654
1642
|
key1 = getInt32(Math.imul(getInt32(key1 + getInt8(key0)), 134775813) + 1);
|
|
1655
1643
|
target.crcKey2.append([key1 >>> 24]);
|
|
1656
|
-
key2 = ~target.crcKey2.get();
|
|
1644
|
+
const key2 = ~target.crcKey2.get();
|
|
1657
1645
|
target.keys = [key0, key1, key2];
|
|
1658
1646
|
}
|
|
1659
1647
|
|
|
@@ -1700,6 +1688,7 @@ function getInt32(number) {
|
|
|
1700
1688
|
|
|
1701
1689
|
|
|
1702
1690
|
const ERR_INVALID_UNCOMPRESSED_SIZE = "Invalid uncompressed size";
|
|
1691
|
+
const ERR_INVALID_COMPRESSED_DATA = "Invalid compressed data";
|
|
1703
1692
|
const FORMAT_DEFLATE_RAW = "deflate-raw";
|
|
1704
1693
|
const FORMAT_DEFLATE64_RAW = "deflate64-raw";
|
|
1705
1694
|
|
|
@@ -1756,6 +1745,7 @@ class InflateStream extends TransformStream {
|
|
|
1756
1745
|
}
|
|
1757
1746
|
if (compressed) {
|
|
1758
1747
|
readable = pipeThroughCommpressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamZlib, DecompressionStream);
|
|
1748
|
+
readable = mapInflateStreamError(readable);
|
|
1759
1749
|
}
|
|
1760
1750
|
if ((!encrypted || zipCrypto) && signed) {
|
|
1761
1751
|
crc32Stream = new Crc32Stream();
|
|
@@ -1784,14 +1774,15 @@ function setReadable(stream, readable, flush) {
|
|
|
1784
1774
|
function pipeThroughCommpressionStream(readable, useCompressionStream, options, CompressionStreamNative, CompressionStreamZlib, CompressionStream) {
|
|
1785
1775
|
const Stream = useCompressionStream && CompressionStreamNative ? CompressionStreamNative : CompressionStreamZlib || CompressionStream;
|
|
1786
1776
|
const format = options.deflate64 ? FORMAT_DEFLATE64_RAW : FORMAT_DEFLATE_RAW;
|
|
1777
|
+
let codecStream;
|
|
1787
1778
|
try {
|
|
1788
|
-
|
|
1779
|
+
codecStream = new Stream(format, options);
|
|
1789
1780
|
} catch (error) {
|
|
1790
1781
|
if (useCompressionStream) {
|
|
1791
1782
|
if (CompressionStreamZlib) {
|
|
1792
|
-
|
|
1783
|
+
codecStream = new CompressionStreamZlib(format, options);
|
|
1793
1784
|
} else if (CompressionStream) {
|
|
1794
|
-
|
|
1785
|
+
codecStream = new CompressionStream(format, options);
|
|
1795
1786
|
} else {
|
|
1796
1787
|
throw error;
|
|
1797
1788
|
}
|
|
@@ -1799,13 +1790,93 @@ function pipeThroughCommpressionStream(readable, useCompressionStream, options,
|
|
|
1799
1790
|
throw error;
|
|
1800
1791
|
}
|
|
1801
1792
|
}
|
|
1802
|
-
|
|
1793
|
+
// The native CompressionStream/DecompressionStream and the pure-JS zlib port do not signal
|
|
1794
|
+
// backpressure on their writable side (their `ready` never pends), so a plain pipeThrough drains
|
|
1795
|
+
// the whole source into them and peak memory grows with the entry size. Awaiting each write()
|
|
1796
|
+
// paces the source to the codec's consumption rate, keeping streaming memory bounded. The WASM
|
|
1797
|
+
// codec already backpressures, so this is a no-op cost for it.
|
|
1798
|
+
return pipeThroughBackpressured(readable, codecStream);
|
|
1803
1799
|
}
|
|
1804
1800
|
|
|
1805
1801
|
function pipeThrough(readable, transformStream) {
|
|
1806
1802
|
return readable.pipeThrough(transformStream);
|
|
1807
1803
|
}
|
|
1808
1804
|
|
|
1805
|
+
// Like readable.pipeThrough(transformStream), but drives the writable side manually and awaits each
|
|
1806
|
+
// write() so that a codec which under-reports backpressure cannot pull the whole source into memory.
|
|
1807
|
+
// Errors propagate in both directions: a source error aborts the codec; a downstream cancel/error
|
|
1808
|
+
// (surfaced through the codec's writable rejecting) cancels the source.
|
|
1809
|
+
function pipeThroughBackpressured(readable, transformStream) {
|
|
1810
|
+
const writer = transformStream.writable.getWriter();
|
|
1811
|
+
const reader = readable.getReader();
|
|
1812
|
+
pump();
|
|
1813
|
+
return transformStream.readable;
|
|
1814
|
+
|
|
1815
|
+
async function pump() {
|
|
1816
|
+
try {
|
|
1817
|
+
for (; ;) {
|
|
1818
|
+
await writer.ready;
|
|
1819
|
+
const result = await reader.read();
|
|
1820
|
+
if (result.done) {
|
|
1821
|
+
await writer.close();
|
|
1822
|
+
break;
|
|
1823
|
+
}
|
|
1824
|
+
await writer.write(result.value);
|
|
1825
|
+
}
|
|
1826
|
+
} catch (error) {
|
|
1827
|
+
await abort(writer, error);
|
|
1828
|
+
await cancel(reader, error);
|
|
1829
|
+
}
|
|
1830
|
+
}
|
|
1831
|
+
}
|
|
1832
|
+
|
|
1833
|
+
async function abort(writer, error) {
|
|
1834
|
+
try {
|
|
1835
|
+
await writer.abort(error);
|
|
1836
|
+
} catch {
|
|
1837
|
+
// the writable may already be errored/closed
|
|
1838
|
+
}
|
|
1839
|
+
}
|
|
1840
|
+
|
|
1841
|
+
async function cancel(reader, error) {
|
|
1842
|
+
try {
|
|
1843
|
+
await reader.cancel(error);
|
|
1844
|
+
} catch {
|
|
1845
|
+
// the readable may already be errored/closed
|
|
1846
|
+
}
|
|
1847
|
+
}
|
|
1848
|
+
|
|
1849
|
+
// DecompressionStream implementations can fail with a message-less TypeError on malformed
|
|
1850
|
+
// input; give these errors an identifiable message (errors raised by the other stages of
|
|
1851
|
+
// the pipeline, e.g. ERR_INVALID_PASSWORD, always carry a message and pass through as-is)
|
|
1852
|
+
function mapInflateStreamError(readable) {
|
|
1853
|
+
const reader = readable.getReader();
|
|
1854
|
+
return new ReadableStream({
|
|
1855
|
+
async pull(controller) {
|
|
1856
|
+
let result;
|
|
1857
|
+
try {
|
|
1858
|
+
result = await reader.read();
|
|
1859
|
+
} catch (error) {
|
|
1860
|
+
if (error && error.message) {
|
|
1861
|
+
throw error;
|
|
1862
|
+
}
|
|
1863
|
+
const mappedError = new Error(ERR_INVALID_COMPRESSED_DATA);
|
|
1864
|
+
mappedError.cause = error;
|
|
1865
|
+
throw mappedError;
|
|
1866
|
+
}
|
|
1867
|
+
const { value, done } = result;
|
|
1868
|
+
if (done) {
|
|
1869
|
+
controller.close();
|
|
1870
|
+
} else {
|
|
1871
|
+
controller.enqueue(value);
|
|
1872
|
+
}
|
|
1873
|
+
},
|
|
1874
|
+
cancel(reason) {
|
|
1875
|
+
return reader.cancel(reason);
|
|
1876
|
+
}
|
|
1877
|
+
});
|
|
1878
|
+
}
|
|
1879
|
+
|
|
1809
1880
|
/*
|
|
1810
1881
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
1811
1882
|
|
|
@@ -1835,6 +1906,7 @@ function pipeThrough(readable, transformStream) {
|
|
|
1835
1906
|
*/
|
|
1836
1907
|
|
|
1837
1908
|
|
|
1909
|
+
const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
|
|
1838
1910
|
const MESSAGE_EVENT_TYPE = "message";
|
|
1839
1911
|
const MESSAGE_START = "start";
|
|
1840
1912
|
const MESSAGE_PULL = "pull";
|
|
@@ -1903,6 +1975,9 @@ class ChunkStream extends TransformStream {
|
|
|
1903
1975
|
|
|
1904
1976
|
constructor(chunkSize) {
|
|
1905
1977
|
let pendingChunk;
|
|
1978
|
+
if (!(chunkSize >= 1)) {
|
|
1979
|
+
chunkSize = DEFAULT_CHUNK_SIZE$1;
|
|
1980
|
+
}
|
|
1906
1981
|
super({
|
|
1907
1982
|
transform,
|
|
1908
1983
|
flush(controller) {
|
|
@@ -1920,12 +1995,12 @@ class ChunkStream extends TransformStream {
|
|
|
1920
1995
|
chunk = newChunk;
|
|
1921
1996
|
pendingChunk = null;
|
|
1922
1997
|
}
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
pendingChunk = chunk;
|
|
1998
|
+
let offset = 0;
|
|
1999
|
+
while (chunk.length - offset > chunkSize) {
|
|
2000
|
+
controller.enqueue(chunk.slice(offset, offset + chunkSize));
|
|
2001
|
+
offset += chunkSize;
|
|
1928
2002
|
}
|
|
2003
|
+
pendingChunk = offset ? chunk.slice(offset) : chunk;
|
|
1929
2004
|
}
|
|
1930
2005
|
}
|
|
1931
2006
|
}
|
|
@@ -1960,8 +2035,10 @@ class ChunkStream extends TransformStream {
|
|
|
1960
2035
|
|
|
1961
2036
|
|
|
1962
2037
|
const MODULE_WORKER_OPTIONS = { type: "module" };
|
|
2038
|
+
const ERROR_EVENT_TYPE = "error";
|
|
2039
|
+
const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
|
|
1963
2040
|
|
|
1964
|
-
let webWorkerSupported, webWorkerURI, webWorkerOptions;
|
|
2041
|
+
let webWorkerSupported, webWorkerSource, webWorkerURI, webWorkerOptions;
|
|
1965
2042
|
let transferStreamsSupported = true;
|
|
1966
2043
|
try {
|
|
1967
2044
|
transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
|
|
@@ -1976,8 +2053,9 @@ class CodecWorker {
|
|
|
1976
2053
|
const { signal } = streamOptions;
|
|
1977
2054
|
Object.assign(workerData, {
|
|
1978
2055
|
busy: true,
|
|
2056
|
+
generation: (workerData.generation || 0) + 1,
|
|
1979
2057
|
readable: readable
|
|
1980
|
-
.pipeThrough(new ChunkStream(config
|
|
2058
|
+
.pipeThrough(new ChunkStream(getChunkSize(config)))
|
|
1981
2059
|
.pipeThrough(new ProgressWatcherStream(streamOptions), { signal }),
|
|
1982
2060
|
writable,
|
|
1983
2061
|
options: Object.assign({}, options),
|
|
@@ -2000,15 +2078,17 @@ class CodecWorker {
|
|
|
2000
2078
|
});
|
|
2001
2079
|
},
|
|
2002
2080
|
onTaskFinished() {
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2081
|
+
if (workerData.busy) {
|
|
2082
|
+
const { resolveTerminated } = workerData;
|
|
2083
|
+
if (resolveTerminated) {
|
|
2084
|
+
workerData.resolveTerminated = null;
|
|
2085
|
+
workerData.terminated = true;
|
|
2086
|
+
workerData.worker.terminate();
|
|
2087
|
+
resolveTerminated();
|
|
2088
|
+
}
|
|
2089
|
+
workerData.busy = false;
|
|
2090
|
+
onTaskFinished(workerData);
|
|
2009
2091
|
}
|
|
2010
|
-
workerData.busy = false;
|
|
2011
|
-
onTaskFinished(workerData);
|
|
2012
2092
|
}
|
|
2013
2093
|
});
|
|
2014
2094
|
if (webWorkerSupported === UNDEFINED_VALUE) {
|
|
@@ -2077,6 +2157,7 @@ function createWebWorkerInterface(workerData, config) {
|
|
|
2077
2157
|
}
|
|
2078
2158
|
Object.assign(workerData, {
|
|
2079
2159
|
worker,
|
|
2160
|
+
terminated: false,
|
|
2080
2161
|
interface: {
|
|
2081
2162
|
run: () => runWebWorker(workerData, { chunkSize, wasmURI, baseURI })
|
|
2082
2163
|
}
|
|
@@ -2092,7 +2173,15 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
|
|
|
2092
2173
|
try {
|
|
2093
2174
|
await initModule(config);
|
|
2094
2175
|
} catch {
|
|
2095
|
-
|
|
2176
|
+
// The WASM module failed to load. Fall back to the native CompressionStream only if the
|
|
2177
|
+
// zlib codec that would otherwise run depends on that module; a self-contained codec
|
|
2178
|
+
// supplied through config (e.g. the pure-JS port) stays usable and is kept as requested.
|
|
2179
|
+
const ZlibStream = options.codecType.startsWith(CODEC_DEFLATE) ?
|
|
2180
|
+
config.CompressionStreamZlib :
|
|
2181
|
+
config.DecompressionStreamZlib;
|
|
2182
|
+
if (!ZlibStream || ZlibStream.requiresModule) {
|
|
2183
|
+
options.useCompressionStream = true;
|
|
2184
|
+
}
|
|
2096
2185
|
}
|
|
2097
2186
|
}
|
|
2098
2187
|
codecStream = new CodecStream(options, config);
|
|
@@ -2131,37 +2220,85 @@ async function runWebWorker(workerData, config) {
|
|
|
2131
2220
|
result
|
|
2132
2221
|
});
|
|
2133
2222
|
const { readable, options } = workerData;
|
|
2134
|
-
const { writable, closed } = watchClosedStream(workerData.writable);
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
2223
|
+
const { writable, closed, abortPipe } = watchClosedStream(workerData.writable);
|
|
2224
|
+
let streamsTransferred;
|
|
2225
|
+
try {
|
|
2226
|
+
streamsTransferred = sendMessage({
|
|
2227
|
+
type: MESSAGE_START,
|
|
2228
|
+
options,
|
|
2229
|
+
config,
|
|
2230
|
+
readable,
|
|
2231
|
+
writable
|
|
2232
|
+
}, workerData);
|
|
2233
|
+
} catch (error) {
|
|
2234
|
+
abortPipe();
|
|
2235
|
+
try {
|
|
2236
|
+
await closed;
|
|
2237
|
+
} catch {
|
|
2238
|
+
// ignored
|
|
2239
|
+
}
|
|
2240
|
+
workerData.onTaskFinished();
|
|
2241
|
+
throw error;
|
|
2242
|
+
}
|
|
2142
2243
|
if (!streamsTransferred) {
|
|
2143
2244
|
Object.assign(workerData, {
|
|
2144
2245
|
reader: readable.getReader(),
|
|
2145
2246
|
writer: writable.getWriter()
|
|
2146
2247
|
});
|
|
2147
2248
|
}
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
await
|
|
2249
|
+
try {
|
|
2250
|
+
const resultValue = await result;
|
|
2251
|
+
await closeWritable();
|
|
2252
|
+
await closed;
|
|
2253
|
+
return resultValue;
|
|
2254
|
+
} catch (error) {
|
|
2255
|
+
await closeWritable();
|
|
2256
|
+
// unblock the pipe watcher if the worker died before closing its end of the stream
|
|
2257
|
+
abortPipe();
|
|
2258
|
+
try {
|
|
2259
|
+
await closed;
|
|
2260
|
+
} catch {
|
|
2261
|
+
// ignored
|
|
2262
|
+
}
|
|
2263
|
+
throw error;
|
|
2264
|
+
}
|
|
2265
|
+
|
|
2266
|
+
async function closeWritable() {
|
|
2267
|
+
if (!streamsTransferred && !writable.locked) {
|
|
2268
|
+
try {
|
|
2269
|
+
await writable.getWriter().close();
|
|
2270
|
+
} catch {
|
|
2271
|
+
// ignored
|
|
2272
|
+
}
|
|
2273
|
+
}
|
|
2151
2274
|
}
|
|
2152
|
-
await closed;
|
|
2153
|
-
return resultValue;
|
|
2154
2275
|
}
|
|
2155
2276
|
|
|
2156
2277
|
function watchClosedStream(writableSource) {
|
|
2278
|
+
const abortController = new AbortController();
|
|
2157
2279
|
const { writable, readable } = new TransformStream();
|
|
2158
|
-
const closed = readable.pipeTo(writableSource, { preventClose: true });
|
|
2159
|
-
|
|
2280
|
+
const closed = readable.pipeTo(writableSource, { preventClose: true, preventAbort: true, signal: abortController.signal });
|
|
2281
|
+
// the pipe can fail before `closed` is awaited (e.g. the destination write fails);
|
|
2282
|
+
// mark the rejection as handled so it cannot kill the process in the meantime
|
|
2283
|
+
closed.catch(() => { });
|
|
2284
|
+
return { writable, closed, abortPipe: () => abortController.abort() };
|
|
2285
|
+
}
|
|
2286
|
+
|
|
2287
|
+
function terminateWorker$1(workerData) {
|
|
2288
|
+
const { worker } = workerData;
|
|
2289
|
+
if (worker) {
|
|
2290
|
+
try {
|
|
2291
|
+
worker.terminate();
|
|
2292
|
+
} catch {
|
|
2293
|
+
// ignored
|
|
2294
|
+
}
|
|
2295
|
+
}
|
|
2296
|
+
workerData.interface = null;
|
|
2160
2297
|
}
|
|
2161
2298
|
|
|
2162
2299
|
function getWebWorker(url, baseURI, workerData, isModuleType, useBlobURI = true) {
|
|
2163
2300
|
let worker, resolvedURI, resolvedOptions;
|
|
2164
|
-
if (webWorkerURI === UNDEFINED_VALUE) {
|
|
2301
|
+
if (webWorkerURI === UNDEFINED_VALUE || webWorkerSource !== url) {
|
|
2165
2302
|
// deno-lint-ignore valid-typeof
|
|
2166
2303
|
const isFunctionURI = typeof url == FUNCTION_TYPE;
|
|
2167
2304
|
if (isFunctionURI) {
|
|
@@ -2218,16 +2355,36 @@ function getWebWorker(url, baseURI, workerData, isModuleType, useBlobURI = true)
|
|
|
2218
2355
|
}
|
|
2219
2356
|
}
|
|
2220
2357
|
}
|
|
2358
|
+
webWorkerSource = url;
|
|
2221
2359
|
webWorkerURI = resolvedURI;
|
|
2222
2360
|
webWorkerOptions = resolvedOptions;
|
|
2223
2361
|
} else {
|
|
2224
2362
|
worker = new Worker(webWorkerURI, webWorkerOptions);
|
|
2225
2363
|
}
|
|
2226
2364
|
worker.addEventListener(MESSAGE_EVENT_TYPE, event => onMessage(event, workerData));
|
|
2365
|
+
worker.addEventListener(ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
|
|
2366
|
+
worker.addEventListener(MESSAGE_ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
|
|
2227
2367
|
return worker;
|
|
2228
2368
|
}
|
|
2229
2369
|
|
|
2230
|
-
function
|
|
2370
|
+
function onWorkerError(event, workerData) {
|
|
2371
|
+
if (event.preventDefault) {
|
|
2372
|
+
event.preventDefault();
|
|
2373
|
+
}
|
|
2374
|
+
const { rejectResult, writer, onTaskFinished } = workerData;
|
|
2375
|
+
// the worker is unusable (e.g. its script failed to load); terminate it and
|
|
2376
|
+
// fail the current task instead of letting it hang forever
|
|
2377
|
+
terminateWorker$1(workerData);
|
|
2378
|
+
if (rejectResult) {
|
|
2379
|
+
rejectResult(event.error || new Error(event.message || ERROR_EVENT_TYPE));
|
|
2380
|
+
if (writer) {
|
|
2381
|
+
writer.releaseLock();
|
|
2382
|
+
}
|
|
2383
|
+
onTaskFinished();
|
|
2384
|
+
}
|
|
2385
|
+
}
|
|
2386
|
+
|
|
2387
|
+
function sendMessage(message, { worker, writer, transferStreams }) {
|
|
2231
2388
|
try {
|
|
2232
2389
|
const { value, readable, writable } = message;
|
|
2233
2390
|
const transferables = [];
|
|
@@ -2261,14 +2418,16 @@ function sendMessage(message, { worker, writer, onTaskFinished, transferStreams
|
|
|
2261
2418
|
if (writer) {
|
|
2262
2419
|
writer.releaseLock();
|
|
2263
2420
|
}
|
|
2264
|
-
onTaskFinished();
|
|
2265
2421
|
throw error;
|
|
2266
2422
|
}
|
|
2267
2423
|
}
|
|
2268
2424
|
|
|
2269
2425
|
async function onMessage({ data }, workerData) {
|
|
2270
2426
|
const { type, value, messageId, result, error } = data;
|
|
2271
|
-
const { reader, writer, resolveResult, rejectResult, onTaskFinished } = workerData;
|
|
2427
|
+
const { reader, writer, resolveResult, rejectResult, onTaskFinished, generation } = workerData;
|
|
2428
|
+
// continuations below can settle after the worker slot has been reassigned to a new
|
|
2429
|
+
// task (e.g. a pending pull read failing late); they must not touch the new task
|
|
2430
|
+
const stale = () => workerData.generation != generation;
|
|
2272
2431
|
try {
|
|
2273
2432
|
if (error) {
|
|
2274
2433
|
const { message, stack, code, name, outputSize } = error;
|
|
@@ -2278,23 +2437,32 @@ async function onMessage({ data }, workerData) {
|
|
|
2278
2437
|
} else {
|
|
2279
2438
|
if (type == MESSAGE_PULL) {
|
|
2280
2439
|
const { value, done } = await reader.read();
|
|
2281
|
-
|
|
2440
|
+
if (!stale()) {
|
|
2441
|
+
sendMessage({ type: MESSAGE_DATA, value, done, messageId }, workerData);
|
|
2442
|
+
}
|
|
2282
2443
|
}
|
|
2283
2444
|
if (type == MESSAGE_DATA) {
|
|
2284
2445
|
await writer.ready;
|
|
2285
2446
|
await writer.write(new Uint8Array(value));
|
|
2286
|
-
|
|
2447
|
+
if (!stale()) {
|
|
2448
|
+
sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
|
|
2449
|
+
}
|
|
2287
2450
|
}
|
|
2288
2451
|
if (type == MESSAGE_CLOSE) {
|
|
2289
2452
|
close(null, result);
|
|
2290
2453
|
}
|
|
2291
2454
|
}
|
|
2292
2455
|
} catch (error) {
|
|
2293
|
-
|
|
2294
|
-
|
|
2456
|
+
if (!stale()) {
|
|
2457
|
+
terminateWorker$1(workerData);
|
|
2458
|
+
close(error);
|
|
2459
|
+
}
|
|
2295
2460
|
}
|
|
2296
2461
|
|
|
2297
2462
|
function close(error, result) {
|
|
2463
|
+
if (stale()) {
|
|
2464
|
+
return;
|
|
2465
|
+
}
|
|
2298
2466
|
if (error) {
|
|
2299
2467
|
rejectResult(error);
|
|
2300
2468
|
} else {
|
|
@@ -2338,6 +2506,8 @@ async function onMessage({ data }, workerData) {
|
|
|
2338
2506
|
|
|
2339
2507
|
let pool = [];
|
|
2340
2508
|
const pendingRequests = [];
|
|
2509
|
+
let starvationTimeout;
|
|
2510
|
+
let starvationDelay;
|
|
2341
2511
|
|
|
2342
2512
|
let indexWorker = 0;
|
|
2343
2513
|
|
|
@@ -2364,14 +2534,20 @@ async function runWorker(stream, workerOptions) {
|
|
|
2364
2534
|
pool.push(workerData);
|
|
2365
2535
|
return new CodecWorker(workerData, stream, workerOptions, onTaskFinished);
|
|
2366
2536
|
} else {
|
|
2367
|
-
return new Promise(resolve =>
|
|
2537
|
+
return new Promise(resolve => {
|
|
2538
|
+
pendingRequests.push({ resolve, stream, workerOptions });
|
|
2539
|
+
starvationDelay = config.workerStarvationTimeout;
|
|
2540
|
+
armStarvationTimeout();
|
|
2541
|
+
});
|
|
2368
2542
|
}
|
|
2369
2543
|
}
|
|
2370
2544
|
|
|
2371
2545
|
function onTaskFinished(workerData) {
|
|
2546
|
+
clearStarvationTimeout();
|
|
2372
2547
|
if (pendingRequests.length) {
|
|
2373
2548
|
const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
|
|
2374
2549
|
resolve(new CodecWorker(workerData, stream, workerOptions, onTaskFinished));
|
|
2550
|
+
armStarvationTimeout();
|
|
2375
2551
|
} else if (workerData.worker) {
|
|
2376
2552
|
clearTerminateTimeout(workerData);
|
|
2377
2553
|
terminateWorker(workerData, workerOptions);
|
|
@@ -2381,6 +2557,34 @@ async function runWorker(stream, workerOptions) {
|
|
|
2381
2557
|
}
|
|
2382
2558
|
}
|
|
2383
2559
|
|
|
2560
|
+
function armStarvationTimeout() {
|
|
2561
|
+
if (!starvationTimeout && pendingRequests.length && Number.isFinite(starvationDelay) && starvationDelay >= 0) {
|
|
2562
|
+
starvationTimeout = setTimeout(onWorkerStarvation, starvationDelay);
|
|
2563
|
+
}
|
|
2564
|
+
}
|
|
2565
|
+
|
|
2566
|
+
function clearStarvationTimeout() {
|
|
2567
|
+
if (starvationTimeout) {
|
|
2568
|
+
clearTimeout(starvationTimeout);
|
|
2569
|
+
starvationTimeout = null;
|
|
2570
|
+
}
|
|
2571
|
+
}
|
|
2572
|
+
|
|
2573
|
+
function onWorkerStarvation() {
|
|
2574
|
+
starvationTimeout = null;
|
|
2575
|
+
if (pendingRequests.length) {
|
|
2576
|
+
const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
|
|
2577
|
+
const inlineWorkerOptions = Object.assign({}, workerOptions, { useWebWorkers: false, workerURI: UNDEFINED_VALUE });
|
|
2578
|
+
resolve(new CodecWorker({}, stream, inlineWorkerOptions, onInlineTaskFinished));
|
|
2579
|
+
armStarvationTimeout();
|
|
2580
|
+
}
|
|
2581
|
+
}
|
|
2582
|
+
|
|
2583
|
+
function onInlineTaskFinished() {
|
|
2584
|
+
clearStarvationTimeout();
|
|
2585
|
+
armStarvationTimeout();
|
|
2586
|
+
}
|
|
2587
|
+
|
|
2384
2588
|
function terminateWorker(workerData, workerOptions) {
|
|
2385
2589
|
const { config } = workerOptions;
|
|
2386
2590
|
const { terminateWorkerTimeout } = config;
|
|
@@ -2451,6 +2655,7 @@ const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
|
|
|
2451
2655
|
|
|
2452
2656
|
const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
|
|
2453
2657
|
const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
|
|
2658
|
+
const HTTP_HEADER_CONTENT_ENCODING = "Content-Encoding";
|
|
2454
2659
|
const HTTP_HEADER_CONTENT_RANGE = "Content-Range";
|
|
2455
2660
|
const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges";
|
|
2456
2661
|
const HTTP_HEADER_RANGE = "Range";
|
|
@@ -2575,7 +2780,7 @@ class Data64URIWriter extends Writer {
|
|
|
2575
2780
|
|
|
2576
2781
|
writeUint8Array(array) {
|
|
2577
2782
|
const writer = this;
|
|
2578
|
-
let indexArray
|
|
2783
|
+
let indexArray;
|
|
2579
2784
|
let dataString = writer.pending;
|
|
2580
2785
|
const delta = writer.pending.length;
|
|
2581
2786
|
writer.pending = "";
|
|
@@ -2585,12 +2790,10 @@ class Data64URIWriter extends Writer {
|
|
|
2585
2790
|
for (; indexArray < array.length; indexArray++) {
|
|
2586
2791
|
writer.pending += String.fromCharCode(array[indexArray]);
|
|
2587
2792
|
}
|
|
2588
|
-
if (dataString.length) {
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
|
|
2592
|
-
writer.pending += dataString;
|
|
2593
|
-
}
|
|
2793
|
+
if (dataString.length > 2) {
|
|
2794
|
+
writer.data += btoa(dataString);
|
|
2795
|
+
} else {
|
|
2796
|
+
writer.pending = dataString + writer.pending;
|
|
2594
2797
|
}
|
|
2595
2798
|
}
|
|
2596
2799
|
|
|
@@ -2637,6 +2840,9 @@ class BlobWriter extends Stream {
|
|
|
2637
2840
|
}
|
|
2638
2841
|
});
|
|
2639
2842
|
writer.blob = new Response(transformStream.readable, { headers }).blob();
|
|
2843
|
+
// mark early rejections (e.g. aborted pipe) as handled; awaiting getData() still
|
|
2844
|
+
// surfaces them
|
|
2845
|
+
writer.blob.catch(() => { });
|
|
2640
2846
|
}
|
|
2641
2847
|
|
|
2642
2848
|
getData() {
|
|
@@ -2721,7 +2927,8 @@ function createHttpReader(httpReader, url, options) {
|
|
|
2721
2927
|
preventHeadRequest,
|
|
2722
2928
|
useRangeHeader,
|
|
2723
2929
|
forceRangeRequests,
|
|
2724
|
-
combineSizeEocd
|
|
2930
|
+
combineSizeEocd,
|
|
2931
|
+
fetch
|
|
2725
2932
|
} = options;
|
|
2726
2933
|
options = Object.assign({}, options);
|
|
2727
2934
|
delete options.preventHeadRequest;
|
|
@@ -2729,13 +2936,15 @@ function createHttpReader(httpReader, url, options) {
|
|
|
2729
2936
|
delete options.forceRangeRequests;
|
|
2730
2937
|
delete options.combineSizeEocd;
|
|
2731
2938
|
delete options.useXHR;
|
|
2939
|
+
delete options.fetch;
|
|
2732
2940
|
Object.assign(httpReader, {
|
|
2733
2941
|
url,
|
|
2734
2942
|
options,
|
|
2735
2943
|
preventHeadRequest,
|
|
2736
2944
|
useRangeHeader,
|
|
2737
2945
|
forceRangeRequests,
|
|
2738
|
-
combineSizeEocd
|
|
2946
|
+
combineSizeEocd,
|
|
2947
|
+
fetch
|
|
2739
2948
|
});
|
|
2740
2949
|
}
|
|
2741
2950
|
|
|
@@ -2754,7 +2963,10 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
|
|
|
2754
2963
|
throw new Error(ERR_HTTP_RANGE);
|
|
2755
2964
|
} else {
|
|
2756
2965
|
if (combineSizeEocd) {
|
|
2757
|
-
|
|
2966
|
+
const eocdCache = new Uint8Array(await response.arrayBuffer());
|
|
2967
|
+
if (response.status == 206 && eocdCache.length == END_OF_CENTRAL_DIR_LENGTH) {
|
|
2968
|
+
httpReader.eocdCache = eocdCache;
|
|
2969
|
+
}
|
|
2758
2970
|
}
|
|
2759
2971
|
let contentSize;
|
|
2760
2972
|
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
@@ -2800,7 +3012,18 @@ async function readUint8ArrayHttpReader(httpReader, index, length, sendRequest,
|
|
|
2800
3012
|
if (response.status != 206) {
|
|
2801
3013
|
throw new Error(ERR_HTTP_RANGE);
|
|
2802
3014
|
}
|
|
2803
|
-
|
|
3015
|
+
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
3016
|
+
if (contentRangeHeader) {
|
|
3017
|
+
const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
|
|
3018
|
+
if (!Number.isNaN(rangeStart) && rangeStart != index) {
|
|
3019
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
3020
|
+
}
|
|
3021
|
+
}
|
|
3022
|
+
const data = new Uint8Array(await response.arrayBuffer());
|
|
3023
|
+
if (data.length != length) {
|
|
3024
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
3025
|
+
}
|
|
3026
|
+
return data;
|
|
2804
3027
|
}
|
|
2805
3028
|
} else {
|
|
2806
3029
|
const { data } = httpReader;
|
|
@@ -2837,9 +3060,9 @@ async function getXMLHttpRequestData(httpReader) {
|
|
|
2837
3060
|
async function getRequestData(httpReader, sendRequest) {
|
|
2838
3061
|
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getHeaders(httpReader));
|
|
2839
3062
|
httpReader.data = new Uint8Array(await response.arrayBuffer());
|
|
2840
|
-
|
|
2841
|
-
|
|
2842
|
-
|
|
3063
|
+
// the downloaded content is authoritative, e.g. the Content-Length response header
|
|
3064
|
+
// of the HEAD request can be the encoded size when the content is compressed
|
|
3065
|
+
httpReader.size = httpReader.data.length;
|
|
2843
3066
|
}
|
|
2844
3067
|
|
|
2845
3068
|
async function getContentLength(httpReader, sendRequest, getRequestData) {
|
|
@@ -2848,7 +3071,7 @@ async function getContentLength(httpReader, sendRequest, getRequestData) {
|
|
|
2848
3071
|
} else {
|
|
2849
3072
|
const response = await sendRequest(HTTP_METHOD_HEAD, httpReader, getHeaders(httpReader));
|
|
2850
3073
|
const contentLength = response.headers.get(HTTP_HEADER_CONTENT_LENGTH);
|
|
2851
|
-
if (contentLength) {
|
|
3074
|
+
if (contentLength && !response.headers.get(HTTP_HEADER_CONTENT_ENCODING)) {
|
|
2852
3075
|
httpReader.size = Number(contentLength);
|
|
2853
3076
|
} else {
|
|
2854
3077
|
await getRequestData(httpReader, httpReader.options);
|
|
@@ -2856,8 +3079,8 @@ async function getContentLength(httpReader, sendRequest, getRequestData) {
|
|
|
2856
3079
|
}
|
|
2857
3080
|
}
|
|
2858
3081
|
|
|
2859
|
-
async function sendFetchRequest(method, { options, url }, headers) {
|
|
2860
|
-
const response = await
|
|
3082
|
+
async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
|
|
3083
|
+
const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
|
|
2861
3084
|
if (response.status < 400) {
|
|
2862
3085
|
return response;
|
|
2863
3086
|
} else {
|
|
@@ -2903,7 +3126,8 @@ class HttpReader extends Reader {
|
|
|
2903
3126
|
super();
|
|
2904
3127
|
Object.assign(this, {
|
|
2905
3128
|
url,
|
|
2906
|
-
|
|
3129
|
+
// an explicit fetch implementation takes precedence over useXHR
|
|
3130
|
+
reader: options.useXHR && !options.fetch ? new XHRReader(url, options) : new FetchReader(url, options)
|
|
2907
3131
|
});
|
|
2908
3132
|
}
|
|
2909
3133
|
|
|
@@ -2928,8 +3152,7 @@ class HttpReader extends Reader {
|
|
|
2928
3152
|
class HttpRangeReader extends HttpReader {
|
|
2929
3153
|
|
|
2930
3154
|
constructor(url, options = {}) {
|
|
2931
|
-
options
|
|
2932
|
-
super(url, options);
|
|
3155
|
+
super(url, Object.assign({}, options, { useRangeHeader: true }));
|
|
2933
3156
|
}
|
|
2934
3157
|
}
|
|
2935
3158
|
|
|
@@ -3003,7 +3226,7 @@ class SplitDataReader extends Reader {
|
|
|
3003
3226
|
reader.lastDiskNumber = 0;
|
|
3004
3227
|
reader.lastDiskOffset = 0;
|
|
3005
3228
|
await Promise.all(readers.map(async (diskReader, indexDiskReader) => {
|
|
3006
|
-
await diskReader
|
|
3229
|
+
await initStream(diskReader);
|
|
3007
3230
|
if (indexDiskReader != readers.length - 1) {
|
|
3008
3231
|
reader.lastDiskOffset += diskReader.size;
|
|
3009
3232
|
}
|
|
@@ -3087,14 +3310,26 @@ class SplitDataWriter extends Stream {
|
|
|
3087
3310
|
writer.diskOffset += diskSourceWriter.size;
|
|
3088
3311
|
writer.diskNumber++;
|
|
3089
3312
|
diskWriter = null;
|
|
3090
|
-
|
|
3313
|
+
// the next disk is not opened yet but its space is available; leaving a
|
|
3314
|
+
// stale value here would force a new disk for every subsequent write
|
|
3315
|
+
writer.availableSize = writer.maxSize;
|
|
3316
|
+
if (chunk.length > availableSize) {
|
|
3317
|
+
await this.write(chunk.subarray(availableSize));
|
|
3318
|
+
}
|
|
3091
3319
|
} else {
|
|
3092
3320
|
await writeChunk(chunk);
|
|
3093
3321
|
}
|
|
3094
3322
|
},
|
|
3095
3323
|
async close() {
|
|
3096
|
-
|
|
3097
|
-
|
|
3324
|
+
if (diskWriter) {
|
|
3325
|
+
await diskWriter.ready;
|
|
3326
|
+
await closeDisk();
|
|
3327
|
+
}
|
|
3328
|
+
},
|
|
3329
|
+
async abort(reason) {
|
|
3330
|
+
if (diskWriter) {
|
|
3331
|
+
await diskWriter.abort(reason);
|
|
3332
|
+
}
|
|
3098
3333
|
}
|
|
3099
3334
|
});
|
|
3100
3335
|
Object.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
|
|
@@ -3109,7 +3344,6 @@ class SplitDataWriter extends Stream {
|
|
|
3109
3344
|
await diskWriter.ready;
|
|
3110
3345
|
await diskWriter.write(chunk);
|
|
3111
3346
|
diskSourceWriter.size += chunkLength;
|
|
3112
|
-
writer.size += chunkLength;
|
|
3113
3347
|
writer.availableSize -= chunkLength;
|
|
3114
3348
|
}
|
|
3115
3349
|
}
|
|
@@ -3209,7 +3443,7 @@ function readUint8Array(reader, offset, size, diskNumber) {
|
|
|
3209
3443
|
|
|
3210
3444
|
/* global TextDecoder */
|
|
3211
3445
|
|
|
3212
|
-
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■
|
|
3446
|
+
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
3213
3447
|
const VALID_CP437 = CP437.length == 256;
|
|
3214
3448
|
|
|
3215
3449
|
function decodeCP437(stringValue) {
|
|
@@ -3257,7 +3491,8 @@ function decodeText(value, encoding) {
|
|
|
3257
3491
|
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
3258
3492
|
return decodeCP437(value);
|
|
3259
3493
|
} else {
|
|
3260
|
-
|
|
3494
|
+
// ignoreBOM keeps a leading U+FEFF in filenames/comments instead of dropping it
|
|
3495
|
+
return new TextDecoder(encoding, { ignoreBOM: true }).decode(value);
|
|
3261
3496
|
}
|
|
3262
3497
|
}
|
|
3263
3498
|
|
|
@@ -3434,6 +3669,7 @@ const OPTION_SIGNAL = "signal";
|
|
|
3434
3669
|
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
3435
3670
|
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
3436
3671
|
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
3672
|
+
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
3437
3673
|
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
3438
3674
|
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
3439
3675
|
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
@@ -3491,12 +3727,16 @@ const ERR_LOCAL_FILE_HEADER_NOT_FOUND = "Local file header not found";
|
|
|
3491
3727
|
const ERR_EXTRAFIELD_ZIP64_NOT_FOUND = "Zip64 extra field not found";
|
|
3492
3728
|
const ERR_ENCRYPTED = "File contains encrypted entry";
|
|
3493
3729
|
const ERR_UNSUPPORTED_ENCRYPTION = "Encryption method not supported";
|
|
3494
|
-
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
3730
|
+
const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
|
|
3495
3731
|
const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
3496
3732
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
3733
|
+
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
3497
3734
|
const CHARSET_UTF8 = "utf-8";
|
|
3498
3735
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
3499
3736
|
const CHARSET_CP437 = "cp437";
|
|
3737
|
+
// bits of the general purpose flag that change how an entry is interpreted; the level bits (1-2) are excluded
|
|
3738
|
+
// because they are informative only
|
|
3739
|
+
const BITFLAG_AMBIGUITY_MASK = BITFLAG_ENCRYPTED | BITFLAG_DATA_DESCRIPTOR | BITFLAG_LANG_ENCODING_FLAG;
|
|
3500
3740
|
const ZIP64_PROPERTIES = [
|
|
3501
3741
|
[PROPERTY_NAME_UNCOMPRESSED_SIZE, MAX_32_BITS],
|
|
3502
3742
|
[PROPERTY_NAME_COMPRESSED_SIZE, MAX_32_BITS],
|
|
@@ -3521,7 +3761,7 @@ class ZipReader {
|
|
|
3521
3761
|
reader: new GenericReader(reader),
|
|
3522
3762
|
options,
|
|
3523
3763
|
config: getConfiguration(),
|
|
3524
|
-
readRanges:
|
|
3764
|
+
readRanges: new Map()
|
|
3525
3765
|
});
|
|
3526
3766
|
}
|
|
3527
3767
|
|
|
@@ -3554,21 +3794,30 @@ class ZipReader {
|
|
|
3554
3794
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
3555
3795
|
const commentLength = getUint16(endOfDirectoryView, 20);
|
|
3556
3796
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
3797
|
+
const checkAmbiguity = getOptionValue$1(zipReader, options, OPTION_CHECK_AMBIGUITY);
|
|
3798
|
+
if (checkAmbiguity && appendedDataOffset != reader.size) {
|
|
3799
|
+
throwAmbiguousArchive("appended data");
|
|
3800
|
+
}
|
|
3557
3801
|
let lastDiskNumber = getUint16(endOfDirectoryView, 4);
|
|
3558
3802
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
3559
3803
|
let diskNumber = getUint16(endOfDirectoryView, 6);
|
|
3560
|
-
let filesLength = getUint16(endOfDirectoryView,
|
|
3804
|
+
let filesLength = getUint16(endOfDirectoryView, 10);
|
|
3561
3805
|
let prependedDataLength = 0;
|
|
3562
|
-
let startOffset
|
|
3806
|
+
let startOffset;
|
|
3807
|
+
let zip64EndOfDirectory;
|
|
3563
3808
|
if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS) {
|
|
3564
|
-
const endOfDirectoryLocatorArray =
|
|
3809
|
+
const endOfDirectoryLocatorArray = endOfDirectoryInfo.offset >= ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH ?
|
|
3810
|
+
await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH) :
|
|
3811
|
+
new Uint8Array();
|
|
3565
3812
|
const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
|
|
3566
|
-
if (
|
|
3813
|
+
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
3814
|
+
getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
3567
3815
|
directoryDataOffset = getBigUint64(endOfDirectoryLocatorView, 8);
|
|
3568
3816
|
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
|
|
3569
3817
|
let endOfDirectoryView = getDataView$1(endOfDirectoryArray);
|
|
3570
|
-
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
3571
|
-
if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE &&
|
|
3818
|
+
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH - (reader.lastDiskOffset || 0);
|
|
3819
|
+
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
3820
|
+
directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
|
|
3572
3821
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
3573
3822
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
3574
3823
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
@@ -3577,24 +3826,36 @@ class ZipReader {
|
|
|
3577
3826
|
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
|
|
3578
3827
|
endOfDirectoryView = getDataView$1(endOfDirectoryArray);
|
|
3579
3828
|
}
|
|
3580
|
-
if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
3829
|
+
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
3581
3830
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
3582
3831
|
}
|
|
3832
|
+
zip64EndOfDirectory = true;
|
|
3583
3833
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
3584
3834
|
lastDiskNumber = getUint32(endOfDirectoryView, 16);
|
|
3835
|
+
} else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
|
|
3836
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3585
3837
|
}
|
|
3586
3838
|
if (diskNumber == MAX_16_BITS) {
|
|
3587
3839
|
diskNumber = getUint32(endOfDirectoryView, 20);
|
|
3840
|
+
} else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
|
|
3841
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3588
3842
|
}
|
|
3589
3843
|
if (filesLength == MAX_16_BITS) {
|
|
3590
3844
|
filesLength = getBigUint64(endOfDirectoryView, 32);
|
|
3845
|
+
} else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
|
|
3846
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3591
3847
|
}
|
|
3592
3848
|
if (directoryDataLength == MAX_32_BITS) {
|
|
3593
3849
|
directoryDataLength = getBigUint64(endOfDirectoryView, 40);
|
|
3850
|
+
} else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
|
|
3851
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3594
3852
|
}
|
|
3595
|
-
directoryDataOffset
|
|
3853
|
+
directoryDataOffset = getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
3596
3854
|
}
|
|
3597
3855
|
}
|
|
3856
|
+
const declaredDirectoryDataLength = directoryDataLength;
|
|
3857
|
+
const centralDirectoryEndOffset = endOfDirectoryInfo.offset -
|
|
3858
|
+
(zip64EndOfDirectory ? ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
|
|
3598
3859
|
if (directoryDataOffset >= reader.size) {
|
|
3599
3860
|
prependedDataLength = reader.size - directoryDataOffset - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
3600
3861
|
directoryDataOffset = reader.size - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
@@ -3609,8 +3870,11 @@ class ZipReader {
|
|
|
3609
3870
|
let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
|
|
3610
3871
|
let directoryView = getDataView$1(directoryArray);
|
|
3611
3872
|
if (directoryDataLength) {
|
|
3612
|
-
|
|
3613
|
-
|
|
3873
|
+
if (directoryArray.length < 4) {
|
|
3874
|
+
throw new Error(ERR_BAD_FORMAT);
|
|
3875
|
+
}
|
|
3876
|
+
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength - (reader.lastDiskOffset || 0);
|
|
3877
|
+
if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE && directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
3614
3878
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
3615
3879
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
3616
3880
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
@@ -3620,8 +3884,8 @@ class ZipReader {
|
|
|
3620
3884
|
directoryView = getDataView$1(directoryArray);
|
|
3621
3885
|
}
|
|
3622
3886
|
}
|
|
3623
|
-
const expectedDirectoryDataLength =
|
|
3624
|
-
if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0) {
|
|
3887
|
+
const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset - (reader.lastDiskOffset || 0);
|
|
3888
|
+
if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0 && diskNumber == lastDiskNumber) {
|
|
3625
3889
|
directoryDataLength = expectedDirectoryDataLength;
|
|
3626
3890
|
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
|
|
3627
3891
|
directoryView = getDataView$1(directoryArray);
|
|
@@ -3629,16 +3893,19 @@ class ZipReader {
|
|
|
3629
3893
|
if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
|
|
3630
3894
|
throw new Error(ERR_BAD_FORMAT);
|
|
3631
3895
|
}
|
|
3896
|
+
startOffset = directoryDataOffset;
|
|
3632
3897
|
const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
|
|
3633
3898
|
const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
|
|
3899
|
+
const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
|
|
3900
|
+
let duplicateFilename;
|
|
3634
3901
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
3635
3902
|
const fileEntry = new ZipEntry$1(reader, config, zipReader.options);
|
|
3636
|
-
if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
3903
|
+
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
3637
3904
|
throw new Error(ERR_CENTRAL_DIRECTORY_NOT_FOUND);
|
|
3638
3905
|
}
|
|
3639
3906
|
readCommonHeader(fileEntry, directoryView, offset + 6);
|
|
3640
3907
|
const languageEncodingFlag = Boolean(fileEntry.bitFlag.languageEncodingFlag);
|
|
3641
|
-
const filenameOffset = offset +
|
|
3908
|
+
const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
|
|
3642
3909
|
const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
|
|
3643
3910
|
const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
|
|
3644
3911
|
const versionMadeBy = getUint16(directoryView, offset + 4);
|
|
@@ -3659,7 +3926,7 @@ class ZipReader {
|
|
|
3659
3926
|
directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
|
|
3660
3927
|
archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
|
|
3661
3928
|
};
|
|
3662
|
-
const offsetFileEntry = getUint32(directoryView, offset + 42)
|
|
3929
|
+
const offsetFileEntry = getUint32(directoryView, offset + 42);
|
|
3663
3930
|
const decode = getOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
3664
3931
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
3665
3932
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
@@ -3672,6 +3939,7 @@ class ZipReader {
|
|
|
3672
3939
|
comment = decodeText(rawComment, rawCommentEncoding);
|
|
3673
3940
|
}
|
|
3674
3941
|
Object.assign(fileEntry, {
|
|
3942
|
+
index: indexFile,
|
|
3675
3943
|
versionMadeBy,
|
|
3676
3944
|
msDosCompatible,
|
|
3677
3945
|
compressedSize: 0,
|
|
@@ -3691,8 +3959,15 @@ class ZipReader {
|
|
|
3691
3959
|
filename,
|
|
3692
3960
|
comment
|
|
3693
3961
|
});
|
|
3694
|
-
startOffset = Math.max(offsetFileEntry, startOffset);
|
|
3695
3962
|
readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
3963
|
+
fileEntry.offset += prependedDataLength;
|
|
3964
|
+
startOffset = Math.min(fileEntry.offset, startOffset);
|
|
3965
|
+
if (checkAmbiguity) {
|
|
3966
|
+
if (filenames.has(fileEntry.filename)) {
|
|
3967
|
+
duplicateFilename = true;
|
|
3968
|
+
}
|
|
3969
|
+
filenames.add(fileEntry.filename);
|
|
3970
|
+
}
|
|
3696
3971
|
const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
|
|
3697
3972
|
if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
|
|
3698
3973
|
fileEntry.unixMode = unixExternalUpper;
|
|
@@ -3713,7 +3988,7 @@ class ZipReader {
|
|
|
3713
3988
|
internalFileAttribute: fileEntry.internalFileAttributes,
|
|
3714
3989
|
externalFileAttribute: fileEntry.externalFileAttributes,
|
|
3715
3990
|
executable,
|
|
3716
|
-
directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || (filename.endsWith(DIRECTORY_SIGNATURE) && !fileEntry.uncompressedSize),
|
|
3991
|
+
directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || (fileEntry.filename.endsWith(DIRECTORY_SIGNATURE) && !fileEntry.uncompressedSize),
|
|
3717
3992
|
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
3718
3993
|
});
|
|
3719
3994
|
const entry = new Entry(fileEntry);
|
|
@@ -3736,6 +4011,15 @@ class ZipReader {
|
|
|
3736
4011
|
}
|
|
3737
4012
|
yield entry;
|
|
3738
4013
|
}
|
|
4014
|
+
if (checkAmbiguity && offset != declaredDirectoryDataLength) {
|
|
4015
|
+
throwAmbiguousArchive("trailing central directory data");
|
|
4016
|
+
}
|
|
4017
|
+
if (duplicateFilename) {
|
|
4018
|
+
throwAmbiguousArchive("duplicate filename");
|
|
4019
|
+
}
|
|
4020
|
+
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
|
|
4021
|
+
throwAmbiguousArchive("prepended data");
|
|
4022
|
+
}
|
|
3739
4023
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
3740
4024
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
3741
4025
|
if (extractPrependedData) {
|
|
@@ -3775,9 +4059,21 @@ class ZipReaderStream {
|
|
|
3775
4059
|
readable: (function () {
|
|
3776
4060
|
const { readable, writable } = new TransformStream();
|
|
3777
4061
|
if (value.getData) {
|
|
3778
|
-
|
|
4062
|
+
getData();
|
|
3779
4063
|
return readable;
|
|
3780
4064
|
}
|
|
4065
|
+
|
|
4066
|
+
async function getData() {
|
|
4067
|
+
try {
|
|
4068
|
+
await value.getData(writable);
|
|
4069
|
+
} catch (error) {
|
|
4070
|
+
try {
|
|
4071
|
+
await writable.abort(error);
|
|
4072
|
+
} catch {
|
|
4073
|
+
// ignored
|
|
4074
|
+
}
|
|
4075
|
+
}
|
|
4076
|
+
}
|
|
3781
4077
|
})()
|
|
3782
4078
|
};
|
|
3783
4079
|
delete chunk.getData;
|
|
@@ -3802,6 +4098,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
3802
4098
|
const zipEntry = this;
|
|
3803
4099
|
const {
|
|
3804
4100
|
reader,
|
|
4101
|
+
index,
|
|
3805
4102
|
offset,
|
|
3806
4103
|
diskNumberStart,
|
|
3807
4104
|
extraFieldAES,
|
|
@@ -3827,27 +4124,42 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
3827
4124
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
3828
4125
|
if (extraFieldAES) {
|
|
3829
4126
|
if (extraFieldAES.originalCompressionMethod != COMPRESSION_METHOD_AES) {
|
|
3830
|
-
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
4127
|
+
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
3831
4128
|
}
|
|
3832
4129
|
}
|
|
3833
4130
|
if ((compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64) && !passThrough) {
|
|
3834
|
-
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
4131
|
+
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
3835
4132
|
}
|
|
3836
|
-
if (getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
4133
|
+
if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
3837
4134
|
throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
|
|
3838
4135
|
}
|
|
3839
4136
|
readCommonHeader(localDirectory, dataView, 4);
|
|
3840
4137
|
const {
|
|
3841
4138
|
extraFieldLength,
|
|
3842
|
-
filenameLength
|
|
3843
|
-
lastAccessDate,
|
|
3844
|
-
creationDate
|
|
4139
|
+
filenameLength
|
|
3845
4140
|
} = localDirectory;
|
|
3846
|
-
|
|
3847
|
-
|
|
3848
|
-
|
|
4141
|
+
const checkAmbiguity = getOptionValue$1(zipEntry, options, OPTION_CHECK_AMBIGUITY);
|
|
4142
|
+
let rawLocalFilename = new Uint8Array();
|
|
4143
|
+
if (checkAmbiguity && (filenameLength || extraFieldLength)) {
|
|
4144
|
+
const trailingDataArray = await readUint8Array(reader, offset + HEADER_SIZE, filenameLength + extraFieldLength, diskNumberStart);
|
|
4145
|
+
rawLocalFilename = trailingDataArray.subarray(0, filenameLength);
|
|
4146
|
+
localDirectory.rawExtraField = trailingDataArray.subarray(filenameLength);
|
|
4147
|
+
} else {
|
|
4148
|
+
localDirectory.rawExtraField = extraFieldLength ?
|
|
4149
|
+
await readUint8Array(reader, offset + HEADER_SIZE + filenameLength, extraFieldLength, diskNumberStart) :
|
|
4150
|
+
new Uint8Array();
|
|
4151
|
+
}
|
|
3849
4152
|
readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
|
|
3850
|
-
|
|
4153
|
+
if (checkAmbiguity) {
|
|
4154
|
+
checkLocalDirectory(zipEntry, localDirectory, rawLocalFilename);
|
|
4155
|
+
}
|
|
4156
|
+
const { lastAccessDate, creationDate } = localDirectory;
|
|
4157
|
+
if (lastAccessDate) {
|
|
4158
|
+
fileEntry.lastAccessDate = lastAccessDate;
|
|
4159
|
+
}
|
|
4160
|
+
if (creationDate) {
|
|
4161
|
+
fileEntry.creationDate = creationDate;
|
|
4162
|
+
}
|
|
3851
4163
|
const encrypted = zipEntry.encrypted && localDirectory.encrypted && !passThrough;
|
|
3852
4164
|
const zipCrypto = encrypted && !extraFieldAES;
|
|
3853
4165
|
if (!passThrough) {
|
|
@@ -3893,7 +4205,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
3893
4205
|
outputSize: passThrough ? compressedSize : uncompressedSize,
|
|
3894
4206
|
signature,
|
|
3895
4207
|
compressed: compressionMethod != 0 && !passThrough,
|
|
3896
|
-
encrypted
|
|
4208
|
+
encrypted,
|
|
3897
4209
|
useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
|
|
3898
4210
|
useCompressionStream,
|
|
3899
4211
|
transferStreams: getOptionValue$1(zipEntry, options, OPTION_TRANSFER_STREAMS),
|
|
@@ -3907,6 +4219,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
3907
4219
|
await detectOverlappingEntry({
|
|
3908
4220
|
reader,
|
|
3909
4221
|
fileEntry,
|
|
4222
|
+
index,
|
|
3910
4223
|
offset,
|
|
3911
4224
|
diskNumberStart,
|
|
3912
4225
|
signature,
|
|
@@ -4009,7 +4322,7 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
4009
4322
|
directory.extraFieldUnicodeComment = extraFieldUnicodeComment;
|
|
4010
4323
|
}
|
|
4011
4324
|
const extraFieldAES = extraField.get(EXTRAFIELD_TYPE_AES);
|
|
4012
|
-
if (extraFieldAES) {
|
|
4325
|
+
if (extraFieldAES && extraFieldAES.data.length >= 7) {
|
|
4013
4326
|
readExtraFieldAES(extraFieldAES, directory, compressionMethod);
|
|
4014
4327
|
directory.extraFieldAES = extraFieldAES;
|
|
4015
4328
|
} else {
|
|
@@ -4046,19 +4359,23 @@ function readExtraFieldZip64(extraFieldZip64, directory) {
|
|
|
4046
4359
|
directory.zip64 = true;
|
|
4047
4360
|
const extraFieldView = getDataView$1(extraFieldZip64.data);
|
|
4048
4361
|
const missingProperties = ZIP64_PROPERTIES.filter(([propertyName, max]) => directory[propertyName] == max);
|
|
4362
|
+
const requiredLength = missingProperties.reduce((length, [, max]) => length + ZIP64_EXTRACTION[max].bytes, 0);
|
|
4363
|
+
if (extraFieldZip64.data.length < requiredLength) {
|
|
4364
|
+
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
4365
|
+
}
|
|
4049
4366
|
for (let indexMissingProperty = 0, offset = 0; indexMissingProperty < missingProperties.length; indexMissingProperty++) {
|
|
4050
4367
|
const [propertyName, max] = missingProperties[indexMissingProperty];
|
|
4051
|
-
|
|
4052
|
-
|
|
4053
|
-
|
|
4054
|
-
offset += extraction.bytes;
|
|
4055
|
-
} else if (extraFieldZip64[propertyName]) {
|
|
4056
|
-
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
4057
|
-
}
|
|
4368
|
+
const extraction = ZIP64_EXTRACTION[max];
|
|
4369
|
+
directory[propertyName] = extraFieldZip64[propertyName] = extraction.getValue(extraFieldView, offset);
|
|
4370
|
+
offset += extraction.bytes;
|
|
4058
4371
|
}
|
|
4059
4372
|
}
|
|
4060
4373
|
|
|
4061
4374
|
function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName, directory, fileEntry) {
|
|
4375
|
+
if (extraFieldUnicode.data.length < 5) {
|
|
4376
|
+
extraFieldUnicode.valid = false;
|
|
4377
|
+
return;
|
|
4378
|
+
}
|
|
4062
4379
|
const extraFieldView = getDataView$1(extraFieldUnicode.data);
|
|
4063
4380
|
const crc32 = new Crc32();
|
|
4064
4381
|
crc32.append(fileEntry[rawPropertyName]);
|
|
@@ -4131,32 +4448,30 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
|
|
|
4131
4448
|
function readExtraFieldUnix(extraField, directory, isInfoZip) {
|
|
4132
4449
|
try {
|
|
4133
4450
|
const view = getDataView$1(new Uint8Array(extraField.data));
|
|
4134
|
-
let
|
|
4135
|
-
|
|
4136
|
-
|
|
4137
|
-
|
|
4138
|
-
|
|
4139
|
-
|
|
4140
|
-
|
|
4141
|
-
|
|
4142
|
-
|
|
4143
|
-
|
|
4144
|
-
|
|
4145
|
-
if (
|
|
4146
|
-
|
|
4147
|
-
|
|
4148
|
-
|
|
4149
|
-
|
|
4150
|
-
|
|
4451
|
+
let uid, gid;
|
|
4452
|
+
if (isInfoZip) {
|
|
4453
|
+
// Info-ZIP New Unix "ux" field (0x7875): version + variable-length uid/gid
|
|
4454
|
+
let offset = 0;
|
|
4455
|
+
const version = getUint8(view, offset++);
|
|
4456
|
+
const uidSize = getUint8(view, offset++);
|
|
4457
|
+
uid = unpackUnixId(extraField.data.subarray(offset, offset + uidSize));
|
|
4458
|
+
offset += uidSize;
|
|
4459
|
+
const gidSize = getUint8(view, offset++);
|
|
4460
|
+
gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
|
|
4461
|
+
Object.assign(extraField, { version, uid, gid });
|
|
4462
|
+
} else if (extraField.data.length >= 4) {
|
|
4463
|
+
// Info-ZIP Unix "Ux" field (0x7855): fixed 2-byte uid + gid (the file mode, if any, is
|
|
4464
|
+
// carried in the external file attributes, not here)
|
|
4465
|
+
uid = getUint16(view, 0);
|
|
4466
|
+
gid = getUint16(view, 2);
|
|
4467
|
+
Object.assign(extraField, { uid, gid });
|
|
4468
|
+
}
|
|
4151
4469
|
if (uid !== UNDEFINED_VALUE) {
|
|
4152
4470
|
directory.uid = uid;
|
|
4153
4471
|
}
|
|
4154
4472
|
if (gid !== UNDEFINED_VALUE) {
|
|
4155
4473
|
directory.gid = gid;
|
|
4156
4474
|
}
|
|
4157
|
-
if (unixMode !== UNDEFINED_VALUE) {
|
|
4158
|
-
directory.unixMode = unixMode;
|
|
4159
|
-
}
|
|
4160
4475
|
} catch {
|
|
4161
4476
|
// ignored
|
|
4162
4477
|
}
|
|
@@ -4170,6 +4485,9 @@ function unpackUnixId(bytes) {
|
|
|
4170
4485
|
}
|
|
4171
4486
|
|
|
4172
4487
|
function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory) {
|
|
4488
|
+
if (!extraFieldExtendedTimestamp.data.length) {
|
|
4489
|
+
return;
|
|
4490
|
+
}
|
|
4173
4491
|
const extraFieldView = getDataView$1(extraFieldExtendedTimestamp.data);
|
|
4174
4492
|
const flags = getUint8(extraFieldView, 0);
|
|
4175
4493
|
const timeProperties = [];
|
|
@@ -4195,7 +4513,8 @@ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory,
|
|
|
4195
4513
|
timeProperties.forEach((propertyName, indexProperty) => {
|
|
4196
4514
|
if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
|
|
4197
4515
|
const time = getUint32(extraFieldView, offset);
|
|
4198
|
-
|
|
4516
|
+
// the extended timestamp is a signed 32-bit time_t value
|
|
4517
|
+
directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
|
|
4199
4518
|
const rawPropertyName = timeRawProperties[indexProperty];
|
|
4200
4519
|
extraFieldExtendedTimestamp[rawPropertyName] = time;
|
|
4201
4520
|
}
|
|
@@ -4206,6 +4525,7 @@ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory,
|
|
|
4206
4525
|
async function detectOverlappingEntry({
|
|
4207
4526
|
reader,
|
|
4208
4527
|
fileEntry,
|
|
4528
|
+
index,
|
|
4209
4529
|
offset,
|
|
4210
4530
|
diskNumberStart,
|
|
4211
4531
|
signature,
|
|
@@ -4217,10 +4537,9 @@ async function detectOverlappingEntry({
|
|
|
4217
4537
|
readRanges
|
|
4218
4538
|
}) {
|
|
4219
4539
|
let diskOffset = 0;
|
|
4220
|
-
if (diskNumberStart) {
|
|
4221
|
-
for (let indexReader = 0; indexReader < diskNumberStart; indexReader++) {
|
|
4222
|
-
|
|
4223
|
-
diskOffset += diskReader.size;
|
|
4540
|
+
if (diskNumberStart && reader.readers) {
|
|
4541
|
+
for (let indexReader = 0; indexReader < Math.min(diskNumberStart, reader.readers.length); indexReader++) {
|
|
4542
|
+
diskOffset += reader.readers[indexReader].size;
|
|
4224
4543
|
}
|
|
4225
4544
|
}
|
|
4226
4545
|
let dataDescriptorLength = 0;
|
|
@@ -4233,7 +4552,8 @@ async function detectOverlappingEntry({
|
|
|
4233
4552
|
}
|
|
4234
4553
|
if (dataDescriptorLength) {
|
|
4235
4554
|
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, diskNumberStart);
|
|
4236
|
-
const dataDescriptorSignature =
|
|
4555
|
+
const dataDescriptorSignature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
|
|
4556
|
+
getUint32(getDataView$1(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
4237
4557
|
if (dataDescriptorSignature) {
|
|
4238
4558
|
const readSignature = getUint32(getDataView$1(dataDescriptorArray), 4);
|
|
4239
4559
|
let readCompressedSize;
|
|
@@ -4258,14 +4578,14 @@ async function detectOverlappingEntry({
|
|
|
4258
4578
|
end: diskOffset + dataOffset + compressedSize + dataDescriptorLength,
|
|
4259
4579
|
fileEntry
|
|
4260
4580
|
};
|
|
4261
|
-
for (const otherRange of readRanges) {
|
|
4262
|
-
if (
|
|
4581
|
+
for (const [otherIndex, otherRange] of readRanges) {
|
|
4582
|
+
if (otherIndex != index && range.start < otherRange.end && otherRange.start < range.end) {
|
|
4263
4583
|
const error = new Error(ERR_OVERLAPPING_ENTRY);
|
|
4264
4584
|
error.overlappingEntry = otherRange.fileEntry;
|
|
4265
4585
|
throw error;
|
|
4266
4586
|
}
|
|
4267
4587
|
}
|
|
4268
|
-
readRanges.
|
|
4588
|
+
readRanges.set(index, range);
|
|
4269
4589
|
}
|
|
4270
4590
|
|
|
4271
4591
|
async function seekSignature(reader, signature, startOffset, minimumBytes, maximumLength) {
|
|
@@ -4290,6 +4610,35 @@ async function seekSignature(reader, signature, startOffset, minimumBytes, maxim
|
|
|
4290
4610
|
}
|
|
4291
4611
|
}
|
|
4292
4612
|
|
|
4613
|
+
function checkLocalDirectory(zipEntry, localDirectory, rawLocalFilename) {
|
|
4614
|
+
const { rawFilename } = zipEntry;
|
|
4615
|
+
if (rawLocalFilename.length != rawFilename.length ||
|
|
4616
|
+
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte])) {
|
|
4617
|
+
throwAmbiguousArchive("mismatched local file header (filename)");
|
|
4618
|
+
}
|
|
4619
|
+
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
4620
|
+
throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
|
|
4621
|
+
}
|
|
4622
|
+
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
4623
|
+
throwAmbiguousArchive("mismatched local file header (compression method)");
|
|
4624
|
+
}
|
|
4625
|
+
// when the data descriptor flag is set, the local signature and sizes are zeroed out; all-zero values are
|
|
4626
|
+
// also tolerated when the flag is clear because some tools produce them (streaming writers predating bit 3)
|
|
4627
|
+
if (!localDirectory.bitFlag.dataDescriptor &&
|
|
4628
|
+
(localDirectory.signature || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
4629
|
+
(localDirectory.signature != zipEntry.signature ||
|
|
4630
|
+
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
4631
|
+
localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
|
|
4632
|
+
throwAmbiguousArchive("mismatched local file header (signature or sizes)");
|
|
4633
|
+
}
|
|
4634
|
+
}
|
|
4635
|
+
|
|
4636
|
+
function throwAmbiguousArchive(reason) {
|
|
4637
|
+
const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
|
|
4638
|
+
error.reason = reason;
|
|
4639
|
+
throw error;
|
|
4640
|
+
}
|
|
4641
|
+
|
|
4293
4642
|
function getOptionValue$1(zipReader, options, name) {
|
|
4294
4643
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
4295
4644
|
}
|
|
@@ -4328,7 +4677,7 @@ function setUint32$1(view, offset, value) {
|
|
|
4328
4677
|
}
|
|
4329
4678
|
|
|
4330
4679
|
function getDataView$1(array) {
|
|
4331
|
-
return new DataView(array.buffer);
|
|
4680
|
+
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
4332
4681
|
}
|
|
4333
4682
|
|
|
4334
4683
|
/*
|
|
@@ -4368,13 +4717,19 @@ const ERR_INVALID_VERSION = "Version exceeds 65535";
|
|
|
4368
4717
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
4369
4718
|
const ERR_INVALID_EXTRAFIELD_TYPE = "Extra field type exceeds 65535";
|
|
4370
4719
|
const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
|
|
4720
|
+
// same message as the constant exported by zip-reader.js
|
|
4721
|
+
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
4722
|
+
const MIN_UNIX_TIME = -2147483648;
|
|
4723
|
+
const MAX_UNIX_TIME = 2147483647;
|
|
4371
4724
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
4372
4725
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
4726
|
+
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
4373
4727
|
const ERR_ZIP_NOT_EMPTY = "Zip file not empty";
|
|
4374
4728
|
const ERR_INVALID_UID = "Invalid uid (must be integer 0..2^32-1)";
|
|
4375
4729
|
const ERR_INVALID_GID = "Invalid gid (must be integer 0..2^32-1)";
|
|
4376
4730
|
const ERR_INVALID_UNIX_MODE = "Invalid UNIX mode (must be integer 0..65535)";
|
|
4377
4731
|
const ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = "Invalid unixExtraFieldType (must be 'infozip' or 'unix')";
|
|
4732
|
+
const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldType 'unix' (use 'infozip' for larger ids)";
|
|
4378
4733
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
4379
4734
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
4380
4735
|
|
|
@@ -4400,9 +4755,10 @@ class ZipWriter {
|
|
|
4400
4755
|
files: new Map(),
|
|
4401
4756
|
filenames: new Set(),
|
|
4402
4757
|
offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
|
|
4403
|
-
|
|
4758
|
+
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
4404
4759
|
pendingAddFileCalls: new Set(),
|
|
4405
|
-
bufferedWrites: 0
|
|
4760
|
+
bufferedWrites: 0,
|
|
4761
|
+
lastFileEntry: UNDEFINED_VALUE
|
|
4406
4762
|
});
|
|
4407
4763
|
}
|
|
4408
4764
|
|
|
@@ -4411,17 +4767,18 @@ class ZipWriter {
|
|
|
4411
4767
|
throw new Error(ERR_ZIP_NOT_EMPTY);
|
|
4412
4768
|
}
|
|
4413
4769
|
reader = new GenericReader(reader);
|
|
4770
|
+
await initStream(reader);
|
|
4414
4771
|
const zipReader = new ZipReader(reader.readable);
|
|
4415
4772
|
const entries = await zipReader.getEntries();
|
|
4416
4773
|
await zipReader.close();
|
|
4774
|
+
await initStream(this.writer);
|
|
4417
4775
|
await reader.readable.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
|
|
4418
4776
|
this.writer.size = this.offset = reader.size;
|
|
4419
4777
|
this.filenames = new Set(entries.map(entry => entry.filename));
|
|
4420
4778
|
this.files = new Map(entries.map(entry => {
|
|
4421
4779
|
const {
|
|
4422
4780
|
version,
|
|
4423
|
-
|
|
4424
|
-
lastModDate,
|
|
4781
|
+
rawLastModDate,
|
|
4425
4782
|
lastAccessDate,
|
|
4426
4783
|
creationDate,
|
|
4427
4784
|
rawFilename,
|
|
@@ -4434,6 +4791,7 @@ class ZipWriter {
|
|
|
4434
4791
|
zip64
|
|
4435
4792
|
} = entry;
|
|
4436
4793
|
let {
|
|
4794
|
+
compressionMethod,
|
|
4437
4795
|
rawExtraFieldZip64,
|
|
4438
4796
|
rawExtraFieldAES,
|
|
4439
4797
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -4446,31 +4804,39 @@ class ZipWriter {
|
|
|
4446
4804
|
rawExtraFieldAES = rawExtraFieldAES || new Uint8Array();
|
|
4447
4805
|
rawExtraFieldExtendedTimestamp = rawExtraFieldExtendedTimestamp || new Uint8Array();
|
|
4448
4806
|
rawExtraFieldNTFS = rawExtraFieldNTFS || new Uint8Array();
|
|
4449
|
-
rawExtraFieldUnix =
|
|
4807
|
+
rawExtraFieldUnix = rawExtraFieldUnix || new Uint8Array();
|
|
4450
4808
|
rawExtraField = rawExtraField || new Uint8Array();
|
|
4809
|
+
if (entry.extraFieldAES) {
|
|
4810
|
+
compressionMethod = COMPRESSION_METHOD_AES;
|
|
4811
|
+
}
|
|
4451
4812
|
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
4452
|
-
const zip64UncompressedSize = zip64 && uncompressedSize
|
|
4453
|
-
const zip64CompressedSize = zip64 && compressedSize
|
|
4813
|
+
const zip64UncompressedSize = zip64 && uncompressedSize >= MAX_32_BITS;
|
|
4814
|
+
const zip64CompressedSize = zip64 && compressedSize >= MAX_32_BITS;
|
|
4815
|
+
const bitFlagValue = (getBitFlag(level, languageEncodingFlag, dataDescriptor, encrypted, compressionMethod) & ~BITFLAG_LEVEL) | (level << 1);
|
|
4454
4816
|
const {
|
|
4455
4817
|
headerArray,
|
|
4456
4818
|
headerView
|
|
4457
4819
|
} = getHeaderArrayData({
|
|
4458
4820
|
version,
|
|
4459
|
-
bitFlag:
|
|
4821
|
+
bitFlag: bitFlagValue,
|
|
4460
4822
|
compressionMethod,
|
|
4461
4823
|
uncompressedSize,
|
|
4462
4824
|
compressedSize,
|
|
4463
|
-
|
|
4825
|
+
rawLastModDate,
|
|
4464
4826
|
rawFilename,
|
|
4465
4827
|
zip64CompressedSize,
|
|
4466
4828
|
zip64UncompressedSize,
|
|
4467
4829
|
extraFieldLength
|
|
4468
4830
|
});
|
|
4831
|
+
const { signature } = entry;
|
|
4832
|
+
if (signature !== UNDEFINED_VALUE) {
|
|
4833
|
+
setUint32(headerView, HEADER_OFFSET_SIGNATURE, signature);
|
|
4834
|
+
}
|
|
4469
4835
|
Object.assign(entry, {
|
|
4470
4836
|
zip64UncompressedSize,
|
|
4471
4837
|
zip64CompressedSize,
|
|
4472
|
-
zip64Offset: zip64 && this.offset - diskOffset
|
|
4473
|
-
zip64DiskNumberStart: zip64 && diskNumber
|
|
4838
|
+
zip64Offset: zip64 && this.offset - diskOffset >= MAX_32_BITS,
|
|
4839
|
+
zip64DiskNumberStart: zip64 && diskNumber >= MAX_16_BITS,
|
|
4474
4840
|
rawExtraFieldZip64,
|
|
4475
4841
|
rawExtraFieldAES,
|
|
4476
4842
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -4488,6 +4854,7 @@ class ZipWriter {
|
|
|
4488
4854
|
|
|
4489
4855
|
async add(name = "", reader, options = {}) {
|
|
4490
4856
|
const zipWriter = this;
|
|
4857
|
+
options = Object.assign({}, options);
|
|
4491
4858
|
const {
|
|
4492
4859
|
pendingAddFileCalls,
|
|
4493
4860
|
config
|
|
@@ -4498,17 +4865,24 @@ class ZipWriter {
|
|
|
4498
4865
|
await new Promise(resolve => pendingEntries.push(resolve));
|
|
4499
4866
|
}
|
|
4500
4867
|
let promiseAddFile;
|
|
4868
|
+
let nameAdded;
|
|
4501
4869
|
try {
|
|
4502
4870
|
name = name.trim();
|
|
4871
|
+
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
4872
|
+
name += DIRECTORY_SIGNATURE;
|
|
4873
|
+
}
|
|
4503
4874
|
if (zipWriter.filenames.has(name)) {
|
|
4504
4875
|
throw new Error(ERR_DUPLICATED_NAME);
|
|
4505
4876
|
}
|
|
4506
4877
|
zipWriter.filenames.add(name);
|
|
4878
|
+
nameAdded = true;
|
|
4507
4879
|
promiseAddFile = addFile(zipWriter, name, reader, options);
|
|
4508
4880
|
pendingAddFileCalls.add(promiseAddFile);
|
|
4509
4881
|
return await promiseAddFile;
|
|
4510
4882
|
} catch (error) {
|
|
4511
|
-
|
|
4883
|
+
if (nameAdded) {
|
|
4884
|
+
zipWriter.filenames.delete(name);
|
|
4885
|
+
}
|
|
4512
4886
|
throw error;
|
|
4513
4887
|
} finally {
|
|
4514
4888
|
pendingAddFileCalls.delete(promiseAddFile);
|
|
@@ -4541,6 +4915,9 @@ class ZipWriter {
|
|
|
4541
4915
|
const zipWriter = this;
|
|
4542
4916
|
const { pendingAddFileCalls, writer } = this;
|
|
4543
4917
|
const { writable } = writer;
|
|
4918
|
+
if (getLength(comment) > MAX_16_BITS) {
|
|
4919
|
+
throw new Error(ERR_INVALID_COMMENT);
|
|
4920
|
+
}
|
|
4544
4921
|
while (pendingAddFileCalls.size) {
|
|
4545
4922
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
4546
4923
|
}
|
|
@@ -4559,28 +4936,94 @@ class ZipWriterStream {
|
|
|
4559
4936
|
const { readable, writable } = new TransformStream();
|
|
4560
4937
|
this.readable = readable;
|
|
4561
4938
|
this.zipWriter = new ZipWriter(writable, options);
|
|
4939
|
+
this.pendingAddFileCalls = new Set();
|
|
4562
4940
|
}
|
|
4563
4941
|
|
|
4564
4942
|
transform(path) {
|
|
4943
|
+
const zipWriter = this.zipWriter;
|
|
4944
|
+
let streamController;
|
|
4565
4945
|
const { readable, writable } = new TransformStream({
|
|
4566
|
-
|
|
4946
|
+
start(controller) {
|
|
4947
|
+
streamController = controller;
|
|
4948
|
+
},
|
|
4949
|
+
flush: () => void closeArchive()
|
|
4567
4950
|
});
|
|
4568
|
-
this.zipWriter.add(path, readable);
|
|
4951
|
+
watchAddFileCall(this, this.zipWriter.add(path, readable), error => streamController.error(error));
|
|
4569
4952
|
return { readable: this.readable, writable };
|
|
4953
|
+
|
|
4954
|
+
async function closeArchive() {
|
|
4955
|
+
try {
|
|
4956
|
+
await zipWriter.close();
|
|
4957
|
+
} catch (error) {
|
|
4958
|
+
try {
|
|
4959
|
+
await zipWriter.writer.writable.abort(error);
|
|
4960
|
+
} catch {
|
|
4961
|
+
// ignored
|
|
4962
|
+
}
|
|
4963
|
+
}
|
|
4964
|
+
}
|
|
4570
4965
|
}
|
|
4571
4966
|
|
|
4572
4967
|
writable(path) {
|
|
4573
|
-
|
|
4574
|
-
|
|
4968
|
+
let streamController;
|
|
4969
|
+
const { readable, writable } = new TransformStream({
|
|
4970
|
+
start(controller) {
|
|
4971
|
+
streamController = controller;
|
|
4972
|
+
}
|
|
4973
|
+
});
|
|
4974
|
+
watchAddFileCall(this, this.zipWriter.add(path, readable), error => streamController.error(error));
|
|
4575
4975
|
return writable;
|
|
4576
4976
|
}
|
|
4577
4977
|
|
|
4578
|
-
close(comment = UNDEFINED_VALUE, options = {}) {
|
|
4978
|
+
async close(comment = UNDEFINED_VALUE, options = {}) {
|
|
4979
|
+
await Promise.all(Array.from(this.pendingAddFileCalls));
|
|
4579
4980
|
return this.zipWriter.close(comment, options);
|
|
4580
4981
|
}
|
|
4581
4982
|
}
|
|
4582
4983
|
|
|
4984
|
+
function watchAddFileCall(zipWriterStream, promiseAddFile, onerror) {
|
|
4985
|
+
zipWriterStream.pendingAddFileCalls.add(promiseAddFile);
|
|
4986
|
+
promiseAddFile.catch(error => {
|
|
4987
|
+
try {
|
|
4988
|
+
onerror(error);
|
|
4989
|
+
} catch {
|
|
4990
|
+
// ignored
|
|
4991
|
+
}
|
|
4992
|
+
});
|
|
4993
|
+
}
|
|
4994
|
+
|
|
4583
4995
|
async function addFile(zipWriter, name, reader, options) {
|
|
4996
|
+
const attributesInfo = resolveAttributes(zipWriter, name, options);
|
|
4997
|
+
({ name } = attributesInfo);
|
|
4998
|
+
const metadataInfo = resolveMetadata(zipWriter, name, options);
|
|
4999
|
+
const { comment } = metadataInfo;
|
|
5000
|
+
const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
|
|
5001
|
+
zipWriter.files.set(name, UNDEFINED_VALUE);
|
|
5002
|
+
let fileEntry;
|
|
5003
|
+
try {
|
|
5004
|
+
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
5005
|
+
({ reader } = sizesInfo);
|
|
5006
|
+
const { diskOffset, diskNumber } = zipWriter.writer;
|
|
5007
|
+
options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
|
|
5008
|
+
internalFileAttribute: metadataInfo.resolvedOptions.internalFileAttributes,
|
|
5009
|
+
externalFileAttribute: attributesInfo.resolvedOptions.externalFileAttributes,
|
|
5010
|
+
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
5011
|
+
offset: zipWriter.offset - diskOffset,
|
|
5012
|
+
diskNumberStart: diskNumber
|
|
5013
|
+
});
|
|
5014
|
+
const headerInfo = getHeaderInfo(options);
|
|
5015
|
+
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
5016
|
+
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
5017
|
+
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
5018
|
+
} catch (error) {
|
|
5019
|
+
zipWriter.files.delete(name);
|
|
5020
|
+
throw error;
|
|
5021
|
+
}
|
|
5022
|
+
Object.assign(fileEntry, { name, comment, extraField });
|
|
5023
|
+
return new Entry(fileEntry);
|
|
5024
|
+
}
|
|
5025
|
+
|
|
5026
|
+
function resolveAttributes(zipWriter, name, options) {
|
|
4584
5027
|
name = name.trim();
|
|
4585
5028
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
4586
5029
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? 20 : 768);
|
|
@@ -4588,7 +5031,7 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4588
5031
|
const uid = getOptionValue(zipWriter, options, PROPERTY_NAME_UID);
|
|
4589
5032
|
const gid = getOptionValue(zipWriter, options, PROPERTY_NAME_GID);
|
|
4590
5033
|
let unixMode = getOptionValue(zipWriter, options, PROPERTY_NAME_UNIX_MODE);
|
|
4591
|
-
|
|
5034
|
+
let unixExtraFieldType = getOptionValue(zipWriter, options, OPTION_UNIX_EXTRA_FIELD_TYPE);
|
|
4592
5035
|
let setuid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETUID);
|
|
4593
5036
|
let setgid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETGID);
|
|
4594
5037
|
let sticky = getOptionValue(zipWriter, options, PROPERTY_NAME_STICKY);
|
|
@@ -4604,6 +5047,13 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4604
5047
|
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
|
|
4605
5048
|
throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
|
|
4606
5049
|
}
|
|
5050
|
+
if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
|
|
5051
|
+
((uid !== UNDEFINED_VALUE && uid > MAX_16_BITS) || (gid !== UNDEFINED_VALUE && gid > MAX_16_BITS))) {
|
|
5052
|
+
throw new Error(ERR_INVALID_UNIX_ID_SIZE);
|
|
5053
|
+
}
|
|
5054
|
+
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
5055
|
+
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
|
|
5056
|
+
}
|
|
4607
5057
|
let msdosAttributesRaw = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
4608
5058
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
4609
5059
|
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
|
|
@@ -4674,6 +5124,27 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4674
5124
|
if (hasMsDosProvided) {
|
|
4675
5125
|
externalFileAttributes = (externalFileAttributes & MAX_32_BITS) | (msdosAttributesRaw & MAX_8_BITS);
|
|
4676
5126
|
}
|
|
5127
|
+
return {
|
|
5128
|
+
name,
|
|
5129
|
+
resolvedOptions: {
|
|
5130
|
+
versionMadeBy,
|
|
5131
|
+
msDosCompatible,
|
|
5132
|
+
externalFileAttributes,
|
|
5133
|
+
unixExternalUpper,
|
|
5134
|
+
uid,
|
|
5135
|
+
gid,
|
|
5136
|
+
unixMode,
|
|
5137
|
+
unixExtraFieldType,
|
|
5138
|
+
setuid,
|
|
5139
|
+
setgid,
|
|
5140
|
+
sticky,
|
|
5141
|
+
msdosAttributesRaw,
|
|
5142
|
+
msdosAttributes
|
|
5143
|
+
}
|
|
5144
|
+
};
|
|
5145
|
+
}
|
|
5146
|
+
|
|
5147
|
+
function resolveMetadata(zipWriter, name, options) {
|
|
4677
5148
|
const encode = getOptionValue(zipWriter, options, OPTION_ENCODE_TEXT, encodeText);
|
|
4678
5149
|
let rawFilename = encode(name);
|
|
4679
5150
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
@@ -4712,10 +5183,14 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4712
5183
|
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS, true);
|
|
4713
5184
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
4714
5185
|
const createTempStream = getOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
4715
|
-
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE,
|
|
5186
|
+
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
4716
5187
|
const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
|
|
4717
5188
|
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
|
|
4718
5189
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
5190
|
+
if (!passThrough && compressionMethod !== UNDEFINED_VALUE &&
|
|
5191
|
+
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE) {
|
|
5192
|
+
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
5193
|
+
}
|
|
4719
5194
|
let level = getOptionValue(zipWriter, options, OPTION_LEVEL);
|
|
4720
5195
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
4721
5196
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
@@ -4731,7 +5206,7 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4731
5206
|
if (!useCompressionStream && (zipWriter.config.CompressionStream === UNDEFINED_VALUE && zipWriter.config.CompressionStreamZlib === UNDEFINED_VALUE)) {
|
|
4732
5207
|
level = 0;
|
|
4733
5208
|
}
|
|
4734
|
-
|
|
5209
|
+
const zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
4735
5210
|
if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(encryptionStrength >= 1 && encryptionStrength <= 3)) {
|
|
4736
5211
|
throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH);
|
|
4737
5212
|
}
|
|
@@ -4742,6 +5217,7 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4742
5217
|
let offset = 0;
|
|
4743
5218
|
extraField.forEach(data => extraFieldSize += 4 + getLength(data));
|
|
4744
5219
|
rawExtraField = new Uint8Array(extraFieldSize);
|
|
5220
|
+
const rawExtraFieldView = getDataView(rawExtraField);
|
|
4745
5221
|
extraField.forEach((data, type) => {
|
|
4746
5222
|
if (type > MAX_16_BITS) {
|
|
4747
5223
|
throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
|
|
@@ -4749,22 +5225,72 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4749
5225
|
if (getLength(data) > MAX_16_BITS) {
|
|
4750
5226
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
4751
5227
|
}
|
|
4752
|
-
|
|
4753
|
-
|
|
5228
|
+
setUint16(rawExtraFieldView, offset, type);
|
|
5229
|
+
setUint16(rawExtraFieldView, offset + 2, getLength(data));
|
|
4754
5230
|
arraySet(rawExtraField, data, offset + 4);
|
|
4755
5231
|
offset += 4 + getLength(data);
|
|
4756
5232
|
});
|
|
4757
5233
|
}
|
|
5234
|
+
return {
|
|
5235
|
+
comment,
|
|
5236
|
+
resolvedOptions: {
|
|
5237
|
+
rawFilename,
|
|
5238
|
+
rawComment,
|
|
5239
|
+
version,
|
|
5240
|
+
lastModDate,
|
|
5241
|
+
lastAccessDate,
|
|
5242
|
+
creationDate,
|
|
5243
|
+
internalFileAttributes,
|
|
5244
|
+
passThrough,
|
|
5245
|
+
password,
|
|
5246
|
+
rawPassword,
|
|
5247
|
+
encryptionStrength,
|
|
5248
|
+
zipCrypto,
|
|
5249
|
+
extendedTimestamp,
|
|
5250
|
+
keepOrder,
|
|
5251
|
+
useWebWorkers,
|
|
5252
|
+
transferStreams,
|
|
5253
|
+
bufferedWrite,
|
|
5254
|
+
createTempStream,
|
|
5255
|
+
dataDescriptorSignature,
|
|
5256
|
+
signal,
|
|
5257
|
+
useUnicodeFileNames,
|
|
5258
|
+
compressionMethod,
|
|
5259
|
+
level,
|
|
5260
|
+
useCompressionStream,
|
|
5261
|
+
dataDescriptor,
|
|
5262
|
+
zip64,
|
|
5263
|
+
rawExtraField
|
|
5264
|
+
}
|
|
5265
|
+
};
|
|
5266
|
+
}
|
|
5267
|
+
|
|
5268
|
+
async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
|
|
5269
|
+
const { passThrough, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
|
|
5270
|
+
let { dataDescriptor, zip64, level, compressionMethod } = metadata;
|
|
4758
5271
|
let maximumCompressedSize = 0;
|
|
4759
|
-
let maximumEntrySize = 0;
|
|
4760
5272
|
let uncompressedSize = 0;
|
|
4761
5273
|
if (passThrough) {
|
|
5274
|
+
// the headers of a passThrough entry describe the payload verbatim: without a
|
|
5275
|
+
// reader they would declare content that is not there
|
|
5276
|
+
if (!reader) {
|
|
5277
|
+
throw new Error(ERR_UNDEFINED_READER);
|
|
5278
|
+
}
|
|
4762
5279
|
uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
|
|
4763
5280
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
4764
5281
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
4765
5282
|
}
|
|
4766
5283
|
}
|
|
4767
5284
|
const zip64Enabled = zip64 === true;
|
|
5285
|
+
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
5286
|
+
// entries without a reader have no payload: write them as empty stored files instead of
|
|
5287
|
+
// declaring a compressed or encrypted content that does not exist
|
|
5288
|
+
const encryptedEntry = Boolean(reader) && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted));
|
|
5289
|
+
if (!reader) {
|
|
5290
|
+
level = 0;
|
|
5291
|
+
compressionMethod = COMPRESSION_METHOD_STORE;
|
|
5292
|
+
}
|
|
5293
|
+
const encryptionOverhead = encryptedEntry ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
4768
5294
|
if (reader) {
|
|
4769
5295
|
reader = new GenericReader(reader);
|
|
4770
5296
|
await initStream(reader);
|
|
@@ -4777,16 +5303,15 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4777
5303
|
}
|
|
4778
5304
|
} else {
|
|
4779
5305
|
options.uncompressedSize = uncompressedSize = reader.size;
|
|
4780
|
-
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize);
|
|
5306
|
+
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize) + encryptionOverhead;
|
|
4781
5307
|
}
|
|
4782
5308
|
} else {
|
|
4783
5309
|
options.uncompressedSize = uncompressedSize;
|
|
4784
|
-
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize);
|
|
5310
|
+
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize) + encryptionOverhead;
|
|
4785
5311
|
}
|
|
4786
5312
|
}
|
|
4787
|
-
const
|
|
4788
|
-
const
|
|
4789
|
-
const zip64CompressedSize = zip64Enabled || maximumCompressedSize > MAX_32_BITS;
|
|
5313
|
+
const zip64UncompressedSize = zip64Enabled || uncompressedSize >= MAX_32_BITS;
|
|
5314
|
+
const zip64CompressedSize = zip64Enabled || maximumCompressedSize >= MAX_32_BITS;
|
|
4790
5315
|
if (zip64UncompressedSize || zip64CompressedSize) {
|
|
4791
5316
|
if (zip64 === false) {
|
|
4792
5317
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
@@ -4795,73 +5320,19 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
4795
5320
|
}
|
|
4796
5321
|
}
|
|
4797
5322
|
zip64 = zip64 || false;
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
|
|
4803
|
-
|
|
4804
|
-
|
|
4805
|
-
|
|
4806
|
-
|
|
4807
|
-
|
|
4808
|
-
|
|
4809
|
-
|
|
4810
|
-
|
|
4811
|
-
password,
|
|
4812
|
-
rawPassword,
|
|
4813
|
-
level,
|
|
4814
|
-
useWebWorkers,
|
|
4815
|
-
transferStreams,
|
|
4816
|
-
encryptionStrength,
|
|
4817
|
-
extendedTimestamp,
|
|
4818
|
-
zipCrypto,
|
|
4819
|
-
bufferedWrite,
|
|
4820
|
-
createTempStream,
|
|
4821
|
-
keepOrder,
|
|
4822
|
-
useUnicodeFileNames,
|
|
4823
|
-
dataDescriptor,
|
|
4824
|
-
dataDescriptorSignature,
|
|
4825
|
-
signal,
|
|
4826
|
-
msDosCompatible,
|
|
4827
|
-
internalFileAttribute: internalFileAttributes,
|
|
4828
|
-
internalFileAttributes,
|
|
4829
|
-
externalFileAttribute: externalFileAttributes,
|
|
4830
|
-
externalFileAttributes,
|
|
4831
|
-
useCompressionStream,
|
|
4832
|
-
passThrough,
|
|
4833
|
-
encrypted: Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted),
|
|
4834
|
-
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
4835
|
-
compressionMethod,
|
|
4836
|
-
uncompressedSize,
|
|
4837
|
-
offset: zipWriter.offset - diskOffset,
|
|
4838
|
-
diskNumberStart: diskNumber,
|
|
4839
|
-
uid,
|
|
4840
|
-
gid,
|
|
4841
|
-
setuid,
|
|
4842
|
-
setgid,
|
|
4843
|
-
sticky,
|
|
4844
|
-
unixMode,
|
|
4845
|
-
msdosAttributesRaw,
|
|
4846
|
-
msdosAttributes,
|
|
4847
|
-
unixExternalUpper
|
|
4848
|
-
});
|
|
4849
|
-
const headerInfo = getHeaderInfo(options);
|
|
4850
|
-
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
4851
|
-
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
4852
|
-
maximumEntrySize = metadataSize + maximumCompressedSize;
|
|
4853
|
-
if (zipWriter.options[OPTION_USDZ]) {
|
|
4854
|
-
maximumEntrySize += maximumEntrySize + 64;
|
|
4855
|
-
}
|
|
4856
|
-
zipWriter.pendingEntriesSize += maximumEntrySize;
|
|
4857
|
-
let fileEntry;
|
|
4858
|
-
try {
|
|
4859
|
-
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
4860
|
-
} finally {
|
|
4861
|
-
zipWriter.pendingEntriesSize -= maximumEntrySize;
|
|
4862
|
-
}
|
|
4863
|
-
Object.assign(fileEntry, { name, comment, extraField });
|
|
4864
|
-
return new Entry(fileEntry);
|
|
5323
|
+
return {
|
|
5324
|
+
reader,
|
|
5325
|
+
resolvedOptions: {
|
|
5326
|
+
dataDescriptor,
|
|
5327
|
+
zip64,
|
|
5328
|
+
zip64UncompressedSize,
|
|
5329
|
+
zip64CompressedSize,
|
|
5330
|
+
uncompressedSize,
|
|
5331
|
+
level,
|
|
5332
|
+
compressionMethod,
|
|
5333
|
+
encrypted: encryptedEntry
|
|
5334
|
+
}
|
|
5335
|
+
};
|
|
4865
5336
|
}
|
|
4866
5337
|
|
|
4867
5338
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
@@ -4878,37 +5349,40 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
4878
5349
|
headerInfo
|
|
4879
5350
|
} = entryInfo;
|
|
4880
5351
|
const usdz = zipWriter.options[OPTION_USDZ];
|
|
4881
|
-
const previousFileEntry =
|
|
5352
|
+
const previousFileEntry = zipWriter.lastFileEntry;
|
|
4882
5353
|
let fileEntry = {};
|
|
4883
5354
|
let bufferedWrite;
|
|
4884
5355
|
let releaseLockWriter;
|
|
4885
5356
|
let releaseLockCurrentFileEntry;
|
|
4886
5357
|
let writingBufferedEntryData;
|
|
4887
5358
|
let writingEntryData;
|
|
5359
|
+
let writerSizeBeforeEntry;
|
|
5360
|
+
let flushedBufferedSize = 0;
|
|
4888
5361
|
let fileWriter;
|
|
4889
5362
|
files.set(name, fileEntry);
|
|
5363
|
+
zipWriter.lastFileEntry = fileEntry;
|
|
4890
5364
|
try {
|
|
4891
5365
|
let lockPreviousFileEntry;
|
|
4892
5366
|
if (keepOrder) {
|
|
4893
5367
|
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
|
|
4894
5368
|
requestLockCurrentFileEntry();
|
|
4895
5369
|
}
|
|
4896
|
-
if (
|
|
5370
|
+
if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
|
|
5371
|
+
bufferedWrite = true;
|
|
5372
|
+
zipWriter.bufferedWrites++;
|
|
4897
5373
|
if (options.createTempStream) {
|
|
4898
5374
|
fileWriter = await options.createTempStream();
|
|
4899
5375
|
} else {
|
|
4900
5376
|
fileWriter = new TransformStream(UNDEFINED_VALUE, UNDEFINED_VALUE, { highWaterMark: INFINITY_VALUE });
|
|
4901
5377
|
}
|
|
4902
5378
|
fileWriter.size = 0;
|
|
4903
|
-
bufferedWrite = true;
|
|
4904
|
-
zipWriter.bufferedWrites++;
|
|
4905
5379
|
await initStream(writer);
|
|
4906
5380
|
} else {
|
|
4907
5381
|
fileWriter = writer;
|
|
4908
5382
|
await requestLockWriter();
|
|
4909
5383
|
}
|
|
4910
5384
|
await initStream(fileWriter);
|
|
4911
|
-
const {
|
|
5385
|
+
const { diskOffset } = writer;
|
|
4912
5386
|
if (zipWriter.addSplitZipSignature) {
|
|
4913
5387
|
delete zipWriter.addSplitZipSignature;
|
|
4914
5388
|
const signatureArray = new Uint8Array(4);
|
|
@@ -4917,21 +5391,20 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
4917
5391
|
await writeData(writer, signatureArray);
|
|
4918
5392
|
zipWriter.offset += 4;
|
|
4919
5393
|
}
|
|
4920
|
-
if (usdz) {
|
|
5394
|
+
if (usdz && !bufferedWrite) {
|
|
4921
5395
|
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
|
|
4922
5396
|
}
|
|
4923
|
-
const {
|
|
4924
|
-
localHeaderView,
|
|
4925
|
-
localHeaderArray
|
|
4926
|
-
} = headerInfo;
|
|
5397
|
+
const { localHeaderArray } = headerInfo;
|
|
4927
5398
|
if (!bufferedWrite) {
|
|
4928
5399
|
await lockPreviousFileEntry;
|
|
4929
|
-
await skipDiskIfNeeded(
|
|
5400
|
+
await skipDiskIfNeeded();
|
|
4930
5401
|
}
|
|
4931
|
-
const
|
|
4932
|
-
|
|
5402
|
+
const diskNumberStart = writer.diskNumber;
|
|
5403
|
+
const entryOffset = getSegmentOffset(zipWriter, writer);
|
|
5404
|
+
fileEntry.diskNumberStart = diskNumberStart;
|
|
4933
5405
|
if (!bufferedWrite) {
|
|
4934
5406
|
writingEntryData = true;
|
|
5407
|
+
writerSizeBeforeEntry = writer.size;
|
|
4935
5408
|
await writeData(fileWriter, localHeaderArray);
|
|
4936
5409
|
}
|
|
4937
5410
|
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, zipWriter.config, options);
|
|
@@ -4944,16 +5417,24 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
4944
5417
|
await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
|
|
4945
5418
|
await requestLockWriter();
|
|
4946
5419
|
writingBufferedEntryData = true;
|
|
5420
|
+
writerSizeBeforeEntry = writer.size;
|
|
5421
|
+
await skipDiskIfNeeded();
|
|
4947
5422
|
fileEntry.diskNumberStart = writer.diskNumber;
|
|
4948
|
-
fileEntry.offset = zipWriter
|
|
4949
|
-
|
|
4950
|
-
|
|
4951
|
-
|
|
4952
|
-
|
|
5423
|
+
fileEntry.offset = getSegmentOffset(zipWriter, writer);
|
|
5424
|
+
if (usdz) {
|
|
5425
|
+
// the padding depends on the entry offset, only known now that the writer is locked
|
|
5426
|
+
const previousMetadataSize = entryInfo.metadataSize;
|
|
5427
|
+
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - writer.diskOffset);
|
|
5428
|
+
fileEntry.size += entryInfo.metadataSize - previousMetadataSize;
|
|
5429
|
+
}
|
|
5430
|
+
updateLocalHeader(fileEntry, headerInfo.localHeaderView, options);
|
|
5431
|
+
await writeData(writer, headerInfo.localHeaderArray);
|
|
5432
|
+
await flushBufferedData(fileWriter.readable, writer, signal, chunkLength => flushedBufferedSize += chunkLength);
|
|
4953
5433
|
writer.size += fileWriter.size;
|
|
4954
5434
|
writingBufferedEntryData = false;
|
|
4955
5435
|
} else {
|
|
4956
|
-
fileEntry.
|
|
5436
|
+
fileEntry.diskNumberStart = diskNumberStart;
|
|
5437
|
+
fileEntry.offset = entryOffset;
|
|
4957
5438
|
}
|
|
4958
5439
|
zipWriter.offset += fileEntry.size;
|
|
4959
5440
|
return fileEntry;
|
|
@@ -4967,10 +5448,9 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
4967
5448
|
// ignored
|
|
4968
5449
|
}
|
|
4969
5450
|
}
|
|
5451
|
+
zipWriter.offset += writer.size - writerSizeBeforeEntry;
|
|
4970
5452
|
if (bufferedWrite) {
|
|
4971
|
-
zipWriter.offset +=
|
|
4972
|
-
} else {
|
|
4973
|
-
zipWriter.offset = fileWriter.size;
|
|
5453
|
+
zipWriter.offset += flushedBufferedSize;
|
|
4974
5454
|
}
|
|
4975
5455
|
}
|
|
4976
5456
|
files.delete(name);
|
|
@@ -5001,10 +5481,10 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
5001
5481
|
await lockWriter;
|
|
5002
5482
|
}
|
|
5003
5483
|
|
|
5004
|
-
async function skipDiskIfNeeded(
|
|
5484
|
+
async function skipDiskIfNeeded() {
|
|
5005
5485
|
if (getLength(headerInfo.localHeaderArray) > writer.availableSize) {
|
|
5006
5486
|
writer.availableSize = 0;
|
|
5007
|
-
await writeData(
|
|
5487
|
+
await writeData(writer, new Uint8Array());
|
|
5008
5488
|
}
|
|
5009
5489
|
}
|
|
5010
5490
|
}
|
|
@@ -5145,6 +5625,10 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
|
|
|
5145
5625
|
uncompressedSize = result.inputSize;
|
|
5146
5626
|
signature = result.signature;
|
|
5147
5627
|
}
|
|
5628
|
+
if ((!zip64CompressedSize && compressedSize >= MAX_32_BITS) ||
|
|
5629
|
+
(!zip64UncompressedSize && uncompressedSize >= MAX_32_BITS)) {
|
|
5630
|
+
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
5631
|
+
}
|
|
5148
5632
|
} catch (error) {
|
|
5149
5633
|
if (error.outputSize !== UNDEFINED_VALUE) {
|
|
5150
5634
|
writer.size += error.outputSize;
|
|
@@ -5207,35 +5691,28 @@ function getHeaderInfo(options) {
|
|
|
5207
5691
|
uncompressedSize
|
|
5208
5692
|
} = options;
|
|
5209
5693
|
let { version, compressionMethod } = options;
|
|
5210
|
-
const compressed = !directory && (
|
|
5694
|
+
const compressed = !directory && (compressionMethod === UNDEFINED_VALUE
|
|
5695
|
+
? (level === UNDEFINED_VALUE || level > 0)
|
|
5696
|
+
: compressionMethod !== COMPRESSION_METHOD_STORE);
|
|
5211
5697
|
let rawLocalExtraFieldZip64;
|
|
5212
5698
|
const uncompressedFile = passThrough || !compressed;
|
|
5213
|
-
|
|
5214
|
-
|
|
5215
|
-
|
|
5216
|
-
|
|
5217
|
-
|
|
5218
|
-
|
|
5219
|
-
|
|
5220
|
-
|
|
5221
|
-
|
|
5222
|
-
|
|
5223
|
-
|
|
5224
|
-
|
|
5225
|
-
setUint16(rawLocalExtraFieldZip64View, 2, getLength(rawLocalExtraFieldZip64) - 4);
|
|
5699
|
+
// entries without a data descriptor are always buffered (cf. getFileEntry), so the
|
|
5700
|
+
// zip64 extra field values can be patched into the local header before flushing it
|
|
5701
|
+
const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || uncompressedFile));
|
|
5702
|
+
const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
|
|
5703
|
+
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
5704
|
+
// APPNOTE 4.5.3: the zip64 extra field of a local header must include both the
|
|
5705
|
+
// uncompressed and compressed size fields
|
|
5706
|
+
const length = 4 + 16;
|
|
5707
|
+
const extraFieldZip64 = createRecordWriter(length);
|
|
5708
|
+
extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
|
|
5709
|
+
extraFieldZip64.uint16(length - 4);
|
|
5710
|
+
rawLocalExtraFieldZip64 = extraFieldZip64.array;
|
|
5226
5711
|
if (zip64ExtraFieldComplete) {
|
|
5227
|
-
|
|
5228
|
-
|
|
5229
|
-
|
|
5230
|
-
|
|
5231
|
-
rawLocalExtraFieldZip64Offset += 8;
|
|
5232
|
-
}
|
|
5233
|
-
if (zip64CompressedSize && uncompressedFile) {
|
|
5234
|
-
setBigUint64(rawLocalExtraFieldZip64View, rawLocalExtraFieldZip64Offset, BigInt(uncompressedSize));
|
|
5235
|
-
rawLocalExtraFieldZip64Offset += 8;
|
|
5236
|
-
}
|
|
5237
|
-
if (rawLocalExtraFieldZip64Offset == 4) {
|
|
5238
|
-
rawLocalExtraFieldZip64 = new Uint8Array();
|
|
5712
|
+
extraFieldZip64.uint64(uncompressedSize);
|
|
5713
|
+
if (uncompressedFile) {
|
|
5714
|
+
const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
5715
|
+
extraFieldZip64.uint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
|
|
5239
5716
|
}
|
|
5240
5717
|
}
|
|
5241
5718
|
} else {
|
|
@@ -5243,11 +5720,11 @@ function getHeaderInfo(options) {
|
|
|
5243
5720
|
}
|
|
5244
5721
|
let rawExtraFieldAES;
|
|
5245
5722
|
if (encrypted && !zipCrypto) {
|
|
5246
|
-
|
|
5247
|
-
|
|
5248
|
-
|
|
5249
|
-
|
|
5250
|
-
|
|
5723
|
+
const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
|
|
5724
|
+
extraFieldAES.uint16(EXTRAFIELD_TYPE_AES);
|
|
5725
|
+
extraFieldAES.bytes(EXTRAFIELD_DATA_AES);
|
|
5726
|
+
rawExtraFieldAES = extraFieldAES.array;
|
|
5727
|
+
rawExtraFieldAES[8] = encryptionStrength;
|
|
5251
5728
|
} else {
|
|
5252
5729
|
rawExtraFieldAES = new Uint8Array();
|
|
5253
5730
|
}
|
|
@@ -5255,33 +5732,38 @@ function getHeaderInfo(options) {
|
|
|
5255
5732
|
let rawExtraFieldExtendedTimestamp;
|
|
5256
5733
|
let extraFieldExtendedTimestampFlag;
|
|
5257
5734
|
if (extendedTimestamp) {
|
|
5258
|
-
|
|
5259
|
-
|
|
5260
|
-
|
|
5261
|
-
|
|
5262
|
-
|
|
5263
|
-
|
|
5264
|
-
|
|
5265
|
-
|
|
5266
|
-
|
|
5267
|
-
|
|
5268
|
-
|
|
5269
|
-
|
|
5270
|
-
|
|
5271
|
-
|
|
5272
|
-
|
|
5735
|
+
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
5736
|
+
if (inUnixTimeRange(lastModTimeUnix)) {
|
|
5737
|
+
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
5738
|
+
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
5739
|
+
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
5740
|
+
extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5741
|
+
extraFieldTimestamp.uint16(extraFieldTimestampLength - 4);
|
|
5742
|
+
extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
|
|
5743
|
+
extraFieldTimestamp.uint32(lastModTimeUnix);
|
|
5744
|
+
if (lastAccessDate) {
|
|
5745
|
+
extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(lastAccessDate)));
|
|
5746
|
+
}
|
|
5747
|
+
if (creationDate) {
|
|
5748
|
+
extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(creationDate)));
|
|
5749
|
+
}
|
|
5750
|
+
rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
|
|
5751
|
+
} else {
|
|
5752
|
+
// the date cannot be stored as a 32-bit time_t; the NTFS field replaces it
|
|
5753
|
+
rawExtraFieldExtendedTimestamp = new Uint8Array();
|
|
5273
5754
|
}
|
|
5274
5755
|
try {
|
|
5275
|
-
rawExtraFieldNTFS = new Uint8Array(36);
|
|
5276
|
-
const extraFieldNTFSView = getDataView(rawExtraFieldNTFS);
|
|
5277
5756
|
const lastModTimeNTFS = getTimeNTFS(lastModDate);
|
|
5278
|
-
|
|
5279
|
-
|
|
5280
|
-
|
|
5281
|
-
|
|
5282
|
-
|
|
5283
|
-
|
|
5284
|
-
|
|
5757
|
+
const extraFieldNTFS = createRecordWriter(36);
|
|
5758
|
+
extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS);
|
|
5759
|
+
extraFieldNTFS.uint16(32);
|
|
5760
|
+
extraFieldNTFS.skip(4);
|
|
5761
|
+
extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS_TAG1);
|
|
5762
|
+
extraFieldNTFS.uint16(24);
|
|
5763
|
+
extraFieldNTFS.uint64(lastModTimeNTFS);
|
|
5764
|
+
extraFieldNTFS.uint64(getTimeNTFS(lastAccessDate) || lastModTimeNTFS);
|
|
5765
|
+
extraFieldNTFS.uint64(getTimeNTFS(creationDate) || lastModTimeNTFS);
|
|
5766
|
+
rawExtraFieldNTFS = extraFieldNTFS.array;
|
|
5285
5767
|
} catch {
|
|
5286
5768
|
rawExtraFieldNTFS = new Uint8Array();
|
|
5287
5769
|
}
|
|
@@ -5290,41 +5772,27 @@ function getHeaderInfo(options) {
|
|
|
5290
5772
|
}
|
|
5291
5773
|
let rawExtraFieldUnix;
|
|
5292
5774
|
try {
|
|
5293
|
-
const { uid, gid,
|
|
5294
|
-
if (unixExtraFieldType && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE
|
|
5775
|
+
const { uid, gid, unixExtraFieldType } = options;
|
|
5776
|
+
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
5295
5777
|
const uidBytes = packUnixId(uid);
|
|
5296
5778
|
const gidBytes = packUnixId(gid);
|
|
5297
|
-
|
|
5298
|
-
|
|
5299
|
-
|
|
5300
|
-
|
|
5301
|
-
|
|
5302
|
-
|
|
5303
|
-
|
|
5304
|
-
|
|
5305
|
-
|
|
5306
|
-
|
|
5307
|
-
|
|
5308
|
-
|
|
5309
|
-
|
|
5310
|
-
|
|
5311
|
-
|
|
5312
|
-
|
|
5313
|
-
|
|
5314
|
-
rawExtraFieldUnix = new Uint8Array(4 + payloadLength);
|
|
5315
|
-
const rawExtraFieldUnixView = getDataView(rawExtraFieldUnix);
|
|
5316
|
-
setUint16(rawExtraFieldUnixView, 0, unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE ? EXTRAFIELD_TYPE_INFOZIP : EXTRAFIELD_TYPE_UNIX);
|
|
5317
|
-
setUint16(rawExtraFieldUnixView, 2, payloadLength);
|
|
5318
|
-
setUint8(rawExtraFieldUnixView, 4, 1);
|
|
5319
|
-
setUint8(rawExtraFieldUnixView, 5, uidBytes.length);
|
|
5320
|
-
let offset = 6;
|
|
5321
|
-
arraySet(rawExtraFieldUnix, uidBytes, offset);
|
|
5322
|
-
offset += uidBytes.length;
|
|
5323
|
-
setUint8(rawExtraFieldUnixView, offset, gidBytes.length);
|
|
5324
|
-
offset++;
|
|
5325
|
-
arraySet(rawExtraFieldUnix, gidBytes, offset);
|
|
5326
|
-
offset += gidBytes.length;
|
|
5327
|
-
arraySet(rawExtraFieldUnix, modeArray, offset);
|
|
5779
|
+
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
5780
|
+
const extraFieldUnix = createRecordWriter(4 + payloadLength);
|
|
5781
|
+
extraFieldUnix.uint16(EXTRAFIELD_TYPE_INFOZIP);
|
|
5782
|
+
extraFieldUnix.uint16(payloadLength);
|
|
5783
|
+
extraFieldUnix.uint8(1);
|
|
5784
|
+
extraFieldUnix.uint8(uidBytes.length);
|
|
5785
|
+
extraFieldUnix.bytes(uidBytes);
|
|
5786
|
+
extraFieldUnix.uint8(gidBytes.length);
|
|
5787
|
+
extraFieldUnix.bytes(gidBytes);
|
|
5788
|
+
rawExtraFieldUnix = extraFieldUnix.array;
|
|
5789
|
+
} else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
5790
|
+
const extraFieldUnix = createRecordWriter(8);
|
|
5791
|
+
extraFieldUnix.uint16(EXTRAFIELD_TYPE_UNIX);
|
|
5792
|
+
extraFieldUnix.uint16(4);
|
|
5793
|
+
extraFieldUnix.uint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
|
|
5794
|
+
extraFieldUnix.uint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
|
|
5795
|
+
rawExtraFieldUnix = extraFieldUnix.array;
|
|
5328
5796
|
} else {
|
|
5329
5797
|
rawExtraFieldUnix = new Uint8Array();
|
|
5330
5798
|
}
|
|
@@ -5342,8 +5810,11 @@ function getHeaderInfo(options) {
|
|
|
5342
5810
|
rawExtraFieldAES[9] = compressionMethod;
|
|
5343
5811
|
compressionMethod = COMPRESSION_METHOD_AES;
|
|
5344
5812
|
}
|
|
5345
|
-
const localExtraFieldZip64Length =
|
|
5813
|
+
const localExtraFieldZip64Length = writeLocalExtraFieldZip64 ? getLength(rawLocalExtraFieldZip64) : 0;
|
|
5346
5814
|
const extraFieldLength = localExtraFieldZip64Length + getLength(rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
5815
|
+
if (extraFieldLength > MAX_16_BITS) {
|
|
5816
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
5817
|
+
}
|
|
5347
5818
|
const {
|
|
5348
5819
|
headerArray,
|
|
5349
5820
|
headerView,
|
|
@@ -5359,29 +5830,27 @@ function getHeaderInfo(options) {
|
|
|
5359
5830
|
zip64UncompressedSize,
|
|
5360
5831
|
extraFieldLength
|
|
5361
5832
|
});
|
|
5362
|
-
|
|
5363
|
-
const localHeaderArray =
|
|
5833
|
+
const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
|
|
5834
|
+
const localHeaderArray = localHeader.array;
|
|
5364
5835
|
const localHeaderView = getDataView(localHeaderArray);
|
|
5365
|
-
|
|
5366
|
-
|
|
5367
|
-
|
|
5368
|
-
|
|
5369
|
-
|
|
5370
|
-
|
|
5371
|
-
|
|
5372
|
-
|
|
5373
|
-
|
|
5374
|
-
|
|
5375
|
-
|
|
5376
|
-
localHeaderOffset += getLength(rawExtraFieldExtendedTimestamp);
|
|
5377
|
-
arraySet(localHeaderArray, rawExtraFieldNTFS, localHeaderOffset);
|
|
5378
|
-
localHeaderOffset += getLength(rawExtraFieldNTFS);
|
|
5379
|
-
arraySet(localHeaderArray, rawExtraFieldUnix, localHeaderOffset);
|
|
5380
|
-
localHeaderOffset += getLength(rawExtraFieldUnix);
|
|
5381
|
-
arraySet(localHeaderArray, rawExtraField, localHeaderOffset);
|
|
5836
|
+
localHeader.uint32(LOCAL_FILE_HEADER_SIGNATURE);
|
|
5837
|
+
localHeader.bytes(headerArray);
|
|
5838
|
+
localHeader.bytes(rawFilename);
|
|
5839
|
+
if (writeLocalExtraFieldZip64) {
|
|
5840
|
+
localHeader.bytes(rawLocalExtraFieldZip64);
|
|
5841
|
+
}
|
|
5842
|
+
localHeader.bytes(rawExtraFieldAES);
|
|
5843
|
+
localHeader.bytes(rawExtraFieldExtendedTimestamp);
|
|
5844
|
+
localHeader.bytes(rawExtraFieldNTFS);
|
|
5845
|
+
localHeader.bytes(rawExtraFieldUnix);
|
|
5846
|
+
localHeader.bytes(rawExtraField);
|
|
5382
5847
|
if (dataDescriptor) {
|
|
5383
|
-
|
|
5384
|
-
|
|
5848
|
+
if (!zip64CompressedSize) {
|
|
5849
|
+
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
5850
|
+
}
|
|
5851
|
+
if (!zip64UncompressedSize) {
|
|
5852
|
+
setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
5853
|
+
}
|
|
5385
5854
|
}
|
|
5386
5855
|
return {
|
|
5387
5856
|
localHeaderArray,
|
|
@@ -5408,7 +5877,7 @@ function getHeaderInfo(options) {
|
|
|
5408
5877
|
function appendExtraFieldUSDZ(entryInfo, zipWriterOffset) {
|
|
5409
5878
|
const { headerInfo } = entryInfo;
|
|
5410
5879
|
let { localHeaderArray, extraFieldLength } = headerInfo;
|
|
5411
|
-
let localHeaderArrayView
|
|
5880
|
+
let localHeaderArrayView;
|
|
5412
5881
|
let extraBytesLength = 64 - ((zipWriterOffset + getLength(localHeaderArray)) % 64);
|
|
5413
5882
|
if (extraBytesLength < 4) {
|
|
5414
5883
|
extraBytesLength += 64;
|
|
@@ -5416,13 +5885,14 @@ function appendExtraFieldUSDZ(entryInfo, zipWriterOffset) {
|
|
|
5416
5885
|
const rawExtraFieldUSDZ = new Uint8Array(extraBytesLength);
|
|
5417
5886
|
const extraFieldUSDZView = getDataView(rawExtraFieldUSDZ);
|
|
5418
5887
|
setUint16(extraFieldUSDZView, 0, EXTRAFIELD_TYPE_USDZ);
|
|
5419
|
-
setUint16(extraFieldUSDZView, 2, extraBytesLength -
|
|
5888
|
+
setUint16(extraFieldUSDZView, 2, extraBytesLength - 4);
|
|
5420
5889
|
const previousLocalHeaderArray = localHeaderArray;
|
|
5421
5890
|
headerInfo.localHeaderArray = localHeaderArray = new Uint8Array(getLength(previousLocalHeaderArray) + extraBytesLength);
|
|
5422
5891
|
arraySet(localHeaderArray, previousLocalHeaderArray);
|
|
5423
5892
|
arraySet(localHeaderArray, rawExtraFieldUSDZ, getLength(previousLocalHeaderArray));
|
|
5424
5893
|
localHeaderArrayView = getDataView(localHeaderArray);
|
|
5425
5894
|
setUint16(localHeaderArrayView, 28, extraFieldLength + extraBytesLength);
|
|
5895
|
+
headerInfo.localHeaderView = localHeaderArrayView;
|
|
5426
5896
|
entryInfo.metadataSize += extraBytesLength;
|
|
5427
5897
|
}
|
|
5428
5898
|
|
|
@@ -5545,37 +6015,32 @@ function updateLocalHeader({
|
|
|
5545
6015
|
}, localHeaderView, { dataDescriptor }) {
|
|
5546
6016
|
if (!dataDescriptor) {
|
|
5547
6017
|
if (!encrypted) {
|
|
5548
|
-
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE +
|
|
6018
|
+
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, signature);
|
|
5549
6019
|
}
|
|
5550
6020
|
if (!zip64CompressedSize) {
|
|
5551
|
-
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE +
|
|
6021
|
+
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, compressedSize);
|
|
5552
6022
|
}
|
|
5553
6023
|
if (!zip64UncompressedSize) {
|
|
5554
|
-
setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE +
|
|
6024
|
+
setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, uncompressedSize);
|
|
5555
6025
|
}
|
|
5556
6026
|
}
|
|
5557
6027
|
if (zip64 && localExtraFieldZip64Length) {
|
|
5558
|
-
|
|
5559
|
-
|
|
5560
|
-
|
|
5561
|
-
|
|
5562
|
-
}
|
|
5563
|
-
if (zip64CompressedSize) {
|
|
5564
|
-
setBigUint64(localHeaderView, localHeaderOffset, BigInt(compressedSize));
|
|
5565
|
-
localHeaderOffset += 8;
|
|
5566
|
-
}
|
|
6028
|
+
// the local zip64 extra field always contains both size slots
|
|
6029
|
+
const localHeaderOffset = HEADER_SIZE + getLength(rawFilename) + 4;
|
|
6030
|
+
setBigUint64(localHeaderView, localHeaderOffset, BigInt(uncompressedSize));
|
|
6031
|
+
setBigUint64(localHeaderView, localHeaderOffset + 8, BigInt(compressedSize));
|
|
5567
6032
|
}
|
|
5568
6033
|
}
|
|
5569
6034
|
|
|
5570
6035
|
|
|
5571
6036
|
async function closeFile(zipWriter, comment, options) {
|
|
5572
|
-
const
|
|
5573
|
-
const {
|
|
5574
|
-
|
|
5575
|
-
|
|
6037
|
+
const directoryDataLength = createDirectoryRecords(zipWriter.files);
|
|
6038
|
+
const { cdStartDiskNumber, cdStartDiskOffset } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
|
|
6039
|
+
await writeEndOfDirectoryRecord(zipWriter, comment, options, { cdStartDiskNumber, cdStartDiskOffset, directoryDataLength });
|
|
6040
|
+
}
|
|
6041
|
+
|
|
6042
|
+
function createDirectoryRecords(files) {
|
|
5576
6043
|
let directoryDataLength = 0;
|
|
5577
|
-
let directoryOffset = zipWriter.offset - diskOffset;
|
|
5578
|
-
let filesLength = files.size;
|
|
5579
6044
|
for (const [, fileEntry] of files) {
|
|
5580
6045
|
const {
|
|
5581
6046
|
rawFilename,
|
|
@@ -5592,24 +6057,27 @@ async function closeFile(zipWriter, comment, options) {
|
|
|
5592
6057
|
uncompressedSize,
|
|
5593
6058
|
compressedSize
|
|
5594
6059
|
} = fileEntry;
|
|
5595
|
-
const zip64Offset = fileEntry.offset
|
|
5596
|
-
const zip64DiskNumberStart = fileEntry.diskNumberStart
|
|
6060
|
+
const zip64Offset = fileEntry.offset >= MAX_32_BITS;
|
|
6061
|
+
const zip64DiskNumberStart = fileEntry.diskNumberStart >= MAX_16_BITS;
|
|
5597
6062
|
let rawExtraFieldZip64;
|
|
5598
6063
|
if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
|
|
5599
|
-
|
|
5600
|
-
|
|
5601
|
-
|
|
5602
|
-
|
|
5603
|
-
if (
|
|
5604
|
-
|
|
5605
|
-
|
|
5606
|
-
|
|
5607
|
-
|
|
5608
|
-
|
|
5609
|
-
if (
|
|
5610
|
-
|
|
5611
|
-
|
|
5612
|
-
if (zip64DiskNumberStart) {
|
|
6064
|
+
const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
|
|
6065
|
+
const extraFieldZip64 = createRecordWriter(length);
|
|
6066
|
+
extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
|
|
6067
|
+
extraFieldZip64.uint16(length - 4);
|
|
6068
|
+
if (zip64UncompressedSize) {
|
|
6069
|
+
extraFieldZip64.uint64(uncompressedSize);
|
|
6070
|
+
}
|
|
6071
|
+
if (zip64CompressedSize) {
|
|
6072
|
+
extraFieldZip64.uint64(compressedSize);
|
|
6073
|
+
}
|
|
6074
|
+
if (zip64Offset) {
|
|
6075
|
+
extraFieldZip64.uint64(fileEntry.offset);
|
|
6076
|
+
}
|
|
6077
|
+
if (zip64DiskNumberStart) {
|
|
6078
|
+
extraFieldZip64.uint32(fileEntry.diskNumberStart);
|
|
6079
|
+
}
|
|
6080
|
+
rawExtraFieldZip64 = extraFieldZip64.array;
|
|
5613
6081
|
} else {
|
|
5614
6082
|
rawExtraFieldZip64 = new Uint8Array();
|
|
5615
6083
|
}
|
|
@@ -5617,32 +6085,41 @@ async function closeFile(zipWriter, comment, options) {
|
|
|
5617
6085
|
fileEntry.zip64Offset = zip64Offset;
|
|
5618
6086
|
fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
|
|
5619
6087
|
let rawExtraFieldTimestamp;
|
|
5620
|
-
|
|
5621
|
-
|
|
5622
|
-
const
|
|
5623
|
-
|
|
5624
|
-
|
|
5625
|
-
|
|
5626
|
-
|
|
6088
|
+
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
6089
|
+
if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
|
|
6090
|
+
const extraFieldTimestamp = createRecordWriter(9);
|
|
6091
|
+
extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
6092
|
+
extraFieldTimestamp.uint16(5);
|
|
6093
|
+
extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
|
|
6094
|
+
extraFieldTimestamp.uint32(lastModTimeUnix);
|
|
6095
|
+
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
5627
6096
|
} else {
|
|
5628
6097
|
rawExtraFieldTimestamp = new Uint8Array();
|
|
5629
6098
|
}
|
|
5630
6099
|
fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
|
|
5631
|
-
|
|
5632
|
-
|
|
5633
|
-
|
|
5634
|
-
|
|
5635
|
-
|
|
5636
|
-
|
|
5637
|
-
|
|
5638
|
-
|
|
5639
|
-
|
|
5640
|
-
|
|
6100
|
+
const extraFieldLength = getLength(
|
|
6101
|
+
rawExtraFieldZip64,
|
|
6102
|
+
rawExtraFieldAES,
|
|
6103
|
+
rawExtraFieldNTFS,
|
|
6104
|
+
rawExtraFieldUnix,
|
|
6105
|
+
rawExtraFieldTimestamp,
|
|
6106
|
+
rawExtraField);
|
|
6107
|
+
if (extraFieldLength > MAX_16_BITS) {
|
|
6108
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
6109
|
+
}
|
|
6110
|
+
directoryDataLength += CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
5641
6111
|
}
|
|
6112
|
+
return directoryDataLength;
|
|
6113
|
+
}
|
|
6114
|
+
|
|
6115
|
+
async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
6116
|
+
const { files, writer } = zipWriter;
|
|
5642
6117
|
const directoryArray = new Uint8Array(directoryDataLength);
|
|
5643
|
-
const directoryView = getDataView(directoryArray);
|
|
5644
6118
|
await initStream(writer);
|
|
6119
|
+
let offset = 0;
|
|
5645
6120
|
let directoryDiskOffset = 0;
|
|
6121
|
+
let cdStartDiskNumber = writer.diskNumber;
|
|
6122
|
+
let cdStartDiskOffset = writer.diskOffset;
|
|
5646
6123
|
for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
|
|
5647
6124
|
const {
|
|
5648
6125
|
offset: fileEntryOffset,
|
|
@@ -5668,52 +6145,46 @@ async function closeFile(zipWriter, comment, options) {
|
|
|
5668
6145
|
compressedSize
|
|
5669
6146
|
} = fileEntry;
|
|
5670
6147
|
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
5671
|
-
|
|
5672
|
-
|
|
6148
|
+
const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
6149
|
+
if (offset + directoryRecordLength - directoryDiskOffset > writer.availableSize) {
|
|
6150
|
+
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
6151
|
+
directoryDiskOffset = offset;
|
|
6152
|
+
writer.availableSize = 0;
|
|
6153
|
+
await writeData(writer, new Uint8Array());
|
|
6154
|
+
}
|
|
6155
|
+
if (indexFileEntry == 0) {
|
|
6156
|
+
cdStartDiskNumber = writer.diskNumber;
|
|
6157
|
+
cdStartDiskOffset = writer.diskOffset;
|
|
6158
|
+
}
|
|
5673
6159
|
if (!zip64UncompressedSize) {
|
|
5674
6160
|
setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
|
|
5675
6161
|
}
|
|
5676
6162
|
if (!zip64CompressedSize) {
|
|
5677
6163
|
setUint32(headerView, HEADER_OFFSET_COMPRESSED_SIZE, compressedSize);
|
|
5678
6164
|
}
|
|
5679
|
-
|
|
5680
|
-
|
|
5681
|
-
|
|
5682
|
-
|
|
5683
|
-
|
|
5684
|
-
|
|
5685
|
-
|
|
5686
|
-
|
|
5687
|
-
|
|
5688
|
-
|
|
5689
|
-
|
|
5690
|
-
|
|
5691
|
-
|
|
5692
|
-
|
|
5693
|
-
|
|
5694
|
-
|
|
5695
|
-
|
|
5696
|
-
|
|
5697
|
-
|
|
5698
|
-
|
|
5699
|
-
|
|
5700
|
-
|
|
5701
|
-
|
|
5702
|
-
directoryOffset += getLength(rawExtraFieldExtendedTimestamp);
|
|
5703
|
-
arraySet(directoryArray, rawExtraFieldNTFS, directoryOffset);
|
|
5704
|
-
directoryOffset += getLength(rawExtraFieldNTFS);
|
|
5705
|
-
arraySet(directoryArray, rawExtraFieldUnix, directoryOffset);
|
|
5706
|
-
directoryOffset += getLength(rawExtraFieldUnix);
|
|
5707
|
-
arraySet(directoryArray, rawExtraField, directoryOffset);
|
|
5708
|
-
directoryOffset += getLength(rawExtraField);
|
|
5709
|
-
arraySet(directoryArray, rawComment, directoryOffset);
|
|
5710
|
-
directoryOffset += getLength(rawComment);
|
|
5711
|
-
if (offset - directoryDiskOffset > writer.availableSize) {
|
|
5712
|
-
writer.availableSize = 0;
|
|
5713
|
-
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
5714
|
-
directoryDiskOffset = offset;
|
|
5715
|
-
}
|
|
5716
|
-
offset = directoryOffset;
|
|
6165
|
+
if ((zip64Offset || zip64DiskNumberStart) && fileEntry.version < VERSION_ZIP64) {
|
|
6166
|
+
setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
|
|
6167
|
+
}
|
|
6168
|
+
const directoryRecord = createRecordWriter(directoryRecordLength);
|
|
6169
|
+
directoryRecord.uint32(CENTRAL_FILE_HEADER_SIGNATURE);
|
|
6170
|
+
directoryRecord.uint16(versionMadeBy);
|
|
6171
|
+
directoryRecord.bytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
|
|
6172
|
+
directoryRecord.uint16(extraFieldLength);
|
|
6173
|
+
directoryRecord.uint16(getLength(rawComment));
|
|
6174
|
+
directoryRecord.uint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
|
|
6175
|
+
directoryRecord.uint16(internalFileAttributes);
|
|
6176
|
+
directoryRecord.uint32(externalFileAttributes);
|
|
6177
|
+
directoryRecord.uint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
|
|
6178
|
+
directoryRecord.bytes(rawFilename);
|
|
6179
|
+
directoryRecord.bytes(rawExtraFieldZip64);
|
|
6180
|
+
directoryRecord.bytes(rawExtraFieldAES);
|
|
6181
|
+
directoryRecord.bytes(rawExtraFieldExtendedTimestamp);
|
|
6182
|
+
directoryRecord.bytes(rawExtraFieldNTFS);
|
|
6183
|
+
directoryRecord.bytes(rawExtraFieldUnix);
|
|
6184
|
+
directoryRecord.bytes(rawExtraField);
|
|
6185
|
+
directoryRecord.bytes(rawComment);
|
|
6186
|
+
arraySet(directoryArray, directoryRecord.array, offset);
|
|
6187
|
+
offset += directoryRecordLength;
|
|
5717
6188
|
if (options.onprogress) {
|
|
5718
6189
|
try {
|
|
5719
6190
|
await options.onprogress(indexFileEntry + 1, files.size, new Entry(fileEntry));
|
|
@@ -5723,36 +6194,53 @@ async function closeFile(zipWriter, comment, options) {
|
|
|
5723
6194
|
}
|
|
5724
6195
|
}
|
|
5725
6196
|
await writeData(writer, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
|
|
6197
|
+
return { cdStartDiskNumber, cdStartDiskOffset };
|
|
6198
|
+
}
|
|
6199
|
+
|
|
6200
|
+
async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
6201
|
+
const { writer } = zipWriter;
|
|
6202
|
+
const { cdStartDiskNumber, cdStartDiskOffset } = cdInfo;
|
|
6203
|
+
let { directoryDataLength } = cdInfo;
|
|
6204
|
+
let filesLength = zipWriter.files.size;
|
|
6205
|
+
let diskNumber = cdStartDiskNumber;
|
|
6206
|
+
let directoryOffset = zipWriter.offset - cdStartDiskOffset - (cdStartDiskNumber ? zipWriter.initialOffset : 0);
|
|
5726
6207
|
let lastDiskNumber = writer.diskNumber;
|
|
5727
|
-
|
|
5728
|
-
if (availableSize < END_OF_CENTRAL_DIR_LENGTH) {
|
|
6208
|
+
if (writer.availableSize < END_OF_CENTRAL_DIR_LENGTH) {
|
|
5729
6209
|
lastDiskNumber++;
|
|
5730
6210
|
}
|
|
5731
6211
|
let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
5732
|
-
if (directoryOffset
|
|
6212
|
+
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || filesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
|
|
5733
6213
|
if (zip64 === false) {
|
|
5734
6214
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
5735
6215
|
} else {
|
|
5736
6216
|
zip64 = true;
|
|
5737
6217
|
}
|
|
5738
6218
|
}
|
|
5739
|
-
const
|
|
5740
|
-
|
|
5741
|
-
|
|
6219
|
+
const commentLength = getLength(comment);
|
|
6220
|
+
if (commentLength > MAX_16_BITS) {
|
|
6221
|
+
throw new Error(ERR_INVALID_COMMENT);
|
|
6222
|
+
}
|
|
6223
|
+
const endOfdirectoryRecord = createRecordWriter(zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
|
|
6224
|
+
if (getLength(endOfdirectoryRecord.array) + commentLength > writer.availableSize) {
|
|
6225
|
+
writer.availableSize = 0;
|
|
6226
|
+
await writeData(writer, new Uint8Array());
|
|
6227
|
+
}
|
|
6228
|
+
lastDiskNumber = writer.diskNumber;
|
|
5742
6229
|
if (zip64) {
|
|
5743
|
-
|
|
5744
|
-
|
|
5745
|
-
|
|
5746
|
-
|
|
5747
|
-
|
|
5748
|
-
|
|
5749
|
-
|
|
5750
|
-
|
|
5751
|
-
|
|
5752
|
-
|
|
5753
|
-
|
|
5754
|
-
|
|
5755
|
-
|
|
6230
|
+
endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
|
|
6231
|
+
endOfdirectoryRecord.uint64(44);
|
|
6232
|
+
endOfdirectoryRecord.uint16(45);
|
|
6233
|
+
endOfdirectoryRecord.uint16(45);
|
|
6234
|
+
endOfdirectoryRecord.uint32(lastDiskNumber);
|
|
6235
|
+
endOfdirectoryRecord.uint32(diskNumber);
|
|
6236
|
+
endOfdirectoryRecord.uint64(filesLength);
|
|
6237
|
+
endOfdirectoryRecord.uint64(filesLength);
|
|
6238
|
+
endOfdirectoryRecord.uint64(directoryDataLength);
|
|
6239
|
+
endOfdirectoryRecord.uint64(directoryOffset);
|
|
6240
|
+
endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
|
|
6241
|
+
endOfdirectoryRecord.uint32(lastDiskNumber);
|
|
6242
|
+
endOfdirectoryRecord.uint64(BigInt(zipWriter.offset) + BigInt(directoryDataLength) - BigInt(writer.diskOffset) - BigInt(writer.diskNumber ? zipWriter.initialOffset : 0));
|
|
6243
|
+
endOfdirectoryRecord.uint32(lastDiskNumber + 1);
|
|
5756
6244
|
const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
|
|
5757
6245
|
if (supportZip64SplitFile) {
|
|
5758
6246
|
lastDiskNumber = MAX_16_BITS;
|
|
@@ -5761,29 +6249,40 @@ async function closeFile(zipWriter, comment, options) {
|
|
|
5761
6249
|
filesLength = MAX_16_BITS;
|
|
5762
6250
|
directoryOffset = MAX_32_BITS;
|
|
5763
6251
|
directoryDataLength = MAX_32_BITS;
|
|
5764
|
-
offset += ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH;
|
|
5765
|
-
}
|
|
5766
|
-
setUint32(endOfdirectoryView, offset, END_OF_CENTRAL_DIR_SIGNATURE);
|
|
5767
|
-
setUint16(endOfdirectoryView, offset + 4, lastDiskNumber);
|
|
5768
|
-
setUint16(endOfdirectoryView, offset + 6, diskNumber);
|
|
5769
|
-
setUint16(endOfdirectoryView, offset + 8, filesLength);
|
|
5770
|
-
setUint16(endOfdirectoryView, offset + 10, filesLength);
|
|
5771
|
-
setUint32(endOfdirectoryView, offset + 12, directoryDataLength);
|
|
5772
|
-
setUint32(endOfdirectoryView, offset + 16, directoryOffset);
|
|
5773
|
-
const commentLength = getLength(comment);
|
|
5774
|
-
if (commentLength) {
|
|
5775
|
-
if (commentLength <= MAX_16_BITS) {
|
|
5776
|
-
setUint16(endOfdirectoryView, offset + 20, commentLength);
|
|
5777
|
-
} else {
|
|
5778
|
-
throw new Error(ERR_INVALID_COMMENT);
|
|
5779
|
-
}
|
|
5780
6252
|
}
|
|
5781
|
-
|
|
6253
|
+
endOfdirectoryRecord.uint32(END_OF_CENTRAL_DIR_SIGNATURE);
|
|
6254
|
+
endOfdirectoryRecord.uint16(lastDiskNumber);
|
|
6255
|
+
endOfdirectoryRecord.uint16(diskNumber);
|
|
6256
|
+
endOfdirectoryRecord.uint16(filesLength);
|
|
6257
|
+
endOfdirectoryRecord.uint16(filesLength);
|
|
6258
|
+
endOfdirectoryRecord.uint32(directoryDataLength);
|
|
6259
|
+
endOfdirectoryRecord.uint32(directoryOffset);
|
|
6260
|
+
endOfdirectoryRecord.uint16(commentLength);
|
|
6261
|
+
await writeData(writer, endOfdirectoryRecord.array);
|
|
5782
6262
|
if (commentLength) {
|
|
5783
6263
|
await writeData(writer, comment);
|
|
5784
6264
|
}
|
|
5785
6265
|
}
|
|
5786
6266
|
|
|
6267
|
+
function createRecordWriter(length) {
|
|
6268
|
+
const array = new Uint8Array(length);
|
|
6269
|
+
const view = getDataView(array);
|
|
6270
|
+
let offset = 0;
|
|
6271
|
+
return {
|
|
6272
|
+
array,
|
|
6273
|
+
uint8: value => { setUint8(view, offset, value); offset += 1; },
|
|
6274
|
+
uint16: value => { setUint16(view, offset, value); offset += 2; },
|
|
6275
|
+
uint32: value => { setUint32(view, offset, value); offset += 4; },
|
|
6276
|
+
uint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
|
|
6277
|
+
bytes: value => { arraySet(array, value, offset); offset += getLength(value); },
|
|
6278
|
+
skip: count => offset += count
|
|
6279
|
+
};
|
|
6280
|
+
}
|
|
6281
|
+
|
|
6282
|
+
function getSegmentOffset(zipWriter, writer) {
|
|
6283
|
+
return zipWriter.offset - writer.diskOffset - (writer.diskNumber ? zipWriter.initialOffset : 0);
|
|
6284
|
+
}
|
|
6285
|
+
|
|
5787
6286
|
async function writeData(writer, array) {
|
|
5788
6287
|
const { writable } = writer;
|
|
5789
6288
|
const streamWriter = writable.getWriter();
|
|
@@ -5796,12 +6295,40 @@ async function writeData(writer, array) {
|
|
|
5796
6295
|
}
|
|
5797
6296
|
}
|
|
5798
6297
|
|
|
6298
|
+
async function flushBufferedData(readable, writer, signal, onChunkWritten) {
|
|
6299
|
+
const streamWriter = writer.writable.getWriter();
|
|
6300
|
+
try {
|
|
6301
|
+
await readable.pipeTo(new WritableStream({
|
|
6302
|
+
async write(chunk) {
|
|
6303
|
+
await streamWriter.ready;
|
|
6304
|
+
await streamWriter.write(chunk);
|
|
6305
|
+
onChunkWritten(getLength(chunk));
|
|
6306
|
+
}
|
|
6307
|
+
}), { preventClose: true, preventAbort: true, signal });
|
|
6308
|
+
} finally {
|
|
6309
|
+
streamWriter.releaseLock();
|
|
6310
|
+
}
|
|
6311
|
+
}
|
|
6312
|
+
|
|
5799
6313
|
function getTimeNTFS(date) {
|
|
5800
6314
|
if (date) {
|
|
5801
6315
|
return ((BigInt(date.getTime()) + BigInt(11644473600000)) * BigInt(10000));
|
|
5802
6316
|
}
|
|
5803
6317
|
}
|
|
5804
6318
|
|
|
6319
|
+
function getTimeUnix(date) {
|
|
6320
|
+
return Math.floor(date.getTime() / 1000);
|
|
6321
|
+
}
|
|
6322
|
+
|
|
6323
|
+
// the extended timestamp extra field stores dates as signed 32-bit time_t values
|
|
6324
|
+
function inUnixTimeRange(timeUnix) {
|
|
6325
|
+
return timeUnix >= MIN_UNIX_TIME && timeUnix <= MAX_UNIX_TIME;
|
|
6326
|
+
}
|
|
6327
|
+
|
|
6328
|
+
function clampUnixTime(timeUnix) {
|
|
6329
|
+
return Math.min(MAX_UNIX_TIME, Math.max(MIN_UNIX_TIME, timeUnix));
|
|
6330
|
+
}
|
|
6331
|
+
|
|
5805
6332
|
function getOptionValue(zipWriter, options, name, defaultValue) {
|
|
5806
6333
|
const result = options[name] === UNDEFINED_VALUE ? zipWriter.options[name] : options[name];
|
|
5807
6334
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
@@ -5832,7 +6359,7 @@ function arraySet(array, typedArray, offset) {
|
|
|
5832
6359
|
}
|
|
5833
6360
|
|
|
5834
6361
|
function getDataView(array) {
|
|
5835
|
-
return new DataView(array.buffer);
|
|
6362
|
+
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
5836
6363
|
}
|
|
5837
6364
|
|
|
5838
6365
|
function getLength(...arrayLikes) {
|
|
@@ -5848,30 +6375,39 @@ function getHeaderArrayData({
|
|
|
5848
6375
|
uncompressedSize,
|
|
5849
6376
|
compressedSize,
|
|
5850
6377
|
lastModDate,
|
|
6378
|
+
rawLastModDate,
|
|
5851
6379
|
rawFilename,
|
|
5852
6380
|
zip64CompressedSize,
|
|
5853
6381
|
zip64UncompressedSize,
|
|
5854
6382
|
extraFieldLength
|
|
5855
6383
|
}) {
|
|
5856
|
-
const
|
|
6384
|
+
const headerRecord = createRecordWriter(HEADER_SIZE - 4);
|
|
6385
|
+
const headerArray = headerRecord.array;
|
|
5857
6386
|
const headerView = getDataView(headerArray);
|
|
5858
|
-
|
|
5859
|
-
|
|
5860
|
-
|
|
5861
|
-
|
|
5862
|
-
|
|
5863
|
-
|
|
5864
|
-
|
|
5865
|
-
|
|
5866
|
-
|
|
6387
|
+
headerRecord.uint16(version);
|
|
6388
|
+
headerRecord.uint16(bitFlag);
|
|
6389
|
+
headerRecord.uint16(compressionMethod);
|
|
6390
|
+
if (rawLastModDate === UNDEFINED_VALUE) {
|
|
6391
|
+
const dateArray = new Uint32Array(1);
|
|
6392
|
+
const dateView = getDataView(dateArray);
|
|
6393
|
+
setUint16(dateView, 0, (((lastModDate.getHours() << 6) | lastModDate.getMinutes()) << 5) | lastModDate.getSeconds() / 2);
|
|
6394
|
+
setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
|
|
6395
|
+
rawLastModDate = dateArray[0];
|
|
6396
|
+
}
|
|
6397
|
+
headerRecord.uint32(rawLastModDate);
|
|
6398
|
+
headerRecord.skip(4);
|
|
5867
6399
|
if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
|
|
5868
|
-
|
|
6400
|
+
headerRecord.uint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
|
|
6401
|
+
} else {
|
|
6402
|
+
headerRecord.skip(4);
|
|
5869
6403
|
}
|
|
5870
6404
|
if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
|
|
5871
|
-
|
|
6405
|
+
headerRecord.uint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
|
|
6406
|
+
} else {
|
|
6407
|
+
headerRecord.skip(4);
|
|
5872
6408
|
}
|
|
5873
|
-
|
|
5874
|
-
|
|
6409
|
+
headerRecord.uint16(getLength(rawFilename));
|
|
6410
|
+
headerRecord.uint16(extraFieldLength);
|
|
5875
6411
|
return {
|
|
5876
6412
|
headerArray,
|
|
5877
6413
|
headerView,
|
|
@@ -5972,7 +6508,7 @@ try {
|
|
|
5972
6508
|
// ignored
|
|
5973
6509
|
}
|
|
5974
6510
|
|
|
5975
|
-
var{Uint8Array:x,Uint16Array:E,Int32Array:H,TransformStream:U,Math:N,Error:z,Array:v}=globalThis,Se=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],F=new x(0),qe=new E(0),de=[];for(let e=0;e<6;e++)de.push(e,0==e?8:4);de.push(0,1);var Ee=[];for(let e=0;e<14;e++)Ee.push(e,0==e?4:2);var ge=new E([0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576]),Te=new E([0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224,0]);function M(e,t,n,r,i){if(0==i)return;let f=e instanceof x?e:new x(e.buffer,e.byteOffset,e.byteLength),_=n instanceof x?n.subarray(r,r+i):new x(n.buffer,n.byteOffset+r,i);f.set(_,t);}function je(e,t,n){0!=n&&(e instanceof x?e:new x(e.buffer,e.byteOffset,e.byteLength)).fill(0,t,t+n);}function Ve(){return {next_in:F,next_in_index:0,avail_in:0,total_in:0,next_out:F,next_out_index:0,avail_out:0,total_out:0,msg:"",t:0,i:0,_:0,l:void 0}}function Je(e,t){let n=1<<t;return {o:e,u:new x(n),h:n,v:t,k:0,m:0,p:0,I:0}}function te(e){let t=[];for(let n=0;n<e.length;n+=2){let r=e[n],i=e[n+1];for(let e=0;e<i;e++)t.push(r);}return new E(t)}var ne=class{constructor(e,t){this.L=e,this.M=t,this.F=0;}},re=class{constructor(e,t,n,r,i){this.q=e,this.N=t,this.V=n,this.W=r,this.S=i;}};function g_(e){return V_[e<-6||e>2?9:2-e]||""}function Ae(e,t){try{e.msg=g_(t);}catch(n){e.msg="zlib error "+String(t)+" ("+n+")";}return t}function $e(e,t){let n=e>>>0,r=0;for(let e=0;e<t;e++)r=r<<1|1&n,n>>>=1;return r}function g(e,t){e.$[e.A++]=t;}function De(e,t){g(e,255&t),g(e,t>>>8&255);}function e_(e,t,n){let r=255&n,i=65535&t,f=e.U+e.D;return e.$[f]=255&i,e.$[f+1]=i>>>8&255,e.$[f+2]=r,e.D+=3,i=i-1&65535,e.C[__[r]+ie+1].Z++,e.T[T_(i)].Z++,e.D==e.B}function ye(e,t){let n=255&t,r=e.U+e.D;return e.$[r]=0,e.$[r+1]=0,e.$[r+2]=n,e.D+=3,e.C[n].Z++,e.D==e.B}function ve(e){return e.h-ae}function T_(e){return e<256?E_[e]:E_[256+(e>>7)]}function w_(e){let t=He+7,n=1<<t,r=(1<<t)-1,i=N.floor((t+I-1)/I),f=1<<8+He;return {...Je(e,15),o:e,R:42,G:0,O:void 0,P:32767,H:t,J:n,X:r,Y:i,j:new E(32768),K:new E(n),ee:f,$:new x(32768),te:0,ne:32768,A:0,re:0,ie:0,fe:0,_e:0,le:0,oe:-2,ue:0,ae:0,ce:0,se:0,he:0,de:0,we:0,be:0,ge:0,ve:0,ke:0,me:0,xe:0,ye:0,pe:new H(2*we+1),Ie:new x(2*we+1),ze:new E(be+1),D:0,B:0,Le:F,U:0,Ee:0,Me:0,Fe:8,qe:32768,Ne:0,Ve:0,We:0,C:new v(le).fill(0).map(()=>Q()),T:new v(2*me+1).fill(0).map(()=>Q()),Se:new v(2*oe+1).fill(0).map(()=>Q()),$e:S_(),Ae:S_(),Ue:S_()}}function A_(e){let t=[];for(let n=0;n<e.length;n+=2){let r=e[n],i=e[n+1],f=Q();f.Qe=r,f.De=i,t.push(f);}return t}function Q(){return {Z:0,Qe:0,Ze:0,De:0}}function S_(){return new ne([],mn(null,F,0,0,0))}function mn(e,t,n,r,i){return new re(e,t,n,r,i)}function J_(){let e=new v(288).fill(0);for(let t=0;t<=143;t++)e[t]=8;for(let t=144;t<=255;t++)e[t]=9;for(let t=256;t<=279;t++)e[t]=7;for(let t=280;t<=287;t++)e[t]=8;return e}function D_(e){let{code:t,length:n}=bn(e),r=new E(2*e.length),i=0;for(let f=0;f<e.length;f++){let e=n[f]||0,_=t[f]||0;r[i++]=e?$e(_,e):0,r[i++]=e;}return new E(r)}function Q_(e,t,n){let r=0;for(let n=0;n<e.length;n++){let i=t[n]?1<<t[n]:1,f=e[n]+i-1;f>r&&(r=f);}r<n&&(r=n);let i=new x(r+1);for(let n=0;n<=r;n++)for(let r=0;r<e.length;r++){let f=t[r]?1<<t[r]:1,_=e[r];if(n>=_&&n<=_+f-1){i[n]=r;break}}return i}function $_(e,t){let n=0;for(let r=0;r<e.length;r++){let i=t[r]?1<<t[r]:1,f=e[r]+i-1;f>n&&(n=f);}let r=new x(n+1);for(let i=0;i<=n;i++)for(let n=0;n<e.length;n++){let f=t[n]?1<<t[n]:1,_=e[n];if(i>=_&&i<=_+f-1){r[i]=n;break}}return r}function et(e){let t=new x(512),n=e.length-1;for(let r=0;r<256;r++)t[r]=r<=n?e[r]:e[n];for(let r=256;r<=n;r++){let n=r>>7;t[256+(n>255?255:n)]=e[r];}for(let e=257;e<512;e++)0==t[e]&&(t[e]=t[e-1]);return t}function bn(e){let t=N.max(...e),n=new v(t+1).fill(0);for(let t of e)t>0&&n[t]++;let r=new v(e.length).fill(0),i=new v(t+1).fill(0),f=0;for(let e=1;e<=t;e++)f=f+n[e-1]<<1,i[e]=f;for(let t=0;t<e.length;t++){let n=e[t];0!=n&&(r[t]=i[n]++);}return {code:r,length:e}}var He=8,I=3,_e=258,ae=_e+I+1,Ue=16,Be=_e,hn=29,ie=256,we=ie+1+hn,me=30,oe=19,le=2*we+1,be=15,_t=9,tt=255,nt=32,rt=4,ke=256,t_=16,n_=17,r_=18,at=0,y_=1,it=2,$=-1,V_=["need dictionary","stream end","","file error","stream error","data error","insufficient memory","buffer error",""],a_=te(de),i_=te(Ee),Ze=new E(19);Ze[16]=2,Ze[17]=3,Ze[18]=7;var sn=D_(J_()),xn=D_(new v(30).fill(5)),Fe=A_(sn),v_=A_(xn),__=Q_(Te,a_,_e),E_=et($_(ge,i_));function Pe(e){return e%65521>>>0}function he(e,t,n){if(void 0===t||void 0===n)return 1;let r=e>>>16&65535;if(e&=65535,1==n)return (e+=t[0])>=65521&&(e-=65521),r+=e,r>=65521&&(r-=65521),(r<<16|e)>>>0;if(n<16){for(let i=0;i<n;i++)r+=e+=t[i];return e>=65521&&(e-=65521),r=Pe(r),(r<<16|e)>>>0}for(;n>=5552;){n-=5552;let i=N.floor(347);do{for(let n=0;n<16;n++)r+=e+=t[n];t=t.subarray(16);}while(--i);e=Pe(e),r=Pe(r);}if(n){for(;n>=16;){n-=16;for(let n=0;n<16;n++)r+=e+=t[n];t=t.subarray(16);}for(let i=0;i<n;i++)r+=e+=t[i];e=Pe(e),r=Pe(r);}return (r<<16|e)>>>0}var pn=(()=>{let e=new v(256);for(let t=0;t<256;t++){let n=t;for(let e=0;e<8;e++)n=1&n?3988292384^n>>>1:n>>>1;e[t]=n>>>0;}return e})();function W(e=0,t,n){if(!t)return 0;void 0===n&&(n=t.length),n=N.min(n,t.length),e=~e>>>0;for(let r=0;r<n;r++)e=e>>>8^pn[255&(e^t[r])];return (4294967295^e)>>>0}function mt(e){16==e.I?(De(e,e.p),e.p=0,e.I=0):e.I>=8&&(g(e,e.p),e.p>>=8,e.I-=8);}function bt(e){e.I>8?De(e,e.p):e.I>0&&g(e,e.p),e.Ee=1+(e.I-1&7),e.p=0,e.I=0;}function Sn(e,t,n){let r,i,f=[],_=0;for(r=1;r<=be;r++)_=_+n[r-1]<<1,f[r]=_;for(i=0;i<=t;i++){let t=e[i].De;0!=t&&(e[i].Qe=$e(f[t]++,t));}}function L(e,t,n){e.I>Ue-n?(e.p=65535&(e.p|t<<e.I),De(e,e.p),e.p=t>>Ue-e.I&65535,e.I+=n-Ue):(e.p=65535&(e.p|t<<e.I),e.I+=n);}function ht(e){for(let t=0;t<e.C.length;t++)e.C[t].Z=0;for(let t=0;t<e.T.length;t++)e.T[t].Z=0;for(let t=0;t<e.Se.length;t++)e.Se[t].Z=0;e.C[ke].Z=1,e.ie=e.fe=0,e.D=e._e=0;}function st(e){if(e.C&&e.C.length>=le)for(let t=0;t<le;t++)e.C[t]=Q();else {e.C=[];for(let t=0;t<le;t++)e.C.push(Q());}if(e.T&&e.T.length>=2*me+1)for(let t=0;t<2*me+1;t++)e.T[t]=Q();else {e.T=[];for(let t=0;t<2*me+1;t++)e.T.push(Q());}if(e.Se&&e.Se.length>=2*oe+1)for(let t=0;t<2*oe+1;t++)e.Se[t]=Q();else {e.Se=[];for(let t=0;t<2*oe+1;t++)e.Se.push(Q());}e.$e=new ne(e.C,new re(Fe,a_,ie+1,we,be)),e.Ae=new ne(e.T,new re(v_,i_,0,me,be)),e.Ue=new ne(e.Se,new re(null,Ze,0,oe,7)),e.p=0,e.I=0,e.Ee=0,ht(e);}var se=1;function En(e,t,n){return n=e.pe[se],e.pe[se]=e.pe[e.Ve--],k_(e,t,se),n}function ft(e,t,n,r){return e[t].Z<e[n].Z||e[t].Z==e[n].Z&&r[t]<=r[n]}function k_(e,t,n){let r=e.pe[n],i=n<<1;for(;i<=e.Ve&&(i<e.Ve&&ft(t,e.pe[i+1],e.pe[i],e.Ie)&&i++,!ft(t,r,e.pe[i],e.Ie));)e.pe[n]=e.pe[i],n=i,i<<=1;e.pe[n]=r;}function gn(e,t){let n,r,i,f,_,l,o=t.L,u=t.F,a=t.M.q,c=t.M.N,s=t.M.V,h=t.M.S,d=0;for(f=0;f<=be;f++)e.ze[f]=0;for(o[e.pe[e.We]].De=0,n=e.We+1;n<le;n++)r=e.pe[n],f=o[o[r].Ze].De+1,f>h&&(f=h,d++),o[r].De=f,!(r>u)&&(e.ze[f]++,_=0,r>=s&&(_=c[r-s]),l=o[r].Z,e.ie+=l*(f+_),a&&(e.fe+=l*(a[r].De+_)));if(0!=d){do{for(f=h-1;0==e.ze[f];)f--;e.ze[f]--,e.ze[f+1]+=2,e.ze[h]--,d-=2;}while(d>0);for(f=h;0!=f;f--)for(r=e.ze[f];0!=r;)i=e.pe[--n],!(i>u)&&(o[i].De!=f&&(e.ie+=(f-o[i].De)*o[i].Z,o[i].De=f),r--);}}function I_(e,t){let n,r,i,f=t.L,_=t.M.q,l=t.M.W,o=-1;for(e.Ve=0,e.We=le,n=0;n<l;n++)0!=f[n].Z?(e.pe[++e.Ve]=o=n,e.Ie[n]=0):f[n].De=0;for(;e.Ve<2;)i=e.pe[++e.Ve]=o<2?++o:0,f[i].Z=1,e.Ie[i]=0,e.ie--,_&&(e.fe-=_[i].De);for(t.F=o,n=N.floor(e.Ve/2);n>=1;n--)k_(e,f,n);i=l;do{n=En(e,f,n),r=e.pe[se],e.pe[--e.We]=n,e.pe[--e.We]=r,f[i].Z=f[n].Z+f[r].Z,e.Ie[i]=(e.Ie[n]>=e.Ie[r]?e.Ie[n]:e.Ie[r])+1,f[n].Ze=f[r].Ze=i,e.pe[se]=i++,k_(e,f,se);}while(e.Ve>=2);e.pe[--e.We]=e.pe[se],gn(e,t),Sn(f,t.F,e.ze);}function ut(e,t,n){let r,i,f=-1,_=t[0].De,l=0,o=7,u=4;for(0==_&&(o=138,u=3),t[n+1].De=65535,r=0;r<=n;r++)i=_,_=t[r+1].De,!(++l<o&&i==_)&&(l<u?e.Se[i].Z+=l:0!=i?(i!=f&&e.Se[i].Z++,e.Se[t_].Z++):l<=10?e.Se[n_].Z++:e.Se[r_].Z++,l=0,f=i,0==_?(o=138,u=3):i==_?(o=6,u=3):(o=7,u=4));}function ct(e,t,n){let r,i=-1,f=t[0].De,_=0,l=7,o=4;0==f&&(l=138,o=3);for(let u=0;u<=n;u++)if(r=f,f=t[u+1].De,!(++_<l&&r==f)){if(_<o)do{L(e,e.Se[r].Qe,e.Se[r].De);}while(0!=--_);else 0!=r?(r!=i&&(L(e,e.Se[r].Qe,e.Se[r].De),_--),L(e,e.Se[t_].Qe,e.Se[t_].De),L(e,_-3,2)):_<=10?(L(e,e.Se[n_].Qe,e.Se[n_].De),L(e,_-3,3)):(L(e,e.Se[r_].Qe,e.Se[r_].De),L(e,_-11,7));_=0,i=r,0==f?(l=138,o=3):r==f?(l=6,o=3):(l=7,o=4);}}function Tn(e){let t;for(ut(e,e.C,e.$e.F),ut(e,e.T,e.Ae.F),I_(e,e.Ue),t=oe-1;t>=3&&0==e.Se[Se[t]].De;t--);return e.ie+=3*(t+1)+5+5+4,t}function wn(e,t,n,r){let i;for(L(e,t-257,5),L(e,n-1,5),L(e,r-4,4),i=0;i<r;i++)L(e,e.Se[Se[i]].De,3);ct(e,e.C,t-1),ct(e,e.T,n-1);}function Me(e,t,n,r,i=0){L(e,(at<<1)+r,3),bt(e),De(e,n),De(e,~n),n&&t&&M(e.$,e.A,t,i,n),e.A+=n;}function xt(e){mt(e);}function pt(e){L(e,y_<<1,3),L(e,Fe[ke].Qe,Fe[ke].De),mt(e);}function dt(e,t,n){let r,i,f,_,l=0;if(0!=e.D)do{r=255&e.Le[l],r+=(255&e.Le[l+1])<<8,i=e.Le[l+2],l+=3,0==r?L(e,t[i].Qe,t[i].De):(f=__[i],L(e,t[f+ie+1].Qe,t[f+ie+1].De),_=a_[f],0!=_&&(i-=Te[f],L(e,i,_)),r--,f=T_(r),L(e,n[f].Qe,n[f].De),_=i_[f],0!=_&&(r-=ge[f],L(e,r,_)));}while(l<e.D);L(e,t[ke].Qe,t[ke].De);}function An(e){let t,n=4093624447;for(t=0;t<=31;t++,n>>=1)if(1&n&&0!=e.C[t].Z)return 0;if(0!=e.C[9].Z||0!=e.C[10].Z||0!=e.C[13].Z)return 1;for(t=32;t<ie;t++)if(0!=e.C[t].Z)return 1;return 0}function St(e,t,n,r,i=0){let f,_,l=0;e.ge>0?(2==e.o.t&&(e.o.t=An(e)),I_(e,e.$e),I_(e,e.Ae),l=Tn(e),f=e.ie+3+7>>3,_=e.fe+3+7>>3,(_<=f||4==e.ve)&&(f=_)):f=_=n+5,n+4<=f&&t?Me(e,t,n,r,i):_==f?(L(e,(y_<<1)+r,3),dt(e,Fe,v_)):(L(e,(it<<1)+r,3),wn(e,e.$e.F+1,e.Ae.F+1,l+1),dt(e,e.C,e.T)),ht(e),r&&bt(e);}function wt(){let e=Ve();return e.l=w_(e),e}var Xe=[{Ce:It,Te:0,Be:0,Re:0,Ge:0},{Ce:z_,Te:4,Be:4,Re:8,Ge:4},{Ce:z_,Te:5,Be:5,Re:16,Ge:8},{Ce:z_,Te:6,Be:16,Re:32,Ge:32},{Ce:Re,Te:4,Be:4,Re:16,Ge:16},{Ce:Re,Te:16,Be:8,Re:16,Ge:32},{Ce:Re,Te:16,Be:16,Re:32,Ge:128},{Ce:Re,Te:32,Be:32,Re:128,Ge:256},{Ce:Re,Te:128,Be:128,Re:256,Ge:1024},{Ce:Re,Te:258,Be:258,Re:258,Ge:4096}];function Et(e){return 2*e-(e>4?9:0)}function f_(e,t,n){return ((t<<e.Y^n)&e.X)>>>0}function u_(e,t){e.be=f_(e,e.be,e.u[t+(I-1)]);let n=e.j[t&e.P]=e.K[e.be];return e.K[e.be]=t,n}function At(e){e.K[e.J-1]=0,je(e.K,0,(e.J-1)*e.K.BYTES_PER_ELEMENT);}function Nn(e){let t,n,r=e.h;for(t=e.J;t>0;)t--,n=e.K[t],e.K[t]=n>=r?n-r:0;for(t=r;t>0;)t--,n=e.j[t],e.j[t]=n>=r?n-r:0;}function C_(e,t,n,r){let i=e.avail_in;return i>r&&(i=r),0==i?0:(e.avail_in-=i,M(t,n,e.next_in,e.next_in_index,i),1==e.l.G?e.i=he(e.i,new x(t.buffer,t.byteOffset+n,i),i):2==e.l.G&&(e.i=W(e.i,new x(t.buffer,t.byteOffset+n,i),i)),e.next_in_index+=i,e.total_in+=i,i)}function c_(e){let t,n,r=e.h;do{if(n=e.qe-e.ce-e.ae,0==n&&0==e.ae&&0==e.ce?n=r:-1==n&&n--,e.ae>=r+ve(e)&&(M(e.u,0,e.u,r,r-n),e.Ne-=r,e.ae-=r,e.ue-=r,e.le>e.ae&&(e.le=e.ae),Nn(e),n+=r),0==e.o.avail_in)break;if(t=C_(e.o,e.u,e.ae+e.ce,n),e.ce+=t,e.ce+e.le>=I){let t=e.ae-e.le;for(e.be=e.u[t],e.be=f_(e,e.be,e.u[t+1]);e.le&&(e.be=f_(e,e.be,e.u[t+I-1]),e.j[t&e.P]=e.K[e.be],e.K[e.be]=t,t++,e.le--,!(e.ce+e.le<I)););}}while(e.ce<ae&&0!=e.o.avail_in);if(e.k<e.qe){let t,n=e.ae+e.ce;e.k<n?(t=e.qe-n,t>Be&&(t=Be),je(e.u,n,t),e.k=n+t):e.k<n+Be&&(t=n+Be-e.k,t>e.qe-e.k&&(t=e.qe-e.k),je(e.u,e.k,t),e.k+=t);}}function Dt(e,t,n=8,r=15,i=He,f=0){let _=1;if(!e)return -2;if(e.msg="",-1==t&&(t=6),r<0){if(_=0,r<-15)return -2;r=-r;}else r>15&&(_=2,r-=16);if(i<1||i>_t||8!=n||r<8||r>15||t<0||t>9||f<0||f>4||8==r&&1!=_)return -2;8==r&&(r=9);let l=w_(e);return l?(e.l=l,l.o=e,l.R=42,l.G=_,l.O=void 0,l.v=r,l.h=1<<l.v,l.P=l.h-1,l.H=i+7,l.J=1<<l.H,l.X=l.J-1,l.Y=(l.H+I-1)/I,l.u=new x(2*l.h),l.j=new E(l.h),l.K=new E(l.J),l.k=0,l.ee=1<<i+6,l.$=new x(l.ee*rt),l.ne=4*l.ee,l.u&&l.j&&l.K&&l.$?(l.Le=l.$.subarray(l.ee),l.U=l.te+l.ee,l.B=3*(l.ee-1),l.ge=t,l.ve=f,l.Fe=n,Cn(e)):(l.R=666,e.msg=g_(-4),B_(e),-4)):-4}function U_(e){if(null==e)return true;let t=e.l;return !t||t.o!=e||42!=t.R&&57!=t.R&&69!=t.R&&73!=t.R&&91!=t.R&&103!=t.R&&113!=t.R&&666!=t.R}function Rn(e){let t;return U_(e)?-2:(e.total_in=e.total_out=0,e.msg="",e.t=2,t=e.l,t.A=0,t.re=t.te,t.G<0&&(t.G=-t.G),t.R=2==t.G?57:42,e.i=2==t.G?W(0):he(0),t.oe=-2,st(t),0)}function zn(e){e.qe=2*e.h,At(e),e.ye=Xe[e.ge].Te,e.ke=Xe[e.ge].Be,e.me=Xe[e.ge].Re,e.xe=Xe[e.ge].Ge,e.ae=0,e.ue=0,e.ce=0,e.le=0,e.se=e.he=I-1,e.we=0,e.be=0;}function Cn(e){let t=Rn(e);return 0==t&&zn(e.l),t}function Ye(e,t){g(e,t>>8),g(e,255&t);}function q(e){let t,n=e.l;xt(n),t=n.A,t>e.avail_out&&(t=e.avail_out),0!=t&&(M(e.next_out,e.next_out_index,n.$,n.re,t),e.next_out_index+=t,n.re+=t,e.total_out+=t,e.avail_out-=t,n.A-=t,0==n.A&&(n.re=n.te));}function Ie(e,t){let n=e.l;n.O&&n.O.Oe&&(e.i=W(e.i,new x(n.$.buffer,n.te+t,n.A-t),n.A-t));}function yt(e,t){let n,r=e.l;if(U_(e)||t>5||t<0)return Ae(e,-2);if(!e.next_out||0!=e.avail_in&&!e.next_in||666==r.R&&4!=t)return Ae(e,-2);if(0==e.avail_out)return Ae(e,-5);if(n=r.oe,r.oe=t,0!=r.A){if(q(e),0==e.avail_out)return r.oe=$,0}else if(0==e.avail_in&&Et(t)<=Et(n)&&4!=t)return Ae(e,-5);if(666==r.R&&0!=e.avail_in)return Ae(e,-5);if(42==r.R&&0==r.G&&(r.R=113),42==r.R){let t,n=8+(r.v-8<<4)<<8;if(t=r.ve>=2||r.ge<2?0:r.ge<6?1:6==r.ge?2:3,n|=t<<6,0!=r.ae&&(n|=nt),n+=31-n%31,Ye(r,n),0!=r.ae&&(Ye(r,e.i>>16),Ye(r,65535&e.i)),e.i=1,r.R=113,q(e),0!=r.A)return r.oe=$,0}if(57==r.R)if(e.i=W(0),g(r,31),g(r,139),g(r,8),r.O)g(r,(r.O.Pe?1:0)+(r.O.Oe?2:0)+(null==r.O.He?0:4)+(null==r.O.Je?0:8)+(null==r.O.Xe?0:16)),g(r,255&r.O.Ye),g(r,r.O.Ye>>>8&255),g(r,r.O.Ye>>>16&255),g(r,r.O.Ye>>>24&255),g(r,9==r.ge?2:r.ve>=2||r.ge<2?4:0),g(r,255&r.O.je),null!=r.O.He&&(g(r,255&r.O.Ke),g(r,r.O.Ke>>>8&255)),r.O.Oe&&(e.i=W(e.i,r.$,r.A)),r.Me=0,r.R=69;else if(g(r,0),g(r,0),g(r,0),g(r,0),g(r,0),g(r,9==r.ge?2:r.ve>=2||r.ge<2?4:0),g(r,tt),r.R=113,q(e),0!=r.A)return r.oe=$,0;if(69==r.R){if(r.O&&null!=r.O.He){let t=r.A,n=(65535&r.O.Ke)-r.Me;for(;r.A+n>r.ne;){let i=r.ne-r.A;if(M(r.$,r.A,r.O.He,r.Me,i),r.A=r.ne,Ie(e,t),r.Me+=i,q(e),0!=r.A)return r.oe=$,0;t=0,n-=i;}M(r.$,r.A,r.O.He,r.Me,n),r.A+=n,Ie(e,t),r.Me=0;}r.R=73;}if(73==r.R){if(r.O&&r.O.Je&&r.O.Je.length){let t,n=r.A;do{if(r.A==r.ne){if(Ie(e,n),q(e),0!=r.A)return r.oe=$,0;n=0;}t=r.O.Je[r.Me++],g(r,t);}while(0!=t);Ie(e,n),r.Me=0;}r.R=91;}if(91==r.R){if(r.O&&r.O.Xe&&r.O.Xe.length){let t,n=r.A;do{if(r.A==r.ne){if(Ie(e,n),q(e),0!=r.A)return r.oe=$,0;n=0;}t=r.O.Xe[r.Me++],g(r,t);}while(0!=t);Ie(e,n);}r.R=103;}if(103==r.R){if(r.O&&r.O.Oe){if(r.A+2>r.ne&&(q(e),0!=r.A))return r.oe=$,0;g(r,255&e.i),g(r,e.i>>>8&255),e.i=W(0);}if(r.R=113,q(e),0!=r.A)return r.oe=$,0}if(0!=e.avail_in||0!=r.ce||0!=t&&666!=r.R){let n=0==r.ge?It(r,t):2==r.ve?On(r,t):3==r.ve?Ln(r,t):Xe[r.ge].Ce(r,t);if((2==n||3==n)&&(r.R=666),0==n||2==n)return 0==e.avail_out&&(r.oe=$),0;if(1==n&&(1==t?pt(r):5!=t&&(Me(r,null,0,0),3==t&&(At(r),0==r.ce&&(r.ae=0,r.ue=0,r.le=0))),q(e),0==e.avail_out))return r.oe=$,0}return 4!=t?0:r.G<=0?1:(2==r.G?(g(r,255&e.i),g(r,e.i>>>8&255),g(r,e.i>>>16&255),g(r,e.i>>>24&255),g(r,255&e.total_in),g(r,e.total_in>>>8&255),g(r,e.total_in>>>16&255),g(r,e.total_in>>>24&255)):(Ye(r,e.i>>>16&65535),Ye(r,65535&e.i)),q(e),r.G>0&&(r.G=-r.G),0!=r.A?0:1)}function B_(e){if(U_(e))return -2;let t=e.l,n=t.R;return t.u=F,t.j=qe,t.K=qe,t.$=F,t.Le=F,t.pe=new H(0),t.Ie=F,t.ze=qe,t.C.length=0,t.T.length=0,t.Se.length=0,t.O=void 0,t.te=0,t.re=0,t.U=0,113==n?-3:0}function vt(e,t){let n,r,i=e.xe,f=e.ae,_=e.he,l=e.me,o=e.ae>ve(e)?e.ae-ve(e):0,u=e.j,a=e.P,c=e.u[f],s=e.u[f+1],h=e.u[f+_-1],d=e.u[f+_];e.he>=e.ke&&(i>>=2),l>e.ce&&(l=e.ce);do{if(n=t,e.u[n+_]!=d||e.u[n+_-1]!=h||e.u[n]!=c||e.u[n+1]!=s)continue;let i=N.min(_e,e.ce),o=2;for(;o<i&&e.u[f+o]==e.u[n+o];)o++;if(r=o,r>_){if(e.Ne=t,_=r,r>=l)break;h=e.u[f+_-1],d=e.u[f+_];}}while((t=u[t&a])>o&&0!=--i);return _<=e.ce?_:e.ce}function kt(e,t){St(e,e.u,e.ae-e.ue,t,e.ue),e.ue=e.ae,q(e.o);}function V(e,t){return kt(e,t?1:0),0==e.o.avail_out?t?2:0:null}var gt=65535;function Ne(e,t){return e<t?e:t}function It(e,t){let n,r,i,f=Ne(e.ne-5,e.h),_=0,l=e.o.avail_in;do{if(n=gt,i=e.I+42>>3,e.o.avail_out<i||(i=e.o.avail_out-i,r=e.ae-e.ue,n>r+e.o.avail_in&&(n=r+e.o.avail_in),n>i&&(n=i),n<f&&(0==n&&4!=t||0==t||n!=r+e.o.avail_in)))break;_=4==t&&n==r+e.o.avail_in?1:0,Me(e,null,0,_),e.$[e.A-4]=n,e.$[e.A-3]=n>>8,e.$[e.A-2]=~n,e.$[e.A-1]=~n>>8,q(e.o),r&&(r>n&&(r=n),M(e.o.next_out,e.o.next_out_index,e.u,e.ue,r),e.o.next_out_index+=r,e.o.avail_out-=r,e.o.total_out+=r,e.ue+=r,n-=r),n&&(C_(e.o,e.o.next_out,e.o.next_out_index,n),e.o.next_out_index+=n,e.o.avail_out-=n,e.o.total_out+=n);}while(0==_);if(l-=e.o.avail_in,l){if(l>=e.h){e._e=2;let t=e.o.next_in_index-e.h;M(e.u,0,e.o.next_in,t,e.h),e.ae=e.h,e.le=e.ae;}else e.qe-e.ae<=l&&(e.ae-=e.h,M(e.u,0,e.u,e.h,e.ae),e._e<2&&e._e++,e.le>e.ae&&(e.le=e.ae)),M(e.u,e.ae,e.o.next_in,e.o.next_in_index-l,l),e.ae+=l,e.le+=Ne(l,e.h-e.le);e.ue=e.ae;}return e.k<e.ae&&(e.k=e.ae),_?(e.Ee=8,3):0!=t&&4!=t&&0==e.o.avail_in&&e.ae==e.ue?1:(i=e.qe-e.ae,e.o.avail_in>i&&e.ue>=e.h&&(e.ue-=e.h,e.ae-=e.h,M(e.u,0,e.u,e.h,e.ae),e._e<2&&e._e++,i+=e.h,e.le>e.ae&&(e.le=e.ae)),i>e.o.avail_in&&(i=e.o.avail_in),i&&(C_(e.o,e.u,e.ae,i),e.ae+=i,e.le+=Ne(i,e.h-e.le)),e.k<e.ae&&(e.k=e.ae),i=e.I+42>>3,i=Ne(e.ne-i,gt),f=Ne(i,e.h),r=e.ae-e.ue,(r>=f||(r||4==t)&&0!=t&&0==e.o.avail_in&&r<=i)&&(n=Ne(r,i),_=4==t&&0==e.o.avail_in&&n==r?1:0,Me(e,e.u,n,_,e.ue),e.ue+=n,q(e.o)),_&&(e.Ee=8),_?2:0)}function z_(e,t){let n,r=false;for(;;){if(e.ce<ae){if(c_(e),e.ce<ae&&0==t)return 0;if(0==e.ce)break}if(n=0,e.ce>=I&&(n=u_(e,e.ae)),0!=n&&e.ae-n<=ve(e)&&(e.se=vt(e,n)),e.se>=I)if(e.ae,e.Ne,e.se,r=e_(e,e.ae-e.Ne,e.se-I),e.ce-=e.se,e.se<=e.ye&&e.ce>=I){e.se--;do{e.ae++,n=u_(e,e.ae);}while(0!=--e.se);e.ae++;}else e.ae+=e.se,e.se=0,e.be=e.u[e.ae],e.be=f_(e,e.be,e.u[e.ae+1]);else r=ye(e,e.u[e.ae]),e.ce--,e.ae++;if(r){let t=V(e,false);if(null!=t)return t}}if(e.le=e.ae<I-1?e.ae:I-1,4==t){return V(e,true)??3}if(e.D){let t=V(e,false);if(null!=t)return t}return 1}function Re(e,t){let n,r=false;for(;;){if(e.ce<ae){if(c_(e),e.ce<ae&&0==t)return 0;if(0==e.ce)break}if(n=0,e.ce>=I&&(n=u_(e,e.ae)),e.he=e.se,e.de=e.Ne,e.se=I-1,0!=n&&e.he<e.ye&&e.ae-n<=ve(e)&&(e.se=vt(e,n),e.se<=5&&1==e.ve&&(e.se=I-1)),e.he>=I&&e.se<=e.he){let t=e.ae+e.ce-I;e.ae,e.de,e.he,r=e_(e,e.ae-1-e.de,e.he-I),e.ce-=e.he-1,e.he-=2;do{++e.ae<=t&&(n=u_(e,e.ae));}while(0!=--e.he);if(e.we=0,e.se=I-1,e.ae++,r){let t=V(e,false);if(null!=t)return t}}else if(e.we){if(r=ye(e,e.u[e.ae-1]),r&&kt(e,0),e.ae++,e.ce--,0==e.o.avail_out)return 0}else e.we=1,e.ae++,e.ce--;}if(e.we&&(r=ye(e,e.u[e.ae-1]),e.we=0),e.le=e.ae<I-1?e.ae:I-1,4==t){return V(e,true)??3}if(e.D){let t=V(e,false);if(null!=t)return t}return 1}function Ln(e,t){let n,r,i,f;for(;;){if(e.ce<=_e){if(c_(e),e.ce<=_e&&0==t)return 0;if(0==e.ce)break}if(e.se=0,e.ce>=I&&e.ae>0&&(i=e.ae-1,r=e.u[i],r==++i&&r==++i&&r==++i)){f=e.ae+_e;do{}while(r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&i<f);e.se=_e-(f-i),e.se>e.ce&&(e.se=e.ce);}if(e.se>=I?(e.ae,e.ae,e.se,n=e_(e,1,e.se-I),e.ce-=e.se,e.ae+=e.se,e.se=0):(n=ye(e,e.u[e.ae]),e.ce--,e.ae++),n){let t=V(e,false);if(null!=t)return t}}if(e.le=0,4==t){return V(e,true)??3}if(e.D){let t=V(e,false);if(null!=t)return t}return 1}function On(e,t){let n=false;for(;;){if(0==e.ce&&(c_(e),0==e.ce)){if(0==t)return 0;break}if(e.se=0,n=ye(e,e.u[e.ae]),e.ce--,e.ae++,n){let t=V(e,false);if(null!=t)return t}}if(e.le=0,4==t){return V(e,true)??3}if(e.D){let t=V(e,false);if(null!=t)return t}return 1}var ue=852,d_=592,m_=594,Nt=ge.map(e=>e+1),Rt=Te.subarray(0,-1).map(e=>e+3),zt=[16,1,73,1,200,1],Ct=Ee.map(Wt),Lt=Ee.map(Gt);Ct.push(64,2),Lt.push(142,2);var Ot=de.map(Wt),Ht=de.map(Gt);Ot.push(...zt),Ht.push(...zt);var Ut=new E([...Rt,258,0,0]),Bt=new E([...Rt,3,0,0]),Zt=te(Ot),Ft=te(Ht),Pt=new E([...Nt,0,0]),Mt=new E([...Nt,32769,49153]),Yt=te(Ct),Xt=te(Lt);function Wt(e,t){return t%2?e:e+16}function Gt(e,t){return t%2?e:e+128}function qt(e,t){let n,r=e.l,i=e.next_in_index,f=e.next_out_index,_=e.next_in,l=e.next_out,o=r.u,u=r.p>>>0,a=r.I>>>0,c=r.et,s=r.tt,h=(1<<r.nt)-1,d=(1<<r.rt)-1,w=r.h>>>0,b=r.k>>>0,g=r.m>>>0,v=r.it,k=f-(t-e.avail_out),m=f+(e.avail_out-257),x=i+(e.avail_in-5),y=0,p=0,I=0,z=0;e:do{for(;a<15;){if(!(i<_.length))break e;u+=_[i++]<<a,a+=8;}n=c[u&h];t:for(;;){if(I=n.ft,u>>>=I,a-=I,I=n._t,0==I){l[f++]=n.lt;break}if(16&I){if(y=n.lt,I&=15,I){for(;a<I;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}y+=u&(1<<I)-1,u>>>=I,a-=I;}for(;a<15;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}n=s[u&d];n:for(;;){if(I=n.ft,u>>>=I,a-=I,I=n._t,16&I){if(p=n.lt,I&=15,I){for(;a<I;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}p+=u&(1<<I)-1,u>>>=I,a-=I;}let t=y,c=f-k;if(p>c){let n=p-c;if(n>b&&v){e.msg="invalid distance too far back",r.ot=16209;break e}if(0==g){if(z=w-n,!(n<t)){for(let e=0;e<t;++e)l[f++]=o[z++];continue e}for(let e=0;e<n;++e)l[f++]=o[z++];t-=n,z=f-p;}else if(g<n){z=w+g-n;let e=n-g;if(!(e<t)){for(let e=0;e<t;++e)l[f++]=o[z++];continue e}for(let t=0;t<e;++t)l[f++]=o[z++];if(t-=e,z=0,g<t){for(let e=0;e<g;++e)l[f++]=o[z++];t-=g,z=f-p;}}else {if(z=g-n,!(n<t)){for(let e=0;e<t;++e)l[f++]=o[z++];continue e}for(let e=0;e<n;++e)l[f++]=o[z++];t-=n,z=f-p;}for(;t>2;)l[f++]=l[z++],l[f++]=l[z++],l[f++]=l[z++],t-=3;t&&(l[f++]=l[z++],t>1&&(l[f++]=l[z++]));}else {for(z=f-p;t>2;)l[f++]=l[z++],l[f++]=l[z++],l[f++]=l[z++],t-=3;t&&(l[f++]=l[z++],t>1&&(l[f++]=l[z++]));}break}if(64&I){e.msg="invalid distance code",r.ot=16209;break e}n=s[n.lt+(u&(1<<I)-1)];continue n}break}if(64&I){if(32&I){r.ot=16191;break e}e.msg="invalid literal/length code",r.ot=16209;break e}n=c[n.lt+(u&(1<<I)-1)];continue t}}while(i<x&&f<m);let L=a>>3;i-=L,a-=L<<3,u&=(1<<a)-1,e.next_in_index=i,e.next_out_index=f,e.avail_in=i<x?x-i+5:5-(i-x),e.avail_out=f<m?m-f+257:257-(f-m),r.p=u>>>0,r.I=a>>>0;}function Z_(e,t){let n=[],r=t?ue+m_:ue+d_;return {...Je(e,0),o:e,ot:16180,ut:false,G:0,ct:false,st:0,ht:0,dt:0,wt:0,u:F,bt:0,gt:0,He:0,et:n,tt:n,nt:0,rt:0,vt:0,kt:0,xt:0,yt:0,It:n,zt:new E(320),Lt:new E(288),Et:new v(r).fill(null).map(()=>pe()),Mt:0,it:true,Ft:0,qt:0,Nt:t}}function pe(e=0,t=0,n=0){return {_t:e,ft:t,lt:n}}function F_(e=1){return {_t:64,ft:e,lt:0}}function jt(e=0){return {_t:96,ft:e,lt:0}}function P_(e){return (255&e)<<24|(e>>8&255)<<16|(e>>16&255)<<8|e>>24&255}var Le=15,Un={Nt:false,Vt:Ut,Wt:Zt,St:Pt,$t:Yt,At:20,Ut:257,Qt:0,Dt:d_,Zt:false,Ct:true},Bn={Nt:true,Vt:Bt,Wt:Ft,St:Mt,$t:Xt,At:19,Ut:256,Qt:-1,Dt:m_,Zt:true,Ct:false};function Oe(e,t,n,r,i,f,_,l){let o,u,a,c,s,h,d,w,b,g,v,k,m,x,y,p,I,z,L,M=new E(Le+1),F=new E(Le+1),q=l?Bn:Un;for(o=0;o<=Le;o++)M[o]=0;for(u=0;u<n;u++)M[t[u]]++;for(s=i.Tt,c=Le;c>=1&&0==M[c];c--);if(s>c&&(s=c),0==c)return q.Ct?(y=F_(1),r.Tt[0]=y,r.Tt[1]=y,i.Tt=1,0):-1;for(a=1;a<c&&0==M[a];a++);for(s<a&&(s=a),w=1,o=1;o<=Le;o++)if(w<<=1,w-=M[o],w<0)return -1;if(w>0&&(0==e||1!=c))return -1;for(F[1]=0,o=1;o<Le;o++)F[o+1]=F[o]+M[o];for(u=0;u<n;u++)0!=t[u]&&(f[F[t[u]]++]=u);switch(e){case 0:I=z=f,L=q.At;break;case 1:I=q.Vt,z=q.Wt,L=q.Ut;break;default:I=q.St,z=q.$t,L=q.Qt;}if(g=0,u=0,o=a,p=_.Tt,h=s,d=0,m=-1,b=1<<s,x=b-1,1==e&&(q.Zt?b>=ue:b>ue)||2==e&&(q.Zt?b>=q.Dt:b>q.Dt))return 1;for(;;){y=Zn(f,u,o,d,e,I,z,L,q.Nt),v=1<<o-d,k=1<<h,a=k;do{k-=v;let e=(g>>d)+k;r.Tt[p+e]={...y};}while(0!=k);for(v=1<<o-1;g&v;)v>>=1;if(0!=v?(g&=v-1,g+=v):g=0,u++,0==--M[o]){if(o==c)break;o=t[f[u]];}if(o>s&&(g&x)!=m){for(0==d&&(d=s),p+=1<<h,h=o-d,w=1<<h;h+d<c&&(w-=M[h+d],!(w<=0));)h++,w<<=1;if(b+=1<<h,1==e&&(q.Zt?b>=ue:b>ue)||2==e&&(q.Zt?b>=q.Dt:b>q.Dt))return 1;m=g&x,r.Tt[_.Tt+m]={_t:h,ft:s,lt:p-_.Tt};}}if(0!=g)for(y=F_(o-d);0!=g;){for(0!=d&&(g&x)!=m&&(d=0,o=s,p=_.Tt,h=s,y.ft=o),r.Tt[p+(g>>d)]={...y},v=1<<o-1;g&v;)v>>=1;0!=v?(g&=v-1,g+=v):g=0;}return _.Tt+=b,i.Tt=s,0}function Zn(e,t,n,r,i,f,_,l,o){let u;if(o?e[t]<l:e[t]+1<l)u=pe(0,n-r,e[t]);else if(o?e[t]>l:e[t]>=l)if(o&&1==i){let i=e[t]-257;u=pe(_[i],n-r,f[i]);}else {let i=o?e[t]:e[t]-l;u=pe(_[i],n-r,f[i]);}else u=jt(n-r);return u}var Qt,$t,Vt=new v(544),Jt=true;function en(e){let t=Ve();return t.l=Z_(t,!!e),t}function Ge(e){let t;return !(e&&(t=e.l,!(!t||t.o!=e||t.Nt&&(t.ot<16191||t.ot>16209)||!t.Nt&&(t.ot<16180||t.ot>16211))))}function Xn(e){let t;return Ge(e)?-2:(t=e.l,e.total_in=e.total_out=t.wt=0,e.msg="",t.G&&(e.i=1&t.G),t.ot=t.Nt?16191:16180,t.ut=false,t.ct=false,t.st=-1,t.ht=t.Nt?65536:32768,delete t.O,t.p=0,t.I=0,t.et=t.Et,t.tt=t.Et,t.It=t.Et,t.it=true,t.Ft=-1,0)}function Wn(e){let t;return Ge(e)?-2:(t=e.l,t.h=0,t.k=0,t.m=0,Xn(e))}function Gn(e,t){let n,r,i;if(Ge(e))return -2;if(r=e.l,r.Nt?(t=-16,i=16):i=15,t<0){if(t<-i)return -2;n=0,t=-t;}else n=5+(t>>4),!r.Nt&&t<48&&(t&=15);return t&&(t<8||t>i)?-2:(r.u.length>0&&r.v!=t&&(r.u=F),r.G=n,r.v=t,Wn(e))}function _n(e,t){let n,r;if(!e)return -2;e.msg="";let i=!!e.l.Nt;return r=Z_(e,i),i&&(t=-16),e.l=r,r.o=e,r.ot=r.Nt?16191:16180,n=Gn(e,t),n}function Kn(e){let t={Tt:0};if(Jt){let n,r,i;for(n=0;n<144;)e.zt[n++]=8;for(;n<256;)e.zt[n++]=9;for(;n<280;)e.zt[n++]=7;for(;n<288;)e.zt[n++]=8;for(let e=0;e<544;e++)Vt[e]=pe();i=Vt,Qt=i,r=9;let f={Tt:i},_={Tt:r},l={Tt:0};for(Oe(1,e.zt,288,f,_,e.Lt,l,e.Nt),i=f.Tt,r=_.Tt,e.Mt=l.Tt,n=0;n<32;)e.zt[n++]=5;r=5;let o=l.Tt,u={Tt:i},a={Tt:r};t.Tt=o,Oe(2,e.zt,32,u,a,e.Lt,t,e.Nt),$t=i.slice(o),Jt=false;}e.et=Qt,e.nt=9,e.tt=$t,e.rt=5,e.Mt=t.Tt;}function qn(e,t,n){let r=e.l;if(!(r.u&&0!=r.u.length||(r.u=new x(1<<r.v),r.u)))return 1;if(0==r.h&&(r.h=1<<r.v,r.m=0,r.k=0),n>=r.h)M(r.u,0,t,t.length-r.h,r.h),r.m=0,r.k=r.h;else {let e=r.h-r.m;e>n&&(e=n),M(r.u,r.m,t,t.length-n,e),(n-=e)?(M(r.u,0,t,t.length-n,n),r.m=n,r.k=r.h):(r.m+=e,r.m==r.h&&(r.m=0),r.k<r.h&&(r.k+=e));}return 0}var h_=class extends z{constructor(){super("Need more input");}};function tn(e,t){let n,r,i,f,_,l,o,u,a,c,s,h,d,w,b,g,v,k=new x(4);if(Ge(e)||!e.next_out||!e.next_in&&0!=e.avail_in)return -2;l=0,u=0,o=0,a=0,r=F,i=0,f=F,_=0,n=e.l,16191==n.ot&&(n.ot=16192),z(),c=l,s=o,v=0;try{for(;;)switch(n.ot){case 16180:if(0==n.G){n.ot=16192;break}if(N(16),2&n.G&&35615==u){0==n.v&&(n.v=15),n.dt=W(0),n.dt=p(n.dt,u),E(),n.ot=16181;break}if(n.O&&(n.O.Bt=-1),!(1&n.G)||((V(8)<<8)+(u>>8))%31){e.msg="incorrect header check",n.ot=16209;break}if(8!=V(4)){e.msg="unknown compression method",n.ot=16209;break}if(S(4),g=V(4)+8,0==n.v&&(n.v=g),g>15||g>n.v){e.msg="invalid window size",n.ot=16209;break}n.ht=1<<g,n.st=0,e.i=n.dt=he(0),n.ot=512&u?16189:16191,E();break;case 16181:if(N(16),n.st=u,8!=(255&n.st)){e.msg="unknown compression method",n.ot=16209;break}if(57344&n.st){e.msg="unknown header flags set",n.ot=16209;break}n.O&&(n.O.Pe=u>>8&1),512&n.st&&4&n.G&&(n.dt=p(n.dt,u)),E(),n.ot=16182;case 16182:N(32),n.O&&(n.O.Ye=u),512&n.st&&4&n.G&&(n.dt=I(n.dt,u)),E(),n.ot=16183;case 16183:N(16),n.O&&(n.O.Rt=255&u,n.O.je=u>>8),512&n.st&&4&n.G&&(n.dt=p(n.dt,u)),E(),n.ot=16184;case 16184:1024&n.st?(N(16),n.bt=u,n.O&&(n.O.Ke=u),512&n.st&&4&n.G&&(n.dt=p(n.dt,u)),E()):n.O&&(n.O.He=F),n.ot=16185;case 16185:if(1024&n.st&&(h=n.bt,h>l&&(h=l),h&&(n.O&&n.O.He&&n.O.Gt&&(g=n.O.Ke-n.bt)<n.O.Gt&&M(n.O.He,g,r,i,h),512&n.st&&4&n.G&&(n.dt=W(n.dt,r.subarray(i,i+h),h)),l-=h,i+=h,n.bt-=h),n.bt))return m();n.bt=0,n.ot=16186;case 16186:if(2048&n.st){if(0==l)return m();h=0;do{g=r[i+h++],n.O&&n.O.Ot&&n.bt<n.O.Ot&&(n.O.Je[n.bt++]=g);}while(g&&h<l);if(512&n.st&&4&n.G&&(n.dt=W(n.dt,r.subarray(i,i+h),h)),l-=h,i+=h,g)return m()}else n.O&&(n.O.Je=F);n.bt=0,n.ot=16187;case 16187:if(4096&n.st){if(0==l)return m();h=0;do{g=r[i+h++],n.O&&n.O.Pt&&n.bt<n.O.Pt&&(n.O.Xe[n.bt++]=g);}while(g&&h<l);if(512&n.st&&4&n.G&&(n.dt=W(n.dt,r.subarray(i,i+h),h)),l-=h,i+=h,g)return m()}else n.O&&(n.O.Xe=F);n.ot=16188;case 16188:if(512&n.st){if(N(16),4&n.G&&u!=(65535&n.dt)){e.msg="header crc mismatch",n.ot=16209;break}E();}n.O&&(n.O.Oe=n.st>>9&1,n.O.Bt=1),e.i=n.dt=W(0),n.ot=16191;break;case 16189:N(32),e.i=n.dt=P_(u),E(),n.ot=16190;case 16190:if(!n.ct)return L(),2;e.i=n.dt=he(0),n.ot=16191;case 16191:if(5==t||6==t)return m();case 16192:if(n.ut){$(),n.ot=16206;break}switch(N(3),n.ut=!!V(1),S(1),V(2)){case 0:n.ot=16193;break;case 1:if(Kn(n),n.ot=16199,6==t)return S(2),m();break;case 2:n.ot=16196;break;case 3:e.msg="invalid block type",n.ot=16209;}S(2);break;case 16193:if($(),N(32),(65535&u)!=(u>>>16^65535)){e.msg="invalid stored block lengths",n.ot=16209;break}if(n.bt=65535&u,E(),n.ot=16194,6==t)return m();case 16194:n.ot=16195;case 16195:if(h=n.bt,h){if(h>l&&(h=l),h>o&&(h=o),0==h)return m();M(f,_,r,i,h),l-=h,i+=h,o-=h,_+=h,n.bt-=h;break}n.ot=16191;break;case 16196:if(N(14),n.kt=V(5)+257,S(5),n.xt=V(5)+1,S(5),n.vt=V(4)+4,S(4),n.kt>286||!n.Nt&&n.xt>30){e.msg=n.Nt?"too many length":"too many length or distance symbols",n.ot=16209;break}n.yt=0,n.ot=16197;case 16197:for(;n.yt<n.vt;)N(3),n.zt[Se[n.yt++]]=V(3),S(3);for(;n.yt<19;)n.zt[Se[n.yt++]]=0;n.It=n.Et,n.et=n.tt=n.It,n.nt=7;let c={Tt:n.It},k={Tt:n.nt},x={Tt:0};if(v=Oe(0,n.zt,19,c,k,n.Lt,x,n.Nt),n.It=c.Tt,n.nt=k.Tt,v){e.msg="invalid code lengths set",n.ot=16209;break}n.yt=0,n.ot=16198;case 16198:for(;n.yt<n.kt+n.xt;){for(;w=n.et[V(n.nt)],!(w.ft<=a);)q();if(w.lt<16)S(w.ft),n.zt[n.yt++]=w.lt;else {if(16==w.lt){if(N(w.ft+2),S(w.ft),0==n.yt){e.msg="invalid bit length repeat",n.ot=16209;break}g=n.zt[n.yt-1],h=3+V(2),S(2);}else 17==w.lt?(N(w.ft+3),S(w.ft),g=0,h=3+V(3),S(3)):(N(w.ft+7),S(w.ft),g=0,h=11+V(7),S(7));if(n.yt+h>n.kt+n.xt){e.msg="invalid bit length repeat",n.ot=16209;break}for(;h--;)n.zt[n.yt++]=g;}}if(16209==n.ot)break;if(0==n.zt[256]){e.msg="invalid code -- missing end-of-block",n.ot=16209;break}n.It=n.Et,n.nt=9;let A={Tt:n.It},U={Tt:n.nt},Q={Tt:0};v=Oe(1,n.zt,n.kt,A,U,n.Lt,Q,n.Nt),n.It=A.Tt,n.nt=U.Tt;let D=Q.Tt;if(n.et=n.It.slice(0,D),v){e.msg="invalid literal/lengths set",n.ot=16209;break}n.rt=6;let Z=n.zt.subarray(n.kt,n.kt+n.xt),C={Tt:n.It},T={Tt:n.rt},B={Tt:D};if(v=Oe(2,Z,n.xt,C,T,n.Lt,B,n.Nt),n.It=C.Tt,n.rt=T.Tt,n.tt=n.It.slice(D),v){e.msg="invalid distances set",n.ot=16209;break}if(n.ot=16199,6==t)return m();case 16199:n.ot=16200;case 16200:if(!n.Nt&&l>=6&&o>=258){L(),qt(e,s),z(),16191==n.ot&&(n.Ft=-1);break}for(n.Ft=0;w=n.et[V(n.nt)],!(w.ft<=a);)q();if(w._t&&!(240&w._t)){for(b=w;w=n.et[b.lt+(V(b.ft+b._t)>>b.ft)],!(b.ft+w.ft<=a);)q();S(b.ft),n.Ft+=b.ft;}if(S(w.ft),n.Ft+=w.ft,n.bt=w.lt,0==w._t){n.ot=16205;break}if(32&w._t){n.Ft=-1,n.ot=16191;break}if(64&w._t){e.msg="invalid literal/length code",n.ot=16209;break}n.He=15&w._t,n.ot=16201;case 16201:n.He&&(N(n.He),n.bt+=V(n.He),S(n.He),n.Ft+=n.He),n.qt=n.bt,n.ot=16202;case 16202:for(;w=n.tt[V(n.rt)],!(w.ft<=a);)q();if(!(240&w._t)){for(b=w;w=n.tt[b.lt+(V(b.ft+b._t)>>b.ft)],!(b.ft+w.ft<=a);)q();S(b.ft),n.Ft+=b.ft;}if(S(w.ft),n.Ft+=w.ft,64&w._t){e.msg="invalid distance code",n.ot=16209;break}n.gt=w.lt,n.He=15&w._t,n.ot=16203;case 16203:n.He&&(N(n.He),n.gt+=V(n.He),S(n.He),n.Ft+=n.He),n.ot=16204;case 16204:if(0==o)return m();if(h=s-o,n.gt>h){if(h=n.gt-h,h>n.k&&n.it){e.msg="invalid distance too far back",n.ot=16209;break}h>n.m?(h-=n.m,d=n.h-h):d=n.m-h,h>n.bt&&(h=n.bt),h>o&&(h=o);for(let e=0;e<h;++e)f[_]=255&n.u[d],++_,++d;}else {d=_-n.gt,h=n.bt,h>o&&(h=o);for(let e=0;e<h;++e)f[_]=f[d],++_,++d;}h>o&&(h=o),o-=h,n.bt-=h,0==n.bt&&(n.ot=16200);break;case 16205:if(0==o)return m();f[_++]=n.bt,o--,n.ot=16200;break;case 16206:if(n.G){if(N(32),s-=o,e.total_out+=s,n.wt+=s,4&n.G&&s){let t=f.subarray(_-s,_);e.i=n.dt=y(n.dt,t,s);}if(s=o,4&n.G&&(n.st?u:P_(u)>>>0)!=n.dt){e.msg="incorrect data check",n.ot=16209;break}E();}n.ot=16207;case 16207:if(n.G&&n.st){if(N(32),4&n.G&&u!=(4294967295&n.wt)){e.msg="incorrect length check",n.ot=16209;break}E();}n.ot=16208;case 16208:return v=1,m();case 16209:return v=-3,m();case 16210:return -4;default:return -2}}catch(e){if(e instanceof h_)return m();throw e}function m(){if(L(),n.h||s!=e.avail_out&&n.ot<16209&&(n.Nt?n.ot<16208:n.ot<16206)||4!=t){let t=s-e.avail_out;if(qn(e,e.next_out.subarray(e.next_out_index-t,e.next_out_index),t))return n.ot=16210,-4}return c-=e.avail_in,s-=e.avail_out,e.total_in+=c,e.total_out+=s,n.wt+=s,4&n.G&&s&&(e.i=n.dt=y(n.dt,e.next_out.subarray(e.next_out_index-s,e.next_out_index),s)),e.t=n.I+(n.ut?64:0)+(16191==n.ot?128:0)+(16199==n.ot||16194==n.ot?256:0),(0==c&&0==s&&0==v||4==t&&0==v)&&(v=-5),v}function y(e,t,r){return n.st?W(e,t,r):he(e,t,r)}function p(e,t){return k[0]=255&t,k[1]=t>>>8&255,W(e,k,2)>>>0}function I(e,t){return k[0]=255&t,k[1]=t>>>8&255,k[2]=t>>>16&255,k[3]=t>>>24&255,W(e,k,4)>>>0}function z(){f=e.next_out,_=e.next_out_index,o=e.avail_out,r=e.next_in,i=e.next_in_index,l=e.avail_in,u=n.p,a=n.I;}function L(){e.next_out=f,e.next_out_index=_,e.avail_out=o,e.next_in=r,e.next_in_index=i,e.avail_in=l,n.p=u,n.I=a;}function E(){u=0,a=0;}function q(){if(0==l)throw new h_;l--,u+=(255&r[i])<<a,i++,u>>>=0,a+=8;}function N(e){for(;a<e;)q();}function V(e){return u&(1<<e)-1}function S(e){u>>>=e,a-=e;}function $(){u>>>=7&a,a-=7&a;}}function nn(e){return Ge(e)?-2:0}var M_=65536,jn=32768,Y_=class{constructor(e=16,t=M_){this.Ht=[],this.Jt=e;for(let n=0;n<N.min(e,4);n++)this.Ht.push(new x(t));}acquire(e=M_){for(let t=this.Ht.length-1;t>=0;t--){let n=this.Ht[t];if(n.length>=e)return this.Ht.splice(t,1),n}return new x(e)}release(e){this.Ht.length<this.Jt&&this.Ht.push(e);}};function rn(e){let t=new Y_(32,M_),n=null;function r(e){try{t.release(e);}catch{}}return new U({start(){},transform(i,f){if(!n){let t=e.Xt(),r=e.Yt(t);if(0!=r&&0!=r)throw new z("init failed: "+r);n={o:t};}let _=n.o,l=0;for(;l<i.length;){let n=N.min(i.length-l,jn),o=i.subarray(l,l+n);for(_.next_in=o,_.next_in_index=0,_.avail_in=o.length;_.avail_in>0;){let n=t.acquire(),i=false;try{_.next_out=n,_.next_out_index=0,_.avail_out=n.length;let r=e.jt(_,0),l=n.length-_.avail_out;if(l>0){let e=!1,r={Kt:n.subarray(0,l),release:()=>{e||(e=!0,t.release(n));}};i=!0,f.enqueue(r);}if(0!=r&&1!=r)throw new z("process error: "+r)}finally{i||r(n);}}l+=n;}},flush(i){if(!n)return;let f=n.o;for(;;){let n=t.acquire(),_=false;try{f.next_out=n,f.next_out_index=0,f.avail_out=n.length;let r=e.jt(f,4),l=n.length-f.avail_out;if(l>0){let e=!1,r={Kt:n.subarray(0,l),release:()=>{e||(e=!0,t.release(n));}};_=!0,i.enqueue(r);}if(1==r)break;if(0!=r)throw new z("finalization error: "+r)}finally{_||r(n);}}let _=e.en(f);if(0!=_&&0!=_)throw new z("end failed: "+_)}})}function an(){return new U({start(){},transform(e,t){try{t.enqueue(e.Kt.slice(0));}finally{e.release();}},flush(){}})}function Vn(e="deflate",t){let n="gzip"==e?31:"deflate-raw"==e?-15:15,r=t&&"number"==typeof t.level?t.level:-1;return rn({Xt:()=>wt(),Yt:e=>Dt(e,r,8,n,8,0),jt:yt,en:B_})}function Jn(e="deflate"){let t="gzip"==e?31:"deflate-raw"==e?-15:15;return rn({Xt:()=>en("deflate64-raw"==e),Yt:e=>_n(e,t),jt:tn,en:nn})}var s_=class{constructor(e="deflate",t){let n=Vn(e,t);this.writable=n.writable,this.readable=n.readable.pipeThrough(an());}},x_=class{constructor(e="deflate"){let t=Jn(e);this.writable=t.writable,this.readable=t.readable.pipeThrough(an());}};
|
|
6511
|
+
var{Uint8Array:x,Uint16Array:E,Int32Array:H,TransformStream:U,Math:N,Error:z,Array:y}=globalThis,Se=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],Z=new x(0),qe=new E(0),de=[];for(let e=0;e<6;e++)de.push(e,0==e?8:4);de.push(0,1);var Ee=[];for(let e=0;e<14;e++)Ee.push(e,0==e?4:2);var ge=new E([0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576]),Te=new E([0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224,0]);function M(e,t,n,r,i){if(0==i)return;let f=e instanceof x?e:new x(e.buffer,e.byteOffset,e.byteLength),_=n instanceof x?n.subarray(r,r+i):new x(n.buffer,n.byteOffset+r,i);f.set(_,t);}function je(e,t,n){0!=n&&(e instanceof x?e:new x(e.buffer,e.byteOffset,e.byteLength)).fill(0,t,t+n);}function Ve(){return {next_in:Z,next_in_index:0,avail_in:0,total_in:0,next_out:Z,next_out_index:0,avail_out:0,total_out:0,msg:"",t:0,i:0,_:0,l:void 0}}function Je(e,t){let n=1<<t;return {o:e,u:new x(n),h:n,k:t,m:0,v:0,p:0,M:0}}function te(e){let t=[];for(let n=0;n<e.length;n+=2){let r=e[n],i=e[n+1];for(let e=0;e<i;e++)t.push(r);}return new E(t)}var ne=class{constructor(e,t){this.L=e,this.Z=t,this.q=0;}},re=class{constructor(e,t,n,r,i){this.N=e,this.V=t,this.W=n,this.S=r,this.$=i;}};function g_(e){return V_[e<-6||e>2?9:2-e]||""}function Ae(e,t){try{e.msg=g_(t);}catch(n){e.msg="zlib error "+String(t)+" ("+n+")";}return t}function $e(e,t){let n=e>>>0,r=0;for(let e=0;e<t;e++)r=r<<1|1&n,n>>>=1;return r}function g(e,t){e.I[e.D++]=t;}function De(e,t){g(e,255&t),g(e,t>>>8&255);}function e_(e,t,n){let r=255&n,i=65535&t,f=e.A+e.U;return e.I[f]=255&i,e.I[f+1]=i>>>8&255,e.I[f+2]=r,e.U+=3,i=i-1&65535,e.R[__[r]+ie+1].P++,e.X[T_(i)].P++,e.U==e.C}function ye(e,t){let n=255&t,r=e.A+e.U;return e.I[r]=0,e.I[r+1]=0,e.I[r+2]=n,e.U+=3,e.R[n].P++,e.U==e.C}function ve(e){return e.h-ae}function T_(e){return e<256?E_[e]:E_[256+(e>>7)]}function w_(e){let t=He+7,n=1<<t,r=(1<<t)-1,i=N.floor((t+k-1)/k),f=1<<8+He;return {...Je(e,15),o:e,H:42,O:0,T:void 0,Y:32767,B:t,F:n,j:r,G:i,J:new E(32768),K:new E(n),ee:f,I:new x(32768),te:0,ne:32768,D:0,re:0,ie:0,fe:0,_e:0,le:0,oe:-2,ue:0,ae:0,ce:0,se:0,de:0,he:0,we:0,ke:0,be:0,ge:0,me:0,ve:0,xe:0,ye:0,pe:new H(2*we+1),ze:new x(2*we+1),Me:new E(be+1),U:0,C:0,Le:Z,A:0,Ee:0,Ze:0,qe:8,Ne:32768,Ve:0,We:0,Se:0,R:new y(le).fill(0).map(()=>Q()),X:new y(2*me+1).fill(0).map(()=>Q()),$e:new y(2*oe+1).fill(0).map(()=>Q()),Ie:S_(),De:S_(),Ae:S_()}}function A_(e){let t=[];for(let n=0;n<e.length;n+=2){let r=e[n],i=e[n+1],f=Q();f.Qe=r,f.Ue=i,t.push(f);}return t}function Q(){return {P:0,Qe:0,Pe:0,Ue:0}}function S_(){return new ne([],ln(null,Z,0,0,0))}function ln(e,t,n,r,i){return new re(e,t,n,r,i)}function J_(){let e=new y(288).fill(0);for(let t=0;t<=143;t++)e[t]=8;for(let t=144;t<=255;t++)e[t]=9;for(let t=256;t<=279;t++)e[t]=7;for(let t=280;t<=287;t++)e[t]=8;return e}function D_(e){let{code:t,length:n}=fn(e),r=new E(2*e.length),i=0;for(let f=0;f<e.length;f++){let e=n[f]||0,_=t[f]||0;r[i++]=e?$e(_,e):0,r[i++]=e;}return new E(r)}function Q_(e,t,n){let r=0;for(let n=0;n<e.length;n++){let i=t[n]?1<<t[n]:1,f=e[n]+i-1;f>r&&(r=f);}r<n&&(r=n);let i=new x(r+1);for(let n=0;n<=r;n++)for(let r=0;r<e.length;r++){let f=t[r]?1<<t[r]:1,_=e[r];if(n>=_&&n<=_+f-1){i[n]=r;break}}return i}function $_(e,t){let n=0;for(let r=0;r<e.length;r++){let i=t[r]?1<<t[r]:1,f=e[r]+i-1;f>n&&(n=f);}let r=new x(n+1);for(let i=0;i<=n;i++)for(let n=0;n<e.length;n++){let f=t[n]?1<<t[n]:1,_=e[n];if(i>=_&&i<=_+f-1){r[i]=n;break}}return r}function et(e){let t=new x(512),n=e.length-1;for(let r=0;r<256;r++)t[r]=r<=n?e[r]:e[n];for(let r=256;r<=n;r++){let n=r>>7;t[256+(n>255?255:n)]=e[r];}for(let e=257;e<512;e++)0==t[e]&&(t[e]=t[e-1]);return t}function fn(e){let t=N.max(...e),n=new y(t+1).fill(0);for(let t of e)t>0&&n[t]++;let r=new y(e.length).fill(0),i=new y(t+1).fill(0),f=0;for(let e=1;e<=t;e++)f=f+n[e-1]<<1,i[e]=f;for(let t=0;t<e.length;t++){let n=e[t];0!=n&&(r[t]=i[n]++);}return {code:r,length:e}}var He=8,k=3,_e=258,ae=_e+k+1,Ue=16,Be=_e,un=29,ie=256,we=ie+1+un,me=30,oe=19,le=2*we+1,be=15,_t=9,tt=255,nt=32,rt=4,Ie=256,t_=16,n_=17,r_=18,at=0,y_=1,it=2,$=-1,V_=["need dictionary","stream end","","file error","stream error","data error","insufficient memory","buffer error",""],a_=te(de),i_=te(Ee),Fe=new E(19);Fe[16]=2,Fe[17]=3,Fe[18]=7;var cn=D_(J_()),dn=D_(new y(30).fill(5)),Ze=A_(cn),v_=A_(dn),__=Q_(Te,a_,_e),E_=et($_(ge,i_));function Pe(e){return e%65521>>>0}function se(e,t,n){if(void 0===t||void 0===n)return 1;let r=e>>>16&65535;if(e&=65535,1==n)return (e+=t[0])>=65521&&(e-=65521),r+=e,r>=65521&&(r-=65521),(r<<16|e)>>>0;if(n<16){for(let i=0;i<n;i++)r+=e+=t[i];return e>=65521&&(e-=65521),r=Pe(r),(r<<16|e)>>>0}for(;n>=5552;){n-=5552;let i=N.floor(347);do{for(let n=0;n<16;n++)r+=e+=t[n];t=t.subarray(16);}while(--i);e=Pe(e),r=Pe(r);}if(n){for(;n>=16;){n-=16;for(let n=0;n<16;n++)r+=e+=t[n];t=t.subarray(16);}for(let i=0;i<n;i++)r+=e+=t[i];e=Pe(e),r=Pe(r);}return (r<<16|e)>>>0}var mn=(()=>{let e=new y(256);for(let t=0;t<256;t++){let n=t;for(let e=0;e<8;e++)n=1&n?3988292384^n>>>1:n>>>1;e[t]=n>>>0;}return e})();function W(e=0,t,n){if(!t)return 0;void 0===n&&(n=t.length),n=N.min(n,t.length),e=~e>>>0;for(let r=0;r<n;r++)e=e>>>8^mn[255&(e^t[r])];return (4294967295^e)>>>0}function mt(e){16==e.M?(De(e,e.p),e.p=0,e.M=0):e.M>=8&&(g(e,e.p),e.p>>=8,e.M-=8);}function bt(e){e.M>8?De(e,e.p):e.M>0&&g(e,e.p),e.Ee=1+(e.M-1&7),e.p=0,e.M=0;}function bn(e,t,n){let r,i,f=[],_=0;for(r=1;r<=be;r++)_=_+n[r-1]<<1,f[r]=_;for(i=0;i<=t;i++){let t=e[i].Ue;0!=t&&(e[i].Qe=$e(f[t]++,t));}}function L(e,t,n){e.M>Ue-n?(e.p=65535&(e.p|t<<e.M),De(e,e.p),e.p=t>>Ue-e.M&65535,e.M+=n-Ue):(e.p=65535&(e.p|t<<e.M),e.M+=n);}function st(e){for(let t=0;t<e.R.length;t++)e.R[t].P=0;for(let t=0;t<e.X.length;t++)e.X[t].P=0;for(let t=0;t<e.$e.length;t++)e.$e[t].P=0;e.R[Ie].P=1,e.ie=e.fe=0,e.U=e._e=0;}function ht(e){if(e.R&&e.R.length>=le)for(let t=0;t<le;t++)e.R[t]=Q();else {e.R=[];for(let t=0;t<le;t++)e.R.push(Q());}if(e.X&&e.X.length>=2*me+1)for(let t=0;t<2*me+1;t++)e.X[t]=Q();else {e.X=[];for(let t=0;t<2*me+1;t++)e.X.push(Q());}if(e.$e&&e.$e.length>=2*oe+1)for(let t=0;t<2*oe+1;t++)e.$e[t]=Q();else {e.$e=[];for(let t=0;t<2*oe+1;t++)e.$e.push(Q());}e.Ie=new ne(e.R,new re(Ze,a_,ie+1,we,be)),e.De=new ne(e.X,new re(v_,i_,0,me,be)),e.Ae=new ne(e.$e,new re(null,Fe,0,oe,7)),e.p=0,e.M=0,e.Ee=0,st(e);}var he=1;function sn(e,t,n){return n=e.pe[he],e.pe[he]=e.pe[e.We--],I_(e,t,he),n}function ft(e,t,n,r){return e[t].P<e[n].P||e[t].P==e[n].P&&r[t]<=r[n]}function I_(e,t,n){let r=e.pe[n],i=n<<1;for(;i<=e.We&&(i<e.We&&ft(t,e.pe[i+1],e.pe[i],e.ze)&&i++,!ft(t,r,e.pe[i],e.ze));)e.pe[n]=e.pe[i],n=i,i<<=1;e.pe[n]=r;}function hn(e,t){let n,r,i,f,_,l,o=t.L,u=t.q,a=t.Z.N,c=t.Z.V,s=t.Z.W,d=t.Z.$,h=0;for(f=0;f<=be;f++)e.Me[f]=0;for(o[e.pe[e.Se]].Ue=0,n=e.Se+1;n<le;n++)r=e.pe[n],f=o[o[r].Pe].Ue+1,f>d&&(f=d,h++),o[r].Ue=f,!(r>u)&&(e.Me[f]++,_=0,r>=s&&(_=c[r-s]),l=o[r].P,e.ie+=l*(f+_),a&&(e.fe+=l*(a[r].Ue+_)));if(0!=h){do{for(f=d-1;0==e.Me[f];)f--;e.Me[f]--,e.Me[f+1]+=2,e.Me[d]--,h-=2;}while(h>0);for(f=d;0!=f;f--)for(r=e.Me[f];0!=r;)i=e.pe[--n],!(i>u)&&(o[i].Ue!=f&&(e.ie+=(f-o[i].Ue)*o[i].P,o[i].Ue=f),r--);}}function k_(e,t){let n,r,i,f=t.L,_=t.Z.N,l=t.Z.S,o=-1;for(e.We=0,e.Se=le,n=0;n<l;n++)0!=f[n].P?(e.pe[++e.We]=o=n,e.ze[n]=0):f[n].Ue=0;for(;e.We<2;)i=e.pe[++e.We]=o<2?++o:0,f[i].P=1,e.ze[i]=0,e.ie--,_&&(e.fe-=_[i].Ue);for(t.q=o,n=N.floor(e.We/2);n>=1;n--)I_(e,f,n);i=l;do{n=sn(e,f,n),r=e.pe[he],e.pe[--e.Se]=n,e.pe[--e.Se]=r,f[i].P=f[n].P+f[r].P,e.ze[i]=(e.ze[n]>=e.ze[r]?e.ze[n]:e.ze[r])+1,f[n].Pe=f[r].Pe=i,e.pe[he]=i++,I_(e,f,he);}while(e.We>=2);e.pe[--e.Se]=e.pe[he],hn(e,t),bn(f,t.q,e.Me);}function ut(e,t,n){let r,i,f=-1,_=t[0].Ue,l=0,o=7,u=4;for(0==_&&(o=138,u=3),t[n+1].Ue=65535,r=0;r<=n;r++)i=_,_=t[r+1].Ue,!(++l<o&&i==_)&&(l<u?e.$e[i].P+=l:0!=i?(i!=f&&e.$e[i].P++,e.$e[t_].P++):l<=10?e.$e[n_].P++:e.$e[r_].P++,l=0,f=i,0==_?(o=138,u=3):i==_?(o=6,u=3):(o=7,u=4));}function ct(e,t,n){let r,i=-1,f=t[0].Ue,_=0,l=7,o=4;0==f&&(l=138,o=3);for(let u=0;u<=n;u++)if(r=f,f=t[u+1].Ue,!(++_<l&&r==f)){if(_<o)do{L(e,e.$e[r].Qe,e.$e[r].Ue);}while(0!=--_);else 0!=r?(r!=i&&(L(e,e.$e[r].Qe,e.$e[r].Ue),_--),L(e,e.$e[t_].Qe,e.$e[t_].Ue),L(e,_-3,2)):_<=10?(L(e,e.$e[n_].Qe,e.$e[n_].Ue),L(e,_-3,3)):(L(e,e.$e[r_].Qe,e.$e[r_].Ue),L(e,_-11,7));_=0,i=r,0==f?(l=138,o=3):r==f?(l=6,o=3):(l=7,o=4);}}function xn(e){let t;for(ut(e,e.R,e.Ie.q),ut(e,e.X,e.De.q),k_(e,e.Ae),t=oe-1;t>=3&&0==e.$e[Se[t]].Ue;t--);return e.ie+=3*(t+1)+5+5+4,t}function pn(e,t,n,r){let i;for(L(e,t-257,5),L(e,n-1,5),L(e,r-4,4),i=0;i<r;i++)L(e,e.$e[Se[i]].Ue,3);ct(e,e.R,t-1),ct(e,e.X,n-1);}function Me(e,t,n,r,i=0){L(e,(at<<1)+r,3),bt(e),De(e,n),De(e,~n),n&&t&&M(e.I,e.D,t,i,n),e.D+=n;}function xt(e){mt(e);}function pt(e){L(e,y_<<1,3),L(e,Ze[Ie].Qe,Ze[Ie].Ue),mt(e);}function dt(e,t,n){let r,i,f,_,l=0;if(0!=e.U)do{r=255&e.Le[l],r+=(255&e.Le[l+1])<<8,i=e.Le[l+2],l+=3,0==r?L(e,t[i].Qe,t[i].Ue):(f=__[i],L(e,t[f+ie+1].Qe,t[f+ie+1].Ue),_=a_[f],0!=_&&(i-=Te[f],L(e,i,_)),r--,f=T_(r),L(e,n[f].Qe,n[f].Ue),_=i_[f],0!=_&&(r-=ge[f],L(e,r,_)));}while(l<e.U);L(e,t[Ie].Qe,t[Ie].Ue);}function Sn(e){let t,n=4093624447;for(t=0;t<=31;t++,n>>=1)if(1&n&&0!=e.R[t].P)return 0;if(0!=e.R[9].P||0!=e.R[10].P||0!=e.R[13].P)return 1;for(t=32;t<ie;t++)if(0!=e.R[t].P)return 1;return 0}function St(e,t,n,r,i=0){let f,_,l=0;e.be>0?(2==e.o.t&&(e.o.t=Sn(e)),k_(e,e.Ie),k_(e,e.De),l=xn(e),f=e.ie+3+7>>3,_=e.fe+3+7>>3,(_<=f||4==e.ge)&&(f=_)):f=_=n+5,n+4<=f&&t?Me(e,t,n,r,i):_==f?(L(e,(y_<<1)+r,3),dt(e,Ze,v_)):(L(e,(it<<1)+r,3),pn(e,e.Ie.q+1,e.De.q+1,l+1),dt(e,e.R,e.X)),st(e),r&&bt(e);}function wt(){let e=Ve();return e.l=w_(e),e}var Ye=[{Re:kt,Xe:0,Ce:0,He:0,Oe:0},{Re:z_,Xe:4,Ce:4,He:8,Oe:4},{Re:z_,Xe:5,Ce:5,He:16,Oe:8},{Re:z_,Xe:6,Ce:16,He:32,Oe:32},{Re:Re,Xe:4,Ce:4,He:16,Oe:16},{Re:Re,Xe:16,Ce:8,He:16,Oe:32},{Re:Re,Xe:16,Ce:16,He:32,Oe:128},{Re:Re,Xe:32,Ce:32,He:128,Oe:256},{Re:Re,Xe:128,Ce:128,He:256,Oe:1024},{Re:Re,Xe:258,Ce:258,He:258,Oe:4096}];function Et(e){return 2*e-(e>4?9:0)}function f_(e,t,n){return ((t<<e.G^n)&e.j)>>>0}function u_(e,t){e.ke=f_(e,e.ke,e.u[t+(k-1)]);let n=e.J[t&e.Y]=e.K[e.ke];return e.K[e.ke]=t,n}function At(e){e.K[e.F-1]=0,je(e.K,0,(e.F-1)*e.K.BYTES_PER_ELEMENT);}function Dn(e){let t,n,r=e.h;for(t=e.F;t>0;)t--,n=e.K[t],e.K[t]=n>=r?n-r:0;for(t=r;t>0;)t--,n=e.J[t],e.J[t]=n>=r?n-r:0;}function C_(e,t,n,r){let i=e.avail_in;return i>r&&(i=r),0==i?0:(e.avail_in-=i,M(t,n,e.next_in,e.next_in_index,i),1==e.l.O?e.i=se(e.i,new x(t.buffer,t.byteOffset+n,i),i):2==e.l.O&&(e.i=W(e.i,new x(t.buffer,t.byteOffset+n,i),i)),e.next_in_index+=i,e.total_in+=i,i)}function c_(e){let t,n,r=e.h;do{if(n=e.Ne-e.ce-e.ae,0==n&&0==e.ae&&0==e.ce?n=r:-1==n&&n--,e.ae>=r+ve(e)&&(M(e.u,0,e.u,r,r-n),e.Ve-=r,e.ae-=r,e.ue-=r,e.le>e.ae&&(e.le=e.ae),Dn(e),n+=r),0==e.o.avail_in)break;if(t=C_(e.o,e.u,e.ae+e.ce,n),e.ce+=t,e.ce+e.le>=k){let t=e.ae-e.le;for(e.ke=e.u[t],e.ke=f_(e,e.ke,e.u[t+1]);e.le&&(e.ke=f_(e,e.ke,e.u[t+k-1]),e.J[t&e.Y]=e.K[e.ke],e.K[e.ke]=t,t++,e.le--,!(e.ce+e.le<k)););}}while(e.ce<ae&&0!=e.o.avail_in);if(e.m<e.Ne){let t,n=e.ae+e.ce;e.m<n?(t=e.Ne-n,t>Be&&(t=Be),je(e.u,n,t),e.m=n+t):e.m<n+Be&&(t=n+Be-e.m,t>e.Ne-e.m&&(t=e.Ne-e.m),je(e.u,e.m,t),e.m+=t);}}function Dt(e,t,n=8,r=15,i=He,f=0){let _=1;if(!e)return -2;if(e.msg="",-1==t&&(t=6),r<0){if(_=0,r<-15)return -2;r=-r;}else r>15&&(_=2,r-=16);if(i<1||i>_t||8!=n||r<8||r>15||t<0||t>9||f<0||f>4||8==r&&1!=_)return -2;8==r&&(r=9);let l=w_(e);return l?(e.l=l,l.o=e,l.H=42,l.O=_,l.T=void 0,l.k=r,l.h=1<<l.k,l.Y=l.h-1,l.B=i+7,l.F=1<<l.B,l.j=l.F-1,l.G=(l.B+k-1)/k,l.u=new x(2*l.h),l.J=new E(l.h),l.K=new E(l.F),l.m=0,l.ee=1<<i+6,l.I=new x(l.ee*rt),l.ne=4*l.ee,l.u&&l.J&&l.K&&l.I?(l.Le=l.I.subarray(l.ee),l.A=l.te+l.ee,l.C=3*(l.ee-1),l.be=t,l.ge=f,l.qe=n,In(e)):(l.H=666,e.msg=g_(-4),B_(e),-4)):-4}function U_(e){if(null==e)return true;let t=e.l;return !t||t.o!=e||42!=t.H&&57!=t.H&&69!=t.H&&73!=t.H&&91!=t.H&&103!=t.H&&113!=t.H&&666!=t.H}function yn(e){let t;return U_(e)?-2:(e.total_in=e.total_out=0,e.msg="",e.t=2,t=e.l,t.D=0,t.re=t.te,t.O<0&&(t.O=-t.O),t.H=2==t.O?57:42,e.i=2==t.O?W(0):se(0),t.oe=-2,ht(t),0)}function vn(e){e.Ne=2*e.h,At(e),e.ye=Ye[e.be].Xe,e.me=Ye[e.be].Ce,e.ve=Ye[e.be].He,e.xe=Ye[e.be].Oe,e.ae=0,e.ue=0,e.ce=0,e.le=0,e.se=e.de=k-1,e.we=0,e.ke=0;}function In(e){let t=yn(e);return 0==t&&vn(e.l),t}function Xe(e,t){g(e,t>>8),g(e,255&t);}function q(e){let t,n=e.l;xt(n),t=n.D,t>e.avail_out&&(t=e.avail_out),0!=t&&(M(e.next_out,e.next_out_index,n.I,n.re,t),e.next_out_index+=t,n.re+=t,e.total_out+=t,e.avail_out-=t,n.D-=t,0==n.D&&(n.re=n.te));}function ke(e,t){let n=e.l;n.T&&n.T.Te&&(e.i=W(e.i,new x(n.I.buffer,n.te+t,n.D-t),n.D-t));}function yt(e,t){let n,r=e.l;if(U_(e)||t>5||t<0)return Ae(e,-2);if(!e.next_out||0!=e.avail_in&&!e.next_in||666==r.H&&4!=t)return Ae(e,-2);if(0==e.avail_out)return Ae(e,-5);if(n=r.oe,r.oe=t,0!=r.D){if(q(e),0==e.avail_out)return r.oe=$,0}else if(0==e.avail_in&&Et(t)<=Et(n)&&4!=t)return Ae(e,-5);if(666==r.H&&0!=e.avail_in)return Ae(e,-5);if(42==r.H&&0==r.O&&(r.H=113),42==r.H){let t,n=8+(r.k-8<<4)<<8;if(t=r.ge>=2||r.be<2?0:r.be<6?1:6==r.be?2:3,n|=t<<6,0!=r.ae&&(n|=nt),n+=31-n%31,Xe(r,n),0!=r.ae&&(Xe(r,e.i>>16),Xe(r,65535&e.i)),e.i=1,r.H=113,q(e),0!=r.D)return r.oe=$,0}if(57==r.H)if(e.i=W(0),g(r,31),g(r,139),g(r,8),r.T)g(r,(r.T.Ye?1:0)+(r.T.Te?2:0)+(null==r.T.Be?0:4)+(null==r.T.Fe?0:8)+(null==r.T.je?0:16)),g(r,255&r.T.Ge),g(r,r.T.Ge>>>8&255),g(r,r.T.Ge>>>16&255),g(r,r.T.Ge>>>24&255),g(r,9==r.be?2:r.ge>=2||r.be<2?4:0),g(r,255&r.T.Je),null!=r.T.Be&&(g(r,255&r.T.Ke),g(r,r.T.Ke>>>8&255)),r.T.Te&&(e.i=W(e.i,r.I,r.D)),r.Ze=0,r.H=69;else if(g(r,0),g(r,0),g(r,0),g(r,0),g(r,0),g(r,9==r.be?2:r.ge>=2||r.be<2?4:0),g(r,tt),r.H=113,q(e),0!=r.D)return r.oe=$,0;if(69==r.H){if(r.T&&null!=r.T.Be){let t=r.D,n=(65535&r.T.Ke)-r.Ze;for(;r.D+n>r.ne;){let i=r.ne-r.D;if(M(r.I,r.D,r.T.Be,r.Ze,i),r.D=r.ne,ke(e,t),r.Ze+=i,q(e),0!=r.D)return r.oe=$,0;t=0,n-=i;}M(r.I,r.D,r.T.Be,r.Ze,n),r.D+=n,ke(e,t),r.Ze=0;}r.H=73;}if(73==r.H){if(r.T&&r.T.Fe&&r.T.Fe.length){let t,n=r.D;do{if(r.D==r.ne){if(ke(e,n),q(e),0!=r.D)return r.oe=$,0;n=0;}t=r.T.Fe[r.Ze++],g(r,t);}while(0!=t);ke(e,n),r.Ze=0;}r.H=91;}if(91==r.H){if(r.T&&r.T.je&&r.T.je.length){let t,n=r.D;do{if(r.D==r.ne){if(ke(e,n),q(e),0!=r.D)return r.oe=$,0;n=0;}t=r.T.je[r.Ze++],g(r,t);}while(0!=t);ke(e,n);}r.H=103;}if(103==r.H){if(r.T&&r.T.Te){if(r.D+2>r.ne&&(q(e),0!=r.D))return r.oe=$,0;g(r,255&e.i),g(r,e.i>>>8&255),e.i=W(0);}if(r.H=113,q(e),0!=r.D)return r.oe=$,0}if(0!=e.avail_in||0!=r.ce||0!=t&&666!=r.H){let n=0==r.be?kt(r,t):2==r.ge?Nn(r,t):3==r.ge?kn(r,t):Ye[r.be].Re(r,t);if((2==n||3==n)&&(r.H=666),0==n||2==n)return 0==e.avail_out&&(r.oe=$),0;if(1==n&&(1==t?pt(r):5!=t&&(Me(r,null,0,0),3==t&&(At(r),0==r.ce&&(r.ae=0,r.ue=0,r.le=0))),q(e),0==e.avail_out))return r.oe=$,0}return 4!=t?0:r.O<=0?1:(2==r.O?(g(r,255&e.i),g(r,e.i>>>8&255),g(r,e.i>>>16&255),g(r,e.i>>>24&255),g(r,255&e.total_in),g(r,e.total_in>>>8&255),g(r,e.total_in>>>16&255),g(r,e.total_in>>>24&255)):(Xe(r,e.i>>>16&65535),Xe(r,65535&e.i)),q(e),r.O>0&&(r.O=-r.O),0!=r.D?0:1)}function B_(e){if(U_(e))return -2;let t=e.l,n=t.H;return t.u=Z,t.J=qe,t.K=qe,t.I=Z,t.Le=Z,t.pe=new H(0),t.ze=Z,t.Me=qe,t.R.length=0,t.X.length=0,t.$e.length=0,t.T=void 0,t.te=0,t.re=0,t.A=0,113==n?-3:0}function vt(e,t){let n,r,i=e.xe,f=e.ae,_=e.de,l=e.ve,o=e.ae>ve(e)?e.ae-ve(e):0,u=e.J,a=e.Y,c=e.u[f],s=e.u[f+1],d=e.u[f+_-1],h=e.u[f+_];e.de>=e.me&&(i>>=2),l>e.ce&&(l=e.ce);do{if(n=t,e.u[n+_]!=h||e.u[n+_-1]!=d||e.u[n]!=c||e.u[n+1]!=s)continue;let i=N.min(_e,e.ce),o=2;for(;o<i&&e.u[f+o]==e.u[n+o];)o++;if(r=o,r>_){if(e.Ve=t,_=r,r>=l)break;d=e.u[f+_-1],h=e.u[f+_];}}while((t=u[t&a])>o&&0!=--i);return _<=e.ce?_:e.ce}function It(e,t){St(e,e.u,e.ae-e.ue,t,e.ue),e.ue=e.ae,q(e.o);}function V(e,t){return It(e,t?1:0),0==e.o.avail_out?t?2:0:null}var gt=65535;function Ne(e,t){return e<t?e:t}function kt(e,t){let n,r,i,f=Ne(e.ne-5,e.h),_=0,l=e.o.avail_in;do{if(n=gt,i=e.M+42>>3,e.o.avail_out<i||(i=e.o.avail_out-i,r=e.ae-e.ue,n>r+e.o.avail_in&&(n=r+e.o.avail_in),n>i&&(n=i),n<f&&(0==n&&4!=t||0==t||n!=r+e.o.avail_in)))break;_=4==t&&n==r+e.o.avail_in?1:0,Me(e,null,0,_),e.I[e.D-4]=n,e.I[e.D-3]=n>>8,e.I[e.D-2]=~n,e.I[e.D-1]=~n>>8,q(e.o),r&&(r>n&&(r=n),M(e.o.next_out,e.o.next_out_index,e.u,e.ue,r),e.o.next_out_index+=r,e.o.avail_out-=r,e.o.total_out+=r,e.ue+=r,n-=r),n&&(C_(e.o,e.o.next_out,e.o.next_out_index,n),e.o.next_out_index+=n,e.o.avail_out-=n,e.o.total_out+=n);}while(0==_);if(l-=e.o.avail_in,l){if(l>=e.h){e._e=2;let t=e.o.next_in_index-e.h;M(e.u,0,e.o.next_in,t,e.h),e.ae=e.h,e.le=e.ae;}else e.Ne-e.ae<=l&&(e.ae-=e.h,M(e.u,0,e.u,e.h,e.ae),e._e<2&&e._e++,e.le>e.ae&&(e.le=e.ae)),M(e.u,e.ae,e.o.next_in,e.o.next_in_index-l,l),e.ae+=l,e.le+=Ne(l,e.h-e.le);e.ue=e.ae;}return e.m<e.ae&&(e.m=e.ae),_?(e.Ee=8,3):0!=t&&4!=t&&0==e.o.avail_in&&e.ae==e.ue?1:(i=e.Ne-e.ae,e.o.avail_in>i&&e.ue>=e.h&&(e.ue-=e.h,e.ae-=e.h,M(e.u,0,e.u,e.h,e.ae),e._e<2&&e._e++,i+=e.h,e.le>e.ae&&(e.le=e.ae)),i>e.o.avail_in&&(i=e.o.avail_in),i&&(C_(e.o,e.u,e.ae,i),e.ae+=i,e.le+=Ne(i,e.h-e.le)),e.m<e.ae&&(e.m=e.ae),i=e.M+42>>3,i=Ne(e.ne-i,gt),f=Ne(i,e.h),r=e.ae-e.ue,(r>=f||(r||4==t)&&0!=t&&0==e.o.avail_in&&r<=i)&&(n=Ne(r,i),_=4==t&&0==e.o.avail_in&&n==r?1:0,Me(e,e.u,n,_,e.ue),e.ue+=n,q(e.o)),_&&(e.Ee=8),_?2:0)}function z_(e,t){let n,r=false;for(;;){if(e.ce<ae){if(c_(e),e.ce<ae&&0==t)return 0;if(0==e.ce)break}if(n=0,e.ce>=k&&(n=u_(e,e.ae)),0!=n&&e.ae-n<=ve(e)&&(e.se=vt(e,n)),e.se>=k)if(e.ae,e.Ve,e.se,r=e_(e,e.ae-e.Ve,e.se-k),e.ce-=e.se,e.se<=e.ye&&e.ce>=k){e.se--;do{e.ae++,n=u_(e,e.ae);}while(0!=--e.se);e.ae++;}else e.ae+=e.se,e.se=0,e.ke=e.u[e.ae],e.ke=f_(e,e.ke,e.u[e.ae+1]);else r=ye(e,e.u[e.ae]),e.ce--,e.ae++;if(r){let t=V(e,false);if(null!=t)return t}}if(e.le=e.ae<k-1?e.ae:k-1,4==t){return V(e,true)??3}if(e.U){let t=V(e,false);if(null!=t)return t}return 1}function Re(e,t){let n,r=false;for(;;){if(e.ce<ae){if(c_(e),e.ce<ae&&0==t)return 0;if(0==e.ce)break}if(n=0,e.ce>=k&&(n=u_(e,e.ae)),e.de=e.se,e.he=e.Ve,e.se=k-1,0!=n&&e.de<e.ye&&e.ae-n<=ve(e)&&(e.se=vt(e,n),e.se<=5&&1==e.ge&&(e.se=k-1)),e.de>=k&&e.se<=e.de){let t=e.ae+e.ce-k;e.ae,e.he,e.de,r=e_(e,e.ae-1-e.he,e.de-k),e.ce-=e.de-1,e.de-=2;do{++e.ae<=t&&(n=u_(e,e.ae));}while(0!=--e.de);if(e.we=0,e.se=k-1,e.ae++,r){let t=V(e,false);if(null!=t)return t}}else if(e.we){if(r=ye(e,e.u[e.ae-1]),r&&It(e,0),e.ae++,e.ce--,0==e.o.avail_out)return 0}else e.we=1,e.ae++,e.ce--;}if(e.we&&(r=ye(e,e.u[e.ae-1]),e.we=0),e.le=e.ae<k-1?e.ae:k-1,4==t){return V(e,true)??3}if(e.U){let t=V(e,false);if(null!=t)return t}return 1}function kn(e,t){let n,r,i,f;for(;;){if(e.ce<=_e){if(c_(e),e.ce<=_e&&0==t)return 0;if(0==e.ce)break}if(e.se=0,e.ce>=k&&e.ae>0&&(i=e.ae-1,r=e.u[i],r==++i&&r==++i&&r==++i)){f=e.ae+_e;do{}while(r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&i<f);e.se=_e-(f-i),e.se>e.ce&&(e.se=e.ce);}if(e.se>=k?(e.ae,e.ae,e.se,n=e_(e,1,e.se-k),e.ce-=e.se,e.ae+=e.se,e.se=0):(n=ye(e,e.u[e.ae]),e.ce--,e.ae++),n){let t=V(e,false);if(null!=t)return t}}if(e.le=0,4==t){return V(e,true)??3}if(e.U){let t=V(e,false);if(null!=t)return t}return 1}function Nn(e,t){let n=false;for(;;){if(0==e.ce&&(c_(e),0==e.ce)){if(0==t)return 0;break}if(e.se=0,n=ye(e,e.u[e.ae]),e.ce--,e.ae++,n){let t=V(e,false);if(null!=t)return t}}if(e.le=0,4==t){return V(e,true)??3}if(e.U){let t=V(e,false);if(null!=t)return t}return 1}var ue=852,d_=592,m_=594,Nt=ge.map(e=>e+1),Rt=Te.subarray(0,-1).map(e=>e+3),Rn=[16,1,73,1,200,1],zn=[144,1,72,1,78,1],zt=Ee.map(Yt),Ct=Ee.map(Wt);zt.push(64,2),Ct.push(142,2);var Lt=de.slice(0,-2).map(Yt),Ot=de.slice(0,-2).map(Wt);Lt.push(...Rn),Ot.push(...zn);var Ht=new E([...Rt,258,0,0]),Ut=new E([...Rt,3,0,0]),Bt=te(Lt),Ft=te(Ot),Zt=new E([...Nt,0,0]),Pt=new E([...Nt,32769,49153]),Mt=te(zt),Xt=te(Ct);function Yt(e,t){return t%2?e:e+16}function Wt(e,t){return t%2?e:e+128}function Kt(e,t){let n,r=e.l,i=e.next_in_index,f=e.next_out_index,_=e.next_in,l=e.next_out,o=r.u,u=r.p>>>0,a=r.M>>>0,c=r.et,s=r.tt,d=(1<<r.nt)-1,h=(1<<r.rt)-1,w=r.h>>>0,k=r.m>>>0,b=r.v>>>0,g=r.it,m=f-(t-e.avail_out),v=f+(e.avail_out-257),x=i+(e.avail_in-5),y=0,p=0,z=0,M=0;e:do{for(;a<15;){if(!(i<_.length))break e;u+=_[i++]<<a,a+=8;}n=c[u&d];t:for(;;){if(z=n.ft,u>>>=z,a-=z,z=n._t,0==z){l[f++]=n.lt;break}if(16&z){if(y=n.lt,z&=15,z){for(;a<z;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}y+=u&(1<<z)-1,u>>>=z,a-=z;}for(;a<15;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}n=s[u&h];n:for(;;){if(z=n.ft,u>>>=z,a-=z,z=n._t,16&z){if(p=n.lt,z&=15,z){for(;a<z;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}p+=u&(1<<z)-1,u>>>=z,a-=z;}let t=y,c=f-m;if(p>c){let n=p-c;if(n>k&&g){e.msg="invalid distance too far back",r.ot=16209;break e}if(0==b){if(M=w-n,!(n<t)){for(let e=0;e<t;++e)l[f++]=o[M++];continue e}for(let e=0;e<n;++e)l[f++]=o[M++];t-=n,M=f-p;}else if(b<n){M=w+b-n;let e=n-b;if(!(e<t)){for(let e=0;e<t;++e)l[f++]=o[M++];continue e}for(let t=0;t<e;++t)l[f++]=o[M++];if(t-=e,M=0,b<t){for(let e=0;e<b;++e)l[f++]=o[M++];t-=b,M=f-p;}}else {if(M=b-n,!(n<t)){for(let e=0;e<t;++e)l[f++]=o[M++];continue e}for(let e=0;e<n;++e)l[f++]=o[M++];t-=n,M=f-p;}for(;t>2;)l[f++]=l[M++],l[f++]=l[M++],l[f++]=l[M++],t-=3;t&&(l[f++]=l[M++],t>1&&(l[f++]=l[M++]));}else {for(M=f-p;t>2;)l[f++]=l[M++],l[f++]=l[M++],l[f++]=l[M++],t-=3;t&&(l[f++]=l[M++],t>1&&(l[f++]=l[M++]));}break}if(64&z){e.msg="invalid distance code",r.ot=16209;break e}n=s[n.lt+(u&(1<<z)-1)];continue n}break}if(64&z){if(32&z){r.ot=16191;break e}e.msg="invalid literal/length code",r.ot=16209;break e}n=c[n.lt+(u&(1<<z)-1)];continue t}}while(i<x&&f<v);let L=a>>3;i-=L,a-=L<<3,u&=(1<<a)-1,e.next_in_index=i,e.next_out_index=f,e.avail_in=i<x?x-i+5:5-(i-x),e.avail_out=f<v?v-f+257:257-(f-v),r.p=u>>>0,r.M=a>>>0;}function F_(e,t){let n=[],r=t?ue+m_:ue+d_;return {...Je(e,0),o:e,ot:16180,ut:false,O:0,ct:false,st:0,dt:0,ht:0,wt:0,u:Z,kt:0,bt:0,Be:0,et:n,tt:n,nt:0,rt:0,gt:0,vt:0,xt:0,yt:0,zt:n,Mt:new E(320),Lt:new E(288),Et:new y(r).fill(null).map(()=>pe()),Zt:0,it:true,qt:0,Nt:0,Vt:t}}function pe(e=0,t=0,n=0){return {_t:e,ft:t,lt:n}}function Z_(e=1){return {_t:64,ft:e,lt:0}}function qt(e=0){return {_t:96,ft:e,lt:0}}function P_(e){return (255&e)<<24|(e>>8&255)<<16|(e>>16&255)<<8|e>>24&255}var Le=15,Ln={Vt:false,Wt:Ht,St:Bt,$t:Zt,It:Mt,Dt:20,At:257,Qt:0,Ut:d_,Pt:false,Rt:true},On={Vt:true,Wt:Ut,St:Ft,$t:Pt,It:Xt,Dt:19,At:256,Qt:-1,Ut:m_,Pt:true,Rt:false};function Oe(e,t,n,r,i,f,_,l){let o,u,a,c,s,d,h,w,k,b,g,m,v,x,y,p,z,M,L,Z=new E(Le+1),q=new E(Le+1),N=l?On:Ln;for(o=0;o<=Le;o++)Z[o]=0;for(u=0;u<n;u++)Z[t[u]]++;for(s=i.Xt,c=Le;c>=1&&0==Z[c];c--);if(s>c&&(s=c),0==c)return N.Rt?(y=Z_(1),r.Xt[0]=y,r.Xt[1]=y,i.Xt=1,0):-1;for(a=1;a<c&&0==Z[a];a++);for(s<a&&(s=a),w=1,o=1;o<=Le;o++)if(w<<=1,w-=Z[o],w<0)return -1;if(w>0&&(0==e||1!=c))return -1;for(q[1]=0,o=1;o<Le;o++)q[o+1]=q[o]+Z[o];for(u=0;u<n;u++)0!=t[u]&&(f[q[t[u]]++]=u);switch(e){case 0:z=M=f,L=N.Dt;break;case 1:z=N.Wt,M=N.St,L=N.At;break;default:z=N.$t,M=N.It,L=N.Qt;}if(b=0,u=0,o=a,p=_.Xt,d=s,h=0,v=-1,k=1<<s,x=k-1,1==e&&(N.Pt?k>=ue:k>ue)||2==e&&(N.Pt?k>=N.Ut:k>N.Ut))return 1;for(;;){y=Hn(f,u,o,h,e,z,M,L,N.Vt),g=1<<o-h,m=1<<d,a=m;do{m-=g;let e=(b>>h)+m;r.Xt[p+e]={...y};}while(0!=m);for(g=1<<o-1;b&g;)g>>=1;if(0!=g?(b&=g-1,b+=g):b=0,u++,0==--Z[o]){if(o==c)break;o=t[f[u]];}if(o>s&&(b&x)!=v){for(0==h&&(h=s),p+=1<<d,d=o-h,w=1<<d;d+h<c&&(w-=Z[d+h],!(w<=0));)d++,w<<=1;if(k+=1<<d,1==e&&(N.Pt?k>=ue:k>ue)||2==e&&(N.Pt?k>=N.Ut:k>N.Ut))return 1;v=b&x,r.Xt[_.Xt+v]={_t:d,ft:s,lt:p-_.Xt};}}if(0!=b)for(y=Z_(o-h);0!=b;){for(0!=h&&(b&x)!=v&&(h=0,o=s,p=_.Xt,d=s,y.ft=o),r.Xt[p+(b>>h)]={...y},g=1<<o-1;b&g;)g>>=1;0!=g?(b&=g-1,b+=g):b=0;}return _.Xt+=k,i.Xt=s,0}function Hn(e,t,n,r,i,f,_,l,o){let u;if(o?e[t]<l:e[t]+1<l)u=pe(0,n-r,e[t]);else if(o?e[t]>l:e[t]>=l)if(o&&1==i){let i=e[t]-257;u=pe(_[i],n-r,f[i]);}else {let i=o?e[t]:e[t]-l;u=pe(_[i],n-r,f[i]);}else u=qt(n-r);return u}var Pn={Ct:true,Ht:new y(544),Ot:[],Tt:[]},Mn={Ct:true,Ht:new y(544),Ot:[],Tt:[]};function jt(e){let t=Ve();return t.l=F_(t,!!e),t}function Ge(e){let t;return !(e&&(t=e.l,!(!t||t.o!=e||t.Vt&&(t.ot<16191||t.ot>16209)||!t.Vt&&(t.ot<16180||t.ot>16211))))}function Xn(e){let t;return Ge(e)?-2:(t=e.l,e.total_in=e.total_out=t.wt=0,e.msg="",t.O&&(e.i=1&t.O),t.ot=t.Vt?16191:16180,t.ut=false,t.ct=false,t.st=-1,t.dt=t.Vt?65536:32768,delete t.T,t.p=0,t.M=0,t.et=t.Et,t.tt=t.Et,t.zt=t.Et,t.it=true,t.qt=-1,0)}function Yn(e){let t;return Ge(e)?-2:(t=e.l,t.h=0,t.m=0,t.v=0,Xn(e))}function Wn(e,t){let n,r,i;if(Ge(e))return -2;if(r=e.l,r.Vt?(t=-16,i=16):i=15,t<0){if(t<-i)return -2;n=0,t=-t;}else n=5+(t>>4),!r.Vt&&t<48&&(t&=15);return t&&(t<8||t>i)?-2:(r.u.length>0&&r.k!=t&&(r.u=Z),r.O=n,r.k=t,Yn(e))}function Vt(e,t){let n,r;if(!e)return -2;e.msg="";let i=!!e.l.Vt;return r=F_(e,i),i&&(t=-16),e.l=r,r.o=e,r.ot=r.Vt?16191:16180,n=Wn(e,t),n}function Gn(e){let t=e.Vt?Mn:Pn,n={Xt:0};if(t.Ct){let r,i,f;for(r=0;r<144;)e.Mt[r++]=8;for(;r<256;)e.Mt[r++]=9;for(;r<280;)e.Mt[r++]=7;for(;r<288;)e.Mt[r++]=8;for(let e=0;e<544;e++)t.Ht[e]=pe();f=t.Ht,t.Ot=f,i=9;let _={Xt:f},l={Xt:i},o={Xt:0};for(Oe(1,e.Mt,288,_,l,e.Lt,o,e.Vt),f=_.Xt,i=l.Xt,e.Zt=o.Xt,r=0;r<32;)e.Mt[r++]=5;i=5;let u=o.Xt,a={Xt:f},c={Xt:i};n.Xt=u,Oe(2,e.Mt,32,a,c,e.Lt,n,e.Vt),t.Tt=f.slice(u),t.Ct=false;}e.et=t.Ot,e.nt=9,e.tt=t.Tt,e.rt=5,e.Zt=n.Xt;}function Kn(e,t,n){let r=e.l;if(!(r.u&&0!=r.u.length||(r.u=new x(1<<r.k),r.u)))return 1;if(0==r.h&&(r.h=1<<r.k,r.v=0,r.m=0),n>=r.h)M(r.u,0,t,t.length-r.h,r.h),r.v=0,r.m=r.h;else {let e=r.h-r.v;e>n&&(e=n),M(r.u,r.v,t,t.length-n,e),(n-=e)?(M(r.u,0,t,t.length-n,n),r.v=n,r.m=r.h):(r.v+=e,r.v==r.h&&(r.v=0),r.m<r.h&&(r.m+=e));}return 0}var s_=class extends z{constructor(){super("Need more input");}};function Jt(e,t){let n,r,i,f,_,l,o,u,a,c,s,d,h,w,k,b,g,m=new x(4);if(Ge(e)||!e.next_out||!e.next_in&&0!=e.avail_in)return -2;l=0,u=0,o=0,a=0,r=Z,i=0,f=Z,_=0,n=e.l,16191==n.ot&&(n.ot=16192),L(),c=l,s=o,g=0;try{for(;;)switch(n.ot){case 16180:if(0==n.O){n.ot=16192;break}if(V(16),2&n.O&&35615==u){0==n.k&&(n.k=15),n.ht=W(0),n.ht=p(n.ht,u),q(),n.ot=16181;break}if(n.T&&(n.T.Yt=-1),!(1&n.O)||((S(8)<<8)+(u>>8))%31){e.msg="incorrect header check",n.ot=16209;break}if(8!=S(4)){e.msg="unknown compression method",n.ot=16209;break}if($(4),b=S(4)+8,0==n.k&&(n.k=b),b>15||b>n.k){e.msg="invalid window size",n.ot=16209;break}n.dt=1<<b,n.st=0,e.i=n.ht=se(0),n.ot=512&u?16189:16191,q();break;case 16181:if(V(16),n.st=u,8!=(255&n.st)){e.msg="unknown compression method",n.ot=16209;break}if(57344&n.st){e.msg="unknown header flags set",n.ot=16209;break}n.T&&(n.T.Ye=u>>8&1),512&n.st&&4&n.O&&(n.ht=p(n.ht,u)),q(),n.ot=16182;case 16182:V(32),n.T&&(n.T.Ge=u),512&n.st&&4&n.O&&(n.ht=z(n.ht,u)),q(),n.ot=16183;case 16183:V(16),n.T&&(n.T.Bt=255&u,n.T.Je=u>>8),512&n.st&&4&n.O&&(n.ht=p(n.ht,u)),q(),n.ot=16184;case 16184:1024&n.st?(V(16),n.kt=u,n.T&&(n.T.Ke=u),512&n.st&&4&n.O&&(n.ht=p(n.ht,u)),q()):n.T&&(n.T.Be=Z),n.ot=16185;case 16185:if(1024&n.st&&(d=n.kt,d>l&&(d=l),d&&(n.T&&n.T.Be&&n.T.Ft&&(b=n.T.Ke-n.kt)<n.T.Ft&&M(n.T.Be,b,r,i,d),512&n.st&&4&n.O&&(n.ht=W(n.ht,r.subarray(i,i+d),d)),l-=d,i+=d,n.kt-=d),n.kt))return v();n.kt=0,n.ot=16186;case 16186:if(2048&n.st){if(0==l)return v();d=0;do{b=r[i+d++],n.T&&n.T.jt&&n.kt<n.T.jt&&(n.T.Fe[n.kt++]=b);}while(b&&d<l);if(512&n.st&&4&n.O&&(n.ht=W(n.ht,r.subarray(i,i+d),d)),l-=d,i+=d,b)return v()}else n.T&&(n.T.Fe=Z);n.kt=0,n.ot=16187;case 16187:if(4096&n.st){if(0==l)return v();d=0;do{b=r[i+d++],n.T&&n.T.Gt&&n.kt<n.T.Gt&&(n.T.je[n.kt++]=b);}while(b&&d<l);if(512&n.st&&4&n.O&&(n.ht=W(n.ht,r.subarray(i,i+d),d)),l-=d,i+=d,b)return v()}else n.T&&(n.T.je=Z);n.ot=16188;case 16188:if(512&n.st){if(V(16),4&n.O&&u!=(65535&n.ht)){e.msg="header crc mismatch",n.ot=16209;break}q();}n.T&&(n.T.Te=n.st>>9&1,n.T.Yt=1),e.i=n.ht=W(0),n.ot=16191;break;case 16189:V(32),e.i=n.ht=P_(u),q(),n.ot=16190;case 16190:if(!n.ct)return E(),2;e.i=n.ht=se(0),n.ot=16191;case 16191:if(5==t||6==t)return v();case 16192:if(n.ut){I(),n.ot=16206;break}switch(V(3),n.ut=!!S(1),$(1),S(2)){case 0:n.ot=16193;break;case 1:if(Gn(n),n.ot=16199,6==t)return $(2),v();break;case 2:n.ot=16196;break;case 3:e.msg="invalid block type",n.ot=16209;}$(2);break;case 16193:if(I(),V(32),(65535&u)!=(u>>>16^65535)){e.msg="invalid stored block lengths",n.ot=16209;break}if(n.kt=65535&u,q(),n.ot=16194,6==t)return v();case 16194:n.ot=16195;case 16195:if(d=n.kt,d){if(d>l&&(d=l),d>o&&(d=o),0==d)return v();M(f,_,r,i,d),l-=d,i+=d,o-=d,_+=d,n.kt-=d;break}n.ot=16191;break;case 16196:if(V(14),n.vt=S(5)+257,$(5),n.xt=S(5)+1,$(5),n.gt=S(4)+4,$(4),n.vt>286||!n.Vt&&n.xt>30){e.msg=n.Vt?"too many length":"too many length or distance symbols",n.ot=16209;break}n.yt=0,n.ot=16197;case 16197:for(;n.yt<n.gt;)V(3),n.Mt[Se[n.yt++]]=S(3),$(3);for(;n.yt<19;)n.Mt[Se[n.yt++]]=0;n.zt=n.Et,n.et=n.tt=n.zt,n.nt=7;let c={Xt:n.zt},m={Xt:n.nt},x={Xt:0};if(g=Oe(0,n.Mt,19,c,m,n.Lt,x,n.Vt),n.zt=c.Xt,n.nt=m.Xt,g){e.msg="invalid code lengths set",n.ot=16209;break}n.yt=0,n.ot=16198;case 16198:for(;n.yt<n.vt+n.xt;){for(;w=n.et[S(n.nt)],!(w.ft<=a);)N();if(w.lt<16)$(w.ft),n.Mt[n.yt++]=w.lt;else {if(16==w.lt){if(V(w.ft+2),$(w.ft),0==n.yt){e.msg="invalid bit length repeat",n.ot=16209;break}b=n.Mt[n.yt-1],d=3+S(2),$(2);}else 17==w.lt?(V(w.ft+3),$(w.ft),b=0,d=3+S(3),$(3)):(V(w.ft+7),$(w.ft),b=0,d=11+S(7),$(7));if(n.yt+d>n.vt+n.xt){e.msg="invalid bit length repeat",n.ot=16209;break}for(;d--;)n.Mt[n.yt++]=b;}}if(16209==n.ot)break;if(0==n.Mt[256]){e.msg="invalid code -- missing end-of-block",n.ot=16209;break}n.zt=n.Et,n.nt=9;let D={Xt:n.zt},A={Xt:n.nt},Q={Xt:0};g=Oe(1,n.Mt,n.vt,D,A,n.Lt,Q,n.Vt),n.zt=D.Xt,n.nt=A.Xt;let U=Q.Xt;if(n.et=n.zt.slice(0,U),g){e.msg="invalid literal/lengths set",n.ot=16209;break}n.rt=6;let P=n.Mt.subarray(n.vt,n.vt+n.xt),R={Xt:n.zt},X={Xt:n.rt},C={Xt:U};if(g=Oe(2,P,n.xt,R,X,n.Lt,C,n.Vt),n.zt=R.Xt,n.rt=X.Xt,n.tt=n.zt.slice(U),g){e.msg="invalid distances set",n.ot=16209;break}if(n.ot=16199,6==t)return v();case 16199:n.ot=16200;case 16200:if(!n.Vt&&l>=6&&o>=258){E(),Kt(e,s),L(),16191==n.ot&&(n.qt=-1);break}for(n.qt=0;w=n.et[S(n.nt)],!(w.ft<=a);)N();if(w._t&&!(240&w._t)){for(k=w;w=n.et[k.lt+(S(k.ft+k._t)>>k.ft)],!(k.ft+w.ft<=a);)N();$(k.ft),n.qt+=k.ft;}if($(w.ft),n.qt+=w.ft,n.kt=w.lt,0==w._t){n.ot=16205;break}if(32&w._t){n.qt=-1,n.ot=16191;break}if(64&w._t){e.msg="invalid literal/length code",n.ot=16209;break}n.Be=w._t&(n.Vt?31:15),n.ot=16201;case 16201:n.Be&&(V(n.Be),n.kt+=S(n.Be),$(n.Be),n.qt+=n.Be),n.Nt=n.kt,n.ot=16202;case 16202:for(;w=n.tt[S(n.rt)],!(w.ft<=a);)N();if(!(240&w._t)){for(k=w;w=n.tt[k.lt+(S(k.ft+k._t)>>k.ft)],!(k.ft+w.ft<=a);)N();$(k.ft),n.qt+=k.ft;}if($(w.ft),n.qt+=w.ft,64&w._t){e.msg="invalid distance code",n.ot=16209;break}n.bt=w.lt,n.Be=15&w._t,n.ot=16203;case 16203:n.Be&&(V(n.Be),n.bt+=S(n.Be),$(n.Be),n.qt+=n.Be),n.ot=16204;case 16204:if(0==o)return v();if(d=s-o,n.bt>d){if(d=n.bt-d,d>n.m&&n.it){e.msg="invalid distance too far back",n.ot=16209;break}d>n.v?(d-=n.v,h=n.h-d):h=n.v-d,d>n.kt&&(d=n.kt),d>o&&(d=o);for(let e=0;e<d;++e)f[_]=255&n.u[h],++_,++h;}else {h=_-n.bt,d=n.kt,d>o&&(d=o);for(let e=0;e<d;++e)f[_]=f[h],++_,++h;}d>o&&(d=o),o-=d,n.kt-=d,0==n.kt&&(n.ot=16200);break;case 16205:if(0==o)return v();f[_++]=n.kt,o--,n.ot=16200;break;case 16206:if(n.O){if(V(32),s-=o,e.total_out+=s,n.wt+=s,4&n.O&&s){let t=f.subarray(_-s,_);e.i=n.ht=y(n.ht,t,s);}if(s=o,4&n.O&&(n.st?u:P_(u)>>>0)!=n.ht){e.msg="incorrect data check",n.ot=16209;break}q();}n.ot=16207;case 16207:if(n.O&&n.st){if(V(32),4&n.O&&u!=(4294967295&n.wt)){e.msg="incorrect length check",n.ot=16209;break}q();}n.ot=16208;case 16208:return g=1,v();case 16209:return g=-3,v();case 16210:return -4;default:return -2}}catch(e){if(e instanceof s_)return v();throw e}function v(){if(E(),n.h||s!=e.avail_out&&n.ot<16209&&(n.Vt?n.ot<16208:n.ot<16206)||4!=t){let t=s-e.avail_out;if(Kn(e,e.next_out.subarray(e.next_out_index-t,e.next_out_index),t))return n.ot=16210,-4}return c-=e.avail_in,s-=e.avail_out,e.total_in+=c,e.total_out+=s,n.wt+=s,4&n.O&&s&&(e.i=n.ht=y(n.ht,e.next_out.subarray(e.next_out_index-s,e.next_out_index),s)),e.t=n.M+(n.ut?64:0)+(16191==n.ot?128:0)+(16199==n.ot||16194==n.ot?256:0),(0==c&&0==s&&0==g||4==t&&0==g)&&(g=-5),g}function y(e,t,r){return n.st?W(e,t,r):se(e,t,r)}function p(e,t){return m[0]=255&t,m[1]=t>>>8&255,W(e,m,2)>>>0}function z(e,t){return m[0]=255&t,m[1]=t>>>8&255,m[2]=t>>>16&255,m[3]=t>>>24&255,W(e,m,4)>>>0}function L(){f=e.next_out,_=e.next_out_index,o=e.avail_out,r=e.next_in,i=e.next_in_index,l=e.avail_in,u=n.p,a=n.M;}function E(){e.next_out=f,e.next_out_index=_,e.avail_out=o,e.next_in=r,e.next_in_index=i,e.avail_in=l,n.p=u,n.M=a;}function q(){u=0,a=0;}function N(){if(0==l)throw new s_;l--,u+=(255&r[i])<<a,i++,u>>>=0,a+=8;}function V(e){for(;a<e;)N();}function S(e){return u&(1<<e)-1}function $(e){u>>>=e,a-=e;}function I(){u>>>=7&a,a-=7&a;}}function Qt(e){return Ge(e)?-2:0}var M_=65536,qn=32768,X_=class{constructor(e=16,t=M_){this.Jt=[],this.Kt=e;for(let n=0;n<N.min(e,4);n++)this.Jt.push(new x(t));}acquire(e=M_){for(let t=this.Jt.length-1;t>=0;t--){let n=this.Jt[t];if(n.length>=e)return this.Jt.splice(t,1),n}return new x(e)}release(e){this.Jt.length<this.Kt&&this.Jt.push(e);}};function $t(e){let t=new X_(32,M_),n=null;function r(e){try{t.release(e);}catch{}}return new U({start(){},transform(i,f){if(!n){let t=e.en(),r=e.tn(t);if(0!=r&&0!=r)throw new z("init failed: "+r);n={o:t};}let _=n.o,l=0;for(;l<i.length;){let n=N.min(i.length-l,qn),o=i.subarray(l,l+n);for(_.next_in=o,_.next_in_index=0,_.avail_in=o.length;_.avail_in>0;){let n=t.acquire(),i=false;try{_.next_out=n,_.next_out_index=0,_.avail_out=n.length;let r=e.nn(_,0),l=n.length-_.avail_out;if(l>0){let e=!1,r={rn:n.subarray(0,l),release:()=>{e||(e=!0,t.release(n));}};i=!0,f.enqueue(r);}if(0!=r&&1!=r)throw new z("process error: "+r)}finally{i||r(n);}}l+=n;}},flush(i){if(!n)return;let f=n.o;for(;;){let n=t.acquire(),_=false;try{f.next_out=n,f.next_out_index=0,f.avail_out=n.length;let r=e.nn(f,4),l=n.length-f.avail_out;if(l>0){let e=!1,r={rn:n.subarray(0,l),release:()=>{e||(e=!0,t.release(n));}};_=!0,i.enqueue(r);}if(1==r)break;if(0!=r)throw new z("finalization error: "+r)}finally{_||r(n);}}let _=e.fn(f);if(0!=_&&0!=_)throw new z("end failed: "+_)}})}function en(){return new U({start(){},transform(e,t){try{t.enqueue(e.rn.slice(0));}finally{e.release();}},flush(){}})}function jn(e="deflate",t){let n="gzip"==e?31:"deflate-raw"==e?-15:15,r=t&&"number"==typeof t.level?t.level:-1;return $t({en:()=>wt(),tn:e=>Dt(e,r,8,n,8,0),nn:yt,fn:B_})}function Vn(e="deflate"){let t="gzip"==e?31:"deflate-raw"==e?-15:15;return $t({en:()=>jt("deflate64-raw"==e),tn:e=>Vt(e,t),nn:Jt,fn:Qt})}var h_=class{constructor(e="deflate",t){let n=jn(e,t);this.writable=n.writable,this.readable=n.readable.pipeThrough(en());}},x_=class{constructor(e="deflate"){let t=Vn(e);this.writable=t.writable,this.readable=t.readable.pipeThrough(en());}};
|
|
5976
6512
|
|
|
5977
6513
|
/*
|
|
5978
6514
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -6006,7 +6542,7 @@ var{Uint8Array:x,Uint16Array:E,Int32Array:H,TransformStream:U,Math:N,Error:z,Arr
|
|
|
6006
6542
|
configure({
|
|
6007
6543
|
workerURI: "./core/web-worker-native.js",
|
|
6008
6544
|
wasmURI: null,
|
|
6009
|
-
CompressionStreamZlib:
|
|
6545
|
+
CompressionStreamZlib: h_,
|
|
6010
6546
|
DecompressionStreamZlib: x_
|
|
6011
6547
|
});
|
|
6012
6548
|
|
|
@@ -6039,12 +6575,15 @@ configure({
|
|
|
6039
6575
|
*/
|
|
6040
6576
|
|
|
6041
6577
|
|
|
6578
|
+
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
6579
|
+
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
6580
|
+
|
|
6042
6581
|
class ZipEntry {
|
|
6043
6582
|
|
|
6044
6583
|
constructor(fs, name, params, parent) {
|
|
6045
6584
|
const zipEntry = this;
|
|
6046
6585
|
if (fs.root && parent && parent.getChildByName(name)) {
|
|
6047
|
-
throw new Error(
|
|
6586
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
6048
6587
|
}
|
|
6049
6588
|
if (!params) {
|
|
6050
6589
|
params = {};
|
|
@@ -6054,13 +6593,17 @@ class ZipEntry {
|
|
|
6054
6593
|
name,
|
|
6055
6594
|
data: params.data,
|
|
6056
6595
|
options: params.options,
|
|
6057
|
-
id: fs.
|
|
6596
|
+
id: fs.entryIdCounter++,
|
|
6058
6597
|
parent,
|
|
6059
6598
|
children: [],
|
|
6060
6599
|
uncompressedSize: params.uncompressedSize || 0,
|
|
6061
6600
|
passThrough: params.passThrough
|
|
6062
6601
|
});
|
|
6063
|
-
|
|
6602
|
+
// detached entries (e.g. clones) are not registered until they are attached,
|
|
6603
|
+
// otherwise they could never be garbage collected
|
|
6604
|
+
if (parent || !fs.root) {
|
|
6605
|
+
fs.entries[zipEntry.id] = zipEntry;
|
|
6606
|
+
}
|
|
6064
6607
|
if (parent) {
|
|
6065
6608
|
zipEntry.parent.children.push(zipEntry);
|
|
6066
6609
|
}
|
|
@@ -6098,7 +6641,7 @@ class ZipEntry {
|
|
|
6098
6641
|
rename(name) {
|
|
6099
6642
|
const parent = this.parent;
|
|
6100
6643
|
if (parent && parent.getChildByName(name)) {
|
|
6101
|
-
throw new Error(
|
|
6644
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
6102
6645
|
} else {
|
|
6103
6646
|
this.name = name;
|
|
6104
6647
|
}
|
|
@@ -6137,16 +6680,17 @@ class ZipFileEntry extends ZipEntry {
|
|
|
6137
6680
|
}
|
|
6138
6681
|
|
|
6139
6682
|
isPasswordProtected() {
|
|
6140
|
-
return this.data.encrypted;
|
|
6683
|
+
return Boolean(this.data && this.data.encrypted);
|
|
6141
6684
|
}
|
|
6142
6685
|
|
|
6143
6686
|
async checkPassword(password, options = {}) {
|
|
6144
6687
|
const zipEntry = this;
|
|
6145
6688
|
if (zipEntry.isPasswordProtected()) {
|
|
6146
|
-
options.password = password;
|
|
6147
|
-
options.checkPasswordOnly = true;
|
|
6148
6689
|
try {
|
|
6149
|
-
await zipEntry.data.getData(null, options
|
|
6690
|
+
await zipEntry.data.getData(null, Object.assign({}, options, {
|
|
6691
|
+
password,
|
|
6692
|
+
checkPasswordOnly: true
|
|
6693
|
+
}));
|
|
6150
6694
|
return true;
|
|
6151
6695
|
} catch (error) {
|
|
6152
6696
|
if (error.message == ERR_INVALID_PASSWORD) {
|
|
@@ -6180,8 +6724,15 @@ class ZipFileEntry extends ZipEntry {
|
|
|
6180
6724
|
return this.getData({ writable }, options);
|
|
6181
6725
|
}
|
|
6182
6726
|
|
|
6183
|
-
getArrayBuffer(options) {
|
|
6184
|
-
|
|
6727
|
+
async getArrayBuffer(options) {
|
|
6728
|
+
// this.data may be a string, a Uint8Array, a data URI or a Blob depending on how the entry
|
|
6729
|
+
// was created, so retrieve the bytes through getUint8Array rather than assuming a Blob; this
|
|
6730
|
+
// also applies the options (password, signal, onprogress...) like the other getData() getters
|
|
6731
|
+
const array = await this.getUint8Array(options);
|
|
6732
|
+
// return the backing buffer directly when the array spans it, slicing the exact bytes otherwise
|
|
6733
|
+
return array.byteOffset || array.byteLength != array.buffer.byteLength
|
|
6734
|
+
? array.buffer.slice(array.byteOffset, array.byteOffset + array.byteLength)
|
|
6735
|
+
: array.buffer;
|
|
6185
6736
|
}
|
|
6186
6737
|
|
|
6187
6738
|
replaceBlob(blob) {
|
|
@@ -6223,7 +6774,7 @@ class ZipFileEntry extends ZipEntry {
|
|
|
6223
6774
|
replaceReadable(readable) {
|
|
6224
6775
|
Object.assign(this, {
|
|
6225
6776
|
data: null,
|
|
6226
|
-
Reader:
|
|
6777
|
+
Reader: getReadableReader(readable),
|
|
6227
6778
|
Writer: null,
|
|
6228
6779
|
reader: null
|
|
6229
6780
|
});
|
|
@@ -6239,7 +6790,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
6239
6790
|
|
|
6240
6791
|
clone(deepClone) {
|
|
6241
6792
|
const zipEntry = this;
|
|
6242
|
-
const clonedEntry = new ZipDirectoryEntry(zipEntry.fs, zipEntry.name);
|
|
6793
|
+
const clonedEntry = new ZipDirectoryEntry(zipEntry.fs, zipEntry.name, zipEntry);
|
|
6243
6794
|
if (deepClone) {
|
|
6244
6795
|
clonedEntry.children = zipEntry.children.map(child => {
|
|
6245
6796
|
const childClone = child.clone(deepClone);
|
|
@@ -6313,7 +6864,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
6313
6864
|
|
|
6314
6865
|
addReadable(name, readable, options = {}) {
|
|
6315
6866
|
return addChild(this, name, {
|
|
6316
|
-
Reader:
|
|
6867
|
+
Reader: getReadableReader(readable),
|
|
6317
6868
|
options
|
|
6318
6869
|
});
|
|
6319
6870
|
}
|
|
@@ -6327,6 +6878,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
6327
6878
|
}
|
|
6328
6879
|
|
|
6329
6880
|
addFile(file, options = {}) {
|
|
6881
|
+
options = Object.assign({}, options);
|
|
6330
6882
|
if (!options.lastModDate) {
|
|
6331
6883
|
options.lastModDate = new Date(file.lastModified);
|
|
6332
6884
|
}
|
|
@@ -6393,11 +6945,15 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
6393
6945
|
try {
|
|
6394
6946
|
const path = entry.filename.split("/");
|
|
6395
6947
|
const name = path.pop();
|
|
6396
|
-
path.forEach(
|
|
6948
|
+
path.forEach(pathPart => {
|
|
6397
6949
|
const previousParent = parent;
|
|
6398
6950
|
parent = parent.getChildByName(pathPart);
|
|
6399
|
-
if (
|
|
6400
|
-
|
|
6951
|
+
if (parent) {
|
|
6952
|
+
if (!parent.directory) {
|
|
6953
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
6954
|
+
}
|
|
6955
|
+
} else {
|
|
6956
|
+
parent = new ZipDirectoryEntry(this.fs, pathPart, { data: null }, previousParent);
|
|
6401
6957
|
importedEntries.push(parent);
|
|
6402
6958
|
}
|
|
6403
6959
|
});
|
|
@@ -6408,6 +6964,22 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
6408
6964
|
uncompressedSize: entry.uncompressedSize,
|
|
6409
6965
|
passThrough: options.passThrough
|
|
6410
6966
|
}));
|
|
6967
|
+
} else {
|
|
6968
|
+
let directoryEntry = parent;
|
|
6969
|
+
if (name) {
|
|
6970
|
+
directoryEntry = parent.getChildByName(name);
|
|
6971
|
+
if (directoryEntry) {
|
|
6972
|
+
if (!directoryEntry.directory) {
|
|
6973
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
6974
|
+
}
|
|
6975
|
+
} else {
|
|
6976
|
+
directoryEntry = new ZipDirectoryEntry(this.fs, name, { data: null }, parent);
|
|
6977
|
+
importedEntries.push(directoryEntry);
|
|
6978
|
+
}
|
|
6979
|
+
}
|
|
6980
|
+
if (directoryEntry != this && !directoryEntry.data) {
|
|
6981
|
+
directoryEntry.data = entry;
|
|
6982
|
+
}
|
|
6411
6983
|
}
|
|
6412
6984
|
} catch (error) {
|
|
6413
6985
|
try {
|
|
@@ -6423,14 +6995,15 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
6423
6995
|
return importedEntries;
|
|
6424
6996
|
}
|
|
6425
6997
|
|
|
6426
|
-
async exportZip(writer, options) {
|
|
6998
|
+
async exportZip(writer, options = {}) {
|
|
6427
6999
|
const zipEntry = this;
|
|
7000
|
+
options = Object.assign({}, options);
|
|
6428
7001
|
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
6429
7002
|
options.bufferedWrite = true;
|
|
6430
7003
|
}
|
|
6431
|
-
await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
|
|
7004
|
+
const [readers] = await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
|
|
6432
7005
|
const zipWriter = new ZipWriter(writer, options);
|
|
6433
|
-
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], "uncompressedSize"), options);
|
|
7006
|
+
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], "uncompressedSize"), options, readers);
|
|
6434
7007
|
await zipWriter.close();
|
|
6435
7008
|
return writer.getData ? writer.getData() : writer.writable;
|
|
6436
7009
|
}
|
|
@@ -6476,7 +7049,15 @@ class FS {
|
|
|
6476
7049
|
|
|
6477
7050
|
remove(entry) {
|
|
6478
7051
|
detach(entry);
|
|
6479
|
-
|
|
7052
|
+
const removedEntries = [entry];
|
|
7053
|
+
while (removedEntries.length) {
|
|
7054
|
+
const removedEntry = removedEntries.pop();
|
|
7055
|
+
this.entries[removedEntry.id] = null;
|
|
7056
|
+
for (const child of removedEntry.children) {
|
|
7057
|
+
removedEntries.push(child);
|
|
7058
|
+
}
|
|
7059
|
+
}
|
|
7060
|
+
entry.parent = UNDEFINED_VALUE;
|
|
6480
7061
|
}
|
|
6481
7062
|
|
|
6482
7063
|
move(entry, destination) {
|
|
@@ -6486,12 +7067,17 @@ class FS {
|
|
|
6486
7067
|
if (destination.directory) {
|
|
6487
7068
|
if (!destination.isDescendantOf(entry)) {
|
|
6488
7069
|
if (entry != destination) {
|
|
6489
|
-
|
|
6490
|
-
|
|
7070
|
+
const existingChild = destination.getChildByName(entry.name);
|
|
7071
|
+
if (existingChild) {
|
|
7072
|
+
if (existingChild != entry) {
|
|
7073
|
+
throw new Error(ERR_ENTRY_EXISTS);
|
|
7074
|
+
}
|
|
7075
|
+
} else {
|
|
7076
|
+
detach(entry);
|
|
7077
|
+
entry.parent = destination;
|
|
7078
|
+
destination.children.push(entry);
|
|
7079
|
+
registerEntries(this, entry);
|
|
6491
7080
|
}
|
|
6492
|
-
detach(entry);
|
|
6493
|
-
entry.parent = destination;
|
|
6494
|
-
destination.children.push(entry);
|
|
6495
7081
|
}
|
|
6496
7082
|
} else {
|
|
6497
7083
|
throw new Error("Entry is a ancestor of target entry");
|
|
@@ -6508,6 +7094,11 @@ class FS {
|
|
|
6508
7094
|
for (let index = 0; node && index < path.length; index++) {
|
|
6509
7095
|
node = node.getChildByName(path[index]);
|
|
6510
7096
|
}
|
|
7097
|
+
if (!node) {
|
|
7098
|
+
// exclude detached entries, e.g. clones registered in `entries` but not attached
|
|
7099
|
+
node = this.entries.find(entry => entry && (entry == this.root || entry.isDescendantOf(this.root)) &&
|
|
7100
|
+
entry.getRelativeName() == fullname);
|
|
7101
|
+
}
|
|
6511
7102
|
return node;
|
|
6512
7103
|
}
|
|
6513
7104
|
|
|
@@ -6589,6 +7180,7 @@ class FS {
|
|
|
6589
7180
|
}
|
|
6590
7181
|
|
|
6591
7182
|
importZip(reader, options) {
|
|
7183
|
+
resetFS(this);
|
|
6592
7184
|
return this.root.importZip(reader, options);
|
|
6593
7185
|
}
|
|
6594
7186
|
|
|
@@ -6608,6 +7200,10 @@ class FS {
|
|
|
6608
7200
|
return this.root.exportWritable(writable, options);
|
|
6609
7201
|
}
|
|
6610
7202
|
|
|
7203
|
+
exportZip(writer, options) {
|
|
7204
|
+
return this.root.exportZip(writer, options);
|
|
7205
|
+
}
|
|
7206
|
+
|
|
6611
7207
|
isPasswordProtected() {
|
|
6612
7208
|
return this.root.isPasswordProtected();
|
|
6613
7209
|
}
|
|
@@ -6621,15 +7217,26 @@ const fs = { FS, ZipDirectoryEntry, ZipFileEntry };
|
|
|
6621
7217
|
|
|
6622
7218
|
function getTotalSize(entries, propertyName) {
|
|
6623
7219
|
let size = 0;
|
|
6624
|
-
|
|
7220
|
+
const pendingEntries = Array.from(entries);
|
|
7221
|
+
while (pendingEntries.length) {
|
|
7222
|
+
const entry = pendingEntries.pop();
|
|
7223
|
+
size += entry[propertyName] || 0;
|
|
7224
|
+
for (const child of entry.children) {
|
|
7225
|
+
pendingEntries.push(child);
|
|
7226
|
+
}
|
|
7227
|
+
}
|
|
6625
7228
|
return size;
|
|
7229
|
+
}
|
|
6626
7230
|
|
|
6627
|
-
|
|
6628
|
-
|
|
6629
|
-
|
|
6630
|
-
|
|
7231
|
+
function getReadableReader(readable) {
|
|
7232
|
+
let consumed;
|
|
7233
|
+
return function () {
|
|
7234
|
+
if (consumed) {
|
|
7235
|
+
throw new Error(ERR_READABLE_CONSUMED);
|
|
6631
7236
|
}
|
|
6632
|
-
|
|
7237
|
+
consumed = true;
|
|
7238
|
+
return { readable };
|
|
7239
|
+
};
|
|
6633
7240
|
}
|
|
6634
7241
|
|
|
6635
7242
|
function getZipBlobReader(options) {
|
|
@@ -6644,7 +7251,7 @@ function getZipBlobReader(options) {
|
|
|
6644
7251
|
async init() {
|
|
6645
7252
|
const zipBlobReader = this;
|
|
6646
7253
|
zipBlobReader.size = zipBlobReader.entry.uncompressedSize;
|
|
6647
|
-
const data = await zipBlobReader.entry.getData(new BlobWriter(), Object.assign({},
|
|
7254
|
+
const data = await zipBlobReader.entry.getData(new BlobWriter(), Object.assign({}, options, zipBlobReader.options));
|
|
6648
7255
|
zipBlobReader.data = data;
|
|
6649
7256
|
zipBlobReader.blobReader = new BlobReader(data);
|
|
6650
7257
|
super.init();
|
|
@@ -6657,29 +7264,41 @@ function getZipBlobReader(options) {
|
|
|
6657
7264
|
}
|
|
6658
7265
|
|
|
6659
7266
|
async function initReaders(entry, options) {
|
|
6660
|
-
|
|
6661
|
-
|
|
7267
|
+
const fileEntries = [];
|
|
7268
|
+
const pendingEntries = [entry];
|
|
7269
|
+
// per-export map so concurrent exports do not share (and lock) the same readers
|
|
7270
|
+
const readers = new Map();
|
|
7271
|
+
while (pendingEntries.length) {
|
|
7272
|
+
const pendingEntry = pendingEntries.pop();
|
|
7273
|
+
for (const child of pendingEntry.children) {
|
|
6662
7274
|
if (child.directory) {
|
|
6663
|
-
|
|
7275
|
+
pendingEntries.push(child);
|
|
6664
7276
|
} else {
|
|
6665
|
-
|
|
6666
|
-
try {
|
|
6667
|
-
await initStream(reader);
|
|
6668
|
-
} catch (error) {
|
|
6669
|
-
try {
|
|
6670
|
-
error.entryId = child.id;
|
|
6671
|
-
error.cause = {
|
|
6672
|
-
entry: child
|
|
6673
|
-
};
|
|
6674
|
-
} catch {
|
|
6675
|
-
// ignored
|
|
6676
|
-
}
|
|
6677
|
-
throw error;
|
|
6678
|
-
}
|
|
6679
|
-
child.uncompressedSize = reader.size;
|
|
7277
|
+
fileEntries.push(child);
|
|
6680
7278
|
}
|
|
6681
|
-
}
|
|
7279
|
+
}
|
|
6682
7280
|
}
|
|
7281
|
+
await Promise.all(fileEntries.map(async child => {
|
|
7282
|
+
const reader = child.reader = new child.Reader(child.data, options);
|
|
7283
|
+
readers.set(child, reader);
|
|
7284
|
+
try {
|
|
7285
|
+
await initStream(reader);
|
|
7286
|
+
} catch (error) {
|
|
7287
|
+
try {
|
|
7288
|
+
error.entryId = child.id;
|
|
7289
|
+
error.cause = {
|
|
7290
|
+
entry: child
|
|
7291
|
+
};
|
|
7292
|
+
} catch {
|
|
7293
|
+
// ignored
|
|
7294
|
+
}
|
|
7295
|
+
throw error;
|
|
7296
|
+
}
|
|
7297
|
+
if (reader.size !== UNDEFINED_VALUE) {
|
|
7298
|
+
child.uncompressedSize = reader.size;
|
|
7299
|
+
}
|
|
7300
|
+
}));
|
|
7301
|
+
return readers;
|
|
6683
7302
|
}
|
|
6684
7303
|
|
|
6685
7304
|
function detach(entry) {
|
|
@@ -6693,7 +7312,7 @@ function detach(entry) {
|
|
|
6693
7312
|
}
|
|
6694
7313
|
}
|
|
6695
7314
|
|
|
6696
|
-
async function exportZip(zipWriter, entry, totalSize, options) {
|
|
7315
|
+
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
6697
7316
|
const selectedEntry = entry;
|
|
6698
7317
|
const entryOffsets = new Map();
|
|
6699
7318
|
await process(zipWriter, entry);
|
|
@@ -6703,7 +7322,11 @@ async function exportZip(zipWriter, entry, totalSize, options) {
|
|
|
6703
7322
|
|
|
6704
7323
|
async function exportChild() {
|
|
6705
7324
|
if (options.bufferedWrite) {
|
|
6706
|
-
await Promise.allSettled(entry.children.map(processChild));
|
|
7325
|
+
const results = await Promise.allSettled(entry.children.map(processChild));
|
|
7326
|
+
const errorResult = results.find(result => result.status == "rejected");
|
|
7327
|
+
if (errorResult) {
|
|
7328
|
+
throw errorResult.reason;
|
|
7329
|
+
}
|
|
6707
7330
|
} else {
|
|
6708
7331
|
for (const child of entry.children) {
|
|
6709
7332
|
await processChild(child);
|
|
@@ -6758,7 +7381,7 @@ async function exportZip(zipWriter, entry, totalSize, options) {
|
|
|
6758
7381
|
});
|
|
6759
7382
|
}
|
|
6760
7383
|
}
|
|
6761
|
-
await zipWriter.add(name, child
|
|
7384
|
+
await zipWriter.add(name, readers.get(child), Object.assign({}, options, zipEntryOptions, childOptions, {
|
|
6762
7385
|
directory: child.directory,
|
|
6763
7386
|
onprogress: async indexProgress => {
|
|
6764
7387
|
if (options.onprogress) {
|
|
@@ -6807,7 +7430,7 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
6807
7430
|
}
|
|
6808
7431
|
} catch (error) {
|
|
6809
7432
|
const message = error.message + (handle ? " (" + handle.name + ")" : "");
|
|
6810
|
-
throw new Error(message);
|
|
7433
|
+
throw new Error(message, { cause: error });
|
|
6811
7434
|
}
|
|
6812
7435
|
}
|
|
6813
7436
|
return addedEntries;
|
|
@@ -6867,9 +7490,21 @@ async function transformToFileSystemhandles(entry) {
|
|
|
6867
7490
|
|
|
6868
7491
|
function resetFS(fs) {
|
|
6869
7492
|
fs.entries = [];
|
|
7493
|
+
fs.entryIdCounter = 0;
|
|
6870
7494
|
fs.root = new ZipDirectoryEntry(fs);
|
|
6871
7495
|
}
|
|
6872
7496
|
|
|
7497
|
+
function registerEntries(fs, entry) {
|
|
7498
|
+
const pendingEntries = [entry];
|
|
7499
|
+
while (pendingEntries.length) {
|
|
7500
|
+
const pendingEntry = pendingEntries.pop();
|
|
7501
|
+
fs.entries[pendingEntry.id] = pendingEntry;
|
|
7502
|
+
for (const child of pendingEntry.children) {
|
|
7503
|
+
pendingEntries.push(child);
|
|
7504
|
+
}
|
|
7505
|
+
}
|
|
7506
|
+
}
|
|
7507
|
+
|
|
6873
7508
|
function addChild(parent, name, params, directory) {
|
|
6874
7509
|
if (parent.directory) {
|
|
6875
7510
|
return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
|
|
@@ -8545,6 +9180,7 @@ exports.BlobReader = BlobReader;
|
|
|
8545
9180
|
exports.BlobWriter = BlobWriter;
|
|
8546
9181
|
exports.Data64URIReader = Data64URIReader;
|
|
8547
9182
|
exports.Data64URIWriter = Data64URIWriter;
|
|
9183
|
+
exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
|
|
8548
9184
|
exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
|
|
8549
9185
|
exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
8550
9186
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
@@ -8554,6 +9190,7 @@ exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
|
8554
9190
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
8555
9191
|
exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
|
|
8556
9192
|
exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
9193
|
+
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
8557
9194
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
8558
9195
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
8559
9196
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
@@ -8566,8 +9203,9 @@ exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
|
|
|
8566
9203
|
exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
|
|
8567
9204
|
exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
8568
9205
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
9206
|
+
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
8569
9207
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
8570
|
-
exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION;
|
|
9208
|
+
exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
|
|
8571
9209
|
exports.ERR_UNSUPPORTED_ENCRYPTION = ERR_UNSUPPORTED_ENCRYPTION;
|
|
8572
9210
|
exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
|
|
8573
9211
|
exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
|