From cb69a4766d65eb6bd40e94da131184fda524baf0 Mon Sep 17 00:00:00 2001 From: W2Wizard Date: Tue, 8 Oct 2024 13:32:32 +0200 Subject: [PATCH] Add functional demo that runs on wasm --- web/README.md | 91 ++++++++++++++++++++++++ web/coi-serviceworker.js | 146 +++++++++++++++++++++++++++++++++++++++ web/demo.js | 1 + web/demo.wasm | Bin 0 -> 113025 bytes web/index.html | 42 +++++++++++ 5 files changed, 280 insertions(+) create mode 100644 web/README.md create mode 100644 web/coi-serviceworker.js create mode 100644 web/demo.js create mode 100755 web/demo.wasm create mode 100644 web/index.html diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..430f49a --- /dev/null +++ b/web/README.md @@ -0,0 +1,91 @@ +# Web + +MLX42 supports compilation towards [WASM](https://webassembly.org/). What this means is you can run any application written in C directly in the browser! +This overcomes a lot of issues with for instance showing projects towards others or have an environment where building natively just won't work. + +In this README you will learn how to compile your project towards Webassembly and later deploy it on github! + +## Pre-requisites + +- [Emscripten](https://emscripten.org/), you can install this via brew or read the instructions they provide for [Windows or Linux](https://emscripten.org/docs/getting_started/downloads.html) + +## Building + +Once you made sure you have emscripten installed (check if `emcc` and `emcake` work). + +Run: +```bash +emcmake cmake -B build && cmake --build build --parallel +``` + +## Modifications + +You're only required to do a few modifications to your `main.c`. +For this we will use the demo main provided in the root [readme](../README.md). + +Add the following headers at the top: +```c +#include +#include +``` + +Modify your main: +```c +// Invoked instead of mlx_loop directly. +void emscripten_main_loop() { + mlx_loop(mlx); +} + +int32_t main(int argc, char **argv) +{ + // Gotta error check this stuff + if (!(mlx = mlx_init(WIDTH, HEIGHT, "MLX42", true))) + { + puts(mlx_strerror(mlx_errno)); + return(EXIT_FAILURE); + } + if (!(image = mlx_new_image(mlx, 128, 128))) + { + mlx_close_window(mlx); + puts(mlx_strerror(mlx_errno)); + return(EXIT_FAILURE); + } + if (mlx_image_to_window(mlx, image, 0, 0) == -1) + { + mlx_close_window(mlx); + puts(mlx_strerror(mlx_errno)); + return(EXIT_FAILURE); + } + + mlx_loop_hook(mlx, ft_randomize, mlx); + mlx_loop_hook(mlx, ft_hook, mlx); + + // This function will set up the main loop + emscripten_set_main_loop(emscripten_main_loop, 0, true); + mlx_terminate(mlx); + return (EXIT_SUCCESS); +} +``` + +Thats actually it! It may or may not be necessary to modify your own source code depending on what you do but that's most often not the case. +It is that easy to just re-deploy your own app into webassembly. + +## Building + +```bash +# Compile C into JS/WASM +emcc -O3 -I include -I mlx -pthread main.c \ + -o ./web/demo.js \ + ./build/libmlx42.a \ + -s USE_GLFW=3 -s USE_WEBGL2=1 -s FULL_ES3=1 -s WASM=1 \ + -s NO_EXIT_RUNTIME=1 -s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]' \ + -s ALLOW_MEMORY_GROWTH + +# Navigate into the web folder (if you're running this directly from this repo) +cd web + +# Launch local webserver, this is required to make the service worker function. +python3 -m http.server 8000 +``` + +Once the server is up and running all you need to do now is go to [localhost](http://localhost:8000/index.html) diff --git a/web/coi-serviceworker.js b/web/coi-serviceworker.js new file mode 100644 index 0000000..9901474 --- /dev/null +++ b/web/coi-serviceworker.js @@ -0,0 +1,146 @@ +/*! coi-serviceworker v0.1.7 - Guido Zuidhof and contributors, licensed under MIT */ +let coepCredentialless = false; +if (typeof window === 'undefined') { + self.addEventListener("install", () => self.skipWaiting()); + self.addEventListener("activate", (event) => event.waitUntil(self.clients.claim())); + + self.addEventListener("message", (ev) => { + if (!ev.data) { + return; + } else if (ev.data.type === "deregister") { + self.registration + .unregister() + .then(() => { + return self.clients.matchAll(); + }) + .then(clients => { + clients.forEach((client) => client.navigate(client.url)); + }); + } else if (ev.data.type === "coepCredentialless") { + coepCredentialless = ev.data.value; + } + }); + + self.addEventListener("fetch", function (event) { + const r = event.request; + if (r.cache === "only-if-cached" && r.mode !== "same-origin") { + return; + } + + const request = (coepCredentialless && r.mode === "no-cors") + ? new Request(r, { + credentials: "omit", + }) + : r; + event.respondWith( + fetch(request) + .then((response) => { + if (response.status === 0) { + return response; + } + + const newHeaders = new Headers(response.headers); + newHeaders.set("Cross-Origin-Embedder-Policy", + coepCredentialless ? "credentialless" : "require-corp" + ); + if (!coepCredentialless) { + newHeaders.set("Cross-Origin-Resource-Policy", "cross-origin"); + } + newHeaders.set("Cross-Origin-Opener-Policy", "same-origin"); + + return new Response(response.body, { + status: response.status, + statusText: response.statusText, + headers: newHeaders, + }); + }) + .catch((e) => console.error(e)) + ); + }); + +} else { + (() => { + const reloadedBySelf = window.sessionStorage.getItem("coiReloadedBySelf"); + window.sessionStorage.removeItem("coiReloadedBySelf"); + const coepDegrading = (reloadedBySelf == "coepdegrade"); + + // You can customize the behavior of this script through a global `coi` variable. + const coi = { + shouldRegister: () => !reloadedBySelf, + shouldDeregister: () => false, + coepCredentialless: () => true, + coepDegrade: () => true, + doReload: () => window.location.reload(), + quiet: false, + ...window.coi + }; + + const n = navigator; + const controlling = n.serviceWorker && n.serviceWorker.controller; + + // Record the failure if the page is served by serviceWorker. + if (controlling && !window.crossOriginIsolated) { + window.sessionStorage.setItem("coiCoepHasFailed", "true"); + } + const coepHasFailed = window.sessionStorage.getItem("coiCoepHasFailed"); + + if (controlling) { + // Reload only on the first failure. + const reloadToDegrade = coi.coepDegrade() && !( + coepDegrading || window.crossOriginIsolated + ); + n.serviceWorker.controller.postMessage({ + type: "coepCredentialless", + value: (reloadToDegrade || coepHasFailed && coi.coepDegrade()) + ? false + : coi.coepCredentialless(), + }); + if (reloadToDegrade) { + !coi.quiet && console.log("Reloading page to degrade COEP."); + window.sessionStorage.setItem("coiReloadedBySelf", "coepdegrade"); + coi.doReload("coepdegrade"); + } + + if (coi.shouldDeregister()) { + n.serviceWorker.controller.postMessage({ type: "deregister" }); + } + } + + // If we're already coi: do nothing. Perhaps it's due to this script doing its job, or COOP/COEP are + // already set from the origin server. Also if the browser has no notion of crossOriginIsolated, just give up here. + if (window.crossOriginIsolated !== false || !coi.shouldRegister()) return; + + if (!window.isSecureContext) { + !coi.quiet && console.log("COOP/COEP Service Worker not registered, a secure context is required."); + return; + } + + // In some environments (e.g. Firefox private mode) this won't be available + if (!n.serviceWorker) { + !coi.quiet && console.error("COOP/COEP Service Worker not registered, perhaps due to private mode."); + return; + } + + n.serviceWorker.register(window.document.currentScript.src).then( + (registration) => { + !coi.quiet && console.log("COOP/COEP Service Worker registered", registration.scope); + + registration.addEventListener("updatefound", () => { + !coi.quiet && console.log("Reloading page to make use of updated COOP/COEP Service Worker."); + window.sessionStorage.setItem("coiReloadedBySelf", "updatefound"); + coi.doReload(); + }); + + // If the registration is active, but it's not controlling the page + if (registration.active && !n.serviceWorker.controller) { + !coi.quiet && console.log("Reloading page to make use of COOP/COEP Service Worker."); + window.sessionStorage.setItem("coiReloadedBySelf", "notcontrolling"); + coi.doReload(); + } + }, + (err) => { + !coi.quiet && console.error("COOP/COEP Service Worker failed to register:", err); + } + ); + })(); +} diff --git a/web/demo.js b/web/demo.js new file mode 100644 index 0000000..bda5e48 --- /dev/null +++ b/web/demo.js @@ -0,0 +1 @@ +function GROWABLE_HEAP_I8(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAP8}function GROWABLE_HEAP_U8(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAPU8}function GROWABLE_HEAP_I16(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAP16}function GROWABLE_HEAP_U16(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAPU16}function GROWABLE_HEAP_I32(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAP32}function GROWABLE_HEAP_U32(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAPU32}function GROWABLE_HEAP_F32(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAPF32}function GROWABLE_HEAP_F64(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAPF64}var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&process.type!="renderer";var ENVIRONMENT_IS_PTHREAD=ENVIRONMENT_IS_WORKER&&self.name=="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 moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=typeof document!="undefined"?document.currentScript?.src:undefined;if(ENVIRONMENT_IS_NODE){_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");var nodePath=require("path");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);var ret=fs.readFileSync(filename);return ret};readAsync=(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return new Promise((resolve,reject)=>{fs.readFile(filename,binary?undefined:"utf8",(err,data)=>{if(err)reject(err);else resolve(binary?data.buffer:data)})})};if(!Module["thisProgram"]&&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){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}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=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)})}return fetch(url,{credentials:"same-origin"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+" : "+response.url))})}}}else{}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.error.bind(console);if(ENVIRONMENT_IS_NODE){defaultPrint=(...args)=>fs.writeSync(1,args.join(" ")+"\n");defaultPrintErr=(...args)=>fs.writeSync(2,args.join(" ")+"\n")}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var wasmBinary=Module["wasmBinary"];var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}if(ENVIRONMENT_IS_PTHREAD){var wasmPromiseResolve;var wasmPromiseReject;if(ENVIRONMENT_IS_NODE){var parentPort=worker_threads["parentPort"];parentPort.on("message",data=>onmessage({data}));Object.assign(globalThis,{self:global,importScripts:()=>{},postMessage:msg=>parentPort.postMessage(msg)})}var initializedJS=false;function threadPrintErr(...args){var text=args.join(" ");if(ENVIRONMENT_IS_NODE){fs.writeSync(2,text+"\n");return}console.error(text)}if(!Module["printErr"])err=threadPrintErr;function threadAlert(...args){var text=args.join(" ");postMessage({cmd:"alert",text,threadId:_pthread_self()})}self.alert=threadAlert;Module["instantiateWasm"]=(info,receiveInstance)=>new Promise((resolve,reject)=>{wasmPromiseResolve=module=>{var instance=new WebAssembly.Instance(module,getWasmImports());receiveInstance(instance);resolve()};wasmPromiseReject=reject});self.onunhandledrejection=e=>{throw e.reason||e};function handleMessage(e){try{var msgData=e["data"];var cmd=msgData.cmd;if(cmd==="load"){let messageQueue=[];self.onmessage=e=>messageQueue.push(e);self.startWorker=instance=>{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();wasmPromiseResolve(msgData.wasmModule)}else if(cmd==="run"){establishStackSpace(msgData.pthread_ptr);__emscripten_thread_init(msgData.pthread_ptr,0,0,1,0,0);PThread.receiveObjectTransfer(msgData);PThread.threadInitTLS();__emscripten_thread_mailbox_await(msgData.pthread_ptr);if(!initializedJS){initializedJS=true}try{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}if(!ENVIRONMENT_IS_PTHREAD){if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;wasmMemory=new WebAssembly.Memory({initial:INITIAL_MEMORY/65536,maximum:32768,shared:true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){err("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and/or recent version)")}throw Error("bad memory")}}updateMemoryViews()}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;if(!Module["noFSInit"]&&!FS.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){if(ENVIRONMENT_IS_PTHREAD)return;callRuntimeCallbacks(__ATMAIN__)}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(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");function findWasmBinary(){var f="demo.wasm";if(!isDataURI(f)){return locateFile(f)}return f}var wasmBinaryFile;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"}function getBinaryPromise(binaryFile){if(!wasmBinary){return readAsync(binaryFile).then(response=>new Uint8Array(response),()=>getBinarySync(binaryFile))}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){assignWasmImports();return{a:wasmImports}}function createWasm(){var info=getWasmImports();function receiveInstance(instance,module){wasmExports=instance.exports;registerTLSInit(wasmExports["Ue"]);wasmTable=wasmExports["Re"];addOnInit(wasmExports["Pe"]);wasmModule=module;removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);return false}}wasmBinaryFile??=findWasmBinary();instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult);return{}}function ExitStatus(status){this.name="ExitStatus";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 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 convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;var proxyToMainThread=(funcIndex,emAsmAddr,sync,...callArgs)=>{var serializedNumCallArgs=callArgs.length;var sp=stackSave();var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(1,0,0,returnCode);_exit(returnCode)}var exitJS=(status,implicit)=>{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(){addOnPreRun(()=>{addRunDependency("loading-workers");PThread.loadWasmModuleToAllWorkers(()=>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)},receiveObjectTransfer(data){},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"){cleanupThread(d.thread)}else if(cmd==="loaded"){worker.loaded=true;onFinishedLoading(worker)}else if(cmd==="alert"){alert(`Thread ${d.threadId}: ${d.text}`)}else if(d.target==="setimmediate"){worker.postMessage(d)}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})}),loadWasmModuleToAllWorkers(onMaybeReady){onMaybeReady()},allocateUnusedWorker(){var worker;var workerOptions={workerData:"em-pthread",name:"em-pthread"};var pthreadMainJs=_scriptName;if(Module["mainScriptUrlOrBlob"]){pthreadMainJs=Module["mainScriptUrlOrBlob"];if(typeof pthreadMainJs!="string"){pthreadMainJs=URL.createObjectURL(pthreadMainJs)}}worker=new Worker(pthreadMainJs,workerOptions);PThread.unusedWorkers.push(worker)},getNewWorker(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var establishStackSpace=pthread_ptr=>{updateMemoryViews();var stackHigh=GROWABLE_HEAP_U32()[pthread_ptr+52>>2];var stackSize=GROWABLE_HEAP_U32()[pthread_ptr+56>>2];var stackLow=stackHigh-stackSize;_emscripten_stack_set_limits(stackHigh,stackLow);stackRestore(stackHigh)};var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var invokeEntryPoint=(ptr,arg)=>{runtimeKeepaliveCounter=0;noExitRuntime=0;var result=getWasmTableEntry(ptr)(arg);function finish(result){if(keepRuntimeAlive()){EXITSTATUS=result}else{__emscripten_thread_exit(result)}}finish(result)};var noExitRuntime=Module["noExitRuntime"]||true;var registerTLSInit=tlsInitFunc=>PThread.tlsInitFunctions.push(tlsInitFunc);var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder:undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.buffer instanceof SharedArrayBuffer?heapOrArray.slice(idx,endPtr):heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(GROWABLE_HEAP_U8(),ptr,maxBytesToRead):"";var ___assert_fail=(condition,filename,line,func)=>{abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])};var __emscripten_init_main_thread_js=tb=>{__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB,65536,false);PThread.threadInitTLS()};var maybeExit=()=>{if(!keepRuntimeAlive()){try{if(ENVIRONMENT_IS_PTHREAD)__emscripten_thread_exit(EXITSTATUS);else _exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var __emscripten_thread_mailbox_await=pthread_ptr=>{if(typeof Atomics.waitAsync==="function"){var wait=Atomics.waitAsync(GROWABLE_HEAP_I32(),pthread_ptr>>2,pthread_ptr);wait.value.then(checkMailbox);var waitingAsync=pthread_ptr+128;Atomics.store(GROWABLE_HEAP_I32(),waitingAsync>>2,1)}};var checkMailbox=()=>{var pthread_ptr=_pthread_self();if(pthread_ptr){__emscripten_thread_mailbox_await(pthread_ptr);callUserCallback(__emscripten_check_mailbox)}};var __emscripten_notify_mailbox_postmessage=(targetThread,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=[];var __emscripten_receive_on_main_thread_js=(funcIndex,emAsmAddr,callingThread,numCallArgs,args)=>{proxiedJSCallArgs.length=numCallArgs;var b=args>>3;for(var i=0;i{if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({cmd:"cleanupThread",thread})};var __emscripten_thread_set_strongref=thread=>{if(ENVIRONMENT_IS_NODE){PThread.pthreads[thread].ref()}};var warnOnce=text=>{warnOnce.shown||={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}};var _emscripten_check_blocking_allowed=()=>{};var runtimeKeepalivePush=()=>{runtimeKeepaliveCounter+=1};var _emscripten_exit_with_live_runtime=()=>{runtimeKeepalivePush();throw"unwind"};var _emscripten_get_now=()=>performance.timeOrigin+performance.now();var GLctx;var webgl_enable_ANGLE_instanced_arrays=ctx=>{var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=(index,divisor)=>ext["vertexAttribDivisorANGLE"](index,divisor);ctx["drawArraysInstanced"]=(mode,first,count,primcount)=>ext["drawArraysInstancedANGLE"](mode,first,count,primcount);ctx["drawElementsInstanced"]=(mode,count,type,indices,primcount)=>ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount);return 1}};var webgl_enable_OES_vertex_array_object=ctx=>{var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=()=>ext["createVertexArrayOES"]();ctx["deleteVertexArray"]=vao=>ext["deleteVertexArrayOES"](vao);ctx["bindVertexArray"]=vao=>ext["bindVertexArrayOES"](vao);ctx["isVertexArray"]=vao=>ext["isVertexArrayOES"](vao);return 1}};var webgl_enable_WEBGL_draw_buffers=ctx=>{var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=(n,bufs)=>ext["drawBuffersWEBGL"](n,bufs);return 1}};var webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance=ctx=>!!(ctx.dibvbi=ctx.getExtension("WEBGL_draw_instanced_base_vertex_base_instance"));var webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance=ctx=>!!(ctx.mdibvbi=ctx.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance"));var webgl_enable_EXT_polygon_offset_clamp=ctx=>!!(ctx.extPolygonOffsetClamp=ctx.getExtension("EXT_polygon_offset_clamp"));var webgl_enable_EXT_clip_control=ctx=>!!(ctx.extClipControl=ctx.getExtension("EXT_clip_control"));var webgl_enable_WEBGL_polygon_mode=ctx=>!!(ctx.webglPolygonMode=ctx.getExtension("WEBGL_polygon_mode"));var webgl_enable_WEBGL_multi_draw=ctx=>!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"));var getEmscriptenSupportedExtensions=ctx=>{var supportedExtensions=["ANGLE_instanced_arrays","EXT_blend_minmax","EXT_disjoint_timer_query","EXT_frag_depth","EXT_shader_texture_lod","EXT_sRGB","OES_element_index_uint","OES_fbo_render_mipmap","OES_standard_derivatives","OES_texture_float","OES_texture_half_float","OES_texture_half_float_linear","OES_vertex_array_object","WEBGL_color_buffer_float","WEBGL_depth_texture","WEBGL_draw_buffers","EXT_color_buffer_float","EXT_conservative_depth","EXT_disjoint_timer_query_webgl2","EXT_texture_norm16","NV_shader_noperspective_interpolation","WEBGL_clip_cull_distance","EXT_clip_control","EXT_color_buffer_half_float","EXT_depth_clamp","EXT_float_blend","EXT_polygon_offset_clamp","EXT_texture_compression_bptc","EXT_texture_compression_rgtc","EXT_texture_filter_anisotropic","KHR_parallel_shader_compile","OES_texture_float_linear","WEBGL_blend_func_extended","WEBGL_compressed_texture_astc","WEBGL_compressed_texture_etc","WEBGL_compressed_texture_etc1","WEBGL_compressed_texture_s3tc","WEBGL_compressed_texture_s3tc_srgb","WEBGL_debug_renderer_info","WEBGL_debug_shaders","WEBGL_lose_context","WEBGL_multi_draw","WEBGL_polygon_mode"];return(ctx.getSupportedExtensions()||[]).filter(ext=>supportedExtensions.includes(ext))};var registerPreMainLoop=f=>{typeof MainLoop!="undefined"&&MainLoop.preMainLoop.push(f)};var GL={counter:1,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},queries:[],samplers:[],transformFeedbacks:[],syncs:[],byteSizeByTypeRoot:5120,byteSizeByType:[1,1,2,2,4,4,4,2,3,4,8],stringCache:{},stringiCache:{},unpackAlignment:4,unpackRowLength:0,recordError:errorCode=>{if(!GL.lastError){GL.lastError=errorCode}},getNewId:table=>{var ret=GL.counter++;for(var i=table.length;i{for(var i=0;i>2]=id}},MAX_TEMP_BUFFER_SIZE:2097152,numTempVertexBuffersPerSize:64,log2ceilLookup:i=>32-Math.clz32(i===0?0:i-1),generateTempBuffers:(quads,context)=>{var largestIndex=GL.log2ceilLookup(GL.MAX_TEMP_BUFFER_SIZE);context.tempVertexBufferCounters1=[];context.tempVertexBufferCounters2=[];context.tempVertexBufferCounters1.length=context.tempVertexBufferCounters2.length=largestIndex+1;context.tempVertexBuffers1=[];context.tempVertexBuffers2=[];context.tempVertexBuffers1.length=context.tempVertexBuffers2.length=largestIndex+1;context.tempIndexBuffers=[];context.tempIndexBuffers.length=largestIndex+1;for(var i=0;i<=largestIndex;++i){context.tempIndexBuffers[i]=null;context.tempVertexBufferCounters1[i]=context.tempVertexBufferCounters2[i]=0;var ringbufferLength=GL.numTempVertexBuffersPerSize;context.tempVertexBuffers1[i]=[];context.tempVertexBuffers2[i]=[];var ringbuffer1=context.tempVertexBuffers1[i];var ringbuffer2=context.tempVertexBuffers2[i];ringbuffer1.length=ringbuffer2.length=ringbufferLength;for(var j=0;j>1;var quadIndexes=new Uint16Array(numIndexes);var i=0,v=0;while(1){quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+1;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v+3;if(i>=numIndexes)break;v+=4}context.GLctx.bufferData(34963,quadIndexes,35044);context.GLctx.bindBuffer(34963,null)}},getTempVertexBuffer:sizeBytes=>{var idx=GL.log2ceilLookup(sizeBytes);var ringbuffer=GL.currentContext.tempVertexBuffers1[idx];var nextFreeBufferIndex=GL.currentContext.tempVertexBufferCounters1[idx];GL.currentContext.tempVertexBufferCounters1[idx]=GL.currentContext.tempVertexBufferCounters1[idx]+1&GL.numTempVertexBuffersPerSize-1;var vbo=ringbuffer[nextFreeBufferIndex];if(vbo){return vbo}var prevVBO=GLctx.getParameter(34964);ringbuffer[nextFreeBufferIndex]=GLctx.createBuffer();GLctx.bindBuffer(34962,ringbuffer[nextFreeBufferIndex]);GLctx.bufferData(34962,1<{var idx=GL.log2ceilLookup(sizeBytes);var ibo=GL.currentContext.tempIndexBuffers[idx];if(ibo){return ibo}var prevIBO=GLctx.getParameter(34965);GL.currentContext.tempIndexBuffers[idx]=GLctx.createBuffer();GLctx.bindBuffer(34963,GL.currentContext.tempIndexBuffers[idx]);GLctx.bufferData(34963,1<{if(!GL.currentContext){return}var vb=GL.currentContext.tempVertexBuffers1;GL.currentContext.tempVertexBuffers1=GL.currentContext.tempVertexBuffers2;GL.currentContext.tempVertexBuffers2=vb;vb=GL.currentContext.tempVertexBufferCounters1;GL.currentContext.tempVertexBufferCounters1=GL.currentContext.tempVertexBufferCounters2;GL.currentContext.tempVertexBufferCounters2=vb;var largestIndex=GL.log2ceilLookup(GL.MAX_TEMP_BUFFER_SIZE);for(var i=0;i<=largestIndex;++i){GL.currentContext.tempVertexBufferCounters1[i]=0}},getSource:(shader,count,string,length)=>{var source="";for(var i=0;i>2]:undefined;source+=UTF8ToString(GROWABLE_HEAP_U32()[string+i*4>>2],len)}return source},calcBufLength:(size,type,stride,count)=>{if(stride>0){return count*stride}var typeSize=GL.byteSizeByType[type-GL.byteSizeByTypeRoot];return size*typeSize*count},usedTempBuffers:[],preDrawHandleClientVertexAttribBindings:count=>{GL.resetBufferBinding=false;for(var i=0;i{if(GL.resetBufferBinding){GLctx.bindBuffer(34962,GL.buffers[GLctx.currentArrayBufferBinding])}},createContext:(canvas,webGLContextAttributes)=>{if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}canvas.getContext=fixedGetContext}var ctx=webGLContextAttributes.majorVersion>1?canvas.getContext("webgl2",webGLContextAttributes):canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:(ctx,webGLContextAttributes)=>{var handle=_malloc(8);GROWABLE_HEAP_U32()[handle+4>>2]=_pthread_self();var context={handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault=="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}context.maxVertexAttribs=context.GLctx.getParameter(34921);context.clientBuffers=[];for(var i=0;i{GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext?.GLctx;return!(contextHandle&&!GLctx)},getContext:contextHandle=>GL.contexts[contextHandle],deleteContext:contextHandle=>{if(GL.currentContext===GL.contexts[contextHandle]){GL.currentContext=null}if(typeof JSEvents=="object"){JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas)}if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas){GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined}_free(GL.contexts[contextHandle].handle);GL.contexts[contextHandle]=null},initExtensions:context=>{context||=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;webgl_enable_WEBGL_multi_draw(GLctx);webgl_enable_EXT_polygon_offset_clamp(GLctx);webgl_enable_EXT_clip_control(GLctx);webgl_enable_WEBGL_polygon_mode(GLctx);webgl_enable_ANGLE_instanced_arrays(GLctx);webgl_enable_OES_vertex_array_object(GLctx);webgl_enable_WEBGL_draw_buffers(GLctx);webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(GLctx);webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(GLctx);if(context.version>=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}getEmscriptenSupportedExtensions(GLctx).forEach(ext=>{if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var _glActiveTexture=x0=>GLctx.activeTexture(x0);var _emscripten_glActiveTexture=_glActiveTexture;var _glAttachShader=(program,shader)=>{GLctx.attachShader(GL.programs[program],GL.shaders[shader])};var _emscripten_glAttachShader=_glAttachShader;var _glBeginQuery=(target,id)=>{GLctx.beginQuery(target,GL.queries[id])};var _emscripten_glBeginQuery=_glBeginQuery;var _glBeginQueryEXT=(target,id)=>{GLctx.disjointTimerQueryExt["beginQueryEXT"](target,GL.queries[id])};var _emscripten_glBeginQueryEXT=_glBeginQueryEXT;var _glBeginTransformFeedback=x0=>GLctx.beginTransformFeedback(x0);var _emscripten_glBeginTransformFeedback=_glBeginTransformFeedback;var _glBindAttribLocation=(program,index,name)=>{GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))};var _emscripten_glBindAttribLocation=_glBindAttribLocation;var _glBindBuffer=(target,buffer)=>{if(target==34962){GLctx.currentArrayBufferBinding=buffer}else if(target==34963){GLctx.currentElementArrayBufferBinding=buffer}if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])};var _emscripten_glBindBuffer=_glBindBuffer;var _glBindBufferBase=(target,index,buffer)=>{GLctx.bindBufferBase(target,index,GL.buffers[buffer])};var _emscripten_glBindBufferBase=_glBindBufferBase;var _glBindBufferRange=(target,index,buffer,offset,ptrsize)=>{GLctx.bindBufferRange(target,index,GL.buffers[buffer],offset,ptrsize)};var _emscripten_glBindBufferRange=_glBindBufferRange;var _glBindFramebuffer=(target,framebuffer)=>{GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])};var _emscripten_glBindFramebuffer=_glBindFramebuffer;var _glBindRenderbuffer=(target,renderbuffer)=>{GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])};var _emscripten_glBindRenderbuffer=_glBindRenderbuffer;var _glBindSampler=(unit,sampler)=>{GLctx.bindSampler(unit,GL.samplers[sampler])};var _emscripten_glBindSampler=_glBindSampler;var _glBindTexture=(target,texture)=>{GLctx.bindTexture(target,GL.textures[texture])};var _emscripten_glBindTexture=_glBindTexture;var _glBindTransformFeedback=(target,id)=>{GLctx.bindTransformFeedback(target,GL.transformFeedbacks[id])};var _emscripten_glBindTransformFeedback=_glBindTransformFeedback;var _glBindVertexArray=vao=>{GLctx.bindVertexArray(GL.vaos[vao]);var ibo=GLctx.getParameter(34965);GLctx.currentElementArrayBufferBinding=ibo?ibo.name|0:0};var _emscripten_glBindVertexArray=_glBindVertexArray;var _glBindVertexArrayOES=_glBindVertexArray;var _emscripten_glBindVertexArrayOES=_glBindVertexArrayOES;var _glBlendColor=(x0,x1,x2,x3)=>GLctx.blendColor(x0,x1,x2,x3);var _emscripten_glBlendColor=_glBlendColor;var _glBlendEquation=x0=>GLctx.blendEquation(x0);var _emscripten_glBlendEquation=_glBlendEquation;var _glBlendEquationSeparate=(x0,x1)=>GLctx.blendEquationSeparate(x0,x1);var _emscripten_glBlendEquationSeparate=_glBlendEquationSeparate;var _glBlendFunc=(x0,x1)=>GLctx.blendFunc(x0,x1);var _emscripten_glBlendFunc=_glBlendFunc;var _glBlendFuncSeparate=(x0,x1,x2,x3)=>GLctx.blendFuncSeparate(x0,x1,x2,x3);var _emscripten_glBlendFuncSeparate=_glBlendFuncSeparate;var _glBlitFramebuffer=(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)=>GLctx.blitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9);var _emscripten_glBlitFramebuffer=_glBlitFramebuffer;var _glBufferData=(target,size,data,usage)=>{if(GL.currentContext.version>=2){if(data&&size){GLctx.bufferData(target,GROWABLE_HEAP_U8(),usage,data,size)}else{GLctx.bufferData(target,size,usage)}return}GLctx.bufferData(target,data?GROWABLE_HEAP_U8().subarray(data,data+size):size,usage)};var _emscripten_glBufferData=_glBufferData;var _glBufferSubData=(target,offset,size,data)=>{if(GL.currentContext.version>=2){size&&GLctx.bufferSubData(target,offset,GROWABLE_HEAP_U8(),data,size);return}GLctx.bufferSubData(target,offset,GROWABLE_HEAP_U8().subarray(data,data+size))};var _emscripten_glBufferSubData=_glBufferSubData;var _glCheckFramebufferStatus=x0=>GLctx.checkFramebufferStatus(x0);var _emscripten_glCheckFramebufferStatus=_glCheckFramebufferStatus;var _glClear=x0=>GLctx.clear(x0);var _emscripten_glClear=_glClear;var _glClearBufferfi=(x0,x1,x2,x3)=>GLctx.clearBufferfi(x0,x1,x2,x3);var _emscripten_glClearBufferfi=_glClearBufferfi;var _glClearBufferfv=(buffer,drawbuffer,value)=>{GLctx.clearBufferfv(buffer,drawbuffer,GROWABLE_HEAP_F32(),value>>2)};var _emscripten_glClearBufferfv=_glClearBufferfv;var _glClearBufferiv=(buffer,drawbuffer,value)=>{GLctx.clearBufferiv(buffer,drawbuffer,GROWABLE_HEAP_I32(),value>>2)};var _emscripten_glClearBufferiv=_glClearBufferiv;var _glClearBufferuiv=(buffer,drawbuffer,value)=>{GLctx.clearBufferuiv(buffer,drawbuffer,GROWABLE_HEAP_U32(),value>>2)};var _emscripten_glClearBufferuiv=_glClearBufferuiv;var _glClearColor=(x0,x1,x2,x3)=>GLctx.clearColor(x0,x1,x2,x3);var _emscripten_glClearColor=_glClearColor;var _glClearDepthf=x0=>GLctx.clearDepth(x0);var _emscripten_glClearDepthf=_glClearDepthf;var _glClearStencil=x0=>GLctx.clearStencil(x0);var _emscripten_glClearStencil=_glClearStencil;var convertI32PairToI53=(lo,hi)=>(lo>>>0)+hi*4294967296;var _glClientWaitSync=(sync,flags,timeout_low,timeout_high)=>{var timeout=convertI32PairToI53(timeout_low,timeout_high);return GLctx.clientWaitSync(GL.syncs[sync],flags,timeout)};var _emscripten_glClientWaitSync=_glClientWaitSync;var _glClipControlEXT=(origin,depth)=>{GLctx.extClipControl["clipControlEXT"](origin,depth)};var _emscripten_glClipControlEXT=_glClipControlEXT;var _glColorMask=(red,green,blue,alpha)=>{GLctx.colorMask(!!red,!!green,!!blue,!!alpha)};var _emscripten_glColorMask=_glColorMask;var _glCompileShader=shader=>{GLctx.compileShader(GL.shaders[shader])};var _emscripten_glCompileShader=_glCompileShader;var _glCompressedTexImage2D=(target,level,internalFormat,width,height,border,imageSize,data)=>{if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data);return}GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,GROWABLE_HEAP_U8(),data,imageSize);return}GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,GROWABLE_HEAP_U8().subarray(data,data+imageSize))};var _emscripten_glCompressedTexImage2D=_glCompressedTexImage2D;var _glCompressedTexImage3D=(target,level,internalFormat,width,height,depth,border,imageSize,data)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.compressedTexImage3D(target,level,internalFormat,width,height,depth,border,imageSize,data)}else{GLctx.compressedTexImage3D(target,level,internalFormat,width,height,depth,border,GROWABLE_HEAP_U8(),data,imageSize)}};var _emscripten_glCompressedTexImage3D=_glCompressedTexImage3D;var _glCompressedTexSubImage2D=(target,level,xoffset,yoffset,width,height,format,imageSize,data)=>{if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx.compressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data);return}GLctx.compressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,GROWABLE_HEAP_U8(),data,imageSize);return}GLctx.compressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,GROWABLE_HEAP_U8().subarray(data,data+imageSize))};var _emscripten_glCompressedTexSubImage2D=_glCompressedTexSubImage2D;var _glCompressedTexSubImage3D=(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.compressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx.compressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,GROWABLE_HEAP_U8(),data,imageSize)}};var _emscripten_glCompressedTexSubImage3D=_glCompressedTexSubImage3D;var _glCopyBufferSubData=(x0,x1,x2,x3,x4)=>GLctx.copyBufferSubData(x0,x1,x2,x3,x4);var _emscripten_glCopyBufferSubData=_glCopyBufferSubData;var _glCopyTexImage2D=(x0,x1,x2,x3,x4,x5,x6,x7)=>GLctx.copyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7);var _emscripten_glCopyTexImage2D=_glCopyTexImage2D;var _glCopyTexSubImage2D=(x0,x1,x2,x3,x4,x5,x6,x7)=>GLctx.copyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7);var _emscripten_glCopyTexSubImage2D=_glCopyTexSubImage2D;var _glCopyTexSubImage3D=(x0,x1,x2,x3,x4,x5,x6,x7,x8)=>GLctx.copyTexSubImage3D(x0,x1,x2,x3,x4,x5,x6,x7,x8);var _emscripten_glCopyTexSubImage3D=_glCopyTexSubImage3D;var _glCreateProgram=()=>{var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id};var _emscripten_glCreateProgram=_glCreateProgram;var _glCreateShader=shaderType=>{var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id};var _emscripten_glCreateShader=_glCreateShader;var _glCullFace=x0=>GLctx.cullFace(x0);var _emscripten_glCullFace=_glCullFace;var _glDeleteBuffers=(n,buffers)=>{for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentArrayBufferBinding)GLctx.currentArrayBufferBinding=0;if(id==GLctx.currentElementArrayBufferBinding)GLctx.currentElementArrayBufferBinding=0;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}};var _emscripten_glDeleteBuffers=_glDeleteBuffers;var _glDeleteFramebuffers=(n,framebuffers)=>{for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}};var _emscripten_glDeleteFramebuffers=_glDeleteFramebuffers;var _glDeleteProgram=id=>{if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null};var _emscripten_glDeleteProgram=_glDeleteProgram;var _glDeleteQueries=(n,ids)=>{for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx.deleteQuery(query);GL.queries[id]=null}};var _emscripten_glDeleteQueries=_glDeleteQueries;var _glDeleteQueriesEXT=(n,ids)=>{for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx.disjointTimerQueryExt["deleteQueryEXT"](query);GL.queries[id]=null}};var _emscripten_glDeleteQueriesEXT=_glDeleteQueriesEXT;var _glDeleteRenderbuffers=(n,renderbuffers)=>{for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}};var _emscripten_glDeleteRenderbuffers=_glDeleteRenderbuffers;var _glDeleteSamplers=(n,samplers)=>{for(var i=0;i>2];var sampler=GL.samplers[id];if(!sampler)continue;GLctx.deleteSampler(sampler);sampler.name=0;GL.samplers[id]=null}};var _emscripten_glDeleteSamplers=_glDeleteSamplers;var _glDeleteShader=id=>{if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null};var _emscripten_glDeleteShader=_glDeleteShader;var _glDeleteSync=id=>{if(!id)return;var sync=GL.syncs[id];if(!sync){GL.recordError(1281);return}GLctx.deleteSync(sync);sync.name=0;GL.syncs[id]=null};var _emscripten_glDeleteSync=_glDeleteSync;var _glDeleteTextures=(n,textures)=>{for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}};var _emscripten_glDeleteTextures=_glDeleteTextures;var _glDeleteTransformFeedbacks=(n,ids)=>{for(var i=0;i>2];var transformFeedback=GL.transformFeedbacks[id];if(!transformFeedback)continue;GLctx.deleteTransformFeedback(transformFeedback);transformFeedback.name=0;GL.transformFeedbacks[id]=null}};var _emscripten_glDeleteTransformFeedbacks=_glDeleteTransformFeedbacks;var _glDeleteVertexArrays=(n,vaos)=>{for(var i=0;i>2];GLctx.deleteVertexArray(GL.vaos[id]);GL.vaos[id]=null}};var _emscripten_glDeleteVertexArrays=_glDeleteVertexArrays;var _glDeleteVertexArraysOES=_glDeleteVertexArrays;var _emscripten_glDeleteVertexArraysOES=_glDeleteVertexArraysOES;var _glDepthFunc=x0=>GLctx.depthFunc(x0);var _emscripten_glDepthFunc=_glDepthFunc;var _glDepthMask=flag=>{GLctx.depthMask(!!flag)};var _emscripten_glDepthMask=_glDepthMask;var _glDepthRangef=(x0,x1)=>GLctx.depthRange(x0,x1);var _emscripten_glDepthRangef=_glDepthRangef;var _glDetachShader=(program,shader)=>{GLctx.detachShader(GL.programs[program],GL.shaders[shader])};var _emscripten_glDetachShader=_glDetachShader;var _glDisable=x0=>GLctx.disable(x0);var _emscripten_glDisable=_glDisable;var _glDisableVertexAttribArray=index=>{var cb=GL.currentContext.clientBuffers[index];cb.enabled=false;GLctx.disableVertexAttribArray(index)};var _emscripten_glDisableVertexAttribArray=_glDisableVertexAttribArray;var _glDrawArrays=(mode,first,count)=>{GL.preDrawHandleClientVertexAttribBindings(first+count);GLctx.drawArrays(mode,first,count);GL.postDrawHandleClientVertexAttribBindings()};var _emscripten_glDrawArrays=_glDrawArrays;var _glDrawArraysInstanced=(mode,first,count,primcount)=>{GLctx.drawArraysInstanced(mode,first,count,primcount)};var _emscripten_glDrawArraysInstanced=_glDrawArraysInstanced;var _glDrawArraysInstancedANGLE=_glDrawArraysInstanced;var _emscripten_glDrawArraysInstancedANGLE=_glDrawArraysInstancedANGLE;var _glDrawArraysInstancedARB=_glDrawArraysInstanced;var _emscripten_glDrawArraysInstancedARB=_glDrawArraysInstancedARB;var _glDrawArraysInstancedEXT=_glDrawArraysInstanced;var _emscripten_glDrawArraysInstancedEXT=_glDrawArraysInstancedEXT;var _glDrawArraysInstancedNV=_glDrawArraysInstanced;var _emscripten_glDrawArraysInstancedNV=_glDrawArraysInstancedNV;var tempFixedLengthArray=[];var _glDrawBuffers=(n,bufs)=>{var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx.drawBuffers(bufArray)};var _emscripten_glDrawBuffers=_glDrawBuffers;var _glDrawBuffersEXT=_glDrawBuffers;var _emscripten_glDrawBuffersEXT=_glDrawBuffersEXT;var _glDrawBuffersWEBGL=_glDrawBuffers;var _emscripten_glDrawBuffersWEBGL=_glDrawBuffersWEBGL;var _glDrawElements=(mode,count,type,indices)=>{var buf;var vertexes=0;if(!GLctx.currentElementArrayBufferBinding){var size=GL.calcBufLength(1,type,0,count);buf=GL.getTempIndexBuffer(size);GLctx.bindBuffer(34963,buf);GLctx.bufferSubData(34963,0,GROWABLE_HEAP_U8().subarray(indices,indices+size));if(count>0){for(var i=0;iMath.max(max,current))+1;break}}}indices=0}GL.preDrawHandleClientVertexAttribBindings(vertexes);GLctx.drawElements(mode,count,type,indices);GL.postDrawHandleClientVertexAttribBindings(count);if(!GLctx.currentElementArrayBufferBinding){GLctx.bindBuffer(34963,null)}};var _emscripten_glDrawElements=_glDrawElements;var _glDrawElementsInstanced=(mode,count,type,indices,primcount)=>{GLctx.drawElementsInstanced(mode,count,type,indices,primcount)};var _emscripten_glDrawElementsInstanced=_glDrawElementsInstanced;var _glDrawElementsInstancedANGLE=_glDrawElementsInstanced;var _emscripten_glDrawElementsInstancedANGLE=_glDrawElementsInstancedANGLE;var _glDrawElementsInstancedARB=_glDrawElementsInstanced;var _emscripten_glDrawElementsInstancedARB=_glDrawElementsInstancedARB;var _glDrawElementsInstancedEXT=_glDrawElementsInstanced;var _emscripten_glDrawElementsInstancedEXT=_glDrawElementsInstancedEXT;var _glDrawElementsInstancedNV=_glDrawElementsInstanced;var _emscripten_glDrawElementsInstancedNV=_glDrawElementsInstancedNV;var _glDrawRangeElements=(mode,start,end,count,type,indices)=>{_glDrawElements(mode,count,type,indices)};var _emscripten_glDrawRangeElements=_glDrawRangeElements;var _glEnable=x0=>GLctx.enable(x0);var _emscripten_glEnable=_glEnable;var _glEnableVertexAttribArray=index=>{var cb=GL.currentContext.clientBuffers[index];cb.enabled=true;GLctx.enableVertexAttribArray(index)};var _emscripten_glEnableVertexAttribArray=_glEnableVertexAttribArray;var _glEndQuery=x0=>GLctx.endQuery(x0);var _emscripten_glEndQuery=_glEndQuery;var _glEndQueryEXT=target=>{GLctx.disjointTimerQueryExt["endQueryEXT"](target)};var _emscripten_glEndQueryEXT=_glEndQueryEXT;var _glEndTransformFeedback=()=>GLctx.endTransformFeedback();var _emscripten_glEndTransformFeedback=_glEndTransformFeedback;var _glFenceSync=(condition,flags)=>{var sync=GLctx.fenceSync(condition,flags);if(sync){var id=GL.getNewId(GL.syncs);sync.name=id;GL.syncs[id]=sync;return id}return 0};var _emscripten_glFenceSync=_glFenceSync;var _glFinish=()=>GLctx.finish();var _emscripten_glFinish=_glFinish;var _glFlush=()=>GLctx.flush();var _emscripten_glFlush=_glFlush;var emscriptenWebGLGetBufferBinding=target=>{switch(target){case 34962:target=34964;break;case 34963:target=34965;break;case 35051:target=35053;break;case 35052:target=35055;break;case 35982:target=35983;break;case 36662:target=36662;break;case 36663:target=36663;break;case 35345:target=35368;break}var buffer=GLctx.getParameter(target);if(buffer)return buffer.name|0;else return 0};var emscriptenWebGLValidateMapBufferTarget=target=>{switch(target){case 34962:case 34963:case 36662:case 36663:case 35051:case 35052:case 35882:case 35982:case 35345:return true;default:return false}};var _glFlushMappedBufferRange=(target,offset,length)=>{if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glFlushMappedBufferRange");return}var mapping=GL.mappedBuffers[emscriptenWebGLGetBufferBinding(target)];if(!mapping){GL.recordError(1282);err("buffer was never mapped in glFlushMappedBufferRange");return}if(!(mapping.access&16)){GL.recordError(1282);err("buffer was not mapped with GL_MAP_FLUSH_EXPLICIT_BIT in glFlushMappedBufferRange");return}if(offset<0||length<0||offset+length>mapping.length){GL.recordError(1281);err("invalid range in glFlushMappedBufferRange");return}GLctx.bufferSubData(target,mapping.offset,GROWABLE_HEAP_U8().subarray(mapping.mem+offset,mapping.mem+offset+length))};var _emscripten_glFlushMappedBufferRange=_glFlushMappedBufferRange;var _glFramebufferRenderbuffer=(target,attachment,renderbuffertarget,renderbuffer)=>{GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])};var _emscripten_glFramebufferRenderbuffer=_glFramebufferRenderbuffer;var _glFramebufferTexture2D=(target,attachment,textarget,texture,level)=>{GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)};var _emscripten_glFramebufferTexture2D=_glFramebufferTexture2D;var _glFramebufferTextureLayer=(target,attachment,texture,level,layer)=>{GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)};var _emscripten_glFramebufferTextureLayer=_glFramebufferTextureLayer;var _glFrontFace=x0=>GLctx.frontFace(x0);var _emscripten_glFrontFace=_glFrontFace;var _glGenBuffers=(n,buffers)=>{GL.genObject(n,buffers,"createBuffer",GL.buffers)};var _emscripten_glGenBuffers=_glGenBuffers;var _glGenFramebuffers=(n,ids)=>{GL.genObject(n,ids,"createFramebuffer",GL.framebuffers)};var _emscripten_glGenFramebuffers=_glGenFramebuffers;var _glGenQueries=(n,ids)=>{GL.genObject(n,ids,"createQuery",GL.queries)};var _emscripten_glGenQueries=_glGenQueries;var _glGenQueriesEXT=(n,ids)=>{for(var i=0;i>2]=0;return}var id=GL.getNewId(GL.queries);query.name=id;GL.queries[id]=query;GROWABLE_HEAP_I32()[ids+i*4>>2]=id}};var _emscripten_glGenQueriesEXT=_glGenQueriesEXT;var _glGenRenderbuffers=(n,renderbuffers)=>{GL.genObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)};var _emscripten_glGenRenderbuffers=_glGenRenderbuffers;var _glGenSamplers=(n,samplers)=>{GL.genObject(n,samplers,"createSampler",GL.samplers)};var _emscripten_glGenSamplers=_glGenSamplers;var _glGenTextures=(n,textures)=>{GL.genObject(n,textures,"createTexture",GL.textures)};var _emscripten_glGenTextures=_glGenTextures;var _glGenTransformFeedbacks=(n,ids)=>{GL.genObject(n,ids,"createTransformFeedback",GL.transformFeedbacks)};var _emscripten_glGenTransformFeedbacks=_glGenTransformFeedbacks;var _glGenVertexArrays=(n,arrays)=>{GL.genObject(n,arrays,"createVertexArray",GL.vaos)};var _emscripten_glGenVertexArrays=_glGenVertexArrays;var _glGenVertexArraysOES=_glGenVertexArrays;var _emscripten_glGenVertexArraysOES=_glGenVertexArraysOES;var _glGenerateMipmap=x0=>GLctx.generateMipmap(x0);var _emscripten_glGenerateMipmap=_glGenerateMipmap;var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=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}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,GROWABLE_HEAP_U8(),outPtr,maxBytesToWrite);var __glGetActiveAttribOrUniform=(funcName,program,index,bufSize,length,size,type,name)=>{program=GL.programs[program];var info=GLctx[funcName](program,index);if(info){var numBytesWrittenExclNull=name&&stringToUTF8(info.name,name,bufSize);if(length)GROWABLE_HEAP_I32()[length>>2]=numBytesWrittenExclNull;if(size)GROWABLE_HEAP_I32()[size>>2]=info.size;if(type)GROWABLE_HEAP_I32()[type>>2]=info.type}};var _glGetActiveAttrib=(program,index,bufSize,length,size,type,name)=>{__glGetActiveAttribOrUniform("getActiveAttrib",program,index,bufSize,length,size,type,name)};var _emscripten_glGetActiveAttrib=_glGetActiveAttrib;var _glGetActiveUniform=(program,index,bufSize,length,size,type,name)=>{__glGetActiveAttribOrUniform("getActiveUniform",program,index,bufSize,length,size,type,name)};var _emscripten_glGetActiveUniform=_glGetActiveUniform;var _glGetActiveUniformBlockName=(program,uniformBlockIndex,bufSize,length,uniformBlockName)=>{program=GL.programs[program];var result=GLctx.getActiveUniformBlockName(program,uniformBlockIndex);if(!result)return;if(uniformBlockName&&bufSize>0){var numBytesWrittenExclNull=stringToUTF8(result,uniformBlockName,bufSize);if(length)GROWABLE_HEAP_I32()[length>>2]=numBytesWrittenExclNull}else{if(length)GROWABLE_HEAP_I32()[length>>2]=0}};var _emscripten_glGetActiveUniformBlockName=_glGetActiveUniformBlockName;var _glGetActiveUniformBlockiv=(program,uniformBlockIndex,pname,params)=>{if(!params){GL.recordError(1281);return}program=GL.programs[program];if(pname==35393){var name=GLctx.getActiveUniformBlockName(program,uniformBlockIndex);GROWABLE_HEAP_I32()[params>>2]=name.length+1;return}var result=GLctx.getActiveUniformBlockParameter(program,uniformBlockIndex,pname);if(result===null)return;if(pname==35395){for(var i=0;i>2]=result[i]}}else{GROWABLE_HEAP_I32()[params>>2]=result}};var _emscripten_glGetActiveUniformBlockiv=_glGetActiveUniformBlockiv;var _glGetActiveUniformsiv=(program,uniformCount,uniformIndices,pname,params)=>{if(!params){GL.recordError(1281);return}if(uniformCount>0&&uniformIndices==0){GL.recordError(1281);return}program=GL.programs[program];var ids=[];for(var i=0;i>2])}var result=GLctx.getActiveUniforms(program,ids,pname);if(!result)return;var len=result.length;for(var i=0;i>2]=result[i]}};var _emscripten_glGetActiveUniformsiv=_glGetActiveUniformsiv;var _glGetAttachedShaders=(program,maxCount,count,shaders)=>{var result=GLctx.getAttachedShaders(GL.programs[program]);var len=result.length;if(len>maxCount){len=maxCount}GROWABLE_HEAP_I32()[count>>2]=len;for(var i=0;i>2]=id}};var _emscripten_glGetAttachedShaders=_glGetAttachedShaders;var _glGetAttribLocation=(program,name)=>GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name));var _emscripten_glGetAttribLocation=_glGetAttribLocation;var writeI53ToI64=(ptr,num)=>{GROWABLE_HEAP_U32()[ptr>>2]=num;var lower=GROWABLE_HEAP_U32()[ptr>>2];GROWABLE_HEAP_U32()[ptr+4>>2]=(num-lower)/4294967296};var webglGetExtensions=function $webglGetExtensions(){var exts=getEmscriptenSupportedExtensions(GLctx);exts=exts.concat(exts.map(e=>"GL_"+e));return exts};var emscriptenWebGLGet=(name_,p,type)=>{if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}ret=webglGetExtensions().length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:GROWABLE_HEAP_F32()[p+i*4>>2]=result[i];break;case 4:GROWABLE_HEAP_I8()[p+i]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err(`GL_INVALID_ENUM in glGet${type}v: Unknown object returned from WebGL getParameter(${name_})! (error: ${e})`);return}}break;default:GL.recordError(1280);err(`GL_INVALID_ENUM in glGet${type}v: Native code calling glGet${type}v(${name_}) and it returns ${result} of type ${typeof result}!`);return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:GROWABLE_HEAP_I32()[p>>2]=ret;break;case 2:GROWABLE_HEAP_F32()[p>>2]=ret;break;case 4:GROWABLE_HEAP_I8()[p]=ret?1:0;break}};var _glGetBooleanv=(name_,p)=>emscriptenWebGLGet(name_,p,4);var _emscripten_glGetBooleanv=_glGetBooleanv;var _glGetBufferParameteri64v=(target,value,data)=>{if(!data){GL.recordError(1281);return}writeI53ToI64(data,GLctx.getBufferParameter(target,value))};var _emscripten_glGetBufferParameteri64v=_glGetBufferParameteri64v;var _glGetBufferParameteriv=(target,value,data)=>{if(!data){GL.recordError(1281);return}GROWABLE_HEAP_I32()[data>>2]=GLctx.getBufferParameter(target,value)};var _emscripten_glGetBufferParameteriv=_glGetBufferParameteriv;var _glGetBufferPointerv=(target,pname,params)=>{if(pname==35005){var ptr=0;var mappedBuffer=GL.mappedBuffers[emscriptenWebGLGetBufferBinding(target)];if(mappedBuffer){ptr=mappedBuffer.mem}GROWABLE_HEAP_I32()[params>>2]=ptr}else{GL.recordError(1280);err("GL_INVALID_ENUM in glGetBufferPointerv")}};var _emscripten_glGetBufferPointerv=_glGetBufferPointerv;var _glGetError=()=>{var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error};var _emscripten_glGetError=_glGetError;var _glGetFloatv=(name_,p)=>emscriptenWebGLGet(name_,p,2);var _emscripten_glGetFloatv=_glGetFloatv;var _glGetFragDataLocation=(program,name)=>GLctx.getFragDataLocation(GL.programs[program],UTF8ToString(name));var _emscripten_glGetFragDataLocation=_glGetFragDataLocation;var _glGetFramebufferAttachmentParameteriv=(target,attachment,pname,params)=>{var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}GROWABLE_HEAP_I32()[params>>2]=result};var _emscripten_glGetFramebufferAttachmentParameteriv=_glGetFramebufferAttachmentParameteriv;var emscriptenWebGLGetIndexed=(target,index,data,type)=>{if(!data){GL.recordError(1281);return}var result=GLctx.getIndexedParameter(target,index);var ret;switch(typeof result){case"boolean":ret=result?1:0;break;case"number":ret=result;break;case"object":if(result===null){switch(target){case 35983:case 35368:ret=0;break;default:{GL.recordError(1280);return}}}else if(result instanceof WebGLBuffer){ret=result.name|0}else{GL.recordError(1280);return}break;default:GL.recordError(1280);return}switch(type){case 1:writeI53ToI64(data,ret);break;case 0:GROWABLE_HEAP_I32()[data>>2]=ret;break;case 2:GROWABLE_HEAP_F32()[data>>2]=ret;break;case 4:GROWABLE_HEAP_I8()[data]=ret?1:0;break;default:throw"internal emscriptenWebGLGetIndexed() error, bad type: "+type}};var _glGetInteger64i_v=(target,index,data)=>emscriptenWebGLGetIndexed(target,index,data,1);var _emscripten_glGetInteger64i_v=_glGetInteger64i_v;var _glGetInteger64v=(name_,p)=>{emscriptenWebGLGet(name_,p,1)};var _emscripten_glGetInteger64v=_glGetInteger64v;var _glGetIntegeri_v=(target,index,data)=>emscriptenWebGLGetIndexed(target,index,data,0);var _emscripten_glGetIntegeri_v=_glGetIntegeri_v;var _glGetIntegerv=(name_,p)=>emscriptenWebGLGet(name_,p,0);var _emscripten_glGetIntegerv=_glGetIntegerv;var _glGetInternalformativ=(target,internalformat,pname,bufSize,params)=>{if(bufSize<0){GL.recordError(1281);return}if(!params){GL.recordError(1281);return}var ret=GLctx.getInternalformatParameter(target,internalformat,pname);if(ret===null)return;for(var i=0;i>2]=ret[i]}};var _emscripten_glGetInternalformativ=_glGetInternalformativ;var _glGetProgramBinary=(program,bufSize,length,binaryFormat,binary)=>{GL.recordError(1282)};var _emscripten_glGetProgramBinary=_glGetProgramBinary;var _glGetProgramInfoLog=(program,maxLength,length,infoLog)=>{var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)GROWABLE_HEAP_I32()[length>>2]=numBytesWrittenExclNull};var _emscripten_glGetProgramInfoLog=_glGetProgramInfoLog;var _glGetProgramiv=(program,pname,p)=>{if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";GROWABLE_HEAP_I32()[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){var numActiveUniforms=GLctx.getProgramParameter(program,35718);for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){var numActiveAttributes=GLctx.getProgramParameter(program,35721);for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){var numActiveUniformBlocks=GLctx.getProgramParameter(program,35382);for(var i=0;i>2]=program.maxUniformBlockNameLength}else{GROWABLE_HEAP_I32()[p>>2]=GLctx.getProgramParameter(program,pname)}};var _emscripten_glGetProgramiv=_glGetProgramiv;var _glGetQueryObjecti64vEXT=(id,pname,params)=>{if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;if(GL.currentContext.version<2){param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}else{param=GLctx.getQueryParameter(query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)};var _emscripten_glGetQueryObjecti64vEXT=_glGetQueryObjecti64vEXT;var _glGetQueryObjectivEXT=(id,pname,params)=>{if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}GROWABLE_HEAP_I32()[params>>2]=ret};var _emscripten_glGetQueryObjectivEXT=_glGetQueryObjectivEXT;var _glGetQueryObjectui64vEXT=_glGetQueryObjecti64vEXT;var _emscripten_glGetQueryObjectui64vEXT=_glGetQueryObjectui64vEXT;var _glGetQueryObjectuiv=(id,pname,params)=>{if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.getQueryParameter(query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}GROWABLE_HEAP_I32()[params>>2]=ret};var _emscripten_glGetQueryObjectuiv=_glGetQueryObjectuiv;var _glGetQueryObjectuivEXT=_glGetQueryObjectivEXT;var _emscripten_glGetQueryObjectuivEXT=_glGetQueryObjectuivEXT;var _glGetQueryiv=(target,pname,params)=>{if(!params){GL.recordError(1281);return}GROWABLE_HEAP_I32()[params>>2]=GLctx.getQuery(target,pname)};var _emscripten_glGetQueryiv=_glGetQueryiv;var _glGetQueryivEXT=(target,pname,params)=>{if(!params){GL.recordError(1281);return}GROWABLE_HEAP_I32()[params>>2]=GLctx.disjointTimerQueryExt["getQueryEXT"](target,pname)};var _emscripten_glGetQueryivEXT=_glGetQueryivEXT;var _glGetRenderbufferParameteriv=(target,pname,params)=>{if(!params){GL.recordError(1281);return}GROWABLE_HEAP_I32()[params>>2]=GLctx.getRenderbufferParameter(target,pname)};var _emscripten_glGetRenderbufferParameteriv=_glGetRenderbufferParameteriv;var _glGetSamplerParameterfv=(sampler,pname,params)=>{if(!params){GL.recordError(1281);return}GROWABLE_HEAP_F32()[params>>2]=GLctx.getSamplerParameter(GL.samplers[sampler],pname)};var _emscripten_glGetSamplerParameterfv=_glGetSamplerParameterfv;var _glGetSamplerParameteriv=(sampler,pname,params)=>{if(!params){GL.recordError(1281);return}GROWABLE_HEAP_I32()[params>>2]=GLctx.getSamplerParameter(GL.samplers[sampler],pname)};var _emscripten_glGetSamplerParameteriv=_glGetSamplerParameteriv;var _glGetShaderInfoLog=(shader,maxLength,length,infoLog)=>{var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)GROWABLE_HEAP_I32()[length>>2]=numBytesWrittenExclNull};var _emscripten_glGetShaderInfoLog=_glGetShaderInfoLog;var _glGetShaderPrecisionFormat=(shaderType,precisionType,range,precision)=>{var result=GLctx.getShaderPrecisionFormat(shaderType,precisionType);GROWABLE_HEAP_I32()[range>>2]=result.rangeMin;GROWABLE_HEAP_I32()[range+4>>2]=result.rangeMax;GROWABLE_HEAP_I32()[precision>>2]=result.precision};var _emscripten_glGetShaderPrecisionFormat=_glGetShaderPrecisionFormat;var _glGetShaderSource=(shader,bufSize,length,source)=>{var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)GROWABLE_HEAP_I32()[length>>2]=numBytesWrittenExclNull};var _emscripten_glGetShaderSource=_glGetShaderSource;var _glGetShaderiv=(shader,pname,p)=>{if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;GROWABLE_HEAP_I32()[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;GROWABLE_HEAP_I32()[p>>2]=sourceLength}else{GROWABLE_HEAP_I32()[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}};var _emscripten_glGetShaderiv=_glGetShaderiv;var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var _glGetString=name_=>{var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:ret=stringToNewUTF8(webglGetExtensions().join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s?stringToNewUTF8(s):0;break;case 7938:var webGLVersion=GLctx.getParameter(7938);var glVersion=`OpenGL ES 2.0 (${webGLVersion})`;if(GL.currentContext.version>=2)glVersion=`OpenGL ES 3.0 (${webGLVersion})`;ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion=`OpenGL ES GLSL ES ${ver_num[1]} (${glslVersion})`}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret};var _emscripten_glGetString=_glGetString;var _glGetStringi=(name,index)=>{if(GL.currentContext.version<2){GL.recordError(1282);return 0}var stringiCache=GL.stringiCache[name];if(stringiCache){if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index]}switch(name){case 7939:var exts=webglGetExtensions().map(stringToNewUTF8);stringiCache=GL.stringiCache[name]=exts;if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index];default:GL.recordError(1280);return 0}};var _emscripten_glGetStringi=_glGetStringi;var _glGetSynciv=(sync,pname,bufSize,length,values)=>{if(bufSize<0){GL.recordError(1281);return}if(!values){GL.recordError(1281);return}var ret=GLctx.getSyncParameter(GL.syncs[sync],pname);if(ret!==null){GROWABLE_HEAP_I32()[values>>2]=ret;if(length)GROWABLE_HEAP_I32()[length>>2]=1}};var _emscripten_glGetSynciv=_glGetSynciv;var _glGetTexParameterfv=(target,pname,params)=>{if(!params){GL.recordError(1281);return}GROWABLE_HEAP_F32()[params>>2]=GLctx.getTexParameter(target,pname)};var _emscripten_glGetTexParameterfv=_glGetTexParameterfv;var _glGetTexParameteriv=(target,pname,params)=>{if(!params){GL.recordError(1281);return}GROWABLE_HEAP_I32()[params>>2]=GLctx.getTexParameter(target,pname)};var _emscripten_glGetTexParameteriv=_glGetTexParameteriv;var _glGetTransformFeedbackVarying=(program,index,bufSize,length,size,type,name)=>{program=GL.programs[program];var info=GLctx.getTransformFeedbackVarying(program,index);if(!info)return;if(name&&bufSize>0){var numBytesWrittenExclNull=stringToUTF8(info.name,name,bufSize);if(length)GROWABLE_HEAP_I32()[length>>2]=numBytesWrittenExclNull}else{if(length)GROWABLE_HEAP_I32()[length>>2]=0}if(size)GROWABLE_HEAP_I32()[size>>2]=info.size;if(type)GROWABLE_HEAP_I32()[type>>2]=info.type};var _emscripten_glGetTransformFeedbackVarying=_glGetTransformFeedbackVarying;var _glGetUniformBlockIndex=(program,uniformBlockName)=>GLctx.getUniformBlockIndex(GL.programs[program],UTF8ToString(uniformBlockName));var _emscripten_glGetUniformBlockIndex=_glGetUniformBlockIndex;var _glGetUniformIndices=(program,uniformCount,uniformNames,uniformIndices)=>{if(!uniformIndices){GL.recordError(1281);return}if(uniformCount>0&&(uniformNames==0||uniformIndices==0)){GL.recordError(1281);return}program=GL.programs[program];var names=[];for(var i=0;i>2]));var result=GLctx.getUniformIndices(program,names);if(!result)return;var len=result.length;for(var i=0;i>2]=result[i]}};var _emscripten_glGetUniformIndices=_glGetUniformIndices;var jstoi_q=str=>parseInt(str);var webglGetLeftBracePos=name=>name.slice(-1)=="]"&&name.lastIndexOf("[");var webglPrepareUniformLocationsBeforeFirstUse=program=>{var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};var numActiveUniforms=GLctx.getProgramParameter(program,35718);for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j{name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex{var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc=="number"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?`[${webglLoc}]`:""))}return webglLoc}else{GL.recordError(1282)}};var emscriptenWebGLGetUniform=(program,location,params,type)=>{if(!params){GL.recordError(1281);return}program=GL.programs[program];webglPrepareUniformLocationsBeforeFirstUse(program);var data=GLctx.getUniform(program,webglGetUniformLocation(location));if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:GROWABLE_HEAP_I32()[params>>2]=data;break;case 2:GROWABLE_HEAP_F32()[params>>2]=data;break}}else{for(var i=0;i>2]=data[i];break;case 2:GROWABLE_HEAP_F32()[params+i*4>>2]=data[i];break}}}};var _glGetUniformfv=(program,location,params)=>{emscriptenWebGLGetUniform(program,location,params,2)};var _emscripten_glGetUniformfv=_glGetUniformfv;var _glGetUniformiv=(program,location,params)=>{emscriptenWebGLGetUniform(program,location,params,0)};var _emscripten_glGetUniformiv=_glGetUniformiv;var _glGetUniformuiv=(program,location,params)=>emscriptenWebGLGetUniform(program,location,params,0);var _emscripten_glGetUniformuiv=_glGetUniformuiv;var emscriptenWebGLGetVertexAttrib=(index,pname,params,type)=>{if(!params){GL.recordError(1281);return}if(GL.currentContext.clientBuffers[index].enabled){err("glGetVertexAttrib*v on client-side array: not supported, bad data returned")}var data=GLctx.getVertexAttrib(index,pname);if(pname==34975){GROWABLE_HEAP_I32()[params>>2]=data&&data["name"]}else if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:GROWABLE_HEAP_I32()[params>>2]=data;break;case 2:GROWABLE_HEAP_F32()[params>>2]=data;break;case 5:GROWABLE_HEAP_I32()[params>>2]=Math.fround(data);break}}else{for(var i=0;i>2]=data[i];break;case 2:GROWABLE_HEAP_F32()[params+i*4>>2]=data[i];break;case 5:GROWABLE_HEAP_I32()[params+i*4>>2]=Math.fround(data[i]);break}}}};var _glGetVertexAttribIiv=(index,pname,params)=>{emscriptenWebGLGetVertexAttrib(index,pname,params,0)};var _emscripten_glGetVertexAttribIiv=_glGetVertexAttribIiv;var _glGetVertexAttribIuiv=_glGetVertexAttribIiv;var _emscripten_glGetVertexAttribIuiv=_glGetVertexAttribIuiv;var _glGetVertexAttribPointerv=(index,pname,pointer)=>{if(!pointer){GL.recordError(1281);return}if(GL.currentContext.clientBuffers[index].enabled){err("glGetVertexAttribPointer on client-side array: not supported, bad data returned")}GROWABLE_HEAP_I32()[pointer>>2]=GLctx.getVertexAttribOffset(index,pname)};var _emscripten_glGetVertexAttribPointerv=_glGetVertexAttribPointerv;var _glGetVertexAttribfv=(index,pname,params)=>{emscriptenWebGLGetVertexAttrib(index,pname,params,2)};var _emscripten_glGetVertexAttribfv=_glGetVertexAttribfv;var _glGetVertexAttribiv=(index,pname,params)=>{emscriptenWebGLGetVertexAttrib(index,pname,params,5)};var _emscripten_glGetVertexAttribiv=_glGetVertexAttribiv;var _glHint=(x0,x1)=>GLctx.hint(x0,x1);var _emscripten_glHint=_glHint;var _glInvalidateFramebuffer=(target,numAttachments,attachments)=>{var list=tempFixedLengthArray[numAttachments];for(var i=0;i>2]}GLctx.invalidateFramebuffer(target,list)};var _emscripten_glInvalidateFramebuffer=_glInvalidateFramebuffer;var _glInvalidateSubFramebuffer=(target,numAttachments,attachments,x,y,width,height)=>{var list=tempFixedLengthArray[numAttachments];for(var i=0;i>2]}GLctx.invalidateSubFramebuffer(target,list,x,y,width,height)};var _emscripten_glInvalidateSubFramebuffer=_glInvalidateSubFramebuffer;var _glIsBuffer=buffer=>{var b=GL.buffers[buffer];if(!b)return 0;return GLctx.isBuffer(b)};var _emscripten_glIsBuffer=_glIsBuffer;var _glIsEnabled=x0=>GLctx.isEnabled(x0);var _emscripten_glIsEnabled=_glIsEnabled;var _glIsFramebuffer=framebuffer=>{var fb=GL.framebuffers[framebuffer];if(!fb)return 0;return GLctx.isFramebuffer(fb)};var _emscripten_glIsFramebuffer=_glIsFramebuffer;var _glIsProgram=program=>{program=GL.programs[program];if(!program)return 0;return GLctx.isProgram(program)};var _emscripten_glIsProgram=_glIsProgram;var _glIsQuery=id=>{var query=GL.queries[id];if(!query)return 0;return GLctx.isQuery(query)};var _emscripten_glIsQuery=_glIsQuery;var _glIsQueryEXT=id=>{var query=GL.queries[id];if(!query)return 0;return GLctx.disjointTimerQueryExt["isQueryEXT"](query)};var _emscripten_glIsQueryEXT=_glIsQueryEXT;var _glIsRenderbuffer=renderbuffer=>{var rb=GL.renderbuffers[renderbuffer];if(!rb)return 0;return GLctx.isRenderbuffer(rb)};var _emscripten_glIsRenderbuffer=_glIsRenderbuffer;var _glIsSampler=id=>{var sampler=GL.samplers[id];if(!sampler)return 0;return GLctx.isSampler(sampler)};var _emscripten_glIsSampler=_glIsSampler;var _glIsShader=shader=>{var s=GL.shaders[shader];if(!s)return 0;return GLctx.isShader(s)};var _emscripten_glIsShader=_glIsShader;var _glIsSync=sync=>GLctx.isSync(GL.syncs[sync]);var _emscripten_glIsSync=_glIsSync;var _glIsTexture=id=>{var texture=GL.textures[id];if(!texture)return 0;return GLctx.isTexture(texture)};var _emscripten_glIsTexture=_glIsTexture;var _glIsTransformFeedback=id=>GLctx.isTransformFeedback(GL.transformFeedbacks[id]);var _emscripten_glIsTransformFeedback=_glIsTransformFeedback;var _glIsVertexArray=array=>{var vao=GL.vaos[array];if(!vao)return 0;return GLctx.isVertexArray(vao)};var _emscripten_glIsVertexArray=_glIsVertexArray;var _glIsVertexArrayOES=_glIsVertexArray;var _emscripten_glIsVertexArrayOES=_glIsVertexArrayOES;var _glLineWidth=x0=>GLctx.lineWidth(x0);var _emscripten_glLineWidth=_glLineWidth;var _glLinkProgram=program=>{program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}};var _emscripten_glLinkProgram=_glLinkProgram;var _glMapBufferRange=(target,offset,length,access)=>{if((access&(1|32))!=0){err("glMapBufferRange access does not support MAP_READ or MAP_UNSYNCHRONIZED");return 0}if((access&2)==0){err("glMapBufferRange access must include MAP_WRITE");return 0}if((access&(4|8))==0){err("glMapBufferRange access must include INVALIDATE_BUFFER or INVALIDATE_RANGE");return 0}if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glMapBufferRange");return 0}var mem=_malloc(length),binding=emscriptenWebGLGetBufferBinding(target);if(!mem)return 0;binding=GL.mappedBuffers[binding]??={};binding.offset=offset;binding.length=length;binding.mem=mem;binding.access=access;return mem};var _emscripten_glMapBufferRange=_glMapBufferRange;var _glPauseTransformFeedback=()=>GLctx.pauseTransformFeedback();var _emscripten_glPauseTransformFeedback=_glPauseTransformFeedback;var _glPixelStorei=(pname,param)=>{if(pname==3317){GL.unpackAlignment=param}else if(pname==3314){GL.unpackRowLength=param}GLctx.pixelStorei(pname,param)};var _emscripten_glPixelStorei=_glPixelStorei;var _glPolygonModeWEBGL=(face,mode)=>{GLctx.webglPolygonMode["polygonModeWEBGL"](face,mode)};var _emscripten_glPolygonModeWEBGL=_glPolygonModeWEBGL;var _glPolygonOffset=(x0,x1)=>GLctx.polygonOffset(x0,x1);var _emscripten_glPolygonOffset=_glPolygonOffset;var _glPolygonOffsetClampEXT=(factor,units,clamp)=>{GLctx.extPolygonOffsetClamp["polygonOffsetClampEXT"](factor,units,clamp)};var _emscripten_glPolygonOffsetClampEXT=_glPolygonOffsetClampEXT;var _glProgramBinary=(program,binaryFormat,binary,length)=>{GL.recordError(1280)};var _emscripten_glProgramBinary=_glProgramBinary;var _glProgramParameteri=(program,pname,value)=>{GL.recordError(1280)};var _emscripten_glProgramParameteri=_glProgramParameteri;var _glQueryCounterEXT=(id,target)=>{GLctx.disjointTimerQueryExt["queryCounterEXT"](GL.queries[id],target)};var _emscripten_glQueryCounterEXT=_glQueryCounterEXT;var _glReadBuffer=x0=>GLctx.readBuffer(x0);var _emscripten_glReadBuffer=_glReadBuffer;var computeUnpackAlignedImageSize=(width,height,sizePerPixel)=>{function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=(GL.unpackRowLength||width)*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,GL.unpackAlignment);return height*alignedRowSize};var colorChannelsInGlTextureFormat=format=>{var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1};var heapObjectForWebGLType=type=>{type-=5120;if(type==0)return GROWABLE_HEAP_I8();if(type==1)return GROWABLE_HEAP_U8();if(type==2)return GROWABLE_HEAP_I16();if(type==4)return GROWABLE_HEAP_I32();if(type==6)return GROWABLE_HEAP_F32();if(type==5||type==28922||type==28520||type==30779||type==30782)return GROWABLE_HEAP_U32();return GROWABLE_HEAP_U16()};var toTypedArrayIndex=(pointer,heap)=>pointer>>>31-Math.clz32(heap.BYTES_PER_ELEMENT);var emscriptenWebGLGetTexPixelData=(type,format,width,height,pixels,internalFormat)=>{var heap=heapObjectForWebGLType(type);var sizePerPixel=colorChannelsInGlTextureFormat(format)*heap.BYTES_PER_ELEMENT;var bytes=computeUnpackAlignedImageSize(width,height,sizePerPixel);return heap.subarray(toTypedArrayIndex(pixels,heap),toTypedArrayIndex(pixels+bytes,heap))};var _glReadPixels=(x,y,width,height,format,type,pixels)=>{if(GL.currentContext.version>=2){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels);return}var heap=heapObjectForWebGLType(type);var target=toTypedArrayIndex(pixels,heap);GLctx.readPixels(x,y,width,height,format,type,heap,target);return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)};var _emscripten_glReadPixels=_glReadPixels;var _glReleaseShaderCompiler=()=>{};var _emscripten_glReleaseShaderCompiler=_glReleaseShaderCompiler;var _glRenderbufferStorage=(x0,x1,x2,x3)=>GLctx.renderbufferStorage(x0,x1,x2,x3);var _emscripten_glRenderbufferStorage=_glRenderbufferStorage;var _glRenderbufferStorageMultisample=(x0,x1,x2,x3,x4)=>GLctx.renderbufferStorageMultisample(x0,x1,x2,x3,x4);var _emscripten_glRenderbufferStorageMultisample=_glRenderbufferStorageMultisample;var _glResumeTransformFeedback=()=>GLctx.resumeTransformFeedback();var _emscripten_glResumeTransformFeedback=_glResumeTransformFeedback;var _glSampleCoverage=(value,invert)=>{GLctx.sampleCoverage(value,!!invert)};var _emscripten_glSampleCoverage=_glSampleCoverage;var _glSamplerParameterf=(sampler,pname,param)=>{GLctx.samplerParameterf(GL.samplers[sampler],pname,param)};var _emscripten_glSamplerParameterf=_glSamplerParameterf;var _glSamplerParameterfv=(sampler,pname,params)=>{var param=GROWABLE_HEAP_F32()[params>>2];GLctx.samplerParameterf(GL.samplers[sampler],pname,param)};var _emscripten_glSamplerParameterfv=_glSamplerParameterfv;var _glSamplerParameteri=(sampler,pname,param)=>{GLctx.samplerParameteri(GL.samplers[sampler],pname,param)};var _emscripten_glSamplerParameteri=_glSamplerParameteri;var _glSamplerParameteriv=(sampler,pname,params)=>{var param=GROWABLE_HEAP_I32()[params>>2];GLctx.samplerParameteri(GL.samplers[sampler],pname,param)};var _emscripten_glSamplerParameteriv=_glSamplerParameteriv;var _glScissor=(x0,x1,x2,x3)=>GLctx.scissor(x0,x1,x2,x3);var _emscripten_glScissor=_glScissor;var _glShaderBinary=(count,shaders,binaryformat,binary,length)=>{GL.recordError(1280)};var _emscripten_glShaderBinary=_glShaderBinary;var _glShaderSource=(shader,count,string,length)=>{var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)};var _emscripten_glShaderSource=_glShaderSource;var _glStencilFunc=(x0,x1,x2)=>GLctx.stencilFunc(x0,x1,x2);var _emscripten_glStencilFunc=_glStencilFunc;var _glStencilFuncSeparate=(x0,x1,x2,x3)=>GLctx.stencilFuncSeparate(x0,x1,x2,x3);var _emscripten_glStencilFuncSeparate=_glStencilFuncSeparate;var _glStencilMask=x0=>GLctx.stencilMask(x0);var _emscripten_glStencilMask=_glStencilMask;var _glStencilMaskSeparate=(x0,x1)=>GLctx.stencilMaskSeparate(x0,x1);var _emscripten_glStencilMaskSeparate=_glStencilMaskSeparate;var _glStencilOp=(x0,x1,x2)=>GLctx.stencilOp(x0,x1,x2);var _emscripten_glStencilOp=_glStencilOp;var _glStencilOpSeparate=(x0,x1,x2,x3)=>GLctx.stencilOpSeparate(x0,x1,x2,x3);var _emscripten_glStencilOpSeparate=_glStencilOpSeparate;var _glTexImage2D=(target,level,internalFormat,width,height,border,format,type,pixels)=>{if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels);return}if(pixels){var heap=heapObjectForWebGLType(type);var index=toTypedArrayIndex(pixels,heap);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,index);return}}var pixelData=pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null;GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixelData)};var _emscripten_glTexImage2D=_glTexImage2D;var _glTexImage3D=(target,level,internalFormat,width,height,depth,border,format,type,pixels)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage3D(target,level,internalFormat,width,height,depth,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage3D(target,level,internalFormat,width,height,depth,border,format,type,heap,toTypedArrayIndex(pixels,heap))}else{GLctx.texImage3D(target,level,internalFormat,width,height,depth,border,format,type,null)}};var _emscripten_glTexImage3D=_glTexImage3D;var _glTexParameterf=(x0,x1,x2)=>GLctx.texParameterf(x0,x1,x2);var _emscripten_glTexParameterf=_glTexParameterf;var _glTexParameterfv=(target,pname,params)=>{var param=GROWABLE_HEAP_F32()[params>>2];GLctx.texParameterf(target,pname,param)};var _emscripten_glTexParameterfv=_glTexParameterfv;var _glTexParameteri=(x0,x1,x2)=>GLctx.texParameteri(x0,x1,x2);var _emscripten_glTexParameteri=_glTexParameteri;var _glTexParameteriv=(target,pname,params)=>{var param=GROWABLE_HEAP_I32()[params>>2];GLctx.texParameteri(target,pname,param)};var _emscripten_glTexParameteriv=_glTexParameteriv;var _glTexStorage2D=(x0,x1,x2,x3,x4)=>GLctx.texStorage2D(x0,x1,x2,x3,x4);var _emscripten_glTexStorage2D=_glTexStorage2D;var _glTexStorage3D=(x0,x1,x2,x3,x4,x5)=>GLctx.texStorage3D(x0,x1,x2,x3,x4,x5);var _emscripten_glTexStorage3D=_glTexStorage3D;var _glTexSubImage2D=(target,level,xoffset,yoffset,width,height,format,type,pixels)=>{if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);return}if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,toTypedArrayIndex(pixels,heap));return}}var pixelData=pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0):null;GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)};var _emscripten_glTexSubImage2D=_glTexSubImage2D;var _glTexSubImage3D=(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,toTypedArrayIndex(pixels,heap))}else{GLctx.texSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}};var _emscripten_glTexSubImage3D=_glTexSubImage3D;var _glTransformFeedbackVaryings=(program,count,varyings,bufferMode)=>{program=GL.programs[program];var vars=[];for(var i=0;i>2]));GLctx.transformFeedbackVaryings(program,vars,bufferMode)};var _emscripten_glTransformFeedbackVaryings=_glTransformFeedbackVaryings;var _glUniform1f=(location,v0)=>{GLctx.uniform1f(webglGetUniformLocation(location),v0)};var _emscripten_glUniform1f=_glUniform1f;var miniTempWebGLFloatBuffers=[];var _glUniform1fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform1fv(webglGetUniformLocation(location),GROWABLE_HEAP_F32(),value>>2,count);return}if(count<=288){var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>2]}}else{var view=GROWABLE_HEAP_F32().subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(webglGetUniformLocation(location),view)};var _emscripten_glUniform1fv=_glUniform1fv;var _glUniform1i=(location,v0)=>{GLctx.uniform1i(webglGetUniformLocation(location),v0)};var _emscripten_glUniform1i=_glUniform1i;var miniTempWebGLIntBuffers=[];var _glUniform1iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform1iv(webglGetUniformLocation(location),GROWABLE_HEAP_I32(),value>>2,count);return}if(count<=288){var view=miniTempWebGLIntBuffers[count];for(var i=0;i>2]}}else{var view=GROWABLE_HEAP_I32().subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)};var _emscripten_glUniform1iv=_glUniform1iv;var _glUniform1ui=(location,v0)=>{GLctx.uniform1ui(webglGetUniformLocation(location),v0)};var _emscripten_glUniform1ui=_glUniform1ui;var _glUniform1uiv=(location,count,value)=>{count&&GLctx.uniform1uiv(webglGetUniformLocation(location),GROWABLE_HEAP_U32(),value>>2,count)};var _emscripten_glUniform1uiv=_glUniform1uiv;var _glUniform2f=(location,v0,v1)=>{GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)};var _emscripten_glUniform2f=_glUniform2f;var _glUniform2fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform2fv(webglGetUniformLocation(location),GROWABLE_HEAP_F32(),value>>2,count*2);return}if(count<=144){count*=2;var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>2];view[i+1]=GROWABLE_HEAP_F32()[value+(4*i+4)>>2]}}else{var view=GROWABLE_HEAP_F32().subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)};var _emscripten_glUniform2fv=_glUniform2fv;var _glUniform2i=(location,v0,v1)=>{GLctx.uniform2i(webglGetUniformLocation(location),v0,v1)};var _emscripten_glUniform2i=_glUniform2i;var _glUniform2iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform2iv(webglGetUniformLocation(location),GROWABLE_HEAP_I32(),value>>2,count*2);return}if(count<=144){count*=2;var view=miniTempWebGLIntBuffers[count];for(var i=0;i>2];view[i+1]=GROWABLE_HEAP_I32()[value+(4*i+4)>>2]}}else{var view=GROWABLE_HEAP_I32().subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)};var _emscripten_glUniform2iv=_glUniform2iv;var _glUniform2ui=(location,v0,v1)=>{GLctx.uniform2ui(webglGetUniformLocation(location),v0,v1)};var _emscripten_glUniform2ui=_glUniform2ui;var _glUniform2uiv=(location,count,value)=>{count&&GLctx.uniform2uiv(webglGetUniformLocation(location),GROWABLE_HEAP_U32(),value>>2,count*2)};var _emscripten_glUniform2uiv=_glUniform2uiv;var _glUniform3f=(location,v0,v1,v2)=>{GLctx.uniform3f(webglGetUniformLocation(location),v0,v1,v2)};var _emscripten_glUniform3f=_glUniform3f;var _glUniform3fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform3fv(webglGetUniformLocation(location),GROWABLE_HEAP_F32(),value>>2,count*3);return}if(count<=96){count*=3;var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>2];view[i+1]=GROWABLE_HEAP_F32()[value+(4*i+4)>>2];view[i+2]=GROWABLE_HEAP_F32()[value+(4*i+8)>>2]}}else{var view=GROWABLE_HEAP_F32().subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)};var _emscripten_glUniform3fv=_glUniform3fv;var _glUniform3i=(location,v0,v1,v2)=>{GLctx.uniform3i(webglGetUniformLocation(location),v0,v1,v2)};var _emscripten_glUniform3i=_glUniform3i;var _glUniform3iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform3iv(webglGetUniformLocation(location),GROWABLE_HEAP_I32(),value>>2,count*3);return}if(count<=96){count*=3;var view=miniTempWebGLIntBuffers[count];for(var i=0;i>2];view[i+1]=GROWABLE_HEAP_I32()[value+(4*i+4)>>2];view[i+2]=GROWABLE_HEAP_I32()[value+(4*i+8)>>2]}}else{var view=GROWABLE_HEAP_I32().subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(webglGetUniformLocation(location),view)};var _emscripten_glUniform3iv=_glUniform3iv;var _glUniform3ui=(location,v0,v1,v2)=>{GLctx.uniform3ui(webglGetUniformLocation(location),v0,v1,v2)};var _emscripten_glUniform3ui=_glUniform3ui;var _glUniform3uiv=(location,count,value)=>{count&&GLctx.uniform3uiv(webglGetUniformLocation(location),GROWABLE_HEAP_U32(),value>>2,count*3)};var _emscripten_glUniform3uiv=_glUniform3uiv;var _glUniform4f=(location,v0,v1,v2,v3)=>{GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)};var _emscripten_glUniform4f=_glUniform4f;var _glUniform4fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform4fv(webglGetUniformLocation(location),GROWABLE_HEAP_F32(),value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count];var heap=GROWABLE_HEAP_F32();value=value>>2;count*=4;for(var i=0;i>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)};var _emscripten_glUniform4fv=_glUniform4fv;var _glUniform4i=(location,v0,v1,v2,v3)=>{GLctx.uniform4i(webglGetUniformLocation(location),v0,v1,v2,v3)};var _emscripten_glUniform4i=_glUniform4i;var _glUniform4iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform4iv(webglGetUniformLocation(location),GROWABLE_HEAP_I32(),value>>2,count*4);return}if(count<=72){count*=4;var view=miniTempWebGLIntBuffers[count];for(var i=0;i>2];view[i+1]=GROWABLE_HEAP_I32()[value+(4*i+4)>>2];view[i+2]=GROWABLE_HEAP_I32()[value+(4*i+8)>>2];view[i+3]=GROWABLE_HEAP_I32()[value+(4*i+12)>>2]}}else{var view=GROWABLE_HEAP_I32().subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(webglGetUniformLocation(location),view)};var _emscripten_glUniform4iv=_glUniform4iv;var _glUniform4ui=(location,v0,v1,v2,v3)=>{GLctx.uniform4ui(webglGetUniformLocation(location),v0,v1,v2,v3)};var _emscripten_glUniform4ui=_glUniform4ui;var _glUniform4uiv=(location,count,value)=>{count&&GLctx.uniform4uiv(webglGetUniformLocation(location),GROWABLE_HEAP_U32(),value>>2,count*4)};var _emscripten_glUniform4uiv=_glUniform4uiv;var _glUniformBlockBinding=(program,uniformBlockIndex,uniformBlockBinding)=>{program=GL.programs[program];GLctx.uniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding)};var _emscripten_glUniformBlockBinding=_glUniformBlockBinding;var _glUniformMatrix2fv=(location,count,transpose,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*4);return}if(count<=72){count*=4;var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>2];view[i+1]=GROWABLE_HEAP_F32()[value+(4*i+4)>>2];view[i+2]=GROWABLE_HEAP_F32()[value+(4*i+8)>>2];view[i+3]=GROWABLE_HEAP_F32()[value+(4*i+12)>>2]}}else{var view=GROWABLE_HEAP_F32().subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,view)};var _emscripten_glUniformMatrix2fv=_glUniformMatrix2fv;var _glUniformMatrix2x3fv=(location,count,transpose,value)=>{count&&GLctx.uniformMatrix2x3fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*6)};var _emscripten_glUniformMatrix2x3fv=_glUniformMatrix2x3fv;var _glUniformMatrix2x4fv=(location,count,transpose,value)=>{count&&GLctx.uniformMatrix2x4fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*8)};var _emscripten_glUniformMatrix2x4fv=_glUniformMatrix2x4fv;var _glUniformMatrix3fv=(location,count,transpose,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*9);return}if(count<=32){count*=9;var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>2];view[i+1]=GROWABLE_HEAP_F32()[value+(4*i+4)>>2];view[i+2]=GROWABLE_HEAP_F32()[value+(4*i+8)>>2];view[i+3]=GROWABLE_HEAP_F32()[value+(4*i+12)>>2];view[i+4]=GROWABLE_HEAP_F32()[value+(4*i+16)>>2];view[i+5]=GROWABLE_HEAP_F32()[value+(4*i+20)>>2];view[i+6]=GROWABLE_HEAP_F32()[value+(4*i+24)>>2];view[i+7]=GROWABLE_HEAP_F32()[value+(4*i+28)>>2];view[i+8]=GROWABLE_HEAP_F32()[value+(4*i+32)>>2]}}else{var view=GROWABLE_HEAP_F32().subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)};var _emscripten_glUniformMatrix3fv=_glUniformMatrix3fv;var _glUniformMatrix3x2fv=(location,count,transpose,value)=>{count&&GLctx.uniformMatrix3x2fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*6)};var _emscripten_glUniformMatrix3x2fv=_glUniformMatrix3x2fv;var _glUniformMatrix3x4fv=(location,count,transpose,value)=>{count&&GLctx.uniformMatrix3x4fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*12)};var _emscripten_glUniformMatrix3x4fv=_glUniformMatrix3x4fv;var _glUniformMatrix4fv=(location,count,transpose,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*16);return}if(count<=18){var view=miniTempWebGLFloatBuffers[16*count];var heap=GROWABLE_HEAP_F32();value=value>>2;count*=16;for(var i=0;i>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)};var _emscripten_glUniformMatrix4fv=_glUniformMatrix4fv;var _glUniformMatrix4x2fv=(location,count,transpose,value)=>{count&&GLctx.uniformMatrix4x2fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*8)};var _emscripten_glUniformMatrix4x2fv=_glUniformMatrix4x2fv;var _glUniformMatrix4x3fv=(location,count,transpose,value)=>{count&&GLctx.uniformMatrix4x3fv(webglGetUniformLocation(location),!!transpose,GROWABLE_HEAP_F32(),value>>2,count*12)};var _emscripten_glUniformMatrix4x3fv=_glUniformMatrix4x3fv;var _glUnmapBuffer=target=>{if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glUnmapBuffer");return 0}var buffer=emscriptenWebGLGetBufferBinding(target);var mapping=GL.mappedBuffers[buffer];if(!mapping||!mapping.mem){GL.recordError(1282);err("buffer was never mapped in glUnmapBuffer");return 0}if(!(mapping.access&16)){if(GL.currentContext.version>=2){GLctx.bufferSubData(target,mapping.offset,GROWABLE_HEAP_U8(),mapping.mem,mapping.length)}else GLctx.bufferSubData(target,mapping.offset,GROWABLE_HEAP_U8().subarray(mapping.mem,mapping.mem+mapping.length))}_free(mapping.mem);mapping.mem=0;return 1};var _emscripten_glUnmapBuffer=_glUnmapBuffer;var _glUseProgram=program=>{program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program};var _emscripten_glUseProgram=_glUseProgram;var _glValidateProgram=program=>{GLctx.validateProgram(GL.programs[program])};var _emscripten_glValidateProgram=_glValidateProgram;var _glVertexAttrib1f=(x0,x1)=>GLctx.vertexAttrib1f(x0,x1);var _emscripten_glVertexAttrib1f=_glVertexAttrib1f;var _glVertexAttrib1fv=(index,v)=>{GLctx.vertexAttrib1f(index,GROWABLE_HEAP_F32()[v>>2])};var _emscripten_glVertexAttrib1fv=_glVertexAttrib1fv;var _glVertexAttrib2f=(x0,x1,x2)=>GLctx.vertexAttrib2f(x0,x1,x2);var _emscripten_glVertexAttrib2f=_glVertexAttrib2f;var _glVertexAttrib2fv=(index,v)=>{GLctx.vertexAttrib2f(index,GROWABLE_HEAP_F32()[v>>2],GROWABLE_HEAP_F32()[v+4>>2])};var _emscripten_glVertexAttrib2fv=_glVertexAttrib2fv;var _glVertexAttrib3f=(x0,x1,x2,x3)=>GLctx.vertexAttrib3f(x0,x1,x2,x3);var _emscripten_glVertexAttrib3f=_glVertexAttrib3f;var _glVertexAttrib3fv=(index,v)=>{GLctx.vertexAttrib3f(index,GROWABLE_HEAP_F32()[v>>2],GROWABLE_HEAP_F32()[v+4>>2],GROWABLE_HEAP_F32()[v+8>>2])};var _emscripten_glVertexAttrib3fv=_glVertexAttrib3fv;var _glVertexAttrib4f=(x0,x1,x2,x3,x4)=>GLctx.vertexAttrib4f(x0,x1,x2,x3,x4);var _emscripten_glVertexAttrib4f=_glVertexAttrib4f;var _glVertexAttrib4fv=(index,v)=>{GLctx.vertexAttrib4f(index,GROWABLE_HEAP_F32()[v>>2],GROWABLE_HEAP_F32()[v+4>>2],GROWABLE_HEAP_F32()[v+8>>2],GROWABLE_HEAP_F32()[v+12>>2])};var _emscripten_glVertexAttrib4fv=_glVertexAttrib4fv;var _glVertexAttribDivisor=(index,divisor)=>{GLctx.vertexAttribDivisor(index,divisor)};var _emscripten_glVertexAttribDivisor=_glVertexAttribDivisor;var _glVertexAttribDivisorANGLE=_glVertexAttribDivisor;var _emscripten_glVertexAttribDivisorANGLE=_glVertexAttribDivisorANGLE;var _glVertexAttribDivisorARB=_glVertexAttribDivisor;var _emscripten_glVertexAttribDivisorARB=_glVertexAttribDivisorARB;var _glVertexAttribDivisorEXT=_glVertexAttribDivisor;var _emscripten_glVertexAttribDivisorEXT=_glVertexAttribDivisorEXT;var _glVertexAttribDivisorNV=_glVertexAttribDivisor;var _emscripten_glVertexAttribDivisorNV=_glVertexAttribDivisorNV;var _glVertexAttribI4i=(x0,x1,x2,x3,x4)=>GLctx.vertexAttribI4i(x0,x1,x2,x3,x4);var _emscripten_glVertexAttribI4i=_glVertexAttribI4i;var _glVertexAttribI4iv=(index,v)=>{GLctx.vertexAttribI4i(index,GROWABLE_HEAP_I32()[v>>2],GROWABLE_HEAP_I32()[v+4>>2],GROWABLE_HEAP_I32()[v+8>>2],GROWABLE_HEAP_I32()[v+12>>2])};var _emscripten_glVertexAttribI4iv=_glVertexAttribI4iv;var _glVertexAttribI4ui=(x0,x1,x2,x3,x4)=>GLctx.vertexAttribI4ui(x0,x1,x2,x3,x4);var _emscripten_glVertexAttribI4ui=_glVertexAttribI4ui;var _glVertexAttribI4uiv=(index,v)=>{GLctx.vertexAttribI4ui(index,GROWABLE_HEAP_U32()[v>>2],GROWABLE_HEAP_U32()[v+4>>2],GROWABLE_HEAP_U32()[v+8>>2],GROWABLE_HEAP_U32()[v+12>>2])};var _emscripten_glVertexAttribI4uiv=_glVertexAttribI4uiv;var _glVertexAttribIPointer=(index,size,type,stride,ptr)=>{var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=false;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribIPointer(index,size,type,stride,ptr)};return}cb.clientside=false;GLctx.vertexAttribIPointer(index,size,type,stride,ptr)};var _emscripten_glVertexAttribIPointer=_glVertexAttribIPointer;var _glVertexAttribPointer=(index,size,type,normalized,stride,ptr)=>{var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=normalized;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribPointer(index,size,type,normalized,stride,ptr)};return}cb.clientside=false;GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)};var _emscripten_glVertexAttribPointer=_glVertexAttribPointer;var _glViewport=(x0,x1,x2,x3)=>GLctx.viewport(x0,x1,x2,x3);var _emscripten_glViewport=_glViewport;var _glWaitSync=(sync,flags,timeout_low,timeout_high)=>{var timeout=convertI32PairToI53(timeout_low,timeout_high);GLctx.waitSync(GL.syncs[sync],flags,timeout)};var _emscripten_glWaitSync=_glWaitSync;var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=GROWABLE_HEAP_U8().length;requestedSize>>>=0;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 _emscripten_set_main_loop_timing=(mode,value)=>{MainLoop.timingMode=mode;MainLoop.timingValue=value;if(!MainLoop.func){return 1}if(!MainLoop.running){runtimeKeepalivePush();MainLoop.running=true}if(mode==0){MainLoop.scheduler=function MainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,MainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(MainLoop.runner,timeUntilNextTick)};MainLoop.method="timeout"}else if(mode==1){MainLoop.scheduler=function MainLoop_scheduler_rAF(){MainLoop.requestAnimationFrame(MainLoop.runner)};MainLoop.method="rAF"}else if(mode==2){if(typeof MainLoop.setImmediate=="undefined"){if(typeof setImmediate=="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var MainLoop_setImmediate_messageHandler=event=>{if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",MainLoop_setImmediate_messageHandler,true);MainLoop.setImmediate=func=>{setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){Module["setImmediates"]??=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}else{MainLoop.setImmediate=setImmediate}}MainLoop.scheduler=function MainLoop_scheduler_setImmediate(){MainLoop.setImmediate(MainLoop.runner)};MainLoop.method="immediate"}return 0};var MainLoop={running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],preMainLoop:[],postMainLoop:[],pause(){MainLoop.scheduler=null;MainLoop.currentlyRunningMainloop++},resume(){MainLoop.currentlyRunningMainloop++;var timingMode=MainLoop.timingMode;var timingValue=MainLoop.timingValue;var func=MainLoop.func;MainLoop.func=null;setMainLoop(func,0,false,MainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);MainLoop.scheduler()},updateStatus(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=MainLoop.remainingBlockers??0;var expected=MainLoop.expectedBlockers??0;if(remaining){if(remaining=MainLoop.nextRAF){MainLoop.nextRAF+=1e3/60}}var delay=Math.max(MainLoop.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame(func){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(func);return}var RAF=MainLoop.fakeRequestAnimationFrame;RAF(func)}};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};var setMainLoop=(iterFunc,fps,simulateInfiniteLoop,arg,noSetTiming)=>{MainLoop.func=iterFunc;MainLoop.arg=arg;var thisMainLoopId=MainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId0){var start=Date.now();var blocker=MainLoop.queue.shift();blocker.func(blocker.arg);if(MainLoop.remainingBlockers){var remaining=MainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){MainLoop.remainingBlockers=next}else{next=next+.5;MainLoop.remainingBlockers=(8*remaining+next)/9}}MainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(MainLoop.runner,0);return}if(!checkIsRunning())return;MainLoop.currentFrameNumber=MainLoop.currentFrameNumber+1|0;if(MainLoop.timingMode==1&&MainLoop.timingValue>1&&MainLoop.currentFrameNumber%MainLoop.timingValue!=0){MainLoop.scheduler();return}else if(MainLoop.timingMode==0){MainLoop.tickStartTime=_emscripten_get_now()}MainLoop.runIter(iterFunc);if(!checkIsRunning())return;MainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0){_emscripten_set_main_loop_timing(0,1e3/fps)}else{_emscripten_set_main_loop_timing(1,1)}MainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}};var _emscripten_set_main_loop=(func,fps,simulateInfiniteLoop)=>{var iterFunc=getWasmTableEntry(func);setMainLoop(iterFunc,fps,simulateInfiniteLoop)};function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(2,0,1,fd);return 52}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(3,0,1,fd,offset_low,offset_high,whence,newOffset);var offset=convertI32PairToI53Checked(offset_low,offset_high);return 70}var printCharBuffers=[null,[],[]];var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}};function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(4,0,1,fd,iov,iovcnt,pnum);var num=0;for(var i=0;i>2];var len=GROWABLE_HEAP_U32()[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0}var safeSetTimeout=(func,timeout)=>{runtimeKeepalivePush();return setTimeout(()=>{runtimeKeepalivePop();callUserCallback(func)},timeout)};var preloadPlugins=Module["preloadPlugins"]||[];var Browser={useWebGL:false,isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init(){if(Browser.initted)return;Browser.initted=true;var imagePlugin={};imagePlugin["canHandle"]=function imagePlugin_canHandle(name){return!Module["noImageDecoding"]&&/\.(jpg|jpeg|png|bmp|webp)$/i.test(name)};imagePlugin["handle"]=function imagePlugin_handle(byteArray,name,onload,onerror){var b=new Blob([byteArray],{type:Browser.getMimetype(name)});if(b.size!==byteArray.length){b=new Blob([new Uint8Array(byteArray).buffer],{type:Browser.getMimetype(name)})}var url=URL.createObjectURL(b);var img=new Image;img.onload=()=>{var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);preloadedImages[name]=canvas;URL.revokeObjectURL(url);onload?.(byteArray)};img.onerror=event=>{err(`Image ${url} could not be decoded`);onerror?.()};img.src=url};preloadPlugins.push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module["noAudioDecoding"]&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;preloadedAudios[name]=audio;onload?.(byteArray)}var b=new Blob([byteArray],{type:Browser.getMimetype(name)});var url=URL.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",()=>finish(audio),false);audio.onerror=function audio_onerror(event){if(done)return;err(`warning: browser could not fully decode audio ${name}, trying slower base64 approach`);function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;safeSetTimeout(()=>{finish(audio)},1e4)};preloadPlugins.push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(()=>{});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(()=>{});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",ev=>{if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}},false)}}},createContext(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:typeof WebGL2RenderingContext!="undefined"?2:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Browser.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach(callback=>callback());Browser.init()}return ctx},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}Module["onFullScreen"]?.(Browser.isFullscreen);Module["onFullscreen"]?.(Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?()=>canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"]):null)||(canvasContainer["webkitRequestFullScreen"]?()=>canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]):null);canvasContainer.requestFullscreen()},exitFullscreen(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||(()=>{});CFS.apply(document,[]);return true},safeSetTimeout(func,timeout){return safeSetTimeout(func,timeout)},getMimetype(name){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia(func){window.getUserMedia||=navigator["getUserMedia"]||navigator["mozGetUserMedia"];window.getUserMedia(func)},getMovementX(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseCoords(pageX,pageY){var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;var adjustedX=pageX-(scrollX+rect.left);var adjustedY=pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);return{x:adjustedX,y:adjustedY}},setMouseCoords(pageX,pageY){const{x,y}=Browser.calculateMouseCoords(pageX,pageY);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y},calculateMouseEvent(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}else{if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var coords=Browser.calculateMouseCoords(touch.pageX,touch.pageY);if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];last||=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}Browser.setMouseCoords(event.pageX,event.pageY)}},resizeListeners:[],updateResizeListeners(){var canvas=Module["canvas"];Browser.resizeListeners.forEach(listener=>listener(canvas.width,canvas.height))},setCanvasSize(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize(){if(typeof SDL!="undefined"){var flags=GROWABLE_HEAP_U32()[SDL.screen>>2];flags=flags|8388608;GROWABLE_HEAP_I32()[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize(){if(typeof SDL!="undefined"){var flags=GROWABLE_HEAP_U32()[SDL.screen>>2];flags=flags&~8388608;GROWABLE_HEAP_I32()[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>(view.set(crypto.getRandomValues(new Uint8Array(view.byteLength))),view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);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.substr(-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.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};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).substr(1);to=PATH_FS.resolve(to).substr(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;i0?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(typeof window!="undefined"&&typeof window.prompt=="function"){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,0));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,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,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,allocate:MEMFS.stream_ops.allocate,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.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}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.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp},unlink(parent,name){delete parent.contents[name];parent.timestamp=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.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key of Object.keys(node.contents)){entries.push(key)}return entries},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 dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url).then(arrayBuffer=>{onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},err=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{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 FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:class{constructor(errno){this.name="ErrnoError";this.errno=errno}},genericErrors:{},filesystems:null,syncFSRequests:0,readFiles:{},FSStream:class{constructor(){this.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{constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev;this.readMode=292|73;this.writeMode=146}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={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;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){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){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},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},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)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},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);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];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||name==="."||name===".."){throw new FS.ErrnoError(28)}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)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;iFS.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});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){randomLeft=randomFill(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",16384|511,73);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}};ret.parent=ret;return ret}};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(){[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""});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 i=0;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))throw new Error("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)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("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))throw new Error("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")throw new Error("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(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"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={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];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,GROWABLE_HEAP_I8(),ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var GLFW={WindowFromId:id=>{if(id<=0||!GLFW.windows)return null;return GLFW.windows[id-1]},joystickFunc:0,errorFunc:0,monitorFunc:0,active:null,scale:null,windows:null,monitors:null,monitorString:null,versionString:null,initialTime:null,extensions:null,devicePixelRatioMQL:null,hints:null,primaryTouchId:null,defaultHints:{131073:0,131074:0,131075:1,131076:1,131077:1,131082:0,135169:8,135170:8,135171:8,135172:8,135173:24,135174:8,135175:0,135176:0,135177:0,135178:0,135179:0,135180:0,135181:0,135182:0,135183:0,139265:196609,139266:1,139267:0,139268:0,139269:0,139270:0,139271:0,139272:0,139276:0},DOMToGLFWKeyCode:keycode=>{switch(keycode){case 32:return 32;case 222:return 39;case 188:return 44;case 173:return 45;case 189:return 45;case 190:return 46;case 191:return 47;case 48:return 48;case 49:return 49;case 50:return 50;case 51:return 51;case 52:return 52;case 53:return 53;case 54:return 54;case 55:return 55;case 56:return 56;case 57:return 57;case 59:return 59;case 61:return 61;case 187:return 61;case 65:return 65;case 66:return 66;case 67:return 67;case 68:return 68;case 69:return 69;case 70:return 70;case 71:return 71;case 72:return 72;case 73:return 73;case 74:return 74;case 75:return 75;case 76:return 76;case 77:return 77;case 78:return 78;case 79:return 79;case 80:return 80;case 81:return 81;case 82:return 82;case 83:return 83;case 84:return 84;case 85:return 85;case 86:return 86;case 87:return 87;case 88:return 88;case 89:return 89;case 90:return 90;case 219:return 91;case 220:return 92;case 221:return 93;case 192:return 96;case 27:return 256;case 13:return 257;case 9:return 258;case 8:return 259;case 45:return 260;case 46:return 261;case 39:return 262;case 37:return 263;case 40:return 264;case 38:return 265;case 33:return 266;case 34:return 267;case 36:return 268;case 35:return 269;case 20:return 280;case 145:return 281;case 144:return 282;case 44:return 283;case 19:return 284;case 112:return 290;case 113:return 291;case 114:return 292;case 115:return 293;case 116:return 294;case 117:return 295;case 118:return 296;case 119:return 297;case 120:return 298;case 121:return 299;case 122:return 300;case 123:return 301;case 124:return 302;case 125:return 303;case 126:return 304;case 127:return 305;case 128:return 306;case 129:return 307;case 130:return 308;case 131:return 309;case 132:return 310;case 133:return 311;case 134:return 312;case 135:return 313;case 136:return 314;case 96:return 320;case 97:return 321;case 98:return 322;case 99:return 323;case 100:return 324;case 101:return 325;case 102:return 326;case 103:return 327;case 104:return 328;case 105:return 329;case 110:return 330;case 111:return 331;case 106:return 332;case 109:return 333;case 107:return 334;case 16:return 340;case 17:return 341;case 18:return 342;case 91:return 343;case 224:return 343;case 93:return 348;default:return-1}},getModBits:win=>{var mod=0;if(win.keys[340])mod|=1;if(win.keys[341])mod|=2;if(win.keys[342])mod|=4;if(win.keys[343]||win.keys[348])mod|=8;return mod},onKeyPress:event=>{if(!GLFW.active||!GLFW.active.charFunc)return;if(event.ctrlKey||event.metaKey)return;var charCode=event.charCode;if(charCode==0||charCode>=0&&charCode<=31)return;getWasmTableEntry(GLFW.active.charFunc)(GLFW.active.id,charCode)},onKeyChanged:(keyCode,status)=>{if(!GLFW.active)return;var key=GLFW.DOMToGLFWKeyCode(keyCode);if(key==-1)return;var repeat=status&&GLFW.active.keys[key];GLFW.active.keys[key]=status;GLFW.active.domKeys[keyCode]=status;if(GLFW.active.keyFunc){if(repeat)status=2;getWasmTableEntry(GLFW.active.keyFunc)(GLFW.active.id,key,keyCode,status,GLFW.getModBits(GLFW.active))}},onGamepadConnected:event=>{GLFW.refreshJoysticks()},onGamepadDisconnected:event=>{GLFW.refreshJoysticks()},onKeydown:event=>{GLFW.onKeyChanged(event.keyCode,1);if(event.keyCode===8||event.keyCode===9){event.preventDefault()}},onKeyup:event=>{GLFW.onKeyChanged(event.keyCode,0)},onBlur:event=>{if(!GLFW.active)return;for(var i=0;i{if(!GLFW.active)return;if(event.type==="touchmove"){event.preventDefault();let primaryChanged=false;for(let i of event.changedTouches){if(GLFW.primaryTouchId===i.identifier){Browser.setMouseCoords(i.pageX,i.pageY);primaryChanged=true;break}}if(!primaryChanged){return}}else{Browser.calculateMouseEvent(event)}if(event.target!=Module["canvas"]||!GLFW.active.cursorPosFunc)return;if(GLFW.active.cursorPosFunc){getWasmTableEntry(GLFW.active.cursorPosFunc)(GLFW.active.id,Browser.mouseX,Browser.mouseY)}},DOMToGLFWMouseButton:event=>{var eventButton=event["button"];if(eventButton>0){if(eventButton==1){eventButton=2}else{eventButton=1}}return eventButton},onMouseenter:event=>{if(!GLFW.active)return;if(event.target!=Module["canvas"])return;if(GLFW.active.cursorEnterFunc){getWasmTableEntry(GLFW.active.cursorEnterFunc)(GLFW.active.id,1)}},onMouseleave:event=>{if(!GLFW.active)return;if(event.target!=Module["canvas"])return;if(GLFW.active.cursorEnterFunc){getWasmTableEntry(GLFW.active.cursorEnterFunc)(GLFW.active.id,0)}},onMouseButtonChanged:(event,status)=>{if(!GLFW.active)return;if(event.target!=Module["canvas"])return;const isTouchType=event.type==="touchstart"||event.type==="touchend"||event.type==="touchcancel";let eventButton=0;if(isTouchType){event.preventDefault();let primaryChanged=false;if(GLFW.primaryTouchId===null&&event.type==="touchstart"&&event.targetTouches.length>0){const chosenTouch=event.targetTouches[0];GLFW.primaryTouchId=chosenTouch.identifier;Browser.setMouseCoords(chosenTouch.pageX,chosenTouch.pageY);primaryChanged=true}else if(event.type==="touchend"||event.type==="touchcancel"){for(let i of event.changedTouches){if(GLFW.primaryTouchId===i.identifier){GLFW.primaryTouchId=null;primaryChanged=true;break}}}if(!primaryChanged){return}}else{Browser.calculateMouseEvent(event);eventButton=GLFW.DOMToGLFWMouseButton(event)}if(status==1){GLFW.active.buttons|=1<{if(!GLFW.active)return;GLFW.onMouseButtonChanged(event,1)},onMouseButtonUp:event=>{if(!GLFW.active)return;GLFW.onMouseButtonChanged(event,0)},onMouseWheel:event=>{var delta=-Browser.getMouseWheelDelta(event);delta=delta==0?0:delta>0?Math.max(delta,1):Math.min(delta,-1);GLFW.wheelPos+=delta;if(!GLFW.active||!GLFW.active.scrollFunc||event.target!=Module["canvas"])return;var sx=0;var sy=delta;if(event.type=="mousewheel"){sx=event.wheelDeltaX}else{sx=event.deltaX}getWasmTableEntry(GLFW.active.scrollFunc)(GLFW.active.id,sx,sy);event.preventDefault()},onCanvasResize:(width,height,framebufferWidth,framebufferHeight)=>{if(!GLFW.active)return;var resizeNeeded=false;if(document["fullscreen"]||document["fullScreen"]||document["mozFullScreen"]||document["webkitIsFullScreen"]){if(!GLFW.active.fullscreen){resizeNeeded=width!=screen.width||height!=screen.height;GLFW.active.storedX=GLFW.active.x;GLFW.active.storedY=GLFW.active.y;GLFW.active.storedWidth=GLFW.active.width;GLFW.active.storedHeight=GLFW.active.height;GLFW.active.x=GLFW.active.y=0;GLFW.active.width=screen.width;GLFW.active.height=screen.height;GLFW.active.fullscreen=true}}else if(GLFW.active.fullscreen==true){resizeNeeded=width!=GLFW.active.storedWidth||height!=GLFW.active.storedHeight;GLFW.active.x=GLFW.active.storedX;GLFW.active.y=GLFW.active.storedY;GLFW.active.width=GLFW.active.storedWidth;GLFW.active.height=GLFW.active.storedHeight;GLFW.active.fullscreen=false}if(resizeNeeded){Browser.setCanvasSize(GLFW.active.width,GLFW.active.height)}else if(GLFW.active.width!=width||GLFW.active.height!=height||GLFW.active.framebufferWidth!=framebufferWidth||GLFW.active.framebufferHeight!=framebufferHeight){GLFW.active.width=width;GLFW.active.height=height;GLFW.active.framebufferWidth=framebufferWidth;GLFW.active.framebufferHeight=framebufferHeight;GLFW.onWindowSizeChanged();GLFW.onFramebufferSizeChanged()}},onWindowSizeChanged:()=>{if(!GLFW.active)return;if(GLFW.active.windowSizeFunc){getWasmTableEntry(GLFW.active.windowSizeFunc)(GLFW.active.id,GLFW.active.width,GLFW.active.height)}},onFramebufferSizeChanged:()=>{if(!GLFW.active)return;if(GLFW.active.framebufferSizeFunc){getWasmTableEntry(GLFW.active.framebufferSizeFunc)(GLFW.active.id,GLFW.active.framebufferWidth,GLFW.active.framebufferHeight)}},onWindowContentScaleChanged:scale=>{GLFW.scale=scale;if(!GLFW.active)return;if(GLFW.active.windowContentScaleFunc){getWasmTableEntry(GLFW.active.windowContentScaleFunc)(GLFW.active.id,GLFW.scale,GLFW.scale)}},getTime:()=>_emscripten_get_now()/1e3,setWindowTitle:(winid,title)=>{var win=GLFW.WindowFromId(winid);if(!win)return;win.title=title;if(GLFW.active.id==win.id){_emscripten_set_window_title(title)}},setJoystickCallback:cbfun=>{var prevcbfun=GLFW.joystickFunc;GLFW.joystickFunc=cbfun;GLFW.refreshJoysticks();return prevcbfun},joys:{},lastGamepadState:[],lastGamepadStateFrame:null,refreshJoysticks:()=>{if(MainLoop.currentFrameNumber!==GLFW.lastGamepadStateFrame||!MainLoop.currentFrameNumber){GLFW.lastGamepadState=navigator.getGamepads?navigator.getGamepads():navigator.webkitGetGamepads||[];GLFW.lastGamepadStateFrame=MainLoop.currentFrameNumber;for(var joy=0;joy>2]=gamepad.axes[i]}}else{if(GLFW.joys[joy]){out("glfw joystick disconnected",joy);if(GLFW.joystickFunc){getWasmTableEntry(GLFW.joystickFunc)(joy,262146)}_free(GLFW.joys[joy].id);_free(GLFW.joys[joy].buttons);_free(GLFW.joys[joy].axes);delete GLFW.joys[joy]}}}}},setKeyCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.keyFunc;win.keyFunc=cbfun;return prevcbfun},setCharCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.charFunc;win.charFunc=cbfun;return prevcbfun},setMouseButtonCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.mouseButtonFunc;win.mouseButtonFunc=cbfun;return prevcbfun},setCursorPosCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.cursorPosFunc;win.cursorPosFunc=cbfun;return prevcbfun},setScrollCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.scrollFunc;win.scrollFunc=cbfun;return prevcbfun},setDropCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.dropFunc;win.dropFunc=cbfun;return prevcbfun},onDrop:event=>{if(!GLFW.active||!GLFW.active.dropFunc)return;if(!event.dataTransfer||!event.dataTransfer.files||event.dataTransfer.files.length==0)return;event.preventDefault();var filenames=_malloc(event.dataTransfer.files.length*4);var filenamesArray=[];var count=event.dataTransfer.files.length;var written=0;var drop_dir=".glfw_dropped_files";FS.createPath("/",drop_dir);function save(file){var path="/"+drop_dir+"/"+file.name.replace(/\//g,"_");var reader=new FileReader;reader.onloadend=e=>{if(reader.readyState!=2){++written;out("failed to read dropped file: "+file.name+": "+reader.error);return}var data=e.target.result;FS.writeFile(path,new Uint8Array(data));if(++written===count){getWasmTableEntry(GLFW.active.dropFunc)(GLFW.active.id,count,filenames);for(var i=0;i>2]=filename}for(var i=0;i{if(!GLFW.active||!GLFW.active.dropFunc)return;event.preventDefault();return false},setWindowSizeCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.windowSizeFunc;win.windowSizeFunc=cbfun;return prevcbfun},setWindowCloseCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.windowCloseFunc;win.windowCloseFunc=cbfun;return prevcbfun},setWindowRefreshCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.windowRefreshFunc;win.windowRefreshFunc=cbfun;return prevcbfun},onClickRequestPointerLock:e=>{if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();e.preventDefault()}},setInputMode:(winid,mode,value)=>{var win=GLFW.WindowFromId(winid);if(!win)return;switch(mode){case 208897:{switch(value){case 212993:{win.inputModes[mode]=value;Module["canvas"].removeEventListener("click",GLFW.onClickRequestPointerLock,true);Module["canvas"].exitPointerLock();break}case 212994:{err("glfwSetInputMode called with GLFW_CURSOR_HIDDEN value not implemented");break}case 212995:{win.inputModes[mode]=value;Module["canvas"].addEventListener("click",GLFW.onClickRequestPointerLock,true);Module["canvas"].requestPointerLock();break}default:{err(`glfwSetInputMode called with unknown value parameter value: ${value}`);break}}break}case 208898:{err("glfwSetInputMode called with GLFW_STICKY_KEYS mode not implemented");break}case 208899:{err("glfwSetInputMode called with GLFW_STICKY_MOUSE_BUTTONS mode not implemented");break}case 208900:{err("glfwSetInputMode called with GLFW_LOCK_KEY_MODS mode not implemented");break}case 3342341:{err("glfwSetInputMode called with GLFW_RAW_MOUSE_MOTION mode not implemented");break}default:{err(`glfwSetInputMode called with unknown mode parameter value: ${mode}`);break}}},getKey:(winid,key)=>{var win=GLFW.WindowFromId(winid);if(!win)return 0;return win.keys[key]},getMouseButton:(winid,button)=>{var win=GLFW.WindowFromId(winid);if(!win)return 0;return(win.buttons&1<0},getCursorPos:(winid,x,y)=>{GROWABLE_HEAP_F64()[x>>3]=Browser.mouseX;GROWABLE_HEAP_F64()[y>>3]=Browser.mouseY},getMousePos:(winid,x,y)=>{GROWABLE_HEAP_I32()[x>>2]=Browser.mouseX;GROWABLE_HEAP_I32()[y>>2]=Browser.mouseY},setCursorPos:(winid,x,y)=>{},getWindowPos:(winid,x,y)=>{var wx=0;var wy=0;var win=GLFW.WindowFromId(winid);if(win){wx=win.x;wy=win.y}if(x){GROWABLE_HEAP_I32()[x>>2]=wx}if(y){GROWABLE_HEAP_I32()[y>>2]=wy}},setWindowPos:(winid,x,y)=>{var win=GLFW.WindowFromId(winid);if(!win)return;win.x=x;win.y=y},getWindowSize:(winid,width,height)=>{var ww=0;var wh=0;var win=GLFW.WindowFromId(winid);if(win){ww=win.width;wh=win.height}if(width){GROWABLE_HEAP_I32()[width>>2]=ww}if(height){GROWABLE_HEAP_I32()[height>>2]=wh}},setWindowSize:(winid,width,height)=>{var win=GLFW.WindowFromId(winid);if(!win)return;if(GLFW.active.id==win.id){Browser.setCanvasSize(width,height)}},defaultWindowHints:()=>{GLFW.hints=Object.assign({},GLFW.defaultHints)},createWindow:(width,height,title,monitor,share)=>{var i,id;for(i=0;i0)throw"glfwCreateWindow only supports one window at time currently";id=i+1;if(width<=0||height<=0)return 0;if(monitor){Browser.requestFullscreen()}else{Browser.setCanvasSize(width,height)}for(i=0;i0;if(i==GLFW.windows.length){if(useWebGL){var contextAttributes={antialias:GLFW.hints[135181]>1,depth:GLFW.hints[135173]>0,stencil:GLFW.hints[135174]>0,alpha:GLFW.hints[135172]>0};Module.ctx=Browser.createContext(Module["canvas"],true,true,contextAttributes)}else{Browser.init()}}if(!Module.ctx&&useWebGL)return 0;const canvas=Module["canvas"];var win=new GLFW_Window(id,canvas.clientWidth,canvas.clientHeight,canvas.width,canvas.height,title,monitor,share);if(id-1==GLFW.windows.length){GLFW.windows.push(win)}else{GLFW.windows[id-1]=win}GLFW.active=win;GLFW.adjustCanvasDimensions();return win.id},destroyWindow:winid=>{var win=GLFW.WindowFromId(winid);if(!win)return;if(win.windowCloseFunc){getWasmTableEntry(win.windowCloseFunc)(win.id)}GLFW.windows[win.id-1]=null;if(GLFW.active.id==win.id)GLFW.active=null;for(var i=0;i{},requestFullscreen(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas);Browser.updateResizeListeners()}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas);Browser.updateResizeListeners()}}Module["onFullScreen"]?.(Browser.isFullscreen);Module["onFullscreen"]?.(Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?()=>canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"]):null)||(canvasContainer["webkitRequestFullScreen"]?()=>canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]):null);canvasContainer.requestFullscreen()},updateCanvasDimensions(canvas,wNative,hNative){const scale=GLFW.getHiDPIScale();if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h{var win=GLFW.WindowFromId(winid);if(!win)return;const isHiDPIAware=GLFW.isHiDPIAware();win.attributes[attrib]=value;if(isHiDPIAware!==GLFW.isHiDPIAware())GLFW.adjustCanvasDimensions()},getDevicePixelRatio(){return typeof devicePixelRatio=="number"&&devicePixelRatio||1},isHiDPIAware(){if(GLFW.active)return GLFW.active.attributes[139276]>0;else return false},adjustCanvasDimensions(){const canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,canvas.clientWidth,canvas.clientHeight);Browser.updateResizeListeners()},getHiDPIScale(){return GLFW.isHiDPIAware()?GLFW.scale:1},onDevicePixelRatioChange(){GLFW.onWindowContentScaleChanged(GLFW.getDevicePixelRatio());GLFW.adjustCanvasDimensions()},GLFW2ParamToGLFW3Param:param=>{var table={196609:0,196610:0,196611:0,196612:0,196613:0,196614:0,131073:0,131074:0,131075:0,131076:0,131077:135169,131078:135170,131079:135171,131080:135172,131081:135173,131082:135174,131083:135183,131084:135175,131085:135176,131086:135177,131087:135178,131088:135179,131089:135180,131090:0,131091:135181,131092:139266,131093:139267,131094:139270,131095:139271,131096:139272};return table[param]}};var _glfwCreateWindow=(width,height,title,monitor,share)=>GLFW.createWindow(width,height,title,monitor,share);var _glfwGetKey=(winid,key)=>GLFW.getKey(winid,key);var _glfwGetPrimaryMonitor=()=>1;var _glfwGetTime=()=>GLFW.getTime()-GLFW.initialTime;var _glfwGetWindowSize=(winid,width,height)=>GLFW.getWindowSize(winid,width,height);var _glfwInit=()=>{if(GLFW.windows)return 1;GLFW.initialTime=GLFW.getTime();GLFW.defaultWindowHints();GLFW.windows=new Array;GLFW.active=null;GLFW.scale=GLFW.getDevicePixelRatio();window.addEventListener("gamepadconnected",GLFW.onGamepadConnected,true);window.addEventListener("gamepaddisconnected",GLFW.onGamepadDisconnected,true);window.addEventListener("keydown",GLFW.onKeydown,true);window.addEventListener("keypress",GLFW.onKeyPress,true);window.addEventListener("keyup",GLFW.onKeyup,true);window.addEventListener("blur",GLFW.onBlur,true);GLFW.devicePixelRatioMQL=window.matchMedia("(resolution: "+GLFW.getDevicePixelRatio()+"dppx)");GLFW.devicePixelRatioMQL.addEventListener("change",GLFW.onDevicePixelRatioChange);Module["canvas"].addEventListener("touchmove",GLFW.onMousemove,true);Module["canvas"].addEventListener("touchstart",GLFW.onMouseButtonDown,true);Module["canvas"].addEventListener("touchcancel",GLFW.onMouseButtonUp,true);Module["canvas"].addEventListener("touchend",GLFW.onMouseButtonUp,true);Module["canvas"].addEventListener("mousemove",GLFW.onMousemove,true);Module["canvas"].addEventListener("mousedown",GLFW.onMouseButtonDown,true);Module["canvas"].addEventListener("mouseup",GLFW.onMouseButtonUp,true);Module["canvas"].addEventListener("wheel",GLFW.onMouseWheel,true);Module["canvas"].addEventListener("mousewheel",GLFW.onMouseWheel,true);Module["canvas"].addEventListener("mouseenter",GLFW.onMouseenter,true);Module["canvas"].addEventListener("mouseleave",GLFW.onMouseleave,true);Module["canvas"].addEventListener("drop",GLFW.onDrop,true);Module["canvas"].addEventListener("dragover",GLFW.onDragover,true);Browser.requestFullscreen=GLFW.requestFullscreen;Browser.calculateMouseCoords=GLFW.calculateMouseCoords;Browser.updateCanvasDimensions=GLFW.updateCanvasDimensions;Browser.resizeListeners.push((width,height)=>{if(GLFW.isHiDPIAware()){var canvas=Module["canvas"];GLFW.onCanvasResize(canvas.clientWidth,canvas.clientHeight,width,height)}else{GLFW.onCanvasResize(width,height,width,height)}});return 1};var _glfwMakeContextCurrent=winid=>{};var _glfwPollEvents=()=>{};var _glfwSetFramebufferSizeCallback=(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.framebufferSizeFunc;win.framebufferSizeFunc=cbfun;return prevcbfun};var _glfwSetWindowShouldClose=(winid,value)=>{var win=GLFW.WindowFromId(winid);if(!win)return;win.shouldClose=value};var _glfwSetWindowUserPointer=(winid,ptr)=>{var win=GLFW.WindowFromId(winid);if(!win)return;win.userptr=ptr};var _glfwSwapBuffers=winid=>GLFW.swapBuffers(winid);var _glfwSwapInterval=interval=>{interval=Math.abs(interval);if(interval==0)_emscripten_set_main_loop_timing(0,0);else _emscripten_set_main_loop_timing(1,interval)};var _glfwTerminate=()=>{window.removeEventListener("gamepadconnected",GLFW.onGamepadConnected,true);window.removeEventListener("gamepaddisconnected",GLFW.onGamepadDisconnected,true);window.removeEventListener("keydown",GLFW.onKeydown,true);window.removeEventListener("keypress",GLFW.onKeyPress,true);window.removeEventListener("keyup",GLFW.onKeyup,true);window.removeEventListener("blur",GLFW.onBlur,true);Module["canvas"].removeEventListener("touchmove",GLFW.onMousemove,true);Module["canvas"].removeEventListener("touchstart",GLFW.onMouseButtonDown,true);Module["canvas"].removeEventListener("touchcancel",GLFW.onMouseButtonUp,true);Module["canvas"].removeEventListener("touchend",GLFW.onMouseButtonUp,true);Module["canvas"].removeEventListener("mousemove",GLFW.onMousemove,true);Module["canvas"].removeEventListener("mousedown",GLFW.onMouseButtonDown,true);Module["canvas"].removeEventListener("mouseup",GLFW.onMouseButtonUp,true);Module["canvas"].removeEventListener("wheel",GLFW.onMouseWheel,true);Module["canvas"].removeEventListener("mousewheel",GLFW.onMouseWheel,true);Module["canvas"].removeEventListener("mouseenter",GLFW.onMouseenter,true);Module["canvas"].removeEventListener("mouseleave",GLFW.onMouseleave,true);Module["canvas"].removeEventListener("drop",GLFW.onDrop,true);Module["canvas"].removeEventListener("dragover",GLFW.onDragover,true);if(GLFW.devicePixelRatioMQL)GLFW.devicePixelRatioMQL.removeEventListener("change",GLFW.onDevicePixelRatioChange);Module["canvas"].width=Module["canvas"].height=1;GLFW.windows=null;GLFW.active=null};var _glfwWindowHint=(target,hint)=>{GLFW.hints[target]=hint};var _glfwWindowShouldClose=winid=>{var win=GLFW.WindowFromId(winid);if(!win)return 0;return win.shouldClose};var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{GROWABLE_HEAP_I8().set(array,buffer)};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(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)};PThread.init();registerPreMainLoop(()=>GL.newRenderingFrameStarted());for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<=288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i)}var miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<=288;++i){miniTempWebGLIntBuffers[i]=miniTempWebGLIntBuffersStorage.subarray(0,i)}Module["requestAnimationFrame"]=MainLoop.requestAnimationFrame;Module["pauseMainLoop"]=MainLoop.pause;Module["resumeMainLoop"]=MainLoop.resume;MainLoop.init();Module["requestFullscreen"]=Browser.requestFullscreen;Module["setCanvasSize"]=Browser.setCanvasSize;Module["getUserMedia"]=Browser.getUserMedia;Module["createContext"]=Browser.createContext;var preloadedImages={};var preloadedAudios={};FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();var proxiedFunctionTable=[_proc_exit,exitOnMainThread,_fd_close,_fd_seek,_fd_write,_emscripten_set_window_title];var wasmImports;function assignWasmImports(){wasmImports={b:___assert_fail,Ka:__emscripten_init_main_thread_js,Ea:__emscripten_notify_mailbox_postmessage,Ha:__emscripten_receive_on_main_thread_js,Ca:__emscripten_thread_cleanup,Ia:__emscripten_thread_mailbox_await,Ma:__emscripten_thread_set_strongref,Ga:_emscripten_check_blocking_allowed,La:_emscripten_exit_with_live_runtime,d:_emscripten_get_now,ta:_emscripten_glActiveTexture,sa:_emscripten_glAttachShader,Pc:_emscripten_glBeginQuery,zc:_emscripten_glBeginQueryEXT,pc:_emscripten_glBeginTransformFeedback,ra:_emscripten_glBindAttribLocation,pa:_emscripten_glBindBuffer,lc:_emscripten_glBindBufferBase,mc:_emscripten_glBindBufferRange,oa:_emscripten_glBindFramebuffer,na:_emscripten_glBindRenderbuffer,pb:_emscripten_glBindSampler,ma:_emscripten_glBindTexture,gb:_emscripten_glBindTransformFeedback,uc:_emscripten_glBindVertexArray,Ta:_emscripten_glBindVertexArrayOES,la:_emscripten_glBlendColor,ka:_emscripten_glBlendEquation,ja:_emscripten_glBlendEquationSeparate,ia:_emscripten_glBlendFunc,ha:_emscripten_glBlendFuncSeparate,Ac:_emscripten_glBlitFramebuffer,ga:_emscripten_glBufferData,fa:_emscripten_glBufferSubData,ea:_emscripten_glCheckFramebufferStatus,da:_emscripten_glClear,Ob:_emscripten_glClearBufferfi,Pb:_emscripten_glClearBufferfv,Rb:_emscripten_glClearBufferiv,Qb:_emscripten_glClearBufferuiv,ca:_emscripten_glClearColor,ba:_emscripten_glClearDepthf,aa:_emscripten_glClearStencil,zb:_emscripten_glClientWaitSync,ed:_emscripten_glClipControlEXT,$:_emscripten_glColorMask,_:_emscripten_glCompileShader,Z:_emscripten_glCompressedTexImage2D,Uc:_emscripten_glCompressedTexImage3D,Y:_emscripten_glCompressedTexSubImage2D,Tc:_emscripten_glCompressedTexSubImage3D,Mb:_emscripten_glCopyBufferSubData,W:_emscripten_glCopyTexImage2D,V:_emscripten_glCopyTexSubImage2D,Vc:_emscripten_glCopyTexSubImage3D,U:_emscripten_glCreateProgram,T:_emscripten_glCreateShader,S:_emscripten_glCullFace,R:_emscripten_glDeleteBuffers,Q:_emscripten_glDeleteFramebuffers,P:_emscripten_glDeleteProgram,Rc:_emscripten_glDeleteQueries,Wc:_emscripten_glDeleteQueriesEXT,O:_emscripten_glDeleteRenderbuffers,rb:_emscripten_glDeleteSamplers,N:_emscripten_glDeleteShader,Ab:_emscripten_glDeleteSync,L:_emscripten_glDeleteTextures,fb:_emscripten_glDeleteTransformFeedbacks,tc:_emscripten_glDeleteVertexArrays,Ja:_emscripten_glDeleteVertexArraysOES,K:_emscripten_glDepthFunc,J:_emscripten_glDepthMask,I:_emscripten_glDepthRangef,H:_emscripten_glDetachShader,G:_emscripten_glDisable,F:_emscripten_glDisableVertexAttribArray,E:_emscripten_glDrawArrays,Eb:_emscripten_glDrawArraysInstanced,wa:_emscripten_glDrawArraysInstancedANGLE,Pa:_emscripten_glDrawArraysInstancedARB,bd:_emscripten_glDrawArraysInstancedEXT,Qa:_emscripten_glDrawArraysInstancedNV,Hc:_emscripten_glDrawBuffers,$c:_emscripten_glDrawBuffersEXT,xa:_emscripten_glDrawBuffersWEBGL,D:_emscripten_glDrawElements,Db:_emscripten_glDrawElementsInstanced,va:_emscripten_glDrawElementsInstancedANGLE,Na:_emscripten_glDrawElementsInstancedARB,Oa:_emscripten_glDrawElementsInstancedEXT,ad:_emscripten_glDrawElementsInstancedNV,Zc:_emscripten_glDrawRangeElements,C:_emscripten_glEnable,B:_emscripten_glEnableVertexAttribArray,Oc:_emscripten_glEndQuery,oc:_emscripten_glEndQueryEXT,nc:_emscripten_glEndTransformFeedback,Cb:_emscripten_glFenceSync,A:_emscripten_glFinish,z:_emscripten_glFlush,vc:_emscripten_glFlushMappedBufferRange,y:_emscripten_glFramebufferRenderbuffer,x:_emscripten_glFramebufferTexture2D,xc:_emscripten_glFramebufferTextureLayer,w:_emscripten_glFrontFace,v:_emscripten_glGenBuffers,t:_emscripten_glGenFramebuffers,Sc:_emscripten_glGenQueries,fd:_emscripten_glGenQueriesEXT,s:_emscripten_glGenRenderbuffers,sb:_emscripten_glGenSamplers,q:_emscripten_glGenTextures,eb:_emscripten_glGenTransformFeedbacks,sc:_emscripten_glGenVertexArrays,za:_emscripten_glGenVertexArraysOES,u:_emscripten_glGenerateMipmap,p:_emscripten_glGetActiveAttrib,o:_emscripten_glGetActiveUniform,Gb:_emscripten_glGetActiveUniformBlockName,Hb:_emscripten_glGetActiveUniformBlockiv,Kb:_emscripten_glGetActiveUniformsiv,n:_emscripten_glGetAttachedShaders,m:_emscripten_glGetAttribLocation,l:_emscripten_glGetBooleanv,tb:_emscripten_glGetBufferParameteri64v,k:_emscripten_glGetBufferParameteriv,Ic:_emscripten_glGetBufferPointerv,j:_emscripten_glGetError,i:_emscripten_glGetFloatv,$b:_emscripten_glGetFragDataLocation,h:_emscripten_glGetFramebufferAttachmentParameteriv,ub:_emscripten_glGetInteger64i_v,wb:_emscripten_glGetInteger64v,qc:_emscripten_glGetIntegeri_v,Me:_emscripten_glGetIntegerv,Ua:_emscripten_glGetInternalformativ,$a:_emscripten_glGetProgramBinary,Ke:_emscripten_glGetProgramInfoLog,Le:_emscripten_glGetProgramiv,nb:_emscripten_glGetQueryObjecti64vEXT,Jb:_emscripten_glGetQueryObjectivEXT,cb:_emscripten_glGetQueryObjectui64vEXT,Mc:_emscripten_glGetQueryObjectuiv,yb:_emscripten_glGetQueryObjectuivEXT,Nc:_emscripten_glGetQueryiv,Ub:_emscripten_glGetQueryivEXT,Je:_emscripten_glGetRenderbufferParameteriv,ib:_emscripten_glGetSamplerParameterfv,jb:_emscripten_glGetSamplerParameteriv,He:_emscripten_glGetShaderInfoLog,Ge:_emscripten_glGetShaderPrecisionFormat,Fe:_emscripten_glGetShaderSource,Ie:_emscripten_glGetShaderiv,Ee:_emscripten_glGetString,Nb:_emscripten_glGetStringi,vb:_emscripten_glGetSynciv,De:_emscripten_glGetTexParameterfv,Be:_emscripten_glGetTexParameteriv,jc:_emscripten_glGetTransformFeedbackVarying,Ib:_emscripten_glGetUniformBlockIndex,Lb:_emscripten_glGetUniformIndices,ye:_emscripten_glGetUniformLocation,Ae:_emscripten_glGetUniformfv,ze:_emscripten_glGetUniformiv,ac:_emscripten_glGetUniformuiv,hc:_emscripten_glGetVertexAttribIiv,gc:_emscripten_glGetVertexAttribIuiv,ve:_emscripten_glGetVertexAttribPointerv,xe:_emscripten_glGetVertexAttribfv,we:_emscripten_glGetVertexAttribiv,ue:_emscripten_glHint,Ya:_emscripten_glInvalidateFramebuffer,Xa:_emscripten_glInvalidateSubFramebuffer,te:_emscripten_glIsBuffer,se:_emscripten_glIsEnabled,qe:_emscripten_glIsFramebuffer,pe:_emscripten_glIsProgram,Qc:_emscripten_glIsQuery,Kc:_emscripten_glIsQueryEXT,oe:_emscripten_glIsRenderbuffer,qb:_emscripten_glIsSampler,ne:_emscripten_glIsShader,Bb:_emscripten_glIsSync,me:_emscripten_glIsTexture,db:_emscripten_glIsTransformFeedback,rc:_emscripten_glIsVertexArray,ya:_emscripten_glIsVertexArrayOES,le:_emscripten_glLineWidth,ke:_emscripten_glLinkProgram,wc:_emscripten_glMapBufferRange,bb:_emscripten_glPauseTransformFeedback,je:_emscripten_glPixelStorei,dd:_emscripten_glPolygonModeWEBGL,ie:_emscripten_glPolygonOffset,gd:_emscripten_glPolygonOffsetClampEXT,_a:_emscripten_glProgramBinary,Za:_emscripten_glProgramParameteri,dc:_emscripten_glQueryCounterEXT,_c:_emscripten_glReadBuffer,he:_emscripten_glReadPixels,fe:_emscripten_glReleaseShaderCompiler,ee:_emscripten_glRenderbufferStorage,yc:_emscripten_glRenderbufferStorageMultisample,ab:_emscripten_glResumeTransformFeedback,de:_emscripten_glSampleCoverage,lb:_emscripten_glSamplerParameterf,kb:_emscripten_glSamplerParameterfv,ob:_emscripten_glSamplerParameteri,mb:_emscripten_glSamplerParameteriv,ce:_emscripten_glScissor,be:_emscripten_glShaderBinary,ae:_emscripten_glShaderSource,$d:_emscripten_glStencilFunc,_d:_emscripten_glStencilFuncSeparate,Zd:_emscripten_glStencilMask,Yd:_emscripten_glStencilMaskSeparate,Wd:_emscripten_glStencilOp,Vd:_emscripten_glStencilOpSeparate,Ud:_emscripten_glTexImage2D,Yc:_emscripten_glTexImage3D,Td:_emscripten_glTexParameterf,Sd:_emscripten_glTexParameterfv,Rd:_emscripten_glTexParameteri,Qd:_emscripten_glTexParameteriv,Wa:_emscripten_glTexStorage2D,Va:_emscripten_glTexStorage3D,Pd:_emscripten_glTexSubImage2D,Xc:_emscripten_glTexSubImage3D,kc:_emscripten_glTransformFeedbackVaryings,Od:_emscripten_glUniform1f,Nd:_emscripten_glUniform1fv,Ld:_emscripten_glUniform1i,Kd:_emscripten_glUniform1iv,_b:_emscripten_glUniform1ui,Wb:_emscripten_glUniform1uiv,Jd:_emscripten_glUniform2f,Id:_emscripten_glUniform2fv,Hd:_emscripten_glUniform2i,Gd:_emscripten_glUniform2iv,Zb:_emscripten_glUniform2ui,Vb:_emscripten_glUniform2uiv,Fd:_emscripten_glUniform3f,Ed:_emscripten_glUniform3fv,Dd:_emscripten_glUniform3i,Cd:_emscripten_glUniform3iv,Yb:_emscripten_glUniform3ui,Tb:_emscripten_glUniform3uiv,Ad:_emscripten_glUniform4f,zd:_emscripten_glUniform4fv,yd:_emscripten_glUniform4i,xd:_emscripten_glUniform4iv,Xb:_emscripten_glUniform4ui,Sb:_emscripten_glUniform4uiv,Fb:_emscripten_glUniformBlockBinding,wd:_emscripten_glUniformMatrix2fv,Gc:_emscripten_glUniformMatrix2x3fv,Ec:_emscripten_glUniformMatrix2x4fv,vd:_emscripten_glUniformMatrix3fv,Fc:_emscripten_glUniformMatrix3x2fv,Cc:_emscripten_glUniformMatrix3x4fv,ud:_emscripten_glUniformMatrix4fv,Dc:_emscripten_glUniformMatrix4x2fv,Bc:_emscripten_glUniformMatrix4x3fv,Jc:_emscripten_glUnmapBuffer,td:_emscripten_glUseProgram,sd:_emscripten_glValidateProgram,rd:_emscripten_glVertexAttrib1f,pd:_emscripten_glVertexAttrib1fv,od:_emscripten_glVertexAttrib2f,nd:_emscripten_glVertexAttrib2fv,md:_emscripten_glVertexAttrib3f,ld:_emscripten_glVertexAttrib3fv,kd:_emscripten_glVertexAttrib4f,jd:_emscripten_glVertexAttrib4fv,hb:_emscripten_glVertexAttribDivisor,ua:_emscripten_glVertexAttribDivisorANGLE,Ra:_emscripten_glVertexAttribDivisorARB,cd:_emscripten_glVertexAttribDivisorEXT,Sa:_emscripten_glVertexAttribDivisorNV,fc:_emscripten_glVertexAttribI4i,cc:_emscripten_glVertexAttribI4iv,ec:_emscripten_glVertexAttribI4ui,bc:_emscripten_glVertexAttribI4uiv,ic:_emscripten_glVertexAttribIPointer,id:_emscripten_glVertexAttribPointer,hd:_emscripten_glViewport,xb:_emscripten_glWaitSync,Da:_emscripten_resize_heap,Oe:_emscripten_set_main_loop,Ba:_exit,Fa:_fd_close,Aa:_fd_seek,f:_fd_write,M:_glfwCreateWindow,re:_glfwGetKey,X:_glfwGetPrimaryMonitor,ge:_glfwGetTime,Xd:_glfwGetWindowSize,qa:_glfwInit,e:_glfwMakeContextCurrent,Bd:_glfwPollEvents,r:_glfwSetFramebufferSizeCallback,Lc:_glfwSetWindowShouldClose,Ne:_glfwSetWindowUserPointer,Md:_glfwSwapBuffers,Ce:_glfwSwapInterval,g:_glfwTerminate,c:_glfwWindowHint,qd:_glfwWindowShouldClose,a:wasmMemory}}var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["Pe"])();var _main=Module["_main"]=(a0,a1)=>(_main=Module["_main"]=wasmExports["Qe"])(a0,a1);var _free=a0=>(_free=wasmExports["Se"])(a0);var _malloc=a0=>(_malloc=wasmExports["Te"])(a0);var __emscripten_tls_init=()=>(__emscripten_tls_init=wasmExports["Ue"])();var _pthread_self=()=>(_pthread_self=wasmExports["Ve"])();var __emscripten_thread_init=(a0,a1,a2,a3,a4,a5)=>(__emscripten_thread_init=wasmExports["We"])(a0,a1,a2,a3,a4,a5);var __emscripten_thread_crashed=()=>(__emscripten_thread_crashed=wasmExports["Xe"])();var __emscripten_run_on_main_thread_js=(a0,a1,a2,a3,a4)=>(__emscripten_run_on_main_thread_js=wasmExports["Ye"])(a0,a1,a2,a3,a4);var __emscripten_thread_free_data=a0=>(__emscripten_thread_free_data=wasmExports["Ze"])(a0);var __emscripten_thread_exit=a0=>(__emscripten_thread_exit=wasmExports["_e"])(a0);var __emscripten_check_mailbox=()=>(__emscripten_check_mailbox=wasmExports["$e"])();var _emscripten_stack_set_limits=(a0,a1)=>(_emscripten_stack_set_limits=wasmExports["af"])(a0,a1);var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["bf"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["cf"])(a0);var _emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports["df"])();Module["ccall"]=ccall;Module["cwrap"]=cwrap;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args=[]){var entryFunction=_main;args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv;args.forEach(arg=>{GROWABLE_HEAP_U32()[argv_ptr>>2]=stringToUTF8OnStack(arg);argv_ptr+=4});GROWABLE_HEAP_U32()[argv_ptr>>2]=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(args=arguments_){if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){initRuntime();startWorker(Module);return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();Module["onRuntimeInitialized"]?.();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run(); diff --git a/web/demo.wasm b/web/demo.wasm new file mode 100755 index 0000000000000000000000000000000000000000..5bd4b5a6932a5fb95b039eb75f88b3775e67d2db GIT binary patch literal 113025 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≠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 z + + + + + WebAssembly Test + + + + + Loading... + + + + +