@zip.js/zip.js 2.8.49 → 2.8.50
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/deno.json +1 -1
- package/dist/zip-core-external.js +333 -203
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +339 -203
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +420 -214
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +212 -450
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +420 -214
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +426 -214
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +426 -214
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +339 -203
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +339 -203
- package/dist/zip-native.min.js +1 -1
- package/dist/zip.js +339 -203
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +425 -213
- package/index-native.min.js +1 -1
- package/index.cjs +425 -213
- package/index.d.cts +124 -2
- package/index.d.ts +124 -2
- package/index.min.js +1 -1
- package/lib/core/codec-registry.js +2 -2
- package/lib/core/codec-worker-web.js +436 -0
- package/lib/core/codec-worker.js +23 -404
- package/lib/core/constants.js +5 -1
- package/lib/core/io.js +2 -1
- package/lib/core/options.js +8 -0
- package/lib/core/zip-fs.js +88 -12
- package/lib/core/zip-reader.js +90 -16
- package/lib/core/zip-writer.js +36 -13
- package/lib/zip-core-reader.js +6 -0
- package/lib/zip-core-writer.js +4 -0
- package/package.json +1 -1
package/index-native.cjs
CHANGED
|
@@ -111,6 +111,8 @@ const INFINITY_VALUE = Infinity;
|
|
|
111
111
|
const UNDEFINED_TYPE = "undefined";
|
|
112
112
|
const FUNCTION_TYPE = "function";
|
|
113
113
|
const OBJECT_TYPE = "object";
|
|
114
|
+
const STRING_TYPE = "string";
|
|
115
|
+
const NUMBER_TYPE = "number";
|
|
114
116
|
|
|
115
117
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
116
118
|
|
|
@@ -242,7 +244,7 @@ function resetConfiguration() {
|
|
|
242
244
|
const r=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],t=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],f=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],n=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],c=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],e=new Uint8Array(288);e.fill(8,0,144),e.fill(9,144,256),e.fill(7,256,280),e.fill(8,280,288);const j$1=new Uint8Array(30).fill(5);function z$1(r){const t=new Uint16Array(16);for(const f of r)t[f]++;t[0]=0;const f=new Uint16Array(17);for(let r=1;15>=r;r++)f[r+1]=f[r]+t[r];const n=new Uint16Array(r.length);for(let t=0;t<r.length;t++)r[t]&&(n[f[r[t]]++]=t);return {j:t,symbols:n}}const W$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p$1=(s=()=>(W=>{let p=0,s=0,o=0,Y=new Uint8Array(1024),l=0,B=0;for(;!B;){B=u(1);const r=u(2);if(0==r)T();else if(1==r)w(z$1(e),z$1(j$1));else {if(2!=r)throw Error("invalid deflate block type");w(...K());}}return Y.subarray(0,l);function S(){if(p>=W.length)throw Error("unexpected end of deflate data");return W[p++]}function u(r){for(;r>o;)s|=S()<<o,o+=8;const t=s&(1<<r)-1;return s>>>=r,o-=r,t}function T(){s=0,o=0;const r=S()|S()<<8;p+=2,D(l+r);for(let t=0;r>t;t++)Y[l++]=S();}function w(c,e){let j=q(c);for(;256!=j;){if(256>j)D(l+1),Y[l++]=j;else {const c=j-257,z=r[c]+u(t[c]),W=q(e),p=f[W]+u(n[W]);D(l+z);const s=l-p;for(let r=0;z>r;r++)Y[l++]=Y[s+r];}j=q(c);}}function K(){const r=u(5)+257,t=u(5)+1,f=u(4)+4,n=new Uint8Array(19);for(let r=0;f>r;r++)n[c[r]]=u(3);const e=z$1(n),j=new Uint8Array(r+t);let W=0;for(;W<j.length;){const r=q(e);if(16>r)j[W++]=r;else if(16==r){const r=j[W-1];let t=u(2)+3;for(;t--;)j[W++]=r;}else W+=17==r?u(3)+3:u(7)+11;}return [z$1(j.subarray(0,r)),z$1(j.subarray(r))]}function q(r){const{j:t,symbols:f}=r;let n=0,c=0,e=0;for(let r=1;15>=r;r++){n|=u(1);const j=t[r];if(j>n-c)return f[e+(n-c)];e+=j,c=c+j<<1,n<<=1;}throw Error("invalid huffman code")}function D(r){if(Y.length<r){let t=2*Y.length;for(;r>t;)t*=2;const f=new Uint8Array(t);f.set(Y.subarray(0,l)),Y=f;}}})((r=>{const t=(r=(r+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,f=[];for(let n=0;t>n;n+=4){const t=W$1.indexOf(r[n])<<18|W$1.indexOf(r[n+1])<<12|(63&W$1.indexOf(r[n+2]))<<6|63&W$1.indexOf(r[n+3]);f.push(t>>16&255),"="!==r[n+2]&&f.push(t>>8&255),"="!==r[n+3]&&f.push(255&t);}return new Uint8Array(f)})("zb1rc9s4zwD6/fyKJLOPR1xBWkm+xJFDZ3rfbq/bNrvbetyOY1OxEptyJbpuGvv57WcAUhLtuN193st5z7TjSBSvIAgCIAA6gvdvj5KlHKs0k0ecq5uFyJKDiUhSKRoN/dcfzSdn+tERLBYO2zCnLOSw26NlIQ4KladjddQbZ7JQt/fyfHQTC3h1cSXGKlbwcjm/EHks4cVITeMcHuV5lscZnKdSdXXulF7Cjn5L6K0Z6bcCntYvY3gxWsQzeDhSoz9SsYpH8DrP5mkh4iW8E1/VIznOJiKPVzDObxYqi6ewyAr1QhTF6FLEE3iXj2SRZPn8rcrFaB4v4I0YTUYXM2ESbuDPPFVWwhweZPNFLooizaRJu4aHYnwn9WLDCzFL4Av/kqWTgwAu+dFSavBNjuAtr+EN37gUq4MUrvhgMIR9/4e9JMudmVAHgge9qN3pi55wXXaLSYqLrc9d81HxsKHOVL/fDz82T7rd6CRqdlsxJfSuBsFwIIZcbfbXXKYqHva6fdVT2BrN6oHkVwPlhVi8dzVQVI3s9/vdj1Rp1G435HBDeQcP4DV8hXtwDp/gDTwd8qveeDYqioNHurJ8OVZZ7gh2q6Zp4WdcrNdeuBktFkJOMFn3IVjrz72yB8Fa+DMhL9W0hzlyHvTSxJF93m00hH+xTBKRl/3NCLwjp0wH4V/cKPEqSQqhQDJIufS6BMJe2ud5L3d5tywsuPqY+ZdCEeY5ORwGDCS3k9wWJvYUf0pjF8OPbwYC4dGI2u3hx0/0Enb02zm9RS39ds9A6+PXgaxLvKaXssQDejMlNjRdPdnHXuIUKwL8A6rHUR/FIB+yYc8AU20uhXLYbS7UMpf/1qmbjZ6B9wfiqxJyUhwstuZCw1wYUCsC3qNesVyI3LlV5ZJxBEh2q/xqpkD6Qn5eiiVShw0ks2UxdWqUIQx3Wqyn50KWc+QXQukl7gSgfOovA+F/Gc2WgsvNhoHg2PHNplwwBw8dAWq36hIfXGUeWE8P+0BiG7qH+KCgzMpA1pW+QGwrS/wAX/TLc12BxvKDdxw7Mx4p3bE0cQLOednMeo1vVbdMG8I3RRSrsFoMyjJeOIScv/NnjqzG0Yw45/mZVTB+508dBTkEawnCL2bpWDgB1JUwtoGLVOne4gDLSa1Wj+mrKrsVWJ3BRV43/rOjvJC5uk8bmFdjbUY/l9WdVvWIqh5H8LpruT8W6cxRvzQjxljZCVNGNXgzBNkPGg3VaDhiIL1wyN/5X3DO6KURha3jVrfZaXX7feWFECKybOBLjL0ByXifoCTOVOzIs2CtYnV62ow8wdwwODlph2EnOj4+7vwsYBYL3s/9PFsi/v6y9Zmt180IprpSyNktrjpNyHEOGg0n54Mh66k+b0Y95fFmxHJ/gSgvkTwEd+Cal7MmWEWsMx70stNqKjLXrSpZi0E27Pf7CmvDZxqF6pUUrSx0toUycQApIU1WIY2pkIDopo1mCMpN+83oTMa5v8gWDiMY5psNPOa3iNpFfPvWRpV3vo1Bv3ShXHGKadq7NR7Vz2ggzUa2Xjs59v2X1pCBHGRDnhMhg/z0lHer1bmBK7u5wZBqlYA0HWtGaMoaShKhxPPT0+5aDOQQmo1/y/XaUXqcOcNy9ZJpyEZD1SDo/uw0G5JBzhiozWYDLzkRw93NqOwMEp6e8i9m2fj6bfpN8HYYgfIf8EF43Iza3VZ40oRWEDWjZrMVHkPU7kTNbjMMIoiOw+Nms3vchWbUbTePj9tRMATlv+aDsB1220EQtU4g7LZPjo/bzZMmRK0gOGmfHAddaDZP2q3OyXE3GoI4c5R/jwv/XrmIGCj/nAv/3E74xIX/icXKzwUSObYxf+ttDIdS0R6s8EFdXvjnfDAE4X/iAYjNcjEZKXEHEEfI3cnLmkEUuEr5Y/+Nj1NY0zHs37uKTPnnIHBalP8JUvzlubuNVLha0v5JEByHJydRu3XcCk5OQqamebYiYpw5Rw9GUmbqYDoqpgfzLBcHajqSB9HHdvPAOwgPLlJVHJU9SAhDC6SdiEtjg0may7Gm0809Z+u1Yb15IUN2ANkhuwxT/lMn8YvlxQjZUCfs/DyGsPOzM3ZDxhiMXR5aO8/CED7Mhjj3fndKDAfnn9eE17/XUxb8YICoi7RuyLbGYTa8qBe2G4bl06ge6HzlmvCTWYZ47X/6pRWdtE46x9FJB1eAyb1G1OmV9fWY8J86yu46YzXmGLwCuXlYk8fyaz88ORP9Jv608ef45ExTzVh9lB/zWDXkWjXytWzkVsq/VSPfvND7SbkVnJ6KNfI2SLs3Tx1ru0eoQcalfw9SLpxuwLa437DkYFNib5FJxU8JzwbBEAqeDcIhjHk2iIYw49mgOYQRzwatbRb7+ETPvMtuscL12qHqpP/CCSEdCK85/Ih/uvpP2DJ/O8NqGSjK3YaEudJHWBUwhhlzRy5W5Ur/9aCamV+igA3XQW/EZzDjYxhT2WYABYOCJ5BwtcH+0yDcZB0ADoPG4hb0Fg1pSO6Y3ppDGpk7o7fWkAbojtbBZgP3+W06X2S5eiZucAvEpXLff+c8Jsam0EsZHteTi4w1l+t1KFoQ9PP1OujL7bWZyi+jWTo5WIzy0bw4UNnB4uJ6kkTVgkx56Dp5v99mp6eRng8NDliaHCtasiTZ3Seuy0kZTA3nvtLreMJL7mTB32kM53WvFYMlD3tOul6HrD/pLXHyMFPCCy58IUkKdBbWuloOccHysCf7497YSD125oLBjAe92WlRSRuYazAbfuTFYKZxBslL2WqjMT5NyrxY4xR5Ti0oTCAZjIcMJi5vbQyer2rO6Jcu28C7+G/3I0D6+pK/hNyIi8Oe8u/zAYJKAv0OKz5B+fcHwbCmXr80o165lfYzIt8OFWF+RfT99w6r15RCJsUIgDnKd2rIT4KTdhS1up2PYqCGkA9CSg7brZN2u9ONupTeM42birEw0pz7g9BKCyntV5po6egS39m8hMkm/JeO0BlB+H/ww9DasEjG+YMfBkBPv9bD2kzSS1Hs1gpIe3/FIRu+pqw9HFYgUQSSfSSwxBNBq0S3vb00TI6DTB6MZrkYTW4OdK2Tg+l8ND4Yj2YzMTk8qqqnSqpO61GYnguGLMuv5e47PeSXjUb5gqLTm5GcZPM/UHQqOH8Lv/Ojp9XSLIpVlk+O4I86sUgv5Ugtc3EEf/I/4Bk/+pYurgpvdJHlyhtPxfjaqwr2KlHpuRnvryVze6dx3NO3d2/SwBzce/30AHfxYrlACiQmR6UI9ZmHHXjFb+VoLuKj1/efPXwcHW3gA1f+qMB+Ore49ccmw68v7j042mzgFYPfrCypEvkI+1jEoWiCXeLtr/e80BT5iw+OJiJPv4j7yDYM4Sc+6EIYQdgZwhM+CDsQtaCJ3JfgYQBK8EEA9G8IUtgTALngqCObIkegZgIy/W6y5ALzpKKkU5CIf8Rx/skHO7qgIewmIDf5J65I+r9eK/+ZY/Ng9K01JM7rT9z1Ur6lNDEkmIfIfrUOOU8bjY7+08U/+2n8SBQH1+LmoEi/iaOSz3jNB0Ut5SFNxQ4nPO21fk7dqNtPekmprhK8GCQoWTrJv1LOebBedzm1qt9bjMiSNIqS4elp1PpIb0YjcnoadnRC17x3P0qjegFTJ1Uh8Iuu5eMMq4EZn52ehh+jbvNnZ9bvHyPDVgySIXUpHX4UW9qwBBkASDyvnp5i0GyIsyROvNawN0aWoNXnyXrd6qPISfRRDpTu+PAjEUZ6N13HpMgkdauUJqZg/9VwuLFpik0SnjsCAraZiO9+Ddnm2Q51IxwAVT6HQ5ImNU7gnwy5/rSUuQxCfEfXmA6cDAcsKggKguBHTKvKjHjCg96hHIyGvdFHXqzXIeLBIBniBkkIkPLkY4KVJKenEf408afVS3mKuiwERPrx5ASwDp5CPkiHfES8GrJtyMGNhkPd4yUPO91WMwhOfp597LTbzeOfxx+j9vHPxUfzofvzCFYck7JBOqxT06rHKF+2+pIES5QosdUVXxHarVC7BgpT0yFf8iWlLjF1Y5dvW+U5/liiGSYpO2nzvFKd4KqrtFHfXW60e5cLzmaD/de0/XJpqvil5UU4nRWtSsqZV8j6JogMY54gHsx4ghzwiCfIAS95ghwwDmcFU5jAgotBMPwoscQNqoLOmnGI7+EQ5lwMInyOhnBN38K4ie/NIVzw1hb65AZ5VrwYLPSy+Dge3NTazdlgXuk9R7QIrrGqiyFMeYEZTZG5XeR6p8iCirjhECa8wKym0LVdaLFT6EYXokEUmNUUWtiFbnYKzXUhHKnLW7DgK7jhU5jzydawW9WaUWfNhidiMeTLEgAahywgEEFb1oBAsrW0YOG6Q1jxBSz4DdzwOcz5NVzzVckxpJsNFHu3FcQyQoBXXGhO4gNX+uE3riouq0ygDBYvZROYvzR38wpMRb+xzU+GDcCO/huJQdRiTLg8xAH2xKwQ5fFEOVKkPmaQkHOi2L2o3UY92ZmjeAD6RZ6h0se85Gc5D2LXzVnsuhJ/FAjUUrhcIeDwQZ6edvFvXrLVYvMEO4caOAcRWY/tJ3pmtL+g+FQlhkPGNn8ZFeKtVmqliXPo5LXa1vA6g5q3tnUYalurl5MWjLcMbJ+gJkIXyy3pQrKeGmTDjzwnKj3I3JBeQv0S0UukX5r00hyWI3znzx0FGdtsYCz4ff8dLd6ZZj4ymwHxK2kPWcLRvhw1L8T5W3NAsxTfOR+4LTnCWEA+Wr0u3xSYcZlDMIRLLIG4yDLTKzm7iXOddm+ppkKqdEwM24NsIuKEHwYbdmvOGgo1yhE9p4JwD/T0bGBU3MjxgX0SsasdqLuYQFF2pQAh4jEQDx7PNlz2kjNntBqlyqEaK4GX929LqZU+HyyE+TYXTg4B/DRQKDgmnN7pjTRYg2B4SER2vU4HIT2Hwy2y/juemUooIMG6BNVVDN0ItdicUsw75GfKF3g66uiSzxiLxw5jse7SzKDTaOf0wxPCs1/Yvz6jZqc8mZkIR4KAEQQgBJ5aVeDU5zUlI3qrRKxAilgCHu+k8jLODeTSjeZRUSvQaCh2qzuUmg4V3AAptzoBY51qp2l85d+wolK6rpmXC+GkAgrWk7UsVK0gZaXN+DVlzUtBYoRN6TRZCk6M0YCZ4RnKbpwKcRbGwRblFsKQ7uWajwYCNwQxxD4uG41kay7/ZD1RAXaGohkrj9ZW/zNr5392KeT1UshwKSRmQgtcClpN+q2XnzljfmdR1Esi588djXF6EZR70EMnh53FkjON7BnkDJIadQszjzODuuNSj1mjrXlA3J3Rmd0YSMm9g8YzKMvCfwWTs/2YnPU0k0qYmd/BzAr5LgzebeEopAYfRYmPCb+DjPVBnbBx6KGTQsIMIlXC9hThKSGHjI5btaAr4FaPAUG4dBTvC18IrhhU032DMMqZNeleWIHg24bVLUyqGYMMEgtuBcJtXBWabbjozQxAGg1H8YfODFSl8BxVm6WnYbg05zcO4SXvk46k0VB9sQNVyUUPRT5zrESHwo5EcafazxGTctcZeaN/fWao6Qt6I+9zny97S5d/3iUcc+EoWMLS/YyarEZjfIeKZNzSsvSS9brKkpUHxXreMgZLN6974htwcN0GaoEM3pXwXBDkNSylX04Il8vZrCKSe/YdyAyIDmeiVKzcrzdvZDFUflMyZRpX7d3dOcpHqyOq6zBEzmA8UuNpmX8m+GEI2/VtNswJIIMPEMBfSKT3Lnzs0cjq0WM6QS9GMwW/+bXCBeT+/tW8halyu18j06/v14q9rDU8mCNONvAbgwK6PzvRz08Gud5BK4LCYFTjwQwCwCyENFYqpoEuzRisOCWa90oXVzYr4fZa3BQx/sYjyNHEqJzYP0SeJoaLiVcbUIJWZSGIUCbCGaGaMsmzuaNQsy7197FwlmzDYFUvxBuxfQbCOf9y5gizcDS3tuL8slZH6AE7gi+lKMYjpL1k9HT+5ikaKmVSSFQVVCftbEvqlafKPlUlSVX44+koR27snrJsD5TBfxrTivm6GdRIMjQGU/Ug5qLko6sVU52V0fRXOa+3hyv8t4iT1eeL3c+o4jcb7Jf/fIPdO1172dO72+7bnW33Bxsu7SbVol+vpW91o564b7SD1ZAJIIwY2y7Mt8oS/YDgkDtqEKIo7u8bEdthN3tkfFGdVUZss4+xrHdW3S/chCpm5vJ/Ctb/PbiSVAbZ38D3h9CrDuZKHoZgTuDk+8GJupXvWBdBTpvEFQJMMeRPMh5GGxR7D3ZL4begZxUQDPeVGuw52970335n068gLrcgnu+HeLZh4OiKag4u44Nm0G6FJ92TDrRPwuN2GLROoHvcDbpReBIRs2u3SYQvg0yTrUdORgcvaf0aDZGO5cw+MVKnJedEB0cPcDw5CUoEoO2s8k5WaVMhRYykHkYNom9inxWYukPo0IwkrwkdWs3JQT7kr5F6fVS4C+gmbcJv2YVd/Q+3o77TzgPTzkyoARAhRsD3hJ+J0siO4FfO4r/pC9nL9SS/J5zcT+fLmXNPONL9imwMg7DZOj5ud8Mmc0PchNK6Km1TOKwPaP9Nn3V9um0+yEBCOqz7+HrLJiRa63yDqLIS+1p1Q0H4UTFUlFpz9tVWK5H6p/52z/5WmSlgFt3eueYPZ/Ux1Ce7xLnue8V2vxH1MddSlva5YqLVqPBU8D/gkeBHE5HMRkp4xDu9F/zo8lu6OIKHgg+aIYTNE+gOjUbkxfcIoYDb8XQp6YA1VndNhB+PZrOL0fg6lnvMh63tZmNm47buLopqWjIUkziFZSHu1pDAt3ShD9jiArDsUokH+bgZxWOYiS9iFs/AjLPTipeAFHak0C66ruuFUNNsEk83XMCkprgLuIE5Kkixh35uzKMN0lzwVaPxSTgrBl/4uNHIGo3DZaNxeNFoOIfpel2wRuPQOUzW68Nca0gajcNivT4cr9df1mtnQTP6Hq75H8K5hgVDqpgmzgW75n9iyq/CufDvDBhWcFsOy4b7vtEwQ3DSxPnC5tTeOwGmenzLnffIlJkuzE12ZGSv+e+YlOxtbAN5xcpWZsrE/2qmjKo1nK7ekcXGtKqq1nRv2CZtNJzizEq8RMxmsXNDda1IsDSfb/DI6r5wJnANDrHnNUydiT/Gaedfzub6Kdb2EwttTlvZ3F7WNrdIW8ud/p34sUkwKDwMLUlgwPYZBWf6JLyml7k/T6VtdEv7i8clHDpbzImsuVS9pjclaZK7GgKsotvnaSmUoI2RI/lDzbtURmCp14XCdCABWXUgs0RuafNgBdvmyRKvQHBTzXX6di7Ks2vvrPgLZJ6FmQ9lQ5wsyIVvEyUyLbQzkUW5bfusJ+jxP6RAexwSLBq0z11hHxWqqUpiEaFCs8wlfdFoNgOLZK32k6mpRYMmJQ2a71m118jb3E/V49noMr6AbKkWS0UjuyQNhFAHb+EbXO0SJVQkNhpOcnaFS+WKVtIXs5K0iwXZpoP5/A2ndlVrDuZEy+aEn4Jd4WK9Qgok/D0Ag/k2xP92FLvTHV9WtAmpxhUSmyuYbtdqAWyX4KSJM1mvL1FENCy/hszfEaErrY3Z1ulpE3/bJiCAET8Mt2yzlpUap+ACxlxtWG/l6w4RJdowkOt1UdkgaOutRcnui12xNUSnCeKJHwpcEeWiVHclAbXlW7Cj5xuhtc+No9UPWu+w2iSpHM1mN7dzp+QIyma7yI2/QHVKtuV8kGvmh5an/aWFCpVgt4PjkRyLGQ2K7HIYTMrh7vQ9t3wkZm513AuyPzsbNRo3DosLxxYGxL7qK+sjRF4BUwb4F5EUG4EJq/miG4fhsCHhhVDv0rnIlopmaGxEvje447VF0+LM5ki6ZmKUl/kT0rtcgYJLhkgjKnRBgyk09xGjichrsyis+sa51XOzWM5m5bYoaV6kOUtRtF6dbUwW6LQz135ZFTbbs5Y5FTNnsXKTkRodlYZGyh+PloXAg0494be058U5TDIp8NhC9lJ0nphlhXBYLGzhy8AbzSGxHgP7DcodV2wzbjSct4ZXMcTjrd6FSXq9Mhtx4oxraqI33rfbGy+Sltmhhl+9HYTbQvtTYaRvqunlHbb3vpEN2a3EvmiTv4VzS+sBCTniknY0e51nC5GrG0fAUUkmj+D2UqgYuyxtLfCvld4GFX5ix/i6Jm8Hc6Jvu2ZcNhqIHUXP75aCmVVna6rRyM/yOFuvc0i49Ctid3ZUPRJbHj/SpK0gRCrMMk52yeGhWq8Ps/U65TyrkKgw6EO5TRdpzRRW//7Y0jSVCjdxkMpCIS5kycHNrl/Lf7IKbHSUGh3zzc566OV7cVP+EDcF8xfpQryb5tnycrqlPftzR2xV/sq4MmK30a0Ruw353mEYFTBiNYKcXM565fmIpB7f9EpMN5rechwIOR/HWOc3w+pd5GJ0vSlTsT+4uxJcEN/LudzRQpe90OWET8aJpAqkjW1DRwOCwd8UM5DbKpcDrTWivuX6MOvuGcqGSF/gueBHNIIj+FwLjEdGKHz1fZZM3mGp8OySDuVQeTp+d7MguqSxO+mlPm2UxZ+pmjqfBTtL+AsRb6UepVK3jjYMCX+MfhV+zSChqTIulMpOekzon1BnYLbDMMHoOzsWkePqmKew9ix7k7KY3kpdlMNtKkturdjQvri820pJZvAwqG5IWhvs1rDc6mAJhJV8yPmXRsPO2Lc/b1PVN3ecEm816yo2fNyzB2CSYXcgvTtUNd9LVWdba3K0vUTH269LS/r68F1MuuMcRa5R5UrP7nhZmoPuzLi99EQ/67GK2VNobJJy4WW9UkfXT88cfeaV2+JPqrWUaD9jpWOqy1MWl0UwU+ZWp+qg/GKaJnjQWVLc3OMC5Eb6afE4lbTsWaMh+jxcrx3B0XCvw+CONCkh1Rb8qnKty91KGiTbMpZWSJM5NUqiXgiRuPxWsa47WjxWgxMN+TWUD9CziZXOojk1qnZcFSUeStERN04gVvKb4JHmvfVBjRx9SS9HKsvJSrt686ejfLIa5eJBJsfLPBdyfNNoOL8J/sMsFdXSffzLcAXwU8keYBeeCBCoUd05j1Sq0lBASl3U+J8ttKV0AuNMJuklWgKQFJX4WjpjFf3cJquH58KfjgqaRHTU3ALu7V3J73siJ1e9+mBLHvK3tU3SIX+7zYHU7N9EjA/m2WQ5Q2vIc6Gde+E/aFZrk/W49HEoqpgpmoEZOCQ+tXP+5qnFYxieQn96SgUfj9KZmKD8ITZkx3KnFxQFYI8Oq9gnVerM+8RN7FDJ9zYah9UM0WztE7c1S2SfvB+WZ7iHofaw5C9LnWkPPSilQamXJUglK5eHpHyKNvecRE7aWg2vh1zEYVAe66I7Rr12KgpA0K22vd2dbg/g4r0QgkdI16ttneCFFOUFIYRDvtFJellv8pWE/c8K7AcmDu9wTx9LpUqjsefjh1mKitAfFOPfKcXgcO/g7eb2fK4a/EFR/t2SrGIZbqfp5fTPkRL5i1F+HYcbGHFRcQ3r9fd5XCOtLZGF/sugkSKVnFQOEcb4CAscgRH2nk5ioVDNpbgjlBuyf0n/xb2/Pr299/jRp6cv3z168uhNb480l1Xsc8+W4yBDom/YTbSMZD30eSg5X931edl1w4CWyltbGUIjUFyw3k/VMNAVuxzFMwG6P+I/GYmxkMqpZ6Bh9Uo4Ceodn2hCfg+Z2weZVHk2m4ncjJ38dGbxasOfiJ6uZLTD+W+9Yk0fBNoF9HN/PvqKaF6qlaDTYsxBvaYukjkpVA3AIhdfhFQPEITxYVC+U7diNM40Y0htKaJi8G2+amoxUBNbibdAul9B8rmAXBTLmYr/vtxmR2tgc77qTFmv6AjfaBymPlrOi4lFMfZ2vKQWufaxqnZOqXbFN2W2SKK81SEgVl+GrHAkVyCtiBF4Rl2HjDjkZegLK/FMsyOSxZKVQScmjoCBqXRY9hCVSJqk4VOvfvoyyu3DRBxIqTg5l9cyW8kDOvQ/YuV4DN7GCgql9cJIneMcyF0qtSGfAKlW6HBpZ+uLx3hgNOP/UXWbHuppZ0Zho/2zCh//lKspLkp10IbBWGfes+symDi3NK54tmGb0WTyCLH1eVooIUXuHJlKjsC5RWEuFpuaTyH0U9b6lbBLYwRxS2niHNF+hY7vjQaxU6A4fyZqdc9feiuVrPcXmjzNhELZHYRT0i1Ne9KyaobswtFofI111tX8VFXz03Y1bKM4fy4ajSelAGytBYO2BA1NZElCP9oQXtxawZUytRVdKVV2QKVE3YmIVCgdqWmsTKimmQKdeaQ2/HKWXYxm71CiXSrymguPIexCAF04hhPoQBhAG8IQWuhc14SwCRGELQghbA9hZXR7Ct1kpkY9Sy8TknRss9zSCWliRAEBAUb56MYt1ivTAgj1QljcKR6WDhmL7fKtONJFbqrmBwGEgJ1tQQeMU6D2BoRWFzotOOlAGHUhPIkw3AM0uy3AqBDHnS6EQdSCsN3sQBS0utAMjiNoBScd6IStFnSxSBhF3S6EHSwWtdrHnSGD+b7G29CBY+xAQH1oUTcC7EnUpc4E2J92B7vUDahXmA971gl076IWBENLMXytbD2cjlCSGabQGL1uKb0ydaatPDL1T4LhoBZvp7h1apZD7masrK4kgluU0sV+oRpEKCeBLVswVSong0Mu0X/jv9FP5ifpbIbhhkC5tp7ySx0r6TYR8UpBgTvJGH9m+DOixCU+rvBnij8TER8dgcItJw5ggUk3ItZhD6y95FJV9h0HEn1klJElb+fIRiwryDC4RjXhBRKn6ziAL1jjIg7gUsR2hW9rsc5G9zvhUnhkXFrIMQ0y/OOG2+sj62/Fj6j5doOXim1wlXxTP/QyeitKNyPckPXTleAYdODqOyUrIyfM+6Aq/7ks/lpwqZ++Cp7rp3uCZ5tNjdYPbG/In9TAo4ANoh+dncSRJ4br9dGRZcNi5kHv2RPBH9TKREcynXb0bZZe6B3z4MhV7tGBc+RK94gdbSqDyNqqZWtm0d80qILXlABWBsAUuSZchw0JaIFThwrJLUsYU5/wzzG6zyfhuhSnrfx+br5TPnIbZaDLlCHELJz+pLbcmsjpSkJGOpd2Q5FP8BvhCv+pqB3czwW6O2LWDPSbi9EmyurLtGjIcZ09FS5vQsYzL2xQtSD892JQoPmT+6dyw6H/CB1p8SB18Eg5GasSngr0f3xhmQG92QImjY6U1Pv6mA/RD4yesH/VczTksuoX9UX+oMWnNvqgRZP3uwXsR2rLZKnTF2djORDDeIwuux1XO8FaNlLvrWX5UrnHoBc75NzBv8wLIeNjZSJ/OMq9j2G1frmv0HcgPD3tui8ryuD7PpGNsM2AqMQ7EbcieIwU4WVJY+C+iJvRcecYfkWS8TsSjz+Qi/lTxBk805QxVQ7m6TJ4XiVIBp+RNTuviKfJ8grr/6Br7cInfPsNf/7Cn5/w5wn+CKR5UsVeBBmRP/xJ8KfAnzH+zPBniT8r/Jnizw3+XOPPBf58wZ9L/HmrqCOJcqKfn6EMBd9U2bUy5UqV3f9A70+xJy/w54FC4vwGH19jbV/x556Ku3CuyqFg0hv8eYo/7/XAR8p5pcpNgfnz0YJOS53bR1jXI8qJPw9VHODp2sOqWPTzc+zEPy/6QtVFP/9nRd+p+B0eTz82f1/qv3ZYvP/ehgApf4HGf6n/SPEcUv+h4lkZIyhlewjfC2u/3NfrOue7OidtKd+UMxjSweWVcsiweaW0zzKzaNfjckB0XhIrmJWOUfo8Wg91rEjE9X1flDE8MLqLBdw6lolW7SqMMCcHaui6pYJLF6pslMqSkO2rD9It6h5iGDjj78tTV2IcIPTpBXKXT3vbxq7CNnYt9wyMlmI4G7SS5dlADl23hPmtEaXM8MWGjv5K22TEpW1D47JB7GZaN5jWERjkIB2u1wH6h+unXj7IcJsRZ1+R9xIsDqBM2uEFcs0LvFS8C/cVb8KvikftLvyu+K9IzdwQ/sBH+BPTO/BMcdwE3OgEniveDOCz4uEJvFJcr2n4oHjYht907r8U90L4SfHBkRR4xp8SLozymyPA+GNiND8QcnIER0dwlKQzYeTa+qN5RXmvekllsUySdJwKqQ7mYp5RdZpTrDIdDeGJ4m+VM1EMhMSnhWKgZAnn8IT1lByEnSGPAB+Oh7xJD90hP9YyuOSPlaPtYQyozXrvdvfgI4kmzT7X4XUQDXjX+hq2WugfvfX9xPoetTu9CENVWd+P7e/doBd1j3fqt3yqMPIf9dj0shmYTrbRFlPyh8qRkkFCT7lkUFjeXCVx2baAFrYF9K0+h0Kb5zPc/Qb5MA6R50DWIPPCXtpHnJc8ZZuo3TUvUbvLrIWJTLEbbjtYyz7XcQa/S+XcMtgEurXoxiU2nhDVQx1O1udJo5G4qRf2ecZucwxRKM0p9cY+QbvbgBfWTeS7TaTUhJvT+DDIUsZr+kmt1NUAasbnCp4oBmNp0zUz9HYYUQzIumEb3siRmFCwyA7lfXmGbccIYCsjIorUoW0ropP3+8c9pZkY2Y/a7bOo3Y4lG9LsWIFQovZxrx1GhoMNOAVVQ/8/E2DNCy2PqQ1z/rcQ5P8aI6yjjBt02GWWaD2TlvVMFShUrdfVsywtSEKD2poDF7j/6mi/mncu95ae7Ae9il73I9E8i0Qzlj3pcdGbZLc5z101SF13iEHeeObm62CzmqYz4XieYL38X9hEFEJmHkoXrgzDJqxzNM4PiJSP5P9G4Ok65PRHCjltAk+P5H8l8rSe0JGsAk/joxV5WtdqQk9/GeWDpYSVhKmEiYSFhBsJcwnXcshHsp61CzT2CWqrJysKbj1vhH61v4dB5PW/Be21aeI4kniQFN0E63ARfYwhbW0BGGhSaybUD8NPU+CIbgng/KOoI01nJvi0nWSCT+f8ugwh9HGuIxCZuCU3+q0MabIowxPp14ksI1BPpR2CeiW3YlAv5d4g1HrB5RTXtYuZKAp1/hGjWrDSKcSpnTk+GqSrNS4SObyww2lMZw6JtsJfoLXlggS6S8EDNIi6FBTb27ln5+j3eZfyeNx2M7mkWqlM96yqUlcSNBp2Fa8VRiakKsLG8XazlqqlWt1UR9jx5JmDWfUaxsc1Rqz0LwWD7TFQ7CcPv1Sy8SVGLPHCDou/W4fJZLs70Zh2Wcn3W9wkiboKRV2L6JZZH+5kffj9rC/UdtYXqspKTfym30IQ/l9owv8TxWNB0Vr4T7YAdyV3nEERed8qjHBi/up34b9RnjeE1zp/uBWZ+4G8G2hUd+jUSPbrdTkYblIaDeSjT3k+kLb/ktxWhlDbJALJ01O9sfayU9Q2oFkDhmbGhwfafeGtDtBinvDvN8Uajcx14ZCy5NufGAZSfWucanW65Blkp6c87JVfLLXPV2lpPsh/HIPlvhXIpPvfhP9AQKGfvqL5tWEEsIsa+oq/UhR6ujDBqIJDnmpoILK+VQPXxdxDPib1yDfqQMBiyvRQlftO1MdcPZbxrUJRf3zmumOU8wdZNf/fcFzU/l/C8yBB1az/k/B4gpkeqjJA3JXgY5C13gPr/CViuGuHPel5jKYmRSfyjBe4vUl+VSZBvo01nofD1Uoe6zWvemaG7aaDHP9W/XTMqE/pbz48M39jk85cDO4qh/57xansexSBS0zFmTbdDJnZaXEcfR6x3lZPyt5uc0J6ToFM7PXMzjhCBkbVBC/102dY6YfXAqb66R66ZekZQg7hg+rzlCQ64V+hDFeaMA3MenqqhnpSab94qtyw90oZxKgRP+XjwVgPFHPj8PtoipfyKUxclwF9fKh4CrM+xT03zWFcPB5A3kcXMCfhy0HurYYYrHZcwfwv4fLiZyd1EwYjgxiUMtKVugnTLs/BIZ+w20l2q0eHPC6ezuiWeiz1vJ558TzQT244dHmkX6aYPPF4ZOZk0jciVsqnKFWnvdTziK3Iq0qDQ55XKO55cojjQ1Z9rPH2EOMROnoMTuqZVPbzWGMYmASeMsg9j4xIyQ7fcq4wDssUXg+B1dM9CGnuNCee8MSVg9yoCxDjeELZdCR1w9CWvJZuEruuo+NjTxT/qpyUVBkYiQP7kQIhFY7U2j/ubZM+6pcXkgIgwGqh4AGM+THMTAS3gCMv7Ix52OzCjDcpkh3qch8qvWWRjrsSKjIdpZg0sVid47pFn4/X6+yQJ2itOusXZ7SVEABdXsTBIc/OnIxAbX1BLe0LhVI2vbG46IeBLhp2dVqs345Nfux6yjM80kvOrB7HmUno6FfHjM/WMZ3vwgWhklZQQSQv+DGMeQtxkjz1qP4xb9byx0xDYkbRgclGKqU6ZgYYrpv0MRRifshT4jTH/YRNslviK2gsuGZU9fhQlfQlOOSel5iTfkTaMyc/JET9QVkKWQl1BgKlqp8xC31NvCZEjMUJQtiqkeCs6merQBjCMTpUWZmPrczHO7U3UUjiKJ/kOD3pmQW+ODcJHf3qGEDbOs1Psj4l4gHTEAvcHJoMiM3T7JY0f/+Nty+QUSKedfrn2MVPWEGGWegshVucxZu7iwLJs7m+AR01ngpGohY5K/sP1KAYojmoU7+74ZBh+DmkJfQeDaHAg4cAY9dpzlEvVf33oWKxk/ICL0QA8zktj0mU9UITyZ8gucKwD7gYM4/P6Z3KYYAZIj+Q8keol9PJqNvDmuivrkRIq5Lc4zd1JTlWUmJbcUoj7pluEZ+nzMNDcwb4VPLB7X0V/yXhV9T0/o4/f+DPn6jzBfz2E31r4bcWfuvit9adb238FnbwY/fOxw5+bEb4sRnpr092qtVFw479FfWQ+OE7ha3PeFT+J/25k6EZWRmi9lYDzYiqiLqYBfWeWEcQte7mwY91HrQD2Axr2fORtA+Wfsawbf3W2UkcWMTp/Q777DgkIfwpPkrWEP4fYkeceijLk8OV4u/1Cl3h0lwOlOvQQdOQGeNP4T8TA9UQ/n2M3+o/x6PGlRrWB2xlCpozWTp/I1vR199R98PxHMfBFAjA0YnsZ3z3779/9+jtp9eP3nx69PzRi0cv31ljeydrq2RJHN61MDHdsY6eQvWH8jziX55TnHHzl7RcQSy93OTPtzM/M5mfbWe2zhUsgUKrj4Q/ro4Ws35OKruc4RLOzgIU08bC4xlco1Ercp0JQrag4FAhcio3wn8szoSfclQE+SkYLdVemd+VZDHP4qgqSrxGyi/+eWHyQRYusacz+ptZwH25D7iTTIfyF/658oSf4E+qcJCy0SCGK1XmIVFnkuexF9I3SWxXimyLS6eljYZD9HWJYfX8JeSQe5q+Ko+OhFPzNzN/Bcb8Solt8YWilhgQBoB0DaTRA9AfC0baNrKx4zhR/lxQG1jGxZ5pSp4olyv9l6rn91XFKGHzmGgEpBUmLTVO7FkXqL3E3NS5Pd9x2VCk+b3rBbYWiiLuRSgCmN21HuttKpEhUae/I6QPqzFrr6nrU5yaat54NWQMyHEqz2hpnCtPgur/oSgC2x+K6dW3BApDI/xrLl2Fyo7rU+maXPjgCf8acBpo8q8pvXyp6qA8VIvLlb0P35fG6BIP6zivTMmD6v6Sm3IBoR+e8ufiEO9ya0WHXPnvRKPRPi6fOifl03GzfDoJy6cwqBLDsHrsdDr60XJYlJYZBMbTNlYQ2iLC8j6014LuKGnZSfeEzmNkiktsQl/4K2EgsxIMDKtNuD4iNMTQNOf485vQgFqidxK9a3ycmr8r4VH6J/qLa8z/JMjJCV09/FfCZkL/kFsWJNhF6b8UjQb++s/UXvKAHamtqF4J1zSHdsr6r+0OuK1c0G2kiUPzul6rfhuv9aj0n2Qk40WEl4c49vWasHUsGo1DJH/rdafT4TynyWkd8r0laVGvxPanto5yxXNfKsAfBM8hz/1PGsFoumCnKOX7S0GwKaN5UAbsziPpKHbKH0lHsn1d0e1ZvTUD2ZerFVWZ8IHoMr7zMGwyKL/WyNR1ndy/EF739LSFTKCmWrl/gzqB9Trq5/5UnQVxRz+EMXViqs6iuAlyjQGMO3rwRBvlGu8RQ4rYDD35r2YIv6JHmmRWHkoRfopqRaa/m4MEP6VNIeUhlH0GA0wD3jvATBOnfWwGRRSIcCyghZRDMzQPYfPEPHXRMe+lYPTi4KP/HMcVMFe/PcOx4ZumE5T2GUHQ2k57hWnd7bQPmIaXDem2cB1T+m/KpJi3ysppN1Vrq+8ka621ST6pZmB3mlpxsNvyX7iWlrPZYTkQrYC2cvy01bef6r5pQN1ZuzlSD5oMzPAV9TM0WZ2TKk4NVVd25e/+/sPhsH+KErRWTko8pwCoRIdsIFRnE0gzJXc0/pXg8HBYWpOIGVzZz/0PoldyWvji4Qds6RodDg1AwNROYEEeBxMpOxjySF+Q0/mbIZDSy+PZ5vvVS129y+VW5TzYEJyOm7g0jpt34GBwt3qo4piWFIFGphkt6j8NgCqgdiT7u85LHmxUuUYGNGJ3qOfRVgoo1isrtDt+EmLHT8L9Hf+gqof/1Y5/+Ecd1z0OA4J1GHwH2M8UK/vkRoRKjYaz3ZW7fanWKBJF3QcimSXdqAjdhqr+x8TSbB20GeZ+ouhBGe6k3hokD8yy/EvS8GPaOW7U2c7R+KE5c+iV1tjI7DUazst6D0wUKz9ap5P6RJpIdqF1vG/0qdNygEzjUHPIhm133VLDofgrhP1hqPdgWtRVrWqjK0QXUmiRW4Jdpr5U0ZQ7U3FTl3gq/lH15fk3Od4rFjf3AkVryW24EMPMf9WIoEFTJtFGbcGlhiLbBREmIiuOusaULMCcTIsKIfFDS9TH5Jy7btZobP/FGdDM+K8K14jB5v2Z//nftJ+h5FGgsZTnpF5GMh0yoYneNQqlh1KO4vS+wpsRfjjVdKiYKjA/Ba5tsgEO6c27r0wBTh+pUPmIcGL//8SVp3KAC2ro39cEhc7dI47X0jXRtqJk1DqdDi0cuV5Hls2FYScpF61nprc6Ld/iH6UD7ZLmK0LtolaxyVIJZp5Qn1YKDjmL21pA+ERsGsVnxZ25SX5CzgvpaMk21xOKHBzt95n+g8DDGFTbHO9dwlPGREQ4BjGypf3gzIk0h3rm/B2xs1K2GCSdtMUc6VpmosoxE3fqmYm7Fc3qO61RN1zzqJVZyx5WVQ9bD4eg81hwD38rGozsIIvDWop5VkqhJLYYSHmRJYPS5XjvRB3AeclXCpT/TPAp/n1u/p4Lnf5A6b9vtb1VovRtqt9M8pXS2atzdrQWqY/S6a06Lae3l6K88F35r8i4BAU+/PMG/4QhouuZ14wttd3z3ZNfLvwv2jQ/xSMI4Y/xfEb4FwrGlNgnNcwZkS96RFNrUn2Rr+59PElEeX5FBASmfNX/VZ39ijEfJ3yJyt8F/sHj7Bt6wAu5YK4fh72kjxojOgPv4+kmFP0VnXysWKVFUrAcSDcZHvL5ek2PHl55cUMvw0M+0amYtmDjTKpULoWJSxFp8k43EGKT2ZBzzJwNeyxzXe1mnkHeT8wG8AmlxITneOBYGA3Rno6XKhZH8dlANUZD1h+TwOd59Y3ISX91toqTGvyfDfidraMGsx+VBwLCnyqz7Ehpoyk0Plg2eyB5KzhpdqJWq3VslJNBrxkaA0x0+eAhSloh3ktM3ERpsbG9h5kvJ9q4oXwNg533pl0yNA02o96fythNWXWp7bxlc2RKzOCrVnq9U9XjY4WnufXYqPZ7+tt7nde/Qkqhkx7qMpRkaniJxrP8s/LIQLppVIsv1GCJ9iR0lqk8z7pXEQ9bw5bb/JmsrUFpM2dcBn8Jt+ke9/tNWg0/VW9Oqm9fI0UqWmM4KU8Yi1OecOm2Ie1z6bYaDXVmHySxOKGTJ03s9WHSG03uIZHV6VZLf3Hsi2EIfwkU+ozEi9rH0C5PXrywes69FrRM3GdjJ1UfmS3xJIhOBpusd17BFPXzcF7BU3qhDlVhYO2GJYjdEAqE0BtrOh7iNH7TNLXRuDR7VK079VAbC4qUsox+NXn5XetYLV3RK7kVeF0vDxLyKzXtSpyRoB/jpkfHQh+kPhWuDzh+265G9cWZsAPF/7XH3gXLoICIZlLXgpnjV6MlrUjPB0kk8lK4rQixwHTpFG8cz8oOehmxdeXAZT93TT1k0Fe9MZBkoyt5xkBbm2qNOO6363VAVpzy0CrADAFKeIs2esnrjwgmIFwz7EDCoPLj8lraZqV8bZL1YtdKiYb833aOEN8xSzlLQHfPUy9zjq6CSlMh0k7OSUGpJzyjyDUmzSUlvAZL+Tg1qZnCv9JDLTxWW+vct6uVVm2yrk3WtclKzOM8IQ6t8Mq5g4IoOR4wXgtm9M6pOuWF1o8QP3otYOtYgVL0WQEaJT2huFRPhNGx3z1RYGVxw/zOzUHNHI9KvEKHd0V+t6AKXES3glqh4wJ9yn5LNmw1T6EL0wGK1TldtTJoirVy01vTmU21wuqbQ1C/b7p8bc5AEjTNeo2uFE0Wa2GyRb/1gYgWWPA1w1VIGG7AByZLn+JeZIq2bX2YlJUQ/c+Bm7n1WPYBOevXCymrjjAw9oaze2ADWQnyrAZ5ZoGczhrugmVreWcVWcjgA9nLVpWwrTXu5H2ertdOTjsCbgfBHVhmfZ4zWu6/SR26qlzGdi5c0vVS1qcriUU6cQmUS5IZqzecRZzQaOsI96cdxfu2yG/OgnYl29//kWArt6RajH+sO0uTpL2JCDbylJendiTjPdf6Fy1tnt5XLP+xSFlpJg3KfTKCZa4FSwN/k3pXwCSJ9lKt1zS0+4rdkTmhOqOj5vcd01GZcFgt0UJ5Hu4HpX7DGrttOYMZUcbGTKTr+c9kWyJReP5HnHaMT/+70m6FNk/+j9AGRY1yamb4ZKaV09hLpBqjlfCl+jF+QbtPNWn5GvkzRIFC8UoJQ1jTR8OIqizZKOhunN43Bfr4ps8nlkYbuI2wdD6bNxrEqQSsVHoZJK55lgou+hQJqyMjViv31rWV5fGrd1/1DO7PFPVtC/dDr0rfwv4xgoz+8AhxFS1pccu7A/VtjB0rcxy81EujBL7p5z9E4Y2pghiFu9DStTP4v0FzZBhFzrvtCFTObxR5vwreF8jUypzPlR2G0AtZnaHJIM/5QhdZYMin6u0mZ7081/6qnRZE+E2/ha0ITKCPNOcTVV3A5kWsqijZ+wUrTctqOhDCcRNDdAQYbASSqn6MaXIc4U+3jEJSVP6ZA9/3JWpXunQrL4Px7qem+TDL0eswzRmM6CnJGSy3MqvcZF3tJqOL8wm0TsJ2c8hgSuXznMGEnrLc8lZa5Nus+b+iMxELN+xYd1F9J0vUtYJG53cPlWnrLgRJbUtB4loiiIcfodV67i9hxnN03ehjjHEMuk2PeCvjEwUrnvsKFRboLJ/7QqK//MS85eQ9v+C5f60L3eAjPc157n/RiddYhYQLnnoOkhg8yP/CU/TyWAmU1xhc8szVRj0orvEAvvEArngAD1DSj40lci9s90ea4KJjWHlkQoQUo627aOTuusPT0xGMXK5vhJZ8OZg1pkNDqa947UYDM4z4cAUjj1+B/oARWji/YrcFOXIZXxBZ6/fDTuOKKnpbfoOrBrrLXmlnkN7Vvi7e5r6UPOxEgTkqOBCbu9196/JZAyF7hWC1Orf5wej/WdUaEqvBrDH555Coxvrtf36s3747Vk233sKSp94Fkq1v/WV5jPPNWxIh6980GtdlaJDyZu5JqgPQHKgsO0hG+QHG1zuCqjsnVXf0LqxDMj7gCw9jfyB13Q0Q4rqCGUQYDx64Ll01THqzg+2L6eXezHSpxgOeet8qKwnZn7PbB3zhzj0d4Udw6c1pe/mv9wB1WqKveq6rdjLrmz0ELiNQ2LRd//x7nZ6bTlOvNYzm/x/AiFBK9aNemaWgLPCjN+XxZg/31J3kfribxnScNuo/tfe/2lRFLzotXEPfQVQMI7AXQXGpmmN8yVynXilsuFt1mjjNCB9MNeFJWFWz3eyMbnGc/aLX6Y8aX363ccMZXaKA+6WfatvV13zU7zd7mcdf4xJ+fXrahFmD9ogRI0apECRvLgVPkQET/LKfnV16mduO256TeZeMLLT4l3569sVL3ah9HEftYzyE+4JHEgs+01F80A9wVPnJXuf1IYHlRGrvgvw6h5yrs7DV6sRhq9XaDeUSmEguUsZhJ+wGkMv4MNQhXRJ6LCQGT8GfGf6M8GdJcafwaYKW1p/x54mKJSj8EfghpyAr+DSlfPizwJ8bvObwWtZhYAIGF9UrxiWAL7IMvJKjWX0cgJIY/fEtPn7DnysZK8sc8Eu+e8kj3vm+pgvZ15a18GWuHWzpiDqoclfFLRdLzBnaOTotQHBZLpB5bTGtDfAZteqUd8ozat6prptHk6y1KE+maAqvcn57RWB+IOMih9cynuXwVcbLHO7JeJrDuYwjlPsRIeANjv2pjNsnETyiYu8RMBt4YOoJsJ4x1TOielZUz4TqCU90PR2sxwt1RS2qKKCKQiuK1WsrHpZ2Q9AoNYYZjGAJK5jCBMx9XHABX+AS6BoceACv4WsVo6LD4J79cs6Lswd5fKWNpccYcaLd5+Pe2HXZ18G4dBzTLizag+XrQA1mQ4yOgl9WPPMfSljysN1b9nlIMubXwXLYW6L2Pk2cVX/ZaDgrviQF8bJk+M/99/LMecvf5k6Iq+oh+mjzt/opxCesmIcQsNh4M4542Fv2R6aJ0bA3cl3tZjOiE6gVHzFY8BDGPLTGkSbOAt0qYeFxHBME/UV5OhhiDxd0xIiS4HodHvIlq7/SscaAzNhNpbrOe4MxBpW6NxgPXazzDpRQtzSYYSCEdHCvhNiQz1ivWKUmMuN4hG478RV/wFN4zc/9c8Pb9ehLGF/xc/8B7kjn/mtJOT6VOSYiGWFcVMzyVWe5p7O8kUiP5zygi3rGfATfeIJzNOV4vhfAF3RiusFoUiu45DdeSFbqjYZz7j+SZzd9LvL4pi9yRqfk9odz/6mMb/r4h20fLCEb95Z/zZ0U792GCQiDeuf+FSqisbWxN4ELfJjiDbwo8154/NowHs68358w96JH8//NFUP+tpZ8L/Q0m2rC3rxx3WPXFCFNH2JdnznzBr/2Qpi7/JrFNHzXRYzzPJwg7ViF+GcgjLFtcFY25HCF6DNvXLJDjF5tHNwmjYYz4SsG31zd6ynHISzopbfsT13MQUg1dSdDWKBnIZu6LhC6Yc9uTMn/HoC/8HnjUi8MnEj3y5B/yZ0prOCbhwlsY8yP5uTHSGtq7E0YOgPOe2Y8hzQeM0YaGSLHykYOXZCZ1fjN1XOCS3Ef4PdDvRTjqaP8Ri/iFVjn2V/vkDIYa2I2Q5CNz/A08rSI8Y8bnhZsxi9zB432chD1JaFV1r7Oike/mNZohBi3snTdGKghSnU9qiQhN2tPuwIbFkzn01VRRV7x3cwHM4xvQ8e/X3LnpENbEHOkl1faD33edc/iBeA857cviKq/q3bSdqvF4LGM7+XwEn838Omf5Ko3hDd5HZvaWNY7pXH6jYBDZ8vQXvlXZMmCDFlf+VJikpR94rXYen1YZ+gGOxnCkDHbWPxp3TI6zMqzT3l8noPktw9lHGz0BbEvbK8549uK0Yxa/Rwd36/lIEdyaAJb6Dg1VvqJSe8G2+nHZXp3tx7lv5NWBC58BeU/ljyFjJ/oO1Soh+kGCnrINjAu+4y1vs4d5A6vJWAMVkRL4V9IGKOvLJ0r0DrBm+Ef4rHWpeRjfMJxNaPt7rR7GW/3tO8nZRqVTS9N0z2J62IGr3Mn0o02I9rIqU1p2lT+S8lTo3Wa4fsLNAvcCP+J4jg6unaMn4DwFSa8xIRc8bbuH7ZB6Pgo1/E1qytEZmrnBkd9u8bRSwyqNc9yDKC6WKojZkfSfJ/fOZIFcyPcPh6kjMXTIi6A8HW9Nu4C5CWwa2zvRb2i2rVQ/YOBMlcKT8khxYfE+KvfCCBMRrcJSRFYSmkjYnDl4KUyBaz4GK5RLKyvKDI7L+Y2my/he6wlcInGRbd1VbWa5R6xSlFDks1/s90J25zP2C0VutB+GxeCYxxG6c+ksZKnx7cO/oEZg9cOJunKu2FduXbloD/+fcnxkP8QLUCwN+u145w7XeRUUfZBLxb2r2ZYi3DjLM/FWB1M6YamA7p78ahsphKjsJnuIT93WqwsujRhv8d3ru7aX/yT02IwpyrcLuwMfM5g3g/b6/W8j++7EuYqlZNsZa7WvVO59McUA3MO0i/06QPd6SnRWS4wMGuHUWN2hpA7iWnqEZxbvBICNa7miqqaQfdQ++Li63956O3jZqulq9ipwUA9mY0ui4NCqL2jq2f3uULBsdsIGYaEphobjZbBKmcbXXbwJapHGcX3HPIDsWr+TfHZ9yv99p1Km3WlzbiEW13przrA6owS/b905//zrrfqVlrkCkulz6qJWuJE2e3+9MPBbDfDYrvkZ7TLs5pu1023YzIjN603Gs6UY9Mw7Rf0UjCYmmqMXxW6c9DD75h9zk3fPCzGTqsv16psG+ZEE6ff7/uF1J23rkvKIHOnDKaMQeHxKZ6uTwkoHp9q6FR84Be8yhvBFdQj7NQj7OAIMbC4QVVN1Aq79JQHyHXPOcZunKK+yBrvH+jK6S/lafWmB/ZKDTAZt7V5eRY1bzSKvr6r97871rnVQc1j2TP6imb0zrCP62Ef47DxkPC/OOw/t4b9ZzXsD/+Xw/5QDtuMt1uPtxtbrdNw9UIquzE7LF1usB8V0Ss3iHx8ME+LOYaz3kOtXjtsi2I9Q9fHQvb7J40Qyh1K3xXPt3a6bWVf3dsTQ6yqAt9yZ2cvPAmq7Ce0FR9KP6lMsx84DKLevi1Bt1cVJeLfJnOsjnXIjfNf5Yli2m9zyW7f1D2Igo4ZvuEP7jlN/JhLfnh4jsqJT/hz7kSsEtmrHjS3BfY0cZ7m6DNaZTgBuzufnIjBl+2tK6pr69jpzXh7G73A20oO8AYHe+Y2WOUO2E+a2BEcooa+QYgZO+TIRPTDzkdtdr27Uxcqy0XZktbMFvs3RVqRptrt6WzBd+Hfqkdak+YTIs0lOSaMtokymug6Uz4m5dHUrvZaOch/GppbL60xPiUWHa224u9g6UnHMA4tHMZU8nOnzVDrC58cYukmJiksE1ZSc0ItIL4IC/Wjbme9PpQkR2GRfjMw4MW0syM8B5qP5I2B61G8m3KQ5bUyvriZX2SzYi9HsbBp4UlNC0+OYx15z18gOVvJHjOofC3RqBTTXXc45OeY+skxIWp64UkfP/XYnYxBT/o3KEd8kSBR5pAoZ2Aa4HWM/JhkHC3TYOoGLsyzkBt4akmE1/w1yfAo6YQnsIQLvNtBwlOQJOlQO0sUlajiC3y6c6aGhwQlWn6X39qGTk05T7pb0JlKF2fJaEd6C47jG5zTNZNsCM6i9mPAc8Wv+u7SsNM3i2nB2Cc7k4aygZxZGYteeWaFMQzrgppqR65dHifEro5Y7IXcBcFFqkp0ycVCjPbBAHkV0xc0f5/ypovEC5BS6L0mPLa6g6xY84d9QWWarsXgDYude87xPygThu65c4zfjnUwLwLQtF/B/78yPu0d4HkGYUuYzzf6SDwKTrRgWMeKIGBSCMzOcC9SeR5ui0UqLzF8tJclHtHAvQhWLwgUvWkFPLJWwHtrBTwsVwChf6jRH8cOj+C9XgAP7QXwqFoA7/2H+kj2BX+IjwS6J3rtVVYoL9jdNbJ9rvb9ZZIr3qEG3hFoanaFulfPDzy2xvbSPOdqA/fp+UW9uiN4R7QSHsNLPbb79tge67Hlir/UT2prNPvGUlLD742CgLJ3n93adk5iWRsBmNQoKHkNpNdFn3cajXGfYkvfIs9BxisrrU3Y1TW8JSndQkZKCv4pDVlob6jGYfkUtQKmydANX5S1mOV5w1zn3HFu6ppceolajPX7djo2uJVtT+uf7ByA3XZ5naLl/MWdHHUKWNv+AsoBsEprEgXtemrM6JoRfiaY3WEUrWyd1o8x2ZwQ78Hkz4qbOhzaaZthrDUxJmdYz3kYS+Om7+CDFrBcfm7ePlWpOOzy+ZvUvElVYVRXGMXV7qH0zOfq+zP/gxlX/3+d8e9Oz47dwJ6JmagKVexZCtt15mYNyubduZmov5sbU02rrqZltHljmxQQg7nyxlRn3zCZeKm88qaAu9E18mxK/kMjnjtjxSq+iDNn6uHWgLE4JdqwT1k8oQTTyrJWPNic7VaU7KkxTEkHib5jR/rLwWSIQQLBdSf6zGLCEw97D5UW4+/rSu1aLLaa2GXDKWuuY2mpVKMg2JEuoqC9F8SDBDdh6s4YQ23t2F3VxTtaCnssDB+EEsrK42MTHmcF0h9J/FuKtKvytCGtd6nEW0HCasHwUovdClbkD43KX0swL+TZLCbRE6012CGVuatFpUshvqdD1bKxSTyuh3NcDqdhi+Q4KFskr6NcN3B47G7jJZn7J8136+a7sZmEax6Cte1FwUn9xWtufQoD88lrVefIpQp+s32Jpn2R2qPcnnBz37Fl9eFoEzYSBq/Fer06NG7V1Jt+tX9eyTPqOaXEhBL0yNZrCtBjZntF1pnkyr0TNrWKT3To5P6SjhFyf2lM/tDDw1+Whw9kGXpBnsRLZh2pagzOtT8M/uEmJ6ClKDlgX5O7+yl+LEO147OHGXqCnKyEcbJCu1VMxjvjypsYJAgGDobjZ2eOyRNsZ6DwHF/wDjNsjRqKHUxxuelH3UPsFGa/Pq077XJhDMkO9jWAGSHXfjD1oDBhy78T8EimXlloGOWRWwXeY1mBrMS9MACvVR7yLsmQXeDyxbkyweaW31/JJtyNvWT3tL4yra/I1l/RBdMuKW7OOi2KH2SxZGdh1K3SDOe/XpO6wWSI2h30TsQJX5LtyIp+r7UfkH6moHUcDX6vLfskwrs6rjgRkgtpUuNZ+WTZKW2ZRV+gRYu+pOwCbUiq+D9AlVxAtBOh8ds/LT6I9KvZpC8GTf2ubZnK6ls71V85OlTFSFteLwX5i68EGWcnlXF2oSd1hgIojAj6Vrh1B0nXSNvOLQVPtK3cmMIeksugMa8bC16ARGM5kGQoZwVad9jtTJ/wWWYBTq28re92f5T3Cs+DmQmqilduMDTbxWjbZKcbGJPiKpJxGQi/JwwPZEXztWJqakNCwTzLreYTHWxjrQJNB+175xzz4bgxwk/HjZF9tZZleqYP5s+8KNZWgS/0VR4deJfvu+OQhx1Q/EVu7jh8JjEcND0+l9b9Gfq2EnOPhIAWo0jdpoj2MijDQjK2QU8XqrO2yS2zVtfEqD6ejXpeaZloMuBVU7Sf6Yz9KpbfQVlDsSB5zYThty5/yuie2VzMxKigi7O32zw1o2o0trotto6YH1u2BVjnu9xpRvAip6u7lrNZnRMPrUsbhFfS0RdffJDmGnrtioS/Fi7NlHOEl7sfJPpy4oMjVzLrmk3bhDGjAeQ3t8qvR1RdG2+NulDOLV3/67DbDajyhlxUTbJbuV6jM7HDtGlqwaU/Fxq+v0n7atVxGV5/fJqWtyuU1xCYWS/TvTGYi/hmNkM0hrGba/avwJU4gwJXYgAFrsRZWSm+VTfH5Fz5nxF2KXqQ4WgLXNk5FLiysegK9zxTtIyF+he6xQaM3DVMlwqzUY/7QblVHoZoEfKTjHPbWWfMwIAzpkuwxHrtCH6IATBKMOcYp7yXYmJSXd4uiavThj0IO35oRTnCSOE707zIs7FAewe6lvjgyMXwp6kczWY3t+l6neE1ZZtyHgx/6nK8ej2Z6QvtyJccWbp6onZmM9GzWVq/mWWkAZqXAE0QoBISDdAEASr3ADTBaABF9clLDECLLYBmBFBpA7T4e4BKAmiOiWkF0KwGaK0luwtHgln6bURrYh8wcwQmGqBp/Bb+E+kk5RIsaAkWO3UKObFWYIFR6a3QtPn2VYDfW17VJa2qGpLwf6pUY6zuoagAwarpZbfYKJpy3VpXfiNtoCvciZY8qM0D9HXXj0ezGcp/6HZ45+OHWXpB2+hDMf5RwT2fsWivELPExw68yCbLmeCj4kaODzC8hmo09N30dLE4cZ3f7xvyo/oehh/0g+d0E8Dtd2uJ921URxORzEZKHNXW7OWs7f96dPktXRzhPdrNMC6/e/loRWle2I5DvCVANRpHcjm/EDledn6zQEkDWdgvYnZm/qL9r8GJx7lz+0oSrtvX6OHdzHWkkBvB6Z5VoEvs4IOMBWYnIYJ3IUevoYy/xBg6VSSXRBtsHlrGSOS8iELaEWCoYx0sFwNI9XMiD2iO5IXtfl4XybmXa4Y874dtuvsigtzjYUcfH/Sz9Trrn6zX3UMMQtXt5+t1TqYzQR/t9fBT0E/X67TfWq+7HC/VCPGKhKoFnebk/KTcU2io5eALjBhwg6xX4c/xwuQC4161IigwgFIChRWCqEDbHST2WvrBVyj8+4JjihdC4f8qeOYeQ+H/bnL8ijn+wBy/6xx/Cu5gcnVPLe4dvLqVtSDpo8AAS8bovEx5bqX8TinXtON8ppYytwMFhmEqbch+xi+Y64Pg+gUbajSwavx9Tr/n4swpMGoTPtZksiz7Bjv+Srim+AvBmz/TRzS6KvwphhEq/Bu8z6Tw7ykuwbpwz4p1Y2BNYaaQ06ObQTkKPWS+pFEGBZcIjDmmwqCJJtoTRn4CNLIk5YSiwFaKAlthbCoecbTsE2ftY7zMF6WlMoUO22N9BK4w/pcX6Q4Sor6nEA1VKKo+f6WY7ZP1qoz6Y+L96OtcjcP8e2HfCXsnu2bVsICJNveQGntYN2buurVr0ElVLQ/vNPrwTqN3itxp+IXSt4FYDX++2/Bnuxa6n2qr4RfqbsM7ReyGMcAON/fSUjgdczNtJuEJ3mPqhvBMwQftIP/YyvqwypqgGw4E8LzK99LK90JtXXarMOdnhTdpbN04pi8kC3QYnw1zMEwdRfGpVn+gqRTiBEYB4Xj167WAFyYIwKXiT+VAUKS83yk6iZXwKyZcWAl/YMIXK+FPHRCQOpKVQRPpj6h80SlCgHFIX1bBG0jP4N+IMmoT3uZh4vFBecu612JAEdzAazEWey3STeTQBQld5Df/kvGfEp7I+JnEzRs5gB6JEqs8VaOLGXJW5aMWoXIxmpgP5aO/SBfi3TTPlpdTB5kNZAp+sFf+eCssRRBnK7EiGX+/A5aJnZaV3InD9n+635Gb2WG4veXV+7Nltru7yxl6ZbhRD0+qKwqX63opTMsN7hW53lTITy8703Y32lFt9+ZX3RAJw1s7qvEDx2jiSLe8sFPFFfciDBMLuX8lTT9AcU8Z8yjedh3V77eYznAYQqvbpz0ZvYBZrwwgTNpFC4KYpas310xT61pXiH4/qPTTcRpzCgeogw6STu5CcAV36X4l4TsVdb/W1P2afknV9g+K1buG8kfS2jpUfedD2Ci3BonCBQ2uBroiI6UQlJ+YvwWdsym0qaXcpHsw95tPxEwocYBRCPHiburrpe44mZN/QYt5VT3dyCpNaolCH+IZmmP9YoBkqVckrtL3Oa7Sh/nGEKftRaq+t0jVDxcpVtb7f/5f")),r=>r({workerURI:r=>{const t="text/javascript";let f=s();if("string"==typeof f&&(f=(new TextEncoder).encode(f)),r){const r=new Blob([f],{type:t});return URL.createObjectURL(r)}return "data:"+t+";base64,"+(r=>{let t="";const f=r.length;let n=0;for(;f>n+2;n+=3){const f=r[n]<<16|r[n+1]<<8|r[n+2];t+=W$1[f>>18&63]+W$1[f>>12&63]+W$1[f>>6&63]+W$1[63&f];}const c=f-n;if(1===c){const f=r[n]<<16;t+=W$1[f>>18&63]+W$1[f>>12&63]+"==";}else if(2===c){const f=r[n]<<16|r[n+1]<<8;t+=W$1[f>>18&63]+W$1[f>>12&63]+W$1[f>>6&63]+"=";}return t})(f)}}));var s;
|
|
243
245
|
|
|
244
246
|
/*
|
|
245
|
-
Copyright (c)
|
|
247
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
246
248
|
|
|
247
249
|
Redistribution and use in source and binary forms, with or without
|
|
248
250
|
modification, are permitted provided that the following conditions are met:
|
|
@@ -270,72 +272,19 @@ const r=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,1
|
|
|
270
272
|
*/
|
|
271
273
|
|
|
272
274
|
|
|
273
|
-
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
const RESERVED_COMPRESSION_METHODS = [
|
|
279
|
-
COMPRESSION_METHOD_STORE,
|
|
280
|
-
COMPRESSION_METHOD_DEFLATE,
|
|
281
|
-
COMPRESSION_METHOD_DEFLATE_64,
|
|
282
|
-
COMPRESSION_METHOD_AES
|
|
283
|
-
];
|
|
284
|
-
|
|
285
|
-
const registeredCodecs = new Map();
|
|
286
|
-
const codecStreams = new Map();
|
|
287
|
-
|
|
288
|
-
function registerCodec(codec = {}) {
|
|
289
|
-
const { compressionMethod, format, codecURI, CompressionStream, DecompressionStream, versionNeeded } = codec;
|
|
290
|
-
if (!Number.isInteger(compressionMethod) || compressionMethod < 0 || compressionMethod > MAX_16_BITS ||
|
|
291
|
-
typeof format != STRING_TYPE || !format.length) {
|
|
292
|
-
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
293
|
-
}
|
|
294
|
-
if (RESERVED_COMPRESSION_METHODS.includes(compressionMethod)) {
|
|
295
|
-
throw new Error(ERR_RESERVED_COMPRESSION_METHOD);
|
|
296
|
-
}
|
|
297
|
-
const hasStreams = typeof CompressionStream == FUNCTION_TYPE || typeof DecompressionStream == FUNCTION_TYPE;
|
|
298
|
-
if (!hasStreams && (typeof codecURI != STRING_TYPE || !codecURI.length)) {
|
|
299
|
-
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
300
|
-
}
|
|
301
|
-
registeredCodecs.set(compressionMethod, { compressionMethod, format, codecURI, versionNeeded });
|
|
302
|
-
if (hasStreams) {
|
|
303
|
-
setCodecStreams(format, { CompressionStream, DecompressionStream });
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
function unregisterCodec(compressionMethod) {
|
|
308
|
-
const codec = registeredCodecs.get(compressionMethod);
|
|
309
|
-
if (codec) {
|
|
310
|
-
registeredCodecs.delete(compressionMethod);
|
|
311
|
-
let formatUsed;
|
|
312
|
-
registeredCodecs.forEach(otherCodec => formatUsed = formatUsed || otherCodec.format == codec.format);
|
|
313
|
-
if (!formatUsed) {
|
|
314
|
-
codecStreams.delete(codec.format);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
function getRegisteredCodec(compressionMethod) {
|
|
320
|
-
return registeredCodecs.get(compressionMethod);
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
function getCodecStreams(format) {
|
|
324
|
-
return codecStreams.get(format);
|
|
275
|
+
function concat(first, second) {
|
|
276
|
+
const result = new Uint8Array(first.length + second.length);
|
|
277
|
+
result.set(first);
|
|
278
|
+
result.set(second, first.length);
|
|
279
|
+
return result;
|
|
325
280
|
}
|
|
326
281
|
|
|
327
|
-
function
|
|
328
|
-
|
|
329
|
-
if (typeof CompressionStream != FUNCTION_TYPE && typeof DecompressionStream != FUNCTION_TYPE) {
|
|
330
|
-
throw new Error(ERR_INVALID_CODEC_MODULE);
|
|
331
|
-
}
|
|
332
|
-
codecStreams.set(format, { CompressionStream, DecompressionStream });
|
|
282
|
+
function toExactUint8Array(array) {
|
|
283
|
+
return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
|
|
333
284
|
}
|
|
334
285
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
setCodecStreams(format, await import(/* webpackIgnore: true */ /* @vite-ignore */ codecURI));
|
|
338
|
-
}
|
|
286
|
+
function getDataView(array) {
|
|
287
|
+
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
339
288
|
}
|
|
340
289
|
|
|
341
290
|
/*
|
|
@@ -520,50 +469,6 @@ function encodeText(value) {
|
|
|
520
469
|
}
|
|
521
470
|
}
|
|
522
471
|
|
|
523
|
-
/*
|
|
524
|
-
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
525
|
-
|
|
526
|
-
Redistribution and use in source and binary forms, with or without
|
|
527
|
-
modification, are permitted provided that the following conditions are met:
|
|
528
|
-
|
|
529
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
530
|
-
this list of conditions and the following disclaimer.
|
|
531
|
-
|
|
532
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
533
|
-
notice, this list of conditions and the following disclaimer in
|
|
534
|
-
the documentation and/or other materials provided with the distribution.
|
|
535
|
-
|
|
536
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
537
|
-
derived from this software without specific prior written permission.
|
|
538
|
-
|
|
539
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
540
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
541
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
542
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
543
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
544
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
545
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
546
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
547
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
548
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
549
|
-
*/
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
function concat(first, second) {
|
|
553
|
-
const result = new Uint8Array(first.length + second.length);
|
|
554
|
-
result.set(first);
|
|
555
|
-
result.set(second, first.length);
|
|
556
|
-
return result;
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
function toExactUint8Array(array) {
|
|
560
|
-
return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
function getDataView(array) {
|
|
564
|
-
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
565
|
-
}
|
|
566
|
-
|
|
567
472
|
// Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
|
|
568
473
|
|
|
569
474
|
// deno-lint-ignore-file no-this-alias
|
|
@@ -1933,6 +1838,102 @@ function toCompatibleWritable(writable) {
|
|
|
1933
1838
|
});
|
|
1934
1839
|
}
|
|
1935
1840
|
|
|
1841
|
+
/*
|
|
1842
|
+
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
1843
|
+
|
|
1844
|
+
Redistribution and use in source and binary forms, with or without
|
|
1845
|
+
modification, are permitted provided that the following conditions are met:
|
|
1846
|
+
|
|
1847
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
1848
|
+
this list of conditions and the following disclaimer.
|
|
1849
|
+
|
|
1850
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
1851
|
+
notice, this list of conditions and the following disclaimer in
|
|
1852
|
+
the documentation and/or other materials provided with the distribution.
|
|
1853
|
+
|
|
1854
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
1855
|
+
derived from this software without specific prior written permission.
|
|
1856
|
+
|
|
1857
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
1858
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
1859
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
1860
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
1861
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
1862
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
1863
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
1864
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
1865
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
1866
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
1867
|
+
*/
|
|
1868
|
+
|
|
1869
|
+
|
|
1870
|
+
const ERR_INVALID_CODEC_DEFINITION = "Invalid codec definition";
|
|
1871
|
+
const ERR_RESERVED_COMPRESSION_METHOD = "Reserved compression method";
|
|
1872
|
+
const ERR_INVALID_CODEC_MODULE = "Invalid codec module";
|
|
1873
|
+
|
|
1874
|
+
const RESERVED_COMPRESSION_METHODS = [
|
|
1875
|
+
COMPRESSION_METHOD_STORE,
|
|
1876
|
+
COMPRESSION_METHOD_DEFLATE,
|
|
1877
|
+
COMPRESSION_METHOD_DEFLATE_64,
|
|
1878
|
+
COMPRESSION_METHOD_AES
|
|
1879
|
+
];
|
|
1880
|
+
|
|
1881
|
+
const registeredCodecs = new Map();
|
|
1882
|
+
const codecStreams = new Map();
|
|
1883
|
+
|
|
1884
|
+
function registerCodec(codec = {}) {
|
|
1885
|
+
const { compressionMethod, format, codecURI, CompressionStream, DecompressionStream, versionNeeded } = codec;
|
|
1886
|
+
if (!Number.isInteger(compressionMethod) || compressionMethod < 0 || compressionMethod > MAX_16_BITS ||
|
|
1887
|
+
typeof format != STRING_TYPE || !format.length) {
|
|
1888
|
+
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
1889
|
+
}
|
|
1890
|
+
if (RESERVED_COMPRESSION_METHODS.includes(compressionMethod)) {
|
|
1891
|
+
throw new Error(ERR_RESERVED_COMPRESSION_METHOD);
|
|
1892
|
+
}
|
|
1893
|
+
const hasStreams = typeof CompressionStream == FUNCTION_TYPE || typeof DecompressionStream == FUNCTION_TYPE;
|
|
1894
|
+
if (!hasStreams && (typeof codecURI != STRING_TYPE || !codecURI.length)) {
|
|
1895
|
+
throw new Error(ERR_INVALID_CODEC_DEFINITION);
|
|
1896
|
+
}
|
|
1897
|
+
registeredCodecs.set(compressionMethod, { compressionMethod, format, codecURI, versionNeeded });
|
|
1898
|
+
if (hasStreams) {
|
|
1899
|
+
setCodecStreams(format, { CompressionStream, DecompressionStream });
|
|
1900
|
+
}
|
|
1901
|
+
}
|
|
1902
|
+
|
|
1903
|
+
function unregisterCodec(compressionMethod) {
|
|
1904
|
+
const codec = registeredCodecs.get(compressionMethod);
|
|
1905
|
+
if (codec) {
|
|
1906
|
+
registeredCodecs.delete(compressionMethod);
|
|
1907
|
+
let formatUsed;
|
|
1908
|
+
registeredCodecs.forEach(otherCodec => formatUsed = formatUsed || otherCodec.format == codec.format);
|
|
1909
|
+
if (!formatUsed) {
|
|
1910
|
+
codecStreams.delete(codec.format);
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1914
|
+
|
|
1915
|
+
function getRegisteredCodec(compressionMethod) {
|
|
1916
|
+
return registeredCodecs.get(compressionMethod);
|
|
1917
|
+
}
|
|
1918
|
+
|
|
1919
|
+
function getCodecStreams(format) {
|
|
1920
|
+
return codecStreams.get(format);
|
|
1921
|
+
}
|
|
1922
|
+
|
|
1923
|
+
function setCodecStreams(format, streams) {
|
|
1924
|
+
const { CompressionStream, DecompressionStream } = streams;
|
|
1925
|
+
if (typeof CompressionStream != FUNCTION_TYPE && typeof DecompressionStream != FUNCTION_TYPE) {
|
|
1926
|
+
throw new Error(ERR_INVALID_CODEC_MODULE);
|
|
1927
|
+
}
|
|
1928
|
+
codecStreams.set(format, { CompressionStream, DecompressionStream });
|
|
1929
|
+
}
|
|
1930
|
+
|
|
1931
|
+
async function ensureCodecStreams(format, codecURI) {
|
|
1932
|
+
if (!codecStreams.has(format) && codecURI) {
|
|
1933
|
+
setCodecStreams(format, await import(/* webpackIgnore: true */ /* @vite-ignore */ codecURI));
|
|
1934
|
+
}
|
|
1935
|
+
}
|
|
1936
|
+
|
|
1936
1937
|
/*
|
|
1937
1938
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
1938
1939
|
|
|
@@ -2486,8 +2487,8 @@ class ChunkStream extends TransformStream {
|
|
|
2486
2487
|
1. Redistributions of source code must retain the above copyright notice,
|
|
2487
2488
|
this list of conditions and the following disclaimer.
|
|
2488
2489
|
|
|
2489
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
2490
|
-
notice, this list of conditions and the following disclaimer in
|
|
2490
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
2491
|
+
notice, this list of conditions and the following disclaimer in
|
|
2491
2492
|
the documentation and/or other materials provided with the distribution.
|
|
2492
2493
|
|
|
2493
2494
|
3. The names of the authors may not be used to endorse or promote products
|
|
@@ -2506,20 +2507,15 @@ class ChunkStream extends TransformStream {
|
|
|
2506
2507
|
*/
|
|
2507
2508
|
|
|
2508
2509
|
|
|
2509
|
-
const MODULE_WORKER_OPTIONS = { type: "module" };
|
|
2510
|
-
const ERROR_EVENT_TYPE = "error";
|
|
2511
|
-
const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
|
|
2512
2510
|
const ERR_WORKER_STARTUP_TIMEOUT = "Worker startup timeout";
|
|
2513
2511
|
|
|
2514
|
-
let webWorkerSupported,
|
|
2515
|
-
let transferStreamsSupported = true;
|
|
2516
|
-
try {
|
|
2517
|
-
transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
|
|
2518
|
-
} catch {
|
|
2519
|
-
// ignored
|
|
2520
|
-
}
|
|
2512
|
+
let webWorkerSupported, createWorkerFailed, webWorkerBackend;
|
|
2521
2513
|
let initModule = () => { };
|
|
2522
2514
|
|
|
2515
|
+
function setWebWorkerBackend(backend) {
|
|
2516
|
+
webWorkerBackend = backend;
|
|
2517
|
+
}
|
|
2518
|
+
|
|
2523
2519
|
async function supportsDeflate(config) {
|
|
2524
2520
|
const { CompressionStream: NativeStream, CompressionStreamFallback: FallbackStream } = config;
|
|
2525
2521
|
if (FallbackStream && !FallbackStream.requiresModule) {
|
|
@@ -2544,6 +2540,14 @@ function resetWebWorkerSupport() {
|
|
|
2544
2540
|
createWorkerFailed = false;
|
|
2545
2541
|
}
|
|
2546
2542
|
|
|
2543
|
+
function disableWebWorker(workerData) {
|
|
2544
|
+
if (workerData.createWorker) {
|
|
2545
|
+
createWorkerFailed = true;
|
|
2546
|
+
} else {
|
|
2547
|
+
webWorkerSupported = false;
|
|
2548
|
+
}
|
|
2549
|
+
}
|
|
2550
|
+
|
|
2547
2551
|
class CodecWorker {
|
|
2548
2552
|
|
|
2549
2553
|
constructor(workerData, { readable, writable }, { options, config, streamOptions, useWebWorkers, transferStreams, workerURI, createWorker }, onTaskFinished) {
|
|
@@ -2596,7 +2600,7 @@ class CodecWorker {
|
|
|
2596
2600
|
// deno-lint-ignore valid-typeof
|
|
2597
2601
|
webWorkerSupported = typeof Worker != UNDEFINED_TYPE;
|
|
2598
2602
|
}
|
|
2599
|
-
return (useWebWorkers && ((webWorkerSupported && workerURI) || createWorker) ?
|
|
2603
|
+
return (useWebWorkers && webWorkerBackend && ((webWorkerSupported && workerURI) || createWorker) ? webWorkerBackend : createWorkerInterface)(workerData, config);
|
|
2600
2604
|
}
|
|
2601
2605
|
}
|
|
2602
2606
|
|
|
@@ -2640,60 +2644,6 @@ function createWorkerInterface(workerData, config) {
|
|
|
2640
2644
|
};
|
|
2641
2645
|
}
|
|
2642
2646
|
|
|
2643
|
-
function createWebWorkerInterface(workerData, config) {
|
|
2644
|
-
const { baseURI, chunkSize, workerStartupTimeout } = config;
|
|
2645
|
-
let { wasmURI } = config;
|
|
2646
|
-
|
|
2647
|
-
if (!workerData.interface) {
|
|
2648
|
-
// deno-lint-ignore valid-typeof
|
|
2649
|
-
if (typeof wasmURI == FUNCTION_TYPE) {
|
|
2650
|
-
wasmURI = wasmURI();
|
|
2651
|
-
}
|
|
2652
|
-
let worker;
|
|
2653
|
-
try {
|
|
2654
|
-
worker = getWebWorker(workerData.workerURI, baseURI, workerData);
|
|
2655
|
-
} catch {
|
|
2656
|
-
if (workerData.createWorker) {
|
|
2657
|
-
createWorkerFailed = true;
|
|
2658
|
-
} else {
|
|
2659
|
-
webWorkerSupported = false;
|
|
2660
|
-
}
|
|
2661
|
-
return createWorkerInterface(workerData, config);
|
|
2662
|
-
}
|
|
2663
|
-
Object.assign(workerData, {
|
|
2664
|
-
worker,
|
|
2665
|
-
workerAlive: false,
|
|
2666
|
-
terminated: false,
|
|
2667
|
-
interface: {
|
|
2668
|
-
run: async () => {
|
|
2669
|
-
try {
|
|
2670
|
-
return await runWebWorker(workerData, { chunkSize, wasmURI, baseURI, workerStartupTimeout });
|
|
2671
|
-
} catch (error) {
|
|
2672
|
-
if (error && error.workerStartupFailed) {
|
|
2673
|
-
if (workerData.createWorker) {
|
|
2674
|
-
createWorkerFailed = true;
|
|
2675
|
-
} else {
|
|
2676
|
-
webWorkerSupported = false;
|
|
2677
|
-
}
|
|
2678
|
-
releaseWorkerStreams(workerData);
|
|
2679
|
-
return runWorker$1(workerData, config);
|
|
2680
|
-
}
|
|
2681
|
-
if (error && error.codecImportFailed) {
|
|
2682
|
-
if (workerData.reader) {
|
|
2683
|
-
releaseWorkerStreams(workerData);
|
|
2684
|
-
return runWorker$1(workerData, config);
|
|
2685
|
-
}
|
|
2686
|
-
workerData.onTaskFinished();
|
|
2687
|
-
}
|
|
2688
|
-
throw error;
|
|
2689
|
-
}
|
|
2690
|
-
}
|
|
2691
|
-
}
|
|
2692
|
-
});
|
|
2693
|
-
}
|
|
2694
|
-
return workerData.interface;
|
|
2695
|
-
}
|
|
2696
|
-
|
|
2697
2647
|
async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
|
|
2698
2648
|
let codecStream;
|
|
2699
2649
|
try {
|
|
@@ -2742,6 +2692,95 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
|
|
|
2742
2692
|
}
|
|
2743
2693
|
}
|
|
2744
2694
|
|
|
2695
|
+
/*
|
|
2696
|
+
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
2697
|
+
|
|
2698
|
+
Redistribution and use in source and binary forms, with or without
|
|
2699
|
+
modification, are permitted provided that the following conditions are met:
|
|
2700
|
+
|
|
2701
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
2702
|
+
this list of conditions and the following disclaimer.
|
|
2703
|
+
|
|
2704
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
2705
|
+
notice, this list of conditions and the following disclaimer in
|
|
2706
|
+
the documentation and/or other materials provided with the distribution.
|
|
2707
|
+
|
|
2708
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
2709
|
+
derived from this software without specific prior written permission.
|
|
2710
|
+
|
|
2711
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
2712
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
2713
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
2714
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
2715
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
2716
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
2717
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
2718
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
2719
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
2720
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
2721
|
+
*/
|
|
2722
|
+
|
|
2723
|
+
|
|
2724
|
+
const MODULE_WORKER_OPTIONS = { type: "module" };
|
|
2725
|
+
const ERROR_EVENT_TYPE = "error";
|
|
2726
|
+
const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
|
|
2727
|
+
|
|
2728
|
+
let webWorkerSource, webWorkerURI, webWorkerOptions;
|
|
2729
|
+
let transferStreamsSupported = true;
|
|
2730
|
+
try {
|
|
2731
|
+
transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
|
|
2732
|
+
} catch {
|
|
2733
|
+
// ignored
|
|
2734
|
+
}
|
|
2735
|
+
|
|
2736
|
+
setWebWorkerBackend(createWebWorkerInterface);
|
|
2737
|
+
|
|
2738
|
+
function createWebWorkerInterface(workerData, config) {
|
|
2739
|
+
const { baseURI, chunkSize, workerStartupTimeout } = config;
|
|
2740
|
+
let { wasmURI } = config;
|
|
2741
|
+
|
|
2742
|
+
if (!workerData.interface) {
|
|
2743
|
+
// deno-lint-ignore valid-typeof
|
|
2744
|
+
if (typeof wasmURI == FUNCTION_TYPE) {
|
|
2745
|
+
wasmURI = wasmURI();
|
|
2746
|
+
}
|
|
2747
|
+
let worker;
|
|
2748
|
+
try {
|
|
2749
|
+
worker = getWebWorker(workerData.workerURI, baseURI, workerData);
|
|
2750
|
+
} catch {
|
|
2751
|
+
disableWebWorker(workerData);
|
|
2752
|
+
return createWorkerInterface(workerData, config);
|
|
2753
|
+
}
|
|
2754
|
+
Object.assign(workerData, {
|
|
2755
|
+
worker,
|
|
2756
|
+
workerAlive: false,
|
|
2757
|
+
terminated: false,
|
|
2758
|
+
interface: {
|
|
2759
|
+
run: async () => {
|
|
2760
|
+
try {
|
|
2761
|
+
return await runWebWorker(workerData, { chunkSize, wasmURI, baseURI, workerStartupTimeout });
|
|
2762
|
+
} catch (error) {
|
|
2763
|
+
if (error && error.workerStartupFailed) {
|
|
2764
|
+
disableWebWorker(workerData);
|
|
2765
|
+
releaseWorkerStreams(workerData);
|
|
2766
|
+
return runWorker$1(workerData, config);
|
|
2767
|
+
}
|
|
2768
|
+
if (error && error.codecImportFailed) {
|
|
2769
|
+
if (workerData.reader) {
|
|
2770
|
+
releaseWorkerStreams(workerData);
|
|
2771
|
+
return runWorker$1(workerData, config);
|
|
2772
|
+
}
|
|
2773
|
+
workerData.onTaskFinished();
|
|
2774
|
+
}
|
|
2775
|
+
throw error;
|
|
2776
|
+
}
|
|
2777
|
+
}
|
|
2778
|
+
}
|
|
2779
|
+
});
|
|
2780
|
+
}
|
|
2781
|
+
return workerData.interface;
|
|
2782
|
+
}
|
|
2783
|
+
|
|
2745
2784
|
async function runWebWorker(workerData, config) {
|
|
2746
2785
|
let resolveResult, rejectResult;
|
|
2747
2786
|
const result = new Promise((resolve, reject) => {
|
|
@@ -3618,7 +3657,7 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
|
|
|
3618
3657
|
forceRangeRequests,
|
|
3619
3658
|
combineSizeEocd
|
|
3620
3659
|
} = httpReader;
|
|
3621
|
-
if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest ==
|
|
3660
|
+
if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest == UNDEFINED_TYPE || preventHeadRequest)) {
|
|
3622
3661
|
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -END_OF_CENTRAL_DIR_LENGTH : undefined));
|
|
3623
3662
|
const acceptRanges = response.headers.get(HTTP_HEADER_ACCEPT_RANGES);
|
|
3624
3663
|
if (!forceRangeRequests && (!acceptRanges || acceptRanges.toLowerCase() != HTTP_RANGE_UNIT)) {
|
|
@@ -4471,9 +4510,13 @@ const OPTION_USDZ = "usdz";
|
|
|
4471
4510
|
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
4472
4511
|
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
4473
4512
|
const OPTION_STRICTNESS = "strictness";
|
|
4513
|
+
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
4514
|
+
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
4474
4515
|
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
4475
4516
|
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
4476
4517
|
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
4518
|
+
const TEXT_TYPE_FILENAME = "filename";
|
|
4519
|
+
const TEXT_TYPE_COMMENT = "comment";
|
|
4477
4520
|
const STRICTNESS_STRICT = "strict";
|
|
4478
4521
|
const STRICTNESS_BALANCED = "balanced";
|
|
4479
4522
|
const STRICTNESS_TOLERANT = "tolerant";
|
|
@@ -4520,6 +4563,11 @@ const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
|
4520
4563
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
4521
4564
|
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
4522
4565
|
const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
|
|
4566
|
+
const ERR_UNSAFE_FILENAME = "Unsafe filename";
|
|
4567
|
+
const ERR_INVALID_STRICTNESS = "Invalid strictness (must be 'strict', 'balanced' or 'tolerant')";
|
|
4568
|
+
const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
|
|
4569
|
+
const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
|
|
4570
|
+
const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
|
|
4523
4571
|
const CHARSET_UTF8 = "utf-8";
|
|
4524
4572
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
4525
4573
|
const CHARSET_CP437 = "cp437";
|
|
@@ -4541,6 +4589,10 @@ const ZIP64_EXTRACTION = {
|
|
|
4541
4589
|
bytes: 8
|
|
4542
4590
|
}
|
|
4543
4591
|
};
|
|
4592
|
+
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
4593
|
+
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
4594
|
+
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
4595
|
+
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
4544
4596
|
|
|
4545
4597
|
class ZipReader {
|
|
4546
4598
|
|
|
@@ -4569,6 +4621,8 @@ class ZipReader {
|
|
|
4569
4621
|
const checkAmbiguity = strictness == STRICTNESS_STRICT;
|
|
4570
4622
|
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
4571
4623
|
const maxAppendedDataSize = getMaxAppendedDataSize(getOptionValue$1(zipReader, options, OPTION_MAX_APPENDED_DATA_SIZE), strictness);
|
|
4624
|
+
const filenameValidation = getFilenameValidation(getOptionValue$1(zipReader, options, OPTION_FILENAME_VALIDATION), strictness);
|
|
4625
|
+
const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
|
|
4572
4626
|
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
4573
4627
|
if (!endOfDirectoryInfo) {
|
|
4574
4628
|
const signatureArray = await readUint8Array(reader, 0, 4);
|
|
@@ -4762,11 +4816,22 @@ class ZipReader {
|
|
|
4762
4816
|
const decode = getOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
4763
4817
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
4764
4818
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
4765
|
-
let filename = decode(rawFilename, rawFilenameEncoding);
|
|
4819
|
+
let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
|
|
4766
4820
|
if (filename === UNDEFINED_VALUE) {
|
|
4767
4821
|
filename = decodeText(rawFilename, rawFilenameEncoding);
|
|
4768
4822
|
}
|
|
4769
|
-
|
|
4823
|
+
if (normalizeFilename) {
|
|
4824
|
+
const normalizedFilename = normalizeFilename(filename);
|
|
4825
|
+
if (normalizedFilename !== UNDEFINED_VALUE) {
|
|
4826
|
+
filename = normalizedFilename;
|
|
4827
|
+
}
|
|
4828
|
+
}
|
|
4829
|
+
if (isUnsafeFilename(filename, filenameValidation)) {
|
|
4830
|
+
const error = new Error(ERR_UNSAFE_FILENAME);
|
|
4831
|
+
error.filename = filename;
|
|
4832
|
+
throw error;
|
|
4833
|
+
}
|
|
4834
|
+
let comment = decode(rawComment, rawCommentEncoding, TEXT_TYPE_COMMENT);
|
|
4770
4835
|
if (comment === UNDEFINED_VALUE) {
|
|
4771
4836
|
comment = decodeText(rawComment, rawCommentEncoding);
|
|
4772
4837
|
}
|
|
@@ -4827,10 +4892,10 @@ class ZipReader {
|
|
|
4827
4892
|
entry.getData = (writer, options) => fileEntry.getData(writer, entry, zipReader.readRanges, options);
|
|
4828
4893
|
entry.arrayBuffer = async options => {
|
|
4829
4894
|
const writer = new TransformStream();
|
|
4830
|
-
const
|
|
4831
|
-
|
|
4832
|
-
|
|
4833
|
-
return
|
|
4895
|
+
const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
|
|
4896
|
+
arrayBufferPromise.catch(() => { });
|
|
4897
|
+
await fileEntry.getData(writer, entry, zipReader.readRanges, options);
|
|
4898
|
+
return arrayBufferPromise;
|
|
4834
4899
|
};
|
|
4835
4900
|
offset = endOffset;
|
|
4836
4901
|
const { onprogress } = options;
|
|
@@ -5081,7 +5146,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5081
5146
|
readRanges
|
|
5082
5147
|
});
|
|
5083
5148
|
}
|
|
5084
|
-
let writable;
|
|
5149
|
+
let writable, abortError;
|
|
5085
5150
|
try {
|
|
5086
5151
|
if (!checkOverlappingEntryOnly) {
|
|
5087
5152
|
if (checkPasswordOnly) {
|
|
@@ -5101,12 +5166,22 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5101
5166
|
writer.size += error.outputSize;
|
|
5102
5167
|
}
|
|
5103
5168
|
if (!checkPasswordOnly || error.message != ERR_ABORT_CHECK_PASSWORD) {
|
|
5169
|
+
abortError = error;
|
|
5104
5170
|
throw error;
|
|
5105
5171
|
}
|
|
5106
5172
|
} finally {
|
|
5107
5173
|
const preventClose = getOptionValue$1(zipEntry, options, OPTION_PREVENT_CLOSE);
|
|
5108
5174
|
if (!preventClose && writable && !writable.locked) {
|
|
5109
|
-
|
|
5175
|
+
const writableWriter = writable.getWriter();
|
|
5176
|
+
if (abortError) {
|
|
5177
|
+
try {
|
|
5178
|
+
await writableWriter.abort(abortError);
|
|
5179
|
+
} catch {
|
|
5180
|
+
// the error being propagated is more relevant; ignored
|
|
5181
|
+
}
|
|
5182
|
+
} else {
|
|
5183
|
+
await writableWriter.close();
|
|
5184
|
+
}
|
|
5110
5185
|
}
|
|
5111
5186
|
}
|
|
5112
5187
|
return checkPasswordOnly || checkOverlappingEntryOnly ? UNDEFINED_VALUE : writer.getData ? writer.getData() : writable;
|
|
@@ -5486,16 +5561,51 @@ function getDiskOffset$1(reader, diskNumber) {
|
|
|
5486
5561
|
return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
|
|
5487
5562
|
}
|
|
5488
5563
|
|
|
5564
|
+
function isStrictnessValue(value) {
|
|
5565
|
+
return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
|
|
5566
|
+
}
|
|
5567
|
+
|
|
5489
5568
|
function getStrictness(strictness, checkAmbiguity) {
|
|
5490
5569
|
if (strictness === UNDEFINED_VALUE) {
|
|
5491
5570
|
return checkAmbiguity ? STRICTNESS_STRICT : STRICTNESS_BALANCED;
|
|
5492
5571
|
}
|
|
5572
|
+
if (!isStrictnessValue(strictness)) {
|
|
5573
|
+
throw new Error(ERR_INVALID_STRICTNESS);
|
|
5574
|
+
}
|
|
5493
5575
|
return strictness;
|
|
5494
5576
|
}
|
|
5495
5577
|
|
|
5578
|
+
function getFilenameValidation(filenameValidation, strictness) {
|
|
5579
|
+
if (filenameValidation === UNDEFINED_VALUE) {
|
|
5580
|
+
return strictness;
|
|
5581
|
+
}
|
|
5582
|
+
if (!isStrictnessValue(filenameValidation)) {
|
|
5583
|
+
throw new Error(ERR_INVALID_FILENAME_VALIDATION);
|
|
5584
|
+
}
|
|
5585
|
+
return filenameValidation;
|
|
5586
|
+
}
|
|
5587
|
+
|
|
5588
|
+
function isUnsafeFilename(filename, filenameValidation) {
|
|
5589
|
+
if (filenameValidation == STRICTNESS_TOLERANT) {
|
|
5590
|
+
return false;
|
|
5591
|
+
}
|
|
5592
|
+
const pathParts = filename.split("/");
|
|
5593
|
+
if (pathParts.length > 1 && pathParts[pathParts.length - 1] === "") {
|
|
5594
|
+
pathParts.pop();
|
|
5595
|
+
}
|
|
5596
|
+
if (pathParts.includes("..") || filename.startsWith("/") || filename.startsWith("\\\\") || DRIVE_LETTER_REGEXP.test(filename)) {
|
|
5597
|
+
return true;
|
|
5598
|
+
}
|
|
5599
|
+
return filenameValidation == STRICTNESS_STRICT && (pathParts.includes(".") || pathParts.includes(""));
|
|
5600
|
+
}
|
|
5601
|
+
|
|
5496
5602
|
function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
|
|
5497
5603
|
if (maxAppendedDataSize !== UNDEFINED_VALUE) {
|
|
5498
|
-
|
|
5604
|
+
const size = toNumber$1(maxAppendedDataSize);
|
|
5605
|
+
if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
|
|
5606
|
+
throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
|
|
5607
|
+
}
|
|
5608
|
+
return size;
|
|
5499
5609
|
}
|
|
5500
5610
|
if (strictness == STRICTNESS_STRICT) {
|
|
5501
5611
|
return 0;
|
|
@@ -5506,12 +5616,6 @@ function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
|
|
|
5506
5616
|
return MAX_16_BITS;
|
|
5507
5617
|
}
|
|
5508
5618
|
|
|
5509
|
-
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
5510
|
-
|
|
5511
|
-
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
5512
|
-
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
5513
|
-
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
5514
|
-
|
|
5515
5619
|
async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDataSize) {
|
|
5516
5620
|
const { size } = reader;
|
|
5517
5621
|
const anchoredLength = Math.min(size, END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS);
|
|
@@ -5647,6 +5751,10 @@ function getOptionValue$1(zipReader, options, name) {
|
|
|
5647
5751
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
5648
5752
|
}
|
|
5649
5753
|
|
|
5754
|
+
function toNumber$1(value) {
|
|
5755
|
+
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
5756
|
+
}
|
|
5757
|
+
|
|
5650
5758
|
function getDate(timeRaw) {
|
|
5651
5759
|
const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
|
|
5652
5760
|
return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
|
|
@@ -5685,12 +5793,16 @@ var zipReader = /*#__PURE__*/Object.freeze({
|
|
|
5685
5793
|
ERR_INVALID_AUTHENTICATION_CODE: ERR_INVALID_AUTHENTICATION_CODE,
|
|
5686
5794
|
ERR_INVALID_COMPRESSED_DATA: ERR_INVALID_COMPRESSED_DATA,
|
|
5687
5795
|
ERR_INVALID_CRC32: ERR_INVALID_CRC32,
|
|
5796
|
+
ERR_INVALID_FILENAME_VALIDATION: ERR_INVALID_FILENAME_VALIDATION,
|
|
5797
|
+
ERR_INVALID_MAX_APPENDED_DATA_SIZE: ERR_INVALID_MAX_APPENDED_DATA_SIZE,
|
|
5688
5798
|
ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
|
|
5689
5799
|
ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
|
|
5800
|
+
ERR_INVALID_STRICTNESS: ERR_INVALID_STRICTNESS,
|
|
5690
5801
|
ERR_INVALID_UNCOMPRESSED_SIZE: ERR_INVALID_UNCOMPRESSED_SIZE,
|
|
5691
5802
|
ERR_LOCAL_FILE_HEADER_NOT_FOUND: ERR_LOCAL_FILE_HEADER_NOT_FOUND,
|
|
5692
5803
|
ERR_OVERLAPPING_ENTRY: ERR_OVERLAPPING_ENTRY,
|
|
5693
5804
|
ERR_SPLIT_ZIP_FILE: ERR_SPLIT_ZIP_FILE,
|
|
5805
|
+
ERR_UNSAFE_FILENAME: ERR_UNSAFE_FILENAME,
|
|
5694
5806
|
ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION$1,
|
|
5695
5807
|
ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
|
|
5696
5808
|
ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
|
|
@@ -5752,6 +5864,8 @@ const ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = "Invalid unixExtraFieldType (must be '
|
|
|
5752
5864
|
const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldType 'unix' (use 'infozip' for larger ids)";
|
|
5753
5865
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
5754
5866
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
5867
|
+
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
5868
|
+
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
5755
5869
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
5756
5870
|
|
|
5757
5871
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
@@ -5759,6 +5873,7 @@ const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
|
|
|
5759
5873
|
const VENDOR_VERSION_AE_1 = 1;
|
|
5760
5874
|
const INFOZIP_EXTRA_FIELD_TYPE$1 = "infozip";
|
|
5761
5875
|
const UNIX_EXTRA_FIELD_TYPE = "unix";
|
|
5876
|
+
const MAX_LEVEL = 9;
|
|
5762
5877
|
|
|
5763
5878
|
let workers = 0;
|
|
5764
5879
|
const pendingEntries = [];
|
|
@@ -5921,7 +6036,8 @@ class ZipWriter {
|
|
|
5921
6036
|
|
|
5922
6037
|
remove(entry) {
|
|
5923
6038
|
const { filenames, files } = this;
|
|
5924
|
-
|
|
6039
|
+
// deno-lint-ignore valid-typeof
|
|
6040
|
+
if (typeof entry == STRING_TYPE) {
|
|
5925
6041
|
entry = files.get(entry);
|
|
5926
6042
|
}
|
|
5927
6043
|
if (entry && entry.filename !== UNDEFINED_VALUE) {
|
|
@@ -6059,20 +6175,20 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6059
6175
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6060
6176
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? 20 : 768);
|
|
6061
6177
|
const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
|
|
6062
|
-
const uid =
|
|
6063
|
-
const gid =
|
|
6064
|
-
let unixMode =
|
|
6178
|
+
const uid = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_UID);
|
|
6179
|
+
const gid = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_GID);
|
|
6180
|
+
let unixMode = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_UNIX_MODE);
|
|
6065
6181
|
let unixExtraFieldType = getOptionValue(zipWriter, options, OPTION_UNIX_EXTRA_FIELD_TYPE);
|
|
6066
6182
|
let setuid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETUID);
|
|
6067
6183
|
let setgid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETGID);
|
|
6068
6184
|
let sticky = getOptionValue(zipWriter, options, PROPERTY_NAME_STICKY);
|
|
6069
|
-
if (uid !== UNDEFINED_VALUE && (uid < 0 || uid > MAX_32_BITS)) {
|
|
6185
|
+
if (uid !== UNDEFINED_VALUE && (!Number.isInteger(uid) || uid < 0 || uid > MAX_32_BITS)) {
|
|
6070
6186
|
throw new Error(ERR_INVALID_UID);
|
|
6071
6187
|
}
|
|
6072
|
-
if (gid !== UNDEFINED_VALUE && (gid < 0 || gid > MAX_32_BITS)) {
|
|
6188
|
+
if (gid !== UNDEFINED_VALUE && (!Number.isInteger(gid) || gid < 0 || gid > MAX_32_BITS)) {
|
|
6073
6189
|
throw new Error(ERR_INVALID_GID);
|
|
6074
6190
|
}
|
|
6075
|
-
if (unixMode !== UNDEFINED_VALUE && (unixMode < 0 || unixMode > MAX_16_BITS)) {
|
|
6191
|
+
if (unixMode !== UNDEFINED_VALUE && (!Number.isInteger(unixMode) || unixMode < 0 || unixMode > MAX_16_BITS)) {
|
|
6076
6192
|
throw new Error(ERR_INVALID_UNIX_MODE);
|
|
6077
6193
|
}
|
|
6078
6194
|
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE$1 && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
|
|
@@ -6184,7 +6300,7 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6184
6300
|
|
|
6185
6301
|
function resolveMetadata(zipWriter, name, options) {
|
|
6186
6302
|
const encode = getOptionValue(zipWriter, options, OPTION_ENCODE_TEXT, encodeText);
|
|
6187
|
-
let rawFilename = encode(name);
|
|
6303
|
+
let rawFilename = encode(name, TEXT_TYPE_FILENAME);
|
|
6188
6304
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
6189
6305
|
rawFilename = encodeText(name);
|
|
6190
6306
|
}
|
|
@@ -6192,7 +6308,7 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6192
6308
|
throw new Error(ERR_INVALID_ENTRY_NAME);
|
|
6193
6309
|
}
|
|
6194
6310
|
const comment = options[PROPERTY_NAME_COMMENT] || "";
|
|
6195
|
-
let rawComment = encode(comment);
|
|
6311
|
+
let rawComment = encode(comment, TEXT_TYPE_COMMENT);
|
|
6196
6312
|
if (rawComment === UNDEFINED_VALUE) {
|
|
6197
6313
|
rawComment = encodeText(comment);
|
|
6198
6314
|
}
|
|
@@ -6212,8 +6328,11 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6212
6328
|
if (!passThrough) {
|
|
6213
6329
|
password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6214
6330
|
rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6331
|
+
if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
|
|
6332
|
+
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
6333
|
+
}
|
|
6215
6334
|
}
|
|
6216
|
-
const encryptionStrength =
|
|
6335
|
+
const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
|
|
6217
6336
|
const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
|
|
6218
6337
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
6219
6338
|
const ntfsTimestamp = getOptionValue(zipWriter, options, OPTION_NTFS_TIMESTAMP);
|
|
@@ -6231,7 +6350,10 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6231
6350
|
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
|
|
6232
6351
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
6233
6352
|
}
|
|
6234
|
-
let level =
|
|
6353
|
+
let level = getNumberOptionValue(zipWriter, options, OPTION_LEVEL);
|
|
6354
|
+
if (level !== UNDEFINED_VALUE && (!Number.isInteger(level) || level < 0 || level > MAX_LEVEL)) {
|
|
6355
|
+
throw new Error(ERR_INVALID_LEVEL);
|
|
6356
|
+
}
|
|
6235
6357
|
if (zipWriter.options[OPTION_USDZ]) {
|
|
6236
6358
|
if (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) {
|
|
6237
6359
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION_USDZ);
|
|
@@ -6252,7 +6374,7 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6252
6374
|
useCompressionStream = false;
|
|
6253
6375
|
}
|
|
6254
6376
|
const zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
6255
|
-
if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(encryptionStrength >= 1 && encryptionStrength <= 3)) {
|
|
6377
|
+
if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(Number.isInteger(encryptionStrength) && encryptionStrength >= 1 && encryptionStrength <= 3)) {
|
|
6256
6378
|
throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH);
|
|
6257
6379
|
}
|
|
6258
6380
|
const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
|
|
@@ -7446,6 +7568,14 @@ function getOptionValue(zipWriter, options, name, defaultValue) {
|
|
|
7446
7568
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
7447
7569
|
}
|
|
7448
7570
|
|
|
7571
|
+
function getNumberOptionValue(zipWriter, options, name, defaultValue) {
|
|
7572
|
+
return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
|
|
7573
|
+
}
|
|
7574
|
+
|
|
7575
|
+
function toNumber(value) {
|
|
7576
|
+
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
7577
|
+
}
|
|
7578
|
+
|
|
7449
7579
|
function getMaximumCompressedSize(uncompressedSize) {
|
|
7450
7580
|
return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
|
|
7451
7581
|
}
|
|
@@ -8098,6 +8228,7 @@ setDefaultConfiguration({
|
|
|
8098
8228
|
|
|
8099
8229
|
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
8100
8230
|
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
8231
|
+
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
8101
8232
|
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
8102
8233
|
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
8103
8234
|
EXTRAFIELD_TYPE_ZIP64,
|
|
@@ -8206,8 +8337,9 @@ class ZipFileEntry extends ZipEntry {
|
|
|
8206
8337
|
const uncompressedSize = zipEntry.data ? zipEntry.data.uncompressedSize : reader.size;
|
|
8207
8338
|
await Promise.all([initStream(reader), initStream(writer, uncompressedSize)]);
|
|
8208
8339
|
const { readable } = reader;
|
|
8340
|
+
const { signal } = options;
|
|
8209
8341
|
zipEntry.uncompressedSize = reader.size;
|
|
8210
|
-
await toCompatibleReadable(readable).pipeTo(toCompatibleWritable(writer.writable));
|
|
8342
|
+
await toCompatibleReadable(readable).pipeTo(toCompatibleWritable(writer.writable), { signal });
|
|
8211
8343
|
return writer.getData ? writer.getData() : writer.writable;
|
|
8212
8344
|
}
|
|
8213
8345
|
}
|
|
@@ -8474,7 +8606,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
8474
8606
|
for (const entry of entries) {
|
|
8475
8607
|
let parent = this;
|
|
8476
8608
|
try {
|
|
8477
|
-
const path = entry.filename.split("/");
|
|
8609
|
+
const path = entry.filename.split("/").filter(pathPart => pathPart != "" && pathPart != ".");
|
|
8478
8610
|
const name = path.pop();
|
|
8479
8611
|
path.forEach(pathPart => {
|
|
8480
8612
|
const previousParent = parent;
|
|
@@ -8849,6 +8981,39 @@ function detach(entry) {
|
|
|
8849
8981
|
}
|
|
8850
8982
|
}
|
|
8851
8983
|
|
|
8984
|
+
function forwardAbort(signal, abortController) {
|
|
8985
|
+
if (!signal) {
|
|
8986
|
+
return () => { };
|
|
8987
|
+
}
|
|
8988
|
+
if (signal.aborted) {
|
|
8989
|
+
abortController.abort(signal.reason);
|
|
8990
|
+
return () => { };
|
|
8991
|
+
}
|
|
8992
|
+
const abort = () => abortController.abort(signal.reason);
|
|
8993
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
8994
|
+
return () => signal.removeEventListener("abort", abort);
|
|
8995
|
+
}
|
|
8996
|
+
|
|
8997
|
+
function isExportAborted(error) {
|
|
8998
|
+
return Boolean(error) && error.message == ERR_ABORT_EXPORT;
|
|
8999
|
+
}
|
|
9000
|
+
|
|
9001
|
+
function aggregateEntryErrors(errors) {
|
|
9002
|
+
const [error] = errors;
|
|
9003
|
+
const otherErrors = errors
|
|
9004
|
+
.slice(1)
|
|
9005
|
+
.flatMap(otherError => [otherError, ...(otherError && otherError.entryErrors || [])])
|
|
9006
|
+
.filter(otherError => otherError !== error);
|
|
9007
|
+
if (otherErrors.length) {
|
|
9008
|
+
try {
|
|
9009
|
+
error.entryErrors = [...(error.entryErrors || []), ...otherErrors];
|
|
9010
|
+
} catch {
|
|
9011
|
+
// ignored
|
|
9012
|
+
}
|
|
9013
|
+
}
|
|
9014
|
+
return error;
|
|
9015
|
+
}
|
|
9016
|
+
|
|
8852
9017
|
function getUserExtraField(extraField) {
|
|
8853
9018
|
if (extraField) {
|
|
8854
9019
|
const userExtraField = new Map();
|
|
@@ -8969,8 +9134,9 @@ async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
|
8969
9134
|
function addFileSystemHandle(zipEntry, handle, options) {
|
|
8970
9135
|
return addFile(zipEntry, handle, []);
|
|
8971
9136
|
|
|
8972
|
-
async function addFile(parentEntry, handle, addedEntries) {
|
|
9137
|
+
async function addFile(parentEntry, handle, addedEntries, parentName = "") {
|
|
8973
9138
|
if (handle) {
|
|
9139
|
+
const entryName = parentName ? parentName + "/" + handle.name : handle.name;
|
|
8974
9140
|
try {
|
|
8975
9141
|
if (handle.isFile || handle.isDirectory) {
|
|
8976
9142
|
handle = await transformToFileSystemhandle(handle);
|
|
@@ -8992,12 +9158,18 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
8992
9158
|
const directoryEntry = parentEntry.addDirectory(handle.name);
|
|
8993
9159
|
addedEntries.push(directoryEntry);
|
|
8994
9160
|
for await (const childHandle of handle.values()) {
|
|
8995
|
-
await addFile(directoryEntry, childHandle, addedEntries);
|
|
9161
|
+
await addFile(directoryEntry, childHandle, addedEntries, entryName);
|
|
8996
9162
|
}
|
|
8997
9163
|
}
|
|
8998
9164
|
} catch (error) {
|
|
8999
|
-
|
|
9000
|
-
|
|
9165
|
+
try {
|
|
9166
|
+
if (error.entryName === UNDEFINED_VALUE) {
|
|
9167
|
+
error.entryName = entryName;
|
|
9168
|
+
}
|
|
9169
|
+
} catch {
|
|
9170
|
+
// ignored
|
|
9171
|
+
}
|
|
9172
|
+
throw error;
|
|
9001
9173
|
}
|
|
9002
9174
|
}
|
|
9003
9175
|
return addedEntries;
|
|
@@ -9007,15 +9179,32 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
9007
9179
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
9008
9180
|
const totalSize = getTotalSize([zipEntry], "uncompressedSize");
|
|
9009
9181
|
const writtenSizes = new Map();
|
|
9010
|
-
|
|
9182
|
+
const abortController = new AbortController();
|
|
9183
|
+
const { signal } = abortController;
|
|
9184
|
+
const releaseSignal = forwardAbort(options.signal, abortController);
|
|
9185
|
+
const exportedEntryNames = [];
|
|
9186
|
+
try {
|
|
9187
|
+
await exportChildren(zipEntry, directoryHandle);
|
|
9188
|
+
} catch (error) {
|
|
9189
|
+
try {
|
|
9190
|
+
error.exportedEntryNames = exportedEntryNames;
|
|
9191
|
+
} catch {
|
|
9192
|
+
// ignored
|
|
9193
|
+
}
|
|
9194
|
+
throw error;
|
|
9195
|
+
} finally {
|
|
9196
|
+
releaseSignal();
|
|
9197
|
+
}
|
|
9011
9198
|
return directoryHandle;
|
|
9012
9199
|
|
|
9013
9200
|
async function exportChildren(entry, parentHandle) {
|
|
9014
9201
|
if (options.concurrent) {
|
|
9015
9202
|
const results = await Promise.allSettled(entry.children.map(child => exportChild(child, parentHandle)));
|
|
9016
|
-
const
|
|
9017
|
-
if (
|
|
9018
|
-
|
|
9203
|
+
const rejectedResults = results.filter(result => result.status == "rejected");
|
|
9204
|
+
if (rejectedResults.length) {
|
|
9205
|
+
const failedResults = rejectedResults.filter(result => !isExportAborted(result.reason));
|
|
9206
|
+
const reportedResults = failedResults.length ? failedResults : rejectedResults;
|
|
9207
|
+
throw aggregateEntryErrors(reportedResults.map(result => result.reason));
|
|
9019
9208
|
}
|
|
9020
9209
|
} else {
|
|
9021
9210
|
for (const child of entry.children) {
|
|
@@ -9025,6 +9214,12 @@ async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
|
9025
9214
|
}
|
|
9026
9215
|
|
|
9027
9216
|
async function exportChild(child, parentHandle) {
|
|
9217
|
+
if (signal.aborted) {
|
|
9218
|
+
if (isExportAborted(signal.reason)) {
|
|
9219
|
+
return;
|
|
9220
|
+
}
|
|
9221
|
+
throw signal.reason;
|
|
9222
|
+
}
|
|
9028
9223
|
try {
|
|
9029
9224
|
if (child.directory) {
|
|
9030
9225
|
const childDirectoryHandle = await parentHandle.getDirectoryHandle(child.name, { create: true });
|
|
@@ -9033,6 +9228,7 @@ async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
|
9033
9228
|
const fileHandle = await parentHandle.getFileHandle(child.name, { create: true });
|
|
9034
9229
|
const writable = await fileHandle.createWritable();
|
|
9035
9230
|
await child.getData({ writable }, Object.assign({}, options, {
|
|
9231
|
+
signal,
|
|
9036
9232
|
onprogress: async progress => {
|
|
9037
9233
|
if (options.onprogress) {
|
|
9038
9234
|
writtenSizes.set(child.id, progress);
|
|
@@ -9044,9 +9240,19 @@ async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
|
9044
9240
|
}
|
|
9045
9241
|
}
|
|
9046
9242
|
}));
|
|
9243
|
+
exportedEntryNames.push(child.getRelativeName(zipEntry));
|
|
9047
9244
|
}
|
|
9048
9245
|
} catch (error) {
|
|
9049
|
-
|
|
9246
|
+
abortController.abort(new Error(ERR_ABORT_EXPORT));
|
|
9247
|
+
try {
|
|
9248
|
+
if (error.entryName === UNDEFINED_VALUE) {
|
|
9249
|
+
error.entryName = child.getRelativeName(zipEntry);
|
|
9250
|
+
error.entryId = child.id;
|
|
9251
|
+
}
|
|
9252
|
+
} catch {
|
|
9253
|
+
// ignored
|
|
9254
|
+
}
|
|
9255
|
+
throw error;
|
|
9050
9256
|
}
|
|
9051
9257
|
}
|
|
9052
9258
|
}
|
|
@@ -9249,12 +9455,17 @@ exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
|
9249
9455
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
9250
9456
|
exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
|
|
9251
9457
|
exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
|
|
9458
|
+
exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
|
|
9252
9459
|
exports.ERR_INVALID_GID = ERR_INVALID_GID;
|
|
9460
|
+
exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
|
|
9461
|
+
exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
|
|
9253
9462
|
exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
|
|
9254
9463
|
exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
9255
9464
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
9465
|
+
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
9256
9466
|
exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
|
|
9257
9467
|
exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
|
|
9468
|
+
exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
|
|
9258
9469
|
exports.ERR_INVALID_UID = ERR_INVALID_UID;
|
|
9259
9470
|
exports.ERR_INVALID_UNCOMPRESSED_SIZE = ERR_INVALID_UNCOMPRESSED_SIZE;
|
|
9260
9471
|
exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
|
|
@@ -9269,6 +9480,7 @@ exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
|
9269
9480
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
9270
9481
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
9271
9482
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
9483
|
+
exports.ERR_UNSAFE_FILENAME = ERR_UNSAFE_FILENAME;
|
|
9272
9484
|
exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
|
|
9273
9485
|
exports.ERR_UNSUPPORTED_CONTEXT = ERR_UNSUPPORTED_CONTEXT;
|
|
9274
9486
|
exports.ERR_UNSUPPORTED_CRYPTO_API = ERR_UNSUPPORTED_CRYPTO_API;
|