akarisub 0.2.1 → 0.2.2
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/LICENSE +3 -0
- package/README.md +53 -51
- package/THIRD_PARTY_NOTICES.md +1590 -0
- package/dist/COPYRIGHT +1588 -949
- package/dist/akarisub-worker.js +2 -2
- package/dist/akarisub-worker.wasm +0 -0
- package/dist/akarisub.umd.js +3 -3
- package/dist/index.js +3 -3
- package/dist/ts/ts/akarisub.d.ts +0 -4
- package/dist/ts/ts/akarisub.d.ts.map +1 -1
- package/dist/ts/ts/akarisub.js +1 -7
- package/dist/ts/ts/akarisub.js.map +1 -1
- package/dist/ts/ts/types.d.ts +4 -4
- package/dist/ts/ts/types.d.ts.map +1 -1
- package/dist/ts/ts/webgl2-renderer.d.ts +2 -1
- package/dist/ts/ts/webgl2-renderer.d.ts.map +1 -1
- package/dist/ts/ts/webgl2-renderer.js +19 -16
- package/dist/ts/ts/webgl2-renderer.js.map +1 -1
- package/dist/ts/ts/webgpu-renderer.d.ts +2 -4
- package/dist/ts/ts/webgpu-renderer.d.ts.map +1 -1
- package/dist/ts/ts/webgpu-renderer.js +19 -52
- package/dist/ts/ts/webgpu-renderer.js.map +1 -1
- package/dist/ts/ts/worker.js +120 -53
- package/dist/ts/ts/worker.js.map +1 -1
- package/package.json +3 -1
- package/src/ts/akarisub.ts +2 -8
- package/src/ts/types.ts +4 -3
- package/src/ts/webgl2-renderer.ts +19 -13
- package/src/ts/webgpu-renderer.ts +26 -71
- package/src/ts/worker.ts +126 -47
package/dist/akarisub-worker.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(()=>{async function F2($={}){var Z,h=$,K=(...w)=>{console.log(...w)},X=(...w)=>{console.error(...w)};function U(){B?.(h)}(function(){var w=typeof WebAssembly<"u"&&WebAssembly.instantiateStreaming;w&&(WebAssembly.instantiateStreaming=function(f,r){var J=null;return f=Promise.resolve(f).then(function(v){return J=v.clone(),v}),w.call(WebAssembly,f,r).catch(function(v){if(console.warn("[AkariSub] instantiateStreaming failed, using ArrayBuffer fallback:",v&&v.message||v),!J)throw v;return J.arrayBuffer().then(function(G){return WebAssembly.instantiate(G,r)})})})})(),K=(w)=>{w==="AkariSub: No usable fontconfig configuration file found, using fallback."||w.startsWith("Unable to revert mtime:")||w.trim()===""?console.debug(w):console.log(w)},X=(w)=>{w==="Fontconfig error: Cannot load default config file: No such file: (null)"||w==="Fontconfig error: Cannot load default config file: File not found"||w==="Fontconfig error: No writable cache directories"||w.includes("/var/cache/fontconfig")||w.includes("/.cache/fontconfig")||w.includes("/.local/share/fonts")?console.debug(w):console.error(w)};class Q{}class V extends Q{}var B,c=!1;function b(){var w=H.buffer;A=new Int8Array(w),I=new Int16Array(w),N=new Uint8Array(w),new Uint16Array(w),E=new Int32Array(w),_=new Uint32Array(w),new Float32Array(w),new Float64Array(w),W=new BigInt64Array(w),Y=new BigUint64Array(w)}H=new WebAssembly.Memory({initial:256,maximum:32768}),b();var I,E,W,A,_,Y,N,H,D=new TextDecoder,O=(w,f)=>{for(var r=f+void 0;w[f]&&!(f>=r);)++f;return f},R=(w)=>w?D.decode(N.subarray(w,O(N,w))):"",M=(w,f)=>{for(var r=0,J=w.length-1;J>=0;J--){var v=w[J];v==="."?w.splice(J,1):v===".."?(w.splice(J,1),r++):r&&(w.splice(J,1),r--)}if(f)for(;r;r--)w.unshift("..");return w},y=(w)=>{var f=w.charAt(0)==="/",r=w.slice(-1)==="/";return(w=M(w.split("/").filter((J)=>!!J),!f).join("/"))||f||(w="."),w&&r&&(w+="/"),(f?"/":"")+w},x=(w)=>{var f=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(w).slice(1);if(w=f[0],f=f[1],!w&&!f)return".";return f&&=f.slice(0,-1),w+f},C=(w)=>w&&w.match(/([^\/]+|\/)\/*$/)[1],K0=()=>(w)=>(crypto.getRandomValues(w),0),d=(w)=>(d=K0())(w),$0=(...w)=>{for(var f="",r=!1,J=w.length-1;J>=-1&&!r;J--){if(r=J>=0?w[J]:"/",typeof r!="string")throw TypeError("Arguments to path.resolve must be strings");if(!r)return"";f=r+"/"+f,r=r.charAt(0)==="/"}return f=M(f.split("/").filter((v)=>!!v),!r).join("/"),(r?"/":"")+f||"."},L0=(w,f)=>{function r(z){for(var q=0;q<z.length&&z[q]==="";q++);for(var o=z.length-1;o>=0&&z[o]==="";o--);return q>o?[]:z.slice(q,o-q+1)}w=$0(w).slice(1),f=$0(f).slice(1),w=r(w.split("/")),f=r(f.split("/"));for(var J=Math.min(w.length,f.length),v=J,G=0;G<J;G++)if(w[G]!==f[G]){v=G;break}J=[];for(G=v;G<w.length;G++)J.push("..");return J=J.concat(f.slice(v)),J.join("/")},m0=(w)=>{var f=O(w,0);return D.decode(w.buffer?w.subarray(0,f):new Uint8Array(w.slice(0,f)))},t1=[],l0=(w)=>{for(var f=0,r=0;r<w.length;++r){var J=w.charCodeAt(r);J<=127?f++:J<=2047?f+=2:J>=55296&&J<=57343?(f+=4,++r):f+=3}return f},g0=(w,f,r,J)=>{if(!(J>0))return 0;var v=r;J=r+J-1;for(var G=0;G<w.length;++G){var z=w.codePointAt(G);if(z<=127){if(r>=J)break;f[r++]=z}else if(z<=2047){if(r+1>=J)break;f[r++]=192|z>>6,f[r++]=128|z&63}else if(z<=65535){if(r+2>=J)break;f[r++]=224|z>>12,f[r++]=128|z>>6&63,f[r++]=128|z&63}else{if(r+3>=J)break;f[r++]=240|z>>18,f[r++]=128|z>>12&63,f[r++]=128|z>>6&63,f[r++]=128|z&63,G++}}return f[r]=0,r-v},d1=[];function a1(w,f){d1[w]={input:[],output:[],Ga:f},q1(w,N2)}var N2={open(w){var f=d1[w.node.Oa];if(!f)throw new j(43);w.fa=f,w.seekable=!1},close(w){w.fa.Ga.Pa(w.fa)},Pa(w){w.fa.Ga.Pa(w.fa)},read(w,f,r,J){if(!w.fa||!w.fa.Ga.$a)throw new j(60);for(var v=0,G=0;G<J;G++){try{var z=w.fa.Ga.$a(w.fa)}catch(q){throw new j(29)}if(z===void 0&&v===0)throw new j(6);if(z===null||z===void 0)break;v++,f[r+G]=z}return v&&(w.node.Fa=Date.now()),v},write(w,f,r,J){if(!w.fa||!w.fa.Ga.Ya)throw new j(60);try{for(var v=0;v<J;v++)w.fa.Ga.Ya(w.fa,f[r+v])}catch(G){throw new j(29)}return J&&(w.node.ra=w.node.qa=Date.now()),v}},H2={$a(){return t1.length?t1.shift():null},Ya(w,f){f===null||f===10?(K(m0(w.output)),w.output=[]):f!=0&&w.output.push(f)},Pa(w){w.output?.length>0&&(K(m0(w.output)),w.output=[])},mb(){return{xb:25856,zb:5,wb:191,yb:35387,ub:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},nb(){return 0},ob(){return[24,80]}},A2={Ya(w,f){f===null||f===10?(X(m0(w.output)),w.output=[]):f!=0&&w.output.push(f)},Pa(w){w.output?.length>0&&(X(m0(w.output)),w.output=[])}},k={wa:null,ua(){return k.createNode(null,"/",16895,0)},createNode(w,f,r,J){if((r&61440)===24576||(r&61440)===4096)throw new j(63);return k.wa||(k.wa={dir:{node:{ta:k.ca.ta,Ea:k.ca.Ea,Na:k.ca.Na,Qa:k.ca.Qa,Sa:k.ca.Sa,Va:k.ca.Va,Ta:k.ca.Ta,Ra:k.ca.Ra,Ua:k.ca.Ua},stream:{va:k.da.va}},file:{node:{ta:k.ca.ta,Ea:k.ca.Ea},stream:{va:k.da.va,read:k.da.read,write:k.da.write,bb:k.da.bb,eb:k.da.eb}},link:{node:{ta:k.ca.ta,Ea:k.ca.Ea,La:k.ca.La},stream:{}},Za:{node:{ta:k.ca.ta,Ea:k.ca.Ea},stream:g2}}),r=Jw(w,f,r,J),a(r.mode)?(r.ca=k.wa.dir.node,r.da=k.wa.dir.stream,r.ga={}):(r.mode&61440)===32768?(r.ca=k.wa.file.node,r.da=k.wa.file.stream,r.sa=0,r.ga=k.ib??(k.ib=new Uint8Array(0))):(r.mode&61440)===40960?(r.ca=k.wa.link.node,r.da=k.wa.link.stream):(r.mode&61440)===8192&&(r.ca=k.wa.Za.node,r.da=k.wa.Za.stream),r.Fa=r.ra=r.qa=Date.now(),w&&(w.ga[f]=r,w.Fa=w.ra=w.qa=r.Fa),r},ca:{ta(w){var f={};return f.hb=(w.mode&61440)===8192?w.id:1,f.kb=w.id,f.mode=w.mode,f.qb=1,f.uid=0,f.jb=0,f.Oa=w.Oa,a(w.mode)?f.size=4096:(w.mode&61440)===32768?f.size=w.sa:(w.mode&61440)===40960?f.size=w.link.length:f.size=0,f.Fa=new Date(w.Fa),f.ra=new Date(w.ra),f.qa=new Date(w.qa),f.fb=4096,f.gb=Math.ceil(f.size/f.fb),f},Ea(w,f){for(var r of["mode","atime","mtime","ctime"])f[r]!=null&&(w[r]=f[r]);f.size!==void 0&&(f=f.size,w.sa!=f&&(r=w.ga,w.ga=new Uint8Array(f),w.ga.set(r.subarray(0,Math.min(f,w.sa))),w.sa=f))},Na(){throw k.Wa||(k.Wa=new j(44),k.Wa.stack="<generic error, no stack>"),k.Wa},Qa(w,f,r,J){return k.createNode(w,f,r,J)},Sa(w,f,r){try{var J=h0(f,r)}catch(G){}if(J){if(a(w.mode))for(var v in J.ga)throw new j(55);t0(J)}delete w.parent.ga[w.name],f.ga[r]=w,w.name=r,f.qa=f.ra=w.parent.qa=w.parent.ra=Date.now()},Va(w,f){delete w.ga[f],w.qa=w.ra=Date.now()},Ta(w,f){var r=h0(w,f),J;for(J in r.ga)throw new j(55);delete w.ga[f],w.qa=w.ra=Date.now()},Ra(w){return[".","..",...Object.keys(w.ga)]},Ua(w,f,r){return w=k.createNode(w,f,41471,0),w.link=r,w},La(w){if((w.mode&61440)!==40960)throw new j(28);return w.link}},da:{read(w,f,r,J,v){if(v>=w.node.sa)return 0;return J=Math.min(w.node.sa-v,J),f.set(w.node.ga.subarray(v,v+J),r),J},write(w,f,r,J,v,G){if(f.buffer===A.buffer&&(G=!1),!J)return 0;if(w=w.node,w.ra=w.qa=Date.now(),G)w.ga=f.subarray(r,r+J),w.sa=J;else if(w.sa===0&&v===0)w.ga=f.slice(r,r+J),w.sa=J;else{G=v+J;var z=w.ga.length;z>=G||(G=Math.max(G,z*(z<1048576?2:1.125)>>>0),z&&(G=Math.max(G,256)),z=w.ga.subarray(0,w.sa),w.ga=new Uint8Array(G),w.ga.set(z)),w.ga.set(f.subarray(r,r+J),v),w.sa=Math.max(w.sa,v+J)}return J},va(w,f,r){if(r===1?f+=w.position:r===2&&(w.node.mode&61440)===32768&&(f+=w.node.sa),f<0)throw new j(28);return f},bb(w,f,r,J,v){if((w.node.mode&61440)!==32768)throw new j(43);if(w=w.node.ga,v&2||w.buffer!==A.buffer){v=!0,J=Math.ceil(f/65536)*65536;var G=sw(65536,J);if(G&&N.fill(0,G,G+J),J=G,!J)throw new j(48);if(w){if(r>0||r+f<w.length)w.subarray?w=w.subarray(r,r+f):w=Array.prototype.slice.call(w,r,r+f);A.set(w,J)}}else v=!1,J=w.byteOffset;return{Db:J,tb:v}},eb(w,f,r,J){return k.da.write(w,f,0,J,r,!1),0}}},e1=(w,f)=>{var r=0;return w&&(r|=365),f&&(r|=146),r},Y1=null,ww={},H0=[],P2=1,W0=null,fw=!1,rw=!0,j=class{name="ErrnoError";constructor(w){this.ea=w}},_2=class{shared={};node=null;get flags(){return this.shared.flags}set flags(w){this.shared.flags=w}get position(){return this.shared.position}set position(w){this.shared.position=w}},D2=class{ca={};da={};Ia=null;constructor(w,f,r,J){w||=this,this.parent=w,this.ua=w.ua,this.id=P2++,this.name=f,this.mode=r,this.Oa=J,this.Fa=this.ra=this.qa=Date.now()}get read(){return(this.mode&365)===365}set read(w){w?this.mode|=365:this.mode&=-366}get write(){return(this.mode&146)===146}set write(w){w?this.mode|=146:this.mode&=-147}};function i(w,f={}){if(!w)throw new j(44);f.Xa??(f.Xa=!0),w.charAt(0)==="/"||(w="//"+w);var r=0;w:for(;r<40;r++){w=w.split("/").filter((q)=>!!q);for(var J=Y1,v="/",G=0;G<w.length;G++){var z=G===w.length-1;if(z&&f.parent)break;if(w[G]!==".")if(w[G]==="..")if(v=x(v),J===J.parent){w=v+"/"+w.slice(G+1).join("/"),r--;continue w}else J=J.parent;else{v=y(v+"/"+w[G]);try{J=h0(J,w[G])}catch(q){if(q?.ea===44&&z&&f.rb)return{path:v};throw q}if(!J.Ia||z&&!f.Xa||(J=J.Ia.root),(J.mode&61440)===40960&&(!z||f.Ja)){if(!J.ca.La)throw new j(52);J=J.ca.La(J),J.charAt(0)==="/"||(J=x(v)+"/"+J),w=J+"/"+w.slice(G+1).join("/");continue w}}}return{path:v,node:J}}throw new j(32)}function i0(w){for(var f;;){if(w===w.parent)return w=w.ua.cb,f?w[w.length-1]!=="/"?`${w}/${f}`:w+f:w;f=f?`${w.name}/${f}`:w.name,w=w.parent}}function B1(w,f){for(var r=0,J=0;J<f.length;J++)r=(r<<5)-r+f.charCodeAt(J)|0;return(w+r>>>0)%W0.length}function $w(w){var f=B1(w.parent.id,w.name);w.Ma=W0[f],W0[f]=w}function t0(w){var f=B1(w.parent.id,w.name);if(W0[f]===w)W0[f]=w.Ma;else for(f=W0[f];f;){if(f.Ma===w){f.Ma=w.Ma;break}f=f.Ma}}function h0(w,f){var r=a(w.mode)?(r=y0(w,"x"))?r:w.ca.Na?0:2:54;if(r)throw new j(r);for(r=W0[B1(w.id,f)];r;r=r.Ma){var J=r.name;if(r.parent.id===w.id&&J===f)return r}return w.ca.Na(w,f)}function Jw(w,f,r,J){return w=new D2(w,f,r,J),$w(w),w}function a(w){return(w&61440)===16384}function y0(w,f){return rw?0:f.includes("r")&&!(w.mode&292)||f.includes("w")&&!(w.mode&146)||f.includes("x")&&!(w.mode&73)?2:0}function k1(w,f){if(!a(w.mode))return 54;try{return h0(w,f),20}catch(r){}return y0(w,"wx")}function d0(w,f,r){try{var J=h0(w,f)}catch(v){return v.ea}if(w=y0(w,"wx"))return w;if(r){if(!a(J.mode))return 54;if(J===J.parent||i0(J)==="/")return 10}else if(a(J.mode))return 31;return 0}function I0(w,f){if(!w)throw new j(f);return w}function G0(w){if(w=H0[w],!w)throw new j(8);return w}function vw(w,f=-1){if(w=Object.assign(new _2,w),f==-1)w:{for(f=0;f<=4096;f++)if(!H0[f])break w;throw new j(33)}return w.Ha=f,H0[f]=w}function L2(w,f=-1){return w=vw(w,f),w.da?.Bb?.(w),w}function Zw(w,f){var r=void 0,J=r?null:w;r??=w.ca.Ea,I0(r,63);try{r(J,f)}catch(v){if(v instanceof RangeError)throw new j(22);throw v}}var g2={open(w){w.da=ww[w.node.Oa].da,w.da.open?.(w)},va(){throw new j(70)}};function q1(w,f){ww[w]={da:f}}function hw(w,f){var r=f==="/";if(r&&Y1)throw new j(10);if(!r&&f){var J=i(f,{Xa:!1});if(f=J.path,J=J.node,J.Ia)throw new j(10);if(!a(J.mode))throw new j(54)}f={type:w,Cb:{},cb:f,pb:[]},w=w.ua(f),w.ua=f,f.root=w,r?Y1=w:J&&(J.Ia=f,J.ua&&J.ua.pb.push(f))}function a0(w,f,r){var J=i(w,{parent:!0}).node;if(w=C(w),!w)throw new j(28);if(w==="."||w==="..")throw new j(20);var v=k1(J,w);if(v)throw new j(v);if(!J.ca.Qa)throw new j(63);return J.ca.Qa(J,w,f,r)}function I2(w,f=438){return a0(w,f&4095|32768,0)}function J0(w,f=511){return a0(w,f&1023|16384,0)}function e0(w,f,r){typeof r>"u"&&(r=f,f=438),a0(w,f|8192,r)}function N1(w,f){if(!$0(w))throw new j(44);var r=i(f,{parent:!0}).node;if(!r)throw new j(44);f=C(f);var J=k1(r,f);if(J)throw new j(J);if(!r.ca.Ua)throw new j(63);r.ca.Ua(r,f,w)}function Gw(w){var f=i(w,{parent:!0}).node;w=C(w);var r=h0(f,w),J=d0(f,w,!0);if(J)throw new j(J);if(!f.ca.Ta)throw new j(63);if(r.Ia)throw new j(10);f.ca.Ta(f,w),t0(r)}function w1(w,f){return w=i(w,{Ja:!f}).node,I0(w.ca.ta,63)(w)}function f1(w,f){w=typeof w=="string"?i(w,{Ja:!0}).node:w,Zw(w,{mode:f&4095|w.mode&-4096,qa:Date.now(),Ab:void 0})}function E0(w,f,r=438){if(w==="")throw new j(44);if(typeof f=="string"){var J={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090}[f];if(typeof J>"u")throw Error(`Unknown file open mode: ${f}`);f=J}if(r=f&64?r&4095|32768:0,typeof w=="object")J=w;else{var v=w.endsWith("/"),G=i(w,{Ja:!(f&131072),rb:!0});J=G.node,w=G.path}if(G=!1,f&64)if(J){if(f&128)throw new j(20)}else{if(v)throw new j(31);J=a0(w,r|511,0),G=!0}if(!J)throw new j(44);if((J.mode&61440)===8192&&(f&=-513),f&65536&&!a(J.mode))throw new j(54);if(!G&&(J?(J.mode&61440)===40960?v=32:(v=["r","w","rw"][f&3],f&512&&(v+="w"),v=a(J.mode)&&(v!=="r"||f&576)?31:y0(J,v)):v=44,v))throw new j(v);if(f&512&&!G){if(v=J,v=typeof v=="string"?i(v,{Ja:!0}).node:v,a(v.mode))throw new j(31);if((v.mode&61440)!==32768)throw new j(28);if(w=y0(v,"w"))throw new j(w);Zw(v,{size:0,timestamp:Date.now()})}return f=vw({node:J,path:i0(J),flags:f&-131713,seekable:!0,position:0,da:J.da,sb:[],error:!1}),f.da.open&&f.da.open(f),G&&f1(J,r&511),f}function Qw(w){if(w.Ha===null)throw new j(8);w.Ka&&(w.Ka=null);try{w.da.close&&w.da.close(w)}catch(f){throw f}finally{H0[w.Ha]=null}w.Ha=null}function r1(w,f,r){if(w.Ha===null)throw new j(8);if(!w.seekable||!w.da.va)throw new j(70);if(r!=0&&r!=1&&r!=2)throw new j(28);return w.position=w.da.va(w,f,r),w.sb=[],w.position}function Kw(w,f,r,J,v,G){if(J<0||v<0)throw new j(28);if(w.Ha===null)throw new j(8);if((w.flags&2097155)===0)throw new j(8);if(a(w.node.mode))throw new j(31);if(!w.da.write)throw new j(28);w.seekable&&w.flags&1024&&r1(w,0,2);var z=typeof v<"u";if(!z)v=w.position;else if(!w.seekable)throw new j(70);return f=w.da.write(w,f,r,J,v,G),z||(w.position+=f),f}function E2(w,f){w=typeof w=="string"?w:i0(w);for(f=f.split("/").reverse();f.length;){var r=f.pop();if(r){var J=y(w+"/"+r);try{J0(J)}catch(v){if(v.ea!=20)throw v}w=J}}return J}function o2(w,f,r,J,v,G){var z=f;w&&(w=typeof w=="string"?w:i0(w),z=f?y(w+"/"+f):w),w=e1(J,v),z=I2(z,w),r&&(f=r,typeof f=="string"&&(r=Array(l0(f)+1),f=g0(f,r,0,r.length),r.length=f,f=r),f.subarray||(f=new Uint8Array(f)),r=f,f1(z,w|146),f=E0(z,577),Kw(f,r,0,r.length,0,G),Qw(f),f1(z,w))}function o0(w,f){w=y("/dev/"+w);var r=e1(!!f,!1);o0.ab??(o0.ab=64);var J=o0.ab++<<8|0;q1(J,{open(v){v.seekable=!1},close(){},read(v,G,z,q){for(var o=0,L=0;L<q;L++){try{var S=f()}catch(m){throw new j(29)}if(S===void 0&&o===0)throw new j(6);if(S===null||S===void 0)break;o++,G[z+L]=S}return o&&(v.node.Fa=Date.now()),o},write(v,G,z,q){for(var o=0;o<q;o++)try{(void 0)(G[z+o])}catch(L){throw new j(29)}return q&&(v.node.ra=v.node.qa=Date.now()),o}}),e0(w,r,J)}var p={};function z0(w,f,r){if(f.charAt(0)==="/")return f;if(w=w===-100?"/":G0(w).path,f.length==0){if(!r)throw new j(44);return w}return w+"/"+f}function $1(w,f){_[w>>2]=f.hb,_[w+4>>2]=f.mode,_[w+8>>2]=f.qb,_[w+12>>2]=f.uid,_[w+16>>2]=f.jb,_[w+20>>2]=f.Oa,W[w+24>>3]=BigInt(f.size),E[w+32>>2]=4096,E[w+36>>2]=f.gb;var r=f.Fa.getTime(),J=f.ra.getTime(),v=f.qa.getTime();return W[w+40>>3]=BigInt(Math.floor(r/1000)),_[w+48>>2]=r%1000*1000*1000,W[w+56>>3]=BigInt(Math.floor(J/1000)),_[w+64>>2]=J%1000*1000*1000,W[w+72>>3]=BigInt(Math.floor(v/1000)),_[w+80>>2]=v%1000*1000*1000,W[w+88>>3]=BigInt(f.kb),0}var R0=void 0,j0=()=>{var w=E[+R0>>2];return R0+=4,w},H1={},zw=()=>{if(!A1){var w={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8",_:"./this.program"},f;for(f in H1)H1[f]===void 0?delete w[f]:w[f]=H1[f];var r=[];for(f in w)r.push(`${f}=${w[f]}`);A1=r}return A1},A1,jw=[],Xw=(w)=>{var f=jw[w];return f||(jw[w]=f=mw.get(w)),f};W0=Array(4096),hw(k,"/"),J0("/tmp"),J0("/home"),J0("/home/web_user"),function(){J0("/dev"),q1(259,{read:()=>0,write:(J,v,G,z)=>z,va:()=>0}),e0("/dev/null",259),a1(1280,H2),a1(1536,A2),e0("/dev/tty",1280),e0("/dev/tty1",1536);var w=new Uint8Array(1024),f=0,r=()=>{return f===0&&(d(w),f=w.byteLength),w[--f]};o0("random",r),o0("urandom",r),J0("/dev/shm"),J0("/dev/shm/tmp")}(),function(){J0("/proc");var w=J0("/proc/self");J0("/proc/self/fd"),hw({ua(){var f=Jw(w,"fd",16895,73);return f.da={va:k.da.va},f.ca={Na(r,J){r=+J;var v=G0(r);return r={parent:null,ua:{cb:"fake"},ca:{La:()=>v.path},id:r+1},r.parent=r},Ra(){return Array.from(H0.entries()).filter(([,r])=>r).map(([r])=>r.toString())}},f}},"/proc/self/fd")}();var Uw,Ow,Ww,Vw,yw,Yw,Bw,kw,qw,Nw,Hw,Aw,Pw,_w,Dw,Lw,gw,Iw,Ew,ow,Rw,Fw,Mw,Cw,bw,Tw,uw,xw,pw,Sw,cw,nw,sw,P1,_1,D1,mw,R2={a:{b:(w,f,r,J)=>{throw`Assertion failed: ${R(w)}, at: `+[f?R(f):"unknown filename",r,J?R(J):"unknown function"]},H:function(w,f){try{return w=R(w),f1(w,f),0}catch(r){if(typeof p>"u"||r.name!=="ErrnoError")throw r;return-r.ea}},k:function(w,f,r){try{if(f=R(f),f=z0(w,f),r&-8)return-28;var J=i(f,{Ja:!0}).node;if(!J)return-44;return w="",r&4&&(w+="r"),r&2&&(w+="w"),r&1&&(w+="x"),w&&y0(J,w)?-2:0}catch(v){if(typeof p>"u"||v.name!=="ErrnoError")throw v;return-v.ea}},c:function(w,f,r){R0=r;try{var J=G0(w);switch(f){case 0:var v=j0();if(v<0)break;for(;H0[v];)v++;return L2(J,v).Ha;case 1:case 2:return 0;case 3:return J.flags;case 4:return v=j0(),J.flags=J.flags&-289793|v&289792,0;case 12:return v=j0(),I[v+0>>1]=2,0;case 13:case 14:return 0}return-28}catch(G){if(typeof p>"u"||G.name!=="ErrnoError")throw G;return-G.ea}},G:function(w,f){try{var r=G0(w),J=r.node,v=r.da.ta;w=v?r:J,v??=J.ca.ta,I0(v,63);var G=v(w);return $1(f,G)}catch(z){if(typeof p>"u"||z.name!=="ErrnoError")throw z;return-z.ea}},C:function(w,f){try{if(f===0)return-28;var r=l0("/")+1;if(f<r)return-68;return g0("/",N,w,f),r}catch(J){if(typeof p>"u"||J.name!=="ErrnoError")throw J;return-J.ea}},w:function(w,f,r){try{var J=G0(w);if(!J.Ka){var v=i(J.path,{Ja:!0}).node,G=I0(v.ca.Ra,54)(v);J.Ka=G}w=0;var z=r1(J,0,1),q=Math.floor(z/280),o=Math.min(J.Ka.length,q+Math.floor(r/280));for(r=q;r<o;r++){var L=J.Ka[r];if(L===".")var S=J.node.id,m=4;else if(L==="..")S=i(J.path,{parent:!0}).node.id,m=4;else{try{var w0=h0(J.node,L)}catch(f0){if(f0?.ea===28)continue;throw f0}S=w0.id,m=(w0.mode&61440)===8192?2:a(w0.mode)?4:(w0.mode&61440)===40960?10:8}W[f+w>>3]=BigInt(S),W[f+w+8>>3]=BigInt((r+1)*280),I[f+w+16>>1]=280,A[f+w+18]=m,g0(L,N,f+w+19,256),w+=280}return r1(J,r*280,0),w}catch(f0){if(typeof p>"u"||f0.name!=="ErrnoError")throw f0;return-f0.ea}},m:function(w,f,r){R0=r;try{var J=G0(w);switch(f){case 21509:return J.fa?0:-59;case 21505:if(!J.fa)return-59;if(J.fa.Ga.mb){w=[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];var v=j0();E[v>>2]=25856,E[v+4>>2]=5,E[v+8>>2]=191,E[v+12>>2]=35387;for(var G=0;G<32;G++)A[v+G+17]=w[G]||0}return 0;case 21510:case 21511:case 21512:return J.fa?0:-59;case 21506:case 21507:case 21508:if(!J.fa)return-59;if(J.fa.Ga.nb)for(v=j0(),w=[],G=0;G<32;G++)w.push(A[v+G+17]);return 0;case 21519:if(!J.fa)return-59;return v=j0(),E[v>>2]=0;case 21520:return J.fa?-28:-59;case 21537:case 21531:if(v=j0(),!J.da.lb)throw new j(59);return J.da.lb(J,f,v);case 21523:if(!J.fa)return-59;return J.fa.Ga.ob&&(G=[24,80],v=j0(),I[v>>1]=G[0],I[v+2>>1]=G[1]),0;case 21524:return J.fa?0:-59;case 21515:return J.fa?0:-59;default:return-28}}catch(z){if(typeof p>"u"||z.name!=="ErrnoError")throw z;return-z.ea}},D:function(w,f){try{return w=R(w),$1(f,w1(w,!0))}catch(r){if(typeof p>"u"||r.name!=="ErrnoError")throw r;return-r.ea}},x:function(w,f,r){try{return f=R(f),f=z0(w,f),J0(f,r&-19),0}catch(J){if(typeof p>"u"||J.name!=="ErrnoError")throw J;return-J.ea}},E:function(w,f,r,J){try{f=R(f);var v=J&256;return f=z0(w,f,J&4096),$1(r,v?w1(f,!0):w1(f))}catch(G){if(typeof p>"u"||G.name!=="ErrnoError")throw G;return-G.ea}},i:function(w,f,r,J){R0=J;try{f=R(f),f=z0(w,f);var v=J?j0():0;return r&64&&(v&=-19),E0(f,r,v).Ha}catch(G){if(typeof p>"u"||G.name!=="ErrnoError")throw G;return-G.ea}},v:function(w,f,r,J){try{if(f=R(f),f=z0(w,f),J<=0)return-28;var v=i(f).node;if(!v)throw new j(44);if(!v.ca.La)throw new j(28);var G=v.ca.La(v),z=Math.min(J,l0(G)),q=A[r+z];return g0(G,N,r,J+1),A[r+z]=q,z}catch(o){if(typeof p>"u"||o.name!=="ErrnoError")throw o;return-o.ea}},u:function(w,f,r,J){try{f=R(f),J=R(J),f=z0(w,f),J=z0(r,J),w=f;var v=x(w),G=x(J),z=C(w),q=C(J),o=i(w,{parent:!0}),L=o.node;o=i(J,{parent:!0});var S=o.node;if(!L||!S)throw new j(44);if(L.ua!==S.ua)throw new j(75);var m=h0(L,z),w0=L0(w,G);if(w0.charAt(0)!==".")throw new j(28);if(w0=L0(J,v),w0.charAt(0)!==".")throw new j(55);try{var f0=h0(S,q)}catch(v0){}if(m!==f0){var F0=a(m.mode),X0=d0(L,z,F0);if(X0)throw new j(X0);if(X0=f0?d0(S,q,F0):k1(S,q))throw new j(X0);if(!L.ca.Sa)throw new j(63);if(m.Ia||f0&&f0.Ia)throw new j(10);if(S!==L&&(X0=y0(L,"w")))throw new j(X0);t0(m);try{L.ca.Sa(m,S,q),m.parent=S}catch(v0){throw v0}finally{$w(m)}}return 0}catch(v0){if(typeof p>"u"||v0.name!=="ErrnoError")throw v0;return-v0.ea}},t:function(w){try{return w=R(w),Gw(w),0}catch(f){if(typeof p>"u"||f.name!=="ErrnoError")throw f;return-f.ea}},F:function(w,f){try{return w=R(w),$1(f,w1(w))}catch(r){if(typeof p>"u"||r.name!=="ErrnoError")throw r;return-r.ea}},s:function(w,f,r){try{if(f=R(f),f=z0(w,f),r)if(r===512)Gw(f);else return-28;else{w=f;var J=i(w,{parent:!0}).node;if(!J)throw new j(44);var v=C(w),G=h0(J,v),z=d0(J,v,!1);if(z)throw new j(z);if(!J.ca.Va)throw new j(63);if(G.Ia)throw new j(10);J.ca.Va(J,v),t0(G)}return 0}catch(q){if(typeof p>"u"||q.name!=="ErrnoError")throw q;return-q.ea}},r:function(w,f,r){try{f=R(f),f=z0(w,f,!0);var J=Date.now(),v,G;if(r){var z=_[r>>2]+E[r+4>>2]*4294967296,q=E[r+8>>2];q==1073741823?v=J:q==1073741822?v=null:v=z*1000+q/1e6,r+=16,z=_[r>>2]+E[r+4>>2]*4294967296,q=E[r+8>>2],q==1073741823?G=J:q==1073741822?G=null:G=z*1000+q/1e6}else G=v=J;if((G??v)!==null){w=v;var o=i(f,{Ja:!0}).node;I0(o.ca.Ea,63)(o,{Fa:w,ra:G})}return 0}catch(L){if(typeof p>"u"||L.name!=="ErrnoError")throw L;return-L.ea}},l:()=>{throw""},p:()=>{throw new V},j:()=>Date.now(),f:()=>performance.now(),q:(w)=>{var f=N.length;if(w>>>=0,w>2147483648)return!1;for(var r=1;r<=4;r*=2){var J=f*(1+0.2/r);J=Math.min(J,w+100663296);w:{J=(Math.min(2147483648,Math.ceil(Math.max(w,J)/65536)*65536)-H.buffer.byteLength+65535)/65536|0;try{H.grow(J),b();var v=1;break w}catch(G){}v=void 0}if(v)return!0}return!1},z:(w,f)=>{var r=0,J=0,v;for(v of zw()){var G=f+r;_[w+J>>2]=G,r+=g0(v,N,G,1/0)+1,J+=4}return 0},A:(w,f)=>{var r=zw();_[w>>2]=r.length,w=0;for(var J of r)w+=l0(J)+1;return _[f>>2]=w,0},g:(w)=>{throw`exit(${w})`},d:function(w){try{var f=G0(w);return Qw(f),0}catch(r){if(typeof p>"u"||r.name!=="ErrnoError")throw r;return r.ea}},h:function(w,f,r,J){try{w:{var v=G0(w);w=f;for(var G,z=f=0;z<r;z++){var q=_[w>>2],o=_[w+4>>2];w+=8;var L=v,S=q,m=o,w0=G,f0=A;if(m<0||w0<0)throw new j(28);if(L.Ha===null)throw new j(8);if((L.flags&2097155)===1)throw new j(8);if(a(L.node.mode))throw new j(31);if(!L.da.read)throw new j(28);var F0=typeof w0<"u";if(!F0)w0=L.position;else if(!L.seekable)throw new j(70);var X0=L.da.read(L,f0,S,m,w0);F0||(L.position+=X0);var v0=X0;if(v0<0){var iw=-1;break w}if(f+=v0,v0<o)break;typeof G<"u"&&(G+=v0)}iw=f}return _[J>>2]=iw,0}catch(g1){if(typeof p>"u"||g1.name!=="ErrnoError")throw g1;return g1.ea}},y:function(w,f,r,J){f=f<-9007199254740992||f>9007199254740992?NaN:Number(f);try{if(isNaN(f))return 22;var v=G0(w);return r1(v,f,r),W[J>>3]=BigInt(v.position),v.Ka&&f===0&&r===0&&(v.Ka=null),0}catch(G){if(typeof p>"u"||G.name!=="ErrnoError")throw G;return G.ea}},e:function(w,f,r,J){try{w:{var v=G0(w);w=f;for(var G,z=f=0;z<r;z++){var q=_[w>>2],o=_[w+4>>2];w+=8;var L=Kw(v,A,q,o,G);if(L<0){var S=-1;break w}if(f+=L,L<o)break;typeof G<"u"&&(G+=L)}S=f}return _[J>>2]=S,0}catch(m){if(typeof p>"u"||m.name!=="ErrnoError")throw m;return m.ea}},o:function(w,f,r){var J=D1();try{return Xw(w)(f,r)}catch(v){if(_1(J),!(v instanceof Q))throw v;P1(1,0)}},n:function(w,f,r,J,v){var G=D1();try{return Xw(w)(f,r,J,v)}catch(z){if(_1(G),!(z instanceof Q))throw z;P1(1,0)}},a:H,B:(w,f)=>d(N.subarray(w,w+f))}};WebAssembly.instantiateStreaming(fetch(new URL("akarisub-worker.wasm",self.location.href)),R2).then((w)=>{w=w.instance.exports,Uw=w.J,Ow=w.K,Ww=w.L,Vw=w.M,yw=w.N,Yw=w.O,Bw=w.P,kw=w.Q,qw=w.R,Nw=w.S,Hw=w.T,Aw=w.U,Pw=w.V,_w=w.W,Dw=w.X,Lw=w.Y,gw=w.Z,Iw=w._,Ew=w.$,ow=w.aa,Rw=w.ba,Fw=w.ha,Mw=w.ia,Cw=w.ja,bw=w.ka,Tw=w.la,uw=w.ma,xw=w.na,pw=w.oa,Sw=w.pa,cw=w.xa,nw=w.ya,sw=w.Aa,P1=w.Ba,_1=w.Ca,D1=w.Da,mw=w.za,c=!0,h.noFSInit||fw||(fw=!0,N1("/dev/tty","/dev/stdin"),N1("/dev/tty","/dev/stdout"),N1("/dev/tty1","/dev/stderr"),E0("/dev/stdin",0),E0("/dev/stdout",1),E0("/dev/stderr",1)),w.I(),rw=!1,U()});let L1=()=>{try{typeof H<"u"&&(self.wasmMemory=H,self.HEAPU8C=new Uint8ClampedArray(H.buffer),typeof BigInt64Array<"u"&&(self.HEAP64=new BigInt64Array(H.buffer),self.HEAPU64=new BigUint64Array(H.buffer))),typeof N<"u"&&(self.HEAPU8=N),typeof W<"u"&&(self.HEAP64=W),typeof Y<"u"&&(self.HEAPU64=Y)}catch(w){}};if(typeof updateGlobalBufferAndViews==="function"){let w=updateGlobalBufferAndViews;updateGlobalBufferAndViews=(f)=>{w(f),L1()}}if(typeof b==="function"){let w=b;b=()=>{w(),L1()}}let lw=typeof U==="function"?U:null;return lw&&(U=()=>{return Object.assign(h,{_malloc:Ow,_free:Ww,_akarisub_create:Uw,_akarisub_destroy:Vw,_akarisub_set_drop_animations:yw,_akarisub_create_track_mem:Yw,_akarisub_remove_track:Bw,_akarisub_resize_canvas:kw,_akarisub_add_font:qw,_akarisub_reload_fonts:Nw,_akarisub_set_default_font:Hw,_akarisub_set_fallback_fonts:Aw,_akarisub_set_memory_limits:Pw,_akarisub_get_event_count:_w,_akarisub_alloc_event:Dw,_akarisub_remove_event:Lw,_akarisub_get_style_count:gw,_akarisub_alloc_style:Iw,_akarisub_remove_style:Ew,_akarisub_style_override_index:ow,_akarisub_disable_style_override:Rw,_akarisub_get_track_color_space:Fw,_akarisub_event_get_int:Mw,_akarisub_event_set_int:Cw,_akarisub_event_get_str:bw,_akarisub_event_set_str:Tw,_akarisub_style_get_num:uw,_akarisub_style_set_num:xw,_akarisub_style_get_str:pw,_akarisub_style_set_str:Sw,_akarisub_render_blend_collect:cw,_akarisub_render_image_collect:nw}),typeof p<"u"&&(h.FS_createPath=E2,h.FS_createDataFile=o2),L1(),lw()}),c?Z=h:Z=new Promise((w)=>{B=w}),Z}var tw=F2;var I1=[null,"BT601",null,"BT601","BT601","BT709","BT709","SMPTE240M","SMPTE240M","FCC","FCC"];function dw($,Z=!1){let h=[],K=$.split(/[\r\n]+/g),X=K.length,U=null,Q=null;for(let V=0;V<X;V++){let B=K[V];if(!B||/^\s*$/.test(B))continue;let c=B[0];if(c==="["){let b=B.match(/^\[(.*)\]$/);if(b){if(Z&&b[1].toLowerCase()==="events")break;U=null,Q={name:b[1],body:[]},h.push(Q);continue}}if(!Q)continue;if(c===";")Q.body.push({type:"comment",value:B.substring(1)});else{let b=B.indexOf(":");if(b===-1)continue;let I=B.substring(0,b),E=B.substring(b+1).trim();if(U||I==="Format"){let W=E.split(",");if(U&&W.length>U.length){let _=W.slice(U.length-1).join(",");W=W.slice(0,U.length-1),W.push(_)}let A=W.length;for(let _=0;_<A;_++)W[_]=W[_].trim();if(U){let _={},Y=Math.min(U.length,A);for(let N=0;N<Y;N++)_[U[N]]=W[N];E=_}else E=W}if(I==="Format")U=E;Q.body.push({key:I,value:E})}}return h}var M2=/\\blur(?:[0-9]+\.)?[0-9]+/gm;function E1($){return $.replace(M2,"")}var C2=[{w:7680,h:4320},{w:3840,h:2160},{w:2560,h:1440},{w:1920,h:1080},{w:1280,h:720}];function b2($,Z){let h=[...C2].sort((K,X)=>K.w-X.w);for(let K of h)if($<=K.w&&Z<=K.h)return K;return{w:Math.ceil($/100)*100,h:Math.ceil(Z/100)*100}}function n($,Z){return Z&&Z.includes(".")?$.toFixed(2).replace(/\.?0+$/,""):Math.round($)}function o1($){let Z=$.match(/PlayResX:\s*(\d+)/i),h=$.match(/PlayResY:\s*(\d+)/i),K=Z?parseInt(Z[1],10):1920,X=h?parseInt(h[1],10):1080,U=/\\pos\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,Q=/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)/g,V=/\\org\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,B=/\\i?clip\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,c=0,b=0,I=(M,y,x)=>{let C,K0=new RegExp(M.source,"g");while((C=K0.exec($))!==null){for(let d of y)if(C[d]){let $0=Math.abs(parseFloat(C[d]));if($0>c)c=$0}for(let d of x)if(C[d]){let $0=Math.abs(parseFloat(C[d]));if($0>b)b=$0}}};if(I(U,[1],[2]),I(Q,[1,3],[2,4]),I(V,[1],[2]),I(B,[1,3],[2,4]),c<=K&&b<=X)return $;let E=b2(c,b),W=K/E.w,A=X/E.h,_=Math.min(W,A),Y=Math.max(W,A),N=1,H=$,D=H.match(/(\[Events\][\s\S]*)/i);if(!D)return H;let O=D[1];return O=O.replace(U,(M,y,x)=>`\\pos(${n(parseFloat(y)*W,y)},${n(parseFloat(x)*A,x)})`),O=O.replace(/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)(?:\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+))?\s*\)/g,(M,y,x,C,K0,d,$0)=>{let L0=`\\move(${n(parseFloat(y)*W,y)},${n(parseFloat(x)*A,x)},${n(parseFloat(C)*W,C)},${n(parseFloat(K0)*A,K0)}`;return d?`${L0},${d},${$0})`:`${L0})`}),O=O.replace(V,(M,y,x)=>`\\org(${n(parseFloat(y)*W,y)},${n(parseFloat(x)*A,x)})`),O=O.replace(/\\(i?clip)\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,(M,y,x,C,K0,d)=>`\\${y}(${n(parseFloat(x)*W,x)},${n(parseFloat(C)*A,C)},${n(parseFloat(K0)*W,K0)},${n(parseFloat(d)*A,d)})`),O=O.replace(/\\fs([\d.]+)/g,(M,y)=>`\\fs${n(parseFloat(y)*Y,y)}`),O=O.replace(/\\fscx([\d.]+)/g,(M,y)=>`\\fscx${n(parseFloat(y)*N,y)}`),O=O.replace(/\\xbord([\d.]+)/g,(M,y)=>`\\xbord${n(parseFloat(y)*W,y)}`),O=O.replace(/\\ybord([\d.]+)/g,(M,y)=>`\\ybord${n(parseFloat(y)*A,y)}`),O=O.replace(/\\xshad(-?[\d.]+)/g,(M,y)=>`\\xshad${n(parseFloat(y)*W,y)}`),O=O.replace(/\\yshad(-?[\d.]+)/g,(M,y)=>`\\yshad${n(parseFloat(y)*A,y)}`),["fsp","bord","shad","be","blur"].forEach((M)=>{let y=new RegExp(`\\\\${M}(-?[\\d.]+)`,"g");O=O.replace(y,(x,C)=>`\\${M}${n(parseFloat(C)*_,C)}`)}),O=O.replace(/(\\i?clip\s*\([^,)]+m[^)]+\)|\\p[1-9][^}]*?)(?=[\\}]|$)/g,(M)=>{return M.replace(/(-?[\d.]+)\s+(-?[\d.]+)/g,(y,x,C)=>{return`${n(parseFloat(x)*W,x)} ${n(parseFloat(C)*A,C)}`})}),H.substring(0,D.index)+O}var q0=0,$2=1,Z0=null,R1=!1,D0=()=>typeof performance<"u"?performance.now():Date.now(),O1=D0(),Q1=24,x0=!1,J2=!1,s1="wasm",B0={},K1={},v2=0,Z2=0,M0=[],s=!1,Z1=!1,p0=!1,T2=3,t=[];self.width=0;self.height=0;var P={framesRendered:0,framesDropped:0,totalRenderTime:0,maxRenderTime:0,minRenderTime:1/0,lastRenderTime:0,renderStartTime:0,pendingRenders:0,totalEvents:0,currentEventIndex:0,cacheHits:0,cacheMisses:0},u2=()=>{P.framesRendered=0,P.framesDropped=0,P.totalRenderTime=0,P.maxRenderTime=0,P.minRenderTime=1/0,P.lastRenderTime=0,P.cacheHits=0,P.cacheMisses=0},O0=!1,C0=!0,U0=null,A0=null,S0=!1,Y0=null,h2=null,F=0,P0=null,h1=!1,G2=!1,x2=!1,l=null,z1=!1,Q2=new TextEncoder,p2=new TextDecoder,b1=null,W1=128,K2=Math.max(W1,4096),z2=K2;var S2=30,c2=1,n2=24,T1=1000,j2=Array(W1),aw=!1,u1=3,G1=5,e=0,Q0=0,s2=[],m2=[],l2=[],F1=null;var i2=!1,V1=null,k0=null,_0=!1,x1=($)=>new Promise((Z)=>setTimeout(Z,$)),X2=()=>{if(aw)return;for(let $=0;$<W1;$++)j2[$]={w:0,h:0,x:0,y:0,image:0};aw=!0},ew=($)=>{if($<W1)return j2[$];return{w:0,h:0,x:0,y:0,image:0}},m1=($)=>{if(!l||$<=0)return;let Z=u1+G1*$;if(Q0>=Z&&e)return;let h=Math.max(Z,(Q0||64)*2),K=h*Int32Array.BYTES_PER_ELEMENT;if(e)l._free(e),e=0,Q0=0;if(e=l._malloc(K),!e)throw Q0=0,Error("Failed to allocate render-collect buffer");Q0=h},j1=($)=>{if(!F)return;let Z=g(),h=u();if(m1(z2),s1==="wasm")Z.renderBlendCollect(h,$,0,e,Q0);else Z.renderImageCollect(h,$,0,e,Q0)},n0=()=>{P.totalEvents=F?g().getEventCount(F):0},U2=()=>{if(!F)return null;let $=g(),Z=u(),h=$.getEventCount(Z);if(h<=0)return null;let K=Number.POSITIVE_INFINITY;for(let X=0;X<h;X++){let U=$.eventGetInt(Z,X,r0.Start)/T1;if(Number.isFinite(U)&&U<K)K=U}if(!Number.isFinite(K))return null;return Math.max(0,K)},t2=()=>{if(!F)return null;let $=g(),Z=u(),h=$.getEventCount(Z);if(h<=0)return null;let K=Number.POSITIVE_INFINITY,X=0;for(let U=0;U<h;U++){let Q=$.eventGetInt(Z,U,r0.Start)/T1,V=Math.max(0,$.eventGetInt(Z,U,r0.Duration)/T1);if(!Number.isFinite(Q))continue;let B=Q+V;if(Q<K)K=Q;if(B>X)X=B}if(!Number.isFinite(K))return null;if(X<K)X=K;return{start:Math.max(0,K),end:Math.max(0,X)}},d2=async()=>{if(!F)return;let $=t2();if(!$)return;let Z=Math.min($.end,$.start+S2),h=0;for(let K=$.start;K<=Z;K+=c2){if(!F)return;if(x0&&(p0||t.length>0||P.pendingRenders>0)){await x1(0);continue}if(j1(K),h++,x0||h%n2===0)await x1(0)}j1(Z)};var y1=()=>{if(i2=!1,F1)clearTimeout(F1),F1=null},a2=()=>{if(!G2||k0||!F)return;k0=(async()=>{await x1(0);try{await d2()}catch($){if(s)console.warn("[AkariSub] Full track warmup failed, continuing:",$)}try{if(F)j1(Y2())}catch($){if(s)console.warn("[AkariSub] Post-warmup re-prime failed, continuing:",$)}})().finally(()=>{k0=null})};var r0={Start:0,Duration:1,ReadOrder:2,Layer:3,Style:4,MarginL:5,MarginR:6,MarginV:7},b0={Name:0,Effect:1,Text:2},T={FontSize:0,PrimaryColour:1,SecondaryColour:2,OutlineColour:3,BackColour:4,Bold:5,Italic:6,Underline:7,StrikeOut:8,ScaleX:9,ScaleY:10,Spacing:11,Angle:12,BorderStyle:13,Outline:14,Shadow:15,Alignment:16,MarginL:17,MarginR:18,MarginV:19,Encoding:20,treat_fontname_as_pattern:21,Blur:22,Justify:23},X1={Name:0,FontName:1},e2=($)=>{return Q2.encode($)},w4=($)=>{if(!l)return 0;let Z=e2($),h=l._malloc(Z.length+1);if(!h)return 0;return self.HEAPU8.set(Z,h),self.HEAPU8[h+Z.length]=0,h},T0=($)=>{if(!$)return"";let Z=$,h=self.HEAPU8;while(h[Z]!==0)Z++;return p2.decode(h.subarray($,Z))},N0=($,Z)=>{let h=w4($);try{return Z(h)}finally{if(h&&l)l._free(h)}},p1=($)=>{return $ instanceof Uint8Array?$:new Uint8Array($)},f4=($)=>{return $ instanceof Uint8Array||$ instanceof ArrayBuffer},r4=($,Z)=>{if(!l)throw Error("AkariSub module is not initialized");let h=l._malloc($.length+1);if(!h)throw Error("Failed to allocate subtitle content");try{return self.HEAPU8.set($,h),self.HEAPU8[h+$.length]=0,Z(h)}finally{self.HEAPU8.fill(0,h,h+$.length+1),l._free(h)}},w2=async($,Z)=>{let h=new Uint8Array($),K=8,X=12,U=21;if(h.length<37)throw Error("Ciphertext too short for v2 subtitle payload");if(h[0]!==2)throw Error("Unsupported encrypted subtitle protocol version");let Q=h.subarray(0,9),V=h.subarray(9,21),B=h.subarray(21),c=await crypto.subtle.decrypt({name:"AES-GCM",iv:V.buffer.slice(V.byteOffset,V.byteOffset+V.byteLength),additionalData:Q.buffer.slice(Q.byteOffset,Q.byteOffset+Q.byteLength),tagLength:128},Z,B.buffer.slice(B.byteOffset,B.byteOffset+B.byteLength));return new Uint8Array(c)},O2=async($)=>{if($.encrypted)return w2($.encrypted,$.contentKey);let Z=$.encryptedChunks||[];if(Z.length===0)throw Error("Encrypted subtitle content is empty");let h=await Promise.all(Z.map((Q)=>w2(Q,$.contentKey))),K=h.reduce((Q,V)=>Q+V.length,0),X=new Uint8Array(K),U=0;for(let Q of h)X.set(Q,U),Q.fill(0),U+=Q.length;return X},l1=($)=>{let Z=g(),h=u();r4($,(K)=>{Z.createTrackMem(h,K)})},W2=($)=>{let Z=g(),h=u();N0($,(K)=>{Z.createTrackMem(h,K)})},g=()=>{if(!b1)throw Error("AkariSub API is not initialized");return b1},u=()=>{if(!F)throw Error("AkariSub instance is not initialized");return F};self.addFont=({font:$})=>V2($,!1);var J1=($)=>{if($=$.trim().toLowerCase(),$.startsWith("@"))$=$.substring(1);if(K1[$])return;if(K1[$]=!0,!B0[$]){if(J2)postMessage({target:"getLocalFont",font:$})}else V2(B0[$])},V2=($,Z=!0)=>{if(typeof $==="string")c1($,(h)=>{f2(new Uint8Array(h),Z)},console.error);else f2($,Z)};var M1=null,$4=()=>{if(M1)return;M1=setTimeout(()=>{if(M1=null,F)g().reloadFonts(F)},16)},c0=($,Z)=>{if(!l||!F){if(s)console.warn("[AkariSub] Cannot add embedded font, module or AkariSub not ready:",Z);return}try{let h=g(),K=l._malloc($.length);if(!K){console.warn("[AkariSub] Failed to allocate memory for embedded font:",Z);return}if(self.HEAPU8.set($,K),N0(Z,(X)=>{h.addFont(F,X,K,$.length)}),s)console.log("[AkariSub] Added embedded font:",Z,"size:",$.length)}catch(h){console.warn("[AkariSub] Failed to add embedded font:",Z,h)}},f2=($,Z=!0)=>{let h=Z?"/fonts/fallback":"/fonts/attached",K=Z?"fallback-"+Z2++:"attached-"+v2++;if(l){try{l.FS_createDataFile(h,K,$,!0,!0,!0)}catch(X){console.warn("Failed to write font to filesystem:",h+"/"+K,X)}if(!Z)c0($,K);else if(F)c0($,K);else M0.push({data:$,name:K})}$4()},v1=($,Z=!0)=>{let h=Z?"/fonts/fallback":"/fonts/attached",K=Z?"fallback-"+Z2++:"attached-"+v2++;if(l){try{if(l.FS_createDataFile(h,K,$,!0,!0,!0),s)console.log("[AkariSub] Wrote font to FS:",h+"/"+K,"size:",$.length)}catch(X){console.warn("Failed to write font to filesystem:",h+"/"+K,X)}if(!Z)c0($,K);else if(F)c0($,K);else M0.push({data:$,name:K})}},y2=($)=>{if(!B0)return;if($.length>500000){let h=$.match(/\[V4\+?\s*Styles?\][^\[]*(?=\[|$)/i);if(h){let U=h[0].matchAll(/^Style:[^,]*,([^,]+)/gm);for(let Q of U)J1(Q[1].trim())}let K=$.match(/\[Events\][\s\S]*/i);if(K){let U=K[0].matchAll(/\\fn([^\\}]*?)[\\}]/g),Q=0;for(let V of U)if(J1(V[1]),++Q>=1000)break}}else{let h=dw($,!0);for(let X=0;X<h.length;X++)for(let U=0;U<h[X].body.length;U++){let Q=h[X].body[U];if(Q.key==="Style"&&typeof Q.value==="object"&&!Array.isArray(Q.value))J1(Q.value.Fontname)}let K=$.match(/\[Events\][\s\S]*/i);if(K){let U=K[0].matchAll(/\\fn([^\\}]*?)[\\}]/g);for(let Q of U)J1(Q[1])}}},S1=($,Z)=>{let h=new XMLHttpRequest;return h.open("GET",$,!1),h.responseType=Z?"arraybuffer":"text",h.send(null),h.response},c1=($,Z,h)=>{let K=new XMLHttpRequest;K.open("GET",$,!0),K.responseType="arraybuffer",K.onload=()=>{if((K.status===200||K.status===0)&&K.response)return Z(K.response)},K.onerror=h,K.send(null)},n1=()=>{let $=g(),Z=u();n0(),V1=U2(),P0=I1[$.getTrackColorSpace(Z)],z1=!0,postMessage({target:"verifyColorSpace",subtitleColorSpace:P0}),postMessage({target:"trackReady"})};self.setTrack=({content:$})=>{if(y1(),k0=null,_0=!1,f4($)){l1(p1($)),n1();return}if(y2($),Z1)$=o1($);if(h1)$=E1($);W2($),n1()};self.setEncryptedTrack=async({content:$})=>{y1(),k0=null,_0=!0;let Z=await O2($);try{l1(Z)}finally{Z.fill(0)}n1()};self.getColorSpace=()=>{postMessage({target:"verifyColorSpace",subtitleColorSpace:P0})};self.freeTrack=()=>{y1(),k0=null,V1=null,_0=!1;let $=g(),Z=u();$.removeTrack(Z),n0()};self.setTrackByUrl=({url:$})=>{self.setTrack({content:S1($)})};var u0=!0,Y2=()=>{let $=(D0()-O1)/1000;if(u0)return q0;else{if($>5)console.error("Didn't receive currentTime > 5 seconds. Assuming video was paused."),B2(!0);return q0+$*$2}},J4=($)=>{if(q0=$,O1=D0(),x0)return;if(!Z0)if(R1)Z0=i1(U1);else U1(),R1=!0,setTimeout(()=>{R1=!1},20)},B2=($)=>{if(x0){if(u0=$,Z0)r2(Z0),Z0=null;return}if($!==u0)if(u0=$,$){if(Z0)r2(Z0),Z0=null}else O1=D0(),Z0=i1(U1)},v4=()=>{if(p0||t.length===0)return;if(t.length>1){let Z=t.length-1;P.framesDropped+=Z;let h=t[t.length-1];t.length=0,t.push(h)}let $=t.shift();if(!$)return;s0($.time,$.force)},V0=()=>{p0=!1,v4()},s0=($,Z)=>{if(p0){let W={time:$,force:Z?1:0};if(W.force)t.length=0;else{let A=t[t.length-1];if(A&&Math.abs(A.time-W.time)>0.25)t.length=0}if(t.length>=T2)t.shift(),P.framesDropped++;t.push(W);return}p0=!0,X2();let h={},K=performance.now();P.renderStartTime=K,P.pendingRenders++;let X=g(),U=u(),Q=Z?1:0;m1(K2);let V=s1==="wasm"?X.renderBlendCollect(U,$,Q,e,Q0):X.renderImageCollect(U,$,Q,e,Q0),B=new Int32Array(self.wasmMemory.buffer,e,u1),c=B[0],b=B[1],E=performance.now()-K;if(P.lastRenderTime=E,P.totalRenderTime+=E,P.maxRenderTime=Math.max(P.maxRenderTime,E),E>0)P.minRenderTime=Math.min(P.minRenderTime,E);if(c!==0||Z)P.framesRendered++,P.cacheMisses++;else P.cacheHits++;if(s){let W=performance.now(),A=B[2];h.WASMRenderTime=A-K,h.WASMBitmapDecodeTime=W-A,h.JSRenderTime=Date.now()}if(c!==0||Z){let W=s2,A=m2;if(W.length=0,A.length=0,V===0)return C1({images:W,buffers:A,times:h});let _=e+u1*Int32Array.BYTES_PER_ELEMENT,Y=new Int32Array(self.wasmMemory.buffer,_,V*G1);if(O0&&S0!==!0){let H=l2;H.length=V;for(let D=0;D<V;++D){let O=D*G1,R=ew(D);R.x=Y[O],R.y=Y[O+1],R.w=Y[O+2],R.h=Y[O+3],R.image=0;let M=Y[O+4],y=R.w*R.h*4,x=new Uint8ClampedArray(self.wasmMemory.buffer,M,y),C=new ImageData(x,R.w,R.h);H[D]=C0?createImageBitmap(C,{premultiplyAlpha:"none",colorSpaceConversion:"none"}):createImageBitmap(C),W[D]=R}Promise.all(H).then((D)=>{for(let O=0;O<V;O++)W[O].image=D[O];if(s)h.JSBitmapGenerationTime=Date.now()-(h.JSRenderTime||0);C1({images:W,buffers:D,times:h})}).catch(()=>{if(C0)C0=!1,console.warn("[AkariSub] createImageBitmap options not supported, disabling"),P.pendingRenders--,V0(),s0($,Z);else P.pendingRenders--,postMessage({target:"unbusy"}),V0()})}else{for(let H=0;H<V;++H){let D=H*G1,O=ew(H);if(O.x=Y[D],O.y=Y[D+1],O.w=Y[D+2],O.h=Y[D+3],O.image=Y[D+4],!A0){let R=O.image,M=O.w*O.h*4,y=new Uint8ClampedArray(M);y.set(self.HEAPU8C.subarray(R,R+M)),A.push(y.buffer),O.image=y}W[H]=O}C1({images:W,buffers:A,times:h})}}else P.pendingRenders--,postMessage({target:"unbusy"}),V0()};self.demand=({time:$})=>{q0=$,O1=D0();let Z=z1?1:0;z1=!1,s0($,Z)};var U1=($)=>{if(Z0=null,s0(Y2(),$),!u0)Z0=i1(U1)},C1=({times:$,images:Z,buffers:h})=>{P.pendingRenders--;let{width:K,height:X}=self,U=Z.length,Q={target:"render",asyncRender:O0,images:Z,times:$,width:K,height:X,colorSpace:P0};if(S0){if(U0.height!==X||U0.width!==K)U0.width=K,U0.height=X;if(A0.clearRect(0,0,K,X),O0)for(let V=0;V<U;V++){let B=Z[V];if(B.image)A0.drawImage(B.image,B.x,B.y),B.image.close()}else for(let V=0;V<U;V++){let B=Z[V];if(B.image){let{w:c,h:b}=B;if(Y0.width!==c||Y0.height!==b)Y0.width=c,Y0.height=b;let I=B.image,E=c*b*4,W=self.HEAPU8C.subarray(I,I+E);h2.putImageData(new ImageData(W,c,b),0,0),A0.drawImage(Y0,B.x,B.y)}}if(S0==="hybrid"){if(!U){postMessage(Q),V0();return}if(s)$.bitmaps=U;try{let V=U0.transferToImageBitmap(),B={...Q,images:[{image:V,x:0,y:0}],asyncRender:!0};postMessage(B,[V]),V0()}catch{postMessage({target:"unbusy"}),V0()}}else{if(s){$.JSRenderTime=Date.now()-($.JSRenderTime||0)-($.JSBitmapGenerationTime||0);let V=0;for(let B in $)V+=$[B]||0;console.log("Bitmaps: "+U+" Total: "+(V|0)+"ms",$)}postMessage({target:"unbusy"}),V0()}}else postMessage(Q,h),V0()},i1=self.requestAnimationFrame?self.requestAnimationFrame.bind(self):(()=>{let $=0;return(Z)=>{let h=D0();if($===0)$=h+1000/Q1;else while(h+2>=$)$+=1000/Q1;let K=Math.max($-h,0);return setTimeout(Z,K)}})(),r2=self.cancelAnimationFrame?self.cancelAnimationFrame.bind(self):clearTimeout;self.init=async($)=>{if(x2=$.hasBitmapBug,G2=!!$.fullTrackWarmup,typeof $.initialTime==="number"&&Number.isFinite($.initialTime))q0=$.initialTime;let Z=self.fetch,h=(Q)=>{if(WebAssembly.instantiateStreaming)self.fetch=(V)=>Z(Q)},K=()=>{self.fetch=Z},X=(Q)=>{return h(Q),tw({wasm:!WebAssembly.instantiateStreaming?S1(Q,!0):void 0}).finally(K)},U=async(Q)=>{l=Q,b1={create:Q._akarisub_create,destroy:Q._akarisub_destroy,setDropAnimations:Q._akarisub_set_drop_animations,createTrackMem:Q._akarisub_create_track_mem,removeTrack:Q._akarisub_remove_track,resizeCanvas:Q._akarisub_resize_canvas,addFont:Q._akarisub_add_font,reloadFonts:Q._akarisub_reload_fonts,setDefaultFont:Q._akarisub_set_default_font,setFallbackFonts:Q._akarisub_set_fallback_fonts,setMemoryLimits:Q._akarisub_set_memory_limits,getEventCount:Q._akarisub_get_event_count,allocEvent:Q._akarisub_alloc_event,removeEvent:Q._akarisub_remove_event,getStyleCount:Q._akarisub_get_style_count,allocStyle:Q._akarisub_alloc_style,removeStyle:Q._akarisub_remove_style,styleOverrideIndex:Q._akarisub_style_override_index,disableStyleOverride:Q._akarisub_disable_style_override,getTrackColorSpace:Q._akarisub_get_track_color_space,eventGetInt:Q._akarisub_event_get_int,eventSetInt:Q._akarisub_event_set_int,eventGetStr:Q._akarisub_event_get_str,eventSetStr:Q._akarisub_event_set_str,styleGetNum:Q._akarisub_style_get_num,styleSetNum:Q._akarisub_style_set_num,styleGetStr:Q._akarisub_style_get_str,styleSetStr:Q._akarisub_style_set_str,renderBlendCollect:Q._akarisub_render_blend_collect,renderImageCollect:Q._akarisub_render_image_collect};let V=[],B=new Set;if($.fallbackFonts&&$.fallbackFonts.length>0)for(let Y of $.fallbackFonts){let N=Y.trim(),H=N.toLowerCase();if(H&&!B.has(H))B.add(H),V.push(N)}try{Q.FS_createPath("/","fonts",!0,!0),Q.FS_createPath("/fonts","attached",!0,!0),Q.FS_createPath("/fonts","fallback",!0,!0),Q.FS_createPath("/","fontconfig",!0,!0),Q.FS_createPath("/","assets",!0,!0),Q.FS_createPath("/","etc",!0,!0),Q.FS_createPath("/etc","fonts",!0,!0);let Y=`<?xml version="1.0"?>
|
|
1
|
+
(()=>{async function m4($={}){var Z,h=$,z=(...w)=>{console.log(...w)},r=(...w)=>{console.error(...w)};function U(){D?.(h)}(function(){var w=typeof WebAssembly<"u"&&WebAssembly.instantiateStreaming;w&&(WebAssembly.instantiateStreaming=function(f,J){var G=null;return f=Promise.resolve(f).then(function(Q){return G=Q.clone(),Q}),w.call(WebAssembly,f,J).catch(function(Q){if(console.warn("[AkariSub] instantiateStreaming failed, using ArrayBuffer fallback:",Q&&Q.message||Q),!G)throw Q;return G.arrayBuffer().then(function(v){return WebAssembly.instantiate(v,J)})})})})(),z=(w)=>{w==="AkariSub: No usable fontconfig configuration file found, using fallback."||w.startsWith("Unable to revert mtime:")||w.trim()===""?console.debug(w):console.log(w)},r=(w)=>{w==="Fontconfig error: Cannot load default config file: No such file: (null)"||w==="Fontconfig error: Cannot load default config file: File not found"||w==="Fontconfig error: No writable cache directories"||w.includes("/var/cache/fontconfig")||w.includes("/.cache/fontconfig")||w.includes("/.local/share/fonts")?console.debug(w):console.error(w)};class K{}class A extends K{}var D,c=!1;function C(){var w=B.buffer;_=new Int8Array(w),L=new Int16Array(w),O=new Uint8Array(w),new Uint16Array(w),H=new Int32Array(w),I=new Uint32Array(w),new Float32Array(w),new Float64Array(w),W=new BigInt64Array(w),N=new BigUint64Array(w)}B=new WebAssembly.Memory({initial:256,maximum:32768}),C();var L,H,W,_,I,N,O,B,q=new TextDecoder,Y=(w,f)=>{for(var J=f+void 0;w[f]&&!(f>=J);)++f;return f},x=(w)=>w?q.decode(O.subarray(w,Y(O,w))):"",F=(w,f)=>{for(var J=0,G=w.length-1;G>=0;G--){var Q=w[G];Q==="."?w.splice(G,1):Q===".."?(w.splice(G,1),J++):J&&(w.splice(G,1),J--)}if(f)for(;J;J--)w.unshift("..");return w},V=(w)=>{var f=w.charAt(0)==="/",J=w.slice(-1)==="/";return(w=F(w.split("/").filter((G)=>!!G),!f).join("/"))||f||(w="."),w&&J&&(w+="/"),(f?"/":"")+w},u=(w)=>{var f=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(w).slice(1);if(w=f[0],f=f[1],!w&&!f)return".";return f&&=f.slice(0,-1),w+f},S=(w)=>w&&w.match(/([^\/]+|\/)\/*$/)[1],z0=()=>(w)=>(crypto.getRandomValues(w),0),a=(w)=>(a=z0())(w),J0=(...w)=>{for(var f="",J=!1,G=w.length-1;G>=-1&&!J;G--){if(J=G>=0?w[G]:"/",typeof J!="string")throw TypeError("Arguments to path.resolve must be strings");if(!J)return"";f=J+"/"+f,J=J.charAt(0)==="/"}return f=F(f.split("/").filter((Q)=>!!Q),!J).join("/"),(J?"/":"")+f||"."},I0=(w,f)=>{function J(j){for(var y=0;y<j.length&&j[y]==="";y++);for(var R=j.length-1;R>=0&&j[R]==="";R--);return y>R?[]:j.slice(y,R-y+1)}w=J0(w).slice(1),f=J0(f).slice(1),w=J(w.split("/")),f=J(f.split("/"));for(var G=Math.min(w.length,f.length),Q=G,v=0;v<G;v++)if(w[v]!==f[v]){Q=v;break}G=[];for(v=Q;v<w.length;v++)G.push("..");return G=G.concat(f.slice(Q)),G.join("/")},i0=(w)=>{var f=Y(w,0);return q.decode(w.buffer?w.subarray(0,f):new Uint8Array(w.slice(0,f)))},G2=[],d0=(w)=>{for(var f=0,J=0;J<w.length;++J){var G=w.charCodeAt(J);G<=127?f++:G<=2047?f+=2:G>=55296&&G<=57343?(f+=4,++J):f+=3}return f},E0=(w,f,J,G)=>{if(!(G>0))return 0;var Q=J;G=J+G-1;for(var v=0;v<w.length;++v){var j=w.codePointAt(v);if(j<=127){if(J>=G)break;f[J++]=j}else if(j<=2047){if(J+1>=G)break;f[J++]=192|j>>6,f[J++]=128|j&63}else if(j<=65535){if(J+2>=G)break;f[J++]=224|j>>12,f[J++]=128|j>>6&63,f[J++]=128|j&63}else{if(J+3>=G)break;f[J++]=240|j>>18,f[J++]=128|j>>12&63,f[J++]=128|j>>6&63,f[J++]=128|j&63,v++}}return f[J]=0,J-Q},Z2=[];function Q2(w,f){Z2[w]={input:[],output:[],La:f},_1(w,C4)}var C4={open(w){var f=Z2[w.node.Ta];if(!f)throw new X(43);w.Aa=f,w.seekable=!1},close(w){w.Aa.La.Ua(w.Aa)},Ua(w){w.Aa.La.Ua(w.Aa)},read(w,f,J,G){if(!w.Aa||!w.Aa.La.fb)throw new X(60);for(var Q=0,v=0;v<G;v++){try{var j=w.Aa.La.fb(w.Aa)}catch(y){throw new X(29)}if(j===void 0&&Q===0)throw new X(6);if(j===null||j===void 0)break;Q++,f[J+v]=j}return Q&&(w.node.Ka=Date.now()),Q},write(w,f,J,G){if(!w.Aa||!w.Aa.La.cb)throw new X(60);try{for(var Q=0;Q<G;Q++)w.Aa.La.cb(w.Aa,f[J+Q])}catch(v){throw new X(29)}return G&&(w.node.Da=w.node.Ca=Date.now()),Q}},M4={fb(){return G2.length?G2.shift():null},cb(w,f){f===null||f===10?(z(i0(w.output)),w.output=[]):f!=0&&w.output.push(f)},Ua(w){w.output?.length>0&&(z(i0(w.output)),w.output=[])},rb(){return{Cb:25856,Eb:5,Bb:191,Db:35387,Ab:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},sb(){return 0},tb(){return[24,80]}},o4={cb(w,f){f===null||f===10?(r(i0(w.output)),w.output=[]):f!=0&&w.output.push(f)},Ua(w){w.output?.length>0&&(r(i0(w.output)),w.output=[])}},k={Ia:null,Ga(){return k.createNode(null,"/",16895,0)},createNode(w,f,J,G){if((J&61440)===24576||(J&61440)===4096)throw new X(63);return k.Ia||(k.Ia={dir:{node:{Fa:k.da.Fa,Ja:k.da.Ja,Sa:k.da.Sa,Va:k.da.Va,Xa:k.da.Xa,$a:k.da.$a,Ya:k.da.Ya,Wa:k.da.Wa,Za:k.da.Za},stream:{Ha:k.ea.Ha}},file:{node:{Fa:k.da.Fa,Ja:k.da.Ja},stream:{Ha:k.ea.Ha,read:k.ea.read,write:k.ea.write,hb:k.ea.hb,jb:k.ea.jb}},link:{node:{Fa:k.da.Fa,Ja:k.da.Ja,Qa:k.da.Qa},stream:{}},eb:{node:{Fa:k.da.Fa,Ja:k.da.Ja},stream:p4}}),J=X2(w,f,J,G),e(J.mode)?(J.da=k.Ia.dir.node,J.ea=k.Ia.dir.stream,J.Ba={}):(J.mode&61440)===32768?(J.da=k.Ia.file.node,J.ea=k.Ia.file.stream,J.Ea=0,J.Ba=k.nb??(k.nb=new Uint8Array(0))):(J.mode&61440)===40960?(J.da=k.Ia.link.node,J.ea=k.Ia.link.stream):(J.mode&61440)===8192&&(J.da=k.Ia.eb.node,J.ea=k.Ia.eb.stream),J.Ka=J.Da=J.Ca=Date.now(),w&&(w.Ba[f]=J,w.Ka=w.Da=w.Ca=J.Ka),J},da:{Fa(w){var f={};return f.mb=(w.mode&61440)===8192?w.id:1,f.pb=w.id,f.mode=w.mode,f.wb=1,f.uid=0,f.ob=0,f.Ta=w.Ta,e(w.mode)?f.size=4096:(w.mode&61440)===32768?f.size=w.Ea:(w.mode&61440)===40960?f.size=w.link.length:f.size=0,f.Ka=new Date(w.Ka),f.Da=new Date(w.Da),f.Ca=new Date(w.Ca),f.kb=4096,f.lb=Math.ceil(f.size/f.kb),f},Ja(w,f){for(var J of["mode","atime","mtime","ctime"])f[J]!=null&&(w[J]=f[J]);f.size!==void 0&&(f=f.size,w.Ea!=f&&(J=w.Ba,w.Ba=new Uint8Array(f),w.Ba.set(J.subarray(0,Math.min(f,w.Ea))),w.Ea=f))},Sa(){throw k.ab||(k.ab=new X(44),k.ab.stack="<generic error, no stack>"),k.ab},Va(w,f,J,G){return k.createNode(w,f,J,G)},Xa(w,f,J){try{var G=h0(f,J)}catch(v){}if(G){if(e(w.mode))for(var Q in G.Ba)throw new X(55);a0(G)}delete w.parent.Ba[w.name],f.Ba[J]=w,w.name=J,f.Ca=f.Da=w.parent.Ca=w.parent.Da=Date.now()},$a(w,f){delete w.Ba[f],w.Ca=w.Da=Date.now()},Ya(w,f){var J=h0(w,f),G;for(G in J.Ba)throw new X(55);delete w.Ba[f],w.Ca=w.Da=Date.now()},Wa(w){return[".","..",...Object.keys(w.Ba)]},Za(w,f,J){return w=k.createNode(w,f,41471,0),w.link=J,w},Qa(w){if((w.mode&61440)!==40960)throw new X(28);return w.link}},ea:{read(w,f,J,G,Q){if(Q>=w.node.Ea)return 0;return G=Math.min(w.node.Ea-Q,G),f.set(w.node.Ba.subarray(Q,Q+G),J),G},write(w,f,J,G,Q,v){if(f.buffer===_.buffer&&(v=!1),!G)return 0;if(w=w.node,w.Da=w.Ca=Date.now(),v)w.Ba=f.subarray(J,J+G),w.Ea=G;else if(w.Ea===0&&Q===0)w.Ba=f.slice(J,J+G),w.Ea=G;else{v=Q+G;var j=w.Ba.length;j>=v||(v=Math.max(v,j*(j<1048576?2:1.125)>>>0),j&&(v=Math.max(v,256)),j=w.Ba.subarray(0,w.Ea),w.Ba=new Uint8Array(v),w.Ba.set(j)),w.Ba.set(f.subarray(J,J+G),Q),w.Ea=Math.max(w.Ea,Q+G)}return G},Ha(w,f,J){if(J===1?f+=w.position:J===2&&(w.node.mode&61440)===32768&&(f+=w.node.Ea),f<0)throw new X(28);return f},hb(w,f,J,G,Q){if((w.node.mode&61440)!==32768)throw new X(43);if(w=w.node.Ba,Q&2||w.buffer!==_.buffer)throw void 0;return{Ib:w.byteOffset,zb:!1}},jb(w,f,J,G){return k.ea.write(w,f,0,G,J,!1),0}}},h2=(w,f)=>{var J=0;return w&&(J|=365),f&&(J|=146),J},y1=null,v2={},D0=[],T4=1,B0=null,K2=!1,z2=!0,X=class{name="ErrnoError";constructor(w){this.fa=w}},x4=class{shared={};node=null;get flags(){return this.shared.flags}set flags(w){this.shared.flags=w}get position(){return this.shared.position}set position(w){this.shared.position=w}},S4=class{da={};ea={};Na=null;constructor(w,f,J,G){w||=this,this.parent=w,this.Ga=w.Ga,this.id=T4++,this.name=f,this.mode=J,this.Ta=G,this.Ka=this.Da=this.Ca=Date.now()}get read(){return(this.mode&365)===365}set read(w){w?this.mode|=365:this.mode&=-366}get write(){return(this.mode&146)===146}set write(w){w?this.mode|=146:this.mode&=-147}};function d(w,f={}){if(!w)throw new X(44);f.bb??(f.bb=!0),w.charAt(0)==="/"||(w="//"+w);var J=0;w:for(;J<40;J++){w=w.split("/").filter((y)=>!!y);for(var G=y1,Q="/",v=0;v<w.length;v++){var j=v===w.length-1;if(j&&f.parent)break;if(w[v]!==".")if(w[v]==="..")if(Q=u(Q),G===G.parent){w=Q+"/"+w.slice(v+1).join("/"),J--;continue w}else G=G.parent;else{Q=V(Q+"/"+w[v]);try{G=h0(G,w[v])}catch(y){if(y?.fa===44&&j&&f.xb)return{path:Q};throw y}if(!G.Na||j&&!f.bb||(G=G.Na.root),(G.mode&61440)===40960&&(!j||f.Oa)){if(!G.da.Qa)throw new X(52);G=G.da.Qa(G),G.charAt(0)==="/"||(G=u(Q)+"/"+G),w=G+"/"+w.slice(v+1).join("/");continue w}}}return{path:Q,node:G}}throw new X(32)}function t0(w){for(var f;;){if(w===w.parent)return w=w.Ga.ib,f?w[w.length-1]!=="/"?`${w}/${f}`:w+f:w;f=f?`${w.name}/${f}`:w.name,w=w.parent}}function D1(w,f){for(var J=0,G=0;G<f.length;G++)J=(J<<5)-J+f.charCodeAt(G)|0;return(w+J>>>0)%B0.length}function j2(w){var f=D1(w.parent.id,w.name);w.Ra=B0[f],B0[f]=w}function a0(w){var f=D1(w.parent.id,w.name);if(B0[f]===w)B0[f]=w.Ra;else for(f=B0[f];f;){if(f.Ra===w){f.Ra=w.Ra;break}f=f.Ra}}function h0(w,f){var J=e(w.mode)?(J=W0(w,"x"))?J:w.da.Sa?0:2:54;if(J)throw new X(J);for(J=B0[D1(w.id,f)];J;J=J.Ra){var G=J.name;if(J.parent.id===w.id&&G===f)return J}return w.da.Sa(w,f)}function X2(w,f,J,G){return w=new S4(w,f,J,G),j2(w),w}function e(w){return(w&61440)===16384}function W0(w,f){return z2?0:f.includes("r")&&!(w.mode&292)||f.includes("w")&&!(w.mode&146)||f.includes("x")&&!(w.mode&73)?2:0}function H1(w,f){if(!e(w.mode))return 54;try{return h0(w,f),20}catch(J){}return W0(w,"wx")}function e0(w,f,J){try{var G=h0(w,f)}catch(Q){return Q.fa}if(w=W0(w,"wx"))return w;if(J){if(!e(G.mode))return 54;if(G===G.parent||t0(G)==="/")return 10}else if(e(G.mode))return 31;return 0}function g0(w,f){if(!w)throw new X(f);return w}function v0(w){if(w=D0[w],!w)throw new X(8);return w}function r2(w,f=-1){if(w=Object.assign(new x4,w),f==-1)w:{for(f=0;f<=4096;f++)if(!D0[f])break w;throw new X(33)}return w.Ma=f,D0[f]=w}function u4(w,f=-1){return w=r2(w,f),w.ea?.Gb?.(w),w}function O2(w,f){var J=void 0,G=J?null:w;J??=w.da.Ja,g0(J,63);try{J(G,f)}catch(Q){if(Q instanceof RangeError)throw new X(22);throw Q}}var p4={open(w){w.ea=v2[w.node.Ta].ea,w.ea.open?.(w)},Ha(){throw new X(70)}};function _1(w,f){v2[w]={ea:f}}function U2(w,f){var J=f==="/";if(J&&y1)throw new X(10);if(!J&&f){var G=d(f,{bb:!1});if(f=G.path,G=G.node,G.Na)throw new X(10);if(!e(G.mode))throw new X(54)}f={type:w,Hb:{},ib:f,ub:[]},w=w.Ga(f),w.Ga=f,f.root=w,J?y1=w:G&&(G.Na=f,G.Ga&&G.Ga.ub.push(f))}function w1(w,f,J){var G=d(w,{parent:!0}).node;if(w=S(w),!w)throw new X(28);if(w==="."||w==="..")throw new X(20);var Q=H1(G,w);if(Q)throw new X(Q);if(!G.da.Va)throw new X(63);return G.da.Va(G,w,f,J)}function n4(w,f=438){return w1(w,f&4095|32768,0)}function G0(w,f=511){return w1(w,f&1023|16384,0)}function f1(w,f,J){typeof J>"u"&&(J=f,f=438),w1(w,f|8192,J)}function q1(w,f){if(!J0(w))throw new X(44);var J=d(f,{parent:!0}).node;if(!J)throw new X(44);f=S(f);var G=H1(J,f);if(G)throw new X(G);if(!J.da.Za)throw new X(63);J.da.Za(J,f,w)}function B2(w){var f=d(w,{parent:!0}).node;w=S(w);var J=h0(f,w),G=e0(f,w,!0);if(G)throw new X(G);if(!f.da.Ya)throw new X(63);if(J.Na)throw new X(10);f.da.Ya(f,w),a0(J)}function $1(w,f){return w=d(w,{Oa:!f}).node,g0(w.da.Fa,63)(w)}function J1(w,f){w=typeof w=="string"?d(w,{Oa:!0}).node:w,O2(w,{mode:f&4095|w.mode&-4096,Ca:Date.now(),Fb:void 0})}function R0(w,f,J=438){if(w==="")throw new X(44);if(typeof f=="string"){var G={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090}[f];if(typeof G>"u")throw Error(`Unknown file open mode: ${f}`);f=G}if(J=f&64?J&4095|32768:0,typeof w=="object")G=w;else{var Q=w.endsWith("/"),v=d(w,{Oa:!(f&131072),xb:!0});G=v.node,w=v.path}if(v=!1,f&64)if(G){if(f&128)throw new X(20)}else{if(Q)throw new X(31);G=w1(w,J|511,0),v=!0}if(!G)throw new X(44);if((G.mode&61440)===8192&&(f&=-513),f&65536&&!e(G.mode))throw new X(54);if(!v&&(G?(G.mode&61440)===40960?Q=32:(Q=["r","w","rw"][f&3],f&512&&(Q+="w"),Q=e(G.mode)&&(Q!=="r"||f&576)?31:W0(G,Q)):Q=44,Q))throw new X(Q);if(f&512&&!v){if(Q=G,Q=typeof Q=="string"?d(Q,{Oa:!0}).node:Q,e(Q.mode))throw new X(31);if((Q.mode&61440)!==32768)throw new X(28);if(w=W0(Q,"w"))throw new X(w);O2(Q,{size:0,timestamp:Date.now()})}return f=r2({node:G,path:t0(G),flags:f&-131713,seekable:!0,position:0,ea:G.ea,yb:[],error:!1}),f.ea.open&&f.ea.open(f),v&&J1(G,J&511),f}function Y2(w){if(w.Ma===null)throw new X(8);w.Pa&&(w.Pa=null);try{w.ea.close&&w.ea.close(w)}catch(f){throw f}finally{D0[w.Ma]=null}w.Ma=null}function G1(w,f,J){if(w.Ma===null)throw new X(8);if(!w.seekable||!w.ea.Ha)throw new X(70);if(J!=0&&J!=1&&J!=2)throw new X(28);return w.position=w.ea.Ha(w,f,J),w.yb=[],w.position}function W2(w,f,J,G,Q,v){if(G<0||Q<0)throw new X(28);if(w.Ma===null)throw new X(8);if((w.flags&2097155)===0)throw new X(8);if(e(w.node.mode))throw new X(31);if(!w.ea.write)throw new X(28);w.seekable&&w.flags&1024&&G1(w,0,2);var j=typeof Q<"u";if(!j)Q=w.position;else if(!w.seekable)throw new X(70);return f=w.ea.write(w,f,J,G,Q,v),j||(w.position+=f),f}function c4(w,f){w=typeof w=="string"?w:t0(w);for(f=f.split("/").reverse();f.length;){var J=f.pop();if(J){var G=V(w+"/"+J);try{G0(G)}catch(Q){if(Q.fa!=20)throw Q}w=G}}return G}function s4(w,f,J,G,Q,v){var j=f;w&&(w=typeof w=="string"?w:t0(w),j=f?V(w+"/"+f):w),w=h2(G,Q),j=n4(j,w),J&&(f=J,typeof f=="string"&&(J=Array(d0(f)+1),f=E0(f,J,0,J.length),J.length=f,f=J),f.subarray||(f=new Uint8Array(f)),J=f,J1(j,w|146),f=R0(j,577),W2(f,J,0,J.length,0,v),Y2(f),J1(j,w))}function F0(w,f){w=V("/dev/"+w);var J=h2(!!f,!1);F0.gb??(F0.gb=64);var G=F0.gb++<<8|0;_1(G,{open(Q){Q.seekable=!1},close(){},read(Q,v,j,y){for(var R=0,E=0;E<y;E++){try{var n=f()}catch(m){throw new X(29)}if(n===void 0&&R===0)throw new X(6);if(n===null||n===void 0)break;R++,v[j+E]=n}return R&&(Q.node.Ka=Date.now()),R},write(Q,v,j,y){for(var R=0;R<y;R++)try{(void 0)(v[j+R])}catch(E){throw new X(29)}return y&&(Q.node.Da=Q.node.Ca=Date.now()),R}}),f1(w,J,G)}var p={};function j0(w,f,J){if(f.charAt(0)==="/")return f;if(w=w===-100?"/":v0(w).path,f.length==0){if(!J)throw new X(44);return w}return w+"/"+f}function Z1(w,f){I[w>>2]=f.mb,I[w+4>>2]=f.mode,I[w+8>>2]=f.wb,I[w+12>>2]=f.uid,I[w+16>>2]=f.ob,I[w+20>>2]=f.Ta,W[w+24>>3]=BigInt(f.size),H[w+32>>2]=4096,H[w+36>>2]=f.lb;var J=f.Ka.getTime(),G=f.Da.getTime(),Q=f.Ca.getTime();return W[w+40>>3]=BigInt(Math.floor(J/1000)),I[w+48>>2]=J%1000*1000*1000,W[w+56>>3]=BigInt(Math.floor(G/1000)),I[w+64>>2]=G%1000*1000*1000,W[w+72>>3]=BigInt(Math.floor(Q/1000)),I[w+80>>2]=Q%1000*1000*1000,W[w+88>>3]=BigInt(f.pb),0}var b0=void 0,X0=()=>{var w=H[+b0>>2];return b0+=4,w},C0={},P1={},V2=()=>{if(!L1){var w={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8",_:"./this.program"},f;for(f in P1)P1[f]===void 0?delete w[f]:w[f]=P1[f];var J=[];for(f in w)J.push(`${f}=${w[f]}`);L1=J}return L1},L1,A2=(w)=>{throw`exit(${w})`},N2=[],k2=(w)=>{var f=N2[w];return f||(N2[w]=f=G4.get(w)),f};B0=Array(4096),U2(k,"/"),G0("/tmp"),G0("/home"),G0("/home/web_user"),function(){G0("/dev"),_1(259,{read:()=>0,write:(G,Q,v,j)=>j,Ha:()=>0}),f1("/dev/null",259),Q2(1280,M4),Q2(1536,o4),f1("/dev/tty",1280),f1("/dev/tty1",1536);var w=new Uint8Array(1024),f=0,J=()=>{return f===0&&(a(w),f=w.byteLength),w[--f]};F0("random",J),F0("urandom",J),G0("/dev/shm"),G0("/dev/shm/tmp")}(),function(){G0("/proc");var w=G0("/proc/self");G0("/proc/self/fd"),U2({Ga(){var f=X2(w,"fd",16895,73);return f.ea={Ha:k.ea.Ha},f.da={Sa(J,G){J=+G;var Q=v0(J);return J={parent:null,Ga:{ib:"fake"},da:{Qa:()=>Q.path},id:J+1},J.parent=J},Wa(){return Array.from(D0.entries()).filter(([,J])=>J).map(([J])=>J.toString())}},f}},"/proc/self/fd")}();var y2,D2,H2,_2,q2,P2,L2,I2,E2,g2,R2,F2,b2,C2,M2,o2,T2,x2,S2,u2,p2,n2,c2,s2,l2,m2,i2,d2,t2,a2,e2,w4,f4,$4,J4,I1,E1,g1,G4,l4={a:{b:(w,f,J,G)=>{throw`Assertion failed: ${x(w)}, at: `+[f?x(f):"unknown filename",J,G?x(G):"unknown function"]},K:function(w,f){try{return w=x(w),J1(w,f),0}catch(J){if(typeof p>"u"||J.name!=="ErrnoError")throw J;return-J.fa}},k:function(w,f,J){try{if(f=x(f),f=j0(w,f),J&-8)return-28;var G=d(f,{Oa:!0}).node;if(!G)return-44;return w="",J&4&&(w+="r"),J&2&&(w+="w"),J&1&&(w+="x"),w&&W0(G,w)?-2:0}catch(Q){if(typeof p>"u"||Q.name!=="ErrnoError")throw Q;return-Q.fa}},d:function(w,f,J){b0=J;try{var G=v0(w);switch(f){case 0:var Q=X0();if(Q<0)break;for(;D0[Q];)Q++;return u4(G,Q).Ma;case 1:case 2:return 0;case 3:return G.flags;case 4:return Q=X0(),G.flags=G.flags&-289793|Q&289792,0;case 12:return Q=X0(),L[Q+0>>1]=2,0;case 13:case 14:return 0}return-28}catch(v){if(typeof p>"u"||v.name!=="ErrnoError")throw v;return-v.fa}},J:function(w,f){try{var J=v0(w),G=J.node,Q=J.ea.Fa;w=Q?J:G,Q??=G.da.Fa,g0(Q,63);var v=Q(w);return Z1(f,v)}catch(j){if(typeof p>"u"||j.name!=="ErrnoError")throw j;return-j.fa}},F:function(w,f){try{if(f===0)return-28;var J=d0("/")+1;if(f<J)return-68;return E0("/",O,w,f),J}catch(G){if(typeof p>"u"||G.name!=="ErrnoError")throw G;return-G.fa}},x:function(w,f,J){try{var G=v0(w);if(!G.Pa){var Q=d(G.path,{Oa:!0}).node,v=g0(Q.da.Wa,54)(Q);G.Pa=v}w=0;var j=G1(G,0,1),y=Math.floor(j/280),R=Math.min(G.Pa.length,y+Math.floor(J/280));for(J=y;J<R;J++){var E=G.Pa[J];if(E===".")var n=G.node.id,m=4;else if(E==="..")n=d(G.path,{parent:!0}).node.id,m=4;else{try{var w0=h0(G.node,E)}catch(f0){if(f0?.fa===28)continue;throw f0}n=w0.id,m=(w0.mode&61440)===8192?2:e(w0.mode)?4:(w0.mode&61440)===40960?10:8}W[f+w>>3]=BigInt(n),W[f+w+8>>3]=BigInt((J+1)*280),L[f+w+16>>1]=280,_[f+w+18]=m,E0(E,O,f+w+19,256),w+=280}return G1(G,J*280,0),w}catch(f0){if(typeof p>"u"||f0.name!=="ErrnoError")throw f0;return-f0.fa}},m:function(w,f,J){b0=J;try{var G=v0(w);switch(f){case 21509:return G.Aa?0:-59;case 21505:if(!G.Aa)return-59;if(G.Aa.La.rb){w=[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];var Q=X0();H[Q>>2]=25856,H[Q+4>>2]=5,H[Q+8>>2]=191,H[Q+12>>2]=35387;for(var v=0;v<32;v++)_[Q+v+17]=w[v]||0}return 0;case 21510:case 21511:case 21512:return G.Aa?0:-59;case 21506:case 21507:case 21508:if(!G.Aa)return-59;if(G.Aa.La.sb)for(Q=X0(),w=[],v=0;v<32;v++)w.push(_[Q+v+17]);return 0;case 21519:if(!G.Aa)return-59;return Q=X0(),H[Q>>2]=0;case 21520:return G.Aa?-28:-59;case 21537:case 21531:if(Q=X0(),!G.ea.qb)throw new X(59);return G.ea.qb(G,f,Q);case 21523:if(!G.Aa)return-59;return G.Aa.La.tb&&(v=[24,80],Q=X0(),L[Q>>1]=v[0],L[Q+2>>1]=v[1]),0;case 21524:return G.Aa?0:-59;case 21515:return G.Aa?0:-59;default:return-28}}catch(j){if(typeof p>"u"||j.name!=="ErrnoError")throw j;return-j.fa}},H:function(w,f){try{return w=x(w),Z1(f,$1(w,!0))}catch(J){if(typeof p>"u"||J.name!=="ErrnoError")throw J;return-J.fa}},A:function(w,f,J){try{return f=x(f),f=j0(w,f),G0(f,J&-19),0}catch(G){if(typeof p>"u"||G.name!=="ErrnoError")throw G;return-G.fa}},G:function(w,f,J,G){try{f=x(f);var Q=G&256;return f=j0(w,f,G&4096),Z1(J,Q?$1(f,!0):$1(f))}catch(v){if(typeof p>"u"||v.name!=="ErrnoError")throw v;return-v.fa}},h:function(w,f,J,G){b0=G;try{f=x(f),f=j0(w,f);var Q=G?X0():0;return J&64&&(Q&=-19),R0(f,J,Q).Ma}catch(v){if(typeof p>"u"||v.name!=="ErrnoError")throw v;return-v.fa}},w:function(w,f,J,G){try{if(f=x(f),f=j0(w,f),G<=0)return-28;var Q=d(f).node;if(!Q)throw new X(44);if(!Q.da.Qa)throw new X(28);var v=Q.da.Qa(Q),j=Math.min(G,d0(v)),y=_[J+j];return E0(v,O,J,G+1),_[J+j]=y,j}catch(R){if(typeof p>"u"||R.name!=="ErrnoError")throw R;return-R.fa}},v:function(w,f,J,G){try{f=x(f),G=x(G),f=j0(w,f),G=j0(J,G),w=f;var Q=u(w),v=u(G),j=S(w),y=S(G),R=d(w,{parent:!0}),E=R.node;R=d(G,{parent:!0});var n=R.node;if(!E||!n)throw new X(44);if(E.Ga!==n.Ga)throw new X(75);var m=h0(E,j),w0=I0(w,v);if(w0.charAt(0)!==".")throw new X(28);if(w0=I0(G,Q),w0.charAt(0)!==".")throw new X(55);try{var f0=h0(n,y)}catch(Z0){}if(m!==f0){var M0=e(m.mode),r0=e0(E,j,M0);if(r0)throw new X(r0);if(r0=f0?e0(n,y,M0):H1(n,y))throw new X(r0);if(!E.da.Xa)throw new X(63);if(m.Na||f0&&f0.Na)throw new X(10);if(n!==E&&(r0=W0(E,"w")))throw new X(r0);a0(m);try{E.da.Xa(m,n,y),m.parent=n}catch(Z0){throw Z0}finally{j2(m)}}return 0}catch(Z0){if(typeof p>"u"||Z0.name!=="ErrnoError")throw Z0;return-Z0.fa}},u:function(w){try{return w=x(w),B2(w),0}catch(f){if(typeof p>"u"||f.name!=="ErrnoError")throw f;return-f.fa}},I:function(w,f){try{return w=x(w),Z1(f,$1(w))}catch(J){if(typeof p>"u"||J.name!=="ErrnoError")throw J;return-J.fa}},t:function(w,f,J){try{if(f=x(f),f=j0(w,f),J)if(J===512)B2(f);else return-28;else{w=f;var G=d(w,{parent:!0}).node;if(!G)throw new X(44);var Q=S(w),v=h0(G,Q),j=e0(G,Q,!1);if(j)throw new X(j);if(!G.da.$a)throw new X(63);if(v.Na)throw new X(10);G.da.$a(G,Q),a0(v)}return 0}catch(y){if(typeof p>"u"||y.name!=="ErrnoError")throw y;return-y.fa}},s:function(w,f,J){try{f=x(f),f=j0(w,f,!0);var G=Date.now(),Q,v;if(J){var j=I[J>>2]+H[J+4>>2]*4294967296,y=H[J+8>>2];y==1073741823?Q=G:y==1073741822?Q=null:Q=j*1000+y/1e6,J+=16,j=I[J>>2]+H[J+4>>2]*4294967296,y=H[J+8>>2],y==1073741823?v=G:y==1073741822?v=null:v=j*1000+y/1e6}else v=Q=G;if((v??Q)!==null){w=Q;var R=d(f,{Oa:!0}).node;g0(R.da.Ja,63)(R,{Ka:w,Da:v})}return 0}catch(E){if(typeof p>"u"||E.name!=="ErrnoError")throw E;return-E.fa}},l:()=>{throw""},z:()=>{},p:()=>{throw new A},q:(w,f)=>{if(C0[w]&&(clearTimeout(C0[w].id),delete C0[w]),!f)return 0;var J=setTimeout(()=>{delete C0[w],J4(w,performance.now())},f);return C0[w]={id:J,Jb:f},0},i:()=>Date.now(),j:()=>performance.now(),r:(w)=>{var f=O.length;if(w>>>=0,w>2147483648)return!1;for(var J=1;J<=4;J*=2){var G=f*(1+0.2/J);G=Math.min(G,w+100663296);w:{G=(Math.min(2147483648,Math.ceil(Math.max(w,G)/65536)*65536)-B.buffer.byteLength+65535)/65536|0;try{B.grow(G),C();var Q=1;break w}catch(v){}Q=void 0}if(Q)return!0}return!1},C:(w,f)=>{var J=0,G=0,Q;for(Q of V2()){var v=f+J;I[w+G>>2]=v,J+=E0(Q,O,v,1/0)+1,G+=4}return 0},D:(w,f)=>{var J=V2();I[w>>2]=J.length,w=0;for(var G of J)w+=d0(G)+1;return I[f>>2]=w,0},e:A2,c:function(w){try{var f=v0(w);return Y2(f),0}catch(J){if(typeof p>"u"||J.name!=="ErrnoError")throw J;return J.fa}},g:function(w,f,J,G){try{w:{var Q=v0(w);w=f;for(var v,j=f=0;j<J;j++){var y=I[w>>2],R=I[w+4>>2];w+=8;var E=Q,n=y,m=R,w0=v,f0=_;if(m<0||w0<0)throw new X(28);if(E.Ma===null)throw new X(8);if((E.flags&2097155)===1)throw new X(8);if(e(E.node.mode))throw new X(31);if(!E.ea.read)throw new X(28);var M0=typeof w0<"u";if(!M0)w0=E.position;else if(!E.seekable)throw new X(70);var r0=E.ea.read(E,f0,n,m,w0);M0||(E.position+=r0);var Z0=r0;if(Z0<0){var Q4=-1;break w}if(f+=Z0,Z0<R)break;typeof v<"u"&&(v+=Z0)}Q4=f}return I[G>>2]=Q4,0}catch(F1){if(typeof p>"u"||F1.name!=="ErrnoError")throw F1;return F1.fa}},B:function(w,f,J,G){f=f<-9007199254740992||f>9007199254740992?NaN:Number(f);try{if(isNaN(f))return 22;var Q=v0(w);return G1(Q,f,J),W[G>>3]=BigInt(Q.position),Q.Pa&&f===0&&J===0&&(Q.Pa=null),0}catch(v){if(typeof p>"u"||v.name!=="ErrnoError")throw v;return v.fa}},f:function(w,f,J,G){try{w:{var Q=v0(w);w=f;for(var v,j=f=0;j<J;j++){var y=I[w>>2],R=I[w+4>>2];w+=8;var E=W2(Q,_,y,R,v);if(E<0){var n=-1;break w}if(f+=E,E<R)break;typeof v<"u"&&(v+=E)}n=f}return I[G>>2]=n,0}catch(m){if(typeof p>"u"||m.name!=="ErrnoError")throw m;return m.fa}},o:function(w,f,J){var G=g1();try{return k2(w)(f,J)}catch(Q){if(E1(G),!(Q instanceof K))throw Q;I1(1,0)}},n:function(w,f,J,G,Q){var v=g1();try{return k2(w)(f,J,G,Q)}catch(j){if(E1(v),!(j instanceof K))throw j;I1(1,0)}},a:B,y:A2,E:(w,f)=>a(O.subarray(w,w+f))}};WebAssembly.instantiateStreaming(fetch(new URL("akarisub-worker.wasm",self.location.href)),l4).then((w)=>{w=w.instance.exports,y2=w.M,D2=w.N,H2=w.O,_2=w.P,q2=w.Q,P2=w.R,L2=w.S,I2=w.T,E2=w.U,g2=w.V,R2=w.W,F2=w.X,b2=w.Y,C2=w.Z,M2=w._,o2=w.$,T2=w.aa,x2=w.ba,S2=w.ca,u2=w.ga,p2=w.ha,n2=w.ia,c2=w.ja,s2=w.ka,l2=w.la,m2=w.ma,i2=w.na,d2=w.oa,t2=w.pa,a2=w.qa,e2=w.ra,w4=w.sa,f4=w.ta,$4=w.ua,J4=w.wa,I1=w.xa,E1=w.ya,g1=w.za,G4=w.va,c=!0,h.noFSInit||K2||(K2=!0,q1("/dev/tty","/dev/stdin"),q1("/dev/tty","/dev/stdout"),q1("/dev/tty1","/dev/stderr"),R0("/dev/stdin",0),R0("/dev/stdout",1),R0("/dev/stderr",1)),w.L(),z2=!1,U()});let R1=()=>{try{typeof B<"u"&&(self.wasmMemory=B,self.HEAPU8C=new Uint8ClampedArray(B.buffer),typeof BigInt64Array<"u"&&(self.HEAP64=new BigInt64Array(B.buffer),self.HEAPU64=new BigUint64Array(B.buffer))),typeof O<"u"&&(self.HEAPU8=O),typeof W<"u"&&(self.HEAP64=W),typeof N<"u"&&(self.HEAPU64=N)}catch(w){}};if(typeof updateGlobalBufferAndViews==="function"){let w=updateGlobalBufferAndViews;updateGlobalBufferAndViews=(f)=>{w(f),R1()}}if(typeof C==="function"){let w=C;C=()=>{w(),R1()}}let Z4=typeof U==="function"?U:null;return Z4&&(U=()=>{return Object.assign(h,{_malloc:$4,_free:l2,_akarisub_create:y2,_akarisub_destroy:D2,_akarisub_set_drop_animations:H2,_akarisub_create_track_mem:_2,_akarisub_remove_track:q2,_akarisub_resize_canvas:P2,_akarisub_add_font:L2,_akarisub_reload_fonts:I2,_akarisub_set_default_font:E2,_akarisub_set_fallback_fonts:g2,_akarisub_set_memory_limits:R2,_akarisub_get_event_count:F2,_akarisub_alloc_event:b2,_akarisub_remove_event:C2,_akarisub_get_style_count:M2,_akarisub_alloc_style:o2,_akarisub_remove_style:T2,_akarisub_style_override_index:x2,_akarisub_disable_style_override:S2,_akarisub_get_track_color_space:u2,_akarisub_event_get_int:p2,_akarisub_event_set_int:n2,_akarisub_event_get_str:c2,_akarisub_event_set_str:s2,_akarisub_style_get_num:m2,_akarisub_style_set_num:i2,_akarisub_style_get_str:d2,_akarisub_style_set_str:t2,_akarisub_get_event_time_range:a2,_akarisub_get_empty_window:e2,_akarisub_render_blend_collect:w4,_akarisub_render_image_collect:f4}),typeof p<"u"&&(h.FS_createPath=c4,h.FS_createDataFile=s4),R1(),Z4()}),c?Z=h:Z=new Promise((w)=>{D=w}),Z}var h4=m4;var b1=[null,"BT601",null,"BT601","BT601","BT709","BT709","SMPTE240M","SMPTE240M","FCC","FCC"];function v4($,Z=!1){let h=[],z=$.split(/[\r\n]+/g),r=z.length,U=null,K=null;for(let A=0;A<r;A++){let D=z[A];if(!D||/^\s*$/.test(D))continue;let c=D[0];if(c==="["){let C=D.match(/^\[(.*)\]$/);if(C){if(Z&&C[1].toLowerCase()==="events")break;U=null,K={name:C[1],body:[]},h.push(K);continue}}if(!K)continue;if(c===";")K.body.push({type:"comment",value:D.substring(1)});else{let C=D.indexOf(":");if(C===-1)continue;let L=D.substring(0,C),H=D.substring(C+1).trim();if(U||L==="Format"){let W=H.split(",");if(U&&W.length>U.length){let I=W.slice(U.length-1).join(",");W=W.slice(0,U.length-1),W.push(I)}let _=W.length;for(let I=0;I<_;I++)W[I]=W[I].trim();if(U){let I={},N=Math.min(U.length,_);for(let O=0;O<N;O++)I[U[O]]=W[O];H=I}else H=W}if(L==="Format")U=H;K.body.push({key:L,value:H})}}return h}var i4=/\\blur(?:[0-9]+\.)?[0-9]+/gm;function C1($){return $.replace(i4,"")}var d4=[{w:7680,h:4320},{w:3840,h:2160},{w:2560,h:1440},{w:1920,h:1080},{w:1280,h:720}];function t4($,Z){let h=[...d4].sort((z,r)=>z.w-r.w);for(let z of h)if($<=z.w&&Z<=z.h)return z;return{w:Math.ceil($/100)*100,h:Math.ceil(Z/100)*100}}function s($,Z){return Z&&Z.includes(".")?$.toFixed(2).replace(/\.?0+$/,""):Math.round($)}function M1($){let Z=$.match(/PlayResX:\s*(\d+)/i),h=$.match(/PlayResY:\s*(\d+)/i),z=Z?parseInt(Z[1],10):1920,r=h?parseInt(h[1],10):1080,U=/\\pos\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,K=/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)/g,A=/\\org\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,D=/\\i?clip\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,c=0,C=0,L=(F,V,u)=>{let S,z0=new RegExp(F.source,"g");while((S=z0.exec($))!==null){for(let a of V)if(S[a]){let J0=Math.abs(parseFloat(S[a]));if(J0>c)c=J0}for(let a of u)if(S[a]){let J0=Math.abs(parseFloat(S[a]));if(J0>C)C=J0}}};if(L(U,[1],[2]),L(K,[1,3],[2,4]),L(A,[1],[2]),L(D,[1,3],[2,4]),c<=z&&C<=r)return $;let H=t4(c,C),W=z/H.w,_=r/H.h,I=Math.min(W,_),N=Math.max(W,_),O=1,B=$,q=B.match(/(\[Events\][\s\S]*)/i);if(!q)return B;let Y=q[1];return Y=Y.replace(U,(F,V,u)=>`\\pos(${s(parseFloat(V)*W,V)},${s(parseFloat(u)*_,u)})`),Y=Y.replace(/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)(?:\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+))?\s*\)/g,(F,V,u,S,z0,a,J0)=>{let I0=`\\move(${s(parseFloat(V)*W,V)},${s(parseFloat(u)*_,u)},${s(parseFloat(S)*W,S)},${s(parseFloat(z0)*_,z0)}`;return a?`${I0},${a},${J0})`:`${I0})`}),Y=Y.replace(A,(F,V,u)=>`\\org(${s(parseFloat(V)*W,V)},${s(parseFloat(u)*_,u)})`),Y=Y.replace(/\\(i?clip)\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,(F,V,u,S,z0,a)=>`\\${V}(${s(parseFloat(u)*W,u)},${s(parseFloat(S)*_,S)},${s(parseFloat(z0)*W,z0)},${s(parseFloat(a)*_,a)})`),Y=Y.replace(/\\fs([\d.]+)/g,(F,V)=>`\\fs${s(parseFloat(V)*N,V)}`),Y=Y.replace(/\\fscx([\d.]+)/g,(F,V)=>`\\fscx${s(parseFloat(V)*O,V)}`),Y=Y.replace(/\\xbord([\d.]+)/g,(F,V)=>`\\xbord${s(parseFloat(V)*W,V)}`),Y=Y.replace(/\\ybord([\d.]+)/g,(F,V)=>`\\ybord${s(parseFloat(V)*_,V)}`),Y=Y.replace(/\\xshad(-?[\d.]+)/g,(F,V)=>`\\xshad${s(parseFloat(V)*W,V)}`),Y=Y.replace(/\\yshad(-?[\d.]+)/g,(F,V)=>`\\yshad${s(parseFloat(V)*_,V)}`),["fsp","bord","shad","be","blur"].forEach((F)=>{let V=new RegExp(`\\\\${F}(-?[\\d.]+)`,"g");Y=Y.replace(V,(u,S)=>`\\${F}${s(parseFloat(S)*I,S)}`)}),Y=Y.replace(/(\\i?clip\s*\([^,)]+m[^)]+\)|\\p[1-9][^}]*?)(?=[\\}]|$)/g,(F)=>{return F.replace(/(-?[\d.]+)\s+(-?[\d.]+)/g,(V,u,S)=>{return`${s(parseFloat(u)*W,u)} ${s(parseFloat(S)*_,S)}`})}),B.substring(0,q.index)+Y}var k0=0,O4=1,Q0=null,o1=!1,L0=()=>typeof performance<"u"?performance.now():Date.now(),A1=L0(),X1=24,p0=!1,U4=!1,e1="wasm",A0={},r1={},B4=0,Y4=0,o0=[],l=!1,v1=!1,n0=!1,a4=3,t=[];self.width=0;self.height=0;var P={framesRendered:0,framesDropped:0,totalRenderTime:0,maxRenderTime:0,minRenderTime:1/0,lastRenderTime:0,renderStartTime:0,pendingRenders:0,totalEvents:0,currentEventIndex:0,cacheHits:0,cacheMisses:0},e4=()=>{P.framesRendered=0,P.framesDropped=0,P.totalRenderTime=0,P.maxRenderTime=0,P.minRenderTime=1/0,P.lastRenderTime=0,P.cacheHits=0,P.cacheMisses=0},U0=!1,T0=!0,O0=null,_0=null,c0=!1,V0=null,W4=null,b=0,q0=null,K1=!1,V4=!1,A4=!1,T=null,O1=!1,N4=new TextEncoder,ww=new TextDecoder,u1=null,k4=128,y4=Math.max(k4,4096),D4=y4;var fw=30,$w=1,Jw=24,p1=1000,n1=[],K4=!1,z1=3,j1=5,i=0,$0=0,U1=null,w2=null,c1=null,s1=0,l1=0,Gw=[],Zw=[],Qw=[],T1=null;var hw=!1,N1=null,N0=null,P0=!1,m1=($)=>new Promise((Z)=>setTimeout(Z,$)),H4=()=>{if(K4)return;for(let $=0;$<k4;$++)n1[$]={w:0,h:0,x:0,y:0,image:0};K4=!0},z4=($)=>{let Z=n1[$];if(!Z)Z={w:0,h:0,x:0,y:0,image:0},n1[$]=Z;return Z},f2=($)=>{if(!T||$<=0)return;let Z=z1+j1*$;if($0>=Z&&i)return;let h=Math.max(Z,($0||64)*2),z=h*Int32Array.BYTES_PER_ELEMENT;if(i)T._free(i),i=0,$0=0;if(i=T._malloc(z),!i)throw $0=0,Error("Failed to allocate render-collect buffer");$0=h},vw=()=>{let $=self.wasmMemory.buffer;if(U1&&c1===$&&s1===i&&l1===$0)return;U1=new Int32Array($,i,z1),w2=new Int32Array($,i+z1*Int32Array.BYTES_PER_ELEMENT,$0-z1),c1=$,s1=i,l1=$0},B1=($)=>{if(!b)return;let Z=g(),h=o();if(f2(D4),e1==="wasm")Z.renderBlendCollect(h,$,0,i,$0);else Z.renderImageCollect(h,$,0,i,$0)},l0=()=>{P.totalEvents=b?g().getEventCount(b):0},_4=()=>{if(!b||!T)return null;let $=g(),Z=o(),h=T._malloc(2*Int32Array.BYTES_PER_ELEMENT);if(!h)return null;try{if(!$.getEventTimeRange(Z,h))return null;let z=new Int32Array(self.wasmMemory.buffer,h,2),r=Math.max(0,z[0]/p1),U=Math.max(r,z[1]/p1);return{start:r,end:U}}finally{T._free(h)}},q4=()=>{return _4()?.start??null},H0=-1,Y1=-1,Kw=()=>{H0=-1,Y1=-1},zw=($)=>{if(!b||!T)return;let Z=T._malloc(Int32Array.BYTES_PER_ELEMENT);if(!Z)return;try{if(!g().getEmptyWindow(o(),$,Z))return;let h=new Int32Array(self.wasmMemory.buffer,Z,1)[0];H0=$,Y1=h<0?Number.POSITIVE_INFINITY:h/p1}finally{T._free(Z)}},jw=async()=>{if(!b)return;let $=_4();if(!$)return;let Z=Math.min($.end,$.start+fw),h=0;for(let z=$.start;z<=Z;z+=$w){if(!b)return;if(p0&&(n0||t.length>0||P.pendingRenders>0)){await m1(0);continue}if(B1(z),h++,p0||h%Jw===0)await m1(0)}B1(Z)};var k1=()=>{if(hw=!1,T1)clearTimeout(T1),T1=null},Xw=()=>{if(!V4||N0||!b)return;N0=(async()=>{await m1(0);try{await jw()}catch($){if(l)console.warn("[AkariSub] Full track warmup failed, continuing:",$)}try{if(b)B1(g4())}catch($){if(l)console.warn("[AkariSub] Post-warmup re-prime failed, continuing:",$)}})().finally(()=>{N0=null})};var K0={Start:0,Duration:1,ReadOrder:2,Layer:3,Style:4,MarginL:5,MarginR:6,MarginV:7},x0={Name:0,Effect:1,Text:2},M={FontSize:0,PrimaryColour:1,SecondaryColour:2,OutlineColour:3,BackColour:4,Bold:5,Italic:6,Underline:7,StrikeOut:8,ScaleX:9,ScaleY:10,Spacing:11,Angle:12,BorderStyle:13,Outline:14,Shadow:15,Alignment:16,MarginL:17,MarginR:18,MarginV:19,Encoding:20,treat_fontname_as_pattern:21,Blur:22,Justify:23},W1={Name:0,FontName:1},rw=($)=>{return N4.encode($)},Ow=($)=>{if(!T)return 0;let Z=rw($),h=T._malloc(Z.length+1);if(!h)return 0;return self.HEAPU8.set(Z,h),self.HEAPU8[h+Z.length]=0,h},S0=($)=>{if(!$)return"";let Z=$,h=self.HEAPU8;while(h[Z]!==0)Z++;return ww.decode(h.subarray($,Z))},y0=($,Z)=>{let h=Ow($);try{return Z(h)}finally{if(h&&T)T._free(h)}},i1=($)=>{return $ instanceof Uint8Array?$:new Uint8Array($)},Uw=($)=>{return $ instanceof Uint8Array||$ instanceof ArrayBuffer},Bw=($,Z)=>{if(!T)throw Error("AkariSub module is not initialized");let h=T._malloc($.length+1);if(!h)throw Error("Failed to allocate subtitle content");try{return self.HEAPU8.set($,h),self.HEAPU8[h+$.length]=0,Z(h)}finally{self.HEAPU8.fill(0,h,h+$.length+1),T._free(h)}},j4=async($,Z)=>{let h=new Uint8Array($),z=8,r=12,U=21;if(h.length<37)throw Error("Ciphertext too short for v2 subtitle payload");if(h[0]!==2)throw Error("Unsupported encrypted subtitle protocol version");let K=h.subarray(0,9),A=h.subarray(9,21),D=h.subarray(21),c=await crypto.subtle.decrypt({name:"AES-GCM",iv:A.buffer.slice(A.byteOffset,A.byteOffset+A.byteLength),additionalData:K.buffer.slice(K.byteOffset,K.byteOffset+K.byteLength),tagLength:128},Z,D.buffer.slice(D.byteOffset,D.byteOffset+D.byteLength));return new Uint8Array(c)},P4=async($)=>{if($.encrypted)return j4($.encrypted,$.contentKey);let Z=$.encryptedChunks||[];if(Z.length===0)throw Error("Encrypted subtitle content is empty");let h=await Promise.all(Z.map((K)=>j4(K,$.contentKey))),z=h.reduce((K,A)=>K+A.length,0),r=new Uint8Array(z),U=0;for(let K of h)r.set(K,U),K.fill(0),U+=K.length;return r},$2=($)=>{let Z=g(),h=o();Bw($,(z)=>{Z.createTrackMem(h,z)})},L4=($)=>{let Z=g(),h=o();y0($,(z)=>{Z.createTrackMem(h,z)})},g=()=>{if(!u1)throw Error("AkariSub API is not initialized");return u1},o=()=>{if(!b)throw Error("AkariSub instance is not initialized");return b};self.addFont=({font:$})=>I4($,!1);var Q1=($)=>{if($=$.trim().toLowerCase(),$.startsWith("@"))$=$.substring(1);if(r1[$])return;if(r1[$]=!0,!A0[$]){if(U4)postMessage({target:"getLocalFont",font:$})}else I4(A0[$])},I4=($,Z=!0)=>{if(typeof $==="string")t1($,(h)=>{X4(new Uint8Array(h),Z)},console.error);else X4($,Z)};var x1=null,Yw=()=>{if(x1)return;x1=setTimeout(()=>{if(x1=null,b)g().reloadFonts(b)},16)},s0=($,Z)=>{if(!T||!b){if(l)console.warn("[AkariSub] Cannot add embedded font, module or AkariSub not ready:",Z);return}try{let h=g(),z=T._malloc($.length);if(!z){console.warn("[AkariSub] Failed to allocate memory for embedded font:",Z);return}if(self.HEAPU8.set($,z),y0(Z,(r)=>{h.addFont(b,r,z,$.length)}),l)console.log("[AkariSub] Added embedded font:",Z,"size:",$.length)}catch(h){console.warn("[AkariSub] Failed to add embedded font:",Z,h)}},X4=($,Z=!0)=>{let h=Z?"/fonts/fallback":"/fonts/attached",z=Z?"fallback-"+Y4++:"attached-"+B4++;if(T){try{T.FS_createDataFile(h,z,$,!0,!0,!0)}catch(r){console.warn("Failed to write font to filesystem:",h+"/"+z,r)}if(!Z)s0($,z);else if(b)s0($,z);else o0.push({data:$,name:z})}Yw()},h1=($,Z=!0)=>{let h=Z?"/fonts/fallback":"/fonts/attached",z=Z?"fallback-"+Y4++:"attached-"+B4++;if(T){try{if(T.FS_createDataFile(h,z,$,!0,!0,!0),l)console.log("[AkariSub] Wrote font to FS:",h+"/"+z,"size:",$.length)}catch(r){console.warn("Failed to write font to filesystem:",h+"/"+z,r)}if(!Z)s0($,z);else if(b)s0($,z);else o0.push({data:$,name:z})}},E4=($)=>{if(!A0)return;if($.length>500000){let h=$.match(/\[V4\+?\s*Styles?\][^\[]*(?=\[|$)/i);if(h){let U=h[0].matchAll(/^Style:[^,]*,([^,]+)/gm);for(let K of U)Q1(K[1].trim())}let z=$.match(/\[Events\][\s\S]*/i);if(z){let U=z[0].matchAll(/\\fn([^\\}]*?)[\\}]/g),K=0;for(let A of U)if(Q1(A[1]),++K>=1000)break}}else{let h=v4($,!0);for(let r=0;r<h.length;r++)for(let U=0;U<h[r].body.length;U++){let K=h[r].body[U];if(K.key==="Style"&&typeof K.value==="object"&&!Array.isArray(K.value))Q1(K.value.Fontname)}let z=$.match(/\[Events\][\s\S]*/i);if(z){let U=z[0].matchAll(/\\fn([^\\}]*?)[\\}]/g);for(let K of U)Q1(K[1])}}},d1=($,Z)=>{let h=new XMLHttpRequest;return h.open("GET",$,!1),h.responseType=Z?"arraybuffer":"text",h.send(null),h.response},t1=($,Z,h)=>{let z=new XMLHttpRequest;z.open("GET",$,!0),z.responseType="arraybuffer",z.onload=()=>{if((z.status===200||z.status===0)&&z.response)return Z(z.response)},z.onerror=h,z.send(null)},a1=()=>{let $=g(),Z=o();l0(),N1=q4(),q0=b1[$.getTrackColorSpace(Z)],O1=!0,postMessage({target:"verifyColorSpace",subtitleColorSpace:q0}),postMessage({target:"trackReady"})};self.setTrack=({content:$})=>{if(k1(),N0=null,P0=!1,Uw($)){$2(i1($)),a1();return}if(E4($),v1)$=M1($);if(K1)$=C1($);L4($),a1()};self.setEncryptedTrack=async({content:$})=>{k1(),N0=null,P0=!0;let Z=await P4($);try{$2(Z)}finally{Z.fill(0)}a1()};self.getColorSpace=()=>{postMessage({target:"verifyColorSpace",subtitleColorSpace:q0})};self.freeTrack=()=>{k1(),N0=null,N1=null,P0=!1;let $=g(),Z=o();$.removeTrack(Z),l0()};self.setTrackByUrl=({url:$})=>{self.setTrack({content:d1($)})};var u0=!0,g4=()=>{let $=(L0()-A1)/1000;if(u0)return k0;else{if($>5)console.error("Didn't receive currentTime > 5 seconds. Assuming video was paused."),R4(!0);return k0+$*O4}},Ww=($)=>{if(k0=$,A1=L0(),p0)return;if(!Q0)if(o1)Q0=J2(V1);else V1(),o1=!0,setTimeout(()=>{o1=!1},20)},R4=($)=>{if(p0){if(u0=$,Q0)r4(Q0),Q0=null;return}if($!==u0)if(u0=$,$){if(Q0)r4(Q0),Q0=null}else A1=L0(),Q0=J2(V1)},Vw=()=>{if(n0||t.length===0)return;if(t.length>1){let Z=t.length-1;P.framesDropped+=Z;let h=t[t.length-1];t.length=0,t.push(h)}let $=t.shift();if(!$)return;m0($.time,$.force)},Y0=()=>{n0=!1,Vw()},m0=($,Z)=>{if(n0){let H={time:$,force:Z?1:0};if(H.force)t.length=0;else{let W=t[t.length-1];if(W&&Math.abs(W.time-H.time)>0.25)t.length=0}if(t.length>=a4)t.shift(),P.framesDropped++;t.push(H);return}if(!Z&&H0>=0&&$>=H0&&$<Y1){P.cacheHits++,postMessage({target:"unbusy"});return}n0=!0,H4();let h={},z=performance.now();P.renderStartTime=z,P.pendingRenders++;let r=g(),U=o(),K=Z?1:0;f2(y4);let A=e1==="wasm"?r.renderBlendCollect(U,$,K,i,$0):r.renderImageCollect(U,$,K,i,$0);vw();let D=U1,c=D[0];if(D[1]===0&&(H0<0||$<H0||$>=Y1))zw($);let L=performance.now()-z;if(P.lastRenderTime=L,P.totalRenderTime+=L,P.maxRenderTime=Math.max(P.maxRenderTime,L),L>0)P.minRenderTime=Math.min(P.minRenderTime,L);if(c!==0||Z)P.framesRendered++,P.cacheMisses++;else P.cacheHits++;if(l){let H=performance.now(),W=D[2];h.WASMRenderTime=W-z,h.WASMBitmapDecodeTime=H-W,h.JSRenderTime=Date.now()}if(c!==0||Z){let H=Gw,W=Zw;if(H.length=0,W.length=0,A===0)return S1({images:H,buffers:W,times:h});let _=w2;if(U0&&c0!==!0){let N=Qw;N.length=A;for(let O=0;O<A;++O){let B=O*j1,q=z4(O);q.x=_[B],q.y=_[B+1],q.w=_[B+2],q.h=_[B+3],q.image=0;let Y=_[B+4],x=q.w*q.h*4,F=new Uint8ClampedArray(self.wasmMemory.buffer,Y,x);if(A4)F=F.slice();let V=new ImageData(F,q.w,q.h);N[O]=T0?createImageBitmap(V,{premultiplyAlpha:"none",colorSpaceConversion:"none"}):createImageBitmap(V),H[O]=q}Promise.all(N).then((O)=>{for(let B=0;B<A;B++)H[B].image=O[B];if(l)h.JSBitmapGenerationTime=Date.now()-(h.JSRenderTime||0);S1({images:H,buffers:O,times:h})}).catch(()=>{if(T0)T0=!1,console.warn("[AkariSub] createImageBitmap options not supported, disabling"),P.pendingRenders--,Y0(),m0($,Z);else P.pendingRenders--,postMessage({target:"unbusy"}),Y0()})}else{let N=null,O=0;if(!_0){let B=0;for(let q=0;q<A;++q){let Y=q*j1;B+=_[Y+2]*_[Y+3]*4}N=new Uint8ClampedArray(B),W.push(N.buffer)}for(let B=0;B<A;++B){let q=B*j1,Y=z4(B);if(Y.x=_[q],Y.y=_[q+1],Y.w=_[q+2],Y.h=_[q+3],Y.image=_[q+4],N){let x=Y.image,F=Y.w*Y.h*4,V=N.subarray(O,O+F);V.set(self.HEAPU8C.subarray(x,x+F)),Y.image=V,O+=F}H[B]=Y}S1({images:H,buffers:W,times:h})}}else P.pendingRenders--,postMessage({target:"unbusy"}),Y0()};self.demand=({time:$})=>{k0=$,A1=L0();let Z=O1?1:0;O1=!1,m0($,Z)};var V1=($)=>{if(Q0=null,m0(g4(),$),!u0)Q0=J2(V1)},S1=({times:$,images:Z,buffers:h})=>{P.pendingRenders--;let{width:z,height:r}=self,U=Z.length,K={target:"render",asyncRender:U0,images:Z,times:$,width:z,height:r,colorSpace:q0};if(c0){if(O0.height!==r||O0.width!==z)O0.width=z,O0.height=r;if(_0.clearRect(0,0,z,r),U0)for(let A=0;A<U;A++){let D=Z[A];if(D.image)_0.drawImage(D.image,D.x,D.y),D.image.close()}else for(let A=0;A<U;A++){let D=Z[A];if(D.image){let{w:c,h:C}=D;if(V0.width!==c||V0.height!==C)V0.width=c,V0.height=C;let L=D.image,H=c*C*4,W=self.HEAPU8C.subarray(L,L+H);W4.putImageData(new ImageData(W,c,C),0,0),_0.drawImage(V0,D.x,D.y)}}if(c0==="hybrid"){if(!U){postMessage(K),Y0();return}if(l)$.bitmaps=U;try{let A=O0.transferToImageBitmap(),D={...K,images:[{image:A,x:0,y:0}],asyncRender:!0};postMessage(D,[A]),Y0()}catch{postMessage({target:"unbusy"}),Y0()}}else{if(l){$.JSRenderTime=Date.now()-($.JSRenderTime||0)-($.JSBitmapGenerationTime||0);let A=0;for(let D in $)A+=$[D]||0;console.log("Bitmaps: "+U+" Total: "+(A|0)+"ms",$)}postMessage({target:"unbusy"}),Y0()}}else postMessage(K,h),Y0()},J2=self.requestAnimationFrame?self.requestAnimationFrame.bind(self):(()=>{let $=0;return(Z)=>{let h=L0();if($===0)$=h+1000/X1;else while(h+2>=$)$+=1000/X1;let z=Math.max($-h,0);return setTimeout(Z,z)}})(),r4=self.cancelAnimationFrame?self.cancelAnimationFrame.bind(self):clearTimeout;self.init=async($)=>{if(A4=$.hasBitmapBug,V4=!!$.fullTrackWarmup,typeof $.initialTime==="number"&&Number.isFinite($.initialTime))k0=$.initialTime;let Z=self.fetch,h=(K)=>{if(WebAssembly.instantiateStreaming)self.fetch=(A)=>Z(K)},z=()=>{self.fetch=Z},r=(K)=>{return h(K),h4({wasm:!WebAssembly.instantiateStreaming?d1(K,!0):void 0}).finally(z)},U=async(K)=>{T=K,u1={create:K._akarisub_create,destroy:K._akarisub_destroy,setDropAnimations:K._akarisub_set_drop_animations,createTrackMem:K._akarisub_create_track_mem,removeTrack:K._akarisub_remove_track,resizeCanvas:K._akarisub_resize_canvas,addFont:K._akarisub_add_font,reloadFonts:K._akarisub_reload_fonts,setDefaultFont:K._akarisub_set_default_font,setFallbackFonts:K._akarisub_set_fallback_fonts,setMemoryLimits:K._akarisub_set_memory_limits,getEventCount:K._akarisub_get_event_count,allocEvent:K._akarisub_alloc_event,removeEvent:K._akarisub_remove_event,getStyleCount:K._akarisub_get_style_count,allocStyle:K._akarisub_alloc_style,removeStyle:K._akarisub_remove_style,styleOverrideIndex:K._akarisub_style_override_index,disableStyleOverride:K._akarisub_disable_style_override,getTrackColorSpace:K._akarisub_get_track_color_space,eventGetInt:K._akarisub_event_get_int,eventSetInt:K._akarisub_event_set_int,eventGetStr:K._akarisub_event_get_str,eventSetStr:K._akarisub_event_set_str,styleGetNum:K._akarisub_style_get_num,styleSetNum:K._akarisub_style_set_num,styleGetStr:K._akarisub_style_get_str,styleSetStr:K._akarisub_style_set_str,getEventTimeRange:K._akarisub_get_event_time_range,getEmptyWindow:K._akarisub_get_empty_window,renderBlendCollect:K._akarisub_render_blend_collect,renderImageCollect:K._akarisub_render_image_collect};let A=[],D=new Set;if($.fallbackFonts&&$.fallbackFonts.length>0)for(let N of $.fallbackFonts){let O=N.trim(),B=O.toLowerCase();if(B&&!D.has(B))D.add(B),A.push(O)}try{K.FS_createPath("/","fonts",!0,!0),K.FS_createPath("/fonts","attached",!0,!0),K.FS_createPath("/fonts","fallback",!0,!0),K.FS_createPath("/","fontconfig",!0,!0),K.FS_createPath("/","assets",!0,!0),K.FS_createPath("/","etc",!0,!0),K.FS_createPath("/etc","fonts",!0,!0);let N=`<?xml version="1.0"?>
|
|
2
2
|
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
|
|
3
3
|
<fontconfig>
|
|
4
4
|
<!-- Font directories listed in priority order -->
|
|
@@ -36,4 +36,4 @@
|
|
|
36
36
|
</rescan>
|
|
37
37
|
</config>
|
|
38
38
|
</fontconfig>
|
|
39
|
-
`,
|
|
39
|
+
`,O=N4.encode(N);K.FS_createDataFile("/assets","fonts.conf",O,!0,!1,!1),K.FS_createDataFile("/etc/fonts","fonts.conf",O,!0,!1,!1)}catch(N){console.warn("Failed to create font directories or fonts.conf:",N)}if(self.width=$.width,self.height=$.height,p0=!!$.onDemandRender,e1=$.blendMode,U0=$.asyncRender,U0&&typeof createImageBitmap>"u")U0=!1,console.error("'createImageBitmap' needed for 'asyncRender' unsupported!");if(U0)try{let O=new OffscreenCanvas(1,1).getContext("2d");if(O){let B=O.getImageData(0,0,1,1);await createImageBitmap(B,{premultiplyAlpha:"none",colorSpaceConversion:"none"}).catch(()=>{T0=!1,console.warn("[AkariSub] createImageBitmap options not supported (Safari?), rendering without options")})}}catch{T0=!1}A0=$.availableFonts,l=$.debug,X1=$.targetFps||X1,U4=$.useLocalFonts,K1=$.dropAllBlur,v1=$.clampPos,await(async()=>{let N=[];for(let O of A){let B=O.trim().toLowerCase(),q=B.startsWith("@")?B.substring(1):B;if(A0&&A0[q]){let Y=A0[q];if(typeof Y==="string"){let x=new Promise((F)=>{t1(Y,(V)=>{if(h1(new Uint8Array(V),!0),r1[q]=!0,l)console.log("[AkariSub] Loaded fallback font async:",q);F()},(V)=>{console.error("Failed to load fallback font:",q,V),F()})});N.push(x)}else h1(Y,!0),r1[q]=!0}}if(N.length>0){let O=null,B=!1,q=new Promise((Y)=>{O=setTimeout(()=>{B=!0,console.warn("[AkariSub] Fallback font loading timeout, continuing with available fonts"),Y()},30000)});if(await Promise.race([Promise.all(N).then(()=>{if(O!==null)clearTimeout(O)}),q]),!B&&l)console.log("[AkariSub] All fallback fonts loaded successfully")}})();let C=A.length>0?A[0]:null;if(b=y0(C||"",(N)=>{return g().create(self.width,self.height,N,l?1:0)}),o0.length>0){for(let{data:N,name:O}of o0)s0(N,O);o0.length=0,g().reloadFonts(b)}if(A.length>0)y0(A.join(","),(N)=>{g().setFallbackFonts(o(),N)});let L=$.subContent,H=null;if($.encryptedSubContent)P0=!0,H=await P4($.encryptedSubContent),L=H;else if(P0=!1,!L)L=d1($.subUrl);if(typeof L==="string"?L.length>500000:i1(L).byteLength>500000){if(postMessage({target:"partial_ready"}),l)console.log("[AkariSub] Large subtitle detected, emitting partial_ready early")}if(typeof L==="string"){if(E4(L),v1)L=M1(L);if(K1)L=C1(L)}else if(l&&(v1||K1))console.warn("[AkariSub] Text rewrite options are skipped for protected binary subtitle content");let _=!1,I=[];for(let N of $.fonts||[])if(typeof N==="string"){let O=new Promise((B)=>{t1(N,(q)=>{if(h1(new Uint8Array(q),!1),_=!0,l)console.log("[AkariSub] Loaded attached font async:",N);B()},(q)=>{console.error("Failed to load attached font:",N,q),B()})});I.push(O)}else h1(N,!1),_=!0;if(I.length>0){let N=null,O=!1,B=new Promise((q)=>{N=setTimeout(()=>{O=!0,console.warn("[AkariSub] Attached font loading timeout, continuing with available fonts"),q()},30000)});if(await Promise.race([Promise.all(I).then(()=>{if(N!==null)clearTimeout(N)}),B]),!O&&l)console.log("[AkariSub] Attached font loading complete")}if(_){if(l)console.log("[AkariSub] Reloading fonts after writing attached fonts to FS");if(g().reloadFonts(o()),l)console.log("[AkariSub] Font reload complete")}if(typeof L==="string")L4(L);else try{$2(i1(L))}finally{H?.fill(0)}if(l0(),N1=q4(),q0=b1[g().getTrackColorSpace(o())],g().setDropAnimations(o(),$.dropAllAnimations||0),$.libassMemoryLimit>0||$.libassGlyphLimit>0)g().setMemoryLimits(o(),$.libassGlyphLimit||0,$.libassMemoryLimit||0);H4(),f2(D4);try{B1(k0)}catch(N){if(l)console.warn("[AkariSub] Prewarm render failed, continuing:",N)}O1=!0,postMessage({target:"ready"}),postMessage({target:"verifyColorSpace",subtitleColorSpace:q0}),Xw()};r($.wasmUrl).then(U).catch((K)=>{console.error("[AkariSub] WASM loading failed:",K),postMessage({target:"error",error:"WASM loading failed: "+(K&&K.message?K.message:String(K))})})};self.offscreenCanvas=({transferable:$})=>{if(O0=$[0],_0=O0.getContext("2d",{desynchronized:!0}),!U0)V0=new OffscreenCanvas(self.width,self.height),W4=V0.getContext("2d",{desynchronized:!0});c0=!0};self.detachOffscreen=()=>{O0=new OffscreenCanvas(self.width,self.height),_0=O0.getContext("2d",{desynchronized:!0}),c0="hybrid"};self.canvas=({width:$,height:Z,videoWidth:h,videoHeight:z,force:r})=>{if($==null)throw Error("Invalid canvas size specified");if(self.width=$,self.height=Z,b)g().resizeCanvas(b,$,Z,h,z);if(r)m0(k0,!0)};self.video=({currentTime:$,isPaused:Z,rate:h})=>{if($!=null)Ww($);if(Z!=null)R4(Z);if(h!=null)O4=h};self.destroy=()=>{if(k1(),N0=null,N1=null,T){if(i)T._free(i),i=0,$0=0,U1=null,w2=null,c1=null,s1=0,l1=0}if(b)g().destroy(b),b=0;P.totalEvents=0};self.setAsyncRender=({value:$})=>{U0=$&&typeof createImageBitmap<"u"};var F4=($,Z)=>{let h=g(),z=o();for(let r of Object.keys(Z)){let U=Z[r];if(U==null||r==="_index")continue;if(r in K0){h.eventSetInt(z,$,K0[r],Number(U));continue}if(r in x0)y0(String(U),(K)=>{h.eventSetStr(z,$,x0[r],K)})}},Aw=($)=>{let Z=g(),h=o();return{Start:Z.eventGetInt(h,$,K0.Start),Duration:Z.eventGetInt(h,$,K0.Duration),ReadOrder:Z.eventGetInt(h,$,K0.ReadOrder),Layer:Z.eventGetInt(h,$,K0.Layer),Style:String(Z.eventGetInt(h,$,K0.Style)),MarginL:Z.eventGetInt(h,$,K0.MarginL),MarginR:Z.eventGetInt(h,$,K0.MarginR),MarginV:Z.eventGetInt(h,$,K0.MarginV),Name:S0(Z.eventGetStr(h,$,x0.Name)),Text:S0(Z.eventGetStr(h,$,x0.Text)),Effect:S0(Z.eventGetStr(h,$,x0.Effect))}},b4=($,Z)=>{let h=g(),z=o();for(let r of Object.keys(Z)){let U=Z[r];if(U==null)continue;if(r in M){h.styleSetNum(z,$,M[r],Number(U));continue}if(r in W1)y0(String(U),(K)=>{h.styleSetStr(z,$,W1[r],K)})}},Nw=($)=>{let Z=g(),h=o();return{Name:S0(Z.styleGetStr(h,$,W1.Name)),FontName:S0(Z.styleGetStr(h,$,W1.FontName)),FontSize:Z.styleGetNum(h,$,M.FontSize),PrimaryColour:Z.styleGetNum(h,$,M.PrimaryColour),SecondaryColour:Z.styleGetNum(h,$,M.SecondaryColour),OutlineColour:Z.styleGetNum(h,$,M.OutlineColour),BackColour:Z.styleGetNum(h,$,M.BackColour),Bold:Z.styleGetNum(h,$,M.Bold),Italic:Z.styleGetNum(h,$,M.Italic),Underline:Z.styleGetNum(h,$,M.Underline),StrikeOut:Z.styleGetNum(h,$,M.StrikeOut),ScaleX:Z.styleGetNum(h,$,M.ScaleX),ScaleY:Z.styleGetNum(h,$,M.ScaleY),Spacing:Z.styleGetNum(h,$,M.Spacing),Angle:Z.styleGetNum(h,$,M.Angle),BorderStyle:Z.styleGetNum(h,$,M.BorderStyle),Outline:Z.styleGetNum(h,$,M.Outline),Shadow:Z.styleGetNum(h,$,M.Shadow),Alignment:Z.styleGetNum(h,$,M.Alignment),MarginL:Z.styleGetNum(h,$,M.MarginL),MarginR:Z.styleGetNum(h,$,M.MarginR),MarginV:Z.styleGetNum(h,$,M.MarginV),Encoding:Z.styleGetNum(h,$,M.Encoding),treat_fontname_as_pattern:Z.styleGetNum(h,$,M.treat_fontname_as_pattern),Blur:Z.styleGetNum(h,$,M.Blur),Justify:Z.styleGetNum(h,$,M.Justify)}};self.createEvent=({event:$})=>{let Z=g().allocEvent(o());if(Z>=0)F4(Z,$);l0()};self.getEvents=()=>{let $=[],h=g().getEventCount(o());for(let z=0;z<h;z++){let r={...Aw(z),_index:z};if(P0)r.Name="",r.Effect="",r.Text="";$.push(r)}postMessage({target:"getEvents",events:$})};self.setEvent=({event:$,index:Z})=>{F4(Z,$)};self.removeEvent=({index:$})=>{g().removeEvent(o(),$),l0()};self.createStyle=({style:$})=>{let Z=g().allocStyle(o());if(Z>=0)b4(Z,$);return Z};self.getStyles=()=>{let $=[],h=g().getStyleCount(o());for(let z=0;z<h;z++)$.push(Nw(z));postMessage({target:"getStyles",time:Date.now(),styles:$})};self.setStyle=({style:$,index:Z})=>{b4(Z,$)};self.removeStyle=({index:$})=>{g().removeStyle(o(),$)};self.styleOverride=($)=>{let Z=self.createStyle($);if(typeof Z==="number"&&Z>=0)g().styleOverrideIndex(o(),Z)};self.disableStyleOverride=()=>{g().disableStyleOverride(o())};self.defaultFont=({font:$})=>{y0($,(Z)=>{g().setDefaultFont(o(),Z)})};self.getStats=()=>{let $=P.framesRendered>0?P.totalRenderTime/P.framesRendered:0;postMessage({target:"getStats",stats:{framesRendered:P.framesRendered,framesDropped:P.framesDropped,avgRenderTime:Math.round($*100)/100,maxRenderTime:Math.round(P.maxRenderTime*100)/100,minRenderTime:P.minRenderTime===1/0?0:Math.round(P.minRenderTime*100)/100,lastRenderTime:Math.round(P.lastRenderTime*100)/100,pendingRenders:Math.max(0,P.pendingRenders),totalEvents:P.totalEvents,cacheHits:P.cacheHits,cacheMisses:P.cacheMisses}})};self.resetStats=()=>{e4(),postMessage({target:"resetStats",success:!0})};self.getEventCount=()=>{let $=b?g().getEventCount(b):0;postMessage({target:"getEventCount",count:$})};self.getStyleCount=()=>{let $=b?g().getStyleCount(b):0;postMessage({target:"getStyleCount",count:$})};var kw=new Set(["demand","video","getEvents","getStyles","getStats","resetStats","getEventCount","getStyleCount","getColorSpace"]);onmessage=({data:$})=>{if(!self[$.target])throw Error("Unknown event target "+$.target);if(!kw.has($.target))Kw();Promise.resolve(self[$.target]($)).catch((Z)=>{postMessage({target:"error",error:Z instanceof Error?Z.message:String(Z)})})};})();
|
|
Binary file
|
package/dist/akarisub.umd.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
root.AkariSub = factory();
|
|
8
8
|
}
|
|
9
9
|
}(typeof self !== 'undefined' ? self : this, function() {
|
|
10
|
-
(()=>{var{defineProperty:h,getOwnPropertyNames:$J,getOwnPropertyDescriptor:QJ}=Object,KJ=Object.prototype.hasOwnProperty;function NJ(J){return this[J]}var OJ=(J)=>{var Z=(d??=new WeakMap).get(J),Q;if(Z)return Z;if(Z=h({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function"){for(var $ of $J(J))if(!KJ.call(Z,$))h(Z,$,{get:NJ.bind(J,$),enumerable:!(Q=QJ(J,$))||Q.enumerable})}return d.set(J,Z),Z},d;var GJ=(J)=>J;function FJ(J,Z){this[J]=GJ.bind(null,Z)}var
|
|
10
|
+
(()=>{var{defineProperty:h,getOwnPropertyNames:$J,getOwnPropertyDescriptor:QJ}=Object,KJ=Object.prototype.hasOwnProperty;function NJ(J){return this[J]}var OJ=(J)=>{var Z=(d??=new WeakMap).get(J),Q;if(Z)return Z;if(Z=h({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function"){for(var $ of $J(J))if(!KJ.call(Z,$))h(Z,$,{get:NJ.bind(J,$),enumerable:!(Q=QJ(J,$))||Q.enumerable})}return d.set(J,Z),Z},d;var GJ=(J)=>J;function FJ(J,Z){this[J]=GJ.bind(null,Z)}var XJ=(J,Z)=>{for(var Q in Z)h(J,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:FJ.bind(Z,Q)})};var PJ={};XJ(PJ,{webYCbCrMap:()=>u,testImageBugs:()=>l,runFeatureTests:()=>a,parseAss:()=>o,libassYCbCrMap:()=>s,isWebGPUSupported:()=>f,isWebGL2Supported:()=>p,getVideoPosition:()=>c,getColorSpaceFilterUrl:()=>r,getBitmapBug:()=>e,getAlphaBug:()=>t,fixPlayRes:()=>i,fixAlpha:()=>m,dropBlur:()=>n,default:()=>z,computeCanvasSize:()=>w,colorMatrixConversionMap:()=>y,WebGPURenderer:()=>v,WebGL2Renderer:()=>x,AkariSub:()=>z});var u={bt709:"BT709",bt470bg:"BT601",smpte170m:"BT601"},y={BT601:{BT709:"1.0863 -0.0723 -0.014 0 0 0.0965 0.8451 0.0584 0 0 -0.0141 -0.0277 1.0418"},BT709:{BT601:"0.9137 0.0784 0.0079 0 0 -0.1049 1.1722 -0.0671 0 0 0.0096 0.0322 0.9582"},FCC:{BT709:"1.0873 -0.0736 -0.0137 0 0 0.0974 0.8494 0.0531 0 0 -0.0127 -0.0251 1.0378",BT601:"1.001 -0.0008 -0.0002 0 0 0.0009 1.005 -0.006 0 0 0.0013 0.0027 0.996"},SMPTE240M:{BT709:"0.9993 0.0006 0.0001 0 0 -0.0004 0.9812 0.0192 0 0 -0.0034 -0.0114 1.0148",BT601:"0.913 0.0774 0.0096 0 0 -0.1051 1.1508 -0.0456 0 0 0.0063 0.0207 0.973"}},s=[null,"BT601",null,"BT601","BT601","BT709","BT709","SMPTE240M","SMPTE240M","FCC","FCC"];function r(J,Z){if(!J||!Z)return null;if(J===Z)return null;let Q=y[J]?.[Z];if(!Q)return null;return`url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='f'><feColorMatrix type='matrix' values='${Q} 0 0 0 0 0 1 0'/></filter></svg>#f")`}function w(J,Z,Q,$,N){let O=Q<=0?1:Q,K=globalThis.devicePixelRatio||1;if(Z<=0||J<=0)return{width:0,height:0};let G=O<1?-1:1,F=Z*K;if(G*F*O<=G*$)F*=O;else if(G*F<G*$)F=$;if(N>0&&F>N)F=N;return J*=F/Z,Z=F,{width:J,height:Z}}function c(J,Z=J.videoWidth,Q=J.videoHeight){let $=Z/Q,{offsetWidth:N,offsetHeight:O}=J,K=N/O,G=N,F=O;if(K>$)G=Math.floor(O*$);else F=Math.floor(N/$);let X=(N-G)/2,E=(O-F)/2;return{width:G,height:F,x:X,y:E}}function m(J,Z){if(!Z)return J;let Q=J.length,$=Q-Q%16,N=3;for(;N<$;N+=16){if(J[N]<2)J[N]=1;if(J[N+4]<2)J[N+4]=1;if(J[N+8]<2)J[N+8]=1;if(J[N+12]<2)J[N+12]=1}for(;N<Q;N+=4)if(J[N]<2)J[N]=1;return J}function o(J,Z=!1){let Q=[],$=J.split(/[\r\n]+/g),N=$.length,O=null,K=null;for(let G=0;G<N;G++){let F=$[G];if(!F||/^\s*$/.test(F))continue;let X=F[0];if(X==="["){let E=F.match(/^\[(.*)\]$/);if(E){if(Z&&E[1].toLowerCase()==="events")break;O=null,K={name:E[1],body:[]},Q.push(K);continue}}if(!K)continue;if(X===";")K.body.push({type:"comment",value:F.substring(1)});else{let E=F.indexOf(":");if(E===-1)continue;let M=F.substring(0,E),Y=F.substring(E+1).trim();if(O||M==="Format"){let U=Y.split(",");if(O&&U.length>O.length){let j=U.slice(O.length-1).join(",");U=U.slice(0,O.length-1),U.push(j)}let L=U.length;for(let j=0;j<L;j++)U[j]=U[j].trim();if(O){let j={},T=Math.min(O.length,L);for(let B=0;B<T;B++)j[O[B]]=U[B];Y=j}else Y=U}if(M==="Format")O=Y;K.body.push({key:M,value:Y})}}return Q}var qJ=/\\blur(?:[0-9]+\.)?[0-9]+/gm;function n(J){return J.replace(qJ,"")}var YJ=[{w:7680,h:4320},{w:3840,h:2160},{w:2560,h:1440},{w:1920,h:1080},{w:1280,h:720}];function UJ(J,Z){let Q=[...YJ].sort(($,N)=>$.w-N.w);for(let $ of Q)if(J<=$.w&&Z<=$.h)return $;return{w:Math.ceil(J/100)*100,h:Math.ceil(Z/100)*100}}function k(J,Z){return Z&&Z.includes(".")?J.toFixed(2).replace(/\.?0+$/,""):Math.round(J)}function i(J){let Z=J.match(/PlayResX:\s*(\d+)/i),Q=J.match(/PlayResY:\s*(\d+)/i),$=Z?parseInt(Z[1],10):1920,N=Q?parseInt(Q[1],10):1080,O=/\\pos\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,K=/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)/g,G=/\\org\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,F=/\\i?clip\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,X=0,E=0,M=(P,q,R)=>{let H,D=new RegExp(P.source,"g");while((H=D.exec(J))!==null){for(let A of q)if(H[A]){let C=Math.abs(parseFloat(H[A]));if(C>X)X=C}for(let A of R)if(H[A]){let C=Math.abs(parseFloat(H[A]));if(C>E)E=C}}};if(M(O,[1],[2]),M(K,[1,3],[2,4]),M(G,[1],[2]),M(F,[1,3],[2,4]),X<=$&&E<=N)return J;let Y=UJ(X,E),U=$/Y.w,L=N/Y.h,j=Math.min(U,L),T=Math.max(U,L),B=1,V=J,W=V.match(/(\[Events\][\s\S]*)/i);if(!W)return V;let _=W[1];return _=_.replace(O,(P,q,R)=>`\\pos(${k(parseFloat(q)*U,q)},${k(parseFloat(R)*L,R)})`),_=_.replace(/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)(?:\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+))?\s*\)/g,(P,q,R,H,D,A,C)=>{let g=`\\move(${k(parseFloat(q)*U,q)},${k(parseFloat(R)*L,R)},${k(parseFloat(H)*U,H)},${k(parseFloat(D)*L,D)}`;return A?`${g},${A},${C})`:`${g})`}),_=_.replace(G,(P,q,R)=>`\\org(${k(parseFloat(q)*U,q)},${k(parseFloat(R)*L,R)})`),_=_.replace(/\\(i?clip)\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,(P,q,R,H,D,A)=>`\\${q}(${k(parseFloat(R)*U,R)},${k(parseFloat(H)*L,H)},${k(parseFloat(D)*U,D)},${k(parseFloat(A)*L,A)})`),_=_.replace(/\\fs([\d.]+)/g,(P,q)=>`\\fs${k(parseFloat(q)*T,q)}`),_=_.replace(/\\fscx([\d.]+)/g,(P,q)=>`\\fscx${k(parseFloat(q)*B,q)}`),_=_.replace(/\\xbord([\d.]+)/g,(P,q)=>`\\xbord${k(parseFloat(q)*U,q)}`),_=_.replace(/\\ybord([\d.]+)/g,(P,q)=>`\\ybord${k(parseFloat(q)*L,q)}`),_=_.replace(/\\xshad(-?[\d.]+)/g,(P,q)=>`\\xshad${k(parseFloat(q)*U,q)}`),_=_.replace(/\\yshad(-?[\d.]+)/g,(P,q)=>`\\yshad${k(parseFloat(q)*L,q)}`),["fsp","bord","shad","be","blur"].forEach((P)=>{let q=new RegExp(`\\\\${P}(-?[\\d.]+)`,"g");_=_.replace(q,(R,H)=>`\\${P}${k(parseFloat(H)*j,H)}`)}),_=_.replace(/(\\i?clip\s*\([^,)]+m[^)]+\)|\\p[1-9][^}]*?)(?=[\\}]|$)/g,(P)=>{return P.replace(/(-?[\d.]+)\s+(-?[\d.]+)/g,(q,R,H)=>{return`${k(parseFloat(R)*U,R)} ${k(parseFloat(H)*L,H)}`})}),V.substring(0,W.index)+_}var b=null,S=null;async function l(){if(b!==null&&S!==null)return{hasAlphaBug:b,hasBitmapBug:S};let J=document.createElement("canvas"),Z=J.getContext("2d",{willReadFrequently:!0});if(!Z)throw Error("Canvas rendering not supported");if(typeof ImageData.prototype.constructor==="function")try{new ImageData(new Uint8ClampedArray([0,0,0,0]),1,1)}catch{console.log("Detected that ImageData is not constructable despite browser saying so")}let Q=document.createElement("canvas"),$=Q.getContext("2d",{willReadFrequently:!0});if(!$)throw Error("Canvas rendering not supported");J.width=Q.width=1,J.height=Q.height=1,Z.clearRect(0,0,1,1),$.clearRect(0,0,1,1);let N=$.getImageData(0,0,1,1).data;Z.putImageData(new ImageData(new Uint8ClampedArray([0,255,0,0]),1,1),0,0),$.drawImage(J,0,0);let O=$.getImageData(0,0,1,1).data;if(b=N[1]!==O[1],b)console.log("Detected a browser having issue with transparent pixels, applying workaround");if(typeof createImageBitmap<"u"){let K=new Uint8ClampedArray([255,0,255,0,255]).subarray(1,5);$.drawImage(await createImageBitmap(new ImageData(K,1)),0,0);let{data:G}=$.getImageData(0,0,1,1);S=!1;for(let F=0;F<G.length;F++)if(Math.abs(K[F]-G[F])>15){S=!0,console.log("Detected a browser having issue with partial bitmaps, applying workaround");break}}else S=!1;return J.remove(),Q.remove(),{hasAlphaBug:b,hasBitmapBug:S}}async function a(){return l()}function t(){return b}function e(){return S}function f(){return typeof navigator<"u"&&"gpu"in navigator}function EJ(J){if(J instanceof ArrayBuffer)return new Uint8Array(J);return new Uint8Array(J.buffer,J.byteOffset,J.byteLength)}class v{device=null;context=null;pipeline=null;bindGroupLayout=null;uniformBuffer=null;imageDataBuffer=null;textureArray=null;textureArrayView=null;textureArraySize=0;textureArrayWidth=0;textureArrayHeight=0;pendingDestroyTextures=[];imageDataArray;resolutionArray=new Float32Array(2);bindGroup=null;bindGroupDirty=!0;lastCanvasWidth=0;lastCanvasHeight=0;format="bgra8unorm";_canvas=null;_initPromise=null;_initialized=!1;constructor(){this.imageDataArray=new Float32Array(2048)}async init(){if(this._initPromise)return this._initPromise;return this._initPromise=this._initDevice(),this._initPromise}async _initDevice(){if(!navigator.gpu)throw Error("WebGPU not supported");let J=await navigator.gpu.requestAdapter({powerPreference:"high-performance"});if(!J)throw Error("No WebGPU adapter found");this.device=await J.requestDevice(),this.format=navigator.gpu.getPreferredCanvasFormat();let Z=this.device.createShaderModule({code:`
|
|
11
11
|
struct VertexOutput {
|
|
12
12
|
@builtin(position) position: vec4f,
|
|
13
13
|
@location(0) @interpolate(flat) instanceIndex: u32,
|
|
@@ -100,7 +100,7 @@ fn fragmentMain(input: FragmentInput) -> @location(0) vec4f {
|
|
|
100
100
|
// Premultiplied alpha output
|
|
101
101
|
return vec4f(color.rgb * color.a, color.a);
|
|
102
102
|
}
|
|
103
|
-
`});this.uniformBuffer=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.imageDataBuffer=this.device.createBuffer({size:8192,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),this.createTextureArray(256,256,32),this.bindGroupLayout=this.device.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"unfilterable-float",viewDimension:"2d-array"}}]});let $=this.device.createPipelineLayout({bindGroupLayouts:[this.bindGroupLayout]});this.pipeline=this.device.createRenderPipeline({layout:$,vertex:{module:Z,entryPoint:"vertexMain"},fragment:{module:Q,entryPoint:"fragmentMain",targets:[{format:this.format,blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},primitive:{topology:"triangle-list"}}),this._initialized=!0}
|
|
103
|
+
`});this.uniformBuffer=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.imageDataBuffer=this.device.createBuffer({size:8192,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),this.createTextureArray(256,256,32),this.bindGroupLayout=this.device.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"unfilterable-float",viewDimension:"2d-array"}}]});let $=this.device.createPipelineLayout({bindGroupLayouts:[this.bindGroupLayout]});this.pipeline=this.device.createRenderPipeline({layout:$,vertex:{module:Z,entryPoint:"vertexMain"},fragment:{module:Q,entryPoint:"fragmentMain",targets:[{format:this.format,blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},primitive:{topology:"triangle-list"}}),this._initialized=!0}roundDim(J){return Math.max(J,64)+63&-64}roundLayers(J){return Math.min(Math.max(J,8)+7&-8,256)}createTextureArray(J,Z,Q){if(this.textureArray)this.pendingDestroyTextures.push(this.textureArray);let $=this.roundDim(J),N=this.roundDim(Z),O=this.roundLayers(Q);this.textureArray=this.device.createTexture({size:[$,N,O],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),this.textureArrayView=this.textureArray.createView({dimension:"2d-array"}),this.textureArrayWidth=$,this.textureArrayHeight=N,this.textureArraySize=O,this.bindGroupDirty=!0;let K=this.device.createCommandEncoder();for(let G=0;G<O;G++){let F=this.textureArray.createView({dimension:"2d",baseArrayLayer:G,arrayLayerCount:1});K.beginRenderPass({colorAttachments:[{view:F,clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}]}).end()}this.device.queue.submit([K.finish()])}ensureTextureArray(J,Z,Q){let $=Math.min(Q,256);if(J<=this.textureArrayWidth&&Z<=this.textureArrayHeight&&$<=this.textureArraySize)return!1;let N=Math.max(this.textureArrayWidth,J),O=Math.max(this.textureArrayHeight,Z),K=Math.max($,Math.min(this.textureArraySize,16));return this.createTextureArray(N,O,K),!0}updateBindGroup(){if(!this.bindGroupDirty||!this.device||!this.bindGroupLayout)return;this.bindGroup=this.device.createBindGroup({layout:this.bindGroupLayout,entries:[{binding:0,resource:{buffer:this.uniformBuffer}},{binding:1,resource:{buffer:this.imageDataBuffer}},{binding:2,resource:this.textureArrayView}]}),this.bindGroupDirty=!1}async setCanvas(J,Z,Q){if(await this.init(),!this.device)throw Error("WebGPU device not initialized");if(Z<=0||Q<=0)return;if(this._canvas=J,J.width=Z,J.height=Q,!this.context){if(this.context=J.getContext("webgpu"),!this.context)throw Error("Could not get WebGPU context");this.context.configure({device:this.device,format:this.format,alphaMode:"premultiplied"})}this.resolutionArray[0]=Z,this.resolutionArray[1]=Q,this.device.queue.writeBuffer(this.uniformBuffer,0,this.resolutionArray),this.lastCanvasWidth=Z,this.lastCanvasHeight=Q}updateSize(J,Z){if(!this.device||!this._canvas||J<=0||Z<=0)return;if(J===this.lastCanvasWidth&&Z===this.lastCanvasHeight)return;this._canvas.width=J,this._canvas.height=Z,this.resolutionArray[0]=J,this.resolutionArray[1]=Z,this.device.queue.writeBuffer(this.uniformBuffer,0,this.resolutionArray),this.lastCanvasWidth=J,this.lastCanvasHeight=Z}renderBitmaps(J,Z,Q){if(!this.device||!this.context||!this.pipeline)return;let $=J.length;if($===0){this.clear();return}let N=this.context.getCurrentTexture();if(N.width===0||N.height===0)return;let O=0,K=0,G=0;for(let T=0;T<$;T++){let{image:B}=J[T],V=B.width,W=B.height;if(V>0&&W>0){if(V>O)O=V;if(W>K)K=W;G++}}if(G===0){this.clear();return}let F=Math.min(G,256);this.ensureTextureArray(O,K,F),this.updateBindGroup();let X=this.device,E=X.queue,M=this.textureArray,Y=this.imageDataArray,U=N.createView(),L=0,j=!0;while(L<$){let T=0;while(L<$&&T<256){let W=J[L++],_=W.image,I=_.width,P=_.height;if(I<=0||P<=0)continue;E.copyExternalImageToTexture({source:_,flipY:!1},{texture:M,origin:[0,0,T],premultipliedAlpha:!1},{width:I,height:P});let q=T<<3;Y[q]=W.x,Y[q+1]=W.y,Y[q+2]=I,Y[q+3]=P,Y[q+4]=I,Y[q+5]=P,Y[q+6]=T,Y[q+7]=0,T++}if(T===0)continue;E.writeBuffer(this.imageDataBuffer,0,Y.buffer,0,T<<5);let B=X.createCommandEncoder(),V=B.beginRenderPass({colorAttachments:[{view:U,clearValue:{r:0,g:0,b:0,a:0},loadOp:j?"clear":"load",storeOp:"store"}]});V.setPipeline(this.pipeline),V.setBindGroup(0,this.bindGroup),V.draw(6,T),V.end(),E.submit([B.finish()]),j=!1}this.cleanupPendingTextures()}render(J,Z,Q){if(!this.device||!this.context||!this.pipeline)return;let $=J.length;if($===0){this.clear();return}let N=this.context.getCurrentTexture();if(N.width===0||N.height===0)return;let O=0,K=0,G=0;for(let T=0;T<$;T++){let{w:B,h:V}=J[T];if(B>0&&V>0){if(B>O)O=B;if(V>K)K=V;G++}}if(G===0){this.clear();return}let F=Math.min(G,256);this.ensureTextureArray(O,K,F),this.updateBindGroup();let X=this.device,E=X.queue,M=this.textureArray,Y=this.imageDataArray,U=N.createView(),L=0,j=!0;while(L<$){let T=0;while(L<$&&T<256){let W=J[L++],_=W.w,I=W.h;if(_<=0||I<=0)continue;let P=W.image;if(P instanceof ImageBitmap)E.copyExternalImageToTexture({source:P,flipY:!1},{texture:M,origin:[0,0,T],premultipliedAlpha:!1},{width:_,height:I});else if(P instanceof ArrayBuffer||P instanceof Uint8Array||P instanceof Uint8ClampedArray)this.uploadTextureData(T,P,_,I);let q=T<<3;Y[q]=W.x,Y[q+1]=W.y,Y[q+2]=_,Y[q+3]=I,Y[q+4]=_,Y[q+5]=I,Y[q+6]=T,Y[q+7]=0,T++}if(T===0)continue;E.writeBuffer(this.imageDataBuffer,0,Y.buffer,0,T<<5);let B=X.createCommandEncoder(),V=B.beginRenderPass({colorAttachments:[{view:U,clearValue:{r:0,g:0,b:0,a:0},loadOp:j?"clear":"load",storeOp:"store"}]});V.setPipeline(this.pipeline),V.setBindGroup(0,this.bindGroup),V.draw(6,T),V.end(),E.submit([B.finish()]),j=!1}this.cleanupPendingTextures()}uploadTextureData(J,Z,Q,$){this.device.queue.writeTexture({texture:this.textureArray,origin:[0,0,J]},EJ(Z),{bytesPerRow:Q*4},{width:Q,height:$})}cleanupPendingTextures(){let J=this.pendingDestroyTextures,Z=J.length;if(Z===0)return;for(let Q=0;Q<Z;Q++)J[Q].destroy();J.length=0}clear(){if(!this.device||!this.context)return;try{let J=this.context.getCurrentTexture();if(J.width===0||J.height===0)return;let Z=this.device.createCommandEncoder();Z.beginRenderPass({colorAttachments:[{view:J.createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}]}).end(),this.device.queue.submit([Z.finish()])}catch{}}get initialized(){return this._initialized}destroy(){this.cleanupPendingTextures(),this.textureArray?.destroy(),this.textureArray=null,this.textureArrayView=null,this.uniformBuffer?.destroy(),this.uniformBuffer=null,this.imageDataBuffer?.destroy(),this.imageDataBuffer=null,this.bindGroup=null,this.device?.destroy(),this.device=null,this.context=null,this._canvas=null,this._initialized=!1,this._initPromise=null}}function p(){if(typeof document>"u")return!1;try{return document.createElement("canvas").getContext("webgl2")!==null}catch{return!1}}function _J(J){return J instanceof Uint8Array||J instanceof Uint8ClampedArray}function JJ(J,Z,Q){let $=J.createShader(Z);if(J.shaderSource($,Q),J.compileShader($),!J.getShaderParameter($,J.COMPILE_STATUS)){let N=J.getShaderInfoLog($);throw J.deleteShader($),Error(`WebGL2 shader compilation failed: ${N}`)}return $}class x{_gl=null;_canvas=null;_program=null;_vao=null;_instanceBuffer=null;_texArray=null;_texWidth=0;_texHeight=0;_texLayers=0;_resolutionLoc=null;_texArraySizeLoc=null;_instanceData;_lastCanvasWidth=0;_lastCanvasHeight=0;_initialized=!1;_initPromise=null;constructor(){this._instanceData=new Float32Array(2048)}async init(){if(this._initPromise)return this._initPromise;return this._initPromise=this._checkSupport(),this._initPromise}async _checkSupport(){if(typeof document>"u")throw Error("WebGL2 requires a DOM environment");if(!document.createElement("canvas").getContext("webgl2"))throw Error("WebGL2 not supported")}_initGL(){if(!this._canvas)throw Error("Canvas not set before _initGL");if(this._gl)return;let J=this._canvas.getContext("webgl2",{alpha:!0,premultipliedAlpha:!0,antialias:!1});if(!J)throw Error("Failed to create WebGL2 context");this._gl=J;let Z=JJ(J,J.VERTEX_SHADER,`#version 300 es
|
|
104
104
|
precision highp float;
|
|
105
105
|
|
|
106
106
|
in vec4 a_destRect;
|
|
@@ -153,7 +153,7 @@ void main() {
|
|
|
153
153
|
// Premultiplied alpha output (matches WebGPU renderer behaviour)
|
|
154
154
|
fragColor = vec4(color.rgb * color.a, color.a);
|
|
155
155
|
}
|
|
156
|
-
`),$=J.createProgram();if(J.attachShader($,Z),J.attachShader($,Q),J.linkProgram($),!J.getProgramParameter($,J.LINK_STATUS))throw Error(`WebGL2 program link failed: ${J.getProgramInfoLog($)}`);J.deleteShader(Z),J.deleteShader(Q),this._program=$,this._resolutionLoc=J.getUniformLocation($,"u_resolution"),this._texArraySizeLoc=J.getUniformLocation($,"u_texArraySize"),this._vao=J.createVertexArray(),J.bindVertexArray(this._vao),this._instanceBuffer=J.createBuffer(),J.bindBuffer(J.ARRAY_BUFFER,this._instanceBuffer),J.bufferData(J.ARRAY_BUFFER,8192,J.DYNAMIC_DRAW);let O=J.getAttribLocation($,"a_destRect");J.enableVertexAttribArray(O),J.vertexAttribPointer(O,4,J.FLOAT,!1,32,0),J.vertexAttribDivisor(O,1);let N=J.getAttribLocation($,"a_texInfo");J.enableVertexAttribArray(N),J.vertexAttribPointer(N,4,J.FLOAT,!1,32,16),J.vertexAttribDivisor(N,1),J.bindVertexArray(null),this._texArray=J.createTexture(),this._allocateTextureArray(256,256,32),J.enable(J.BLEND),J.blendEquation(J.FUNC_ADD),J.blendFunc(J.ONE,J.ONE_MINUS_SRC_ALPHA),this._initialized=!0}_nextPow2(J){return J--,J|=J>>1,J|=J>>2,J|=J>>4,J|=J>>8,J|=J>>16,J+1}_allocateTextureArray(J,Z,Q){let $=this._gl,O=this._nextPow2(Math.max(J,64)),N=this._nextPow2(Math.max(Z,64)),K=Math.min(this._nextPow2(Math.max(Q,16)),256);$.bindTexture($.TEXTURE_2D_ARRAY,this._texArray),$.texImage3D($.TEXTURE_2D_ARRAY,0,$.RGBA8,O,N,K,0,$.RGBA,$.UNSIGNED_BYTE,null),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_MIN_FILTER,$.NEAREST),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_MAG_FILTER,$.NEAREST),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_WRAP_S,$.CLAMP_TO_EDGE),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_WRAP_T,$.CLAMP_TO_EDGE),this._texWidth=O,this._texHeight=N,this._texLayers=K}_ensureTextureArray(J,Z,Q){let $=Math.min(Q,256);if(J<=this._texWidth&&Z<=this._texHeight&&$<=this._texLayers)return;let O=this._nextPow2(Math.max(this._texWidth,J)),N=this._nextPow2(Math.max(this._texHeight,Z)),K=Math.min(this._nextPow2(Math.max(this._texLayers,$,$+16)),256);this._allocateTextureArray(O,N,K)}async setCanvas(J,Z,Q){if(await this.init(),Z<=0||Q<=0)return;this._canvas=J,J.width=Z,J.height=Q,this._initGL(),this._gl.viewport(0,0,Z,Q),this._lastCanvasWidth=Z,this._lastCanvasHeight=Q}updateSize(J,Z){if(!this._gl||!this._canvas||J<=0||Z<=0)return;if(J===this._lastCanvasWidth&&Z===this._lastCanvasHeight)return;this._canvas.width=J,this._canvas.height=Z,this._gl.viewport(0,0,J,Z),this._lastCanvasWidth=J,this._lastCanvasHeight=Z}renderBitmaps(J,Z,Q){if(!this._gl||!this._initialized)return;let $=J.length;if($===0){this.clear();return}let O=0,N=0;for(let U=0;U<$;U++){let{image:E}=J[U];if(E.width>O)O=E.width;if(E.height>N)N=E.height}this._ensureTextureArray(O,N,Math.min($,256));let K=this._gl;K.clearColor(0,0,0,0),K.clear(K.COLOR_BUFFER_BIT),K.useProgram(this._program),K.uniform2f(this._resolutionLoc,this._lastCanvasWidth,this._lastCanvasHeight),K.uniform2i(this._texArraySizeLoc,this._texWidth,this._texHeight),K.activeTexture(K.TEXTURE0),K.bindTexture(K.TEXTURE_2D_ARRAY,this._texArray),K.pixelStorei(K.UNPACK_FLIP_Y_WEBGL,!1);let F=this._instanceData,G=0;while(G<$){let U=0;while(G<$&&U<256){let E=J[G++],T=E.image.width,q=E.image.height;if(T<=0||q<=0)continue;K.texSubImage3D(K.TEXTURE_2D_ARRAY,0,0,0,U,T,q,1,K.RGBA,K.UNSIGNED_BYTE,E.image);let Y=U<<3;F[Y]=E.x,F[Y+1]=E.y,F[Y+2]=T,F[Y+3]=q,F[Y+4]=T,F[Y+5]=q,F[Y+6]=U,F[Y+7]=0,U++}if(U===0)continue;K.bindBuffer(K.ARRAY_BUFFER,this._instanceBuffer),K.bufferSubData(K.ARRAY_BUFFER,0,F,0,U<<3),K.bindVertexArray(this._vao),K.drawArraysInstanced(K.TRIANGLES,0,6,U),K.bindVertexArray(null)}}render(J,Z,Q){if(!this._gl||!this._initialized)return;let $=J.length;if($===0){this.clear();return}let O=0,N=0;for(let U=0;U<$;U++){let{w:E,h:T}=J[U];if(E>O)O=E;if(T>N)N=T}this._ensureTextureArray(O,N,Math.min($,256));let K=this._gl;K.clearColor(0,0,0,0),K.clear(K.COLOR_BUFFER_BIT),K.useProgram(this._program),K.uniform2f(this._resolutionLoc,this._lastCanvasWidth,this._lastCanvasHeight),K.uniform2i(this._texArraySizeLoc,this._texWidth,this._texHeight),K.activeTexture(K.TEXTURE0),K.bindTexture(K.TEXTURE_2D_ARRAY,this._texArray),K.pixelStorei(K.UNPACK_FLIP_Y_WEBGL,!1);let F=this._instanceData,G=0;while(G<$){let U=0;while(G<$&&U<256){let E=J[G++],T=E.w,q=E.h;if(T<=0||q<=0)continue;let Y=E.image;if(Y instanceof ImageBitmap)K.texSubImage3D(K.TEXTURE_2D_ARRAY,0,0,0,U,T,q,1,K.RGBA,K.UNSIGNED_BYTE,Y);else if(Y instanceof ArrayBuffer||_J(Y)){let B=Y instanceof ArrayBuffer?new Uint8Array(Y):Y;K.texSubImage3D(K.TEXTURE_2D_ARRAY,0,0,0,U,T,q,1,K.RGBA,K.UNSIGNED_BYTE,B)}let L=U<<3;F[L]=E.x,F[L+1]=E.y,F[L+2]=T,F[L+3]=q,F[L+4]=T,F[L+5]=q,F[L+6]=U,F[L+7]=0,U++}if(U===0)continue;K.bindBuffer(K.ARRAY_BUFFER,this._instanceBuffer),K.bufferSubData(K.ARRAY_BUFFER,0,F,0,U<<3),K.bindVertexArray(this._vao),K.drawArraysInstanced(K.TRIANGLES,0,6,U),K.bindVertexArray(null)}}clear(){if(!this._gl)return;this._gl.clearColor(0,0,0,0),this._gl.clear(this._gl.COLOR_BUFFER_BIT)}get initialized(){return this._initialized}destroy(){let J=this._gl;if(J)J.deleteProgram(this._program),J.deleteVertexArray(this._vao),J.deleteBuffer(this._instanceBuffer),J.deleteTexture(this._texArray);this._gl=null,this._program=null,this._vao=null,this._instanceBuffer=null,this._texArray=null,this._canvas=null,this._initialized=!1,this._initPromise=null}}var ZJ=0.008,LJ=ZJ*1000,TJ=16,MJ=()=>{if(typeof navigator>"u")return!1;let J=navigator.userAgent||"",Z=navigator.vendor||"",Q=/\b(iPhone|iPad|iPod)\b/i.test(J);if(!/AppleWebKit/i.test(J))return!1;if(Q)return!0;if(/\b(Chrome|Chromium|Edg|OPR|SamsungBrowser|Firefox)\b/i.test(J))return!1;return Z.includes("Apple")};class R extends EventTarget{static MAX_PENDING_DEMANDS=3;static _hasAlphaBug=null;static _hasBitmapBug=null;_loaded;_init;_onDemandRender;_offscreenRender;_video;_videoWidth=0;_videoHeight=0;_videoColorSpace=null;_canvas;_canvasParent;_bufferCanvas;_bufferCtx;_canvasctrl;_ctx=null;_lastRenderTime=0;_playstate=!0;_destroyed=!1;_workerReady=!1;_ro;_worker;_pendingDemandTimes=[];_isLikelyWebKit;_activeDemandStartedAt=0;_smoothedDemandLatencyMs;_boundResize;_boundTimeUpdate;_boundSetRate;_boundUpdateColorSpace;_boundHandleRVFC;_gpuRenderer=null;_rendererType="canvas2d";_onCanvasFallback;_lastRenderWidth=0;_lastRenderHeight=0;_gpuBitmapImages=[];timeOffset;debug;prescaleFactor;prescaleHeightLimit;maxRenderHeight;busy=!1;renderAhead;constructor(J){super();if(!globalThis.Worker)throw this.destroy(Error("Worker not supported"));if(!J)throw this.destroy(Error("No options provided"));this._loaded=new Promise((N)=>{this._init=N}),this._isLikelyWebKit=MJ(),this._smoothedDemandLatencyMs=this._isLikelyWebKit?TJ:LJ;let Z=R._test();this._onDemandRender="requestVideoFrameCallback"in HTMLVideoElement.prototype&&(J.onDemandRender??!0),this._onCanvasFallback=J.onCanvasFallback;let Q=!this._isLikelyWebKit&&!J.canvas&&(f()||p()),$=typeof createImageBitmap<"u"&&(J.asyncRender??!this._isLikelyWebKit);if(this._offscreenRender="transferControlToOffscreen"in HTMLCanvasElement.prototype&&!J.canvas&&!Q&&(J.offscreenRender??!0),this.timeOffset=J.timeOffset||0,this._video=J.video,this._canvas=J.canvas,this._video&&!this._canvas)this._canvasParent=document.createElement("div"),this._canvasParent.className="AkariSub",this._canvasParent.style.position="relative",this._canvas=this._createCanvas(),this._video.insertAdjacentElement("afterend",this._canvasParent);else if(!this._canvas)throw this.destroy(Error("Don't know where to render: you should give video or canvas in options."));this._bufferCanvas=document.createElement("canvas");let O=this._bufferCanvas.getContext("2d");if(!O)throw this.destroy(Error("Canvas rendering not supported"));if(this._bufferCtx=O,Q)this._initGPURenderer();else if(!this._offscreenRender)this._ctx=this._canvas.getContext("2d",{alpha:!0,desynchronized:!0});if(this._canvasctrl=this._offscreenRender?this._canvas.transferControlToOffscreen():this._canvas,this._lastRenderTime=0,this.debug=!!J.debug,this.prescaleFactor=J.prescaleFactor||1,this.prescaleHeightLimit=J.prescaleHeightLimit||1080,this.maxRenderHeight=J.maxRenderHeight||0,this.renderAhead=J.renderAhead??ZJ,this._boundResize=this.resize.bind(this),this._boundTimeUpdate=this._timeupdate.bind(this),this._boundSetRate=()=>this.setRate(this._video.playbackRate),this._boundUpdateColorSpace=this._updateColorSpace.bind(this),this._boundHandleRVFC=this._handleRVFC.bind(this),this._video)this.setVideo(this._video);if(this._onDemandRender)this.busy=!1,this._pendingDemandTimes.length=0;this._worker=new Worker(J.workerUrl||"akarisub-worker.js"),this._worker.onmessage=(N)=>this._onmessage(N),this._worker.onerror=(N)=>this._error(N),Z.then(()=>{let N={target:"init",wasmUrl:J.wasmUrl??"akarisub-worker.wasm",asyncRender:$,fullTrackWarmup:J.fullTrackWarmup??!1,onDemandRender:this._onDemandRender,initialTime:(this._video?.currentTime??0)+this.timeOffset,width:this._canvasctrl.width||0,height:this._canvasctrl.height||0,blendMode:J.blendMode??"wasm",subUrl:J.subUrl,subContent:J.subContent||null,encryptedSubContent:J.encryptedSubContent||null,fonts:J.fonts||[],availableFonts:J.availableFonts||{"liberation sans":"./default.woff2"},fallbackFonts:J.fallbackFonts||["liberation sans"],debug:this.debug,targetFps:J.targetFps||24,dropAllAnimations:J.dropAllAnimations,dropAllBlur:J.dropAllBlur,clampPos:J.clampPos,libassMemoryLimit:J.libassMemoryLimit??128,libassGlyphLimit:J.libassGlyphLimit??2048,useLocalFonts:typeof globalThis.queryLocalFonts<"u"&&(J.useLocalFonts??!0),hasBitmapBug:R._hasBitmapBug};if(this._worker.postMessage(N,R._getSubtitleTransfers(J.subContent,J.encryptedSubContent)),this._offscreenRender)this.sendMessage("offscreenCanvas",{},[this._canvasctrl])})}static async _testImageBugs(){if(R._hasBitmapBug!==null)return;let J=document.createElement("canvas"),Z=J.getContext("2d",{willReadFrequently:!0});if(!Z)throw Error("Canvas rendering not supported");if(typeof ImageData.prototype.constructor==="function")try{new ImageData(new Uint8ClampedArray([0,0,0,0]),1,1)}catch{console.log("Detected that ImageData is not constructable despite browser saying so")}let Q=document.createElement("canvas"),$=Q.getContext("2d",{willReadFrequently:!0});if(!$)throw Error("Canvas rendering not supported");J.width=Q.width=1,J.height=Q.height=1,Z.clearRect(0,0,1,1),$.clearRect(0,0,1,1);let O=$.getImageData(0,0,1,1).data;Z.putImageData(new ImageData(new Uint8ClampedArray([0,255,0,0]),1,1),0,0),$.drawImage(J,0,0);let N=$.getImageData(0,0,1,1).data;if(R._hasAlphaBug=O[1]!==N[1],R._hasAlphaBug)console.log("Detected a browser having issue with transparent pixels, applying workaround");if(typeof createImageBitmap<"u"){let K=new Uint8ClampedArray([255,0,255,0,255]).subarray(1,5);$.drawImage(await createImageBitmap(new ImageData(K,1)),0,0);let{data:F}=$.getImageData(0,0,1,1);R._hasBitmapBug=!1;for(let G=0;G<F.length;G++)if(Math.abs(K[G]-F[G])>15){R._hasBitmapBug=!0,console.log("Detected a browser having issue with partial bitmaps, applying workaround");break}}else R._hasBitmapBug=!1;J.remove(),Q.remove()}static async _test(){await R._testImageBugs()}static _getSubtitleTransfers(J,Z){let Q=[];if(J instanceof ArrayBuffer)Q.push(J);else if(J instanceof Uint8Array)Q.push(J.buffer);if(Z?.encrypted)Q.push(Z.encrypted);for(let $ of Z?.encryptedChunks||[])Q.push($);return Q}async _initGPURenderer(){if(f())try{let J=new v;if(await J.init(),!this._canvas)return;await J.setCanvas(this._canvas,Math.max(1,this._canvas.width||1),Math.max(1,this._canvas.height||1)),this._gpuRenderer=J,this._rendererType="webgpu",console.log("[AkariSub] Using WebGPU renderer");return}catch(J){console.warn("[AkariSub] WebGPU init failed, trying WebGL2:",J)}if(p())try{let J=new x;if(await J.init(),!this._canvas)return;await J.setCanvas(this._canvas,Math.max(1,this._canvas.width||1),Math.max(1,this._canvas.height||1)),this._gpuRenderer=J,this._rendererType="webgl2",console.log("[AkariSub] Using WebGL2 renderer");return}catch(J){console.warn("[AkariSub] WebGL2 init failed, falling back to Canvas2D:",J)}if(this._rendererType="canvas2d",!this._offscreenRender&&!this._ctx)this._ctx=this._canvas.getContext("2d",{alpha:!0,desynchronized:!0});this.sendMessage("setAsyncRender",{value:!1}),this._onCanvasFallback?.()}get rendererType(){return this._rendererType}get isUsingWebGPU(){return this._rendererType==="webgpu"}get isUsingGPURenderer(){return this._gpuRenderer!==null}_createCanvas(){return this._canvas=document.createElement("canvas"),this._canvas.style.display="block",this._canvas.style.position="absolute",this._canvas.style.pointerEvents="none",this._canvasParent.appendChild(this._canvas),this._canvas}resize(J=0,Z=0,Q=0,$=0,O=this._video?.paused??!1){if((!J||!Z)&&this._video){let N=c(this._video),K;if(this._videoWidth){let F=this._video.videoWidth/this._videoWidth,G=this._video.videoHeight/this._videoHeight;K=w((N.width||0)/F,(N.height||0)/G,this.prescaleFactor,this.prescaleHeightLimit,this.maxRenderHeight)}else K=w(N.width||0,N.height||0,this.prescaleFactor,this.prescaleHeightLimit,this.maxRenderHeight);if(J=K.width,Z=K.height,this._canvasParent)Q=N.y-(this._canvasParent.getBoundingClientRect().top-this._video.getBoundingClientRect().top),$=N.x;this._canvas.style.width=N.width+"px",this._canvas.style.height=N.height+"px"}if(this._canvas.style.top=Q+"px",this._canvas.style.left=$+"px",J>0&&Z>0)this._canvasctrl.width=J,this._canvasctrl.height=Z;if(this._gpuRenderer&&J>0&&Z>0)this._gpuRenderer.updateSize(J,Z);if(O&&this.busy===!1)this.busy=!0;else O=!1;this.sendMessage("canvas",{width:J,height:Z,videoWidth:this._videoWidth||this._video?.videoWidth||0,videoHeight:this._videoHeight||this._video?.videoHeight||0,force:O})}_timeupdate(J){let Q={seeking:!0,waiting:!0,playing:!1}[J.type];if(Q!=null)this._playstate=Q;this.setCurrentTime(this._video.paused||this._playstate,this._video.currentTime+this.timeOffset)}setVideo(J){if(J instanceof HTMLVideoElement){if(this._removeListeners(),this._video=J,this._onDemandRender){if(!this._destroyed&&this._video===J)J.requestVideoFrameCallback(this._boundHandleRVFC)}else this._playstate=J.paused,J.addEventListener("timeupdate",this._boundTimeUpdate,!1),J.addEventListener("progress",this._boundTimeUpdate,!1),J.addEventListener("waiting",this._boundTimeUpdate,!1),J.addEventListener("seeking",this._boundTimeUpdate,!1),J.addEventListener("playing",this._boundTimeUpdate,!1),J.addEventListener("ratechange",this._boundSetRate,!1),J.addEventListener("resize",this._boundResize,!1);if("VideoFrame"in window){if(J.addEventListener("loadedmetadata",this._boundUpdateColorSpace,!1),J.readyState>2)this._updateColorSpace()}if(J.videoWidth>0)this.resize();if(typeof ResizeObserver<"u"){if(!this._ro)this._ro=new ResizeObserver(()=>this.resize());this._ro.observe(J)}}else this._error(Error("Video element invalid!"))}runBenchmark(){this.sendMessage("runBenchmark")}setTrackByUrl(J){if(this.sendMessage("setTrackByUrl",{url:J}),this._reAttachOffscreen(),this._ctx)this._ctx.filter="none"}setTrack(J){if(this.sendMessage("setTrack",{content:J},R._getSubtitleTransfers(J)),this._reAttachOffscreen(),this._ctx)this._ctx.filter="none"}setEncryptedTrack(J){if(this.sendMessage("setEncryptedTrack",{content:J},R._getSubtitleTransfers(void 0,J)),this._reAttachOffscreen(),this._ctx)this._ctx.filter="none"}freeTrack(){this.sendMessage("freeTrack")}setIsPaused(J){this.sendMessage("video",{isPaused:J})}setRate(J){this.sendMessage("video",{rate:J})}setCurrentTime(J,Z,Q){this.sendMessage("video",{isPaused:J,currentTime:Z,rate:Q,colorSpace:this._videoColorSpace})}createEvent(J){this.sendMessage("createEvent",{event:J})}setEvent(J,Z){this.sendMessage("setEvent",{event:J,index:Z})}removeEvent(J){this.sendMessage("removeEvent",{index:J})}async getEvents(){return(await this._fetchFromWorker({target:"getEvents"})).events??[]}styleOverride(J){this.sendMessage("styleOverride",{style:J})}disableStyleOverride(){this.sendMessage("disableStyleOverride")}createStyle(J){this.sendMessage("createStyle",{style:J})}setStyle(J,Z){this.sendMessage("setStyle",{style:J,index:Z})}removeStyle(J){this.sendMessage("removeStyle",{index:J})}async getStyles(){return(await this._fetchFromWorker({target:"getStyles"})).styles??[]}addFont(J){this.sendMessage("addFont",{font:J})}setDefaultFont(J){this.sendMessage("defaultFont",{font:J})}async getStats(){let Z=(await this._fetchFromWorker({target:"getStats"})).stats;return{framesRendered:Z.framesRendered??0,framesDropped:Z.framesDropped??0,avgRenderTime:Z.avgRenderTime??0,maxRenderTime:Z.maxRenderTime??0,minRenderTime:Z.minRenderTime??0,lastRenderTime:Z.lastRenderTime??0,pendingRenders:Z.pendingRenders??0,totalEvents:Z.totalEvents??0,cacheHits:Z.cacheHits??0,cacheMisses:Z.cacheMisses??0,renderFps:Z.avgRenderTime&&Z.avgRenderTime>0?Math.round(1000/Z.avgRenderTime):0,usingWorker:!0,offscreenRender:this._offscreenRender,onDemandRender:this._onDemandRender}}async resetStats(){await this._fetchFromWorker({target:"resetStats"})}async getEventCount(){return(await this._fetchFromWorker({target:"getEventCount"})).count}async getStyleCount(){return(await this._fetchFromWorker({target:"getStyleCount"})).count}_sendLocalFont(J){try{globalThis.queryLocalFonts().then((Z)=>{let Q=Z?.find(($)=>$.fullName.toLowerCase()===J);if(Q)Q.blob().then(($)=>{$.arrayBuffer().then((O)=>{this.addFont(new Uint8Array(O))})})})}catch(Z){console.warn("Local fonts API:",Z)}}_getLocalFont(J){try{if(navigator?.permissions?.query)navigator.permissions.query({name:"local-fonts"}).then((Z)=>{if(Z.state==="granted")this._sendLocalFont(J.font)});else this._sendLocalFont(J.font)}catch(Z){console.warn("Local fonts API:",Z)}}_unbusy(){if(this._observeDemandCompletion(),this._pendingDemandTimes.length>0){if(this._pendingDemandTimes.length>1){let Z=this._pendingDemandTimes[this._pendingDemandTimes.length-1];this._pendingDemandTimes.length=0,this._pendingDemandTimes.push(Z)}let J=this._pendingDemandTimes.shift();if(J){this._demandRender(J);return}}this.busy=!1}_markDemandDispatched(){if(!this._onDemandRender)return;this._activeDemandStartedAt=performance.now()}_observeDemandCompletion(){if(!this._onDemandRender||this._activeDemandStartedAt===0)return;let J=performance.now()-this._activeDemandStartedAt;if(this._activeDemandStartedAt=0,!Number.isFinite(J)||J<=0)return;this._smoothedDemandLatencyMs=this._smoothedDemandLatencyMs<=0?J:this._smoothedDemandLatencyMs*0.75+J*0.25}_getDemandPipelineLeadSeconds(J,Z){let Q=Z.expectedDisplayTime??Z.presentationTime??J,$=Math.max(0,Q-J)/1000;return Math.max(0,this._smoothedDemandLatencyMs/1000-$)}_enqueueDemand(J){let Z=this._pendingDemandTimes;if(Z.length>0){let Q=Z[Z.length-1];if(Math.abs(Q.mediaTime-J.mediaTime)>0.25)Z.length=0}if(Z.length>=R.MAX_PENDING_DEMANDS)Z.shift();Z.push(J)}_handleRVFC(J,Z){if(this._destroyed)return;let Q=this._video?.playbackRate??1,$=this._getDemandPipelineLeadSeconds(J,Z),N={mediaTime:Z.mediaTime+($+this.renderAhead)*Q,width:Z.width,height:Z.height};if(!this._workerReady){this._enqueueDemand(N),this._video.requestVideoFrameCallback(this._boundHandleRVFC);return}if(this.busy)this._enqueueDemand(N);else this.busy=!0,this._demandRender(N);this._video.requestVideoFrameCallback(this._boundHandleRVFC)}_demandRender(J){if(J.width!==this._videoWidth||J.height!==this._videoHeight)this._videoWidth=J.width,this._videoHeight=J.height,this.resize();this._markDemandDispatched(),this.sendMessage("demand",{time:J.mediaTime+this.timeOffset})}_detachOffscreen(){if(!this._offscreenRender||this._ctx)return;this._canvas.remove(),this._createCanvas(),this._canvasctrl=this._canvas,this._ctx=this._canvasctrl.getContext("2d",{alpha:!0,desynchronized:!0}),this.sendMessage("detachOffscreen"),this.busy=!1,this._activeDemandStartedAt=0,this._pendingDemandTimes.length=0,this.resize(0,0,0,0,!0)}_reAttachOffscreen(){if(!this._offscreenRender||!this._ctx)return;this._canvas.remove(),this._createCanvas(),this._canvasctrl=this._canvas.transferControlToOffscreen(),this._ctx=!1,this.sendMessage("offscreenCanvas",{},[this._canvasctrl]),this.resize(0,0,0,0,!0)}_updateColorSpace(){this._video.requestVideoFrameCallback(()=>{try{let J=new globalThis.VideoFrame(this._video);this._videoColorSpace=u[J.colorSpace.matrix]??null,J.close(),this.sendMessage("getColorSpace")}catch(J){console.warn(J)}})}_verifyColorSpace(J){let{subtitleColorSpace:Z,videoColorSpace:Q=this._videoColorSpace}=J;if(!Z||!Q)return;if(Z===Q)return;this._detachOffscreen();let $=y[Z]?.[Q];if($&&this._ctx)this._ctx.filter=`url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='f'><feColorMatrix type='matrix' values='${$} 0 0 0 0 0 1 0'/></filter></svg>#f")`}_render(J){try{let{width:Z,height:Q}=J;if(this.debug)J.times.IPCTime=Date.now()-(J.times.JSRenderTime||0);if(this._canvasctrl.width!==Z||this._canvasctrl.height!==Q){if(this._canvasctrl.width=Z,this._canvasctrl.height=Q,this._lastRenderWidth=Z,this._lastRenderHeight=Q,this._gpuRenderer)this._gpuRenderer.updateSize(Z,Q);this._verifyColorSpace({subtitleColorSpace:J.colorSpace})}if(this._gpuRenderer){this._renderGPU(J);return}if(!this._ctx)return;let O=this._ctx,N=J.images,K=N.length;if(O.clearRect(0,0,Z,Q),J.asyncRender)for(let F=0;F<K;F++){let G=N[F];if(G.image)O.drawImage(G.image,G.x,G.y),G.image.close()}else{let F=R._hasAlphaBug??!1;for(let G=0;G<K;G++){let U=N[G];if(U.image){let{w:E,h:T,image:q}=U,Y=q instanceof Uint8ClampedArray?q:q instanceof Uint8Array?new Uint8ClampedArray(q.buffer,q.byteOffset,q.byteLength):new Uint8ClampedArray(q),L=m(Y,F);O.putImageData(new ImageData(L,E,T),U.x,U.y)}}}if(this.debug){J.times.JSRenderTime=Date.now()-(J.times.JSRenderTime||0)-(J.times.IPCTime||0);let F=0,G=J.times.bitmaps||K;delete J.times.bitmaps;for(let U in J.times)F+=J.times[U]||0;console.log("Bitmaps: "+G+" Total: "+(F|0)+"ms",J.times)}}finally{this._unbusy()}}_renderGPU(J){let Z=this._gpuRenderer;if(!Z)return;if(J.images.length===0){Z.clear();return}if(J.asyncRender){let Q=this._gpuBitmapImages,$=0;for(let O=0;O<J.images.length;O++){let N=J.images[O];if(!(N.image instanceof ImageBitmap))continue;let K=Q[$]||(Q[$]={image:N.image,x:0,y:0});K.image=N.image,K.x=N.x,K.y=N.y,$++}Q.length=$,Z.renderBitmaps(Q,this._canvasctrl.width,this._canvasctrl.height);for(let O of J.images)if(O.image instanceof ImageBitmap)O.image.close()}else Z.render(J.images,this._canvasctrl.width,this._canvasctrl.height);if(this.debug){J.times.JSRenderTime=Date.now()-(J.times.JSRenderTime||0)-(J.times.IPCTime||0);let Q=0,$=J.times.bitmaps||J.images.length;delete J.times.bitmaps;for(let O in J.times)Q+=J.times[O]||0;console.log(`[${this._rendererType.toUpperCase()}] Bitmaps: `+$+" Total: "+(Q|0)+"ms",J.times)}}_ready(){if(this._workerReady=!0,this._init(),this._onDemandRender&&this._video){this.setCurrentTime(this._video.paused,this._video.currentTime+this.timeOffset,this._video.playbackRate);let J=this._pendingDemandTimes.length>0?this._pendingDemandTimes[this._pendingDemandTimes.length-1]:{mediaTime:this._video.currentTime+this.renderAhead*(this._video.playbackRate||1),width:this._video.videoWidth,height:this._video.videoHeight};this._pendingDemandTimes.length=0,this.busy=!0,this._demandRender(J)}this.dispatchEvent(new CustomEvent("ready"))}_partial_ready(){this.dispatchEvent(new CustomEvent("partial_ready"))}_trackReady(){this.dispatchEvent(new CustomEvent("trackReady"))}async sendMessage(J,Z={},Q){if(await this._loaded,Q)this._worker.postMessage({target:J,transferable:Q,...Z},[...Q]);else this._worker.postMessage({target:J,...Z})}_fetchFromWorker(J){return new Promise((Z,Q)=>{try{let $=J.target,O=setTimeout(()=>{F(),Q(Error("Error: Timeout while trying to fetch "+$))},5000),N=(G)=>{if(G.data.target===$)F(),Z(G.data)},K=(G)=>{F(),Q(G instanceof Error?G:G.error||Error("Worker error"))},F=()=>{this._worker.removeEventListener("message",N),this._worker.removeEventListener("error",K),clearTimeout(O)};this._worker.addEventListener("message",N),this._worker.addEventListener("error",K),this._worker.postMessage(J)}catch($){Q($)}})}_console(J){console[J.command].apply(console,JSON.parse(J.content))}_onmessage(J){let Z=J.data.target;if(Z==="error"){this._error(J.data.error||"Unknown worker error");return}let Q=this["_"+Z];if(Q)Q.call(this,J.data)}_error(J){let Z=J instanceof Error?J:J instanceof ErrorEvent?J.error||Error(J.message):Error(String(J)),Q=J instanceof Event?new ErrorEvent(J.type,J):new ErrorEvent("error",{error:Z});return this.dispatchEvent(Q),console.error(Z),Z}_removeListeners(){if(this._video){if(this._ro)this._ro.unobserve(this._video);if(this._ctx)this._ctx.filter="none";this._video.removeEventListener("timeupdate",this._boundTimeUpdate),this._video.removeEventListener("progress",this._boundTimeUpdate),this._video.removeEventListener("waiting",this._boundTimeUpdate),this._video.removeEventListener("seeking",this._boundTimeUpdate),this._video.removeEventListener("playing",this._boundTimeUpdate),this._video.removeEventListener("ratechange",this._boundSetRate),this._video.removeEventListener("resize",this._boundResize),this._video.removeEventListener("loadedmetadata",this._boundUpdateColorSpace)}}destroy(J){let Z=J?this._error(J):void 0;if(this._video&&this._canvasParent)this._video.parentNode?.removeChild(this._canvasParent);if(this._gpuRenderer)this._gpuRenderer.destroy(),this._gpuRenderer=null,this._rendererType="canvas2d";return this._destroyed=!0,this._removeListeners(),this.sendMessage("destroy"),this._worker?.terminate(),Z}}})();
|
|
156
|
+
`),$=J.createProgram();if(J.attachShader($,Z),J.attachShader($,Q),J.linkProgram($),!J.getProgramParameter($,J.LINK_STATUS))throw Error(`WebGL2 program link failed: ${J.getProgramInfoLog($)}`);J.deleteShader(Z),J.deleteShader(Q),this._program=$,this._resolutionLoc=J.getUniformLocation($,"u_resolution"),this._texArraySizeLoc=J.getUniformLocation($,"u_texArraySize"),this._vao=J.createVertexArray(),J.bindVertexArray(this._vao),this._instanceBuffer=J.createBuffer(),J.bindBuffer(J.ARRAY_BUFFER,this._instanceBuffer),J.bufferData(J.ARRAY_BUFFER,8192,J.DYNAMIC_DRAW);let N=J.getAttribLocation($,"a_destRect");J.enableVertexAttribArray(N),J.vertexAttribPointer(N,4,J.FLOAT,!1,32,0),J.vertexAttribDivisor(N,1);let O=J.getAttribLocation($,"a_texInfo");J.enableVertexAttribArray(O),J.vertexAttribPointer(O,4,J.FLOAT,!1,32,16),J.vertexAttribDivisor(O,1),J.bindVertexArray(null),this._allocateTextureArray(256,256,32),J.enable(J.BLEND),J.blendEquation(J.FUNC_ADD),J.blendFunc(J.ONE,J.ONE_MINUS_SRC_ALPHA),this._initialized=!0}_roundDim(J){return Math.max(J,64)+63&-64}_roundLayers(J){return Math.min(Math.max(J,8)+7&-8,256)}_allocateTextureArray(J,Z,Q){let $=this._gl,N=this._roundDim(J),O=this._roundDim(Z),K=this._roundLayers(Q);if(this._texArray)$.deleteTexture(this._texArray);this._texArray=$.createTexture(),$.bindTexture($.TEXTURE_2D_ARRAY,this._texArray),$.texStorage3D($.TEXTURE_2D_ARRAY,1,$.RGBA8,N,O,K),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_MIN_FILTER,$.NEAREST),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_MAG_FILTER,$.NEAREST),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_WRAP_S,$.CLAMP_TO_EDGE),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_WRAP_T,$.CLAMP_TO_EDGE),this._texWidth=N,this._texHeight=O,this._texLayers=K}_ensureTextureArray(J,Z,Q){let $=Math.min(Q,256);if(J<=this._texWidth&&Z<=this._texHeight&&$<=this._texLayers)return;let N=Math.max(this._texWidth,J),O=Math.max(this._texHeight,Z),K=Math.max($,Math.min(this._texLayers,16));this._allocateTextureArray(N,O,K)}async setCanvas(J,Z,Q){if(await this.init(),Z<=0||Q<=0)return;this._canvas=J,J.width=Z,J.height=Q,this._initGL(),this._gl.viewport(0,0,Z,Q),this._lastCanvasWidth=Z,this._lastCanvasHeight=Q}updateSize(J,Z){if(!this._gl||!this._canvas||J<=0||Z<=0)return;if(J===this._lastCanvasWidth&&Z===this._lastCanvasHeight)return;this._canvas.width=J,this._canvas.height=Z,this._gl.viewport(0,0,J,Z),this._lastCanvasWidth=J,this._lastCanvasHeight=Z}renderBitmaps(J,Z,Q){if(!this._gl||!this._initialized)return;let $=J.length;if($===0){this.clear();return}let N=0,O=0;for(let X=0;X<$;X++){let{image:E}=J[X];if(E.width>N)N=E.width;if(E.height>O)O=E.height}this._ensureTextureArray(N,O,Math.min($,256));let K=this._gl;K.clearColor(0,0,0,0),K.clear(K.COLOR_BUFFER_BIT),K.useProgram(this._program),K.uniform2f(this._resolutionLoc,this._lastCanvasWidth,this._lastCanvasHeight),K.uniform2i(this._texArraySizeLoc,this._texWidth,this._texHeight),K.activeTexture(K.TEXTURE0),K.bindTexture(K.TEXTURE_2D_ARRAY,this._texArray),K.pixelStorei(K.UNPACK_FLIP_Y_WEBGL,!1);let G=this._instanceData,F=0;while(F<$){let X=0;while(F<$&&X<256){let E=J[F++],M=E.image.width,Y=E.image.height;if(M<=0||Y<=0)continue;K.texSubImage3D(K.TEXTURE_2D_ARRAY,0,0,0,X,M,Y,1,K.RGBA,K.UNSIGNED_BYTE,E.image);let U=X<<3;G[U]=E.x,G[U+1]=E.y,G[U+2]=M,G[U+3]=Y,G[U+4]=M,G[U+5]=Y,G[U+6]=X,G[U+7]=0,X++}if(X===0)continue;K.bindBuffer(K.ARRAY_BUFFER,this._instanceBuffer),K.bufferSubData(K.ARRAY_BUFFER,0,G,0,X<<3),K.bindVertexArray(this._vao),K.drawArraysInstanced(K.TRIANGLES,0,6,X),K.bindVertexArray(null)}}render(J,Z,Q){if(!this._gl||!this._initialized)return;let $=J.length;if($===0){this.clear();return}let N=0,O=0;for(let X=0;X<$;X++){let{w:E,h:M}=J[X];if(E>N)N=E;if(M>O)O=M}this._ensureTextureArray(N,O,Math.min($,256));let K=this._gl;K.clearColor(0,0,0,0),K.clear(K.COLOR_BUFFER_BIT),K.useProgram(this._program),K.uniform2f(this._resolutionLoc,this._lastCanvasWidth,this._lastCanvasHeight),K.uniform2i(this._texArraySizeLoc,this._texWidth,this._texHeight),K.activeTexture(K.TEXTURE0),K.bindTexture(K.TEXTURE_2D_ARRAY,this._texArray),K.pixelStorei(K.UNPACK_FLIP_Y_WEBGL,!1);let G=this._instanceData,F=0;while(F<$){let X=0;while(F<$&&X<256){let E=J[F++],M=E.w,Y=E.h;if(M<=0||Y<=0)continue;let U=E.image;if(U instanceof ImageBitmap)K.texSubImage3D(K.TEXTURE_2D_ARRAY,0,0,0,X,M,Y,1,K.RGBA,K.UNSIGNED_BYTE,U);else if(U instanceof ArrayBuffer||_J(U)){let j=U instanceof ArrayBuffer?new Uint8Array(U):U;K.texSubImage3D(K.TEXTURE_2D_ARRAY,0,0,0,X,M,Y,1,K.RGBA,K.UNSIGNED_BYTE,j)}let L=X<<3;G[L]=E.x,G[L+1]=E.y,G[L+2]=M,G[L+3]=Y,G[L+4]=M,G[L+5]=Y,G[L+6]=X,G[L+7]=0,X++}if(X===0)continue;K.bindBuffer(K.ARRAY_BUFFER,this._instanceBuffer),K.bufferSubData(K.ARRAY_BUFFER,0,G,0,X<<3),K.bindVertexArray(this._vao),K.drawArraysInstanced(K.TRIANGLES,0,6,X),K.bindVertexArray(null)}}clear(){if(!this._gl)return;this._gl.clearColor(0,0,0,0),this._gl.clear(this._gl.COLOR_BUFFER_BIT)}get initialized(){return this._initialized}destroy(){let J=this._gl;if(J)J.deleteProgram(this._program),J.deleteVertexArray(this._vao),J.deleteBuffer(this._instanceBuffer),J.deleteTexture(this._texArray);this._gl=null,this._program=null,this._vao=null,this._instanceBuffer=null,this._texArray=null,this._canvas=null,this._initialized=!1,this._initPromise=null}}var ZJ=0.008,LJ=ZJ*1000,TJ=16,MJ=()=>{if(typeof navigator>"u")return!1;let J=navigator.userAgent||"",Z=navigator.vendor||"",Q=/\b(iPhone|iPad|iPod)\b/i.test(J);if(!/AppleWebKit/i.test(J))return!1;if(Q)return!0;if(/\b(Chrome|Chromium|Edg|OPR|SamsungBrowser|Firefox)\b/i.test(J))return!1;return Z.includes("Apple")};class z extends EventTarget{static MAX_PENDING_DEMANDS=3;static _hasAlphaBug=null;static _hasBitmapBug=null;_loaded;_init;_onDemandRender;_offscreenRender;_video;_videoWidth=0;_videoHeight=0;_videoColorSpace=null;_canvas;_canvasParent;_bufferCanvas;_bufferCtx;_canvasctrl;_ctx=null;_lastRenderTime=0;_playstate=!0;_destroyed=!1;_workerReady=!1;_ro;_worker;_pendingDemandTimes=[];_isLikelyWebKit;_activeDemandStartedAt=0;_smoothedDemandLatencyMs;_boundResize;_boundTimeUpdate;_boundSetRate;_boundUpdateColorSpace;_boundHandleRVFC;_gpuRenderer=null;_rendererType="canvas2d";_onCanvasFallback;_lastRenderWidth=0;_lastRenderHeight=0;_gpuBitmapImages=[];timeOffset;debug;prescaleFactor;prescaleHeightLimit;maxRenderHeight;busy=!1;renderAhead;constructor(J){super();if(!globalThis.Worker)throw this.destroy(Error("Worker not supported"));if(!J)throw this.destroy(Error("No options provided"));this._loaded=new Promise((O)=>{this._init=O}),this._isLikelyWebKit=MJ(),this._smoothedDemandLatencyMs=this._isLikelyWebKit?TJ:LJ;let Z=z._test();this._onDemandRender="requestVideoFrameCallback"in HTMLVideoElement.prototype&&(J.onDemandRender??!0),this._onCanvasFallback=J.onCanvasFallback;let Q=!this._isLikelyWebKit&&!J.canvas&&(f()||p()),$=typeof createImageBitmap<"u"&&(J.asyncRender??(!this._isLikelyWebKit&&!Q));if(this._offscreenRender="transferControlToOffscreen"in HTMLCanvasElement.prototype&&!J.canvas&&!Q&&(J.offscreenRender??!0),this.timeOffset=J.timeOffset||0,this._video=J.video,this._canvas=J.canvas,this._video&&!this._canvas)this._canvasParent=document.createElement("div"),this._canvasParent.className="AkariSub",this._canvasParent.style.position="relative",this._canvas=this._createCanvas(),this._video.insertAdjacentElement("afterend",this._canvasParent);else if(!this._canvas)throw this.destroy(Error("Don't know where to render: you should give video or canvas in options."));this._bufferCanvas=document.createElement("canvas");let N=this._bufferCanvas.getContext("2d");if(!N)throw this.destroy(Error("Canvas rendering not supported"));if(this._bufferCtx=N,Q)this._initGPURenderer();else if(!this._offscreenRender)this._ctx=this._canvas.getContext("2d",{alpha:!0,desynchronized:!0});if(this._canvasctrl=this._offscreenRender?this._canvas.transferControlToOffscreen():this._canvas,this._lastRenderTime=0,this.debug=!!J.debug,this.prescaleFactor=J.prescaleFactor||1,this.prescaleHeightLimit=J.prescaleHeightLimit||1080,this.maxRenderHeight=J.maxRenderHeight||0,this.renderAhead=J.renderAhead??ZJ,this._boundResize=this.resize.bind(this),this._boundTimeUpdate=this._timeupdate.bind(this),this._boundSetRate=()=>this.setRate(this._video.playbackRate),this._boundUpdateColorSpace=this._updateColorSpace.bind(this),this._boundHandleRVFC=this._handleRVFC.bind(this),this._video)this.setVideo(this._video);if(this._onDemandRender)this.busy=!1,this._pendingDemandTimes.length=0;this._worker=new Worker(J.workerUrl||"akarisub-worker.js"),this._worker.onmessage=(O)=>this._onmessage(O),this._worker.onerror=(O)=>this._error(O),Z.then(()=>{let O={target:"init",wasmUrl:J.wasmUrl??"akarisub-worker.wasm",asyncRender:$,fullTrackWarmup:J.fullTrackWarmup??!1,onDemandRender:this._onDemandRender,initialTime:(this._video?.currentTime??0)+this.timeOffset,width:this._canvasctrl.width||0,height:this._canvasctrl.height||0,blendMode:J.blendMode??"wasm",subUrl:J.subUrl,subContent:J.subContent||null,encryptedSubContent:J.encryptedSubContent||null,fonts:J.fonts||[],availableFonts:J.availableFonts||{"liberation sans":"./default.woff2"},fallbackFonts:J.fallbackFonts||["liberation sans"],debug:this.debug,targetFps:J.targetFps||24,dropAllAnimations:J.dropAllAnimations,dropAllBlur:J.dropAllBlur,clampPos:J.clampPos,libassMemoryLimit:J.libassMemoryLimit??128,libassGlyphLimit:J.libassGlyphLimit??2048,useLocalFonts:typeof globalThis.queryLocalFonts<"u"&&(J.useLocalFonts??!0),hasBitmapBug:z._hasBitmapBug};if(this._worker.postMessage(O,z._getSubtitleTransfers(J.subContent,J.encryptedSubContent)),this._offscreenRender)this.sendMessage("offscreenCanvas",{},[this._canvasctrl])})}static async _testImageBugs(){if(z._hasBitmapBug!==null)return;let J=document.createElement("canvas"),Z=J.getContext("2d",{willReadFrequently:!0});if(!Z)throw Error("Canvas rendering not supported");if(typeof ImageData.prototype.constructor==="function")try{new ImageData(new Uint8ClampedArray([0,0,0,0]),1,1)}catch{console.log("Detected that ImageData is not constructable despite browser saying so")}let Q=document.createElement("canvas"),$=Q.getContext("2d",{willReadFrequently:!0});if(!$)throw Error("Canvas rendering not supported");J.width=Q.width=1,J.height=Q.height=1,Z.clearRect(0,0,1,1),$.clearRect(0,0,1,1);let N=$.getImageData(0,0,1,1).data;Z.putImageData(new ImageData(new Uint8ClampedArray([0,255,0,0]),1,1),0,0),$.drawImage(J,0,0);let O=$.getImageData(0,0,1,1).data;if(z._hasAlphaBug=N[1]!==O[1],z._hasAlphaBug)console.log("Detected a browser having issue with transparent pixels, applying workaround");if(typeof createImageBitmap<"u"){let K=new Uint8ClampedArray([255,0,255,0,255]).subarray(1,5);$.drawImage(await createImageBitmap(new ImageData(K,1)),0,0);let{data:G}=$.getImageData(0,0,1,1);z._hasBitmapBug=!1;for(let F=0;F<G.length;F++)if(Math.abs(K[F]-G[F])>15){z._hasBitmapBug=!0,console.log("Detected a browser having issue with partial bitmaps, applying workaround");break}}else z._hasBitmapBug=!1;J.remove(),Q.remove()}static async _test(){await z._testImageBugs()}static _getSubtitleTransfers(J,Z){let Q=[];if(J instanceof ArrayBuffer)Q.push(J);else if(J instanceof Uint8Array)Q.push(J.buffer);if(Z?.encrypted)Q.push(Z.encrypted);for(let $ of Z?.encryptedChunks||[])Q.push($);return Q}async _initGPURenderer(){if(f())try{let J=new v;if(await J.init(),!this._canvas)return;await J.setCanvas(this._canvas,Math.max(1,this._canvas.width||1),Math.max(1,this._canvas.height||1)),this._gpuRenderer=J,this._rendererType="webgpu",console.log("[AkariSub] Using WebGPU renderer");return}catch(J){console.warn("[AkariSub] WebGPU init failed, trying WebGL2:",J)}if(p())try{let J=new x;if(await J.init(),!this._canvas)return;await J.setCanvas(this._canvas,Math.max(1,this._canvas.width||1),Math.max(1,this._canvas.height||1)),this._gpuRenderer=J,this._rendererType="webgl2",console.log("[AkariSub] Using WebGL2 renderer");return}catch(J){console.warn("[AkariSub] WebGL2 init failed, falling back to Canvas2D:",J)}if(this._rendererType="canvas2d",!this._offscreenRender&&!this._ctx)this._ctx=this._canvas.getContext("2d",{alpha:!0,desynchronized:!0});this.sendMessage("setAsyncRender",{value:!1}),this._onCanvasFallback?.()}get rendererType(){return this._rendererType}get isUsingWebGPU(){return this._rendererType==="webgpu"}get isUsingGPURenderer(){return this._gpuRenderer!==null}_createCanvas(){return this._canvas=document.createElement("canvas"),this._canvas.style.display="block",this._canvas.style.position="absolute",this._canvas.style.pointerEvents="none",this._canvasParent.appendChild(this._canvas),this._canvas}resize(J=0,Z=0,Q=0,$=0,N=this._video?.paused??!1){if((!J||!Z)&&this._video){let O=c(this._video),K;if(this._videoWidth){let G=this._video.videoWidth/this._videoWidth,F=this._video.videoHeight/this._videoHeight;K=w((O.width||0)/G,(O.height||0)/F,this.prescaleFactor,this.prescaleHeightLimit,this.maxRenderHeight)}else K=w(O.width||0,O.height||0,this.prescaleFactor,this.prescaleHeightLimit,this.maxRenderHeight);if(J=K.width,Z=K.height,this._canvasParent)Q=O.y-(this._canvasParent.getBoundingClientRect().top-this._video.getBoundingClientRect().top),$=O.x;this._canvas.style.width=O.width+"px",this._canvas.style.height=O.height+"px"}if(this._canvas.style.top=Q+"px",this._canvas.style.left=$+"px",J>0&&Z>0)this._canvasctrl.width=J,this._canvasctrl.height=Z;if(this._gpuRenderer&&J>0&&Z>0)this._gpuRenderer.updateSize(J,Z);if(N&&this.busy===!1)this.busy=!0;else N=!1;this.sendMessage("canvas",{width:J,height:Z,videoWidth:this._videoWidth||this._video?.videoWidth||0,videoHeight:this._videoHeight||this._video?.videoHeight||0,force:N})}_timeupdate(J){let Q={seeking:!0,waiting:!0,playing:!1}[J.type];if(Q!=null)this._playstate=Q;this.setCurrentTime(this._video.paused||this._playstate,this._video.currentTime+this.timeOffset)}setVideo(J){if(J instanceof HTMLVideoElement){if(this._removeListeners(),this._video=J,this._onDemandRender){if(!this._destroyed&&this._video===J)J.requestVideoFrameCallback(this._boundHandleRVFC)}else this._playstate=J.paused,J.addEventListener("timeupdate",this._boundTimeUpdate,!1),J.addEventListener("progress",this._boundTimeUpdate,!1),J.addEventListener("waiting",this._boundTimeUpdate,!1),J.addEventListener("seeking",this._boundTimeUpdate,!1),J.addEventListener("playing",this._boundTimeUpdate,!1),J.addEventListener("ratechange",this._boundSetRate,!1),J.addEventListener("resize",this._boundResize,!1);if("VideoFrame"in window){if(J.addEventListener("loadedmetadata",this._boundUpdateColorSpace,!1),J.readyState>2)this._updateColorSpace()}if(J.videoWidth>0)this.resize();if(typeof ResizeObserver<"u"){if(!this._ro)this._ro=new ResizeObserver(()=>this.resize());this._ro.observe(J)}}else this._error(Error("Video element invalid!"))}setTrackByUrl(J){if(this.sendMessage("setTrackByUrl",{url:J}),this._reAttachOffscreen(),this._ctx)this._ctx.filter="none"}setTrack(J){if(this.sendMessage("setTrack",{content:J},z._getSubtitleTransfers(J)),this._reAttachOffscreen(),this._ctx)this._ctx.filter="none"}setEncryptedTrack(J){if(this.sendMessage("setEncryptedTrack",{content:J},z._getSubtitleTransfers(void 0,J)),this._reAttachOffscreen(),this._ctx)this._ctx.filter="none"}freeTrack(){this.sendMessage("freeTrack")}setIsPaused(J){this.sendMessage("video",{isPaused:J})}setRate(J){this.sendMessage("video",{rate:J})}setCurrentTime(J,Z,Q){this.sendMessage("video",{isPaused:J,currentTime:Z,rate:Q,colorSpace:this._videoColorSpace})}createEvent(J){this.sendMessage("createEvent",{event:J})}setEvent(J,Z){this.sendMessage("setEvent",{event:J,index:Z})}removeEvent(J){this.sendMessage("removeEvent",{index:J})}async getEvents(){return(await this._fetchFromWorker({target:"getEvents"})).events??[]}styleOverride(J){this.sendMessage("styleOverride",{style:J})}disableStyleOverride(){this.sendMessage("disableStyleOverride")}createStyle(J){this.sendMessage("createStyle",{style:J})}setStyle(J,Z){this.sendMessage("setStyle",{style:J,index:Z})}removeStyle(J){this.sendMessage("removeStyle",{index:J})}async getStyles(){return(await this._fetchFromWorker({target:"getStyles"})).styles??[]}addFont(J){this.sendMessage("addFont",{font:J})}setDefaultFont(J){this.sendMessage("defaultFont",{font:J})}async getStats(){let Z=(await this._fetchFromWorker({target:"getStats"})).stats;return{framesRendered:Z.framesRendered??0,framesDropped:Z.framesDropped??0,avgRenderTime:Z.avgRenderTime??0,maxRenderTime:Z.maxRenderTime??0,minRenderTime:Z.minRenderTime??0,lastRenderTime:Z.lastRenderTime??0,pendingRenders:Z.pendingRenders??0,totalEvents:Z.totalEvents??0,cacheHits:Z.cacheHits??0,cacheMisses:Z.cacheMisses??0,renderFps:Z.avgRenderTime&&Z.avgRenderTime>0?Math.round(1000/Z.avgRenderTime):0,usingWorker:!0,offscreenRender:this._offscreenRender,onDemandRender:this._onDemandRender}}async resetStats(){await this._fetchFromWorker({target:"resetStats"})}async getEventCount(){return(await this._fetchFromWorker({target:"getEventCount"})).count}async getStyleCount(){return(await this._fetchFromWorker({target:"getStyleCount"})).count}_sendLocalFont(J){try{globalThis.queryLocalFonts().then((Z)=>{let Q=Z?.find(($)=>$.fullName.toLowerCase()===J);if(Q)Q.blob().then(($)=>{$.arrayBuffer().then((N)=>{this.addFont(new Uint8Array(N))})})})}catch(Z){console.warn("Local fonts API:",Z)}}_getLocalFont(J){try{if(navigator?.permissions?.query)navigator.permissions.query({name:"local-fonts"}).then((Z)=>{if(Z.state==="granted")this._sendLocalFont(J.font)});else this._sendLocalFont(J.font)}catch(Z){console.warn("Local fonts API:",Z)}}_unbusy(){if(this._observeDemandCompletion(),this._pendingDemandTimes.length>0){if(this._pendingDemandTimes.length>1){let Z=this._pendingDemandTimes[this._pendingDemandTimes.length-1];this._pendingDemandTimes.length=0,this._pendingDemandTimes.push(Z)}let J=this._pendingDemandTimes.shift();if(J){this._demandRender(J);return}}this.busy=!1}_markDemandDispatched(){if(!this._onDemandRender)return;this._activeDemandStartedAt=performance.now()}_observeDemandCompletion(){if(!this._onDemandRender||this._activeDemandStartedAt===0)return;let J=performance.now()-this._activeDemandStartedAt;if(this._activeDemandStartedAt=0,!Number.isFinite(J)||J<=0)return;this._smoothedDemandLatencyMs=this._smoothedDemandLatencyMs<=0?J:this._smoothedDemandLatencyMs*0.75+J*0.25}_getDemandPipelineLeadSeconds(J,Z){let Q=Z.expectedDisplayTime??Z.presentationTime??J,$=Math.max(0,Q-J)/1000;return Math.max(0,this._smoothedDemandLatencyMs/1000-$)}_enqueueDemand(J){let Z=this._pendingDemandTimes;if(Z.length>0){let Q=Z[Z.length-1];if(Math.abs(Q.mediaTime-J.mediaTime)>0.25)Z.length=0}if(Z.length>=z.MAX_PENDING_DEMANDS)Z.shift();Z.push(J)}_handleRVFC(J,Z){if(this._destroyed)return;let Q=this._video?.playbackRate??1,$=this._getDemandPipelineLeadSeconds(J,Z),O={mediaTime:Z.mediaTime+($+this.renderAhead)*Q,width:Z.width,height:Z.height};if(!this._workerReady){this._enqueueDemand(O),this._video.requestVideoFrameCallback(this._boundHandleRVFC);return}if(this.busy)this._enqueueDemand(O);else this.busy=!0,this._demandRender(O);this._video.requestVideoFrameCallback(this._boundHandleRVFC)}_demandRender(J){if(J.width!==this._videoWidth||J.height!==this._videoHeight)this._videoWidth=J.width,this._videoHeight=J.height,this.resize();this._markDemandDispatched(),this.sendMessage("demand",{time:J.mediaTime+this.timeOffset})}_detachOffscreen(){if(!this._offscreenRender||this._ctx)return;this._canvas.remove(),this._createCanvas(),this._canvasctrl=this._canvas,this._ctx=this._canvasctrl.getContext("2d",{alpha:!0,desynchronized:!0}),this.sendMessage("detachOffscreen"),this.busy=!1,this._activeDemandStartedAt=0,this._pendingDemandTimes.length=0,this.resize(0,0,0,0,!0)}_reAttachOffscreen(){if(!this._offscreenRender||!this._ctx)return;this._canvas.remove(),this._createCanvas(),this._canvasctrl=this._canvas.transferControlToOffscreen(),this._ctx=!1,this.sendMessage("offscreenCanvas",{},[this._canvasctrl]),this.resize(0,0,0,0,!0)}_updateColorSpace(){this._video.requestVideoFrameCallback(()=>{try{let J=new globalThis.VideoFrame(this._video);this._videoColorSpace=u[J.colorSpace.matrix]??null,J.close(),this.sendMessage("getColorSpace")}catch(J){console.warn(J)}})}_verifyColorSpace(J){let{subtitleColorSpace:Z,videoColorSpace:Q=this._videoColorSpace}=J;if(!Z||!Q)return;if(Z===Q)return;this._detachOffscreen();let $=y[Z]?.[Q];if($&&this._ctx)this._ctx.filter=`url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='f'><feColorMatrix type='matrix' values='${$} 0 0 0 0 0 1 0'/></filter></svg>#f")`}_render(J){try{let{width:Z,height:Q}=J;if(this.debug)J.times.IPCTime=Date.now()-(J.times.JSRenderTime||0);if(this._canvasctrl.width!==Z||this._canvasctrl.height!==Q){if(this._canvasctrl.width=Z,this._canvasctrl.height=Q,this._lastRenderWidth=Z,this._lastRenderHeight=Q,this._gpuRenderer)this._gpuRenderer.updateSize(Z,Q);this._verifyColorSpace({subtitleColorSpace:J.colorSpace})}if(this._gpuRenderer){this._renderGPU(J);return}if(!this._ctx)return;let N=this._ctx,O=J.images,K=O.length;if(N.clearRect(0,0,Z,Q),J.asyncRender)for(let G=0;G<K;G++){let F=O[G];if(F.image)N.drawImage(F.image,F.x,F.y),F.image.close()}else{let G=z._hasAlphaBug??!1;for(let F=0;F<K;F++){let X=O[F];if(X.image){let{w:E,h:M,image:Y}=X,U=Y instanceof Uint8ClampedArray?Y:Y instanceof Uint8Array?new Uint8ClampedArray(Y.buffer,Y.byteOffset,Y.byteLength):new Uint8ClampedArray(Y),L=m(U,G);N.putImageData(new ImageData(L,E,M),X.x,X.y)}}}if(this.debug){J.times.JSRenderTime=Date.now()-(J.times.JSRenderTime||0)-(J.times.IPCTime||0);let G=0,F=J.times.bitmaps||K;delete J.times.bitmaps;for(let X in J.times)G+=J.times[X]||0;console.log("Bitmaps: "+F+" Total: "+(G|0)+"ms",J.times)}}finally{this._unbusy()}}_renderGPU(J){let Z=this._gpuRenderer;if(!Z)return;if(J.images.length===0){Z.clear();return}if(J.asyncRender){let Q=this._gpuBitmapImages,$=0;for(let N=0;N<J.images.length;N++){let O=J.images[N];if(!(O.image instanceof ImageBitmap))continue;let K=Q[$]||(Q[$]={image:O.image,x:0,y:0});K.image=O.image,K.x=O.x,K.y=O.y,$++}Q.length=$,Z.renderBitmaps(Q,this._canvasctrl.width,this._canvasctrl.height);for(let N of J.images)if(N.image instanceof ImageBitmap)N.image.close()}else Z.render(J.images,this._canvasctrl.width,this._canvasctrl.height);if(this.debug){J.times.JSRenderTime=Date.now()-(J.times.JSRenderTime||0)-(J.times.IPCTime||0);let Q=0,$=J.times.bitmaps||J.images.length;delete J.times.bitmaps;for(let N in J.times)Q+=J.times[N]||0;console.log(`[${this._rendererType.toUpperCase()}] Bitmaps: `+$+" Total: "+(Q|0)+"ms",J.times)}}_ready(){if(this._workerReady=!0,this._init(),this._onDemandRender&&this._video){this.setCurrentTime(this._video.paused,this._video.currentTime+this.timeOffset,this._video.playbackRate);let J=this._pendingDemandTimes.length>0?this._pendingDemandTimes[this._pendingDemandTimes.length-1]:{mediaTime:this._video.currentTime+this.renderAhead*(this._video.playbackRate||1),width:this._video.videoWidth,height:this._video.videoHeight};this._pendingDemandTimes.length=0,this.busy=!0,this._demandRender(J)}this.dispatchEvent(new CustomEvent("ready"))}_partial_ready(){this.dispatchEvent(new CustomEvent("partial_ready"))}_trackReady(){this.dispatchEvent(new CustomEvent("trackReady"))}async sendMessage(J,Z={},Q){if(await this._loaded,Q)this._worker.postMessage({target:J,transferable:Q,...Z},[...Q]);else this._worker.postMessage({target:J,...Z})}_fetchFromWorker(J){return new Promise((Z,Q)=>{try{let $=J.target,N=setTimeout(()=>{G(),Q(Error("Error: Timeout while trying to fetch "+$))},5000),O=(F)=>{if(F.data.target===$)G(),Z(F.data)},K=(F)=>{G(),Q(F instanceof Error?F:F.error||Error("Worker error"))},G=()=>{this._worker.removeEventListener("message",O),this._worker.removeEventListener("error",K),clearTimeout(N)};this._worker.addEventListener("message",O),this._worker.addEventListener("error",K),this._worker.postMessage(J)}catch($){Q($)}})}_console(J){console[J.command].apply(console,JSON.parse(J.content))}_onmessage(J){let Z=J.data.target;if(Z==="error"){this._error(J.data.error||"Unknown worker error");return}let Q=this["_"+Z];if(Q)Q.call(this,J.data)}_error(J){let Z=J instanceof Error?J:J instanceof ErrorEvent?J.error||Error(J.message):Error(String(J)),Q=J instanceof Event?new ErrorEvent(J.type,J):new ErrorEvent("error",{error:Z});return this.dispatchEvent(Q),console.error(Z),Z}_removeListeners(){if(this._video){if(this._ro)this._ro.unobserve(this._video);if(this._ctx)this._ctx.filter="none";this._video.removeEventListener("timeupdate",this._boundTimeUpdate),this._video.removeEventListener("progress",this._boundTimeUpdate),this._video.removeEventListener("waiting",this._boundTimeUpdate),this._video.removeEventListener("seeking",this._boundTimeUpdate),this._video.removeEventListener("playing",this._boundTimeUpdate),this._video.removeEventListener("ratechange",this._boundSetRate),this._video.removeEventListener("resize",this._boundResize),this._video.removeEventListener("loadedmetadata",this._boundUpdateColorSpace)}}destroy(J){let Z=J?this._error(J):void 0;if(this._video&&this._canvasParent)this._video.parentNode?.removeChild(this._canvasParent);if(this._gpuRenderer)this._gpuRenderer.destroy(),this._gpuRenderer=null,this._rendererType="canvas2d";return this._destroyed=!0,this._removeListeners(),this.sendMessage("destroy"),this._worker?.terminate(),Z}}})();
|
|
157
157
|
|
|
158
158
|
return AkariSub;
|
|
159
159
|
}));
|