Path: blob/main/projects/tunnel-rush/tunnel_rush_v9wasmframework.unityweb
1828 views
UnityLoader["2a4956e740b59b60b50e2d9d9e786bda"]=(function(Module) { Module['preRun'].push(function (){ // Initialize the IndexedDB based file system. Module['unityFileSystemInit'] allows // developers to override this with their own function, when they want to do cloud storage // instead. var unityFileSystemInit = Module['unityFileSystemInit'] || function (){ if (!Module.indexedDB) { console.log('IndexedDB is not available. Data will not persist in cache and PlayerPrefs will not be saved.'); } FS.mkdir('/idbfs'); FS.mount(IDBFS, {}, '/idbfs'); Module.addRunDependency('JS_FileSystem_Mount'); FS.syncfs(true, function (err) { Module.removeRunDependency('JS_FileSystem_Mount'); }); }; unityFileSystemInit(); }); Module["SetFullscreen"] = function (fullscreen) { if (typeof runtimeInitialized === 'undefined' || !runtimeInitialized) { console.log ("Runtime not initialized yet."); } else if (typeof JSEvents === 'undefined') { console.log ("Player not loaded yet."); } else { var tmp = JSEvents.canPerformEventHandlerRequests; JSEvents.canPerformEventHandlerRequests = function () { return 1; }; Module.ccall("SetFullscreen", null, ["number"], [fullscreen]); JSEvents.canPerformEventHandlerRequests = tmp; } }; // The following code overrides the default Emscripten instantiation of the WebAssembly module // as a workaround for incorrectly initialized Runtime object properties // (module export is not available at launch time if the module is compiled asynchronously). // This file should be removed as soon as this bug is fixed in Emscripten. integrateWasmJS = function integrateWasmJS(Module) { // wasm.js has several methods for creating the compiled code module here: // * 'native-wasm' : use native WebAssembly support in the browser // * 'interpret-s-expr': load s-expression code from a .wast and interpret // * 'interpret-binary': load binary wasm and interpret // * 'interpret-asm2wasm': load asm.js code, translate to wasm, and interpret // * 'asmjs': no wasm, just load the asm.js code and use that (good for testing) // The method can be set at compile time (BINARYEN_METHOD), or runtime by setting Module['wasmJSMethod']. // The method can be a comma-separated list, in which case, we will try the // options one by one. Some of them can fail gracefully, and then we can try // the next. // inputs var method = Module['wasmJSMethod'] || 'native-wasm'; Module['wasmJSMethod'] = method; var wasmTextFile = Module['wasmTextFile'] || 'build.wast'; var wasmBinaryFile = Module['wasmBinaryFile'] || 'build.wasm'; var asmjsCodeFile = Module['asmjsCodeFile'] || 'build.asm.js'; // utilities var wasmPageSize = 64*1024; var asm2wasmImports = { // special asm2wasm imports "f64-rem": function(x, y) { return x % y; }, "f64-to-int": function(x) { return x | 0; }, "i32s-div": function(x, y) { return ((x | 0) / (y | 0)) | 0; }, "i32u-div": function(x, y) { return ((x >>> 0) / (y >>> 0)) >>> 0; }, "i32s-rem": function(x, y) { return ((x | 0) % (y | 0)) | 0; }, "i32u-rem": function(x, y) { return ((x >>> 0) % (y >>> 0)) >>> 0; }, "debugger": function() { debugger; }, }; var info = { 'global': null, 'env': null, 'asm2wasm': asm2wasmImports, 'parent': Module // Module inside wasm-js.cpp refers to wasm-js.cpp; this allows access to the outside program. }; var exports = null; function lookupImport(mod, base) { var lookup = info; if (mod.indexOf('.') < 0) { lookup = (lookup || {})[mod]; } else { var parts = mod.split('.'); lookup = (lookup || {})[parts[0]]; lookup = (lookup || {})[parts[1]]; } if (base) { lookup = (lookup || {})[base]; } if (lookup === undefined) { abort('bad lookupImport to (' + mod + ').' + base); } return lookup; } function mergeMemory(newBuffer) { // The wasm instance creates its memory. But static init code might have written to // buffer already, including the mem init file, and we must copy it over in a proper merge. // TODO: avoid this copy, by avoiding such static init writes // TODO: in shorter term, just copy up to the last static init write var oldBuffer = Module['buffer']; if (newBuffer.byteLength < oldBuffer.byteLength) { Module['printErr']('the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here'); } var oldView = new Int8Array(oldBuffer); var newView = new Int8Array(newBuffer); // If we have a mem init file, do not trample it if (!memoryInitializer) { oldView.set(newView.subarray(Module['STATIC_BASE'], Module['STATIC_BASE'] + Module['STATIC_BUMP']), Module['STATIC_BASE']); } newView.set(oldView); updateGlobalBuffer(newBuffer); updateGlobalBufferViews(); } var WasmTypes = { none: 0, i32: 1, i64: 2, f32: 3, f64: 4 }; function fixImports(imports) { if (!0) return imports; var ret = {}; for (var i in imports) { var fixed = i; if (fixed[0] == '_') fixed = fixed.substr(1); ret[fixed] = imports[i]; } return ret; } function getBinary() { var binary; if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { binary = Module['wasmBinary']; assert(binary, "on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)"); binary = new Uint8Array(binary); } else { binary = Module['readBinary'](wasmBinaryFile); } return binary; } // do-method functions function doJustAsm(global, env, providedBuffer) { // if no Module.asm, or it's the method handler helper (see below), then apply // the asmjs if (typeof Module['asm'] !== 'function' || Module['asm'] === methodHandler) { if (!Module['asmPreload']) { // you can load the .asm.js file before this, to avoid this sync xhr and eval eval(Module['read'](asmjsCodeFile)); // set Module.asm } else { Module['asm'] = Module['asmPreload']; } } if (typeof Module['asm'] !== 'function') { Module['printErr']('asm evalling did not set the module properly'); return false; } return Module['asm'](global, env, providedBuffer); } function doNativeWasm(global, env, providedBuffer) { if (typeof WebAssembly !== 'object') { Module['printErr']('no native wasm support detected'); return false; } // prepare memory import if (!(Module['wasmMemory'] instanceof WebAssembly.Memory)) { Module['printErr']('no native wasm Memory in use'); return false; } env['memory'] = Module['wasmMemory']; // Load the wasm module and create an instance of using native support in the JS engine. info['global'] = { 'NaN': NaN, 'Infinity': Infinity }; info['global.Math'] = global.Math; info['env'] = env; // handle a generated wasm instance, receiving its exports and // performing other necessary setup function receiveInstance(instance) { exports = instance.exports; if (exports.memory) mergeMemory(exports.memory); Module["usingWasm"] = true; } Module['print']('asynchronously preparing wasm'); addRunDependency('wasm-instantiate'); // we can't run yet WebAssembly.instantiate(getBinary(), info).then(function(output) { receiveInstance(output.instance); asm = Module['asm'] = exports; // swap in the exports so they can be called Runtime.stackAlloc = exports['stackAlloc']; Runtime.stackSave = exports['stackSave']; Runtime.stackRestore = exports['stackRestore']; Runtime.establishStackSpace = exports['establishStackSpace']; Runtime.setTempRet0 = exports['setTempRet0']; Runtime.getTempRet0 = exports['getTempRet0']; removeRunDependency('wasm-instantiate'); }); return {}; // no exports yet; we'll fill them in later var instance; try { instance = new WebAssembly.Instance(new WebAssembly.Module(getBinary()), info) } catch (e) { Module['printErr']('failed to compile wasm module: ' + e); if (e.toString().indexOf('imported Memory with incompatible size') >= 0) { Module['printErr']('Memory size incompatibility issues may be due to changing TOTAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set TOTAL_MEMORY at runtime to something smaller than it was at compile time).'); } return false; } receiveInstance(instance); return exports; } function doWasmPolyfill(global, env, providedBuffer, method) { if (typeof WasmJS !== 'function') { Module['printErr']('WasmJS not detected - polyfill not bundled?'); return false; } // Use wasm.js to polyfill and execute code in a wasm interpreter. var wasmJS = WasmJS({}); // XXX don't be confused. Module here is in the outside program. wasmJS is the inner wasm-js.cpp. wasmJS['outside'] = Module; // Inside wasm-js.cpp, Module['outside'] reaches the outside module. // Information for the instance of the module. wasmJS['info'] = info; wasmJS['lookupImport'] = lookupImport; assert(providedBuffer === Module['buffer']); // we should not even need to pass it as a 3rd arg for wasm, but that's the asm.js way. info.global = global; info.env = env; // polyfill interpreter expects an ArrayBuffer assert(providedBuffer === Module['buffer']); env['memory'] = providedBuffer; assert(env['memory'] instanceof ArrayBuffer); wasmJS['providedTotalMemory'] = Module['buffer'].byteLength; // Prepare to generate wasm, using either asm2wasm or s-exprs var code; if (method === 'interpret-binary') { code = getBinary(); } else { code = Module['read'](method == 'interpret-asm2wasm' ? asmjsCodeFile : wasmTextFile); } var temp; if (method == 'interpret-asm2wasm') { temp = wasmJS['_malloc'](code.length + 1); wasmJS['writeAsciiToMemory'](code, temp); wasmJS['_load_asm2wasm'](temp); } else if (method === 'interpret-s-expr') { temp = wasmJS['_malloc'](code.length + 1); wasmJS['writeAsciiToMemory'](code, temp); wasmJS['_load_s_expr2wasm'](temp); } else if (method === 'interpret-binary') { temp = wasmJS['_malloc'](code.length); wasmJS['HEAPU8'].set(code, temp); wasmJS['_load_binary2wasm'](temp, code.length); } else { throw 'what? ' + method; } wasmJS['_free'](temp); wasmJS['_instantiate'](temp); if (Module['newBuffer']) { mergeMemory(Module['newBuffer']); Module['newBuffer'] = null; } exports = wasmJS['asmExports']; return exports; } // We may have a preloaded value in Module.asm, save it Module['asmPreload'] = Module['asm']; // Memory growth integration code Module['reallocBuffer'] = function(size) { size = Math.ceil(size / wasmPageSize) * wasmPageSize; // round up to wasm page size var old = Module['buffer']; var result = exports['__growWasmMemory'](size / wasmPageSize); // tiny wasm method that just does grow_memory if (Module["usingWasm"]) { if (result !== (-1 | 0)) { // success in native wasm memory growth, get the buffer from the memory return Module['buffer'] = Module['wasmMemory'].buffer; } else { return null; } } else { // in interpreter, we replace Module.buffer if we allocate return Module['buffer'] !== old ? Module['buffer'] : null; // if it was reallocated, it changed } }; // Provide an "asm.js function" for the application, called to "link" the asm.js module. We instantiate // the wasm module at that time, and it receives imports and provides exports and so forth, the app // doesn't need to care that it is wasm or olyfilled wasm or asm.js. Module['asm'] = function(global, env, providedBuffer) { global = fixImports(global); env = fixImports(env); // import table if (!env['table']) { var TABLE_SIZE = Module['wasmTableSize']; if (TABLE_SIZE === undefined) TABLE_SIZE = 1024; // works in binaryen interpreter at least var MAX_TABLE_SIZE = Module['wasmMaxTableSize']; if (typeof WebAssembly === 'object' && typeof WebAssembly.Table === 'function') { if (MAX_TABLE_SIZE !== undefined) { env['table'] = new WebAssembly.Table({ initial: TABLE_SIZE, maximum: MAX_TABLE_SIZE, element: 'anyfunc' }); } else { env['table'] = new WebAssembly.Table({ initial: TABLE_SIZE, element: 'anyfunc' }); } } else { env['table'] = new Array(TABLE_SIZE); // works in binaryen interpreter at least } Module['wasmTable'] = env['table']; } if (!env['memoryBase']) { env['memoryBase'] = Module['STATIC_BASE']; // tell the memory segments where to place themselves } if (!env['tableBase']) { env['tableBase'] = 0; // table starts at 0 by default, in dynamic linking this will change } // try the methods. each should return the exports if it succeeded var exports; var methods = method.split(','); for (var i = 0; i < methods.length; i++) { var curr = methods[i]; Module['print']('trying binaryen method: ' + curr); if (curr === 'native-wasm') { if (exports = doNativeWasm(global, env, providedBuffer)) break; } else if (curr === 'asmjs') { if (exports = doJustAsm(global, env, providedBuffer)) break; } else if (curr === 'interpret-asm2wasm' || curr === 'interpret-s-expr' || curr === 'interpret-binary') { if (exports = doWasmPolyfill(global, env, providedBuffer, curr)) break; } else { throw 'bad method: ' + curr; } } if (!exports) throw 'no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods'; Module['print']('binaryen method succeeded.'); return exports; }; var methodHandler = Module['asm']; // note our method handler, as we may modify Module['asm'] later } Module["demangle"] = demangle || (function (symbol) {return symbol}); var MediaDevices = []; Module['preRun'].push(function () { var enumerateMediaDevices = function () { var getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; if (!getMedia) return; function addDevice(label) { label = label ? label : ("device #" + MediaDevices.length); var device = { deviceName: label, refCount: 0, video: null }; MediaDevices.push(device); } // try MediaDevices.enumerateDevices, if available if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) { if (typeof MediaStreamTrack == 'undefined' || typeof MediaStreamTrack.getSources == 'undefined') { console.log("Media Devices cannot be enumerated on this browser."); return; } function gotSources(sourceInfos) { for (var i = 0; i !== sourceInfos.length; ++i) { var sourceInfo = sourceInfos[i]; if (sourceInfo.kind === 'video') addDevice(sourceInfo.label); } } // MediaStreamTrack.getSources asynchronously returns a list of objects that identify devices // and for privacy purposes the .label properties are not filled in unless the user has consented to // device access through getUserMedia. MediaStreamTrack.getSources(gotSources); } // List cameras and microphones. navigator.mediaDevices.enumerateDevices().then(function(devices) { devices.forEach(function(device) { // device: kind, label, deviceId if (device.kind == 'videoinput') addDevice(device.label); }); }) .catch(function(err) { console.log(err.name + ": " + error.message); }); }; enumerateMediaDevices(); }); function SendMessage(gameObject, func, param) { if (param === undefined) Module.ccall("SendMessage", null, ["string", "string"], [gameObject, func]); else if (typeof param === "string") Module.ccall("SendMessageString", null, ["string", "string", "string"], [gameObject, func, param]); else if (typeof param === "number") Module.ccall("SendMessageFloat", null, ["string", "string", "number"], [gameObject, func, param]); else throw "" + param + " is does not have a type which is supported by SendMessage."; } Module["SendMessage"] = SendMessage; // to avoid emscripten stripping // The Module object: Our interface to the outside world. We import // and export values on it, and do the work to get that through // closure compiler if necessary. There are various ways Module can be used: // 1. Not defined. We create it here // 2. A function parameter, function(Module) { ..generated code.. } // 3. pre-run appended it, var Module = {}; ..generated code.. // 4. External script tag defines var Module. // We need to do an eval in order to handle the closure compiler // case, where this code here is minified but Module was defined // elsewhere (e.g. case 4 above). We also need to check if Module // already exists (e.g. case 3 above). // Note that if you want to run closure, and also to use Module // after the generated code, you will need to define var Module = {}; // before the code. Then that object will be used in the code, and you // can continue to use Module afterwards as well. var Module; if (!Module) Module = (typeof Module !== 'undefined' ? Module : null) || {}; // Sometimes an existing Module object exists with properties // meant to overwrite the default module functionality. Here // we collect those properties and reapply _after_ we configure // the current environment's defaults to avoid having to be so // defensive during initialization. var moduleOverrides = {}; for (var key in Module) { if (Module.hasOwnProperty(key)) { moduleOverrides[key] = Module[key]; } } // The environment setup code below is customized to use Module. // *** Environment setup code *** var ENVIRONMENT_IS_WEB = false; var ENVIRONMENT_IS_WORKER = false; var ENVIRONMENT_IS_NODE = false; var ENVIRONMENT_IS_SHELL = false; // Three configurations we can be running in: // 1) We could be the application main() thread running in the main JS UI thread. (ENVIRONMENT_IS_WORKER == false and ENVIRONMENT_IS_PTHREAD == false) // 2) We could be the application main() thread proxied to worker. (with Emscripten -s PROXY_TO_WORKER=1) (ENVIRONMENT_IS_WORKER == true, ENVIRONMENT_IS_PTHREAD == false) // 3) We could be an application pthread running in a worker. (ENVIRONMENT_IS_WORKER == true and ENVIRONMENT_IS_PTHREAD == true) if (Module['ENVIRONMENT']) { if (Module['ENVIRONMENT'] === 'WEB') { ENVIRONMENT_IS_WEB = true; } else if (Module['ENVIRONMENT'] === 'WORKER') { ENVIRONMENT_IS_WORKER = true; } else if (Module['ENVIRONMENT'] === 'NODE') { ENVIRONMENT_IS_NODE = true; } else if (Module['ENVIRONMENT'] === 'SHELL') { ENVIRONMENT_IS_SHELL = true; } else { throw new Error('The provided Module[\'ENVIRONMENT\'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.'); } } else { ENVIRONMENT_IS_WEB = typeof window === 'object'; ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function' && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER; ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; } if (ENVIRONMENT_IS_NODE) { // Expose functionality in the same simple way that the shells work // Note that we pollute the global namespace here, otherwise we break in node if (!Module['print']) Module['print'] = console.log; if (!Module['printErr']) Module['printErr'] = console.warn; var nodeFS; var nodePath; Module['read'] = function read(filename, binary) { if (!nodeFS) nodeFS = require('fs'); if (!nodePath) nodePath = require('path'); filename = nodePath['normalize'](filename); var ret = nodeFS['readFileSync'](filename); return binary ? ret : ret.toString(); }; Module['readBinary'] = function readBinary(filename) { var ret = Module['read'](filename, true); if (!ret.buffer) { ret = new Uint8Array(ret); } assert(ret.buffer); return ret; }; Module['load'] = function load(f) { globalEval(read(f)); }; if (!Module['thisProgram']) { if (process['argv'].length > 1) { Module['thisProgram'] = process['argv'][1].replace(/\\/g, '/'); } else { Module['thisProgram'] = 'unknown-program'; } } Module['arguments'] = process['argv'].slice(2); if (typeof module !== 'undefined') { module['exports'] = Module; } process['on']('uncaughtException', function(ex) { // suppress ExitStatus exceptions from showing an error if (!(ex instanceof ExitStatus)) { throw ex; } }); Module['inspect'] = function () { return '[Emscripten Module object]'; }; } else if (ENVIRONMENT_IS_SHELL) { if (!Module['print']) Module['print'] = print; if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm if (typeof read != 'undefined') { Module['read'] = read; } else { Module['read'] = function read() { throw 'no read() available' }; } Module['readBinary'] = function readBinary(f) { if (typeof readbuffer === 'function') { return new Uint8Array(readbuffer(f)); } var data = read(f, 'binary'); assert(typeof data === 'object'); return data; }; if (typeof scriptArgs != 'undefined') { Module['arguments'] = scriptArgs; } else if (typeof arguments != 'undefined') { Module['arguments'] = arguments; } } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { Module['read'] = function read(url) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.send(null); return xhr.responseText; }; Module['readAsync'] = function readAsync(url, onload, onerror) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = function xhr_onload() { if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 onload(xhr.response); } else { onerror(); } }; xhr.onerror = onerror; xhr.send(null); }; if (typeof arguments != 'undefined') { Module['arguments'] = arguments; } if (typeof console !== 'undefined') { if (!Module['print']) Module['print'] = function print(x) { console.log(x); }; if (!Module['printErr']) Module['printErr'] = function printErr(x) { console.warn(x); }; } else { // Probably a worker, and without console.log. We can do very little here... var TRY_USE_DUMP = false; if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== "undefined") ? (function(x) { dump(x); }) : (function(x) { // self.postMessage(x); // enable this if you want stdout to be sent as messages })); } if (ENVIRONMENT_IS_WORKER) { Module['load'] = importScripts; } if (typeof Module['setWindowTitle'] === 'undefined') { Module['setWindowTitle'] = function(title) { document.title = title }; } } else { // Unreachable because SHELL is dependant on the others throw 'Unknown runtime environment. Where are we?'; } function globalEval(x) { eval.call(null, x); } if (!Module['load'] && Module['read']) { Module['load'] = function load(f) { globalEval(Module['read'](f)); }; } if (!Module['print']) { Module['print'] = function(){}; } if (!Module['printErr']) { Module['printErr'] = Module['print']; } if (!Module['arguments']) { Module['arguments'] = []; } if (!Module['thisProgram']) { Module['thisProgram'] = './this.program'; } // *** Environment setup code *** // Closure helpers Module.print = Module['print']; Module.printErr = Module['printErr']; // Callbacks Module['preRun'] = []; Module['postRun'] = []; // Merge back in the overrides for (var key in moduleOverrides) { if (moduleOverrides.hasOwnProperty(key)) { Module[key] = moduleOverrides[key]; } } // Free the object hierarchy contained in the overrides, this lets the GC // reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. moduleOverrides = undefined; // {{PREAMBLE_ADDITIONS}} // === Preamble library stuff === // Documentation for the public APIs defined in this file must be updated in: // site/source/docs/api_reference/preamble.js.rst // A prebuilt local version of the documentation is available at: // site/build/text/docs/api_reference/preamble.js.txt // You can also build docs locally as HTML or other formats in site/ // An online HTML version (which may be of a different version of Emscripten) // is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html //======================================== // Runtime code shared with compiler //======================================== var Runtime = { setTempRet0: function (value) { tempRet0 = value; }, getTempRet0: function () { return tempRet0; }, stackSave: function () { return STACKTOP; }, stackRestore: function (stackTop) { STACKTOP = stackTop; }, getNativeTypeSize: function (type) { switch (type) { case 'i1': case 'i8': return 1; case 'i16': return 2; case 'i32': return 4; case 'i64': return 8; case 'float': return 4; case 'double': return 8; default: { if (type[type.length-1] === '*') { return Runtime.QUANTUM_SIZE; // A pointer } else if (type[0] === 'i') { var bits = parseInt(type.substr(1)); assert(bits % 8 === 0); return bits/8; } else { return 0; } } } }, getNativeFieldSize: function (type) { return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE); }, STACK_ALIGN: 16, prepVararg: function (ptr, type) { if (type === 'double' || type === 'i64') { // move so the load is aligned if (ptr & 7) { assert((ptr & 7) === 4); ptr += 4; } } else { assert((ptr & 3) === 0); } return ptr; }, getAlignSize: function (type, size, vararg) { // we align i64s and doubles on 64-bit boundaries, unlike x86 if (!vararg && (type == 'i64' || type == 'double')) return 8; if (!type) return Math.min(size, 8); // align structures internally to 64 bits return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE); }, dynCall: function (sig, ptr, args) { if (args && args.length) { return Module['dynCall_' + sig].apply(null, [ptr].concat(args)); } else { return Module['dynCall_' + sig].call(null, ptr); } }, functionPointers: [], addFunction: function (func) { for (var i = 0; i < Runtime.functionPointers.length; i++) { if (!Runtime.functionPointers[i]) { Runtime.functionPointers[i] = func; return 2*(1 + i); } } throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.'; }, removeFunction: function (index) { Runtime.functionPointers[(index-2)/2] = null; }, warnOnce: function (text) { if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {}; if (!Runtime.warnOnce.shown[text]) { Runtime.warnOnce.shown[text] = 1; Module.printErr(text); } }, funcWrappers: {}, getFuncWrapper: function (func, sig) { assert(sig); if (!Runtime.funcWrappers[sig]) { Runtime.funcWrappers[sig] = {}; } var sigCache = Runtime.funcWrappers[sig]; if (!sigCache[func]) { // optimize away arguments usage in common cases if (sig.length === 1) { sigCache[func] = function dynCall_wrapper() { return Runtime.dynCall(sig, func); }; } else if (sig.length === 2) { sigCache[func] = function dynCall_wrapper(arg) { return Runtime.dynCall(sig, func, [arg]); }; } else { // general case sigCache[func] = function dynCall_wrapper() { return Runtime.dynCall(sig, func, Array.prototype.slice.call(arguments)); }; } } return sigCache[func]; }, getCompilerSetting: function (name) { throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work'; }, stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+15)&-16); return ret; }, staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+15)&-16); return ret; }, dynamicAlloc: function (size) { var ret = HEAP32[DYNAMICTOP_PTR>>2];var end = (((ret + size + 15)|0) & -16);HEAP32[DYNAMICTOP_PTR>>2] = end;if (end >= TOTAL_MEMORY) {var success = enlargeMemory();if (!success) {HEAP32[DYNAMICTOP_PTR>>2] = ret;return 0;}}return ret;}, alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 16))*(quantum ? quantum : 16); return ret; }, makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*4294967296.0)) : ((+((low>>>0)))+((+((high|0)))*4294967296.0))); return ret; }, GLOBAL_BASE: 1024, QUANTUM_SIZE: 4, __dummy__: 0 } Module["Runtime"] = Runtime; //======================================== // Runtime essentials //======================================== var ABORT = 0; // whether we are quitting the application. no code should run after this. set in exit() and abort() var EXITSTATUS = 0; function assert(condition, text) { if (!condition) { abort('Assertion failed: ' + text); } } var globalScope = this; // Returns the C function with a specified identifier (for C++, you need to do manual name mangling) function getCFunc(ident) { var func = Module['_' + ident]; // closure exported function if (!func) { try { func = eval('_' + ident); } catch(e) {} } assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)'); return func; } var cwrap, ccall; (function(){ var JSfuncs = { // Helpers for cwrap -- it can't refer to Runtime directly because it might // be renamed by closure, instead it calls JSfuncs['stackSave'].body to find // out what the minified function name is. 'stackSave': function() { Runtime.stackSave() }, 'stackRestore': function() { Runtime.stackRestore() }, // type conversion from js to c 'arrayToC' : function(arr) { var ret = Runtime.stackAlloc(arr.length); writeArrayToMemory(arr, ret); return ret; }, 'stringToC' : function(str) { var ret = 0; if (str !== null && str !== undefined && str !== 0) { // null string // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' var len = (str.length << 2) + 1; ret = Runtime.stackAlloc(len); stringToUTF8(str, ret, len); } return ret; } }; // For fast lookup of conversion functions var toC = {'string' : JSfuncs['stringToC'], 'array' : JSfuncs['arrayToC']}; // C calling interface. ccall = function ccallFunc(ident, returnType, argTypes, args, opts) { var func = getCFunc(ident); var cArgs = []; var stack = 0; if (args) { for (var i = 0; i < args.length; i++) { var converter = toC[argTypes[i]]; if (converter) { if (stack === 0) stack = Runtime.stackSave(); cArgs[i] = converter(args[i]); } else { cArgs[i] = args[i]; } } } var ret = func.apply(null, cArgs); if (returnType === 'string') ret = Pointer_stringify(ret); if (stack !== 0) { if (opts && opts.async) { EmterpreterAsync.asyncFinalizers.push(function() { Runtime.stackRestore(stack); }); return; } Runtime.stackRestore(stack); } return ret; } var sourceRegex = /^function\s*[a-zA-Z$_0-9]*\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/; function parseJSFunc(jsfunc) { // Match the body and the return value of a javascript function source var parsed = jsfunc.toString().match(sourceRegex).slice(1); return {arguments : parsed[0], body : parsed[1], returnValue: parsed[2]} } // sources of useful functions. we create this lazily as it can trigger a source decompression on this entire file var JSsource = null; function ensureJSsource() { if (!JSsource) { JSsource = {}; for (var fun in JSfuncs) { if (JSfuncs.hasOwnProperty(fun)) { // Elements of toCsource are arrays of three items: // the code, and the return value JSsource[fun] = parseJSFunc(JSfuncs[fun]); } } } } cwrap = function cwrap(ident, returnType, argTypes) { argTypes = argTypes || []; var cfunc = getCFunc(ident); // When the function takes numbers and returns a number, we can just return // the original function var numericArgs = argTypes.every(function(type){ return type === 'number'}); var numericRet = (returnType !== 'string'); if ( numericRet && numericArgs) { return cfunc; } // Creation of the arguments list (["$1","$2",...,"$nargs"]) var argNames = argTypes.map(function(x,i){return '$'+i}); var funcstr = "(function(" + argNames.join(',') + ") {"; var nargs = argTypes.length; if (!numericArgs) { // Generate the code needed to convert the arguments from javascript // values to pointers ensureJSsource(); funcstr += 'var stack = ' + JSsource['stackSave'].body + ';'; for (var i = 0; i < nargs; i++) { var arg = argNames[i], type = argTypes[i]; if (type === 'number') continue; var convertCode = JSsource[type + 'ToC']; // [code, return] funcstr += 'var ' + convertCode.arguments + ' = ' + arg + ';'; funcstr += convertCode.body + ';'; funcstr += arg + '=(' + convertCode.returnValue + ');'; } } // When the code is compressed, the name of cfunc is not literally 'cfunc' anymore var cfuncname = parseJSFunc(function(){return cfunc}).returnValue; // Call the function funcstr += 'var ret = ' + cfuncname + '(' + argNames.join(',') + ');'; if (!numericRet) { // Return type can only by 'string' or 'number' // Convert the result to a string var strgfy = parseJSFunc(function(){return Pointer_stringify}).returnValue; funcstr += 'ret = ' + strgfy + '(ret);'; } if (!numericArgs) { // If we had a stack, restore it ensureJSsource(); funcstr += JSsource['stackRestore'].body.replace('()', '(stack)') + ';'; } funcstr += 'return ret})'; return eval(funcstr); }; })(); Module["ccall"] = ccall; Module["cwrap"] = cwrap; function setValue(ptr, value, type, noSafe) { type = type || 'i8'; if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit switch(type) { case 'i1': HEAP8[((ptr)>>0)]=value; break; case 'i8': HEAP8[((ptr)>>0)]=value; break; case 'i16': HEAP16[((ptr)>>1)]=value; break; case 'i32': HEAP32[((ptr)>>2)]=value; break; case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break; case 'float': HEAPF32[((ptr)>>2)]=value; break; case 'double': HEAPF64[((ptr)>>3)]=value; break; default: abort('invalid type for setValue: ' + type); } } Module["setValue"] = setValue; function getValue(ptr, type, noSafe) { type = type || 'i8'; if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit switch(type) { case 'i1': return HEAP8[((ptr)>>0)]; case 'i8': return HEAP8[((ptr)>>0)]; case 'i16': return HEAP16[((ptr)>>1)]; case 'i32': return HEAP32[((ptr)>>2)]; case 'i64': return HEAP32[((ptr)>>2)]; case 'float': return HEAPF32[((ptr)>>2)]; case 'double': return HEAPF64[((ptr)>>3)]; default: abort('invalid type for setValue: ' + type); } return null; } Module["getValue"] = getValue; var ALLOC_NORMAL = 0; // Tries to use _malloc() var ALLOC_STACK = 1; // Lives for the duration of the current function call var ALLOC_STATIC = 2; // Cannot be freed var ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk var ALLOC_NONE = 4; // Do not allocate Module["ALLOC_NORMAL"] = ALLOC_NORMAL; Module["ALLOC_STACK"] = ALLOC_STACK; Module["ALLOC_STATIC"] = ALLOC_STATIC; Module["ALLOC_DYNAMIC"] = ALLOC_DYNAMIC; Module["ALLOC_NONE"] = ALLOC_NONE; // allocate(): This is for internal use. You can use it yourself as well, but the interface // is a little tricky (see docs right below). The reason is that it is optimized // for multiple syntaxes to save space in generated code. So you should // normally not use allocate(), and instead allocate memory using _malloc(), // initialize it with setValue(), and so forth. // @slab: An array of data, or a number. If a number, then the size of the block to allocate, // in *bytes* (note that this is sometimes confusing: the next parameter does not // affect this!) // @types: Either an array of types, one for each byte (or 0 if no type at that position), // or a single type which is used for the entire block. This only matters if there // is initial data - if @slab is a number, then this does not matter at all and is // ignored. // @allocator: How to allocate memory, see ALLOC_* function allocate(slab, types, allocator, ptr) { var zeroinit, size; if (typeof slab === 'number') { zeroinit = true; size = slab; } else { zeroinit = false; size = slab.length; } var singleType = typeof types === 'string' ? types : null; var ret; if (allocator == ALLOC_NONE) { ret = ptr; } else { ret = [typeof _malloc === 'function' ? _malloc : Runtime.staticAlloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length)); } if (zeroinit) { var ptr = ret, stop; assert((ret & 3) == 0); stop = ret + (size & ~3); for (; ptr < stop; ptr += 4) { HEAP32[((ptr)>>2)]=0; } stop = ret + size; while (ptr < stop) { HEAP8[((ptr++)>>0)]=0; } return ret; } if (singleType === 'i8') { if (slab.subarray || slab.slice) { HEAPU8.set(slab, ret); } else { HEAPU8.set(new Uint8Array(slab), ret); } return ret; } var i = 0, type, typeSize, previousType; while (i < size) { var curr = slab[i]; if (typeof curr === 'function') { curr = Runtime.getFunctionIndex(curr); } type = singleType || types[i]; if (type === 0) { i++; continue; } if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later setValue(ret+i, curr, type); // no need to look up size unless type changes, so cache it if (previousType !== type) { typeSize = Runtime.getNativeTypeSize(type); previousType = type; } i += typeSize; } return ret; } Module["allocate"] = allocate; // Allocate memory during any stage of startup - static memory early on, dynamic memory later, malloc when ready function getMemory(size) { if (!staticSealed) return Runtime.staticAlloc(size); if (!runtimeInitialized) return Runtime.dynamicAlloc(size); return _malloc(size); } Module["getMemory"] = getMemory; function Pointer_stringify(ptr, /* optional */ length) { if (length === 0 || !ptr) return ''; // TODO: use TextDecoder // Find the length, and check for UTF while doing so var hasUtf = 0; var t; var i = 0; while (1) { t = HEAPU8[(((ptr)+(i))>>0)]; hasUtf |= t; if (t == 0 && !length) break; i++; if (length && i == length) break; } if (!length) length = i; var ret = ''; if (hasUtf < 128) { var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack var curr; while (length > 0) { curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK))); ret = ret ? ret + curr : curr; ptr += MAX_CHUNK; length -= MAX_CHUNK; } return ret; } return Module['UTF8ToString'](ptr); } Module["Pointer_stringify"] = Pointer_stringify; // Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns // a copy of that string as a Javascript String object. function AsciiToString(ptr) { var str = ''; while (1) { var ch = HEAP8[((ptr++)>>0)]; if (!ch) return str; str += String.fromCharCode(ch); } } Module["AsciiToString"] = AsciiToString; // Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', // null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. function stringToAscii(str, outPtr) { return writeAsciiToMemory(str, outPtr, false); } Module["stringToAscii"] = stringToAscii; // Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns // a copy of that string as a Javascript String object. var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined; function UTF8ArrayToString(u8Array, idx) { var endPtr = idx; // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. while (u8Array[endPtr]) ++endPtr; if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) { return UTF8Decoder.decode(u8Array.subarray(idx, endPtr)); } else { var u0, u1, u2, u3, u4, u5; var str = ''; while (1) { // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 u0 = u8Array[idx++]; if (!u0) return str; if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } u1 = u8Array[idx++] & 63; if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } u2 = u8Array[idx++] & 63; if ((u0 & 0xF0) == 0xE0) { u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; } else { u3 = u8Array[idx++] & 63; if ((u0 & 0xF8) == 0xF0) { u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | u3; } else { u4 = u8Array[idx++] & 63; if ((u0 & 0xFC) == 0xF8) { u0 = ((u0 & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4; } else { u5 = u8Array[idx++] & 63; u0 = ((u0 & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5; } } } if (u0 < 0x10000) { str += String.fromCharCode(u0); } else { var ch = u0 - 0x10000; str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); } } } } Module["UTF8ArrayToString"] = UTF8ArrayToString; // Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns // a copy of that string as a Javascript String object. function UTF8ToString(ptr) { return UTF8ArrayToString(HEAPU8,ptr); } Module["UTF8ToString"] = UTF8ToString; // Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', // encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. // Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. // Parameters: // str: the Javascript string to copy. // outU8Array: the array to copy to. Each index in this array is assumed to be one 8-byte element. // outIdx: The starting offset in the array to begin the copying. // maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null // terminator, i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. // maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. // Returns the number of bytes written, EXCLUDING the null terminator. function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) { if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. return 0; var startIdx = outIdx; var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. for (var i = 0; i < str.length; ++i) { // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. // See http://unicode.org/faq/utf_bom.html#utf16-3 // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 var u = str.charCodeAt(i); // possibly a lead surrogate if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); if (u <= 0x7F) { if (outIdx >= endIdx) break; outU8Array[outIdx++] = u; } else if (u <= 0x7FF) { if (outIdx + 1 >= endIdx) break; outU8Array[outIdx++] = 0xC0 | (u >> 6); outU8Array[outIdx++] = 0x80 | (u & 63); } else if (u <= 0xFFFF) { if (outIdx + 2 >= endIdx) break; outU8Array[outIdx++] = 0xE0 | (u >> 12); outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); outU8Array[outIdx++] = 0x80 | (u & 63); } else if (u <= 0x1FFFFF) { if (outIdx + 3 >= endIdx) break; outU8Array[outIdx++] = 0xF0 | (u >> 18); outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); outU8Array[outIdx++] = 0x80 | (u & 63); } else if (u <= 0x3FFFFFF) { if (outIdx + 4 >= endIdx) break; outU8Array[outIdx++] = 0xF8 | (u >> 24); outU8Array[outIdx++] = 0x80 | ((u >> 18) & 63); outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); outU8Array[outIdx++] = 0x80 | (u & 63); } else { if (outIdx + 5 >= endIdx) break; outU8Array[outIdx++] = 0xFC | (u >> 30); outU8Array[outIdx++] = 0x80 | ((u >> 24) & 63); outU8Array[outIdx++] = 0x80 | ((u >> 18) & 63); outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); outU8Array[outIdx++] = 0x80 | (u & 63); } } // Null-terminate the pointer to the buffer. outU8Array[outIdx] = 0; return outIdx - startIdx; } Module["stringToUTF8Array"] = stringToUTF8Array; // Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', // null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. // Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. // Returns the number of bytes written, EXCLUDING the null terminator. function stringToUTF8(str, outPtr, maxBytesToWrite) { return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); } Module["stringToUTF8"] = stringToUTF8; // Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. function lengthBytesUTF8(str) { var len = 0; for (var i = 0; i < str.length; ++i) { // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. // See http://unicode.org/faq/utf_bom.html#utf16-3 var u = str.charCodeAt(i); // possibly a lead surrogate if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); if (u <= 0x7F) { ++len; } else if (u <= 0x7FF) { len += 2; } else if (u <= 0xFFFF) { len += 3; } else if (u <= 0x1FFFFF) { len += 4; } else if (u <= 0x3FFFFFF) { len += 5; } else { len += 6; } } return len; } Module["lengthBytesUTF8"] = lengthBytesUTF8; // Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns // a copy of that string as a Javascript String object. var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined; function UTF16ToString(ptr) { var endPtr = ptr; // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. var idx = endPtr >> 1; while (HEAP16[idx]) ++idx; endPtr = idx << 1; if (endPtr - ptr > 32 && UTF16Decoder) { return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); } else { var i = 0; var str = ''; while (1) { var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; if (codeUnit == 0) return str; ++i; // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. str += String.fromCharCode(codeUnit); } } } // Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', // null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. // Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. // Parameters: // str: the Javascript string to copy. // outPtr: Byte address in Emscripten HEAP where to write the string to. // maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null // terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. // maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. // Returns the number of bytes written, EXCLUDING the null terminator. function stringToUTF16(str, outPtr, maxBytesToWrite) { // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. if (maxBytesToWrite === undefined) { maxBytesToWrite = 0x7FFFFFFF; } if (maxBytesToWrite < 2) return 0; maxBytesToWrite -= 2; // Null terminator. var startPtr = outPtr; var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; for (var i = 0; i < numCharsToWrite; ++i) { // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. var codeUnit = str.charCodeAt(i); // possibly a lead surrogate HEAP16[((outPtr)>>1)]=codeUnit; outPtr += 2; } // Null-terminate the pointer to the HEAP. HEAP16[((outPtr)>>1)]=0; return outPtr - startPtr; } // Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. function lengthBytesUTF16(str) { return str.length*2; } function UTF32ToString(ptr) { var i = 0; var str = ''; while (1) { var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; if (utf32 == 0) return str; ++i; // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. // See http://unicode.org/faq/utf_bom.html#utf16-3 if (utf32 >= 0x10000) { var ch = utf32 - 0x10000; str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); } else { str += String.fromCharCode(utf32); } } } // Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', // null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. // Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. // Parameters: // str: the Javascript string to copy. // outPtr: Byte address in Emscripten HEAP where to write the string to. // maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null // terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. // maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. // Returns the number of bytes written, EXCLUDING the null terminator. function stringToUTF32(str, outPtr, maxBytesToWrite) { // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. if (maxBytesToWrite === undefined) { maxBytesToWrite = 0x7FFFFFFF; } if (maxBytesToWrite < 4) return 0; var startPtr = outPtr; var endPtr = startPtr + maxBytesToWrite - 4; for (var i = 0; i < str.length; ++i) { // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. // See http://unicode.org/faq/utf_bom.html#utf16-3 var codeUnit = str.charCodeAt(i); // possibly a lead surrogate if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { var trailSurrogate = str.charCodeAt(++i); codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); } HEAP32[((outPtr)>>2)]=codeUnit; outPtr += 4; if (outPtr + 4 > endPtr) break; } // Null-terminate the pointer to the HEAP. HEAP32[((outPtr)>>2)]=0; return outPtr - startPtr; } // Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. function lengthBytesUTF32(str) { var len = 0; for (var i = 0; i < str.length; ++i) { // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. // See http://unicode.org/faq/utf_bom.html#utf16-3 var codeUnit = str.charCodeAt(i); if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. len += 4; } return len; } function demangle(func) { var __cxa_demangle_func = Module['___cxa_demangle'] || Module['__cxa_demangle']; if (__cxa_demangle_func) { try { var s = func.substr(1); var len = lengthBytesUTF8(s)+1; var buf = _malloc(len); stringToUTF8(s, buf, len); var status = _malloc(4); var ret = __cxa_demangle_func(buf, 0, 0, status); if (getValue(status, 'i32') === 0 && ret) { return Pointer_stringify(ret); } // otherwise, libcxxabi failed } catch(e) { // ignore problems here } finally { if (buf) _free(buf); if (status) _free(status); if (ret) _free(ret); } // failure when using libcxxabi, don't demangle return func; } Runtime.warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); return func; } function demangleAll(text) { var regex = /__Z[\w\d_]+/g; return text.replace(regex, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']'); }); } function jsStackTrace() { var err = new Error(); if (!err.stack) { // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, // so try that as a special-case. try { throw new Error(0); } catch(e) { err = e; } if (!err.stack) { return '(no stack trace available)'; } } return err.stack.toString(); } function stackTrace() { var js = jsStackTrace(); if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); return demangleAll(js); } Module["stackTrace"] = stackTrace; // Memory management var PAGE_SIZE = 4096; function alignMemoryPage(x) { if (x % 4096 > 0) { x += (4096 - (x % 4096)); } return x; } var HEAP; var buffer; var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; function updateGlobalBuffer(buf) { Module['buffer'] = buffer = buf; } function updateGlobalBufferViews() { Module['HEAP8'] = HEAP8 = new Int8Array(buffer); Module['HEAP16'] = HEAP16 = new Int16Array(buffer); Module['HEAP32'] = HEAP32 = new Int32Array(buffer); Module['HEAPU8'] = HEAPU8 = new Uint8Array(buffer); Module['HEAPU16'] = HEAPU16 = new Uint16Array(buffer); Module['HEAPU32'] = HEAPU32 = new Uint32Array(buffer); Module['HEAPF32'] = HEAPF32 = new Float32Array(buffer); Module['HEAPF64'] = HEAPF64 = new Float64Array(buffer); } var STATIC_BASE, STATICTOP, staticSealed; // static area var STACK_BASE, STACKTOP, STACK_MAX; // stack area var DYNAMIC_BASE, DYNAMICTOP_PTR; // dynamic area handled by sbrk STATIC_BASE = STATICTOP = STACK_BASE = STACKTOP = STACK_MAX = DYNAMIC_BASE = DYNAMICTOP_PTR = 0; staticSealed = false; function abortOnCannotGrowMemory() { abort('Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value ' + TOTAL_MEMORY + ', (2) compile with -s ALLOW_MEMORY_GROWTH=1 which adjusts the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 '); } function enlargeMemory() { abortOnCannotGrowMemory(); } var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880; var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 268435456; var WASM_PAGE_SIZE = 64 * 1024; var totalMemory = WASM_PAGE_SIZE; while (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) { if (totalMemory < 16*1024*1024) { totalMemory *= 2; } else { totalMemory += 16*1024*1024; } } if (totalMemory !== TOTAL_MEMORY) { TOTAL_MEMORY = totalMemory; } // Initialize the runtime's memory // Use a provided buffer, if there is one, or else allocate a new one if (Module['buffer']) { buffer = Module['buffer']; } else { // Use a WebAssembly memory where available if (typeof WebAssembly === 'object' && typeof WebAssembly.Memory === 'function') { Module['wasmMemory'] = new WebAssembly.Memory({ initial: TOTAL_MEMORY / WASM_PAGE_SIZE, maximum: TOTAL_MEMORY / WASM_PAGE_SIZE }); buffer = Module['wasmMemory'].buffer; } else { buffer = new ArrayBuffer(TOTAL_MEMORY); } } updateGlobalBufferViews(); function getTotalMemory() { return TOTAL_MEMORY; } // Endianness check (note: assumes compiler arch was little-endian) HEAP32[0] = 0x63736d65; /* 'emsc' */ HEAP16[1] = 0x6373; if (HEAPU8[2] !== 0x73 || HEAPU8[3] !== 0x63) throw 'Runtime error: expected the system to be little-endian!'; Module['HEAP'] = HEAP; Module['buffer'] = buffer; Module['HEAP8'] = HEAP8; Module['HEAP16'] = HEAP16; Module['HEAP32'] = HEAP32; Module['HEAPU8'] = HEAPU8; Module['HEAPU16'] = HEAPU16; Module['HEAPU32'] = HEAPU32; Module['HEAPF32'] = HEAPF32; Module['HEAPF64'] = HEAPF64; function callRuntimeCallbacks(callbacks) { while(callbacks.length > 0) { var callback = callbacks.shift(); if (typeof callback == 'function') { callback(); continue; } var func = callback.func; if (typeof func === 'number') { if (callback.arg === undefined) { Module['dynCall_v'](func); } else { Module['dynCall_vi'](func, callback.arg); } } else { func(callback.arg === undefined ? null : callback.arg); } } } var __ATPRERUN__ = []; // functions called before the runtime is initialized var __ATINIT__ = []; // functions called during startup var __ATMAIN__ = []; // functions called when main() is to be run var __ATEXIT__ = []; // functions called during shutdown var __ATPOSTRUN__ = []; // functions called after the runtime has exited var runtimeInitialized = false; var runtimeExited = false; function preRun() { // compatibility - merge in anything from Module['preRun'] at this time if (Module['preRun']) { if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; while (Module['preRun'].length) { addOnPreRun(Module['preRun'].shift()); } } callRuntimeCallbacks(__ATPRERUN__); } function ensureInitRuntime() { if (runtimeInitialized) return; runtimeInitialized = true; callRuntimeCallbacks(__ATINIT__); } function preMain() { callRuntimeCallbacks(__ATMAIN__); } function exitRuntime() { callRuntimeCallbacks(__ATEXIT__); runtimeExited = true; } function postRun() { // compatibility - merge in anything from Module['postRun'] at this time 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); } Module["addOnPreRun"] = addOnPreRun; function addOnInit(cb) { __ATINIT__.unshift(cb); } Module["addOnInit"] = addOnInit; function addOnPreMain(cb) { __ATMAIN__.unshift(cb); } Module["addOnPreMain"] = addOnPreMain; function addOnExit(cb) { __ATEXIT__.unshift(cb); } Module["addOnExit"] = addOnExit; function addOnPostRun(cb) { __ATPOSTRUN__.unshift(cb); } Module["addOnPostRun"] = addOnPostRun; // Tools function intArrayFromString(stringy, dontAddNull, length /* optional */) { var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; var u8array = new Array(len); var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); if (dontAddNull) u8array.length = numBytesWritten; return u8array; } Module["intArrayFromString"] = intArrayFromString; function intArrayToString(array) { var ret = []; for (var i = 0; i < array.length; i++) { var chr = array[i]; if (chr > 0xFF) { chr &= 0xFF; } ret.push(String.fromCharCode(chr)); } return ret.join(''); } Module["intArrayToString"] = intArrayToString; // Deprecated: This function should not be called because it is unsafe and does not provide // a maximum length limit of how many bytes it is allowed to write. Prefer calling the // function stringToUTF8Array() instead, which takes in a maximum length that can be used // to be secure from out of bounds writes. function writeStringToMemory(string, buffer, dontAddNull) { Runtime.warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); var lastChar, end; if (dontAddNull) { // stringToUTF8Array always appends null. If we don't want to do that, remember the // character that existed at the location where the null will be placed, and restore // that after the write (below). end = buffer + lengthBytesUTF8(string); lastChar = HEAP8[end]; } stringToUTF8(string, buffer, Infinity); if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. } Module["writeStringToMemory"] = writeStringToMemory; function writeArrayToMemory(array, buffer) { HEAP8.set(array, buffer); } Module["writeArrayToMemory"] = writeArrayToMemory; function writeAsciiToMemory(str, buffer, dontAddNull) { for (var i = 0; i < str.length; ++i) { HEAP8[((buffer++)>>0)]=str.charCodeAt(i); } // Null-terminate the pointer to the HEAP. if (!dontAddNull) HEAP8[((buffer)>>0)]=0; } Module["writeAsciiToMemory"] = writeAsciiToMemory; function unSign(value, bits, ignore) { if (value >= 0) { return value; } return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts : Math.pow(2, bits) + value; } function reSign(value, bits, ignore) { if (value <= 0) { return value; } var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32 : Math.pow(2, bits-1); if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors // TODO: In i64 mode 1, resign the two parts separately and safely value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts } return value; } // check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 ) if (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) { var ah = a >>> 16; var al = a & 0xffff; var bh = b >>> 16; var bl = b & 0xffff; return (al*bl + ((ah*bl + al*bh) << 16))|0; }; Math.imul = Math['imul']; if (!Math['fround']) { var froundBuffer = new Float32Array(1); Math['fround'] = function(x) { froundBuffer[0] = x; return froundBuffer[0] }; } Math.fround = Math['fround']; if (!Math['clz32']) Math['clz32'] = function(x) { x = x >>> 0; for (var i = 0; i < 32; i++) { if (x & (1 << (31 - i))) return i; } return 32; }; Math.clz32 = Math['clz32'] if (!Math['trunc']) Math['trunc'] = function(x) { return x < 0 ? Math.ceil(x) : Math.floor(x); }; Math.trunc = Math['trunc']; var Math_abs = Math.abs; var Math_cos = Math.cos; var Math_sin = Math.sin; var Math_tan = Math.tan; var Math_acos = Math.acos; var Math_asin = Math.asin; var Math_atan = Math.atan; var Math_atan2 = Math.atan2; var Math_exp = Math.exp; var Math_log = Math.log; var Math_sqrt = Math.sqrt; var Math_ceil = Math.ceil; var Math_floor = Math.floor; var Math_pow = Math.pow; var Math_imul = Math.imul; var Math_fround = Math.fround; var Math_round = Math.round; var Math_min = Math.min; var Math_clz32 = Math.clz32; var Math_trunc = Math.trunc; // A counter of dependencies for calling run(). If we need to // do asynchronous work before running, increment this and // decrement it. Incrementing must happen in a place like // PRE_RUN_ADDITIONS (used by emcc to add file preloading). // Note that you can add dependencies in preRun, even though // it happens right before run - run will be postponed until // the dependencies are met. var runDependencies = 0; var runDependencyWatcher = null; var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled function getUniqueRunDependency(id) { return id; } function addRunDependency(id) { runDependencies++; if (Module['monitorRunDependencies']) { Module['monitorRunDependencies'](runDependencies); } } Module["addRunDependency"] = addRunDependency; function removeRunDependency(id) { runDependencies--; if (Module['monitorRunDependencies']) { Module['monitorRunDependencies'](runDependencies); } if (runDependencies == 0) { if (runDependencyWatcher !== null) { clearInterval(runDependencyWatcher); runDependencyWatcher = null; } if (dependenciesFulfilled) { var callback = dependenciesFulfilled; dependenciesFulfilled = null; callback(); // can add another dependenciesFulfilled } } } Module["removeRunDependency"] = removeRunDependency; Module["preloadedImages"] = {}; // maps url to image data Module["preloadedAudios"] = {}; // maps url to audio data var memoryInitializer = null; function integrateWasmJS(Module) { // wasm.js has several methods for creating the compiled code module here: // * 'native-wasm' : use native WebAssembly support in the browser // * 'interpret-s-expr': load s-expression code from a .wast and interpret // * 'interpret-binary': load binary wasm and interpret // * 'interpret-asm2wasm': load asm.js code, translate to wasm, and interpret // * 'asmjs': no wasm, just load the asm.js code and use that (good for testing) // The method can be set at compile time (BINARYEN_METHOD), or runtime by setting Module['wasmJSMethod']. // The method can be a comma-separated list, in which case, we will try the // options one by one. Some of them can fail gracefully, and then we can try // the next. // inputs var method = Module['wasmJSMethod'] || 'native-wasm'; Module['wasmJSMethod'] = method; var wasmTextFile = Module['wasmTextFile'] || 'build.wast'; var wasmBinaryFile = Module['wasmBinaryFile'] || 'build.wasm'; var asmjsCodeFile = Module['asmjsCodeFile'] || 'build.asm.js'; // utilities var wasmPageSize = 64*1024; var asm2wasmImports = { // special asm2wasm imports "f64-rem": function(x, y) { return x % y; }, "f64-to-int": function(x) { return x | 0; }, "i32s-div": function(x, y) { return ((x | 0) / (y | 0)) | 0; }, "i32u-div": function(x, y) { return ((x >>> 0) / (y >>> 0)) >>> 0; }, "i32s-rem": function(x, y) { return ((x | 0) % (y | 0)) | 0; }, "i32u-rem": function(x, y) { return ((x >>> 0) % (y >>> 0)) >>> 0; }, "debugger": function() { debugger; }, }; var info = { 'global': null, 'env': null, 'asm2wasm': asm2wasmImports, 'parent': Module // Module inside wasm-js.cpp refers to wasm-js.cpp; this allows access to the outside program. }; var exports = null; function lookupImport(mod, base) { var lookup = info; if (mod.indexOf('.') < 0) { lookup = (lookup || {})[mod]; } else { var parts = mod.split('.'); lookup = (lookup || {})[parts[0]]; lookup = (lookup || {})[parts[1]]; } if (base) { lookup = (lookup || {})[base]; } if (lookup === undefined) { abort('bad lookupImport to (' + mod + ').' + base); } return lookup; } function mergeMemory(newBuffer) { // The wasm instance creates its memory. But static init code might have written to // buffer already, including the mem init file, and we must copy it over in a proper merge. // TODO: avoid this copy, by avoiding such static init writes // TODO: in shorter term, just copy up to the last static init write var oldBuffer = Module['buffer']; if (newBuffer.byteLength < oldBuffer.byteLength) { Module['printErr']('the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here'); } var oldView = new Int8Array(oldBuffer); var newView = new Int8Array(newBuffer); // If we have a mem init file, do not trample it if (!memoryInitializer) { oldView.set(newView.subarray(Module['STATIC_BASE'], Module['STATIC_BASE'] + Module['STATIC_BUMP']), Module['STATIC_BASE']); } newView.set(oldView); updateGlobalBuffer(newBuffer); updateGlobalBufferViews(); } var WasmTypes = { none: 0, i32: 1, i64: 2, f32: 3, f64: 4 }; function fixImports(imports) { if (!0) return imports; var ret = {}; for (var i in imports) { var fixed = i; if (fixed[0] == '_') fixed = fixed.substr(1); ret[fixed] = imports[i]; } return ret; } function getBinary() { var binary; if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { binary = Module['wasmBinary']; assert(binary, "on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)"); binary = new Uint8Array(binary); } else { binary = Module['readBinary'](wasmBinaryFile); } return binary; } // do-method functions function doJustAsm(global, env, providedBuffer) { // if no Module.asm, or it's the method handler helper (see below), then apply // the asmjs if (typeof Module['asm'] !== 'function' || Module['asm'] === methodHandler) { if (!Module['asmPreload']) { // you can load the .asm.js file before this, to avoid this sync xhr and eval eval(Module['read'](asmjsCodeFile)); // set Module.asm } else { Module['asm'] = Module['asmPreload']; } } if (typeof Module['asm'] !== 'function') { Module['printErr']('asm evalling did not set the module properly'); return false; } return Module['asm'](global, env, providedBuffer); } function doNativeWasm(global, env, providedBuffer) { if (typeof WebAssembly !== 'object') { Module['printErr']('no native wasm support detected'); return false; } // prepare memory import if (!(Module['wasmMemory'] instanceof WebAssembly.Memory)) { Module['printErr']('no native wasm Memory in use'); return false; } env['memory'] = Module['wasmMemory']; // Load the wasm module and create an instance of using native support in the JS engine. info['global'] = { 'NaN': NaN, 'Infinity': Infinity }; info['global.Math'] = global.Math; info['env'] = env; // handle a generated wasm instance, receiving its exports and // performing other necessary setup function receiveInstance(instance) { exports = instance.exports; if (exports.memory) mergeMemory(exports.memory); Module["usingWasm"] = true; } Module['printErr']('asynchronously preparing wasm'); addRunDependency('wasm-instantiate'); // we can't run yet WebAssembly.instantiate(getBinary(), info).then(function(output) { receiveInstance(output.instance); Module['asm'] = exports; // swap in the exports so they can be called removeRunDependency('wasm-instantiate'); }); return {}; // no exports yet; we'll fill them in later var instance; try { instance = new WebAssembly.Instance(new WebAssembly.Module(getBinary()), info) } catch (e) { Module['printErr']('failed to compile wasm module: ' + e); if (e.toString().indexOf('imported Memory with incompatible size') >= 0) { Module['printErr']('Memory size incompatibility issues may be due to changing TOTAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set TOTAL_MEMORY at runtime to something smaller than it was at compile time).'); } return false; } receiveInstance(instance); return exports; } function doWasmPolyfill(global, env, providedBuffer, method) { if (typeof WasmJS !== 'function') { Module['printErr']('WasmJS not detected - polyfill not bundled?'); return false; } // Use wasm.js to polyfill and execute code in a wasm interpreter. var wasmJS = WasmJS({}); // XXX don't be confused. Module here is in the outside program. wasmJS is the inner wasm-js.cpp. wasmJS['outside'] = Module; // Inside wasm-js.cpp, Module['outside'] reaches the outside module. // Information for the instance of the module. wasmJS['info'] = info; wasmJS['lookupImport'] = lookupImport; assert(providedBuffer === Module['buffer']); // we should not even need to pass it as a 3rd arg for wasm, but that's the asm.js way. info.global = global; info.env = env; // polyfill interpreter expects an ArrayBuffer assert(providedBuffer === Module['buffer']); env['memory'] = providedBuffer; assert(env['memory'] instanceof ArrayBuffer); wasmJS['providedTotalMemory'] = Module['buffer'].byteLength; // Prepare to generate wasm, using either asm2wasm or s-exprs var code; if (method === 'interpret-binary') { code = getBinary(); } else { code = Module['read'](method == 'interpret-asm2wasm' ? asmjsCodeFile : wasmTextFile); } var temp; if (method == 'interpret-asm2wasm') { temp = wasmJS['_malloc'](code.length + 1); wasmJS['writeAsciiToMemory'](code, temp); wasmJS['_load_asm2wasm'](temp); } else if (method === 'interpret-s-expr') { temp = wasmJS['_malloc'](code.length + 1); wasmJS['writeAsciiToMemory'](code, temp); wasmJS['_load_s_expr2wasm'](temp); } else if (method === 'interpret-binary') { temp = wasmJS['_malloc'](code.length); wasmJS['HEAPU8'].set(code, temp); wasmJS['_load_binary2wasm'](temp, code.length); } else { throw 'what? ' + method; } wasmJS['_free'](temp); wasmJS['_instantiate'](temp); if (Module['newBuffer']) { mergeMemory(Module['newBuffer']); Module['newBuffer'] = null; } exports = wasmJS['asmExports']; return exports; } // We may have a preloaded value in Module.asm, save it Module['asmPreload'] = Module['asm']; // Memory growth integration code Module['reallocBuffer'] = function(size) { size = Math.ceil(size / wasmPageSize) * wasmPageSize; // round up to wasm page size var old = Module['buffer']; var result = exports['__growWasmMemory'](size / wasmPageSize); // tiny wasm method that just does grow_memory if (Module["usingWasm"]) { if (result !== (-1 | 0)) { // success in native wasm memory growth, get the buffer from the memory return Module['buffer'] = Module['wasmMemory'].buffer; } else { return null; } } else { // in interpreter, we replace Module.buffer if we allocate return Module['buffer'] !== old ? Module['buffer'] : null; // if it was reallocated, it changed } }; // Provide an "asm.js function" for the application, called to "link" the asm.js module. We instantiate // the wasm module at that time, and it receives imports and provides exports and so forth, the app // doesn't need to care that it is wasm or olyfilled wasm or asm.js. Module['asm'] = function(global, env, providedBuffer) { global = fixImports(global); env = fixImports(env); // import table if (!env['table']) { var TABLE_SIZE = Module['wasmTableSize']; if (TABLE_SIZE === undefined) TABLE_SIZE = 1024; // works in binaryen interpreter at least var MAX_TABLE_SIZE = Module['wasmMaxTableSize']; if (typeof WebAssembly === 'object' && typeof WebAssembly.Table === 'function') { if (MAX_TABLE_SIZE !== undefined) { env['table'] = new WebAssembly.Table({ initial: TABLE_SIZE, maximum: MAX_TABLE_SIZE, element: 'anyfunc' }); } else { env['table'] = new WebAssembly.Table({ initial: TABLE_SIZE, element: 'anyfunc' }); } } else { env['table'] = new Array(TABLE_SIZE); // works in binaryen interpreter at least } Module['wasmTable'] = env['table']; } if (!env['memoryBase']) { env['memoryBase'] = Module['STATIC_BASE']; // tell the memory segments where to place themselves } if (!env['tableBase']) { env['tableBase'] = 0; // table starts at 0 by default, in dynamic linking this will change } // try the methods. each should return the exports if it succeeded var exports; var methods = method.split(','); for (var i = 0; i < methods.length; i++) { var curr = methods[i]; Module['printErr']('trying binaryen method: ' + curr); if (curr === 'native-wasm') { if (exports = doNativeWasm(global, env, providedBuffer)) break; } else if (curr === 'asmjs') { if (exports = doJustAsm(global, env, providedBuffer)) break; } else if (curr === 'interpret-asm2wasm' || curr === 'interpret-s-expr' || curr === 'interpret-binary') { if (exports = doWasmPolyfill(global, env, providedBuffer, curr)) break; } else { throw 'bad method: ' + curr; } } if (!exports) throw 'no binaryen method succeeded. consider enabling more options, like interpreting, if you want that: https://github.com/kripken/emscripten/wiki/WebAssembly#binaryen-methods'; Module['printErr']('binaryen method succeeded.'); return exports; }; var methodHandler = Module['asm']; // note our method handler, as we may modify Module['asm'] later } integrateWasmJS(Module); // === Body === var ASM_CONSTS = [function($0, $1) { { Module.printErr('bad name in getProcAddress: ' + [Pointer_stringify($0), Pointer_stringify($1)]); } }]; function _emscripten_asm_const_iii(code, a0, a1) { return ASM_CONSTS[code](a0, a1); } STATIC_BASE = 1024; STATICTOP = Runtime.alignMemory(STATIC_BASE, 16) + 1609424; /* global initializers */ __ATINIT__.push({ func: function() { __GLOBAL__sub_I_runtime_video_0_cpp() } }, { func: function() { ___cxx_global_var_init_13() } }, { func: function() { __GLOBAL__sub_I_SwCollision_cpp() } }, { func: function() { __GLOBAL__sub_I_SwInterCollision_cpp() } }, { func: function() { __GLOBAL__sub_I_SwSelfCollision_cpp() } }, { func: function() { __GLOBAL__sub_I_SwSolverKernel_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_cloth_0_cpp() } }, { func: function() { __GLOBAL__sub_I_GlslGpuProgramGLES_cpp() } }, { func: function() { __GLOBAL__sub_I_SpriteRendererJobs_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_2d_spriteatlas_0_cpp() } }, { func: function() { ___cxx_global_var_init_5_1260() } }, { func: function() { __GLOBAL__sub_I_runtime_assetbundles_1_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_baseclasses_2_cpp() } }, { func: function() { ___cxx_global_var_init_74() } }, { func: function() { ___cxx_global_var_init_75() } }, { func: function() { __GLOBAL__sub_I_runtime_camera_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_camera_1_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_camera_3_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_camera_5_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_camera_6_cpp() } }, { func: function() { ___cxx_global_var_init_18() } }, { func: function() { __GLOBAL__sub_I_runtime_camera_renderlayers_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_camera_renderloops_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_camera_renderloops_1_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_core_callbacks_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_geometry_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_graphics_6_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_graphics_7_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_graphics_billboard_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_graphics_mesh_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_graphics_mesh_2_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_input_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_math_random_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_misc_0_cpp() } }, { func: function() { ___cxx_global_var_init_66() } }, { func: function() { __GLOBAL__sub_I_runtime_scenemanager_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_shaders_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_shaders_shaderimpl_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_utilities_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_utilities_4_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_utilities_6_cpp() } }, { func: function() { __GLOBAL__sub_I_modules_profiler_public_0_cpp() } }, { func: function() { __GLOBAL__sub_I_modules_profiler_runtime_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_gfxdevice_1_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_gfxdevice_2_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_scripting_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_scripting_2_cpp() } }, { func: function() { __GLOBAL__sub_I_platformdependent_webgl_source_0_cpp() } }, { func: function() { __GLOBAL__sub_I_platformdependent_webgl_source_1_cpp() } }, { func: function() { ___cxx_global_var_init_7_2511() } }, { func: function() { __GLOBAL__sub_I_runtime_imgui_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_particlesystem_modules_3_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_particlesystem_modules_5_cpp() } }, { func: function() { __GLOBAL__sub_I_PxsFluidDynamics_cpp() } }, { func: function() { __GLOBAL__sub_I_CmEventProfiler_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_dynamics_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_dynamics_2_cpp() } }, { func: function() { ___cxx_global_var_init_128() } }, { func: function() { __GLOBAL__sub_I_modules_terrain_public_0_cpp() } }, { func: function() { __GLOBAL__sub_I_modules_terrain_public_1_cpp() } }, { func: function() { __GLOBAL__sub_I_modules_terrain_public_2_cpp() } }, { func: function() { __GLOBAL__sub_I_modules_terrain_vr_0_cpp() } }, { func: function() { __GLOBAL__sub_I_modules_tilemap_0_cpp() } }, { func: function() { __GLOBAL__sub_I_modules_tilemap_public_0_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_ui_0_cpp() } }, { func: function() { __GLOBAL__sub_I_umbra_cpp() } }, { func: function() { __GLOBAL__sub_I_UnityAdsSettings_cpp() } }, { func: function() { __GLOBAL__sub_I_runtime_vr_1_cpp() } }, { func: function() { __GLOBAL__sub_I_artifacts_generated_webgl_modules_vr_0_cpp() } }, { func: function() { __GLOBAL__sub_I_Class_cpp() } }, { func: function() { __GLOBAL__sub_I_MetadataCache_cpp() } }, { func: function() { __GLOBAL__sub_I_Runtime_cpp() } }, { func: function() { __GLOBAL__sub_I_File_cpp() } }, { func: function() { __GLOBAL__sub_I_Reflection_cpp() } }, { func: function() { __GLOBAL__sub_I_ArrayMetadata_cpp() } }, { func: function() { __GLOBAL__sub_I_Thread_cpp() } }, { func: function() { __GLOBAL__sub_I_Assembly_cpp() } }, { func: function() { __GLOBAL__sub_I_RCW_cpp() } }, { func: function() { __GLOBAL__sub_I_Image_cpp() } }, { func: function() { __GLOBAL__sub_I_GenericMetadata_cpp() } }, { func: function() { __GLOBAL__sub_I_GCHandle_cpp() } }, { func: function() { __GLOBAL__sub_I_Socket_cpp() } }, { func: function() { __GLOBAL__sub_I_GarbageCollector_cpp() } }, { func: function() { __GLOBAL__sub_I_StackTrace_cpp() } }, { func: function() { __GLOBAL__sub_I_AppDomain_cpp() } }, { func: function() { __GLOBAL__sub_I_Console_cpp() } }, { func: function() { __GLOBAL__sub_I_Thread_cpp_41939() } }, { func: function() { __GLOBAL__sub_I_LibraryLoader_cpp() } }, { func: function() { __GLOBAL__sub_I_ThreadImpl_cpp() } }, { func: function() { __GLOBAL__sub_I_GenericMethod_cpp() } }, { func: function() { __GLOBAL__sub_I_String_cpp() } }, { func: function() { __GLOBAL__sub_I_Interlocked_cpp() } }, { func: function() { __GLOBAL__sub_I_Assembly_cpp_42452() } }, { func: function() { __GLOBAL__sub_I_MemoryMappedFile_cpp() } }, { func: function() { __GLOBAL__sub_I_Runtime_cpp_42981() } }, { func: function() { __GLOBAL__sub_I_Il2CppCodeRegistration_cpp() } }, { func: function() { __GLOBAL__sub_I_Environment_cpp() } }, { func: function() { __GLOBAL__sub_I_NativeDelegateMethodCache_cpp() } }, { func: function() { __GLOBAL__sub_I_Error_cpp() } }, { func: function() { __GLOBAL__sub_I_Path_cpp() } }); memoryInitializer = Module["wasmJSMethod"].indexOf("asmjs") >= 0 || Module["wasmJSMethod"].indexOf("interpret-asm2wasm") >= 0 ? "build.js.mem" : null; var STATIC_BUMP = 1609424; Module["STATIC_BASE"] = STATIC_BASE; Module["STATIC_BUMP"] = STATIC_BUMP; /* no memory initializer */ var tempDoublePtr = STATICTOP; STATICTOP += 16; function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much HEAP8[tempDoublePtr] = HEAP8[ptr]; HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; } function copyTempDouble(ptr) { HEAP8[tempDoublePtr] = HEAP8[ptr]; HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; HEAP8[tempDoublePtr+4] = HEAP8[ptr+4]; HEAP8[tempDoublePtr+5] = HEAP8[ptr+5]; HEAP8[tempDoublePtr+6] = HEAP8[ptr+6]; HEAP8[tempDoublePtr+7] = HEAP8[ptr+7]; } // {{PRE_LIBRARY}} var GL={counter:1,lastError:0,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:[],currentContext:null,offscreenCanvases:{},timerQueriesEXT:[],queries:[],samplers:[],transformFeedbacks:[],syncs:[],byteSizeByTypeRoot:5120,byteSizeByType:[1,1,2,2,4,4,4,2,3,4,8],programInfos:{},stringCache:{},stringiCache:{},packAlignment:4,unpackAlignment:4,init:function () { GL.miniTempBuffer = new Float32Array(GL.MINI_TEMP_BUFFER_SIZE); for (var i = 0; i < GL.MINI_TEMP_BUFFER_SIZE; i++) { GL.miniTempBufferViews[i] = GL.miniTempBuffer.subarray(0, i+1); } },recordError:function recordError(errorCode) { if (!GL.lastError) { GL.lastError = errorCode; } },getNewId:function (table) { var ret = GL.counter++; for (var i = table.length; i < ret; i++) { table[i] = null; } return ret; },MINI_TEMP_BUFFER_SIZE:256,miniTempBuffer:null,miniTempBufferViews:[0],getSource:function (shader, count, string, length) { var source = ''; for (var i = 0; i < count; ++i) { var frag; if (length) { var len = HEAP32[(((length)+(i*4))>>2)]; if (len < 0) { frag = Pointer_stringify(HEAP32[(((string)+(i*4))>>2)]); } else { frag = Pointer_stringify(HEAP32[(((string)+(i*4))>>2)], len); } } else { frag = Pointer_stringify(HEAP32[(((string)+(i*4))>>2)]); } source += frag; } return source; },createContext:function (canvas, webGLContextAttributes) { if (typeof webGLContextAttributes['majorVersion'] === 'undefined' && typeof webGLContextAttributes['minorVersion'] === 'undefined') { webGLContextAttributes['majorVersion'] = 2; webGLContextAttributes['minorVersion'] = 0; } var ctx; var errorInfo = '?'; function onContextCreationError(event) { errorInfo = event.statusMessage || errorInfo; } try { canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false); try { if (webGLContextAttributes['majorVersion'] == 1 && webGLContextAttributes['minorVersion'] == 0) { ctx = canvas.getContext("webgl", webGLContextAttributes) || canvas.getContext("experimental-webgl", webGLContextAttributes); } else if (webGLContextAttributes['majorVersion'] == 2 && webGLContextAttributes['minorVersion'] == 0) { ctx = canvas.getContext("webgl2", webGLContextAttributes) || canvas.getContext("experimental-webgl2", webGLContextAttributes); } else { throw 'Unsupported WebGL context version ' + majorVersion + '.' + minorVersion + '!' } } finally { canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false); } if (!ctx) throw ':('; } catch (e) { Module.print('Could not create canvas: ' + [errorInfo, e, JSON.stringify(webGLContextAttributes)]); return 0; } // possible GL_DEBUG entry point: ctx = wrapDebugGL(ctx); if (!ctx) return 0; return GL.registerContext(ctx, webGLContextAttributes); },registerContext:function (ctx, webGLContextAttributes) { var handle = GL.getNewId(GL.contexts); var context = { handle: handle, attributes: webGLContextAttributes, version: webGLContextAttributes['majorVersion'], GLctx: ctx }; // Store the created context object so that we can access the context given a canvas without having to pass the parameters again. if (ctx.canvas) ctx.canvas.GLctxObject = context; GL.contexts[handle] = context; if (typeof webGLContextAttributes['enableExtensionsByDefault'] === 'undefined' || webGLContextAttributes['enableExtensionsByDefault']) { GL.initExtensions(context); } return handle; },makeContextCurrent:function (contextHandle) { var context = GL.contexts[contextHandle]; if (!context) return false; GLctx = Module.ctx = context.GLctx; // Active WebGL context object. GL.currentContext = context; // Active Emscripten GL layer context object. return true; },getContext:function (contextHandle) { return GL.contexts[contextHandle]; },deleteContext:function (contextHandle) { if (GL.currentContext === GL.contexts[contextHandle]) GL.currentContext = null; if (typeof JSEvents === 'object') JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); // Release all JS event handlers on the DOM element that the GL context is associated with since the context is now deleted. if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) GL.contexts[contextHandle].GLctx.canvas.GLctxObject = undefined; // Make sure the canvas object no longer refers to the context object so there are no GC surprises. GL.contexts[contextHandle] = null; },initExtensions:function (context) { // If this function is called without a specific context object, init the extensions of the currently active context. if (!context) context = GL.currentContext; if (context.initExtensionsDone) return; context.initExtensionsDone = true; var GLctx = context.GLctx; context.maxVertexAttribs = GLctx.getParameter(GLctx.MAX_VERTEX_ATTRIBS); // Detect the presence of a few extensions manually, this GL interop layer itself will need to know if they exist. if (context.version < 2) { // Extension available from Firefox 26 and Google Chrome 30 var instancedArraysExt = GLctx.getExtension('ANGLE_instanced_arrays'); if (instancedArraysExt) { GLctx['vertexAttribDivisor'] = function(index, divisor) { instancedArraysExt['vertexAttribDivisorANGLE'](index, divisor); }; GLctx['drawArraysInstanced'] = function(mode, first, count, primcount) { instancedArraysExt['drawArraysInstancedANGLE'](mode, first, count, primcount); }; GLctx['drawElementsInstanced'] = function(mode, count, type, indices, primcount) { instancedArraysExt['drawElementsInstancedANGLE'](mode, count, type, indices, primcount); }; } // Extension available from Firefox 25 and WebKit var vaoExt = GLctx.getExtension('OES_vertex_array_object'); if (vaoExt) { GLctx['createVertexArray'] = function() { return vaoExt['createVertexArrayOES'](); }; GLctx['deleteVertexArray'] = function(vao) { vaoExt['deleteVertexArrayOES'](vao); }; GLctx['bindVertexArray'] = function(vao) { vaoExt['bindVertexArrayOES'](vao); }; GLctx['isVertexArray'] = function(vao) { return vaoExt['isVertexArrayOES'](vao); }; } var drawBuffersExt = GLctx.getExtension('WEBGL_draw_buffers'); if (drawBuffersExt) { GLctx['drawBuffers'] = function(n, bufs) { drawBuffersExt['drawBuffersWEBGL'](n, bufs); }; } } GLctx.disjointTimerQueryExt = GLctx.getExtension("EXT_disjoint_timer_query"); // These are the 'safe' feature-enabling extensions that don't add any performance impact related to e.g. debugging, and // should be enabled by default so that client GLES2/GL code will not need to go through extra hoops to get its stuff working. // As new extensions are ratified at http://www.khronos.org/registry/webgl/extensions/ , feel free to add your new extensions // here, as long as they don't produce a performance impact for users that might not be using those extensions. // E.g. debugging-related extensions should probably be off by default. var automaticallyEnabledExtensions = [ "OES_texture_float", "OES_texture_half_float", "OES_standard_derivatives", "OES_vertex_array_object", "WEBGL_compressed_texture_s3tc", "WEBGL_depth_texture", "OES_element_index_uint", "EXT_texture_filter_anisotropic", "ANGLE_instanced_arrays", "OES_texture_float_linear", "OES_texture_half_float_linear", "WEBGL_compressed_texture_atc", "WEBGL_compressed_texture_pvrtc", "EXT_color_buffer_half_float", "WEBGL_color_buffer_float", "EXT_frag_depth", "EXT_sRGB", "WEBGL_draw_buffers", "WEBGL_shared_resources", "EXT_shader_texture_lod", "EXT_color_buffer_float"]; function shouldEnableAutomatically(extension) { var ret = false; automaticallyEnabledExtensions.forEach(function(include) { if (ext.indexOf(include) != -1) { ret = true; } }); return ret; } var exts = GLctx.getSupportedExtensions(); if (exts && exts.length > 0) { GLctx.getSupportedExtensions().forEach(function(ext) { if (automaticallyEnabledExtensions.indexOf(ext) != -1) { GLctx.getExtension(ext); // Calling .getExtension enables that extension permanently, no need to store the return value to be enabled. } }); } },populateUniformTable:function (program) { var p = GL.programs[program]; GL.programInfos[program] = { uniforms: {}, maxUniformLength: 0, // This is eagerly computed below, since we already enumerate all uniforms anyway. maxAttributeLength: -1, // This is lazily computed and cached, computed when/if first asked, "-1" meaning not computed yet. maxUniformBlockNameLength: -1 // Lazily computed as well }; var ptable = GL.programInfos[program]; var utable = ptable.uniforms; // A program's uniform table maps the string name of an uniform to an integer location of that uniform. // The global GL.uniforms map maps integer locations to WebGLUniformLocations. var numUniforms = GLctx.getProgramParameter(p, GLctx.ACTIVE_UNIFORMS); for (var i = 0; i < numUniforms; ++i) { var u = GLctx.getActiveUniform(p, i); var name = u.name; ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length+1); // Strip off any trailing array specifier we might have got, e.g. "[0]". if (name.indexOf(']', name.length-1) !== -1) { var ls = name.lastIndexOf('['); name = name.slice(0, ls); } // Optimize memory usage slightly: If we have an array of uniforms, e.g. 'vec3 colors[3];', then // only store the string 'colors' in utable, and 'colors[0]', 'colors[1]' and 'colors[2]' will be parsed as 'colors'+i. // Note that for the GL.uniforms table, we still need to fetch the all WebGLUniformLocations for all the indices. var loc = GLctx.getUniformLocation(p, name); if (loc != null) { var id = GL.getNewId(GL.uniforms); utable[name] = [u.size, id]; GL.uniforms[id] = loc; for (var j = 1; j < u.size; ++j) { var n = name + '['+j+']'; loc = GLctx.getUniformLocation(p, n); id = GL.getNewId(GL.uniforms); GL.uniforms[id] = loc; } } } }};function _emscripten_glStencilMaskSeparate(x0, x1) { GLctx['stencilMaskSeparate'](x0, x1) } Module["_pthread_mutex_lock"] = _pthread_mutex_lock; function _free() { } Module["_free"] = _free;function ___cxa_free_exception(ptr) { try { return _free(ptr); } catch(e) { // XXX FIXME } } var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:function (adjusted) { if (!adjusted || EXCEPTIONS.infos[adjusted]) return adjusted; for (var ptr in EXCEPTIONS.infos) { var info = EXCEPTIONS.infos[ptr]; if (info.adjusted === adjusted) { return ptr; } } return adjusted; },addRef:function (ptr) { if (!ptr) return; var info = EXCEPTIONS.infos[ptr]; info.refcount++; },decRef:function (ptr) { if (!ptr) return; var info = EXCEPTIONS.infos[ptr]; assert(info.refcount > 0); info.refcount--; // A rethrown exception can reach refcount 0; it must not be discarded // Its next handler will clear the rethrown flag and addRef it, prior to // final decRef and destruction here if (info.refcount === 0 && !info.rethrown) { if (info.destructor) { Module['dynCall_vi'](info.destructor, ptr); } delete EXCEPTIONS.infos[ptr]; ___cxa_free_exception(ptr); } },clearRef:function (ptr) { if (!ptr) return; var info = EXCEPTIONS.infos[ptr]; info.refcount = 0; }};function ___cxa_end_catch() { // Clear state flag. asm['setThrew'](0); // Call destructor if one is registered then clear it. var ptr = EXCEPTIONS.caught.pop(); if (ptr) { EXCEPTIONS.decRef(EXCEPTIONS.deAdjust(ptr)); EXCEPTIONS.last = 0; // XXX in decRef? } } function _emscripten_glStencilFunc(x0, x1, x2) { GLctx['stencilFunc'](x0, x1, x2) } function _glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer) { GLctx.framebufferRenderbuffer(target, attachment, renderbuffertarget, GL.renderbuffers[renderbuffer]); } function _emscripten_glVertexPointer(){ throw 'Legacy GL function (glVertexPointer) called. If you want legacy GL emulation, you need to compile with -s LEGACY_GL_EMULATION=1 to enable legacy GL emulation.'; } function _emscripten_glUniform3iv(location, count, value) { location = GL.uniforms[location]; count *= 3; value = HEAP32.subarray((value)>>2,(value+count*4)>>2); GLctx.uniform3iv(location, value); } function _glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data) { var heapView; if (data) { heapView = HEAPU8.subarray((data),(data+imageSize)); } else { heapView = null; } GLctx['compressedTexSubImage2D'](target, level, xoffset, yoffset, zoffset, width, height, depth, format, heapView); } var _llvm_pow_f32=Math_pow; function _glBindSampler(unit, sampler) { GLctx['bindSampler'](unit, sampler ? GL.samplers[sampler] : null); } function _glProgramParameteri(program, pname, value) { GL.recordError(0x0500/*GL_INVALID_ENUM*/); } function _emscripten_glTexParameterf(x0, x1, x2) { GLctx['texParameterf'](x0, x1, x2) } var JSEvents={keyEvent:0,mouseEvent:0,wheelEvent:0,uiEvent:0,focusEvent:0,deviceOrientationEvent:0,deviceMotionEvent:0,fullscreenChangeEvent:0,pointerlockChangeEvent:0,visibilityChangeEvent:0,touchEvent:0,lastGamepadState:null,lastGamepadStateFrame:null,previousFullscreenElement:null,previousScreenX:null,previousScreenY:null,removeEventListenersRegistered:false,registerRemoveEventListeners:function () { if (!JSEvents.removeEventListenersRegistered) { __ATEXIT__.push(function() { for(var i = JSEvents.eventHandlers.length-1; i >= 0; --i) { JSEvents._removeHandler(i); } }); JSEvents.removeEventListenersRegistered = true; } },findEventTarget:function (target) { if (target) { if (typeof target == "number") { target = Pointer_stringify(target); } if (target == '#window') return window; else if (target == '#document') return document; else if (target == '#screen') return window.screen; else if (target == '#canvas') return Module['canvas']; if (typeof target == 'string') return document.getElementById(target); else return target; } else { // The sensible target varies between events, but use window as the default // since DOM events mostly can default to that. Specific callback registrations // override their own defaults. return window; } },deferredCalls:[],deferCall:function (targetFunction, precedence, argsList) { function arraysHaveEqualContent(arrA, arrB) { if (arrA.length != arrB.length) return false; for(var i in arrA) { if (arrA[i] != arrB[i]) return false; } return true; } // Test if the given call was already queued, and if so, don't add it again. for(var i in JSEvents.deferredCalls) { var call = JSEvents.deferredCalls[i]; if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { return; } } JSEvents.deferredCalls.push({ targetFunction: targetFunction, precedence: precedence, argsList: argsList }); JSEvents.deferredCalls.sort(function(x,y) { return x.precedence < y.precedence; }); },removeDeferredCalls:function (targetFunction) { for(var i = 0; i < JSEvents.deferredCalls.length; ++i) { if (JSEvents.deferredCalls[i].targetFunction == targetFunction) { JSEvents.deferredCalls.splice(i, 1); --i; } } },canPerformEventHandlerRequests:function () { return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; },runDeferredCalls:function () { if (!JSEvents.canPerformEventHandlerRequests()) { return; } for(var i = 0; i < JSEvents.deferredCalls.length; ++i) { var call = JSEvents.deferredCalls[i]; JSEvents.deferredCalls.splice(i, 1); --i; call.targetFunction.apply(this, call.argsList); } },inEventHandler:0,currentEventHandler:null,eventHandlers:[],isInternetExplorer:function () { return navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0; },removeAllHandlersOnTarget:function (target, eventTypeString) { for(var i = 0; i < JSEvents.eventHandlers.length; ++i) { if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { JSEvents._removeHandler(i--); } } },_removeHandler:function (i) { var h = JSEvents.eventHandlers[i]; h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); JSEvents.eventHandlers.splice(i, 1); },registerOrRemoveHandler:function (eventHandler) { var jsEventHandler = function jsEventHandler(event) { // Increment nesting count for the event handler. ++JSEvents.inEventHandler; JSEvents.currentEventHandler = eventHandler; // Process any old deferred calls the user has placed. JSEvents.runDeferredCalls(); // Process the actual event, calls back to user C code handler. eventHandler.handlerFunc(event); // Process any new deferred calls that were placed right now from this event handler. JSEvents.runDeferredCalls(); // Out of event handler - restore nesting count. --JSEvents.inEventHandler; } if (eventHandler.callbackfunc) { eventHandler.eventListenerFunc = jsEventHandler; eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); JSEvents.eventHandlers.push(eventHandler); JSEvents.registerRemoveEventListeners(); } else { for(var i = 0; i < JSEvents.eventHandlers.length; ++i) { if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { JSEvents._removeHandler(i--); } } } },registerKeyEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.keyEvent) { JSEvents.keyEvent = _malloc( 164 ); } var handlerFunc = function(event) { var e = event || window.event; stringToUTF8(e.key ? e.key : "", JSEvents.keyEvent + 0, 32); stringToUTF8(e.code ? e.code : "", JSEvents.keyEvent + 32, 32); HEAP32[(((JSEvents.keyEvent)+(64))>>2)]=e.location; HEAP32[(((JSEvents.keyEvent)+(68))>>2)]=e.ctrlKey; HEAP32[(((JSEvents.keyEvent)+(72))>>2)]=e.shiftKey; HEAP32[(((JSEvents.keyEvent)+(76))>>2)]=e.altKey; HEAP32[(((JSEvents.keyEvent)+(80))>>2)]=e.metaKey; HEAP32[(((JSEvents.keyEvent)+(84))>>2)]=e.repeat; stringToUTF8(e.locale ? e.locale : "", JSEvents.keyEvent + 88, 32); stringToUTF8(e.char ? e.char : "", JSEvents.keyEvent + 120, 32); HEAP32[(((JSEvents.keyEvent)+(152))>>2)]=e.charCode; HEAP32[(((JSEvents.keyEvent)+(156))>>2)]=e.keyCode; HEAP32[(((JSEvents.keyEvent)+(160))>>2)]=e.which; var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.keyEvent, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: JSEvents.findEventTarget(target), allowsDeferredCalls: JSEvents.isInternetExplorer() ? false : true, // MSIE doesn't allow fullscreen and pointerlock requests from key handlers, others do. eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },getBoundingClientRectOrZeros:function (target) { return target.getBoundingClientRect ? target.getBoundingClientRect() : { left: 0, top: 0 }; },fillMouseEventData:function (eventStruct, e, target) { HEAPF64[((eventStruct)>>3)]=JSEvents.tick(); HEAP32[(((eventStruct)+(8))>>2)]=e.screenX; HEAP32[(((eventStruct)+(12))>>2)]=e.screenY; HEAP32[(((eventStruct)+(16))>>2)]=e.clientX; HEAP32[(((eventStruct)+(20))>>2)]=e.clientY; HEAP32[(((eventStruct)+(24))>>2)]=e.ctrlKey; HEAP32[(((eventStruct)+(28))>>2)]=e.shiftKey; HEAP32[(((eventStruct)+(32))>>2)]=e.altKey; HEAP32[(((eventStruct)+(36))>>2)]=e.metaKey; HEAP16[(((eventStruct)+(40))>>1)]=e.button; HEAP16[(((eventStruct)+(42))>>1)]=e.buttons; HEAP32[(((eventStruct)+(44))>>2)]=e["movementX"] || e["mozMovementX"] || e["webkitMovementX"] || (e.screenX-JSEvents.previousScreenX); HEAP32[(((eventStruct)+(48))>>2)]=e["movementY"] || e["mozMovementY"] || e["webkitMovementY"] || (e.screenY-JSEvents.previousScreenY); if (Module['canvas']) { var rect = Module['canvas'].getBoundingClientRect(); HEAP32[(((eventStruct)+(60))>>2)]=e.clientX - rect.left; HEAP32[(((eventStruct)+(64))>>2)]=e.clientY - rect.top; } else { // Canvas is not initialized, return 0. HEAP32[(((eventStruct)+(60))>>2)]=0; HEAP32[(((eventStruct)+(64))>>2)]=0; } if (target) { var rect = JSEvents.getBoundingClientRectOrZeros(target); HEAP32[(((eventStruct)+(52))>>2)]=e.clientX - rect.left; HEAP32[(((eventStruct)+(56))>>2)]=e.clientY - rect.top; } else { // No specific target passed, return 0. HEAP32[(((eventStruct)+(52))>>2)]=0; HEAP32[(((eventStruct)+(56))>>2)]=0; } JSEvents.previousScreenX = e.screenX; JSEvents.previousScreenY = e.screenY; },registerMouseEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.mouseEvent) { JSEvents.mouseEvent = _malloc( 72 ); } target = JSEvents.findEventTarget(target); var handlerFunc = function(event) { var e = event || window.event; JSEvents.fillMouseEventData(JSEvents.mouseEvent, e, target); var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.mouseEvent, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: target, allowsDeferredCalls: eventTypeString != 'mousemove' && eventTypeString != 'mouseenter' && eventTypeString != 'mouseleave', // Mouse move events do not allow fullscreen/pointer lock requests to be handled in them! eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; // In IE, mousedown events don't either allow deferred calls to be run! if (JSEvents.isInternetExplorer() && eventTypeString == 'mousedown') eventHandler.allowsDeferredCalls = false; JSEvents.registerOrRemoveHandler(eventHandler); },registerWheelEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.wheelEvent) { JSEvents.wheelEvent = _malloc( 104 ); } target = JSEvents.findEventTarget(target); // The DOM Level 3 events spec event 'wheel' var wheelHandlerFunc = function(event) { var e = event || window.event; JSEvents.fillMouseEventData(JSEvents.wheelEvent, e, target); HEAPF64[(((JSEvents.wheelEvent)+(72))>>3)]=e["deltaX"]; HEAPF64[(((JSEvents.wheelEvent)+(80))>>3)]=e["deltaY"]; HEAPF64[(((JSEvents.wheelEvent)+(88))>>3)]=e["deltaZ"]; HEAP32[(((JSEvents.wheelEvent)+(96))>>2)]=e["deltaMode"]; var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.wheelEvent, userData); if (shouldCancel) { e.preventDefault(); } }; // The 'mousewheel' event as implemented in Safari 6.0.5 var mouseWheelHandlerFunc = function(event) { var e = event || window.event; JSEvents.fillMouseEventData(JSEvents.wheelEvent, e, target); HEAPF64[(((JSEvents.wheelEvent)+(72))>>3)]=e["wheelDeltaX"] || 0; HEAPF64[(((JSEvents.wheelEvent)+(80))>>3)]=-(e["wheelDeltaY"] ? e["wheelDeltaY"] : e["wheelDelta"]) /* 1. Invert to unify direction with the DOM Level 3 wheel event. 2. MSIE does not provide wheelDeltaY, so wheelDelta is used as a fallback. */; HEAPF64[(((JSEvents.wheelEvent)+(88))>>3)]=0 /* Not available */; HEAP32[(((JSEvents.wheelEvent)+(96))>>2)]=0 /* DOM_DELTA_PIXEL */; var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.wheelEvent, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: target, allowsDeferredCalls: true, eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: (eventTypeString == 'wheel') ? wheelHandlerFunc : mouseWheelHandlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },pageScrollPos:function () { if (window.pageXOffset > 0 || window.pageYOffset > 0) { return [window.pageXOffset, window.pageYOffset]; } if (typeof document.documentElement.scrollLeft !== 'undefined' || typeof document.documentElement.scrollTop !== 'undefined') { return [document.documentElement.scrollLeft, document.documentElement.scrollTop]; } return [document.body.scrollLeft|0, document.body.scrollTop|0]; },registerUiEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.uiEvent) { JSEvents.uiEvent = _malloc( 36 ); } if (eventTypeString == "scroll" && !target) { target = document; // By default read scroll events on document rather than window. } else { target = JSEvents.findEventTarget(target); } var handlerFunc = function(event) { var e = event || window.event; if (e.target != target) { // Never take ui events such as scroll via a 'bubbled' route, but always from the direct element that // was targeted. Otherwise e.g. if app logs a message in response to a page scroll, the Emscripten log // message box could cause to scroll, generating a new (bubbled) scroll message, causing a new log print, // causing a new scroll, etc.. return; } var scrollPos = JSEvents.pageScrollPos(); HEAP32[((JSEvents.uiEvent)>>2)]=e.detail; HEAP32[(((JSEvents.uiEvent)+(4))>>2)]=document.body.clientWidth; HEAP32[(((JSEvents.uiEvent)+(8))>>2)]=document.body.clientHeight; HEAP32[(((JSEvents.uiEvent)+(12))>>2)]=window.innerWidth; HEAP32[(((JSEvents.uiEvent)+(16))>>2)]=window.innerHeight; HEAP32[(((JSEvents.uiEvent)+(20))>>2)]=window.outerWidth; HEAP32[(((JSEvents.uiEvent)+(24))>>2)]=window.outerHeight; HEAP32[(((JSEvents.uiEvent)+(28))>>2)]=scrollPos[0]; HEAP32[(((JSEvents.uiEvent)+(32))>>2)]=scrollPos[1]; var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.uiEvent, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: target, allowsDeferredCalls: false, // Neither scroll or resize events allow running requests inside them. eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },getNodeNameForTarget:function (target) { if (!target) return ''; if (target == window) return '#window'; if (target == window.screen) return '#screen'; return (target && target.nodeName) ? target.nodeName : ''; },registerFocusEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.focusEvent) { JSEvents.focusEvent = _malloc( 256 ); } var handlerFunc = function(event) { var e = event || window.event; var nodeName = JSEvents.getNodeNameForTarget(e.target); var id = e.target.id ? e.target.id : ''; stringToUTF8(nodeName, JSEvents.focusEvent + 0, 128); stringToUTF8(id, JSEvents.focusEvent + 128, 128); var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.focusEvent, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: JSEvents.findEventTarget(target), allowsDeferredCalls: false, eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },tick:function () { if (window['performance'] && window['performance']['now']) return window['performance']['now'](); else return Date.now(); },registerDeviceOrientationEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.deviceOrientationEvent) { JSEvents.deviceOrientationEvent = _malloc( 40 ); } var handlerFunc = function(event) { var e = event || window.event; HEAPF64[((JSEvents.deviceOrientationEvent)>>3)]=JSEvents.tick(); HEAPF64[(((JSEvents.deviceOrientationEvent)+(8))>>3)]=e.alpha; HEAPF64[(((JSEvents.deviceOrientationEvent)+(16))>>3)]=e.beta; HEAPF64[(((JSEvents.deviceOrientationEvent)+(24))>>3)]=e.gamma; HEAP32[(((JSEvents.deviceOrientationEvent)+(32))>>2)]=e.absolute; var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.deviceOrientationEvent, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: JSEvents.findEventTarget(target), allowsDeferredCalls: false, eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },registerDeviceMotionEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.deviceMotionEvent) { JSEvents.deviceMotionEvent = _malloc( 80 ); } var handlerFunc = function(event) { var e = event || window.event; HEAPF64[((JSEvents.deviceOrientationEvent)>>3)]=JSEvents.tick(); HEAPF64[(((JSEvents.deviceMotionEvent)+(8))>>3)]=e.acceleration.x; HEAPF64[(((JSEvents.deviceMotionEvent)+(16))>>3)]=e.acceleration.y; HEAPF64[(((JSEvents.deviceMotionEvent)+(24))>>3)]=e.acceleration.z; HEAPF64[(((JSEvents.deviceMotionEvent)+(32))>>3)]=e.accelerationIncludingGravity.x; HEAPF64[(((JSEvents.deviceMotionEvent)+(40))>>3)]=e.accelerationIncludingGravity.y; HEAPF64[(((JSEvents.deviceMotionEvent)+(48))>>3)]=e.accelerationIncludingGravity.z; HEAPF64[(((JSEvents.deviceMotionEvent)+(56))>>3)]=e.rotationRate.alpha; HEAPF64[(((JSEvents.deviceMotionEvent)+(64))>>3)]=e.rotationRate.beta; HEAPF64[(((JSEvents.deviceMotionEvent)+(72))>>3)]=e.rotationRate.gamma; var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.deviceMotionEvent, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: JSEvents.findEventTarget(target), allowsDeferredCalls: false, eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },screenOrientation:function () { if (!window.screen) return undefined; return window.screen.orientation || window.screen.mozOrientation || window.screen.webkitOrientation || window.screen.msOrientation; },fillOrientationChangeEventData:function (eventStruct, e) { var orientations = ["portrait-primary", "portrait-secondary", "landscape-primary", "landscape-secondary"]; var orientations2 = ["portrait", "portrait", "landscape", "landscape"]; var orientationString = JSEvents.screenOrientation(); var orientation = orientations.indexOf(orientationString); if (orientation == -1) { orientation = orientations2.indexOf(orientationString); } HEAP32[((eventStruct)>>2)]=1 << orientation; HEAP32[(((eventStruct)+(4))>>2)]=window.orientation; },registerOrientationChangeEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.orientationChangeEvent) { JSEvents.orientationChangeEvent = _malloc( 8 ); } if (!target) { target = window.screen; // Orientation events need to be captured from 'window.screen' instead of 'window' } else { target = JSEvents.findEventTarget(target); } var handlerFunc = function(event) { var e = event || window.event; JSEvents.fillOrientationChangeEventData(JSEvents.orientationChangeEvent, e); var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.orientationChangeEvent, userData); if (shouldCancel) { e.preventDefault(); } }; if (eventTypeString == "orientationchange" && window.screen.mozOrientation !== undefined) { eventTypeString = "mozorientationchange"; } var eventHandler = { target: target, allowsDeferredCalls: false, eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },fullscreenEnabled:function () { return document.fullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled || document.msFullscreenEnabled; },fillFullscreenChangeEventData:function (eventStruct, e) { var fullscreenElement = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement; var isFullscreen = !!fullscreenElement; HEAP32[((eventStruct)>>2)]=isFullscreen; HEAP32[(((eventStruct)+(4))>>2)]=JSEvents.fullscreenEnabled(); // If transitioning to fullscreen, report info about the element that is now fullscreen. // If transitioning to windowed mode, report info about the element that just was fullscreen. var reportedElement = isFullscreen ? fullscreenElement : JSEvents.previousFullscreenElement; var nodeName = JSEvents.getNodeNameForTarget(reportedElement); var id = (reportedElement && reportedElement.id) ? reportedElement.id : ''; stringToUTF8(nodeName, eventStruct + 8, 128); stringToUTF8(id, eventStruct + 136, 128); HEAP32[(((eventStruct)+(264))>>2)]=reportedElement ? reportedElement.clientWidth : 0; HEAP32[(((eventStruct)+(268))>>2)]=reportedElement ? reportedElement.clientHeight : 0; HEAP32[(((eventStruct)+(272))>>2)]=screen.width; HEAP32[(((eventStruct)+(276))>>2)]=screen.height; if (isFullscreen) { JSEvents.previousFullscreenElement = fullscreenElement; } },registerFullscreenChangeEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.fullscreenChangeEvent) { JSEvents.fullscreenChangeEvent = _malloc( 280 ); } if (!target) { target = document; // Fullscreen change events need to be captured from 'document' by default instead of 'window' } else { target = JSEvents.findEventTarget(target); } var handlerFunc = function(event) { var e = event || window.event; JSEvents.fillFullscreenChangeEventData(JSEvents.fullscreenChangeEvent, e); var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.fullscreenChangeEvent, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: target, allowsDeferredCalls: false, eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },resizeCanvasForFullscreen:function (target, strategy) { var restoreOldStyle = __registerRestoreOldStyle(target); var cssWidth = strategy.softFullscreen ? window.innerWidth : screen.width; var cssHeight = strategy.softFullscreen ? window.innerHeight : screen.height; var rect = target.getBoundingClientRect(); var windowedCssWidth = rect.right - rect.left; var windowedCssHeight = rect.bottom - rect.top; var windowedRttWidth = target.width; var windowedRttHeight = target.height; if (strategy.scaleMode == 3) { __setLetterbox(target, (cssHeight - windowedCssHeight) / 2, (cssWidth - windowedCssWidth) / 2); cssWidth = windowedCssWidth; cssHeight = windowedCssHeight; } else if (strategy.scaleMode == 2) { if (cssWidth*windowedRttHeight < windowedRttWidth*cssHeight) { var desiredCssHeight = windowedRttHeight * cssWidth / windowedRttWidth; __setLetterbox(target, (cssHeight - desiredCssHeight) / 2, 0); cssHeight = desiredCssHeight; } else { var desiredCssWidth = windowedRttWidth * cssHeight / windowedRttHeight; __setLetterbox(target, 0, (cssWidth - desiredCssWidth) / 2); cssWidth = desiredCssWidth; } } // If we are adding padding, must choose a background color or otherwise Chrome will give the // padding a default white color. Do it only if user has not customized their own background color. if (!target.style.backgroundColor) target.style.backgroundColor = 'black'; // IE11 does the same, but requires the color to be set in the document body. if (!document.body.style.backgroundColor) document.body.style.backgroundColor = 'black'; // IE11 // Firefox always shows black letterboxes independent of style color. target.style.width = cssWidth + 'px'; target.style.height = cssHeight + 'px'; if (strategy.filteringMode == 1) { target.style.imageRendering = 'optimizeSpeed'; target.style.imageRendering = '-moz-crisp-edges'; target.style.imageRendering = '-o-crisp-edges'; target.style.imageRendering = '-webkit-optimize-contrast'; target.style.imageRendering = 'optimize-contrast'; target.style.imageRendering = 'crisp-edges'; target.style.imageRendering = 'pixelated'; } var dpiScale = (strategy.canvasResolutionScaleMode == 2) ? window.devicePixelRatio : 1; if (strategy.canvasResolutionScaleMode != 0) { target.width = cssWidth * dpiScale; target.height = cssHeight * dpiScale; if (target.GLctxObject) target.GLctxObject.GLctx.viewport(0, 0, target.width, target.height); } return restoreOldStyle; },requestFullscreen:function (target, strategy) { // EMSCRIPTEN_FULLSCREEN_SCALE_DEFAULT + EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE is a mode where no extra logic is performed to the DOM elements. if (strategy.scaleMode != 0 || strategy.canvasResolutionScaleMode != 0) { JSEvents.resizeCanvasForFullscreen(target, strategy); } if (target.requestFullscreen) { target.requestFullscreen(); } else if (target.msRequestFullscreen) { target.msRequestFullscreen(); } else if (target.mozRequestFullScreen) { target.mozRequestFullScreen(); } else if (target.mozRequestFullscreen) { target.mozRequestFullscreen(); } else if (target.webkitRequestFullscreen) { target.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); } else { if (typeof JSEvents.fullscreenEnabled() === 'undefined') { return -1; } else { return -3; } } if (strategy.canvasResizedCallback) { Module['dynCall_iiii'](strategy.canvasResizedCallback, 37, 0, strategy.canvasResizedCallbackUserData); } return 0; },fillPointerlockChangeEventData:function (eventStruct, e) { var pointerLockElement = document.pointerLockElement || document.mozPointerLockElement || document.webkitPointerLockElement || document.msPointerLockElement; var isPointerlocked = !!pointerLockElement; HEAP32[((eventStruct)>>2)]=isPointerlocked; var nodeName = JSEvents.getNodeNameForTarget(pointerLockElement); var id = (pointerLockElement && pointerLockElement.id) ? pointerLockElement.id : ''; stringToUTF8(nodeName, eventStruct + 4, 128); stringToUTF8(id, eventStruct + 132, 128); },registerPointerlockChangeEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.pointerlockChangeEvent) { JSEvents.pointerlockChangeEvent = _malloc( 260 ); } if (!target) { target = document; // Pointer lock change events need to be captured from 'document' by default instead of 'window' } else { target = JSEvents.findEventTarget(target); } var handlerFunc = function(event) { var e = event || window.event; JSEvents.fillPointerlockChangeEventData(JSEvents.pointerlockChangeEvent, e); var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.pointerlockChangeEvent, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: target, allowsDeferredCalls: false, eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },registerPointerlockErrorEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!target) { target = document; // Pointer lock events need to be captured from 'document' by default instead of 'window' } else { target = JSEvents.findEventTarget(target); } var handlerFunc = function(event) { var e = event || window.event; var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, 0, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: target, allowsDeferredCalls: false, eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },requestPointerLock:function (target) { if (target.requestPointerLock) { target.requestPointerLock(); } else if (target.mozRequestPointerLock) { target.mozRequestPointerLock(); } else if (target.webkitRequestPointerLock) { target.webkitRequestPointerLock(); } else if (target.msRequestPointerLock) { target.msRequestPointerLock(); } else { // document.body is known to accept pointer lock, so use that to differentiate if the user passed a bad element, // or if the whole browser just doesn't support the feature. if (document.body.requestPointerLock || document.body.mozRequestPointerLock || document.body.webkitRequestPointerLock || document.body.msRequestPointerLock) { return -3; } else { return -1; } } return 0; },fillVisibilityChangeEventData:function (eventStruct, e) { var visibilityStates = [ "hidden", "visible", "prerender", "unloaded" ]; var visibilityState = visibilityStates.indexOf(document.visibilityState); HEAP32[((eventStruct)>>2)]=document.hidden; HEAP32[(((eventStruct)+(4))>>2)]=visibilityState; },registerVisibilityChangeEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.visibilityChangeEvent) { JSEvents.visibilityChangeEvent = _malloc( 8 ); } if (!target) { target = document; // Visibility change events need to be captured from 'document' by default instead of 'window' } else { target = JSEvents.findEventTarget(target); } var handlerFunc = function(event) { var e = event || window.event; JSEvents.fillVisibilityChangeEventData(JSEvents.visibilityChangeEvent, e); var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.visibilityChangeEvent, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: target, allowsDeferredCalls: false, eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },registerTouchEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.touchEvent) { JSEvents.touchEvent = _malloc( 1684 ); } target = JSEvents.findEventTarget(target); var handlerFunc = function(event) { var e = event || window.event; var touches = {}; for(var i = 0; i < e.touches.length; ++i) { var touch = e.touches[i]; touches[touch.identifier] = touch; } for(var i = 0; i < e.changedTouches.length; ++i) { var touch = e.changedTouches[i]; touches[touch.identifier] = touch; touch.changed = true; } for(var i = 0; i < e.targetTouches.length; ++i) { var touch = e.targetTouches[i]; touches[touch.identifier].onTarget = true; } var ptr = JSEvents.touchEvent; HEAP32[(((ptr)+(4))>>2)]=e.ctrlKey; HEAP32[(((ptr)+(8))>>2)]=e.shiftKey; HEAP32[(((ptr)+(12))>>2)]=e.altKey; HEAP32[(((ptr)+(16))>>2)]=e.metaKey; ptr += 20; // Advance to the start of the touch array. var canvasRect = Module['canvas'] ? Module['canvas'].getBoundingClientRect() : undefined; var targetRect = JSEvents.getBoundingClientRectOrZeros(target); var numTouches = 0; for(var i in touches) { var t = touches[i]; HEAP32[((ptr)>>2)]=t.identifier; HEAP32[(((ptr)+(4))>>2)]=t.screenX; HEAP32[(((ptr)+(8))>>2)]=t.screenY; HEAP32[(((ptr)+(12))>>2)]=t.clientX; HEAP32[(((ptr)+(16))>>2)]=t.clientY; HEAP32[(((ptr)+(20))>>2)]=t.pageX; HEAP32[(((ptr)+(24))>>2)]=t.pageY; HEAP32[(((ptr)+(28))>>2)]=t.changed; HEAP32[(((ptr)+(32))>>2)]=t.onTarget; if (canvasRect) { HEAP32[(((ptr)+(44))>>2)]=t.clientX - canvasRect.left; HEAP32[(((ptr)+(48))>>2)]=t.clientY - canvasRect.top; } else { HEAP32[(((ptr)+(44))>>2)]=0; HEAP32[(((ptr)+(48))>>2)]=0; } HEAP32[(((ptr)+(36))>>2)]=t.clientX - targetRect.left; HEAP32[(((ptr)+(40))>>2)]=t.clientY - targetRect.top; ptr += 52; if (++numTouches >= 32) { break; } } HEAP32[((JSEvents.touchEvent)>>2)]=numTouches; var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.touchEvent, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: target, allowsDeferredCalls: false, // XXX Currently disabled, see bug https://bugzilla.mozilla.org/show_bug.cgi?id=966493 // Once the above bug is resolved, enable the following condition if possible: // allowsDeferredCalls: eventTypeString == 'touchstart', eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },fillGamepadEventData:function (eventStruct, e) { HEAPF64[((eventStruct)>>3)]=e.timestamp; for(var i = 0; i < e.axes.length; ++i) { HEAPF64[(((eventStruct+i*8)+(16))>>3)]=e.axes[i]; } for(var i = 0; i < e.buttons.length; ++i) { if (typeof(e.buttons[i]) === 'object') { HEAPF64[(((eventStruct+i*8)+(528))>>3)]=e.buttons[i].value; } else { HEAPF64[(((eventStruct+i*8)+(528))>>3)]=e.buttons[i]; } } for(var i = 0; i < e.buttons.length; ++i) { if (typeof(e.buttons[i]) === 'object') { HEAP32[(((eventStruct+i*4)+(1040))>>2)]=e.buttons[i].pressed; } else { HEAP32[(((eventStruct+i*4)+(1040))>>2)]=e.buttons[i] == 1.0; } } HEAP32[(((eventStruct)+(1296))>>2)]=e.connected; HEAP32[(((eventStruct)+(1300))>>2)]=e.index; HEAP32[(((eventStruct)+(8))>>2)]=e.axes.length; HEAP32[(((eventStruct)+(12))>>2)]=e.buttons.length; stringToUTF8(e.id, eventStruct + 1304, 64); stringToUTF8(e.mapping, eventStruct + 1368, 64); },registerGamepadEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.gamepadEvent) { JSEvents.gamepadEvent = _malloc( 1432 ); } var handlerFunc = function(event) { var e = event || window.event; JSEvents.fillGamepadEventData(JSEvents.gamepadEvent, e.gamepad); var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.gamepadEvent, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: JSEvents.findEventTarget(target), allowsDeferredCalls: true, eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },registerBeforeUnloadEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { var handlerFunc = function(event) { var e = event || window.event; var confirmationMessage = Module['dynCall_iiii'](callbackfunc, eventTypeId, 0, userData); if (confirmationMessage) { confirmationMessage = Pointer_stringify(confirmationMessage); } if (confirmationMessage) { e.preventDefault(); e.returnValue = confirmationMessage; return confirmationMessage; } }; var eventHandler = { target: JSEvents.findEventTarget(target), allowsDeferredCalls: false, eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },battery:function () { return navigator.battery || navigator.mozBattery || navigator.webkitBattery; },fillBatteryEventData:function (eventStruct, e) { HEAPF64[((eventStruct)>>3)]=e.chargingTime; HEAPF64[(((eventStruct)+(8))>>3)]=e.dischargingTime; HEAPF64[(((eventStruct)+(16))>>3)]=e.level; HEAP32[(((eventStruct)+(24))>>2)]=e.charging; },registerBatteryEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!JSEvents.batteryEvent) { JSEvents.batteryEvent = _malloc( 32 ); } var handlerFunc = function(event) { var e = event || window.event; JSEvents.fillBatteryEventData(JSEvents.batteryEvent, JSEvents.battery()); var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, JSEvents.batteryEvent, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: JSEvents.findEventTarget(target), allowsDeferredCalls: false, eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); },registerWebGlEventCallback:function (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { if (!target) { target = Module['canvas']; } var handlerFunc = function(event) { var e = event || window.event; var shouldCancel = Module['dynCall_iiii'](callbackfunc, eventTypeId, 0, userData); if (shouldCancel) { e.preventDefault(); } }; var eventHandler = { target: JSEvents.findEventTarget(target), allowsDeferredCalls: false, eventTypeString: eventTypeString, callbackfunc: callbackfunc, handlerFunc: handlerFunc, useCapture: useCapture }; JSEvents.registerOrRemoveHandler(eventHandler); }};function _emscripten_webgl_destroy_context(contextHandle) { GL.deleteContext(contextHandle); } function emscriptenWebGLGetIndexed(target, index, data, type) { if (!data) { // GLES2 specification does not specify how to behave if data is a null pointer. Since calling this function does not make sense // if data == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); 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 0x8C8F: // TRANSFORM_FEEDBACK_BUFFER_BINDING case 0x8A28: // UNIFORM_BUFFER_BINDING ret = 0; break; default: { GL.recordError(0x0500); // GL_INVALID_ENUM return; } } } else if (result instanceof WebGLBuffer) { ret = result.name | 0; } else { GL.recordError(0x0500); // GL_INVALID_ENUM return; } break; default: GL.recordError(0x0500); // GL_INVALID_ENUM return; } switch (type) { case 'Integer64': (tempI64 = [ret>>>0,(tempDouble=ret,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((data)>>2)]=tempI64[0],HEAP32[(((data)+(4))>>2)]=tempI64[1]); break; case 'Integer': HEAP32[((data)>>2)]=ret; break; case 'Float': HEAPF32[((data)>>2)]=ret; break; case 'Boolean': HEAP8[((data)>>0)]=ret ? 1 : 0; break; default: throw 'internal emscriptenWebGLGetIndexed() error, bad type: ' + type; } }function _glGetIntegeri_v(target, index, data) { emscriptenWebGLGetIndexed(target, index, data, 'Integer'); } function _emscripten_glTexParameteri(x0, x1, x2) { GLctx['texParameteri'](x0, x1, x2) } function _glCompileShader(shader) { GLctx.compileShader(GL.shaders[shader]); } var ___tm_current=STATICTOP; STATICTOP += 48;; var ___tm_timezone=allocate(intArrayFromString("GMT"), "i8", ALLOC_STATIC); var _tzname=STATICTOP; STATICTOP += 16;; var _daylight=STATICTOP; STATICTOP += 16;; var _timezone=STATICTOP; STATICTOP += 16;;function _tzset() { // TODO: Use (malleable) environment variables instead of system settings. if (_tzset.called) return; _tzset.called = true; HEAP32[((_timezone)>>2)]=-(new Date()).getTimezoneOffset() * 60; var winter = new Date(2000, 0, 1); var summer = new Date(2000, 6, 1); HEAP32[((_daylight)>>2)]=Number(winter.getTimezoneOffset() != summer.getTimezoneOffset()); function extractZone(date) { var match = date.toTimeString().match(/\(([A-Za-z ]+)\)$/); return match ? match[1] : "GMT"; }; var winterName = extractZone(winter); var summerName = extractZone(summer); var winterNamePtr = allocate(intArrayFromString(winterName), 'i8', ALLOC_NORMAL); var summerNamePtr = allocate(intArrayFromString(summerName), 'i8', ALLOC_NORMAL); if (summer.getTimezoneOffset() < winter.getTimezoneOffset()) { // Northern hemisphere HEAP32[((_tzname)>>2)]=winterNamePtr; HEAP32[(((_tzname)+(4))>>2)]=summerNamePtr; } else { HEAP32[((_tzname)>>2)]=summerNamePtr; HEAP32[(((_tzname)+(4))>>2)]=winterNamePtr; } }function _localtime_r(time, tmPtr) { _tzset(); var date = new Date(HEAP32[((time)>>2)]*1000); HEAP32[((tmPtr)>>2)]=date.getSeconds(); HEAP32[(((tmPtr)+(4))>>2)]=date.getMinutes(); HEAP32[(((tmPtr)+(8))>>2)]=date.getHours(); HEAP32[(((tmPtr)+(12))>>2)]=date.getDate(); HEAP32[(((tmPtr)+(16))>>2)]=date.getMonth(); HEAP32[(((tmPtr)+(20))>>2)]=date.getFullYear()-1900; HEAP32[(((tmPtr)+(24))>>2)]=date.getDay(); var start = new Date(date.getFullYear(), 0, 1); var yday = ((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24))|0; HEAP32[(((tmPtr)+(28))>>2)]=yday; HEAP32[(((tmPtr)+(36))>>2)]=-(date.getTimezoneOffset() * 60); // DST is in December in South var summerOffset = new Date(2000, 6, 1).getTimezoneOffset(); var winterOffset = start.getTimezoneOffset(); var dst = (date.getTimezoneOffset() == Math.min(winterOffset, summerOffset))|0; HEAP32[(((tmPtr)+(32))>>2)]=dst; var zonePtr = HEAP32[(((_tzname)+(dst ? Runtime.QUANTUM_SIZE : 0))>>2)]; HEAP32[(((tmPtr)+(40))>>2)]=zonePtr; return tmPtr; }function _localtime(time) { return _localtime_r(time, ___tm_current); } function _emscripten_glFrustum() { Module['printErr']('missing function: emscripten_glFrustum'); abort(-1); } function _emscripten_glGetTexParameterfv(target, pname, params) { if (!params) { // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense // if p == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } HEAPF32[((params)>>2)]=GLctx.getTexParameter(target, pname); } function _emscripten_glBindRenderbuffer(target, renderbuffer) { GLctx.bindRenderbuffer(target, renderbuffer ? GL.renderbuffers[renderbuffer] : null); } function _glVertexAttribIPointer(index, size, type, stride, ptr) { var cb = GL.currentContext.clientBuffers[index]; if (!GL.currArrayBuffer) { cb.size = size; cb.type = type; cb.normalized = false; cb.stride = stride; cb.ptr = ptr; cb.clientside = true; return; } cb.clientside = false; GLctx.vertexAttribIPointer(index, size, type, stride, ptr); } function __emscripten_sample_gamepad_data() { // Produce a new Gamepad API sample if we are ticking a new game frame, or if not using emscripten_set_main_loop() at all to drive animation. if (Browser.mainLoop.currentFrameNumber !== JSEvents.lastGamepadStateFrame || !Browser.mainLoop.currentFrameNumber) { JSEvents.lastGamepadState = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads : null); JSEvents.lastGamepadStateFrame = Browser.mainLoop.currentFrameNumber; } }function _emscripten_get_gamepad_status(index, gamepadState) { __emscripten_sample_gamepad_data(); if (!JSEvents.lastGamepadState) return -1; // INVALID_PARAM is returned on a Gamepad index that never was there. if (index < 0 || index >= JSEvents.lastGamepadState.length) return -5; // NO_DATA is returned on a Gamepad index that was removed. // For previously disconnected gamepads there should be an empty slot (null/undefined/false) at the index. // This is because gamepads must keep their original position in the array. // For example, removing the first of two gamepads produces [null/undefined/false, gamepad]. if (!JSEvents.lastGamepadState[index]) return -7; JSEvents.fillGamepadEventData(gamepadState, JSEvents.lastGamepadState[index]); return 0; } var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86}; var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"}; function ___setErrNo(value) { if (Module['___errno_location']) HEAP32[((Module['___errno_location']())>>2)]=value; return value; } var PATH={splitPath:function (filename) { var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; return splitPathRe.exec(filename).slice(1); },normalizeArray:function (parts, allowAboveRoot) { // if the path tries to go above the root, `up` ends up > 0 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 the path is allowed to go above the root, restore leading ..s if (allowAboveRoot) { for (; up--; up) { parts.unshift('..'); } } return parts; },normalize:function (path) { var isAbsolute = path.charAt(0) === '/', trailingSlash = path.substr(-1) === '/'; // Normalize the path path = PATH.normalizeArray(path.split('/').filter(function(p) { return !!p; }), !isAbsolute).join('/'); if (!path && !isAbsolute) { path = '.'; } if (path && trailingSlash) { path += '/'; } return (isAbsolute ? '/' : '') + path; },dirname:function (path) { var result = PATH.splitPath(path), root = result[0], dir = result[1]; if (!root && !dir) { // No dirname whatsoever return '.'; } if (dir) { // It has a dirname, strip trailing slash dir = dir.substr(0, dir.length - 1); } return root + dir; },basename:function (path) { // EMSCRIPTEN return '/'' for '/', not an empty string if (path === '/') return '/'; var lastSlash = path.lastIndexOf('/'); if (lastSlash === -1) return path; return path.substr(lastSlash+1); },extname:function (path) { return PATH.splitPath(path)[3]; },join:function () { var paths = Array.prototype.slice.call(arguments, 0); return PATH.normalize(paths.join('/')); },join2:function (l, r) { return PATH.normalize(l + '/' + r); },resolve:function () { var resolvedPath = '', resolvedAbsolute = false; for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { var path = (i >= 0) ? arguments[i] : FS.cwd(); // Skip empty and invalid entries if (typeof path !== 'string') { throw new TypeError('Arguments to path.resolve must be strings'); } else if (!path) { return ''; // an invalid portion invalidates the whole thing } resolvedPath = path + '/' + resolvedPath; resolvedAbsolute = path.charAt(0) === '/'; } // At this point the path should be resolved to a full absolute path, but // handle relative paths to be safe (might happen when process.cwd() fails) resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { return !!p; }), !resolvedAbsolute).join('/'); return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; },relative:function (from, to) { from = PATH.resolve(from).substr(1); to = PATH.resolve(to).substr(1); function trim(arr) { var start = 0; for (; start < arr.length; start++) { if (arr[start] !== '') break; } var end = arr.length - 1; for (; end >= 0; end--) { if (arr[end] !== '') break; } if (start > end) return []; return arr.slice(start, end - start + 1); } var fromParts = trim(from.split('/')); var toParts = trim(to.split('/')); var length = Math.min(fromParts.length, toParts.length); var samePartsLength = length; for (var i = 0; i < length; i++) { if (fromParts[i] !== toParts[i]) { samePartsLength = i; break; } } var outputParts = []; for (var i = samePartsLength; i < fromParts.length; i++) { outputParts.push('..'); } outputParts = outputParts.concat(toParts.slice(samePartsLength)); return outputParts.join('/'); }}; var TTY={ttys:[],init:function () { // https://github.com/kripken/emscripten/pull/1555 // if (ENVIRONMENT_IS_NODE) { // // currently, FS.init does not distinguish if process.stdin is a file or TTY // // device, it always assumes it's a TTY device. because of this, we're forcing // // process.stdin to UTF8 encoding to at least make stdin reading compatible // // with text files until FS.init can be refactored. // process['stdin']['setEncoding']('utf8'); // } },shutdown:function () { // https://github.com/kripken/emscripten/pull/1555 // if (ENVIRONMENT_IS_NODE) { // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call // process['stdin']['pause'](); // } },register:function (dev, ops) { TTY.ttys[dev] = { input: [], output: [], ops: ops }; FS.registerDevice(dev, TTY.stream_ops); },stream_ops:{open:function (stream) { var tty = TTY.ttys[stream.node.rdev]; if (!tty) { throw new FS.ErrnoError(ERRNO_CODES.ENODEV); } stream.tty = tty; stream.seekable = false; },close:function (stream) { // flush any pending line data stream.tty.ops.flush(stream.tty); },flush:function (stream) { stream.tty.ops.flush(stream.tty); },read:function (stream, buffer, offset, length, pos /* ignored */) { if (!stream.tty || !stream.tty.ops.get_char) { throw new FS.ErrnoError(ERRNO_CODES.ENXIO); } var bytesRead = 0; for (var i = 0; i < length; i++) { var result; try { result = stream.tty.ops.get_char(stream.tty); } catch (e) { throw new FS.ErrnoError(ERRNO_CODES.EIO); } if (result === undefined && bytesRead === 0) { throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); } if (result === null || result === undefined) break; bytesRead++; buffer[offset+i] = result; } if (bytesRead) { stream.node.timestamp = Date.now(); } return bytesRead; },write:function (stream, buffer, offset, length, pos) { if (!stream.tty || !stream.tty.ops.put_char) { throw new FS.ErrnoError(ERRNO_CODES.ENXIO); } for (var i = 0; i < length; i++) { try { stream.tty.ops.put_char(stream.tty, buffer[offset+i]); } catch (e) { throw new FS.ErrnoError(ERRNO_CODES.EIO); } } if (length) { stream.node.timestamp = Date.now(); } return i; }},default_tty_ops:{get_char:function (tty) { if (!tty.input.length) { var result = null; if (ENVIRONMENT_IS_NODE) { // we will read data by chunks of BUFSIZE var BUFSIZE = 256; var buf = new Buffer(BUFSIZE); var bytesRead = 0; var isPosixPlatform = (process.platform != 'win32'); // Node doesn't offer a direct check, so test by exclusion var fd = process.stdin.fd; if (isPosixPlatform) { // Linux and Mac cannot use process.stdin.fd (which isn't set up as sync) var usingDevice = false; try { fd = fs.openSync('/dev/stdin', 'r'); usingDevice = true; } catch (e) {} } try { bytesRead = fs.readSync(fd, buf, 0, BUFSIZE, null); } catch(e) { // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. if (e.toString().indexOf('EOF') != -1) bytesRead = 0; else throw e; } if (usingDevice) { fs.closeSync(fd); } if (bytesRead > 0) { result = buf.slice(0, bytesRead).toString('utf-8'); } else { result = null; } } else if (typeof window != 'undefined' && typeof window.prompt == 'function') { // Browser. result = window.prompt('Input: '); // returns null on cancel if (result !== null) { result += '\n'; } } else if (typeof readline == 'function') { // Command line. result = readline(); if (result !== null) { result += '\n'; } } if (!result) { return null; } tty.input = intArrayFromString(result, true); } return tty.input.shift(); },put_char:function (tty, val) { if (val === null || val === 10) { Module['print'](UTF8ArrayToString(tty.output, 0)); tty.output = []; } else { if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. } },flush:function (tty) { if (tty.output && tty.output.length > 0) { Module['print'](UTF8ArrayToString(tty.output, 0)); tty.output = []; } }},default_tty1_ops:{put_char:function (tty, val) { if (val === null || val === 10) { Module['printErr'](UTF8ArrayToString(tty.output, 0)); tty.output = []; } else { if (val != 0) tty.output.push(val); } },flush:function (tty) { if (tty.output && tty.output.length > 0) { Module['printErr'](UTF8ArrayToString(tty.output, 0)); tty.output = []; } }}}; var MEMFS={ops_table:null,mount:function (mount) { return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); },createNode:function (parent, name, mode, dev) { if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { // no supported throw new FS.ErrnoError(ERRNO_CODES.EPERM); } if (!MEMFS.ops_table) { 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; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. 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(); // add the new node to the parent if (parent) { parent.contents[name] = node; } return node; },getFileDataAsRegularArray:function (node) { if (node.contents && node.contents.subarray) { var arr = []; for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]); return arr; // Returns a copy of the original data. } return node.contents; // No-op, the file contents are already in a JS array. Return as-is. },getFileDataAsTypedArray:function (node) { if (!node.contents) return new Uint8Array; if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. return new Uint8Array(node.contents); },expandFileStorage:function (node, newCapacity) { // If we are asked to expand the size of a file that already exists, revert to using a standard JS array to store the file // instead of a typed array. This makes resizing the array more flexible because we can just .push() elements at the back to // increase the size. if (node.contents && node.contents.subarray && newCapacity > node.contents.length) { node.contents = MEMFS.getFileDataAsRegularArray(node); node.usedBytes = node.contents.length; // We might be writing to a lazy-loaded file which had overridden this property, so force-reset it. } if (!node.contents || node.contents.subarray) { // Keep using a typed array if creating a new storage, or if old one was a typed array as well. var prevCapacity = node.contents ? node.contents.length : 0; if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to // avoid overshooting the allocation cap by a very large margin. var CAPACITY_DOUBLING_MAX = 1024 * 1024; newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) | 0); if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. var oldContents = node.contents; node.contents = new Uint8Array(newCapacity); // Allocate new storage. if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. return; } // Not using a typed array to back the file storage. Use a standard JS array instead. if (!node.contents && newCapacity > 0) node.contents = []; while (node.contents.length < newCapacity) node.contents.push(0); },resizeFileStorage:function (node, newSize) { if (node.usedBytes == newSize) return; if (newSize == 0) { node.contents = null; // Fully decommit when requesting a resize to zero. node.usedBytes = 0; return; } if (!node.contents || node.contents.subarray) { // Resize a typed array if that is being used as the backing store. var oldContents = node.contents; node.contents = new Uint8Array(new ArrayBuffer(newSize)); // Allocate new storage. if (oldContents) { node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. } node.usedBytes = newSize; return; } // Backing with a JS array. if (!node.contents) node.contents = []; if (node.contents.length > newSize) node.contents.length = newSize; else while (node.contents.length < newSize) node.contents.push(0); node.usedBytes = newSize; },node_ops:{getattr:function (node) { var attr = {}; // device numbers reuse inode numbers. 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); // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), // but this is not required by the standard. attr.blksize = 4096; attr.blocks = Math.ceil(attr.size / attr.blksize); return attr; },setattr:function (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:function (parent, name) { throw FS.genericErrors[ERRNO_CODES.ENOENT]; },mknod:function (parent, name, mode, dev) { return MEMFS.createNode(parent, name, mode, dev); },rename:function (old_node, new_dir, new_name) { // if we're overwriting a directory at new_name, make sure it's empty. 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(ERRNO_CODES.ENOTEMPTY); } } } // do the internal rewiring delete old_node.parent.contents[old_node.name]; old_node.name = new_name; new_dir.contents[new_name] = old_node; old_node.parent = new_dir; },unlink:function (parent, name) { delete parent.contents[name]; },rmdir:function (parent, name) { var node = FS.lookupNode(parent, name); for (var i in node.contents) { throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); } delete parent.contents[name]; },readdir:function (node) { var entries = ['.', '..'] for (var key in node.contents) { if (!node.contents.hasOwnProperty(key)) { continue; } entries.push(key); } return entries; },symlink:function (parent, newname, oldpath) { var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); node.link = oldpath; return node; },readlink:function (node) { if (!FS.isLink(node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } return node.link; }},stream_ops:{read:function (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); assert(size >= 0); if (size > 8 && contents.subarray) { // non-trivial, and typed array buffer.set(contents.subarray(position, position + size), offset); } else { for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; } return size; },write:function (stream, buffer, offset, length, position, canOwn) { if (!length) return 0; var node = stream.node; node.timestamp = Date.now(); if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? if (canOwn) { node.contents = buffer.subarray(offset, offset + length); node.usedBytes = length; return length; } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. node.contents = new Uint8Array(buffer.subarray(offset, offset + length)); node.usedBytes = length; return length; } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? node.contents.set(buffer.subarray(offset, offset + length), position); return length; } } // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. MEMFS.expandFileStorage(node, position+length); if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position); // Use typed array write if available. else { for (var i = 0; i < length; i++) { node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. } } node.usedBytes = Math.max(node.usedBytes, position+length); return length; },llseek:function (stream, offset, whence) { var position = offset; if (whence === 1) { // SEEK_CUR. position += stream.position; } else if (whence === 2) { // SEEK_END. if (FS.isFile(stream.node.mode)) { position += stream.node.usedBytes; } } if (position < 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } return position; },allocate:function (stream, offset, length) { MEMFS.expandFileStorage(stream.node, offset + length); stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); },mmap:function (stream, buffer, offset, length, position, prot, flags) { if (!FS.isFile(stream.node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.ENODEV); } var ptr; var allocated; var contents = stream.node.contents; // Only make a new copy when MAP_PRIVATE is specified. if ( !(flags & 2) && (contents.buffer === buffer || contents.buffer === buffer.buffer) ) { // We can't emulate MAP_SHARED when the file is not backed by the buffer // we're mapping to (e.g. the HEAP buffer). allocated = false; ptr = contents.byteOffset; } else { // Try to avoid unnecessary slices. if (position > 0 || position + length < stream.node.usedBytes) { if (contents.subarray) { contents = contents.subarray(position, position + length); } else { contents = Array.prototype.slice.call(contents, position, position + length); } } allocated = true; ptr = _malloc(length); if (!ptr) { throw new FS.ErrnoError(ERRNO_CODES.ENOMEM); } buffer.set(contents, ptr); } return { ptr: ptr, allocated: allocated }; },msync:function (stream, buffer, offset, length, mmapFlags) { if (!FS.isFile(stream.node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.ENODEV); } if (mmapFlags & 2) { // MAP_PRIVATE calls need not to be synced back to underlying fs return 0; } var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); // should we check if bytesWritten and length are the same? return 0; }}}; var IDBFS={dbs:{},indexedDB:function () { return Module.indexedDB; },DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function (mount) { // reuse all of the core MEMFS functionality return MEMFS.mount.apply(null, arguments); },syncfs:function (mount, populate, callback) { IDBFS.getLocalSet(mount, function(err, local) { if (err) return callback(err); IDBFS.getRemoteSet(mount, function(err, remote) { if (err) return callback(err); var src = populate ? remote : local; var dst = populate ? local : remote; IDBFS.reconcile(src, dst, callback); }); }); },getDB:function (name, callback) { // check the cache first var db = IDBFS.dbs[name]; if (db) { return callback(null, db); } var req; try { req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION); } catch (e) { return callback(e); } if (!req) { return callback("Unable to connect to IndexedDB"); } req.onupgradeneeded = function(e) { var db = e.target.result; var transaction = e.target.transaction; var fileStore; if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) { fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME); } else { fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME); } if (!fileStore.indexNames.contains('timestamp')) { fileStore.createIndex('timestamp', 'timestamp', { unique: false }); } }; req.onsuccess = function() { db = req.result; // add to the cache IDBFS.dbs[name] = db; callback(null, db); }; req.onerror = function(e) { callback(this.error); e.preventDefault(); }; },getLocalSet:function (mount, callback) { var entries = {}; function isRealDir(p) { return p !== '.' && p !== '..'; }; function toAbsolute(root) { return function(p) { return PATH.join2(root, p); } }; var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint)); while (check.length) { var path = check.pop(); var stat; try { stat = FS.stat(path); } catch (e) { return callback(e); } if (FS.isDir(stat.mode)) { check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path))); } entries[path] = { timestamp: stat.mtime }; } return callback(null, { type: 'local', entries: entries }); },getRemoteSet:function (mount, callback) { var entries = {}; IDBFS.getDB(mount.mountpoint, function(err, db) { if (err) return callback(err); var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly'); transaction.onerror = function(e) { callback(this.error); e.preventDefault(); }; var store = transaction.objectStore(IDBFS.DB_STORE_NAME); var index = store.index('timestamp'); index.openKeyCursor().onsuccess = function(event) { var cursor = event.target.result; if (!cursor) { return callback(null, { type: 'remote', db: db, entries: entries }); } entries[cursor.primaryKey] = { timestamp: cursor.key }; cursor.continue(); }; }); },loadLocalEntry:function (path, callback) { var stat, node; try { var lookup = FS.lookupPath(path); node = lookup.node; stat = FS.stat(path); } catch (e) { return callback(e); } if (FS.isDir(stat.mode)) { return callback(null, { timestamp: stat.mtime, mode: stat.mode }); } else if (FS.isFile(stat.mode)) { // Performance consideration: storing a normal JavaScript array to a IndexedDB is much slower than storing a typed array. // Therefore always convert the file contents to a typed array first before writing the data to IndexedDB. node.contents = MEMFS.getFileDataAsTypedArray(node); return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents }); } else { return callback(new Error('node type not supported')); } },storeLocalEntry:function (path, entry, callback) { try { if (FS.isDir(entry.mode)) { FS.mkdir(path, entry.mode); } else if (FS.isFile(entry.mode)) { FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true }); } else { return callback(new Error('node type not supported')); } FS.chmod(path, entry.mode); FS.utime(path, entry.timestamp, entry.timestamp); } catch (e) { return callback(e); } callback(null); },removeLocalEntry:function (path, callback) { try { var lookup = FS.lookupPath(path); var stat = FS.stat(path); if (FS.isDir(stat.mode)) { FS.rmdir(path); } else if (FS.isFile(stat.mode)) { FS.unlink(path); } } catch (e) { return callback(e); } callback(null); },loadRemoteEntry:function (store, path, callback) { var req = store.get(path); req.onsuccess = function(event) { callback(null, event.target.result); }; req.onerror = function(e) { callback(this.error); e.preventDefault(); }; },storeRemoteEntry:function (store, path, entry, callback) { var req = store.put(entry, path); req.onsuccess = function() { callback(null); }; req.onerror = function(e) { callback(this.error); e.preventDefault(); }; },removeRemoteEntry:function (store, path, callback) { var req = store.delete(path); req.onsuccess = function() { callback(null); }; req.onerror = function(e) { callback(this.error); e.preventDefault(); }; },reconcile:function (src, dst, callback) { var total = 0; var create = []; Object.keys(src.entries).forEach(function (key) { var e = src.entries[key]; var e2 = dst.entries[key]; if (!e2 || e.timestamp > e2.timestamp) { create.push(key); total++; } }); var remove = []; Object.keys(dst.entries).forEach(function (key) { var e = dst.entries[key]; var e2 = src.entries[key]; if (!e2) { remove.push(key); total++; } }); if (!total) { return callback(null); } var errored = false; var completed = 0; var db = src.type === 'remote' ? src.db : dst.db; var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite'); var store = transaction.objectStore(IDBFS.DB_STORE_NAME); function done(err) { if (err) { if (!done.errored) { done.errored = true; return callback(err); } return; } if (++completed >= total) { return callback(null); } }; transaction.onerror = function(e) { done(this.error); e.preventDefault(); }; // sort paths in ascending order so directory entries are created // before the files inside them create.sort().forEach(function (path) { if (dst.type === 'local') { IDBFS.loadRemoteEntry(store, path, function (err, entry) { if (err) return done(err); IDBFS.storeLocalEntry(path, entry, done); }); } else { IDBFS.loadLocalEntry(path, function (err, entry) { if (err) return done(err); IDBFS.storeRemoteEntry(store, path, entry, done); }); } }); // sort paths in descending order so files are deleted before their // parent directories remove.sort().reverse().forEach(function(path) { if (dst.type === 'local') { IDBFS.removeLocalEntry(path, done); } else { IDBFS.removeRemoteEntry(store, path, done); } }); }}; var NODEFS={isWindows:false,staticInit:function () { NODEFS.isWindows = !!process.platform.match(/^win/); },mount:function (mount) { assert(ENVIRONMENT_IS_NODE); return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0); },createNode:function (parent, name, mode, dev) { if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } var node = FS.createNode(parent, name, mode); node.node_ops = NODEFS.node_ops; node.stream_ops = NODEFS.stream_ops; return node; },getMode:function (path) { var stat; try { stat = fs.lstatSync(path); if (NODEFS.isWindows) { // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so // propagate write bits to execute bits. stat.mode = stat.mode | ((stat.mode & 146) >> 1); } } catch (e) { if (!e.code) throw e; throw new FS.ErrnoError(ERRNO_CODES[e.code]); } return stat.mode; },realPath:function (node) { var parts = []; while (node.parent !== node) { parts.push(node.name); node = node.parent; } parts.push(node.mount.opts.root); parts.reverse(); return PATH.join.apply(null, parts); },flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:function (flags) { flags &= ~0x200000 /*O_PATH*/; // Ignore this flag from musl, otherwise node.js fails to open the file. flags &= ~0x800 /*O_NONBLOCK*/; // Ignore this flag from musl, otherwise node.js fails to open the file. flags &= ~0x8000 /*O_LARGEFILE*/; // Ignore this flag from musl, otherwise node.js fails to open the file. flags &= ~0x80000 /*O_CLOEXEC*/; // Some applications may pass it; it makes no sense for a single process. if (flags in NODEFS.flagsToPermissionStringMap) { return NODEFS.flagsToPermissionStringMap[flags]; } else { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } },node_ops:{getattr:function (node) { var path = NODEFS.realPath(node); var stat; try { stat = fs.lstatSync(path); } catch (e) { if (!e.code) throw e; throw new FS.ErrnoError(ERRNO_CODES[e.code]); } // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096. // See http://support.microsoft.com/kb/140365 if (NODEFS.isWindows && !stat.blksize) { stat.blksize = 4096; } if (NODEFS.isWindows && !stat.blocks) { stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0; } return { dev: stat.dev, ino: stat.ino, mode: stat.mode, nlink: stat.nlink, uid: stat.uid, gid: stat.gid, rdev: stat.rdev, size: stat.size, atime: stat.atime, mtime: stat.mtime, ctime: stat.ctime, blksize: stat.blksize, blocks: stat.blocks }; },setattr:function (node, attr) { var path = NODEFS.realPath(node); try { if (attr.mode !== undefined) { fs.chmodSync(path, attr.mode); // update the common node structure mode as well node.mode = attr.mode; } if (attr.timestamp !== undefined) { var date = new Date(attr.timestamp); fs.utimesSync(path, date, date); } if (attr.size !== undefined) { fs.truncateSync(path, attr.size); } } catch (e) { if (!e.code) throw e; throw new FS.ErrnoError(ERRNO_CODES[e.code]); } },lookup:function (parent, name) { var path = PATH.join2(NODEFS.realPath(parent), name); var mode = NODEFS.getMode(path); return NODEFS.createNode(parent, name, mode); },mknod:function (parent, name, mode, dev) { var node = NODEFS.createNode(parent, name, mode, dev); // create the backing node for this in the fs root as well var path = NODEFS.realPath(node); try { if (FS.isDir(node.mode)) { fs.mkdirSync(path, node.mode); } else { fs.writeFileSync(path, '', { mode: node.mode }); } } catch (e) { if (!e.code) throw e; throw new FS.ErrnoError(ERRNO_CODES[e.code]); } return node; },rename:function (oldNode, newDir, newName) { var oldPath = NODEFS.realPath(oldNode); var newPath = PATH.join2(NODEFS.realPath(newDir), newName); try { fs.renameSync(oldPath, newPath); } catch (e) { if (!e.code) throw e; throw new FS.ErrnoError(ERRNO_CODES[e.code]); } },unlink:function (parent, name) { var path = PATH.join2(NODEFS.realPath(parent), name); try { fs.unlinkSync(path); } catch (e) { if (!e.code) throw e; throw new FS.ErrnoError(ERRNO_CODES[e.code]); } },rmdir:function (parent, name) { var path = PATH.join2(NODEFS.realPath(parent), name); try { fs.rmdirSync(path); } catch (e) { if (!e.code) throw e; throw new FS.ErrnoError(ERRNO_CODES[e.code]); } },readdir:function (node) { var path = NODEFS.realPath(node); try { return fs.readdirSync(path); } catch (e) { if (!e.code) throw e; throw new FS.ErrnoError(ERRNO_CODES[e.code]); } },symlink:function (parent, newName, oldPath) { var newPath = PATH.join2(NODEFS.realPath(parent), newName); try { fs.symlinkSync(oldPath, newPath); } catch (e) { if (!e.code) throw e; throw new FS.ErrnoError(ERRNO_CODES[e.code]); } },readlink:function (node) { var path = NODEFS.realPath(node); try { path = fs.readlinkSync(path); path = NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root), path); return path; } catch (e) { if (!e.code) throw e; throw new FS.ErrnoError(ERRNO_CODES[e.code]); } }},stream_ops:{open:function (stream) { var path = NODEFS.realPath(stream.node); try { if (FS.isFile(stream.node.mode)) { stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags)); } } catch (e) { if (!e.code) throw e; throw new FS.ErrnoError(ERRNO_CODES[e.code]); } },close:function (stream) { try { if (FS.isFile(stream.node.mode) && stream.nfd) { fs.closeSync(stream.nfd); } } catch (e) { if (!e.code) throw e; throw new FS.ErrnoError(ERRNO_CODES[e.code]); } },read:function (stream, buffer, offset, length, position) { if (length === 0) return 0; // node errors on 0 length reads // FIXME this is terrible. var nbuffer = new Buffer(length); var res; try { res = fs.readSync(stream.nfd, nbuffer, 0, length, position); } catch (e) { throw new FS.ErrnoError(ERRNO_CODES[e.code]); } if (res > 0) { for (var i = 0; i < res; i++) { buffer[offset + i] = nbuffer[i]; } } return res; },write:function (stream, buffer, offset, length, position) { // FIXME this is terrible. var nbuffer = new Buffer(buffer.subarray(offset, offset + length)); var res; try { res = fs.writeSync(stream.nfd, nbuffer, 0, length, position); } catch (e) { throw new FS.ErrnoError(ERRNO_CODES[e.code]); } return res; },llseek:function (stream, offset, whence) { var position = offset; if (whence === 1) { // SEEK_CUR. position += stream.position; } else if (whence === 2) { // SEEK_END. if (FS.isFile(stream.node.mode)) { try { var stat = fs.fstatSync(stream.nfd); position += stat.size; } catch (e) { throw new FS.ErrnoError(ERRNO_CODES[e.code]); } } } if (position < 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } return position; }}}; var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:function (mount) { assert(ENVIRONMENT_IS_WORKER); if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync(); var root = WORKERFS.createNode(null, '/', WORKERFS.DIR_MODE, 0); var createdParents = {}; function ensureParent(path) { // return the parent node, creating subdirs as necessary var parts = path.split('/'); var parent = root; for (var i = 0; i < parts.length-1; i++) { var curr = parts.slice(0, i+1).join('/'); // Issue 4254: Using curr as a node name will prevent the node // from being found in FS.nameTable when FS.open is called on // a path which holds a child of this node, // given that all FS functions assume node names // are just their corresponding parts within their given path, // rather than incremental aggregates which include their parent's // directories. if (!createdParents[curr]) { createdParents[curr] = WORKERFS.createNode(parent, parts[i], WORKERFS.DIR_MODE, 0); } parent = createdParents[curr]; } return parent; } function base(path) { var parts = path.split('/'); return parts[parts.length-1]; } // We also accept FileList here, by using Array.prototype Array.prototype.forEach.call(mount.opts["files"] || [], function(file) { WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate); }); (mount.opts["blobs"] || []).forEach(function(obj) { WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"]); }); (mount.opts["packages"] || []).forEach(function(pack) { pack['metadata'].files.forEach(function(file) { var name = file.filename.substr(1); // remove initial slash WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack['blob'].slice(file.start, file.end)); }); }); return root; },createNode:function (parent, name, mode, dev, contents, mtime) { var node = FS.createNode(parent, name, mode); node.mode = mode; node.node_ops = WORKERFS.node_ops; node.stream_ops = WORKERFS.stream_ops; node.timestamp = (mtime || new Date).getTime(); assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE); if (mode === WORKERFS.FILE_MODE) { node.size = contents.size; node.contents = contents; } else { node.size = 4096; node.contents = {}; } if (parent) { parent.contents[name] = node; } return node; },node_ops:{getattr:function (node) { return { dev: 1, ino: undefined, mode: node.mode, nlink: 1, uid: 0, gid: 0, rdev: undefined, size: node.size, atime: new Date(node.timestamp), mtime: new Date(node.timestamp), ctime: new Date(node.timestamp), blksize: 4096, blocks: Math.ceil(node.size / 4096), }; },setattr:function (node, attr) { if (attr.mode !== undefined) { node.mode = attr.mode; } if (attr.timestamp !== undefined) { node.timestamp = attr.timestamp; } },lookup:function (parent, name) { throw new FS.ErrnoError(ERRNO_CODES.ENOENT); },mknod:function (parent, name, mode, dev) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); },rename:function (oldNode, newDir, newName) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); },unlink:function (parent, name) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); },rmdir:function (parent, name) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); },readdir:function (node) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); },symlink:function (parent, newName, oldPath) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); },readlink:function (node) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); }},stream_ops:{read:function (stream, buffer, offset, length, position) { if (position >= stream.node.size) return 0; var chunk = stream.node.contents.slice(position, position + length); var ab = WORKERFS.reader.readAsArrayBuffer(chunk); buffer.set(new Uint8Array(ab), offset); return chunk.size; },write:function (stream, buffer, offset, length, position) { throw new FS.ErrnoError(ERRNO_CODES.EIO); },llseek:function (stream, offset, whence) { var position = offset; if (whence === 1) { // SEEK_CUR. position += stream.position; } else if (whence === 2) { // SEEK_END. if (FS.isFile(stream.node.mode)) { position += stream.node.size; } } if (position < 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } return position; }}}; var _stdin=STATICTOP; STATICTOP += 16;; var _stdout=STATICTOP; STATICTOP += 16;; var _stderr=STATICTOP; STATICTOP += 16;;var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:function (e) { if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace(); return ___setErrNo(e.errno); },lookupPath:function (path, opts) { path = PATH.resolve(FS.cwd(), path); opts = opts || {}; if (!path) return { path: '', node: null }; var defaults = { follow_mount: true, recurse_count: 0 }; for (var key in defaults) { if (opts[key] === undefined) { opts[key] = defaults[key]; } } if (opts.recurse_count > 8) { // max recursive lookup of 8 throw new FS.ErrnoError(ERRNO_CODES.ELOOP); } // split the path var parts = PATH.normalizeArray(path.split('/').filter(function(p) { return !!p; }), false); // start at the root var current = FS.root; var current_path = '/'; for (var i = 0; i < parts.length; i++) { var islast = (i === parts.length-1); if (islast && opts.parent) { // stop resolving break; } current = FS.lookupNode(current, parts[i]); current_path = PATH.join2(current_path, parts[i]); // jump to the mount's root node if this is a mountpoint if (FS.isMountpoint(current)) { if (!islast || (islast && opts.follow_mount)) { current = current.mounted.root; } } // by default, lookupPath will not follow a symlink if it is the final path component. // setting opts.follow = true will override this behavior. if (!islast || opts.follow) { var count = 0; while (FS.isLink(current.mode)) { var link = FS.readlink(current_path); current_path = PATH.resolve(PATH.dirname(current_path), link); var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); current = lookup.node; if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). throw new FS.ErrnoError(ERRNO_CODES.ELOOP); } } } } return { path: current_path, node: current }; },getPath:function (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:function (parentid, name) { var hash = 0; for (var i = 0; i < name.length; i++) { hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; } return ((parentid + hash) >>> 0) % FS.nameTable.length; },hashAddNode:function (node) { var hash = FS.hashName(node.parent.id, node.name); node.name_next = FS.nameTable[hash]; FS.nameTable[hash] = node; },hashRemoveNode:function (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:function (parent, name) { var err = FS.mayLookup(parent); if (err) { throw new FS.ErrnoError(err, parent); } 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; } } // if we failed to find it in the cache, call into the VFS return FS.lookup(parent, name); },createNode:function (parent, name, mode, rdev) { if (!FS.FSNode) { FS.FSNode = function(parent, name, mode, rdev) { if (!parent) { parent = this; // root node sets parent to itself } 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; }; FS.FSNode.prototype = {}; // compatibility var readMode = 292 | 73; var writeMode = 146; // NOTE we must use Object.defineProperties instead of individual calls to // Object.defineProperty in order to make closure compiler happy Object.defineProperties(FS.FSNode.prototype, { read: { get: function() { return (this.mode & readMode) === readMode; }, set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; } }, write: { get: function() { return (this.mode & writeMode) === writeMode; }, set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; } }, isFolder: { get: function() { return FS.isDir(this.mode); } }, isDevice: { get: function() { return FS.isChrdev(this.mode); } } }); } var node = new FS.FSNode(parent, name, mode, rdev); FS.hashAddNode(node); return node; },destroyNode:function (node) { FS.hashRemoveNode(node); },isRoot:function (node) { return node === node.parent; },isMountpoint:function (node) { return !!node.mounted; },isFile:function (mode) { return (mode & 61440) === 32768; },isDir:function (mode) { return (mode & 61440) === 16384; },isLink:function (mode) { return (mode & 61440) === 40960; },isChrdev:function (mode) { return (mode & 61440) === 8192; },isBlkdev:function (mode) { return (mode & 61440) === 24576; },isFIFO:function (mode) { return (mode & 61440) === 4096; },isSocket:function (mode) { return (mode & 49152) === 49152; },flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function (str) { var flags = FS.flagModes[str]; if (typeof flags === 'undefined') { throw new Error('Unknown file open mode: ' + str); } return flags; },flagsToPermissionString:function (flag) { var perms = ['r', 'w', 'rw'][flag & 3]; if ((flag & 512)) { perms += 'w'; } return perms; },nodePermissions:function (node, perms) { if (FS.ignorePermissions) { return 0; } // return 0 if any user, group or owner bits are set. if (perms.indexOf('r') !== -1 && !(node.mode & 292)) { return ERRNO_CODES.EACCES; } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) { return ERRNO_CODES.EACCES; } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) { return ERRNO_CODES.EACCES; } return 0; },mayLookup:function (dir) { var err = FS.nodePermissions(dir, 'x'); if (err) return err; if (!dir.node_ops.lookup) return ERRNO_CODES.EACCES; return 0; },mayCreate:function (dir, name) { try { var node = FS.lookupNode(dir, name); return ERRNO_CODES.EEXIST; } catch (e) { } return FS.nodePermissions(dir, 'wx'); },mayDelete:function (dir, name, isdir) { var node; try { node = FS.lookupNode(dir, name); } catch (e) { return e.errno; } var err = FS.nodePermissions(dir, 'wx'); if (err) { return err; } if (isdir) { if (!FS.isDir(node.mode)) { return ERRNO_CODES.ENOTDIR; } if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { return ERRNO_CODES.EBUSY; } } else { if (FS.isDir(node.mode)) { return ERRNO_CODES.EISDIR; } } return 0; },mayOpen:function (node, flags) { if (!node) { return ERRNO_CODES.ENOENT; } if (FS.isLink(node.mode)) { return ERRNO_CODES.ELOOP; } else if (FS.isDir(node.mode)) { if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) return ERRNO_CODES.EISDIR; } } return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) { fd_start = fd_start || 0; fd_end = fd_end || FS.MAX_OPEN_FDS; for (var fd = fd_start; fd <= fd_end; fd++) { if (!FS.streams[fd]) { return fd; } } throw new FS.ErrnoError(ERRNO_CODES.EMFILE); },getStream:function (fd) { return FS.streams[fd]; },createStream:function (stream, fd_start, fd_end) { if (!FS.FSStream) { FS.FSStream = function(){}; FS.FSStream.prototype = {}; // compatibility Object.defineProperties(FS.FSStream.prototype, { object: { get: function() { return this.node; }, set: function(val) { this.node = val; } }, isRead: { get: function() { return (this.flags & 2097155) !== 1; } }, isWrite: { get: function() { return (this.flags & 2097155) !== 0; } }, isAppend: { get: function() { return (this.flags & 1024); } } }); } // clone it, so we can return an instance of FSStream var newStream = new FS.FSStream(); for (var p in stream) { newStream[p] = stream[p]; } stream = newStream; var fd = FS.nextfd(fd_start, fd_end); stream.fd = fd; FS.streams[fd] = stream; return stream; },closeStream:function (fd) { FS.streams[fd] = null; },chrdev_stream_ops:{open:function (stream) { var device = FS.getDevice(stream.node.rdev); // override node's stream ops with the device's stream.stream_ops = device.stream_ops; // forward the open call if (stream.stream_ops.open) { stream.stream_ops.open(stream); } },llseek:function () { throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); }},major:function (dev) { return ((dev) >> 8); },minor:function (dev) { return ((dev) & 0xff); },makedev:function (ma, mi) { return ((ma) << 8 | (mi)); },registerDevice:function (dev, ops) { FS.devices[dev] = { stream_ops: ops }; },getDevice:function (dev) { return FS.devices[dev]; },getMounts:function (mount) { var mounts = []; var check = [mount]; while (check.length) { var m = check.pop(); mounts.push(m); check.push.apply(check, m.mounts); } return mounts; },syncfs:function (populate, callback) { if (typeof(populate) === 'function') { callback = populate; populate = false; } FS.syncFSRequests++; if (FS.syncFSRequests > 1) { console.log('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(err) { assert(FS.syncFSRequests > 0); FS.syncFSRequests--; return callback(err); } function done(err) { if (err) { if (!done.errored) { done.errored = true; return doCallback(err); } return; } if (++completed >= mounts.length) { doCallback(null); } }; // sync all mounts mounts.forEach(function (mount) { if (!mount.type.syncfs) { return done(null); } mount.type.syncfs(mount, populate, done); }); },mount:function (type, opts, mountpoint) { var root = mountpoint === '/'; var pseudo = !mountpoint; var node; if (root && FS.root) { throw new FS.ErrnoError(ERRNO_CODES.EBUSY); } else if (!root && !pseudo) { var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); mountpoint = lookup.path; // use the absolute path node = lookup.node; if (FS.isMountpoint(node)) { throw new FS.ErrnoError(ERRNO_CODES.EBUSY); } if (!FS.isDir(node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); } } var mount = { type: type, opts: opts, mountpoint: mountpoint, mounts: [] }; // create a root node for the fs var mountRoot = type.mount(mount); mountRoot.mount = mount; mount.root = mountRoot; if (root) { FS.root = mountRoot; } else if (node) { // set as a mountpoint node.mounted = mount; // add the new mount to the current mount's children if (node.mount) { node.mount.mounts.push(mount); } } return mountRoot; },unmount:function (mountpoint) { var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); if (!FS.isMountpoint(lookup.node)) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } // destroy the nodes for this mount, and all its child mounts var node = lookup.node; var mount = node.mounted; var mounts = FS.getMounts(mount); Object.keys(FS.nameTable).forEach(function (hash) { var current = FS.nameTable[hash]; while (current) { var next = current.name_next; if (mounts.indexOf(current.mount) !== -1) { FS.destroyNode(current); } current = next; } }); // no longer a mountpoint node.mounted = null; // remove this mount from the child mounts var idx = node.mount.mounts.indexOf(mount); assert(idx !== -1); node.mount.mounts.splice(idx, 1); },lookup:function (parent, name) { return parent.node_ops.lookup(parent, name); },mknod:function (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(ERRNO_CODES.EINVAL); } var err = FS.mayCreate(parent, name); if (err) { throw new FS.ErrnoError(err); } if (!parent.node_ops.mknod) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); } return parent.node_ops.mknod(parent, name, mode, dev); },create:function (path, mode) { mode = mode !== undefined ? mode : 438 /* 0666 */; mode &= 4095; mode |= 32768; return FS.mknod(path, mode, 0); },mkdir:function (path, mode) { mode = mode !== undefined ? mode : 511 /* 0777 */; mode &= 511 | 512; mode |= 16384; return FS.mknod(path, mode, 0); },mkdirTree:function (path, mode) { var dirs = path.split('/'); var d = ''; for (var i = 0; i < dirs.length; ++i) { if (!dirs[i]) continue; d += '/' + dirs[i]; try { FS.mkdir(d, mode); } catch(e) { if (e.errno != ERRNO_CODES.EEXIST) throw e; } } },mkdev:function (path, mode, dev) { if (typeof(dev) === 'undefined') { dev = mode; mode = 438 /* 0666 */; } mode |= 8192; return FS.mknod(path, mode, dev); },symlink:function (oldpath, newpath) { if (!PATH.resolve(oldpath)) { throw new FS.ErrnoError(ERRNO_CODES.ENOENT); } var lookup = FS.lookupPath(newpath, { parent: true }); var parent = lookup.node; if (!parent) { throw new FS.ErrnoError(ERRNO_CODES.ENOENT); } var newname = PATH.basename(newpath); var err = FS.mayCreate(parent, newname); if (err) { throw new FS.ErrnoError(err); } if (!parent.node_ops.symlink) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); } return parent.node_ops.symlink(parent, newname, oldpath); },rename:function (old_path, new_path) { var old_dirname = PATH.dirname(old_path); var new_dirname = PATH.dirname(new_path); var old_name = PATH.basename(old_path); var new_name = PATH.basename(new_path); // parents must exist var lookup, old_dir, new_dir; try { lookup = FS.lookupPath(old_path, { parent: true }); old_dir = lookup.node; lookup = FS.lookupPath(new_path, { parent: true }); new_dir = lookup.node; } catch (e) { throw new FS.ErrnoError(ERRNO_CODES.EBUSY); } if (!old_dir || !new_dir) throw new FS.ErrnoError(ERRNO_CODES.ENOENT); // need to be part of the same mount if (old_dir.mount !== new_dir.mount) { throw new FS.ErrnoError(ERRNO_CODES.EXDEV); } // source must exist var old_node = FS.lookupNode(old_dir, old_name); // old path should not be an ancestor of the new path var relative = PATH.relative(old_path, new_dirname); if (relative.charAt(0) !== '.') { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } // new path should not be an ancestor of the old path relative = PATH.relative(new_path, old_dirname); if (relative.charAt(0) !== '.') { throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); } // see if the new path already exists var new_node; try { new_node = FS.lookupNode(new_dir, new_name); } catch (e) { // not fatal } // early out if nothing needs to change if (old_node === new_node) { return; } // we'll need to delete the old entry var isdir = FS.isDir(old_node.mode); var err = FS.mayDelete(old_dir, old_name, isdir); if (err) { throw new FS.ErrnoError(err); } // need delete permissions if we'll be overwriting. // need create permissions if new doesn't already exist. err = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name); if (err) { throw new FS.ErrnoError(err); } if (!old_dir.node_ops.rename) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); } if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { throw new FS.ErrnoError(ERRNO_CODES.EBUSY); } // if we are going to change the parent, check write permissions if (new_dir !== old_dir) { err = FS.nodePermissions(old_dir, 'w'); if (err) { throw new FS.ErrnoError(err); } } try { if (FS.trackingDelegate['willMovePath']) { FS.trackingDelegate['willMovePath'](old_path, new_path); } } catch(e) { console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); } // remove the node from the lookup hash FS.hashRemoveNode(old_node); // do the underlying fs rename try { old_dir.node_ops.rename(old_node, new_dir, new_name); } catch (e) { throw e; } finally { // add the node back to the hash (in case node_ops.rename // changed its name) FS.hashAddNode(old_node); } try { if (FS.trackingDelegate['onMovePath']) FS.trackingDelegate['onMovePath'](old_path, new_path); } catch(e) { console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); } },rmdir:function (path) { var lookup = FS.lookupPath(path, { parent: true }); var parent = lookup.node; var name = PATH.basename(path); var node = FS.lookupNode(parent, name); var err = FS.mayDelete(parent, name, true); if (err) { throw new FS.ErrnoError(err); } if (!parent.node_ops.rmdir) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); } if (FS.isMountpoint(node)) { throw new FS.ErrnoError(ERRNO_CODES.EBUSY); } try { if (FS.trackingDelegate['willDeletePath']) { FS.trackingDelegate['willDeletePath'](path); } } catch(e) { console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); } parent.node_ops.rmdir(parent, name); FS.destroyNode(node); try { if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); } catch(e) { console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); } },readdir:function (path) { var lookup = FS.lookupPath(path, { follow: true }); var node = lookup.node; if (!node.node_ops.readdir) { throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); } return node.node_ops.readdir(node); },unlink:function (path) { var lookup = FS.lookupPath(path, { parent: true }); var parent = lookup.node; var name = PATH.basename(path); var node = FS.lookupNode(parent, name); var err = FS.mayDelete(parent, name, false); if (err) { // According to POSIX, we should map EISDIR to EPERM, but // we instead do what Linux does (and we must, as we use // the musl linux libc). throw new FS.ErrnoError(err); } if (!parent.node_ops.unlink) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); } if (FS.isMountpoint(node)) { throw new FS.ErrnoError(ERRNO_CODES.EBUSY); } try { if (FS.trackingDelegate['willDeletePath']) { FS.trackingDelegate['willDeletePath'](path); } } catch(e) { console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); } parent.node_ops.unlink(parent, name); FS.destroyNode(node); try { if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); } catch(e) { console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); } },readlink:function (path) { var lookup = FS.lookupPath(path); var link = lookup.node; if (!link) { throw new FS.ErrnoError(ERRNO_CODES.ENOENT); } if (!link.node_ops.readlink) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } return PATH.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); },stat:function (path, dontFollow) { var lookup = FS.lookupPath(path, { follow: !dontFollow }); var node = lookup.node; if (!node) { throw new FS.ErrnoError(ERRNO_CODES.ENOENT); } if (!node.node_ops.getattr) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); } return node.node_ops.getattr(node); },lstat:function (path) { return FS.stat(path, true); },chmod:function (path, mode, dontFollow) { var node; if (typeof path === 'string') { var lookup = FS.lookupPath(path, { follow: !dontFollow }); node = lookup.node; } else { node = path; } if (!node.node_ops.setattr) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); } node.node_ops.setattr(node, { mode: (mode & 4095) | (node.mode & ~4095), timestamp: Date.now() }); },lchmod:function (path, mode) { FS.chmod(path, mode, true); },fchmod:function (fd, mode) { var stream = FS.getStream(fd); if (!stream) { throw new FS.ErrnoError(ERRNO_CODES.EBADF); } FS.chmod(stream.node, mode); },chown:function (path, uid, gid, dontFollow) { var node; if (typeof path === 'string') { var lookup = FS.lookupPath(path, { follow: !dontFollow }); node = lookup.node; } else { node = path; } if (!node.node_ops.setattr) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); } node.node_ops.setattr(node, { timestamp: Date.now() // we ignore the uid / gid for now }); },lchown:function (path, uid, gid) { FS.chown(path, uid, gid, true); },fchown:function (fd, uid, gid) { var stream = FS.getStream(fd); if (!stream) { throw new FS.ErrnoError(ERRNO_CODES.EBADF); } FS.chown(stream.node, uid, gid); },truncate:function (path, len) { if (len < 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } var node; if (typeof path === 'string') { var lookup = FS.lookupPath(path, { follow: true }); node = lookup.node; } else { node = path; } if (!node.node_ops.setattr) { throw new FS.ErrnoError(ERRNO_CODES.EPERM); } if (FS.isDir(node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.EISDIR); } if (!FS.isFile(node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } var err = FS.nodePermissions(node, 'w'); if (err) { throw new FS.ErrnoError(err); } node.node_ops.setattr(node, { size: len, timestamp: Date.now() }); },ftruncate:function (fd, len) { var stream = FS.getStream(fd); if (!stream) { throw new FS.ErrnoError(ERRNO_CODES.EBADF); } if ((stream.flags & 2097155) === 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } FS.truncate(stream.node, len); },utime:function (path, atime, mtime) { var lookup = FS.lookupPath(path, { follow: true }); var node = lookup.node; node.node_ops.setattr(node, { timestamp: Math.max(atime, mtime) }); },open:function (path, flags, mode, fd_start, fd_end) { if (path === "") { throw new FS.ErrnoError(ERRNO_CODES.ENOENT); } flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags; mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode; if ((flags & 64)) { mode = (mode & 4095) | 32768; } else { mode = 0; } var node; if (typeof path === 'object') { node = path; } else { path = PATH.normalize(path); try { var lookup = FS.lookupPath(path, { follow: !(flags & 131072) }); node = lookup.node; } catch (e) { // ignore } } // perhaps we need to create the node var created = false; if ((flags & 64)) { if (node) { // if O_CREAT and O_EXCL are set, error out if the node already exists if ((flags & 128)) { throw new FS.ErrnoError(ERRNO_CODES.EEXIST); } } else { // node doesn't exist, try to create it node = FS.mknod(path, mode, 0); created = true; } } if (!node) { throw new FS.ErrnoError(ERRNO_CODES.ENOENT); } // can't truncate a device if (FS.isChrdev(node.mode)) { flags &= ~512; } // if asked only for a directory, then this must be one if ((flags & 65536) && !FS.isDir(node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); } // check permissions, if this is not a file we just created now (it is ok to // create and write to a file with read-only permissions; it is read-only // for later use) if (!created) { var err = FS.mayOpen(node, flags); if (err) { throw new FS.ErrnoError(err); } } // do truncation if necessary if ((flags & 512)) { FS.truncate(node, 0); } // we've already handled these, don't pass down to the underlying vfs flags &= ~(128 | 512); // register the stream with the filesystem var stream = FS.createStream({ node: node, path: FS.getPath(node), // we want the absolute path to the node flags: flags, seekable: true, position: 0, stream_ops: node.stream_ops, // used by the file family libc calls (fopen, fwrite, ferror, etc.) ungotten: [], error: false }, fd_start, fd_end); // call the new stream's open function if (stream.stream_ops.open) { stream.stream_ops.open(stream); } if (Module['logReadFiles'] && !(flags & 1)) { if (!FS.readFiles) FS.readFiles = {}; if (!(path in FS.readFiles)) { FS.readFiles[path] = 1; Module['printErr']('read file: ' + path); } } try { if (FS.trackingDelegate['onOpenFile']) { var trackingFlags = 0; if ((flags & 2097155) !== 1) { trackingFlags |= FS.tracking.openFlags.READ; } if ((flags & 2097155) !== 0) { trackingFlags |= FS.tracking.openFlags.WRITE; } FS.trackingDelegate['onOpenFile'](path, trackingFlags); } } catch(e) { console.log("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: " + e.message); } return stream; },close:function (stream) { if (stream.getdents) stream.getdents = null; // free readdir state try { if (stream.stream_ops.close) { stream.stream_ops.close(stream); } } catch (e) { throw e; } finally { FS.closeStream(stream.fd); } },llseek:function (stream, offset, whence) { if (!stream.seekable || !stream.stream_ops.llseek) { throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); } stream.position = stream.stream_ops.llseek(stream, offset, whence); stream.ungotten = []; return stream.position; },read:function (stream, buffer, offset, length, position) { if (length < 0 || position < 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } if ((stream.flags & 2097155) === 1) { throw new FS.ErrnoError(ERRNO_CODES.EBADF); } if (FS.isDir(stream.node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.EISDIR); } if (!stream.stream_ops.read) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } var seeking = true; if (typeof position === 'undefined') { position = stream.position; seeking = false; } else if (!stream.seekable) { throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); } var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); if (!seeking) stream.position += bytesRead; return bytesRead; },write:function (stream, buffer, offset, length, position, canOwn) { if (length < 0 || position < 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } if ((stream.flags & 2097155) === 0) { throw new FS.ErrnoError(ERRNO_CODES.EBADF); } if (FS.isDir(stream.node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.EISDIR); } if (!stream.stream_ops.write) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } if (stream.flags & 1024) { // seek to the end before writing in append mode FS.llseek(stream, 0, 2); } var seeking = true; if (typeof position === 'undefined') { position = stream.position; seeking = false; } else if (!stream.seekable) { throw new FS.ErrnoError(ERRNO_CODES.ESPIPE); } var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); if (!seeking) stream.position += bytesWritten; try { if (stream.path && FS.trackingDelegate['onWriteToFile']) FS.trackingDelegate['onWriteToFile'](stream.path); } catch(e) { console.log("FS.trackingDelegate['onWriteToFile']('"+path+"') threw an exception: " + e.message); } return bytesWritten; },allocate:function (stream, offset, length) { if (offset < 0 || length <= 0) { throw new FS.ErrnoError(ERRNO_CODES.EINVAL); } if ((stream.flags & 2097155) === 0) { throw new FS.ErrnoError(ERRNO_CODES.EBADF); } if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.ENODEV); } if (!stream.stream_ops.allocate) { throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP); } stream.stream_ops.allocate(stream, offset, length); },mmap:function (stream, buffer, offset, length, position, prot, flags) { // TODO if PROT is PROT_WRITE, make sure we have write access if ((stream.flags & 2097155) === 1) { throw new FS.ErrnoError(ERRNO_CODES.EACCES); } if (!stream.stream_ops.mmap) { throw new FS.ErrnoError(ERRNO_CODES.ENODEV); } return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags); },msync:function (stream, buffer, offset, length, mmapFlags) { if (!stream || !stream.stream_ops.msync) { return 0; } return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); },munmap:function (stream) { return 0; },ioctl:function (stream, cmd, arg) { if (!stream.stream_ops.ioctl) { throw new FS.ErrnoError(ERRNO_CODES.ENOTTY); } return stream.stream_ops.ioctl(stream, cmd, arg); },readFile:function (path, opts) { opts = opts || {}; opts.flags = opts.flags || 'r'; opts.encoding = opts.encoding || 'binary'; if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { throw new Error('Invalid encoding type "' + opts.encoding + '"'); } var ret; var stream = FS.open(path, opts.flags); var stat = FS.stat(path); var length = stat.size; var buf = new Uint8Array(length); FS.read(stream, buf, 0, length, 0); if (opts.encoding === 'utf8') { ret = UTF8ArrayToString(buf, 0); } else if (opts.encoding === 'binary') { ret = buf; } FS.close(stream); return ret; },writeFile:function (path, data, opts) { opts = opts || {}; opts.flags = opts.flags || 'w'; opts.encoding = opts.encoding || 'utf8'; if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { throw new Error('Invalid encoding type "' + opts.encoding + '"'); } var stream = FS.open(path, opts.flags, opts.mode); if (opts.encoding === 'utf8') { var buf = new Uint8Array(lengthBytesUTF8(data)+1); var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); FS.write(stream, buf, 0, actualNumBytes, 0, opts.canOwn); } else if (opts.encoding === 'binary') { FS.write(stream, data, 0, data.length, 0, opts.canOwn); } FS.close(stream); },cwd:function () { return FS.currentPath; },chdir:function (path) { var lookup = FS.lookupPath(path, { follow: true }); if (lookup.node === null) { throw new FS.ErrnoError(ERRNO_CODES.ENOENT); } if (!FS.isDir(lookup.node.mode)) { throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR); } var err = FS.nodePermissions(lookup.node, 'x'); if (err) { throw new FS.ErrnoError(err); } FS.currentPath = lookup.path; },createDefaultDirectories:function () { FS.mkdir('/tmp'); FS.mkdir('/home'); FS.mkdir('/home/web_user'); },createDefaultDevices:function () { // create /dev FS.mkdir('/dev'); // setup /dev/null FS.registerDevice(FS.makedev(1, 3), { read: function() { return 0; }, write: function(stream, buffer, offset, length, pos) { return length; } }); FS.mkdev('/dev/null', FS.makedev(1, 3)); // setup /dev/tty and /dev/tty1 // stderr needs to print output using Module['printErr'] // so we register a second tty just for it. 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)); // setup /dev/[u]random var random_device; if (typeof crypto !== 'undefined') { // for modern web browsers var randomBuffer = new Uint8Array(1); random_device = function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; }; } else if (ENVIRONMENT_IS_NODE) { // for nodejs random_device = function() { return require('crypto').randomBytes(1)[0]; }; } else { // default for ES5 platforms random_device = function() { return (Math.random()*256)|0; }; } FS.createDevice('/dev', 'random', random_device); FS.createDevice('/dev', 'urandom', random_device); // we're not going to emulate the actual shm device, // just create the tmp dirs that reside in it commonly FS.mkdir('/dev/shm'); FS.mkdir('/dev/shm/tmp'); },createSpecialDirectories:function () { // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the name of the stream for fd 6 (see test_unistd_ttyname) FS.mkdir('/proc'); FS.mkdir('/proc/self'); FS.mkdir('/proc/self/fd'); FS.mount({ mount: function() { var node = FS.createNode('/proc/self', 'fd', 16384 | 511 /* 0777 */, 73); node.node_ops = { lookup: function(parent, name) { var fd = +name; var stream = FS.getStream(fd); if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); var ret = { parent: null, mount: { mountpoint: 'fake' }, node_ops: { readlink: function() { return stream.path } } }; ret.parent = ret; // make it look like a simple root node return ret; } }; return node; } }, {}, '/proc/self/fd'); },createStandardStreams:function () { // TODO deprecate the old functionality of a single // input / output callback and that utilizes FS.createDevice // and instead require a unique set of stream ops // by default, we symlink the standard streams to the // default tty devices. however, if the standard streams // have been overwritten we create a unique device for // them instead. if (Module['stdin']) { FS.createDevice('/dev', 'stdin', Module['stdin']); } else { FS.symlink('/dev/tty', '/dev/stdin'); } if (Module['stdout']) { FS.createDevice('/dev', 'stdout', null, Module['stdout']); } else { FS.symlink('/dev/tty', '/dev/stdout'); } if (Module['stderr']) { FS.createDevice('/dev', 'stderr', null, Module['stderr']); } else { FS.symlink('/dev/tty1', '/dev/stderr'); } // open default streams for the stdin, stdout and stderr devices var stdin = FS.open('/dev/stdin', 'r'); assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')'); var stdout = FS.open('/dev/stdout', 'w'); assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')'); var stderr = FS.open('/dev/stderr', 'w'); assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')'); },ensureErrnoError:function () { if (FS.ErrnoError) return; FS.ErrnoError = function ErrnoError(errno, node) { //Module.printErr(stackTrace()); // useful for debugging this.node = node; this.setErrno = function(errno) { this.errno = errno; for (var key in ERRNO_CODES) { if (ERRNO_CODES[key] === errno) { this.code = key; break; } } }; this.setErrno(errno); this.message = ERRNO_MESSAGES[errno]; }; FS.ErrnoError.prototype = new Error(); FS.ErrnoError.prototype.constructor = FS.ErrnoError; // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) [ERRNO_CODES.ENOENT].forEach(function(code) { FS.genericErrors[code] = new FS.ErrnoError(code); FS.genericErrors[code].stack = '<generic error, no stack>'; }); },staticInit:function () { FS.ensureErrnoError(); FS.nameTable = new Array(4096); FS.mount(MEMFS, {}, '/'); FS.createDefaultDirectories(); FS.createDefaultDevices(); FS.createSpecialDirectories(); FS.filesystems = { 'MEMFS': MEMFS, 'IDBFS': IDBFS, 'NODEFS': NODEFS, 'WORKERFS': WORKERFS, }; },init:function (input, output, error) { assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); FS.init.initialized = true; FS.ensureErrnoError(); // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here Module['stdin'] = input || Module['stdin']; Module['stdout'] = output || Module['stdout']; Module['stderr'] = error || Module['stderr']; FS.createStandardStreams(); },quit:function () { FS.init.initialized = false; // force-flush all streams, so we get musl std streams printed out var fflush = Module['_fflush']; if (fflush) fflush(0); // close all of our streams for (var i = 0; i < FS.streams.length; i++) { var stream = FS.streams[i]; if (!stream) { continue; } FS.close(stream); } },getMode:function (canRead, canWrite) { var mode = 0; if (canRead) mode |= 292 | 73; if (canWrite) mode |= 146; return mode; },joinPath:function (parts, forceRelative) { var path = PATH.join.apply(null, parts); if (forceRelative && path[0] == '/') path = path.substr(1); return path; },absolutePath:function (relative, base) { return PATH.resolve(base, relative); },standardizePath:function (path) { return PATH.normalize(path); },findObject:function (path, dontResolveLastLink) { var ret = FS.analyzePath(path, dontResolveLastLink); if (ret.exists) { return ret.object; } else { ___setErrNo(ret.error); return null; } },analyzePath:function (path, dontResolveLastLink) { // operate from within the context of the symlink's target try { var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); path = lookup.path; } catch (e) { } var ret = { isRoot: false, exists: false, error: 0, name: null, path: null, object: null, parentExists: false, parentPath: null, parentObject: null }; try { var lookup = FS.lookupPath(path, { parent: true }); ret.parentExists = true; ret.parentPath = lookup.path; ret.parentObject = lookup.node; ret.name = PATH.basename(path); lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); ret.exists = true; ret.path = lookup.path; ret.object = lookup.node; ret.name = lookup.node.name; ret.isRoot = lookup.path === '/'; } catch (e) { ret.error = e.errno; }; return ret; },createFolder:function (parent, name, canRead, canWrite) { var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); var mode = FS.getMode(canRead, canWrite); return FS.mkdir(path, mode); },createPath:function (parent, path, canRead, canWrite) { parent = typeof parent === 'string' ? parent : FS.getPath(parent); var parts = path.split('/').reverse(); while (parts.length) { var part = parts.pop(); if (!part) continue; var current = PATH.join2(parent, part); try { FS.mkdir(current); } catch (e) { // ignore EEXIST } parent = current; } return current; },createFile:function (parent, name, properties, canRead, canWrite) { var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); var mode = FS.getMode(canRead, canWrite); return FS.create(path, mode); },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) { var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent; var mode = FS.getMode(canRead, canWrite); var node = FS.create(path, mode); if (data) { if (typeof data === 'string') { var arr = new Array(data.length); for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); data = arr; } // make sure we can write to the file FS.chmod(node, mode | 146); var stream = FS.open(node, 'w'); FS.write(stream, data, 0, data.length, 0, canOwn); FS.close(stream); FS.chmod(node, mode); } return node; },createDevice:function (parent, name, input, output) { var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); var mode = FS.getMode(!!input, !!output); if (!FS.createDevice.major) FS.createDevice.major = 64; var dev = FS.makedev(FS.createDevice.major++, 0); // Create a fake device that a set of stream ops to emulate // the old behavior. FS.registerDevice(dev, { open: function(stream) { stream.seekable = false; }, close: function(stream) { // flush any pending line data if (output && output.buffer && output.buffer.length) { output(10); } }, read: function(stream, buffer, offset, length, pos /* ignored */) { var bytesRead = 0; for (var i = 0; i < length; i++) { var result; try { result = input(); } catch (e) { throw new FS.ErrnoError(ERRNO_CODES.EIO); } if (result === undefined && bytesRead === 0) { throw new FS.ErrnoError(ERRNO_CODES.EAGAIN); } if (result === null || result === undefined) break; bytesRead++; buffer[offset+i] = result; } if (bytesRead) { stream.node.timestamp = Date.now(); } return bytesRead; }, write: function(stream, buffer, offset, length, pos) { for (var i = 0; i < length; i++) { try { output(buffer[offset+i]); } catch (e) { throw new FS.ErrnoError(ERRNO_CODES.EIO); } } if (length) { stream.node.timestamp = Date.now(); } return i; } }); return FS.mkdev(path, mode, dev); },createLink:function (parent, name, target, canRead, canWrite) { var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); return FS.symlink(target, path); },forceLoadFile:function (obj) { if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; var success = true; if (typeof XMLHttpRequest !== 'undefined') { throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); } else if (Module['read']) { // Command-line. try { // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as // read() will try to parse UTF8. obj.contents = intArrayFromString(Module['read'](obj.url), true); obj.usedBytes = obj.contents.length; } catch (e) { success = false; } } else { throw new Error('Cannot load without read() or XMLHttpRequest.'); } if (!success) ___setErrNo(ERRNO_CODES.EIO); return success; },createLazyFile:function (parent, name, url, canRead, canWrite) { // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. function LazyUint8Array() { this.lengthKnown = false; this.chunks = []; // Loaded chunks. Index is the chunk number } LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) { if (idx > this.length-1 || idx < 0) { return undefined; } var chunkOffset = idx % this.chunkSize; var chunkNum = (idx / this.chunkSize)|0; return this.getter(chunkNum)[chunkOffset]; } LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { this.getter = getter; } LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { // Find length 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; // Chunk size in bytes if (!hasByteServing) chunkSize = datalength; // Function to get a range from the remote URL. var doXHR = (function(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!"); // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); // Some hints to the browser that we want binary data. if (typeof Uint8Array != 'undefined') 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 || []); } else { return intArrayFromString(xhr.responseText || '', true); } }); var lazyArray = this; lazyArray.setDataGetter(function(chunkNum) { var start = chunkNum * chunkSize; var end = (chunkNum+1) * chunkSize - 1; // including this byte end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block 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) { // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file datalength = this.getter(0).length; chunkSize = datalength; console.log("LazyFiles on gzip forces download of the whole file when length is accessed"); } this._length = datalength; this._chunkSize = chunkSize; this.lengthKnown = true; } 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(); Object.defineProperties(lazyArray, { length: { get: function() { if(!this.lengthKnown) { this.cacheLength(); } return this._length; } }, chunkSize: { get: function() { if(!this.lengthKnown) { this.cacheLength(); } return this._chunkSize; } } }); var properties = { isDevice: false, contents: lazyArray }; } else { var properties = { isDevice: false, url: url }; } var node = FS.createFile(parent, name, properties, canRead, canWrite); // This is a total hack, but I want to get this lazy file code out of the // core of MEMFS. If we want to keep this lazy file concept I feel it should // be its own thin LAZYFS proxying calls to MEMFS. if (properties.contents) { node.contents = properties.contents; } else if (properties.url) { node.contents = null; node.url = properties.url; } // Add a function that defers querying the file size until it is asked the first time. Object.defineProperties(node, { usedBytes: { get: function() { return this.contents.length; } } }); // override each stream op with one that tries to force load the lazy file first var stream_ops = {}; var keys = Object.keys(node.stream_ops); keys.forEach(function(key) { var fn = node.stream_ops[key]; stream_ops[key] = function forceLoadLazyFile() { if (!FS.forceLoadFile(node)) { throw new FS.ErrnoError(ERRNO_CODES.EIO); } return fn.apply(null, arguments); }; }); // use a custom read function stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { if (!FS.forceLoadFile(node)) { throw new FS.ErrnoError(ERRNO_CODES.EIO); } var contents = stream.node.contents; if (position >= contents.length) return 0; var size = Math.min(contents.length - position, length); assert(size >= 0); if (contents.slice) { // normal array for (var i = 0; i < size; i++) { buffer[offset + i] = contents[position + i]; } } else { for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR buffer[offset + i] = contents.get(position + i); } } return size; }; node.stream_ops = stream_ops; return node; },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { Browser.init(); // XXX perhaps this method should move onto Browser? // TODO we should allow people to just pass in a complete filename instead // of parent and name being that we just join them anyways var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent; var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname function processData(byteArray) { function finish(byteArray) { if (preFinish) preFinish(); if (!dontCreateFile) { FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); } if (onload) onload(); removeRunDependency(dep); } var handled = false; Module['preloadPlugins'].forEach(function(plugin) { if (handled) return; if (plugin['canHandle'](fullname)) { plugin['handle'](byteArray, fullname, finish, function() { if (onerror) onerror(); removeRunDependency(dep); }); handled = true; } }); if (!handled) finish(byteArray); } addRunDependency(dep); if (typeof url == 'string') { Browser.asyncLoad(url, function(byteArray) { processData(byteArray); }, onerror); } else { processData(url); } },indexedDB:function () { return Module.indexedDB; },DB_NAME:function () { return 'EM_FS_' + window.location.pathname; },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function (paths, onload, onerror) { onload = onload || function(){}; onerror = onerror || function(){}; var indexedDB = FS.indexedDB(); try { var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); } catch (e) { return onerror(e); } openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { console.log('creating db'); var db = openRequest.result; db.createObjectStore(FS.DB_STORE_NAME); }; openRequest.onsuccess = function openRequest_onsuccess() { var db = openRequest.result; var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); var files = transaction.objectStore(FS.DB_STORE_NAME); var ok = 0, fail = 0, total = paths.length; function finish() { if (fail == 0) onload(); else onerror(); } paths.forEach(function(path) { var putRequest = files.put(FS.analyzePath(path).object.contents, path); putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() }; putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() }; }); transaction.onerror = onerror; }; openRequest.onerror = onerror; },loadFilesFromDB:function (paths, onload, onerror) { onload = onload || function(){}; onerror = onerror || function(){}; var indexedDB = FS.indexedDB(); try { var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); } catch (e) { return onerror(e); } openRequest.onupgradeneeded = onerror; // no database to load from openRequest.onsuccess = function openRequest_onsuccess() { var db = openRequest.result; try { var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); } catch(e) { onerror(e); return; } var files = transaction.objectStore(FS.DB_STORE_NAME); var ok = 0, fail = 0, total = paths.length; function finish() { if (fail == 0) onload(); else onerror(); } paths.forEach(function(path) { var getRequest = files.get(path); getRequest.onsuccess = function getRequest_onsuccess() { if (FS.analyzePath(path).exists) { FS.unlink(path); } FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); ok++; if (ok + fail == total) finish(); }; getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() }; }); transaction.onerror = onerror; }; openRequest.onerror = onerror; }};function _utime(path, times) { // int utime(const char *path, const struct utimbuf *times); // http://pubs.opengroup.org/onlinepubs/009695399/basedefs/utime.h.html var time; if (times) { // NOTE: We don't keep track of access timestamps. var offset = 4; time = HEAP32[(((times)+(offset))>>2)]; time *= 1000; } else { time = Date.now(); } path = Pointer_stringify(path); try { FS.utime(path, time, time); return 0; } catch (e) { FS.handleFSError(e); return -1; } } function _emscripten_glCopyTexImage2D(x0, x1, x2, x3, x4, x5, x6, x7) { GLctx['copyTexImage2D'](x0, x1, x2, x3, x4, x5, x6, x7) } function _emscripten_set_devicemotion_callback(userData, useCapture, callbackfunc) { JSEvents.registerDeviceMotionEventCallback(window, userData, useCapture, callbackfunc, 17, "devicemotion"); return 0; } function _JS_SystemInfo_HasFullscreen() { return UnityLoader.SystemInfo.hasFullscreen; } function _emscripten_glTexParameterfv(target, pname, params) { var param = HEAPF32[((params)>>2)]; GLctx.texParameterf(target, pname, param); } function _emscripten_glDepthRangef(x0, x1) { GLctx['depthRange'](x0, x1) } var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:function (dirfd, path) { if (path[0] !== '/') { // relative path var dir; if (dirfd === -100) { dir = FS.cwd(); } else { var dirstream = FS.getStream(dirfd); if (!dirstream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); dir = dirstream.path; } path = PATH.join2(dir, path); } return path; },doStat:function (func, path, buf) { try { var stat = func(path); } catch (e) { if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { // an error occurred while trying to look up the path; we should just report ENOTDIR return -ERRNO_CODES.ENOTDIR; } throw e; } HEAP32[((buf)>>2)]=stat.dev; HEAP32[(((buf)+(4))>>2)]=0; HEAP32[(((buf)+(8))>>2)]=stat.ino; HEAP32[(((buf)+(12))>>2)]=stat.mode; HEAP32[(((buf)+(16))>>2)]=stat.nlink; HEAP32[(((buf)+(20))>>2)]=stat.uid; HEAP32[(((buf)+(24))>>2)]=stat.gid; HEAP32[(((buf)+(28))>>2)]=stat.rdev; HEAP32[(((buf)+(32))>>2)]=0; HEAP32[(((buf)+(36))>>2)]=stat.size; HEAP32[(((buf)+(40))>>2)]=4096; HEAP32[(((buf)+(44))>>2)]=stat.blocks; HEAP32[(((buf)+(48))>>2)]=(stat.atime.getTime() / 1000)|0; HEAP32[(((buf)+(52))>>2)]=0; HEAP32[(((buf)+(56))>>2)]=(stat.mtime.getTime() / 1000)|0; HEAP32[(((buf)+(60))>>2)]=0; HEAP32[(((buf)+(64))>>2)]=(stat.ctime.getTime() / 1000)|0; HEAP32[(((buf)+(68))>>2)]=0; HEAP32[(((buf)+(72))>>2)]=stat.ino; return 0; },doMsync:function (addr, stream, len, flags) { var buffer = new Uint8Array(HEAPU8.subarray(addr, addr + len)); FS.msync(stream, buffer, 0, len, flags); },doMkdir:function (path, mode) { // remove a trailing slash, if one - /a/b/ has basename of '', but // we want to create b in the context of this function path = PATH.normalize(path); if (path[path.length-1] === '/') path = path.substr(0, path.length-1); FS.mkdir(path, mode, 0); return 0; },doMknod:function (path, mode, dev) { // we don't want this in the JS API as it uses mknod to create all nodes. switch (mode & 61440) { case 32768: case 8192: case 24576: case 4096: case 49152: break; default: return -ERRNO_CODES.EINVAL; } FS.mknod(path, mode, dev); return 0; },doReadlink:function (path, buf, bufsize) { if (bufsize <= 0) return -ERRNO_CODES.EINVAL; var ret = FS.readlink(path); var len = Math.min(bufsize, lengthBytesUTF8(ret)); var endChar = HEAP8[buf+len]; stringToUTF8(ret, buf, bufsize+1); // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!) // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write. HEAP8[buf+len] = endChar; return len; },doAccess:function (path, amode) { if (amode & ~7) { // need a valid mode return -ERRNO_CODES.EINVAL; } var node; var lookup = FS.lookupPath(path, { follow: true }); node = lookup.node; var perms = ''; if (amode & 4) perms += 'r'; if (amode & 2) perms += 'w'; if (amode & 1) perms += 'x'; if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { return -ERRNO_CODES.EACCES; } return 0; },doDup:function (path, flags, suggestFD) { var suggest = FS.getStream(suggestFD); if (suggest) FS.close(suggest); return FS.open(path, flags, 0, suggestFD, suggestFD).fd; },doReadv:function (stream, iov, iovcnt, offset) { var ret = 0; for (var i = 0; i < iovcnt; i++) { var ptr = HEAP32[(((iov)+(i*8))>>2)]; var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; var curr = FS.read(stream, HEAP8,ptr, len, offset); if (curr < 0) return -1; ret += curr; if (curr < len) break; // nothing more to read } return ret; },doWritev:function (stream, iov, iovcnt, offset) { var ret = 0; for (var i = 0; i < iovcnt; i++) { var ptr = HEAP32[(((iov)+(i*8))>>2)]; var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; var curr = FS.write(stream, HEAP8,ptr, len, offset); if (curr < 0) return -1; ret += curr; } return ret; },varargs:0,get:function (varargs) { SYSCALLS.varargs += 4; var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; return ret; },getStr:function () { var ret = Pointer_stringify(SYSCALLS.get()); return ret; },getStreamFromFD:function () { var stream = FS.getStream(SYSCALLS.get()); if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); return stream; },getSocketFromFD:function () { var socket = SOCKFS.getSocket(SYSCALLS.get()); if (!socket) throw new FS.ErrnoError(ERRNO_CODES.EBADF); return socket; },getSocketAddress:function (allowNull) { var addrp = SYSCALLS.get(), addrlen = SYSCALLS.get(); if (allowNull && addrp === 0) return null; var info = __read_sockaddr(addrp, addrlen); if (info.errno) throw new FS.ErrnoError(info.errno); info.addr = DNS.lookup_addr(info.addr) || info.addr; return info; },get64:function () { var low = SYSCALLS.get(), high = SYSCALLS.get(); if (low >= 0) assert(high === 0); else assert(high === -1); return low; },getZero:function () { assert(SYSCALLS.get() === 0); }};function ___syscall168(which, varargs) {SYSCALLS.varargs = varargs; try { // poll var fds = SYSCALLS.get(), nfds = SYSCALLS.get(), timeout = SYSCALLS.get(); var nonzero = 0; for (var i = 0; i < nfds; i++) { var pollfd = fds + 8 * i; var fd = HEAP32[((pollfd)>>2)]; var events = HEAP16[(((pollfd)+(4))>>1)]; var mask = 32; var stream = FS.getStream(fd); if (stream) { mask = SYSCALLS.DEFAULT_POLLMASK; if (stream.stream_ops.poll) { mask = stream.stream_ops.poll(stream); } } mask &= events | 8 | 16; if (mask) nonzero++; HEAP16[(((pollfd)+(6))>>1)]=mask; } return nonzero; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _JS_SystemInfo_GetBrowserName(buffer, bufferSize) { var browser = UnityLoader.SystemInfo.browser; if (buffer) stringToUTF8(browser, buffer, bufferSize); return lengthBytesUTF8(browser); } function _emscripten_glGetObjectParameterivARB() { Module['printErr']('missing function: emscripten_glGetObjectParameterivARB'); abort(-1); } function _glCreateShader(shaderType) { var id = GL.getNewId(GL.shaders); GL.shaders[id] = GLctx.createShader(shaderType); return id; } function _emscripten_glBindAttribLocation(program, index, name) { name = Pointer_stringify(name); GLctx.bindAttribLocation(GL.programs[program], index, name); } function _glGenRenderbuffers(n, renderbuffers) { for (var i = 0; i < n; i++) { var renderbuffer = GLctx.createRenderbuffer(); if (!renderbuffer) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); while(i < n) HEAP32[(((renderbuffers)+(i++*4))>>2)]=0; return; } var id = GL.getNewId(GL.renderbuffers); renderbuffer.name = id; GL.renderbuffers[id] = renderbuffer; HEAP32[(((renderbuffers)+(i*4))>>2)]=id; } } function _glCompressedTexImage2D(target, level, internalFormat, width, height, border, imageSize, data) { var heapView; if (data) { heapView = HEAPU8.subarray((data),(data+imageSize)); } else { heapView = null; } GLctx['compressedTexImage2D'](target, level, internalFormat, width, height, border, heapView); } function _glBlendFuncSeparate(x0, x1, x2, x3) { GLctx['blendFuncSeparate'](x0, x1, x2, x3) } Module["_memset"] = _memset; function _glDrawBuffers(n, bufs) { var bufArray = []; for (var i = 0; i < n; i++) bufArray.push(HEAP32[(((bufs)+(i*4))>>2)]); GLctx['drawBuffers'](bufArray); } function _JS_SystemInfo_HasCursorLock() { return UnityLoader.SystemInfo.hasCursorLock; } var wr={requestInstances:{},nextRequestId:1};function _JS_WebRequest_Send(request, ptr, length) { var http = wr.requestInstances[request]; try { if (length > 0) http.send(HEAPU8.subarray(ptr, ptr+length)); else http.send(); } catch(e) { console.error(e.name + ": " + e.message); } } function ___lock() {} function _emscripten_glGetVertexAttribPointerv(index, pname, pointer) { if (!pointer) { // GLES2 specification does not specify how to behave if pointer is a null pointer. Since calling this function does not make sense // if pointer == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } HEAP32[((pointer)>>2)]=GLctx.getVertexAttribOffset(index, pname); } function _emscripten_glVertexAttrib3f(x0, x1, x2, x3) { GLctx['vertexAttrib3f'](x0, x1, x2, x3) } function _clock() { if (_clock.start === undefined) _clock.start = Date.now(); return ((Date.now() - _clock.start) * (1000000 / 1000))|0; } var _llvm_ctlz_i32=true; function _glDeleteProgram(id) { if (!id) return; var program = GL.programs[id]; if (!program) { // glDeleteProgram actually signals an error when deleting a nonexisting object, unlike some other GL delete functions. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } GLctx.deleteProgram(program); program.name = 0; GL.programs[id] = null; GL.programInfos[id] = null; } function _glRenderbufferStorage(x0, x1, x2, x3) { GLctx['renderbufferStorage'](x0, x1, x2, x3) } var WEBAudio={audioInstances:[],audioContext:{},audioWebEnabled:0};function _JS_Sound_SetListenerPosition(x, y, z) { if (WEBAudio.audioWebEnabled == 0) return; WEBAudio.audioContext.listener.setPosition(x, y, z); } function _JS_WebGL_InitContextAttributes(attributes) { // We want alpha in the back buffer so that we match expected Unity output. // But the browsers will use alpha to blend with the web page, so we have to // make sure we clear it before blitting. HEAP32[((attributes)>>2)]=1; HEAP32[(((attributes)+(4))>>2)]=1; HEAP32[(((attributes)+(8))>>2)]=1; HEAP32[(((attributes)+(12))>>2)]=0; HEAP32[(((attributes)+(16))>>2)]=1; HEAP32[(((attributes)+(20))>>2)]=Module.webglContextAttributes.preserveDrawingBuffer; HEAP32[(((attributes)+(24))>>2)]=0; HEAP32[(((attributes)+(28))>>2)]=0; HEAP32[(((attributes)+(32))>>2)]=1; HEAP32[(((attributes)+(36))>>2)]=0; HEAP32[(((attributes)+(40))>>2)]=1; HEAP32[(((attributes)+(44))>>2)]=0; return 0; } function _emscripten_set_touchstart_callback(target, userData, useCapture, callbackfunc) { JSEvents.registerTouchEventCallback(target, userData, useCapture, callbackfunc, 22, "touchstart"); return 0; } function _emscripten_glDeleteShader(id) { if (!id) return; var shader = GL.shaders[id]; if (!shader) { // glDeleteShader actually signals an error when deleting a nonexisting object, unlike some other GL delete functions. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } GLctx.deleteShader(shader); GL.shaders[id] = null; } function _pthread_attr_init(attr) { /* int pthread_attr_init(pthread_attr_t *attr); */ //FIXME: should allocate a pthread_attr_t return 0; } function _emscripten_glDrawArraysInstanced(mode, first, count, primcount) { GLctx['drawArraysInstanced'](mode, first, count, primcount); } function _emscripten_glDeleteBuffers(n, buffers) { for (var i = 0; i < n; i++) { var id = HEAP32[(((buffers)+(i*4))>>2)]; var buffer = GL.buffers[id]; // From spec: "glDeleteBuffers silently ignores 0's and names that do not // correspond to existing buffer objects." if (!buffer) continue; GLctx.deleteBuffer(buffer); buffer.name = 0; GL.buffers[id] = null; if (id == GL.currArrayBuffer) GL.currArrayBuffer = 0; if (id == GL.currElementArrayBuffer) GL.currElementArrayBuffer = 0; } } function _emscripten_glTexParameteriv(target, pname, params) { var param = HEAP32[((params)>>2)]; GLctx.texParameteri(target, pname, param); } function _emscripten_glUniformMatrix2fv(location, count, transpose, value) { location = GL.uniforms[location]; var view; if (4*count <= GL.MINI_TEMP_BUFFER_SIZE) { // avoid allocation when uploading few enough uniforms view = GL.miniTempBufferViews[4*count-1]; for (var i = 0; i < 4*count; i += 4) { view[i] = HEAPF32[(((value)+(4*i))>>2)]; view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)]; } } else { view = HEAPF32.subarray((value)>>2,(value+count*16)>>2); } GLctx.uniformMatrix2fv(location, !!transpose, view); } function ___syscall5(which, varargs) {SYSCALLS.varargs = varargs; try { // open var pathname = SYSCALLS.getStr(), flags = SYSCALLS.get(), mode = SYSCALLS.get() // optional TODO var stream = FS.open(pathname, flags, mode); return stream.fd; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function ___syscall4(which, varargs) {SYSCALLS.varargs = varargs; try { // write var stream = SYSCALLS.getStreamFromFD(), buf = SYSCALLS.get(), count = SYSCALLS.get(); return FS.write(stream, HEAP8,buf, count); } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function ___syscall6(which, varargs) {SYSCALLS.varargs = varargs; try { // close var stream = SYSCALLS.getStreamFromFD(); FS.close(stream); return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _glGenVertexArrays(n, arrays) { for (var i = 0; i < n; i++) { var vao = GLctx['createVertexArray'](); if (!vao) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); while(i < n) HEAP32[(((arrays)+(i++*4))>>2)]=0; return; } var id = GL.getNewId(GL.vaos); vao.name = id; GL.vaos[id] = vao; HEAP32[(((arrays)+(i*4))>>2)]=id; } } function _glTexStorage3D(x0, x1, x2, x3, x4, x5) { GLctx['texStorage3D'](x0, x1, x2, x3, x4, x5) } function _emscripten_glEnableClientState() { Module['printErr']('missing function: emscripten_glEnableClientState'); abort(-1); } function _glDetachShader(program, shader) { GLctx.detachShader(GL.programs[program], GL.shaders[shader]); } function _emscripten_glStencilMask(x0) { GLctx['stencilMask'](x0) } function _JS_Sound_SetListenerOrientation(x, y, z, xUp, yUp, zUp) { if (WEBAudio.audioWebEnabled == 0) return; // Web Audio uses a RHS coordinate system, Unity uses LHS, causing orientations to be flipped. // So we pass a negative direction here to compensate, otherwise channels will be flipped. WEBAudio.audioContext.listener.setOrientation(-x, -y, -z, xUp, yUp, zUp); } function _JS_Eval_SetTimeout(func, arg, millis) { Module['noExitRuntime'] = true; function wrapper() { Runtime.getFuncWrapper(func, 'vi')(arg); } return Browser.safeSetTimeout(wrapper, millis); } function _JS_Eval_EvalJS(ptr) { var str = Pointer_stringify(ptr); try { eval (str); } catch (exception) { console.error(exception); } } function _glDeleteFramebuffers(n, framebuffers) { for (var i = 0; i < n; ++i) { var id = HEAP32[(((framebuffers)+(i*4))>>2)]; var framebuffer = GL.framebuffers[id]; if (!framebuffer) continue; // GL spec: "glDeleteFramebuffers silently ignores 0s and names that do not correspond to existing framebuffer objects". GLctx.deleteFramebuffer(framebuffer); framebuffer.name = 0; GL.framebuffers[id] = null; } } function _glDrawArrays(mode, first, count) { GLctx.drawArrays(mode, first, count); } function _emscripten_webgl_enable_extension(contextHandle, extension) { var context = GL.getContext(contextHandle); var extString = Pointer_stringify(extension); if (extString.indexOf('GL_') == 0) extString = extString.substr(3); // Allow enabling extensions both with "GL_" prefix and without. var ext = context.GLctx.getExtension(extString); return ext ? 1 : 0; } function _emscripten_get_num_gamepads() { __emscripten_sample_gamepad_data(); if (!JSEvents.lastGamepadState) return -1; return JSEvents.lastGamepadState.length; } function _emscripten_set_blur_callback(target, userData, useCapture, callbackfunc) { JSEvents.registerFocusEventCallback(target, userData, useCapture, callbackfunc, 12, "blur"); return 0; } function _mktime(tmPtr) { _tzset(); var date = new Date(HEAP32[(((tmPtr)+(20))>>2)] + 1900, HEAP32[(((tmPtr)+(16))>>2)], HEAP32[(((tmPtr)+(12))>>2)], HEAP32[(((tmPtr)+(8))>>2)], HEAP32[(((tmPtr)+(4))>>2)], HEAP32[((tmPtr)>>2)], 0); // There's an ambiguous hour when the time goes back; the tm_isdst field is // used to disambiguate it. Date() basically guesses, so we fix it up if it // guessed wrong, or fill in tm_isdst with the guess if it's -1. var dst = HEAP32[(((tmPtr)+(32))>>2)]; var guessedOffset = date.getTimezoneOffset(); var start = new Date(date.getFullYear(), 0, 1); var summerOffset = new Date(2000, 6, 1).getTimezoneOffset(); var winterOffset = start.getTimezoneOffset(); var dstOffset = Math.min(winterOffset, summerOffset); // DST is in December in South if (dst < 0) { HEAP32[(((tmPtr)+(32))>>2)]=Number(dstOffset == guessedOffset); } else if ((dst > 0) != (dstOffset == guessedOffset)) { var nonDstOffset = Math.max(winterOffset, summerOffset); var trueOffset = dst > 0 ? dstOffset : nonDstOffset; // Don't try setMinutes(date.getMinutes() + ...) -- it's messed up. date.setTime(date.getTime() + (trueOffset - guessedOffset)*60000); } HEAP32[(((tmPtr)+(24))>>2)]=date.getDay(); var yday = ((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24))|0; HEAP32[(((tmPtr)+(28))>>2)]=yday; return (date.getTime() / 1000)|0; } function _sched_yield() { return 0; } function _glClear(x0) { GLctx['clear'](x0) } function _emscripten_webgl_make_context_current(contextHandle) { var success = GL.makeContextCurrent(contextHandle); return success ? 0 : -5; } function _glUniform2iv(location, count, value) { location = GL.uniforms[location]; count *= 2; value = HEAP32.subarray((value)>>2,(value+count*4)>>2); GLctx.uniform2iv(location, value); } function _glIsEnabled(x0) { return GLctx['isEnabled'](x0) } function _glFramebufferTexture2D(target, attachment, textarget, texture, level) { GLctx.framebufferTexture2D(target, attachment, textarget, GL.textures[texture], level); } function _glGetFramebufferAttachmentParameteriv(target, attachment, pname, params) { var result = GLctx.getFramebufferAttachmentParameter(target, attachment, pname); HEAP32[((params)>>2)]=result; } function _emscripten_request_pointerlock(target, deferUntilInEventHandler) { if (!target) target = '#canvas'; target = JSEvents.findEventTarget(target); if (!target) return -4; if (!target.requestPointerLock && !target.mozRequestPointerLock && !target.webkitRequestPointerLock && !target.msRequestPointerLock) { return -1; } var canPerformRequests = JSEvents.canPerformEventHandlerRequests(); // Queue this function call if we're not currently in an event handler and the user saw it appropriate to do so. if (!canPerformRequests) { if (deferUntilInEventHandler) { JSEvents.deferCall(JSEvents.requestPointerLock, 2 /* priority below fullscreen */, [target]); return 1; } else { return -2; } } return JSEvents.requestPointerLock(target); } function _glBindBufferBase(target, index, buffer) { var bufferObj = buffer ? GL.buffers[buffer] : null; GLctx['bindBufferBase'](target, index, bufferObj); } Module["_pthread_cond_broadcast"] = _pthread_cond_broadcast; function _gettimeofday(ptr) { var now = Date.now(); HEAP32[((ptr)>>2)]=(now/1000)|0; // seconds HEAP32[(((ptr)+(4))>>2)]=((now % 1000)*1000)|0; // microseconds return 0; } function _glTexParameteriv(target, pname, params) { var param = HEAP32[((params)>>2)]; GLctx.texParameteri(target, pname, param); } function _JS_Sound_SetVolume(channelInstance, v) { if (WEBAudio.audioWebEnabled == 0) return; WEBAudio.audioInstances[channelInstance].gain.gain.value = v; } function _glGenFramebuffers(n, ids) { for (var i = 0; i < n; ++i) { var framebuffer = GLctx.createFramebuffer(); if (!framebuffer) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); while(i < n) HEAP32[(((ids)+(i++*4))>>2)]=0; return; } var id = GL.getNewId(GL.framebuffers); framebuffer.name = id; GL.framebuffers[id] = framebuffer; HEAP32[(((ids)+(i*4))>>2)]=id; } } function _emscripten_glGetTexParameteriv(target, pname, params) { if (!params) { // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense // if p == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } HEAP32[((params)>>2)]=GLctx.getTexParameter(target, pname); } function ___syscall122(which, varargs) {SYSCALLS.varargs = varargs; try { // uname var buf = SYSCALLS.get(); if (!buf) return -ERRNO_CODES.EFAULT var layout = {"sysname":0,"nodename":65,"domainname":325,"machine":260,"version":195,"release":130,"__size__":390}; function copyString(element, value) { var offset = layout[element]; writeAsciiToMemory(value, buf + offset); } copyString('sysname', 'Emscripten'); copyString('nodename', 'emscripten'); copyString('release', '1.0'); copyString('version', '#1'); copyString('machine', 'x86-JS'); return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _abort() { Module['abort'](); } function _glDeleteVertexArrays(n, vaos) { for (var i = 0; i < n; i++) { var id = HEAP32[(((vaos)+(i*4))>>2)]; GLctx['deleteVertexArray'](GL.vaos[id]); GL.vaos[id] = null; } } function _emscripten_glSampleCoverage(value, invert) { GLctx.sampleCoverage(value, !!invert); } function _glIsVertexArray(array) { var vao = GL.vaos[array]; if (!vao) return 0; return GLctx['isVertexArray'](vao); } function _glDisableVertexAttribArray(index) { GLctx.disableVertexAttribArray(index); } function _sysconf(name) { // long sysconf(int name); // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html switch(name) { case 30: return PAGE_SIZE; case 85: return totalMemory / PAGE_SIZE; case 132: case 133: case 12: case 137: case 138: case 15: case 235: case 16: case 17: case 18: case 19: case 20: case 149: case 13: case 10: case 236: case 153: case 9: case 21: case 22: case 159: case 154: case 14: case 77: case 78: case 139: case 80: case 81: case 82: case 68: case 67: case 164: case 11: case 29: case 47: case 48: case 95: case 52: case 51: case 46: return 200809; case 79: return 0; case 27: case 246: case 127: case 128: case 23: case 24: case 160: case 161: case 181: case 182: case 242: case 183: case 184: case 243: case 244: case 245: case 165: case 178: case 179: case 49: case 50: case 168: case 169: case 175: case 170: case 171: case 172: case 97: case 76: case 32: case 173: case 35: return -1; case 176: case 177: case 7: case 155: case 8: case 157: case 125: case 126: case 92: case 93: case 129: case 130: case 131: case 94: case 91: return 1; case 74: case 60: case 69: case 70: case 4: return 1024; case 31: case 42: case 72: return 32; case 87: case 26: case 33: return 2147483647; case 34: case 1: return 47839; case 38: case 36: return 99; case 43: case 37: return 2048; case 0: return 2097152; case 3: return 65536; case 28: return 32768; case 44: return 32767; case 75: return 16384; case 39: return 1000; case 89: return 700; case 71: return 256; case 40: return 255; case 2: return 100; case 180: return 64; case 25: return 20; case 5: return 16; case 6: return 6; case 73: return 4; case 84: { if (typeof navigator === 'object') return navigator['hardwareConcurrency'] || 1; return 1; } } ___setErrNo(ERRNO_CODES.EINVAL); return -1; } function _emscripten_glMatrixMode(){ throw 'Legacy GL function (glMatrixMode) called. If you want legacy GL emulation, you need to compile with -s LEGACY_GL_EMULATION=1 to enable legacy GL emulation.'; } function _glGetUniformIndices(program, uniformCount, uniformNames, uniformIndices) { if (!uniformIndices) { // GLES2 specification does not specify how to behave if uniformIndices is a null pointer. Since calling this function does not make sense // if uniformIndices == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } if (uniformCount > 0 && (uniformNames == 0 || uniformIndices == 0)) { GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } program = GL.programs[program]; var names = []; for (var i = 0; i < uniformCount; i++) names.push(Pointer_stringify(HEAP32[(((uniformNames)+(i*4))>>2)])); var result = GLctx['getUniformIndices'](program, names); if (!result) return; // GL spec: If an error is generated, nothing is written out to uniformIndices. var len = result.length; for (var i = 0; i < len; i++) { HEAP32[(((uniformIndices)+(i*4))>>2)]=result[i]; } } function _JS_Log_Dump(ptr, type) { var str = Pointer_stringify(ptr); if (typeof dump == 'function') dump (str); switch (type) { case 0: //LogType_Error case 1: //LogType_Assert case 4: //LogType_Exception console.error (str); return; case 2: //LogType_Warning console.warn (str); return; case 3: //LogType_Log case 5: //LogType_Debug console.log (str); return; default: console.error ("Unknown console message type!") console.error (str); } } function _emscripten_glPolygonOffset(x0, x1) { GLctx['polygonOffset'](x0, x1) } function _glDisable(x0) { GLctx['disable'](x0) } function _emscripten_glIsBuffer(buffer) { var b = GL.buffers[buffer]; if (!b) return 0; return GLctx.isBuffer(b); } var PTHREAD_SPECIFIC={};function _pthread_getspecific(key) { return PTHREAD_SPECIFIC[key] || 0; } function _glEnable(x0) { GLctx['enable'](x0) } function _glGetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params) { if (!params) { // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense // if params == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } if (uniformCount > 0 && uniformIndices == 0) { GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } program = GL.programs[program]; var ids = []; for (var i = 0; i < uniformCount; i++) { ids.push(HEAP32[(((uniformIndices)+(i*4))>>2)]); } var result = GLctx['getActiveUniforms'](program, ids, pname); if (!result) return; // GL spec: If an error is generated, nothing is written out to params. var len = result.length; for (var i = 0; i < len; i++) { HEAP32[(((params)+(i*4))>>2)]=result[i]; } } function emscriptenWebGLComputeImageSize(width, height, sizePerPixel, alignment) { function roundedToNextMultipleOf(x, y) { return Math.floor((x + y - 1) / y) * y } var plainRowSize = width * sizePerPixel; var alignedRowSize = roundedToNextMultipleOf(plainRowSize, alignment); return (height <= 0) ? 0 : ((height - 1) * alignedRowSize + plainRowSize); }function emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, internalFormat) { var sizePerPixel; var numChannels; switch(format) { case 0x1906 /* GL_ALPHA */: case 0x1909 /* GL_LUMINANCE */: case 0x1902 /* GL_DEPTH_COMPONENT */: case 0x1903 /* GL_RED */: case 0x8D94 /* GL_RED_INTEGER */: numChannels = 1; break; case 0x190A /* GL_LUMINANCE_ALPHA */: case 0x8227 /* GL_RG */: case 0x8228 /* GL_RG_INTEGER*/: numChannels = 2; break; case 0x1907 /* GL_RGB */: case 0x8C40 /* GL_SRGB_EXT */: case 0x8D98 /* GL_RGB_INTEGER */: numChannels = 3; break; case 0x1908 /* GL_RGBA */: case 0x8C42 /* GL_SRGB_ALPHA_EXT */: case 0x8D99 /* GL_RGBA_INTEGER */: numChannels = 4; break; default: GL.recordError(0x0500); // GL_INVALID_ENUM return null; } switch (type) { case 0x1401 /* GL_UNSIGNED_BYTE */: case 0x1400 /* GL_BYTE */: sizePerPixel = numChannels*1; break; case 0x1403 /* GL_UNSIGNED_SHORT */: case 0x8D61 /* GL_HALF_FLOAT_OES */: case 0x140B /* GL_HALF_FLOAT */: case 0x1402 /* GL_SHORT */: sizePerPixel = numChannels*2; break; case 0x1405 /* GL_UNSIGNED_INT */: case 0x1406 /* GL_FLOAT */: case 0x1404 /* GL_INT */: sizePerPixel = numChannels*4; break; case 0x84FA /* GL_UNSIGNED_INT_24_8_WEBGL/GL_UNSIGNED_INT_24_8 */: case 0x8C3E /* GL_UNSIGNED_INT_5_9_9_9_REV */: case 0x8368 /* GL_UNSIGNED_INT_2_10_10_10_REV */: case 0x8C3B /* GL_UNSIGNED_INT_10F_11F_11F_REV */: case 0x84FA /* GL_UNSIGNED_INT_24_8 */: sizePerPixel = 4; break; case 0x8363 /* GL_UNSIGNED_SHORT_5_6_5 */: case 0x8033 /* GL_UNSIGNED_SHORT_4_4_4_4 */: case 0x8034 /* GL_UNSIGNED_SHORT_5_5_5_1 */: sizePerPixel = 2; break; default: GL.recordError(0x0500); // GL_INVALID_ENUM return null; } var bytes = emscriptenWebGLComputeImageSize(width, height, sizePerPixel, GL.unpackAlignment); switch(type) { case 0x1400 /* GL_BYTE */: return HEAP8.subarray((pixels),(pixels+bytes)); case 0x1401 /* GL_UNSIGNED_BYTE */: return HEAPU8.subarray((pixels),(pixels+bytes)); case 0x1402 /* GL_SHORT */: return HEAP16.subarray((pixels)>>1,(pixels+bytes)>>1); case 0x1404 /* GL_INT */: return HEAP32.subarray((pixels)>>2,(pixels+bytes)>>2); case 0x1406 /* GL_FLOAT */: return HEAPF32.subarray((pixels)>>2,(pixels+bytes)>>2); case 0x1405 /* GL_UNSIGNED_INT */: case 0x84FA /* GL_UNSIGNED_INT_24_8_WEBGL/GL_UNSIGNED_INT_24_8 */: case 0x8C3E /* GL_UNSIGNED_INT_5_9_9_9_REV */: case 0x8368 /* GL_UNSIGNED_INT_2_10_10_10_REV */: case 0x8C3B /* GL_UNSIGNED_INT_10F_11F_11F_REV */: case 0x84FA /* GL_UNSIGNED_INT_24_8 */: return HEAPU32.subarray((pixels)>>2,(pixels+bytes)>>2); case 0x1403 /* GL_UNSIGNED_SHORT */: case 0x8363 /* GL_UNSIGNED_SHORT_5_6_5 */: case 0x8033 /* GL_UNSIGNED_SHORT_4_4_4_4 */: case 0x8034 /* GL_UNSIGNED_SHORT_5_5_5_1 */: case 0x8D61 /* GL_HALF_FLOAT_OES */: case 0x140B /* GL_HALF_FLOAT */: return HEAPU16.subarray((pixels)>>1,(pixels+bytes)>>1); default: GL.recordError(0x0500); // GL_INVALID_ENUM return null; } }function _emscripten_glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels) { var pixelData = null; if (pixels) pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, 0); GLctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixelData); } function _emscripten_glUniform2f(location, v0, v1) { location = GL.uniforms[location]; GLctx.uniform2f(location, v0, v1); } function _glGetAttribLocation(program, name) { program = GL.programs[program]; name = Pointer_stringify(name); return GLctx.getAttribLocation(program, name); } function _emscripten_glUniform2i(location, v0, v1) { location = GL.uniforms[location]; GLctx.uniform2i(location, v0, v1); } function _emscripten_glDeleteRenderbuffers(n, renderbuffers) { for (var i = 0; i < n; i++) { var id = HEAP32[(((renderbuffers)+(i*4))>>2)]; var renderbuffer = GL.renderbuffers[id]; if (!renderbuffer) continue; // GL spec: "glDeleteRenderbuffers silently ignores 0s and names that do not correspond to existing renderbuffer objects". GLctx.deleteRenderbuffer(renderbuffer); renderbuffer.name = 0; GL.renderbuffers[id] = null; } } function ___cxa_pure_virtual() { ABORT = true; throw 'Pure virtual function called!'; } var _environ=STATICTOP; STATICTOP += 16;;var ___environ=_environ;function ___buildEnvironment(env) { // WARNING: Arbitrary limit! var MAX_ENV_VALUES = 64; var TOTAL_ENV_SIZE = 1024; // Statically allocate memory for the environment. var poolPtr; var envPtr; if (!___buildEnvironment.called) { ___buildEnvironment.called = true; // Set default values. Use string keys for Closure Compiler compatibility. ENV['USER'] = ENV['LOGNAME'] = 'web_user'; ENV['PATH'] = '/'; ENV['PWD'] = '/'; ENV['HOME'] = '/home/web_user'; ENV['LANG'] = 'C'; ENV['_'] = Module['thisProgram']; // Allocate memory. poolPtr = allocate(TOTAL_ENV_SIZE, 'i8', ALLOC_STATIC); envPtr = allocate(MAX_ENV_VALUES * 4, 'i8*', ALLOC_STATIC); HEAP32[((envPtr)>>2)]=poolPtr; HEAP32[((_environ)>>2)]=envPtr; } else { envPtr = HEAP32[((_environ)>>2)]; poolPtr = HEAP32[((envPtr)>>2)]; } // Collect key=value lines. var strings = []; var totalSize = 0; for (var key in env) { if (typeof env[key] === 'string') { var line = key + '=' + env[key]; strings.push(line); totalSize += line.length; } } if (totalSize > TOTAL_ENV_SIZE) { throw new Error('Environment size exceeded TOTAL_ENV_SIZE!'); } // Make new. var ptrSize = 4; for (var i = 0; i < strings.length; i++) { var line = strings[i]; writeAsciiToMemory(line, poolPtr); HEAP32[(((envPtr)+(i * ptrSize))>>2)]=poolPtr; poolPtr += line.length + 1; } HEAP32[(((envPtr)+(strings.length * ptrSize))>>2)]=0; }var ENV={};function _unsetenv(name) { // int unsetenv(const char *name); // http://pubs.opengroup.org/onlinepubs/009695399/functions/unsetenv.html if (name === 0) { ___setErrNo(ERRNO_CODES.EINVAL); return -1; } name = Pointer_stringify(name); if (name === '' || name.indexOf('=') !== -1) { ___setErrNo(ERRNO_CODES.EINVAL); return -1; } if (ENV.hasOwnProperty(name)) { delete ENV[name]; ___buildEnvironment(ENV); } return 0; } function _emscripten_set_mousedown_callback(target, userData, useCapture, callbackfunc) { JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, 5, "mousedown"); return 0; } function _emscripten_glDepthRange(x0, x1) { GLctx['depthRange'](x0, x1) } function _emscripten_set_fullscreenchange_callback(target, userData, useCapture, callbackfunc) { if (typeof JSEvents.fullscreenEnabled() === 'undefined') return -1; if (!target) target = document; else { target = JSEvents.findEventTarget(target); if (!target) return -4; } JSEvents.registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "fullscreenchange"); JSEvents.registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "mozfullscreenchange"); JSEvents.registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "webkitfullscreenchange"); JSEvents.registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "msfullscreenchange"); return 0; } function _glPolygonOffset(x0, x1) { GLctx['polygonOffset'](x0, x1) } function _JS_WebRequest_SetProgressHandler(request, arg, onprogress) { var http = wr.requestInstances[request]; http.onprogress = function http_onprogress(e) { if (onprogress) { if (e.lengthComputable) Runtime.dynCall('viii', onprogress, [arg, e.loaded, e.total]); } }; } function _emscripten_glGetShaderPrecisionFormat(shaderType, precisionType, range, precision) { var result = GLctx.getShaderPrecisionFormat(shaderType, precisionType); HEAP32[((range)>>2)]=result.rangeMin; HEAP32[(((range)+(4))>>2)]=result.rangeMax; HEAP32[((precision)>>2)]=result.precision; } function _emscripten_set_wheel_callback(target, userData, useCapture, callbackfunc) { target = JSEvents.findEventTarget(target); if (typeof target.onwheel !== 'undefined') { JSEvents.registerWheelEventCallback(target, userData, useCapture, callbackfunc, 9, "wheel"); return 0; } else if (typeof target.onmousewheel !== 'undefined') { JSEvents.registerWheelEventCallback(target, userData, useCapture, callbackfunc, 9, "mousewheel"); return 0; } else { return -1; } } function _glDrawElementsInstanced(mode, count, type, indices, primcount) { GLctx['drawElementsInstanced'](mode, count, type, indices, primcount); } function _emscripten_glBindProgramARB() { Module['printErr']('missing function: emscripten_glBindProgramARB'); abort(-1); } function _emscripten_glVertexAttrib3fv(index, v) { var view = GL.miniTempBufferViews[2]; view[0] = HEAPF32[v >> 2]; view[1] = HEAPF32[v + 4 >> 2]; view[2] = HEAPF32[v + 8 >> 2]; GLctx.vertexAttrib3fv(index, view); } function _glFlush() { GLctx['flush']() } function _glGetRenderbufferParameteriv(target, pname, params) { if (!params) { // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense // if params == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } HEAP32[((params)>>2)]=GLctx.getRenderbufferParameter(target, pname); } function _emscripten_glIsFramebuffer(framebuffer) { var fb = GL.framebuffers[framebuffer]; if (!fb) return 0; return GLctx.isFramebuffer(fb); } function ___syscall193(which, varargs) {SYSCALLS.varargs = varargs; try { // truncate64 var path = SYSCALLS.getStr(), zero = SYSCALLS.getZero(), length = SYSCALLS.get64(); FS.truncate(path, length); return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function ___syscall192(which, varargs) {SYSCALLS.varargs = varargs; try { // mmap2 var addr = SYSCALLS.get(), len = SYSCALLS.get(), prot = SYSCALLS.get(), flags = SYSCALLS.get(), fd = SYSCALLS.get(), off = SYSCALLS.get() off <<= 12; // undo pgoffset var ptr; var allocated = false; if (fd === -1) { ptr = _memalign(PAGE_SIZE, len); if (!ptr) return -ERRNO_CODES.ENOMEM; _memset(ptr, 0, len); allocated = true; } else { var info = FS.getStream(fd); if (!info) return -ERRNO_CODES.EBADF; var res = FS.mmap(info, HEAPU8, addr, len, off, prot, flags); ptr = res.ptr; allocated = res.allocated; } SYSCALLS.mappings[ptr] = { malloc: ptr, len: len, allocated: allocated, fd: fd, flags: flags }; return ptr; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function ___syscall195(which, varargs) {SYSCALLS.varargs = varargs; try { // SYS_stat64 var path = SYSCALLS.getStr(), buf = SYSCALLS.get(); return SYSCALLS.doStat(FS.stat, path, buf); } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function ___syscall194(which, varargs) {SYSCALLS.varargs = varargs; try { // ftruncate64 var fd = SYSCALLS.get(), zero = SYSCALLS.getZero(), length = SYSCALLS.get64(); FS.ftruncate(fd, length); return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function ___syscall197(which, varargs) {SYSCALLS.varargs = varargs; try { // SYS_fstat64 var stream = SYSCALLS.getStreamFromFD(), buf = SYSCALLS.get(); return SYSCALLS.doStat(FS.stat, stream.path, buf); } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function ___syscall196(which, varargs) {SYSCALLS.varargs = varargs; try { // SYS_lstat64 var path = SYSCALLS.getStr(), buf = SYSCALLS.get(); return SYSCALLS.doStat(FS.lstat, path, buf); } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function ___syscall202(which, varargs) {SYSCALLS.varargs = varargs; try { // getgid32 return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } }function ___syscall199() { return ___syscall202.apply(null, arguments) } function _emscripten_glRotatef() { Module['printErr']('missing function: emscripten_glRotatef'); abort(-1); } function _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; } else { return 0; // Failed to create a sync object } } function _glBlendEquationSeparate(x0, x1) { GLctx['blendEquationSeparate'](x0, x1) } function _emscripten_glGetActiveUniform(program, index, bufSize, length, size, type, name) { program = GL.programs[program]; var info = GLctx.getActiveUniform(program, index); if (!info) return; // If an error occurs, nothing will be written to length, size, type and name. if (bufSize > 0 && name) { var numBytesWrittenExclNull = stringToUTF8(info.name, name, bufSize); if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull; } else { if (length) HEAP32[((length)>>2)]=0; } if (size) HEAP32[((size)>>2)]=info.size; if (type) HEAP32[((type)>>2)]=info.type; } function _emscripten_set_focus_callback(target, userData, useCapture, callbackfunc) { JSEvents.registerFocusEventCallback(target, userData, useCapture, callbackfunc, 13, "focus"); return 0; } function _emscripten_glGetShaderInfoLog(shader, maxLength, length, infoLog) { var log = GLctx.getShaderInfoLog(GL.shaders[shader]); if (log === null) log = '(unknown error)'; if (maxLength > 0 && infoLog) { var numBytesWrittenExclNull = stringToUTF8(log, infoLog, maxLength); if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull; } else { if (length) HEAP32[((length)>>2)]=0; } } function _emscripten_set_mouseup_callback(target, userData, useCapture, callbackfunc) { JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, 6, "mouseup"); return 0; } function _emscripten_glStencilOpSeparate(x0, x1, x2, x3) { GLctx['stencilOpSeparate'](x0, x1, x2, x3) } function _emscripten_glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data) { var heapView; if (data) { heapView = HEAPU8.subarray((data),(data+imageSize)); } else { heapView = null; } GLctx['compressedTexSubImage2D'](target, level, xoffset, yoffset, width, height, format, heapView); } function _ShowBanner(gameKey,userID) { if (typeof gdsdk !== "undefined") { gdsdk.showBanner(); } } function _glStencilFuncSeparate(x0, x1, x2, x3) { GLctx['stencilFuncSeparate'](x0, x1, x2, x3) } function _glGenSamplers(n, samplers) { for (var i = 0; i < n; i++) { var sampler = GLctx['createSampler'](); if (!sampler) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); while(i < n) HEAP32[(((samplers)+(i++*4))>>2)]=0; return; } var id = GL.getNewId(GL.samplers); sampler.name = id; GL.samplers[id] = sampler; HEAP32[(((samplers)+(i*4))>>2)]=id; } } function _pthread_cleanup_push(routine, arg) { __ATEXIT__.push(function() { Module['dynCall_vi'](routine, arg) }) _pthread_cleanup_push.level = __ATEXIT__.length; } function _emscripten_glIsEnabled(x0) { return GLctx['isEnabled'](x0) } function _glUniform4iv(location, count, value) { location = GL.uniforms[location]; count *= 4; value = HEAP32.subarray((value)>>2,(value+count*4)>>2); GLctx.uniform4iv(location, value); } function _glClearStencil(x0) { GLctx['clearStencil'](x0) } function _JS_Sound_SetPosition(channelInstance, x, y, z) { if (WEBAudio.audioWebEnabled == 0) return; WEBAudio.audioInstances[channelInstance].panner.setPosition(x, y, z); } function _emscripten_glClearDepthf(x0) { GLctx['clearDepth'](x0) } function _emscripten_glVertexAttrib4f(x0, x1, x2, x3, x4) { GLctx['vertexAttrib4f'](x0, x1, x2, x3, x4) } function ___cxa_rethrow() { var ptr = EXCEPTIONS.caught.pop(); if (!EXCEPTIONS.infos[ptr].rethrown) { // Only pop if the corresponding push was through rethrow_primary_exception EXCEPTIONS.caught.push(ptr) EXCEPTIONS.infos[ptr].rethrown = true; } EXCEPTIONS.last = ptr; throw ptr; } function _emscripten_glClear(x0) { GLctx['clear'](x0) } function _emscripten_get_now() { abort() } function _emscripten_get_now_is_monotonic() { // return whether emscripten_get_now is guaranteed monotonic; the Date.now // implementation is not :( return ENVIRONMENT_IS_NODE || (typeof dateNow !== 'undefined') || ((ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && self['performance'] && self['performance']['now']); }function _clock_gettime(clk_id, tp) { // int clock_gettime(clockid_t clk_id, struct timespec *tp); var now; if (clk_id === 0) { now = Date.now(); } else if (clk_id === 1 && _emscripten_get_now_is_monotonic()) { now = _emscripten_get_now(); } else { ___setErrNo(ERRNO_CODES.EINVAL); return -1; } HEAP32[((tp)>>2)]=(now/1000)|0; // seconds HEAP32[(((tp)+(4))>>2)]=((now % 1000)*1000*1000)|0; // nanoseconds return 0; } function _glDeleteRenderbuffers(n, renderbuffers) { for (var i = 0; i < n; i++) { var id = HEAP32[(((renderbuffers)+(i*4))>>2)]; var renderbuffer = GL.renderbuffers[id]; if (!renderbuffer) continue; // GL spec: "glDeleteRenderbuffers silently ignores 0s and names that do not correspond to existing renderbuffer objects". GLctx.deleteRenderbuffer(renderbuffer); renderbuffer.name = 0; GL.renderbuffers[id] = null; } } function _glGetProgramiv(program, pname, p) { if (!p) { // GLES2 specification does not specify how to behave if p is a null pointer. Since calling this function does not make sense // if p == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } if (program >= GL.counter) { GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } var ptable = GL.programInfos[program]; if (!ptable) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); return; } if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH var log = GLctx.getProgramInfoLog(GL.programs[program]); if (log === null) log = '(unknown error)'; HEAP32[((p)>>2)]=log.length + 1; } else if (pname == 0x8B87 /* GL_ACTIVE_UNIFORM_MAX_LENGTH */) { HEAP32[((p)>>2)]=ptable.maxUniformLength; } else if (pname == 0x8B8A /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */) { if (ptable.maxAttributeLength == -1) { var program = GL.programs[program]; var numAttribs = GLctx.getProgramParameter(program, GLctx.ACTIVE_ATTRIBUTES); ptable.maxAttributeLength = 0; // Spec says if there are no active attribs, 0 must be returned. for (var i = 0; i < numAttribs; ++i) { var activeAttrib = GLctx.getActiveAttrib(program, i); ptable.maxAttributeLength = Math.max(ptable.maxAttributeLength, activeAttrib.name.length+1); } } HEAP32[((p)>>2)]=ptable.maxAttributeLength; } else if (pname == 0x8A35 /* GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */) { if (ptable.maxUniformBlockNameLength == -1) { var program = GL.programs[program]; var numBlocks = GLctx.getProgramParameter(program, GLctx.ACTIVE_UNIFORM_BLOCKS); ptable.maxUniformBlockNameLength = 0; for (var i = 0; i < numBlocks; ++i) { var activeBlockName = GLctx.getActiveUniformBlockName(program, i); ptable.maxUniformBlockNameLength = Math.max(ptable.maxUniformBlockNameLength, activeBlockName.length+1); } } HEAP32[((p)>>2)]=ptable.maxUniformBlockNameLength; } else { HEAP32[((p)>>2)]=GLctx.getProgramParameter(GL.programs[program], pname); } } function _glVertexAttribPointer(index, size, type, normalized, stride, ptr) { GLctx.vertexAttribPointer(index, size, type, !!normalized, stride, ptr); } function _pthread_cond_signal() { return 0; } function _glFramebufferTextureLayer(target, attachment, texture, level, layer) { GLctx.framebufferTextureLayer(target, attachment, GL.textures[texture], level, layer); } function _emscripten_glGetAttachedShaders(program, maxCount, count, shaders) { var result = GLctx.getAttachedShaders(GL.programs[program]); var len = result.length; if (len > maxCount) { len = maxCount; } HEAP32[((count)>>2)]=len; for (var i = 0; i < len; ++i) { var id = GL.shaders.indexOf(result[i]); HEAP32[(((shaders)+(i*4))>>2)]=id; } } function _flock(fd, operation) { // int flock(int fd, int operation); // Pretend to succeed return 0; } function _emscripten_glFrontFace(x0) { GLctx['frontFace'](x0) } function _emscripten_glActiveTexture(x0) { GLctx['activeTexture'](x0) } function _glTexStorage2D(x0, x1, x2, x3, x4) { GLctx['texStorage2D'](x0, x1, x2, x3, x4) } function _emscripten_glGetInfoLogARB() { Module['printErr']('missing function: emscripten_glGetInfoLogARB'); abort(-1); } function _pthread_key_delete(key) { if (key in PTHREAD_SPECIFIC) { delete PTHREAD_SPECIFIC[key]; return 0; } return ERRNO_CODES.EINVAL; } function _glGenQueries(n, ids) { for (var i = 0; i < n; i++) { var query = GLctx['createQuery'](); if (!query) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); while(i < n) HEAP32[(((ids)+(i++*4))>>2)]=0; return; } var id = GL.getNewId(GL.queries); query.name = id; GL.queries[id] = query; HEAP32[(((ids)+(i*4))>>2)]=id; } } var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function () { Browser.mainLoop.scheduler = null; Browser.mainLoop.currentlyRunningMainloop++; // Incrementing this signals the previous main loop that it's now become old, and it must return. },resume:function () { Browser.mainLoop.currentlyRunningMainloop++; var timingMode = Browser.mainLoop.timingMode; var timingValue = Browser.mainLoop.timingValue; var func = Browser.mainLoop.func; Browser.mainLoop.func = null; _emscripten_set_main_loop(func, 0, false, Browser.mainLoop.arg, true /* do not set timing and call scheduler, we will do it on the next lines */); _emscripten_set_main_loop_timing(timingMode, timingValue); Browser.mainLoop.scheduler(); },updateStatus:function () { if (Module['setStatus']) { var message = Module['statusMessage'] || 'Please wait...'; var remaining = Browser.mainLoop.remainingBlockers; var expected = Browser.mainLoop.expectedBlockers; if (remaining) { if (remaining < expected) { Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')'); } else { Module['setStatus'](message); } } else { Module['setStatus'](''); } } },runIter:function (func) { if (ABORT) return; if (Module['preMainLoop']) { var preRet = Module['preMainLoop'](); if (preRet === false) { return; // |return false| skips a frame } } try { func(); } catch (e) { if (e instanceof ExitStatus) { return; } else { if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]); throw e; } } if (Module['postMainLoop']) Module['postMainLoop'](); }},isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () { if (!Module["preloadPlugins"]) Module["preloadPlugins"] = []; // needs to exist even in workers if (Browser.initted) return; Browser.initted = true; try { new Blob(); Browser.hasBlobConstructor = true; } catch(e) { Browser.hasBlobConstructor = false; console.log("warning: no blob constructor, cannot create blobs with mimetypes"); } Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null)); Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : undefined; if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') { console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."); Module.noImageDecoding = true; } // Support for plugins that can process preloaded files. You can add more of these to // your app by creating and appending to Module.preloadPlugins. // // Each plugin is asked if it can handle a file based on the file's name. If it can, // it is given the file's raw data. When it is done, it calls a callback with the file's // (possibly modified) data. For example, a plugin might decompress a file, or it // might create some side data structure for use later (like an Image element, etc.). var imagePlugin = {}; imagePlugin['canHandle'] = function imagePlugin_canHandle(name) { return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name); }; imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) { var b = null; if (Browser.hasBlobConstructor) { try { b = new Blob([byteArray], { type: Browser.getMimetype(name) }); if (b.size !== byteArray.length) { // Safari bug #118630 // Safari's Blob can only take an ArrayBuffer b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) }); } } catch(e) { Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder'); } } if (!b) { var bb = new Browser.BlobBuilder(); bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range b = bb.getBlob(); } var url = Browser.URLObject.createObjectURL(b); var img = new Image(); img.onload = function img_onload() { assert(img.complete, 'Image ' + name + ' could not be decoded'); var canvas = document.createElement('canvas'); canvas.width = img.width; canvas.height = img.height; var ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0); Module["preloadedImages"][name] = canvas; Browser.URLObject.revokeObjectURL(url); if (onload) onload(byteArray); }; img.onerror = function img_onerror(event) { console.log('Image ' + url + ' could not be decoded'); if (onerror) onerror(); }; img.src = url; }; Module['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; Module["preloadedAudios"][name] = audio; if (onload) onload(byteArray); } function fail() { if (done) return; done = true; Module["preloadedAudios"][name] = new Audio(); // empty shim if (onerror) onerror(); } if (Browser.hasBlobConstructor) { try { var b = new Blob([byteArray], { type: Browser.getMimetype(name) }); } catch(e) { return fail(); } var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this! var audio = new Audio(); audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926 audio.onerror = function audio_onerror(event) { if (done) return; console.log('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 < data.length; i++) { leftchar = (leftchar << 8) | data[i]; leftbits += 8; while (leftbits >= 6) { var curr = (leftchar >> (leftbits-6)) & 0x3f; leftbits -= 6; ret += BASE[curr]; } } if (leftbits == 2) { ret += BASE[(leftchar&3) << 4]; ret += PAD + PAD; } else if (leftbits == 4) { ret += BASE[(leftchar&0xf) << 2]; ret += PAD; } return ret; } audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray); finish(audio); // we don't wait for confirmation this worked - but it's worth trying }; audio.src = url; // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror Browser.safeSetTimeout(function() { finish(audio); // try to use it even though it is not necessarily ready to play }, 10000); } else { return fail(); } }; Module['preloadPlugins'].push(audioPlugin); // Canvas event setup var canvas = Module['canvas']; function pointerLockChange() { Browser.pointerLock = document['pointerLockElement'] === canvas || document['mozPointerLockElement'] === canvas || document['webkitPointerLockElement'] === canvas || document['msPointerLockElement'] === canvas; } if (canvas) { // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module // Module['forcedAspectRatio'] = 4 / 3; canvas.requestPointerLock = canvas['requestPointerLock'] || canvas['mozRequestPointerLock'] || canvas['webkitRequestPointerLock'] || canvas['msRequestPointerLock'] || function(){}; canvas.exitPointerLock = document['exitPointerLock'] || document['mozExitPointerLock'] || document['webkitExitPointerLock'] || document['msExitPointerLock'] || function(){}; // no-op if function does not exist 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", function(ev) { if (!Browser.pointerLock && canvas.requestPointerLock) { canvas.requestPointerLock(); ev.preventDefault(); } }, false); } } },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) { if (useWebGL && Module.ctx && canvas == Module.canvas) return Module.ctx; // no need to recreate GL context if it's already been created for this canvas. var ctx; var contextHandle; if (useWebGL) { // For GLES2/desktop GL compatibility, adjust a few defaults to be different to WebGL defaults, so that they align better with the desktop defaults. var contextAttributes = { antialias: false, alpha: false }; if (webGLContextAttributes) { for (var attribute in webGLContextAttributes) { contextAttributes[attribute] = webGLContextAttributes[attribute]; } } contextHandle = GL.createContext(canvas, contextAttributes); if (contextHandle) { ctx = GL.getContext(contextHandle).GLctx; } } else { ctx = canvas.getContext('2d'); } if (!ctx) return null; if (setInModule) { if (!useWebGL) assert(typeof GLctx === 'undefined', 'cannot set in module if GLctx is used, but we are a non-GL context that would replace it'); Module.ctx = ctx; if (useWebGL) GL.makeContextCurrent(contextHandle); Module.useWebGL = useWebGL; Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() }); Browser.init(); } return ctx; },destroyContext:function (canvas, useWebGL, setInModule) {},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function (lockPointer, resizeCanvas, vrDevice) { Browser.lockPointer = lockPointer; Browser.resizeCanvas = resizeCanvas; Browser.vrDevice = vrDevice; if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true; if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false; if (typeof Browser.vrDevice === 'undefined') Browser.vrDevice = null; 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 = document['exitFullscreen'] || document['cancelFullScreen'] || document['mozCancelFullScreen'] || document['msExitFullscreen'] || document['webkitCancelFullScreen'] || function() {}; canvas.exitFullscreen = canvas.exitFullscreen.bind(document); if (Browser.lockPointer) canvas.requestPointerLock(); Browser.isFullscreen = true; if (Browser.resizeCanvas) Browser.setFullscreenCanvasSize(); } else { // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen canvasContainer.parentNode.insertBefore(canvas, canvasContainer); canvasContainer.parentNode.removeChild(canvasContainer); if (Browser.resizeCanvas) Browser.setWindowedCanvasSize(); } if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullscreen); if (Module['onFullscreen']) Module['onFullscreen'](Browser.isFullscreen); Browser.updateCanvasDimensions(canvas); } 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); } // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root var canvasContainer = document.createElement("div"); canvas.parentNode.insertBefore(canvasContainer, canvas); canvasContainer.appendChild(canvas); // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size) canvasContainer.requestFullscreen = canvasContainer['requestFullscreen'] || canvasContainer['mozRequestFullScreen'] || canvasContainer['msRequestFullscreen'] || (canvasContainer['webkitRequestFullscreen'] ? function() { canvasContainer['webkitRequestFullscreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null) || (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null); if (vrDevice) { canvasContainer.requestFullscreen({ vrDisplay: vrDevice }); } else { canvasContainer.requestFullscreen(); } },requestFullScreen:function (lockPointer, resizeCanvas, vrDevice) { Module.printErr('Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead.'); Browser.requestFullScreen = function(lockPointer, resizeCanvas, vrDevice) { return Browser.requestFullscreen(lockPointer, resizeCanvas, vrDevice); } return Browser.requestFullscreen(lockPointer, resizeCanvas, vrDevice); },nextRAF:0,fakeRequestAnimationFrame:function (func) { // try to keep 60fps between calls to here var now = Date.now(); if (Browser.nextRAF === 0) { Browser.nextRAF = now + 1000/60; } else { while (now + 2 >= Browser.nextRAF) { // fudge a little, to avoid timer jitter causing us to do lots of delay:0 Browser.nextRAF += 1000/60; } } var delay = Math.max(Browser.nextRAF - now, 0); setTimeout(func, delay); },requestAnimationFrame:function requestAnimationFrame(func) { if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js) Browser.fakeRequestAnimationFrame(func); } else { if (!window.requestAnimationFrame) { window.requestAnimationFrame = window['requestAnimationFrame'] || window['mozRequestAnimationFrame'] || window['webkitRequestAnimationFrame'] || window['msRequestAnimationFrame'] || window['oRequestAnimationFrame'] || Browser.fakeRequestAnimationFrame; } window.requestAnimationFrame(func); } },safeCallback:function (func) { return function() { if (!ABORT) return func.apply(null, arguments); }; },allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function () { Browser.allowAsyncCallbacks = false; },resumeAsyncCallbacks:function () { // marks future callbacks as ok to execute, and synchronously runs any remaining ones right now Browser.allowAsyncCallbacks = true; if (Browser.queuedAsyncCallbacks.length > 0) { var callbacks = Browser.queuedAsyncCallbacks; Browser.queuedAsyncCallbacks = []; callbacks.forEach(function(func) { func(); }); } },safeRequestAnimationFrame:function (func) { return Browser.requestAnimationFrame(function() { if (ABORT) return; if (Browser.allowAsyncCallbacks) { func(); } else { Browser.queuedAsyncCallbacks.push(func); } }); },safeSetTimeout:function (func, timeout) { Module['noExitRuntime'] = true; return setTimeout(function() { if (ABORT) return; if (Browser.allowAsyncCallbacks) { func(); } else { Browser.queuedAsyncCallbacks.push(func); } }, timeout); },safeSetInterval:function (func, timeout) { Module['noExitRuntime'] = true; return setInterval(function() { if (ABORT) return; if (Browser.allowAsyncCallbacks) { func(); } // drop it on the floor otherwise, next interval will kick in }, timeout); },getMimetype:function (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:function (func) { if(!window.getUserMedia) { window.getUserMedia = navigator['getUserMedia'] || navigator['mozGetUserMedia']; } window.getUserMedia(func); },getMovementX:function (event) { return event['movementX'] || event['mozMovementX'] || event['webkitMovementX'] || 0; },getMovementY:function (event) { return event['movementY'] || event['mozMovementY'] || event['webkitMovementY'] || 0; },getMouseWheelDelta:function (event) { var delta = 0; switch (event.type) { case 'DOMMouseScroll': delta = event.detail; break; case 'mousewheel': delta = event.wheelDelta; break; case 'wheel': delta = event['deltaY']; break; default: throw 'unrecognized mouse wheel event: ' + event.type; } return delta; },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup if (Browser.pointerLock) { // When the pointer is locked, calculate the coordinates // based on the movement of the mouse. // Workaround for Firefox bug 764498 if (event.type != 'mousemove' && ('mozMovementX' in event)) { Browser.mouseMovementX = Browser.mouseMovementY = 0; } else { Browser.mouseMovementX = Browser.getMovementX(event); Browser.mouseMovementY = Browser.getMovementY(event); } // check if SDL is available if (typeof SDL != "undefined") { Browser.mouseX = SDL.mouseX + Browser.mouseMovementX; Browser.mouseY = SDL.mouseY + Browser.mouseMovementY; } else { // just add the mouse delta to the current absolut mouse position // FIXME: ideally this should be clamped against the canvas size and zero Browser.mouseX += Browser.mouseMovementX; Browser.mouseY += Browser.mouseMovementY; } } else { // Otherwise, calculate the movement based on the changes // in the coordinates. var rect = Module["canvas"].getBoundingClientRect(); var cw = Module["canvas"].width; var ch = Module["canvas"].height; // Neither .scrollX or .pageXOffset are defined in a spec, but // we prefer .scrollX because it is currently in a spec draft. // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/) var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset); var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset); if (event.type === 'touchstart' || event.type === 'touchend' || event.type === 'touchmove') { var touch = event.touch; if (touch === undefined) { return; // the "touch" property is only defined in SDL } var adjustedX = touch.pageX - (scrollX + rect.left); var adjustedY = touch.pageY - (scrollY + rect.top); adjustedX = adjustedX * (cw / rect.width); adjustedY = adjustedY * (ch / rect.height); var coords = { x: adjustedX, y: adjustedY }; 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]; if (!last) last = coords; Browser.lastTouches[touch.identifier] = last; Browser.touches[touch.identifier] = coords; } return; } var x = event.pageX - (scrollX + rect.left); var y = event.pageY - (scrollY + rect.top); // the canvas might be CSS-scaled compared to its backbuffer; // SDL-using content will want mouse coordinates in terms // of backbuffer units. x = x * (cw / rect.width); y = y * (ch / rect.height); Browser.mouseMovementX = x - Browser.mouseX; Browser.mouseMovementY = y - Browser.mouseY; Browser.mouseX = x; Browser.mouseY = y; } },asyncLoad:function (url, onload, onerror, noRunDep) { var dep = !noRunDep ? getUniqueRunDependency('al ' + url) : ''; Module['readAsync'](url, function(arrayBuffer) { assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); onload(new Uint8Array(arrayBuffer)); if (dep) removeRunDependency(dep); }, function(event) { if (onerror) { onerror(); } else { throw 'Loading data file "' + url + '" failed.'; } }); if (dep) addRunDependency(dep); },resizeListeners:[],updateResizeListeners:function () { var canvas = Module['canvas']; Browser.resizeListeners.forEach(function(listener) { listener(canvas.width, canvas.height); }); },setCanvasSize:function (width, height, noUpdates) { var canvas = Module['canvas']; Browser.updateCanvasDimensions(canvas, width, height); if (!noUpdates) Browser.updateResizeListeners(); },windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function () { // check if SDL is available if (typeof SDL != "undefined") { var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]; flags = flags | 0x00800000; // set SDL_FULLSCREEN flag HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags } Browser.updateResizeListeners(); },setWindowedCanvasSize:function () { // check if SDL is available if (typeof SDL != "undefined") { var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]; flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags } Browser.updateResizeListeners(); },updateCanvasDimensions:function (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 < Module['forcedAspectRatio']) { w = Math.round(h * Module['forcedAspectRatio']); } else { h = Math.round(w / Module['forcedAspectRatio']); } } if (((document['fullscreenElement'] || document['mozFullScreenElement'] || document['msFullscreenElement'] || document['webkitFullscreenElement'] || document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) { var factor = Math.min(screen.width / w, screen.height / h); w = Math.round(w * factor); h = Math.round(h * factor); } if (Browser.resizeCanvas) { if (canvas.width != w) canvas.width = w; if (canvas.height != h) canvas.height = h; if (typeof canvas.style != 'undefined') { canvas.style.removeProperty( "width"); canvas.style.removeProperty("height"); } } else { if (canvas.width != wNative) canvas.width = wNative; if (canvas.height != hNative) canvas.height = hNative; if (typeof canvas.style != 'undefined') { if (w != wNative || h != hNative) { canvas.style.setProperty( "width", w + "px", "important"); canvas.style.setProperty("height", h + "px", "important"); } else { canvas.style.removeProperty( "width"); canvas.style.removeProperty("height"); } } } },wgetRequests:{},nextWgetRequestHandle:0,getNextWgetRequestHandle:function () { var handle = Browser.nextWgetRequestHandle; Browser.nextWgetRequestHandle++; return handle; }};function _emscripten_set_main_loop_timing(mode, value) { Browser.mainLoop.timingMode = mode; Browser.mainLoop.timingValue = value; if (!Browser.mainLoop.func) { return 1; // Return non-zero on failure, can't set timing mode when there is no main loop. } if (mode == 0 /*EM_TIMING_SETTIMEOUT*/) { Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setTimeout() { var timeUntilNextTick = Math.max(0, Browser.mainLoop.tickStartTime + value - _emscripten_get_now())|0; setTimeout(Browser.mainLoop.runner, timeUntilNextTick); // doing this each time means that on exception, we stop }; Browser.mainLoop.method = 'timeout'; } else if (mode == 1 /*EM_TIMING_RAF*/) { Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_rAF() { Browser.requestAnimationFrame(Browser.mainLoop.runner); }; Browser.mainLoop.method = 'rAF'; } else if (mode == 2 /*EM_TIMING_SETIMMEDIATE*/) { if (!window['setImmediate']) { // Emulate setImmediate. (note: not a complete polyfill, we don't emulate clearImmediate() to keep code size to minimum, since not needed) var setImmediates = []; var emscriptenMainLoopMessageId = 'setimmediate'; function Browser_setImmediate_messageHandler(event) { if (event.source === window && event.data === emscriptenMainLoopMessageId) { event.stopPropagation(); setImmediates.shift()(); } } window.addEventListener("message", Browser_setImmediate_messageHandler, true); window['setImmediate'] = function Browser_emulated_setImmediate(func) { setImmediates.push(func); if (ENVIRONMENT_IS_WORKER) { if (Module['setImmediates'] === undefined) Module['setImmediates'] = []; Module['setImmediates'].push(func); window.postMessage({target: emscriptenMainLoopMessageId}); // In --proxy-to-worker, route the message via proxyClient.js } else window.postMessage(emscriptenMainLoopMessageId, "*"); // On the main thread, can just send the message to itself. } } Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setImmediate() { window['setImmediate'](Browser.mainLoop.runner); }; Browser.mainLoop.method = 'immediate'; } return 0; }function _emscripten_set_main_loop(func, fps, simulateInfiniteLoop, arg, noSetTiming) { Module['noExitRuntime'] = true; assert(!Browser.mainLoop.func, 'emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.'); Browser.mainLoop.func = func; Browser.mainLoop.arg = arg; var browserIterationFunc; if (typeof arg !== 'undefined') { browserIterationFunc = function() { Module['dynCall_vi'](func, arg); }; } else { browserIterationFunc = function() { Module['dynCall_v'](func); }; } var thisMainLoopId = Browser.mainLoop.currentlyRunningMainloop; Browser.mainLoop.runner = function Browser_mainLoop_runner() { if (ABORT) return; if (Browser.mainLoop.queue.length > 0) { var start = Date.now(); var blocker = Browser.mainLoop.queue.shift(); blocker.func(blocker.arg); if (Browser.mainLoop.remainingBlockers) { var remaining = Browser.mainLoop.remainingBlockers; var next = remaining%1 == 0 ? remaining-1 : Math.floor(remaining); if (blocker.counted) { Browser.mainLoop.remainingBlockers = next; } else { // not counted, but move the progress along a tiny bit next = next + 0.5; // do not steal all the next one's progress Browser.mainLoop.remainingBlockers = (8*remaining + next)/9; } } console.log('main loop blocker "' + blocker.name + '" took ' + (Date.now() - start) + ' ms'); //, left: ' + Browser.mainLoop.remainingBlockers); Browser.mainLoop.updateStatus(); // catches pause/resume main loop from blocker execution if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return; setTimeout(Browser.mainLoop.runner, 0); return; } // catch pauses from non-main loop sources if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return; // Implement very basic swap interval control Browser.mainLoop.currentFrameNumber = Browser.mainLoop.currentFrameNumber + 1 | 0; if (Browser.mainLoop.timingMode == 1/*EM_TIMING_RAF*/ && Browser.mainLoop.timingValue > 1 && Browser.mainLoop.currentFrameNumber % Browser.mainLoop.timingValue != 0) { // Not the scheduled time to render this frame - skip. Browser.mainLoop.scheduler(); return; } else if (Browser.mainLoop.timingMode == 0/*EM_TIMING_SETTIMEOUT*/) { Browser.mainLoop.tickStartTime = _emscripten_get_now(); } // Signal GL rendering layer that processing of a new frame is about to start. This helps it optimize // VBO double-buffering and reduce GPU stalls. if (Browser.mainLoop.method === 'timeout' && Module.ctx) { Module.printErr('Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!'); Browser.mainLoop.method = ''; // just warn once per call to set main loop } Browser.mainLoop.runIter(browserIterationFunc); // catch pauses from the main loop itself if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return; // Queue new audio data. This is important to be right after the main loop invocation, so that we will immediately be able // to queue the newest produced audio samples. // TODO: Consider adding pre- and post- rAF callbacks so that GL.newRenderingFrameStarted() and SDL.audio.queueNewAudioData() // do not need to be hardcoded into this function, but can be more generic. if (typeof SDL === 'object' && SDL.audio && SDL.audio.queueNewAudioData) SDL.audio.queueNewAudioData(); Browser.mainLoop.scheduler(); } if (!noSetTiming) { if (fps && fps > 0) _emscripten_set_main_loop_timing(0/*EM_TIMING_SETTIMEOUT*/, 1000.0 / fps); else _emscripten_set_main_loop_timing(1/*EM_TIMING_RAF*/, 1); // Do rAF by rendering each frame (no decimating) Browser.mainLoop.scheduler(); } if (simulateInfiniteLoop) { throw 'SimulateInfiniteLoop'; } } function _emscripten_glRenderbufferStorage(x0, x1, x2, x3) { GLctx['renderbufferStorage'](x0, x1, x2, x3) } function _glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data) { GLctx['texSubImage3D'](target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, HEAPU8.subarray(data)); } function ___syscall15(which, varargs) {SYSCALLS.varargs = varargs; try { // chmod var path = SYSCALLS.getStr(), mode = SYSCALLS.get(); FS.chmod(path, mode); return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _glDeleteSamplers(n, samplers) { for (var i = 0; i < n; i++) { var id = HEAP32[(((samplers)+(i*4))>>2)]; var sampler = GL.samplers[id]; if (!sampler) continue; GLctx['deleteSampler'](sampler); sampler.name = 0; GL.samplers[id] = null; } } function ___syscall10(which, varargs) {SYSCALLS.varargs = varargs; try { // unlink var path = SYSCALLS.getStr(); FS.unlink(path); return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _glCopyTexImage2D(x0, x1, x2, x3, x4, x5, x6, x7) { GLctx['copyTexImage2D'](x0, x1, x2, x3, x4, x5, x6, x7) } function _glBlitFramebuffer(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) { GLctx['blitFramebuffer'](x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) } function _llvm_trap() { abort('trap!'); } function _emscripten_glIsProgram(program) { var program = GL.programs[program]; if (!program) return 0; return GLctx.isProgram(program); } function __ZSt18uncaught_exceptionv() { // std::uncaught_exception() return !!__ZSt18uncaught_exceptionv.uncaught_exception; }function ___cxa_begin_catch(ptr) { var info = EXCEPTIONS.infos[ptr]; if (info && !info.caught) { info.caught = true; __ZSt18uncaught_exceptionv.uncaught_exception--; } if (info) info.rethrown = false; EXCEPTIONS.caught.push(ptr); EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr)); return ptr; } function _JS_WebRequest_Create(url, method) { var http = new XMLHttpRequest(); var _url = Pointer_stringify(url); var _method = Pointer_stringify(method); http.open(_method, _url, true); http.responseType = 'arraybuffer'; wr.requestInstances[wr.nextRequestId] = http; return wr.nextRequestId++; } function _JS_Sound_SetLoopPoints(channelInstance, loopStart, loopEnd) { if (WEBAudio.audioWebEnabled == 0) return; var channel = WEBAudio.audioInstances[channelInstance]; channel.source.loopStart = loopStart; channel.source.loopEnd = loopEnd; } function _emscripten_glGetShaderiv(shader, pname, p) { if (!p) { // GLES2 specification does not specify how to behave if p is a null pointer. Since calling this function does not make sense // if p == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH var log = GLctx.getShaderInfoLog(GL.shaders[shader]); if (log === null) log = '(unknown error)'; HEAP32[((p)>>2)]=log.length + 1; } else { HEAP32[((p)>>2)]=GLctx.getShaderParameter(GL.shaders[shader], pname); } } function _emscripten_glUniformMatrix3fv(location, count, transpose, value) { location = GL.uniforms[location]; var view; if (9*count <= GL.MINI_TEMP_BUFFER_SIZE) { // avoid allocation when uploading few enough uniforms view = GL.miniTempBufferViews[9*count-1]; for (var i = 0; i < 9*count; i += 9) { view[i] = HEAPF32[(((value)+(4*i))>>2)]; view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)]; view[i+4] = HEAPF32[(((value)+(4*i+16))>>2)]; view[i+5] = HEAPF32[(((value)+(4*i+20))>>2)]; view[i+6] = HEAPF32[(((value)+(4*i+24))>>2)]; view[i+7] = HEAPF32[(((value)+(4*i+28))>>2)]; view[i+8] = HEAPF32[(((value)+(4*i+32))>>2)]; } } else { view = HEAPF32.subarray((value)>>2,(value+count*36)>>2); } GLctx.uniformMatrix3fv(location, !!transpose, view); } var __currentFullscreenStrategy={};function _emscripten_exit_fullscreen() { if (typeof JSEvents.fullscreenEnabled() === 'undefined') return -1; // Make sure no queued up calls will fire after this. JSEvents.removeDeferredCalls(JSEvents.requestFullscreen); if (document.exitFullscreen) { document.exitFullscreen(); } else if (document.msExitFullscreen) { document.msExitFullscreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } else { return -1; } if (__currentFullscreenStrategy.canvasResizedCallback) { Module['dynCall_iiii'](__currentFullscreenStrategy.canvasResizedCallback, 37, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData); } return 0; } function _glUniform4uiv(location, count, value) { location = GL.uniforms[location]; count *= 4; value = HEAPU32.subarray((value)>>2,(value+count*4)>>2); GLctx.uniform4uiv(location, value); } function _emscripten_glGenFramebuffers(n, ids) { for (var i = 0; i < n; ++i) { var framebuffer = GLctx.createFramebuffer(); if (!framebuffer) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); while(i < n) HEAP32[(((ids)+(i++*4))>>2)]=0; return; } var id = GL.getNewId(GL.framebuffers); framebuffer.name = id; GL.framebuffers[id] = framebuffer; HEAP32[(((ids)+(i*4))>>2)]=id; } } function _JS_Sound_Play(bufferInstance, channelInstance, offset, delay) { // stop sound which is playing in the channel currently. _JS_Sound_Stop (channelInstance, 0); if (WEBAudio.audioWebEnabled == 0) return; var sound = WEBAudio.audioInstances[bufferInstance]; var channel = WEBAudio.audioInstances[channelInstance]; if (sound.buffer) { try { channel.playBuffer (WEBAudio.audioContext.currentTime + delay, sound.buffer, offset); } catch(e) { // Need to catch exception, otherwise execution will stop on Safari if audio output is missing/broken console.error("playBuffer error. Exception: " + e); } } else console.log ("Trying to play sound which is not loaded.") } function _glGetShaderiv(shader, pname, p) { if (!p) { // GLES2 specification does not specify how to behave if p is a null pointer. Since calling this function does not make sense // if p == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH var log = GLctx.getShaderInfoLog(GL.shaders[shader]); if (log === null) log = '(unknown error)'; HEAP32[((p)>>2)]=log.length + 1; } else { HEAP32[((p)>>2)]=GLctx.getShaderParameter(GL.shaders[shader], pname); } } function _emscripten_glBlendEquationSeparate(x0, x1) { GLctx['blendEquationSeparate'](x0, x1) } function _emscripten_glDrawElements(mode, count, type, indices) { GLctx.drawElements(mode, count, type, indices); }function _emscripten_glDrawRangeElements(mode, start, end, count, type, indices) { // TODO: This should be a trivial pass-though function, but due to https://bugzilla.mozilla.org/show_bug.cgi?id=1202427, // we work around by ignoring the range. _emscripten_glDrawElements(mode, count, type, indices); GLctx.drawElements(mode, count, type, indices); } function _glInvalidateFramebuffer(target, numAttachments, attachments) { var list = []; for (var i = 0; i < numAttachments; i++) list.push(HEAP32[(((attachments)+(i*4))>>2)]); GLctx['invalidateFramebuffer'](target, list); } function _emscripten_glGenTextures(n, textures) { for (var i = 0; i < n; i++) { var texture = GLctx.createTexture(); if (!texture) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); // GLES + EGL specs don't specify what should happen here, so best to issue an error and create IDs with 0. while(i < n) HEAP32[(((textures)+(i++*4))>>2)]=0; return; } var id = GL.getNewId(GL.textures); texture.name = id; GL.textures[id] = texture; HEAP32[(((textures)+(i*4))>>2)]=id; } } function _emscripten_glReleaseShaderCompiler() { // NOP (as allowed by GLES 2.0 spec) } function _glCopyTexSubImage2D(x0, x1, x2, x3, x4, x5, x6, x7) { GLctx['copyTexSubImage2D'](x0, x1, x2, x3, x4, x5, x6, x7) } function _JS_Sound_ReleaseInstance(instance) { WEBAudio.audioInstances[instance] = null; } function _openWindow(link) { var url = Pointer_stringify(link); document.onmouseup = function() { window.open(url); document.onmouseup = null; } } function _emscripten_glDrawArrays(mode, first, count) { GLctx.drawArrays(mode, first, count); } function _emscripten_glClearDepth(x0) { GLctx['clearDepth'](x0) } var fs={numPendingSync:0,syncIntervalID:0,syncInProgress:false,sync:function (onlyPendingSync) { if (onlyPendingSync) { if (fs.numPendingSync == 0) return; } else if (fs.syncInProgress) { // this is to avoid indexedDB memory leak when FS.syncfs is executed before the previous one completed. fs.numPendingSync++; return; } fs.syncInProgress = true; FS.syncfs(false, (function(err) { fs.syncInProgress = false; })); fs.numPendingSync = 0; }};function _JS_FileSystem_SetSyncInterval(ms) { if (!Module.indexedDB) return; fs.syncIntervalID = window.setInterval(function(){ fs.sync(true); }, ms); } function _emscripten_glGetUniformLocation(program, name) { name = Pointer_stringify(name); var arrayOffset = 0; // If user passed an array accessor "[index]", parse the array index off the accessor. if (name.indexOf(']', name.length-1) !== -1) { var ls = name.lastIndexOf('['); var arrayIndex = name.slice(ls+1, -1); if (arrayIndex.length > 0) { arrayOffset = parseInt(arrayIndex); if (arrayOffset < 0) { return -1; } } name = name.slice(0, ls); } var ptable = GL.programInfos[program]; if (!ptable) { return -1; } var utable = ptable.uniforms; var uniformInfo = utable[name]; // returns pair [ dimension_of_uniform_array, uniform_location ] if (uniformInfo && arrayOffset < uniformInfo[0]) { // Check if user asked for an out-of-bounds element, i.e. for 'vec4 colors[3];' user could ask for 'colors[10]' which should return -1. return uniformInfo[1]+arrayOffset; } else { return -1; } } function _glUniform3fv(location, count, value) { location = GL.uniforms[location]; var view; if (3*count <= GL.MINI_TEMP_BUFFER_SIZE) { // avoid allocation when uploading few enough uniforms view = GL.miniTempBufferViews[3*count-1]; for (var i = 0; i < 3*count; i += 3) { view[i] = HEAPF32[(((value)+(4*i))>>2)]; view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; } } else { view = HEAPF32.subarray((value)>>2,(value+count*12)>>2); } GLctx.uniform3fv(location, view); } function _emscripten_glVertexAttrib4fv(index, v) { var view = GL.miniTempBufferViews[3]; view[0] = HEAPF32[v >> 2]; view[1] = HEAPF32[v + 4 >> 2]; view[2] = HEAPF32[v + 8 >> 2]; view[3] = HEAPF32[v + 12 >> 2]; GLctx.vertexAttrib4fv(index, view); } function _emscripten_glScissor(x0, x1, x2, x3) { GLctx['scissor'](x0, x1, x2, x3) } function _JS_Sound_Set3D(channelInstance, threeD) { var channel = WEBAudio.audioInstances[channelInstance]; if (channel.threeD != threeD) { channel.threeD = threeD; channel.setupPanning(); } } function _JS_SystemInfo_GetDocumentURL(buffer, bufferSize) { if (buffer) stringToUTF8(document.URL, buffer, bufferSize); return lengthBytesUTF8(document.URL); } function _emscripten_glLinkProgram(program) { GLctx.linkProgram(GL.programs[program]); GL.programInfos[program] = null; // uniforms no longer keep the same names after linking GL.populateUniformTable(program); } function _JS_Sound_GetLength(bufferInstance) { if (WEBAudio.audioWebEnabled == 0) return 0; var sound = WEBAudio.audioInstances[bufferInstance]; // Fakemod assumes sample rate is 44100, though that's not necessarily the case, // depending on OS, if the audio file was not imported by our pipeline. // Therefore we need to recalculate the length based on the actual samplerate. var sampleRateRatio = 44100 / sound.buffer.sampleRate; return sound.buffer.length * sampleRateRatio; } function _JS_Sound_Create_Channel(callback, userData) { if (WEBAudio.audioWebEnabled == 0) return; var channel = { gain: WEBAudio.audioContext.createGain(), panner: WEBAudio.audioContext.createPanner(), threeD: false, playBuffer: function(delay, buffer, offset) { this.source.buffer = buffer; var chan = this; this.source.onended = function() { if (callback) Runtime.dynCall('vi', callback, [userData]); // recreate channel for future use. chan.setup(); }; this.source.start(delay, offset); }, setup: function() { this.source = WEBAudio.audioContext.createBufferSource(); this.setupPanning(); }, setupPanning: function() { if(this.threeD) { this.source.disconnect(); this.source.connect(this.panner); this.panner.connect(this.gain); } else { this.panner.disconnect(); this.source.connect(this.gain); } } }; channel.panner.rolloffFactor = 0; // We calculate rolloff ourselves. channel.gain.connect ( WEBAudio.audioContext.destination); channel.setup(); return WEBAudio.audioInstances.push(channel) - 1; } function _glDeleteSync(id) { if (!id) return; var sync = GL.syncs[id]; if (!sync) { // glDeleteSync signals an error when deleting a nonexisting object, unlike some other GL delete functions. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } GLctx.deleteSync(sync); sync.name = 0; GL.syncs[id] = null; } function ___cxa_find_matching_catch_4() { return ___cxa_find_matching_catch.apply(null, arguments); } function emscriptenWebGLGetVertexAttrib(index, pname, params, type) { if (!params) { // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense // if params == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } var data = GLctx.getVertexAttrib(index, pname); if (pname == 0x889F/*VERTEX_ATTRIB_ARRAY_BUFFER_BINDING*/) { HEAP32[((params)>>2)]=data["name"]; } else if (typeof data == 'number' || typeof data == 'boolean') { switch (type) { case 'Integer': HEAP32[((params)>>2)]=data; break; case 'Float': HEAPF32[((params)>>2)]=data; break; case 'FloatToInteger': HEAP32[((params)>>2)]=Math.fround(data); break; default: throw 'internal emscriptenWebGLGetVertexAttrib() error, bad type: ' + type; } } else { for (var i = 0; i < data.length; i++) { switch (type) { case 'Integer': HEAP32[(((params)+(i))>>2)]=data[i]; break; case 'Float': HEAPF32[(((params)+(i))>>2)]=data[i]; break; case 'FloatToInteger': HEAP32[(((params)+(i))>>2)]=Math.fround(data[i]); break; default: throw 'internal emscriptenWebGLGetVertexAttrib() error, bad type: ' + type; } } } }function _glGetVertexAttribiv(index, pname, params) { // N.B. This function may only be called if the vertex attribute was specified using the function glVertexAttrib*f(), // otherwise the results are undefined. (GLES3 spec 6.1.12) emscriptenWebGLGetVertexAttrib(index, pname, params, 'FloatToInteger'); } function ___cxa_find_matching_catch_2() { return ___cxa_find_matching_catch.apply(null, arguments); } function ___cxa_find_matching_catch_3() { return ___cxa_find_matching_catch.apply(null, arguments); } function _JS_FileSystem_Sync() { if (!Module.indexedDB) return; fs.sync(false); } function _emscripten_glEnable(x0) { GLctx['enable'](x0) } var _llvm_pow_f64=Math_pow; function _glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params) { if (!params) { // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense // if params == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } program = GL.programs[program]; switch(pname) { case 0x8A41: /* GL_UNIFORM_BLOCK_NAME_LENGTH */ var name = GLctx['getActiveUniformBlockName'](program, uniformBlockIndex); HEAP32[((params)>>2)]=name.length+1; return; default: var result = GLctx['getActiveUniformBlockParameter'](program, uniformBlockIndex, pname); if (!result) return; // If an error occurs, nothing will be written to params. if (typeof result == 'number') { HEAP32[((params)>>2)]=result; } else { for (var i = 0; i < result.length; i++) { HEAP32[(((params)+(i*4))>>2)]=result[i]; } } } } function _emscripten_glGetShaderSource(shader, bufSize, length, source) { var result = GLctx.getShaderSource(GL.shaders[shader]); if (!result) return; // If an error occurs, nothing will be written to length or source. if (bufSize > 0 && source) { var numBytesWrittenExclNull = stringToUTF8(result, source, bufSize); if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull; } else { if (length) HEAP32[((length)>>2)]=0; } } Module["_llvm_bswap_i32"] = _llvm_bswap_i32; function _JS_Sound_GetLoadState(bufferInstance) { if (WEBAudio.audioWebEnabled == 0) return 2; var sound = WEBAudio.audioInstances[bufferInstance]; if (sound.error) return 2; if (sound.buffer) return 0; return 1; } function _JS_Sound_SetPitch(channelInstance, v) { if (WEBAudio.audioWebEnabled == 0) return; WEBAudio.audioInstances[channelInstance].source.playbackRate.value = v; } function emscriptenWebGLGet(name_, p, type) { // Guard against user passing a null pointer. // Note that GLES2 spec does not say anything about how passing a null pointer should be treated. // Testing on desktop core GL 3, the application crashes on glGetIntegerv to a null pointer, but // better to report an error instead of doing anything random. if (!p) { GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } var ret = undefined; switch(name_) { // Handle a few trivial GLES values case 0x8DFA: // GL_SHADER_COMPILER ret = 1; break; case 0x8DF8: // GL_SHADER_BINARY_FORMATS if (type !== 'Integer' && type !== 'Integer64') { GL.recordError(0x0500); // GL_INVALID_ENUM } return; // Do not write anything to the out pointer, since no binary formats are supported. case 0x87FE: // GL_NUM_PROGRAM_BINARY_FORMATS case 0x8DF9: // GL_NUM_SHADER_BINARY_FORMATS ret = 0; break; case 0x86A2: // GL_NUM_COMPRESSED_TEXTURE_FORMATS // WebGL doesn't have GL_NUM_COMPRESSED_TEXTURE_FORMATS (it's obsolete since GL_COMPRESSED_TEXTURE_FORMATS returns a JS array that can be queried for length), // so implement it ourselves to allow C++ GLES2 code get the length. var formats = GLctx.getParameter(0x86A3 /*GL_COMPRESSED_TEXTURE_FORMATS*/); ret = formats.length; break; case 0x821D: // GL_NUM_EXTENSIONS if (GLctx.canvas.GLctxObject.version < 2) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); // Calling GLES3/WebGL2 function with a GLES2/WebGL1 context return; } var exts = GLctx.getSupportedExtensions(); ret = 2*exts.length; // each extension is duplicated, first in unprefixed WebGL form, and then a second time with "GL_" prefix. break; case 0x821B: // GL_MAJOR_VERSION case 0x821C: // GL_MINOR_VERSION if (GLctx.canvas.GLctxObject.version < 2) { GL.recordError(0x0500); // GL_INVALID_ENUM return; } ret = name_ == 0x821B ? 3 : 0; // return version 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(0x0500); // GL_INVALID_ENUM return; case "object": if (result === null) { // null is a valid result for some (e.g., which buffer is bound - perhaps nothing is bound), but otherwise // can mean an invalid name_, which we need to report as an error switch(name_) { case 0x8894: // ARRAY_BUFFER_BINDING case 0x8B8D: // CURRENT_PROGRAM case 0x8895: // ELEMENT_ARRAY_BUFFER_BINDING case 0x8CA6: // FRAMEBUFFER_BINDING case 0x8CA7: // RENDERBUFFER_BINDING case 0x8069: // TEXTURE_BINDING_2D case 0x85B5: // GL_VERTEX_ARRAY_BINDING case 0x8919: // GL_SAMPLER_BINDING case 0x8E25: // GL_TRANSFORM_FEEDBACK_BINDING case 0x8514: { // TEXTURE_BINDING_CUBE_MAP ret = 0; break; } default: { GL.recordError(0x0500); // GL_INVALID_ENUM return; } } } else if (result instanceof Float32Array || result instanceof Uint32Array || result instanceof Int32Array || result instanceof Array) { for (var i = 0; i < result.length; ++i) { switch (type) { case 'Integer': HEAP32[(((p)+(i*4))>>2)]=result[i]; break; case 'Float': HEAPF32[(((p)+(i*4))>>2)]=result[i]; break; case 'Boolean': HEAP8[(((p)+(i))>>0)]=result[i] ? 1 : 0; break; default: throw 'internal glGet error, bad type: ' + type; } } return; } else if (result instanceof WebGLBuffer || result instanceof WebGLProgram || result instanceof WebGLFramebuffer || result instanceof WebGLRenderbuffer || result instanceof WebGLQuery || result instanceof WebGLSampler || result instanceof WebGLSync || result instanceof WebGLTransformFeedback || result instanceof WebGLVertexArrayObject || result instanceof WebGLTexture) { ret = result.name | 0; } else { GL.recordError(0x0500); // GL_INVALID_ENUM return; } break; default: GL.recordError(0x0500); // GL_INVALID_ENUM return; } } switch (type) { case 'Integer64': (tempI64 = [ret>>>0,(tempDouble=ret,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((p)>>2)]=tempI64[0],HEAP32[(((p)+(4))>>2)]=tempI64[1]); break; case 'Integer': HEAP32[((p)>>2)]=ret; break; case 'Float': HEAPF32[((p)>>2)]=ret; break; case 'Boolean': HEAP8[((p)>>0)]=ret ? 1 : 0; break; default: throw 'internal glGet error, bad type: ' + type; } }function _emscripten_glGetFloatv(name_, p) { emscriptenWebGLGet(name_, p, 'Float'); } function _glGetProgramInfoLog(program, maxLength, length, infoLog) { var log = GLctx.getProgramInfoLog(GL.programs[program]); if (log === null) log = '(unknown error)'; if (maxLength > 0 && infoLog) { var numBytesWrittenExclNull = stringToUTF8(log, infoLog, maxLength); if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull; } else { if (length) HEAP32[((length)>>2)]=0; } } function _emscripten_glUniform3fv(location, count, value) { location = GL.uniforms[location]; var view; if (3*count <= GL.MINI_TEMP_BUFFER_SIZE) { // avoid allocation when uploading few enough uniforms view = GL.miniTempBufferViews[3*count-1]; for (var i = 0; i < 3*count; i += 3) { view[i] = HEAPF32[(((value)+(4*i))>>2)]; view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; } } else { view = HEAPF32.subarray((value)>>2,(value+count*12)>>2); } GLctx.uniform3fv(location, view); } function _glBindTransformFeedback(target, id) { var transformFeedback = id ? GL.transformFeedbacks[id] : null; if (id && !transformFeedback) { // Passing an nonexisting or an already deleted id is an error. GL.recordError(0x0502 /* GL_INVALID_OPERATION */); return; } GLctx['bindTransformFeedback'](target, transformFeedback); } function _glBindVertexArray(vao) { GLctx['bindVertexArray'](GL.vaos[vao]); } function ___resumeException(ptr) { if (!EXCEPTIONS.last) { EXCEPTIONS.last = ptr; } throw ptr; } function _emscripten_glCreateProgram() { var id = GL.getNewId(GL.programs); var program = GLctx.createProgram(); program.name = id; GL.programs[id] = program; return id; } function _pthread_once(ptr, func) { if (!_pthread_once.seen) _pthread_once.seen = {}; if (ptr in _pthread_once.seen) return; Module['dynCall_v'](func); _pthread_once.seen[ptr] = 1; } function _emscripten_glCompressedTexImage2D(target, level, internalFormat, width, height, border, imageSize, data) { var heapView; if (data) { heapView = HEAPU8.subarray((data),(data+imageSize)); } else { heapView = null; } GLctx['compressedTexImage2D'](target, level, internalFormat, width, height, border, heapView); } function _emscripten_glClearColor(x0, x1, x2, x3) { GLctx['clearColor'](x0, x1, x2, x3) } function _glUniform2uiv(location, count, value) { location = GL.uniforms[location]; count *= 2; value = HEAPU32.subarray((value)>>2,(value+count*4)>>2); GLctx.uniform2uiv(location, value); } function _pthread_attr_destroy(attr) { /* int pthread_attr_destroy(pthread_attr_t *attr); */ //FIXME: should destroy the pthread_attr_t struct return 0; } function _JS_SystemInfo_HasWebGL() { return UnityLoader.SystemInfo.hasWebGL; } function _glFinish() { GLctx['finish']() } function _emscripten_glLoadMatrixf() { Module['printErr']('missing function: emscripten_glLoadMatrixf'); abort(-1); } function _glDeleteShader(id) { if (!id) return; var shader = GL.shaders[id]; if (!shader) { // glDeleteShader actually signals an error when deleting a nonexisting object, unlike some other GL delete functions. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } GLctx.deleteShader(shader); GL.shaders[id] = null; } function _emscripten_glGetProgramInfoLog(program, maxLength, length, infoLog) { var log = GLctx.getProgramInfoLog(GL.programs[program]); if (log === null) log = '(unknown error)'; if (maxLength > 0 && infoLog) { var numBytesWrittenExclNull = stringToUTF8(log, infoLog, maxLength); if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull; } else { if (length) HEAP32[((length)>>2)]=0; } } function _glViewport(x0, x1, x2, x3) { GLctx['viewport'](x0, x1, x2, x3) } function _emscripten_glDepthMask(flag) { GLctx.depthMask(!!flag); } function _glUniform1uiv(location, count, value) { location = GL.uniforms[location]; value = HEAPU32.subarray((value)>>2,(value+count*4)>>2); GLctx.uniform1uiv(location, value); } function _glTransformFeedbackVaryings(program, count, varyings, bufferMode) { program = GL.programs[program]; var vars = []; for (var i = 0; i < count; i++) vars.push(Pointer_stringify(HEAP32[(((varyings)+(i*4))>>2)])); GLctx['transformFeedbackVaryings'](program, vars, bufferMode); } function _JS_Sound_Init() { try { window.AudioContext = window.AudioContext||window.webkitAudioContext; WEBAudio.audioContext = new AudioContext(); WEBAudio.audioWebEnabled = 1; } catch(e) { alert('Web Audio API is not supported in this browser'); } } function _emscripten_glFlush() { GLctx['flush']() } function _emscripten_glCreateShader(shaderType) { var id = GL.getNewId(GL.shaders); GL.shaders[id] = GLctx.createShader(shaderType); return id; } function _pthread_cond_init() { return 0; } function _emscripten_glIsShader(shader) { var s = GL.shaders[shader]; if (!s) return 0; return GLctx.isShader(s); } function _JS_WebRequest_GetResponseHeaders(request, buffer, bufferSize) { var headers = wr.requestInstances[request].getAllResponseHeaders(); if (buffer) stringToUTF8(headers, buffer, bufferSize); return lengthBytesUTF8(headers); } function _glTexParameterf(x0, x1, x2) { GLctx['texParameterf'](x0, x1, x2) } function _glTexParameteri(x0, x1, x2) { GLctx['texParameteri'](x0, x1, x2) } function _emscripten_glColorMask(red, green, blue, alpha) { GLctx.colorMask(!!red, !!green, !!blue, !!alpha); } function _emscripten_set_mousemove_callback(target, userData, useCapture, callbackfunc) { JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, 8, "mousemove"); return 0; } function _emscripten_set_canvas_size(width, height) { Browser.setCanvasSize(width, height); } function _glPixelStorei(pname, param) { if (pname == 0x0D05 /* GL_PACK_ALIGNMENT */) { GL.packAlignment = param; } else if (pname == 0x0cf5 /* GL_UNPACK_ALIGNMENT */) { GL.unpackAlignment = param; } GLctx.pixelStorei(pname, param); } function _glValidateProgram(program) { GLctx.validateProgram(GL.programs[program]); } function _JS_WebRequest_Abort(request) { wr.requestInstances[request].abort(); } function ___syscall221(which, varargs) {SYSCALLS.varargs = varargs; try { // fcntl64 var stream = SYSCALLS.getStreamFromFD(), cmd = SYSCALLS.get(); switch (cmd) { case 0: { var arg = SYSCALLS.get(); if (arg < 0) { return -ERRNO_CODES.EINVAL; } var newStream; newStream = FS.open(stream.path, stream.flags, 0, arg); return newStream.fd; } case 1: case 2: return 0; // FD_CLOEXEC makes no sense for a single process. case 3: return stream.flags; case 4: { var arg = SYSCALLS.get(); stream.flags |= arg; return 0; } case 12: case 12: { var arg = SYSCALLS.get(); var offset = 0; // We're always unlocked. HEAP16[(((arg)+(offset))>>1)]=2; return 0; } case 13: case 14: case 13: case 14: return 0; // Pretend that the locking is successful. case 16: case 8: return -ERRNO_CODES.EINVAL; // These are for sockets. We don't have them fully implemented yet. case 9: // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fnctl() returns that, and we set errno ourselves. ___setErrNo(ERRNO_CODES.EINVAL); return -1; default: { return -ERRNO_CODES.EINVAL; } } } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function ___syscall220(which, varargs) {SYSCALLS.varargs = varargs; try { // SYS_getdents64 var stream = SYSCALLS.getStreamFromFD(), dirp = SYSCALLS.get(), count = SYSCALLS.get(); if (!stream.getdents) { stream.getdents = FS.readdir(stream.path); } var pos = 0; while (stream.getdents.length > 0 && pos + 268 <= count) { var id; var type; var name = stream.getdents.pop(); assert(name.length < 256); // limit of dirent struct if (name[0] === '.') { id = 1; type = 4; // DT_DIR } else { var child = FS.lookupNode(stream.node, name); id = child.id; type = FS.isChrdev(child.mode) ? 2 : // DT_CHR, character device. FS.isDir(child.mode) ? 4 : // DT_DIR, directory. FS.isLink(child.mode) ? 10 : // DT_LNK, symbolic link. 8; // DT_REG, regular file. } HEAP32[((dirp + pos)>>2)]=id; HEAP32[(((dirp + pos)+(4))>>2)]=stream.position; HEAP16[(((dirp + pos)+(8))>>1)]=268; HEAP8[(((dirp + pos)+(10))>>0)]=type; for (var i = 0; i < name.length; i++) { HEAP8[(((dirp + pos)+(11 + i))>>0)]=name.charCodeAt(i); } HEAP8[(((dirp + pos)+(11 + i))>>0)]=0; pos += 268; } return pos; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _emscripten_glIsRenderbuffer(renderbuffer) { var rb = GL.renderbuffers[renderbuffer]; if (!rb) return 0; return GLctx.isRenderbuffer(rb); } function _glLinkProgram(program) { GLctx.linkProgram(GL.programs[program]); GL.programInfos[program] = null; // uniforms no longer keep the same names after linking GL.populateUniformTable(program); } function _glBindTexture(target, texture) { GLctx.bindTexture(target, texture ? GL.textures[texture] : null); } function _glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName) { program = GL.programs[program]; var result = GLctx['getActiveUniformBlockName'](program, uniformBlockIndex); if (!result) return; // If an error occurs, nothing will be written to uniformBlockName or length. if (uniformBlockName && bufSize > 0) { var numBytesWrittenExclNull = stringToUTF8(result, uniformBlockName, bufSize); if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull; } else { if (length) HEAP32[((length)>>2)]=0; } } function _glClearColor(x0, x1, x2, x3) { GLctx['clearColor'](x0, x1, x2, x3) } function _glUniform3iv(location, count, value) { location = GL.uniforms[location]; count *= 3; value = HEAP32.subarray((value)>>2,(value+count*4)>>2); GLctx.uniform3iv(location, value); } function _emscripten_glShaderSource(shader, count, string, length) { var source = GL.getSource(shader, count, string, length); GLctx.shaderSource(GL.shaders[shader], source); } function _glEndQuery(x0) { GLctx['endQuery'](x0) } function _pthread_mutex_init() {} function _emscripten_glIsTexture(texture) { var texture = GL.textures[texture]; if (!texture) return 0; return GLctx.isTexture(texture); } function ___syscall54(which, varargs) {SYSCALLS.varargs = varargs; try { // ioctl var stream = SYSCALLS.getStreamFromFD(), op = SYSCALLS.get(); switch (op) { case 21505: { if (!stream.tty) return -ERRNO_CODES.ENOTTY; return 0; } case 21506: { if (!stream.tty) return -ERRNO_CODES.ENOTTY; return 0; // no-op, not actually adjusting terminal settings } case 21519: { if (!stream.tty) return -ERRNO_CODES.ENOTTY; var argp = SYSCALLS.get(); HEAP32[((argp)>>2)]=0; return 0; } case 21520: { if (!stream.tty) return -ERRNO_CODES.ENOTTY; return -ERRNO_CODES.EINVAL; // not supported } case 21531: { var argp = SYSCALLS.get(); return FS.ioctl(stream, op, argp); } default: abort('bad ioctl syscall ' + op); } } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _glColorMask(red, green, blue, alpha) { GLctx.colorMask(!!red, !!green, !!blue, !!alpha); } function _glDeleteTextures(n, textures) { for (var i = 0; i < n; i++) { var id = HEAP32[(((textures)+(i*4))>>2)]; var texture = GL.textures[id]; if (!texture) continue; // GL spec: "glDeleteTextures silently ignores 0s and names that do not correspond to existing textures". GLctx.deleteTexture(texture); texture.name = 0; GL.textures[id] = null; } } function _glStencilOpSeparate(x0, x1, x2, x3) { GLctx['stencilOpSeparate'](x0, x1, x2, x3) } function _emscripten_glHint(x0, x1) { GLctx['hint'](x0, x1) } function _glDeleteQueries(n, ids) { for (var i = 0; i < n; i++) { var id = HEAP32[(((ids)+(i*4))>>2)]; var query = GL.queries[id]; if (!query) continue; // GL spec: "unused names in ids are ignored, as is the name zero." GLctx['deleteQuery'](query); GL.queries[id] = null; } } function _glVertexAttrib4f(x0, x1, x2, x3, x4) { GLctx['vertexAttrib4f'](x0, x1, x2, x3, x4) } function _emscripten_glUniform4i(location, v0, v1, v2, v3) { location = GL.uniforms[location]; GLctx.uniform4i(location, v0, v1, v2, v3); } function _glGetTexParameteriv(target, pname, params) { if (!params) { // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense // if p == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } HEAP32[((params)>>2)]=GLctx.getTexParameter(target, pname); } function _emscripten_glViewport(x0, x1, x2, x3) { GLctx['viewport'](x0, x1, x2, x3) } function _emscripten_memcpy_big(dest, src, num) { HEAPU8.set(HEAPU8.subarray(src, src+num), dest); return dest; } Module["_memcpy"] = _memcpy; function _emscripten_glBufferData(target, size, data, usage) { switch (usage) { // fix usages, WebGL only has *_DRAW case 0x88E1: // GL_STREAM_READ case 0x88E2: // GL_STREAM_COPY usage = 0x88E0; // GL_STREAM_DRAW break; case 0x88E5: // GL_STATIC_READ case 0x88E6: // GL_STATIC_COPY usage = 0x88E4; // GL_STATIC_DRAW break; case 0x88E9: // GL_DYNAMIC_READ case 0x88EA: // GL_DYNAMIC_COPY usage = 0x88E8; // GL_DYNAMIC_DRAW break; } if (!data) { GLctx.bufferData(target, size, usage); } else { GLctx.bufferData(target, HEAPU8.subarray(data, data+size), usage); } } function _glSamplerParameteri(sampler, pname, param) { GLctx['samplerParameteri'](sampler ? GL.samplers[sampler] : null, pname, param); } function _pthread_mutexattr_init() {} var _llvm_fabs_f32=Math_abs; function _emscripten_glUniform3f(location, v0, v1, v2) { location = GL.uniforms[location]; GLctx.uniform3f(location, v0, v1, v2); } function _emscripten_glBlendFunc(x0, x1) { GLctx['blendFunc'](x0, x1) } function _emscripten_glUniform3i(location, v0, v1, v2) { location = GL.uniforms[location]; GLctx.uniform3i(location, v0, v1, v2); } function _emscripten_glStencilOp(x0, x1, x2) { GLctx['stencilOp'](x0, x1, x2) } function _glUniform1i(location, v0) { location = GL.uniforms[location]; GLctx.uniform1i(location, v0); } function _glGetActiveAttrib(program, index, bufSize, length, size, type, name) { program = GL.programs[program]; var info = GLctx.getActiveAttrib(program, index); if (!info) return; // If an error occurs, nothing will be written to length, size and type and name. if (bufSize > 0 && name) { var numBytesWrittenExclNull = stringToUTF8(info.name, name, bufSize); if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull; } else { if (length) HEAP32[((length)>>2)]=0; } if (size) HEAP32[((size)>>2)]=info.size; if (type) HEAP32[((type)>>2)]=info.type; } function _pthread_detach() {} function _glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels) { var pixelData = null; if (pixels) pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, 0); GLctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixelData); } function emscriptenWebGLGetUniform(program, location, params, type) { if (!params) { // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense // if params == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } var data = GLctx.getUniform(GL.programs[program], GL.uniforms[location]); if (typeof data == 'number' || typeof data == 'boolean') { switch (type) { case 'Integer': HEAP32[((params)>>2)]=data; break; case 'Float': HEAPF32[((params)>>2)]=data; break; default: throw 'internal emscriptenWebGLGetUniform() error, bad type: ' + type; } } else { for (var i = 0; i < data.length; i++) { switch (type) { case 'Integer': HEAP32[(((params)+(i))>>2)]=data[i]; break; case 'Float': HEAPF32[(((params)+(i))>>2)]=data[i]; break; default: throw 'internal emscriptenWebGLGetUniform() error, bad type: ' + type; } } } }function _glGetUniformiv(program, location, params) { emscriptenWebGLGetUniform(program, location, params, 'Integer'); } function _emscripten_glEnableVertexAttribArray(index) { GLctx.enableVertexAttribArray(index); } function _JS_SystemInfo_GetMemory() { return TOTAL_MEMORY/(1024*1024); } function _atexit(func, arg) { __ATEXIT__.unshift({ func: func, arg: arg }); } function _emscripten_glCopyTexSubImage2D(x0, x1, x2, x3, x4, x5, x6, x7) { GLctx['copyTexSubImage2D'](x0, x1, x2, x3, x4, x5, x6, x7) } function _emscripten_set_touchcancel_callback(target, userData, useCapture, callbackfunc) { JSEvents.registerTouchEventCallback(target, userData, useCapture, callbackfunc, 25, "touchcancel"); return 0; } function _glBindFramebuffer(target, framebuffer) { GLctx.bindFramebuffer(target, framebuffer ? GL.framebuffers[framebuffer] : null); } function _emscripten_glBlendFuncSeparate(x0, x1, x2, x3) { GLctx['blendFuncSeparate'](x0, x1, x2, x3) } function _glCullFace(x0) { GLctx['cullFace'](x0) } function _emscripten_glColorPointer() { Module['printErr']('missing function: emscripten_glColorPointer'); abort(-1); } function _emscripten_glNormalPointer() { Module['printErr']('missing function: emscripten_glNormalPointer'); abort(-1); } function __isLeapYear(year) { return year%4 === 0 && (year%100 !== 0 || year%400 === 0); } function __arraySum(array, index) { var sum = 0; for (var i = 0; i <= index; sum += array[i++]); return sum; } var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31]; var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date, days) { var newDate = new Date(date.getTime()); while(days > 0) { var leap = __isLeapYear(newDate.getFullYear()); var currentMonth = newDate.getMonth(); var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth]; if (days > daysInCurrentMonth-newDate.getDate()) { // we spill over to next month days -= (daysInCurrentMonth-newDate.getDate()+1); newDate.setDate(1); if (currentMonth < 11) { newDate.setMonth(currentMonth+1) } else { newDate.setMonth(0); newDate.setFullYear(newDate.getFullYear()+1); } } else { // we stay in current month newDate.setDate(newDate.getDate()+days); return newDate; } } return newDate; }function _strftime(s, maxsize, format, tm) { // size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr); // http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html var tm_zone = HEAP32[(((tm)+(40))>>2)]; var date = { tm_sec: HEAP32[((tm)>>2)], tm_min: HEAP32[(((tm)+(4))>>2)], tm_hour: HEAP32[(((tm)+(8))>>2)], tm_mday: HEAP32[(((tm)+(12))>>2)], tm_mon: HEAP32[(((tm)+(16))>>2)], tm_year: HEAP32[(((tm)+(20))>>2)], tm_wday: HEAP32[(((tm)+(24))>>2)], tm_yday: HEAP32[(((tm)+(28))>>2)], tm_isdst: HEAP32[(((tm)+(32))>>2)], tm_gmtoff: HEAP32[(((tm)+(36))>>2)], tm_zone: tm_zone ? Pointer_stringify(tm_zone) : '' }; var pattern = Pointer_stringify(format); // expand format var EXPANSION_RULES_1 = { '%c': '%a %b %d %H:%M:%S %Y', // Replaced by the locale's appropriate date and time representation - e.g., Mon Aug 3 14:02:01 2013 '%D': '%m/%d/%y', // Equivalent to %m / %d / %y '%F': '%Y-%m-%d', // Equivalent to %Y - %m - %d '%h': '%b', // Equivalent to %b '%r': '%I:%M:%S %p', // Replaced by the time in a.m. and p.m. notation '%R': '%H:%M', // Replaced by the time in 24-hour notation '%T': '%H:%M:%S', // Replaced by the time '%x': '%m/%d/%y', // Replaced by the locale's appropriate date representation '%X': '%H:%M:%S' // Replaced by the locale's appropriate date representation }; for (var rule in EXPANSION_RULES_1) { pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]); } var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; function leadingSomething(value, digits, character) { var str = typeof value === 'number' ? value.toString() : (value || ''); while (str.length < digits) { str = character[0]+str; } return str; }; function leadingNulls(value, digits) { return leadingSomething(value, digits, '0'); }; function compareByDay(date1, date2) { function sgn(value) { return value < 0 ? -1 : (value > 0 ? 1 : 0); }; var compare; if ((compare = sgn(date1.getFullYear()-date2.getFullYear())) === 0) { if ((compare = sgn(date1.getMonth()-date2.getMonth())) === 0) { compare = sgn(date1.getDate()-date2.getDate()); } } return compare; }; function getFirstWeekStartDate(janFourth) { switch (janFourth.getDay()) { case 0: // Sunday return new Date(janFourth.getFullYear()-1, 11, 29); case 1: // Monday return janFourth; case 2: // Tuesday return new Date(janFourth.getFullYear(), 0, 3); case 3: // Wednesday return new Date(janFourth.getFullYear(), 0, 2); case 4: // Thursday return new Date(janFourth.getFullYear(), 0, 1); case 5: // Friday return new Date(janFourth.getFullYear()-1, 11, 31); case 6: // Saturday return new Date(janFourth.getFullYear()-1, 11, 30); } }; function getWeekBasedYear(date) { var thisDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); var janFourthNextYear = new Date(thisDate.getFullYear()+1, 0, 4); var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { // this date is after the start of the first week of this year if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { return thisDate.getFullYear()+1; } else { return thisDate.getFullYear(); } } else { return thisDate.getFullYear()-1; } }; var EXPANSION_RULES_2 = { '%a': function(date) { return WEEKDAYS[date.tm_wday].substring(0,3); }, '%A': function(date) { return WEEKDAYS[date.tm_wday]; }, '%b': function(date) { return MONTHS[date.tm_mon].substring(0,3); }, '%B': function(date) { return MONTHS[date.tm_mon]; }, '%C': function(date) { var year = date.tm_year+1900; return leadingNulls((year/100)|0,2); }, '%d': function(date) { return leadingNulls(date.tm_mday, 2); }, '%e': function(date) { return leadingSomething(date.tm_mday, 2, ' '); }, '%g': function(date) { // %g, %G, and %V give values according to the ISO 8601:2000 standard week-based year. // In this system, weeks begin on a Monday and week 1 of the year is the week that includes // January 4th, which is also the week that includes the first Thursday of the year, and // is also the first week that contains at least four days in the year. // If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of // the last week of the preceding year; thus, for Saturday 2nd January 1999, // %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th, // or 31st is a Monday, it and any following days are part of week 1 of the following year. // Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01. return getWeekBasedYear(date).toString().substring(2); }, '%G': function(date) { return getWeekBasedYear(date); }, '%H': function(date) { return leadingNulls(date.tm_hour, 2); }, '%I': function(date) { var twelveHour = date.tm_hour; if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; return leadingNulls(twelveHour, 2); }, '%j': function(date) { // Day of the year (001-366) return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon-1), 3); }, '%m': function(date) { return leadingNulls(date.tm_mon+1, 2); }, '%M': function(date) { return leadingNulls(date.tm_min, 2); }, '%n': function() { return '\n'; }, '%p': function(date) { if (date.tm_hour >= 0 && date.tm_hour < 12) { return 'AM'; } else { return 'PM'; } }, '%S': function(date) { return leadingNulls(date.tm_sec, 2); }, '%t': function() { return '\t'; }, '%u': function(date) { var day = new Date(date.tm_year+1900, date.tm_mon+1, date.tm_mday, 0, 0, 0, 0); return day.getDay() || 7; }, '%U': function(date) { // Replaced by the week number of the year as a decimal number [00,53]. // The first Sunday of January is the first day of week 1; // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] var janFirst = new Date(date.tm_year+1900, 0, 1); var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7-janFirst.getDay()); var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday); // is target date after the first Sunday? if (compareByDay(firstSunday, endDate) < 0) { // calculate difference in days between first Sunday and endDate var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31; var firstSundayUntilEndJanuary = 31-firstSunday.getDate(); var days = firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate(); return leadingNulls(Math.ceil(days/7), 2); } return compareByDay(firstSunday, janFirst) === 0 ? '01': '00'; }, '%V': function(date) { // Replaced by the week number of the year (Monday as the first day of the week) // as a decimal number [01,53]. If the week containing 1 January has four // or more days in the new year, then it is considered week 1. // Otherwise, it is the last week of the previous year, and the next week is week 1. // Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday] var janFourthThisYear = new Date(date.tm_year+1900, 0, 4); var janFourthNextYear = new Date(date.tm_year+1901, 0, 4); var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); var endDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); if (compareByDay(endDate, firstWeekStartThisYear) < 0) { // if given date is before this years first week, then it belongs to the 53rd week of last year return '53'; } if (compareByDay(firstWeekStartNextYear, endDate) <= 0) { // if given date is after next years first week, then it belongs to the 01th week of next year return '01'; } // given date is in between CW 01..53 of this calendar year var daysDifference; if (firstWeekStartThisYear.getFullYear() < date.tm_year+1900) { // first CW of this year starts last year daysDifference = date.tm_yday+32-firstWeekStartThisYear.getDate() } else { // first CW of this year starts this year daysDifference = date.tm_yday+1-firstWeekStartThisYear.getDate(); } return leadingNulls(Math.ceil(daysDifference/7), 2); }, '%w': function(date) { var day = new Date(date.tm_year+1900, date.tm_mon+1, date.tm_mday, 0, 0, 0, 0); return day.getDay(); }, '%W': function(date) { // Replaced by the week number of the year as a decimal number [00,53]. // The first Monday of January is the first day of week 1; // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] var janFirst = new Date(date.tm_year, 0, 1); var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7-janFirst.getDay()+1); var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday); // is target date after the first Monday? if (compareByDay(firstMonday, endDate) < 0) { var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31; var firstMondayUntilEndJanuary = 31-firstMonday.getDate(); var days = firstMondayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate(); return leadingNulls(Math.ceil(days/7), 2); } return compareByDay(firstMonday, janFirst) === 0 ? '01': '00'; }, '%y': function(date) { // Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year] return (date.tm_year+1900).toString().substring(2); }, '%Y': function(date) { // Replaced by the year as a decimal number (for example, 1997). [ tm_year] return date.tm_year+1900; }, '%z': function(date) { // Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ). // For example, "-0430" means 4 hours 30 minutes behind UTC (west of Greenwich). var off = date.tm_gmtoff; var ahead = off >= 0; off = Math.abs(off) / 60; // convert from minutes into hhmm format (which means 60 minutes = 100 units) off = (off / 60)*100 + (off % 60); return (ahead ? '+' : '-') + String("0000" + off).slice(-4); }, '%Z': function(date) { return date.tm_zone; }, '%%': function() { return '%'; } }; for (var rule in EXPANSION_RULES_2) { if (pattern.indexOf(rule) >= 0) { pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date)); } } var bytes = intArrayFromString(pattern, false); if (bytes.length > maxsize) { return 0; } writeArrayToMemory(bytes, s); return bytes.length-1; } function _emscripten_glGetFramebufferAttachmentParameteriv(target, attachment, pname, params) { var result = GLctx.getFramebufferAttachmentParameter(target, attachment, pname); HEAP32[((params)>>2)]=result; } function _emscripten_get_pointerlock_status(pointerlockStatus) { if (pointerlockStatus) JSEvents.fillPointerlockChangeEventData(pointerlockStatus); if (!document.body.requestPointerLock && !document.body.mozRequestPointerLock && !document.body.webkitRequestPointerLock && !document.body.msRequestPointerLock) { return -1; } return 0; } function _glAttachShader(program, shader) { GLctx.attachShader(GL.programs[program], GL.shaders[shader]); } function _emscripten_glGetVertexAttribfv(index, pname, params) { // N.B. This function may only be called if the vertex attribute was specified using the function glVertexAttrib*f(), // otherwise the results are undefined. (GLES3 spec 6.1.12) emscriptenWebGLGetVertexAttrib(index, pname, params, 'Float'); } function _emscripten_set_keyup_callback(target, userData, useCapture, callbackfunc) { JSEvents.registerKeyEventCallback(target, userData, useCapture, callbackfunc, 3, "keyup"); return 0; } function _glDrawElements(mode, count, type, indices) { GLctx.drawElements(mode, count, type, indices); } function _emscripten_get_fullscreen_status(fullscreenStatus) { if (typeof JSEvents.fullscreenEnabled() === 'undefined') return -1; JSEvents.fillFullscreenChangeEventData(fullscreenStatus); return 0; } function _malloc(bytes) { /* Over-allocate to make sure it is byte-aligned by 8. * This will leak memory, but this is only the dummy * implementation (replaced by dlmalloc normally) so * not an issue. */ var ptr = Runtime.dynamicAlloc(bytes + 8); return (ptr+8) & 0xFFFFFFF8; } Module["_malloc"] = _malloc; function _getenv(name) { // char *getenv(const char *name); // http://pubs.opengroup.org/onlinepubs/009695399/functions/getenv.html if (name === 0) return 0; name = Pointer_stringify(name); if (!ENV.hasOwnProperty(name)) return 0; if (_getenv.ret) _free(_getenv.ret); _getenv.ret = allocate(intArrayFromString(ENV[name]), 'i8', ALLOC_NORMAL); return _getenv.ret; } function _putenv(string) { // int putenv(char *string); // http://pubs.opengroup.org/onlinepubs/009695399/functions/putenv.html // WARNING: According to the standard (and the glibc implementation), the // string is taken by reference so future changes are reflected. // We copy it instead, possibly breaking some uses. if (string === 0) { ___setErrNo(ERRNO_CODES.EINVAL); return -1; } string = Pointer_stringify(string); var splitPoint = string.indexOf('=') if (string === '' || string.indexOf('=') === -1) { ___setErrNo(ERRNO_CODES.EINVAL); return -1; } var name = string.slice(0, splitPoint); var value = string.slice(splitPoint + 1); if (!(name in ENV) || ENV[name] !== value) { ENV[name] = value; ___buildEnvironment(ENV); } return 0; } function _SDL_RWFromConstMem(mem, size) { var id = SDL.rwops.length; // TODO: recycle ids when they are null SDL.rwops.push({ bytes: mem, count: size }); return id; }function _TTF_FontHeight(font) { var fontData = SDL.fonts[font]; return fontData.size; }function _TTF_SizeText(font, text, w, h) { var fontData = SDL.fonts[font]; if (w) { HEAP32[((w)>>2)]=SDL.estimateTextWidth(fontData, Pointer_stringify(text)); } if (h) { HEAP32[((h)>>2)]=fontData.size; } return 0; }function _TTF_RenderText_Solid(font, text, color) { // XXX the font and color are ignored text = Pointer_stringify(text) || ' '; // if given an empty string, still return a valid surface var fontData = SDL.fonts[font]; var w = SDL.estimateTextWidth(fontData, text); var h = fontData.size; var color = SDL.loadColorToCSSRGB(color); // XXX alpha breaks fonts? var fontString = h + 'px ' + fontData.name; var surf = SDL.makeSurface(w, h, 0, false, 'text:' + text); // bogus numbers.. var surfData = SDL.surfaces[surf]; surfData.ctx.save(); surfData.ctx.fillStyle = color; surfData.ctx.font = fontString; surfData.ctx.textBaseline = 'top'; surfData.ctx.fillText(text, 0, 0); surfData.ctx.restore(); return surf; }function _Mix_HaltMusic() { var audio = SDL.music.audio; if (audio) { audio.src = audio.src; // rewind <media> element audio.currentPosition = 0; // rewind Web Audio graph playback. audio.pause(); } SDL.music.audio = null; if (SDL.hookMusicFinished) { Module['dynCall_v'](SDL.hookMusicFinished); } return 0; }function _Mix_PlayMusic(id, loops) { // Pause old music if it exists. if (SDL.music.audio) { if (!SDL.music.audio.paused) Module.printErr('Music is already playing. ' + SDL.music.source); SDL.music.audio.pause(); } var info = SDL.audios[id]; var audio; if (info.webAudio) { // Play via Web Audio API // Create an instance of the WebAudio object. audio = {}; audio.resource = info; // This new webAudio object is an instance that refers to this existing resource. audio.paused = false; audio.currentPosition = 0; audio.play = function() { SDL.playWebAudio(this); } audio.pause = function() { SDL.pauseWebAudio(this); } } else if (info.audio) { // Play via the <audio> element audio = info.audio; } audio['onended'] = function() { if (SDL.music.audio == this) _Mix_HaltMusic(); } // will send callback audio.loop = loops != 0; // TODO: handle N loops for finite N audio.volume = SDL.music.volume; SDL.music.audio = audio; audio.play(); return 0; }function _Mix_FreeChunk(id) { SDL.audios[id] = null; }function _Mix_LoadWAV_RW(rwopsID, freesrc) { var rwops = SDL.rwops[rwopsID]; if (rwops === undefined) return 0; var filename = ''; var audio; var webAudio; var bytes; if (rwops.filename !== undefined) { filename = PATH.resolve(rwops.filename); var raw = Module["preloadedAudios"][filename]; if (!raw) { if (raw === null) Module.printErr('Trying to reuse preloaded audio, but freePreloadedMediaOnUse is set!'); if (!Module.noAudioDecoding) Runtime.warnOnce('Cannot find preloaded audio ' + filename); // see if we can read the file-contents from the in-memory FS try { bytes = FS.readFile(filename); } catch (e) { Module.printErr('Couldn\'t find file for: ' + filename); return 0; } } if (Module['freePreloadedMediaOnUse']) { Module["preloadedAudios"][filename] = null; } audio = raw; } else if (rwops.bytes !== undefined) { // For Web Audio context buffer decoding, we must make a clone of the audio data, but for <media> element, // a view to existing data is sufficient. if (SDL.webAudioAvailable()) bytes = HEAPU8.buffer.slice(rwops.bytes, rwops.bytes + rwops.count); else bytes = HEAPU8.subarray(rwops.bytes, rwops.bytes + rwops.count); } else { return 0; } var arrayBuffer = bytes ? bytes.buffer || bytes : bytes; // To allow user code to work around browser bugs with audio playback on <audio> elements an Web Audio, enable // the user code to hook in a callback to decide on a file basis whether each file should use Web Audio or <audio> for decoding and playback. // In particular, see https://bugzilla.mozilla.org/show_bug.cgi?id=654787 and ?id=1012801 for tradeoffs. var canPlayWithWebAudio = Module['SDL_canPlayWithWebAudio'] === undefined || Module['SDL_canPlayWithWebAudio'](filename, arrayBuffer); if (bytes !== undefined && SDL.webAudioAvailable() && canPlayWithWebAudio) { audio = undefined; webAudio = {}; // The audio decoding process is asynchronous, which gives trouble if user code plays the audio data back immediately // after loading. Therefore prepare an array of callback handlers to run when this audio decoding is complete, which // will then start the playback (with some delay). webAudio.onDecodeComplete = []; // While this member array exists, decoding hasn't finished yet. function onDecodeComplete(data) { webAudio.decodedBuffer = data; // Call all handlers that were waiting for this decode to finish, and clear the handler list. webAudio.onDecodeComplete.forEach(function(e) { e(); }); webAudio.onDecodeComplete = undefined; // Don't allow more callback handlers since audio has finished decoding. } SDL.audioContext['decodeAudioData'](arrayBuffer, onDecodeComplete); } else if (audio === undefined && bytes) { // Here, we didn't find a preloaded audio but we either were passed a filepath for // which we loaded bytes, or we were passed some bytes var blob = new Blob([bytes], {type: rwops.mimetype}); var url = URL.createObjectURL(blob); audio = new Audio(); audio.src = url; audio.mozAudioChannelType = 'content'; // bugzilla 910340 } var id = SDL.audios.length; // Keep the loaded audio in the audio arrays, ready for playback SDL.audios.push({ source: filename, audio: audio, // Points to the <audio> element, if loaded webAudio: webAudio // Points to a Web Audio -specific resource object, if loaded }); return id; }function _Mix_PlayChannel(channel, id, loops) { // TODO: handle fixed amount of N loops. Currently loops either 0 or infinite times. // Get the audio element associated with the ID var info = SDL.audios[id]; if (!info) return -1; if (!info.audio && !info.webAudio) return -1; // If the user asks us to allocate a channel automatically, get the first // free one. if (channel == -1) { for (var i = SDL.channelMinimumNumber; i < SDL.numChannels; i++) { if (!SDL.channels[i].audio) { channel = i; break; } } if (channel == -1) { Module.printErr('All ' + SDL.numChannels + ' channels in use!'); return -1; } } var channelInfo = SDL.channels[channel]; var audio; if (info.webAudio) { // Create an instance of the WebAudio object. audio = {}; audio.resource = info; // This new object is an instance that refers to this existing resource. audio.paused = false; audio.currentPosition = 0; // Make our instance look similar to the instance of a <media> to make api simple. audio.play = function() { SDL.playWebAudio(this); } audio.pause = function() { SDL.pauseWebAudio(this); } } else { // We clone the audio node to utilize the preloaded audio buffer, since // the browser has already preloaded the audio file. audio = info.audio.cloneNode(true); audio.numChannels = info.audio.numChannels; audio.frequency = info.audio.frequency; } audio['onended'] = function SDL_audio_onended() { // TODO: cache these if (channelInfo.audio == this) { channelInfo.audio.paused = true; channelInfo.audio = null; } if (SDL.channelFinished) Runtime.getFuncWrapper(SDL.channelFinished, 'vi')(channel); } channelInfo.audio = audio; // TODO: handle N loops. Behavior matches Mix_PlayMusic audio.loop = loops != 0; audio.volume = channelInfo.volume; audio.play(); return channel; }function _SDL_PauseAudio(pauseOn) { if (!SDL.audio) { return; } if (pauseOn) { if (SDL.audio.timer !== undefined) { clearTimeout(SDL.audio.timer); SDL.audio.numAudioTimersPending = 0; SDL.audio.timer = undefined; } } else if (!SDL.audio.timer) { // Start the audio playback timer callback loop. SDL.audio.numAudioTimersPending = 1; SDL.audio.timer = Browser.safeSetTimeout(SDL.audio.caller, 1); } SDL.audio.paused = pauseOn; }function _SDL_CloseAudio() { if (SDL.audio) { _SDL_PauseAudio(1); _free(SDL.audio.buffer); SDL.audio = null; SDL.allocateChannels(0); } }function _SDL_LockSurface(surf) { var surfData = SDL.surfaces[surf]; surfData.locked++; if (surfData.locked > 1) return 0; if (!surfData.buffer) { surfData.buffer = _malloc(surfData.width * surfData.height * 4); HEAP32[(((surf)+(20))>>2)]=surfData.buffer; } // Mark in C/C++-accessible SDL structure // SDL_Surface has the following fields: Uint32 flags, SDL_PixelFormat *format; int w, h; Uint16 pitch; void *pixels; ... // So we have fields all of the same size, and 5 of them before us. // TODO: Use macros like in library.js HEAP32[(((surf)+(20))>>2)]=surfData.buffer; if (surf == SDL.screen && Module.screenIsReadOnly && surfData.image) return 0; if (SDL.defaults.discardOnLock) { if (!surfData.image) { surfData.image = surfData.ctx.createImageData(surfData.width, surfData.height); } if (!SDL.defaults.opaqueFrontBuffer) return; } else { surfData.image = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height); } // Emulate desktop behavior and kill alpha values on the locked surface. (very costly!) Set SDL.defaults.opaqueFrontBuffer = false // if you don't want this. if (surf == SDL.screen && SDL.defaults.opaqueFrontBuffer) { var data = surfData.image.data; var num = data.length; for (var i = 0; i < num/4; i++) { data[i*4+3] = 255; // opacity, as canvases blend alpha } } if (SDL.defaults.copyOnLock && !SDL.defaults.discardOnLock) { // Copy pixel data to somewhere accessible to 'C/C++' if (surfData.isFlagSet(0x00200000 /* SDL_HWPALETTE */)) { // If this is neaded then // we should compact the data from 32bpp to 8bpp index. // I think best way to implement this is use // additional colorMap hash (color->index). // Something like this: // // var size = surfData.width * surfData.height; // var data = ''; // for (var i = 0; i<size; i++) { // var color = SDL.translateRGBAToColor( // surfData.image.data[i*4 ], // surfData.image.data[i*4 +1], // surfData.image.data[i*4 +2], // 255); // var index = surfData.colorMap[color]; // HEAP8[(((surfData.buffer)+(i))>>0)]=index; // } throw 'CopyOnLock is not supported for SDL_LockSurface with SDL_HWPALETTE flag set' + new Error().stack; } else { HEAPU8.set(surfData.image.data, surfData.buffer); } } return 0; } function _SDL_FreeRW(rwopsID) { SDL.rwops[rwopsID] = null; while (SDL.rwops.length > 0 && SDL.rwops[SDL.rwops.length-1] === null) { SDL.rwops.pop(); } }function _IMG_Load_RW(rwopsID, freeSrc) { try { // stb_image integration support function cleanup() { if (rwops && freeSrc) _SDL_FreeRW(rwopsID); }; function addCleanup(func) { var old = cleanup; cleanup = function added_cleanup() { old(); func(); } } function callStbImage(func, params) { var x = Module['_malloc'](4); var y = Module['_malloc'](4); var comp = Module['_malloc'](4); addCleanup(function() { Module['_free'](x); Module['_free'](y); Module['_free'](comp); if (data) Module['_stbi_image_free'](data); }); var data = Module['_' + func].apply(null, params.concat([x, y, comp, 0])); if (!data) return null; return { rawData: true, data: data, width: HEAP32[((x)>>2)], height: HEAP32[((y)>>2)], size: HEAP32[((x)>>2)] * HEAP32[((y)>>2)] * HEAP32[((comp)>>2)], bpp: HEAP32[((comp)>>2)] }; } var rwops = SDL.rwops[rwopsID]; if (rwops === undefined) { return 0; } var filename = rwops.filename; if (filename === undefined) { Runtime.warnOnce('Only file names that have been preloaded are supported for IMG_Load_RW. Consider using STB_IMAGE=1 if you want synchronous image decoding (see settings.js), or package files with --use-preload-plugins'); return 0; } if (!raw) { filename = PATH.resolve(filename); var raw = Module["preloadedImages"][filename]; if (!raw) { if (raw === null) Module.printErr('Trying to reuse preloaded image, but freePreloadedMediaOnUse is set!'); Runtime.warnOnce('Cannot find preloaded image ' + filename); Runtime.warnOnce('Cannot find preloaded image ' + filename + '. Consider using STB_IMAGE=1 if you want synchronous image decoding (see settings.js), or package files with --use-preload-plugins'); return 0; } else if (Module['freePreloadedMediaOnUse']) { Module["preloadedImages"][filename] = null; } } var surf = SDL.makeSurface(raw.width, raw.height, 0, false, 'load:' + filename); var surfData = SDL.surfaces[surf]; surfData.ctx.globalCompositeOperation = "copy"; if (!raw.rawData) { surfData.ctx.drawImage(raw, 0, 0, raw.width, raw.height, 0, 0, raw.width, raw.height); } else { var imageData = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height); if (raw.bpp == 4) { // rgba imageData.data.set(HEAPU8.subarray((raw.data),(raw.data+raw.size))); } else if (raw.bpp == 3) { // rgb var pixels = raw.size/3; var data = imageData.data; var sourcePtr = raw.data; var destPtr = 0; for (var i = 0; i < pixels; i++) { data[destPtr++] = HEAPU8[((sourcePtr++)>>0)]; data[destPtr++] = HEAPU8[((sourcePtr++)>>0)]; data[destPtr++] = HEAPU8[((sourcePtr++)>>0)]; data[destPtr++] = 255; } } else if (raw.bpp == 1) { // grayscale var pixels = raw.size; var data = imageData.data; var sourcePtr = raw.data; var destPtr = 0; for (var i = 0; i < pixels; i++) { var value = HEAPU8[((sourcePtr++)>>0)]; data[destPtr++] = value; data[destPtr++] = value; data[destPtr++] = value; data[destPtr++] = 255; } } else { Module.printErr('cannot handle bpp ' + raw.bpp); return 0; } surfData.ctx.putImageData(imageData, 0, 0); } surfData.ctx.globalCompositeOperation = "source-over"; // XXX SDL does not specify that loaded images must have available pixel data, in fact // there are cases where you just want to blit them, so you just need the hardware // accelerated version. However, code everywhere seems to assume that the pixels // are in fact available, so we retrieve it here. This does add overhead though. _SDL_LockSurface(surf); surfData.locked--; // The surface is not actually locked in this hack if (SDL.GL) { // After getting the pixel data, we can free the canvas and context if we do not need to do 2D canvas blitting surfData.canvas = surfData.ctx = null; } return surf; } finally { cleanup(); } } function _SDL_RWFromFile(_name, mode) { var id = SDL.rwops.length; // TODO: recycle ids when they are null var name = Pointer_stringify(_name) SDL.rwops.push({ filename: name, mimetype: Browser.getMimetype(name) }); return id; }function _IMG_Load(filename){ var rwops = _SDL_RWFromFile(filename); var result = _IMG_Load_RW(rwops, 1); return result; }function _SDL_UpperBlitScaled(src, srcrect, dst, dstrect) { return SDL.blitSurface(src, srcrect, dst, dstrect, true); }function _SDL_UpperBlit(src, srcrect, dst, dstrect) { return SDL.blitSurface(src, srcrect, dst, dstrect, false); }function _SDL_GetTicks() { return (Date.now() - SDL.startTime)|0; }var SDL={defaults:{width:320,height:200,copyOnLock:true,discardOnLock:false,opaqueFrontBuffer:true},version:null,surfaces:{},canvasPool:[],events:[],fonts:[null],audios:[null],rwops:[null],music:{audio:null,volume:1},mixerFrequency:22050,mixerFormat:32784,mixerNumChannels:2,mixerChunkSize:1024,channelMinimumNumber:0,GL:false,glAttributes:{0:3,1:3,2:2,3:0,4:0,5:1,6:16,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0,15:1,16:0,17:0,18:0},keyboardState:null,keyboardMap:{},canRequestFullscreen:false,isRequestingFullscreen:false,textInput:false,startTime:null,initFlags:0,buttonState:0,modState:0,DOMButtons:[0,0,0],DOMEventToSDLEvent:{},TOUCH_DEFAULT_ID:0,eventHandler:null,eventHandlerContext:null,eventHandlerTemp:0,keyCodes:{16:1249,17:1248,18:1250,20:1081,33:1099,34:1102,35:1101,36:1098,37:1104,38:1106,39:1103,40:1105,44:316,45:1097,46:127,91:1251,93:1125,96:1122,97:1113,98:1114,99:1115,100:1116,101:1117,102:1118,103:1119,104:1120,105:1121,106:1109,107:1111,109:1110,110:1123,111:1108,112:1082,113:1083,114:1084,115:1085,116:1086,117:1087,118:1088,119:1089,120:1090,121:1091,122:1092,123:1093,124:1128,125:1129,126:1130,127:1131,128:1132,129:1133,130:1134,131:1135,132:1136,133:1137,134:1138,135:1139,144:1107,160:94,161:33,162:34,163:35,164:36,165:37,166:38,167:95,168:40,169:41,170:42,171:43,172:124,173:45,174:123,175:125,176:126,181:127,182:129,183:128,188:44,190:46,191:47,192:96,219:91,220:92,221:93,222:39,224:1251},scanCodes:{8:42,9:43,13:40,27:41,32:44,35:204,39:53,44:54,46:55,47:56,48:39,49:30,50:31,51:32,52:33,53:34,54:35,55:36,56:37,57:38,58:203,59:51,61:46,91:47,92:49,93:48,96:52,97:4,98:5,99:6,100:7,101:8,102:9,103:10,104:11,105:12,106:13,107:14,108:15,109:16,110:17,111:18,112:19,113:20,114:21,115:22,116:23,117:24,118:25,119:26,120:27,121:28,122:29,127:76,305:224,308:226,316:70},loadRect:function (rect) { return { x: HEAP32[((rect + 0)>>2)], y: HEAP32[((rect + 4)>>2)], w: HEAP32[((rect + 8)>>2)], h: HEAP32[((rect + 12)>>2)] }; },updateRect:function (rect, r) { HEAP32[((rect)>>2)]=r.x; HEAP32[(((rect)+(4))>>2)]=r.y; HEAP32[(((rect)+(8))>>2)]=r.w; HEAP32[(((rect)+(12))>>2)]=r.h; },intersectionOfRects:function (first, second) { var leftX = Math.max(first.x, second.x); var leftY = Math.max(first.y, second.y); var rightX = Math.min(first.x + first.w, second.x + second.w); var rightY = Math.min(first.y + first.h, second.y + second.h); return { x: leftX, y: leftY, w: Math.max(leftX, rightX) - leftX, h: Math.max(leftY, rightY) - leftY } },checkPixelFormat:function (fmt) { },loadColorToCSSRGB:function (color) { var rgba = HEAP32[((color)>>2)]; return 'rgb(' + (rgba&255) + ',' + ((rgba >> 8)&255) + ',' + ((rgba >> 16)&255) + ')'; },loadColorToCSSRGBA:function (color) { var rgba = HEAP32[((color)>>2)]; return 'rgba(' + (rgba&255) + ',' + ((rgba >> 8)&255) + ',' + ((rgba >> 16)&255) + ',' + (((rgba >> 24)&255)/255) + ')'; },translateColorToCSSRGBA:function (rgba) { return 'rgba(' + (rgba&0xff) + ',' + (rgba>>8 & 0xff) + ',' + (rgba>>16 & 0xff) + ',' + (rgba>>>24)/0xff + ')'; },translateRGBAToCSSRGBA:function (r, g, b, a) { return 'rgba(' + (r&0xff) + ',' + (g&0xff) + ',' + (b&0xff) + ',' + (a&0xff)/255 + ')'; },translateRGBAToColor:function (r, g, b, a) { return r | g << 8 | b << 16 | a << 24; },makeSurface:function (width, height, flags, usePageCanvas, source, rmask, gmask, bmask, amask) { flags = flags || 0; var is_SDL_HWSURFACE = flags & 0x00000001; var is_SDL_HWPALETTE = flags & 0x00200000; var is_SDL_OPENGL = flags & 0x04000000; var surf = _malloc(60); var pixelFormat = _malloc(44); //surface with SDL_HWPALETTE flag is 8bpp surface (1 byte) var bpp = is_SDL_HWPALETTE ? 1 : 4; var buffer = 0; // preemptively initialize this for software surfaces, // otherwise it will be lazily initialized inside of SDL_LockSurface if (!is_SDL_HWSURFACE && !is_SDL_OPENGL) { buffer = _malloc(width * height * 4); } HEAP32[((surf)>>2)]=flags; HEAP32[(((surf)+(4))>>2)]=pixelFormat; HEAP32[(((surf)+(8))>>2)]=width; HEAP32[(((surf)+(12))>>2)]=height; HEAP32[(((surf)+(16))>>2)]=width * bpp; // assuming RGBA or indexed for now, // since that is what ImageData gives us in browsers HEAP32[(((surf)+(20))>>2)]=buffer; HEAP32[(((surf)+(36))>>2)]=0; HEAP32[(((surf)+(40))>>2)]=0; HEAP32[(((surf)+(44))>>2)]=Module["canvas"].width; HEAP32[(((surf)+(48))>>2)]=Module["canvas"].height; HEAP32[(((surf)+(56))>>2)]=1; HEAP32[((pixelFormat)>>2)]=-2042224636; HEAP32[(((pixelFormat)+(4))>>2)]=0;// TODO HEAP8[(((pixelFormat)+(8))>>0)]=bpp * 8; HEAP8[(((pixelFormat)+(9))>>0)]=bpp; HEAP32[(((pixelFormat)+(12))>>2)]=rmask || 0x000000ff; HEAP32[(((pixelFormat)+(16))>>2)]=gmask || 0x0000ff00; HEAP32[(((pixelFormat)+(20))>>2)]=bmask || 0x00ff0000; HEAP32[(((pixelFormat)+(24))>>2)]=amask || 0xff000000; // Decide if we want to use WebGL or not SDL.GL = SDL.GL || is_SDL_OPENGL; var canvas; if (!usePageCanvas) { if (SDL.canvasPool.length > 0) { canvas = SDL.canvasPool.pop(); } else { canvas = document.createElement('canvas'); } canvas.width = width; canvas.height = height; } else { canvas = Module['canvas']; } var webGLContextAttributes = { antialias: ((SDL.glAttributes[13 /*SDL_GL_MULTISAMPLEBUFFERS*/] != 0) && (SDL.glAttributes[14 /*SDL_GL_MULTISAMPLESAMPLES*/] > 1)), depth: (SDL.glAttributes[6 /*SDL_GL_DEPTH_SIZE*/] > 0), stencil: (SDL.glAttributes[7 /*SDL_GL_STENCIL_SIZE*/] > 0), alpha: (SDL.glAttributes[3 /*SDL_GL_ALPHA_SIZE*/] > 0) }; var ctx = Browser.createContext(canvas, is_SDL_OPENGL, usePageCanvas, webGLContextAttributes); SDL.surfaces[surf] = { width: width, height: height, canvas: canvas, ctx: ctx, surf: surf, buffer: buffer, pixelFormat: pixelFormat, alpha: 255, flags: flags, locked: 0, usePageCanvas: usePageCanvas, source: source, isFlagSet: function(flag) { return flags & flag; } }; return surf; },copyIndexedColorData:function (surfData, rX, rY, rW, rH) { // HWPALETTE works with palette // setted by SDL_SetColors if (!surfData.colors) { return; } var fullWidth = Module['canvas'].width; var fullHeight = Module['canvas'].height; var startX = rX || 0; var startY = rY || 0; var endX = (rW || (fullWidth - startX)) + startX; var endY = (rH || (fullHeight - startY)) + startY; var buffer = surfData.buffer; if (!surfData.image.data32) { surfData.image.data32 = new Uint32Array(surfData.image.data.buffer); } var data32 = surfData.image.data32; var colors32 = surfData.colors32; for (var y = startY; y < endY; ++y) { var base = y * fullWidth; for (var x = startX; x < endX; ++x) { data32[base + x] = colors32[HEAPU8[((buffer + base + x)>>0)]]; } } },freeSurface:function (surf) { var refcountPointer = surf + 56; var refcount = HEAP32[((refcountPointer)>>2)]; if (refcount > 1) { HEAP32[((refcountPointer)>>2)]=refcount - 1; return; } var info = SDL.surfaces[surf]; if (!info.usePageCanvas && info.canvas) SDL.canvasPool.push(info.canvas); if (info.buffer) _free(info.buffer); _free(info.pixelFormat); _free(surf); SDL.surfaces[surf] = null; if (surf === SDL.screen) { SDL.screen = null; } },blitSurface__deps:["SDL_LockSurface"],blitSurface:function (src, srcrect, dst, dstrect, scale) { var srcData = SDL.surfaces[src]; var dstData = SDL.surfaces[dst]; var sr, dr; if (srcrect) { sr = SDL.loadRect(srcrect); } else { sr = { x: 0, y: 0, w: srcData.width, h: srcData.height }; } if (dstrect) { dr = SDL.loadRect(dstrect); } else { dr = { x: 0, y: 0, w: srcData.width, h: srcData.height }; } if (dstData.clipRect) { var widthScale = (!scale || sr.w === 0) ? 1 : sr.w / dr.w; var heightScale = (!scale || sr.h === 0) ? 1 : sr.h / dr.h; dr = SDL.intersectionOfRects(dstData.clipRect, dr); sr.w = dr.w * widthScale; sr.h = dr.h * heightScale; if (dstrect) { SDL.updateRect(dstrect, dr); } } var blitw, blith; if (scale) { blitw = dr.w; blith = dr.h; } else { blitw = sr.w; blith = sr.h; } if (sr.w === 0 || sr.h === 0 || blitw === 0 || blith === 0) { return 0; } var oldAlpha = dstData.ctx.globalAlpha; dstData.ctx.globalAlpha = srcData.alpha/255; dstData.ctx.drawImage(srcData.canvas, sr.x, sr.y, sr.w, sr.h, dr.x, dr.y, blitw, blith); dstData.ctx.globalAlpha = oldAlpha; if (dst != SDL.screen) { // XXX As in IMG_Load, for compatibility we write out |pixels| Runtime.warnOnce('WARNING: copying canvas data to memory for compatibility'); _SDL_LockSurface(dst); dstData.locked--; // The surface is not actually locked in this hack } return 0; },downFingers:{},savedKeydown:null,receiveEvent:function (event) { function unpressAllPressedKeys() { // Un-press all pressed keys: TODO for (var code in SDL.keyboardMap) { SDL.events.push({ type: 'keyup', keyCode: SDL.keyboardMap[code] }); } }; switch(event.type) { case 'touchstart': case 'touchmove': { event.preventDefault(); var touches = []; // Clear out any touchstart events that we've already processed if (event.type === 'touchstart') { for (var i = 0; i < event.touches.length; i++) { var touch = event.touches[i]; if (SDL.downFingers[touch.identifier] != true) { SDL.downFingers[touch.identifier] = true; touches.push(touch); } } } else { touches = event.touches; } var firstTouch = touches[0]; if (event.type == 'touchstart') { SDL.DOMButtons[0] = 1; } var mouseEventType; switch(event.type) { case 'touchstart': mouseEventType = 'mousedown'; break; case 'touchmove': mouseEventType = 'mousemove'; break; } var mouseEvent = { type: mouseEventType, button: 0, pageX: firstTouch.clientX, pageY: firstTouch.clientY }; SDL.events.push(mouseEvent); for (var i = 0; i < touches.length; i++) { var touch = touches[i]; SDL.events.push({ type: event.type, touch: touch }); }; break; } case 'touchend': { event.preventDefault(); // Remove the entry in the SDL.downFingers hash // because the finger is no longer down. for(var i = 0; i < event.changedTouches.length; i++) { var touch = event.changedTouches[i]; if (SDL.downFingers[touch.identifier] === true) { delete SDL.downFingers[touch.identifier]; } } var mouseEvent = { type: 'mouseup', button: 0, pageX: event.changedTouches[0].clientX, pageY: event.changedTouches[0].clientY }; SDL.DOMButtons[0] = 0; SDL.events.push(mouseEvent); for (var i = 0; i < event.changedTouches.length; i++) { var touch = event.changedTouches[i]; SDL.events.push({ type: 'touchend', touch: touch }); }; break; } case 'DOMMouseScroll': case 'mousewheel': case 'wheel': var delta = -Browser.getMouseWheelDelta(event); // Flip the wheel direction to translate from browser wheel direction (+:down) to SDL direction (+:up) delta = (delta == 0) ? 0 : (delta > 0 ? Math.max(delta, 1) : Math.min(delta, -1)); // Quantize to integer so that minimum scroll is at least +/- 1. // Simulate old-style SDL events representing mouse wheel input as buttons var button = delta > 0 ? 3 /*SDL_BUTTON_WHEELUP-1*/ : 4 /*SDL_BUTTON_WHEELDOWN-1*/; // Subtract one since JS->C marshalling is defined to add one back. SDL.events.push({ type: 'mousedown', button: button, pageX: event.pageX, pageY: event.pageY }); SDL.events.push({ type: 'mouseup', button: button, pageX: event.pageX, pageY: event.pageY }); // Pass a delta motion event. SDL.events.push({ type: 'wheel', deltaX: 0, deltaY: delta }); event.preventDefault(); // If we don't prevent this, then 'wheel' event will be sent again by the browser as 'DOMMouseScroll' and we will receive this same event the second time. break; case 'mousemove': if (SDL.DOMButtons[0] === 1) { SDL.events.push({ type: 'touchmove', touch: { identifier: 0, deviceID: -1, pageX: event.pageX, pageY: event.pageY } }); } if (Browser.pointerLock) { // workaround for firefox bug 750111 if ('mozMovementX' in event) { event['movementX'] = event['mozMovementX']; event['movementY'] = event['mozMovementY']; } // workaround for Firefox bug 782777 if (event['movementX'] == 0 && event['movementY'] == 0) { // ignore a mousemove event if it doesn't contain any movement info // (without pointer lock, we infer movement from pageX/pageY, so this check is unnecessary) event.preventDefault(); return; } } // fall through case 'keydown': case 'keyup': case 'keypress': case 'mousedown': case 'mouseup': // If we preventDefault on keydown events, the subsequent keypress events // won't fire. However, it's fine (and in some cases necessary) to // preventDefault for keys that don't generate a character. Otherwise, // preventDefault is the right thing to do in general. if (event.type !== 'keydown' || (!SDL.unicode && !SDL.textInput) || (event.keyCode === 8 /* backspace */ || event.keyCode === 9 /* tab */)) { event.preventDefault(); } if (event.type == 'mousedown') { SDL.DOMButtons[event.button] = 1; SDL.events.push({ type: 'touchstart', touch: { identifier: 0, deviceID: -1, pageX: event.pageX, pageY: event.pageY } }); } else if (event.type == 'mouseup') { // ignore extra ups, can happen if we leave the canvas while pressing down, then return, // since we add a mouseup in that case if (!SDL.DOMButtons[event.button]) { return; } SDL.events.push({ type: 'touchend', touch: { identifier: 0, deviceID: -1, pageX: event.pageX, pageY: event.pageY } }); SDL.DOMButtons[event.button] = 0; } // We can only request fullscreen as the result of user input. // Due to this limitation, we toggle a boolean on keydown which // SDL_WM_ToggleFullScreen will check and subsequently set another // flag indicating for us to request fullscreen on the following // keyup. This isn't perfect, but it enables SDL_WM_ToggleFullScreen // to work as the result of a keypress (which is an extremely // common use case). if (event.type === 'keydown' || event.type === 'mousedown') { SDL.canRequestFullscreen = true; } else if (event.type === 'keyup' || event.type === 'mouseup') { if (SDL.isRequestingFullscreen) { Module['requestFullscreen'](/*lockPointer=*/true, /*resizeCanvas=*/true); SDL.isRequestingFullscreen = false; } SDL.canRequestFullscreen = false; } // SDL expects a unicode character to be passed to its keydown events. // Unfortunately, the browser APIs only provide a charCode property on // keypress events, so we must backfill in keydown events with their // subsequent keypress event's charCode. if (event.type === 'keypress' && SDL.savedKeydown) { // charCode is read-only SDL.savedKeydown.keypressCharCode = event.charCode; SDL.savedKeydown = null; } else if (event.type === 'keydown') { SDL.savedKeydown = event; } // Don't push keypress events unless SDL_StartTextInput has been called. if (event.type !== 'keypress' || SDL.textInput) { SDL.events.push(event); } break; case 'mouseout': // Un-press all pressed mouse buttons, because we might miss the release outside of the canvas for (var i = 0; i < 3; i++) { if (SDL.DOMButtons[i]) { SDL.events.push({ type: 'mouseup', button: i, pageX: event.pageX, pageY: event.pageY }); SDL.DOMButtons[i] = 0; } } event.preventDefault(); break; case 'focus': SDL.events.push(event); event.preventDefault(); break; case 'blur': SDL.events.push(event); unpressAllPressedKeys(); event.preventDefault(); break; case 'visibilitychange': SDL.events.push({ type: 'visibilitychange', visible: !document.hidden }); unpressAllPressedKeys(); event.preventDefault(); break; case 'unload': if (Browser.mainLoop.runner) { SDL.events.push(event); // Force-run a main event loop, since otherwise this event will never be caught! Browser.mainLoop.runner(); } return; case 'resize': SDL.events.push(event); // manually triggered resize event doesn't have a preventDefault member if (event.preventDefault) { event.preventDefault(); } break; } if (SDL.events.length >= 10000) { Module.printErr('SDL event queue full, dropping events'); SDL.events = SDL.events.slice(0, 10000); } // If we have a handler installed, this will push the events to the app // instead of the app polling for them. SDL.flushEventsToHandler(); return; },lookupKeyCodeForEvent:function (event) { var code = event.keyCode; if (code >= 65 && code <= 90) { code += 32; // make lowercase for SDL } else { code = SDL.keyCodes[event.keyCode] || event.keyCode; // If this is one of the modifier keys (224 | 1<<10 - 227 | 1<<10), and the event specifies that it is // a right key, add 4 to get the right key SDL key code. if (event.location === KeyboardEvent.DOM_KEY_LOCATION_RIGHT && code >= (224 | 1<<10) && code <= (227 | 1<<10)) { code += 4; } } return code; },handleEvent:function (event) { if (event.handled) return; event.handled = true; switch (event.type) { case 'touchstart': case 'touchend': case 'touchmove': { Browser.calculateMouseEvent(event); break; } case 'keydown': case 'keyup': { var down = event.type === 'keydown'; var code = SDL.lookupKeyCodeForEvent(event); HEAP8[(((SDL.keyboardState)+(code))>>0)]=down; // TODO: lmeta, rmeta, numlock, capslock, KMOD_MODE, KMOD_RESERVED SDL.modState = (HEAP8[(((SDL.keyboardState)+(1248))>>0)] ? 0x0040 : 0) | // KMOD_LCTRL (HEAP8[(((SDL.keyboardState)+(1249))>>0)] ? 0x0001 : 0) | // KMOD_LSHIFT (HEAP8[(((SDL.keyboardState)+(1250))>>0)] ? 0x0100 : 0) | // KMOD_LALT (HEAP8[(((SDL.keyboardState)+(1252))>>0)] ? 0x0080 : 0) | // KMOD_RCTRL (HEAP8[(((SDL.keyboardState)+(1253))>>0)] ? 0x0002 : 0) | // KMOD_RSHIFT (HEAP8[(((SDL.keyboardState)+(1254))>>0)] ? 0x0200 : 0); // KMOD_RALT if (down) { SDL.keyboardMap[code] = event.keyCode; // save the DOM input, which we can use to unpress it during blur } else { delete SDL.keyboardMap[code]; } break; } case 'mousedown': case 'mouseup': if (event.type == 'mousedown') { // SDL_BUTTON(x) is defined as (1 << ((x)-1)). SDL buttons are 1-3, // and DOM buttons are 0-2, so this means that the below formula is // correct. SDL.buttonState |= 1 << event.button; } else if (event.type == 'mouseup') { SDL.buttonState &= ~(1 << event.button); } // fall through case 'mousemove': { Browser.calculateMouseEvent(event); break; } } },flushEventsToHandler:function () { if (!SDL.eventHandler) return; while (SDL.pollEvent(SDL.eventHandlerTemp)) { Module['dynCall_iii'](SDL.eventHandler, SDL.eventHandlerContext, SDL.eventHandlerTemp); } },pollEvent:function (ptr) { if (SDL.initFlags & 0x200 && SDL.joystickEventState) { // If SDL_INIT_JOYSTICK was supplied AND the joystick system is configured // to automatically query for events, query for joystick events. SDL.queryJoysticks(); } if (ptr) { while (SDL.events.length > 0) { if (SDL.makeCEvent(SDL.events.shift(), ptr) !== false) return 1; } return 0; } else { // XXX: somewhat risky in that we do not check if the event is real or not (makeCEvent returns false) if no pointer supplied return SDL.events.length > 0; } },makeCEvent:function (event, ptr) { if (typeof event === 'number') { // This is a pointer to a copy of a native C event that was SDL_PushEvent'ed _memcpy(ptr, event, 28); _free(event); // the copy is no longer needed return; } SDL.handleEvent(event); switch (event.type) { case 'keydown': case 'keyup': { var down = event.type === 'keydown'; //Module.print('Received key event: ' + event.keyCode); var key = SDL.lookupKeyCodeForEvent(event); var scan; if (key >= 1024) { scan = key - 1024; } else { scan = SDL.scanCodes[key] || key; } HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type]; HEAP8[(((ptr)+(8))>>0)]=down ? 1 : 0; HEAP8[(((ptr)+(9))>>0)]=0; // TODO HEAP32[(((ptr)+(12))>>2)]=scan; HEAP32[(((ptr)+(16))>>2)]=key; HEAP16[(((ptr)+(20))>>1)]=SDL.modState; // some non-character keys (e.g. backspace and tab) won't have keypressCharCode set, fill in with the keyCode. HEAP32[(((ptr)+(24))>>2)]=event.keypressCharCode || key; break; } case 'keypress': { HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type]; // Not filling in windowID for now var cStr = intArrayFromString(String.fromCharCode(event.charCode)); for (var i = 0; i < cStr.length; ++i) { HEAP8[(((ptr)+(8 + i))>>0)]=cStr[i]; } break; } case 'mousedown': case 'mouseup': case 'mousemove': { if (event.type != 'mousemove') { var down = event.type === 'mousedown'; HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type]; HEAP32[(((ptr)+(4))>>2)]=0; HEAP32[(((ptr)+(8))>>2)]=0; HEAP32[(((ptr)+(12))>>2)]=0; HEAP8[(((ptr)+(16))>>0)]=event.button+1; // DOM buttons are 0-2, SDL 1-3 HEAP8[(((ptr)+(17))>>0)]=down ? 1 : 0; HEAP32[(((ptr)+(20))>>2)]=Browser.mouseX; HEAP32[(((ptr)+(24))>>2)]=Browser.mouseY; } else { HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type]; HEAP32[(((ptr)+(4))>>2)]=0; HEAP32[(((ptr)+(8))>>2)]=0; HEAP32[(((ptr)+(12))>>2)]=0; HEAP32[(((ptr)+(16))>>2)]=SDL.buttonState; HEAP32[(((ptr)+(20))>>2)]=Browser.mouseX; HEAP32[(((ptr)+(24))>>2)]=Browser.mouseY; HEAP32[(((ptr)+(28))>>2)]=Browser.mouseMovementX; HEAP32[(((ptr)+(32))>>2)]=Browser.mouseMovementY; } break; } case 'wheel': { HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type]; HEAP32[(((ptr)+(16))>>2)]=event.deltaX; HEAP32[(((ptr)+(20))>>2)]=event.deltaY; break; } case 'touchstart': case 'touchend': case 'touchmove': { var touch = event.touch; if (!Browser.touches[touch.identifier]) break; var w = Module['canvas'].width; var h = Module['canvas'].height; var x = Browser.touches[touch.identifier].x / w; var y = Browser.touches[touch.identifier].y / h; var lx = Browser.lastTouches[touch.identifier].x / w; var ly = Browser.lastTouches[touch.identifier].y / h; var dx = x - lx; var dy = y - ly; if (touch['deviceID'] === undefined) touch.deviceID = SDL.TOUCH_DEFAULT_ID; if (dx === 0 && dy === 0 && event.type === 'touchmove') return false; // don't send these if nothing happened HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type]; HEAP32[(((ptr)+(4))>>2)]=_SDL_GetTicks(); (tempI64 = [touch.deviceID>>>0,(tempDouble=touch.deviceID,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((ptr)+(8))>>2)]=tempI64[0],HEAP32[(((ptr)+(12))>>2)]=tempI64[1]); (tempI64 = [touch.identifier>>>0,(tempDouble=touch.identifier,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((ptr)+(16))>>2)]=tempI64[0],HEAP32[(((ptr)+(20))>>2)]=tempI64[1]); HEAPF32[(((ptr)+(24))>>2)]=x; HEAPF32[(((ptr)+(28))>>2)]=y; HEAPF32[(((ptr)+(32))>>2)]=dx; HEAPF32[(((ptr)+(36))>>2)]=dy; if (touch.force !== undefined) { HEAPF32[(((ptr)+(40))>>2)]=touch.force; } else { // No pressure data, send a digital 0/1 pressure. HEAPF32[(((ptr)+(40))>>2)]=event.type == "touchend" ? 0 : 1; } break; } case 'unload': { HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type]; break; } case 'resize': { HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type]; HEAP32[(((ptr)+(4))>>2)]=event.w; HEAP32[(((ptr)+(8))>>2)]=event.h; break; } case 'joystick_button_up': case 'joystick_button_down': { var state = event.type === 'joystick_button_up' ? 0 : 1; HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type]; HEAP8[(((ptr)+(4))>>0)]=event.index; HEAP8[(((ptr)+(5))>>0)]=event.button; HEAP8[(((ptr)+(6))>>0)]=state; break; } case 'joystick_axis_motion': { HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type]; HEAP8[(((ptr)+(4))>>0)]=event.index; HEAP8[(((ptr)+(5))>>0)]=event.axis; HEAP32[(((ptr)+(8))>>2)]=SDL.joystickAxisValueConversion(event.value); break; } case 'focus': { var SDL_WINDOWEVENT_FOCUS_GAINED = 12 /* SDL_WINDOWEVENT_FOCUS_GAINED */; HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type]; HEAP32[(((ptr)+(4))>>2)]=0; HEAP8[(((ptr)+(8))>>0)]=SDL_WINDOWEVENT_FOCUS_GAINED; break; } case 'blur': { var SDL_WINDOWEVENT_FOCUS_LOST = 13 /* SDL_WINDOWEVENT_FOCUS_LOST */; HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type]; HEAP32[(((ptr)+(4))>>2)]=0; HEAP8[(((ptr)+(8))>>0)]=SDL_WINDOWEVENT_FOCUS_LOST; break; } case 'visibilitychange': { var SDL_WINDOWEVENT_SHOWN = 1 /* SDL_WINDOWEVENT_SHOWN */; var SDL_WINDOWEVENT_HIDDEN = 2 /* SDL_WINDOWEVENT_HIDDEN */; var visibilityEventID = event.visible ? SDL_WINDOWEVENT_SHOWN : SDL_WINDOWEVENT_HIDDEN; HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type]; HEAP32[(((ptr)+(4))>>2)]=0; HEAP8[(((ptr)+(8))>>0)]=visibilityEventID; break; } default: throw 'Unhandled SDL event: ' + event.type; } },estimateTextWidth:function (fontData, text) { var h = fontData.size; var fontString = h + 'px ' + fontData.name; var tempCtx = SDL.ttfContext; tempCtx.save(); tempCtx.font = fontString; var ret = tempCtx.measureText(text).width | 0; tempCtx.restore(); return ret; },allocateChannels:function (num) { // called from Mix_AllocateChannels and init if (SDL.numChannels && SDL.numChannels >= num && num != 0) return; SDL.numChannels = num; SDL.channels = []; for (var i = 0; i < num; i++) { SDL.channels[i] = { audio: null, volume: 1.0 }; } },setGetVolume:function (info, volume) { if (!info) return 0; var ret = info.volume * 128; // MIX_MAX_VOLUME if (volume != -1) { info.volume = Math.min(Math.max(volume, 0), 128) / 128; if (info.audio) { try { info.audio.volume = info.volume; // For <audio> element if (info.audio.webAudioGainNode) info.audio.webAudioGainNode['gain']['value'] = info.volume; // For WebAudio playback } catch(e) { Module.printErr('setGetVolume failed to set audio volume: ' + e); } } } return ret; },setPannerPosition:function (info, x, y, z) { if (!info) return; if (info.audio) { if (info.audio.webAudioPannerNode) { info.audio.webAudioPannerNode['setPosition'](x, y, z); } } },playWebAudio:function (audio) { if (!audio) return; if (audio.webAudioNode) return; // This instance is already playing, don't start again. if (!SDL.webAudioAvailable()) return; try { var webAudio = audio.resource.webAudio; audio.paused = false; if (!webAudio.decodedBuffer) { if (webAudio.onDecodeComplete === undefined) abort("Cannot play back audio object that was not loaded"); webAudio.onDecodeComplete.push(function() { if (!audio.paused) SDL.playWebAudio(audio); }); return; } audio.webAudioNode = SDL.audioContext['createBufferSource'](); audio.webAudioNode['buffer'] = webAudio.decodedBuffer; audio.webAudioNode['loop'] = audio.loop; audio.webAudioNode['onended'] = function() { audio['onended'](); } // For <media> element compatibility, route the onended signal to the instance. audio.webAudioPannerNode = SDL.audioContext['createPanner'](); audio.webAudioPannerNode['panningModel'] = 'equalpower'; // Add an intermediate gain node to control volume. audio.webAudioGainNode = SDL.audioContext['createGain'](); audio.webAudioGainNode['gain']['value'] = audio.volume; audio.webAudioNode['connect'](audio.webAudioPannerNode); audio.webAudioPannerNode['connect'](audio.webAudioGainNode); audio.webAudioGainNode['connect'](SDL.audioContext['destination']); audio.webAudioNode['start'](0, audio.currentPosition); audio.startTime = SDL.audioContext['currentTime'] - audio.currentPosition; } catch(e) { Module.printErr('playWebAudio failed: ' + e); } },pauseWebAudio:function (audio) { if (!audio) return; if (audio.webAudioNode) { try { // Remember where we left off, so that if/when we resume, we can restart the playback at a proper place. audio.currentPosition = (SDL.audioContext['currentTime'] - audio.startTime) % audio.resource.webAudio.decodedBuffer.duration; // Important: When we reach here, the audio playback is stopped by the user. But when calling .stop() below, the Web Audio // graph will send the onended signal, but we don't want to process that, since pausing should not clear/destroy the audio // channel. audio.webAudioNode['onended'] = undefined; audio.webAudioNode.stop(0); // 0 is a default parameter, but WebKit is confused by it #3861 audio.webAudioNode = undefined; } catch(e) { Module.printErr('pauseWebAudio failed: ' + e); } } audio.paused = true; },openAudioContext:function () { // Initialize Web Audio API if we haven't done so yet. Note: Only initialize Web Audio context ever once on the web page, // since initializing multiple times fails on Chrome saying 'audio resources have been exhausted'. if (!SDL.audioContext) { if (typeof(AudioContext) !== 'undefined') SDL.audioContext = new AudioContext(); else if (typeof(webkitAudioContext) !== 'undefined') SDL.audioContext = new webkitAudioContext(); } },webAudioAvailable:function () { return !!SDL.audioContext; },fillWebAudioBufferFromHeap:function (heapPtr, sizeSamplesPerChannel, dstAudioBuffer) { // The input audio data is interleaved across the channels, i.e. [L, R, L, R, L, R, ...] and is either 8-bit or 16-bit as // supported by the SDL API. The output audio wave data for Web Audio API must be in planar buffers of [-1,1]-normalized Float32 data, // so perform a buffer conversion for the data. var numChannels = SDL.audio.channels; for(var c = 0; c < numChannels; ++c) { var channelData = dstAudioBuffer['getChannelData'](c); if (channelData.length != sizeSamplesPerChannel) { throw 'Web Audio output buffer length mismatch! Destination size: ' + channelData.length + ' samples vs expected ' + sizeSamplesPerChannel + ' samples!'; } if (SDL.audio.format == 0x8010 /*AUDIO_S16LSB*/) { for(var j = 0; j < sizeSamplesPerChannel; ++j) { channelData[j] = (HEAP16[(((heapPtr)+((j*numChannels + c)*2))>>1)]) / 0x8000; } } else if (SDL.audio.format == 0x0008 /*AUDIO_U8*/) { for(var j = 0; j < sizeSamplesPerChannel; ++j) { var v = (HEAP8[(((heapPtr)+(j*numChannels + c))>>0)]); channelData[j] = ((v >= 0) ? v-128 : v+128) /128; } } } },debugSurface:function (surfData) { console.log('dumping surface ' + [surfData.surf, surfData.source, surfData.width, surfData.height]); var image = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height); var data = image.data; var num = Math.min(surfData.width, surfData.height); for (var i = 0; i < num; i++) { console.log(' diagonal ' + i + ':' + [data[i*surfData.width*4 + i*4 + 0], data[i*surfData.width*4 + i*4 + 1], data[i*surfData.width*4 + i*4 + 2], data[i*surfData.width*4 + i*4 + 3]]); } },joystickEventState:1,lastJoystickState:{},joystickNamePool:{},recordJoystickState:function (joystick, state) { // Standardize button state. var buttons = new Array(state.buttons.length); for (var i = 0; i < state.buttons.length; i++) { buttons[i] = SDL.getJoystickButtonState(state.buttons[i]); } SDL.lastJoystickState[joystick] = { buttons: buttons, axes: state.axes.slice(0), timestamp: state.timestamp, index: state.index, id: state.id }; },getJoystickButtonState:function (button) { if (typeof button === 'object') { // Current gamepad API editor's draft (Firefox Nightly) // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#idl-def-GamepadButton return button.pressed; } else { // Current gamepad API working draft (Firefox / Chrome Stable) // http://www.w3.org/TR/2012/WD-gamepad-20120529/#gamepad-interface return button > 0; } },queryJoysticks:function () { for (var joystick in SDL.lastJoystickState) { var state = SDL.getGamepad(joystick - 1); var prevState = SDL.lastJoystickState[joystick]; // Check only if the timestamp has differed. // NOTE: Timestamp is not available in Firefox. if (typeof state.timestamp !== 'number' || state.timestamp !== prevState.timestamp) { var i; for (i = 0; i < state.buttons.length; i++) { var buttonState = SDL.getJoystickButtonState(state.buttons[i]); // NOTE: The previous state already has a boolean representation of // its button, so no need to standardize its button state here. if (buttonState !== prevState.buttons[i]) { // Insert button-press event. SDL.events.push({ type: buttonState ? 'joystick_button_down' : 'joystick_button_up', joystick: joystick, index: joystick - 1, button: i }); } } for (i = 0; i < state.axes.length; i++) { if (state.axes[i] !== prevState.axes[i]) { // Insert axes-change event. SDL.events.push({ type: 'joystick_axis_motion', joystick: joystick, index: joystick - 1, axis: i, value: state.axes[i] }); } } SDL.recordJoystickState(joystick, state); } } },joystickAxisValueConversion:function (value) { // Make sure value is properly clamped value = Math.min(1, Math.max(value, -1)); // Ensures that 0 is 0, 1 is 32767, and -1 is 32768. return Math.ceil(((value+1) * 32767.5) - 32768); },getGamepads:function () { var fcn = navigator.getGamepads || navigator.webkitGamepads || navigator.mozGamepads || navigator.gamepads || navigator.webkitGetGamepads; if (fcn !== undefined) { // The function must be applied on the navigator object. return fcn.apply(navigator); } else { return []; } },getGamepad:function (deviceIndex) { var gamepads = SDL.getGamepads(); if (gamepads.length > deviceIndex && deviceIndex >= 0) { return gamepads[deviceIndex]; } return null; }};function _SDL_GL_SwapBuffers() { if (Browser.doSwapBuffers) Browser.doSwapBuffers(); // in workers, this is used to send out a buffered frame } function _glUniform1iv(location, count, value) { location = GL.uniforms[location]; value = HEAP32.subarray((value)>>2,(value+count*4)>>2); GLctx.uniform1iv(location, value); } function _emscripten_glGetVertexAttribiv(index, pname, params) { // N.B. This function may only be called if the vertex attribute was specified using the function glVertexAttrib*f(), // otherwise the results are undefined. (GLES3 spec 6.1.12) emscriptenWebGLGetVertexAttrib(index, pname, params, 'FloatToInteger'); } function _glReadBuffer(x0) { GLctx['readBuffer'](x0) } function _glDrawArraysInstanced(mode, first, count, primcount) { GLctx['drawArraysInstanced'](mode, first, count, primcount); } function _glGenerateMipmap(x0) { GLctx['generateMipmap'](x0) } function _emscripten_glGetPointerv() { Module['printErr']('missing function: emscripten_glGetPointerv'); abort(-1); } function ___syscall140(which, varargs) {SYSCALLS.varargs = varargs; try { // llseek var stream = SYSCALLS.getStreamFromFD(), offset_high = SYSCALLS.get(), offset_low = SYSCALLS.get(), result = SYSCALLS.get(), whence = SYSCALLS.get(); var offset = offset_low; assert(offset_high === 0); FS.llseek(stream, offset, whence); HEAP32[((result)>>2)]=stream.position; if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function ___syscall268(which, varargs) {SYSCALLS.varargs = varargs; try { // statfs64 var path = SYSCALLS.getStr(), size = SYSCALLS.get(), buf = SYSCALLS.get(); assert(size === 64); // NOTE: None of the constants here are true. We're just returning safe and // sane values. HEAP32[(((buf)+(4))>>2)]=4096; HEAP32[(((buf)+(40))>>2)]=4096; HEAP32[(((buf)+(8))>>2)]=1000000; HEAP32[(((buf)+(12))>>2)]=500000; HEAP32[(((buf)+(16))>>2)]=500000; HEAP32[(((buf)+(20))>>2)]=FS.nextInode; HEAP32[(((buf)+(24))>>2)]=1000000; HEAP32[(((buf)+(28))>>2)]=42; HEAP32[(((buf)+(44))>>2)]=2; // ST_NOSUID HEAP32[(((buf)+(36))>>2)]=255; return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function ___syscall146(which, varargs) {SYSCALLS.varargs = varargs; try { // writev var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get(); return SYSCALLS.doWritev(stream, iov, iovcnt); } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _IsMobileOS() { return UnityLoader.SystemInfo.mobile; } function ___syscall145(which, varargs) {SYSCALLS.varargs = varargs; try { // readv var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get(); return SYSCALLS.doReadv(stream, iov, iovcnt); } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _emscripten_glStencilFuncSeparate(x0, x1, x2, x3) { GLctx['stencilFuncSeparate'](x0, x1, x2, x3) } function emscriptenWebGLGetBufferBinding(target) { switch(target) { case 0x8892 /*GL_ARRAY_BUFFER*/: target = 0x8894 /*GL_ARRAY_BUFFER_BINDING*/; break; case 0x8893 /*GL_ELEMENT_ARRAY_BUFFER*/: target = 0x8895 /*GL_ELEMENT_ARRAY_BUFFER_BINDING*/; break; case 0x88EB /*GL_PIXEL_PACK_BUFFER*/: target = 0x88ED /*GL_PIXEL_PACK_BUFFER_BINDING*/; break; case 0x88EC /*GL_PIXEL_UNPACK_BUFFER*/: target = 0x88EF /*GL_PIXEL_UNPACK_BUFFER_BINDING*/; break; case 0x8C8E /*GL_TRANSFORM_FEEDBACK_BUFFER*/: target = 0x8C8F /*GL_TRANSFORM_FEEDBACK_BUFFER_BINDING*/; break; case 0x8F36 /*GL_COPY_READ_BUFFER*/: target = 0x8F36 /*GL_COPY_READ_BUFFER_BINDING*/; break; case 0x8F37 /*GL_COPY_WRITE_BUFFER*/: target = 0x8F37 /*GL_COPY_WRITE_BUFFER_BINDING*/; break; case 0x8A11 /*GL_UNIFORM_BUFFER*/: target = 0x8A28 /*GL_UNIFORM_BUFFER_BINDING*/; break; // In default case, fall through and assume passed one of the _BINDING enums directly. } var buffer = GLctx.getParameter(target); if (buffer) return buffer.name|0; else return 0; } function emscriptenWebGLValidateMapBufferTarget(target) { switch (target) { case 0x8892: // GL_ARRAY_BUFFER case 0x8893: // GL_ELEMENT_ARRAY_BUFFER case 0x8F36: // GL_COPY_READ_BUFFER case 0x8F37: // GL_COPY_WRITE_BUFFER case 0x88EB: // GL_PIXEL_PACK_BUFFER case 0x88EC: // GL_PIXEL_UNPACK_BUFFER case 0x8C2A: // GL_TEXTURE_BUFFER case 0x8C8E: // GL_TRANSFORM_FEEDBACK_BUFFER case 0x8A11: // GL_UNIFORM_BUFFER return true; default: return false; } }function _glUnmapBuffer(target) { if (!emscriptenWebGLValidateMapBufferTarget(target)) { GL.recordError(0x0500/*GL_INVALID_ENUM*/); Module.printErr('GL_INVALID_ENUM in glUnmapBuffer'); return 0; } var buffer = emscriptenWebGLGetBufferBinding(target); var mapping = GL.mappedBuffers[buffer]; if (!mapping) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); Module.printError('buffer was never mapped in glUnmapBuffer'); return 0; } GL.mappedBuffers[buffer] = null; if (!(mapping.access & 0x10)) /* GL_MAP_FLUSH_EXPLICIT_BIT */ GLctx.bufferSubData(target, mapping.offset, HEAPU8.subarray(mapping.mem, mapping.mem+mapping.length)); _free(mapping.mem); return 1; } function ___cxa_find_matching_catch() { var thrown = EXCEPTIONS.last; if (!thrown) { // just pass through the null ptr return ((asm["setTempRet0"](0),0)|0); } var info = EXCEPTIONS.infos[thrown]; var throwntype = info.type; if (!throwntype) { // just pass through the thrown ptr return ((asm["setTempRet0"](0),thrown)|0); } var typeArray = Array.prototype.slice.call(arguments); var pointer = Module['___cxa_is_pointer_type'](throwntype); // can_catch receives a **, add indirection if (!___cxa_find_matching_catch.buffer) ___cxa_find_matching_catch.buffer = _malloc(4); HEAP32[((___cxa_find_matching_catch.buffer)>>2)]=thrown; thrown = ___cxa_find_matching_catch.buffer; // The different catch blocks are denoted by different types. // Due to inheritance, those types may not precisely match the // type of the thrown object. Find one which matches, and // return the type of the catch block which should be called. for (var i = 0; i < typeArray.length; i++) { if (typeArray[i] && Module['___cxa_can_catch'](typeArray[i], throwntype, thrown)) { thrown = HEAP32[((thrown)>>2)]; // undo indirection info.adjusted = thrown; return ((asm["setTempRet0"](typeArray[i]),thrown)|0); } } // Shouldn't happen unless we have bogus data in typeArray // or encounter a type for which emscripten doesn't have suitable // typeinfo defined. Best-efforts match just in case. thrown = HEAP32[((thrown)>>2)]; // undo indirection return ((asm["setTempRet0"](throwntype),thrown)|0); }function ___cxa_throw(ptr, type, destructor) { EXCEPTIONS.infos[ptr] = { ptr: ptr, adjusted: ptr, type: type, destructor: destructor, refcount: 0, caught: false, rethrown: false }; EXCEPTIONS.last = ptr; if (!("uncaught_exception" in __ZSt18uncaught_exceptionv)) { __ZSt18uncaught_exceptionv.uncaught_exception = 1; } else { __ZSt18uncaught_exceptionv.uncaught_exception++; } throw ptr; } function _emscripten_set_touchend_callback(target, userData, useCapture, callbackfunc) { JSEvents.registerTouchEventCallback(target, userData, useCapture, callbackfunc, 23, "touchend"); return 0; } function _glUseProgram(program) { GLctx.useProgram(program ? GL.programs[program] : null); } function _emscripten_glDisableVertexAttribArray(index) { GLctx.disableVertexAttribArray(index); } function _glBindRenderbuffer(target, renderbuffer) { GLctx.bindRenderbuffer(target, renderbuffer ? GL.renderbuffers[renderbuffer] : null); } function _emscripten_glGenRenderbuffers(n, renderbuffers) { for (var i = 0; i < n; i++) { var renderbuffer = GLctx.createRenderbuffer(); if (!renderbuffer) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); while(i < n) HEAP32[(((renderbuffers)+(i++*4))>>2)]=0; return; } var id = GL.getNewId(GL.renderbuffers); renderbuffer.name = id; GL.renderbuffers[id] = renderbuffer; HEAP32[(((renderbuffers)+(i*4))>>2)]=id; } } function _emscripten_glBlendEquation(x0) { GLctx['blendEquation'](x0) } function ___syscall3(which, varargs) {SYSCALLS.varargs = varargs; try { // read var stream = SYSCALLS.getStreamFromFD(), buf = SYSCALLS.get(), count = SYSCALLS.get(); return FS.read(stream, HEAP8,buf, count); } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _emscripten_glDepthFunc(x0) { GLctx['depthFunc'](x0) } function _emscripten_set_deviceorientation_callback(userData, useCapture, callbackfunc) { JSEvents.registerDeviceOrientationEventCallback(window, userData, useCapture, callbackfunc, 16, "deviceorientation"); return 0; } function _emscripten_glUniform4iv(location, count, value) { location = GL.uniforms[location]; count *= 4; value = HEAP32.subarray((value)>>2,(value+count*4)>>2); GLctx.uniform4iv(location, value); } function _glVertexAttrib4fv(index, v) { var view = GL.miniTempBufferViews[3]; view[0] = HEAPF32[v >> 2]; view[1] = HEAPF32[v + 4 >> 2]; view[2] = HEAPF32[v + 8 >> 2]; view[3] = HEAPF32[v + 12 >> 2]; GLctx.vertexAttrib4fv(index, view); } function _emscripten_glLoadIdentity(){ throw 'Legacy GL function (glLoadIdentity) called. If you want legacy GL emulation, you need to compile with -s LEGACY_GL_EMULATION=1 to enable legacy GL emulation.'; } function _emscripten_glVertexAttribDivisor(index, divisor) { GLctx['vertexAttribDivisor'](index, divisor); } function _glActiveTexture(x0) { GLctx['activeTexture'](x0) } function _glEnableVertexAttribArray(index) { GLctx.enableVertexAttribArray(index); } function _glReadPixels(x, y, width, height, format, type, pixels) { var pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, format); if (!pixelData) { GL.recordError(0x0500/*GL_INVALID_ENUM*/); return; } GLctx.readPixels(x, y, width, height, format, type, pixelData); } function _emscripten_glDrawElementsInstanced(mode, count, type, indices, primcount) { GLctx['drawElementsInstanced'](mode, count, type, indices, primcount); } function _emscripten_glGetRenderbufferParameteriv(target, pname, params) { if (!params) { // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense // if params == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } HEAP32[((params)>>2)]=GLctx.getRenderbufferParameter(target, pname); } function _glUniformMatrix3fv(location, count, transpose, value) { location = GL.uniforms[location]; var view; if (9*count <= GL.MINI_TEMP_BUFFER_SIZE) { // avoid allocation when uploading few enough uniforms view = GL.miniTempBufferViews[9*count-1]; for (var i = 0; i < 9*count; i += 9) { view[i] = HEAPF32[(((value)+(4*i))>>2)]; view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)]; view[i+4] = HEAPF32[(((value)+(4*i+16))>>2)]; view[i+5] = HEAPF32[(((value)+(4*i+20))>>2)]; view[i+6] = HEAPF32[(((value)+(4*i+24))>>2)]; view[i+7] = HEAPF32[(((value)+(4*i+28))>>2)]; view[i+8] = HEAPF32[(((value)+(4*i+32))>>2)]; } } else { view = HEAPF32.subarray((value)>>2,(value+count*36)>>2); } GLctx.uniformMatrix3fv(location, !!transpose, view); } function _emscripten_glUniform4f(location, v0, v1, v2, v3) { location = GL.uniforms[location]; GLctx.uniform4f(location, v0, v1, v2, v3); } function _emscripten_webgl_create_context(target, attributes) { var contextAttributes = {}; contextAttributes['alpha'] = !!HEAP32[((attributes)>>2)]; contextAttributes['depth'] = !!HEAP32[(((attributes)+(4))>>2)]; contextAttributes['stencil'] = !!HEAP32[(((attributes)+(8))>>2)]; contextAttributes['antialias'] = !!HEAP32[(((attributes)+(12))>>2)]; contextAttributes['premultipliedAlpha'] = !!HEAP32[(((attributes)+(16))>>2)]; contextAttributes['preserveDrawingBuffer'] = !!HEAP32[(((attributes)+(20))>>2)]; contextAttributes['preferLowPowerToHighPerformance'] = !!HEAP32[(((attributes)+(24))>>2)]; contextAttributes['failIfMajorPerformanceCaveat'] = !!HEAP32[(((attributes)+(28))>>2)]; contextAttributes['majorVersion'] = HEAP32[(((attributes)+(32))>>2)]; contextAttributes['minorVersion'] = HEAP32[(((attributes)+(36))>>2)]; var enableExtensionsByDefault = HEAP32[(((attributes)+(40))>>2)]; contextAttributes['explicitSwapControl'] = HEAP32[(((attributes)+(44))>>2)]; target = Pointer_stringify(target); var canvas; if ((!target || target === '#canvas') && Module['canvas']) { canvas = Module['canvas'].id ? (GL.offscreenCanvases[Module['canvas'].id] || JSEvents.findEventTarget(Module['canvas'].id)) : Module['canvas']; } else { canvas = GL.offscreenCanvases[target] || JSEvents.findEventTarget(target); } if (!canvas) { return 0; } if (contextAttributes['explicitSwapControl']) { console.error('emscripten_webgl_create_context failed: explicitSwapControl is not supported, please rebuild with -s OFFSCREENCANVAS_SUPPORT=1 to enable targeting the experimental OffscreenCanvas specification!'); return 0; } var contextHandle = GL.createContext(canvas, contextAttributes); return contextHandle; } function _pthread_cleanup_pop() { assert(_pthread_cleanup_push.level == __ATEXIT__.length, 'cannot pop if something else added meanwhile!'); __ATEXIT__.pop(); _pthread_cleanup_push.level = __ATEXIT__.length; } function _emscripten_glClearStencil(x0) { GLctx['clearStencil'](x0) } function _emscripten_glDetachShader(program, shader) { GLctx.detachShader(GL.programs[program], GL.shaders[shader]); } function _JS_Sound_Stop(channelInstance, delay) { if (WEBAudio.audioWebEnabled == 0) return; var channel = WEBAudio.audioInstances[channelInstance]; // stop sound currently playing. if (channel.source.buffer) { try { channel.source.stop(WEBAudio.audioContext.currentTime + delay); } catch (e) { // when stop() is used more than once for the same source in Safari it causes the following exception: // InvalidStateError: DOM Exception 11: An attempt was made to use an object that is not, or is no longer, usable. channel.source.disconnect(); } if (delay == 0) { // disable callback for this channel when manually stopped. channel.source.onended = function(){}; // recreate channel for future use. channel.setup(); } } } function _emscripten_glDeleteVertexArrays(n, vaos) { for (var i = 0; i < n; i++) { var id = HEAP32[(((vaos)+(i*4))>>2)]; GLctx['deleteVertexArray'](GL.vaos[id]); GL.vaos[id] = null; } } function _pthread_mutex_destroy() {} function _glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding) { program = GL.programs[program]; GLctx['uniformBlockBinding'](program, uniformBlockIndex, uniformBlockBinding); } function _pthread_cond_destroy() { return 0; } function _emscripten_glGenerateMipmap(x0) { GLctx['generateMipmap'](x0) } function _getpwuid(uid) { return 0; // NULL } function _emscripten_glCullFace(x0) { GLctx['cullFace'](x0) } function _emscripten_glUseProgram(program) { GLctx.useProgram(program ? GL.programs[program] : null); } function _emscripten_glUniformMatrix4fv(location, count, transpose, value) { location = GL.uniforms[location]; var view; if (16*count <= GL.MINI_TEMP_BUFFER_SIZE) { // avoid allocation when uploading few enough uniforms view = GL.miniTempBufferViews[16*count-1]; for (var i = 0; i < 16*count; i += 16) { view[i] = HEAPF32[(((value)+(4*i))>>2)]; view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)]; view[i+4] = HEAPF32[(((value)+(4*i+16))>>2)]; view[i+5] = HEAPF32[(((value)+(4*i+20))>>2)]; view[i+6] = HEAPF32[(((value)+(4*i+24))>>2)]; view[i+7] = HEAPF32[(((value)+(4*i+28))>>2)]; view[i+8] = HEAPF32[(((value)+(4*i+32))>>2)]; view[i+9] = HEAPF32[(((value)+(4*i+36))>>2)]; view[i+10] = HEAPF32[(((value)+(4*i+40))>>2)]; view[i+11] = HEAPF32[(((value)+(4*i+44))>>2)]; view[i+12] = HEAPF32[(((value)+(4*i+48))>>2)]; view[i+13] = HEAPF32[(((value)+(4*i+52))>>2)]; view[i+14] = HEAPF32[(((value)+(4*i+56))>>2)]; view[i+15] = HEAPF32[(((value)+(4*i+60))>>2)]; } } else { view = HEAPF32.subarray((value)>>2,(value+count*64)>>2); } GLctx.uniformMatrix4fv(location, !!transpose, view); } function _emscripten_glUniform2fv(location, count, value) { location = GL.uniforms[location]; var view; if (2*count <= GL.MINI_TEMP_BUFFER_SIZE) { // avoid allocation when uploading few enough uniforms view = GL.miniTempBufferViews[2*count-1]; for (var i = 0; i < 2*count; i += 2) { view[i] = HEAPF32[(((value)+(4*i))>>2)]; view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; } } else { view = HEAPF32.subarray((value)>>2,(value+count*8)>>2); } GLctx.uniform2fv(location, view); } function _glGetShaderInfoLog(shader, maxLength, length, infoLog) { var log = GLctx.getShaderInfoLog(GL.shaders[shader]); if (log === null) log = '(unknown error)'; if (maxLength > 0 && infoLog) { var numBytesWrittenExclNull = stringToUTF8(log, infoLog, maxLength); if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull; } else { if (length) HEAP32[((length)>>2)]=0; } } function _emscripten_glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer) { GLctx.framebufferRenderbuffer(target, attachment, renderbuffertarget, GL.renderbuffers[renderbuffer]); } function _emscripten_glDeleteFramebuffers(n, framebuffers) { for (var i = 0; i < n; ++i) { var id = HEAP32[(((framebuffers)+(i*4))>>2)]; var framebuffer = GL.framebuffers[id]; if (!framebuffer) continue; // GL spec: "glDeleteFramebuffers silently ignores 0s and names that do not correspond to existing framebuffer objects". GLctx.deleteFramebuffer(framebuffer); framebuffer.name = 0; GL.framebuffers[id] = null; } } function _emscripten_glUniform2iv(location, count, value) { location = GL.uniforms[location]; count *= 2; value = HEAP32.subarray((value)>>2,(value+count*4)>>2); GLctx.uniform2iv(location, value); } function _emscripten_glVertexAttrib1fv(index, v) { var view = GL.miniTempBufferViews[0]; view[0] = HEAPF32[v >> 2]; GLctx.vertexAttrib1fv(index, view); } var cttz_i8 = allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0], "i8", ALLOC_STATIC);function _llvm_cttz_i32(x) { x = x|0; var ret = 0; ret = ((HEAP8[(((cttz_i8)+(x & 0xff))>>0)])|0); if ((ret|0) < 8) return ret|0; ret = ((HEAP8[(((cttz_i8)+((x >> 8)&0xff))>>0)])|0); if ((ret|0) < 8) return (ret + 8)|0; ret = ((HEAP8[(((cttz_i8)+((x >> 16)&0xff))>>0)])|0); if ((ret|0) < 8) return (ret + 16)|0; return (((HEAP8[(((cttz_i8)+(x >>> 24))>>0)])|0) + 24)|0; } var _emscripten_asm_const_int=true; function _glGenBuffers(n, buffers) { for (var i = 0; i < n; i++) { var buffer = GLctx.createBuffer(); if (!buffer) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); while(i < n) HEAP32[(((buffers)+(i++*4))>>2)]=0; return; } var id = GL.getNewId(GL.buffers); buffer.name = id; GL.buffers[id] = buffer; HEAP32[(((buffers)+(i*4))>>2)]=id; } } function _emscripten_glBindVertexArray(vao) { GLctx['bindVertexArray'](GL.vaos[vao]); } function _glCreateProgram() { var id = GL.getNewId(GL.programs); var program = GLctx.createProgram(); program.name = id; GL.programs[id] = program; return id; } function _glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, data) { GLctx['texImage3D'](target, level, internalFormat, width, height, depth, border, format, type, HEAPU8.subarray(data)); } function _emscripten_glGetBufferParameteriv(target, value, data) { if (!data) { // GLES2 specification does not specify how to behave if data is a null pointer. Since calling this function does not make sense // if data == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } HEAP32[((data)>>2)]=GLctx.getBufferParameter(target, value); } function _emscripten_glGetUniformiv(program, location, params) { emscriptenWebGLGetUniform(program, location, params, 'Integer'); } function _JS_SystemInfo_GetBrowserVersionString(buffer, bufferSize) { var browserVer = UnityLoader.SystemInfo.browserVersion; if (buffer) stringToUTF8(browserVer, buffer, bufferSize); return lengthBytesUTF8(browserVer); } function _pthread_cond_wait() { return 0; } function _JS_WebRequest_SetRequestHeader(request, header, value) { var _header = Pointer_stringify(header); var _value = Pointer_stringify(value); wr.requestInstances[request].setRequestHeader(_header, _value); } function _JS_Sound_Load(ptr, length) { if (WEBAudio.audioWebEnabled == 0) return 0; var sound = { buffer: null, error: false }; var instance = WEBAudio.audioInstances.push(sound) - 1; WEBAudio.audioContext.decodeAudioData( HEAPU8.buffer.slice(ptr, ptr+length), function(buffer) { sound.buffer = buffer; }, function () { sound.error = true; console.log ("Decode error."); } ); return instance; } function _JS_Eval_ClearTimeout(id) { window.clearTimeout(id); } function _emscripten_glUniform1fv(location, count, value) { location = GL.uniforms[location]; var view; if (count <= GL.MINI_TEMP_BUFFER_SIZE) { // avoid allocation when uploading few enough uniforms view = GL.miniTempBufferViews[count-1]; for (var i = 0; i < count; ++i) { view[i] = HEAPF32[(((value)+(4*i))>>2)]; } } else { view = HEAPF32.subarray((value)>>2,(value+count*4)>>2); } GLctx.uniform1fv(location, view); } function _glDeleteBuffers(n, buffers) { for (var i = 0; i < n; i++) { var id = HEAP32[(((buffers)+(i*4))>>2)]; var buffer = GL.buffers[id]; // From spec: "glDeleteBuffers silently ignores 0's and names that do not // correspond to existing buffer objects." if (!buffer) continue; GLctx.deleteBuffer(buffer); buffer.name = 0; GL.buffers[id] = null; if (id == GL.currArrayBuffer) GL.currArrayBuffer = 0; if (id == GL.currElementArrayBuffer) GL.currElementArrayBuffer = 0; } } function _glScissor(x0, x1, x2, x3) { GLctx['scissor'](x0, x1, x2, x3) } function _JS_SystemInfo_GetLanguage(buffer, bufferSize) { var language = UnityLoader.SystemInfo.language; if (buffer) stringToUTF8(language, buffer, bufferSize); return lengthBytesUTF8(language); } function _emscripten_glCheckFramebufferStatus(x0) { return GLctx['checkFramebufferStatus'](x0) } function _emscripten_glDeleteProgram(id) { if (!id) return; var program = GL.programs[id]; if (!program) { // glDeleteProgram actually signals an error when deleting a nonexisting object, unlike some other GL delete functions. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } GLctx.deleteProgram(program); program.name = 0; GL.programs[id] = null; GL.programInfos[id] = null; } function _emscripten_glDisable(x0) { GLctx['disable'](x0) } function _glUniform3uiv(location, count, value) { location = GL.uniforms[location]; count *= 3; value = HEAPU32.subarray((value)>>2,(value+count*4)>>2); GLctx.uniform3uiv(location, value); } function _InitApi(gameKey, userId) { gameKey = Pointer_stringify(gameKey); userId = Pointer_stringify(userId); window["GD_OPTIONS"] = { "debug": false, // Enable debugging console. This will set a value in local storage as well, remove this value if you don't want debugging at all. You can also call it by running gdsdk.openConsole() within your browser console. "gameId": gameKey, // Your gameId which is unique for each one of your games; can be found at your Gamedistribution.com account. "userId": userId, // Your userId which can be found at your Gamedistribution.com account. "onEvent": function(event) { switch (event.name) { case "SDK_GAME_START": SendMessage('GameDistribution', 'ResumeGame'); break; case "SDK_GAME_PAUSE": SendMessage('GameDistribution', 'PauseGame'); break; case "SDK_ERROR": break; } }, }; (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = '//lablockedgames.com/main.min.js'; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'gamedistribution-jssdk')); } function _emscripten_glGetActiveAttrib(program, index, bufSize, length, size, type, name) { program = GL.programs[program]; var info = GLctx.getActiveAttrib(program, index); if (!info) return; // If an error occurs, nothing will be written to length, size and type and name. if (bufSize > 0 && name) { var numBytesWrittenExclNull = stringToUTF8(info.name, name, bufSize); if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull; } else { if (length) HEAP32[((length)>>2)]=0; } if (size) HEAP32[((size)>>2)]=info.size; if (type) HEAP32[((type)>>2)]=info.type; } function _emscripten_glLineWidth(x0) { GLctx['lineWidth'](x0) } function _glGenTextures(n, textures) { for (var i = 0; i < n; i++) { var texture = GLctx.createTexture(); if (!texture) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); // GLES + EGL specs don't specify what should happen here, so best to issue an error and create IDs with 0. while(i < n) HEAP32[(((textures)+(i++*4))>>2)]=0; return; } var id = GL.getNewId(GL.textures); texture.name = id; GL.textures[id] = texture; HEAP32[(((textures)+(i*4))>>2)]=id; } } function _emscripten_glGetString(name_) { if (GL.stringCache[name_]) return GL.stringCache[name_]; var ret; switch(name_) { case 0x1F00 /* GL_VENDOR */: case 0x1F01 /* GL_RENDERER */: case 0x9245 /* UNMASKED_VENDOR_WEBGL */: case 0x9246 /* UNMASKED_RENDERER_WEBGL */: ret = allocate(intArrayFromString(GLctx.getParameter(name_)), 'i8', ALLOC_NORMAL); break; case 0x1F02 /* GL_VERSION */: var glVersion = GLctx.getParameter(GLctx.VERSION); // return GLES version string corresponding to the version of the WebGL context if (GLctx.canvas.GLctxObject.version >= 2) glVersion = 'OpenGL ES 3.0 (' + glVersion + ')'; else { glVersion = 'OpenGL ES 2.0 (' + glVersion + ')'; } ret = allocate(intArrayFromString(glVersion), 'i8', ALLOC_NORMAL); break; case 0x1F03 /* GL_EXTENSIONS */: var exts = GLctx.getSupportedExtensions(); var gl_exts = []; for (var i = 0; i < exts.length; ++i) { gl_exts.push(exts[i]); gl_exts.push("GL_" + exts[i]); } ret = allocate(intArrayFromString(gl_exts.join(' ')), 'i8', ALLOC_NORMAL); break; case 0x8B8C /* GL_SHADING_LANGUAGE_VERSION */: var glslVersion = GLctx.getParameter(GLctx.SHADING_LANGUAGE_VERSION); // extract the version number 'N.M' from the string 'WebGL GLSL ES N.M ...' 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'; // ensure minor version has 2 digits glslVersion = 'OpenGL ES GLSL ES ' + ver_num[1] + ' (' + glslVersion + ')'; } ret = allocate(intArrayFromString(glslVersion), 'i8', ALLOC_NORMAL); break; default: GL.recordError(0x0500/*GL_INVALID_ENUM*/); return 0; } GL.stringCache[name_] = ret; return ret; } function _emscripten_glGetAttribLocation(program, name) { program = GL.programs[program]; name = Pointer_stringify(name); return GLctx.getAttribLocation(program, name); } function _emscripten_glGetIntegerv(name_, p) { emscriptenWebGLGet(name_, p, 'Integer'); } function _glGetStringi(name, index) { if (GLctx.canvas.GLctxObject.version < 2) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); // Calling GLES3/WebGL2 function with a GLES2/WebGL1 context return 0; } var stringiCache = GL.stringiCache[name]; if (stringiCache) { if (index < 0 || index >= stringiCache.length) { GL.recordError(0x0501/*GL_INVALID_VALUE*/); return 0; } return stringiCache[index]; } switch(name) { case 0x1F03 /* GL_EXTENSIONS */: var exts = GLctx.getSupportedExtensions(); var gl_exts = []; // each extension is duplicated, first in unprefixed WebGL form, and then a second time with "GL_" prefix. for (var i = 0; i < exts.length; ++i) { gl_exts.push(allocate(intArrayFromString(exts[i]), 'i8', ALLOC_NORMAL)); gl_exts.push(allocate(intArrayFromString("GL_" + exts[i]), 'i8', ALLOC_NORMAL)); } stringiCache = GL.stringiCache[name] = gl_exts; if (index < 0 || index >= stringiCache.length) { GL.recordError(0x0501/*GL_INVALID_VALUE*/); return 0; } return stringiCache[index]; default: GL.recordError(0x0500/*GL_INVALID_ENUM*/); return 0; } } function _JS_Sound_SetLoop(channelInstance, loop) { if (WEBAudio.audioWebEnabled == 0) return; WEBAudio.audioInstances[channelInstance].source.loop = loop; } function _JS_Sound_Load_PCM(channels, length, sampleRate, ptr) { if (WEBAudio.audioWebEnabled == 0) return 0; var sound = { buffer: WEBAudio.audioContext.createBuffer(channels, length, sampleRate), error: false }; for (var i = 0; i < channels; i++) { var offs = (ptr>>2) + length * i; var buffer = sound.buffer; var copyToChannel = buffer['copyToChannel'] || function (source, channelNumber, startInChannel) { // Shim for copyToChannel on browsers which don't support it like Safari. var clipped = source.subarray(0, Math.min(source.length, this.length - (startInChannel | 0))); this.getChannelData(channelNumber | 0).set(clipped, startInChannel | 0); }; copyToChannel.apply(buffer, [HEAPF32.subarray(offs, offs + length),i, 0]); } var instance = WEBAudio.audioInstances.push(sound) - 1; return instance; } function _glUniform2fv(location, count, value) { location = GL.uniforms[location]; var view; if (2*count <= GL.MINI_TEMP_BUFFER_SIZE) { // avoid allocation when uploading few enough uniforms view = GL.miniTempBufferViews[2*count-1]; for (var i = 0; i < 2*count; i += 2) { view[i] = HEAPF32[(((value)+(4*i))>>2)]; view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; } } else { view = HEAPF32.subarray((value)>>2,(value+count*8)>>2); } GLctx.uniform2fv(location, view); } function _JS_Log_StackTrace(buffer, bufferSize) { var trace = stackTrace(); if (buffer) stringToUTF8(trace, buffer, bufferSize); return lengthBytesUTF8(trace); } function _emscripten_glReadPixels(x, y, width, height, format, type, pixels) { var pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, format); if (!pixelData) { GL.recordError(0x0500/*GL_INVALID_ENUM*/); return; } GLctx.readPixels(x, y, width, height, format, type, pixelData); } function __setLetterbox(element, topBottom, leftRight) { if (JSEvents.isInternetExplorer()) { // Cannot use padding on IE11, because IE11 computes padding in addition to the size, unlike // other browsers, which treat padding to be part of the size. // e.g. // FF, Chrome: If CSS size = 1920x1080, padding-leftright = 460, padding-topbottomx40, then content size = (1920 - 2*460) x (1080-2*40) = 1000x1000px, and total element size = 1920x1080px. // IE11: If CSS size = 1920x1080, padding-leftright = 460, padding-topbottomx40, then content size = 1920x1080px and total element size = (1920+2*460) x (1080+2*40)px. // IE11 treats margin like Chrome and FF treat padding. element.style.marginLeft = element.style.marginRight = leftRight + 'px'; element.style.marginTop = element.style.marginBottom = topBottom + 'px'; } else { // Cannot use margin to specify letterboxes in FF or Chrome, since those ignore margins in fullscreen mode. element.style.paddingLeft = element.style.paddingRight = leftRight + 'px'; element.style.paddingTop = element.style.paddingBottom = topBottom + 'px'; } }function _emscripten_do_request_fullscreen(target, strategy) { if (typeof JSEvents.fullscreenEnabled() === 'undefined') return -1; if (!JSEvents.fullscreenEnabled()) return -3; if (!target) target = '#canvas'; target = JSEvents.findEventTarget(target); if (!target) return -4; if (!target.requestFullscreen && !target.msRequestFullscreen && !target.mozRequestFullScreen && !target.mozRequestFullscreen && !target.webkitRequestFullscreen) { return -3; } var canPerformRequests = JSEvents.canPerformEventHandlerRequests(); // Queue this function call if we're not currently in an event handler and the user saw it appropriate to do so. if (!canPerformRequests) { if (strategy.deferUntilInEventHandler) { JSEvents.deferCall(JSEvents.requestFullscreen, 1 /* priority over pointer lock */, [target, strategy]); return 1; } else { return -2; } } return JSEvents.requestFullscreen(target, strategy); }function _emscripten_request_fullscreen(target, deferUntilInEventHandler) { var strategy = {}; // These options perform no added logic, but just bare request fullscreen. strategy.scaleMode = 0; strategy.canvasResolutionScaleMode = 0; strategy.filteringMode = 0; strategy.deferUntilInEventHandler = deferUntilInEventHandler; return _emscripten_do_request_fullscreen(target, strategy); } function _emscripten_glGetError() { // First return any GL error generated by the emscripten library_gl.js interop layer. if (GL.lastError) { var error = GL.lastError; GL.lastError = 0/*GL_NO_ERROR*/; return error; } else { // If there were none, return the GL error from the browser GL context. return GLctx.getError(); } } function _emscripten_glFramebufferTexture2D(target, attachment, textarget, texture, level) { GLctx.framebufferTexture2D(target, attachment, textarget, GL.textures[texture], level); } function ___syscall39(which, varargs) {SYSCALLS.varargs = varargs; try { // mkdir var path = SYSCALLS.getStr(), mode = SYSCALLS.get(); return SYSCALLS.doMkdir(path, mode); } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function ___syscall38(which, varargs) {SYSCALLS.varargs = varargs; try { // rename var old_path = SYSCALLS.getStr(), new_path = SYSCALLS.getStr(); FS.rename(old_path, new_path); return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function ___syscall33(which, varargs) {SYSCALLS.varargs = varargs; try { // access var path = SYSCALLS.getStr(), amode = SYSCALLS.get(); return SYSCALLS.doAccess(path, amode); } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _glClearDepthf(x0) { GLctx['clearDepth'](x0) } function _glGenTransformFeedbacks(n, ids) { for (var i = 0; i < n; i++) { var transformFeedback = GLctx['createTransformFeedback'](); if (!transformFeedback) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); while(i < n) HEAP32[(((ids)+(i++*4))>>2)]=0; return; } var id = GL.getNewId(GL.transformFeedbacks); transformFeedback.name = id; GL.transformFeedbacks[id] = transformFeedback; HEAP32[(((ids)+(i*4))>>2)]=id; } } Module["_memmove"] = _memmove; function ___gxx_personality_v0() { } function _glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data) { var heapView; if (data) { heapView = HEAPU8.subarray((data),(data+imageSize)); } else { heapView = null; } GLctx['compressedTexSubImage2D'](target, level, xoffset, yoffset, width, height, format, heapView); } function _glProgramBinary(program, binaryFormat, binary, length) { GL.recordError(0x0500/*GL_INVALID_ENUM*/); } function _JS_SystemInfo_GetHeight() { return UnityLoader.SystemInfo.height; } function _JS_SystemInfo_GetOS(buffer, bufferSize) { var browser = UnityLoader.SystemInfo.os + " " + UnityLoader.SystemInfo.osVersion; if (buffer) stringToUTF8(browser, buffer, bufferSize); return lengthBytesUTF8(browser); } function ___syscall51(which, varargs) {SYSCALLS.varargs = varargs; try { // acct return -ERRNO_CODES.ENOSYS; // unsupported features } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } }function ___syscall42() { return ___syscall51.apply(null, arguments) } Module["_llvm_ctlz_i64"] = _llvm_ctlz_i64; function _JS_WebRequest_SetResponseHandler(request, arg, onresponse) { var http = wr.requestInstances[request]; // LOAD http.onload = function http_onload(e) { if (onresponse) { var kWebRequestOK = 0; var byteArray = new Uint8Array(http.response); // 200 is successful http request, 0 is returned by non-http requests (file:). if (byteArray.length != 0) { var buffer = _malloc(byteArray.length); HEAPU8.set(byteArray, buffer); Runtime.dynCall('viiiiii', onresponse, [arg, http.status, buffer, byteArray.length, 0, kWebRequestOK]); } else { Runtime.dynCall('viiiiii', onresponse, [arg, http.status, 0, 0, 0, kWebRequestOK]); } } }; function HandleError(err, code) { if (onresponse) { var len = lengthBytesUTF8(err) + 1; var buffer = _malloc(len); stringToUTF8(err, buffer, len); Runtime.dynCall('viiiiii', onresponse, [arg, http.status, 0, 0, buffer, code]); _free(buffer); } } // ERROR http.onerror = function http_onerror(e) { var kWebErrorUnknown = 2; HandleError ("Unknown error.", kWebErrorUnknown); }; http.ontimeout = function http_onerror(e) { var kWebErrorTimeout = 14; HandleError ("Connection timed out.", kWebErrorTimeout); }; http.onabort = function http_onerror(e) { var kWebErrorAborted = 17; HandleError ("Aborted.", kWebErrorAborted); }; } function _JS_SystemInfo_GetWidth() { return UnityLoader.SystemInfo.width; } function _glClientWaitSync(sync, flags, timeoutLo, timeoutHi) { // WebGL2 vs GLES3 differences: in GLES3, the timeout parameter is a uint64, where 0xFFFFFFFFFFFFFFFFULL means GL_TIMEOUT_IGNORED. // In JS, there's no 64-bit value types, so instead timeout is taken to be signed, and GL_TIMEOUT_IGNORED is given value -1. // Inherently the value accepted in the timeout is lossy, and can't take in arbitrary u64 bit pattern (but most likely doesn't matter) // See https://www.khronos.org/registry/webgl/specs/latest/2.0/#5.15 timeoutLo == timeoutLo >>> 0; timeoutHi == timeoutHi >>> 0; var timeout = (timeoutLo == 0xFFFFFFFF && timeoutHi == 0xFFFFFFFF) ? -1 : Runtime.makeBigInt(timeoutLo, timeoutHi, true); return GLctx.clientWaitSync(GL.syncs[sync], flags, timeout); } function _emscripten_glGetUniformfv(program, location, params) { emscriptenWebGLGetUniform(program, location, params, 'Float'); } function _glDepthFunc(x0) { GLctx['depthFunc'](x0) } function _emscripten_exit_pointerlock() { // Make sure no queued up calls will fire after this. JSEvents.removeDeferredCalls(JSEvents.requestPointerLock); if (document.exitPointerLock) { document.exitPointerLock(); } else if (document.msExitPointerLock) { document.msExitPointerLock(); } else if (document.mozExitPointerLock) { document.mozExitPointerLock(); } else if (document.webkitExitPointerLock) { document.webkitExitPointerLock(); } else { return -1; } return 0; } function _emscripten_glBindBuffer(target, buffer) { var bufferObj = buffer ? GL.buffers[buffer] : null; GLctx.bindBuffer(target, bufferObj); } function _glBlendEquation(x0) { GLctx['blendEquation'](x0) } function _glGetUniformLocation(program, name) { name = Pointer_stringify(name); var arrayOffset = 0; // If user passed an array accessor "[index]", parse the array index off the accessor. if (name.indexOf(']', name.length-1) !== -1) { var ls = name.lastIndexOf('['); var arrayIndex = name.slice(ls+1, -1); if (arrayIndex.length > 0) { arrayOffset = parseInt(arrayIndex); if (arrayOffset < 0) { return -1; } } name = name.slice(0, ls); } var ptable = GL.programInfos[program]; if (!ptable) { return -1; } var utable = ptable.uniforms; var uniformInfo = utable[name]; // returns pair [ dimension_of_uniform_array, uniform_location ] if (uniformInfo && arrayOffset < uniformInfo[0]) { // Check if user asked for an out-of-bounds element, i.e. for 'vec4 colors[3];' user could ask for 'colors[10]' which should return -1. return uniformInfo[1]+arrayOffset; } else { return -1; } } function _emscripten_glFinish() { GLctx['finish']() } function _glEndTransformFeedback() { GLctx['endTransformFeedback']() } function _emscripten_glUniform1iv(location, count, value) { location = GL.uniforms[location]; value = HEAP32.subarray((value)>>2,(value+count*4)>>2); GLctx.uniform1iv(location, value); } function _glUniform4fv(location, count, value) { location = GL.uniforms[location]; var view; if (4*count <= GL.MINI_TEMP_BUFFER_SIZE) { // avoid allocation when uploading few enough uniforms view = GL.miniTempBufferViews[4*count-1]; for (var i = 0; i < 4*count; i += 4) { view[i] = HEAPF32[(((value)+(4*i))>>2)]; view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)]; } } else { view = HEAPF32.subarray((value)>>2,(value+count*16)>>2); } GLctx.uniform4fv(location, view); } function _emscripten_glTexCoordPointer() { Module['printErr']('missing function: emscripten_glTexCoordPointer'); abort(-1); } function _glBeginTransformFeedback(x0) { GLctx['beginTransformFeedback'](x0) } function __exit(status) { // void _exit(int status); // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html Module['exit'](status); }function _exit(status) { __exit(status); } function _pthread_setspecific(key, value) { if (!(key in PTHREAD_SPECIFIC)) { return ERRNO_CODES.EINVAL; } PTHREAD_SPECIFIC[key] = value; return 0; } function _emscripten_glVertexAttrib1f(x0, x1) { GLctx['vertexAttrib1f'](x0, x1) } function _glDeleteTransformFeedbacks(n, ids) { for (var i = 0; i < n; i++) { var id = HEAP32[(((ids)+(i*4))>>2)]; var transformFeedback = GL.transformFeedbacks[id]; if (!transformFeedback) continue; // GL spec: "unused names in ids are ignored, as is the name zero." GLctx['deleteTransformFeedback'](transformFeedback); transformFeedback.name = 0; GL.transformFeedbacks[id] = null; } } function _glCheckFramebufferStatus(x0) { return GLctx['checkFramebufferStatus'](x0) } function _gmtime_r(time, tmPtr) { var date = new Date(HEAP32[((time)>>2)]*1000); HEAP32[((tmPtr)>>2)]=date.getUTCSeconds(); HEAP32[(((tmPtr)+(4))>>2)]=date.getUTCMinutes(); HEAP32[(((tmPtr)+(8))>>2)]=date.getUTCHours(); HEAP32[(((tmPtr)+(12))>>2)]=date.getUTCDate(); HEAP32[(((tmPtr)+(16))>>2)]=date.getUTCMonth(); HEAP32[(((tmPtr)+(20))>>2)]=date.getUTCFullYear()-1900; HEAP32[(((tmPtr)+(24))>>2)]=date.getUTCDay(); HEAP32[(((tmPtr)+(36))>>2)]=0; HEAP32[(((tmPtr)+(32))>>2)]=0; var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); var yday = ((date.getTime() - start) / (1000 * 60 * 60 * 24))|0; HEAP32[(((tmPtr)+(28))>>2)]=yday; HEAP32[(((tmPtr)+(40))>>2)]=___tm_timezone; return tmPtr; }function _gmtime(time) { return _gmtime_r(time, ___tm_current); } function _glBindAttribLocation(program, index, name) { name = Pointer_stringify(name); GLctx.bindAttribLocation(GL.programs[program], index, name); } function _emscripten_glShaderBinary() { GL.recordError(0x0500/*GL_INVALID_ENUM*/); } function _emscripten_glBlendColor(x0, x1, x2, x3) { GLctx['blendColor'](x0, x1, x2, x3) } function _emscripten_glVertexAttrib2f(x0, x1, x2) { GLctx['vertexAttrib2f'](x0, x1, x2) } function _emscripten_glUniform4fv(location, count, value) { location = GL.uniforms[location]; var view; if (4*count <= GL.MINI_TEMP_BUFFER_SIZE) { // avoid allocation when uploading few enough uniforms view = GL.miniTempBufferViews[4*count-1]; for (var i = 0; i < 4*count; i += 4) { view[i] = HEAPF32[(((value)+(4*i))>>2)]; view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)]; } } else { view = HEAPF32.subarray((value)>>2,(value+count*16)>>2); } GLctx.uniform4fv(location, view); } function _glBufferSubData(target, offset, size, data) { GLctx.bufferSubData(target, offset, HEAPU8.subarray(data, data+size)); } function _glMapBufferRange(target, offset, length, access) { if (access != 0x1A && access != 0xA) { Module.printErr("glMapBufferRange is only supported when access is MAP_WRITE|INVALIDATE_BUFFER"); return 0; } if (!emscriptenWebGLValidateMapBufferTarget(target)) { GL.recordError(0x0500/*GL_INVALID_ENUM*/); Module.printErr('GL_INVALID_ENUM in glMapBufferRange'); return 0; } var mem = _malloc(length); if (!mem) return 0; GL.mappedBuffers[emscriptenWebGLGetBufferBinding(target)] = { offset: offset, length: length, mem: mem, access: access, }; return mem; } function ___syscall40(which, varargs) {SYSCALLS.varargs = varargs; try { // rmdir var path = SYSCALLS.getStr(); FS.rmdir(path); return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _emscripten_glBindTexture(target, texture) { GLctx.bindTexture(target, texture ? GL.textures[texture] : null); } function _emscripten_glUniform1i(location, v0) { location = GL.uniforms[location]; GLctx.uniform1i(location, v0); } function _emscripten_glVertexAttrib2fv(index, v) { var view = GL.miniTempBufferViews[1]; view[0] = HEAPF32[v >> 2]; view[1] = HEAPF32[v + 4 >> 2]; GLctx.vertexAttrib2fv(index, view); } function _glGetShaderPrecisionFormat(shaderType, precisionType, range, precision) { var result = GLctx.getShaderPrecisionFormat(shaderType, precisionType); HEAP32[((range)>>2)]=result.rangeMin; HEAP32[(((range)+(4))>>2)]=result.rangeMax; HEAP32[((precision)>>2)]=result.precision; } Module["_roundf"] = _roundf; function _emscripten_glDeleteObjectARB() { Module['printErr']('missing function: emscripten_glDeleteObjectARB'); abort(-1); } function _emscripten_set_touchmove_callback(target, userData, useCapture, callbackfunc) { JSEvents.registerTouchEventCallback(target, userData, useCapture, callbackfunc, 24, "touchmove"); return 0; } function _emscripten_glUniform1f(location, v0) { location = GL.uniforms[location]; GLctx.uniform1f(location, v0); } function _emscripten_glVertexAttribPointer(index, size, type, normalized, stride, ptr) { GLctx.vertexAttribPointer(index, size, type, !!normalized, stride, ptr); } function _glShaderSource(shader, count, string, length) { var source = GL.getSource(shader, count, string, length); GLctx.shaderSource(GL.shaders[shader], source); } function _pthread_create() { return 11; } function _emscripten_glGenBuffers(n, buffers) { for (var i = 0; i < n; i++) { var buffer = GLctx.createBuffer(); if (!buffer) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); while(i < n) HEAP32[(((buffers)+(i++*4))>>2)]=0; return; } var id = GL.getNewId(GL.buffers); buffer.name = id; GL.buffers[id] = buffer; HEAP32[(((buffers)+(i*4))>>2)]=id; } } function _emscripten_set_keypress_callback(target, userData, useCapture, callbackfunc) { JSEvents.registerKeyEventCallback(target, userData, useCapture, callbackfunc, 1, "keypress"); return 0; } function _JS_SystemInfo_GetCurrentCanvasHeight() { return Module['canvas'].clientHeight; } var PTHREAD_SPECIFIC_NEXT_KEY=1;function _pthread_key_create(key, destructor) { if (key == 0) { return ERRNO_CODES.EINVAL; } HEAP32[((key)>>2)]=PTHREAD_SPECIFIC_NEXT_KEY; // values start at 0 PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY] = 0; PTHREAD_SPECIFIC_NEXT_KEY++; return 0; } function _glBeginQuery(target, id) { GLctx['beginQuery'](target, id ? GL.queries[id] : null); } function _glGetUniformBlockIndex(program, uniformBlockName) { program = GL.programs[program]; uniformBlockName = Pointer_stringify(uniformBlockName); return GLctx['getUniformBlockIndex'](program, uniformBlockName); } function _glBindBuffer(target, buffer) { var bufferObj = buffer ? GL.buffers[buffer] : null; GLctx.bindBuffer(target, bufferObj); } function _pthread_mutexattr_destroy() {} function ___syscall91(which, varargs) {SYSCALLS.varargs = varargs; try { // munmap var addr = SYSCALLS.get(), len = SYSCALLS.get(); // TODO: support unmmap'ing parts of allocations var info = SYSCALLS.mappings[addr]; if (!info) return 0; if (len === info.len) { var stream = FS.getStream(info.fd); SYSCALLS.doMsync(addr, stream, len, info.flags) FS.munmap(stream); SYSCALLS.mappings[addr] = null; if (info.allocated) { _free(info.malloc); } } return 0; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _pthread_cond_timedwait() { return 0; } function _emscripten_glAttachShader(program, shader) { GLctx.attachShader(GL.programs[program], GL.shaders[shader]); } function _glGetProgramBinary(program, bufSize, length, binaryFormat, binary) { GL.recordError(0x0502/*GL_INVALID_OPERATION*/); } function _glBufferData(target, size, data, usage) { switch (usage) { // fix usages, WebGL only has *_DRAW case 0x88E1: // GL_STREAM_READ case 0x88E2: // GL_STREAM_COPY usage = 0x88E0; // GL_STREAM_DRAW break; case 0x88E5: // GL_STATIC_READ case 0x88E6: // GL_STATIC_COPY usage = 0x88E4; // GL_STATIC_DRAW break; case 0x88E9: // GL_DYNAMIC_READ case 0x88EA: // GL_DYNAMIC_COPY usage = 0x88E8; // GL_DYNAMIC_DRAW break; } if (!data) { GLctx.bufferData(target, size, usage); } else { GLctx.bufferData(target, HEAPU8.subarray(data, data+size), usage); } } function _JS_SystemInfo_GetCurrentCanvasWidth() { return Module['canvas'].clientWidth; } function _glGetError() { // First return any GL error generated by the emscripten library_gl.js interop layer. if (GL.lastError) { var error = GL.lastError; GL.lastError = 0/*GL_NO_ERROR*/; return error; } else { // If there were none, return the GL error from the browser GL context. return GLctx.getError(); } } function _emscripten_glDrawBuffers(n, bufs) { var bufArray = []; for (var i = 0; i < n; i++) bufArray.push(HEAP32[(((bufs)+(i*4))>>2)]); GLctx['drawBuffers'](bufArray); } Module["_pthread_mutex_unlock"] = _pthread_mutex_unlock; function _emscripten_glBindFramebuffer(target, framebuffer) { GLctx.bindFramebuffer(target, framebuffer ? GL.framebuffers[framebuffer] : null); } function _emscripten_glBufferSubData(target, offset, size, data) { GLctx.bufferSubData(target, offset, HEAPU8.subarray(data, data+size)); } function _JS_Cursor_SetShow(show) { Module.canvas.style.cursor = show ? "default" : "none"; } function _emscripten_set_keydown_callback(target, userData, useCapture, callbackfunc) { JSEvents.registerKeyEventCallback(target, userData, useCapture, callbackfunc, 2, "keydown"); return 0; } Module["_sbrk"] = _sbrk; function _glGetIntegerv(name_, p) { emscriptenWebGLGet(name_, p, 'Integer'); } function ___syscall85(which, varargs) {SYSCALLS.varargs = varargs; try { // readlink var path = SYSCALLS.getStr(), buf = SYSCALLS.get(), bufsize = SYSCALLS.get(); return SYSCALLS.doReadlink(path, buf, bufsize); } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _glRenderbufferStorageMultisample(x0, x1, x2, x3, x4) { GLctx['renderbufferStorageMultisample'](x0, x1, x2, x3, x4) } function _difftime(time1, time0) { return time1 - time0; } function _glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels) { var pixelData = null; if (pixels) pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, internalFormat); GLctx.texImage2D(target, level, internalFormat, width, height, border, format, type, pixelData); } function _glStencilMask(x0) { GLctx['stencilMask'](x0) } function _pthread_mutexattr_settype() {} function _glUniform1fv(location, count, value) { location = GL.uniforms[location]; var view; if (count <= GL.MINI_TEMP_BUFFER_SIZE) { // avoid allocation when uploading few enough uniforms view = GL.miniTempBufferViews[count-1]; for (var i = 0; i < count; ++i) { view[i] = HEAPF32[(((value)+(4*i))>>2)]; } } else { view = HEAPF32.subarray((value)>>2,(value+count*4)>>2); } GLctx.uniform1fv(location, view); } function _glGetShaderSource(shader, bufSize, length, source) { var result = GLctx.getShaderSource(GL.shaders[shader]); if (!result) return; // If an error occurs, nothing will be written to length or source. if (bufSize > 0 && source) { var numBytesWrittenExclNull = stringToUTF8(result, source, bufSize); if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull; } else { if (length) HEAP32[((length)>>2)]=0; } } function _JS_Cursor_SetImage(ptr, length) { var binary = ""; for (var i = 0; i < length; i++) binary += String.fromCharCode(HEAPU8[ptr + i]); Module.canvas.style.cursor = "url(data:image/cur;base64," + btoa(binary) + "),default"; } function ___unlock() {} function _JS_SystemInfo_GetGPUInfo(buffer, bufferSize) { var gpuinfo = UnityLoader.SystemInfo.gpu; if (buffer) stringToUTF8(gpuinfo, buffer, bufferSize); return lengthBytesUTF8(gpuinfo); } function _JS_WebRequest_Release(request) { var http = wr.requestInstances[request]; http.onload = null; http.onerror = null; http.ontimeout = null; http.onabort = null; delete http; wr.requestInstances[request] = null; } function _setenv(envname, envval, overwrite) { // int setenv(const char *envname, const char *envval, int overwrite); // http://pubs.opengroup.org/onlinepubs/009695399/functions/setenv.html if (envname === 0) { ___setErrNo(ERRNO_CODES.EINVAL); return -1; } var name = Pointer_stringify(envname); var val = Pointer_stringify(envval); if (name === '' || name.indexOf('=') !== -1) { ___setErrNo(ERRNO_CODES.EINVAL); return -1; } if (ENV.hasOwnProperty(name) && !overwrite) return 0; ENV[name] = val; ___buildEnvironment(ENV); return 0; } function ___cxa_allocate_exception(size) { return _malloc(size); } function _emscripten_glGetProgramiv(program, pname, p) { if (!p) { // GLES2 specification does not specify how to behave if p is a null pointer. Since calling this function does not make sense // if p == null, issue a GL error to notify user about it. GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } if (program >= GL.counter) { GL.recordError(0x0501 /* GL_INVALID_VALUE */); return; } var ptable = GL.programInfos[program]; if (!ptable) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); return; } if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH var log = GLctx.getProgramInfoLog(GL.programs[program]); if (log === null) log = '(unknown error)'; HEAP32[((p)>>2)]=log.length + 1; } else if (pname == 0x8B87 /* GL_ACTIVE_UNIFORM_MAX_LENGTH */) { HEAP32[((p)>>2)]=ptable.maxUniformLength; } else if (pname == 0x8B8A /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */) { if (ptable.maxAttributeLength == -1) { var program = GL.programs[program]; var numAttribs = GLctx.getProgramParameter(program, GLctx.ACTIVE_ATTRIBUTES); ptable.maxAttributeLength = 0; // Spec says if there are no active attribs, 0 must be returned. for (var i = 0; i < numAttribs; ++i) { var activeAttrib = GLctx.getActiveAttrib(program, i); ptable.maxAttributeLength = Math.max(ptable.maxAttributeLength, activeAttrib.name.length+1); } } HEAP32[((p)>>2)]=ptable.maxAttributeLength; } else if (pname == 0x8A35 /* GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */) { if (ptable.maxUniformBlockNameLength == -1) { var program = GL.programs[program]; var numBlocks = GLctx.getProgramParameter(program, GLctx.ACTIVE_UNIFORM_BLOCKS); ptable.maxUniformBlockNameLength = 0; for (var i = 0; i < numBlocks; ++i) { var activeBlockName = GLctx.getActiveUniformBlockName(program, i); ptable.maxUniformBlockNameLength = Math.max(ptable.maxUniformBlockNameLength, activeBlockName.length+1); } } HEAP32[((p)>>2)]=ptable.maxUniformBlockNameLength; } else { HEAP32[((p)>>2)]=GLctx.getProgramParameter(GL.programs[program], pname); } } function _emscripten_glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels) { var pixelData = null; if (pixels) pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, internalFormat); GLctx.texImage2D(target, level, internalFormat, width, height, border, format, type, pixelData); } function _emscripten_glGenVertexArrays(n, arrays) { for (var i = 0; i < n; i++) { var vao = GLctx['createVertexArray'](); if (!vao) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); while(i < n) HEAP32[(((arrays)+(i++*4))>>2)]=0; return; } var id = GL.getNewId(GL.vaos); vao.name = id; GL.vaos[id] = vao; HEAP32[(((arrays)+(i*4))>>2)]=id; } } function _glFlushMappedBufferRange(target, offset, length) { if (!emscriptenWebGLValidateMapBufferTarget(target)) { GL.recordError(0x0500/*GL_INVALID_ENUM*/); Module.printErr('GL_INVALID_ENUM in glFlushMappedBufferRange'); return 0; } var mapping = GL.mappedBuffers[emscriptenWebGLGetBufferBinding(target)]; if (!mapping) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); Module.printError('buffer was never mapped in glFlushMappedBufferRange'); return 0; } if (!(mapping.access & 0x10)) { GL.recordError(0x0502 /* GL_INVALID_OPERATION */); Module.printError('buffer was not mapped with GL_MAP_FLUSH_EXPLICIT_BIT in glFlushMappedBufferRange'); return 0; } if (offset < 0 || length < 0 || offset + length > mapping.length) { GL.recordError(0x0501 /* GL_INVALID_VALUE */); Module.printError('invalid range in glFlushMappedBufferRange'); return 0; } GLctx.bufferSubData( target, mapping.offset, HEAPU8.subarray(mapping.mem + offset, mapping.mem + offset + length)); } function _glCopyBufferSubData(x0, x1, x2, x3, x4) { GLctx['copyBufferSubData'](x0, x1, x2, x3, x4) } function ___syscall183(which, varargs) {SYSCALLS.varargs = varargs; try { // getcwd var buf = SYSCALLS.get(), size = SYSCALLS.get(); if (size === 0) return -ERRNO_CODES.EINVAL; var cwd = FS.cwd(); if (size < cwd.length + 1) return -ERRNO_CODES.ERANGE; writeAsciiToMemory(cwd, buf); return buf; } catch (e) { if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno; } } function _glDepthMask(flag) { GLctx.depthMask(!!flag); } function _llvm_eh_typeid_for(type) { return type; } function _glUniformMatrix4fv(location, count, transpose, value) { location = GL.uniforms[location]; var view; if (16*count <= GL.MINI_TEMP_BUFFER_SIZE) { // avoid allocation when uploading few enough uniforms view = GL.miniTempBufferViews[16*count-1]; for (var i = 0; i < 16*count; i += 16) { view[i] = HEAPF32[(((value)+(4*i))>>2)]; view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)]; view[i+4] = HEAPF32[(((value)+(4*i+16))>>2)]; view[i+5] = HEAPF32[(((value)+(4*i+20))>>2)]; view[i+6] = HEAPF32[(((value)+(4*i+24))>>2)]; view[i+7] = HEAPF32[(((value)+(4*i+28))>>2)]; view[i+8] = HEAPF32[(((value)+(4*i+32))>>2)]; view[i+9] = HEAPF32[(((value)+(4*i+36))>>2)]; view[i+10] = HEAPF32[(((value)+(4*i+40))>>2)]; view[i+11] = HEAPF32[(((value)+(4*i+44))>>2)]; view[i+12] = HEAPF32[(((value)+(4*i+48))>>2)]; view[i+13] = HEAPF32[(((value)+(4*i+52))>>2)]; view[i+14] = HEAPF32[(((value)+(4*i+56))>>2)]; view[i+15] = HEAPF32[(((value)+(4*i+60))>>2)]; } } else { view = HEAPF32.subarray((value)>>2,(value+count*64)>>2); } GLctx.uniformMatrix4fv(location, !!transpose, view); } function _emscripten_glClientActiveTexture() { Module['printErr']('missing function: emscripten_glClientActiveTexture'); abort(-1); } function _glGetActiveUniform(program, index, bufSize, length, size, type, name) { program = GL.programs[program]; var info = GLctx.getActiveUniform(program, index); if (!info) return; // If an error occurs, nothing will be written to length, size, type and name. if (bufSize > 0 && name) { var numBytesWrittenExclNull = stringToUTF8(info.name, name, bufSize); if (length) HEAP32[((length)>>2)]=numBytesWrittenExclNull; } else { if (length) HEAP32[((length)>>2)]=0; } if (size) HEAP32[((size)>>2)]=info.size; if (type) HEAP32[((type)>>2)]=info.type; } function _emscripten_glValidateProgram(program) { GLctx.validateProgram(GL.programs[program]); } function _emscripten_get_main_loop_timing(mode, value) { if (mode) HEAP32[((mode)>>2)]=Browser.mainLoop.timingMode; if (value) HEAP32[((value)>>2)]=Browser.mainLoop.timingValue; } function _JS_WebRequest_SetTimeout(request, timeout) { wr.requestInstances[request].timeout = timeout; } function _glFrontFace(x0) { GLctx['frontFace'](x0) } function _emscripten_webgl_get_current_context() { return GL.currentContext ? GL.currentContext.handle : 0; } function _emscripten_glPixelStorei(pname, param) { if (pname == 0x0D05 /* GL_PACK_ALIGNMENT */) { GL.packAlignment = param; } else if (pname == 0x0cf5 /* GL_UNPACK_ALIGNMENT */) { GL.unpackAlignment = param; } GLctx.pixelStorei(pname, param); } function _emscripten_glDeleteTextures(n, textures) { for (var i = 0; i < n; i++) { var id = HEAP32[(((textures)+(i*4))>>2)]; var texture = GL.textures[id]; if (!texture) continue; // GL spec: "glDeleteTextures silently ignores 0s and names that do not correspond to existing textures". GLctx.deleteTexture(texture); texture.name = 0; GL.textures[id] = null; } } function _glGetString(name_) { if (GL.stringCache[name_]) return GL.stringCache[name_]; var ret; switch(name_) { case 0x1F00 /* GL_VENDOR */: case 0x1F01 /* GL_RENDERER */: case 0x9245 /* UNMASKED_VENDOR_WEBGL */: case 0x9246 /* UNMASKED_RENDERER_WEBGL */: ret = allocate(intArrayFromString(GLctx.getParameter(name_)), 'i8', ALLOC_NORMAL); break; case 0x1F02 /* GL_VERSION */: var glVersion = GLctx.getParameter(GLctx.VERSION); // return GLES version string corresponding to the version of the WebGL context if (GLctx.canvas.GLctxObject.version >= 2) glVersion = 'OpenGL ES 3.0 (' + glVersion + ')'; else { glVersion = 'OpenGL ES 2.0 (' + glVersion + ')'; } ret = allocate(intArrayFromString(glVersion), 'i8', ALLOC_NORMAL); break; case 0x1F03 /* GL_EXTENSIONS */: var exts = GLctx.getSupportedExtensions(); var gl_exts = []; for (var i = 0; i < exts.length; ++i) { gl_exts.push(exts[i]); gl_exts.push("GL_" + exts[i]); } ret = allocate(intArrayFromString(gl_exts.join(' ')), 'i8', ALLOC_NORMAL); break; case 0x8B8C /* GL_SHADING_LANGUAGE_VERSION */: var glslVersion = GLctx.getParameter(GLctx.SHADING_LANGUAGE_VERSION); // extract the version number 'N.M' from the string 'WebGL GLSL ES N.M ...' 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'; // ensure minor version has 2 digits glslVersion = 'OpenGL ES GLSL ES ' + ver_num[1] + ' (' + glslVersion + ')'; } ret = allocate(intArrayFromString(glslVersion), 'i8', ALLOC_NORMAL); break; default: GL.recordError(0x0500/*GL_INVALID_ENUM*/); return 0; } GL.stringCache[name_] = ret; return ret; } var _llvm_nacl_atomic_cmpxchg_i32=undefined; Module["_llvm_bswap_i16"] = _llvm_bswap_i16; function _time(ptr) { var ret = (Date.now()/1000)|0; if (ptr) { HEAP32[((ptr)>>2)]=ret; } return ret; } Module["_pthread_self"] = _pthread_self; function _emscripten_glGetBooleanv(name_, p) { emscriptenWebGLGet(name_, p, 'Boolean'); } function _emscripten_glCompileShader(shader) { GLctx.compileShader(GL.shaders[shader]); } var GLctx; GL.init(); FS.staticInit();__ATINIT__.unshift(function() { if (!Module["noFSInit"] && !FS.init.initialized) FS.init() });__ATMAIN__.push(function() { FS.ignorePermissions = false });__ATEXIT__.push(function() { FS.quit() });Module["FS_createFolder"] = FS.createFolder;Module["FS_createPath"] = FS.createPath;Module["FS_createDataFile"] = FS.createDataFile;Module["FS_createPreloadedFile"] = FS.createPreloadedFile;Module["FS_createLazyFile"] = FS.createLazyFile;Module["FS_createLink"] = FS.createLink;Module["FS_createDevice"] = FS.createDevice;Module["FS_unlink"] = FS.unlink;; __ATINIT__.unshift(function() { TTY.init() });__ATEXIT__.push(function() { TTY.shutdown() });; if (ENVIRONMENT_IS_NODE) { var fs = require("fs"); var NODEJS_PATH = require("path"); NODEFS.staticInit(); }; ___buildEnvironment(ENV);; if (ENVIRONMENT_IS_NODE) { _emscripten_get_now = function _emscripten_get_now_actual() { var t = process['hrtime'](); return t[0] * 1e3 + t[1] / 1e6; }; } else if (typeof dateNow !== 'undefined') { _emscripten_get_now = dateNow; } else if (typeof self === 'object' && self['performance'] && typeof self['performance']['now'] === 'function') { _emscripten_get_now = function() { return self['performance']['now'](); }; } else if (typeof performance === 'object' && typeof performance['now'] === 'function') { _emscripten_get_now = function() { return performance['now'](); }; } else { _emscripten_get_now = Date.now; }; Module["requestFullScreen"] = function Module_requestFullScreen(lockPointer, resizeCanvas, vrDevice) { Module.printErr("Module.requestFullScreen is deprecated. Please call Module.requestFullscreen instead."); Module["requestFullScreen"] = Module["requestFullscreen"]; Browser.requestFullScreen(lockPointer, resizeCanvas, vrDevice) }; Module["requestFullscreen"] = function Module_requestFullscreen(lockPointer, resizeCanvas, vrDevice) { Browser.requestFullscreen(lockPointer, resizeCanvas, vrDevice) }; Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) }; Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) }; Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() }; Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() }; Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia() } Module["createContext"] = function Module_createContext(canvas, useWebGL, setInModule, webGLContextAttributes) { return Browser.createContext(canvas, useWebGL, setInModule, webGLContextAttributes) }; DYNAMICTOP_PTR = allocate(1, "i32", ALLOC_STATIC); STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP); STACK_MAX = STACK_BASE + TOTAL_STACK; DYNAMIC_BASE = Runtime.alignMemory(STACK_MAX); HEAP32[DYNAMICTOP_PTR>>2] = DYNAMIC_BASE; staticSealed = true; // seal the static portion of memory Module['wasmTableSize'] = 46177; Module['wasmMaxTableSize'] = 46177; function invoke_diji(index,a1,a2,a3,a4) { try { return Module["dynCall_diji"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_diddi(index,a1,a2,a3,a4) { try { return Module["dynCall_diddi"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viij(index,a1,a2,a3,a4) { try { Module["dynCall_viij"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fiff(index,a1,a2,a3) { try { return Module["dynCall_fiff"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fifi(index,a1,a2,a3) { try { return Module["dynCall_fifi"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vijjiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) { try { Module["dynCall_vijjiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6) { try { return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vidi(index,a1,a2,a3) { try { Module["dynCall_vidi"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vifiiiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20) { try { Module["dynCall_vifiiiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) { try { Module["dynCall_viiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fff(index,a1,a2) { try { return Module["dynCall_fff"](index,a1,a2); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iidi(index,a1,a2,a3) { try { return Module["dynCall_iidi"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_jiji(index,a1,a2,a3,a4) { try { return Module["dynCall_jiji"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fiiiiiifiiiiiif(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) { try { return Module["dynCall_fiiiiiifiiiiiif"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiifiif(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { return Module["dynCall_iiiiifiif"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiifii(index,a1,a2,a3,a4,a5,a6,a7) { try { return Module["dynCall_iiiiifii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiffi(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { Module["dynCall_viiiiiffi"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viifiiii(index,a1,a2,a3,a4,a5,a6,a7) { try { Module["dynCall_viifiiii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiijiii(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { Module["dynCall_viiijiii"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiifiii(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { return Module["dynCall_iiiiifiii"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiffi(index,a1,a2,a3,a4) { try { return Module["dynCall_iiffi"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_jii(index,a1,a2) { try { return Module["dynCall_jii"](index,a1,a2); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) { try { return Module["dynCall_iiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fif(index,a1,a2) { try { return Module["dynCall_fif"](index,a1,a2); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15) { try { Module["dynCall_viiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiif(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_viiiiif"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fii(index,a1,a2) { try { return Module["dynCall_fii"](index,a1,a2); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiifii(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { Module["dynCall_viiiiifii"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_di(index,a1) { try { return Module["dynCall_di"](index,a1); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viff(index,a1,a2,a3) { try { Module["dynCall_viff"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiifiii(index,a1,a2,a3,a4,a5,a6) { try { return Module["dynCall_iiifiii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viffff(index,a1,a2,a3,a4,a5) { try { Module["dynCall_viffff"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_jijji(index,a1,a2,a3,a4,a5,a6) { try { return Module["dynCall_jijji"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vijiiii(index,a1,a2,a3,a4,a5,a6,a7) { try { Module["dynCall_vijiiii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiji(index,a1,a2,a3,a4,a5) { try { Module["dynCall_viiji"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiijiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) { try { Module["dynCall_viiiiijiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiijjii(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { return Module["dynCall_iiijjii"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiffiii(index,a1,a2,a3,a4,a5,a6,a7) { try { Module["dynCall_viiffiii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_dii(index,a1,a2) { try { return Module["dynCall_dii"](index,a1,a2); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iifii(index,a1,a2,a3,a4) { try { return Module["dynCall_iifii"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_didi(index,a1,a2,a3) { try { return Module["dynCall_didi"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiifiifi(index,a1,a2,a3,a4,a5,a6,a7) { try { return Module["dynCall_iiifiifi"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiii(index,a1,a2,a3,a4) { try { return Module["dynCall_iiiii"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iidii(index,a1,a2,a3,a4) { try { return Module["dynCall_iidii"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiij(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_iiiij"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiiiiiiiffffii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17) { try { return Module["dynCall_iiiiiiiiiiiiffffii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vdd(index,a1,a2) { try { Module["dynCall_vdd"](index,a1,a2); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fiiifii(index,a1,a2,a3,a4,a5,a6) { try { return Module["dynCall_fiiifii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiiffii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { try { Module["dynCall_viiiiiiffii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viffii(index,a1,a2,a3,a4,a5) { try { Module["dynCall_viffii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7) { try { return Module["dynCall_iiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiififii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) { try { Module["dynCall_viiiififii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vffff(index,a1,a2,a3,a4) { try { Module["dynCall_vffff"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iijjii(index,a1,a2,a3,a4,a5,a6,a7) { try { return Module["dynCall_iijjii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vdddddd(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_vdddddd"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vifiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15) { try { Module["dynCall_vifiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiji(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_iiiji"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34) { try { Module["dynCall_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiif(index,a1,a2,a3,a4,a5,a6,a7) { try { return Module["dynCall_iiiiiiif"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viidi(index,a1,a2,a3,a4) { try { Module["dynCall_viidi"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiffii(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_viiffii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_ijj(index,a1,a2,a3,a4) { try { return Module["dynCall_ijj"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) { try { return Module["dynCall_iiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiifiiiif(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { try { return Module["dynCall_iiiiifiiiif"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fiffi(index,a1,a2,a3,a4) { try { return Module["dynCall_fiffi"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiifii(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_iiifii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17) { try { Module["dynCall_viiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_jiijiii(index,a1,a2,a3,a4,a5,a6,a7) { try { return Module["dynCall_jiijiii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13) { try { return Module["dynCall_iiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_jijjji(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { return Module["dynCall_jijjji"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vifiiiiiiiiiiiiiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30) { try { Module["dynCall_vifiiiiiiiiiiiiiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viffi(index,a1,a2,a3,a4) { try { Module["dynCall_viffi"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiifiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { return Module["dynCall_iiiifiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vifi(index,a1,a2,a3) { try { Module["dynCall_vifi"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viijj(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_viijj"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vifff(index,a1,a2,a3,a4) { try { Module["dynCall_vifff"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viififiii(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { Module["dynCall_viififiii"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) { try { Module["dynCall_viiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fiii(index,a1,a2,a3) { try { return Module["dynCall_fiii"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiifffiiifii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) { try { return Module["dynCall_iiiiiifffiiifii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iifff(index,a1,a2,a3,a4) { try { return Module["dynCall_iifff"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iifiii(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_iifiii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiijii(index,a1,a2,a3,a4,a5,a6) { try { return Module["dynCall_iiijii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiidiiii(index,a1,a2,a3,a4,a5,a6,a7) { try { return Module["dynCall_iiidiiii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_jidi(index,a1,a2,a3) { try { return Module["dynCall_jidi"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiifiifii(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { return Module["dynCall_iiifiifii"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_ji(index,a1) { try { return Module["dynCall_ji"](index,a1); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiddi(index,a1,a2,a3,a4) { try { return Module["dynCall_iiddi"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { try { Module["dynCall_viiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiffiiiiiiiiiffffiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23) { try { return Module["dynCall_iiiiiiffiiiiiiiiiffffiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_diii(index,a1,a2,a3) { try { return Module["dynCall_diii"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiji(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_viiiji"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vff(index,a1,a2) { try { Module["dynCall_vff"](index,a1,a2); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viijijiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { try { Module["dynCall_viijijiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viijijji(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { try { Module["dynCall_viijijji"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fiiii(index,a1,a2,a3,a4) { try { return Module["dynCall_fiiii"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiii(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiifii(index,a1,a2,a3,a4,a5,a6,a7) { try { Module["dynCall_viiiifii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vijii(index,a1,a2,a3,a4,a5) { try { Module["dynCall_vijii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiffi(index,a1,a2,a3,a4,a5,a6) { try { return Module["dynCall_iiiiffi"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_jidji(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_jidji"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viidii(index,a1,a2,a3,a4,a5) { try { Module["dynCall_viidii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vjji(index,a1,a2,a3,a4,a5) { try { Module["dynCall_vjji"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiifiif(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) { try { return Module["dynCall_iiiiiifiif"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiii(index,a1,a2,a3,a4) { try { Module["dynCall_viiii"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_jijii(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_jijii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiii(index,a1,a2,a3,a4,a5) { try { Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viifii(index,a1,a2,a3,a4,a5) { try { Module["dynCall_viifii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iifffi(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_iifffi"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vif(index,a1,a2) { try { Module["dynCall_vif"](index,a1,a2); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vid(index,a1,a2) { try { Module["dynCall_vid"](index,a1,a2); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiidi(index,a1,a2,a3,a4) { try { return Module["dynCall_iiidi"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vij(index,a1,a2,a3) { try { Module["dynCall_vij"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vii(index,a1,a2) { try { Module["dynCall_vii"](index,a1,a2); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vijji(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_vijji"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiif(index,a1,a2,a3,a4,a5) { try { Module["dynCall_viiiif"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_difi(index,a1,a2,a3) { try { return Module["dynCall_difi"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fi(index,a1) { try { return Module["dynCall_fi"](index,a1); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiififiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) { try { return Module["dynCall_iiififiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fiji(index,a1,a2,a3,a4) { try { return Module["dynCall_fiji"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_jiiiiiii(index,a1,a2,a3,a4,a5,a6,a7) { try { return Module["dynCall_jiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vijj(index,a1,a2,a3,a4,a5) { try { Module["dynCall_vijj"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vf(index,a1) { try { Module["dynCall_vf"](index,a1); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiffiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22) { try { return Module["dynCall_iiiiiiffiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fiiiiiiiifiiiif(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) { try { return Module["dynCall_fiiiiiiiifiiiif"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiifiifiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) { try { return Module["dynCall_iiifiifiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viffffii(index,a1,a2,a3,a4,a5,a6,a7) { try { Module["dynCall_viffffii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vifiii(index,a1,a2,a3,a4,a5) { try { Module["dynCall_vifiii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viijjii(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { Module["dynCall_viijjii"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iijjji(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { return Module["dynCall_iijjji"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_diiii(index,a1,a2,a3,a4) { try { return Module["dynCall_diiii"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiifiiii(index,a1,a2,a3,a4,a5,a6,a7) { try { return Module["dynCall_iiifiiii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13) { try { Module["dynCall_viiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiiiiiffffii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15) { try { return Module["dynCall_iiiiiiiiiiffffii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiifi(index,a1,a2,a3,a4,a5,a6) { try { return Module["dynCall_iiiiifi"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fifii(index,a1,a2,a3,a4) { try { return Module["dynCall_fifii"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viji(index,a1,a2,a3,a4) { try { Module["dynCall_viji"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { Module["dynCall_viiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fiffifffi(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { return Module["dynCall_fiffifffi"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiff(index,a1,a2,a3,a4) { try { Module["dynCall_viiff"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iif(index,a1,a2) { try { return Module["dynCall_iif"](index,a1,a2); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vifiiii(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_vifiiii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7) { try { Module["dynCall_viiiiiii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vijiji(index,a1,a2,a3,a4,a5,a6,a7) { try { Module["dynCall_vijiji"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vifii(index,a1,a2,a3,a4) { try { Module["dynCall_vifii"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) { try { Module["dynCall_viiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiif(index,a1,a2,a3,a4,a5,a6,a7) { try { Module["dynCall_viiiiiif"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viijji(index,a1,a2,a3,a4,a5,a6,a7) { try { Module["dynCall_viijji"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iii(index,a1,a2) { try { return Module["dynCall_iii"](index,a1,a2); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viifiii(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_viifiii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iij(index,a1,a2,a3) { try { return Module["dynCall_iij"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiijiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) { try { Module["dynCall_viiijiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiifii(index,a1,a2,a3,a4,a5,a6) { try { return Module["dynCall_iiiifii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_f(index) { try { return Module["dynCall_f"](index); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_jiiii(index,a1,a2,a3,a4) { try { return Module["dynCall_jiiii"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viijii(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_viijii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiifiiiiif(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) { try { Module["dynCall_viiiifiiiiif"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viififi(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_viififi"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viii(index,a1,a2,a3) { try { Module["dynCall_viii"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiifi(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_viiiifi"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_jiii(index,a1,a2,a3) { try { return Module["dynCall_jiii"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiji(index,a1,a2,a3,a4) { try { return Module["dynCall_iiji"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viif(index,a1,a2,a3) { try { Module["dynCall_viif"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vijiii(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_vijiii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fiiifi(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_fiiifi"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiifi(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_iiiifi"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_v(index) { try { Module["dynCall_v"](index); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vd(index,a1) { try { Module["dynCall_vd"](index,a1); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viifi(index,a1,a2,a3,a4) { try { Module["dynCall_viifi"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fiifi(index,a1,a2,a3,a4) { try { return Module["dynCall_fiifi"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vi(index,a1) { try { Module["dynCall_vi"](index,a1); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { try { return Module["dynCall_iiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiiffiiiiiiiiiffffiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25) { try { return Module["dynCall_iiiiiiiffiiiiiiiiiffffiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiififii(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { Module["dynCall_viiififii"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_ii(index,a1) { try { return Module["dynCall_ii"](index,a1); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vifffi(index,a1,a2,a3,a4,a5) { try { Module["dynCall_vifffi"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iijji(index,a1,a2,a3,a4,a5,a6) { try { return Module["dynCall_iijji"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiifiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) { try { return Module["dynCall_iiiiifiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiifiiiiif(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) { try { return Module["dynCall_iiiiifiiiiif"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_jifi(index,a1,a2,a3) { try { return Module["dynCall_jifi"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) { try { Module["dynCall_viiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iifi(index,a1,a2,a3) { try { return Module["dynCall_iifi"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiif(index,a1,a2,a3,a4) { try { Module["dynCall_viiif"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fifffi(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_fifffi"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_jiiiii(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_jiiiii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vifiiiiiiiiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25) { try { Module["dynCall_vifiiiiiiiiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiffii(index,a1,a2,a3,a4,a5,a6) { try { return Module["dynCall_iiiffii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vijiijiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { try { Module["dynCall_vijiijiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiifi(index,a1,a2,a3,a4) { try { return Module["dynCall_iiifi"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiii(index,a1,a2,a3) { try { return Module["dynCall_iiii"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fidi(index,a1,a2,a3) { try { return Module["dynCall_fidi"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiij(index,a1,a2,a3,a4) { try { return Module["dynCall_iiij"](index,a1,a2,a3,a4); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viifff(index,a1,a2,a3,a4,a5) { try { Module["dynCall_viifff"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiffi(index,a1,a2,a3,a4,a5) { try { Module["dynCall_viiffi"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiid(index,a1,a2,a3) { try { return Module["dynCall_iiid"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiifiifiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { try { return Module["dynCall_iiiifiifiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiif(index,a1,a2,a3) { try { return Module["dynCall_iiif"](index,a1,a2,a3); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiiffi(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_viiiffi"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_diiiii(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_diiiii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiifi(index,a1,a2,a3,a4,a5) { try { Module["dynCall_viiifi"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_fiiffi(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_fiiffi"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiffiiiiiiiiiffffiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24) { try { return Module["dynCall_iiiiiiffiiiiiiiiiffffiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) { try { return Module["dynCall_iiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viifffi(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_viifffi"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vifffii(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_vifffii"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiifiii(index,a1,a2,a3,a4,a5,a6,a7) { try { return Module["dynCall_iiiifiii"](index,a1,a2,a3,a4,a5,a6,a7); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_ff(index,a1) { try { return Module["dynCall_ff"](index,a1); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiifiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) { try { return Module["dynCall_iiiifiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iijii(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_iijii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) { try { return Module["dynCall_iiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiijjii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) { try { Module["dynCall_viiijjii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_vfi(index,a1,a2) { try { Module["dynCall_vfi"](index,a1,a2); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_i(index) { try { return Module["dynCall_i"](index); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiidii(index,a1,a2,a3,a4,a5) { try { return Module["dynCall_iiidii"](index,a1,a2,a3,a4,a5); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiidiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { return Module["dynCall_iiidiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viiifiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) { try { Module["dynCall_viiifiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiijjiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) { try { return Module["dynCall_iiijjiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiijii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) { try { return Module["dynCall_iiiiiijii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viijjji(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) { try { Module["dynCall_viijjji"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) { try { return Module["dynCall_iiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } function invoke_viffffi(index,a1,a2,a3,a4,a5,a6) { try { Module["dynCall_viffffi"](index,a1,a2,a3,a4,a5,a6); } catch(e) { if (typeof e !== 'number' && e !== 'longjmp') throw e; asm["setThrew"](1, 0); } } Module.asmGlobalArg = { "Math": Math, "Int8Array": Int8Array, "Int16Array": Int16Array, "Int32Array": Int32Array, "Uint8Array": Uint8Array, "Uint16Array": Uint16Array, "Uint32Array": Uint32Array, "Float32Array": Float32Array, "Float64Array": Float64Array, "NaN": NaN, "Infinity": Infinity }; Module.asmLibraryArg = { "abort": abort, "assert": assert, "enlargeMemory": enlargeMemory, "getTotalMemory": getTotalMemory, "abortOnCannotGrowMemory": abortOnCannotGrowMemory, "invoke_diji": invoke_diji, "invoke_diddi": invoke_diddi, "invoke_viij": invoke_viij, "invoke_fiff": invoke_fiff, "invoke_fifi": invoke_fifi, "invoke_vijjiiiiii": invoke_vijjiiiiii, "invoke_iiiiiii": invoke_iiiiiii, "invoke_vidi": invoke_vidi, "invoke_vifiiiiiiiiiiiiiiiiii": invoke_vifiiiiiiiiiiiiiiiiii, "invoke_viiiiiiiiiii": invoke_viiiiiiiiiii, "invoke_fff": invoke_fff, "invoke_iidi": invoke_iidi, "invoke_jiji": invoke_jiji, "invoke_fiiiiiifiiiiiif": invoke_fiiiiiifiiiiiif, "invoke_iiiiifiif": invoke_iiiiifiif, "invoke_iiiiifii": invoke_iiiiifii, "invoke_viiiiiffi": invoke_viiiiiffi, "invoke_viifiiii": invoke_viifiiii, "invoke_viiijiii": invoke_viiijiii, "invoke_iiiiifiii": invoke_iiiiifiii, "invoke_iiffi": invoke_iiffi, "invoke_jii": invoke_jii, "invoke_iiiiiiiiiiii": invoke_iiiiiiiiiiii, "invoke_fif": invoke_fif, "invoke_viiiiiiiiiiiiiii": invoke_viiiiiiiiiiiiiii, "invoke_viiiiif": invoke_viiiiif, "invoke_fii": invoke_fii, "invoke_viiiiifii": invoke_viiiiifii, "invoke_di": invoke_di, "invoke_viff": invoke_viff, "invoke_iiifiii": invoke_iiifiii, "invoke_viffff": invoke_viffff, "invoke_jijji": invoke_jijji, "invoke_vijiiii": invoke_vijiiii, "invoke_viiji": invoke_viiji, "invoke_viiiiijiiii": invoke_viiiiijiiii, "invoke_iiijjii": invoke_iiijjii, "invoke_viiffiii": invoke_viiffiii, "invoke_dii": invoke_dii, "invoke_iifii": invoke_iifii, "invoke_didi": invoke_didi, "invoke_iiifiifi": invoke_iiifiifi, "invoke_iiiii": invoke_iiiii, "invoke_iidii": invoke_iidii, "invoke_iiiij": invoke_iiiij, "invoke_iiiiiiiiiiiiffffii": invoke_iiiiiiiiiiiiffffii, "invoke_vdd": invoke_vdd, "invoke_fiiifii": invoke_fiiifii, "invoke_viiiiiiffii": invoke_viiiiiiffii, "invoke_viffii": invoke_viffii, "invoke_iiiiiiii": invoke_iiiiiiii, "invoke_viiiififii": invoke_viiiififii, "invoke_vffff": invoke_vffff, "invoke_iijjii": invoke_iijjii, "invoke_vdddddd": invoke_vdddddd, "invoke_vifiiiiiiiiiiiii": invoke_vifiiiiiiiiiiiii, "invoke_iiiji": invoke_iiiji, "invoke_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii": invoke_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii, "invoke_iiiiiiif": invoke_iiiiiiif, "invoke_viidi": invoke_viidi, "invoke_viiffii": invoke_viiffii, "invoke_ijj": invoke_ijj, "invoke_iiiiiiiiii": invoke_iiiiiiiiii, "invoke_iiiiifiiiif": invoke_iiiiifiiiif, "invoke_fiffi": invoke_fiffi, "invoke_iiifii": invoke_iiifii, "invoke_viiiiiiiiiiiiiiiii": invoke_viiiiiiiiiiiiiiiii, "invoke_jiijiii": invoke_jiijiii, "invoke_iiiiiiiiiiiiii": invoke_iiiiiiiiiiiiii, "invoke_jijjji": invoke_jijjji, "invoke_vifiiiiiiiiiiiiiiiiiiiiiiiiiiii": invoke_vifiiiiiiiiiiiiiiiiiiiiiiiiiiii, "invoke_viffi": invoke_viffi, "invoke_iiiifiiii": invoke_iiiifiiii, "invoke_vifi": invoke_vifi, "invoke_viijj": invoke_viijj, "invoke_vifff": invoke_vifff, "invoke_viiiiii": invoke_viiiiii, "invoke_viififiii": invoke_viififiii, "invoke_viiiiiiiiiiiiii": invoke_viiiiiiiiiiiiii, "invoke_fiii": invoke_fiii, "invoke_iiiiiifffiiifii": invoke_iiiiiifffiiifii, "invoke_iifff": invoke_iifff, "invoke_iifiii": invoke_iifiii, "invoke_iiijii": invoke_iiijii, "invoke_iiidiiii": invoke_iiidiiii, "invoke_jidi": invoke_jidi, "invoke_iiifiifii": invoke_iiifiifii, "invoke_ji": invoke_ji, "invoke_iiddi": invoke_iiddi, "invoke_viiiiiiiiii": invoke_viiiiiiiiii, "invoke_iiiiiiffiiiiiiiiiffffiii": invoke_iiiiiiffiiiiiiiiiffffiii, "invoke_diii": invoke_diii, "invoke_viiiji": invoke_viiiji, "invoke_vff": invoke_vff, "invoke_viijijiii": invoke_viijijiii, "invoke_viijijji": invoke_viijijji, "invoke_fiiii": invoke_fiiii, "invoke_iiiiii": invoke_iiiiii, "invoke_viiiifii": invoke_viiiifii, "invoke_vijii": invoke_vijii, "invoke_iiiiffi": invoke_iiiiffi, "invoke_jidji": invoke_jidji, "invoke_viidii": invoke_viidii, "invoke_vjji": invoke_vjji, "invoke_iiiiiifiif": invoke_iiiiiifiif, "invoke_viiii": invoke_viiii, "invoke_jijii": invoke_jijii, "invoke_viiiii": invoke_viiiii, "invoke_viifii": invoke_viifii, "invoke_iifffi": invoke_iifffi, "invoke_vif": invoke_vif, "invoke_vid": invoke_vid, "invoke_iiidi": invoke_iiidi, "invoke_vij": invoke_vij, "invoke_vii": invoke_vii, "invoke_vijji": invoke_vijji, "invoke_viiiif": invoke_viiiif, "invoke_difi": invoke_difi, "invoke_fi": invoke_fi, "invoke_iiififiiii": invoke_iiififiiii, "invoke_fiji": invoke_fiji, "invoke_jiiiiiii": invoke_jiiiiiii, "invoke_vijj": invoke_vijj, "invoke_vf": invoke_vf, "invoke_iiiiiiffiiiiiiiiiiiiiii": invoke_iiiiiiffiiiiiiiiiiiiiii, "invoke_fiiiiiiiifiiiif": invoke_fiiiiiiiifiiiif, "invoke_iiifiifiii": invoke_iiifiifiii, "invoke_viffffii": invoke_viffffii, "invoke_vifiii": invoke_vifiii, "invoke_viijjii": invoke_viijjii, "invoke_iijjji": invoke_iijjji, "invoke_diiii": invoke_diiii, "invoke_iiifiiii": invoke_iiifiiii, "invoke_viiiiiiiiiiiii": invoke_viiiiiiiiiiiii, "invoke_iiiiiiiiiiffffii": invoke_iiiiiiiiiiffffii, "invoke_iiiiifi": invoke_iiiiifi, "invoke_fifii": invoke_fifii, "invoke_viji": invoke_viji, "invoke_viiiiiiii": invoke_viiiiiiii, "invoke_fiffifffi": invoke_fiffifffi, "invoke_viiff": invoke_viiff, "invoke_iif": invoke_iif, "invoke_vifiiii": invoke_vifiiii, "invoke_viiiiiii": invoke_viiiiiii, "invoke_vijiji": invoke_vijiji, "invoke_vifii": invoke_vifii, "invoke_viiiiiiiii": invoke_viiiiiiiii, "invoke_viiiiiif": invoke_viiiiiif, "invoke_viijji": invoke_viijji, "invoke_iii": invoke_iii, "invoke_viifiii": invoke_viifiii, "invoke_iij": invoke_iij, "invoke_viiijiiiiii": invoke_viiijiiiiii, "invoke_iiiifii": invoke_iiiifii, "invoke_f": invoke_f, "invoke_jiiii": invoke_jiiii, "invoke_viijii": invoke_viijii, "invoke_viiiifiiiiif": invoke_viiiifiiiiif, "invoke_viififi": invoke_viififi, "invoke_viii": invoke_viii, "invoke_viiiifi": invoke_viiiifi, "invoke_jiii": invoke_jiii, "invoke_iiji": invoke_iiji, "invoke_viif": invoke_viif, "invoke_vijiii": invoke_vijiii, "invoke_fiiifi": invoke_fiiifi, "invoke_iiiifi": invoke_iiiifi, "invoke_v": invoke_v, "invoke_vd": invoke_vd, "invoke_viifi": invoke_viifi, "invoke_fiifi": invoke_fiifi, "invoke_vi": invoke_vi, "invoke_iiiiiiiiiii": invoke_iiiiiiiiiii, "invoke_iiiiiiiffiiiiiiiiiffffiiii": invoke_iiiiiiiffiiiiiiiiiffffiiii, "invoke_viiififii": invoke_viiififii, "invoke_ii": invoke_ii, "invoke_vifffi": invoke_vifffi, "invoke_iijji": invoke_iijji, "invoke_iiiiifiiiiii": invoke_iiiiifiiiiii, "invoke_iiiiifiiiiif": invoke_iiiiifiiiiif, "invoke_jifi": invoke_jifi, "invoke_viiiiiiiiiiii": invoke_viiiiiiiiiiii, "invoke_iifi": invoke_iifi, "invoke_viiif": invoke_viiif, "invoke_fifffi": invoke_fifffi, "invoke_jiiiii": invoke_jiiiii, "invoke_vifiiiiiiiiiiiiiiiiiiiiiii": invoke_vifiiiiiiiiiiiiiiiiiiiiiii, "invoke_iiiffii": invoke_iiiffii, "invoke_vijiijiii": invoke_vijiijiii, "invoke_iiifi": invoke_iiifi, "invoke_iiii": invoke_iiii, "invoke_fidi": invoke_fidi, "invoke_iiij": invoke_iiij, "invoke_viifff": invoke_viifff, "invoke_viiffi": invoke_viiffi, "invoke_iiid": invoke_iiid, "invoke_iiiifiifiii": invoke_iiiifiifiii, "invoke_iiif": invoke_iiif, "invoke_viiiffi": invoke_viiiffi, "invoke_diiiii": invoke_diiiii, "invoke_viiifi": invoke_viiifi, "invoke_fiiffi": invoke_fiiffi, "invoke_iiiiiiffiiiiiiiiiffffiiii": invoke_iiiiiiffiiiiiiiiiffffiiii, "invoke_iiiiiiiiiiiii": invoke_iiiiiiiiiiiii, "invoke_viifffi": invoke_viifffi, "invoke_vifffii": invoke_vifffii, "invoke_iiiifiii": invoke_iiiifiii, "invoke_ff": invoke_ff, "invoke_iiiifiiiii": invoke_iiiifiiiii, "invoke_iijii": invoke_iijii, "invoke_iiiiiiiiiiiiiii": invoke_iiiiiiiiiiiiiii, "invoke_viiijjii": invoke_viiijjii, "invoke_vfi": invoke_vfi, "invoke_i": invoke_i, "invoke_iiidii": invoke_iiidii, "invoke_iiidiiiii": invoke_iiidiiiii, "invoke_viiifiiiii": invoke_viiifiiiii, "invoke_iiijjiiii": invoke_iiijjiiii, "invoke_iiiiiijii": invoke_iiiiiijii, "invoke_viijjji": invoke_viijjji, "invoke_iiiiiiiii": invoke_iiiiiiiii, "invoke_viffffi": invoke_viffffi, "_emscripten_glGetTexParameterfv": _emscripten_glGetTexParameterfv, "_glClearStencil": _glClearStencil, "___syscall220": ___syscall220, "_emscripten_glBlendFuncSeparate": _emscripten_glBlendFuncSeparate, "_glTexParameteriv": _glTexParameteriv, "_glUniformMatrix4fv": _glUniformMatrix4fv, "_glVertexAttrib4f": _glVertexAttrib4f, "_emscripten_glDepthFunc": _emscripten_glDepthFunc, "_emscripten_webgl_create_context": _emscripten_webgl_create_context, "_pthread_key_delete": _pthread_key_delete, "_glDisableVertexAttribArray": _glDisableVertexAttribArray, "_emscripten_memcpy_big": _emscripten_memcpy_big, "_pthread_attr_init": _pthread_attr_init, "_emscripten_glUniform1f": _emscripten_glUniform1f, "emscriptenWebGLComputeImageSize": emscriptenWebGLComputeImageSize, "___syscall221": ___syscall221, "_glInvalidateFramebuffer": _glInvalidateFramebuffer, "_emscripten_glVertexAttrib2f": _emscripten_glVertexAttrib2f, "_emscripten_glUniform1i": _emscripten_glUniform1i, "_emscripten_glGetIntegerv": _emscripten_glGetIntegerv, "_emscripten_glIsProgram": _emscripten_glIsProgram, "_glGenSamplers": _glGenSamplers, "_emscripten_webgl_make_context_current": _emscripten_webgl_make_context_current, "_glEndTransformFeedback": _glEndTransformFeedback, "_glFramebufferRenderbuffer": _glFramebufferRenderbuffer, "_gmtime_r": _gmtime_r, "___cxa_rethrow": ___cxa_rethrow, "_emscripten_glTexParameteriv": _emscripten_glTexParameteriv, "___syscall140": ___syscall140, "___syscall145": ___syscall145, "___syscall146": ___syscall146, "_glUniform1uiv": _glUniform1uiv, "_emscripten_glAttachShader": _emscripten_glAttachShader, "_emscripten_get_now_is_monotonic": _emscripten_get_now_is_monotonic, "_pthread_cond_timedwait": _pthread_cond_timedwait, "_emscripten_glTexParameterfv": _emscripten_glTexParameterfv, "_pthread_attr_destroy": _pthread_attr_destroy, "_emscripten_glUniformMatrix2fv": _emscripten_glUniformMatrix2fv, "_SDL_GetTicks": _SDL_GetTicks, "_emscripten_glDrawArraysInstanced": _emscripten_glDrawArraysInstanced, "___syscall183": ___syscall183, "_glDepthMask": _glDepthMask, "_emscripten_glVertexAttrib2fv": _emscripten_glVertexAttrib2fv, "_glViewport": _glViewport, "_emscripten_glFlush": _emscripten_glFlush, "_glReadBuffer": _glReadBuffer, "___syscall91": ___syscall91, "_pthread_once": _pthread_once, "_glDrawArraysInstanced": _glDrawArraysInstanced, "_JS_Sound_SetListenerOrientation": _JS_Sound_SetListenerOrientation, "_emscripten_glGetAttribLocation": _emscripten_glGetAttribLocation, "_glBeginQuery": _glBeginQuery, "_glAttachShader": _glAttachShader, "_emscripten_glTexCoordPointer": _emscripten_glTexCoordPointer, "_emscripten_set_blur_callback": _emscripten_set_blur_callback, "_emscripten_glLoadMatrixf": _emscripten_glLoadMatrixf, "_emscripten_glStencilFuncSeparate": _emscripten_glStencilFuncSeparate, "_emscripten_glVertexAttrib3f": _emscripten_glVertexAttrib3f, "_emscripten_webgl_enable_extension": _emscripten_webgl_enable_extension, "_glCullFace": _glCullFace, "_emscripten_get_gamepad_status": _emscripten_get_gamepad_status, "_sched_yield": _sched_yield, "_glCompressedTexImage2D": _glCompressedTexImage2D, "_emscripten_glUniform1iv": _emscripten_glUniform1iv, "emscriptenWebGLGetUniform": emscriptenWebGLGetUniform, "_glClearColor": _glClearColor, "_glFinish": _glFinish, "_emscripten_glUniform3iv": _emscripten_glUniform3iv, "_emscripten_glGetBufferParameteriv": _emscripten_glGetBufferParameteriv, "_emscripten_glVertexAttrib4fv": _emscripten_glVertexAttrib4fv, "_glGetTexParameteriv": _glGetTexParameteriv, "_pthread_getspecific": _pthread_getspecific, "_glDrawArrays": _glDrawArrays, "_pthread_cond_signal": _pthread_cond_signal, "_emscripten_glDepthRange": _emscripten_glDepthRange, "_glActiveTexture": _glActiveTexture, "_emscripten_asm_const_iii": _emscripten_asm_const_iii, "_emscripten_glCopyTexImage2D": _emscripten_glCopyTexImage2D, "_emscripten_glFramebufferTexture2D": _emscripten_glFramebufferTexture2D, "_glEnableVertexAttribArray": _glEnableVertexAttribArray, "_emscripten_glStencilFunc": _emscripten_glStencilFunc, "_glBindVertexArray": _glBindVertexArray, "_glVertexAttribIPointer": _glVertexAttribIPointer, "_glVertexAttrib4fv": _glVertexAttrib4fv, "_glDeleteBuffers": _glDeleteBuffers, "_localtime": _localtime, "_glGetUniformBlockIndex": _glGetUniformBlockIndex, "_glGetActiveUniformBlockName": _glGetActiveUniformBlockName, "_glRenderbufferStorageMultisample": _glRenderbufferStorageMultisample, "_glCompressedTexSubImage2D": _glCompressedTexSubImage2D, "_emscripten_glRenderbufferStorage": _emscripten_glRenderbufferStorage, "_Mix_PlayMusic": _Mix_PlayMusic, "_emscripten_set_keydown_callback": _emscripten_set_keydown_callback, "_emscripten_glVertexPointer": _emscripten_glVertexPointer, "_JS_SystemInfo_GetHeight": _JS_SystemInfo_GetHeight, "_emscripten_glBufferSubData": _emscripten_glBufferSubData, "_emscripten_glGetUniformfv": _emscripten_glGetUniformfv, "_SDL_FreeRW": _SDL_FreeRW, "_glFramebufferTextureLayer": _glFramebufferTextureLayer, "_glDeleteQueries": _glDeleteQueries, "_Mix_LoadWAV_RW": _Mix_LoadWAV_RW, "_emscripten_glStencilOp": _emscripten_glStencilOp, "_emscripten_glBlendEquation": _emscripten_glBlendEquation, "_glTexImage3D": _glTexImage3D, "emscriptenWebGLGetIndexed": emscriptenWebGLGetIndexed, "_emscripten_glVertexAttrib1fv": _emscripten_glVertexAttrib1fv, "_TTF_SizeText": _TTF_SizeText, "_emscripten_glDeleteBuffers": _emscripten_glDeleteBuffers, "_glLinkProgram": _glLinkProgram, "_emscripten_glGetProgramInfoLog": _emscripten_glGetProgramInfoLog, "_emscripten_glUniform4fv": _emscripten_glUniform4fv, "___cxa_throw": ___cxa_throw, "_JS_SystemInfo_GetCurrentCanvasWidth": _JS_SystemInfo_GetCurrentCanvasWidth, "_glUniform1iv": _glUniform1iv, "_emscripten_glUniform2fv": _emscripten_glUniform2fv, "_emscripten_glBindBuffer": _emscripten_glBindBuffer, "_emscripten_glGetFloatv": _emscripten_glGetFloatv, "_pthread_mutex_init": _pthread_mutex_init, "_glBlendEquationSeparate": _glBlendEquationSeparate, "_glTexSubImage2D": _glTexSubImage2D, "_glUseProgram": _glUseProgram, "_glUniformMatrix3fv": _glUniformMatrix3fv, "_emscripten_glCullFace": _emscripten_glCullFace, "_glBindTransformFeedback": _glBindTransformFeedback, "_emscripten_glStencilMaskSeparate": _emscripten_glStencilMaskSeparate, "_emscripten_glUniform3fv": _emscripten_glUniform3fv, "_glBindBuffer": _glBindBuffer, "_emscripten_request_fullscreen": _emscripten_request_fullscreen, "_JS_Sound_Play": _JS_Sound_Play, "_emscripten_glDisableVertexAttribArray": _emscripten_glDisableVertexAttribArray, "_TTF_RenderText_Solid": _TTF_RenderText_Solid, "_glPolygonOffset": _glPolygonOffset, "_emscripten_webgl_get_current_context": _emscripten_webgl_get_current_context, "_emscripten_set_touchstart_callback": _emscripten_set_touchstart_callback, "_JS_Sound_SetListenerPosition": _JS_Sound_SetListenerPosition, "_emscripten_glGetBooleanv": _emscripten_glGetBooleanv, "_glProgramBinary": _glProgramBinary, "_emscripten_glVertexAttribDivisor": _emscripten_glVertexAttribDivisor, "_JS_Eval_SetTimeout": _JS_Eval_SetTimeout, "_glDrawElementsInstanced": _glDrawElementsInstanced, "_emscripten_glDeleteObjectARB": _emscripten_glDeleteObjectARB, "_emscripten_glUniform4f": _emscripten_glUniform4f, "_emscripten_glGetShaderPrecisionFormat": _emscripten_glGetShaderPrecisionFormat, "_JS_SystemInfo_GetLanguage": _JS_SystemInfo_GetLanguage, "_emscripten_glIsEnabled": _emscripten_glIsEnabled, "_JS_SystemInfo_HasFullscreen": _JS_SystemInfo_HasFullscreen, "_emscripten_glStencilOpSeparate": _emscripten_glStencilOpSeparate, "_JS_Sound_Set3D": _JS_Sound_Set3D, "_pthread_cleanup_pop": _pthread_cleanup_pop, "_glGenerateMipmap": _glGenerateMipmap, "_JS_Sound_SetPosition": _JS_Sound_SetPosition, "___syscall122": ___syscall122, "___cxa_free_exception": ___cxa_free_exception, "___cxa_find_matching_catch": ___cxa_find_matching_catch, "_JS_SystemInfo_HasCursorLock": _JS_SystemInfo_HasCursorLock, "_emscripten_glClear": _emscripten_glClear, "_glDrawElements": _glDrawElements, "_JS_WebRequest_Send": _JS_WebRequest_Send, "_emscripten_glValidateProgram": _emscripten_glValidateProgram, "_emscripten_glUniform4iv": _emscripten_glUniform4iv, "___setErrNo": ___setErrNo, "_glStencilOpSeparate": _glStencilOpSeparate, "_JS_WebRequest_Abort": _JS_WebRequest_Abort, "___resumeException": ___resumeException, "_mktime": _mktime, "_emscripten_glGetError": _emscripten_glGetError, "_emscripten_glBufferData": _emscripten_glBufferData, "_emscripten_glStencilMask": _emscripten_glStencilMask, "_glGenTextures": _glGenTextures, "_glGetIntegerv": _glGetIntegerv, "_glUniform3iv": _glUniform3iv, "_emscripten_glClearStencil": _emscripten_glClearStencil, "_JS_Sound_Stop": _JS_Sound_Stop, "emscriptenWebGLGet": emscriptenWebGLGet, "_emscripten_set_mouseup_callback": _emscripten_set_mouseup_callback, "_emscripten_glFinish": _emscripten_glFinish, "_emscripten_glClearDepth": _emscripten_glClearDepth, "_emscripten_glUniform1fv": _emscripten_glUniform1fv, "_glBindFramebuffer": _glBindFramebuffer, "_glValidateProgram": _glValidateProgram, "_glGenFramebuffers": _glGenFramebuffers, "_SDL_UpperBlitScaled": _SDL_UpperBlitScaled, "_emscripten_glUniform4i": _emscripten_glUniform4i, "_glUniform1fv": _glUniform1fv, "_llvm_pow_f64": _llvm_pow_f64, "__emscripten_sample_gamepad_data": __emscripten_sample_gamepad_data, "_glDeleteFramebuffers": _glDeleteFramebuffers, "_JS_FileSystem_Sync": _JS_FileSystem_Sync, "_IMG_Load": _IMG_Load, "_glCheckFramebufferStatus": _glCheckFramebufferStatus, "_emscripten_glBlendFunc": _emscripten_glBlendFunc, "_emscripten_glCreateShader": _emscripten_glCreateShader, "_glGetProgramBinary": _glGetProgramBinary, "___syscall192": ___syscall192, "_glGetActiveUniformsiv": _glGetActiveUniformsiv, "_localtime_r": _localtime_r, "_glBindTexture": _glBindTexture, "___syscall196": ___syscall196, "_strftime": _strftime, "_emscripten_glGetVertexAttribiv": _emscripten_glGetVertexAttribiv, "_glReadPixels": _glReadPixels, "_glGetActiveAttrib": _glGetActiveAttrib, "_emscripten_glUniformMatrix3fv": _emscripten_glUniformMatrix3fv, "_glUniform2iv": _glUniform2iv, "___syscall33": ___syscall33, "_glGetActiveUniform": _glGetActiveUniform, "_IsMobileOS": _IsMobileOS, "_emscripten_glDeleteFramebuffers": _emscripten_glDeleteFramebuffers, "__setLetterbox": __setLetterbox, "___syscall39": ___syscall39, "___syscall38": ___syscall38, "_getpwuid": _getpwuid, "_glFrontFace": _glFrontFace, "_emscripten_glGetObjectParameterivARB": _emscripten_glGetObjectParameterivARB, "_glGetUniformiv": _glGetUniformiv, "_JS_SystemInfo_HasWebGL": _JS_SystemInfo_HasWebGL, "_emscripten_glGetUniformiv": _emscripten_glGetUniformiv, "_glGetActiveUniformBlockiv": _glGetActiveUniformBlockiv, "emscriptenWebGLGetBufferBinding": emscriptenWebGLGetBufferBinding, "_openWindow": _openWindow, "_glGetProgramiv": _glGetProgramiv, "___syscall168": ___syscall168, "_glScissor": _glScissor, "_emscripten_glClearColor": _emscripten_glClearColor, "_glGetFramebufferAttachmentParameteriv": _glGetFramebufferAttachmentParameteriv, "___cxa_find_matching_catch_4": ___cxa_find_matching_catch_4, "_emscripten_set_mousemove_callback": _emscripten_set_mousemove_callback, "_glBlitFramebuffer": _glBlitFramebuffer, "___cxa_find_matching_catch_2": ___cxa_find_matching_catch_2, "___cxa_find_matching_catch_3": ___cxa_find_matching_catch_3, "_emscripten_glDeleteTextures": _emscripten_glDeleteTextures, "_emscripten_exit_fullscreen": _emscripten_exit_fullscreen, "_glGetShaderiv": _glGetShaderiv, "_llvm_eh_typeid_for": _llvm_eh_typeid_for, "_glBindBufferBase": _glBindBufferBase, "_glUniform4fv": _glUniform4fv, "_glTexSubImage3D": _glTexSubImage3D, "__exit": __exit, "_IMG_Load_RW": _IMG_Load_RW, "_glBindAttribLocation": _glBindAttribLocation, "_emscripten_glColorMask": _emscripten_glColorMask, "_emscripten_webgl_destroy_context": _emscripten_webgl_destroy_context, "_emscripten_glBindTexture": _emscripten_glBindTexture, "_glDeleteSamplers": _glDeleteSamplers, "_glUniform4iv": _glUniform4iv, "_emscripten_set_main_loop": _emscripten_set_main_loop, "_JS_WebGL_InitContextAttributes": _JS_WebGL_InitContextAttributes, "_SDL_RWFromConstMem": _SDL_RWFromConstMem, "_emscripten_glIsShader": _emscripten_glIsShader, "_emscripten_glCompressedTexImage2D": _emscripten_glCompressedTexImage2D, "_glDisable": _glDisable, "_emscripten_glGetInfoLogARB": _emscripten_glGetInfoLogARB, "_atexit": _atexit, "_glFenceSync": _glFenceSync, "_glStencilFuncSeparate": _glStencilFuncSeparate, "_JS_Sound_ReleaseInstance": _JS_Sound_ReleaseInstance, "_emscripten_glGenRenderbuffers": _emscripten_glGenRenderbuffers, "_JS_SystemInfo_GetCurrentCanvasHeight": _JS_SystemInfo_GetCurrentCanvasHeight, "_JS_WebRequest_GetResponseHeaders": _JS_WebRequest_GetResponseHeaders, "_emscripten_glReleaseShaderCompiler": _emscripten_glReleaseShaderCompiler, "_pthread_key_create": _pthread_key_create, "_flock": _flock, "_SDL_RWFromFile": _SDL_RWFromFile, "_glUniform2fv": _glUniform2fv, "_emscripten_glFrontFace": _emscripten_glFrontFace, "_glDeleteProgram": _glDeleteProgram, "__ZSt18uncaught_exceptionv": __ZSt18uncaught_exceptionv, "_glBlendEquation": _glBlendEquation, "_emscripten_glUseProgram": _emscripten_glUseProgram, "_glCreateProgram": _glCreateProgram, "_clock_gettime": _clock_gettime, "_emscripten_set_touchmove_callback": _emscripten_set_touchmove_callback, "_glGetAttribLocation": _glGetAttribLocation, "_Mix_PlayChannel": _Mix_PlayChannel, "_glCreateShader": _glCreateShader, "_emscripten_glReadPixels": _emscripten_glReadPixels, "_sysconf": _sysconf, "_utime": _utime, "_glEndQuery": _glEndQuery, "_JS_SystemInfo_GetGPUInfo": _JS_SystemInfo_GetGPUInfo, "_pthread_mutexattr_settype": _pthread_mutexattr_settype, "_glTexStorage2D": _glTexStorage2D, "_glGenBuffers": _glGenBuffers, "_glShaderSource": _glShaderSource, "_emscripten_glScissor": _emscripten_glScissor, "_glUniform3uiv": _glUniform3uiv, "_pthread_cleanup_push": _pthread_cleanup_push, "_llvm_trap": _llvm_trap, "_JS_Sound_SetVolume": _JS_Sound_SetVolume, "_JS_Cursor_SetShow": _JS_Cursor_SetShow, "_glPixelStorei": _glPixelStorei, "_emscripten_glIsBuffer": _emscripten_glIsBuffer, "_emscripten_glVertexAttrib1f": _emscripten_glVertexAttrib1f, "_emscripten_set_keyup_callback": _emscripten_set_keyup_callback, "_emscripten_glCompressedTexSubImage2D": _emscripten_glCompressedTexSubImage2D, "_glSamplerParameteri": _glSamplerParameteri, "_glBindSampler": _glBindSampler, "_JS_WebRequest_Release": _JS_WebRequest_Release, "_emscripten_get_main_loop_timing": _emscripten_get_main_loop_timing, "_JS_WebRequest_SetTimeout": _JS_WebRequest_SetTimeout, "_glGetVertexAttribiv": _glGetVertexAttribiv, "_JS_Log_Dump": _JS_Log_Dump, "_emscripten_glGetAttachedShaders": _emscripten_glGetAttachedShaders, "_emscripten_glGenTextures": _emscripten_glGenTextures, "_glBindRenderbuffer": _glBindRenderbuffer, "_pthread_cond_init": _pthread_cond_init, "_SDL_LockSurface": _SDL_LockSurface, "_gmtime": _gmtime, "_emscripten_glGetTexParameteriv": _emscripten_glGetTexParameteriv, "_glDeleteTextures": _glDeleteTextures, "_emscripten_set_mousedown_callback": _emscripten_set_mousedown_callback, "_Mix_HaltMusic": _Mix_HaltMusic, "_emscripten_glClientActiveTexture": _emscripten_glClientActiveTexture, "_emscripten_glCheckFramebufferStatus": _emscripten_glCheckFramebufferStatus, "_emscripten_glUniform3f": _emscripten_glUniform3f, "_emscripten_glUniform3i": _emscripten_glUniform3i, "_glDrawBuffers": _glDrawBuffers, "_emscripten_glDeleteShader": _emscripten_glDeleteShader, "_glEnable": _glEnable, "_glUnmapBuffer": _glUnmapBuffer, "_glGetString": _glGetString, "_emscripten_glGetUniformLocation": _emscripten_glGetUniformLocation, "_emscripten_glEnableVertexAttribArray": _emscripten_glEnableVertexAttribArray, "_emscripten_get_now": _emscripten_get_now, "_emscripten_glGenFramebuffers": _emscripten_glGenFramebuffers, "emscriptenWebGLGetTexPixelData": emscriptenWebGLGetTexPixelData, "_glDetachShader": _glDetachShader, "_gettimeofday": _gettimeofday, "___syscall202": ___syscall202, "_ShowBanner": _ShowBanner, "_JS_Sound_Init": _JS_Sound_Init, "_TTF_FontHeight": _TTF_FontHeight, "_emscripten_glDrawElements": _emscripten_glDrawElements, "_emscripten_get_num_gamepads": _emscripten_get_num_gamepads, "___buildEnvironment": ___buildEnvironment, "_glClearDepthf": _glClearDepthf, "_tzset": _tzset, "_glIsEnabled": _glIsEnabled, "_emscripten_glDisable": _emscripten_glDisable, "___cxa_end_catch": ___cxa_end_catch, "_emscripten_glDeleteRenderbuffers": _emscripten_glDeleteRenderbuffers, "_emscripten_glDrawElementsInstanced": _emscripten_glDrawElementsInstanced, "_emscripten_glVertexAttrib4f": _emscripten_glVertexAttrib4f, "_JS_Sound_Create_Channel": _JS_Sound_Create_Channel, "_emscripten_glPixelStorei": _emscripten_glPixelStorei, "_glGetRenderbufferParameteriv": _glGetRenderbufferParameteriv, "_llvm_fabs_f32": _llvm_fabs_f32, "_glCopyBufferSubData": _glCopyBufferSubData, "_getenv": _getenv, "_emscripten_glFramebufferRenderbuffer": _emscripten_glFramebufferRenderbuffer, "_glBufferData": _glBufferData, "_emscripten_glRotatef": _emscripten_glRotatef, "_emscripten_glGetShaderiv": _emscripten_glGetShaderiv, "_JS_Eval_ClearTimeout": _JS_Eval_ClearTimeout, "___cxa_pure_virtual": ___cxa_pure_virtual, "_emscripten_glUniformMatrix4fv": _emscripten_glUniformMatrix4fv, "_emscripten_glGetPointerv": _emscripten_glGetPointerv, "_pthread_cond_wait": _pthread_cond_wait, "_clock": _clock, "_emscripten_glIsRenderbuffer": _emscripten_glIsRenderbuffer, "_emscripten_request_pointerlock": _emscripten_request_pointerlock, "___syscall40": ___syscall40, "_difftime": _difftime, "___syscall42": ___syscall42, "_glGetUniformIndices": _glGetUniformIndices, "_emscripten_set_touchcancel_callback": _emscripten_set_touchcancel_callback, "_glDeleteRenderbuffers": _glDeleteRenderbuffers, "_glGetShaderPrecisionFormat": _glGetShaderPrecisionFormat, "_JS_SystemInfo_GetMemory": _JS_SystemInfo_GetMemory, "_JS_Sound_SetLoop": _JS_Sound_SetLoop, "_JS_WebRequest_SetResponseHandler": _JS_WebRequest_SetResponseHandler, "_emscripten_set_focus_callback": _emscripten_set_focus_callback, "_pthread_mutexattr_destroy": _pthread_mutexattr_destroy, "_emscripten_glGetVertexAttribfv": _emscripten_glGetVertexAttribfv, "_SDL_PauseAudio": _SDL_PauseAudio, "_emscripten_glVertexAttrib3fv": _emscripten_glVertexAttrib3fv, "_glGetUniformLocation": _glGetUniformLocation, "_emscripten_glCompileShader": _emscripten_glCompileShader, "_glClear": _glClear, "_glBeginTransformFeedback": _glBeginTransformFeedback, "__arraySum": __arraySum, "_emscripten_glLinkProgram": _emscripten_glLinkProgram, "_JS_WebRequest_Create": _JS_WebRequest_Create, "_emscripten_get_pointerlock_status": _emscripten_get_pointerlock_status, "_emscripten_glDrawRangeElements": _emscripten_glDrawRangeElements, "___unlock": ___unlock, "_pthread_create": _pthread_create, "_glProgramParameteri": _glProgramParameteri, "_pthread_setspecific": _pthread_setspecific, "_glColorMask": _glColorMask, "_emscripten_glGenBuffers": _emscripten_glGenBuffers, "_glCopyTexSubImage2D": _glCopyTexSubImage2D, "_emscripten_glCreateProgram": _emscripten_glCreateProgram, "_JS_WebRequest_SetProgressHandler": _JS_WebRequest_SetProgressHandler, "_glTexParameteri": _glTexParameteri, "_pthread_cond_destroy": _pthread_cond_destroy, "_emscripten_glDetachShader": _emscripten_glDetachShader, "_emscripten_glEnableClientState": _emscripten_glEnableClientState, "_glTexParameterf": _glTexParameterf, "_setenv": _setenv, "_emscripten_do_request_fullscreen": _emscripten_do_request_fullscreen, "_glGenQueries": _glGenQueries, "_emscripten_glGetRenderbufferParameteriv": _emscripten_glGetRenderbufferParameteriv, "_emscripten_set_fullscreenchange_callback": _emscripten_set_fullscreenchange_callback, "_emscripten_glVertexAttribPointer": _emscripten_glVertexAttribPointer, "_glTexStorage3D": _glTexStorage3D, "_glIsVertexArray": _glIsVertexArray, "_JS_SystemInfo_GetBrowserName": _JS_SystemInfo_GetBrowserName, "_emscripten_glDrawArrays": _emscripten_glDrawArrays, "_emscripten_glPolygonOffset": _emscripten_glPolygonOffset, "_emscripten_glBlendColor": _emscripten_glBlendColor, "_glGetShaderInfoLog": _glGetShaderInfoLog, "_emscripten_set_main_loop_timing": _emscripten_set_main_loop_timing, "_JS_Log_StackTrace": _JS_Log_StackTrace, "___cxa_begin_catch": ___cxa_begin_catch, "_emscripten_glGetProgramiv": _emscripten_glGetProgramiv, "_glDeleteSync": _glDeleteSync, "__addDays": __addDays, "_emscripten_glGetShaderSource": _emscripten_glGetShaderSource, "emscriptenWebGLValidateMapBufferTarget": emscriptenWebGLValidateMapBufferTarget, "_emscripten_glTexImage2D": _emscripten_glTexImage2D, "_glRenderbufferStorage": _glRenderbufferStorage, "__isLeapYear": __isLeapYear, "_JS_Sound_GetLength": _JS_Sound_GetLength, "_emscripten_glBlendEquationSeparate": _emscripten_glBlendEquationSeparate, "_emscripten_glGetString": _emscripten_glGetString, "_emscripten_glIsFramebuffer": _emscripten_glIsFramebuffer, "_glUniform2uiv": _glUniform2uiv, "_unsetenv": _unsetenv, "_emscripten_glBindProgramARB": _emscripten_glBindProgramARB, "_JS_Sound_SetLoopPoints": _JS_Sound_SetLoopPoints, "_pthread_detach": _pthread_detach, "_JS_Eval_EvalJS": _JS_Eval_EvalJS, "_emscripten_set_devicemotion_callback": _emscripten_set_devicemotion_callback, "___syscall85": ___syscall85, "_emscripten_glUniform2i": _emscripten_glUniform2i, "_emscripten_glUniform2f": _emscripten_glUniform2f, "_glGenTransformFeedbacks": _glGenTransformFeedbacks, "_JS_SystemInfo_GetWidth": _JS_SystemInfo_GetWidth, "_glGetProgramInfoLog": _glGetProgramInfoLog, "_emscripten_glTexParameterf": _emscripten_glTexParameterf, "_emscripten_glTexParameteri": _emscripten_glTexParameteri, "_JS_Sound_Load": _JS_Sound_Load, "_JS_Sound_Load_PCM": _JS_Sound_Load_PCM, "_emscripten_glGenVertexArrays": _emscripten_glGenVertexArrays, "_llvm_cttz_i32": _llvm_cttz_i32, "_glDeleteVertexArrays": _glDeleteVertexArrays, "_glGetStringi": _glGetStringi, "_emscripten_glBindAttribLocation": _emscripten_glBindAttribLocation, "_llvm_pow_f32": _llvm_pow_f32, "_glDepthFunc": _glDepthFunc, "___cxa_allocate_exception": ___cxa_allocate_exception, "_emscripten_set_canvas_size": _emscripten_set_canvas_size, "_emscripten_glClearDepthf": _emscripten_glClearDepthf, "_JS_SystemInfo_GetDocumentURL": _JS_SystemInfo_GetDocumentURL, "_emscripten_glMatrixMode": _emscripten_glMatrixMode, "___syscall15": ___syscall15, "_glBlendFuncSeparate": _glBlendFuncSeparate, "___syscall10": ___syscall10, "_emscripten_glNormalPointer": _emscripten_glNormalPointer, "_emscripten_glHint": _emscripten_glHint, "_emscripten_glEnable": _emscripten_glEnable, "___syscall3": ___syscall3, "___lock": ___lock, "_emscripten_glBindFramebuffer": _emscripten_glBindFramebuffer, "___syscall6": ___syscall6, "___syscall5": ___syscall5, "___syscall4": ___syscall4, "_emscripten_glBindRenderbuffer": _emscripten_glBindRenderbuffer, "_time": _time, "_emscripten_glGetFramebufferAttachmentParameteriv": _emscripten_glGetFramebufferAttachmentParameteriv, "_exit": _exit, "_InitApi": _InitApi, "_emscripten_glGetActiveAttrib": _emscripten_glGetActiveAttrib, "_putenv": _putenv, "___syscall268": ___syscall268, "_emscripten_set_keypress_callback": _emscripten_set_keypress_callback, "_JS_SystemInfo_GetOS": _JS_SystemInfo_GetOS, "_glMapBufferRange": _glMapBufferRange, "_JS_SystemInfo_GetBrowserVersionString": _JS_SystemInfo_GetBrowserVersionString, "_glGetIntegeri_v": _glGetIntegeri_v, "_glFramebufferTexture2D": _glFramebufferTexture2D, "_JS_Cursor_SetImage": _JS_Cursor_SetImage, "_emscripten_glShaderBinary": _emscripten_glShaderBinary, "_emscripten_glGetShaderInfoLog": _emscripten_glGetShaderInfoLog, "_glUniform3fv": _glUniform3fv, "_emscripten_glGetVertexAttribPointerv": _emscripten_glGetVertexAttribPointerv, "_glClientWaitSync": _glClientWaitSync, "_JS_FileSystem_SetSyncInterval": _JS_FileSystem_SetSyncInterval, "_emscripten_set_deviceorientation_callback": _emscripten_set_deviceorientation_callback, "___syscall193": ___syscall193, "_emscripten_glGetActiveUniform": _emscripten_glGetActiveUniform, "emscriptenWebGLGetVertexAttrib": emscriptenWebGLGetVertexAttrib, "___syscall197": ___syscall197, "_glUniformBlockBinding": _glUniformBlockBinding, "___syscall195": ___syscall195, "___syscall194": ___syscall194, "___syscall199": ___syscall199, "_emscripten_glDeleteProgram": _emscripten_glDeleteProgram, "_glUniform1i": _glUniform1i, "_glFlushMappedBufferRange": _glFlushMappedBufferRange, "_emscripten_glTexSubImage2D": _emscripten_glTexSubImage2D, "_pthread_mutex_destroy": _pthread_mutex_destroy, "_emscripten_glColorPointer": _emscripten_glColorPointer, "_glVertexAttribPointer": _glVertexAttribPointer, "_glTransformFeedbackVaryings": _glTransformFeedbackVaryings, "_glGetShaderSource": _glGetShaderSource, "_emscripten_glViewport": _emscripten_glViewport, "_emscripten_glDepthMask": _emscripten_glDepthMask, "_emscripten_glDrawBuffers": _emscripten_glDrawBuffers, "_emscripten_glLineWidth": _emscripten_glLineWidth, "_glCompileShader": _glCompileShader, "_emscripten_exit_pointerlock": _emscripten_exit_pointerlock, "_JS_WebRequest_SetRequestHeader": _JS_WebRequest_SetRequestHeader, "_abort": _abort, "_JS_Sound_GetLoadState": _JS_Sound_GetLoadState, "_glTexImage2D": _glTexImage2D, "_glUniform4uiv": _glUniform4uiv, "_glFlush": _glFlush, "_emscripten_glLoadIdentity": _emscripten_glLoadIdentity, "_glDeleteShader": _glDeleteShader, "_emscripten_glShaderSource": _emscripten_glShaderSource, "_glGenVertexArrays": _glGenVertexArrays, "_SDL_CloseAudio": _SDL_CloseAudio, "___gxx_personality_v0": ___gxx_personality_v0, "_emscripten_get_fullscreen_status": _emscripten_get_fullscreen_status, "_emscripten_set_touchend_callback": _emscripten_set_touchend_callback, "_glGetError": _glGetError, "_glGenRenderbuffers": _glGenRenderbuffers, "_emscripten_glSampleCoverage": _emscripten_glSampleCoverage, "_emscripten_glFrustum": _emscripten_glFrustum, "_Mix_FreeChunk": _Mix_FreeChunk, "_emscripten_glDepthRangef": _emscripten_glDepthRangef, "_JS_Sound_SetPitch": _JS_Sound_SetPitch, "_emscripten_glGenerateMipmap": _emscripten_glGenerateMipmap, "_glCopyTexImage2D": _glCopyTexImage2D, "_emscripten_glIsTexture": _emscripten_glIsTexture, "_glCompressedTexSubImage3D": _glCompressedTexSubImage3D, "_emscripten_glBindVertexArray": _emscripten_glBindVertexArray, "_SDL_UpperBlit": _SDL_UpperBlit, "___syscall51": ___syscall51, "_emscripten_glActiveTexture": _emscripten_glActiveTexture, "_emscripten_set_wheel_callback": _emscripten_set_wheel_callback, "_emscripten_glDeleteVertexArrays": _emscripten_glDeleteVertexArrays, "___syscall54": ___syscall54, "_glDeleteTransformFeedbacks": _glDeleteTransformFeedbacks, "_emscripten_glUniform2iv": _emscripten_glUniform2iv, "_pthread_mutexattr_init": _pthread_mutexattr_init, "_glBufferSubData": _glBufferSubData, "_SDL_GL_SwapBuffers": _SDL_GL_SwapBuffers, "_emscripten_glCopyTexSubImage2D": _emscripten_glCopyTexSubImage2D, "_glStencilMask": _glStencilMask, "DYNAMICTOP_PTR": DYNAMICTOP_PTR, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "cttz_i8": cttz_i8 }; // EMSCRIPTEN_START_ASM var asm =Module["asm"]// EMSCRIPTEN_END_ASM (Module.asmGlobalArg, Module.asmLibraryArg, buffer); Module["asm"] = asm; var __GLOBAL__sub_I_File_cpp = Module["__GLOBAL__sub_I_File_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_File_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_platformdependent_webgl_source_0_cpp = Module["__GLOBAL__sub_I_platformdependent_webgl_source_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_platformdependent_webgl_source_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_graphics_6_cpp = Module["__GLOBAL__sub_I_runtime_graphics_6_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_graphics_6_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_UnityAdsSettings_cpp = Module["__GLOBAL__sub_I_UnityAdsSettings_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_UnityAdsSettings_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_GenericMetadata_cpp = Module["__GLOBAL__sub_I_GenericMetadata_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_GenericMetadata_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_modules_tilemap_public_0_cpp = Module["__GLOBAL__sub_I_modules_tilemap_public_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_modules_tilemap_public_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_camera_renderloops_0_cpp = Module["__GLOBAL__sub_I_runtime_camera_renderloops_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_camera_renderloops_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_Console_cpp = Module["__GLOBAL__sub_I_Console_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Console_cpp"].apply(null, arguments) }; var _sbrk = Module["_sbrk"] = function() { return Module["asm"]["_sbrk"].apply(null, arguments) }; var _memcpy = Module["_memcpy"] = function() { return Module["asm"]["_memcpy"].apply(null, arguments) }; var __GLOBAL__sub_I_GCHandle_cpp = Module["__GLOBAL__sub_I_GCHandle_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_GCHandle_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_MetadataCache_cpp = Module["__GLOBAL__sub_I_MetadataCache_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_MetadataCache_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_gfxdevice_1_cpp = Module["__GLOBAL__sub_I_runtime_gfxdevice_1_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_gfxdevice_1_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_shaders_0_cpp = Module["__GLOBAL__sub_I_runtime_shaders_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_shaders_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_modules_tilemap_0_cpp = Module["__GLOBAL__sub_I_modules_tilemap_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_modules_tilemap_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_GlslGpuProgramGLES_cpp = Module["__GLOBAL__sub_I_GlslGpuProgramGLES_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_GlslGpuProgramGLES_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_modules_terrain_public_2_cpp = Module["__GLOBAL__sub_I_modules_terrain_public_2_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_modules_terrain_public_2_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_SpriteRendererJobs_cpp = Module["__GLOBAL__sub_I_SpriteRendererJobs_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_SpriteRendererJobs_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_Runtime_cpp_42981 = Module["__GLOBAL__sub_I_Runtime_cpp_42981"] = function() { return Module["asm"]["__GLOBAL__sub_I_Runtime_cpp_42981"].apply(null, arguments) }; var ___cxx_global_var_init_66 = Module["___cxx_global_var_init_66"] = function() { return Module["asm"]["___cxx_global_var_init_66"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_geometry_0_cpp = Module["__GLOBAL__sub_I_runtime_geometry_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_geometry_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_GenericMethod_cpp = Module["__GLOBAL__sub_I_GenericMethod_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_GenericMethod_cpp"].apply(null, arguments) }; var ___cxa_can_catch = Module["___cxa_can_catch"] = function() { return Module["asm"]["___cxa_can_catch"].apply(null, arguments) }; var _free = Module["_free"] = function() { return Module["asm"]["_free"].apply(null, arguments) }; var runPostSets = Module["runPostSets"] = function() { return Module["asm"]["runPostSets"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_2d_spriteatlas_0_cpp = Module["__GLOBAL__sub_I_runtime_2d_spriteatlas_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_2d_spriteatlas_0_cpp"].apply(null, arguments) }; var _strstr = Module["_strstr"] = function() { return Module["asm"]["_strstr"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_cloth_0_cpp = Module["__GLOBAL__sub_I_runtime_cloth_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_cloth_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_CmEventProfiler_cpp = Module["__GLOBAL__sub_I_CmEventProfiler_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_CmEventProfiler_cpp"].apply(null, arguments) }; var _memalign = Module["_memalign"] = function() { return Module["asm"]["_memalign"].apply(null, arguments) }; var ___cxx_global_var_init_13 = Module["___cxx_global_var_init_13"] = function() { return Module["asm"]["___cxx_global_var_init_13"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_utilities_6_cpp = Module["__GLOBAL__sub_I_runtime_utilities_6_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_utilities_6_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_particlesystem_modules_3_cpp = Module["__GLOBAL__sub_I_runtime_particlesystem_modules_3_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_particlesystem_modules_3_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_Socket_cpp = Module["__GLOBAL__sub_I_Socket_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Socket_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_misc_0_cpp = Module["__GLOBAL__sub_I_runtime_misc_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_misc_0_cpp"].apply(null, arguments) }; var _SetFullscreen = Module["_SetFullscreen"] = function() { return Module["asm"]["_SetFullscreen"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_assetbundles_1_cpp = Module["__GLOBAL__sub_I_runtime_assetbundles_1_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_assetbundles_1_cpp"].apply(null, arguments) }; var _main = Module["_main"] = function() { return Module["asm"]["_main"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_camera_renderloops_1_cpp = Module["__GLOBAL__sub_I_runtime_camera_renderloops_1_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_camera_renderloops_1_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_utilities_0_cpp = Module["__GLOBAL__sub_I_runtime_utilities_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_utilities_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_Assembly_cpp = Module["__GLOBAL__sub_I_Assembly_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Assembly_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_umbra_cpp = Module["__GLOBAL__sub_I_umbra_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_umbra_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_dynamics_2_cpp = Module["__GLOBAL__sub_I_runtime_dynamics_2_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_dynamics_2_cpp"].apply(null, arguments) }; var ___cxx_global_var_init_128 = Module["___cxx_global_var_init_128"] = function() { return Module["asm"]["___cxx_global_var_init_128"].apply(null, arguments) }; var ___cxa_is_pointer_type = Module["___cxa_is_pointer_type"] = function() { return Module["asm"]["___cxa_is_pointer_type"].apply(null, arguments) }; var _llvm_ctlz_i64 = Module["_llvm_ctlz_i64"] = function() { return Module["asm"]["_llvm_ctlz_i64"].apply(null, arguments) }; var __GLOBAL__sub_I_artifacts_generated_webgl_modules_vr_0_cpp = Module["__GLOBAL__sub_I_artifacts_generated_webgl_modules_vr_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_artifacts_generated_webgl_modules_vr_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_scripting_2_cpp = Module["__GLOBAL__sub_I_runtime_scripting_2_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_scripting_2_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_RCW_cpp = Module["__GLOBAL__sub_I_RCW_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_RCW_cpp"].apply(null, arguments) }; var _pthread_self = Module["_pthread_self"] = function() { return Module["asm"]["_pthread_self"].apply(null, arguments) }; var _ntohs = Module["_ntohs"] = function() { return Module["asm"]["_ntohs"].apply(null, arguments) }; var __GLOBAL__sub_I_modules_terrain_public_0_cpp = Module["__GLOBAL__sub_I_modules_terrain_public_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_modules_terrain_public_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_modules_terrain_public_1_cpp = Module["__GLOBAL__sub_I_modules_terrain_public_1_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_modules_terrain_public_1_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_MemoryMappedFile_cpp = Module["__GLOBAL__sub_I_MemoryMappedFile_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_MemoryMappedFile_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_vr_1_cpp = Module["__GLOBAL__sub_I_runtime_vr_1_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_vr_1_cpp"].apply(null, arguments) }; var _llvm_bswap_i32 = Module["_llvm_bswap_i32"] = function() { return Module["asm"]["_llvm_bswap_i32"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_particlesystem_modules_5_cpp = Module["__GLOBAL__sub_I_runtime_particlesystem_modules_5_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_particlesystem_modules_5_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_String_cpp = Module["__GLOBAL__sub_I_String_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_String_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_Reflection_cpp = Module["__GLOBAL__sub_I_Reflection_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Reflection_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_camera_5_cpp = Module["__GLOBAL__sub_I_runtime_camera_5_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_camera_5_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_graphics_7_cpp = Module["__GLOBAL__sub_I_runtime_graphics_7_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_graphics_7_cpp"].apply(null, arguments) }; var ___cxx_global_var_init_18 = Module["___cxx_global_var_init_18"] = function() { return Module["asm"]["___cxx_global_var_init_18"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_input_0_cpp = Module["__GLOBAL__sub_I_runtime_input_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_input_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_ArrayMetadata_cpp = Module["__GLOBAL__sub_I_ArrayMetadata_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_ArrayMetadata_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_NativeDelegateMethodCache_cpp = Module["__GLOBAL__sub_I_NativeDelegateMethodCache_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_NativeDelegateMethodCache_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_shaders_shaderimpl_0_cpp = Module["__GLOBAL__sub_I_runtime_shaders_shaderimpl_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_shaders_shaderimpl_0_cpp"].apply(null, arguments) }; var _roundf = Module["_roundf"] = function() { return Module["asm"]["_roundf"].apply(null, arguments) }; var __GLOBAL__sub_I_LibraryLoader_cpp = Module["__GLOBAL__sub_I_LibraryLoader_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_LibraryLoader_cpp"].apply(null, arguments) }; var _SendMessageFloat = Module["_SendMessageFloat"] = function() { return Module["asm"]["_SendMessageFloat"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_baseclasses_2_cpp = Module["__GLOBAL__sub_I_runtime_baseclasses_2_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_baseclasses_2_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_graphics_mesh_2_cpp = Module["__GLOBAL__sub_I_runtime_graphics_mesh_2_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_graphics_mesh_2_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_modules_profiler_public_0_cpp = Module["__GLOBAL__sub_I_modules_profiler_public_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_modules_profiler_public_0_cpp"].apply(null, arguments) }; var _memset = Module["_memset"] = function() { return Module["asm"]["_memset"].apply(null, arguments) }; var __GLOBAL__sub_I_StackTrace_cpp = Module["__GLOBAL__sub_I_StackTrace_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_StackTrace_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_Interlocked_cpp = Module["__GLOBAL__sub_I_Interlocked_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Interlocked_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_Environment_cpp = Module["__GLOBAL__sub_I_Environment_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Environment_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_SwCollision_cpp = Module["__GLOBAL__sub_I_SwCollision_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_SwCollision_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_camera_3_cpp = Module["__GLOBAL__sub_I_runtime_camera_3_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_camera_3_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_graphics_mesh_0_cpp = Module["__GLOBAL__sub_I_runtime_graphics_mesh_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_graphics_mesh_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_PxsFluidDynamics_cpp = Module["__GLOBAL__sub_I_PxsFluidDynamics_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_PxsFluidDynamics_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_scenemanager_0_cpp = Module["__GLOBAL__sub_I_runtime_scenemanager_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_scenemanager_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_ui_0_cpp = Module["__GLOBAL__sub_I_runtime_ui_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_ui_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_Class_cpp = Module["__GLOBAL__sub_I_Class_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Class_cpp"].apply(null, arguments) }; var _pthread_cond_broadcast = Module["_pthread_cond_broadcast"] = function() { return Module["asm"]["_pthread_cond_broadcast"].apply(null, arguments) }; var __GLOBAL__sub_I_Image_cpp = Module["__GLOBAL__sub_I_Image_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Image_cpp"].apply(null, arguments) }; var ___cxx_global_var_init_5_1260 = Module["___cxx_global_var_init_5_1260"] = function() { return Module["asm"]["___cxx_global_var_init_5_1260"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_camera_0_cpp = Module["__GLOBAL__sub_I_runtime_camera_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_camera_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_Path_cpp = Module["__GLOBAL__sub_I_Path_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Path_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_SwSelfCollision_cpp = Module["__GLOBAL__sub_I_SwSelfCollision_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_SwSelfCollision_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_dynamics_0_cpp = Module["__GLOBAL__sub_I_runtime_dynamics_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_dynamics_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_Il2CppCodeRegistration_cpp = Module["__GLOBAL__sub_I_Il2CppCodeRegistration_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Il2CppCodeRegistration_cpp"].apply(null, arguments) }; var _malloc = Module["_malloc"] = function() { return Module["asm"]["_malloc"].apply(null, arguments) }; var __GLOBAL__sub_I_Runtime_cpp = Module["__GLOBAL__sub_I_Runtime_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Runtime_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_ThreadImpl_cpp = Module["__GLOBAL__sub_I_ThreadImpl_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_ThreadImpl_cpp"].apply(null, arguments) }; var _SendMessage = Module["_SendMessage"] = function() { return Module["asm"]["_SendMessage"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_camera_1_cpp = Module["__GLOBAL__sub_I_runtime_camera_1_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_camera_1_cpp"].apply(null, arguments) }; var ___cxx_global_var_init_7_2511 = Module["___cxx_global_var_init_7_2511"] = function() { return Module["asm"]["___cxx_global_var_init_7_2511"].apply(null, arguments) }; var __GLOBAL__sub_I_SwSolverKernel_cpp = Module["__GLOBAL__sub_I_SwSolverKernel_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_SwSolverKernel_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_Thread_cpp_41939 = Module["__GLOBAL__sub_I_Thread_cpp_41939"] = function() { return Module["asm"]["__GLOBAL__sub_I_Thread_cpp_41939"].apply(null, arguments) }; var __GLOBAL__sub_I_modules_terrain_vr_0_cpp = Module["__GLOBAL__sub_I_modules_terrain_vr_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_modules_terrain_vr_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_core_callbacks_0_cpp = Module["__GLOBAL__sub_I_runtime_core_callbacks_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_core_callbacks_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_Error_cpp = Module["__GLOBAL__sub_I_Error_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Error_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_scripting_0_cpp = Module["__GLOBAL__sub_I_runtime_scripting_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_scripting_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_Thread_cpp = Module["__GLOBAL__sub_I_Thread_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_Thread_cpp"].apply(null, arguments) }; var _pthread_mutex_lock = Module["_pthread_mutex_lock"] = function() { return Module["asm"]["_pthread_mutex_lock"].apply(null, arguments) }; var __GLOBAL__sub_I_AppDomain_cpp = Module["__GLOBAL__sub_I_AppDomain_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_AppDomain_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_GarbageCollector_cpp = Module["__GLOBAL__sub_I_GarbageCollector_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_GarbageCollector_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_video_0_cpp = Module["__GLOBAL__sub_I_runtime_video_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_video_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_modules_profiler_runtime_0_cpp = Module["__GLOBAL__sub_I_modules_profiler_runtime_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_modules_profiler_runtime_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_SwInterCollision_cpp = Module["__GLOBAL__sub_I_SwInterCollision_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_SwInterCollision_cpp"].apply(null, arguments) }; var _htonl = Module["_htonl"] = function() { return Module["asm"]["_htonl"].apply(null, arguments) }; var _realloc = Module["_realloc"] = function() { return Module["asm"]["_realloc"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_camera_6_cpp = Module["__GLOBAL__sub_I_runtime_camera_6_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_camera_6_cpp"].apply(null, arguments) }; var _pthread_mutex_unlock = Module["_pthread_mutex_unlock"] = function() { return Module["asm"]["_pthread_mutex_unlock"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_gfxdevice_2_cpp = Module["__GLOBAL__sub_I_runtime_gfxdevice_2_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_gfxdevice_2_cpp"].apply(null, arguments) }; var _htons = Module["_htons"] = function() { return Module["asm"]["_htons"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_math_random_0_cpp = Module["__GLOBAL__sub_I_runtime_math_random_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_math_random_0_cpp"].apply(null, arguments) }; var ___errno_location = Module["___errno_location"] = function() { return Module["asm"]["___errno_location"].apply(null, arguments) }; var _SendMessageString = Module["_SendMessageString"] = function() { return Module["asm"]["_SendMessageString"].apply(null, arguments) }; var _llvm_bswap_i16 = Module["_llvm_bswap_i16"] = function() { return Module["asm"]["_llvm_bswap_i16"].apply(null, arguments) }; var __GLOBAL__sub_I_Assembly_cpp_42452 = Module["__GLOBAL__sub_I_Assembly_cpp_42452"] = function() { return Module["asm"]["__GLOBAL__sub_I_Assembly_cpp_42452"].apply(null, arguments) }; var _memmove = Module["_memmove"] = function() { return Module["asm"]["_memmove"].apply(null, arguments) }; var __GLOBAL__sub_I_platformdependent_webgl_source_1_cpp = Module["__GLOBAL__sub_I_platformdependent_webgl_source_1_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_platformdependent_webgl_source_1_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_graphics_billboard_0_cpp = Module["__GLOBAL__sub_I_runtime_graphics_billboard_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_graphics_billboard_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_camera_renderlayers_0_cpp = Module["__GLOBAL__sub_I_runtime_camera_renderlayers_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_camera_renderlayers_0_cpp"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_utilities_4_cpp = Module["__GLOBAL__sub_I_runtime_utilities_4_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_utilities_4_cpp"].apply(null, arguments) }; var ___cxx_global_var_init_74 = Module["___cxx_global_var_init_74"] = function() { return Module["asm"]["___cxx_global_var_init_74"].apply(null, arguments) }; var ___cxx_global_var_init_75 = Module["___cxx_global_var_init_75"] = function() { return Module["asm"]["___cxx_global_var_init_75"].apply(null, arguments) }; var __GLOBAL__sub_I_runtime_imgui_0_cpp = Module["__GLOBAL__sub_I_runtime_imgui_0_cpp"] = function() { return Module["asm"]["__GLOBAL__sub_I_runtime_imgui_0_cpp"].apply(null, arguments) }; var dynCall_diji = Module["dynCall_diji"] = function() { return Module["asm"]["dynCall_diji"].apply(null, arguments) }; var dynCall_diddi = Module["dynCall_diddi"] = function() { return Module["asm"]["dynCall_diddi"].apply(null, arguments) }; var dynCall_viij = Module["dynCall_viij"] = function() { return Module["asm"]["dynCall_viij"].apply(null, arguments) }; var dynCall_fiff = Module["dynCall_fiff"] = function() { return Module["asm"]["dynCall_fiff"].apply(null, arguments) }; var dynCall_fifi = Module["dynCall_fifi"] = function() { return Module["asm"]["dynCall_fifi"].apply(null, arguments) }; var dynCall_vijjiiiiii = Module["dynCall_vijjiiiiii"] = function() { return Module["asm"]["dynCall_vijjiiiiii"].apply(null, arguments) }; var dynCall_iiiiiii = Module["dynCall_iiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiii"].apply(null, arguments) }; var dynCall_vidi = Module["dynCall_vidi"] = function() { return Module["asm"]["dynCall_vidi"].apply(null, arguments) }; var dynCall_vifiiiiiiiiiiiiiiiiii = Module["dynCall_vifiiiiiiiiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_vifiiiiiiiiiiiiiiiiii"].apply(null, arguments) }; var dynCall_viiiiiiiiiii = Module["dynCall_viiiiiiiiiii"] = function() { return Module["asm"]["dynCall_viiiiiiiiiii"].apply(null, arguments) }; var dynCall_fff = Module["dynCall_fff"] = function() { return Module["asm"]["dynCall_fff"].apply(null, arguments) }; var dynCall_iidi = Module["dynCall_iidi"] = function() { return Module["asm"]["dynCall_iidi"].apply(null, arguments) }; var dynCall_jiji = Module["dynCall_jiji"] = function() { return Module["asm"]["dynCall_jiji"].apply(null, arguments) }; var dynCall_fiiiiiifiiiiiif = Module["dynCall_fiiiiiifiiiiiif"] = function() { return Module["asm"]["dynCall_fiiiiiifiiiiiif"].apply(null, arguments) }; var dynCall_iiiiifiif = Module["dynCall_iiiiifiif"] = function() { return Module["asm"]["dynCall_iiiiifiif"].apply(null, arguments) }; var dynCall_iiiiifii = Module["dynCall_iiiiifii"] = function() { return Module["asm"]["dynCall_iiiiifii"].apply(null, arguments) }; var dynCall_viiiiiffi = Module["dynCall_viiiiiffi"] = function() { return Module["asm"]["dynCall_viiiiiffi"].apply(null, arguments) }; var dynCall_viifiiii = Module["dynCall_viifiiii"] = function() { return Module["asm"]["dynCall_viifiiii"].apply(null, arguments) }; var dynCall_viiijiii = Module["dynCall_viiijiii"] = function() { return Module["asm"]["dynCall_viiijiii"].apply(null, arguments) }; var dynCall_iiiiifiii = Module["dynCall_iiiiifiii"] = function() { return Module["asm"]["dynCall_iiiiifiii"].apply(null, arguments) }; var dynCall_iiffi = Module["dynCall_iiffi"] = function() { return Module["asm"]["dynCall_iiffi"].apply(null, arguments) }; var dynCall_jii = Module["dynCall_jii"] = function() { return Module["asm"]["dynCall_jii"].apply(null, arguments) }; var dynCall_iiiiiiiiiiii = Module["dynCall_iiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiiiiiiii"].apply(null, arguments) }; var dynCall_fif = Module["dynCall_fif"] = function() { return Module["asm"]["dynCall_fif"].apply(null, arguments) }; var dynCall_viiiiiiiiiiiiiii = Module["dynCall_viiiiiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_viiiiiiiiiiiiiii"].apply(null, arguments) }; var dynCall_viiiiif = Module["dynCall_viiiiif"] = function() { return Module["asm"]["dynCall_viiiiif"].apply(null, arguments) }; var dynCall_fii = Module["dynCall_fii"] = function() { return Module["asm"]["dynCall_fii"].apply(null, arguments) }; var dynCall_viiiiifii = Module["dynCall_viiiiifii"] = function() { return Module["asm"]["dynCall_viiiiifii"].apply(null, arguments) }; var dynCall_di = Module["dynCall_di"] = function() { return Module["asm"]["dynCall_di"].apply(null, arguments) }; var dynCall_viff = Module["dynCall_viff"] = function() { return Module["asm"]["dynCall_viff"].apply(null, arguments) }; var dynCall_iiifiii = Module["dynCall_iiifiii"] = function() { return Module["asm"]["dynCall_iiifiii"].apply(null, arguments) }; var dynCall_viffff = Module["dynCall_viffff"] = function() { return Module["asm"]["dynCall_viffff"].apply(null, arguments) }; var dynCall_jijji = Module["dynCall_jijji"] = function() { return Module["asm"]["dynCall_jijji"].apply(null, arguments) }; var dynCall_vijiiii = Module["dynCall_vijiiii"] = function() { return Module["asm"]["dynCall_vijiiii"].apply(null, arguments) }; var dynCall_viiji = Module["dynCall_viiji"] = function() { return Module["asm"]["dynCall_viiji"].apply(null, arguments) }; var dynCall_viiiiijiiii = Module["dynCall_viiiiijiiii"] = function() { return Module["asm"]["dynCall_viiiiijiiii"].apply(null, arguments) }; var dynCall_iiijjii = Module["dynCall_iiijjii"] = function() { return Module["asm"]["dynCall_iiijjii"].apply(null, arguments) }; var dynCall_viiffiii = Module["dynCall_viiffiii"] = function() { return Module["asm"]["dynCall_viiffiii"].apply(null, arguments) }; var dynCall_dii = Module["dynCall_dii"] = function() { return Module["asm"]["dynCall_dii"].apply(null, arguments) }; var dynCall_iifii = Module["dynCall_iifii"] = function() { return Module["asm"]["dynCall_iifii"].apply(null, arguments) }; var dynCall_didi = Module["dynCall_didi"] = function() { return Module["asm"]["dynCall_didi"].apply(null, arguments) }; var dynCall_iiifiifi = Module["dynCall_iiifiifi"] = function() { return Module["asm"]["dynCall_iiifiifi"].apply(null, arguments) }; var dynCall_iiiii = Module["dynCall_iiiii"] = function() { return Module["asm"]["dynCall_iiiii"].apply(null, arguments) }; var dynCall_iidii = Module["dynCall_iidii"] = function() { return Module["asm"]["dynCall_iidii"].apply(null, arguments) }; var dynCall_iiiij = Module["dynCall_iiiij"] = function() { return Module["asm"]["dynCall_iiiij"].apply(null, arguments) }; var dynCall_iiiiiiiiiiiiffffii = Module["dynCall_iiiiiiiiiiiiffffii"] = function() { return Module["asm"]["dynCall_iiiiiiiiiiiiffffii"].apply(null, arguments) }; var dynCall_vdd = Module["dynCall_vdd"] = function() { return Module["asm"]["dynCall_vdd"].apply(null, arguments) }; var dynCall_fiiifii = Module["dynCall_fiiifii"] = function() { return Module["asm"]["dynCall_fiiifii"].apply(null, arguments) }; var dynCall_viiiiiiffii = Module["dynCall_viiiiiiffii"] = function() { return Module["asm"]["dynCall_viiiiiiffii"].apply(null, arguments) }; var dynCall_viffii = Module["dynCall_viffii"] = function() { return Module["asm"]["dynCall_viffii"].apply(null, arguments) }; var dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiiii"].apply(null, arguments) }; var dynCall_viiiififii = Module["dynCall_viiiififii"] = function() { return Module["asm"]["dynCall_viiiififii"].apply(null, arguments) }; var dynCall_vffff = Module["dynCall_vffff"] = function() { return Module["asm"]["dynCall_vffff"].apply(null, arguments) }; var dynCall_iijjii = Module["dynCall_iijjii"] = function() { return Module["asm"]["dynCall_iijjii"].apply(null, arguments) }; var dynCall_vdddddd = Module["dynCall_vdddddd"] = function() { return Module["asm"]["dynCall_vdddddd"].apply(null, arguments) }; var dynCall_vifiiiiiiiiiiiii = Module["dynCall_vifiiiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_vifiiiiiiiiiiiii"].apply(null, arguments) }; var dynCall_iiiji = Module["dynCall_iiiji"] = function() { return Module["asm"]["dynCall_iiiji"].apply(null, arguments) }; var dynCall_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii = Module["dynCall_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"].apply(null, arguments) }; var dynCall_iiiiiiif = Module["dynCall_iiiiiiif"] = function() { return Module["asm"]["dynCall_iiiiiiif"].apply(null, arguments) }; var dynCall_viidi = Module["dynCall_viidi"] = function() { return Module["asm"]["dynCall_viidi"].apply(null, arguments) }; var dynCall_viiffii = Module["dynCall_viiffii"] = function() { return Module["asm"]["dynCall_viiffii"].apply(null, arguments) }; var dynCall_ijj = Module["dynCall_ijj"] = function() { return Module["asm"]["dynCall_ijj"].apply(null, arguments) }; var dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiiiiii"].apply(null, arguments) }; var dynCall_iiiiifiiiif = Module["dynCall_iiiiifiiiif"] = function() { return Module["asm"]["dynCall_iiiiifiiiif"].apply(null, arguments) }; var dynCall_fiffi = Module["dynCall_fiffi"] = function() { return Module["asm"]["dynCall_fiffi"].apply(null, arguments) }; var dynCall_iiifii = Module["dynCall_iiifii"] = function() { return Module["asm"]["dynCall_iiifii"].apply(null, arguments) }; var dynCall_viiiiiiiiiiiiiiiii = Module["dynCall_viiiiiiiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_viiiiiiiiiiiiiiiii"].apply(null, arguments) }; var dynCall_jiijiii = Module["dynCall_jiijiii"] = function() { return Module["asm"]["dynCall_jiijiii"].apply(null, arguments) }; var dynCall_iiiiiiiiiiiiii = Module["dynCall_iiiiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiiiiiiiiii"].apply(null, arguments) }; var dynCall_jijjji = Module["dynCall_jijjji"] = function() { return Module["asm"]["dynCall_jijjji"].apply(null, arguments) }; var dynCall_vifiiiiiiiiiiiiiiiiiiiiiiiiiiii = Module["dynCall_vifiiiiiiiiiiiiiiiiiiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_vifiiiiiiiiiiiiiiiiiiiiiiiiiiii"].apply(null, arguments) }; var dynCall_viffi = Module["dynCall_viffi"] = function() { return Module["asm"]["dynCall_viffi"].apply(null, arguments) }; var dynCall_iiiifiiii = Module["dynCall_iiiifiiii"] = function() { return Module["asm"]["dynCall_iiiifiiii"].apply(null, arguments) }; var dynCall_vifi = Module["dynCall_vifi"] = function() { return Module["asm"]["dynCall_vifi"].apply(null, arguments) }; var dynCall_viijj = Module["dynCall_viijj"] = function() { return Module["asm"]["dynCall_viijj"].apply(null, arguments) }; var dynCall_vifff = Module["dynCall_vifff"] = function() { return Module["asm"]["dynCall_vifff"].apply(null, arguments) }; var dynCall_viiiiii = Module["dynCall_viiiiii"] = function() { return Module["asm"]["dynCall_viiiiii"].apply(null, arguments) }; var dynCall_viififiii = Module["dynCall_viififiii"] = function() { return Module["asm"]["dynCall_viififiii"].apply(null, arguments) }; var dynCall_viiiiiiiiiiiiii = Module["dynCall_viiiiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_viiiiiiiiiiiiii"].apply(null, arguments) }; var dynCall_fiii = Module["dynCall_fiii"] = function() { return Module["asm"]["dynCall_fiii"].apply(null, arguments) }; var dynCall_iiiiiifffiiifii = Module["dynCall_iiiiiifffiiifii"] = function() { return Module["asm"]["dynCall_iiiiiifffiiifii"].apply(null, arguments) }; var dynCall_iifff = Module["dynCall_iifff"] = function() { return Module["asm"]["dynCall_iifff"].apply(null, arguments) }; var dynCall_iifiii = Module["dynCall_iifiii"] = function() { return Module["asm"]["dynCall_iifiii"].apply(null, arguments) }; var dynCall_iiijii = Module["dynCall_iiijii"] = function() { return Module["asm"]["dynCall_iiijii"].apply(null, arguments) }; var dynCall_iiidiiii = Module["dynCall_iiidiiii"] = function() { return Module["asm"]["dynCall_iiidiiii"].apply(null, arguments) }; var dynCall_jidi = Module["dynCall_jidi"] = function() { return Module["asm"]["dynCall_jidi"].apply(null, arguments) }; var dynCall_iiifiifii = Module["dynCall_iiifiifii"] = function() { return Module["asm"]["dynCall_iiifiifii"].apply(null, arguments) }; var dynCall_ji = Module["dynCall_ji"] = function() { return Module["asm"]["dynCall_ji"].apply(null, arguments) }; var dynCall_iiddi = Module["dynCall_iiddi"] = function() { return Module["asm"]["dynCall_iiddi"].apply(null, arguments) }; var dynCall_viiiiiiiiii = Module["dynCall_viiiiiiiiii"] = function() { return Module["asm"]["dynCall_viiiiiiiiii"].apply(null, arguments) }; var dynCall_iiiiiiffiiiiiiiiiffffiii = Module["dynCall_iiiiiiffiiiiiiiiiffffiii"] = function() { return Module["asm"]["dynCall_iiiiiiffiiiiiiiiiffffiii"].apply(null, arguments) }; var dynCall_diii = Module["dynCall_diii"] = function() { return Module["asm"]["dynCall_diii"].apply(null, arguments) }; var dynCall_viiiji = Module["dynCall_viiiji"] = function() { return Module["asm"]["dynCall_viiiji"].apply(null, arguments) }; var dynCall_vff = Module["dynCall_vff"] = function() { return Module["asm"]["dynCall_vff"].apply(null, arguments) }; var dynCall_viijijiii = Module["dynCall_viijijiii"] = function() { return Module["asm"]["dynCall_viijijiii"].apply(null, arguments) }; var dynCall_viijijji = Module["dynCall_viijijji"] = function() { return Module["asm"]["dynCall_viijijji"].apply(null, arguments) }; var dynCall_fiiii = Module["dynCall_fiiii"] = function() { return Module["asm"]["dynCall_fiiii"].apply(null, arguments) }; var dynCall_iiiiii = Module["dynCall_iiiiii"] = function() { return Module["asm"]["dynCall_iiiiii"].apply(null, arguments) }; var dynCall_viiiifii = Module["dynCall_viiiifii"] = function() { return Module["asm"]["dynCall_viiiifii"].apply(null, arguments) }; var dynCall_vijii = Module["dynCall_vijii"] = function() { return Module["asm"]["dynCall_vijii"].apply(null, arguments) }; var dynCall_iiiiffi = Module["dynCall_iiiiffi"] = function() { return Module["asm"]["dynCall_iiiiffi"].apply(null, arguments) }; var dynCall_jidji = Module["dynCall_jidji"] = function() { return Module["asm"]["dynCall_jidji"].apply(null, arguments) }; var dynCall_viidii = Module["dynCall_viidii"] = function() { return Module["asm"]["dynCall_viidii"].apply(null, arguments) }; var dynCall_vjji = Module["dynCall_vjji"] = function() { return Module["asm"]["dynCall_vjji"].apply(null, arguments) }; var dynCall_iiiiiifiif = Module["dynCall_iiiiiifiif"] = function() { return Module["asm"]["dynCall_iiiiiifiif"].apply(null, arguments) }; var dynCall_viiii = Module["dynCall_viiii"] = function() { return Module["asm"]["dynCall_viiii"].apply(null, arguments) }; var dynCall_jijii = Module["dynCall_jijii"] = function() { return Module["asm"]["dynCall_jijii"].apply(null, arguments) }; var dynCall_viiiii = Module["dynCall_viiiii"] = function() { return Module["asm"]["dynCall_viiiii"].apply(null, arguments) }; var dynCall_viifii = Module["dynCall_viifii"] = function() { return Module["asm"]["dynCall_viifii"].apply(null, arguments) }; var dynCall_iifffi = Module["dynCall_iifffi"] = function() { return Module["asm"]["dynCall_iifffi"].apply(null, arguments) }; var dynCall_vif = Module["dynCall_vif"] = function() { return Module["asm"]["dynCall_vif"].apply(null, arguments) }; var dynCall_vid = Module["dynCall_vid"] = function() { return Module["asm"]["dynCall_vid"].apply(null, arguments) }; var dynCall_iiidi = Module["dynCall_iiidi"] = function() { return Module["asm"]["dynCall_iiidi"].apply(null, arguments) }; var dynCall_vij = Module["dynCall_vij"] = function() { return Module["asm"]["dynCall_vij"].apply(null, arguments) }; var dynCall_vii = Module["dynCall_vii"] = function() { return Module["asm"]["dynCall_vii"].apply(null, arguments) }; var dynCall_vijji = Module["dynCall_vijji"] = function() { return Module["asm"]["dynCall_vijji"].apply(null, arguments) }; var dynCall_viiiif = Module["dynCall_viiiif"] = function() { return Module["asm"]["dynCall_viiiif"].apply(null, arguments) }; var dynCall_difi = Module["dynCall_difi"] = function() { return Module["asm"]["dynCall_difi"].apply(null, arguments) }; var dynCall_fi = Module["dynCall_fi"] = function() { return Module["asm"]["dynCall_fi"].apply(null, arguments) }; var dynCall_iiififiiii = Module["dynCall_iiififiiii"] = function() { return Module["asm"]["dynCall_iiififiiii"].apply(null, arguments) }; var dynCall_fiji = Module["dynCall_fiji"] = function() { return Module["asm"]["dynCall_fiji"].apply(null, arguments) }; var dynCall_jiiiiiii = Module["dynCall_jiiiiiii"] = function() { return Module["asm"]["dynCall_jiiiiiii"].apply(null, arguments) }; var dynCall_vijj = Module["dynCall_vijj"] = function() { return Module["asm"]["dynCall_vijj"].apply(null, arguments) }; var dynCall_vf = Module["dynCall_vf"] = function() { return Module["asm"]["dynCall_vf"].apply(null, arguments) }; var dynCall_iiiiiiffiiiiiiiiiiiiiii = Module["dynCall_iiiiiiffiiiiiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiiffiiiiiiiiiiiiiii"].apply(null, arguments) }; var dynCall_fiiiiiiiifiiiif = Module["dynCall_fiiiiiiiifiiiif"] = function() { return Module["asm"]["dynCall_fiiiiiiiifiiiif"].apply(null, arguments) }; var dynCall_iiifiifiii = Module["dynCall_iiifiifiii"] = function() { return Module["asm"]["dynCall_iiifiifiii"].apply(null, arguments) }; var dynCall_viffffii = Module["dynCall_viffffii"] = function() { return Module["asm"]["dynCall_viffffii"].apply(null, arguments) }; var dynCall_vifiii = Module["dynCall_vifiii"] = function() { return Module["asm"]["dynCall_vifiii"].apply(null, arguments) }; var dynCall_viijjii = Module["dynCall_viijjii"] = function() { return Module["asm"]["dynCall_viijjii"].apply(null, arguments) }; var dynCall_iijjji = Module["dynCall_iijjji"] = function() { return Module["asm"]["dynCall_iijjji"].apply(null, arguments) }; var dynCall_diiii = Module["dynCall_diiii"] = function() { return Module["asm"]["dynCall_diiii"].apply(null, arguments) }; var dynCall_iiifiiii = Module["dynCall_iiifiiii"] = function() { return Module["asm"]["dynCall_iiifiiii"].apply(null, arguments) }; var dynCall_viiiiiiiiiiiii = Module["dynCall_viiiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_viiiiiiiiiiiii"].apply(null, arguments) }; var dynCall_iiiiiiiiiiffffii = Module["dynCall_iiiiiiiiiiffffii"] = function() { return Module["asm"]["dynCall_iiiiiiiiiiffffii"].apply(null, arguments) }; var dynCall_iiiiifi = Module["dynCall_iiiiifi"] = function() { return Module["asm"]["dynCall_iiiiifi"].apply(null, arguments) }; var dynCall_fifii = Module["dynCall_fifii"] = function() { return Module["asm"]["dynCall_fifii"].apply(null, arguments) }; var dynCall_viji = Module["dynCall_viji"] = function() { return Module["asm"]["dynCall_viji"].apply(null, arguments) }; var dynCall_viiiiiiii = Module["dynCall_viiiiiiii"] = function() { return Module["asm"]["dynCall_viiiiiiii"].apply(null, arguments) }; var dynCall_fiffifffi = Module["dynCall_fiffifffi"] = function() { return Module["asm"]["dynCall_fiffifffi"].apply(null, arguments) }; var dynCall_viiff = Module["dynCall_viiff"] = function() { return Module["asm"]["dynCall_viiff"].apply(null, arguments) }; var dynCall_iif = Module["dynCall_iif"] = function() { return Module["asm"]["dynCall_iif"].apply(null, arguments) }; var dynCall_vifiiii = Module["dynCall_vifiiii"] = function() { return Module["asm"]["dynCall_vifiiii"].apply(null, arguments) }; var dynCall_viiiiiii = Module["dynCall_viiiiiii"] = function() { return Module["asm"]["dynCall_viiiiiii"].apply(null, arguments) }; var dynCall_vijiji = Module["dynCall_vijiji"] = function() { return Module["asm"]["dynCall_vijiji"].apply(null, arguments) }; var dynCall_vifii = Module["dynCall_vifii"] = function() { return Module["asm"]["dynCall_vifii"].apply(null, arguments) }; var dynCall_viiiiiiiii = Module["dynCall_viiiiiiiii"] = function() { return Module["asm"]["dynCall_viiiiiiiii"].apply(null, arguments) }; var dynCall_viiiiiif = Module["dynCall_viiiiiif"] = function() { return Module["asm"]["dynCall_viiiiiif"].apply(null, arguments) }; var dynCall_viijji = Module["dynCall_viijji"] = function() { return Module["asm"]["dynCall_viijji"].apply(null, arguments) }; var dynCall_iii = Module["dynCall_iii"] = function() { return Module["asm"]["dynCall_iii"].apply(null, arguments) }; var dynCall_viifiii = Module["dynCall_viifiii"] = function() { return Module["asm"]["dynCall_viifiii"].apply(null, arguments) }; var dynCall_iij = Module["dynCall_iij"] = function() { return Module["asm"]["dynCall_iij"].apply(null, arguments) }; var dynCall_viiijiiiiii = Module["dynCall_viiijiiiiii"] = function() { return Module["asm"]["dynCall_viiijiiiiii"].apply(null, arguments) }; var dynCall_iiiifii = Module["dynCall_iiiifii"] = function() { return Module["asm"]["dynCall_iiiifii"].apply(null, arguments) }; var dynCall_f = Module["dynCall_f"] = function() { return Module["asm"]["dynCall_f"].apply(null, arguments) }; var dynCall_jiiii = Module["dynCall_jiiii"] = function() { return Module["asm"]["dynCall_jiiii"].apply(null, arguments) }; var dynCall_viijii = Module["dynCall_viijii"] = function() { return Module["asm"]["dynCall_viijii"].apply(null, arguments) }; var dynCall_viiiifiiiiif = Module["dynCall_viiiifiiiiif"] = function() { return Module["asm"]["dynCall_viiiifiiiiif"].apply(null, arguments) }; var dynCall_viififi = Module["dynCall_viififi"] = function() { return Module["asm"]["dynCall_viififi"].apply(null, arguments) }; var dynCall_viii = Module["dynCall_viii"] = function() { return Module["asm"]["dynCall_viii"].apply(null, arguments) }; var dynCall_viiiifi = Module["dynCall_viiiifi"] = function() { return Module["asm"]["dynCall_viiiifi"].apply(null, arguments) }; var dynCall_jiii = Module["dynCall_jiii"] = function() { return Module["asm"]["dynCall_jiii"].apply(null, arguments) }; var dynCall_iiji = Module["dynCall_iiji"] = function() { return Module["asm"]["dynCall_iiji"].apply(null, arguments) }; var dynCall_viif = Module["dynCall_viif"] = function() { return Module["asm"]["dynCall_viif"].apply(null, arguments) }; var dynCall_vijiii = Module["dynCall_vijiii"] = function() { return Module["asm"]["dynCall_vijiii"].apply(null, arguments) }; var dynCall_fiiifi = Module["dynCall_fiiifi"] = function() { return Module["asm"]["dynCall_fiiifi"].apply(null, arguments) }; var dynCall_iiiifi = Module["dynCall_iiiifi"] = function() { return Module["asm"]["dynCall_iiiifi"].apply(null, arguments) }; var dynCall_v = Module["dynCall_v"] = function() { return Module["asm"]["dynCall_v"].apply(null, arguments) }; var dynCall_vd = Module["dynCall_vd"] = function() { return Module["asm"]["dynCall_vd"].apply(null, arguments) }; var dynCall_viifi = Module["dynCall_viifi"] = function() { return Module["asm"]["dynCall_viifi"].apply(null, arguments) }; var dynCall_fiifi = Module["dynCall_fiifi"] = function() { return Module["asm"]["dynCall_fiifi"].apply(null, arguments) }; var dynCall_vi = Module["dynCall_vi"] = function() { return Module["asm"]["dynCall_vi"].apply(null, arguments) }; var dynCall_iiiiiiiiiii = Module["dynCall_iiiiiiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiiiiiii"].apply(null, arguments) }; var dynCall_iiiiiiiffiiiiiiiiiffffiiii = Module["dynCall_iiiiiiiffiiiiiiiiiffffiiii"] = function() { return Module["asm"]["dynCall_iiiiiiiffiiiiiiiiiffffiiii"].apply(null, arguments) }; var dynCall_viiififii = Module["dynCall_viiififii"] = function() { return Module["asm"]["dynCall_viiififii"].apply(null, arguments) }; var dynCall_ii = Module["dynCall_ii"] = function() { return Module["asm"]["dynCall_ii"].apply(null, arguments) }; var dynCall_vifffi = Module["dynCall_vifffi"] = function() { return Module["asm"]["dynCall_vifffi"].apply(null, arguments) }; var dynCall_iijji = Module["dynCall_iijji"] = function() { return Module["asm"]["dynCall_iijji"].apply(null, arguments) }; var dynCall_iiiiifiiiiii = Module["dynCall_iiiiifiiiiii"] = function() { return Module["asm"]["dynCall_iiiiifiiiiii"].apply(null, arguments) }; var dynCall_iiiiifiiiiif = Module["dynCall_iiiiifiiiiif"] = function() { return Module["asm"]["dynCall_iiiiifiiiiif"].apply(null, arguments) }; var dynCall_jifi = Module["dynCall_jifi"] = function() { return Module["asm"]["dynCall_jifi"].apply(null, arguments) }; var dynCall_viiiiiiiiiiii = Module["dynCall_viiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_viiiiiiiiiiii"].apply(null, arguments) }; var dynCall_iifi = Module["dynCall_iifi"] = function() { return Module["asm"]["dynCall_iifi"].apply(null, arguments) }; var dynCall_viiif = Module["dynCall_viiif"] = function() { return Module["asm"]["dynCall_viiif"].apply(null, arguments) }; var dynCall_fifffi = Module["dynCall_fifffi"] = function() { return Module["asm"]["dynCall_fifffi"].apply(null, arguments) }; var dynCall_jiiiii = Module["dynCall_jiiiii"] = function() { return Module["asm"]["dynCall_jiiiii"].apply(null, arguments) }; var dynCall_vifiiiiiiiiiiiiiiiiiiiiiii = Module["dynCall_vifiiiiiiiiiiiiiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_vifiiiiiiiiiiiiiiiiiiiiiii"].apply(null, arguments) }; var dynCall_iiiffii = Module["dynCall_iiiffii"] = function() { return Module["asm"]["dynCall_iiiffii"].apply(null, arguments) }; var dynCall_vijiijiii = Module["dynCall_vijiijiii"] = function() { return Module["asm"]["dynCall_vijiijiii"].apply(null, arguments) }; var dynCall_iiifi = Module["dynCall_iiifi"] = function() { return Module["asm"]["dynCall_iiifi"].apply(null, arguments) }; var dynCall_iiii = Module["dynCall_iiii"] = function() { return Module["asm"]["dynCall_iiii"].apply(null, arguments) }; var dynCall_fidi = Module["dynCall_fidi"] = function() { return Module["asm"]["dynCall_fidi"].apply(null, arguments) }; var dynCall_iiij = Module["dynCall_iiij"] = function() { return Module["asm"]["dynCall_iiij"].apply(null, arguments) }; var dynCall_viifff = Module["dynCall_viifff"] = function() { return Module["asm"]["dynCall_viifff"].apply(null, arguments) }; var dynCall_viiffi = Module["dynCall_viiffi"] = function() { return Module["asm"]["dynCall_viiffi"].apply(null, arguments) }; var dynCall_iiid = Module["dynCall_iiid"] = function() { return Module["asm"]["dynCall_iiid"].apply(null, arguments) }; var dynCall_iiiifiifiii = Module["dynCall_iiiifiifiii"] = function() { return Module["asm"]["dynCall_iiiifiifiii"].apply(null, arguments) }; var dynCall_iiif = Module["dynCall_iiif"] = function() { return Module["asm"]["dynCall_iiif"].apply(null, arguments) }; var dynCall_viiiffi = Module["dynCall_viiiffi"] = function() { return Module["asm"]["dynCall_viiiffi"].apply(null, arguments) }; var dynCall_diiiii = Module["dynCall_diiiii"] = function() { return Module["asm"]["dynCall_diiiii"].apply(null, arguments) }; var dynCall_viiifi = Module["dynCall_viiifi"] = function() { return Module["asm"]["dynCall_viiifi"].apply(null, arguments) }; var dynCall_fiiffi = Module["dynCall_fiiffi"] = function() { return Module["asm"]["dynCall_fiiffi"].apply(null, arguments) }; var dynCall_iiiiiiffiiiiiiiiiffffiiii = Module["dynCall_iiiiiiffiiiiiiiiiffffiiii"] = function() { return Module["asm"]["dynCall_iiiiiiffiiiiiiiiiffffiiii"].apply(null, arguments) }; var dynCall_iiiiiiiiiiiii = Module["dynCall_iiiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiiiiiiiii"].apply(null, arguments) }; var dynCall_viifffi = Module["dynCall_viifffi"] = function() { return Module["asm"]["dynCall_viifffi"].apply(null, arguments) }; var dynCall_vifffii = Module["dynCall_vifffii"] = function() { return Module["asm"]["dynCall_vifffii"].apply(null, arguments) }; var dynCall_iiiifiii = Module["dynCall_iiiifiii"] = function() { return Module["asm"]["dynCall_iiiifiii"].apply(null, arguments) }; var dynCall_ff = Module["dynCall_ff"] = function() { return Module["asm"]["dynCall_ff"].apply(null, arguments) }; var dynCall_iiiifiiiii = Module["dynCall_iiiifiiiii"] = function() { return Module["asm"]["dynCall_iiiifiiiii"].apply(null, arguments) }; var dynCall_iijii = Module["dynCall_iijii"] = function() { return Module["asm"]["dynCall_iijii"].apply(null, arguments) }; var dynCall_iiiiiiiiiiiiiii = Module["dynCall_iiiiiiiiiiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiiiiiiiiiii"].apply(null, arguments) }; var dynCall_viiijjii = Module["dynCall_viiijjii"] = function() { return Module["asm"]["dynCall_viiijjii"].apply(null, arguments) }; var dynCall_vfi = Module["dynCall_vfi"] = function() { return Module["asm"]["dynCall_vfi"].apply(null, arguments) }; var dynCall_i = Module["dynCall_i"] = function() { return Module["asm"]["dynCall_i"].apply(null, arguments) }; var dynCall_iiidii = Module["dynCall_iiidii"] = function() { return Module["asm"]["dynCall_iiidii"].apply(null, arguments) }; var dynCall_iiidiiiii = Module["dynCall_iiidiiiii"] = function() { return Module["asm"]["dynCall_iiidiiiii"].apply(null, arguments) }; var dynCall_viiifiiiii = Module["dynCall_viiifiiiii"] = function() { return Module["asm"]["dynCall_viiifiiiii"].apply(null, arguments) }; var dynCall_iiijjiiii = Module["dynCall_iiijjiiii"] = function() { return Module["asm"]["dynCall_iiijjiiii"].apply(null, arguments) }; var dynCall_iiiiiijii = Module["dynCall_iiiiiijii"] = function() { return Module["asm"]["dynCall_iiiiiijii"].apply(null, arguments) }; var dynCall_viijjji = Module["dynCall_viijjji"] = function() { return Module["asm"]["dynCall_viijjji"].apply(null, arguments) }; var dynCall_iiiiiiiii = Module["dynCall_iiiiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiiiii"].apply(null, arguments) }; var dynCall_viffffi = Module["dynCall_viffffi"] = function() { return Module["asm"]["dynCall_viffffi"].apply(null, arguments) }; ; Runtime.stackAlloc = asm['stackAlloc']; Runtime.stackSave = asm['stackSave']; Runtime.stackRestore = asm['stackRestore']; Runtime.establishStackSpace = asm['establishStackSpace']; Runtime.setTempRet0 = asm['setTempRet0']; Runtime.getTempRet0 = asm['getTempRet0']; // === Auto-generated postamble setup entry stuff === if (memoryInitializer) { if (typeof Module['locateFile'] === 'function') { memoryInitializer = Module['locateFile'](memoryInitializer); } else if (Module['memoryInitializerPrefixURL']) { memoryInitializer = Module['memoryInitializerPrefixURL'] + memoryInitializer; } if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) { var data = Module['readBinary'](memoryInitializer); HEAPU8.set(data, Runtime.GLOBAL_BASE); } else { addRunDependency('memory initializer'); var applyMemoryInitializer = function(data) { if (data.byteLength) data = new Uint8Array(data); HEAPU8.set(data, Runtime.GLOBAL_BASE); // Delete the typed array that contains the large blob of the memory initializer request response so that // we won't keep unnecessary memory lying around. However, keep the XHR object itself alive so that e.g. // its .status field can still be accessed later. if (Module['memoryInitializerRequest']) delete Module['memoryInitializerRequest'].response; removeRunDependency('memory initializer'); } function doBrowserLoad() { Module['readAsync'](memoryInitializer, applyMemoryInitializer, function() { throw 'could not load memory initializer ' + memoryInitializer; }); } if (Module['memoryInitializerRequest']) { // a network request has already been created, just use that function useRequest() { var request = Module['memoryInitializerRequest']; if (request.status !== 200 && request.status !== 0) { // If you see this warning, the issue may be that you are using locateFile or memoryInitializerPrefixURL, and defining them in JS. That // means that the HTML file doesn't know about them, and when it tries to create the mem init request early, does it to the wrong place. // Look in your browser's devtools network console to see what's going on. console.warn('a problem seems to have happened with Module.memoryInitializerRequest, status: ' + request.status + ', retrying ' + memoryInitializer); doBrowserLoad(); return; } applyMemoryInitializer(request.response); } if (Module['memoryInitializerRequest'].response) { setTimeout(useRequest, 0); // it's already here; but, apply it asynchronously } else { Module['memoryInitializerRequest'].addEventListener('load', useRequest); // wait for it } } else { // fetch it from the network ourselves doBrowserLoad(); } } } function ExitStatus(status) { this.name = "ExitStatus"; this.message = "Program terminated with exit(" + status + ")"; this.status = status; }; ExitStatus.prototype = new Error(); ExitStatus.prototype.constructor = ExitStatus; var initialStackTop; var preloadStartTime = null; var calledMain = false; dependenciesFulfilled = function runCaller() { // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) if (!Module['calledRun']) run(); if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled } Module['callMain'] = Module.callMain = function callMain(args) { args = args || []; ensureInitRuntime(); var argc = args.length+1; function pad() { for (var i = 0; i < 4-1; i++) { argv.push(0); } } var argv = [allocate(intArrayFromString(Module['thisProgram']), 'i8', ALLOC_NORMAL) ]; pad(); for (var i = 0; i < argc-1; i = i + 1) { argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL)); pad(); } argv.push(0); argv = allocate(argv, 'i32', ALLOC_NORMAL); try { var ret = Module['_main'](argc, argv, 0); // if we're not running an evented main loop, it's time to exit exit(ret, /* implicit = */ true); } catch(e) { if (e instanceof ExitStatus) { // exit() throws this once it's done to make sure execution // has been stopped completely return; } else if (e == 'SimulateInfiniteLoop') { // running an evented main loop, don't immediately exit Module['noExitRuntime'] = true; return; } else { if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]); throw e; } } finally { calledMain = true; } } function run(args) { args = args || Module['arguments']; if (preloadStartTime === null) preloadStartTime = Date.now(); if (runDependencies > 0) { return; } preRun(); if (runDependencies > 0) return; // a preRun added a dependency, run will be called later if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame function doRun() { if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening Module['calledRun'] = true; if (ABORT) return; ensureInitRuntime(); preMain(); if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); if (Module['_main'] && shouldRunNow) Module['callMain'](args); postRun(); } if (Module['setStatus']) { Module['setStatus']('Running...'); setTimeout(function() { setTimeout(function() { Module['setStatus'](''); }, 1); doRun(); }, 1); } else { doRun(); } } Module['run'] = Module.run = run; function exit(status, implicit) { if (implicit && Module['noExitRuntime']) { return; } if (Module['noExitRuntime']) { } else { ABORT = true; EXITSTATUS = status; STACKTOP = initialStackTop; exitRuntime(); if (Module['onExit']) Module['onExit'](status); } if (ENVIRONMENT_IS_NODE) { process['exit'](status); } else if (ENVIRONMENT_IS_SHELL && typeof quit === 'function') { quit(status); } // if we reach here, we must throw an exception to halt the current execution throw new ExitStatus(status); } Module['exit'] = Module.exit = exit; var abortDecorators = []; function abort(what) { if (what !== undefined) { Module.print(what); Module.printErr(what); what = JSON.stringify(what) } else { what = ''; } ABORT = true; EXITSTATUS = 1; var extra = '\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.'; var output = 'abort(' + what + ') at ' + stackTrace() + extra; if (abortDecorators) { abortDecorators.forEach(function(decorator) { output = decorator(output, what); }); } throw output; } Module['abort'] = Module.abort = abort; // {{PRE_RUN_ADDITIONS}} if (Module['preInit']) { if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; while (Module['preInit'].length > 0) { Module['preInit'].pop()(); } } // shouldRunNow refers to calling main(), not run(). var shouldRunNow = true; if (Module['noInitialRun']) { shouldRunNow = false; } Module["noExitRuntime"] = true; run(); // {{POST_RUN_ADDITIONS}} // {{MODULE_ADDITIONS}} });