diff --git "a/dist/assets/worker-CUNpJr-j.js" "b/dist/assets/worker-CUNpJr-j.js" new file mode 100644--- /dev/null +++ "b/dist/assets/worker-CUNpJr-j.js" @@ -0,0 +1,691 @@ +(function(){var e=class extends Error{code;details;constructor(e,t,n){super(t),this.name=`EngineRuntimeError`,this.code=e,this.details=n}};function t(){return new DOMException(`The engine operation was aborted.`,`AbortError`)}function n(e){if(e.aborted)throw t()}var r=Object.defineProperty,i=Object.defineProperties,a=Object.getOwnPropertyDescriptors,o=Object.getOwnPropertySymbols,s=Object.prototype.hasOwnProperty,c=Object.prototype.propertyIsEnumerable,l=(e,t)=>(t=Symbol[e])?t:Symbol.for(`Symbol.`+e),u=(e,t,n)=>t in e?r(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,d=(e,t)=>{for(var n in t||={})s.call(t,n)&&u(e,n,t[n]);if(o)for(var n of o(t))c.call(t,n)&&u(e,n,t[n]);return e},f=(e,t)=>i(e,a(t)),p=(e,t,n)=>u(e,typeof t==`symbol`?t:t+``,n),m=(e,t,n)=>new Promise((r,i)=>{var a=e=>{try{s(n.next(e))}catch(e){i(e)}},o=e=>{try{s(n.throw(e))}catch(e){i(e)}},s=e=>e.done?r(e.value):Promise.resolve(e.value).then(a,o);s((n=n.apply(e,t)).next())}),h=function(e,t){this[0]=e,this[1]=t},g=(e,t,n)=>{var r=(e,t,i,a)=>{try{var o=n[e](t),s=(t=o.value)instanceof h,c=o.done;Promise.resolve(s?t[0]:t).then(n=>s?r(e===`return`?e:`next`,t[1]?{done:n.done,value:n.value}:n,i,a):i({value:n,done:c})).catch(e=>r(`throw`,e,i,a))}catch(e){a(e)}},i=e=>a[e]=t=>new Promise((n,i)=>r(e,t,n,i)),a={};return n=n.apply(e,t),a[l(`asyncIterator`)]=()=>a,i(`next`),i(`throw`),i(`return`),a},_=(e,t,n)=>(t=e[l(`asyncIterator`)])?t.call(e):(e=e[l(`iterator`)](),t={},n=(n,r)=>(r=e[n])&&(t[n]=t=>new Promise((n,i,a)=>(t=r.call(e,t),a=t.done,Promise.resolve(t.value).then(e=>n({value:e,done:a}),i)))),n(`next`),n(`return`),t),v=1,y={erro_evt:{name:`erro_evt`,structName:`glue_msg_error`,className:`GlueMsgError`,fields:[{type:`str`,name:`message`,isNullable:!1}]},load_req:{name:`load_req`,structName:`glue_msg_load_req`,className:`GlueMsgLoadReq`,fields:[{type:`arr_str`,name:`model_paths`,isNullable:!1},{type:`str`,name:`mmproj_path`,isNullable:!0},{type:`bool`,name:`n_ctx_auto`,isNullable:!1},{type:`bool`,name:`use_mmap`,isNullable:!1},{type:`bool`,name:`use_mlock`,isNullable:!1},{type:`int`,name:`n_gpu_layers`,isNullable:!1},{type:`bool`,name:`offload_token_embedding`,isNullable:!0},{type:`int`,name:`n_ctx`,isNullable:!1},{type:`int`,name:`n_threads`,isNullable:!1},{type:`str`,name:`model_alias`,isNullable:!0},{type:`int`,name:`log_level`,isNullable:!0},{type:`bool`,name:`embeddings`,isNullable:!0},{type:`bool`,name:`offload_kqv`,isNullable:!0},{type:`int`,name:`n_batch`,isNullable:!0},{type:`int`,name:`n_ubatch`,isNullable:!0},{type:`int`,name:`n_parallel`,isNullable:!0},{type:`str`,name:`pooling_type`,isNullable:!0},{type:`str`,name:`rope_scaling_type`,isNullable:!0},{type:`float`,name:`rope_freq_base`,isNullable:!0},{type:`float`,name:`rope_freq_scale`,isNullable:!0},{type:`float`,name:`yarn_ext_factor`,isNullable:!0},{type:`float`,name:`yarn_attn_factor`,isNullable:!0},{type:`float`,name:`yarn_beta_fast`,isNullable:!0},{type:`float`,name:`yarn_beta_slow`,isNullable:!0},{type:`int`,name:`yarn_orig_ctx`,isNullable:!0},{type:`str`,name:`cache_type_k`,isNullable:!0},{type:`str`,name:`cache_type_v`,isNullable:!0},{type:`bool`,name:`kv_unified`,isNullable:!0},{type:`bool`,name:`flash_attn`,isNullable:!0},{type:`bool`,name:`swa_full`,isNullable:!0},{type:`int`,name:`n_ctx_checkpoints`,isNullable:!0},{type:`int`,name:`checkpoint_min_step`,isNullable:!0},{type:`str`,name:`chat_template`,isNullable:!0},{type:`bool`,name:`jinja`,isNullable:!0},{type:`arr_str`,name:`default_template_kwargs_keys`,isNullable:!0},{type:`arr_str`,name:`default_template_kwargs_vals`,isNullable:!0},{type:`bool`,name:`reasoning`,isNullable:!0},{type:`int`,name:`image_min_tokens`,isNullable:!0},{type:`int`,name:`image_max_tokens`,isNullable:!0},{type:`bool`,name:`warmup`,isNullable:!0},{type:`bool`,name:`no_kv_offload`,isNullable:!0},{type:`bool`,name:`mmproj_offload`,isNullable:!0},{type:`bool`,name:`cont_batching`,isNullable:!0},{type:`int`,name:`n_keep`,isNullable:!0},{type:`bool`,name:`ctx_shift`,isNullable:!0},{type:`bool`,name:`cache_idle_slots`,isNullable:!0},{type:`int`,name:`n_cache_reuse`,isNullable:!0},{type:`arr_str`,name:`lora_paths`,isNullable:!0},{type:`arr_float`,name:`lora_scales`,isNullable:!0},{type:`bool`,name:`lora_init_without_apply`,isNullable:!0},{type:`str`,name:`spec_draft_model`,isNullable:!0},{type:`int`,name:`spec_draft_ngl`,isNullable:!0},{type:`int`,name:`spec_draft_n_max`,isNullable:!0},{type:`int`,name:`spec_draft_n_min`,isNullable:!0},{type:`float`,name:`spec_draft_p_min`,isNullable:!0},{type:`int`,name:`spec_draft_threads`,isNullable:!0},{type:`int`,name:`spec_draft_threads_batch`,isNullable:!0},{type:`arr_str`,name:`kv_overrides_keys`,isNullable:!0},{type:`arr_str`,name:`kv_overrides_vals`,isNullable:!0},{type:`int`,name:`reasoning_budget_tokens`,isNullable:!0},{type:`str`,name:`reasoning_budget_message`,isNullable:!0},{type:`str`,name:`reasoning_format`,isNullable:!0},{type:`bool`,name:`skip_chat_parsing`,isNullable:!0},{type:`bool`,name:`prefill_assistant`,isNullable:!0}]},load_res:{name:`load_res`,structName:`glue_msg_load_res`,className:`GlueMsgLoadRes`,fields:[{type:`bool`,name:`success`,isNullable:!1},{type:`int`,name:`n_ctx`,isNullable:!1},{type:`int`,name:`n_batch`,isNullable:!1},{type:`int`,name:`n_ubatch`,isNullable:!1},{type:`int`,name:`n_vocab`,isNullable:!1},{type:`int`,name:`n_ctx_train`,isNullable:!1},{type:`int`,name:`n_embd`,isNullable:!1},{type:`int`,name:`n_layer`,isNullable:!1},{type:`arr_str`,name:`metadata_key`,isNullable:!1},{type:`arr_str`,name:`metadata_val`,isNullable:!1},{type:`int`,name:`token_bos`,isNullable:!1},{type:`int`,name:`token_eos`,isNullable:!1},{type:`int`,name:`token_eot`,isNullable:!1},{type:`arr_int`,name:`list_tokens_eog`,isNullable:!1},{type:`bool`,name:`add_bos_token`,isNullable:!1},{type:`bool`,name:`add_eos_token`,isNullable:!1},{type:`bool`,name:`has_encoder`,isNullable:!1},{type:`int`,name:`token_decoder_start`,isNullable:!1},{type:`str`,name:`media_marker`,isNullable:!1},{type:`bool`,name:`has_image_input`,isNullable:!1},{type:`bool`,name:`has_audio_input`,isNullable:!1}]},cmpl_req:{name:`cmpl_req`,structName:`glue_msg_completion_req`,className:`GlueMsgCompletionReq`,fields:[{type:`bool`,name:`is_chat`,isNullable:!1},{type:`str`,name:`data_json`,isNullable:!1},{type:`arr_raw`,name:`files`,isNullable:!1}]},cmpl_res:{name:`cmpl_res`,structName:`glue_msg_completion_res`,className:`GlueMsgCompletionRes`,fields:[{type:`bool`,name:`success`,isNullable:!1}]},embd_req:{name:`embd_req`,structName:`glue_msg_embedding_req`,className:`GlueMsgEmbeddingReq`,fields:[{type:`str`,name:`data_json`,isNullable:!1},{type:`arr_raw`,name:`files`,isNullable:!1}]},embd_res:{name:`embd_res`,structName:`glue_msg_embedding_res`,className:`GlueMsgEmbeddingRes`,fields:[{type:`bool`,name:`success`,isNullable:!1}]},rrnk_req:{name:`rrnk_req`,structName:`glue_msg_rerank_req`,className:`GlueMsgRerankReq`,fields:[{type:`str`,name:`data_json`,isNullable:!1}]},rrnk_res:{name:`rrnk_res`,structName:`glue_msg_rerank_res`,className:`GlueMsgRerankRes`,fields:[{type:`bool`,name:`success`,isNullable:!1}]},gres_req:{name:`gres_req`,structName:`glue_msg_get_result_req`,className:`GlueMsgGetResultReq`,fields:[]},gres_res:{name:`gres_res`,structName:`glue_msg_get_result_res`,className:`GlueMsgGetResultRes`,fields:[{type:`bool`,name:`success`,isNullable:!1},{type:`bool`,name:`has_more`,isNullable:!1},{type:`bool`,name:`is_error`,isNullable:!1},{type:`str`,name:`data_json`,isNullable:!1}]},tbop_req:{name:`tbop_req`,structName:`glue_msg_test_backend_ops_req`,className:`GlueMsgTestBackendOpsReq`,fields:[{type:`arr_str`,name:`args`,isNullable:!1}]},tbop_res:{name:`tbop_res`,structName:`glue_msg_test_backend_ops_res`,className:`GlueMsgTestBackendOpsRes`,fields:[{type:`int`,name:`retcode`,isNullable:!1},{type:`bool`,name:`success`,isNullable:!1}]}},b=new Uint8Array([71,76,85,69]),x=0,S={str:4,int:2,float:3,bool:1,raw:5,arr_str:9,arr_int:7,arr_float:8,arr_bool:6,arr_raw:10,null:x};function C(e){let t=0,n=new DataView(e.buffer),r=()=>{let e=n.getUint32(t,!0);return t+=4,e},i=()=>{let e=n.getInt32(t,!0);return t+=4,e},a=()=>{let e=n.getFloat32(t,!0);return t+=4,e},o=()=>r()!==0,s=n=>{let i=n??r(),a=new TextDecoder().decode(e.slice(t,t+i));return t+=i,a},c=()=>{let n=r(),i=e.slice(t,t+n);return t+=n,i},l=e=>{let t=r(),n=Array(t);for(let r=0;rnull,d=e=>{switch(e.type){case`str`:return s();case`int`:return i();case`float`:return a();case`bool`:return o();case`raw`:return c();case`arr_str`:return l(s);case`arr_int`:return l(i);case`arr_float`:return l(a);case`arr_bool`:return l(o);case`arr_raw`:return l(c);case`null`:return u()}},f=e[0]===b[0]&&e[1]===b[1]&&e[2]===b[2]&&e[3]===b[3];if(t+=4,!f)throw Error(`Invalid magic number`);if(r()!==v)throw Error(`Invalid version number`);let p=s(8),m=y[p];if(!m)throw Error(`Unknown message name: ${p}`);let h={_name:p};for(let e of m.fields){let t=r();if(t===x){if(!e.isNullable)throw Error(`${p}: Expect field ${e.name} to be non-nullable`);h[e.name]=null;continue}if(t!==S[e.type])throw Error(`${p}: Expect field ${e.name} to have type ${e.type}`);h[e.name]=d(e)}return h}function w(e){let t=y[e._name];if(!t)throw Error(`Unknown message name: ${e._name}`);let n=[],r=e=>{let t=new ArrayBuffer(4);new DataView(t).setUint32(0,e,!0),n.push(new Uint8Array(t))},i=e=>{let t=new ArrayBuffer(4);new DataView(t).setInt32(0,e,!0),n.push(new Uint8Array(t))},a=e=>{let t=new ArrayBuffer(4);new DataView(t).setFloat32(0,e,!0),n.push(new Uint8Array(t))},o=e=>{r(+!!e)},s=e=>{let t=new TextEncoder().encode(e);r(t.byteLength),n.push(t)},c=e=>{r(e.byteLength),n.push(e)},l=(e,t)=>{r(e.length);for(let n of e)t(n)};n.push(b),r(v);{let t=new TextEncoder().encode(e._name);n.push(t)}for(let n of t.fields){let t=e[n.name];if(!n.isNullable&&t==null)throw Error(`${e._name}: Expect field ${n.name} to be non-nullable`);if(t==null){r(x);continue}switch(r(S[n.type]),n.type){case`str`:s(t);break;case`int`:i(t);break;case`float`:a(t);break;case`bool`:o(t);break;case`raw`:c(t);break;case`arr_str`:l(t,s);break;case`arr_int`:l(t,i);break;case`arr_float`:l(t,a);break;case`arr_bool`:l(t,o);break;case`arr_raw`:l(t,c);break;case`null`:break}}let u=n.reduce((e,t)=>e+t.byteLength,0),d=new Uint8Array(u),f=0;for(let e of n)d.set(e,f),f+=e.byteLength;return d}var T={default:`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`,compat:`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`},E=new Map;function D(e){return m(this,null,function*(){if(E.has(e))return E.get(e);let t=T[e];if(!t)throw Error(`No source map for build "${e}"`);let n=Uint8Array.from(atob(t),e=>e.charCodeAt(0)),r=new DecompressionStream(`gzip`),i=r.writable.getWriter();i.write(n),i.close();let a=yield new Response(r.readable).arrayBuffer(),o=new DataView(a),s=new Uint8Array(a),c=o.getUint32(0,!0),l=o.getUint32(4,!0),u=o.getUint32(8,!0),d=new TextDecoder,f=[],p=12;for(let e=0;em(void 0,null,function*(){let{firstId:n,funcNames:r}=yield D(t?`compat`:`default`);return e.map(e=>{let t=e-n;return{funcId:e,name:t>=0&&tm(void 0,null,function*(){let n=[...new Set([...e.matchAll(/wasm-function\[(\d+)\]/g)].map(e=>parseInt(e[1])))];return n.length===0?e:(yield O.decodeFuncIds(n,t)).map(e=>e.name===`(unknown)`?` wasm-func[${e.funcId}] (unknown)`:` wasm-func[${e.funcId}] (${e.name})`).join(` +`)})};new TextDecoder;var k=/-(\d{5})-of-(\d{5})\.gguf(?:\?.*)?$/,ee=e=>{let t=e.match(k);return t?{baseURL:e.replace(k,``),current:parseInt(t[1]),total:parseInt(t[2])}:{baseURL:e,current:1,total:1}},te=e=>{e.every(e=>!!e.name)&&e.length>1&&e.sort((e,t)=>{let n=ee(e.name),r=ee(t.name);return n.current-r.current})},ne=e=>m(void 0,null,function*(){let t=yield e.slice(0,128*1024).arrayBuffer(),n=new Uint8Array(t),r=new TextEncoder().encode(`general.architecture`),i=new TextEncoder().encode(`clip`),a=-1;outer:for(let e=0;e<=n.length-r.length;e++){for(let t=0;tn.length||new DataView(t).getBigUint64(a+24,!0)!==BigInt(`4`))return!1;for(let e=0;enew URL(e,document.baseURI).href,ie=(e,t)=>Array(Math.max(t-String(e).length+1,0)).join(`0`)+e,ae=e=>e.reduce((e,t)=>e+t,0),A=e=>!!e?.startsWith,j=`mmproj.gguf`,oe=e=>m(void 0,null,function*(){let t=[],n=null;for(let r of e)(yield ne(r))?n=r:t.push(r);te(t);let r=t.map((e,n)=>({blob:e,name:`model-${ie(n+1,5)}-of-${ie(t.length,5)}.gguf`}));return n&&r.push({blob:n,name:j}),{llm:r.filter(e=>e.name!==j),mmproj:n?{blob:n,name:j}:null,all:r}}),se=()=>(e=>m(void 0,null,function*(){try{return typeof MessageChannel<`u`&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(e)}catch{return!1}}))(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11])),ce=()=>m(void 0,null,function*(){return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,6,64,25,11,11]))}),le=()=>m(void 0,null,function*(){return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]))}),ue=()=>!!WebAssembly.Suspending,de=()=>!!navigator.gpu,fe=()=>{try{return new WebAssembly.Memory({address:`i64`,initial:BigInt(`1`)}),!0}catch{return!1}},pe=()=>m(void 0,null,function*(){if(!(yield ce()))throw Error(`WebAssembly runtime does not support exception handling`);if(!(yield le()))throw Error(`WebAssembly runtime does not support SIMD`)}),me=()=>!!navigator.userAgent.match(/Firefox\/([0-9\.]+)(?:\s|$)/),he=/^.*\.gguf(?:\?.*)?$/,ge=e=>he.test(e),_e=()=>!!navigator.userAgent.match(/Version\/([0-9\._]+).*Mobile.*Safari.*/),ve=e=>{let t=URL.createObjectURL(A(e)?new Blob([e],{type:`text/javascript`}):e);return new Worker(t,{type:`module`})},ye=e=>(...t)=>{let n=[],r,i;return n.push(new Promise((e,t)=>{r=e,i=t})),e(...t,(e,t,a)=>{if(a){i(a);return}r([e,t]),n.push(new Promise((e,t)=>{r=e,i=t}))}),function(){return g(this,null,function*(){let e;for(let t=0,r=!1;!r;t++)[e,r]=yield new h(n[t]),delete n[t],e!==void 0&&(yield e)})}()},be=e=>ue()||e,xe=()=>!ue()||!fe(),Se=`b1-00fa7cb`,Ce=`// Start the main llama.cpp +let wllamaMalloc; +let wllamaStart; +let wllamaAction; +let wllamaExit; +let wllamaDebug; + +let Module = null; +let isCompat = false; +let lastStack = ''; +let isAborted = false; +let hasMultithread = false; + +////////////////////////////////////////////////////////////// +// UTILS +////////////////////////////////////////////////////////////// + +// send message back to main thread +const msg = (data, transfer) => postMessage(data, transfer); + +// Convert CPP log into JS log +const cppLogToJSLog = (line) => { + const matched = line.match(/@@(DEBUG|INFO|WARN|ERROR)@@(.*)/); + return !!matched + ? { + level: (matched[1] === 'INFO' ? 'debug' : matched[1]).toLowerCase(), + text: matched[2], + } + : { level: 'log', text: line }; +}; + +const getHeapU8 = () => { + const buffer = Module.wasmMemory.buffer; + return new Uint8Array(buffer); +}; + +const toSizeT = (num) => { + return isCompat ? Number(num) : BigInt(num); +}; + +// Get module config that forwards stdout/err to main thread +const getWModuleConfig = (_argMainScriptBlob) => { + var pathConfig = RUN_OPTIONS.pathConfig; + var pthreadPoolSize = RUN_OPTIONS.nbThread; + var argMainScriptBlob = _argMainScriptBlob; + + isCompat = RUN_OPTIONS.compat; + hasMultithread = pthreadPoolSize > 1; + + msg({ + verb: 'console.debug', + args: [ + \`Multithread enabled: \${hasMultithread}, pthreadPoolSize: \${pthreadPoolSize}\`, + ], + }); + + if (!pathConfig['wllama.wasm']) { + throw new Error('"wllama.wasm" is missing in pathConfig'); + } + return { + noInitialRun: true, + print: function (text) { + if (arguments.length > 1) + text = Array.prototype.slice.call(arguments).join(' '); + msg({ verb: 'console.log', args: [text] }); + }, + printErr: function (text) { + if (arguments.length > 1) + text = Array.prototype.slice.call(arguments).join(' '); + if (text.startsWith('@@STACK@@')) { + lastStack = text.slice('@@STACK@@'.length); + return; + } + const logLine = cppLogToJSLog(text); + msg({ verb: 'console.' + logLine.level, args: [logLine.text] }); + }, + locateFile: function (filename, basePath) { + const p = pathConfig[filename]; + const truncate = (str) => + str.length > 128 ? \`\${str.substr(0, 128)}...\` : str; + if (filename.match(/wllama\\.worker\\.js/)) { + msg({ + verb: 'console.error', + args: [ + '"wllama.worker.js" is removed from v2.2.1. Hint: make sure to clear browser\\'s cache.', + ], + }); + } else { + msg({ + verb: 'console.debug', + args: [\`Loading "\${filename}" from "\${truncate(p)}"\`], + }); + return p; + } + }, + mainScriptUrlOrBlob: hasMultithread + ? argMainScriptBlob + : 'throw new Error("Multithreading is not enabled")', + pthreadPoolSize: hasMultithread ? pthreadPoolSize : 0, + wasmMemory: hasMultithread ? getWasmMemory() : null, + onAbort: function (message) { + isAborted = true; + msg({ verb: 'signal.abort', args: ['abort', message, lastStack, null] }); + }, + onExit: function (code) { + isAborted = true; + const callstack = new Error().stack.toString(); + msg({ + verb: 'signal.abort', + args: ['abort', 'exit(' + code + ')', callstack, null], + }); + }, + }; +}; + +// Get the memory to be used by wasm. (Only used in multi-thread mode) +// Because we have a weird OOM issue on iOS, we need to try some values +// See: https://github.com/emscripten-core/emscripten/issues/19144 +// https://github.com/godotengine/godot/issues/70621 +const getWasmMemory = () => { + let minBytes = 128 * 1024 * 1024; + let maxBytes = 4096 * 1024 * 1024; + let stepBytes = 128 * 1024 * 1024; + while (maxBytes > minBytes) { + try { + const wasmMemory = new WebAssembly.Memory({ + initial: toSizeT(minBytes / 65536), + maximum: toSizeT(maxBytes / 65536), + shared: true, + address: isCompat ? undefined : 'i64', + }); + return wasmMemory; + } catch (e) { + maxBytes -= stepBytes; + continue; // retry + } + } + throw new Error('Cannot allocate WebAssembly.Memory'); +}; + +////////////////////////////////////////////////////////////// +// HEAPFS PATCH +////////////////////////////////////////////////////////////// + +/** + * By default, emscripten uses memfs. The way it works is by + * allocating new Uint8Array in javascript heap. This is not good + * because it requires files to be copied to wasm heap each time + * a file is read. + * + * HeapFS is an alternative, which resolves this problem by + * allocating space for file directly inside wasm heap. This + * allows us to mmap without doing any copy. + * + * For llama.cpp, this is great because we use MAP_SHARED + * + * Ref: https://github.com/ngxson/wllama/pull/39 + * Ref: https://github.com/emscripten-core/emscripten/blob/main/src/library_memfs.js + * + * Note 29/05/2024 @ngxson + * Due to ftell() being limited to MAX_LONG, we cannot load files bigger than 2^31 bytes (or 2GB) + * Ref: https://github.com/emscripten-core/emscripten/blob/main/system/lib/libc/musl/src/stdio/ftell.c + */ + +const fsNameToFile = {}; // map Name => File +const fsIdToFile = {}; // map ID => File +let currFileId = 0; + +// Patch and redirect memfs calls to wllama +const patchHeapFS = () => { + const m = Module; + // save functions + m.MEMFS.stream_ops._read = m.MEMFS.stream_ops.read; + m.MEMFS.stream_ops._write = m.MEMFS.stream_ops.write; + m.MEMFS.stream_ops._llseek = m.MEMFS.stream_ops.llseek; + m.MEMFS.stream_ops._allocate = m.MEMFS.stream_ops.allocate; + m.MEMFS.stream_ops._mmap = m.MEMFS.stream_ops.mmap; + m.MEMFS.stream_ops._msync = m.MEMFS.stream_ops.msync; + + const patchStream = (stream) => { + const name = stream.node.name; + if (fsNameToFile[name]) { + const f = fsNameToFile[name]; + const ptr = Number(f.ptr); + stream.node.contents = getHeapU8().subarray(ptr, ptr + f.size); + stream.node.usedBytes = f.size; + } + }; + + // replace "read" functions + m.MEMFS.stream_ops.read = function ( + stream, + buffer, + offset, + length, + position + ) { + patchStream(stream); + return m.MEMFS.stream_ops._read(stream, buffer, offset, length, position); + }; + m.MEMFS.ops_table.file.stream.read = m.MEMFS.stream_ops.read; + + // replace "llseek" functions + m.MEMFS.stream_ops.llseek = function (stream, offset, whence) { + patchStream(stream); + return m.MEMFS.stream_ops._llseek(stream, offset, whence); + }; + m.MEMFS.ops_table.file.stream.llseek = m.MEMFS.stream_ops.llseek; + + // replace "mmap" functions + m.MEMFS.stream_ops.mmap = function (stream, length, position, prot, flags) { + patchStream(stream); + const name = stream.node.name; + if (fsNameToFile[name]) { + const f = fsNameToFile[name]; + const mmapPtr = f.ptr + toSizeT(position); + return { + ptr: mmapPtr, + allocated: false, + }; + } else { + return m.MEMFS.stream_ops._mmap(stream, length, position, prot, flags); + } + }; + m.MEMFS.ops_table.file.stream.mmap = m.MEMFS.stream_ops.mmap; + + // mount FS + m.FS.mkdir('/models'); + m.FS.mount(m.MEMFS, { root: '.' }, '/models'); +}; + +// Allocate a new file in wllama heapfs, returns file ID +const heapfsAlloc = (name, size, allocBuffer) => { + if (size < 1) { + throw new Error('File size must be bigger than 0'); + } + const m = Module; + const ptr = toSizeT(allocBuffer ? m.mmapAlloc(size) : 0); + const file = { + ptr: ptr, + size: size, + id: currFileId++, + }; + fsIdToFile[file.id] = file; + fsNameToFile[name] = file; + return file.id; +}; + +// Add new file to wllama heapfs, return number of written bytes +const heapfsWrite = (id, buffer, offset) => { + if (fsIdToFile[id]) { + const { ptr, size } = fsIdToFile[id]; + const afterWriteByte = offset + buffer.byteLength; + if (afterWriteByte > size) { + throw new Error( + \`File ID \${id} write out of bound, afterWriteByte = \${afterWriteByte} while size = \${size}\` + ); + } + getHeapU8().set(buffer, Number(ptr) + offset); + return buffer.byteLength; + } else { + throw new Error(\`File ID \${id} not found in heapfs\`); + } +}; + +////////////////////////////////////////////////////////////// +// ASYNC FILE READ +////////////////////////////////////////////////////////////// + +let isAwaitReading = false; +let pendingReadPromise = null; +let pendingReadResolve = null; +let pendingReadReject = null; + +const _stripModelsPrefix = (path) => path.replace(/^\\/?models\\//, ''); + +// Called from EM_ASYNC_JS stub in wllama-fs.h (path is already a JS string) +const _wllama_js_file_read = async (path, offset, req_size, out_ptr) => { + const name = _stripModelsPrefix(path); + + pendingReadPromise = new Promise((res, rej) => { + pendingReadResolve = res; + pendingReadReject = rej; + }); + isAwaitReading = true; + + postMessage({ verb: 'fs.read_req', args: [name, offset, req_size] }); + + let data; + try { + data = await pendingReadPromise; + } finally { + isAwaitReading = false; + pendingReadResolve = null; + pendingReadReject = null; + } + + const bytes = new Uint8Array(data); + getHeapU8().set(bytes, out_ptr); + return toSizeT(bytes.length); +}; + +////////////////////////////////////////////////////////////// +// MAIN CODE +////////////////////////////////////////////////////////////// + +const callWrapper = (name, ret, args, isAsync) => { + const fn = Module.cwrap( + name, + ret, + args, + isAsync ? { async: true } : undefined + ); + return async (action, req) => { + // console.log(\`Calling \${name} with action:\`, action, 'and req:', req); + let result; + try { + if (args.length === 2) { + result = isAsync ? await fn(action, req) : fn(action, req); + } else { + result = fn(); + } + } catch (ex) { + console.error(ex); + throw ex; + } + return result; + }; +}; + +function handleError(err) { + // If WASM already aborted, onAbort already sent signal.abort; skip to avoid + // re-reporting the resulting WebAssembly.RuntimeError as a JS exception. + if (isAborted) return; + + const message = err ? err.message || String(err) : 'Unknown error'; + const stack = err ? err.stack || String(err) : ''; + msg({ + verb: 'signal.abort', + args: ['exception', message, stack, err], + }); +} + +onmessage = async (e) => { + if (!e.data) return; + const { verb, args, callbackId } = e.data; + + // fs.read_res arrives while wasm is JSPI-suspended; resolve the pending promise. + if (verb === 'fs.read_res') { + if (pendingReadResolve) { + pendingReadResolve(args[0]); + } + return; + } + + // Guard: while awaiting a file read, reject any other incoming task. + if (isAwaitReading) { + if (callbackId) { + msg({ + callbackId, + err: 'Worker is suspended waiting for file data (JSPI)', + }); + } + return; + } + + if (!callbackId) { + msg({ verb: 'console.error', args: ['callbackId is required', e.data] }); + return; + } + + if (verb === 'module.init') { + const argMainScriptBlob = args[0]; + const argUseAsyncFile = args[1]; + try { + Module = getWModuleConfig(argMainScriptBlob); + Module.preRun = () => { + if (argUseAsyncFile) { + Module.ENV['USE_ASYNC_FILE'] = '1'; + } + }; + Module.onRuntimeInitialized = () => { + // async call once module is ready + // init FS + patchHeapFS(); + // init cwrap + const pointer = isCompat ? 'number' : 'bigint'; + // TODO: note sure why emscripten cannot bind if there is only 1 argument + wllamaMalloc = callWrapper('wllama_malloc', pointer, [ + 'number', + pointer, + ]); + wllamaStart = callWrapper('wllama_start', 'string', [], true); + wllamaAction = callWrapper( + 'wllama_action', + pointer, + ['string', pointer], + true + ); + wllamaExit = callWrapper('wllama_exit', 'string', []); + wllamaDebug = callWrapper('wllama_debug', 'string', []); + msg({ callbackId, result: null }); + }; + wModuleInit(); + } catch (err) { + handleError(err); + } + return; + } + + if (verb === 'fs.alloc') { + const argFilename = args[0]; + const argSize = args[1]; + const argAllocBuffer = args[2]; + try { + // create blank file + const emptyBuffer = new ArrayBuffer(0); + Module['FS_createDataFile']( + '/models', + argFilename, + emptyBuffer, + true, + true, + true + ); + // alloc data on heap + const fileId = heapfsAlloc(argFilename, argSize, argAllocBuffer); + msg({ callbackId, result: { fileId } }); + } catch (err) { + handleError(err); + } + return; + } + + if (verb === 'fs.write') { + const argFileId = args[0]; + const argBuffer = args[1]; + const argOffset = args[2]; + try { + const writtenBytes = heapfsWrite(argFileId, argBuffer, argOffset); + msg({ callbackId, result: { writtenBytes } }); + } catch (err) { + handleError(err); + } + return; + } + + if (verb === 'wllama.start') { + try { + const result = await wllamaStart(); + msg({ callbackId, result }); + } catch (err) { + handleError(err); + } + return; + } + + if (verb === 'wllama.action') { + const argAction = args[0]; + const argEncodedMsg = args[1]; + try { + const inputPtr = await wllamaMalloc(toSizeT(argEncodedMsg.byteLength), 0); + // copy data to wasm heap + const inputBuffer = new Uint8Array( + getHeapU8().buffer, + Number(inputPtr), + argEncodedMsg.byteLength + ); + inputBuffer.set(argEncodedMsg, 0); + const outputPtr = await wllamaAction(argAction, inputPtr); + if (!outputPtr) { + throw new Error(\`wllama_action("\${argAction}") returned a null pointer\`); + } + // length of output buffer is written at the first 4 bytes of input buffer + const outputLen = new Uint32Array( + getHeapU8().buffer, + Number(inputPtr), + 1 + )[0]; + // copy the output buffer to JS heap + const outputBuffer = new Uint8Array(outputLen); + const outputSrcView = new Uint8Array( + getHeapU8().buffer, + Number(outputPtr), + outputLen + ); + outputBuffer.set(outputSrcView, 0); // copy it + msg({ callbackId, result: outputBuffer }, [outputBuffer.buffer]); + } catch (err) { + handleError(err); + } + return; + } + + if (verb === 'wllama.exit') { + try { + const result = await wllamaExit(); + msg({ callbackId, result }); + } catch (err) { + handleError(err); + } + return; + } + + if (verb === 'wllama.debug') { + try { + const result = await wllamaDebug(); + msg({ callbackId, result }); + } catch (err) { + handleError(err); + } + return; + } +}; +`,we=`let accessHandle; +let abortController = new AbortController(); + +async function openFile(filename) { + const opfsRoot = await navigator.storage.getDirectory(); + const cacheDir = await opfsRoot.getDirectoryHandle('cache', { create: true }); + const fileHandler = await cacheDir.getFileHandle(filename, { create: true }); + accessHandle = await fileHandler.createSyncAccessHandle(); + accessHandle.truncate(0); // clear file content +} + +async function writeFile(buf) { + accessHandle.write(buf); +} + +async function closeFile() { + accessHandle.flush(); + accessHandle.close(); +} + +async function writeTextFile(filename, str) { + await openFile(filename); + await writeFile(new TextEncoder().encode(str)); + await closeFile(); +} + +const throttled = (func, delay) => { + let lastRun = 0; + return (...args) => { + const now = Date.now(); + if (now - lastRun > delay) { + lastRun = now; + func.apply(null, args); + } + }; +}; + +const assertNonNull = (val) => { + if (val === null || val === undefined) { + throw new Error('OPFS Worker: Assertion failed'); + } +}; + +// respond to main thread +const resOK = () => postMessage({ ok: true }); +const resProgress = (loaded, total) => + postMessage({ progress: { loaded, total } }); +const resErr = (err) => postMessage({ err }); + +onmessage = async (e) => { + try { + if (!e.data) return; + + /** + * @param {Object} e.data + * + * Fine-control FS actions: + * - { action: 'open', filename: 'string' } + * - { action: 'write', buf: ArrayBuffer } + * - { action: 'close' } + * + * Simple write API: + * - { action: 'write-simple', filename: 'string', buf: ArrayBuffer } + * + * Download API: + * - { action: 'download', url: 'string', filename: 'string', options: Object, metadataFileName: 'string' } + * - { action: 'download-abort' } + */ + const { + action, + filename, + buf, + url, + options, + metadataFileName, + metadataAdditional, + } = e.data; + + if (action === 'open') { + assertNonNull(filename); + await openFile(filename); + return resOK(); + } else if (action === 'write') { + assertNonNull(buf); + await writeFile(buf); + return resOK(); + } else if (action === 'close') { + await closeFile(); + return resOK(); + } else if (action === 'write-simple') { + assertNonNull(filename); + assertNonNull(buf); + await openFile(filename); + await writeFile(buf); + await closeFile(); + return resOK(); + } else if (action === 'download') { + assertNonNull(url); + assertNonNull(filename); + assertNonNull(metadataFileName); + assertNonNull(options); + assertNonNull(options.aborted); + abortController = new AbortController(); + if (options.aborted) abortController.abort(); + const response = await fetch(url, { + ...options, + signal: abortController.signal, + }); + const contentLength = response.headers.get('content-length'); + const etag = (response.headers.get('etag') || '').replace( + /[^A-Za-z0-9]/g, + '' + ); + const total = parseInt(contentLength, 10); + const reader = response.body.getReader(); + await openFile(filename); + let loaded = 0; + const throttledProgress = throttled(resProgress, 100); + while (true) { + const { done, value } = await reader.read(); + if (done) break; + loaded += value.byteLength; + await writeFile(value); + throttledProgress(loaded, total); + } + resProgress(total, total); // 100% done + await closeFile(); + // make sure this is in-sync with CacheEntryMetadata + await writeTextFile( + metadataFileName, + JSON.stringify({ + originalURL: url, + originalSize: total, + etag, + ...metadataAdditional, + }) + ); + return resOK(); + } else if (action === 'download-abort') { + if (abortController) { + abortController.abort(); + } + return; + } + + throw new Error('OPFS Worker: Invalid action', e.data); + } catch (err) { + return resErr(err); + } +}; +`,Te='var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=!!globalThis.window;var ENVIRONMENT_IS_WORKER=!!globalThis.WorkerGlobalScope;var ENVIRONMENT_IS_NODE=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";var ENVIRONMENT_IS_PTHREAD=ENVIRONMENT_IS_WORKER&&self.name?.startsWith("em-pthread");if(ENVIRONMENT_IS_NODE){var worker_threads=require("worker_threads");global.Worker=worker_threads.Worker;ENVIRONMENT_IS_WORKER=!worker_threads.isMainThread;ENVIRONMENT_IS_PTHREAD=ENVIRONMENT_IS_WORKER&&worker_threads["workerData"]=="em-pthread"}var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=globalThis.document?.currentScript?.src;if(typeof __filename!="undefined"){_scriptName=__filename}else if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(process.argv.length>1){thisProgram=process.argv[1].replace(/\\\\/g,"/")}arguments_=process.argv.slice(2);if(typeof module!="undefined"){module["exports"]=Module}quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}if(!ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{if(isFileURI(url)){return new Promise((resolve,reject)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response);return}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.error.bind(console);if(ENVIRONMENT_IS_NODE){var utils=require("util");var stringify=a=>typeof a=="object"?utils.inspect(a):a;defaultPrint=(...args)=>fs.writeSync(1,args.map(stringify).join(" ")+"\\n");defaultPrintErr=(...args)=>fs.writeSync(2,args.map(stringify).join(" ")+"\\n")}var out=defaultPrint;var err=defaultPrintErr;var wasmBinary;var wasmModule;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var isFileURI=filename=>filename.startsWith("file://");function growMemViews(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}}if(ENVIRONMENT_IS_NODE&&ENVIRONMENT_IS_PTHREAD){var parentPort=worker_threads["parentPort"];parentPort.on("message",msg=>global.onmessage?.({data:msg}));Object.assign(globalThis,{self:global,postMessage:msg=>parentPort["postMessage"](msg)});process.on("uncaughtException",err=>{postMessage({cmd:"uncaughtException",error:err});process.exit(1)})}var startWorker;if(ENVIRONMENT_IS_PTHREAD){var initializedJS=false;self.onunhandledrejection=e=>{throw e.reason||e};async function handleMessage(e){try{var msgData=e["data"];var cmd=msgData.cmd;if(cmd==="load"){let messageQueue=[];self.onmessage=e=>messageQueue.push(e);startWorker=()=>{postMessage({cmd:"loaded"});for(let msg of messageQueue){handleMessage(msg)}self.onmessage=handleMessage};for(const handler of msgData.handlers){if(!Module[handler]||Module[handler].proxy){Module[handler]=(...args)=>{postMessage({cmd:"callHandler",handler,args})};if(handler=="print")out=Module[handler];if(handler=="printErr")err=Module[handler]}}wasmMemory=msgData.wasmMemory;updateMemoryViews();wasmModule=msgData.wasmModule;createWasm();run()}else if(cmd==="run"){establishStackSpace(msgData.pthread_ptr);__emscripten_thread_init(msgData.pthread_ptr,0,0,1,0,0);PThread.threadInitTLS();__emscripten_thread_mailbox_await(msgData.pthread_ptr);if(!initializedJS){initializedJS=true}try{await invokeEntryPoint(msgData.start_routine,msgData.arg)}catch(ex){if(ex!="unwind"){throw ex}}}else if(msgData.target==="setimmediate"){}else if(cmd==="checkMailbox"){if(initializedJS){checkMailbox()}}else if(cmd){err(`worker: received unknown command ${cmd}`);err(msgData)}}catch(ex){__emscripten_thread_crashed();throw ex}}self.onmessage=handleMessage}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function initMemory(){if(ENVIRONMENT_IS_PTHREAD){return}if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||134217728;wasmMemory=new WebAssembly.Memory({initial:BigInt(INITIAL_MEMORY/65536),maximum:65536n,shared:true,address:"i64"})}updateMemoryViews()}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return startWorker();if(!Module["noFSInit"]&&!FS.initialized)FS.init();TTY.init();wasmExports["__wasm_call_ctors"]();FS.ignorePermissions=false}function preMain(){}function postRun(){if(ENVIRONMENT_IS_PTHREAD){return}if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";if(runtimeInitialized){___trap()}var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("wllama.wasm")}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){assignWasmImports();if(!wasmImports.__instrumented){wasmImports.__instrumented=true;Asyncify.instrumentWasmImports(wasmImports)}var imports={env:wasmImports,wasi_snapshot_preview1:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=Asyncify.instrumentWasmExports(wasmExports);wasmExports=applySignatureConversions(wasmExports);registerTLSInit(wasmExports["_emscripten_tls_init"]);assignWasmExports(wasmExports);wasmModule=module;removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"],result["module"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}if(ENVIRONMENT_IS_PTHREAD){var instance=new WebAssembly.Instance(wasmModule,getWasmImports());return receiveInstance(instance,wasmModule)}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var terminateWorker=worker=>{worker.terminate();worker.onmessage=e=>{}};var cleanupThread=pthread_ptr=>{var worker=PThread.pthreads[pthread_ptr];PThread.returnWorkerToPool(worker)};var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var runDependencies=0;var dependenciesFulfilled=null;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}};var addRunDependency=id=>{runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)};var spawnThread=threadParams=>{var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);PThread.pthreads[threadParams.pthread_ptr]=worker;worker.pthread_ptr=threadParams.pthread_ptr;var msg={cmd:"run",start_routine:threadParams.startRoutine,arg:threadParams.arg,pthread_ptr:threadParams.pthread_ptr};if(ENVIRONMENT_IS_NODE){worker.unref()}worker.postMessage(msg,threadParams.transferList);return 0};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var stackSave=()=>_emscripten_stack_get_current();var stackRestore=val=>__emscripten_stack_restore(val);var stackAlloc=sz=>__emscripten_stack_alloc(sz);var proxyToMainThread=(funcIndex,emAsmAddr,sync,...callArgs)=>{var serializedNumCallArgs=callArgs.length*2;var sp=stackSave();var args=stackAlloc(serializedNumCallArgs*8);var b=args/8;for(var i=0;i{EXITSTATUS=status;if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}_proc_exit(status)};var _exit=exitJS;var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],pthreads:{},init(){if(!ENVIRONMENT_IS_PTHREAD){PThread.initMainThread()}},initMainThread(){var pthreadPoolSize=Module["pthreadPoolSize"];while(pthreadPoolSize--){PThread.allocateUnusedWorker()}addOnPreRun(async()=>{var pthreadPoolReady=PThread.loadWasmModuleToAllWorkers();addRunDependency("loading-workers");await pthreadPoolReady;removeRunDependency("loading-workers")})},terminateAllThreads:()=>{for(var worker of PThread.runningWorkers){terminateWorker(worker)}for(var worker of PThread.unusedWorkers){terminateWorker(worker)}PThread.unusedWorkers=[];PThread.runningWorkers=[];PThread.pthreads={}},returnWorkerToPool:worker=>{var pthread_ptr=worker.pthread_ptr;delete PThread.pthreads[pthread_ptr];PThread.unusedWorkers.push(worker);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1);worker.pthread_ptr=0;__emscripten_thread_free_data(pthread_ptr)},threadInitTLS(){PThread.tlsInitFunctions.forEach(f=>f())},loadWasmModuleToWorker:worker=>new Promise(onFinishedLoading=>{worker.onmessage=e=>{var d=e["data"];var cmd=d.cmd;if(d.targetThread&&d.targetThread!=_pthread_self()){var targetWorker=PThread.pthreads[d.targetThread];if(targetWorker){targetWorker.postMessage(d,d.transferList)}else{err(`Internal error! Worker sent a message "${cmd}" to target pthread ${d.targetThread}, but that thread no longer exists!`)}return}if(cmd==="checkMailbox"){checkMailbox()}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){callUserCallback(()=>cleanupThread(d.thread))}else if(cmd==="loaded"){worker.loaded=true;if(ENVIRONMENT_IS_NODE&&!worker.pthread_ptr){worker.unref()}onFinishedLoading(worker)}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="uncaughtException"){worker.onerror(d.error)}else if(cmd==="callHandler"){Module[d.handler](...d.args)}else if(cmd){err(`worker sent an unknown command ${cmd}`)}};worker.onerror=e=>{var message="worker sent an error!";err(`${message} ${e.filename}:${e.lineno}: ${e.message}`);throw e};if(ENVIRONMENT_IS_NODE){worker.on("message",data=>worker.onmessage({data}));worker.on("error",e=>worker.onerror(e))}var handlers=[];var knownHandlers=["onExit","onAbort","print","printErr"];for(var handler of knownHandlers){if(Module.propertyIsEnumerable(handler)){handlers.push(handler)}}worker.postMessage({cmd:"load",handlers,wasmMemory,wasmModule})}),async loadWasmModuleToAllWorkers(){if(ENVIRONMENT_IS_PTHREAD){return}let pthreadPoolReady=Promise.all(PThread.unusedWorkers.map(PThread.loadWasmModuleToWorker));return pthreadPoolReady},allocateUnusedWorker(){var worker;var pthreadMainJs=_scriptName;if(Module["mainScriptUrlOrBlob"]){pthreadMainJs=Module["mainScriptUrlOrBlob"];if(typeof pthreadMainJs!="string"){pthreadMainJs=URL.createObjectURL(pthreadMainJs)}}worker=new Worker(pthreadMainJs,{workerData:"em-pthread",name:"em-pthread"});PThread.unusedWorkers.push(worker)},getNewWorker(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);function establishStackSpace(pthread_ptr){var stackHigh=Number((growMemViews(),HEAPU64)[(pthread_ptr+88)/8]);var stackSize=Number((growMemViews(),HEAPU64)[(pthread_ptr+96)/8]);var stackLow=stackHigh-stackSize;_emscripten_stack_set_limits(stackHigh,stackLow);stackRestore(stackHigh)}var wasmTableMirror=[];var getWasmTableEntry=funcPtr=>{funcPtr=Number(funcPtr);var func=wasmTableMirror[funcPtr];if(!func){wasmTableMirror[funcPtr]=func=wasmTable.get(BigInt(funcPtr));if(Asyncify.isAsyncExport(func)){wasmTableMirror[funcPtr]=func=Asyncify.makeAsyncFunction(func)}}return func};var invokeEntryPoint=async(ptr,arg)=>{runtimeKeepaliveCounter=0;noExitRuntime=0;var result=(a1=>WebAssembly.promising(getWasmTableEntry(ptr)).call(null,BigInt(a1)))(arg);function finish(result){if(keepRuntimeAlive()){EXITSTATUS=result;return}__emscripten_thread_exit(result)}result=await result;finish(result)};invokeEntryPoint.isAsync=true;var noExitRuntime=true;var registerTLSInit=tlsInitFunc=>PThread.tlsInitFunctions.push(tlsInitFunc);var wasmMemory;function pthreadCreateProxied(pthread_ptr,attr,startRoutine,arg){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(2,0,1,pthread_ptr,attr,startRoutine,arg);return ___pthread_create_js(pthread_ptr,attr,startRoutine,arg)}var _emscripten_has_threading_support=()=>!!globalThis.SharedArrayBuffer;var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function ___pthread_create_js(pthread_ptr,attr,startRoutine,arg){pthread_ptr=bigintToI53Checked(pthread_ptr);attr=bigintToI53Checked(attr);startRoutine=bigintToI53Checked(startRoutine);arg=bigintToI53Checked(arg);if(!_emscripten_has_threading_support()){return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return pthreadCreateProxied(pthread_ptr,attr,startRoutine,arg)}if(error)return error;var threadParams={startRoutine,pthread_ptr,arg,transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}var syscallGetVarargP=()=>{var ret=Number((growMemViews(),HEAPU64)[SYSCALLS.varargs/8]);SYSCALLS.varargs+=8;return ret};var syscallGetVarargI=()=>{var ret=(growMemViews(),HEAP32)[+SYSCALLS.varargs/4];SYSCALLS.varargs+=4;return ret};var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.slice(0,-1)}return root+dir},basename:path=>path&&path.match(/([^\\/]+|\\/)\\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>view=>view.set(crypto.getRandomValues(new Uint8Array(view.byteLength)));var randomFill=view=>{(randomFill=initRandomFill())(view)};var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.buffer instanceof ArrayBuffer?heapOrArray.subarray(idx,endPtr):heapOrArray.slice(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var intArrayFromString=(stringy,dontAddNull,length)=>{var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}}else if(globalThis.window?.prompt){result=window.prompt("Input: ");if(result!==null){result+="\\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[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]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var zeroMemory=(ptr,size)=>(growMemViews(),HEAPU8).fill(0,ptr,ptr+size);var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(ptr)zeroMemory(ptr,size);return ptr};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]!=null){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){if(!MEMFS.doesNotExistError){MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack=""}throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(...args)=>FS.createDataFile(...args);var getUniqueRunDependency=id=>id;var preloadPlugins=[];var FS_handledByPreloadPlugin=async(byteArray,fullname)=>{if(typeof Browser!="undefined")Browser.init();for(var plugin of preloadPlugins){if(plugin["canHandle"](fullname)){return plugin["handle"](byteArray,fullname)}}return byteArray};var FS_preloadFile=async(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);addRunDependency(dep);try{var byteArray=url;if(typeof url=="string"){byteArray=await asyncLoad(url)}byteArray=await FS_handledByPreloadPlugin(byteArray,fullname);preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}}finally{removeRunDependency(dep)}};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{FS_preloadFile(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish).then(onload).catch(onerror)};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,filesystems:null,syncFSRequests:0,readFiles:{},ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var arg=setattr?stream:node;setattr??=node.node_ops.setattr;FS.checkOpExists(setattr,63);setattr(arg,attr)},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}for(var mount of mounts){if(mount.type.syncfs){mount.type.syncfs(mount,populate,done)}else{done(null)}}},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);for(var[hash,current]of Object.entries(FS.nameTable)){while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}}node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name){throw new FS.ErrnoError(28)}if(name==="."||name===".."){throw new FS.ErrnoError(20)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)},statfsStream(stream){return FS.statfsNode(stream.node)},statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};if(node.node_ops.statfs){Object.assign(rtn,node.node_ops.statfs(node.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name);old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var readdir=FS.checkOpExists(node.node_ops.readdir,54);return readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return link.node_ops.readlink(link)},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;var getattr=FS.checkOpExists(node.node_ops.getattr,63);return getattr(node)},fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var getattr=stream.stream_ops.getattr;var arg=getattr?stream:node;getattr??=node.node_ops.getattr;FS.checkOpExists(getattr,63);return getattr(arg)},lstat(path){return FS.stat(path,true)},doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode&4095|node.mode&~4095,ctime:Date.now(),dontFollow})},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChmod(null,node,mode,dontFollow)},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,stream.node,mode,false)},doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date.now(),dontFollow})},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChown(null,node,dontFollow)},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,stream.node,false)},doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}FS.doSetAttr(stream,node,{size:len,timestamp:Date.now()})},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}FS.doTruncate(null,node,len)},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.doTruncate(stream,stream.node,len)},utime(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var setattr=FS.checkOpExists(node.node_ops.setattr,63);setattr(node,{atime,mtime})},open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS_modeStringToFlags(flags):flags;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;var isDirPath;if(typeof path=="object"){node=path}else{isDirPath=path.endsWith("/");var lookup=FS.lookupPath(path,{follow:!(flags&131072),noent_okay:true});node=lookup.node;path=lookup.path}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else if(isDirPath){throw new FS.ErrnoError(31)}else{node=FS.mknod(path,mode|511,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node,path:FS.getPath(node),flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(created){FS.chmod(node,mode&511)}if(Module["logReadFiles"]&&!(flags&1)){if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},mmap(stream,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}if(!length){throw new FS.ErrnoError(28)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){abort(`Invalid encoding type "${opts.encoding}"`)}var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){buf=UTF8ArrayToString(buf)}FS.close(stream);return buf},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){data=new Uint8Array(intArrayFromString(data,true))}if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{abort("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomFill(randomBuffer);randomLeft=randomBuffer.byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS.close(stream)}}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){if(e.errno!=20)throw e}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort("Couldn\'t load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)abort("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)abort("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort("Couldn\'t load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")abort("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(globalThis.XMLHttpRequest){if(!ENVIRONMENT_IS_WORKER)abort("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};for(const[key,fn]of Object.entries(node.stream_ops)){stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}}function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,(growMemViews(),HEAP8),ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString((growMemViews(),HEAPU8),ptr,maxBytesToRead,ignoreNul):"";var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},writeStat(buf,stat){(growMemViews(),HEAPU32)[buf/4]=stat.dev;(growMemViews(),HEAPU32)[(buf+4)/4]=stat.mode;(growMemViews(),HEAPU64)[(buf+8)/8]=BigInt(stat.nlink);(growMemViews(),HEAPU32)[(buf+16)/4]=stat.uid;(growMemViews(),HEAPU32)[(buf+20)/4]=stat.gid;(growMemViews(),HEAPU32)[(buf+24)/4]=stat.rdev;(growMemViews(),HEAP64)[(buf+32)/8]=BigInt(stat.size);(growMemViews(),HEAP32)[(buf+40)/4]=4096;(growMemViews(),HEAP32)[(buf+44)/4]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();(growMemViews(),HEAP64)[(buf+48)/8]=BigInt(Math.floor(atime/1e3));(growMemViews(),HEAPU64)[(buf+56)/8]=BigInt(atime%1e3*1e3*1e3);(growMemViews(),HEAP64)[(buf+64)/8]=BigInt(Math.floor(mtime/1e3));(growMemViews(),HEAPU64)[(buf+72)/8]=BigInt(mtime%1e3*1e3*1e3);(growMemViews(),HEAP64)[(buf+80)/8]=BigInt(Math.floor(ctime/1e3));(growMemViews(),HEAPU64)[(buf+88)/8]=BigInt(ctime%1e3*1e3*1e3);(growMemViews(),HEAP64)[(buf+96)/8]=BigInt(stat.ino);return 0},writeStatFs(buf,stats){(growMemViews(),HEAPU32)[(buf+8)/4]=stats.bsize;(growMemViews(),HEAPU32)[(buf+72)/4]=stats.bsize;(growMemViews(),HEAP64)[(buf+16)/8]=BigInt(stats.blocks);(growMemViews(),HEAP64)[(buf+24)/8]=BigInt(stats.bfree);(growMemViews(),HEAP64)[(buf+32)/8]=BigInt(stats.bavail);(growMemViews(),HEAP64)[(buf+40)/8]=BigInt(stats.files);(growMemViews(),HEAP64)[(buf+48)/8]=BigInt(stats.ffree);(growMemViews(),HEAPU32)[(buf+56)/4]=stats.fsid;(growMemViews(),HEAPU32)[(buf+80)/4]=stats.flags;(growMemViews(),HEAPU32)[(buf+64)/4]=stats.namelen},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=(growMemViews(),HEAPU8).slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_fcntl64(fd,cmd,varargs){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(3,0,1,fd,cmd,varargs);varargs=bigintToI53Checked(varargs);SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();stream.flags|=arg;return 0}case 5:{var arg=syscallGetVarargP();var offset=0;(growMemViews(),HEAP16)[(arg+offset)/2]=2;return 0}case 6:case 7:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fstat64(fd,buf){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(4,0,1,fd,buf);buf=bigintToI53Checked(buf);try{return SYSCALLS.writeStat(buf,FS.fstat(fd))}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,(growMemViews(),HEAPU8),outPtr,maxBytesToWrite);function ___syscall_getcwd(buf,size){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(5,0,1,buf,size);buf=bigintToI53Checked(buf);size=bigintToI53Checked(size);try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(sizeabort("");function __emscripten_init_main_thread_js(tb){tb=bigintToI53Checked(tb);__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB,5242880,false);PThread.threadInitTLS()}var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var maybeExit=()=>{if(!keepRuntimeAlive()){try{if(ENVIRONMENT_IS_PTHREAD){if(_pthread_self())__emscripten_thread_exit(EXITSTATUS);return}_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};function __emscripten_thread_mailbox_await(pthread_ptr){pthread_ptr=bigintToI53Checked(pthread_ptr);if(Atomics.waitAsync){var wait=Atomics.waitAsync((growMemViews(),HEAP32),pthread_ptr/4,pthread_ptr);wait.value.then(checkMailbox);var waitingAsync=pthread_ptr+228;Atomics.store((growMemViews(),HEAP32),waitingAsync/4,1)}}var checkMailbox=()=>callUserCallback(()=>{var pthread_ptr=_pthread_self();if(pthread_ptr){__emscripten_thread_mailbox_await(pthread_ptr);__emscripten_check_mailbox()}});function __emscripten_notify_mailbox_postmessage(targetThread,currThreadId){targetThread=bigintToI53Checked(targetThread);currThreadId=bigintToI53Checked(currThreadId);if(targetThread==currThreadId){setTimeout(checkMailbox)}else if(ENVIRONMENT_IS_PTHREAD){postMessage({targetThread,cmd:"checkMailbox"})}else{var worker=PThread.pthreads[targetThread];if(!worker){return}worker.postMessage({cmd:"checkMailbox"})}}var proxiedJSCallArgs=[];function __emscripten_receive_on_main_thread_js(funcIndex,emAsmAddr,callingThread,numCallArgs,args){emAsmAddr=bigintToI53Checked(emAsmAddr);callingThread=bigintToI53Checked(callingThread);args=bigintToI53Checked(args);numCallArgs/=2;proxiedJSCallArgs.length=numCallArgs;var b=args/8;for(var i=0;iyear%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time,tmPtr){time=bigintToI53Checked(time);tmPtr=bigintToI53Checked(tmPtr);var date=new Date(time*1e3);(growMemViews(),HEAP32)[tmPtr/4]=date.getSeconds();(growMemViews(),HEAP32)[(tmPtr+4)/4]=date.getMinutes();(growMemViews(),HEAP32)[(tmPtr+8)/4]=date.getHours();(growMemViews(),HEAP32)[(tmPtr+12)/4]=date.getDate();(growMemViews(),HEAP32)[(tmPtr+16)/4]=date.getMonth();(growMemViews(),HEAP32)[(tmPtr+20)/4]=date.getFullYear()-1900;(growMemViews(),HEAP32)[(tmPtr+24)/4]=date.getDay();var yday=ydayFromDate(date)|0;(growMemViews(),HEAP32)[(tmPtr+28)/4]=yday;(growMemViews(),HEAP64)[(tmPtr+40)/8]=BigInt(-(date.getTimezoneOffset()*60));var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;(growMemViews(),HEAP32)[(tmPtr+32)/4]=dst}function __mmap_js(len,prot,flags,fd,offset,allocated,addr){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(12,0,1,len,prot,flags,fd,offset,allocated,addr);len=bigintToI53Checked(len);offset=bigintToI53Checked(offset);allocated=bigintToI53Checked(allocated);addr=bigintToI53Checked(addr);try{var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;(growMemViews(),HEAP32)[allocated/4]=res.allocated;(growMemViews(),HEAPU64)[addr/8]=BigInt(ptr);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function __munmap_js(addr,len,prot,flags,fd,offset){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(13,0,1,addr,len,prot,flags,fd,offset);addr=bigintToI53Checked(addr);len=bigintToI53Checked(len);offset=bigintToI53Checked(offset);try{var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __tzset_js=function(timezone,daylight,std_name,dst_name){timezone=bigintToI53Checked(timezone);daylight=bigintToI53Checked(daylight);std_name=bigintToI53Checked(std_name);dst_name=bigintToI53Checked(dst_name);var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);(growMemViews(),HEAPU64)[timezone/8]=BigInt(stdTimezoneOffset*60);(growMemViews(),HEAP32)[daylight/4]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffsetperformance.timeOrigin+performance.now();var _emscripten_date_now=()=>Date.now();var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;function _clock_time_get(clk_id,ignored_precision,ptime){ignored_precision=bigintToI53Checked(ignored_precision);ptime=bigintToI53Checked(ptime);if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);(growMemViews(),HEAP64)[ptime/8]=BigInt(nsec);return 0}var _emscripten_check_blocking_allowed=()=>{};var runtimeKeepalivePush=()=>{runtimeKeepaliveCounter+=1};var _emscripten_exit_with_live_runtime=()=>{runtimeKeepalivePush();throw"unwind"};var jsStackTrace=()=>(new Error).stack.toString();var getCallstack=flags=>{var callstack=jsStackTrace();var lines=callstack.split("\\n");callstack="";var firefoxRe=new RegExp("\\\\s*(.*?)@(.*?):([0-9]+):([0-9]+)");var chromeRe=new RegExp("\\\\s*at (.*?) \\\\((.*):(.*):(.*)\\\\)");for(var line of lines){var symbolName="";var file="";var lineno=0;var column=0;var parts=chromeRe.exec(line);if(parts?.length==5){symbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]}else{parts=firefoxRe.exec(line);if(parts?.length>=4){symbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]|0}else{callstack+=line+"\\n";continue}}if(symbolName=="_emscripten_log"||symbolName=="_emscripten_get_callstack"){callstack="";continue}if(flags&24){if(flags&64){file=file.substring(file.replace(/\\\\/g,"/").lastIndexOf("/")+1)}callstack+=` at ${symbolName} (${file}:${lineno}:${column})\\n`}}callstack=callstack.replace(/\\s+$/,"");return callstack};function _emscripten_get_callstack(flags,str,maxbytes){str=bigintToI53Checked(str);var callstack=getCallstack(flags);if(!str||maxbytes<=0){return lengthBytesUTF8(callstack)+1}var bytesWrittenExcludingNull=stringToUTF8(callstack,str,maxbytes);return bytesWrittenExcludingNull+1}var getHeapMax=()=>4294967296;var _emscripten_get_heap_max=()=>BigInt(getHeapMax());var _emscripten_has_asyncify=()=>2;var _emscripten_num_logical_cores=()=>ENVIRONMENT_IS_NODE?require("os").cpus().length:navigator["hardwareConcurrency"];var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(BigInt(pages));updateMemoryViews();return 1}catch(e){}};function _emscripten_resize_heap(requestedSize){requestedSize=bigintToI53Checked(requestedSize);var oldSize=(growMemViews(),HEAPU8).length;if(requestedSize<=oldSize){return false}var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false}var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var writeI53ToI64=(ptr,num)=>{(growMemViews(),HEAPU32)[ptr/4]=num;var lower=(growMemViews(),HEAPU32)[ptr/4];(growMemViews(),HEAPU32)[(ptr+4)/4]=(num-lower)/4294967296};var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var readI53FromI64=ptr=>(growMemViews(),HEAPU32)[ptr/4]+(growMemViews(),HEAP32)[(ptr+4)/4]*4294967296;var WebGPU={Internals:{jsObjects:[],jsObjectInsert:(ptr,jsObject)=>{WebGPU.Internals.jsObjects[ptr]=jsObject},bufferOnUnmaps:[],futures:[],futureInsert:(futureId,promise)=>{WebGPU.Internals.futures[futureId]=new Promise(resolve=>promise.finally(()=>resolve(futureId)))}},getJsObject:ptr=>{if(!ptr)return undefined;return WebGPU.Internals.jsObjects[ptr]},importJsAdapter:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateAdapter(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsBindGroup:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateBindGroup(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsBindGroupLayout:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateBindGroupLayout(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsBuffer:(buffer,parentPtr=0)=>{assert(buffer.mapState==="unmapped");var bufferPtr=_emwgpuCreateBuffer(parentPtr);WebGPU.Internals.jsObjectInsert(bufferPtr,buffer);return bufferPtr},importJsCommandBuffer:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateCommandBuffer(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsCommandEncoder:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateCommandEncoder(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsComputePassEncoder:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateComputePassEncoder(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsComputePipeline:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateComputePipeline(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsDevice:(device,parentPtr=0)=>{var queuePtr=_emwgpuCreateQueue(parentPtr);var devicePtr=_emwgpuCreateDevice(parentPtr,queuePtr);WebGPU.Internals.jsObjectInsert(queuePtr,device.queue);WebGPU.Internals.jsObjectInsert(devicePtr,device);return devicePtr},importJsExternalTexture:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateExternalTexture(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsPipelineLayout:(obj,parentPtr=0)=>{var ptr=_emwgpuCreatePipelineLayout(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsQuerySet:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateQuerySet(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsQueue:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateQueue(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsRenderBundle:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateRenderBundle(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsRenderBundleEncoder:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateRenderBundleEncoder(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsRenderPassEncoder:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateRenderPassEncoder(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsRenderPipeline:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateRenderPipeline(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsSampler:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateSampler(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsShaderModule:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateShaderModule(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsSurface:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateSurface(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsTexture:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateTexture(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},importJsTextureView:(obj,parentPtr=0)=>{var ptr=_emwgpuCreateTextureView(parentPtr);WebGPU.Internals.jsObjects[ptr]=obj;return ptr},errorCallback:(callback,type,message,userdata)=>{var sp=stackSave();var messagePtr=stringToUTF8OnStack(message);((a1,a2,a3)=>getWasmTableEntry(callback).call(null,a1,BigInt(a2),BigInt(a3)))(type,BigInt(messagePtr),userdata);stackRestore(sp)},iterateExtensions:(root,handlers)=>{for(var ptr=Number((growMemViews(),HEAPU64)[root/8]);ptr;ptr=Number((growMemViews(),HEAPU64)[ptr/8])){var sType=(growMemViews(),HEAP32)[(ptr+8)/4];var handler=handlers[sType](ptr)}},setStringView:(ptr,data,length)=>{(growMemViews(),HEAPU64)[ptr/8]=BigInt(data);(growMemViews(),HEAPU64)[(ptr+8)/8]=BigInt(length)},makeStringFromStringView:stringViewPtr=>{var ptr=Number((growMemViews(),HEAPU64)[stringViewPtr/8]);var length=Number((growMemViews(),HEAPU64)[(stringViewPtr+8)/8]);return UTF8ToString(ptr,length)},makeStringFromOptionalStringView:stringViewPtr=>{var ptr=Number((growMemViews(),HEAPU64)[stringViewPtr/8]);var length=Number((growMemViews(),HEAPU64)[(stringViewPtr+8)/8]);if(!ptr){if(length===0){return""}return undefined}return UTF8ToString(ptr,length)},makeColor:ptr=>({r:(growMemViews(),HEAPF64)[ptr/8],g:(growMemViews(),HEAPF64)[(ptr+8)/8],b:(growMemViews(),HEAPF64)[(ptr+16)/8],a:(growMemViews(),HEAPF64)[(ptr+24)/8]}),makeExtent3D:ptr=>({width:(growMemViews(),HEAPU32)[ptr/4],height:(growMemViews(),HEAPU32)[(ptr+4)/4],depthOrArrayLayers:(growMemViews(),HEAPU32)[(ptr+8)/4]}),makeOrigin3D:ptr=>({x:(growMemViews(),HEAPU32)[ptr/4],y:(growMemViews(),HEAPU32)[(ptr+4)/4],z:(growMemViews(),HEAPU32)[(ptr+8)/4]}),makeTexelCopyTextureInfo:ptr=>({texture:WebGPU.getJsObject(Number((growMemViews(),HEAPU64)[ptr/8])),mipLevel:(growMemViews(),HEAPU32)[(ptr+8)/4],origin:WebGPU.makeOrigin3D(ptr+12),aspect:WebGPU.TextureAspect[(growMemViews(),HEAP32)[(ptr+24)/4]]}),makeTexelCopyBufferLayout:ptr=>{var bytesPerRow=(growMemViews(),HEAPU32)[(ptr+8)/4];var rowsPerImage=(growMemViews(),HEAPU32)[(ptr+12)/4];return{offset:readI53FromI64(ptr),bytesPerRow:bytesPerRow===4294967295?undefined:bytesPerRow,rowsPerImage:rowsPerImage===4294967295?undefined:rowsPerImage}},makeTexelCopyBufferInfo:ptr=>{var layoutPtr=ptr+0;var bufferCopyView=WebGPU.makeTexelCopyBufferLayout(layoutPtr);bufferCopyView["buffer"]=WebGPU.getJsObject(Number((growMemViews(),HEAPU64)[(ptr+16)/8]));return bufferCopyView},makePassTimestampWrites:ptr=>{if(ptr===0)return undefined;return{querySet:WebGPU.getJsObject(Number((growMemViews(),HEAPU64)[(ptr+8)/8])),beginningOfPassWriteIndex:(growMemViews(),HEAPU32)[(ptr+16)/4],endOfPassWriteIndex:(growMemViews(),HEAPU32)[(ptr+20)/4]}},makePipelineConstants:(constantCount,constantsPtr)=>{if(!constantCount)return;var constants={};for(var i=0;i{if(!layoutPtr)return"auto";return WebGPU.getJsObject(layoutPtr)},makeComputeState:ptr=>{if(!ptr)return undefined;var desc={module:WebGPU.getJsObject(Number((growMemViews(),HEAPU64)[(ptr+8)/8])),constants:WebGPU.makePipelineConstants(Number((growMemViews(),HEAPU64)[(ptr+32)/8]),Number((growMemViews(),HEAPU64)[(ptr+40)/8])),entryPoint:WebGPU.makeStringFromOptionalStringView(ptr+16)};return desc},makeComputePipelineDesc:descriptor=>{var desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+8),layout:WebGPU.makePipelineLayout(Number((growMemViews(),HEAPU64)[(descriptor+24)/8])),compute:WebGPU.makeComputeState(descriptor+32)};return desc},makeRenderPipelineDesc:descriptor=>{function makePrimitiveState(psPtr){if(!psPtr)return undefined;return{topology:WebGPU.PrimitiveTopology[(growMemViews(),HEAP32)[(psPtr+8)/4]],stripIndexFormat:WebGPU.IndexFormat[(growMemViews(),HEAP32)[(psPtr+12)/4]],frontFace:WebGPU.FrontFace[(growMemViews(),HEAP32)[(psPtr+16)/4]],cullMode:WebGPU.CullMode[(growMemViews(),HEAP32)[(psPtr+20)/4]],unclippedDepth:!!(growMemViews(),HEAPU32)[(psPtr+24)/4]}}function makeBlendComponent(bdPtr){if(!bdPtr)return undefined;return{operation:WebGPU.BlendOperation[(growMemViews(),HEAP32)[bdPtr/4]],srcFactor:WebGPU.BlendFactor[(growMemViews(),HEAP32)[(bdPtr+4)/4]],dstFactor:WebGPU.BlendFactor[(growMemViews(),HEAP32)[(bdPtr+8)/4]]}}function makeBlendState(bsPtr){if(!bsPtr)return undefined;return{alpha:makeBlendComponent(bsPtr+12),color:makeBlendComponent(bsPtr+0)}}function makeColorState(csPtr){var format=WebGPU.TextureFormat[(growMemViews(),HEAP32)[(csPtr+8)/4]];return format?{format,blend:makeBlendState(Number((growMemViews(),HEAPU64)[(csPtr+16)/8])),writeMask:(growMemViews(),HEAPU32)[(csPtr+24)/4]}:undefined}function makeColorStates(count,csArrayPtr){var states=[];for(var i=0;i{var nextInChainPtr=Number((growMemViews(),HEAPU64)[limitsOutPtr/8]);function setLimitValueU32(name,basePtr,limitOffset,fallbackValue=0){var limitValue=limits[name]??fallbackValue;(growMemViews(),HEAPU32)[(basePtr+limitOffset)/4]=limitValue}function setLimitValueU64(name,basePtr,limitOffset,fallbackValue=0){var limitValue=limits[name]??fallbackValue;writeI53ToI64(basePtr+limitOffset,limitValue)}setLimitValueU32("maxTextureDimension1D",limitsOutPtr,8);setLimitValueU32("maxTextureDimension2D",limitsOutPtr,12);setLimitValueU32("maxTextureDimension3D",limitsOutPtr,16);setLimitValueU32("maxTextureArrayLayers",limitsOutPtr,20);setLimitValueU32("maxBindGroups",limitsOutPtr,24);setLimitValueU32("maxBindGroupsPlusVertexBuffers",limitsOutPtr,28);setLimitValueU32("maxBindingsPerBindGroup",limitsOutPtr,32);setLimitValueU32("maxDynamicUniformBuffersPerPipelineLayout",limitsOutPtr,36);setLimitValueU32("maxDynamicStorageBuffersPerPipelineLayout",limitsOutPtr,40);setLimitValueU32("maxSampledTexturesPerShaderStage",limitsOutPtr,44);setLimitValueU32("maxSamplersPerShaderStage",limitsOutPtr,48);setLimitValueU32("maxStorageBuffersPerShaderStage",limitsOutPtr,52);setLimitValueU32("maxStorageTexturesPerShaderStage",limitsOutPtr,56);setLimitValueU32("maxUniformBuffersPerShaderStage",limitsOutPtr,60);setLimitValueU32("minUniformBufferOffsetAlignment",limitsOutPtr,80);setLimitValueU32("minStorageBufferOffsetAlignment",limitsOutPtr,84);setLimitValueU64("maxUniformBufferBindingSize",limitsOutPtr,64);setLimitValueU64("maxStorageBufferBindingSize",limitsOutPtr,72);setLimitValueU32("maxVertexBuffers",limitsOutPtr,88);setLimitValueU64("maxBufferSize",limitsOutPtr,96);setLimitValueU32("maxVertexAttributes",limitsOutPtr,104);setLimitValueU32("maxVertexBufferArrayStride",limitsOutPtr,108);setLimitValueU32("maxInterStageShaderVariables",limitsOutPtr,112);setLimitValueU32("maxColorAttachments",limitsOutPtr,116);setLimitValueU32("maxColorAttachmentBytesPerSample",limitsOutPtr,120);setLimitValueU32("maxComputeWorkgroupStorageSize",limitsOutPtr,124);setLimitValueU32("maxComputeInvocationsPerWorkgroup",limitsOutPtr,128);setLimitValueU32("maxComputeWorkgroupSizeX",limitsOutPtr,132);setLimitValueU32("maxComputeWorkgroupSizeY",limitsOutPtr,136);setLimitValueU32("maxComputeWorkgroupSizeZ",limitsOutPtr,140);setLimitValueU32("maxComputeWorkgroupsPerDimension",limitsOutPtr,144);setLimitValueU32("maxImmediateSize",limitsOutPtr,148);if(nextInChainPtr!==0){var sType=(growMemViews(),HEAP32)[(nextInChainPtr+8)/4];var compatibilityModeLimitsPtr=nextInChainPtr;setLimitValueU32("maxStorageBuffersInVertexStage",compatibilityModeLimitsPtr,16,limits.maxStorageBuffersPerShaderStage);setLimitValueU32("maxStorageBuffersInFragmentStage",compatibilityModeLimitsPtr,24,limits.maxStorageBuffersPerShaderStage);setLimitValueU32("maxStorageTexturesInVertexStage",compatibilityModeLimitsPtr,20,limits.maxStorageTexturesPerShaderStage);setLimitValueU32("maxStorageTexturesInFragmentStage",compatibilityModeLimitsPtr,28,limits.maxStorageTexturesPerShaderStage)}},fillAdapterInfoStruct:(info,infoStruct)=>{(growMemViews(),HEAPU32)[(infoStruct+88)/4]=info.subgroupMinSize;(growMemViews(),HEAPU32)[(infoStruct+92)/4]=info.subgroupMaxSize;var strs=info.vendor+info.architecture+info.device+info.description;var strPtr=stringToNewUTF8(strs);var vendorLen=lengthBytesUTF8(info.vendor);WebGPU.setStringView(infoStruct+8,strPtr,vendorLen);strPtr+=vendorLen;var architectureLen=lengthBytesUTF8(info.architecture);WebGPU.setStringView(infoStruct+24,strPtr,architectureLen);strPtr+=architectureLen;var deviceLen=lengthBytesUTF8(info.device);WebGPU.setStringView(infoStruct+40,strPtr,deviceLen);strPtr+=deviceLen;var descriptionLen=lengthBytesUTF8(info.description);WebGPU.setStringView(infoStruct+56,strPtr,descriptionLen);strPtr+=descriptionLen;(growMemViews(),HEAP32)[(infoStruct+72)/4]=2;var adapterType=info.isFallbackAdapter?3:4;(growMemViews(),HEAP32)[(infoStruct+76)/4]=adapterType;(growMemViews(),HEAPU32)[(infoStruct+80)/4]=0;(growMemViews(),HEAPU32)[(infoStruct+84)/4]=0},AddressMode:[,"clamp-to-edge","repeat","mirror-repeat"],BlendFactor:[,"zero","one","src","one-minus-src","src-alpha","one-minus-src-alpha","dst","one-minus-dst","dst-alpha","one-minus-dst-alpha","src-alpha-saturated","constant","one-minus-constant","src1","one-minus-src1","src1-alpha","one-minus-src1-alpha"],BlendOperation:[,"add","subtract","reverse-subtract","min","max"],BufferBindingType:[,,"uniform","storage","read-only-storage"],BufferMapState:[,"unmapped","pending","mapped"],CompareFunction:[,"never","less","equal","less-equal","greater","not-equal","greater-equal","always"],CompilationInfoRequestStatus:[,"success","callback-cancelled"],ComponentSwizzle:[,"0","1","r","g","b","a"],CompositeAlphaMode:[,"opaque","premultiplied","unpremultiplied","inherit"],CullMode:[,"none","front","back"],ErrorFilter:[,"validation","out-of-memory","internal"],FeatureLevel:[,"compatibility","core"],FeatureName:{1:"core-features-and-limits",2:"depth-clip-control",3:"depth32float-stencil8",4:"texture-compression-bc",5:"texture-compression-bc-sliced-3d",6:"texture-compression-etc2",7:"texture-compression-astc",8:"texture-compression-astc-sliced-3d",9:"timestamp-query",10:"indirect-first-instance",11:"shader-f16",12:"rg11b10ufloat-renderable",13:"bgra8unorm-storage",14:"float32-filterable",15:"float32-blendable",16:"clip-distances",17:"dual-source-blending",18:"subgroups",19:"texture-formats-tier1",20:"texture-formats-tier2",21:"primitive-index",22:"texture-component-swizzle",327692:"chromium-experimental-unorm16-texture-formats",327729:"chromium-experimental-multi-draw-indirect"},FilterMode:[,"nearest","linear"],FrontFace:[,"ccw","cw"],IndexFormat:[,"uint16","uint32"],InstanceFeatureName:[,"timed-wait-any","shader-source-spirv","multiple-devices-per-adapter"],LoadOp:[,"load","clear"],MipmapFilterMode:[,"nearest","linear"],OptionalBool:["false","true"],PowerPreference:[,"low-power","high-performance"],PredefinedColorSpace:[,"srgb","display-p3"],PrimitiveTopology:[,"point-list","line-list","line-strip","triangle-list","triangle-strip"],QueryType:[,"occlusion","timestamp"],SamplerBindingType:[,,"filtering","non-filtering","comparison"],Status:[,"success","error"],StencilOperation:[,"keep","zero","replace","invert","increment-clamp","decrement-clamp","increment-wrap","decrement-wrap"],StorageTextureAccess:[,,"write-only","read-only","read-write"],StoreOp:[,"store","discard"],SurfaceGetCurrentTextureStatus:[,"success-optimal","success-suboptimal","timeout","outdated","lost","error"],TextureAspect:[,"all","stencil-only","depth-only"],TextureDimension:[,"1d","2d","3d"],TextureFormat:[,"r8unorm","r8snorm","r8uint","r8sint","r16unorm","r16snorm","r16uint","r16sint","r16float","rg8unorm","rg8snorm","rg8uint","rg8sint","r32float","r32uint","r32sint","rg16unorm","rg16snorm","rg16uint","rg16sint","rg16float","rgba8unorm","rgba8unorm-srgb","rgba8snorm","rgba8uint","rgba8sint","bgra8unorm","bgra8unorm-srgb","rgb10a2uint","rgb10a2unorm","rg11b10ufloat","rgb9e5ufloat","rg32float","rg32uint","rg32sint","rgba16unorm","rgba16snorm","rgba16uint","rgba16sint","rgba16float","rgba32float","rgba32uint","rgba32sint","stencil8","depth16unorm","depth24plus","depth24plus-stencil8","depth32float","depth32float-stencil8","bc1-rgba-unorm","bc1-rgba-unorm-srgb","bc2-rgba-unorm","bc2-rgba-unorm-srgb","bc3-rgba-unorm","bc3-rgba-unorm-srgb","bc4-r-unorm","bc4-r-snorm","bc5-rg-unorm","bc5-rg-snorm","bc6h-rgb-ufloat","bc6h-rgb-float","bc7-rgba-unorm","bc7-rgba-unorm-srgb","etc2-rgb8unorm","etc2-rgb8unorm-srgb","etc2-rgb8a1unorm","etc2-rgb8a1unorm-srgb","etc2-rgba8unorm","etc2-rgba8unorm-srgb","eac-r11unorm","eac-r11snorm","eac-rg11unorm","eac-rg11snorm","astc-4x4-unorm","astc-4x4-unorm-srgb","astc-5x4-unorm","astc-5x4-unorm-srgb","astc-5x5-unorm","astc-5x5-unorm-srgb","astc-6x5-unorm","astc-6x5-unorm-srgb","astc-6x6-unorm","astc-6x6-unorm-srgb","astc-8x5-unorm","astc-8x5-unorm-srgb","astc-8x6-unorm","astc-8x6-unorm-srgb","astc-8x8-unorm","astc-8x8-unorm-srgb","astc-10x5-unorm","astc-10x5-unorm-srgb","astc-10x6-unorm","astc-10x6-unorm-srgb","astc-10x8-unorm","astc-10x8-unorm-srgb","astc-10x10-unorm","astc-10x10-unorm-srgb","astc-12x10-unorm","astc-12x10-unorm-srgb","astc-12x12-unorm","astc-12x12-unorm-srgb"],TextureSampleType:[,,"float","unfilterable-float","depth","sint","uint"],TextureViewDimension:[,"1d","2d","2d-array","cube","cube-array","3d"],ToneMappingMode:[,"standard","extended"],VertexFormat:[,"uint8","uint8x2","uint8x4","sint8","sint8x2","sint8x4","unorm8","unorm8x2","unorm8x4","snorm8","snorm8x2","snorm8x4","uint16","uint16x2","uint16x4","sint16","sint16x2","sint16x4","unorm16","unorm16x2","unorm16x4","snorm16","snorm16x2","snorm16x4","float16","float16x2","float16x4","float32","float32x2","float32x3","float32x4","uint32","uint32x2","uint32x3","uint32x4","sint32","sint32x2","sint32x3","sint32x4","unorm10-10-10-2","unorm8x4-bgra"],VertexStepMode:[,"vertex","instance"],WGSLLanguageFeatureName:[,"readonly_and_readwrite_storage_textures","packed_4x8_integer_dot_product","unrestricted_pointer_parameters","pointer_composite_access","uniform_buffer_standard_layout","subgroup_id","texture_and_sampler_let","subgroup_uniformity","texture_formats_tier1"]};var emwgpuStringToInt_DeviceLostReason={undefined:1,unknown:1,destroyed:2};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};function _emwgpuAdapterRequestDevice(adapterPtr,futureId,deviceLostFutureId,devicePtr,queuePtr,descriptor){adapterPtr=bigintToI53Checked(adapterPtr);futureId=bigintToI53Checked(futureId);deviceLostFutureId=bigintToI53Checked(deviceLostFutureId);devicePtr=bigintToI53Checked(devicePtr);queuePtr=bigintToI53Checked(queuePtr);descriptor=bigintToI53Checked(descriptor);var adapter=WebGPU.getJsObject(adapterPtr);var desc={};if(descriptor){var requiredFeatureCount=Number((growMemViews(),HEAPU64)[(descriptor+24)/8]);if(requiredFeatureCount){var requiredFeaturesPtr=Number((growMemViews(),HEAPU64)[(descriptor+32)/8]);desc["requiredFeatures"]=Array.from((growMemViews(),HEAPU32).subarray(requiredFeaturesPtr/4,(requiredFeaturesPtr+requiredFeatureCount*4)/4),feature=>WebGPU.FeatureName[feature])}var limitsPtr=Number((growMemViews(),HEAPU64)[(descriptor+40)/8]);if(limitsPtr){var nextInChainPtr=Number((growMemViews(),HEAPU64)[limitsPtr/8]);var requiredLimits={};function setLimitU32IfDefined(name,basePtr,limitOffset,ignoreIfZero=false){var ptr=basePtr+limitOffset;var value=(growMemViews(),HEAPU32)[ptr/4];if(value!=4294967295&&(!ignoreIfZero||value!=0)){requiredLimits[name]=value}}function setLimitU64IfDefined(name,basePtr,limitOffset){var ptr=basePtr+limitOffset;var limitPart1=(growMemViews(),HEAPU32)[ptr/4];var limitPart2=(growMemViews(),HEAPU32)[(ptr+4)/4];if(limitPart1!=4294967295||limitPart2!=4294967295){requiredLimits[name]=readI53FromI64(ptr)}}setLimitU32IfDefined("maxTextureDimension1D",limitsPtr,8);setLimitU32IfDefined("maxTextureDimension2D",limitsPtr,12);setLimitU32IfDefined("maxTextureDimension3D",limitsPtr,16);setLimitU32IfDefined("maxTextureArrayLayers",limitsPtr,20);setLimitU32IfDefined("maxBindGroups",limitsPtr,24);setLimitU32IfDefined("maxBindGroupsPlusVertexBuffers",limitsPtr,28);setLimitU32IfDefined("maxBindingsPerBindGroup",limitsPtr,32);setLimitU32IfDefined("maxDynamicUniformBuffersPerPipelineLayout",limitsPtr,36);setLimitU32IfDefined("maxDynamicStorageBuffersPerPipelineLayout",limitsPtr,40);setLimitU32IfDefined("maxSampledTexturesPerShaderStage",limitsPtr,44);setLimitU32IfDefined("maxSamplersPerShaderStage",limitsPtr,48);setLimitU32IfDefined("maxStorageBuffersPerShaderStage",limitsPtr,52);setLimitU32IfDefined("maxStorageTexturesPerShaderStage",limitsPtr,56);setLimitU32IfDefined("maxUniformBuffersPerShaderStage",limitsPtr,60);setLimitU32IfDefined("minUniformBufferOffsetAlignment",limitsPtr,80);setLimitU32IfDefined("minStorageBufferOffsetAlignment",limitsPtr,84);setLimitU64IfDefined("maxUniformBufferBindingSize",limitsPtr,64);setLimitU64IfDefined("maxStorageBufferBindingSize",limitsPtr,72);setLimitU32IfDefined("maxVertexBuffers",limitsPtr,88);setLimitU64IfDefined("maxBufferSize",limitsPtr,96);setLimitU32IfDefined("maxVertexAttributes",limitsPtr,104);setLimitU32IfDefined("maxVertexBufferArrayStride",limitsPtr,108);setLimitU32IfDefined("maxInterStageShaderVariables",limitsPtr,112);setLimitU32IfDefined("maxColorAttachments",limitsPtr,116);setLimitU32IfDefined("maxColorAttachmentBytesPerSample",limitsPtr,120);setLimitU32IfDefined("maxComputeWorkgroupStorageSize",limitsPtr,124);setLimitU32IfDefined("maxComputeInvocationsPerWorkgroup",limitsPtr,128);setLimitU32IfDefined("maxComputeWorkgroupSizeX",limitsPtr,132);setLimitU32IfDefined("maxComputeWorkgroupSizeY",limitsPtr,136);setLimitU32IfDefined("maxComputeWorkgroupSizeZ",limitsPtr,140);setLimitU32IfDefined("maxComputeWorkgroupsPerDimension",limitsPtr,144);setLimitU32IfDefined("maxImmediateSize",limitsPtr,148,true);if(nextInChainPtr!==0){var sType=(growMemViews(),HEAP32)[(nextInChainPtr+8)/4];var compatibilityModeLimitsPtr=nextInChainPtr;if("maxStorageBuffersInVertexStage"in GPUSupportedLimits.prototype){setLimitU32IfDefined("maxStorageBuffersInVertexStage",compatibilityModeLimitsPtr,16);setLimitU32IfDefined("maxStorageTexturesInVertexStage",compatibilityModeLimitsPtr,20);setLimitU32IfDefined("maxStorageBuffersInFragmentStage",compatibilityModeLimitsPtr,24);setLimitU32IfDefined("maxStorageTexturesInFragmentStage",compatibilityModeLimitsPtr,28)}}desc["requiredLimits"]=requiredLimits}var defaultQueuePtr=Number((growMemViews(),HEAPU64)[(descriptor+48)/8]);if(defaultQueuePtr){var defaultQueueDesc={label:WebGPU.makeStringFromOptionalStringView(defaultQueuePtr+8)};desc["defaultQueue"]=defaultQueueDesc}desc["label"]=WebGPU.makeStringFromOptionalStringView(descriptor+8)}runtimeKeepalivePush();WebGPU.Internals.futureInsert(futureId,adapter.requestDevice(desc).then(device=>{runtimeKeepalivePop();callUserCallback(()=>{WebGPU.Internals.jsObjectInsert(queuePtr,device.queue);WebGPU.Internals.jsObjectInsert(devicePtr,device);devicePtr=BigInt(devicePtr);WebGPU.Internals.futureInsert(deviceLostFutureId,device.lost.then(info=>{callUserCallback(()=>{device.onuncapturederror=ev=>{};var sp=stackSave();var messagePtr=stringToUTF8OnStack(info.message);_emwgpuOnDeviceLostCompleted(deviceLostFutureId,emwgpuStringToInt_DeviceLostReason[info.reason],BigInt(messagePtr));stackRestore(sp)})}));device.onuncapturederror=ev=>{var type=5;if(ev.error instanceof GPUValidationError)type=2;else if(ev.error instanceof GPUOutOfMemoryError)type=3;else if(ev.error instanceof GPUInternalError)type=4;var sp=stackSave();var messagePtr=stringToUTF8OnStack(ev.error.message);_emwgpuOnUncapturedError(BigInt(devicePtr),type,BigInt(messagePtr));stackRestore(sp)};_emwgpuOnRequestDeviceCompleted(futureId,1,BigInt(devicePtr),0n)})},ex=>{runtimeKeepalivePop();callUserCallback(()=>{var sp=stackSave();var messagePtr=stringToUTF8OnStack(ex.message);_emwgpuOnRequestDeviceCompleted(futureId,3,BigInt(devicePtr),BigInt(messagePtr));if(deviceLostFutureId){_emwgpuOnDeviceLostCompleted(deviceLostFutureId,4,BigInt(messagePtr))}stackRestore(sp)})}))}function _emwgpuBufferDestroy(bufferPtr){bufferPtr=bigintToI53Checked(bufferPtr);var buffer=WebGPU.getJsObject(bufferPtr);var onUnmap=WebGPU.Internals.bufferOnUnmaps[bufferPtr];if(onUnmap){for(var i=0;i{warnOnce.shown||={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}};var _emwgpuBufferGetConstMappedRange=function(bufferPtr,offset,size){bufferPtr=bigintToI53Checked(bufferPtr);offset=bigintToI53Checked(offset);size=bigintToI53Checked(size);var ret=(()=>{var buffer=WebGPU.getJsObject(bufferPtr);if(size==-1)size=undefined;var mapped;try{mapped=buffer.getMappedRange(offset,size)}catch(ex){return 0n}var data=_memalign(16,mapped.byteLength);(growMemViews(),HEAPU8).set(new Uint8Array(mapped),data);WebGPU.Internals.bufferOnUnmaps[bufferPtr].push(()=>_free(data));return data})();return BigInt(ret)};var _emwgpuBufferMapAsync=function(bufferPtr,futureId,mode,offset,size){bufferPtr=bigintToI53Checked(bufferPtr);futureId=bigintToI53Checked(futureId);mode=bigintToI53Checked(mode);offset=bigintToI53Checked(offset);size=bigintToI53Checked(size);var buffer=WebGPU.getJsObject(bufferPtr);WebGPU.Internals.bufferOnUnmaps[bufferPtr]=[];if(size==-1)size=undefined;runtimeKeepalivePush();WebGPU.Internals.futureInsert(futureId,buffer.mapAsync(mode,offset,size).then(()=>{runtimeKeepalivePop();callUserCallback(()=>{_emwgpuOnMapAsyncCompleted(futureId,1,0n)})},ex=>{runtimeKeepalivePop();callUserCallback(()=>{var sp=stackSave();var messagePtr=stringToUTF8OnStack(ex.message);var status=ex.name==="AbortError"?4:ex.name==="OperationError"?3:0;_emwgpuOnMapAsyncCompleted(futureId,status,BigInt(messagePtr));delete WebGPU.Internals.bufferOnUnmaps[bufferPtr]})}))};function _emwgpuBufferUnmap(bufferPtr){bufferPtr=bigintToI53Checked(bufferPtr);var buffer=WebGPU.getJsObject(bufferPtr);var onUnmap=WebGPU.Internals.bufferOnUnmaps[bufferPtr];if(!onUnmap){return}for(var i=0;i{const device=WebGPU.getJsObject(devicePtr);device.onuncapturederror=null;device.destroy()};function _emwgpuInstanceRequestAdapter(instancePtr,futureId,options,adapterPtr){instancePtr=bigintToI53Checked(instancePtr);futureId=bigintToI53Checked(futureId);options=bigintToI53Checked(options);adapterPtr=bigintToI53Checked(adapterPtr);var opts;if(options){opts={featureLevel:WebGPU.FeatureLevel[(growMemViews(),HEAP32)[(options+8)/4]],powerPreference:WebGPU.PowerPreference[(growMemViews(),HEAP32)[(options+12)/4]],forceFallbackAdapter:!!(growMemViews(),HEAPU32)[(options+16)/4]};var nextInChainPtr=Number((growMemViews(),HEAPU64)[options/8]);if(nextInChainPtr!==0){var sType=(growMemViews(),HEAP32)[(nextInChainPtr+8)/4];var webxrOptions=nextInChainPtr;opts.xrCompatible=!!(growMemViews(),HEAPU32)[(webxrOptions+16)/4]}}if(!("gpu"in navigator)){var sp=stackSave();var messagePtr=stringToUTF8OnStack("WebGPU not available on this browser (navigator.gpu is not available)");_emwgpuOnRequestAdapterCompleted(futureId,3,BigInt(adapterPtr),BigInt(messagePtr));stackRestore(sp);return}runtimeKeepalivePush();WebGPU.Internals.futureInsert(futureId,navigator.gpu.requestAdapter(opts).then(adapter=>{runtimeKeepalivePop();callUserCallback(()=>{if(adapter){WebGPU.Internals.jsObjectInsert(adapterPtr,adapter);_emwgpuOnRequestAdapterCompleted(futureId,1,BigInt(adapterPtr),0n)}else{var sp=stackSave();var messagePtr=stringToUTF8OnStack("WebGPU not available on this browser (requestAdapter returned null)");_emwgpuOnRequestAdapterCompleted(futureId,3,BigInt(adapterPtr),BigInt(messagePtr));stackRestore(sp)}})},ex=>{runtimeKeepalivePop();callUserCallback(()=>{var sp=stackSave();var messagePtr=stringToUTF8OnStack(ex.message);_emwgpuOnRequestAdapterCompleted(futureId,4,BigInt(adapterPtr),BigInt(messagePtr));stackRestore(sp)})}))}var _emwgpuQueueOnSubmittedWorkDone=function(queuePtr,futureId){queuePtr=bigintToI53Checked(queuePtr);futureId=bigintToI53Checked(futureId);var queue=WebGPU.getJsObject(queuePtr);runtimeKeepalivePush();WebGPU.Internals.futureInsert(futureId,queue.onSubmittedWorkDone().then(()=>{runtimeKeepalivePop();callUserCallback(()=>{_emwgpuOnWorkDoneCompleted(futureId,1)})}))};var _emwgpuWaitAny=function(futurePtr,futureCount,timeoutMSPtr){futurePtr=bigintToI53Checked(futurePtr);futureCount=bigintToI53Checked(futureCount);timeoutMSPtr=bigintToI53Checked(timeoutMSPtr);return Asyncify.handleAsync(async()=>{var promises=[];if(timeoutMSPtr){var timeoutMS=(growMemViews(),HEAP32)[timeoutMSPtr/4];promises.length=futureCount+1;promises[futureCount]=new Promise(resolve=>setTimeout(resolve,timeoutMS,0))}else{promises.length=futureCount}for(var i=0;ithisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.language||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};function _environ_get(__environ,environ_buf){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(14,0,1,__environ,environ_buf);__environ=bigintToI53Checked(__environ);environ_buf=bigintToI53Checked(environ_buf);var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;(growMemViews(),HEAPU64)[(__environ+envp)/8]=BigInt(ptr);bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=8}return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(15,0,1,penviron_count,penviron_buf_size);penviron_count=bigintToI53Checked(penviron_count);penviron_buf_size=bigintToI53Checked(penviron_buf_size);var strings=getEnvStrings();(growMemViews(),HEAPU64)[penviron_count/8]=BigInt(strings.length);var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}(growMemViews(),HEAPU64)[penviron_buf_size/8]=BigInt(bufSize);return 0}function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(16,0,1,fd);try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i{var ret=0;for(var i=0;i{var buffer=WebGPU.getJsObject(bufferPtr);return buffer.size})();return BigInt(ret)};var _wgpuCommandEncoderBeginComputePass=function(encoderPtr,descriptor){encoderPtr=bigintToI53Checked(encoderPtr);descriptor=bigintToI53Checked(descriptor);var ret=(()=>{var desc;if(descriptor){desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+8),timestampWrites:WebGPU.makePassTimestampWrites(Number((growMemViews(),HEAPU64)[(descriptor+24)/8]))}}var commandEncoder=WebGPU.getJsObject(encoderPtr);var ptr=_emwgpuCreateComputePassEncoder(0n);WebGPU.Internals.jsObjectInsert(ptr,commandEncoder.beginComputePass(desc));return ptr})();return BigInt(ret)};function _wgpuCommandEncoderCopyBufferToBuffer(encoderPtr,srcPtr,srcOffset,dstPtr,dstOffset,size){encoderPtr=bigintToI53Checked(encoderPtr);srcPtr=bigintToI53Checked(srcPtr);srcOffset=bigintToI53Checked(srcOffset);dstPtr=bigintToI53Checked(dstPtr);dstOffset=bigintToI53Checked(dstOffset);size=bigintToI53Checked(size);var commandEncoder=WebGPU.getJsObject(encoderPtr);var src=WebGPU.getJsObject(srcPtr);var dst=WebGPU.getJsObject(dstPtr);commandEncoder.copyBufferToBuffer(src,srcOffset,dst,dstOffset,size)}var _wgpuCommandEncoderFinish=function(encoderPtr,descriptor){encoderPtr=bigintToI53Checked(encoderPtr);descriptor=bigintToI53Checked(descriptor);var ret=(()=>{var commandEncoder=WebGPU.getJsObject(encoderPtr);var ptr=_emwgpuCreateCommandBuffer(0n);WebGPU.Internals.jsObjectInsert(ptr,commandEncoder.finish());return ptr})();return BigInt(ret)};function _wgpuCommandEncoderResolveQuerySet(encoderPtr,querySetPtr,firstQuery,queryCount,destinationPtr,destinationOffset){encoderPtr=bigintToI53Checked(encoderPtr);querySetPtr=bigintToI53Checked(querySetPtr);destinationPtr=bigintToI53Checked(destinationPtr);destinationOffset=bigintToI53Checked(destinationOffset);var commandEncoder=WebGPU.getJsObject(encoderPtr);var querySet=WebGPU.getJsObject(querySetPtr);var destination=WebGPU.getJsObject(destinationPtr);commandEncoder.resolveQuerySet(querySet,firstQuery,queryCount,destination,destinationOffset)}function _wgpuComputePassEncoderDispatchWorkgroups(passPtr,x,y,z){passPtr=bigintToI53Checked(passPtr);var pass=WebGPU.getJsObject(passPtr);pass.dispatchWorkgroups(x,y,z)}function _wgpuComputePassEncoderEnd(passPtr){passPtr=bigintToI53Checked(passPtr);var pass=WebGPU.getJsObject(passPtr);pass.end()}function _wgpuComputePassEncoderSetBindGroup(passPtr,groupIndex,groupPtr,dynamicOffsetCount,dynamicOffsetsPtr){passPtr=bigintToI53Checked(passPtr);groupPtr=bigintToI53Checked(groupPtr);dynamicOffsetCount=bigintToI53Checked(dynamicOffsetCount);dynamicOffsetsPtr=bigintToI53Checked(dynamicOffsetsPtr);var pass=WebGPU.getJsObject(passPtr);var group=WebGPU.getJsObject(groupPtr);if(dynamicOffsetCount==0){pass.setBindGroup(groupIndex,group)}else{pass.setBindGroup(groupIndex,group,(growMemViews(),HEAPU32),dynamicOffsetsPtr/4,dynamicOffsetCount)}}function _wgpuComputePassEncoderSetPipeline(passPtr,pipelinePtr){passPtr=bigintToI53Checked(passPtr);pipelinePtr=bigintToI53Checked(pipelinePtr);var pass=WebGPU.getJsObject(passPtr);var pipeline=WebGPU.getJsObject(pipelinePtr);pass.setPipeline(pipeline)}var _wgpuComputePipelineGetBindGroupLayout=function(pipelinePtr,groupIndex){pipelinePtr=bigintToI53Checked(pipelinePtr);var ret=(()=>{var pipeline=WebGPU.getJsObject(pipelinePtr);var ptr=_emwgpuCreateBindGroupLayout(0n);WebGPU.Internals.jsObjectInsert(ptr,pipeline.getBindGroupLayout(groupIndex));return ptr})();return BigInt(ret)};var _wgpuDeviceCreateBindGroup=function(devicePtr,descriptor){devicePtr=bigintToI53Checked(devicePtr);descriptor=bigintToI53Checked(descriptor);var ret=(()=>{function makeEntry(entryPtr){var bufferPtr=Number((growMemViews(),HEAPU64)[(entryPtr+16)/8]);var samplerPtr=Number((growMemViews(),HEAPU64)[(entryPtr+40)/8]);var textureViewPtr=Number((growMemViews(),HEAPU64)[(entryPtr+48)/8]);var externalTexturePtr=0;WebGPU.iterateExtensions(entryPtr,{327681:ptr=>{externalTexturePtr=Number((growMemViews(),HEAPU64)[(ptr+16)/8])}});var resource;if(bufferPtr){var size=readI53FromI64(entryPtr+32);if(size==-1)size=undefined;resource={buffer:WebGPU.getJsObject(bufferPtr),offset:readI53FromI64(entryPtr+24),size}}else{resource=WebGPU.getJsObject(samplerPtr||textureViewPtr||externalTexturePtr)}return{binding:(growMemViews(),HEAPU32)[(entryPtr+8)/4],resource}}function makeEntries(count,entriesPtrs){var entries=[];for(var i=0;i{var desc;if(descriptor){desc={label:WebGPU.makeStringFromOptionalStringView(descriptor+8)}}var device=WebGPU.getJsObject(devicePtr);var ptr=_emwgpuCreateCommandEncoder(0n);WebGPU.Internals.jsObjectInsert(ptr,device.createCommandEncoder(desc));return ptr})();return BigInt(ret)};var _wgpuDeviceCreateComputePipeline=function(devicePtr,descriptor){devicePtr=bigintToI53Checked(devicePtr);descriptor=bigintToI53Checked(descriptor);var ret=(()=>{var desc=WebGPU.makeComputePipelineDesc(descriptor);var device=WebGPU.getJsObject(devicePtr);var ptr=_emwgpuCreateComputePipeline(0n);WebGPU.Internals.jsObjectInsert(ptr,device.createComputePipeline(desc));return ptr})();return BigInt(ret)};var _wgpuDeviceCreateQuerySet=function(devicePtr,descriptor){devicePtr=bigintToI53Checked(devicePtr);descriptor=bigintToI53Checked(descriptor);var ret=(()=>{var desc={type:WebGPU.QueryType[(growMemViews(),HEAP32)[(descriptor+24)/4]],count:(growMemViews(),HEAPU32)[(descriptor+28)/4]};var device=WebGPU.getJsObject(devicePtr);var ptr=_emwgpuCreateQuerySet(0n);WebGPU.Internals.jsObjectInsert(ptr,device.createQuerySet(desc));return ptr})();return BigInt(ret)};function _wgpuInstanceHasWGSLLanguageFeature(instance,featureEnumValue){instance=bigintToI53Checked(instance);if(!("wgslLanguageFeatures"in navigator.gpu)){return false}return navigator.gpu.wgslLanguageFeatures.has(WebGPU.WGSLLanguageFeatureName[featureEnumValue])}function _wgpuQuerySetDestroy(querySetPtr){querySetPtr=bigintToI53Checked(querySetPtr);WebGPU.getJsObject(querySetPtr).destroy()}var _wgpuQueueSubmit=function(queuePtr,commandCount,commands){queuePtr=bigintToI53Checked(queuePtr);commandCount=bigintToI53Checked(commandCount);commands=bigintToI53Checked(commands);var queue=WebGPU.getJsObject(queuePtr);var cmds=Array.from((growMemViews(),HEAP64).subarray(commands/8,(commands+commandCount*8)/8),id=>WebGPU.getJsObject(id));queue.submit(cmds)};function _wgpuQueueWriteBuffer(queuePtr,bufferPtr,bufferOffset,data,size){queuePtr=bigintToI53Checked(queuePtr);bufferPtr=bigintToI53Checked(bufferPtr);bufferOffset=bigintToI53Checked(bufferOffset);data=bigintToI53Checked(data);size=bigintToI53Checked(size);var queue=WebGPU.getJsObject(queuePtr);var buffer=WebGPU.getJsObject(bufferPtr);var subarray=(growMemViews(),HEAPU8).subarray(data,data+size);queue.writeBuffer(buffer,bufferOffset,subarray,0,size)}var Asyncify={instrumentWasmImports(imports){var importPattern=/^(invoke_.*|__asyncjs__.*)$/;for(let[x,original]of Object.entries(imports)){if(typeof original=="function"){let isAsyncifyImport=original.isAsync||importPattern.test(x);if(isAsyncifyImport){imports[x]=original=new WebAssembly.Suspending(original)}}}},instrumentFunction(original){var wrapper=(...args)=>original(...args);return wrapper},instrumentWasmExports(exports){var exportPattern=/^(wllama_start|wllama_action|main|__main_argc_argv)$/;Asyncify.asyncExports=new Set;var ret={};for(let[x,original]of Object.entries(exports)){if(typeof original=="function"){let isAsyncifyExport=exportPattern.test(x);if(isAsyncifyExport){Asyncify.asyncExports.add(original);original=Asyncify.makeAsyncFunction(original)}var wrapper=Asyncify.instrumentFunction(original);ret[x]=wrapper}else{ret[x]=original}}return ret},asyncExports:null,isAsyncExport(func){return Asyncify.asyncExports?.has(func)},handleAsync:async startAsync=>{runtimeKeepalivePush();try{return await startAsync()}finally{runtimeKeepalivePop()}},handleSleep:startAsync=>Asyncify.handleAsync(()=>new Promise(startAsync)),makeAsyncFunction(original){return WebAssembly.promising(original)}};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{(growMemViews(),HEAP8).set(array,buffer)};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={pointer:p=>BigInt(p),string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return BigInt(ret)},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return BigInt(ret)}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(Number(ret))}if(returnType==="pointer")return Number(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};var FS_createPath=(...args)=>FS.createPath(...args);var FS_unlink=(...args)=>FS.unlink(...args);var FS_createLazyFile=(...args)=>FS.createLazyFile(...args);var FS_createDevice=(...args)=>FS.createDevice(...args);PThread.init();FS.createPreloadedFile=FS_createPreloadedFile;FS.preloadFile=FS_preloadFile;FS.staticInit();{initMemory();if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["preloadPlugins"])preloadPlugins=Module["preloadPlugins"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["ENV"]=ENV;Module["mmapAlloc"]=mmapAlloc;Module["wasmMemory"]=wasmMemory;Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["FS_preloadFile"]=FS_preloadFile;Module["FS_unlink"]=FS_unlink;Module["FS_createPath"]=FS_createPath;Module["FS_createDevice"]=FS_createDevice;Module["FS"]=FS;Module["FS_createDataFile"]=FS_createDataFile;Module["FS_createLazyFile"]=FS_createLazyFile;Module["MEMFS"]=MEMFS;var proxiedFunctionTable=[_proc_exit,exitOnMainThread,pthreadCreateProxied,___syscall_fcntl64,___syscall_fstat64,___syscall_getcwd,___syscall_getdents64,___syscall_ioctl,___syscall_lstat64,___syscall_newfstatat,___syscall_openat,___syscall_stat64,__mmap_js,__munmap_js,_environ_get,_environ_sizes_get,_fd_close,_fd_read,_fd_seek,_fd_write];function __asyncjs__js_file_read(path_ptr,offset,req_size,out_ptr){return Asyncify.handleAsync(async()=>await _wllama_js_file_read(UTF8ToString(Number(path_ptr)),Number(offset),Number(req_size),Number(out_ptr)))}__asyncjs__js_file_read.sig="jjjjj";var _malloc,_free,_wllama_malloc,_wllama_start,_wllama_action,_wllama_exit,_wllama_debug,_main,_emwgpuCreateBindGroup,_emwgpuCreateBindGroupLayout,_emwgpuCreateCommandBuffer,_emwgpuCreateCommandEncoder,_emwgpuCreateComputePassEncoder,_emwgpuCreateComputePipeline,_emwgpuCreateExternalTexture,_emwgpuCreatePipelineLayout,_emwgpuCreateQuerySet,_emwgpuCreateRenderBundle,_emwgpuCreateRenderBundleEncoder,_emwgpuCreateRenderPassEncoder,_emwgpuCreateRenderPipeline,_emwgpuCreateSampler,_emwgpuCreateSurface,_emwgpuCreateTexture,_emwgpuCreateTextureView,_emwgpuCreateAdapter,_emwgpuCreateBuffer,_emwgpuCreateDevice,_emwgpuCreateQueue,_emwgpuCreateShaderModule,_emwgpuOnDeviceLostCompleted,_emwgpuOnMapAsyncCompleted,_emwgpuOnRequestAdapterCompleted,_emwgpuOnRequestDeviceCompleted,_emwgpuOnWorkDoneCompleted,_emwgpuOnUncapturedError,__emscripten_tls_init,_pthread_self,_emscripten_builtin_memalign,__emscripten_thread_init,__emscripten_thread_crashed,__emscripten_run_js_on_main_thread,__emscripten_thread_free_data,__emscripten_thread_exit,__emscripten_check_mailbox,_memalign,___trap,_emscripten_stack_set_limits,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,__indirect_function_table,wasmTable;function assignWasmExports(wasmExports){_malloc=wasmExports["malloc"];_free=wasmExports["free"];_wllama_malloc=Module["_wllama_malloc"]=wasmExports["wllama_malloc"];_wllama_start=Module["_wllama_start"]=wasmExports["wllama_start"];_wllama_action=Module["_wllama_action"]=wasmExports["wllama_action"];_wllama_exit=Module["_wllama_exit"]=wasmExports["wllama_exit"];_wllama_debug=Module["_wllama_debug"]=wasmExports["wllama_debug"];_main=Module["_main"]=wasmExports["main"];_emwgpuCreateBindGroup=wasmExports["emwgpuCreateBindGroup"];_emwgpuCreateBindGroupLayout=wasmExports["emwgpuCreateBindGroupLayout"];_emwgpuCreateCommandBuffer=wasmExports["emwgpuCreateCommandBuffer"];_emwgpuCreateCommandEncoder=wasmExports["emwgpuCreateCommandEncoder"];_emwgpuCreateComputePassEncoder=wasmExports["emwgpuCreateComputePassEncoder"];_emwgpuCreateComputePipeline=wasmExports["emwgpuCreateComputePipeline"];_emwgpuCreateExternalTexture=wasmExports["emwgpuCreateExternalTexture"];_emwgpuCreatePipelineLayout=wasmExports["emwgpuCreatePipelineLayout"];_emwgpuCreateQuerySet=wasmExports["emwgpuCreateQuerySet"];_emwgpuCreateRenderBundle=wasmExports["emwgpuCreateRenderBundle"];_emwgpuCreateRenderBundleEncoder=wasmExports["emwgpuCreateRenderBundleEncoder"];_emwgpuCreateRenderPassEncoder=wasmExports["emwgpuCreateRenderPassEncoder"];_emwgpuCreateRenderPipeline=wasmExports["emwgpuCreateRenderPipeline"];_emwgpuCreateSampler=wasmExports["emwgpuCreateSampler"];_emwgpuCreateSurface=wasmExports["emwgpuCreateSurface"];_emwgpuCreateTexture=wasmExports["emwgpuCreateTexture"];_emwgpuCreateTextureView=wasmExports["emwgpuCreateTextureView"];_emwgpuCreateAdapter=wasmExports["emwgpuCreateAdapter"];_emwgpuCreateBuffer=wasmExports["emwgpuCreateBuffer"];_emwgpuCreateDevice=wasmExports["emwgpuCreateDevice"];_emwgpuCreateQueue=wasmExports["emwgpuCreateQueue"];_emwgpuCreateShaderModule=wasmExports["emwgpuCreateShaderModule"];_emwgpuOnDeviceLostCompleted=wasmExports["emwgpuOnDeviceLostCompleted"];_emwgpuOnMapAsyncCompleted=wasmExports["emwgpuOnMapAsyncCompleted"];_emwgpuOnRequestAdapterCompleted=wasmExports["emwgpuOnRequestAdapterCompleted"];_emwgpuOnRequestDeviceCompleted=wasmExports["emwgpuOnRequestDeviceCompleted"];_emwgpuOnWorkDoneCompleted=wasmExports["emwgpuOnWorkDoneCompleted"];_emwgpuOnUncapturedError=wasmExports["emwgpuOnUncapturedError"];__emscripten_tls_init=wasmExports["_emscripten_tls_init"];_pthread_self=wasmExports["pthread_self"];_emscripten_builtin_memalign=wasmExports["emscripten_builtin_memalign"];__emscripten_thread_init=wasmExports["_emscripten_thread_init"];__emscripten_thread_crashed=wasmExports["_emscripten_thread_crashed"];__emscripten_run_js_on_main_thread=wasmExports["_emscripten_run_js_on_main_thread"];__emscripten_thread_free_data=wasmExports["_emscripten_thread_free_data"];__emscripten_thread_exit=wasmExports["_emscripten_thread_exit"];__emscripten_check_mailbox=wasmExports["_emscripten_check_mailbox"];_memalign=wasmExports["memalign"];___trap=wasmExports["__trap"];_emscripten_stack_set_limits=wasmExports["emscripten_stack_set_limits"];__emscripten_stack_restore=wasmExports["_emscripten_stack_restore"];__emscripten_stack_alloc=wasmExports["_emscripten_stack_alloc"];_emscripten_stack_get_current=wasmExports["emscripten_stack_get_current"];__indirect_function_table=wasmTable=wasmExports["__indirect_function_table"]}var wasmImports;function assignWasmImports(){wasmImports={__asyncjs__js_file_read,__pthread_create_js:___pthread_create_js,__syscall_fcntl64:___syscall_fcntl64,__syscall_getcwd:___syscall_getcwd,__syscall_getdents64:___syscall_getdents64,__syscall_ioctl:___syscall_ioctl,__syscall_openat:___syscall_openat,__syscall_stat64:___syscall_stat64,_abort_js:__abort_js,_emscripten_init_main_thread_js:__emscripten_init_main_thread_js,_emscripten_notify_mailbox_postmessage:__emscripten_notify_mailbox_postmessage,_emscripten_receive_on_main_thread_js:__emscripten_receive_on_main_thread_js,_emscripten_thread_cleanup:__emscripten_thread_cleanup,_emscripten_thread_mailbox_await:__emscripten_thread_mailbox_await,_emscripten_thread_set_strongref:__emscripten_thread_set_strongref,_localtime_js:__localtime_js,_mmap_js:__mmap_js,_munmap_js:__munmap_js,_tzset_js:__tzset_js,clock_time_get:_clock_time_get,emscripten_check_blocking_allowed:_emscripten_check_blocking_allowed,emscripten_date_now:_emscripten_date_now,emscripten_exit_with_live_runtime:_emscripten_exit_with_live_runtime,emscripten_get_callstack:_emscripten_get_callstack,emscripten_get_heap_max:_emscripten_get_heap_max,emscripten_get_now:_emscripten_get_now,emscripten_has_asyncify:_emscripten_has_asyncify,emscripten_num_logical_cores:_emscripten_num_logical_cores,emscripten_resize_heap:_emscripten_resize_heap,emwgpuAdapterRequestDevice:_emwgpuAdapterRequestDevice,emwgpuBufferDestroy:_emwgpuBufferDestroy,emwgpuBufferGetConstMappedRange:_emwgpuBufferGetConstMappedRange,emwgpuBufferMapAsync:_emwgpuBufferMapAsync,emwgpuBufferUnmap:_emwgpuBufferUnmap,emwgpuDelete:_emwgpuDelete,emwgpuDeviceCreateBuffer:_emwgpuDeviceCreateBuffer,emwgpuDeviceCreateShaderModule:_emwgpuDeviceCreateShaderModule,emwgpuDeviceDestroy:_emwgpuDeviceDestroy,emwgpuInstanceRequestAdapter:_emwgpuInstanceRequestAdapter,emwgpuQueueOnSubmittedWorkDone:_emwgpuQueueOnSubmittedWorkDone,emwgpuWaitAny:_emwgpuWaitAny,environ_get:_environ_get,environ_sizes_get:_environ_sizes_get,exit:_exit,fd_close:_fd_close,fd_read:_fd_read,fd_seek:_fd_seek,fd_write:_fd_write,memory:wasmMemory,random_get:_random_get,wgpuAdapterGetInfo:_wgpuAdapterGetInfo,wgpuAdapterGetLimits:_wgpuAdapterGetLimits,wgpuAdapterHasFeature:_wgpuAdapterHasFeature,wgpuBufferGetSize:_wgpuBufferGetSize,wgpuCommandEncoderBeginComputePass:_wgpuCommandEncoderBeginComputePass,wgpuCommandEncoderCopyBufferToBuffer:_wgpuCommandEncoderCopyBufferToBuffer,wgpuCommandEncoderFinish:_wgpuCommandEncoderFinish,wgpuCommandEncoderResolveQuerySet:_wgpuCommandEncoderResolveQuerySet,wgpuComputePassEncoderDispatchWorkgroups:_wgpuComputePassEncoderDispatchWorkgroups,wgpuComputePassEncoderEnd:_wgpuComputePassEncoderEnd,wgpuComputePassEncoderSetBindGroup:_wgpuComputePassEncoderSetBindGroup,wgpuComputePassEncoderSetPipeline:_wgpuComputePassEncoderSetPipeline,wgpuComputePipelineGetBindGroupLayout:_wgpuComputePipelineGetBindGroupLayout,wgpuDeviceCreateBindGroup:_wgpuDeviceCreateBindGroup,wgpuDeviceCreateCommandEncoder:_wgpuDeviceCreateCommandEncoder,wgpuDeviceCreateComputePipeline:_wgpuDeviceCreateComputePipeline,wgpuDeviceCreateQuerySet:_wgpuDeviceCreateQuerySet,wgpuInstanceHasWGSLLanguageFeature:_wgpuInstanceHasWGSLLanguageFeature,wgpuQuerySetDestroy:_wgpuQuerySetDestroy,wgpuQueueSubmit:_wgpuQueueSubmit,wgpuQueueWriteBuffer:_wgpuQueueWriteBuffer}}function applySignatureConversions(wasmExports){wasmExports=Object.assign({},wasmExports);var makeWrapper_pp=f=>a0=>Number(f(BigInt(a0)));var makeWrapper__p=f=>a0=>f(BigInt(a0));var makeWrapper___PP=f=>(a0,a1,a2)=>f(a0,BigInt(a1?a1:0),BigInt(a2?a2:0));var makeWrapper_p=f=>()=>Number(f());var makeWrapper_ppp=f=>(a0,a1)=>Number(f(BigInt(a0),BigInt(a1)));var makeWrapper__p_____=f=>(a0,a1,a2,a3,a4,a5)=>f(BigInt(a0),a1,a2,a3,a4,a5);var makeWrapper___p_p_=f=>(a0,a1,a2,a3,a4)=>f(a0,BigInt(a1),a2,BigInt(a3),a4);var makeWrapper__pp=f=>(a0,a1)=>f(BigInt(a0),BigInt(a1));wasmExports["malloc"]=makeWrapper_pp(wasmExports["malloc"]);wasmExports["free"]=makeWrapper__p(wasmExports["free"]);wasmExports["main"]=makeWrapper___PP(wasmExports["main"]);wasmExports["pthread_self"]=makeWrapper_p(wasmExports["pthread_self"]);wasmExports["emscripten_builtin_memalign"]=makeWrapper_ppp(wasmExports["emscripten_builtin_memalign"]);wasmExports["_emscripten_thread_init"]=makeWrapper__p_____(wasmExports["_emscripten_thread_init"]);wasmExports["_emscripten_run_js_on_main_thread"]=makeWrapper___p_p_(wasmExports["_emscripten_run_js_on_main_thread"]);wasmExports["_emscripten_thread_free_data"]=makeWrapper__p(wasmExports["_emscripten_thread_free_data"]);wasmExports["_emscripten_thread_exit"]=makeWrapper__p(wasmExports["_emscripten_thread_exit"]);wasmExports["memalign"]=makeWrapper_ppp(wasmExports["memalign"]);wasmExports["emscripten_stack_set_limits"]=makeWrapper__pp(wasmExports["emscripten_stack_set_limits"]);wasmExports["_emscripten_stack_restore"]=makeWrapper__p(wasmExports["_emscripten_stack_restore"]);wasmExports["_emscripten_stack_alloc"]=makeWrapper_pp(wasmExports["_emscripten_stack_alloc"]);wasmExports["emscripten_stack_get_current"]=makeWrapper_p(wasmExports["emscripten_stack_get_current"]);return wasmExports}async function callMain(){var entryFunction=_main;var argc=0;var argv=0;try{var ret=entryFunction(argc,BigInt(argv));ret=await ret;exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(){if(runDependencies>0){dependenciesFulfilled=run;return}if(ENVIRONMENT_IS_PTHREAD){initRuntime();return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}async function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();Module["onRuntimeInitialized"]?.();var noInitialRun=Module["noInitialRun"]||false;if(!noInitialRun)await callMain();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;if(!ENVIRONMENT_IS_PTHREAD){createWasm();run()}\n',Ee=`fs.read_req`,De=` +if (!WebAssembly.Suspending) { + // JSPI not available - stubs that keep the import/export tables valid. + // Suspending wraps imports: identity is fine since async imports won't be called. + WebAssembly.Suspending = function (fn) { + // console.log(fn.toString()); + return fn; + }; + // promising wraps exports: must return a Promise so ccall's ret.then() works. + WebAssembly.promising = function (fn) { + return function (...args) { + try { + return Promise.resolve(fn(...args)); + } catch (e) { + return Promise.reject(e); + } + }; + }; +} +`,Oe=class{constructor(e,t,n,r){p(this,`resources`),p(this,`logger`),p(this,`suppressNativeLog`),p(this,`taskQueue`,[]),p(this,`taskId`,1),p(this,`resultQueue`,[]),p(this,`busy`,!1),p(this,`worker`),p(this,`multiThread`),p(this,`nbThread`),p(this,`useAsyncFile`),p(this,`fileBlobs`,new Map),this.resources=e,this.nbThread=t,this.multiThread=t>0,this.logger=r,this.suppressNativeLog=n,this.useAsyncFile=be(e.compat)}getModuleCode(){return m(this,null,function*(){if(!this.resources.jsPath){if(this.resources.compat)throw Error(`compat mode is enabled but no jsPath was provided. Pass a worker JS via setCompat() or install @wllama/wllama-compat.`);return Te}else if(this.resources.jsPath.code)return this.resources.jsPath.code;else if(A(this.resources.jsPath)){let e=yield fetch(this.resources.jsPath);if(!e.ok)throw Error(`Failed to fetch worker code from ${this.resources.jsPath}`);return yield e.text()}else throw Error(`No JS code provided for worker`)})}moduleInit(e){return m(this,null,function*(){let t=De+(yield this.getModuleCode()),n=t.replace(`var Module`,`var ___Module`),r={pathConfig:{"wllama.wasm":this.resources.wasmPath},nbThread:this.nbThread,compat:this.resources.compat},i=[`const RUN_OPTIONS = ${JSON.stringify(r)};`,`function wModuleInit() { ${n}; return Module; }`,Ce].join(`; + +`);this.worker=ve(i),this.worker.onmessage=this.onRecvMsg.bind(this),this.worker.onerror=this.logger.error;let a=yield this.pushTask({verb:`module.init`,args:[new Blob([t],{type:`text/javascript`}),this.useAsyncFile],callbackId:this.taskId++}),o=[];for(let t of e){let e=!this.useAsyncFile,n=yield this.fileAlloc(t.name,t.blob.size,e);o.push(d({id:n},t)),this.useAsyncFile&&this.fileBlobs.set(t.name,t.blob)}return this.useAsyncFile||(yield Promise.all(o.map(e=>this.fileWrite(e.id,e.blob)))),a})}wllamaStart(){return m(this,null,function*(){let e=yield this.pushTask({verb:`wllama.start`,args:[],callbackId:this.taskId++});return this.parseResult(e)})}wllamaAction(e,t){return m(this,null,function*(){let n=w(t);return C(yield this.pushTask({verb:`wllama.action`,args:[e,n],callbackId:this.taskId++}))})}wllamaExit(){return m(this,null,function*(){this.worker&&this.worker.terminate()})}wllamaDebug(){return m(this,null,function*(){let e=yield this.pushTask({verb:`wllama.debug`,args:[],callbackId:this.taskId++});return JSON.parse(e)})}fileAlloc(e,t,n){return m(this,null,function*(){return(yield this.pushTask({verb:`fs.alloc`,args:[e,t,n],callbackId:this.taskId++})).fileId})}fileWrite(e,t){return m(this,null,function*(){let n=t.stream().getReader(),r=0;for(;;){let{done:t,value:i}=yield n.read();if(t)break;let a=i.byteLength;yield this.pushTask({verb:`fs.write`,args:[e,i,r],callbackId:this.taskId++},[i.buffer]),r+=a}})}fileReadResponse(e,t,n){return m(this,null,function*(){var r;try{let r=this.fileBlobs.get(e);if(!r)throw Error(`blob not found for name="${e}"`);let i=yield r.slice(t,t+n).arrayBuffer();this.worker.postMessage({verb:`fs.read_res`,args:[i]},{transfer:[i]})}catch(e){this.logger.error(`fileReadResponse failed, terminating worker:`,e),(r=this.worker)==null||r.terminate(),this.worker=void 0,this.abort(`File read failed: ${e}`,e.stack||``)}})}parseResult(e){let t=JSON.parse(e);if(t&&t.error)throw new Ze(`Unknown error, please see console.log`,``);return t}pushTask(e,t){return new Promise((n,r)=>{this.taskQueue.push({resolve:n,reject:r,param:e,buffers:t}),this.runTaskLoop()})}runTaskLoop(){return m(this,null,function*(){if(!this.busy){for(this.busy=!0;;){let e=this.taskQueue.shift();if(!e)break;this.resultQueue.push(e),this.worker.postMessage(e.param,_e()?void 0:{transfer:e.buffers??[]})}this.busy=!1}})}onRecvMsg(e){if(!e.data)return;let{verb:t,args:n}=e.data,r=this.resources.compat;if(t&&t.startsWith(`console.`)){if(this.suppressNativeLog)return;t.endsWith(`debug`)&&this.logger.debug(...n),t.endsWith(`log`)&&this.logger.log(...n),t.endsWith(`warn`)&&this.logger.warn(...n),t.endsWith(`error`)&&this.logger.error(...n);return}else if(t===`signal.abort`){let[e,t,i,a]=n;a&&this.logger.error(a),m(this,null,function*(){let n=``,a=t.replace(`Build with -sASSERTIONS for more info.`,``);e===`abort`?(a=`(ABORT) ${a}`,n=i.replace(/\|/g,` +`)):e===`exception`&&(n=i);let o=yield O.decodeStackTrace(n,r);this.logger.error(`Stack trace (${e}): +`+o),this.abort(a,o)});return}if(t===Ee){let[e,t,r]=n;this.fileReadResponse(e,t,r).catch(()=>{});return}let{callbackId:i,result:a,err:o}=e.data;if(i){let e=this.resultQueue.findIndex(e=>e.param.callbackId===i);if(e!==-1){let t=this.resultQueue.splice(e,1)[0];o?t.reject(o):t.resolve(a)}else this.logger.error(`Cannot find waiting task with callbackId = ${i}`)}}abort(e,t){let n=new Ze(e.length==0?`(unknown error)`:e,t);for(;this.resultQueue.length>0;){let e=this.resultQueue.pop();if(!e)break;e.reject(n)}for(;this.taskQueue.length>0;){let e=this.taskQueue.pop();if(!e)break;e.reject(n)}}},ke=`https://huggingface.co`,Ae=[`Q4_K_M`,`Q8_0`];function je(e,t){return m(this,null,function*(){let n=`${ke}/api/models/${e}/tree/main?recursive=true`,r={Accept:`application/json`};t&&(r.Authorization=`Bearer ${t}`);let i=yield fetch(n,{headers:r});if(!i.ok){let e=i.statusText;try{e=(yield i.json()).error??e}catch{}throw Error(`HF API error (${i.status}): ${e}`)}return i.json()})}function Me(e,t){let n=t.match(/^(.+)-(\d{5})-of-(\d{5})\.gguf$/i);if(!n)return t;let r=`${n[1]}-00001-of-${n[3]}.gguf`;return e.some(e=>e.path===r)?r:t}function Ne(e,t,n){let r=e.filter(e=>{if(e.type!==`file`||!e.path.toLowerCase().endsWith(`.gguf`))return!1;let t=e.path.toLowerCase().includes(`mmproj`);return n?t:!t});if(r.length===0)return null;if(t){let e=t.toUpperCase(),n=r.find(t=>t.path.toUpperCase().includes(e));return n?Me(r,n.path):null}for(let e of Ae){let t=r.find(t=>t.path.toUpperCase().includes(e));if(t)return Me(r,t.path)}return Me(r,r[0].path)}function Pe(e){return m(this,null,function*(){let{repo:t,file:n,quant:r,mmprojFile:i,mmprojQuant:a,hfToken:o}=e,s=yield je(t,o),c=n??Ne(s,r,!1);if(!c)throw Error(`No GGUF file found in repo "${t}"`);let l={url:`${ke}/${t}/resolve/main/${c}`};if(i||a!==void 0){let e=i??Ne(s,a,!0);e&&(l.mmprojUrl=`${ke}/${t}/resolve/main/${e}`)}if(o){let e=new URLSearchParams({token:o});l.url+=`?${e}`,l.mmprojUrl&&(l.mmprojUrl+=`?${e}`)}return l})}function Fe(e,t){return m(this,null,function*(){if(!e.includes(`/resolve/`))return;let n=e.replace(`/resolve/`,`/raw/`);try{let e=(yield fetch(n,{headers:t}).then(e=>e.text())).match(/^oid sha256:([0-9a-f]{64})$/m);return e?e[1]:void 0}catch{return}})}var Ie=class{isSupported(){return typeof navigator<`u`&&`storage`in navigator&&!!navigator.storage?.getDirectory}read(e){return m(this,null,function*(){try{return yield(yield(yield Le()).getFileHandle(e)).getFile()}catch{return null}})}write(e,t){return m(this,null,function*(){let n=yield Re(e);yield n.truncate(0);let r=t.getReader();try{for(;;){let{done:e,value:t}=yield r.read();if(e)break;yield n.write(t)}}finally{yield n.close()}})}getSize(e){return m(this,null,function*(){try{return(yield(yield(yield Le()).getFileHandle(e)).getFile()).size}catch{return-1}})}list(){return m(this,null,function*(){let e=yield Le(),t=[];try{for(var n=_(e.entries()),r,i,a;r=!(i=yield n.next()).done;r=!1){let[e,n]=i.value;if(n.kind===`file`){let r=yield n.getFile();t.push({key:e,size:r.size})}}}catch(e){a=[e]}finally{try{r&&(i=n.return)&&(yield i.call(n))}finally{if(a)throw a[0]}}return t})}delete(e){return m(this,null,function*(){try{yield(yield Le()).removeEntry(e)}catch(e){if(e?.name!==`NotFoundError`)throw e}})}};function Le(){return m(this,null,function*(){return(yield navigator.storage.getDirectory()).getDirectoryHandle(`cache`,{create:!0})})}function Re(e){return m(this,null,function*(){let t=ve(we),n,r;t.onmessage=e=>{e.data.ok?n(null):e.data.err&&r(e.data.err)},t.onerror=e=>r?.(e.message??e);let i=e=>new Promise((i,a)=>{n=i,r=a,t.postMessage(e,_e()?void 0:{transfer:`buf`in e&&e.buf?[e.buf.buffer]:[]})});return yield i({action:`open`,filename:e}),{truncate:()=>m(this,null,function*(){}),write:e=>i({action:`write`,buf:e}),close:()=>m(this,null,function*(){yield i({action:`close`}),t.terminate()})}})}function ze(e){return{algorithm:`SHA-256`,value:e}}var Be=class{isSupported(){return typeof navigator<`u`&&`crossOriginStorage`in navigator}read(e){return m(this,null,function*(){try{return(yield navigator.crossOriginStorage.requestFileHandle(ze(e))).getFile()}catch{return null}})}write(e,t){return m(this,null,function*(){let n=yield(yield navigator.crossOriginStorage.requestFileHandle(ze(e),{create:!0})).createWritable(),r=t.getReader();try{for(;;){let{done:e,value:t}=yield r.read();if(e)break;yield n.write(t)}}finally{yield n.close()}})}getSize(e){return m(this,null,function*(){try{return(yield(yield navigator.crossOriginStorage.requestFileHandle(ze(e))).getFile()).size}catch{return-1}})}list(){return m(this,null,function*(){throw Error(`not implemented`)})}delete(e){return m(this,null,function*(){throw Error(`not implemented`)})}},Ve=class{constructor(){p(this,`cos`,new Be),p(this,`priv`,new Ie)}isSupported(){return this.priv.isSupported()}read(e,t){return m(this,null,function*(){if(t?.sha256&&this.cos.isSupported()){let e=yield this.cos.read(t.sha256);if(e)return e}return this.priv.read(e)})}write(e,t,n){return m(this,null,function*(){n?.sha256&&this.cos.isSupported()?yield this.cos.write(n.sha256,t):yield this.priv.write(e,t)})}getSize(e,t){return m(this,null,function*(){if(t?.sha256&&this.cos.isSupported()){let e=yield this.cos.getSize(t.sha256);if(e!==-1)return e}return this.priv.getSize(e)})}list(){return m(this,null,function*(){return this.priv.list()})}delete(e){return m(this,null,function*(){return this.priv.delete(e)})}},M=`__metadata__`,He=`polyfill_for_older_version`;function Ue(e){if(e&&e.sha256)return{sha256:e.sha256}}var We=class{constructor(e=[new Ve]){p(this,`sb`);for(let t of e)if(t.isSupported()){this.sb=t;return}throw Error(`No supported storage backend found`)}getNameFromURL(e){return m(this,null,function*(){return Ge(e,``)})}write(e,t,n){return m(this,null,function*(){yield this.sb.write(e,t),yield this.writeMetadata(e,n)})}download(e){return m(this,arguments,function*(e,t={}){let n=yield Ge(e,``),r=yield Fe(e,t.headers??{}),i=r?{sha256:r}:void 0;if(i&&(yield this.sb.getSize(n,i))!==-1){if(!(yield this.getMetadata(n))){let i=yield fetch(e,d({method:`HEAD`},t.headers?{headers:t.headers}:{})),a=i.headers.get(`content-length`),o=(i.headers.get(`etag`)||``).replace(/[^A-Za-z0-9]/g,``);yield this.writeMetadata(n,d({originalURL:e,originalSize:parseInt(a??`0`,10),etag:o,sha256:r},t.metadataAdditional??{}))}return}let a=yield fetch(e,d(d({},t.headers?{headers:t.headers}:{}),t.signal?{signal:t.signal}:{}));if(!a.ok||!a.body)throw Error(`Failed to fetch ${e}: HTTP ${a.status}`);let o=a.headers.get(`content-length`),s=(a.headers.get(`etag`)||``).replace(/[^A-Za-z0-9]/g,``),c=parseInt(o??`0`,10),l=t.progressCallback,u=0,f=0,p=new TransformStream({transform(e,t){if(u+=e.byteLength,l){let e=Date.now();e-f>100&&(f=e,l({loaded:u,total:c}))}t.enqueue(e)},flush(){l?.({loaded:u,total:c||u})}}),m=d({originalURL:e,originalSize:c,etag:s},t.metadataAdditional??{});r&&(m.sha256=r),yield this.sb.write(n,a.body.pipeThrough(p),i),yield this.writeMetadata(n,m)})}open(e){return m(this,null,function*(){let t=Ue(yield this.getMetadata(e)),n=yield this.sb.read(e,t);if(n)return n;let r=yield Ge(e,``),i=Ue(yield this.getMetadata(r));return this.sb.read(r,i)})}getSize(e){return m(this,null,function*(){let t=Ue(yield this.getMetadata(e));return this.sb.getSize(e,t)})}getMetadata(e){return m(this,null,function*(){let t=yield this.sb.read(`${M}${e}`),n=yield this.sb.getSize(e);if(!t)return n>0?{etag:He,originalSize:n,originalURL:``}:null;try{return yield new Response(t).json()}catch{return null}})}list(){return m(this,null,function*(){let e=yield this.sb.list(),t={};for(let{key:n}of e)if(n.startsWith(M)){let e=yield this.sb.read(n);if(e){let r=yield new Response(e).json().catch(()=>null);t[n.slice(M.length)]=r}}let n=[];for(let{key:r,size:i}of e)r.startsWith(M)||n.push({name:r,size:i,metadata:t[r]||{originalSize:i,originalURL:``,etag:``}});return n})}clear(){return m(this,null,function*(){yield this.deleteMany(()=>!0)})}delete(e){return m(this,null,function*(){let t=yield this.getNameFromURL(e);yield this.deleteMany(n=>n.name===e||n.name===t)})}deleteMany(e){return m(this,null,function*(){let t=yield this.list();for(let n of t)e(n)&&(yield this.sb.delete(n.name),yield this.sb.delete(`${M}${n.name}`))})}writeMetadata(e,t){return m(this,null,function*(){let n=new Blob([JSON.stringify(t)],{type:`text/plain`});yield this.sb.write(`${M}${e}`,n.stream())})}};function Ge(e,t){return m(this,null,function*(){let n=yield crypto.subtle.digest(`SHA-1`,new TextEncoder().encode(e));return`${t}${Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}_${e.split(`/`).pop()}`})}var Ke=3,qe=class{constructor(e,t,n,r){p(this,`modelManager`),p(this,`url`),p(this,`mmprojUrl`),p(this,`size`),p(this,`files`),this.modelManager=e,this.url=t,this.mmprojUrl=n,r?(this.files=this.getAllFiles(r),this.size=ae(this.files.map(e=>e.metadata.originalSize))):(this.files=[],this.size=0)}open(){return m(this,null,function*(){if(this.size===-1)throw new N(`Model is deleted from the cache; Call ModelManager.downloadModel to re-download the model`,`load_error`);let e=[];for(let t of this.files){let n=yield this.modelManager.cacheManager.open(t.name);if(!n)throw Error(`Failed to open file ${t.name}; Hint: the model may be invalid, please refresh it`);e.push(n)}return e})}validate(){let e=Je.parseModelUrl(this.url).length;if(this.mmprojUrl&&(e+=1),this.size===-1)return`deleted`;if(this.size<16||this.files.length!==e)return`invalid`;for(let e of this.files)if(!e.metadata||e.metadata.originalSize!==e.size)return`invalid`;return`valid`}refresh(){return m(this,arguments,function*(e={}){let t=Je.parseModelUrl(this.url);this.mmprojUrl&&t.push(this.mmprojUrl);let n=t.map((e,t)=>({url:e,index:t}));this.modelManager.logger.debug(`Downloading model files:`,t);let r=this.modelManager.params.parallelDownloads??Ke,i=yield this.getTotalDownloadSize(t),a=[],o=()=>m(this,null,function*(){for(;n.length>0;){let t=n.shift();if(!t)break;yield this.modelManager.cacheManager.download(t.url,f(d({},e),{metadataAdditional:{originalURL:t.url,mmprojURL:this.mmprojUrl},progressCallback:({loaded:n})=>{var r;a[t.index]=n,(r=e.progressCallback)==null||r.call(e,{loaded:ae(a),total:i})}}))}}),s=[];for(let e=0;ee+t.metadata.originalSize,0)})}remove(){return m(this,null,function*(){this.files=this.getAllFiles(yield this.modelManager.cacheManager.list()),yield this.modelManager.cacheManager.deleteMany(e=>!!this.files.find(t=>t.name===e.name)),this.size=-1})}getAllFiles(e){let t=new Set(Je.parseModelUrl(this.url));this.mmprojUrl&&t.add(this.mmprojUrl);let n=[];for(let r of t){let t=e.find(e=>e.metadata.originalURL===r);if(!t)throw Error(`Model file not found: ${r}`);n.push(t)}return n.sort((e,t)=>e.metadata.originalURL.localeCompare(t.metadata.originalURL)),n}getTotalDownloadSize(e){return m(this,null,function*(){return ae((yield Promise.all(e.map(e=>fetch(e,{method:`HEAD`})))).map(e=>Number(e.headers.get(`content-length`)||`0`)))})}},Je=class e{constructor(e={}){p(this,`cacheManager`),p(this,`params`),p(this,`logger`),this.cacheManager=e.cacheManager||new We,this.params=e,this.logger=e.logger||console}static parseModelUrl(e){if(Array.isArray(e))return e;let t=/-(\d{5})-of-(\d{5})\.gguf(?:\?.*)?$/,n=e.match(/\.gguf(\?.*)?$/)?.[1]??``,r=e.match(t);if(!r)return[e];let i=e.replace(t,``),a=r[2];return Array.from({length:Number(a)},(e,t)=>(t+1).toString().padStart(5,`0`)).map(e=>`${i}-${e}-of-${a}.gguf${n}`)}getModels(){return m(this,arguments,function*(t={}){let n=yield this.cacheManager.list(),r=[];for(let t of n){let i=e.parseModelUrl(t.metadata.originalURL),a=t.metadata.mmprojURL;(i.length===1||i[0]===t.metadata.originalURL)&&r.push(new qe(this,t.metadata.originalURL,a,n))}return t.includeInvalid||(r=r.filter(e=>e.validate()===`valid`)),r})}downloadModel(e){return m(this,arguments,function*(e,t={}){let n=A(e)?{url:e}:e;if(!ge(n.url))throw new N(`Invalid model URL: ${n.url}; URL must ends with ".gguf"`,`download_error`);let r=new qe(this,n.url,n.mmprojUrl);return r.validate()!==`valid`&&(yield r.refresh(t)),r})}getModelOrDownload(e){return m(this,arguments,function*(e,t={}){var n;let r=(yield this.getModels()).find(t=>t.url===e.url);return r?((n=t.progressCallback)==null||n.call(t,{loaded:r.size,total:r.size}),r):this.downloadModel(e,t)})}clear(){return m(this,null,function*(){yield this.cacheManager.clear()})}},Ye={worker:`https://cdn.jsdelivr.net/npm/@wllama/wllama-compat@3.5.1/wasm/wllama.js`,wasm:`https://cdn.jsdelivr.net/npm/@wllama/wllama-compat@3.5.1/wasm/wllama.wasm`};f(d({},console),{debug:()=>{}});var N=class extends Error{constructor(e,t=`unknown_error`){super(e),p(this,`type`),this.type=t}},Xe=class extends Error{constructor(){super(`Operation aborted`),p(this,`name`,`AbortError`)}},Ze=class extends Error{constructor(e,t){super(e),p(this,`name`,`RuntimeError`),p(this,`stack`),this.stack=t}},Qe=class{constructor(e,t={}){if(p(this,`cacheManager`),p(this,`modelManager`),p(this,`compat`,null),p(this,`proxy`,null),p(this,`config`),p(this,`pathConfig`),p(this,`useMultiThread`,!1),p(this,`nbThreads`,1),p(this,`useEmbeddings`,!1),p(this,`useRerank`,!1),p(this,`loadedContextInfo`,null),p(this,`seed`),p(this,`bosToken`,-1),p(this,`eosToken`,-1),p(this,`eotToken`,-1),p(this,`eogTokens`,new Set),p(this,`addBosToken`,!1),p(this,`addEosToken`,!1),p(this,`mediaMarker`),p(this,`chatTemplate`),p(this,`metadata`),p(this,`hasEncoder`,!1),p(this,`decoderStartToken`,-1),p(this,`chatTemplateKwargs`,{}),pe(),!e)throw new N(`AssetsPathConfig is required`);this.pathConfig=e,this.config=t,this.cacheManager=t.cacheManager??new We,this.modelManager=t.modelManager??new Je({cacheManager:this.cacheManager,logger:t.logger??console,parallelDownloads:t.parallelDownloads,allowOffline:t.allowOffline}),this.setCompat(`default`)}logger(){return this.config.logger??console}checkModelLoaded(){if(!this.isModelLoaded())throw new N(`loadModel() is not yet called`,`model_not_loaded`)}static getLibllamaVersion(){return Se}setCompat(e,t=`safari`){if(t===`safari`&&!this.config.forceCompat&&me()){this.compat=null;return}this.compat=e==="default"?Ye:e}isModelLoaded(){return!!this.proxy&&!!this.metadata}getBOS(){return this.bosToken}getEOS(){return this.eosToken}getEOT(){return this.eotToken}isTokenEOG(e){return e===this.eosToken||e===this.eotToken||this.eogTokens.has(e)}getDecoderStartToken(){return this.decoderStartToken}getModelMetadata(){return this.checkModelLoaded(),this.metadata}isMultithread(){return this.checkModelLoaded(),this.useMultiThread}getNumThreads(){return this.checkModelLoaded(),this.useMultiThread?this.nbThreads:1}isEncoderDecoderArchitecture(){return this.checkModelLoaded(),this.hasEncoder}mustAddBosToken(){return this.checkModelLoaded(),this.addBosToken}mustAddEosToken(){return this.checkModelLoaded(),this.addEosToken}getChatTemplate(){return this.checkModelLoaded(),this.chatTemplate??null}isSupportWebGPU(){return de()}loadModelFromUrl(e){return m(this,arguments,function*(e,t={}){let n=A(e)?{url:e}:e,r=yield(t.useCache??!0?yield this.modelManager.getModelOrDownload(n,t):yield this.modelManager.downloadModel(n,t)).open();return yield this.loadModel(r,t)})}loadModelFromHF(e){return m(this,arguments,function*(e,t={}){let n=yield Pe(e);return yield this.loadModelFromUrl(n,t)})}loadModel(e){return m(this,arguments,function*(e,t={}){let n=e instanceof qe?yield e.open():[...e];if(n.some(e=>e.size===0))throw new N(`Input model (or splits) must be non-empty Blob or File`,`load_error`);if(!this.pathConfig.default)throw new N(`"default" is missing from pathConfig`,`load_error`);if(this.proxy)throw new N(`Module is already initialized`,`load_error`);let r=t.n_gpu_layers??99999,i=t.offload_token_embedding===!0||t.offload_token_embedding===void 0&&r!==0,a=!1;if(i&&de())try{a=!!((yield navigator.gpu.requestAdapter())?.features)?.has(`shader-f16`)}catch{a=!1}if(t.offload_token_embedding===!0&&!a)throw new N(`offload_token_embedding was requested, but WebGPU is unavailable`,`load_error`);let o=t.offload_token_embedding??a,s=yield se(),c=Math.floor((navigator.hardwareConcurrency||1)/2),l=t.n_threads??c;this.nbThreads=l,this.useMultiThread=s&&l>1;let u=this.getWorkerResources();this.proxy=new Oe(u,this.useMultiThread?l:0,this.config.suppressNativeLog??!1,this.logger());let p=t.log_level??2;this.config.suppressNativeLog&&(p=9999);let m=yield oe(n);yield this.proxy.moduleInit(m.all),this.logger().debug(`Calling wllamaStart...`);let h=yield this.proxy.wllamaStart();if(!h.success)throw new N(`Error while calling start function, result = ${h}`);this.logger().debug(`Loading model...`);let g=yield this.proxy.wllamaAction(`load`,{_name:`load_req`,log_level:p,use_mmap:!be(u.compat),use_mlock:!1,n_gpu_layers:r,offload_token_embedding:o,n_ctx:t.n_ctx??1024,n_threads:this.useMultiThread?l:1,n_ctx_auto:!1,mmproj_path:m.mmproj?`/models/${j}`:void 0,model_paths:m.llm.map(e=>`models/${e.name}`),embeddings:t.embeddings,offload_kqv:t.offload_kqv,n_batch:t.n_batch,n_ubatch:t.n_ubatch,pooling_type:t.pooling_type,rope_scaling_type:t.rope_scaling_type,rope_freq_base:t.rope_freq_base,rope_freq_scale:t.rope_freq_scale,yarn_ext_factor:t.yarn_ext_factor,yarn_attn_factor:t.yarn_attn_factor,yarn_beta_fast:t.yarn_beta_fast,yarn_beta_slow:t.yarn_beta_slow,yarn_orig_ctx:t.yarn_orig_ctx,cache_type_k:t.cache_type_k,cache_type_v:t.cache_type_v,n_parallel:1,kv_unified:!1,flash_attn:t.flash_attn,swa_full:t.swa_full,chat_template:t.chat_template,jinja:t.jinja,reasoning:t.reasoning,image_min_tokens:t.image_min_tokens,image_max_tokens:t.image_max_tokens,warmup:t.warmup,no_kv_offload:t.no_kv_offload,mmproj_offload:t.mmproj_offload,cont_batching:t.cont_batching,n_keep:t.n_keep,ctx_shift:t.ctx_shift,cache_idle_slots:t.cache_idle_slots,n_cache_reuse:t.n_cache_reuse,lora_paths:t.lora_adapters?.map(e=>e.path),lora_scales:t.lora_adapters?.map(e=>e.scale??1),lora_init_without_apply:t.lora_init_without_apply,spec_draft_model:t.spec_draft_model,spec_draft_ngl:t.spec_draft_ngl,spec_draft_n_max:t.spec_draft_n_max,spec_draft_n_min:t.spec_draft_n_min,spec_draft_p_min:t.spec_draft_p_min,spec_draft_threads:t.spec_draft_threads,spec_draft_threads_batch:t.spec_draft_threads_batch,kv_overrides_keys:t.kv_overrides?Object.keys(t.kv_overrides):void 0,kv_overrides_vals:t.kv_overrides?Object.values(t.kv_overrides):void 0,reasoning_budget_tokens:t.reasoning_budget_tokens,reasoning_budget_message:t.reasoning_budget_message,reasoning_format:t.reasoning_format,skip_chat_parsing:t.skip_chat_parsing,prefill_assistant:t.prefill_assistant});if(!g.success)throw yield this.exit(),new N(`Failed to load model`,`load_error`);let _=f(d({},g),{metadata:{}});for(let e=0;et.score-e.score),{model:this.getModelMetadata().meta[`general.name`]??``,object:`list`,usage:{prompt_tokens:n,total_tokens:n},results:r.slice(0,t).map(({index:e,score:t})=>({index:e,relevance_score:t}))}})}createChatCompletion(e){return m(this,null,function*(){if(Object.keys(this.chatTemplateKwargs).length>0&&(e=f(d({},e),{chat_template_kwargs:d(d({},this.chatTemplateKwargs),e.chat_template_kwargs??{})})),e.stream&&e.onData)yield this.createCompletionImpl(e);else if(e.stream)return yield this.createCompletionGenerator(e);else return yield this.createCompletionImpl(f(d({},e),{stream:!1}))})}createCompletion(e){return m(this,null,function*(){if(e.stream&&e.onData)yield this.createCompletionImpl(e);else if(e.stream)return yield this.createCompletionGenerator(e);else return yield this.createCompletionImpl(f(d({},e),{stream:!1}))})}createCompletionImpl(e){return m(this,null,function*(){this.checkModelLoaded();let t=!!e.stream,n=!!e.messages,r={};this.seed!==void 0&&(r.seed=this.seed);let i=[];if(n){let t=this.prepareMultimodalInput(e);e=t.params,i=t.files}if(!(yield this.proxy.wllamaAction(`completion`,{_name:`cmpl_req`,is_chat:n,data_json:JSON.stringify(d(d({},e),r)),files:i.map(e=>new Uint8Array(e))})).success)throw new N(`Model failed to start inference`,`inference_error`);return yield this.getResponse(e,t)})}createCompletionGenerator(e){return new Promise(t=>{t(ye(t=>{this.createCompletionImpl(f(d({},e),{onData:e=>t(e)})).then(()=>t(void 0,!0)).catch(e=>t(void 0,!1,e))})())})}supportInputModality(e){if(this.checkModelLoaded(),e===`image`)return!!this.loadedContextInfo.has_image_input;if(e===`audio`)return!!this.loadedContextInfo.has_audio_input;throw new N(`Unsupported modality: `+e,`unknown_error`)}exit(){return m(this,null,function*(){yield this.proxy?.wllamaExit(),this.proxy=null})}testBackendOps(){return m(this,arguments,function*(e=[]){if(!this.pathConfig.default)throw new N(`"default" is missing from pathConfig`,`load_error`);if(!(yield se()))throw new N(`Multi-threading is required to run backend ops tests, but it is not supported in the current environment.`);let t=new Oe(this.getWorkerResources(),0,this.config.suppressNativeLog??!1,this.logger());try{yield t.moduleInit([]);let n=yield t.wllamaStart();if(!n.success)throw new N(`Error while calling start function, result = ${n}`);let r=yield t.wllamaAction(`test_backend_ops`,{_name:`tbop_req`,args:[`test-backend-ops`,...e]});return{retcode:r.retcode,success:r.success}}finally{yield t.wllamaExit()}})}_getDebugInfo(){return m(this,null,function*(){return this.checkModelLoaded(),yield this.proxy.wllamaDebug()})}jsonDecode(e){try{return JSON.parse(e)}catch{throw this.logger().error(`Failed to parse JSON:`,e),new N(`Failed to parse model output`,`inference_error`)}}prepareMultimodalInput(e){let t=e.messages,n=[],r=[];for(let e of t)if(Array.isArray(e.content)){let t=[];for(let n of e.content)if(n.type===`text`)t.push(n);else{if(!this.mediaMarker)throw new N(`Media marker is undefined`,`inference_error`);r.push(n.data),t.push({type:`text`,text:this.mediaMarker})}n.push(f(d({},e),{content:t}))}else n.push(e);return{params:f(d({},e),{messages:n}),files:r}}getRerankResult(){return m(this,null,function*(){for(;;){let e=yield this.proxy.wllamaAction(`get_result`,{_name:`gres_req`}),t=e.data_json;if(t&&t.length>0){if(e.is_error)throw new N(this.jsonDecode(t).message||`Unknown reranking error`,`inference_error`);return this.jsonDecode(t)}if(!e.has_more)break}throw new N(`No reranking result received`,`inference_error`)})}getResponse(e,t){return m(this,null,function*(){var n;let r=null;for(;;){if(e.abortSignal?.aborted)throw new Xe;let i=yield this.proxy.wllamaAction(`get_result`,{_name:`gres_req`}),a=i.data_json;if(!a||a.length===0){if(i.has_more)continue;break}if(a==`null`)continue;let o=this.jsonDecode(a);if(r=o,i.is_error)throw this.logger().error(`Model returned an error:`,o),new N(o.message||`Unknown inference error`,`inference_error`);if(t){Array.isArray(o)||(o=[o]);for(let t of o)(n=e.onData)==null||n.call(e,t),r=t}if(!i.has_more)break}return r})}getWorkerResources(){let e={wasmPath:re(this.pathConfig.default),compat:!1},t=this.config.forceCompat===!0;if(t||xe()){let n=this.compat?.worker,r=typeof n==`string`&&n.trim().length>0||typeof n==`object`&&!!n&&typeof n.code==`string`&&n.code.trim().length>0,i=this.compat?.wasm,a=typeof i==`string`&&i.trim().length>0;if(t&&(!r||!a))throw new N(`forceCompat requires both compat worker JS and compat WASM resources. Configure them with setCompat() before loading.`,`load_error`);this.compat?(this.compat.worker===Ye.worker&&this.compat.wasm===Ye.wasm&&(this.logger().warn(`Compatibility mode is activated, using resources from CDN. To use local resources, please refer to @wllama/wllama-compat package.`),this.logger().warn(`IMPORTANT: Performance will be significantly degraded in compatibility mode.`)),e.wasmPath=re(this.compat.wasm),e.jsPath=this.compat.worker,e.compat=!0):this.logger().warn(`Not using compat mode`+(me()?` (expected on Firefox - WebGPU will be disabled)`:``))}return me()&&(e.compat?this.logger().warn(`Using compat mode on Firefox, performance will be significantly degraded; Consider enabling "javascript.options.wasm_js_promise_integration" in "about:config".`):ue()||this.logger().warn(`WebGPU is disabled on Firefox due to missing JSPI support. Please consider enabling compat mode, or enabling "javascript.options.wasm_js_promise_integration" in "about:config".`)),e}},$e={schemaVersion:2,upstream:`https://github.com/ngxson/wllama`,wllamaRevision:`912c18b75d4358c1405a64646b8dbe43a205943b`,llamaCppRevision:`00fa7cb284cbf133fc426733bd64238a3588a33e`,license:`MIT`,patch:`Expose offload_token_embedding and n_ubatch; place token_embd.weight on WebGPU whenever GPU layers are requested; fail loudly when the requested WebGPU buffer is unavailable; add an opt-in forceCompat selector for controlled benchmark A/B runs; expose native model-load and prompt-prefill progress; type sampled token ids in OAI logprob payloads; accept one raw token-id completion prompt; fail loudly on null action responses; serialize partial-token logprob payloads with the server's UTF-8-safe JSON path; drain every completion through its terminal result while filtering queued responses by task id; use the validated raw-layout vec4 Q1_0 WG64 matvec kernel in the JSPI release build; and retain the scalar Q1_0 path in the Safari compat build.`,patchSet:{format:`git-diff-binary`,path:`vendor/wllama-bonsai/PATCH.diff`,bytes:97836,sha256:`60a5280bea5fc5ae11065f4c83fd2d532526cdcb7977cbe927cac7ae90926bde`,files:[`CMakeLists.txt`,`cpp/glue.hpp`,`cpp/wllama-context.h`,`llama.cpp/ggml/src/ggml-webgpu/CMakeLists.txt`,`llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp`,`llama.cpp/ggml/src/ggml-webgpu/ggml-webgpu.cpp`,`llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl`,`llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/gated_delta_net.wgsl`,`llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl`,`llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl`,`llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl`,`llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl`,`llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q1_dual_glu.wgsl`,`llama.cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q1_glu.wgsl`,`package.json`,`scripts/docker-compose.yml`,`src/glue/messages.ts`,`src/types/oai-compat.ts`,`src/types/types.ts`,`src/wllama.ts`,`src/workers-code/llama-cpp.js`]},build:{emsdkImage:`emscripten/emsdk:4.0.20-arm64`,builderImageId:`sha256:1143696588c47ddcfa796d7a84663a1fd1d8f28e2e1db62d50cac618776d11dd`,dawnTag:`v20260317.182325`,dawnArchiveSha256:`8dcae86c630d76b6794b271c6572becba36f4237d132bee121a56638c3d76575`,runtimeProfiles:{jspi:{GGML_WEBGPU_Q1_VEC4:!0,GGML_WEBGPU_Q1_VEC4_WG_SIZE:64},compat:{GGML_WEBGPU_Q1_VEC4:!1}}},files:[{path:`vendor/wllama-bonsai/esm/index.js`,bytes:366883,sha256:`a02f02b86d7dac8e3bd6c21225910c755bb85ec64ac7d323bfbfa2477b225e3d`},{path:`vendor/wllama-bonsai/esm/index.cjs`,bytes:366633,sha256:`34f64e3fe6b4f96c252b5d12ad2fd751598a2e02473fcb1023efc235eddea4d4`},{path:`vendor/wllama-bonsai/esm/index.min.js`,bytes:315675,sha256:`6eaa53c281b48a085c5680d6f18185dcc2cc5765f87cfb9999c2d9329ccb8fe9`},{path:`vendor/wllama-bonsai/esm/index.min.js.map`,bytes:60959,sha256:`50e7fc21df22b0d3c6d49f2013e8490179a938e1b0429f1f08d1d01f35ccdd0d`},{path:`public/wasm/wllama.wasm`,bytes:8048681,sha256:`dbded8334921b51877ade32009bcaee5b7423e3b39679089a970062c57128acb`},{path:`public/wasm/wllama-compat.wasm`,bytes:14885188,sha256:`f9b1bd2bd2a62a6b95ab52ecda92d10c709bc1ac3b6be9bb450e5adeff8dd39f`},{path:`public/wasm/wllama-compat.js`,bytes:166895,sha256:`0b667db536815fb9e5dc9ffbfbd6ba29affdda38a4ba892d5372ddb41ce9a8c8`}],experiment:{id:`turbo-q1-tritile-gdn-dual-glu-release-v1`,status:`release-candidate`,compileDefinitions:{GGML_WEBGPU_Q1_VEC4:!0,GGML_WEBGPU_Q1_VEC4_WG_SIZE:64,GGML_WEBGPU_Q1_VEC4_OUTPUTS_PER_WG:4,GGML_WEBGPU_Q1_VEC4_SHAPE_AWARE_OUTPUTS:!0,GGML_WEBGPU_Q1_VEC4_LARGE_K_THRESHOLD:4096,GGML_WEBGPU_Q1_ROW_RETILE:!1,GGML_WEBGPU_COMMAND_SUBMIT_BATCH_SIZE:64,GGML_WEBGPU_TURBO_TRACE:!1,GGML_WEBGPU_GPU_PROFILE:!1,GGML_WEBGPU_BATCH_PARAM_UPLOADS:!1,GGML_WEBGPU_Q1_GLU_FUSION:!1,GGML_WEBGPU_Q1_DUAL_GLU_FUSION:!0,GGML_WEBGPU_GDN_CACHE_FUSION:!0},wasmSha256:`dbded8334921b51877ade32009bcaee5b7423e3b39679089a970062c57128acb`,moduleSha256:`a02f02b86d7dac8e3bd6c21225910c755bb85ec64ac7d323bfbfa2477b225e3d`,compatWasmSha256:`f9b1bd2bd2a62a6b95ab52ecda92d10c709bc1ac3b6be9bb450e5adeff8dd39f`,compatWorkerSha256:`0b667db536815fb9e5dc9ffbfbd6ba29affdda38a4ba892d5372ddb41ce9a8c8`}};let et=[`maxBindGroups`,`maxBindingsPerBindGroup`,`maxBufferSize`,`maxComputeInvocationsPerWorkgroup`,`maxComputeWorkgroupSizeX`,`maxComputeWorkgroupSizeY`,`maxComputeWorkgroupSizeZ`,`maxComputeWorkgroupStorageSize`,`maxComputeWorkgroupsPerDimension`,`maxDynamicStorageBuffersPerPipelineLayout`,`maxStorageBufferBindingSize`,`maxStorageBuffersPerShaderStage`];function tt(){return navigator.gpu??null}function nt(e,t){return!/Firefox\/([0-9.]+)(?:\s|$)/.test(e)||t}function rt(){return!!WebAssembly.Suspending}function it(e){let t=e,n={},r=new Set([...et,...Object.keys(t)]);for(let e of r){let r=t[e];typeof r==`number`&&Number.isFinite(r)&&(n[e]=r)}return n}async function at(){if(!nt(navigator.userAgent,rt()))return{available:!1,name:null,vendor:null,architecture:null,device:null,description:null,limits:{},features:[]};let e=tt();if(!e)return{available:!1,name:null,vendor:null,architecture:null,device:null,description:null,limits:{},features:[]};let t=await e.requestAdapter();if(!t)return{available:!1,name:null,vendor:null,architecture:null,device:null,description:null,limits:{},features:[]};let n=t.info??await t.requestAdapterInfo?.()??{},r=e=>e?.trim()||null,i=r(n.vendor),a=r(n.architecture),o=r(n.device),s=r(n.description);return{available:!0,name:s??o??a??i??`WebGPU adapter`,vendor:i,architecture:a,device:o,description:s,limits:it(t.limits),features:[...t.features].sort()}}async function P(){let[e,t]=await Promise.all([navigator.storage.estimate(),navigator.storage.persisted()]);return{usageBytes:e.usage??null,quotaBytes:e.quota??null,persisted:t}}async function ot(){let e=await navigator.storage.persist();return{...await P(),granted:e}}function st(e,t){return e.quotaBytes===null||e.usageBytes===null?null:Math.max(0,e.quotaBytes-e.usageBytes+t)}function ct(e,t,n){let r=e.id===`27b`&&n.tuningScope===`benchmark`&&n.requestedBackend===`webgpu`&&n.flashMode===`auto`&&n.kvCacheType===`q4_0`,i=e.id===`27b`?Math.min(e.contextLength,r?8448:4096):e.contextLength;return{allowed:Number.isSafeInteger(t)&&t>0&&t<=i,limit:i}}function lt(e,t){if(!t.available)return[`WebGPU adapter is unavailable.`];let n=[];e.runtimePolicy.tokenEmbeddingOnWebGPU&&!t.features.includes(`shader-f16`)&&n.push(`WebGPU adapter lacks shader-f16, which the token-embedding single-graph path requires.`);for(let[r,i]of Object.entries(e.requiredLimits)){let a=t.limits[r];a===void 0?n.push(`WebGPU adapter does not report required limit ${r}.`):a0?a.push(...c):l=`webgpu`:c.length===0?l=`webgpu`:e.cpuFallback?(l=`wasm`,o.push(...c.map(e=>`${e} Falling back to CPU-WASM.`))):(a.push(...c),a.push(`${e.displayName} forbids CPU-WASM fallback; choose a smaller tier.`)),a.length>0&&(l=null),{allowed:a.length===0,requestedBackend:t,selectedBackend:l,reasons:a,warnings:o,requiredBytes:e.downloadBytes,availableStorageBytes:s}}function dt(e,t,n){if(t===`webgpu`&&(e.runtimePolicy.tokenEmbeddingOnWebGPU||e.runtimePolicy.requireSingleWebGPUGraph)){if(n.opsOnCpu!==0)throw Error(`${e.displayName} WebGPU tripwire: native log reports ${n.opsOnCpu} CPU op(s).`);if(n.nGraphSplits!==1)throw Error(`${e.displayName} WebGPU tripwire: token embedding policy requires one graph split, observed ${String(n.nGraphSplits)}.`);if(!n.backends.includes(`WebGPU`))throw Error(`${e.displayName} WebGPU tripwire: native log did not confirm the WebGPU backend.`);if(n.layersGpu===null||n.layersGpu.offloaded!==n.layersGpu.total)throw Error(`${e.displayName} WebGPU tripwire: native log did not confirm all layers on the GPU.`)}} +/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */ +function ft(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name===`Uint8Array`}function pt(e,t,n=``){let r=ft(e),i=e?.length,a=t!==void 0;if(!r||a&&i!==t){let o=n&&`"${n}" `,s=a?` of length ${t}`:``,c=r?`length=${i}`:`type=${typeof e}`;throw Error(o+`expected Uint8Array`+s+`, got `+c)}return e}function mt(e,t=!0){if(e.destroyed)throw Error(`Hash instance has been destroyed`);if(t&&e.finished)throw Error(`Hash#digest() has already been called`)}function ht(e,t){pt(e,void 0,`digestInto() output`);let n=t.outputLen;if(e.length=`+n)}function gt(...e){for(let t=0;t>>t}let vt=typeof Uint8Array.from([]).toHex==`function`&&typeof Uint8Array.fromHex==`function`,yt=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,`0`));function bt(e){if(pt(e),vt)return e.toHex();let t=``;for(let n=0;ne(n).update(t).digest(),r=e(void 0);return n.outputLen=r.outputLen,n.blockLen=r.blockLen,n.create=t=>e(t),Object.assign(n,t),Object.freeze(n)}let St=e=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,e])});function Ct(e,t,n){return e&t^~e&n}function wt(e,t,n){return e&t^e&n^t&n}var Tt=class{blockLen;outputLen;padOffset;isLE;buffer;view;finished=!1;length=0;pos=0;destroyed=!1;constructor(e,t,n,r){this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=r,this.buffer=new Uint8Array(e),this.view=_t(this.buffer)}update(e){mt(this),pt(e);let{view:t,buffer:n,blockLen:r}=this,i=e.length;for(let a=0;ar-a&&(this.process(n,0),a=0);for(let e=a;el.length)throw Error(`_sha2: outputLen bigger than state`);for(let e=0;e>>3,i=F(n,17)^F(n,19)^n>>>10;L[e]=i+L[e-7]+r+L[e-16]|0}let{A:n,B:r,C:i,D:a,E:o,F:s,G:c,H:l}=this;for(let e=0;e<64;e++){let t=F(o,6)^F(o,11)^F(o,25),u=l+t+Ct(o,s,c)+Et[e]+L[e]|0,d=(F(n,2)^F(n,13)^F(n,22))+wt(n,r,i)|0;l=c,c=s,s=o,o=a+u|0,a=i,i=r,r=n,n=u+d|0}n=n+this.A|0,r=r+this.B|0,i=i+this.C|0,a=a+this.D|0,o=o+this.E|0,s=s+this.F|0,c=c+this.G|0,l=l+this.H|0,this.set(n,r,i,a,o,s,c,l)}roundClean(){gt(L)}destroy(){this.set(0,0,0,0,0,0,0,0),gt(this.buffer)}},Ot=class extends Dt{A=I[0]|0;B=I[1]|0;C=I[2]|0;D=I[3]|0;E=I[4]|0;F=I[5]|0;G=I[6]|0;H=I[7]|0;constructor(){super(32)}};let kt=xt(()=>new Ot,St(1));async function At(e,r,i,a){i&&n(i);let o=kt.create(),s=e.stream().getReader(),c=()=>{s.cancel(t()).catch(()=>void 0)};i?.addEventListener(`abort`,c,{once:!0});let l=0,u=0;a?.(0,e.size);try{for(;;){i&&n(i);let{done:t,value:r}=await s.read();if(i&&n(i),t)break;o.update(r),l+=r.byteLength;let c=performance.now();c-u>=100&&(u=c,a?.(Math.min(l,e.size),e.size))}a?.(e.size,e.size);let t=bt(o.digest());return{actualSha256:t,matches:t===r}}finally{i?.removeEventListener(`abort`,c),s.releaseLock(),o.destroy()}}let jt=new Set([`1_7b`,`4b`,`8b`,`27b`]),Mt=/^[0-9a-f]{64}$/,Nt=/^[0-9a-f]{40}$/,Pt=/-(\d{5})-of-(\d{5})\.gguf$/i;function R(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function z(e,t){if(!e)throw Error(`Invalid model manifest v2: ${t}`)}function B(e,t){return z(typeof e==`string`&&e.length>0,`${t} must be a non-empty string`),e}function V(e,t){return z(Number.isSafeInteger(e)&&Number(e)>0,`${t} must be a positive integer`),Number(e)}function Ft(e,t){return z(Number.isSafeInteger(e)&&Number(e)>=0,`${t} must be a non-negative integer`),Number(e)}function It(e,t){let n=B(e,t);return z(Mt.test(n),`${t} must be lowercase SHA-256 hex`),n}function Lt(e,t){let n=B(e,t);return z(Nt.test(n),`${t} must be a full 40-character commit`),n}function Rt(e,t){let n=B(e,t);return z(/^[^/\s]+\/[^/\s]+$/.test(n),`${t} must be a Hugging Face owner/repository id`),n}function zt(e,t){let n=B(e,t);return z(!n.startsWith(`/`),`${t} must be repository-relative`),z(!n.split(`/`).some(e=>e===``||e===`.`||e===`..`),`${t} contains an unsafe segment`),z(n.toLowerCase().endsWith(`.gguf`),`${t} must point to a GGUF file`),n}function Bt(e,t){return z(R(e),`${t} must be an object`),{repo:Rt(e.repo,`${t}.repo`),revision:Lt(e.revision,`${t}.revision`),file:zt(e.file,`${t}.file`),bytes:V(e.bytes,`${t}.bytes`),sha256:It(e.sha256,`${t}.sha256`)}}function Vt(e,t){z(R(e),`${t} must be an object`);let n={path:zt(e.path,`${t}.path`),bytes:V(e.bytes,`${t}.bytes`),sha256:It(e.sha256,`${t}.sha256`)};if(e.url!==void 0){let r=B(e.url,`${t}.url`);z(new URL(r).protocol===`https:`,`${t}.url must use HTTPS`),n.url=r}return n}function Ht(e,t){z(R(e),`${t} must be an object`);let n={};for(let[r,i]of Object.entries(e))z(r.length>0,`${t} contains an empty key`),n[r]=V(i,`${t}.${r}`);return n}function Ut(e,t){z(R(e),`${t} must be an object`),z(R(e.markers),`${t}.markers must be an object`);let n=e.markers;return z(typeof n.think==`boolean`,`${t}.markers.think must be boolean`),z(typeof n.toolCall==`boolean`,`${t}.markers.toolCall must be boolean`),z(typeof n.toolResponse==`boolean`,`${t}.markers.toolResponse must be boolean`),{bytes:V(e.bytes,`${t}.bytes`),sha256:It(e.sha256,`${t}.sha256`),markers:{think:n.think,toolCall:n.toolCall,toolResponse:n.toolResponse}}}function Wt(e,t){let n=e.map(e=>e.path.match(Pt)),r=n.filter(Boolean).length;if(r===0){z(e.length===1,`${t} must use GGUF split names when it contains multiple files`);return}z(r===e.length,`${t} mixes split and non-split GGUF names`);for(let r=0;r0,`${n}.files must be a non-empty array`);let i=e.files.map((e,t)=>Vt(e,`${n}.files[${t}]`));Wt(i,`${n}.files`),z(new Set(i.map(e=>e.path)).size===i.length,`${n}.files contains duplicate paths`);let a=V(e.downloadBytes,`${n}.downloadBytes`);z(i.reduce((e,t)=>e+t.bytes,0)===a,`${n}.downloadBytes does not equal the shard byte sum`);let o=V(e.contextLength,`${n}.contextLength`),s=V(e.defaultContext,`${n}.defaultContext`);z(s<=o,`${n}.defaultContext exceeds contextLength`),z(typeof e.cpuFallback==`boolean`,`${n}.cpuFallback must be boolean`),z(R(e.runtimePolicy),`${n}.runtimePolicy must be an object`),z(e.runtimePolicy.flashAttention===!1,`${n}.runtimePolicy.flashAttention must be false`),z(typeof e.runtimePolicy.tokenEmbeddingOnWebGPU==`boolean`,`${n}.runtimePolicy.tokenEmbeddingOnWebGPU must be boolean`),z(typeof e.runtimePolicy.requireSingleWebGPUGraph==`boolean`,`${n}.runtimePolicy.requireSingleWebGPUGraph must be boolean`);let c={id:r,displayName:B(e.displayName,`${n}.displayName`),architecture:B(e.architecture,`${n}.architecture`),source:Bt(e.source,`${n}.source`),files:i,downloadBytes:a,contextLength:o,defaultContext:s,cpuFallback:e.cpuFallback,largestTensorBytes:V(e.largestTensorBytes,`${n}.largestTensorBytes`),requiredLimits:Ht(e.requiredLimits,`${n}.requiredLimits`),chatTemplate:Ut(e.chatTemplate,`${n}.chatTemplate`),hybridDimensions:Ht(e.hybridDimensions,`${n}.hybridDimensions`),nextNTensorCount:Ft(e.nextNTensorCount,`${n}.nextNTensorCount`),runtimePolicy:{flashAttention:!1,tokenEmbeddingOnWebGPU:e.runtimePolicy.tokenEmbeddingOnWebGPU,requireSingleWebGPUGraph:e.runtimePolicy.requireSingleWebGPUGraph}};return z(c.requiredLimits.maxStorageBufferBindingSize===c.largestTensorBytes,`${n}.requiredLimits.maxStorageBufferBindingSize must equal largestTensorBytes`),c.id===`27b`&&(z(c.cpuFallback===!1,`${n} must disable CPU fallback for 27B`),z(c.runtimePolicy.requireSingleWebGPUGraph,`${n} must require a single WebGPU graph for 27B`)),c}function Kt(e){z(R(e),`root must be an object`),z(e.schemaVersion===2,`schemaVersion must equal 2`),z(R(e.repository),`repository must be an object`);let t=Rt(e.repository.id,`repository.id`),n=e.repository.revision===null?null:Lt(e.repository.revision,`repository.revision`);z(Array.isArray(e.models),`models must be an array`);let r=e.models.map(Gt);return z(r.length===jt.size,`models must contain exactly the four Bonsai tiers`),z(new Set(r.map(e=>e.id)).size===r.length,`models contains duplicate ids`),z(r.every(e=>jt.has(e.id)),`models contains an unsupported id`),{schemaVersion:2,repository:{id:t,revision:n},models:r}}async function qt(e,t){let n=await fetch(e,{...t?{signal:t}:{},headers:{Accept:`application/json`}});if(!n.ok)throw Error(`Failed to load model manifest: HTTP ${n.status}`);return Kt(await n.json())}function Jt(e){return e.split(`/`).map(e=>encodeURIComponent(e)).join(`/`)}function Yt(e,t){return z(e.repository.revision!==null,`repository.revision is required before model shards can be loaded`),t.files.map(t=>{let n=`https://huggingface.co/${e.repository.id}/resolve/${e.repository.revision}/${Jt(t.path)}`;if(t.url){let e=new URL(t.url),r=new URL(n);return z(e.origin===r.origin&&e.pathname===r.pathname,`${t.path} URL must match the commit-pinned repository revision`),t.url}return n})}function Xt(e,t){let n=e.models.find(e=>e.id===t);if(!n)throw Error(`Model ${t} is missing from the manifest`);return n}let Zt=[`WebGPU`,`CPU`,`Metal`,`CUDA`,`Vulkan`],Qt=/using device|model buffer size|KV buffer size|compute buffer size|output buffer size|offloaded \d+\/\d+ layers|graph splits\s*=|graph_compute\(|backend\s*=\s*CPU|assigned to (?:device )?CPU|(?:ops?|nodes?).*(?:on|to) CPU|flash_attn\s*=|flash attention.*(?:enabled|disabled)|\bK\s*\([^)]+\).*\bV\s*\([^)]+\)/i,$t=/\bdevice\s+lost!?(?:\s+reason:\s*(-?\d+),\s*message:\s*(.*))?/i,en=/\bWebGPU\s+KV buffer size\s*=\s*(\d+(?:\.\d+)?)\s*(KiB|MiB|GiB)\b/i,tn={kib:1024,mib:1024**2,gib:1024**3};function nn(e){return Zt.find(t=>e.toLowerCase().startsWith(t.toLowerCase()))??e}function rn(e){for(let t of[/ggml_backend_cpu_graph_compute\(\s*(\d+)\s+nodes?\s*\)/i,/backend\s*=\s*CPU\b.*?n_(?:nodes|ops)\s*=\s*(\d+)/i,/(?:backend|device)\s+CPU\b.*?(?:graph|compute).*?(\d+)\s+(?:nodes?|ops?)/i,/(\d+)\s+(?:nodes?|ops?).*?(?:on|to)\s+CPU\b/i]){let n=e.match(t);if(n)return Number(n[1])}return+!!/\b(?:op|node)\b.*?assigned to (?:device )?CPU\b/i.test(e)}function an(e){return Qt.test(e)}function on(e){if(!/\b(?:ggml[_ -]?webgpu|webgpu)\b/i.test(e))return null;let t=e.match($t);if(!t)return null;let n=t[1]===void 0?null:Number(t[1]),r=t[2]?.trim()||null;return{line:e.slice(0,4096),reason:Number.isSafeInteger(n)?n:null,message:r}}function sn(e){if(!e.startsWith(`@@MODEL_LOAD_PROGRESS@@`))return null;try{let t=JSON.parse(e.slice(23));if(t.state!==`loading`&&t.state!==`ready`)return null;let n=Array.isArray(t.stages)?t.stages.filter(e=>typeof e==`string`):[],r=typeof t.current==`string`?t.current:null,i=t.state===`ready`?1:typeof t.value==`number`&&Number.isFinite(t.value)?Math.min(1,Math.max(0,t.value)):0;return{state:t.state,stages:n,current:r,value:i}}catch{return null}}function cn(e){let t=typeof e==`string`?e.split(/\r?\n/):e,n=new Set,r=[],i=0,a=null,o=null,s=null,c=null,l=null,u=0,d=0,f=0;for(let e of t){let t=e.match(/using device\s+([^\s(]+)\s+\(([^)]+)\)/i);t&&n.add(nn(t[2]??t[1]??`unknown`));for(let t of Zt){let r=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);RegExp(`\\b${r}\\s+(?:model|KV|compute|output) buffer size`,`i`).test(e)&&n.add(t)}let p=e.match(/offloaded\s+(\d+)\s*\/\s*(\d+)\s+layers to GPU/i);p&&(a={offloaded:Number(p[1]),total:Number(p[2])});let m=e.match(/graph splits\s*=\s*(\d+)/i);m&&r.push(Number(m[1]));let h=e.match(/\bflash_attn\s*=\s*(enabled|disabled)\b/i),g=e.match(/\bFlash Attention\b.*\b(enabled|disabled)\b/i),_=(h??g)?.[1];_&&(o=_.toLowerCase()===`enabled`);let v=e.match(/\bK\s*\(\s*([^)]+?)\s*\).*\bV\s*\(\s*([^)]+?)\s*\)/i),y=v?.[1],b=v?.[2];y&&b&&(s=y.trim().toLowerCase(),c=b.trim().toLowerCase());let x=e.match(en),S=x?.[1],C=x?.[2];if(S&&C){let e=tn[C.toLowerCase()],t=Math.round(Number(S)*e);l=(l??0)+t}let w=e.match(/\b(model|compute|output) buffer size\s*=\s*(\d+(?:\.\d+)?)\s*(KiB|MiB|GiB)\b/i),T=w?.[1]?.toLowerCase(),E=w?.[2],D=w?.[3];if(T&&E&&D){let e=tn[D.toLowerCase()],t=Math.round(Number(E)*e);T===`model`&&(u+=t),T===`compute`&&(d+=t),T===`output`&&(f+=t)}i+=rn(e)}let p=u+d+f+(l??0);return{backends:[...n],nGraphSplits:r.length>0?Math.max(...r):null,opsOnCpu:i,layersGpu:a,flashAttention:o,cacheTypeK:s,cacheTypeV:c,webgpuKvBufferBytes:l,...u>0?{modelBufferBytes:u}:{},...d>0?{computeBufferBytes:d}:{},...f>0?{outputBufferBytes:f}:{},...p>0?{allocatedBufferBytes:p}:{},webgpuTrace:[]}}var ln=class{lines=[];webgpuTrace=[];recentLines=[];deviceLost=null;deviceLostListeners=new Set;modelLoadListeners=new Set;clear(){this.lines=[],this.webgpuTrace=[],this.recentLines=[],this.deviceLost=null}append(e){let t=e.map(e=>typeof e==`string`?e:JSON.stringify(e)).join(` `);t&&(this.recentLines.push(t.slice(0,4096)),this.recentLines.length>64&&this.recentLines.shift());let n=sn(t);if(n)for(let e of this.modelLoadListeners)e(n);if(!this.deviceLost){let e=on(t);if(e){this.deviceLost=e;for(let t of this.deviceLostListeners)t(e);this.deviceLostListeners.clear()}}an(t)&&(this.lines.push(t.slice(0,4096)),this.lines.length>512&&this.lines.shift()),t.startsWith(`@@WEBGPU_TRACE@@`)&&(this.webgpuTrace.push(t.slice(0,4096)),this.webgpuTrace.length>16384&&this.webgpuTrace.shift())}report(){return{...cn(this.lines),webgpuTrace:[...this.webgpuTrace]}}recent(e=16){return this.recentLines.slice(-Math.max(0,e))}deviceLostSignal(){return this.deviceLost}watchDeviceLost(){if(this.deviceLost)return{promise:Promise.resolve(this.deviceLost),dispose:()=>void 0};let e=null;return{promise:new Promise(t=>{e=t,this.deviceLostListeners.add(t)}),dispose:()=>{e&&this.deviceLostListeners.delete(e),e=null}}}onModelLoadProgress(e){return this.modelLoadListeners.add(e),()=>this.modelLoadListeners.delete(e)}};function H(e,t){if(!e)throw Error(`Invalid streamed tool call: ${t}`)}var un=class{calls=new Map;hasCalls(){return this.calls.size>0}append(e){if(!e)return[];let t=new Set;for(let n of e){H(Number.isSafeInteger(n.index)&&n.index>=0,`index must be a non-negative integer`),H(n.index<4,`index ${n.index} exceeds the 4-call round limit`),H(n.type===void 0||n.type===`function`,`index ${n.index} has an unsupported type`);let e=this.calls.get(n.index)??{id:``,name:``,arguments:``};n.id!==void 0&&(H(typeof n.id==`string`,`index ${n.index} id must be a string`),e.id+=n.id),n.function?.name!==void 0&&(H(typeof n.function.name==`string`,`index ${n.index} name must be a string`),e.name+=n.function.name),n.function?.arguments!==void 0&&(H(typeof n.function.arguments==`string`,`index ${n.index} arguments must be a string`),e.arguments+=n.function.arguments,H(e.arguments.length<=65536,`index ${n.index} arguments exceed 64 KiB`)),this.calls.set(n.index,e),t.add(n.index)}return[...t].sort((e,t)=>e-t).map(e=>{let t=this.calls.get(e);return{index:e,id:t.id,name:t.name,argumentCharacters:t.arguments.length}})}finish(e=!1){if(this.calls.size===0)return H(!e,`finish_reason was tool_calls, but the stream contained no tool calls`),[];try{let e=[...this.calls.keys()].sort((e,t)=>e-t),t=[];for(let n=0;n0,`index ${r} has no id`),H(i.name.length>0,`index ${r} has no function name`);let a;try{a=JSON.parse(i.arguments)}catch{throw Error(`Invalid streamed tool call: index ${r} arguments are not valid JSON`)}H(typeof a==`object`&&!!a&&!Array.isArray(a),`index ${r} arguments must be a JSON object`),t.push({id:i.id,type:`function`,function:{name:i.name,arguments:i.arguments}})}return t}catch(t){if(!e)return[];throw t}}};let dn=2147483647,fn=1024,pn=1e3;function mn(e,t){if(t!==`compat`)return{nBatch:e.nBatch??void 0,nUbatch:e.nUbatch??void 0};let n=e.nBatch??32;return{nBatch:n,nUbatch:e.nUbatch??Math.min(16,n)}}function hn(t,n){if(t===void 0)return null;if(!Number.isSafeInteger(t)||t<=0||t>dn)throw new e(n===`n_batch`?`INVALID_BATCH_SIZE`:`INVALID_UBATCH_SIZE`,`${n} must be a positive signed 32-bit integer (maximum ${dn}).`);return t}function gn(t,n){if(t===void 0)return{scope:`release-defaults`,nBatch:null,nUbatch:null,flashMode:`off`,kvCacheType:`f16`,wasmFlavor:`auto`};if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_BENCHMARK_TUNING`,`Benchmark tuning must be an object.`);let r=t,i=r.flashMode,a=r.kvCacheType,o=r.wasmFlavor;if(i!==`off`&&i!==`auto`)throw new e(`INVALID_BENCHMARK_TUNING`,`Benchmark flash mode must be off or auto.`);if(a!==`f16`&&a!==`q8_0`&&a!==`q4_0`)throw new e(`INVALID_BENCHMARK_TUNING`,`Benchmark KV cache type must be f16, q8_0, or q4_0.`);if(o!==`auto`&&o!==`jspi`&&o!==`compat`)throw new e(`INVALID_BENCHMARK_TUNING`,`Benchmark WASM flavor must be auto, jspi, or compat.`);if(a!==`f16`&&i!==`auto`)throw new e(`INVALID_BENCHMARK_TUNING`,`Quantized V cache requires Flash Attention in auto mode.`);if((i===`auto`||a!==`f16`)&&n!==`webgpu`)throw new e(`INVALID_BENCHMARK_TUNING`,`Flash Attention and quantized KV experiments require the explicit WebGPU backend.`);let s=hn(r.nBatch,`n_batch`),c=hn(r.nUbatch,`n_ubatch`);if(s!==null&&c!==null&&c>s)throw new e(`INVALID_BENCHMARK_TUNING`,`Benchmark n_ubatch must not exceed n_batch.`);return{scope:`benchmark`,nBatch:s,nUbatch:c,flashMode:i,kvCacheType:a,wasmFlavor:o}}function U(e){let t=$e.files.find(t=>t.path===e);if(!t)throw Error(`Runtime provenance is missing ${e}`);return t}function _n(){if(!WebAssembly.Suspending)return!0;try{return new WebAssembly.Memory({address:`i64`,initial:1n}),!1}catch{return!0}}function vn(t,n=_n()){if(t===`compat`)return`compat`;if(t===`jspi`){if(n)throw new e(`BENCHMARK_WASM_FLAVOR_UNAVAILABLE`,`JSPI was requested, but this browser requires the compatibility runtime.`);return`jspi`}return n?`compat`:`jspi`}function W(e,t=[]){return e.files.map((e,n)=>({index:n,path:e.path,loadedBytes:t[n]?e.bytes:0,verifiedBytes:t[n]?e.bytes:0,totalBytes:e.bytes,state:t[n]?`cached`:`queued`}))}function G(e){return e.map(e=>({...e}))}function yn(e){return e.reduce((e,t)=>e+t.loadedBytes,0)}function bn(e){return e.reduce((e,t)=>e+t.verifiedBytes,0)}function xn(e){return e instanceof Error?e.message:String(e)}function Sn(e,t){return t.aborted||e instanceof DOMException&&e.name===`AbortError`||e instanceof Error&&e.name===`AbortError`}function Cn(t,n){return t instanceof e&&(t.code===`SHARD_SIZE_MISMATCH`||t.code===`SHARD_HASH_MISMATCH`)?`verification`:Sn(t,n)?`abort`:`network`}function wn(t,n,r,i,a,o,s){let c=n===`verification`,l=n===`abort`,u=t instanceof e?t.code:l?`ABORTED`:t instanceof Error?t.name:`UNKNOWN`,d={kind:`shard-download-failure`,failure:n,causeCode:u,shardIndex:r,shardCount:i,shardPath:a,retryFromByteZero:!0,partialDeleted:o},f=c?u:l?`SHARD_DOWNLOAD_ABORTED`:`SHARD_DOWNLOAD_FAILED`,p=s===void 0?``:` Partial cache cleanup also failed: ${xn(s)}`,m=xn(t).replace(/\.+$/,``);return new e(f,`Shard ${r+1}/${i} (${a}) failed: ${m}.${p}`,d)}function Tn(e){return new URL(e,globalThis.location.origin).href}function En(){`document`in globalThis||Object.defineProperty(globalThis,"document",{configurable:!0,value:{baseURI:globalThis.location.href}})}function K(e,t,n){e({type:`event`,requestId:t,event:`progress`,...n,nativeStage:n.nativeStage??null})}function q(e,t,n){e({type:`event`,requestId:t,event:`generation`,...n})}function J(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0?Math.floor(e):0}function Dn(e,t){if(!e&&!t)return null;let n=Math.max(J(e?.prompt_tokens),J(t?.prompt_n)),r=Math.max(J(e?.completion_tokens),J(t?.predicted_n));return{promptTokens:n,completionTokens:r,totalTokens:Math.max(J(e?.total_tokens),n+r)}}function On(e){return e?{promptTokensPerSecond:e.prompt_per_second,predictedTokensPerSecond:e.predicted_per_second}:null}function kn(t,n,r){if(!Number.isSafeInteger(t)||t<0||t>4294967295)throw new e(`INVALID_TOKEN_ID_TRACE`,`The native runtime returned a missing or invalid token id in the sampled-token trace.`,{index:n,field:r,id:t});return t}function An(t,n,r){if(typeof t!=`number`||!Number.isFinite(t))throw new e(`INVALID_TOKEN_LOGPROB_TRACE`,`The native runtime returned a missing or invalid logprob in the sampled-token trace.`,{index:n,field:r,logprob:t});return t}function jn(t,n){let r=n.choices[0]?.logprobs?.content;if(r)for(let n of r){let r=t.length,i={id:kn(n.id,r,`selected.id`),logprob:An(n.logprob,r,`selected.logprob`)};if(!Array.isArray(n.top_logprobs)||n.top_logprobs.length!==5)throw new e(`INVALID_TOKEN_LOGPROB_TRACE`,`The native runtime must return exactly 5 top logprob candidates per sampled token.`,{index:r,expected:5,observed:Array.isArray(n.top_logprobs)?n.top_logprobs.length:null});let a=new Set,o=n.top_logprobs.map((t,n)=>{let i=kn(t.id,r,`topCandidates[${n}].id`);if(a.has(i))throw new e(`INVALID_TOKEN_LOGPROB_TRACE`,`The native runtime returned duplicate ids in a top-logprob candidate list.`,{index:r,candidateIndex:n,id:i});return a.add(i),{id:i,logprob:An(t.logprob,r,`topCandidates[${n}].logprob`)}}).sort((e,t)=>t.logprob-e.logprob||e.id-t.id),s=o.find(e=>e.id===i.id);if(!s||s.logprob!==i.logprob)throw new e(`INVALID_TOKEN_LOGPROB_TRACE`,`The sampled token must appear exactly once in its top-logprob candidates with the same logprob.`,{index:r,selected:i,selectedCandidate:s??null});t.push({selected:i,topCandidates:o})}}function Mn(e,t){if(e===null)return null;let n=t?.completionTokens??null;return{usageCompletionTokens:n,tracedTokens:e.length,delta:n===null?null:e.length-n}}function Y(t,n,r){if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_SCORE_SEQUENCE_RESPONSE`,`Teacher-forced response ${n} has an invalid ${r}.`,{index:n,field:r});return t}function Nn(t,n,r,i){if(!Number.isSafeInteger(t)||t<0||t>=i)throw new e(`INVALID_SCORE_SEQUENCE_RESPONSE`,`Teacher-forced response ${n} has an invalid ${r}.`,{index:n,field:r,id:t,vocabularySize:i});return t}function Pn(t,n,r){if(typeof t!=`number`||!Number.isFinite(t))throw new e(`INVALID_SCORE_SEQUENCE_RESPONSE`,`Teacher-forced response ${n} has an invalid ${r}.`,{index:n,field:r,logprob:t});return t}function Fn(t,n,r,i){let a=Y(t,n,`root`);if(!Array.isArray(a.choices)||a.choices.length!==1)throw new e(`INVALID_SCORE_SEQUENCE_RESPONSE`,`Teacher-forced response ${n} must contain exactly one completion choice.`,{index:n,observed:Array.isArray(a.choices)?a.choices.length:null});let o=Y(Y(a.choices[0],n,`choices[0]`).logprobs,n,`choices[0].logprobs`);if(!Array.isArray(o.content)||o.content.length!==1)throw new e(`INVALID_SCORE_SEQUENCE_RESPONSE`,`Teacher-forced response ${n} must contain one selected-token logprob entry.`,{index:n,observed:Array.isArray(o.content)?o.content.length:null});let s=Y(o.content[0],n,`logprobs.content[0]`),c={id:Nn(s.id,n,`selectedReference.id`,i),logprob:Pn(s.logprob,n,`selectedReference.logprob`)};if(c.id!==r)throw new e(`INVALID_SCORE_SEQUENCE_RESPONSE`,`Teacher forcing selected token ${c.id} instead of reference token ${r} at position ${n+1}.`,{index:n,selectedTokenId:c.id,referenceTokenId:r});let l=s.top_logprobs;if(!Array.isArray(l)||l.length!==5)throw new e(`INVALID_SCORE_SEQUENCE_RESPONSE`,`Teacher-forced response ${n} must contain exactly 5 natural top candidates.`,{index:n,observed:Array.isArray(l)?l.length:null});let u=new Set,d=l.map((t,r)=>{let a=Y(t,n,`topCandidates[${r}]`),o={id:Nn(a.id,n,`topCandidates[${r}].id`,i),logprob:Pn(a.logprob,n,`topCandidates[${r}].logprob`)};if(u.has(o.id))throw new e(`INVALID_SCORE_SEQUENCE_RESPONSE`,`Teacher-forced response ${n} contains duplicate natural candidate id ${o.id}.`,{index:n,candidateIndex:r,id:o.id});return u.add(o.id),o}).sort((e,t)=>t.logprob-e.logprob||e.id-t.id),f=d.findIndex(e=>e.id===r);if(f!==-1&&d[f]?.logprob!==c.logprob)throw new e(`INVALID_SCORE_SEQUENCE_RESPONSE`,`Teacher-forced response ${n} reports inconsistent reference logprobs.`,{index:n,selectedReference:c,referenceRankInTopCandidatesZeroBased:f});let p=d[0],m=d[1];return{index:n,selectedReference:c,naturalTop1:{...p},topCandidates:d,referenceRankInTopCandidatesZeroBased:f===-1?null:f,top1Top2Margin:p.logprob-m.logprob}}function In(e){let t=e.choices[0]?.delta;if(typeof t!=`object`||!t)return;let n=t.reasoning_content;return typeof n==`string`&&n.length>0?n:void 0}function Ln(e){let t=e.reasoning_content;return typeof t==`string`?t:``}var Rn=class{wllama=null;wllamaFlavor=null;compatWorkerCode=null;loaded=null;nativeLog=new ln;async raceWebGpuDeviceLoss(e,t,n,r){if(t!==`webgpu`)return r;let i=this.nativeLog.watchDeviceLost();try{return await Promise.race([r,i.promise.then(async()=>{throw await this.assertWebGpuAlive(e,t,n),Error(`WebGPU device-loss handler returned unexpectedly.`)})])}finally{i.dispose()}}async assertWebGpuAlive(t,n,r){let i=this.nativeLog.deviceLostSignal();if(n!==`webgpu`||!i)return;let a=this.wllama;if(this.loaded=null,this.wllama=null,this.wllamaFlavor=null,a){let e;try{await Promise.race([a.exit().catch(()=>void 0),new Promise(t=>{e=setTimeout(t,100)})])}catch{}finally{e!==void 0&&clearTimeout(e)}}let o=r.cpuFallback?` If this repeats, select CPU-WASM before retrying.`:` This model tier requires WebGPU; retry after the browser obtains a fresh GPU device.`,s={recoverable:!0,nextAction:`reload-model`,stage:t,modelId:r.id,cpuFallbackAvailable:r.cpuFallback,signal:i};throw new e(`WEBGPU_DEVICE_LOST`,`The WebGPU device was lost during ${t}. The loaded model was invalidated. Run the action again to reload it.${o}`,s)}async ensureWllama(t=vn(`auto`)){if(this.wllama&&this.wllamaFlavor===t)return this.wllama;if(this.wllama&&(await this.wllama.exit().catch(()=>void 0),this.wllama=null,this.loaded=null,this.wllamaFlavor=null),En(),this.compatWorkerCode===null){let t=await fetch(Tn(`/wasm/wllama-compat.js`));if(!t.ok)throw new e(`COMPAT_ASSET_LOAD_FAILED`,`Failed to load local wllama compat worker: HTTP ${t.status}`);this.compatWorkerCode=await t.text()}let n=new Qe({default:Tn(`/wasm/wllama.wasm`)},{parallelDownloads:3,forceCompat:t===`compat`,logger:{debug:(...e)=>this.nativeLog.append(e),log:(...e)=>this.nativeLog.append(e),warn:(...e)=>this.nativeLog.append(e),error:(...e)=>this.nativeLog.append(e)}});return n.setCompat({wasm:Tn(`/wasm/wllama-compat.wasm`),worker:{code:this.compatWorkerCode}},`firefox_safari`),this.wllama=n,this.wllamaFlavor=t,n}async capabilities(){let[e,t]=await Promise.all([at(),P()]),n=_n()?`compat`:`jspi`,r=U(n===`compat`?`public/wasm/wllama-compat.wasm`:`public/wasm/wllama.wasm`);return{crossOriginIsolated:globalThis.crossOriginIsolated,sharedArrayBuffer:typeof SharedArrayBuffer<`u`,hardwareConcurrency:navigator.hardwareConcurrency||1,webgpu:e,storage:t,browser:{userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language},runtime:{implementation:`bonsai-wllama`,wllamaRevision:`912c18b75d4358c1405a64646b8dbe43a205943b`,llamaCppRevision:`00fa7cb284cbf133fc426733bd64238a3588a33e`,patchSetSha256:$e.patchSet.sha256,moduleSha256:U(`vendor/wllama-bonsai/esm/index.js`).sha256,wasmFlavor:n,wasmSha256:r.sha256,compatWorkerSha256:n===`compat`?U(`public/wasm/wllama-compat.js`).sha256:null,tokenEmbeddingOnWebGPU:!0,tensorPlacementOverrides:!1}}}async inspectCachedShards(t,n,r,i,a,o){let s=[],c=W(r),l=0,u=(e,n)=>{let i=c[e]??null;K(o,t,{phase:n,loadedBytes:yn(c),totalBytes:r.downloadBytes,shardIndex:e,shardCount:r.files.length,shardPath:i?.path??null,stageProgress:n===`verify`?bn(c)/r.downloadBytes:yn(c)/r.downloadBytes,residentBytes:null,shards:G(c)})};for(let t=0;t{n.verifiedBytes=Math.min(e,n.totalBytes),u(t,`verify`)})).matches){s.push(p),l+=d.bytes,n.loadedBytes=d.bytes,n.verifiedBytes=d.bytes,n.state=`cached`,u(t,`cache`);continue}}p&&await n.cacheManager.delete(o),s.push(null);let h=c[t];h&&(h.loadedBytes=0,h.verifiedBytes=0,h.state=`queued`,u(t,`cache`))}return{blobs:s,cachedBytes:l,shards:c}}async downloadShards(t,r,i,a,o,s,c){let l=new AbortController,u=()=>l.abort(s.reason);s.aborted?u():s.addEventListener(`abort`,u,{once:!0});let d=l.signal,f=i.files.map((e,t)=>o.blobs[t]?e.bytes:0),p=o.shards??W(i,o.blobs),m=(e,n=`download`)=>{let r=i.files[e]??null;K(c,t,{phase:n,loadedBytes:f.reduce((e,t)=>e+t,0),totalBytes:i.downloadBytes,shardIndex:e,shardCount:i.files.length,shardPath:r?.path??null,stageProgress:n===`verify`?bn(p)/i.downloadBytes:yn(p)/i.downloadBytes,residentBytes:null,shards:G(p)})};m(0);let h=i.files.map((e,t)=>t).filter(e=>o.blobs[e]===null),g=!1,_=!1,v=null,y=async()=>{for(;!g&&h.length>0;){n(d);let t=h.shift();if(t===void 0)return;let s=i.files[t],c=a[t];if(!s||!c)throw new e(`INVALID_SHARD_ORDER`,`Manifest shard URL and file counts differ.`);let l=p[t];if(!l)throw new e(`INVALID_SHARD_ORDER`,`Manifest shard progress is incomplete.`);try{l.state=`downloading`,l.loadedBytes=0,l.verifiedBytes=0,m(t),await r.cacheManager.download(c,{signal:d,metadataAdditional:{originalURL:c,originalSize:s.bytes,sha256:s.sha256},progressCallback:({loaded:e})=>{f[t]=Math.min(e,s.bytes),l.loadedBytes=f[t]??0,m(t)}}),n(d);let i=await r.cacheManager.open(c);if(!i||i.size!==s.bytes)throw new e(`SHARD_SIZE_MISMATCH`,`Downloaded shard ${s.path} has ${i?.size??0} bytes; expected ${s.bytes}.`);l.state=`verifying`,l.loadedBytes=s.bytes,l.verifiedBytes=0,f[t]=s.bytes,m(t,`verify`);let a=await At(i,s.sha256,d,e=>{l.verifiedBytes=Math.min(e,s.bytes),m(t,`verify`)});if(!a.matches)throw new e(`SHARD_HASH_MISMATCH`,`Downloaded shard ${s.path} has SHA-256 ${a.actualSha256}; expected ${s.sha256}.`);let u=await r.cacheManager.getNameFromURL(c);await r.cacheManager.writeMetadata(u,{etag:`manifest-v2`,originalURL:c,originalSize:s.bytes,sha256:s.sha256}),o.blobs[t]=i,f[t]=s.bytes,l.loadedBytes=s.bytes,l.verifiedBytes=s.bytes,l.state=`complete`,m(t)}catch(e){let n=Cn(e,d);g=!0;let a=!_;a&&(_=!0),o.blobs[t]=null,f[t]=0,l.loadedBytes=0,l.verifiedBytes=0,l.state=`error`;let u=!1,p;try{await r.cacheManager.delete(c),u=!0}catch(e){p=e}m(t,n===`verification`?`verify`:`download`);let h=wn(e,n,t,i.files.length,s.path,u,p);a&&(v=h);return}}},b=Array.from({length:Math.min(3,Math.max(1,h.length))},()=>y()),x;try{x=await Promise.allSettled(b)}finally{s.removeEventListener(`abort`,u)}if(v!==null)throw v;let S=x.find(e=>e.status===`rejected`);if(S)throw S.reason;n(s);let C=o.blobs;if(C.some(e=>e===null))throw new e(`SHARD_LOAD_INCOMPLETE`,`One or more model shards are unavailable.`);return C}async loadModel(t,r,i,a){if(r.tensorPlacement)throw new e(`TENSOR_PLACEMENT_UNSUPPORTED`,`Arbitrary tensor placement is not exposed. The pinned Bonsai build applies its validated token-embedding WebGPU override automatically.`,r.tensorPlacement);let o=gn(r.benchmarkTuning,r.backend),s=vn(o.wasmFlavor);await this.unload(),this.nativeLog.clear(),K(a,t,{phase:`manifest`,loadedBytes:0,totalBytes:1,shardIndex:null,shardCount:0,shardPath:null,stageProgress:0,residentBytes:null,shards:[]});let c=r.manifestUrl===void 0?Kt(r.manifest):await qt(r.manifestUrl,i);n(i),K(a,t,{phase:`manifest`,loadedBytes:1,totalBytes:1,shardIndex:null,shardCount:0,shardPath:null,stageProgress:1,residentBytes:null,shards:[]});let l=Xt(c,r.modelId),u=r.contextSize??l.defaultContext,d=ct(l,u,{tuningScope:o.scope,requestedBackend:r.backend,flashMode:o.flashMode,kvCacheType:o.kvCacheType});if(!d.allowed)throw new e(`INVALID_CONTEXT_SIZE`,`Context size must be between 1 and ${d.limit} for this model and runtime policy.`);let f=Yt(c,l),p=await this.ensureWllama(s),m=await this.inspectCachedShards(t,p,l,f,i,a),[h,g]=await Promise.all([at(),P()]),_=ut(l,r.backend,h,g,m.cachedBytes);if(!_.allowed||_.selectedBackend===null)throw new e(`MODEL_GATE_REJECTED`,_.reasons.join(` `),_);if(_.selectedBackend===`webgpu`&&!p.isSupportWebGPU())throw new e(`WEBGPU_RUNTIME_UNAVAILABLE`,`The adapter gate passed, but the pinned Bonsai wllama build reports WebGPU unavailable in this browser runtime.`);let v=await this.downloadShards(t,p,l,f,m,i,a);n(i),K(a,t,{phase:`load`,loadedBytes:l.downloadBytes,totalBytes:l.downloadBytes,shardIndex:null,shardCount:l.files.length,shardPath:null,stageProgress:0,residentBytes:null,shards:G(m.shards??W(l,v))});let y=Math.max(1,Math.floor((navigator.hardwareConcurrency||1)/2)),b=r.threads??(_.selectedBackend===`wasm`?y:1);if(!Number.isSafeInteger(b)||b<=0)throw new e(`INVALID_THREAD_COUNT`,`Thread count must be a positive integer.`);let x=G(m.shards??W(l,v)),S=mn(o,s),C=this.nativeLog.onModelLoadProgress(e=>{let n=this.nativeLog.report();K(a,t,{phase:`load`,loadedBytes:l.downloadBytes,totalBytes:l.downloadBytes,shardIndex:null,shardCount:l.files.length,shardPath:null,stageProgress:e.value,nativeStage:e.current,residentBytes:n.allocatedBufferBytes??null,shards:G(x)})});try{await this.raceWebGpuDeviceLoss(`load`,_.selectedBackend,l,p.loadModel(v,{n_gpu_layers:_.selectedBackend===`webgpu`?99999:0,offload_token_embedding:_.selectedBackend===`webgpu`,n_ctx:u,n_threads:b,n_batch:S.nBatch,n_ubatch:S.nUbatch,seed:42,flash_attn:o.flashMode===`auto`,warmup:!1,cache_type_k:o.kvCacheType,cache_type_v:o.kvCacheType})),await this.assertWebGpuAlive(`load`,_.selectedBackend,l),n(i);let r=this.nativeLog.report();try{dt(l,_.selectedBackend,r)}catch(t){throw new e(`BACKEND_TRIPWIRE`,t instanceof Error?t.message:String(t),r)}let d=p.getLoadedContextInfo(),m=p.getChatTemplate()??``,h=U(s===`compat`?`public/wasm/wllama-compat.wasm`:`public/wasm/wllama.wasm`),g=s===`compat`?U(`public/wasm/wllama-compat.js`).sha256:null,y=(o.nBatch===null||d.n_batch===o.nBatch)&&(o.nUbatch===null||d.n_ubatch===o.nUbatch)&&r.flashAttention===(o.flashMode===`auto`)&&r.cacheTypeK===o.kvCacheType&&r.cacheTypeV===o.kvCacheType&&(_.selectedBackend!==`webgpu`||r.webgpuKvBufferBytes!==null&&r.webgpuKvBufferBytes>0)&&(o.wasmFlavor===`auto`||o.wasmFlavor===s),C={scope:o.scope,requested:{nBatch:o.nBatch,nUbatch:o.nUbatch,flashMode:o.flashMode,cacheTypeK:o.kvCacheType,cacheTypeV:o.kvCacheType,wasmFlavor:o.wasmFlavor},observed:{nBatch:d.n_batch,nUbatch:d.n_ubatch,flashAttention:r.flashAttention,cacheTypeK:r.cacheTypeK,cacheTypeV:r.cacheTypeV,kvBufferBytes:r.webgpuKvBufferBytes,wasmFlavor:s,wasmSha256:h.sha256,compatWorkerSha256:g},applied:y};if(!y)throw new e(o.scope===`benchmark`?`BENCHMARK_TUNING_NOT_APPLIED`:`RUNTIME_POLICY_NOT_APPLIED`,o.scope===`benchmark`?`The native runtime did not apply the requested benchmark tuning exactly.`:`The native runtime did not preserve the fixed release tuning policy.`,C);return this.loaded={manifest:c,model:l,backend:_.selectedBackend,tuningScope:o.scope,contextSize:d.n_ctx,batchSize:d.n_batch,microBatchSize:d.n_ubatch,vocabularySize:d.n_vocab},K(a,t,{phase:`load`,loadedBytes:l.downloadBytes,totalBytes:l.downloadBytes,shardIndex:null,shardCount:l.files.length,shardPath:null,stageProgress:1,residentBytes:r.allocatedBufferBytes??null,shards:G(x)}),{modelId:l.id,backend:_.selectedBackend,gate:_,shardUrls:f,context:{size:d.n_ctx,trainingSize:d.n_ctx_train,layerCount:d.n_layer,vocabularySize:d.n_vocab,batchSize:d.n_batch,microBatchSize:d.n_ubatch},tuning:C,chatTemplate:{bytes:new TextEncoder().encode(m).byteLength,hasThinkMarker:m.includes(``),hasToolCallMarker:m.includes(``),hasToolResponseMarker:m.includes(``)},backendReport:r}}catch(t){throw t instanceof e&&t.code===`WEBGPU_DEVICE_LOST`?t:(await this.assertWebGpuAlive(`load`,_.selectedBackend,l),await p.exit().catch(()=>void 0),this.wllama=null,this.wllamaFlavor=null,this.loaded=null,t)}finally{C()}}async generate(t,r,i,a){let o=this.loaded,s=this.wllama;if(!o||!s?.isModelLoaded())throw new e(`MODEL_NOT_LOADED`,`Load a model before generating.`);if(await this.assertWebGpuAlive(`generate`,o.backend,o.model),r.messages.length===0)throw new e(`EMPTY_MESSAGES`,`Generation requires at least one chat message.`);n(i);let c=``,l=``,u=null,d=null,f=null,p=0,m=0,h=0,g=0,_=0,v=0,y=null,b=[],x=this.wllamaFlavor!==`compat`,S=(e,t)=>{let n=b.at(-1);if(e<=0||!Number.isFinite(t)||n&&(e<=n.tokens||t2;){let n=b[0];if(!n)break;let r=e-n.tokens,i=t-n.elapsedMs;if(r<=12&&i<=2e3)break;b.shift()}let r=b[0];if(!r)return;let i=e-r.tokens,a=t-r.elapsedMs;if(i<=0||a<=0)return;let o=i*1e3/a;Number.isFinite(o)&&o>=0&&(m=o)},C=r.returnTokenIds===!0?[]:null,w=new un;q(a,t,{phase:`prefill`,promptProcessed:0,promptTotal:0,promptCached:0,completionTokens:0,elapsedMs:0,promptTokensPerSecond:0,decodeTokensPerSecond:0});try{let n={messages:r.messages,max_tokens:r.maxTokens??4096,temperature:r.temperature??0,top_p:r.topP,top_k:r.topK??1,min_p:r.minP,seed:r.seed??42,tools:r.tools,tool_choice:r.toolChoice,cache_prompt:r.cachePrompt??!0,...r.returnTokenIds===!0?{logprobs:!0,top_logprobs:5}:{},abortSignal:i};if(C!==null&&(r.tools?.length??0)>0){let r=await this.raceWebGpuDeviceLoss(`generate`,o.backend,o.model,s.createChatCompletion({...n,stream:!1})),i=r.choices[0];if(!i)throw new e(`INVALID_COMPLETION_RESPONSE`,`The native runtime returned a chat completion without a choice.`);c=typeof i.message.content==`string`?i.message.content:``,l=Ln(i.message),u=i.finish_reason,jn(C,r),w.append(i.message.tool_calls?.map((e,t)=>({index:t,...e})));let p=r.timings;d=Dn(r.usage,p),f=On(p),(c||l)&&a({type:`event`,requestId:t,event:`token`,text:c,...l?{reasoningDelta:l}:{}})}else await this.raceWebGpuDeviceLoss(`generate`,o.backend,o.model,s.createChatCompletion({...n,stream:!0,...x?{timings_per_token:!0,return_progress:!0}:{},onData:e=>{let n=e,r=e.choices[0]?.delta.content,i=typeof r==`string`?r:``,o=In(e),s=n.prompt_progress;if(s){let e=Math.max(0,s.processed),n=Math.max(0,Math.min(e,s.cache)),r=Math.max(0,s.time_ms),i=Math.max(0,e-n);h=e,g=Math.max(e,s.total),_=n;let o=r>=50?i*1e3/r:0;Number.isFinite(o)&&o>=0&&(p=o),q(a,t,{phase:`prefill`,promptProcessed:e,promptTotal:g,promptCached:n,completionTokens:0,elapsedMs:r,promptTokensPerSecond:p,decodeTokensPerSecond:0})}else if(x&&e.timings){let n=Math.max(0,e.timings.predicted_n),r=Math.max(0,e.timings.predicted_ms);S(n,r);let i=Math.max(0,e.timings.prompt_per_second);Number.isFinite(i)&&(p=i),q(a,t,{phase:`decode`,promptProcessed:Math.max(0,e.timings.prompt_n),promptTotal:Math.max(0,e.timings.prompt_n),promptCached:Math.max(0,e.timings.cache_n),completionTokens:n,elapsedMs:r,promptTokensPerSecond:p,decodeTokensPerSecond:m})}else if(!x&&(i||o)){v+=1;let e=performance.now();y??=e;let n=e-y;S(v,n),q(a,t,{phase:`decode`,promptProcessed:h,promptTotal:g,promptCached:_,completionTokens:v,elapsedMs:n,promptTokensPerSecond:p,decodeTokensPerSecond:m})}C!==null&&jn(C,e);let b=w.append(e.choices[0]?.delta.tool_calls);for(let e of b)a({type:`event`,requestId:t,event:`tool-call`,...e});(i||o)&&(c+=i,l+=o??``,a({type:`event`,requestId:t,event:`token`,text:i,...o?{reasoningDelta:o}:{}})),u=e.choices[0]?.finish_reason??u,d=Dn(e.usage,e.timings)??d,f=On(e.timings)??f}}))}catch(t){throw t instanceof e?t:(await this.assertWebGpuAlive(`generate`,o.backend,o.model),new e(`NATIVE_COMPLETION_FAILED`,t instanceof Error?t.message:String(t),{nativeLog:this.nativeLog.recent()}))}await this.assertWebGpuAlive(`generate`,o.backend,o.model),n(i);let T=C?.map(e=>e.selected.id)??null,E=Mn(C,d),D=this.nativeLog.report();try{dt(o.model,o.backend,D)}catch(t){throw await this.unload(),new e(`BACKEND_TRIPWIRE`,t instanceof Error?t.message:String(t),D)}let O,k;try{let e=w.finish(u===`tool_calls`||w.hasCalls());O=u===`tool_calls`?e:[]}catch(e){O=[],k=e instanceof Error?e.message:String(e)}return{text:c,reasoningText:l,...k?{toolCallError:k}:{},tokenIds:T,tokenTrace:C,tokenTraceAccounting:E,finishReason:u,toolCalls:O,usage:d,timings:f}}async scoreSequence(t,r){let i=this.loaded,a=this.wllama;if(!i||!a?.isModelLoaded())throw new e(`MODEL_NOT_LOADED`,`Load a model before scoring a sequence.`);if(i.model.id!==`27b`||i.backend!==`webgpu`||i.tuningScope!==`benchmark`)throw new e(`SCORE_SEQUENCE_UNAVAILABLE`,`Teacher-forced scoring is diagnostic-only and requires the loaded 27B WebGPU benchmark path.`,{modelId:i.model.id,backend:i.backend,tuningScope:i.tuningScope});if(t.topK!==5)throw new e(`INVALID_SCORE_SEQUENCE`,`Teacher-forced scoring requires topK=5.`);if(!Array.isArray(t.promptTokenIds)||t.promptTokenIds.length!==38)throw new e(`INVALID_SCORE_SEQUENCE`,`Teacher-forced scoring requires exactly 38 rendered prompt token ids.`);if(!Array.isArray(t.referenceTokenIds)||t.referenceTokenIds.length!==fn)throw new e(`INVALID_SCORE_SEQUENCE`,`Teacher-forced scoring requires exactly ${fn} reference token ids.`);if(t.promptTokenIds.length+t.referenceTokenIds.length>i.contextSize)throw new e(`INVALID_SCORE_SEQUENCE`,`The rendered prompt and fixed reference sequence exceed the loaded context.`,{promptTokens:t.promptTokenIds.length,referenceTokens:t.referenceTokenIds.length,contextSize:i.contextSize});let o=(t,n)=>{for(let[r,a]of t.entries())if(!Number.isSafeInteger(a)||a<0||a>=i.vocabularySize)throw new e(`INVALID_SCORE_SEQUENCE`,`${n}[${r}] is outside the loaded vocabulary.`,{field:n,index:r,tokenId:a,vocabularySize:i.vocabularySize})};o(t.promptTokenIds,`promptTokenIds`),o(t.referenceTokenIds,`referenceTokenIds`),await this.assertWebGpuAlive(`score-sequence`,i.backend,i.model),n(r);let s=async()=>{let o=[],s=a.createCompletion.bind(a);for(let e=0;ee+t.selectedReference.logprob,0)/o.length,l=Math.exp(c);if(!Number.isFinite(c)||!Number.isFinite(l))throw new e(`INVALID_SCORE_SEQUENCE_RESPONSE`,`Teacher-forced scoring produced a non-finite mean NLL or perplexity.`,{meanNll:c,perplexity:l});return{method:{promptMode:`raw-token-id-prefix`,maxTokensPerStep:1,temperature:0,topK:1,reportedTopLogprobs:5,logitBias:pn,cachePromptFirst:!1,cachePromptSubsequent:!0},entries:o,summary:{tokenCount:fn,meanNll:c,perplexity:l}}};try{let t=await this.raceWebGpuDeviceLoss(`score-sequence`,i.backend,i.model,s());await this.assertWebGpuAlive(`score-sequence`,i.backend,i.model),n(r);let a=this.nativeLog.report();try{dt(i.model,i.backend,a)}catch(t){throw await this.unload(),new e(`BACKEND_TRIPWIRE`,t instanceof Error?t.message:String(t),a)}return t}catch(t){throw t instanceof e&&t.code===`WEBGPU_DEVICE_LOST`||await this.assertWebGpuAlive(`score-sequence`,i.backend,i.model),t}}async backendReport(){let e=this.nativeLog.report();return this.loaded&&await this.assertWebGpuAlive(`backend-report`,this.loaded.backend,this.loaded.model),e}async unload(){return await this.wllama?.exit(),this.loaded=null,{unloaded:!0}}storageEstimate(){return P()}storagePersist(){return ot()}async storageClear(){return await this.unload(),await(await this.ensureWllama()).cacheManager.clear(),{...await P(),cleared:!0}}};let zn=globalThis,X=new Rn,Z=new Map,Q=!1;function Bn(e){zn.postMessage(e)}function $(e,t){zn.postMessage({type:`response`,requestId:e.requestId,method:e.method,ok:!0,result:t})}function Vn(t){return t instanceof e?{code:t.code,message:t.message,...t.details===void 0?{}:{details:t.details}}:t instanceof DOMException&&t.name===`AbortError`?{code:`ABORTED`,message:t.message}:t instanceof Error?{code:t.name===`AbortError`?`ABORTED`:`ENGINE_ERROR`,message:t.message}:{code:`ENGINE_ERROR`,message:String(t)}}function Hn(e,t){zn.postMessage({type:`response`,requestId:e.requestId,method:e.method,ok:!1,error:Vn(t)})}async function Un(t,n){if(Q||Z.size>0)throw new e(`ENGINE_BUSY`,Q?`The engine is unloading or clearing storage.`:`Another mutable engine operation is active (${[...Z.keys()].join(`, `)}).`);let r=new AbortController,i=n(r.signal);Z.set(t,{controller:r,promise:i});try{return await i}finally{Z.delete(t)}}async function Wn(){let e=[...Z.values()];for(let t of e)t.controller.abort();await Promise.allSettled(e.map(e=>e.promise))}async function Gn(t){if(Q)throw new e(`ENGINE_BUSY`,`The engine is already unloading or clearing storage.`);Q=!0;try{return await Wn(),await t()}finally{Q=!1}}async function Kn(e){try{switch(e.method){case`capabilities`:$(e,await X.capabilities());return;case`loadModel`:$(e,await Un(e.requestId,t=>X.loadModel(e.requestId,e.params,t,Bn)));return;case`generate`:$(e,await Un(e.requestId,t=>X.generate(e.requestId,e.params,t,Bn)));return;case`scoreSequence`:$(e,await Un(e.requestId,t=>X.scoreSequence(e.params,t)));return;case`abort`:{let t=Z.get(e.params.targetRequestId),n=t!==void 0&&!t.controller.signal.aborted;t?.controller.abort(),$(e,{targetRequestId:e.params.targetRequestId,aborted:n});return}case`unload`:$(e,await Gn(()=>X.unload()));return;case`backendReport`:$(e,await X.backendReport());return;case`storageEstimate`:$(e,await X.storageEstimate());return;case`storagePersist`:$(e,await X.storagePersist());return;case`storageClear`:$(e,await Gn(()=>X.storageClear()));return}}catch(t){Hn(e,t)}}zn.onmessage=e=>{let t=e.data;t?.type===`request`&&typeof t.requestId==`string`&&Kn(t)}})(); \ No newline at end of file