nertc-web-sdk
Version:
NeRTC SDK for web
2 lines • 155 kB
JavaScript
/*! NeRTC 5.8.31|BUILD v5.8.31-0-g25fea891 production 20250911 */
!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.AIAudioEffects=e():n.AIAudioEffects=e()}(window,(function(){return function(n){var e={};function t(r){if(e[r])return e[r].exports;var a=e[r]={i:r,l:!1,exports:{}};return n[r].call(a.exports,a,a.exports,t),a.l=!0,a.exports}return t.m=n,t.c=e,t.d=function(n,e,r){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:r})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var a in n)t.d(r,a,function(e){return n[e]}.bind(null,a));return r},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=352)}({3:function(n,e,t){"use strict";var r=Object.prototype.hasOwnProperty,a="~";function o(){}function i(n,e,t){this.fn=n,this.context=e,this.once=t||!1}function s(){this._events=new o,this._eventsCount=0}Object.create&&(o.prototype=Object.create(null),(new o).__proto__||(a=!1)),s.prototype.eventNames=function(){var n,e,t=[];if(0===this._eventsCount)return t;for(e in n=this._events)r.call(n,e)&&t.push(a?e.slice(1):e);return Object.getOwnPropertySymbols?t.concat(Object.getOwnPropertySymbols(n)):t},s.prototype.listeners=function(n,e){var t=a?a+n:n,r=this._events[t];if(e)return!!r;if(!r)return[];if(r.fn)return[r.fn];for(var o=0,i=r.length,s=new Array(i);o<i;o++)s[o]=r[o].fn;return s},s.prototype.emit=function(n,e,t,r,o,i){var s=a?a+n:n;if(!this._events[s])return!1;var u,d,l=this._events[s],f=arguments.length;if(l.fn){switch(l.once&&this.removeListener(n,l.fn,void 0,!0),f){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,e),!0;case 3:return l.fn.call(l.context,e,t),!0;case 4:return l.fn.call(l.context,e,t,r),!0;case 5:return l.fn.call(l.context,e,t,r,o),!0;case 6:return l.fn.call(l.context,e,t,r,o,i),!0}for(d=1,u=new Array(f-1);d<f;d++)u[d-1]=arguments[d];l.fn.apply(l.context,u)}else{var c,p=l.length;for(d=0;d<p;d++)switch(l[d].once&&this.removeListener(n,l[d].fn,void 0,!0),f){case 1:l[d].fn.call(l[d].context);break;case 2:l[d].fn.call(l[d].context,e);break;case 3:l[d].fn.call(l[d].context,e,t);break;case 4:l[d].fn.call(l[d].context,e,t,r);break;default:if(!u)for(c=1,u=new Array(f-1);c<f;c++)u[c-1]=arguments[c];l[d].fn.apply(l[d].context,u)}}return!0},s.prototype.on=function(n,e,t){var r=new i(e,t||this),o=a?a+n:n;return this._events[o]?this._events[o].fn?this._events[o]=[this._events[o],r]:this._events[o].push(r):(this._events[o]=r,this._eventsCount++),this},s.prototype.once=function(n,e,t){var r=new i(e,t||this,!0),o=a?a+n:n;return this._events[o]?this._events[o].fn?this._events[o]=[this._events[o],r]:this._events[o].push(r):(this._events[o]=r,this._eventsCount++),this},s.prototype.removeListener=function(n,e,t,r){var i=a?a+n:n;if(!this._events[i])return this;if(!e)return 0==--this._eventsCount?this._events=new o:delete this._events[i],this;var s=this._events[i];if(s.fn)s.fn!==e||r&&!s.once||t&&s.context!==t||(0==--this._eventsCount?this._events=new o:delete this._events[i]);else{for(var u=0,d=[],l=s.length;u<l;u++)(s[u].fn!==e||r&&!s[u].once||t&&s[u].context!==t)&&d.push(s[u]);d.length?this._events[i]=1===d.length?d[0]:d:0==--this._eventsCount?this._events=new o:delete this._events[i]}return this},s.prototype.removeAllListeners=function(n){var e;return n?(e=a?a+n:n,this._events[e]&&(0==--this._eventsCount?this._events=new o:delete this._events[e])):(this._events=new o,this._eventsCount=0),this},s.prototype.off=s.prototype.removeListener,s.prototype.addListener=s.prototype.on,s.prototype.setMaxListeners=function(){return this},s.prefixed=a,s.EventEmitter=s,n.exports=s},352:function(n,e,t){"use strict";var r=this&&this.__importDefault||function(n){return n&&n.__esModule?n:{default:n}};Object.defineProperty(e,"__esModule",{value:!0});const a=r(t(353));n.exports=a.default},353:function(n,e,t){"use strict";var r=this&&this.__importDefault||function(n){return n&&n.__esModule?n:{default:n}};Object.defineProperty(e,"__esModule",{value:!0});const a=t(3),o=r(t(354)),i={audioEffectsWorkletAgentProcessor:{blobParts:[o.default],options:{type:"text/javascript; charset=utf-8"},url:""}};class s extends a.EventEmitter{constructor(n){super(),this.wasmBinary=null,this.logger=n.adapterRef.logger.getChild(()=>"AIAudioEffects"),this.version="5.8.31",this.logger.info("Plugin AIAudioEffects 5.8.31 v5.8.31-0-g25fea891: 创建成功。"),this.url=function(n){if(!i[n].url){const e=new Blob(i[n].blobParts,i[n].options);i[n].url=window.URL.createObjectURL(e)}return i[n].url}("audioEffectsWorkletAgentProcessor"),this.preload(n)}async preload(n){fetch(n.wasmUrl).then(n=>{if(200==n.status)return n.arrayBuffer();this.emit("plugin-load-error")}).then(n=>{n&&(this.wasmBinary=new Uint8Array(n),this.emit("plugin-load"))})}init(){this.logger.log("AIAudioEffects create")}}e.default=s},354:function(n,e,t){"use strict";n.exports="/* eslint-disable */\n\nconst createModule = function (Module) {\n var Module = typeof Module != 'undefined' ? Module : {}\n var moduleOverrides = Object.assign({}, Module)\n var arguments_ = []\n var thisProgram = './this.program'\n var quit_ = (status, toThrow) => {\n throw toThrow\n }\n var ENVIRONMENT_IS_WEB = typeof window == 'object'\n var ENVIRONMENT_IS_WORKER = typeof importScripts == 'function'\n var ENVIRONMENT_IS_NODE =\n typeof process == 'object' &&\n typeof process.versions == 'object' &&\n typeof process.versions.node == 'string'\n var scriptDirectory = ''\n function locateFile(path) {\n if (Module['locateFile']) {\n return Module['locateFile'](path, scriptDirectory)\n }\n return scriptDirectory + path\n }\n var read_, readAsync, readBinary, setWindowTitle\n function logExceptionOnExit(e) {\n if (e instanceof ExitStatus) return\n let toLog = e\n err('exiting due to exception: ' + toLog)\n }\n if (ENVIRONMENT_IS_NODE) {\n if (ENVIRONMENT_IS_WORKER) {\n scriptDirectory = require('path').dirname(scriptDirectory) + '/'\n } else {\n scriptDirectory = __dirname + '/'\n }\n var fs\n var nodePath\n var requireNodeFS = () => {\n if (!nodePath) {\n fs = require('fs')\n nodePath = require('path')\n }\n }\n read_ = (filename, binary) => {\n requireNodeFS()\n filename = nodePath['normalize'](filename)\n return fs.readFileSync(filename, binary ? undefined : 'utf8')\n }\n readBinary = (filename) => {\n var ret = read_(filename, true)\n if (!ret.buffer) {\n ret = new Uint8Array(ret)\n }\n return ret\n }\n readAsync = (filename, onload, onerror) => {\n requireNodeFS()\n filename = nodePath['normalize'](filename)\n fs.readFile(filename, function (err, data) {\n if (err) onerror(err)\n else onload(data.buffer)\n })\n }\n if (process['argv'].length > 1) {\n thisProgram = process['argv'][1].replace(/\\\\/g, '/')\n }\n arguments_ = process['argv'].slice(2)\n if (typeof module != 'undefined') {\n module['exports'] = Module\n }\n process['on']('uncaughtException', function (ex) {\n if (!(ex instanceof ExitStatus)) {\n throw ex\n }\n })\n process['on']('unhandledRejection', function (reason) {\n throw reason\n })\n quit_ = (status, toThrow) => {\n if (keepRuntimeAlive()) {\n process['exitCode'] = status\n throw toThrow\n }\n logExceptionOnExit(toThrow)\n process['exit'](status)\n }\n Module['inspect'] = function () {\n return '[Emscripten Module object]'\n }\n } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n if (ENVIRONMENT_IS_WORKER) {\n scriptDirectory = self.location.href\n } else if (typeof document != 'undefined' && document.currentScript) {\n scriptDirectory = document.currentScript.src\n }\n if (scriptDirectory.indexOf('blob:') !== 0) {\n scriptDirectory = scriptDirectory.substr(\n 0,\n scriptDirectory.replace(/[?#].*/, '').lastIndexOf('/') + 1\n )\n } else {\n scriptDirectory = ''\n }\n {\n read_ = (url) => {\n var xhr = new XMLHttpRequest()\n xhr.open('GET', url, false)\n xhr.send(null)\n return xhr.responseText\n }\n if (ENVIRONMENT_IS_WORKER) {\n readBinary = (url) => {\n var xhr = new XMLHttpRequest()\n xhr.open('GET', url, false)\n xhr.responseType = 'arraybuffer'\n xhr.send(null)\n return new Uint8Array(xhr.response)\n }\n }\n readAsync = (url, onload, onerror) => {\n var xhr = new XMLHttpRequest()\n xhr.open('GET', url, true)\n xhr.responseType = 'arraybuffer'\n xhr.onload = () => {\n if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {\n onload(xhr.response)\n return\n }\n onerror()\n }\n xhr.onerror = onerror\n xhr.send(null)\n }\n }\n setWindowTitle = (title) => (document.title = title)\n } else {\n }\n var out = Module['print'] || console.log.bind(console)\n var err = Module['printErr'] || console.warn.bind(console)\n Object.assign(Module, moduleOverrides)\n moduleOverrides = null\n if (Module['arguments']) arguments_ = Module['arguments']\n if (Module['thisProgram']) thisProgram = Module['thisProgram']\n if (Module['quit']) quit_ = Module['quit']\n var wasmBinary\n if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']\n var noExitRuntime = Module['noExitRuntime'] || true\n if (typeof WebAssembly != 'object') {\n abort('no native wasm support detected')\n }\n var wasmMemory\n var ABORT = false\n var EXITSTATUS\n function assert(condition, text) {\n if (!condition) {\n abort(text)\n }\n }\n var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined\n function UTF8ArrayToString(heapOrArray, idx, maxBytesToRead) {\n var endIdx = idx + maxBytesToRead\n var endPtr = idx\n while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr\n if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {\n return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr))\n }\n var str = ''\n while (idx < endPtr) {\n var u0 = heapOrArray[idx++]\n if (!(u0 & 128)) {\n str += String.fromCharCode(u0)\n continue\n }\n var u1 = heapOrArray[idx++] & 63\n if ((u0 & 224) == 192) {\n str += String.fromCharCode(((u0 & 31) << 6) | u1)\n continue\n }\n var u2 = heapOrArray[idx++] & 63\n if ((u0 & 240) == 224) {\n u0 = ((u0 & 15) << 12) | (u1 << 6) | u2\n } else {\n u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63)\n }\n if (u0 < 65536) {\n str += String.fromCharCode(u0)\n } else {\n var ch = u0 - 65536\n str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023))\n }\n }\n return str\n }\n function UTF8ToString(ptr, maxBytesToRead) {\n return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''\n }\n function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {\n if (!(maxBytesToWrite > 0)) return 0\n var startIdx = outIdx\n var endIdx = outIdx + maxBytesToWrite - 1\n for (var i = 0; i < str.length; ++i) {\n var u = str.charCodeAt(i)\n if (u >= 55296 && u <= 57343) {\n var u1 = str.charCodeAt(++i)\n u = (65536 + ((u & 1023) << 10)) | (u1 & 1023)\n }\n if (u <= 127) {\n if (outIdx >= endIdx) break\n heap[outIdx++] = u\n } else if (u <= 2047) {\n if (outIdx + 1 >= endIdx) break\n heap[outIdx++] = 192 | (u >> 6)\n heap[outIdx++] = 128 | (u & 63)\n } else if (u <= 65535) {\n if (outIdx + 2 >= endIdx) break\n heap[outIdx++] = 224 | (u >> 12)\n heap[outIdx++] = 128 | ((u >> 6) & 63)\n heap[outIdx++] = 128 | (u & 63)\n } else {\n if (outIdx + 3 >= endIdx) break\n heap[outIdx++] = 240 | (u >> 18)\n heap[outIdx++] = 128 | ((u >> 12) & 63)\n heap[outIdx++] = 128 | ((u >> 6) & 63)\n heap[outIdx++] = 128 | (u & 63)\n }\n }\n heap[outIdx] = 0\n return outIdx - startIdx\n }\n function stringToUTF8(str, outPtr, maxBytesToWrite) {\n return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite)\n }\n function lengthBytesUTF8(str) {\n var len = 0\n for (var i = 0; i < str.length; ++i) {\n var c = str.charCodeAt(i)\n if (c <= 127) {\n len++\n } else if (c <= 2047) {\n len += 2\n } else if (c >= 55296 && c <= 57343) {\n len += 4\n ++i\n } else {\n len += 3\n }\n }\n return len\n }\n var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64\n function updateGlobalBufferAndViews(buf) {\n buffer = buf\n Module['HEAP8'] = HEAP8 = new Int8Array(buf)\n Module['HEAP16'] = HEAP16 = new Int16Array(buf)\n Module['HEAP32'] = HEAP32 = new Int32Array(buf)\n Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf)\n Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf)\n Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf)\n Module['HEAPF32'] = HEAPF32 = new Float32Array(buf)\n Module['HEAPF64'] = HEAPF64 = new Float64Array(buf)\n }\n var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216\n var wasmTable\n var __ATPRERUN__ = []\n var __ATINIT__ = []\n var __ATMAIN__ = []\n var __ATPOSTRUN__ = []\n var runtimeInitialized = false\n function keepRuntimeAlive() {\n return noExitRuntime\n }\n function preRun() {\n if (Module['preRun']) {\n if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]\n while (Module['preRun'].length) {\n addOnPreRun(Module['preRun'].shift())\n }\n }\n callRuntimeCallbacks(__ATPRERUN__)\n }\n function initRuntime() {\n runtimeInitialized = true\n if (!Module['noFSInit'] && !FS.init.initialized) FS.init()\n FS.ignorePermissions = false\n TTY.init()\n callRuntimeCallbacks(__ATINIT__)\n }\n function preMain() {\n callRuntimeCallbacks(__ATMAIN__)\n }\n function postRun() {\n if (Module['postRun']) {\n if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]\n while (Module['postRun'].length) {\n addOnPostRun(Module['postRun'].shift())\n }\n }\n callRuntimeCallbacks(__ATPOSTRUN__)\n }\n function addOnPreRun(cb) {\n __ATPRERUN__.unshift(cb)\n }\n function addOnInit(cb) {\n __ATINIT__.unshift(cb)\n }\n function addOnPostRun(cb) {\n __ATPOSTRUN__.unshift(cb)\n }\n var runDependencies = 0\n var runDependencyWatcher = null\n var dependenciesFulfilled = null\n function getUniqueRunDependency(id) {\n return id\n }\n function addRunDependency(id) {\n runDependencies++\n if (Module['monitorRunDependencies']) {\n Module['monitorRunDependencies'](runDependencies)\n }\n }\n function removeRunDependency(id) {\n runDependencies--\n if (Module['monitorRunDependencies']) {\n Module['monitorRunDependencies'](runDependencies)\n }\n if (runDependencies == 0) {\n if (runDependencyWatcher !== null) {\n clearInterval(runDependencyWatcher)\n runDependencyWatcher = null\n }\n if (dependenciesFulfilled) {\n var callback = dependenciesFulfilled\n dependenciesFulfilled = null\n callback()\n }\n }\n }\n function abort(what) {\n {\n if (Module['onAbort']) {\n Module['onAbort'](what)\n }\n }\n what = 'Aborted(' + what + ')'\n err(what)\n ABORT = true\n EXITSTATUS = 1\n what += '. Build with -sASSERTIONS for more info.'\n var e = new WebAssembly.RuntimeError(what)\n throw e\n }\n var dataURIPrefix = 'data:application/octet-stream;base64,'\n function isDataURI(filename) {\n return filename.startsWith(dataURIPrefix)\n }\n function isFileURI(filename) {\n return filename.startsWith('file://')\n }\n var wasmBinaryFile\n wasmBinaryFile = 'audio_effects_and_denoise.wasm'\n if (!isDataURI(wasmBinaryFile)) {\n wasmBinaryFile = locateFile(wasmBinaryFile)\n }\n function getBinary(file) {\n try {\n if (file == wasmBinaryFile && wasmBinary) {\n return new Uint8Array(wasmBinary)\n }\n if (readBinary) {\n return readBinary(file)\n }\n throw 'both async and sync fetching of the wasm failed'\n } catch (err) {\n abort(err)\n }\n }\n function getBinaryPromise() {\n if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {\n if (typeof fetch == 'function' && !isFileURI(wasmBinaryFile)) {\n return fetch(wasmBinaryFile, { credentials: 'same-origin' })\n .then(function (response) {\n if (!response['ok']) {\n throw \"failed to load wasm binary file at '\" + wasmBinaryFile + \"'\"\n }\n return response['arrayBuffer']()\n })\n .catch(function () {\n return getBinary(wasmBinaryFile)\n })\n } else {\n if (readAsync) {\n return new Promise(function (resolve, reject) {\n readAsync(\n wasmBinaryFile,\n function (response) {\n resolve(new Uint8Array(response))\n },\n reject\n )\n })\n }\n }\n }\n return Promise.resolve().then(function () {\n return getBinary(wasmBinaryFile)\n })\n }\n function createWasm() {\n var info = { a: asmLibraryArg }\n function receiveInstance(instance, module) {\n var exports = instance.exports\n Module['asm'] = exports\n wasmMemory = Module['asm']['B']\n updateGlobalBufferAndViews(wasmMemory.buffer)\n wasmTable = Module['asm']['J']\n addOnInit(Module['asm']['C'])\n removeRunDependency('wasm-instantiate')\n }\n addRunDependency('wasm-instantiate')\n function receiveInstantiationResult(result) {\n receiveInstance(result['instance'])\n }\n function instantiateArrayBuffer(receiver) {\n return getBinaryPromise()\n .then(function (binary) {\n return WebAssembly.instantiate(binary, info)\n })\n .then(function (instance) {\n return instance\n })\n .then(receiver, function (reason) {\n err('failed to asynchronously prepare wasm: ' + reason)\n abort(reason)\n })\n }\n function instantiateAsync() {\n if (\n !wasmBinary &&\n typeof WebAssembly.instantiateStreaming == 'function' &&\n !isDataURI(wasmBinaryFile) &&\n !isFileURI(wasmBinaryFile) &&\n !ENVIRONMENT_IS_NODE &&\n typeof fetch == 'function'\n ) {\n return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) {\n var result = WebAssembly.instantiateStreaming(response, info)\n return result.then(receiveInstantiationResult, function (reason) {\n err('wasm streaming compile failed: ' + reason)\n err('falling back to ArrayBuffer instantiation')\n return instantiateArrayBuffer(receiveInstantiationResult)\n })\n })\n } else {\n return instantiateArrayBuffer(receiveInstantiationResult)\n }\n }\n if (Module['instantiateWasm']) {\n try {\n var exports = Module['instantiateWasm'](info, receiveInstance)\n return exports\n } catch (e) {\n err('Module.instantiateWasm callback failed with error: ' + e)\n return false\n }\n }\n instantiateAsync()\n return {}\n }\n var tempDouble\n var tempI64\n function ExitStatus(status) {\n this.name = 'ExitStatus'\n this.message = 'Program terminated with exit(' + status + ')'\n this.status = status\n }\n function callRuntimeCallbacks(callbacks) {\n while (callbacks.length > 0) {\n callbacks.shift()(Module)\n }\n }\n function handleException(e) {\n if (e instanceof ExitStatus || e == 'unwind') {\n return EXITSTATUS\n }\n quit_(1, e)\n }\n function writeArrayToMemory(array, buffer) {\n HEAP8.set(array, buffer)\n }\n function ___assert_fail(condition, filename, line, func) {\n abort(\n 'Assertion failed: ' +\n UTF8ToString(condition) +\n ', at: ' +\n [\n filename ? UTF8ToString(filename) : 'unknown filename',\n line,\n func ? UTF8ToString(func) : 'unknown function'\n ]\n )\n }\n function ___cxa_allocate_exception(size) {\n return _malloc(size + 24) + 24\n }\n function ExceptionInfo(excPtr) {\n this.excPtr = excPtr\n this.ptr = excPtr - 24\n this.set_type = function (type) {\n HEAPU32[(this.ptr + 4) >> 2] = type\n }\n this.get_type = function () {\n return HEAPU32[(this.ptr + 4) >> 2]\n }\n this.set_destructor = function (destructor) {\n HEAPU32[(this.ptr + 8) >> 2] = destructor\n }\n this.get_destructor = function () {\n return HEAPU32[(this.ptr + 8) >> 2]\n }\n this.set_refcount = function (refcount) {\n HEAP32[this.ptr >> 2] = refcount\n }\n this.set_caught = function (caught) {\n caught = caught ? 1 : 0\n HEAP8[(this.ptr + 12) >> 0] = caught\n }\n this.get_caught = function () {\n return HEAP8[(this.ptr + 12) >> 0] != 0\n }\n this.set_rethrown = function (rethrown) {\n rethrown = rethrown ? 1 : 0\n HEAP8[(this.ptr + 13) >> 0] = rethrown\n }\n this.get_rethrown = function () {\n return HEAP8[(this.ptr + 13) >> 0] != 0\n }\n this.init = function (type, destructor) {\n this.set_adjusted_ptr(0)\n this.set_type(type)\n this.set_destructor(destructor)\n this.set_refcount(0)\n this.set_caught(false)\n this.set_rethrown(false)\n }\n this.add_ref = function () {\n var value = HEAP32[this.ptr >> 2]\n HEAP32[this.ptr >> 2] = value + 1\n }\n this.release_ref = function () {\n var prev = HEAP32[this.ptr >> 2]\n HEAP32[this.ptr >> 2] = prev - 1\n return prev === 1\n }\n this.set_adjusted_ptr = function (adjustedPtr) {\n HEAPU32[(this.ptr + 16) >> 2] = adjustedPtr\n }\n this.get_adjusted_ptr = function () {\n return HEAPU32[(this.ptr + 16) >> 2]\n }\n this.get_exception_ptr = function () {\n var isPointer = ___cxa_is_pointer_type(this.get_type())\n if (isPointer) {\n return HEAPU32[this.excPtr >> 2]\n }\n var adjusted = this.get_adjusted_ptr()\n if (adjusted !== 0) return adjusted\n return this.excPtr\n }\n }\n var exceptionLast = 0\n var uncaughtExceptionCount = 0\n function ___cxa_throw(ptr, type, destructor) {\n var info = new ExceptionInfo(ptr)\n info.init(type, destructor)\n exceptionLast = ptr\n uncaughtExceptionCount++\n throw ptr\n }\n function setErrNo(value) {\n HEAP32[___errno_location() >> 2] = value\n return value\n }\n var PATH = {\n isAbs: (path) => path.charAt(0) === '/',\n splitPath: (filename) => {\n var splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/\n return splitPathRe.exec(filename).slice(1)\n },\n normalizeArray: (parts, allowAboveRoot) => {\n var up = 0\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i]\n if (last === '.') {\n parts.splice(i, 1)\n } else if (last === '..') {\n parts.splice(i, 1)\n up++\n } else if (up) {\n parts.splice(i, 1)\n up--\n }\n }\n if (allowAboveRoot) {\n for (; up; up--) {\n parts.unshift('..')\n }\n }\n return parts\n },\n normalize: (path) => {\n var isAbsolute = PATH.isAbs(path),\n trailingSlash = path.substr(-1) === '/'\n path = PATH.normalizeArray(\n path.split('/').filter((p) => !!p),\n !isAbsolute\n ).join('/')\n if (!path && !isAbsolute) {\n path = '.'\n }\n if (path && trailingSlash) {\n path += '/'\n }\n return (isAbsolute ? '/' : '') + path\n },\n dirname: (path) => {\n var result = PATH.splitPath(path),\n root = result[0],\n dir = result[1]\n if (!root && !dir) {\n return '.'\n }\n if (dir) {\n dir = dir.substr(0, dir.length - 1)\n }\n return root + dir\n },\n basename: (path) => {\n if (path === '/') return '/'\n path = PATH.normalize(path)\n path = path.replace(/\\/$/, '')\n var lastSlash = path.lastIndexOf('/')\n if (lastSlash === -1) return path\n return path.substr(lastSlash + 1)\n },\n join: function () {\n var paths = Array.prototype.slice.call(arguments)\n return PATH.normalize(paths.join('/'))\n },\n join2: (l, r) => {\n return PATH.normalize(l + '/' + r)\n }\n }\n function getRandomDevice() {\n if (typeof crypto == 'object' && typeof crypto['getRandomValues'] == 'function') {\n var randomBuffer = new Uint8Array(1)\n return () => {\n crypto.getRandomValues(randomBuffer)\n return randomBuffer[0]\n }\n } else if (ENVIRONMENT_IS_NODE) {\n try {\n var crypto_module = require('crypto')\n return () => crypto_module['randomBytes'](1)[0]\n } catch (e) {}\n }\n return () => abort('randomDevice')\n }\n var PATH_FS = {\n resolve: function () {\n var resolvedPath = '',\n resolvedAbsolute = false\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = i >= 0 ? arguments[i] : FS.cwd()\n if (typeof path != 'string') {\n throw new TypeError('Arguments to path.resolve must be strings')\n } else if (!path) {\n return ''\n }\n resolvedPath = path + '/' + resolvedPath\n resolvedAbsolute = PATH.isAbs(path)\n }\n resolvedPath = PATH.normalizeArray(\n resolvedPath.split('/').filter((p) => !!p),\n !resolvedAbsolute\n ).join('/')\n return (resolvedAbsolute ? '/' : '') + resolvedPath || '.'\n },\n relative: (from, to) => {\n from = PATH_FS.resolve(from).substr(1)\n to = PATH_FS.resolve(to).substr(1)\n function trim(arr) {\n var start = 0\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break\n }\n var end = arr.length - 1\n for (; end >= 0; end--) {\n if (arr[end] !== '') break\n }\n if (start > end) return []\n return arr.slice(start, end - start + 1)\n }\n var fromParts = trim(from.split('/'))\n var toParts = trim(to.split('/'))\n var length = Math.min(fromParts.length, toParts.length)\n var samePartsLength = length\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i\n break\n }\n }\n var outputParts = []\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..')\n }\n outputParts = outputParts.concat(toParts.slice(samePartsLength))\n return outputParts.join('/')\n }\n }\n function intArrayFromString(stringy, dontAddNull, length) {\n var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1\n var u8array = new Array(len)\n var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length)\n if (dontAddNull) u8array.length = numBytesWritten\n return u8array\n }\n var TTY = {\n ttys: [],\n init: function () {},\n shutdown: function () {},\n register: function (dev, ops) {\n TTY.ttys[dev] = { input: [], output: [], ops: ops }\n FS.registerDevice(dev, TTY.stream_ops)\n },\n stream_ops: {\n open: function (stream) {\n var tty = TTY.ttys[stream.node.rdev]\n if (!tty) {\n throw new FS.ErrnoError(43)\n }\n stream.tty = tty\n stream.seekable = false\n },\n close: function (stream) {\n stream.tty.ops.fsync(stream.tty)\n },\n fsync: function (stream) {\n stream.tty.ops.fsync(stream.tty)\n },\n read: function (stream, buffer, offset, length, pos) {\n if (!stream.tty || !stream.tty.ops.get_char) {\n throw new FS.ErrnoError(60)\n }\n var bytesRead = 0\n for (var i = 0; i < length; i++) {\n var result\n try {\n result = stream.tty.ops.get_char(stream.tty)\n } catch (e) {\n throw new FS.ErrnoError(29)\n }\n if (result === undefined && bytesRead === 0) {\n throw new FS.ErrnoError(6)\n }\n if (result === null || result === undefined) break\n bytesRead++\n buffer[offset + i] = result\n }\n if (bytesRead) {\n stream.node.timestamp = Date.now()\n }\n return bytesRead\n },\n write: function (stream, buffer, offset, length, pos) {\n if (!stream.tty || !stream.tty.ops.put_char) {\n throw new FS.ErrnoError(60)\n }\n try {\n for (var i = 0; i < length; i++) {\n stream.tty.ops.put_char(stream.tty, buffer[offset + i])\n }\n } catch (e) {\n throw new FS.ErrnoError(29)\n }\n if (length) {\n stream.node.timestamp = Date.now()\n }\n return i\n }\n },\n default_tty_ops: {\n get_char: function (tty) {\n if (!tty.input.length) {\n var result = null\n if (ENVIRONMENT_IS_NODE) {\n var BUFSIZE = 256\n var buf = Buffer.alloc(BUFSIZE)\n var bytesRead = 0\n try {\n bytesRead = fs.readSync(process.stdin.fd, buf, 0, BUFSIZE, -1)\n } catch (e) {\n if (e.toString().includes('EOF')) bytesRead = 0\n else throw e\n }\n if (bytesRead > 0) {\n result = buf.slice(0, bytesRead).toString('utf-8')\n } else {\n result = null\n }\n } else if (typeof window != 'undefined' && typeof window.prompt == 'function') {\n result = window.prompt('Input: ')\n if (result !== null) {\n result += '\\n'\n }\n } else if (typeof readline == 'function') {\n result = readline()\n if (result !== null) {\n result += '\\n'\n }\n }\n if (!result) {\n return null\n }\n tty.input = intArrayFromString(result, true)\n }\n return tty.input.shift()\n },\n put_char: function (tty, val) {\n if (val === null || val === 10) {\n out(UTF8ArrayToString(tty.output, 0))\n tty.output = []\n } else {\n if (val != 0) tty.output.push(val)\n }\n },\n fsync: function (tty) {\n if (tty.output && tty.output.length > 0) {\n out(UTF8ArrayToString(tty.output, 0))\n tty.output = []\n }\n }\n },\n default_tty1_ops: {\n put_char: function (tty, val) {\n if (val === null || val === 10) {\n err(UTF8ArrayToString(tty.output, 0))\n tty.output = []\n } else {\n if (val != 0) tty.output.push(val)\n }\n },\n fsync: function (tty) {\n if (tty.output && tty.output.length > 0) {\n err(UTF8ArrayToString(tty.output, 0))\n tty.output = []\n }\n }\n }\n }\n function mmapAlloc(size) {\n abort()\n }\n var MEMFS = {\n ops_table: null,\n mount: function (mount) {\n return MEMFS.createNode(null, '/', 16384 | 511, 0)\n },\n createNode: function (parent, name, mode, dev) {\n if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {\n throw new FS.ErrnoError(63)\n }\n if (!MEMFS.ops_table) {\n MEMFS.ops_table = {\n dir: {\n node: {\n getattr: MEMFS.node_ops.getattr,\n setattr: MEMFS.node_ops.setattr,\n lookup: MEMFS.node_ops.lookup,\n mknod: MEMFS.node_ops.mknod,\n rename: MEMFS.node_ops.rename,\n unlink: MEMFS.node_ops.unlink,\n rmdir: MEMFS.node_ops.rmdir,\n readdir: MEMFS.node_ops.readdir,\n symlink: MEMFS.node_ops.symlink\n },\n stream: { llseek: MEMFS.stream_ops.llseek }\n },\n file: {\n node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr },\n stream: {\n llseek: MEMFS.stream_ops.llseek,\n read: MEMFS.stream_ops.read,\n write: MEMFS.stream_ops.write,\n allocate: MEMFS.stream_ops.allocate,\n mmap: MEMFS.stream_ops.mmap,\n msync: MEMFS.stream_ops.msync\n }\n },\n link: {\n node: {\n getattr: MEMFS.node_ops.getattr,\n setattr: MEMFS.node_ops.setattr,\n readlink: MEMFS.node_ops.readlink\n },\n stream: {}\n },\n chrdev: {\n node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr },\n stream: FS.chrdev_stream_ops\n }\n }\n }\n var node = FS.createNode(parent, name, mode, dev)\n if (FS.isDir(node.mode)) {\n node.node_ops = MEMFS.ops_table.dir.node\n node.stream_ops = MEMFS.ops_table.dir.stream\n node.contents = {}\n } else if (FS.isFile(node.mode)) {\n node.node_ops = MEMFS.ops_table.file.node\n node.stream_ops = MEMFS.ops_table.file.stream\n node.usedBytes = 0\n node.contents = null\n } else if (FS.isLink(node.mode)) {\n node.node_ops = MEMFS.ops_table.link.node\n node.stream_ops = MEMFS.ops_table.link.stream\n } else if (FS.isChrdev(node.mode)) {\n node.node_ops = MEMFS.ops_table.chrdev.node\n node.stream_ops = MEMFS.ops_table.chrdev.stream\n }\n node.timestamp = Date.now()\n if (parent) {\n parent.contents[name] = node\n parent.timestamp = node.timestamp\n }\n return node\n },\n getFileDataAsTypedArray: function (node) {\n if (!node.contents) return new Uint8Array(0)\n if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes)\n return new Uint8Array(node.contents)\n },\n expandFileStorage: function (node, newCapacity) {\n var prevCapacity = node.contents ? node.contents.length : 0\n if (prevCapacity >= newCapacity) return\n var CAPACITY_DOUBLING_MAX = 1024 * 1024\n newCapacity = Math.max(\n newCapacity,\n (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0\n )\n if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256)\n var oldContents = node.contents\n node.contents = new Uint8Array(newCapacity)\n if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0)\n },\n resizeFileStorage: function (node, newSize) {\n if (node.usedBytes == newSize) return\n if (newSize == 0) {\n node.contents = null\n node.usedBytes = 0\n } else {\n var oldContents = node.contents\n node.contents = new Uint8Array(newSize)\n if (oldContents) {\n node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes)))\n }\n node.usedBytes = newSize\n }\n },\n node_ops: {\n getattr: function (node) {\n var attr = {}\n attr.dev = FS.isChrdev(node.mode) ? node.id : 1\n attr.ino = node.id\n attr.mode = node.mode\n attr.nlink = 1\n attr.uid = 0\n attr.gid = 0\n attr.rdev = node.rdev\n if (FS.isDir(node.mode)) {\n attr.size = 4096\n } else if (FS.isFile(node.mode)) {\n attr.size = node.usedBytes\n } else if (FS.isLink(node.mode)) {\n attr.size = node.link.length\n } else {\n attr.size = 0\n }\n attr.atime = new Date(node.timestamp)\n attr.mtime = new Date(node.timestamp)\n attr.ctime = new Date(node.timestamp)\n attr.blksize = 4096\n attr.blocks = Math.ceil(attr.size / attr.blksize)\n return attr\n },\n setattr: function (node, attr) {\n if (attr.mode !== undefined) {\n node.mode = attr.mode\n }\n if (attr.timestamp !== undefined) {\n node.timestamp = attr.timestamp\n }\n if (attr.size !== undefined) {\n MEMFS.resizeFileStorage(node, attr.size)\n }\n },\n lookup: function (parent, name) {\n throw FS.genericErrors[44]\n },\n mknod: function (parent, name, mode, dev) {\n return MEMFS.createNode(parent, name, mode, dev)\n },\n rename: function (old_node, new_dir, new_name) {\n if (FS.isDir(old_node.mode)) {\n var new_node\n try {\n new_node = FS.lookupNode(new_dir, new_name)\n } catch (e) {}\n if (new_node) {\n for (var i in new_node.contents) {\n throw new FS.ErrnoError(55)\n }\n }\n }\n delete old_node.parent.contents[old_node.name]\n old_node.parent.timestamp = Date.now()\n old_node.name = new_name\n new_dir.contents[new_name] = old_node\n new_dir.timestamp = old_node.parent.timestamp\n old_node.parent = new_dir\n },\n unlink: function (parent, name) {\n delete parent.contents[name]\n parent.timestamp = Date.now()\n },\n rmdir: function (parent, name) {\n var node = FS.lookupNode(parent, name)\n for (var i in node.contents) {\n throw new FS.ErrnoError(55)\n }\n delete parent.contents[name]\n parent.timestamp = Date.now()\n },\n readdir: function (node) {\n var entries = ['.', '..']\n for (var key in node.contents) {\n if (!node.contents.hasOwnProperty(key)) {\n continue\n }\n entries.push(key)\n }\n return entries\n },\n symlink: function (parent, newname, oldpath) {\n var node = MEMFS.createNode(parent, newname, 511 | 40960, 0)\n node.link = oldpath\n return node\n },\n readlink: function (node) {\n if (!FS.isLink(node.mode)) {\n throw new FS.ErrnoError(28)\n }\n return node.link\n }\n },\n stream_ops: {\n read: function (stream, buffer, offset, length, position) {\n var contents = stream.node.contents\n if (position >= stream.node.usedBytes) return 0\n var size = Math.min(stream.node.usedBytes - position, length)\n if (size > 8 && contents.subarray) {\n buffer.set(contents.subarray(position, position + size), offset)\n } else {\n for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]\n }\n return size\n },\n write: function (stream, buffer, offset, length, position, canOwn) {\n if (!length) return 0\n var node = stream.node\n node.timestamp = Date.now()\n if (buffer.subarray && (!node.contents || node.contents.subarray)) {\n if (canOwn) {\n node.contents = buffer.subarray(offset, offset + length)\n node.usedBytes = length\n return length\n } else if (node.usedBytes === 0 && position === 0) {\n node.contents = buffer.slice(offset, offset + length)\n node.usedBytes = length\n return length\n } else if (position + length <= node.usedBytes) {\n node.contents.set(buffer.subarray(offset, offset + length), position)\n return length\n }\n }\n MEMFS.expandFileStorage(node, position + length)\n if (node.contents.subarray && buffer.subarray) {\n node.contents.set(buffer.subarray(offset, offset + length), position)\n } else {\n for (var i = 0; i < length; i++) {\n node.contents[position + i] = buffer[offset + i]\n }\n }\n node.usedBytes = Math.max(node.usedBytes, position + length)\n return length\n },\n llseek: function (stream, offset, whence) {\n var position = offset\n if (whence === 1) {\n position += stream.position\n } else if (whence === 2) {\n if (FS.isFile(stream.node.mode)) {\n position += stream.node.usedBytes\n }\n }\n if (position < 0) {\n throw new FS.ErrnoError(28)\n }\n return position\n },\n allocate: function (stream, offset, length) {\n MEMFS.expandFileStorage(stream.node, offset + length)\n stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length)\n },\n mmap: function (stream, length, position, prot, flags) {\n if (!FS.isFile(stream.node.mode)) {\n throw new FS.ErrnoError(43)\n }\n var ptr\n var allocated\n var contents = stream.node.contents\n if (!(flags & 2) && contents.buffer === buffer) {\n allocated = false\n ptr = contents.byteOffset\n } else {\n if (position > 0 || position + length < contents.length) {\n if (contents.subarray) {\n contents = contents.subarray(position, position + length)\n } else {\n contents = Array.prototype.slice.call(contents, position, position + length)\n }\n }\n allocated = true\n ptr = mmapAlloc(length)\n if (!ptr) {\n throw new FS.ErrnoError(48)\n }\n HEAP8.set(contents, ptr)\n }\n return { ptr: ptr, allocated: allocated }\n },\n msync: function (stream, buffer, offset, length, mmapFlags) {\n MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false)\n return 0\n }\n }\n }\n function asyncLoad(url, onload, onerror, noRunDep) {\n var dep = !noRunDep ? getUniqueRunDependency('al ' + url) : ''\n readAsync(\n url,\n (arrayBuffer) => {\n assert(arrayBuffer, 'Loading data file \"' + url + '\" failed (no arrayBuffer).')\n onload(new Uint8Array(arrayBuffer))\n if (dep) removeRunDependency(dep)\n },\n (event) => {\n if (onerror) {\n onerror()\n } else {\n throw 'Loading data file \"' + url + '\" failed.'\n }\n }\n )\n if (dep) addRunDependency(dep)\n }\n var FS = {\n root: null,\n mounts: [],\n devices: {},\n streams: [],\n nextInode: 1,\n nameTable: null,\n currentPath: '/',\n initialized: false,\n ignorePermissions: true,\n ErrnoError: null,\n genericErrors: {},\n filesystems: null,\n syncFSRequests: 0,\n lookupPath: (path, opts = {}) => {\n path = PATH_FS.resolve(FS.cwd(), path)\n if (!path) return { path: '', node: null }\n var defaults = { follow_mount: true, recurse_count: 0 }\n opts = Object.assign(defaults, opts)\n if (opts.recurse_count > 8) {\n throw new FS.ErrnoError(32)\n }\n var parts = PATH.normalizeArray(\n path.split('/').filter((p) => !!p),\n false\n )\n var current = FS.root\n var current_path = '/'\n for (var i = 0; i < parts.length; i++) {\n var islast = i === parts.length - 1\n if (islast && opts.parent) {\n break\n }\n current = FS.lookupNode(current, parts[i])\n current_path = PATH.join2(current_path, parts[i])\n if (FS.isMountpoint(current)) {\n if (!islast || (islast && opts.follow_mount)) {\n current = current.mounted.root\n }\n }\n if (!islast || opts.follow) {\n var count = 0\n while (FS.isLink(current.mode)) {\n var link = FS.readlink(current_path)\n current_path = PATH_FS.resolve(PATH.dirname(current_path), link)\n var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count + 1 })\n current = lookup.node\n if (count++ > 40) {\n throw new FS.ErrnoError(32)\n }\n }\n }\n }\n return { path: current_path, node: current }\n },\n getPath: (node) => {\n var path\n while (true) {\n if (FS.isRoot(node)) {\n var mount = node.mount.mountpoint\n if (!path) return mount\n return mount[mount.length - 1] !== '/' ? mount + '/' + path : mount + path\n }\n path = path ? node.name + '/' + path : node.name\n node = node.parent\n }\n },\n hashName: (parentid, name) => {\n var hash = 0\n for (var i = 0; i < name.length; i++) {\n hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0\n }\n return ((parentid + hash) >>> 0) % FS.nameTable.length\n },\n hashAddNode: (node) => {\n var hash = FS.hashName(node.parent.id, node.name)\n node.name_next = FS.nameTable[hash]\n FS.nameTable[hash] = node\n },\n hashRemoveNode: (node) => {\n var hash = FS.hashName(node.parent.id, node.name)\n if (FS.nameTable[hash] === node) {\n FS.nameTable[hash] = node.name_next\n } else {\n var current = FS.nameTable[hash]\n while (current) {\n if (current.name_next === node) {\n current.name_next = node.name_next\n break\n }\n current = current.name_next\n }\n }\n },\n lookupNode: (parent, name) => {\n var errCode = FS.mayLookup(parent)\n if (errCode) {\n throw new FS.ErrnoError(errCode, parent)\n }\n var hash = FS.hashName(parent.id, name)\n for (var node = FS.nameTable[hash]; node; node = node.name_next) {\n var nodeName = node.name\n if (node.parent.id === parent.id && nodeName === name) {\n return node\n }\n }\n return FS.lookup(parent, name)\n },\n createNode: (parent, name, mode, rdev) => {\n var node = new FS.FSNode(parent, name, mode, rdev)\n FS.hashAddNode(node)\n return node\n },\n destroyNode: (node) => {\n FS.hashRemoveNode(node)\n },\n isRoot: (node) => {\n return node === node.parent\n },\n isMountpoint: (node) => {\n return !!node.mounted\n },\n isFile: (mode) => {\n return (mode & 61440) === 32768\n },\n isDir: (mode) => {\n return (mode & 61440) === 16384\n },\n isLink: (mode) => {\n return (mode & 61440) === 40960\n },\n isChrdev: (mode) => {\n return (mode & 61440) === 8192\n },\n isBlkdev: (mode) => {\n return (mode & 61440) === 24576\n },\n isFIFO: (mode) => {\n return (mode & 61440) === 4096\n },\n isSocket: (mode) => {\n return (mode & 49152) === 49152\n },\n flagModes: { r: 0, 'r+': 2, w: 577, 'w+': 578, a: 1089, 'a+': 1090 },\n modeStringToFlags: (str) => {\n var flags = FS.flagModes[str]\n if (typeof flags == 'undefined') {\n throw new Error('Unknown file open mode: ' + str)\n }\n return flags\n },\n flagsToPermissionString: (flag) => {\n var perms = ['r', 'w', 'rw'][flag & 3]\n if (flag & 512) {\n perms += 'w'\n }\n return perms\n },\n nodePermissions: (node, perms) => {\n if (FS.ignorePermissions) {\n return 0\n }\n if (perms.includes('r') && !(node.mode & 292)) {\n return 2\n } else if (perms.includes('w') && !(node.mode & 146)) {\n return 2\n } else if (perms.includes('x') && !(node.mode & 73)) {\n return 2\n }\n return 0\n },\n mayLookup: (dir) => {\n var errCode = FS.nodePermissions(dir, 'x')\n if (errCode) return errCode\n if (!dir.node_ops.lookup) return 2\n return 0\n },\n mayCreate: (dir, name) => {\n try {\n var node = FS.lookupNode(dir, name)\n return 20\n } catch (e) {}\n return FS.nodePermissions(dir, 'wx')\n },\n mayDelete: (dir, name, isdir) => {\n var node\n try {\n node = FS.lookupNode(dir, name)\n } catch (e) {\n return e.errno\n }\n var errCode = FS.nodePermissions(dir, 'wx')\n if (errCode) {\n return errCode\n }\n if (isdir) {\n if (!FS.isDir(node.mode)) {\n return 54\n }\n if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {\n return 10\n }\n } else {\n if (FS.isDir(node.mode)) {\n return 31\n }\n }\n return 0\n },\n mayOpen: (node, flags) => {\n if (!node) {\n return 44\n }\n if (FS.isLink(node.mode)) {\n return 32\n } else if (FS.isDir(node.mode)) {\n if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) {\n return 31\n }\n }\n return FS.nodePermissions(node, FS.flagsToPermissionString(flags)