Commit 1231aa278a6925840764a4ab054dd29cb85755fa
移动端图片
3.19 KB
4.22 KB
7.18 KB
64.1 KB
17.1 KB
6.42 KB
33.9 KB
5.98 KB
3.15 KB
35.1 KB
2.22 KB
4.97 KB
3.38 KB
6.58 KB
5.63 KB
6.34 KB
15.6 KB
1.64 KB
2.81 KB
23.8 KB
2.43 KB
1.72 KB
2.77 KB
27.8 KB
8.64 KB
20.4 KB
22.2 KB
10.3 KB
6.38 KB
8.12 KB
5.62 KB
8.74 KB
4.82 KB
5.64 KB
6.69 KB
4.79 KB
5.44 KB
6.12 KB
6.89 KB
6.33 KB
5.92 KB
6.45 KB
35.7 KB
7.6 KB
19.2 KB
1.77 KB
1.72 KB
6.03 KB
6.62 KB
18.8 KB
5.94 KB
10.3 KB
472 Bytes
5.24 KB
1.63 KB
2.45 KB
3.95 KB
4.49 KB
2.79 KB
2.29 KB
4.4 KB
4.96 KB
2.47 KB
3.31 KB
3.71 KB
4.14 KB
1.75 KB
4.87 KB
16.3 KB
12.5 KB
30.2 KB
42 KB
31.2 KB
2.44 KB
2.37 KB
3.54 KB
3.41 KB
3.15 KB
3 KB
2.68 KB
4.12 KB
1.46 KB
1.76 KB
3.04 KB
5.24 KB
1.94 KB
4.31 KB
1.6 KB
2.12 KB
19.4 KB
24.3 KB
1.86 KB
2.35 KB
1.69 KB
3.08 KB
2.54 KB
3.84 KB
3.65 KB
3.6 KB
2.39 KB
4.77 KB
5.43 KB
1.05 KB
910 Bytes
4.06 KB
5.87 KB
| 1 | +!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(require("path"),require("fs"),require("crypto")):"function"==typeof define&&define.amd?define(["path","fs","crypto"],r):r((e="undefined"!=typeof globalThis?globalThis:e||self).path,e.fs,e.crypto$1)}(this,(function(e,r,t){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=n(e),i=n(r),a=n(t);function s(e,r){return e(r={exports:{}},r.exports),r.exports}var l=s((function(e){var r=void 0!==r?r:{},t=(r={print:function(e){console.log("Jessibuca: [worker]:",e)},printErr:function(e){console.warn("Jessibuca: [worker]:",e),postMessage({cmd:"wasmError",message:e})}},Object.assign({},r)),n="./this.program",s="object"==typeof window,l="function"==typeof importScripts,u="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,c=!s&&!u&&!l;if(r.ENVIRONMENT)throw new Error("Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)");var d,f,p,m,h,g,v="";if(u){if("object"!=typeof process)throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");v=l?o.default.dirname(v)+"/":__dirname+"/",g=()=>{h||(m=i.default,h=o.default)},d=function(e,r){return g(),e=h.normalize(e),m.readFileSync(e,r?void 0:"utf8")},p=e=>{var r=d(e,!0);return r.buffer||(r=new Uint8Array(r)),F(r.buffer),r},f=(e,r,t)=>{g(),e=h.normalize(e),m.readFile(e,(function(e,n){e?t(e):r(n.buffer)}))},process.argv.length>1&&(n=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2),e.exports=r,process.on("uncaughtException",(function(e){if(!(e instanceof St))throw e})),process.on("unhandledRejection",(function(e){throw e})),r.inspect=function(){return"[Emscripten Module object]"}}else if(c){if("object"==typeof process||"object"==typeof window||"function"==typeof importScripts)throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");"undefined"!=typeof read&&(d=function(e){return read(e)}),p=function(e){let r;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(r=read(e,"binary"),F("object"==typeof r),r)},f=function(e,r,t){setTimeout((()=>r(p(e))),0)},"undefined"!=typeof scriptArgs&&scriptArgs,"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)}else{if(!s&&!l)throw new Error("environment detection error");if(l?v=self.location.href:"undefined"!=typeof document&&document.currentScript&&(v=document.currentScript.src),v=0!==v.indexOf("blob:")?v.substr(0,v.replace(/[?#].*/,"").lastIndexOf("/")+1):"","object"!=typeof window&&"function"!=typeof importScripts)throw new Error("not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)");d=e=>{var r=new XMLHttpRequest;return r.open("GET",e,!1),r.send(null),r.responseText},l&&(p=e=>{var r=new XMLHttpRequest;return r.open("GET",e,!1),r.responseType="arraybuffer",r.send(null),new Uint8Array(r.response)}),f=(e,r,t)=>{var n=new XMLHttpRequest;n.open("GET",e,!0),n.responseType="arraybuffer",n.onload=()=>{200==n.status||0==n.status&&n.response?r(n.response):t()},n.onerror=t,n.send(null)}}var y,E,w,b=r.print||console.log.bind(console),_=r.printErr||console.warn.bind(console);function T(e){T.shown||(T.shown={}),T.shown[e]||(T.shown[e]=1,_(e))}function k(e,t){Object.getOwnPropertyDescriptor(r,e)||Object.defineProperty(r,e,{configurable:!0,get:function(){ge("Module."+e+" has been replaced with plain "+t+" (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)")}})}function S(e,r){var t="'"+e+"' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)";return r&&(t+=". Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you"),t}function C(e,t){Object.getOwnPropertyDescriptor(r,e)||Object.defineProperty(r,e,{configurable:!0,get:function(){ge(S(e,t))}})}function P(e,t){Object.getOwnPropertyDescriptor(r,e)||(r[e]=()=>ge(S(e,t)))}Object.assign(r,t),t=null,y="fetchSettings",Object.getOwnPropertyDescriptor(r,y)&&ge("`Module."+y+"` was supplied but `"+y+"` not included in INCOMING_MODULE_JS_API"),r.arguments,k("arguments","arguments_"),r.thisProgram&&(n=r.thisProgram),k("thisProgram","thisProgram"),r.quit,k("quit","quit_"),F(void 0===r.memoryInitializerPrefixURL,"Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead"),F(void 0===r.pthreadMainPrefixURL,"Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead"),F(void 0===r.cdInitializerPrefixURL,"Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead"),F(void 0===r.filePackagePrefixURL,"Module.filePackagePrefixURL option was removed, use Module.locateFile instead"),F(void 0===r.read,"Module.read option was removed (modify read_ in JS)"),F(void 0===r.readAsync,"Module.readAsync option was removed (modify readAsync in JS)"),F(void 0===r.readBinary,"Module.readBinary option was removed (modify readBinary in JS)"),F(void 0===r.setWindowTitle,"Module.setWindowTitle option was removed (modify setWindowTitle in JS)"),F(void 0===r.TOTAL_MEMORY,"Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY"),k("read","read_"),k("readAsync","readAsync"),k("readBinary","readBinary"),k("setWindowTitle","setWindowTitle"),F(!c,"shell environment detected but not enabled at build time. Add 'shell' to `-sENVIRONMENT` to enable."),r.wasmBinary&&(E=r.wasmBinary),k("wasmBinary","wasmBinary"),r.noExitRuntime,k("noExitRuntime","noExitRuntime"),"object"!=typeof WebAssembly&&ge("no native wasm support detected");var A=!1;function F(e,r){e||ge("Assertion failed"+(r?": "+r:""))}var D="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function O(e,r,t){for(var n=r+t,o=r;e[o]&&!(o>=n);)++o;if(o-r>16&&e.buffer&&D)return D.decode(e.subarray(r,o));for(var i="";r<o;){var a=e[r++];if(128&a){var s=63&e[r++];if(192!=(224&a)){var l=63&e[r++];if(224==(240&a)?a=(15&a)<<12|s<<6|l:(240!=(248&a)&&T("Invalid UTF-8 leading byte 0x"+a.toString(16)+" encountered when deserializing a UTF-8 string in wasm memory to a JS string!"),a=(7&a)<<18|s<<12|l<<6|63&e[r++]),a<65536)i+=String.fromCharCode(a);else{var u=a-65536;i+=String.fromCharCode(55296|u>>10,56320|1023&u)}}else i+=String.fromCharCode((31&a)<<6|s)}else i+=String.fromCharCode(a)}return i}function R(e,r){return e?O(U,e,r):""}function M(e,r,t,n){if(!(n>0))return 0;for(var o=t,i=t+n-1,a=0;a<e.length;++a){var s=e.charCodeAt(a);if(s>=55296&&s<=57343)s=65536+((1023&s)<<10)|1023&e.charCodeAt(++a);if(s<=127){if(t>=i)break;r[t++]=s}else if(s<=2047){if(t+1>=i)break;r[t++]=192|s>>6,r[t++]=128|63&s}else if(s<=65535){if(t+2>=i)break;r[t++]=224|s>>12,r[t++]=128|s>>6&63,r[t++]=128|63&s}else{if(t+3>=i)break;s>1114111&&T("Invalid Unicode code point 0x"+s.toString(16)+" encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF)."),r[t++]=240|s>>18,r[t++]=128|s>>12&63,r[t++]=128|s>>6&63,r[t++]=128|63&s}}return r[t]=0,t-o}function N(e,r,t){return F("number"==typeof t,"stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),M(e,U,r,t)}function I(e){for(var r=0,t=0;t<e.length;++t){var n=e.charCodeAt(t);n>=55296&&n<=57343&&(n=65536+((1023&n)<<10)|1023&e.charCodeAt(++t)),n<=127?++r:r+=n<=2047?2:n<=65535?3:4}return r}var L,x,U,B,j,$,W,z,H,G="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0;function V(e,r){F(e%2==0,"Pointer passed to UTF16ToString must be aligned to two bytes!");for(var t=e,n=t>>1,o=n+r/2;!(n>=o)&&j[n];)++n;if((t=n<<1)-e>32&&G)return G.decode(U.subarray(e,t));for(var i="",a=0;!(a>=r/2);++a){var s=B[e+2*a>>1];if(0==s)break;i+=String.fromCharCode(s)}return i}function Y(e,r,t){if(F(r%2==0,"Pointer passed to stringToUTF16 must be aligned to two bytes!"),F("number"==typeof t,"stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),void 0===t&&(t=2147483647),t<2)return 0;for(var n=r,o=(t-=2)<2*e.length?t/2:e.length,i=0;i<o;++i){var a=e.charCodeAt(i);B[r>>1]=a,r+=2}return B[r>>1]=0,r-n}function q(e){return 2*e.length}function X(e,r){F(e%4==0,"Pointer passed to UTF32ToString must be aligned to four bytes!");for(var t=0,n="";!(t>=r/4);){var o=$[e+4*t>>2];if(0==o)break;if(++t,o>=65536){var i=o-65536;n+=String.fromCharCode(55296|i>>10,56320|1023&i)}else n+=String.fromCharCode(o)}return n}function K(e,r,t){if(F(r%4==0,"Pointer passed to stringToUTF32 must be aligned to four bytes!"),F("number"==typeof t,"stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!"),void 0===t&&(t=2147483647),t<4)return 0;for(var n=r,o=n+t-4,i=0;i<e.length;++i){var a=e.charCodeAt(i);if(a>=55296&&a<=57343)a=65536+((1023&a)<<10)|1023&e.charCodeAt(++i);if($[r>>2]=a,(r+=4)+4>o)break}return $[r>>2]=0,r-n}function J(e){for(var r=0,t=0;t<e.length;++t){var n=e.charCodeAt(t);n>=55296&&n<=57343&&++t,r+=4}return r}function Q(e){var r=I(e)+1,t=gt(r);return t&&M(e,x,t,r),t}function Z(e){L=e,r.HEAP8=x=new Int8Array(e),r.HEAP16=B=new Int16Array(e),r.HEAP32=$=new Int32Array(e),r.HEAPU8=U=new Uint8Array(e),r.HEAPU16=j=new Uint16Array(e),r.HEAPU32=W=new Uint32Array(e),r.HEAPF32=z=new Float32Array(e),r.HEAPF64=H=new Float64Array(e)}var ee=5242880;r.TOTAL_STACK&&F(ee===r.TOTAL_STACK,"the stack size can no longer be determined at runtime");var re,te=r.INITIAL_MEMORY||67108864;function ne(){var e=kt();F(0==(3&e)),$[e>>2]=34821223,$[e+4>>2]=2310721022,$[0]=1668509029}function oe(){if(!A){var e=kt(),r=W[e>>2],t=W[e+4>>2];34821223==r&&2310721022==t||ge("Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x"+t.toString(16)+" 0x"+r.toString(16)),1668509029!==$[0]&&ge("Runtime error: The application has corrupted its heap memory area (address zero)!")}}k("INITIAL_MEMORY","INITIAL_MEMORY"),F(te>=ee,"INITIAL_MEMORY should be larger than TOTAL_STACK, was "+te+"! (TOTAL_STACK="+"5242880)"),F("undefined"!=typeof Int32Array&&"undefined"!=typeof Float64Array&&null!=Int32Array.prototype.subarray&&null!=Int32Array.prototype.set,"JS engine does not provide full typed array support"),F(!r.wasmMemory,"Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally"),F(67108864==te,"Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically"),function(){var e=new Int16Array(1),r=new Int8Array(e.buffer);if(e[0]=25459,115!==r[0]||99!==r[1])throw"Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)"}();var ie=[],ae=[],se=[],le=!1;F(Math.imul,"This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),F(Math.fround,"This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),F(Math.clz32,"This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill"),F(Math.trunc,"This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill");var ue=0,ce=null,de=null,fe={};function pe(e){for(var r=e;;){if(!fe[e])return e;e=r+Math.random()}}function me(e){ue++,r.monitorRunDependencies&&r.monitorRunDependencies(ue),e?(F(!fe[e]),fe[e]=1,null===ce&&"undefined"!=typeof setInterval&&(ce=setInterval((function(){if(A)return clearInterval(ce),void(ce=null);var e=!1;for(var r in fe)e||(e=!0,_("still waiting on run dependencies:")),_("dependency: "+r);e&&_("(end of list)")}),1e4))):_("warning: run dependency added without ID")}function he(e){if(ue--,r.monitorRunDependencies&&r.monitorRunDependencies(ue),e?(F(fe[e]),delete fe[e]):_("warning: run dependency removed without ID"),0==ue&&(null!==ce&&(clearInterval(ce),ce=null),de)){var t=de;de=null,t()}}function ge(e){throw r.onAbort&&r.onAbort(e),_(e="Aborted("+e+")"),A=!0,new WebAssembly.RuntimeError(e)}var ve,ye,Ee;function we(e){return e.startsWith("data:application/octet-stream;base64,")}function be(e){return e.startsWith("file://")}function _e(e,t){return function(){var n=e,o=t;return t||(o=r.asm),F(le,"native function `"+n+"` called before runtime initialization"),o[e]||F(o[e],"exported native function `"+n+"` not found"),o[e].apply(null,arguments)}}function Te(e){try{if(e==ve&&E)return new Uint8Array(E);if(p)return p(e);throw"both async and sync fetching of the wasm failed"}catch(e){ge(e)}}function ke(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?Ce(n)():Ce(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(r)}}function Se(e){return e.replace(/\b_Z[\w\d_]+/g,(function(e){var r,t=(r=e,T("warning: build with -sDEMANGLE_SUPPORT to link in libcxxabi demangling"),r);return e===t?e:t+" ["+e+"]"}))}function Ce(e){return re.get(e)}function Pe(){var e=new Error;if(!e.stack){try{throw new Error}catch(r){e=r}if(!e.stack)return"(no stack trace available)"}return e.stack.toString()}we(ve="decoder.wasm")||(ve=function(e){return r.locateFile?r.locateFile(e,v):v+e}(ve));var Ae={isAbs:e=>"/"===e.charAt(0),splitPath:e=>/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(e).slice(1),normalizeArray:(e,r)=>{for(var t=0,n=e.length-1;n>=0;n--){var o=e[n];"."===o?e.splice(n,1):".."===o?(e.splice(n,1),t++):t&&(e.splice(n,1),t--)}if(r)for(;t;t--)e.unshift("..");return e},normalize:e=>{var r=Ae.isAbs(e),t="/"===e.substr(-1);return(e=Ae.normalizeArray(e.split("/").filter((e=>!!e)),!r).join("/"))||r||(e="."),e&&t&&(e+="/"),(r?"/":"")+e},dirname:e=>{var r=Ae.splitPath(e),t=r[0],n=r[1];return t||n?(n&&(n=n.substr(0,n.length-1)),t+n):"."},basename:e=>{if("/"===e)return"/";var r=(e=(e=Ae.normalize(e)).replace(/\/$/,"")).lastIndexOf("/");return-1===r?e:e.substr(r+1)},join:function(){var e=Array.prototype.slice.call(arguments,0);return Ae.normalize(e.join("/"))},join2:(e,r)=>Ae.normalize(e+"/"+r)};var Fe={resolve:function(){for(var e="",r=!1,t=arguments.length-1;t>=-1&&!r;t--){var n=t>=0?arguments[t]:Ie.cwd();if("string"!=typeof n)throw new TypeError("Arguments to path.resolve must be strings");if(!n)return"";e=n+"/"+e,r=Ae.isAbs(n)}return(r?"/":"")+(e=Ae.normalizeArray(e.split("/").filter((e=>!!e)),!r).join("/"))||"."},relative:(e,r)=>{function t(e){for(var r=0;r<e.length&&""===e[r];r++);for(var t=e.length-1;t>=0&&""===e[t];t--);return r>t?[]:e.slice(r,t-r+1)}e=Fe.resolve(e).substr(1),r=Fe.resolve(r).substr(1);for(var n=t(e.split("/")),o=t(r.split("/")),i=Math.min(n.length,o.length),a=i,s=0;s<i;s++)if(n[s]!==o[s]){a=s;break}var l=[];for(s=a;s<n.length;s++)l.push("..");return(l=l.concat(o.slice(a))).join("/")}},De={ttys:[],init:function(){},shutdown:function(){},register:function(e,r){De.ttys[e]={input:[],output:[],ops:r},Ie.registerDevice(e,De.stream_ops)},stream_ops:{open:function(e){var r=De.ttys[e.node.rdev];if(!r)throw new Ie.ErrnoError(43);e.tty=r,e.seekable=!1},close:function(e){e.tty.ops.flush(e.tty)},flush:function(e){e.tty.ops.flush(e.tty)},read:function(e,r,t,n,o){if(!e.tty||!e.tty.ops.get_char)throw new Ie.ErrnoError(60);for(var i=0,a=0;a<n;a++){var s;try{s=e.tty.ops.get_char(e.tty)}catch(e){throw new Ie.ErrnoError(29)}if(void 0===s&&0===i)throw new Ie.ErrnoError(6);if(null==s)break;i++,r[t+a]=s}return i&&(e.node.timestamp=Date.now()),i},write:function(e,r,t,n,o){if(!e.tty||!e.tty.ops.put_char)throw new Ie.ErrnoError(60);try{for(var i=0;i<n;i++)e.tty.ops.put_char(e.tty,r[t+i])}catch(e){throw new Ie.ErrnoError(29)}return n&&(e.node.timestamp=Date.now()),i}},default_tty_ops:{get_char:function(e){if(!e.input.length){var r=null;if(u){var t=Buffer.alloc(256),n=0;try{n=m.readSync(process.stdin.fd,t,0,256,-1)}catch(e){if(!e.toString().includes("EOF"))throw e;n=0}r=n>0?t.slice(0,n).toString("utf-8"):null}else"undefined"!=typeof window&&"function"==typeof window.prompt?null!==(r=window.prompt("Input: "))&&(r+="\n"):"function"==typeof readline&&null!==(r=readline())&&(r+="\n");if(!r)return null;e.input=pt(r,!0)}return e.input.shift()},put_char:function(e,r){null===r||10===r?(b(O(e.output,0)),e.output=[]):0!=r&&e.output.push(r)},flush:function(e){e.output&&e.output.length>0&&(b(O(e.output,0)),e.output=[])}},default_tty1_ops:{put_char:function(e,r){null===r||10===r?(_(O(e.output,0)),e.output=[]):0!=r&&e.output.push(r)},flush:function(e){e.output&&e.output.length>0&&(_(O(e.output,0)),e.output=[])}}};function Oe(e){e=function(e,r){return F(r,"alignment argument is required"),Math.ceil(e/r)*r}(e,65536);var r=bt(65536,e);return r?(function(e,r){U.fill(0,e,e+r)}(r,e),r):0}var Re={ops_table:null,mount:function(e){return Re.createNode(null,"/",16895,0)},createNode:function(e,r,t,n){if(Ie.isBlkdev(t)||Ie.isFIFO(t))throw new Ie.ErrnoError(63);Re.ops_table||(Re.ops_table={dir:{node:{getattr:Re.node_ops.getattr,setattr:Re.node_ops.setattr,lookup:Re.node_ops.lookup,mknod:Re.node_ops.mknod,rename:Re.node_ops.rename,unlink:Re.node_ops.unlink,rmdir:Re.node_ops.rmdir,readdir:Re.node_ops.readdir,symlink:Re.node_ops.symlink},stream:{llseek:Re.stream_ops.llseek}},file:{node:{getattr:Re.node_ops.getattr,setattr:Re.node_ops.setattr},stream:{llseek:Re.stream_ops.llseek,read:Re.stream_ops.read,write:Re.stream_ops.write,allocate:Re.stream_ops.allocate,mmap:Re.stream_ops.mmap,msync:Re.stream_ops.msync}},link:{node:{getattr:Re.node_ops.getattr,setattr:Re.node_ops.setattr,readlink:Re.node_ops.readlink},stream:{}},chrdev:{node:{getattr:Re.node_ops.getattr,setattr:Re.node_ops.setattr},stream:Ie.chrdev_stream_ops}});var o=Ie.createNode(e,r,t,n);return Ie.isDir(o.mode)?(o.node_ops=Re.ops_table.dir.node,o.stream_ops=Re.ops_table.dir.stream,o.contents={}):Ie.isFile(o.mode)?(o.node_ops=Re.ops_table.file.node,o.stream_ops=Re.ops_table.file.stream,o.usedBytes=0,o.contents=null):Ie.isLink(o.mode)?(o.node_ops=Re.ops_table.link.node,o.stream_ops=Re.ops_table.link.stream):Ie.isChrdev(o.mode)&&(o.node_ops=Re.ops_table.chrdev.node,o.stream_ops=Re.ops_table.chrdev.stream),o.timestamp=Date.now(),e&&(e.contents[r]=o,e.timestamp=o.timestamp),o},getFileDataAsTypedArray:function(e){return e.contents?e.contents.subarray?e.contents.subarray(0,e.usedBytes):new Uint8Array(e.contents):new Uint8Array(0)},expandFileStorage:function(e,r){var t=e.contents?e.contents.length:0;if(!(t>=r)){r=Math.max(r,t*(t<1048576?2:1.125)>>>0),0!=t&&(r=Math.max(r,256));var n=e.contents;e.contents=new Uint8Array(r),e.usedBytes>0&&e.contents.set(n.subarray(0,e.usedBytes),0)}},resizeFileStorage:function(e,r){if(e.usedBytes!=r)if(0==r)e.contents=null,e.usedBytes=0;else{var t=e.contents;e.contents=new Uint8Array(r),t&&e.contents.set(t.subarray(0,Math.min(r,e.usedBytes))),e.usedBytes=r}},node_ops:{getattr:function(e){var r={};return r.dev=Ie.isChrdev(e.mode)?e.id:1,r.ino=e.id,r.mode=e.mode,r.nlink=1,r.uid=0,r.gid=0,r.rdev=e.rdev,Ie.isDir(e.mode)?r.size=4096:Ie.isFile(e.mode)?r.size=e.usedBytes:Ie.isLink(e.mode)?r.size=e.link.length:r.size=0,r.atime=new Date(e.timestamp),r.mtime=new Date(e.timestamp),r.ctime=new Date(e.timestamp),r.blksize=4096,r.blocks=Math.ceil(r.size/r.blksize),r},setattr:function(e,r){void 0!==r.mode&&(e.mode=r.mode),void 0!==r.timestamp&&(e.timestamp=r.timestamp),void 0!==r.size&&Re.resizeFileStorage(e,r.size)},lookup:function(e,r){throw Ie.genericErrors[44]},mknod:function(e,r,t,n){return Re.createNode(e,r,t,n)},rename:function(e,r,t){if(Ie.isDir(e.mode)){var n;try{n=Ie.lookupNode(r,t)}catch(e){}if(n)for(var o in n.contents)throw new Ie.ErrnoError(55)}delete e.parent.contents[e.name],e.parent.timestamp=Date.now(),e.name=t,r.contents[t]=e,r.timestamp=e.parent.timestamp,e.parent=r},unlink:function(e,r){delete e.contents[r],e.timestamp=Date.now()},rmdir:function(e,r){var t=Ie.lookupNode(e,r);for(var n in t.contents)throw new Ie.ErrnoError(55);delete e.contents[r],e.timestamp=Date.now()},readdir:function(e){var r=[".",".."];for(var t in e.contents)e.contents.hasOwnProperty(t)&&r.push(t);return r},symlink:function(e,r,t){var n=Re.createNode(e,r,41471,0);return n.link=t,n},readlink:function(e){if(!Ie.isLink(e.mode))throw new Ie.ErrnoError(28);return e.link}},stream_ops:{read:function(e,r,t,n,o){var i=e.node.contents;if(o>=e.node.usedBytes)return 0;var a=Math.min(e.node.usedBytes-o,n);if(F(a>=0),a>8&&i.subarray)r.set(i.subarray(o,o+a),t);else for(var s=0;s<a;s++)r[t+s]=i[o+s];return a},write:function(e,r,t,n,o,i){if(F(!(r instanceof ArrayBuffer)),r.buffer===x.buffer&&(i=!1),!n)return 0;var a=e.node;if(a.timestamp=Date.now(),r.subarray&&(!a.contents||a.contents.subarray)){if(i)return F(0===o,"canOwn must imply no weird position inside the file"),a.contents=r.subarray(t,t+n),a.usedBytes=n,n;if(0===a.usedBytes&&0===o)return a.contents=r.slice(t,t+n),a.usedBytes=n,n;if(o+n<=a.usedBytes)return a.contents.set(r.subarray(t,t+n),o),n}if(Re.expandFileStorage(a,o+n),a.contents.subarray&&r.subarray)a.contents.set(r.subarray(t,t+n),o);else for(var s=0;s<n;s++)a.contents[o+s]=r[t+s];return a.usedBytes=Math.max(a.usedBytes,o+n),n},llseek:function(e,r,t){var n=r;if(1===t?n+=e.position:2===t&&Ie.isFile(e.node.mode)&&(n+=e.node.usedBytes),n<0)throw new Ie.ErrnoError(28);return n},allocate:function(e,r,t){Re.expandFileStorage(e.node,r+t),e.node.usedBytes=Math.max(e.node.usedBytes,r+t)},mmap:function(e,r,t,n,o,i){if(0!==r)throw new Ie.ErrnoError(28);if(!Ie.isFile(e.node.mode))throw new Ie.ErrnoError(43);var a,s,l=e.node.contents;if(2&i||l.buffer!==L){if((n>0||n+t<l.length)&&(l=l.subarray?l.subarray(n,n+t):Array.prototype.slice.call(l,n,n+t)),s=!0,!(a=Oe(t)))throw new Ie.ErrnoError(48);x.set(l,a)}else s=!1,a=l.byteOffset;return{ptr:a,allocated:s}},msync:function(e,r,t,n,o){if(!Ie.isFile(e.node.mode))throw new Ie.ErrnoError(43);return 2&o||Re.stream_ops.write(e,r,0,n,t,!1),0}}};var Me={0:"Success",1:"Arg list too long",2:"Permission denied",3:"Address already in use",4:"Address not available",5:"Address family not supported by protocol family",6:"No more processes",7:"Socket already connected",8:"Bad file number",9:"Trying to read unreadable message",10:"Mount device busy",11:"Operation canceled",12:"No children",13:"Connection aborted",14:"Connection refused",15:"Connection reset by peer",16:"File locking deadlock error",17:"Destination address required",18:"Math arg out of domain of func",19:"Quota exceeded",20:"File exists",21:"Bad address",22:"File too large",23:"Host is unreachable",24:"Identifier removed",25:"Illegal byte sequence",26:"Connection already in progress",27:"Interrupted system call",28:"Invalid argument",29:"I/O error",30:"Socket is already connected",31:"Is a directory",32:"Too many symbolic links",33:"Too many open files",34:"Too many links",35:"Message too long",36:"Multihop attempted",37:"File or path name too long",38:"Network interface is not configured",39:"Connection reset by network",40:"Network is unreachable",41:"Too many open files in system",42:"No buffer space available",43:"No such device",44:"No such file or directory",45:"Exec format error",46:"No record locks available",47:"The link has been severed",48:"Not enough core",49:"No message of desired type",50:"Protocol not available",51:"No space left on device",52:"Function not implemented",53:"Socket is not connected",54:"Not a directory",55:"Directory not empty",56:"State not recoverable",57:"Socket operation on non-socket",59:"Not a typewriter",60:"No such device or address",61:"Value too large for defined data type",62:"Previous owner died",63:"Not super-user",64:"Broken pipe",65:"Protocol error",66:"Unknown protocol",67:"Protocol wrong type for socket",68:"Math result not representable",69:"Read only file system",70:"Illegal seek",71:"No such process",72:"Stale file handle",73:"Connection timed out",74:"Text file busy",75:"Cross-device link",100:"Device not a stream",101:"Bad font file fmt",102:"Invalid slot",103:"Invalid request code",104:"No anode",105:"Block device required",106:"Channel number out of range",107:"Level 3 halted",108:"Level 3 reset",109:"Link number out of range",110:"Protocol driver not attached",111:"No CSI structure available",112:"Level 2 halted",113:"Invalid exchange",114:"Invalid request descriptor",115:"Exchange full",116:"No data (for no delay io)",117:"Timer expired",118:"Out of streams resources",119:"Machine is not on the network",120:"Package not installed",121:"The object is remote",122:"Advertise error",123:"Srmount error",124:"Communication error on send",125:"Cross mount point (not really error)",126:"Given log. name not unique",127:"f.d. invalid for this operation",128:"Remote address changed",129:"Can access a needed shared lib",130:"Accessing a corrupted shared lib",131:".lib section in a.out corrupted",132:"Attempting to link in too many libs",133:"Attempting to exec a shared library",135:"Streams pipe error",136:"Too many users",137:"Socket type not supported",138:"Not supported",139:"Protocol family not supported",140:"Can't send after socket shutdown",141:"Too many references",142:"Host is down",148:"No medium (in tape drive)",156:"Level 2 not synchronized"},Ne={},Ie={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(e){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(e=Fe.resolve(Ie.cwd(),e)))return{path:"",node:null};var t={follow_mount:!0,recurse_count:0};if(r=Object.assign(t,r),r.recurse_count>8)throw new Ie.ErrnoError(32);for(var n=Ae.normalizeArray(e.split("/").filter((e=>!!e)),!1),o=Ie.root,i="/",a=0;a<n.length;a++){var s=a===n.length-1;if(s&&r.parent)break;if(o=Ie.lookupNode(o,n[a]),i=Ae.join2(i,n[a]),Ie.isMountpoint(o)&&(!s||s&&r.follow_mount)&&(o=o.mounted.root),!s||r.follow)for(var l=0;Ie.isLink(o.mode);){var u=Ie.readlink(i);i=Fe.resolve(Ae.dirname(i),u);var c=Ie.lookupPath(i,{recurse_count:r.recurse_count+1});if(o=c.node,l++>40)throw new Ie.ErrnoError(32)}}return{path:i,node:o}},getPath:e=>{for(var r;;){if(Ie.isRoot(e)){var t=e.mount.mountpoint;return r?"/"!==t[t.length-1]?t+"/"+r:t+r:t}r=r?e.name+"/"+r:e.name,e=e.parent}},hashName:(e,r)=>{for(var t=0,n=0;n<r.length;n++)t=(t<<5)-t+r.charCodeAt(n)|0;return(e+t>>>0)%Ie.nameTable.length},hashAddNode:e=>{var r=Ie.hashName(e.parent.id,e.name);e.name_next=Ie.nameTable[r],Ie.nameTable[r]=e},hashRemoveNode:e=>{var r=Ie.hashName(e.parent.id,e.name);if(Ie.nameTable[r]===e)Ie.nameTable[r]=e.name_next;else for(var t=Ie.nameTable[r];t;){if(t.name_next===e){t.name_next=e.name_next;break}t=t.name_next}},lookupNode:(e,r)=>{var t=Ie.mayLookup(e);if(t)throw new Ie.ErrnoError(t,e);for(var n=Ie.hashName(e.id,r),o=Ie.nameTable[n];o;o=o.name_next){var i=o.name;if(o.parent.id===e.id&&i===r)return o}return Ie.lookup(e,r)},createNode:(e,r,t,n)=>{F("object"==typeof e);var o=new Ie.FSNode(e,r,t,n);return Ie.hashAddNode(o),o},destroyNode:e=>{Ie.hashRemoveNode(e)},isRoot:e=>e===e.parent,isMountpoint:e=>!!e.mounted,isFile:e=>32768==(61440&e),isDir:e=>16384==(61440&e),isLink:e=>40960==(61440&e),isChrdev:e=>8192==(61440&e),isBlkdev:e=>24576==(61440&e),isFIFO:e=>4096==(61440&e),isSocket:e=>49152==(49152&e),flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:e=>{var r=Ie.flagModes[e];if(void 0===r)throw new Error("Unknown file open mode: "+e);return r},flagsToPermissionString:e=>{var r=["r","w","rw"][3&e];return 512&e&&(r+="w"),r},nodePermissions:(e,r)=>Ie.ignorePermissions||(!r.includes("r")||292&e.mode)&&(!r.includes("w")||146&e.mode)&&(!r.includes("x")||73&e.mode)?0:2,mayLookup:e=>{var r=Ie.nodePermissions(e,"x");return r||(e.node_ops.lookup?0:2)},mayCreate:(e,r)=>{try{Ie.lookupNode(e,r);return 20}catch(e){}return Ie.nodePermissions(e,"wx")},mayDelete:(e,r,t)=>{var n;try{n=Ie.lookupNode(e,r)}catch(e){return e.errno}var o=Ie.nodePermissions(e,"wx");if(o)return o;if(t){if(!Ie.isDir(n.mode))return 54;if(Ie.isRoot(n)||Ie.getPath(n)===Ie.cwd())return 10}else if(Ie.isDir(n.mode))return 31;return 0},mayOpen:(e,r)=>e?Ie.isLink(e.mode)?32:Ie.isDir(e.mode)&&("r"!==Ie.flagsToPermissionString(r)||512&r)?31:Ie.nodePermissions(e,Ie.flagsToPermissionString(r)):44,MAX_OPEN_FDS:4096,nextfd:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Ie.MAX_OPEN_FDS;for(var t=e;t<=r;t++)if(!Ie.streams[t])return t;throw new Ie.ErrnoError(33)},getStream:e=>Ie.streams[e],createStream:(e,r,t)=>{Ie.FSStream||(Ie.FSStream=function(){this.shared={}},Ie.FSStream.prototype={object:{get:function(){return this.node},set:function(e){this.node=e}},isRead:{get:function(){return 1!=(2097155&this.flags)}},isWrite:{get:function(){return 0!=(2097155&this.flags)}},isAppend:{get:function(){return 1024&this.flags}},flags:{get:function(){return this.shared.flags},set:function(e){this.shared.flags=e}},position:{get function(){return this.shared.position},set:function(e){this.shared.position=e}}}),e=Object.assign(new Ie.FSStream,e);var n=Ie.nextfd(r,t);return e.fd=n,Ie.streams[n]=e,e},closeStream:e=>{Ie.streams[e]=null},chrdev_stream_ops:{open:e=>{var r=Ie.getDevice(e.node.rdev);e.stream_ops=r.stream_ops,e.stream_ops.open&&e.stream_ops.open(e)},llseek:()=>{throw new Ie.ErrnoError(70)}},major:e=>e>>8,minor:e=>255&e,makedev:(e,r)=>e<<8|r,registerDevice:(e,r)=>{Ie.devices[e]={stream_ops:r}},getDevice:e=>Ie.devices[e],getMounts:e=>{for(var r=[],t=[e];t.length;){var n=t.pop();r.push(n),t.push.apply(t,n.mounts)}return r},syncfs:(e,r)=>{"function"==typeof e&&(r=e,e=!1),Ie.syncFSRequests++,Ie.syncFSRequests>1&&_("warning: "+Ie.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var t=Ie.getMounts(Ie.root.mount),n=0;function o(e){return F(Ie.syncFSRequests>0),Ie.syncFSRequests--,r(e)}function i(e){if(e)return i.errored?void 0:(i.errored=!0,o(e));++n>=t.length&&o(null)}t.forEach((r=>{if(!r.type.syncfs)return i(null);r.type.syncfs(r,e,i)}))},mount:(e,r,t)=>{if("string"==typeof e)throw e;var n,o="/"===t,i=!t;if(o&&Ie.root)throw new Ie.ErrnoError(10);if(!o&&!i){var a=Ie.lookupPath(t,{follow_mount:!1});if(t=a.path,n=a.node,Ie.isMountpoint(n))throw new Ie.ErrnoError(10);if(!Ie.isDir(n.mode))throw new Ie.ErrnoError(54)}var s={type:e,opts:r,mountpoint:t,mounts:[]},l=e.mount(s);return l.mount=s,s.root=l,o?Ie.root=l:n&&(n.mounted=s,n.mount&&n.mount.mounts.push(s)),l},unmount:e=>{var r=Ie.lookupPath(e,{follow_mount:!1});if(!Ie.isMountpoint(r.node))throw new Ie.ErrnoError(28);var t=r.node,n=t.mounted,o=Ie.getMounts(n);Object.keys(Ie.nameTable).forEach((e=>{for(var r=Ie.nameTable[e];r;){var t=r.name_next;o.includes(r.mount)&&Ie.destroyNode(r),r=t}})),t.mounted=null;var i=t.mount.mounts.indexOf(n);F(-1!==i),t.mount.mounts.splice(i,1)},lookup:(e,r)=>e.node_ops.lookup(e,r),mknod:(e,r,t)=>{var n=Ie.lookupPath(e,{parent:!0}).node,o=Ae.basename(e);if(!o||"."===o||".."===o)throw new Ie.ErrnoError(28);var i=Ie.mayCreate(n,o);if(i)throw new Ie.ErrnoError(i);if(!n.node_ops.mknod)throw new Ie.ErrnoError(63);return n.node_ops.mknod(n,o,r,t)},create:(e,r)=>(r=void 0!==r?r:438,r&=4095,r|=32768,Ie.mknod(e,r,0)),mkdir:(e,r)=>(r=void 0!==r?r:511,r&=1023,r|=16384,Ie.mknod(e,r,0)),mkdirTree:(e,r)=>{for(var t=e.split("/"),n="",o=0;o<t.length;++o)if(t[o]){n+="/"+t[o];try{Ie.mkdir(n,r)}catch(e){if(20!=e.errno)throw e}}},mkdev:(e,r,t)=>(void 0===t&&(t=r,r=438),r|=8192,Ie.mknod(e,r,t)),symlink:(e,r)=>{if(!Fe.resolve(e))throw new Ie.ErrnoError(44);var t=Ie.lookupPath(r,{parent:!0}).node;if(!t)throw new Ie.ErrnoError(44);var n=Ae.basename(r),o=Ie.mayCreate(t,n);if(o)throw new Ie.ErrnoError(o);if(!t.node_ops.symlink)throw new Ie.ErrnoError(63);return t.node_ops.symlink(t,n,e)},rename:(e,r)=>{var t,n,o=Ae.dirname(e),i=Ae.dirname(r),a=Ae.basename(e),s=Ae.basename(r);if(t=Ie.lookupPath(e,{parent:!0}).node,n=Ie.lookupPath(r,{parent:!0}).node,!t||!n)throw new Ie.ErrnoError(44);if(t.mount!==n.mount)throw new Ie.ErrnoError(75);var l,u=Ie.lookupNode(t,a),c=Fe.relative(e,i);if("."!==c.charAt(0))throw new Ie.ErrnoError(28);if("."!==(c=Fe.relative(r,o)).charAt(0))throw new Ie.ErrnoError(55);try{l=Ie.lookupNode(n,s)}catch(e){}if(u!==l){var d=Ie.isDir(u.mode),f=Ie.mayDelete(t,a,d);if(f)throw new Ie.ErrnoError(f);if(f=l?Ie.mayDelete(n,s,d):Ie.mayCreate(n,s))throw new Ie.ErrnoError(f);if(!t.node_ops.rename)throw new Ie.ErrnoError(63);if(Ie.isMountpoint(u)||l&&Ie.isMountpoint(l))throw new Ie.ErrnoError(10);if(n!==t&&(f=Ie.nodePermissions(t,"w")))throw new Ie.ErrnoError(f);Ie.hashRemoveNode(u);try{t.node_ops.rename(u,n,s)}catch(e){throw e}finally{Ie.hashAddNode(u)}}},rmdir:e=>{var r=Ie.lookupPath(e,{parent:!0}).node,t=Ae.basename(e),n=Ie.lookupNode(r,t),o=Ie.mayDelete(r,t,!0);if(o)throw new Ie.ErrnoError(o);if(!r.node_ops.rmdir)throw new Ie.ErrnoError(63);if(Ie.isMountpoint(n))throw new Ie.ErrnoError(10);r.node_ops.rmdir(r,t),Ie.destroyNode(n)},readdir:e=>{var r=Ie.lookupPath(e,{follow:!0}).node;if(!r.node_ops.readdir)throw new Ie.ErrnoError(54);return r.node_ops.readdir(r)},unlink:e=>{var r=Ie.lookupPath(e,{parent:!0}).node;if(!r)throw new Ie.ErrnoError(44);var t=Ae.basename(e),n=Ie.lookupNode(r,t),o=Ie.mayDelete(r,t,!1);if(o)throw new Ie.ErrnoError(o);if(!r.node_ops.unlink)throw new Ie.ErrnoError(63);if(Ie.isMountpoint(n))throw new Ie.ErrnoError(10);r.node_ops.unlink(r,t),Ie.destroyNode(n)},readlink:e=>{var r=Ie.lookupPath(e).node;if(!r)throw new Ie.ErrnoError(44);if(!r.node_ops.readlink)throw new Ie.ErrnoError(28);return Fe.resolve(Ie.getPath(r.parent),r.node_ops.readlink(r))},stat:(e,r)=>{var t=Ie.lookupPath(e,{follow:!r}).node;if(!t)throw new Ie.ErrnoError(44);if(!t.node_ops.getattr)throw new Ie.ErrnoError(63);return t.node_ops.getattr(t)},lstat:e=>Ie.stat(e,!0),chmod:(e,r,t)=>{var n;"string"==typeof e?n=Ie.lookupPath(e,{follow:!t}).node:n=e;if(!n.node_ops.setattr)throw new Ie.ErrnoError(63);n.node_ops.setattr(n,{mode:4095&r|-4096&n.mode,timestamp:Date.now()})},lchmod:(e,r)=>{Ie.chmod(e,r,!0)},fchmod:(e,r)=>{var t=Ie.getStream(e);if(!t)throw new Ie.ErrnoError(8);Ie.chmod(t.node,r)},chown:(e,r,t,n)=>{var o;"string"==typeof e?o=Ie.lookupPath(e,{follow:!n}).node:o=e;if(!o.node_ops.setattr)throw new Ie.ErrnoError(63);o.node_ops.setattr(o,{timestamp:Date.now()})},lchown:(e,r,t)=>{Ie.chown(e,r,t,!0)},fchown:(e,r,t)=>{var n=Ie.getStream(e);if(!n)throw new Ie.ErrnoError(8);Ie.chown(n.node,r,t)},truncate:(e,r)=>{if(r<0)throw new Ie.ErrnoError(28);var t;"string"==typeof e?t=Ie.lookupPath(e,{follow:!0}).node:t=e;if(!t.node_ops.setattr)throw new Ie.ErrnoError(63);if(Ie.isDir(t.mode))throw new Ie.ErrnoError(31);if(!Ie.isFile(t.mode))throw new Ie.ErrnoError(28);var n=Ie.nodePermissions(t,"w");if(n)throw new Ie.ErrnoError(n);t.node_ops.setattr(t,{size:r,timestamp:Date.now()})},ftruncate:(e,r)=>{var t=Ie.getStream(e);if(!t)throw new Ie.ErrnoError(8);if(0==(2097155&t.flags))throw new Ie.ErrnoError(28);Ie.truncate(t.node,r)},utime:(e,r,t)=>{var n=Ie.lookupPath(e,{follow:!0}).node;n.node_ops.setattr(n,{timestamp:Math.max(r,t)})},open:(e,t,n,o,i)=>{if(""===e)throw new Ie.ErrnoError(44);var a;if(n=void 0===n?438:n,n=64&(t="string"==typeof t?Ie.modeStringToFlags(t):t)?4095&n|32768:0,"object"==typeof e)a=e;else{e=Ae.normalize(e);try{a=Ie.lookupPath(e,{follow:!(131072&t)}).node}catch(e){}}var s=!1;if(64&t)if(a){if(128&t)throw new Ie.ErrnoError(20)}else a=Ie.mknod(e,n,0),s=!0;if(!a)throw new Ie.ErrnoError(44);if(Ie.isChrdev(a.mode)&&(t&=-513),65536&t&&!Ie.isDir(a.mode))throw new Ie.ErrnoError(54);if(!s){var l=Ie.mayOpen(a,t);if(l)throw new Ie.ErrnoError(l)}512&t&&Ie.truncate(a,0),t&=-131713;var u=Ie.createStream({node:a,path:Ie.getPath(a),flags:t,seekable:!0,position:0,stream_ops:a.stream_ops,ungotten:[],error:!1},o,i);return u.stream_ops.open&&u.stream_ops.open(u),!r.logReadFiles||1&t||(Ie.readFiles||(Ie.readFiles={}),e in Ie.readFiles||(Ie.readFiles[e]=1)),u},close:e=>{if(Ie.isClosed(e))throw new Ie.ErrnoError(8);e.getdents&&(e.getdents=null);try{e.stream_ops.close&&e.stream_ops.close(e)}catch(e){throw e}finally{Ie.closeStream(e.fd)}e.fd=null},isClosed:e=>null===e.fd,llseek:(e,r,t)=>{if(Ie.isClosed(e))throw new Ie.ErrnoError(8);if(!e.seekable||!e.stream_ops.llseek)throw new Ie.ErrnoError(70);if(0!=t&&1!=t&&2!=t)throw new Ie.ErrnoError(28);return e.position=e.stream_ops.llseek(e,r,t),e.ungotten=[],e.position},read:(e,r,t,n,o)=>{if(n<0||o<0)throw new Ie.ErrnoError(28);if(Ie.isClosed(e))throw new Ie.ErrnoError(8);if(1==(2097155&e.flags))throw new Ie.ErrnoError(8);if(Ie.isDir(e.node.mode))throw new Ie.ErrnoError(31);if(!e.stream_ops.read)throw new Ie.ErrnoError(28);var i=void 0!==o;if(i){if(!e.seekable)throw new Ie.ErrnoError(70)}else o=e.position;var a=e.stream_ops.read(e,r,t,n,o);return i||(e.position+=a),a},write:(e,r,t,n,o,i)=>{if(n<0||o<0)throw new Ie.ErrnoError(28);if(Ie.isClosed(e))throw new Ie.ErrnoError(8);if(0==(2097155&e.flags))throw new Ie.ErrnoError(8);if(Ie.isDir(e.node.mode))throw new Ie.ErrnoError(31);if(!e.stream_ops.write)throw new Ie.ErrnoError(28);e.seekable&&1024&e.flags&&Ie.llseek(e,0,2);var a=void 0!==o;if(a){if(!e.seekable)throw new Ie.ErrnoError(70)}else o=e.position;var s=e.stream_ops.write(e,r,t,n,o,i);return a||(e.position+=s),s},allocate:(e,r,t)=>{if(Ie.isClosed(e))throw new Ie.ErrnoError(8);if(r<0||t<=0)throw new Ie.ErrnoError(28);if(0==(2097155&e.flags))throw new Ie.ErrnoError(8);if(!Ie.isFile(e.node.mode)&&!Ie.isDir(e.node.mode))throw new Ie.ErrnoError(43);if(!e.stream_ops.allocate)throw new Ie.ErrnoError(138);e.stream_ops.allocate(e,r,t)},mmap:(e,r,t,n,o,i)=>{if(0!=(2&o)&&0==(2&i)&&2!=(2097155&e.flags))throw new Ie.ErrnoError(2);if(1==(2097155&e.flags))throw new Ie.ErrnoError(2);if(!e.stream_ops.mmap)throw new Ie.ErrnoError(43);return e.stream_ops.mmap(e,r,t,n,o,i)},msync:(e,r,t,n,o)=>e&&e.stream_ops.msync?e.stream_ops.msync(e,r,t,n,o):0,munmap:e=>0,ioctl:(e,r,t)=>{if(!e.stream_ops.ioctl)throw new Ie.ErrnoError(59);return e.stream_ops.ioctl(e,r,t)},readFile:function(e){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(r.flags=r.flags||0,r.encoding=r.encoding||"binary","utf8"!==r.encoding&&"binary"!==r.encoding)throw new Error('Invalid encoding type "'+r.encoding+'"');var t,n=Ie.open(e,r.flags),o=Ie.stat(e),i=o.size,a=new Uint8Array(i);return Ie.read(n,a,0,i,0),"utf8"===r.encoding?t=O(a,0):"binary"===r.encoding&&(t=a),Ie.close(n),t},writeFile:function(e,r){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};t.flags=t.flags||577;var n=Ie.open(e,t.flags,t.mode);if("string"==typeof r){var o=new Uint8Array(I(r)+1),i=M(r,o,0,o.length);Ie.write(n,o,0,i,void 0,t.canOwn)}else{if(!ArrayBuffer.isView(r))throw new Error("Unsupported data type");Ie.write(n,r,0,r.byteLength,void 0,t.canOwn)}Ie.close(n)},cwd:()=>Ie.currentPath,chdir:e=>{var r=Ie.lookupPath(e,{follow:!0});if(null===r.node)throw new Ie.ErrnoError(44);if(!Ie.isDir(r.node.mode))throw new Ie.ErrnoError(54);var t=Ie.nodePermissions(r.node,"x");if(t)throw new Ie.ErrnoError(t);Ie.currentPath=r.path},createDefaultDirectories:()=>{Ie.mkdir("/tmp"),Ie.mkdir("/home"),Ie.mkdir("/home/web_user")},createDefaultDevices:()=>{Ie.mkdir("/dev"),Ie.registerDevice(Ie.makedev(1,3),{read:()=>0,write:(e,r,t,n,o)=>n}),Ie.mkdev("/dev/null",Ie.makedev(1,3)),De.register(Ie.makedev(5,0),De.default_tty_ops),De.register(Ie.makedev(6,0),De.default_tty1_ops),Ie.mkdev("/dev/tty",Ie.makedev(5,0)),Ie.mkdev("/dev/tty1",Ie.makedev(6,0));var e=function(){if("object"==typeof crypto&&"function"==typeof crypto.getRandomValues){var e=new Uint8Array(1);return function(){return crypto.getRandomValues(e),e[0]}}if(u)try{var r=a.default;return function(){return r.randomBytes(1)[0]}}catch(e){}return function(){ge("no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: function(array) { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };")}}();Ie.createDevice("/dev","random",e),Ie.createDevice("/dev","urandom",e),Ie.mkdir("/dev/shm"),Ie.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{Ie.mkdir("/proc");var e=Ie.mkdir("/proc/self");Ie.mkdir("/proc/self/fd"),Ie.mount({mount:()=>{var r=Ie.createNode(e,"fd",16895,73);return r.node_ops={lookup:(e,r)=>{var t=+r,n=Ie.getStream(t);if(!n)throw new Ie.ErrnoError(8);var o={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>n.path}};return o.parent=o,o}},r}},{},"/proc/self/fd")},createStandardStreams:()=>{r.stdin?Ie.createDevice("/dev","stdin",r.stdin):Ie.symlink("/dev/tty","/dev/stdin"),r.stdout?Ie.createDevice("/dev","stdout",null,r.stdout):Ie.symlink("/dev/tty","/dev/stdout"),r.stderr?Ie.createDevice("/dev","stderr",null,r.stderr):Ie.symlink("/dev/tty1","/dev/stderr");var e=Ie.open("/dev/stdin",0),t=Ie.open("/dev/stdout",1),n=Ie.open("/dev/stderr",1);F(0===e.fd,"invalid handle for stdin ("+e.fd+")"),F(1===t.fd,"invalid handle for stdout ("+t.fd+")"),F(2===n.fd,"invalid handle for stderr ("+n.fd+")")},ensureErrnoError:()=>{Ie.ErrnoError||(Ie.ErrnoError=function(e,r){this.node=r,this.setErrno=function(e){for(var r in this.errno=e,Ne)if(Ne[r]===e){this.code=r;break}},this.setErrno(e),this.message=Me[e],this.stack&&(Object.defineProperty(this,"stack",{value:(new Error).stack,writable:!0}),this.stack=Se(this.stack))},Ie.ErrnoError.prototype=new Error,Ie.ErrnoError.prototype.constructor=Ie.ErrnoError,[44].forEach((e=>{Ie.genericErrors[e]=new Ie.ErrnoError(e),Ie.genericErrors[e].stack="<generic error, no stack>"})))},staticInit:()=>{Ie.ensureErrnoError(),Ie.nameTable=new Array(4096),Ie.mount(Re,{},"/"),Ie.createDefaultDirectories(),Ie.createDefaultDevices(),Ie.createSpecialDirectories(),Ie.filesystems={MEMFS:Re}},init:(e,t,n)=>{F(!Ie.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)"),Ie.init.initialized=!0,Ie.ensureErrnoError(),r.stdin=e||r.stdin,r.stdout=t||r.stdout,r.stderr=n||r.stderr,Ie.createStandardStreams()},quit:()=>{Ie.init.initialized=!1,wt();for(var e=0;e<Ie.streams.length;e++){var r=Ie.streams[e];r&&Ie.close(r)}},getMode:(e,r)=>{var t=0;return e&&(t|=365),r&&(t|=146),t},findObject:(e,r)=>{var t=Ie.analyzePath(e,r);return t.exists?t.object:null},analyzePath:(e,r)=>{try{e=(n=Ie.lookupPath(e,{follow:!r})).path}catch(e){}var t={isRoot:!1,exists:!1,error:0,name:null,path:null,object:null,parentExists:!1,parentPath:null,parentObject:null};try{var n=Ie.lookupPath(e,{parent:!0});t.parentExists=!0,t.parentPath=n.path,t.parentObject=n.node,t.name=Ae.basename(e),n=Ie.lookupPath(e,{follow:!r}),t.exists=!0,t.path=n.path,t.object=n.node,t.name=n.node.name,t.isRoot="/"===n.path}catch(e){t.error=e.errno}return t},createPath:(e,r,t,n)=>{e="string"==typeof e?e:Ie.getPath(e);for(var o=r.split("/").reverse();o.length;){var i=o.pop();if(i){var a=Ae.join2(e,i);try{Ie.mkdir(a)}catch(e){}e=a}}return a},createFile:(e,r,t,n,o)=>{var i=Ae.join2("string"==typeof e?e:Ie.getPath(e),r),a=Ie.getMode(n,o);return Ie.create(i,a)},createDataFile:(e,r,t,n,o,i)=>{var a=r;e&&(e="string"==typeof e?e:Ie.getPath(e),a=r?Ae.join2(e,r):e);var s=Ie.getMode(n,o),l=Ie.create(a,s);if(t){if("string"==typeof t){for(var u=new Array(t.length),c=0,d=t.length;c<d;++c)u[c]=t.charCodeAt(c);t=u}Ie.chmod(l,146|s);var f=Ie.open(l,577);Ie.write(f,t,0,t.length,0,i),Ie.close(f),Ie.chmod(l,s)}return l},createDevice:(e,r,t,n)=>{var o=Ae.join2("string"==typeof e?e:Ie.getPath(e),r),i=Ie.getMode(!!t,!!n);Ie.createDevice.major||(Ie.createDevice.major=64);var a=Ie.makedev(Ie.createDevice.major++,0);return Ie.registerDevice(a,{open:e=>{e.seekable=!1},close:e=>{n&&n.buffer&&n.buffer.length&&n(10)},read:(e,r,n,o,i)=>{for(var a=0,s=0;s<o;s++){var l;try{l=t()}catch(e){throw new Ie.ErrnoError(29)}if(void 0===l&&0===a)throw new Ie.ErrnoError(6);if(null==l)break;a++,r[n+s]=l}return a&&(e.node.timestamp=Date.now()),a},write:(e,r,t,o,i)=>{for(var a=0;a<o;a++)try{n(r[t+a])}catch(e){throw new Ie.ErrnoError(29)}return o&&(e.node.timestamp=Date.now()),a}}),Ie.mkdev(o,i,a)},forceLoadFile:e=>{if(e.isDevice||e.isFolder||e.link||e.contents)return!0;if("undefined"!=typeof XMLHttpRequest)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.");if(!d)throw new Error("Cannot load without read() or XMLHttpRequest.");try{e.contents=pt(d(e.url),!0),e.usedBytes=e.contents.length}catch(e){throw new Ie.ErrnoError(29)}},createLazyFile:(e,r,t,n,o)=>{function i(){this.lengthKnown=!1,this.chunks=[]}if(i.prototype.get=function(e){if(!(e>this.length-1||e<0)){var r=e%this.chunkSize,t=e/this.chunkSize|0;return this.getter(t)[r]}},i.prototype.setDataGetter=function(e){this.getter=e},i.prototype.cacheLength=function(){var e=new XMLHttpRequest;if(e.open("HEAD",t,!1),e.send(null),!(e.status>=200&&e.status<300||304===e.status))throw new Error("Couldn't load "+t+". Status: "+e.status);var r,n=Number(e.getResponseHeader("Content-length")),o=(r=e.getResponseHeader("Accept-Ranges"))&&"bytes"===r,i=(r=e.getResponseHeader("Content-Encoding"))&&"gzip"===r,a=1048576;o||(a=n);var s=this;s.setDataGetter((e=>{var r=e*a,o=(e+1)*a-1;if(o=Math.min(o,n-1),void 0===s.chunks[e]&&(s.chunks[e]=((e,r)=>{if(e>r)throw new Error("invalid range ("+e+", "+r+") or no bytes requested!");if(r>n-1)throw new Error("only "+n+" bytes available! programmer error!");var o=new XMLHttpRequest;if(o.open("GET",t,!1),n!==a&&o.setRequestHeader("Range","bytes="+e+"-"+r),o.responseType="arraybuffer",o.overrideMimeType&&o.overrideMimeType("text/plain; charset=x-user-defined"),o.send(null),!(o.status>=200&&o.status<300||304===o.status))throw new Error("Couldn't load "+t+". Status: "+o.status);return void 0!==o.response?new Uint8Array(o.response||[]):pt(o.responseText||"",!0)})(r,o)),void 0===s.chunks[e])throw new Error("doXHR failed!");return s.chunks[e]})),!i&&n||(a=n=1,n=this.getter(0).length,a=n,b("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=n,this._chunkSize=a,this.lengthKnown=!0},"undefined"!=typeof XMLHttpRequest){if(!l)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var a=new i;Object.defineProperties(a,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var s={isDevice:!1,contents:a}}else s={isDevice:!1,url:t};var u=Ie.createFile(e,r,s,n,o);s.contents?u.contents=s.contents:s.url&&(u.contents=null,u.url=s.url),Object.defineProperties(u,{usedBytes:{get:function(){return this.contents.length}}});var c={};return Object.keys(u.stream_ops).forEach((e=>{var r=u.stream_ops[e];c[e]=function(){return Ie.forceLoadFile(u),r.apply(null,arguments)}})),c.read=(e,r,t,n,o)=>{Ie.forceLoadFile(u);var i=e.node.contents;if(o>=i.length)return 0;var a=Math.min(i.length-o,n);if(F(a>=0),i.slice)for(var s=0;s<a;s++)r[t+s]=i[o+s];else for(s=0;s<a;s++)r[t+s]=i.get(o+s);return a},u.stream_ops=c,u},createPreloadedFile:(e,r,t,n,o,i,a,s,l,u)=>{var c=r?Fe.resolve(Ae.join2(e,r)):e,d=pe("cp "+c);function p(t){function f(t){u&&u(),s||Ie.createDataFile(e,r,t,n,o,l),i&&i(),he(d)}Browser.handledByPreloadPlugin(t,c,f,(()=>{a&&a(),he(d)}))||f(t)}me(d),"string"==typeof t?function(e,r,t,n){var o=n?"":pe("al "+e);f(e,(function(t){F(t,'Loading data file "'+e+'" failed (no arrayBuffer).'),r(new Uint8Array(t)),o&&he(o)}),(function(r){if(!t)throw'Loading data file "'+e+'" failed.';t()})),o&&me(o)}(t,(e=>p(e)),a):p(t)},indexedDB:()=>window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB,DB_NAME:()=>"EM_FS_"+window.location.pathname,DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(e,r,t)=>{r=r||(()=>{}),t=t||(()=>{});var n=Ie.indexedDB();try{var o=n.open(Ie.DB_NAME(),Ie.DB_VERSION)}catch(e){return t(e)}o.onupgradeneeded=()=>{b("creating db"),o.result.createObjectStore(Ie.DB_STORE_NAME)},o.onsuccess=()=>{var n=o.result.transaction([Ie.DB_STORE_NAME],"readwrite"),i=n.objectStore(Ie.DB_STORE_NAME),a=0,s=0,l=e.length;function u(){0==s?r():t()}e.forEach((e=>{var r=i.put(Ie.analyzePath(e).object.contents,e);r.onsuccess=()=>{++a+s==l&&u()},r.onerror=()=>{s++,a+s==l&&u()}})),n.onerror=t},o.onerror=t},loadFilesFromDB:(e,r,t)=>{r=r||(()=>{}),t=t||(()=>{});var n=Ie.indexedDB();try{var o=n.open(Ie.DB_NAME(),Ie.DB_VERSION)}catch(e){return t(e)}o.onupgradeneeded=t,o.onsuccess=()=>{var n=o.result;try{var i=n.transaction([Ie.DB_STORE_NAME],"readonly")}catch(e){return void t(e)}var a=i.objectStore(Ie.DB_STORE_NAME),s=0,l=0,u=e.length;function c(){0==l?r():t()}e.forEach((e=>{var r=a.get(e);r.onsuccess=()=>{Ie.analyzePath(e).exists&&Ie.unlink(e),Ie.createDataFile(Ae.dirname(e),Ae.basename(e),r.result,!0,!0,!0),++s+l==u&&c()},r.onerror=()=>{l++,s+l==u&&c()}})),i.onerror=t},o.onerror=t},absolutePath:()=>{ge("FS.absolutePath has been removed; use PATH_FS.resolve instead")},createFolder:()=>{ge("FS.createFolder has been removed; use FS.mkdir instead")},createLink:()=>{ge("FS.createLink has been removed; use FS.symlink instead")},joinPath:()=>{ge("FS.joinPath has been removed; use PATH.join instead")},mmapAlloc:()=>{ge("FS.mmapAlloc has been replaced by the top level function mmapAlloc")},standardizePath:()=>{ge("FS.standardizePath has been removed; use PATH.normalize instead")}},Le={DEFAULT_POLLMASK:5,calculateAt:function(e,r,t){if(Ae.isAbs(r))return r;var n;if(-100===e)n=Ie.cwd();else{var o=Ie.getStream(e);if(!o)throw new Ie.ErrnoError(8);n=o.path}if(0==r.length){if(!t)throw new Ie.ErrnoError(44);return n}return Ae.join2(n,r)},doStat:function(e,r,t){try{var n=e(r)}catch(e){if(e&&e.node&&Ae.normalize(r)!==Ae.normalize(Ie.getPath(e.node)))return-54;throw e}return $[t>>2]=n.dev,$[t+4>>2]=0,$[t+8>>2]=n.ino,$[t+12>>2]=n.mode,$[t+16>>2]=n.nlink,$[t+20>>2]=n.uid,$[t+24>>2]=n.gid,$[t+28>>2]=n.rdev,$[t+32>>2]=0,Ee=[n.size>>>0,(ye=n.size,+Math.abs(ye)>=1?ye>0?(0|Math.min(+Math.floor(ye/4294967296),4294967295))>>>0:~~+Math.ceil((ye-+(~~ye>>>0))/4294967296)>>>0:0)],$[t+40>>2]=Ee[0],$[t+44>>2]=Ee[1],$[t+48>>2]=4096,$[t+52>>2]=n.blocks,$[t+56>>2]=n.atime.getTime()/1e3|0,$[t+60>>2]=0,$[t+64>>2]=n.mtime.getTime()/1e3|0,$[t+68>>2]=0,$[t+72>>2]=n.ctime.getTime()/1e3|0,$[t+76>>2]=0,Ee=[n.ino>>>0,(ye=n.ino,+Math.abs(ye)>=1?ye>0?(0|Math.min(+Math.floor(ye/4294967296),4294967295))>>>0:~~+Math.ceil((ye-+(~~ye>>>0))/4294967296)>>>0:0)],$[t+80>>2]=Ee[0],$[t+84>>2]=Ee[1],0},doMsync:function(e,r,t,n,o){var i=U.slice(e,e+t);Ie.msync(r,i,o,t,n)},doMknod:function(e,r,t){switch(61440&r){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return Ie.mknod(e,r,t),0},doReadlink:function(e,r,t){if(t<=0)return-28;var n=Ie.readlink(e),o=Math.min(t,I(n)),i=x[r+o];return N(n,r,t+1),x[r+o]=i,o},doAccess:function(e,r){if(-8&r)return-28;var t=Ie.lookupPath(e,{follow:!0}).node;if(!t)return-44;var n="";return 4&r&&(n+="r"),2&r&&(n+="w"),1&r&&(n+="x"),n&&Ie.nodePermissions(t,n)?-2:0},doReadv:function(e,r,t,n){for(var o=0,i=0;i<t;i++){var a=$[r>>2],s=$[r+4>>2];r+=8;var l=Ie.read(e,x,a,s,n);if(l<0)return-1;if(o+=l,l<s)break}return o},doWritev:function(e,r,t,n){for(var o=0,i=0;i<t;i++){var a=$[r>>2],s=$[r+4>>2];r+=8;var l=Ie.write(e,x,a,s,n);if(l<0)return-1;o+=l}return o},varargs:void 0,get:function(){return F(null!=Le.varargs),Le.varargs+=4,$[Le.varargs-4>>2]},getStr:function(e){return R(e)},getStreamFromFD:function(e){var r=Ie.getStream(e);if(!r)throw new Ie.ErrnoError(8);return r}};function xe(e){switch(e){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+e)}}var Ue=void 0;function Be(e){for(var r="",t=e;U[t];)r+=Ue[U[t++]];return r}var je={},$e={},We={};function ze(e){if(void 0===e)return"_unknown";var r=(e=e.replace(/[^a-zA-Z0-9_]/g,"$")).charCodeAt(0);return r>=48&&r<=57?"_"+e:e}function He(e,r){return e=ze(e),new Function("body","return function "+e+'() {\n "use strict"; return body.apply(this, arguments);\n};\n')(r)}function Ge(e,r){var t=He(r,(function(e){this.name=r,this.message=e;var t=new Error(e).stack;void 0!==t&&(this.stack=this.toString()+"\n"+t.replace(/^Error(:[^\n]*)?\n/,""))}));return t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message},t}var Ve=void 0;function Ye(e){throw new Ve(e)}var qe=void 0;function Xe(e){throw new qe(e)}function Ke(e,r,t){function n(r){var n=t(r);n.length!==e.length&&Xe("Mismatched type converter count");for(var o=0;o<e.length;++o)Je(e[o],n[o])}e.forEach((function(e){We[e]=r}));var o=new Array(r.length),i=[],a=0;r.forEach(((e,r)=>{$e.hasOwnProperty(e)?o[r]=$e[e]:(i.push(e),je.hasOwnProperty(e)||(je[e]=[]),je[e].push((()=>{o[r]=$e[e],++a===i.length&&n(o)})))})),0===i.length&&n(o)}function Je(e,r){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!("argPackAdvance"in r))throw new TypeError("registerType registeredInstance requires argPackAdvance");var n=r.name;if(e||Ye('type "'+n+'" must have a positive integer typeid pointer'),$e.hasOwnProperty(e)){if(t.ignoreDuplicateRegistrations)return;Ye("Cannot register type '"+n+"' twice")}if($e[e]=r,delete We[e],je.hasOwnProperty(e)){var o=je[e];delete je[e],o.forEach((e=>e()))}}function Qe(e){if(!(this instanceof wr))return!1;if(!(e instanceof wr))return!1;for(var r=this.$$.ptrType.registeredClass,t=this.$$.ptr,n=e.$$.ptrType.registeredClass,o=e.$$.ptr;r.baseClass;)t=r.upcast(t),r=r.baseClass;for(;n.baseClass;)o=n.upcast(o),n=n.baseClass;return r===n&&t===o}function Ze(e){Ye(e.$$.ptrType.registeredClass.name+" instance already deleted")}var er=!1;function rr(e){}function tr(e){e.count.value-=1,0===e.count.value&&function(e){e.smartPtr?e.smartPtrType.rawDestructor(e.smartPtr):e.ptrType.registeredClass.rawDestructor(e.ptr)}(e)}function nr(e,r,t){if(r===t)return e;if(void 0===t.baseClass)return null;var n=nr(e,r,t.baseClass);return null===n?null:t.downcast(n)}var or={};function ir(){return Object.keys(dr).length}function ar(){var e=[];for(var r in dr)dr.hasOwnProperty(r)&&e.push(dr[r]);return e}var sr=[];function lr(){for(;sr.length;){var e=sr.pop();e.$$.deleteScheduled=!1,e.delete()}}var ur=void 0;function cr(e){ur=e,sr.length&&ur&&ur(lr)}var dr={};function fr(e,r){return r=function(e,r){for(void 0===r&&Ye("ptr should not be undefined");e.baseClass;)r=e.upcast(r),e=e.baseClass;return r}(e,r),dr[r]}function pr(e,r){return r.ptrType&&r.ptr||Xe("makeClassHandle requires ptr and ptrType"),!!r.smartPtrType!==!!r.smartPtr&&Xe("Both smartPtrType and smartPtr must be specified"),r.count={value:1},hr(Object.create(e,{$$:{value:r}}))}function mr(e){var r=this.getPointee(e);if(!r)return this.destructor(e),null;var t=fr(this.registeredClass,r);if(void 0!==t){if(0===t.$$.count.value)return t.$$.ptr=r,t.$$.smartPtr=e,t.clone();var n=t.clone();return this.destructor(e),n}function o(){return this.isSmartPointer?pr(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:r,smartPtrType:this,smartPtr:e}):pr(this.registeredClass.instancePrototype,{ptrType:this,ptr:e})}var i,a=this.registeredClass.getActualType(r),s=or[a];if(!s)return o.call(this);i=this.isConst?s.constPointerType:s.pointerType;var l=nr(r,this.registeredClass,i.registeredClass);return null===l?o.call(this):this.isSmartPointer?pr(i.registeredClass.instancePrototype,{ptrType:i,ptr:l,smartPtrType:this,smartPtr:e}):pr(i.registeredClass.instancePrototype,{ptrType:i,ptr:l})}function hr(e){return"undefined"==typeof FinalizationRegistry?(hr=e=>e,e):(er=new FinalizationRegistry((e=>{console.warn(e.leakWarning.stack.replace(/^Error: /,"")),tr(e.$$)})),hr=e=>{var r=e.$$;if(!!r.smartPtr){var t={$$:r},n=r.ptrType.registeredClass;t.leakWarning=new Error("Embind found a leaked C++ instance "+n.name+" <0x"+r.ptr.toString(16)+">.\nWe'll free it automatically in this case, but this functionality is not reliable across various environments.\nMake sure to invoke .delete() manually once you're done with the instance instead.\nOriginally allocated"),"captureStackTrace"in Error&&Error.captureStackTrace(t.leakWarning,mr),er.register(e,t,e)}return e},rr=e=>er.unregister(e),hr(e))}function gr(){if(this.$$.ptr||Ze(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var e,r=hr(Object.create(Object.getPrototypeOf(this),{$$:{value:(e=this.$$,{count:e.count,deleteScheduled:e.deleteScheduled,preservePointerOnDelete:e.preservePointerOnDelete,ptr:e.ptr,ptrType:e.ptrType,smartPtr:e.smartPtr,smartPtrType:e.smartPtrType})}}));return r.$$.count.value+=1,r.$$.deleteScheduled=!1,r}function vr(){this.$$.ptr||Ze(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&Ye("Object already scheduled for deletion"),rr(this),tr(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)}function yr(){return!this.$$.ptr}function Er(){return this.$$.ptr||Ze(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&Ye("Object already scheduled for deletion"),sr.push(this),1===sr.length&&ur&&ur(lr),this.$$.deleteScheduled=!0,this}function wr(){}function br(e,r,t){if(void 0===e[r].overloadTable){var n=e[r];e[r]=function(){return e[r].overloadTable.hasOwnProperty(arguments.length)||Ye("Function '"+t+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+e[r].overloadTable+")!"),e[r].overloadTable[arguments.length].apply(this,arguments)},e[r].overloadTable=[],e[r].overloadTable[n.argCount]=n}}function _r(e,r,t,n,o,i,a,s){this.name=e,this.constructor=r,this.instancePrototype=t,this.rawDestructor=n,this.baseClass=o,this.getActualType=i,this.upcast=a,this.downcast=s,this.pureVirtualFunctions=[]}function Tr(e,r,t){for(;r!==t;)r.upcast||Ye("Expected null or instance of "+t.name+", got an instance of "+r.name),e=r.upcast(e),r=r.baseClass;return e}function kr(e,r){if(null===r)return this.isReference&&Ye("null is not a valid "+this.name),0;r.$$||Ye('Cannot pass "'+qr(r)+'" as a '+this.name),r.$$.ptr||Ye("Cannot pass deleted object as a pointer of type "+this.name);var t=r.$$.ptrType.registeredClass;return Tr(r.$$.ptr,t,this.registeredClass)}function Sr(e,r){var t;if(null===r)return this.isReference&&Ye("null is not a valid "+this.name),this.isSmartPointer?(t=this.rawConstructor(),null!==e&&e.push(this.rawDestructor,t),t):0;r.$$||Ye('Cannot pass "'+qr(r)+'" as a '+this.name),r.$$.ptr||Ye("Cannot pass deleted object as a pointer of type "+this.name),!this.isConst&&r.$$.ptrType.isConst&&Ye("Cannot convert argument of type "+(r.$$.smartPtrType?r.$$.smartPtrType.name:r.$$.ptrType.name)+" to parameter type "+this.name);var n=r.$$.ptrType.registeredClass;if(t=Tr(r.$$.ptr,n,this.registeredClass),this.isSmartPointer)switch(void 0===r.$$.smartPtr&&Ye("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:r.$$.smartPtrType===this?t=r.$$.smartPtr:Ye("Cannot convert argument of type "+(r.$$.smartPtrType?r.$$.smartPtrType.name:r.$$.ptrType.name)+" to parameter type "+this.name);break;case 1:t=r.$$.smartPtr;break;case 2:if(r.$$.smartPtrType===this)t=r.$$.smartPtr;else{var o=r.clone();t=this.rawShare(t,Yr.toHandle((function(){o.delete()}))),null!==e&&e.push(this.rawDestructor,t)}break;default:Ye("Unsupporting sharing policy")}return t}function Cr(e,r){if(null===r)return this.isReference&&Ye("null is not a valid "+this.name),0;r.$$||Ye('Cannot pass "'+qr(r)+'" as a '+this.name),r.$$.ptr||Ye("Cannot pass deleted object as a pointer of type "+this.name),r.$$.ptrType.isConst&&Ye("Cannot convert argument of type "+r.$$.ptrType.name+" to parameter type "+this.name);var t=r.$$.ptrType.registeredClass;return Tr(r.$$.ptr,t,this.registeredClass)}function Pr(e){return this.fromWireType(W[e>>2])}function Ar(e){return this.rawGetPointee&&(e=this.rawGetPointee(e)),e}function Fr(e){this.rawDestructor&&this.rawDestructor(e)}function Dr(e){null!==e&&e.delete()}function Or(e,r,t,n,o,i,a,s,l,u,c){this.name=e,this.registeredClass=r,this.isReference=t,this.isConst=n,this.isSmartPointer=o,this.pointeeType=i,this.sharingPolicy=a,this.rawGetPointee=s,this.rawConstructor=l,this.rawShare=u,this.rawDestructor=c,o||void 0!==r.baseClass?this.toWireType=Sr:n?(this.toWireType=kr,this.destructorFunction=null):(this.toWireType=Cr,this.destructorFunction=null)}function Rr(e,t,n){return e.includes("j")?function(e,t,n){F("dynCall_"+e in r,"bad function pointer type - no table for sig '"+e+"'"),n&&n.length?F(n.length===e.substring(1).replace(/j/g,"--").length):F(1==e.length);var o=r["dynCall_"+e];return n&&n.length?o.apply(null,[t].concat(n)):o.call(null,t)}(e,t,n):(F(Ce(t),"missing table entry in dynCall: "+t),Ce(t).apply(null,n))}function Mr(e,r){var t=(e=Be(e)).includes("j")?function(e,r){F(e.includes("j"),"getDynCaller should only be called with i64 sigs");var t=[];return function(){return t.length=0,Object.assign(t,arguments),Rr(e,r,t)}}(e,r):Ce(r);return"function"!=typeof t&&Ye("unknown function pointer with signature "+e+": "+r),t}var Nr=void 0;function Ir(e){var r=Et(e),t=Be(r);return ht(r),t}function Lr(e,r){var t=[],n={};throw r.forEach((function e(r){n[r]||$e[r]||(We[r]?We[r].forEach(e):(t.push(r),n[r]=!0))})),new Nr(e+": "+t.map(Ir).join([", "]))}function xr(e,r){for(var t=[],n=0;n<e;n++)t.push($[(r>>2)+n]);return t}function Ur(e){for(;e.length;){var r=e.pop();e.pop()(r)}}function Br(e,r){if(!(e instanceof Function))throw new TypeError("new_ called with constructor type "+typeof e+" which is not a function");var t=He(e.name||"unknownFunctionName",(function(){}));t.prototype=e.prototype;var n=new t,o=e.apply(n,r);return o instanceof Object?o:n}function jr(e,r,t,n,o){var i=r.length;i<2&&Ye("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var a=null!==r[1]&&null!==t,s=!1,l=1;l<r.length;++l)if(null!==r[l]&&void 0===r[l].destructorFunction){s=!0;break}var u="void"!==r[0].name,c="",d="";for(l=0;l<i-2;++l)c+=(0!==l?", ":"")+"arg"+l,d+=(0!==l?", ":"")+"arg"+l+"Wired";var f="return function "+ze(e)+"("+c+") {\nif (arguments.length !== "+(i-2)+") {\nthrowBindingError('function "+e+" called with ' + arguments.length + ' arguments, expected "+(i-2)+" args!');\n}\n";s&&(f+="var destructors = [];\n");var p=s?"destructors":"null",m=["throwBindingError","invoker","fn","runDestructors","retType","classParam"],h=[Ye,n,o,Ur,r[0],r[1]];a&&(f+="var thisWired = classParam.toWireType("+p+", this);\n");for(l=0;l<i-2;++l)f+="var arg"+l+"Wired = argType"+l+".toWireType("+p+", arg"+l+"); // "+r[l+2].name+"\n",m.push("argType"+l),h.push(r[l+2]);if(a&&(d="thisWired"+(d.length>0?", ":"")+d),f+=(u?"var rv = ":"")+"invoker(fn"+(d.length>0?", ":"")+d+");\n",s)f+="runDestructors(destructors);\n";else for(l=a?1:2;l<r.length;++l){var g=1===l?"thisWired":"arg"+(l-2)+"Wired";null!==r[l].destructorFunction&&(f+=g+"_dtor("+g+"); // "+r[l].name+"\n",m.push(g+"_dtor"),h.push(r[l].destructorFunction))}return u&&(f+="var ret = retType.fromWireType(rv);\nreturn ret;\n"),f+="}\n",m.push(f),Br(Function,m).apply(null,h)}function $r(e,r,t){return e instanceof Object||Ye(t+' with invalid "this": '+e),e instanceof r.registeredClass.constructor||Ye(t+' incompatible with "this" of type '+e.constructor.name),e.$$.ptr||Ye("cannot call emscripten binding method "+t+" on deleted object"),Tr(e.$$.ptr,e.$$.ptrType.registeredClass,r.registeredClass)}var Wr=[],zr=[{},{value:void 0},{value:null},{value:!0},{value:!1}];function Hr(e){e>4&&0==--zr[e].refcount&&(zr[e]=void 0,Wr.push(e))}function Gr(){for(var e=0,r=5;r<zr.length;++r)void 0!==zr[r]&&++e;return e}function Vr(){for(var e=5;e<zr.length;++e)if(void 0!==zr[e])return zr[e];return null}var Yr={toValue:e=>(e||Ye("Cannot use deleted val. handle = "+e),zr[e].value),toHandle:e=>{switch(e){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:var r=Wr.length?Wr.pop():zr.length;return zr[r]={refcount:1,value:e},r}}};function qr(e){if(null===e)return"null";var r=typeof e;return"object"===r||"array"===r||"function"===r?e.toString():""+e}function Xr(e,r){switch(r){case 2:return function(e){return this.fromWireType(z[e>>2])};case 3:return function(e){return this.fromWireType(H[e>>3])};default:throw new TypeError("Unknown float type: "+e)}}function Kr(e,r,t){switch(r){case 0:return t?function(e){return x[e]}:function(e){return U[e]};case 1:return t?function(e){return B[e>>1]}:function(e){return j[e>>1]};case 2:return t?function(e){return $[e>>2]}:function(e){return W[e>>2]};default:throw new TypeError("Unknown integer type: "+e)}}function Jr(e,r){var t=$e[e];return void 0===t&&Ye(r+" has unknown type "+Ir(e)),t}var Qr={};var Zr=[];var et=[];function rt(e,r){return F(r===(0|r)),(e>>>0)+4294967296*r}function tt(e,r){if(e<=0)return e;var t=r<=32?Math.abs(1<<r-1):Math.pow(2,r-1);return e>=t&&(r<=32||e>t)&&(e=-2*t+e),e}function nt(e,r){return e>=0?e:r<=32?2*Math.abs(1<<r-1)+e:Math.pow(2,r)+e}function ot(e,r){F(0==(3&r));var t=e,n=r;function o(e){var r;return n=function(e,r){return"double"===r||"i64"===r?7&e&&(F(4==(7&e)),e+=4):F(0==(3&e)),e}(n,e),"double"===e?(r=Number(H[n>>3]),n+=8):"i64"==e?(r=[$[n>>2],$[n+4>>2]],n+=8):(F(0==(3&n)),e="i32",r=$[n>>2],n+=4),r}for(var i,a,s,l,u,c,d=[];;){var f=t;if(0===(i=x[t>>0]))break;if(a=x[t+1>>0],37==i){var p=!1,m=!1,h=!1,g=!1,v=!1;e:for(;;){switch(a){case 43:p=!0;break;case 45:m=!0;break;case 35:h=!0;break;case 48:if(g)break e;g=!0;break;case 32:v=!0;break;default:break e}t++,a=x[t+1>>0]}var y=0;if(42==a)y=o("i32"),t++,a=x[t+1>>0];else for(;a>=48&&a<=57;)y=10*y+(a-48),t++,a=x[t+1>>0];var E,w=!1,b=-1;if(46==a){if(b=0,w=!0,t++,42==(a=x[t+1>>0]))b=o("i32"),t++;else for(;;){var _=x[t+1>>0];if(_<48||_>57)break;b=10*b+(_-48),t++}a=x[t+1>>0]}switch(b<0&&(b=6,w=!1),String.fromCharCode(a)){case"h":104==x[t+2>>0]?(t++,E=1):E=2;break;case"l":108==x[t+2>>0]?(t++,E=8):E=4;break;case"L":case"q":case"j":E=8;break;case"z":case"t":case"I":E=4;break;default:E=null}switch(E&&t++,a=x[t+1>>0],String.fromCharCode(a)){case"d":case"i":case"u":case"o":case"x":case"X":case"p":var T=100==a||105==a;if(s=o("i"+8*(E=E||4)),8==E&&(s=117==a?(u=s[0],c=s[1],(u>>>0)+4294967296*(c>>>0)):rt(s[0],s[1])),E<=4)s=(T?tt:nt)(s&Math.pow(256,E)-1,8*E);var k=Math.abs(s),S="";if(100==a||105==a)A=tt(s,8*E).toString(10);else if(117==a)A=nt(s,8*E).toString(10),s=Math.abs(s);else if(111==a)A=(h?"0":"")+k.toString(8);else if(120==a||88==a){if(S=h&&0!=s?"0x":"",s<0){s=-s,A=(k-1).toString(16);for(var C=[],P=0;P<A.length;P++)C.push((15-parseInt(A[P],16)).toString(16));for(A=C.join("");A.length<2*E;)A="f"+A}else A=k.toString(16);88==a&&(S=S.toUpperCase(),A=A.toUpperCase())}else 112==a&&(0===k?A="(nil)":(S="0x",A=k.toString(16)));if(w)for(;A.length<b;)A="0"+A;for(s>=0&&(p?S="+"+S:v&&(S=" "+S)),"-"==A.charAt(0)&&(S="-"+S,A=A.substr(1));S.length+A.length<y;)m?A+=" ":g?A="0"+A:S=" "+S;(A=S+A).split("").forEach((function(e){d.push(e.charCodeAt(0))}));break;case"f":case"F":case"e":case"E":case"g":case"G":var A;if(s=o("double"),isNaN(s))A="nan",g=!1;else if(isFinite(s)){var D=!1,O=Math.min(b,20);if(103==a||71==a){D=!0,b=b||1;var R=parseInt(s.toExponential(O).split("e")[1],10);b>R&&R>=-4?(a=(103==a?"f":"F").charCodeAt(0),b-=R+1):(a=(103==a?"e":"E").charCodeAt(0),b--),O=Math.min(b,20)}101==a||69==a?(A=s.toExponential(O),/[eE][-+]\d$/.test(A)&&(A=A.slice(0,-1)+"0"+A.slice(-1))):102!=a&&70!=a||(A=s.toFixed(O),0===s&&((l=s)<0||0===l&&1/l==-1/0)&&(A="-"+A));var M=A.split("e");if(D&&!h)for(;M[0].length>1&&M[0].includes(".")&&("0"==M[0].slice(-1)||"."==M[0].slice(-1));)M[0]=M[0].slice(0,-1);else for(h&&-1==A.indexOf(".")&&(M[0]+=".");b>O++;)M[0]+="0";A=M[0]+(M.length>1?"e"+M[1]:""),69==a&&(A=A.toUpperCase()),s>=0&&(p?A="+"+A:v&&(A=" "+A))}else A=(s<0?"-":"")+"inf",g=!1;for(;A.length<y;)m?A+=" ":A=!g||"-"!=A[0]&&"+"!=A[0]?(g?"0":" ")+A:A[0]+"0"+A.slice(1);a<97&&(A=A.toUpperCase()),A.split("").forEach((function(e){d.push(e.charCodeAt(0))}));break;case"s":var N=o("i8*"),I=N?vt(N):"(null)".length;if(w&&(I=Math.min(I,b)),!m)for(;I<y--;)d.push(32);if(N)for(P=0;P<I;P++)d.push(U[N++>>0]);else d=d.concat(pt("(null)".substr(0,I),!0));if(m)for(;I<y--;)d.push(32);break;case"c":for(m&&d.push(o("i8"));--y>0;)d.push(32);m||d.push(o("i8"));break;case"n":var L=o("i32*");$[L>>2]=d.length;break;case"%":d.push(i);break;default:for(P=f;P<t+2;P++)d.push(x[P>>0])}t+=2}else d.push(i),t+=1}return d}function it(e){if(!e||!e.callee||!e.callee.name)return[null,"",""];e.callee.toString();var r=e.callee.name,t="(",n=!0;for(var o in e){var i=e[o];n||(t+=", "),n=!1,t+="number"==typeof i||"string"==typeof i?i:"("+typeof i+")"}t+=")";var a=e.callee.caller;return n&&(t=""),[e=a?a.arguments:[],r,t]}function at(e,r){24&e&&(r=r.replace(/\s+$/,""),r+=(r.length>0?"\n":"")+function(e){var r=Pe(),t=r.lastIndexOf("_emscripten_log"),n=r.lastIndexOf("_emscripten_get_callstack"),o=r.indexOf("\n",Math.max(t,n))+1;r=r.slice(o),32&e&&T("EM_LOG_DEMANGLE is deprecated; ignoring"),8&e&&"undefined"==typeof emscripten_source_map&&(T('Source map information is not available, emscripten_log with EM_LOG_C_STACK will be ignored. Build with "--pre-js $EMSCRIPTEN/src/emscripten-source-map.min.js" linker flag to add source map loading to code.'),e^=8,e|=16);var i=null;if(128&e)for(i=it(arguments);i[1].includes("_emscripten_");)i=it(i[0]);var a=r.split("\n");r="";var s=new RegExp("\\s*(.*?)@(.*?):([0-9]+):([0-9]+)"),l=new RegExp("\\s*(.*?)@(.*):(.*)(:(.*))?"),u=new RegExp("\\s*at (.*?) \\((.*):(.*):(.*)\\)");for(var c in a){var d=a[c],f="",p="",m=0,h=0,g=u.exec(d);if(g&&5==g.length)f=g[1],p=g[2],m=g[3],h=g[4];else{if((g=s.exec(d))||(g=l.exec(d)),!(g&&g.length>=4)){r+=d+"\n";continue}f=g[1],p=g[2],m=g[3],h=0|g[4]}var v=!1;if(8&e){var y=emscripten_source_map.originalPositionFor({line:m,column:h});(v=y&&y.source)&&(64&e&&(y.source=y.source.substring(y.source.replace(/\\/g,"/").lastIndexOf("/")+1)),r+=" at "+f+" ("+y.source+":"+y.line+":"+y.column+")\n")}(16&e||!v)&&(64&e&&(p=p.substring(p.replace(/\\/g,"/").lastIndexOf("/")+1)),r+=(v?" = "+f:" at "+f)+" ("+p+":"+m+":"+h+")\n"),128&e&&i[0]&&(i[1]==f&&i[2].length>0&&(r=r.replace(/\s+$/,""),r+=" with values: "+i[1]+i[2]+"\n"),i=it(i[0]))}return r.replace(/\s+$/,"")}(e)),1&e?4&e?console.error(r):2&e?console.warn(r):512&e?console.info(r):256&e?console.debug(r):console.log(r):6&e?_(r):b(r)}function st(e){try{return w.grow(e-L.byteLength+65535>>>16),Z(w.buffer),1}catch(r){_("emscripten_realloc_buffer: Attempted to grow heap from "+L.byteLength+" bytes to "+e+" bytes, but got error: "+r)}}var lt={};function ut(){if(!ut.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:n||"./this.program"};for(var r in lt)void 0===lt[r]?delete e[r]:e[r]=lt[r];var t=[];for(var r in e)t.push(r+"="+e[r]);ut.strings=t}return ut.strings}var ct=function(e,r,t,n){e||(e=this),this.parent=e,this.mount=e.mount,this.mounted=null,this.id=Ie.nextInode++,this.name=r,this.mode=t,this.node_ops={},this.stream_ops={},this.rdev=n},dt=365,ft=146;function pt(e,r,t){var n=t>0?t:I(e)+1,o=new Array(n),i=M(e,o,0,o.length);return r&&(o.length=i),o}Object.defineProperties(ct.prototype,{read:{get:function(){return(this.mode&dt)===dt},set:function(e){e?this.mode|=dt:this.mode&=-366}},write:{get:function(){return(this.mode&ft)===ft},set:function(e){e?this.mode|=ft:this.mode&=-147}},isFolder:{get:function(){return Ie.isDir(this.mode)}},isDevice:{get:function(){return Ie.isChrdev(this.mode)}}}),Ie.FSNode=ct,Ie.staticInit(),Ne={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135},function(){for(var e=new Array(256),r=0;r<256;++r)e[r]=String.fromCharCode(r);Ue=e}(),Ve=r.BindingError=Ge(Error,"BindingError"),qe=r.InternalError=Ge(Error,"InternalError"),wr.prototype.isAliasOf=Qe,wr.prototype.clone=gr,wr.prototype.delete=vr,wr.prototype.isDeleted=yr,wr.prototype.deleteLater=Er,r.getInheritedInstanceCount=ir,r.getLiveInheritedInstances=ar,r.flushPendingDeletes=lr,r.setDelayFunction=cr,Or.prototype.getPointee=Ar,Or.prototype.destructor=Fr,Or.prototype.argPackAdvance=8,Or.prototype.readValueFromPointer=Pr,Or.prototype.deleteObject=Dr,Or.prototype.fromWireType=mr,Nr=r.UnboundTypeError=Ge(Error,"UnboundTypeError"),r.count_emval_handles=Gr,r.get_first_emval=Vr;var mt={__syscall_fcntl64:function(e,r,t){Le.varargs=t;try{var n=Le.getStreamFromFD(e);switch(r){case 0:return(o=Le.get())<0?-28:Ie.createStream(n,o).fd;case 1:case 2:case 6:case 7:return 0;case 3:return n.flags;case 4:var o=Le.get();return n.flags|=o,0;case 5:o=Le.get();return B[o+0>>1]=2,0;case 16:case 8:default:return-28;case 9:return i=28,$[yt()>>2]=i,-1}}catch(e){if(void 0===Ie||!(e instanceof Ie.ErrnoError))throw e;return-e.errno}var i},__syscall_openat:function(e,r,t,n){Le.varargs=n;try{r=Le.getStr(r),r=Le.calculateAt(e,r);var o=n?Le.get():0;return Ie.open(r,t,o).fd}catch(e){if(void 0===Ie||!(e instanceof Ie.ErrnoError))throw e;return-e.errno}},_embind_register_bigint:function(e,r,t,n,o){},_embind_register_bool:function(e,r,t,n,o){var i=xe(t);Je(e,{name:r=Be(r),fromWireType:function(e){return!!e},toWireType:function(e,r){return r?n:o},argPackAdvance:8,readValueFromPointer:function(e){var n;if(1===t)n=x;else if(2===t)n=B;else{if(4!==t)throw new TypeError("Unknown boolean type size: "+r);n=$}return this.fromWireType(n[e>>i])},destructorFunction:null})},_embind_register_class:function(e,t,n,o,i,a,s,l,u,c,d,f,p){d=Be(d),a=Mr(i,a),l&&(l=Mr(s,l)),c&&(c=Mr(u,c)),p=Mr(f,p);var m=ze(d);!function(e,t,n){r.hasOwnProperty(e)?((void 0===n||void 0!==r[e].overloadTable&&void 0!==r[e].overloadTable[n])&&Ye("Cannot register public name '"+e+"' twice"),br(r,e,e),r.hasOwnProperty(n)&&Ye("Cannot register multiple overloads of a function with the same number of arguments ("+n+")!"),r[e].overloadTable[n]=t):(r[e]=t,void 0!==n&&(r[e].numArguments=n))}(m,(function(){Lr("Cannot construct "+d+" due to unbound types",[o])})),Ke([e,t,n],o?[o]:[],(function(t){var n,i;t=t[0],i=o?(n=t.registeredClass).instancePrototype:wr.prototype;var s=He(m,(function(){if(Object.getPrototypeOf(this)!==u)throw new Ve("Use 'new' to construct "+d);if(void 0===f.constructor_body)throw new Ve(d+" has no accessible constructor");var e=f.constructor_body[arguments.length];if(void 0===e)throw new Ve("Tried to invoke ctor of "+d+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(f.constructor_body).toString()+") parameters instead!");return e.apply(this,arguments)})),u=Object.create(i,{constructor:{value:s}});s.prototype=u;var f=new _r(d,s,u,p,n,a,l,c),h=new Or(d,f,!0,!1,!1),g=new Or(d+"*",f,!1,!1,!1),v=new Or(d+" const*",f,!1,!0,!1);return or[e]={pointerType:g,constPointerType:v},function(e,t,n){r.hasOwnProperty(e)||Xe("Replacing nonexistant public symbol"),void 0!==r[e].overloadTable&&void 0!==n?r[e].overloadTable[n]=t:(r[e]=t,r[e].argCount=n)}(m,s),[h,g,v]}))},_embind_register_class_constructor:function(e,r,t,n,o,i){F(r>0);var a=xr(r,t);o=Mr(n,o),Ke([],[e],(function(e){var t="constructor "+(e=e[0]).name;if(void 0===e.registeredClass.constructor_body&&(e.registeredClass.constructor_body=[]),void 0!==e.registeredClass.constructor_body[r-1])throw new Ve("Cannot register multiple constructors with identical number of parameters ("+(r-1)+") for class '"+e.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");return e.registeredClass.constructor_body[r-1]=()=>{Lr("Cannot construct "+e.name+" due to unbound types",a)},Ke([],a,(function(n){return n.splice(1,0,null),e.registeredClass.constructor_body[r-1]=jr(t,n,null,o,i),[]})),[]}))},_embind_register_class_function:function(e,r,t,n,o,i,a,s){var l=xr(t,n);r=Be(r),i=Mr(o,i),Ke([],[e],(function(e){var n=(e=e[0]).name+"."+r;function o(){Lr("Cannot call "+n+" due to unbound types",l)}r.startsWith("@@")&&(r=Symbol[r.substring(2)]),s&&e.registeredClass.pureVirtualFunctions.push(r);var u=e.registeredClass.instancePrototype,c=u[r];return void 0===c||void 0===c.overloadTable&&c.className!==e.name&&c.argCount===t-2?(o.argCount=t-2,o.className=e.name,u[r]=o):(br(u,r,n),u[r].overloadTable[t-2]=o),Ke([],l,(function(o){var s=jr(n,o,e,i,a);return void 0===u[r].overloadTable?(s.argCount=t-2,u[r]=s):u[r].overloadTable[t-2]=s,[]})),[]}))},_embind_register_class_property:function(e,r,t,n,o,i,a,s,l,u){r=Be(r),o=Mr(n,o),Ke([],[e],(function(e){var n=(e=e[0]).name+"."+r,c={get:function(){Lr("Cannot access "+n+" due to unbound types",[t,a])},enumerable:!0,configurable:!0};return c.set=l?()=>{Lr("Cannot access "+n+" due to unbound types",[t,a])}:e=>{Ye(n+" is a read-only property")},Object.defineProperty(e.registeredClass.instancePrototype,r,c),Ke([],l?[t,a]:[t],(function(t){var a=t[0],c={get:function(){var r=$r(this,e,n+" getter");return a.fromWireType(o(i,r))},enumerable:!0};if(l){l=Mr(s,l);var d=t[1];c.set=function(r){var t=$r(this,e,n+" setter"),o=[];l(u,t,d.toWireType(o,r)),Ur(o)}}return Object.defineProperty(e.registeredClass.instancePrototype,r,c),[]})),[]}))},_embind_register_emval:function(e,r){Je(e,{name:r=Be(r),fromWireType:function(e){var r=Yr.toValue(e);return Hr(e),r},toWireType:function(e,r){return Yr.toHandle(r)},argPackAdvance:8,readValueFromPointer:Pr,destructorFunction:null})},_embind_register_float:function(e,r,t){var n=xe(t);Je(e,{name:r=Be(r),fromWireType:function(e){return e},toWireType:function(e,r){if("number"!=typeof r&&"boolean"!=typeof r)throw new TypeError('Cannot convert "'+qr(r)+'" to '+this.name);return r},argPackAdvance:8,readValueFromPointer:Xr(r,n),destructorFunction:null})},_embind_register_integer:function(e,r,t,n,o){r=Be(r),-1===o&&(o=4294967295);var i=xe(t),a=e=>e;if(0===n){var s=32-8*t;a=e=>e<<s>>>s}var l=r.includes("unsigned"),u=(e,t)=>{if("number"!=typeof e&&"boolean"!=typeof e)throw new TypeError('Cannot convert "'+qr(e)+'" to '+t);if(e<n||e>o)throw new TypeError('Passing a number "'+qr(e)+'" from JS side to C/C++ side to an argument of type "'+r+'", which is outside the valid range ['+n+", "+o+"]!")};Je(e,{name:r,fromWireType:a,toWireType:l?function(e,r){return u(r,this.name),r>>>0}:function(e,r){return u(r,this.name),r},argPackAdvance:8,readValueFromPointer:Kr(r,i,0!==n),destructorFunction:null})},_embind_register_memory_view:function(e,r,t){var n=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][r];function o(e){var r=W,t=r[e>>=2],o=r[e+1];return new n(L,o,t)}Je(e,{name:t=Be(t),fromWireType:o,argPackAdvance:8,readValueFromPointer:o},{ignoreDuplicateRegistrations:!0})},_embind_register_std_string:function(e,r){var t="std::string"===(r=Be(r));Je(e,{name:r,fromWireType:function(e){var r,n=W[e>>2];if(t)for(var o=e+4,i=0;i<=n;++i){var a=e+4+i;if(i==n||0==U[a]){var s=R(o,a-o);void 0===r?r=s:(r+=String.fromCharCode(0),r+=s),o=a+1}}else{var l=new Array(n);for(i=0;i<n;++i)l[i]=String.fromCharCode(U[e+4+i]);r=l.join("")}return ht(e),r},toWireType:function(e,r){r instanceof ArrayBuffer&&(r=new Uint8Array(r));var n="string"==typeof r;n||r instanceof Uint8Array||r instanceof Uint8ClampedArray||r instanceof Int8Array||Ye("Cannot pass non-string to std::string");var o=(t&&n?()=>I(r):()=>r.length)(),i=gt(4+o+1);if(W[i>>2]=o,t&&n)N(r,i+4,o+1);else if(n)for(var a=0;a<o;++a){var s=r.charCodeAt(a);s>255&&(ht(i),Ye("String has UTF-16 code units that do not fit in 8 bits")),U[i+4+a]=s}else for(a=0;a<o;++a)U[i+4+a]=r[a];return null!==e&&e.push(ht,i),i},argPackAdvance:8,readValueFromPointer:Pr,destructorFunction:function(e){ht(e)}})},_embind_register_std_wstring:function(e,r,t){var n,o,i,a,s;t=Be(t),2===r?(n=V,o=Y,a=q,i=()=>j,s=1):4===r&&(n=X,o=K,a=J,i=()=>W,s=2),Je(e,{name:t,fromWireType:function(e){for(var t,o=W[e>>2],a=i(),l=e+4,u=0;u<=o;++u){var c=e+4+u*r;if(u==o||0==a[c>>s]){var d=n(l,c-l);void 0===t?t=d:(t+=String.fromCharCode(0),t+=d),l=c+r}}return ht(e),t},toWireType:function(e,n){"string"!=typeof n&&Ye("Cannot pass non-string to C++ string type "+t);var i=a(n),l=gt(4+i+r);return W[l>>2]=i>>s,o(n,l+4,i+r),null!==e&&e.push(ht,l),l},argPackAdvance:8,readValueFromPointer:Pr,destructorFunction:function(e){ht(e)}})},_embind_register_void:function(e,r){Je(e,{isVoid:!0,name:r=Be(r),argPackAdvance:0,fromWireType:function(){},toWireType:function(e,r){}})},_emscripten_date_now:function(){return Date.now()},_emval_as:function(e,r,t){e=Yr.toValue(e),r=Jr(r,"emval::as");var n=[],o=Yr.toHandle(n);return $[t>>2]=o,r.toWireType(n,e)},_emval_call_void_method:function(e,r,t,n){var o,i;(e=Zr[e])(r=Yr.toValue(r),t=void 0===(i=Qr[o=t])?Be(o):i,null,n)},_emval_decref:Hr,_emval_get_method_caller:function(e,r){var t=function(e,r){for(var t=new Array(e),n=0;n<e;++n)t[n]=Jr($[(r>>2)+n],"parameter "+n);return t}(e,r),n=t[0],o=n.name+"_$"+t.slice(1).map((function(e){return e.name})).join("_")+"$",i=et[o];if(void 0!==i)return i;for(var a=["retType"],s=[n],l="",u=0;u<e-1;++u)l+=(0!==u?", ":"")+"arg"+u,a.push("argType"+u),s.push(t[1+u]);var c="return function "+ze("methodCaller_"+o)+"(handle, name, destructors, args) {\n",d=0;for(u=0;u<e-1;++u)c+=" var arg"+u+" = argType"+u+".readValueFromPointer(args"+(d?"+"+d:"")+");\n",d+=t[u+1].argPackAdvance;for(c+=" var rv = handle[name]("+l+");\n",u=0;u<e-1;++u)t[u+1].deleteObject&&(c+=" argType"+u+".deleteObject(arg"+u+");\n");n.isVoid||(c+=" return retType.toWireType(destructors, rv);\n"),c+="};\n",a.push(c);var f,p,m=Br(Function,a).apply(null,s);return f=m,p=Zr.length,Zr.push(f),i=p,et[o]=i,i},_emval_incref:function(e){e>4&&(zr[e].refcount+=1)},_emval_run_destructors:function(e){Ur(Yr.toValue(e)),Hr(e)},_emval_take_value:function(e,r){var t=(e=Jr(e,"_emval_take_value")).readValueFromPointer(r);return Yr.toHandle(t)},_gmtime_js:function(e,r){var t=new Date(1e3*$[e>>2]);$[r>>2]=t.getUTCSeconds(),$[r+4>>2]=t.getUTCMinutes(),$[r+8>>2]=t.getUTCHours(),$[r+12>>2]=t.getUTCDate(),$[r+16>>2]=t.getUTCMonth(),$[r+20>>2]=t.getUTCFullYear()-1900,$[r+24>>2]=t.getUTCDay();var n=Date.UTC(t.getUTCFullYear(),0,1,0,0,0,0),o=(t.getTime()-n)/864e5|0;$[r+28>>2]=o},_localtime_js:function(e,r){var t=new Date(1e3*$[e>>2]);$[r>>2]=t.getSeconds(),$[r+4>>2]=t.getMinutes(),$[r+8>>2]=t.getHours(),$[r+12>>2]=t.getDate(),$[r+16>>2]=t.getMonth(),$[r+20>>2]=t.getFullYear()-1900,$[r+24>>2]=t.getDay();var n=new Date(t.getFullYear(),0,1),o=(t.getTime()-n.getTime())/864e5|0;$[r+28>>2]=o,$[r+36>>2]=-60*t.getTimezoneOffset();var i=new Date(t.getFullYear(),6,1).getTimezoneOffset(),a=n.getTimezoneOffset(),s=0|(i!=a&&t.getTimezoneOffset()==Math.min(a,i));$[r+32>>2]=s},_mktime_js:function(e){var r=new Date($[e+20>>2]+1900,$[e+16>>2],$[e+12>>2],$[e+8>>2],$[e+4>>2],$[e>>2],0),t=$[e+32>>2],n=r.getTimezoneOffset(),o=new Date(r.getFullYear(),0,1),i=new Date(r.getFullYear(),6,1).getTimezoneOffset(),a=o.getTimezoneOffset(),s=Math.min(a,i);if(t<0)$[e+32>>2]=Number(i!=a&&s==n);else if(t>0!=(s==n)){var l=Math.max(a,i),u=t>0?s:l;r.setTime(r.getTime()+6e4*(u-n))}$[e+24>>2]=r.getDay();var c=(r.getTime()-o.getTime())/864e5|0;return $[e+28>>2]=c,$[e>>2]=r.getSeconds(),$[e+4>>2]=r.getMinutes(),$[e+8>>2]=r.getHours(),$[e+12>>2]=r.getDate(),$[e+16>>2]=r.getMonth(),r.getTime()/1e3|0},_tzset_js:function e(r,t,n){e.called||(e.called=!0,function(e,r,t){var n=(new Date).getFullYear(),o=new Date(n,0,1),i=new Date(n,6,1),a=o.getTimezoneOffset(),s=i.getTimezoneOffset(),l=Math.max(a,s);function u(e){var r=e.toTimeString().match(/\(([A-Za-z ]+)\)$/);return r?r[1]:"GMT"}$[e>>2]=60*l,$[r>>2]=Number(a!=s);var c=u(o),d=u(i),f=Q(c),p=Q(d);s<a?($[t>>2]=f,$[t+4>>2]=p):($[t>>2]=p,$[t+4>>2]=f)}(r,t,n))},abort:function(){ge("native code called abort()")},emscripten_log:function(e,r,t){at(e,O(ot(r,t),0))},emscripten_resize_heap:function(e){var r=U.length;F((e>>>=0)>r);var t,n,o=2147483648;if(e>o)return _("Cannot enlarge memory, asked to go up to "+e+" bytes, but the limit is "+"2147483648 bytes!"),!1;for(var i=1;i<=4;i*=2){var a=r*(1+.2/i);a=Math.min(a,e+100663296);var s=Math.min(o,(t=Math.max(e,a))+((n=65536)-t%n)%n);if(st(s))return!0}return _("Failed to grow the heap from "+r+" bytes to "+s+" bytes, not enough memory!"),!1},environ_get:function(e,r){var t=0;return ut().forEach((function(n,o){var i=r+t;$[e+4*o>>2]=i,function(e,r,t){for(var n=0;n<e.length;++n)F(e.charCodeAt(n)===(255&e.charCodeAt(n))),x[r++>>0]=e.charCodeAt(n);t||(x[r>>0]=0)}(n,i),t+=n.length+1})),0},environ_sizes_get:function(e,r){var t=ut();$[e>>2]=t.length;var n=0;return t.forEach((function(e){n+=e.length+1})),$[r>>2]=n,0},fd_close:function(e){try{var r=Le.getStreamFromFD(e);return Ie.close(r),0}catch(e){if(void 0===Ie||!(e instanceof Ie.ErrnoError))throw e;return e.errno}},fd_fdstat_get:function(e,r){try{var t=Le.getStreamFromFD(e),n=t.tty?2:Ie.isDir(t.mode)?3:Ie.isLink(t.mode)?7:4;return x[r>>0]=n,0}catch(e){if(void 0===Ie||!(e instanceof Ie.ErrnoError))throw e;return e.errno}},fd_read:function(e,r,t,n){try{var o=Le.getStreamFromFD(e),i=Le.doReadv(o,r,t);return $[n>>2]=i,0}catch(e){if(void 0===Ie||!(e instanceof Ie.ErrnoError))throw e;return e.errno}},fd_seek:function(e,r,t,n,o){try{var i=Le.getStreamFromFD(e),a=4294967296*t+(r>>>0),s=9007199254740992;return a<=-s||a>=s?-61:(Ie.llseek(i,a,n),Ee=[i.position>>>0,(ye=i.position,+Math.abs(ye)>=1?ye>0?(0|Math.min(+Math.floor(ye/4294967296),4294967295))>>>0:~~+Math.ceil((ye-+(~~ye>>>0))/4294967296)>>>0:0)],$[o>>2]=Ee[0],$[o+4>>2]=Ee[1],i.getdents&&0===a&&0===n&&(i.getdents=null),0)}catch(e){if(void 0===Ie||!(e instanceof Ie.ErrnoError))throw e;return e.errno}},fd_write:function(e,r,t,n){try{var o=Le.getStreamFromFD(e),i=Le.doWritev(o,r,t);return $[n>>2]=i,0}catch(e){if(void 0===Ie||!(e instanceof Ie.ErrnoError))throw e;return e.errno}},setTempRet0:function(e){}};!function(){var e={env:mt,wasi_snapshot_preview1:mt};function t(e,t){var n,o=e.exports;r.asm=o,F(w=r.asm.memory,"memory not found in wasm exports"),Z(w.buffer),F(re=r.asm.__indirect_function_table,"table not found in wasm exports"),n=r.asm.__wasm_call_ctors,ae.unshift(n),he("wasm-instantiate")}me("wasm-instantiate");var n=r;function o(e){F(r===n,"the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?"),n=null,t(e.instance)}function i(r){return function(){if(!E&&(s||l)){if("function"==typeof fetch&&!be(ve))return fetch(ve,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+ve+"'";return e.arrayBuffer()})).catch((function(){return Te(ve)}));if(f)return new Promise((function(e,r){f(ve,(function(r){e(new Uint8Array(r))}),r)}))}return Promise.resolve().then((function(){return Te(ve)}))}().then((function(r){return WebAssembly.instantiate(r,e)})).then((function(e){return e})).then(r,(function(e){_("failed to asynchronously prepare wasm: "+e),be(ve)&&_("warning: Loading from a file URI ("+ve+") is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing"),ge(e)}))}if(r.instantiateWasm)try{return r.instantiateWasm(e,t)}catch(e){return _("Module.instantiateWasm callback failed with error: "+e),!1}E||"function"!=typeof WebAssembly.instantiateStreaming||we(ve)||be(ve)||"function"!=typeof fetch?i(o):fetch(ve,{credentials:"same-origin"}).then((function(r){return WebAssembly.instantiateStreaming(r,e).then(o,(function(e){return _("wasm streaming compile failed: "+e),_("falling back to ArrayBuffer instantiation"),i(o)}))}))}(),r.___wasm_call_ctors=_e("__wasm_call_ctors");var ht=r._free=_e("free"),gt=r._malloc=_e("malloc"),vt=r._strlen=_e("strlen"),yt=r.___errno_location=_e("__errno_location"),Et=r.___getTypeName=_e("__getTypeName");r.___embind_register_native_and_builtin_types=_e("__embind_register_native_and_builtin_types");var wt=r.___stdio_exit=_e("__stdio_exit"),bt=r._emscripten_builtin_memalign=_e("emscripten_builtin_memalign"),_t=r._emscripten_stack_init=function(){return(_t=r._emscripten_stack_init=r.asm.emscripten_stack_init).apply(null,arguments)};r._emscripten_stack_get_free=function(){return(r._emscripten_stack_get_free=r.asm.emscripten_stack_get_free).apply(null,arguments)},r._emscripten_stack_get_base=function(){return(r._emscripten_stack_get_base=r.asm.emscripten_stack_get_base).apply(null,arguments)};var Tt,kt=r._emscripten_stack_get_end=function(){return(kt=r._emscripten_stack_get_end=r.asm.emscripten_stack_get_end).apply(null,arguments)};function St(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function Ct(e){function t(){Tt||(Tt=!0,r.calledRun=!0,A||(oe(),F(!le),le=!0,r.noFSInit||Ie.init.initialized||Ie.init(),Ie.ignorePermissions=!1,ke(ae),r.onRuntimeInitialized&&r.onRuntimeInitialized(),F(!r._main,'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'),function(){if(oe(),r.postRun)for("function"==typeof r.postRun&&(r.postRun=[r.postRun]);r.postRun.length;)e=r.postRun.shift(),se.unshift(e);var e;ke(se)}()))}ue>0||(_t(),ne(),function(){if(r.preRun)for("function"==typeof r.preRun&&(r.preRun=[r.preRun]);r.preRun.length;)e=r.preRun.shift(),ie.unshift(e);var e;ke(ie)}(),ue>0||(r.setStatus?(r.setStatus("Running..."),setTimeout((function(){setTimeout((function(){r.setStatus("")}),1),t()}),1)):t(),oe()))}if(r.stackSave=_e("stackSave"),r.stackRestore=_e("stackRestore"),r.stackAlloc=_e("stackAlloc"),r.dynCall_ijiii=_e("dynCall_ijiii"),r.dynCall_viiijj=_e("dynCall_viiijj"),r.dynCall_jij=_e("dynCall_jij"),r.dynCall_jii=_e("dynCall_jii"),r.dynCall_jiji=_e("dynCall_jiji"),r._ff_h264_cabac_tables=112940,P("intArrayFromString",!1),P("intArrayToString",!1),P("ccall",!1),P("cwrap",!1),P("setValue",!1),P("getValue",!1),P("allocate",!1),P("UTF8ArrayToString",!1),P("UTF8ToString",!1),P("stringToUTF8Array",!1),P("stringToUTF8",!1),P("lengthBytesUTF8",!1),P("stackTrace",!1),P("addOnPreRun",!1),P("addOnInit",!1),P("addOnPreMain",!1),P("addOnExit",!1),P("addOnPostRun",!1),P("writeStringToMemory",!1),P("writeArrayToMemory",!1),P("writeAsciiToMemory",!1),P("addRunDependency",!0),P("removeRunDependency",!0),P("FS_createFolder",!1),P("FS_createPath",!0),P("FS_createDataFile",!0),P("FS_createPreloadedFile",!0),P("FS_createLazyFile",!0),P("FS_createLink",!1),P("FS_createDevice",!0),P("FS_unlink",!0),P("getLEB",!1),P("getFunctionTables",!1),P("alignFunctionTables",!1),P("registerFunctions",!1),P("addFunction",!1),P("removeFunction",!1),P("prettyPrint",!1),P("dynCall",!1),P("getCompilerSetting",!1),P("print",!1),P("printErr",!1),P("getTempRet0",!1),P("setTempRet0",!1),P("callMain",!1),P("abort",!1),P("keepRuntimeAlive",!1),P("ptrToString",!1),P("zeroMemory",!1),P("stringToNewUTF8",!1),P("emscripten_realloc_buffer",!1),P("ENV",!1),P("ERRNO_CODES",!1),P("ERRNO_MESSAGES",!1),P("setErrNo",!1),P("inetPton4",!1),P("inetNtop4",!1),P("inetPton6",!1),P("inetNtop6",!1),P("readSockaddr",!1),P("writeSockaddr",!1),P("DNS",!1),P("getHostByName",!1),P("Protocols",!1),P("Sockets",!1),P("getRandomDevice",!1),P("traverseStack",!1),P("UNWIND_CACHE",!1),P("convertPCtoSourceLocation",!1),P("readAsmConstArgsArray",!1),P("readAsmConstArgs",!1),P("mainThreadEM_ASM",!1),P("jstoi_q",!1),P("jstoi_s",!1),P("getExecutableName",!1),P("listenOnce",!1),P("autoResumeAudioContext",!1),P("dynCallLegacy",!1),P("getDynCaller",!1),P("dynCall",!1),P("setWasmTableEntry",!1),P("getWasmTableEntry",!1),P("handleException",!1),P("runtimeKeepalivePush",!1),P("runtimeKeepalivePop",!1),P("callUserCallback",!1),P("maybeExit",!1),P("safeSetTimeout",!1),P("asmjsMangle",!1),P("asyncLoad",!1),P("alignMemory",!1),P("mmapAlloc",!1),P("reallyNegative",!1),P("unSign",!1),P("reSign",!1),P("formatString",!1),P("PATH",!1),P("PATH_FS",!1),P("SYSCALLS",!1),P("getSocketFromFD",!1),P("getSocketAddress",!1),P("JSEvents",!1),P("registerKeyEventCallback",!1),P("specialHTMLTargets",!1),P("maybeCStringToJsString",!1),P("findEventTarget",!1),P("findCanvasEventTarget",!1),P("getBoundingClientRect",!1),P("fillMouseEventData",!1),P("registerMouseEventCallback",!1),P("registerWheelEventCallback",!1),P("registerUiEventCallback",!1),P("registerFocusEventCallback",!1),P("fillDeviceOrientationEventData",!1),P("registerDeviceOrientationEventCallback",!1),P("fillDeviceMotionEventData",!1),P("registerDeviceMotionEventCallback",!1),P("screenOrientation",!1),P("fillOrientationChangeEventData",!1),P("registerOrientationChangeEventCallback",!1),P("fillFullscreenChangeEventData",!1),P("registerFullscreenChangeEventCallback",!1),P("registerRestoreOldStyle",!1),P("hideEverythingExceptGivenElement",!1),P("restoreHiddenElements",!1),P("setLetterbox",!1),P("currentFullscreenStrategy",!1),P("restoreOldWindowedStyle",!1),P("softFullscreenResizeWebGLRenderTarget",!1),P("doRequestFullscreen",!1),P("fillPointerlockChangeEventData",!1),P("registerPointerlockChangeEventCallback",!1),P("registerPointerlockErrorEventCallback",!1),P("requestPointerLock",!1),P("fillVisibilityChangeEventData",!1),P("registerVisibilityChangeEventCallback",!1),P("registerTouchEventCallback",!1),P("fillGamepadEventData",!1),P("registerGamepadEventCallback",!1),P("registerBeforeUnloadEventCallback",!1),P("fillBatteryEventData",!1),P("battery",!1),P("registerBatteryEventCallback",!1),P("setCanvasElementSize",!1),P("getCanvasElementSize",!1),P("demangle",!1),P("demangleAll",!1),P("jsStackTrace",!1),P("stackTrace",!1),P("getEnvStrings",!1),P("checkWasiClock",!1),P("writeI53ToI64",!1),P("writeI53ToI64Clamped",!1),P("writeI53ToI64Signaling",!1),P("writeI53ToU64Clamped",!1),P("writeI53ToU64Signaling",!1),P("readI53FromI64",!1),P("readI53FromU64",!1),P("convertI32PairToI53",!1),P("convertU32PairToI53",!1),P("dlopenMissingError",!1),P("setImmediateWrapped",!1),P("clearImmediateWrapped",!1),P("polyfillSetImmediate",!1),P("uncaughtExceptionCount",!1),P("exceptionLast",!1),P("exceptionCaught",!1),P("ExceptionInfo",!1),P("exception_addRef",!1),P("exception_decRef",!1),P("Browser",!1),P("setMainLoop",!1),P("wget",!1),P("FS",!1),P("MEMFS",!1),P("TTY",!1),P("PIPEFS",!1),P("SOCKFS",!1),P("_setNetworkCallback",!1),P("tempFixedLengthArray",!1),P("miniTempWebGLFloatBuffers",!1),P("heapObjectForWebGLType",!1),P("heapAccessShiftForWebGLHeap",!1),P("GL",!1),P("emscriptenWebGLGet",!1),P("computeUnpackAlignedImageSize",!1),P("emscriptenWebGLGetTexPixelData",!1),P("emscriptenWebGLGetUniform",!1),P("webglGetUniformLocation",!1),P("webglPrepareUniformLocationsBeforeFirstUse",!1),P("webglGetLeftBracePos",!1),P("emscriptenWebGLGetVertexAttrib",!1),P("writeGLArray",!1),P("AL",!1),P("SDL_unicode",!1),P("SDL_ttfContext",!1),P("SDL_audio",!1),P("SDL",!1),P("SDL_gfx",!1),P("GLUT",!1),P("EGL",!1),P("GLFW_Window",!1),P("GLFW",!1),P("GLEW",!1),P("IDBStore",!1),P("runAndAbortIfError",!1),P("InternalError",!1),P("BindingError",!1),P("UnboundTypeError",!1),P("PureVirtualError",!1),P("init_embind",!1),P("throwInternalError",!1),P("throwBindingError",!1),P("throwUnboundTypeError",!1),P("ensureOverloadTable",!1),P("exposePublicSymbol",!1),P("replacePublicSymbol",!1),P("extendError",!1),P("createNamedFunction",!1),P("registeredInstances",!1),P("getBasestPointer",!1),P("registerInheritedInstance",!1),P("unregisterInheritedInstance",!1),P("getInheritedInstance",!1),P("getInheritedInstanceCount",!1),P("getLiveInheritedInstances",!1),P("registeredTypes",!1),P("awaitingDependencies",!1),P("typeDependencies",!1),P("registeredPointers",!1),P("registerType",!1),P("whenDependentTypesAreResolved",!1),P("embind_charCodes",!1),P("embind_init_charCodes",!1),P("readLatin1String",!1),P("getTypeName",!1),P("heap32VectorToArray",!1),P("requireRegisteredType",!1),P("getShiftFromSize",!1),P("integerReadValueFromPointer",!1),P("enumReadValueFromPointer",!1),P("floatReadValueFromPointer",!1),P("simpleReadValueFromPointer",!1),P("runDestructors",!1),P("new_",!1),P("craftInvokerFunction",!1),P("embind__requireFunction",!1),P("tupleRegistrations",!1),P("structRegistrations",!1),P("genericPointerToWireType",!1),P("constNoSmartPtrRawPointerToWireType",!1),P("nonConstNoSmartPtrRawPointerToWireType",!1),P("init_RegisteredPointer",!1),P("RegisteredPointer",!1),P("RegisteredPointer_getPointee",!1),P("RegisteredPointer_destructor",!1),P("RegisteredPointer_deleteObject",!1),P("RegisteredPointer_fromWireType",!1),P("runDestructor",!1),P("releaseClassHandle",!1),P("finalizationRegistry",!1),P("detachFinalizer_deps",!1),P("detachFinalizer",!1),P("attachFinalizer",!1),P("makeClassHandle",!1),P("init_ClassHandle",!1),P("ClassHandle",!1),P("ClassHandle_isAliasOf",!1),P("throwInstanceAlreadyDeleted",!1),P("ClassHandle_clone",!1),P("ClassHandle_delete",!1),P("deletionQueue",!1),P("ClassHandle_isDeleted",!1),P("ClassHandle_deleteLater",!1),P("flushPendingDeletes",!1),P("delayFunction",!1),P("setDelayFunction",!1),P("RegisteredClass",!1),P("shallowCopyInternalPointer",!1),P("downcastPointer",!1),P("upcastPointer",!1),P("validateThis",!1),P("char_0",!1),P("char_9",!1),P("makeLegalFunctionName",!1),P("emval_handle_array",!1),P("emval_free_list",!1),P("emval_symbols",!1),P("init_emval",!1),P("count_emval_handles",!1),P("get_first_emval",!1),P("getStringOrSymbol",!1),P("Emval",!1),P("emval_newers",!1),P("craftEmvalAllocator",!1),P("emval_get_global",!1),P("emval_methodCallers",!1),P("emval_registeredMethods",!1),P("warnOnce",!1),P("stackSave",!1),P("stackRestore",!1),P("stackAlloc",!1),P("AsciiToString",!1),P("stringToAscii",!1),P("UTF16ToString",!1),P("stringToUTF16",!1),P("lengthBytesUTF16",!1),P("UTF32ToString",!1),P("stringToUTF32",!1),P("lengthBytesUTF32",!1),P("allocateUTF8",!1),P("allocateUTF8OnStack",!1),r.writeStackCookie=ne,r.checkStackCookie=oe,C("ALLOC_NORMAL",!1),C("ALLOC_STACK",!1),de=function e(){Tt||Ct(),Tt||(de=e)},r.run=Ct,r.preInit)for("function"==typeof r.preInit&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();Ct(),e.exports=r}));const u=1e3,c=1e3,d=!1,f=!1,p=!1,m=!1,h="initVideo",g="render",v="playAudio",y="initAudio",E="audioCode",w="videoCode",b=1,_=2,T="init",k="decode",S="audioDecode",C="videoDecode",P="close",A="updateConfig",F="key",D="delta";s((function(e){!function(){var r="undefined"!=typeof window&&void 0!==window.document?window.document:{},t=e.exports,n=function(){for(var e,t=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],n=0,o=t.length,i={};n<o;n++)if((e=t[n])&&e[1]in r){for(n=0;n<e.length;n++)i[t[0][n]]=e[n];return i}return!1}(),o={change:n.fullscreenchange,error:n.fullscreenerror},i={request:function(e,t){return new Promise(function(o,i){var a=function(){this.off("change",a),o()}.bind(this);this.on("change",a);var s=(e=e||r.documentElement)[n.requestFullscreen](t);s instanceof Promise&&s.then(a).catch(i)}.bind(this))},exit:function(){return new Promise(function(e,t){if(this.isFullscreen){var o=function(){this.off("change",o),e()}.bind(this);this.on("change",o);var i=r[n.exitFullscreen]();i instanceof Promise&&i.then(o).catch(t)}else e()}.bind(this))},toggle:function(e,r){return this.isFullscreen?this.exit():this.request(e,r)},onchange:function(e){this.on("change",e)},onerror:function(e){this.on("error",e)},on:function(e,t){var n=o[e];n&&r.addEventListener(n,t,!1)},off:function(e,t){var n=o[e];n&&r.removeEventListener(n,t,!1)},raw:n};n?(Object.defineProperties(i,{isFullscreen:{get:function(){return Boolean(r[n.fullscreenElement])}},element:{enumerable:!0,get:function(){return r[n.fullscreenElement]}},isEnabled:{enumerable:!0,get:function(){return Boolean(r[n.fullscreenEnabled])}}}),t?e.exports=i:window.screenfull=i):t?e.exports={isEnabled:!1}:window.screenfull={isEnabled:!1}}()})).isEnabled,(()=>{try{if("object"==typeof WebAssembly&&"function"==typeof WebAssembly.instantiate){const e=new WebAssembly.Module(Uint8Array.of(0,97,115,109,1,0,0,0));if(e instanceof WebAssembly.Module)return new WebAssembly.Instance(e)instanceof WebAssembly.Instance}}catch(e){}})(),Date.now||(Date.now=function(){return(new Date).getTime()}),l.postRun=function(){var e=[],r=[],t={};"VideoEncoder"in self&&(t={hasInit:!1,isEmitInfo:!1,offscreenCanvas:null,offscreenCanvasCtx:null,decoder:new VideoDecoder({output:function(e){t.isEmitInfo||(n.opt.debug&&console.log("Jessibuca: [worker] Webcodecs Video Decoder initSize"),postMessage({cmd:h,w:e.codedWidth,h:e.codedHeight}),t.isEmitInfo=!0,t.offscreenCanvas=new OffscreenCanvas(e.codedWidth,e.codedHeight),t.offscreenCanvasCtx=t.offscreenCanvas.getContext("2d")),t.offscreenCanvasCtx.drawImage(e,0,0,e.codedWidth,e.codedHeight);let r=t.offscreenCanvas.transferToImageBitmap();postMessage({cmd:g,buffer:r,delay:n.delay,ts:0},[r]),setTimeout((function(){e.close?e.close():e.destroy()}),100)},error:function(e){console.error(e)}}),decode:function(e,r){const o=e[0]>>4==1;if(t.hasInit){const n=new EncodedVideoChunk({data:e.slice(5),timestamp:r,type:o?F:D});t.decoder.decode(n)}else if(o&&0===e[1]){const r=15&e[0];n.setVideoCodec(r);const o=function(e){let r=e.subarray(1,4),t="avc1.";for(let e=0;e<3;e++){let n=r[e].toString(16);n.length<2&&(n="0"+n),t+=n}return{codec:t,description:e}}(e.slice(5));t.decoder.configure(o),t.hasInit=!0}},reset(){t.hasInit=!1,t.isEmitInfo=!1,t.offscreenCanvas=null,t.offscreenCanvasCtx=null}});var n={opt:{debug:d,useOffscreen:p,useWCS:f,videoBuffer:u,openWebglAlignment:m,videoBufferDelay:c},useOffscreen:function(){return n.opt.useOffscreen&&"undefined"!=typeof OffscreenCanvas},initAudioPlanar:function(e,t){postMessage({cmd:y,sampleRate:t,channels:e});var n=[],o=0;this.playAudioPlanar=function(t,i,a){for(var s=i,u=[],c=0,d=0;d<2;d++){var f=l.HEAPU32[(t>>2)+d]>>2;u[d]=l.HEAPF32.subarray(f,f+s)}if(o){if(!(s>=(i=1024-o)))return o+=s,r[0]=Float32Array.of(...r[0],...u[0]),void(2==e&&(r[1]=Float32Array.of(...r[1],...u[1])));n[0]=Float32Array.of(...r[0],...u[0].subarray(0,i)),2==e&&(n[1]=Float32Array.of(...r[1],...u[1].subarray(0,i))),postMessage({cmd:v,buffer:n,ts:a},n.map((e=>e.buffer))),c=i,s-=i}for(o=s;o>=1024;o-=1024)n[0]=u[0].slice(c,c+=1024),2==e&&(n[1]=u[1].slice(c-1024,c)),postMessage({cmd:v,buffer:n,ts:a},n.map((e=>e.buffer)));o&&(r[0]=u[0].slice(c),2==e&&(r[1]=u[1].slice(c)))}},setVideoCodec:function(e){postMessage({cmd:w,code:e})},setAudioCodec:function(e){postMessage({cmd:E,code:e})},setVideoSize:function(e,r){postMessage({cmd:h,w:e,h:r});var t=e*r,o=t>>2;n.useOffscreen()?(this.offscreenCanvas=new OffscreenCanvas(e,r),this.offscreenCanvasGL=this.offscreenCanvas.getContext("webgl"),this.webglObj=((e,r)=>{var t=["attribute vec4 vertexPos;","attribute vec4 texturePos;","varying vec2 textureCoord;","void main()","{","gl_Position = vertexPos;","textureCoord = texturePos.xy;","}"].join("\n"),n=["precision highp float;","varying highp vec2 textureCoord;","uniform sampler2D ySampler;","uniform sampler2D uSampler;","uniform sampler2D vSampler;","const mat4 YUV2RGB = mat4","(","1.1643828125, 0, 1.59602734375, -.87078515625,","1.1643828125, -.39176171875, -.81296875, .52959375,","1.1643828125, 2.017234375, 0, -1.081390625,","0, 0, 0, 1",");","void main(void) {","highp float y = texture2D(ySampler, textureCoord).r;","highp float u = texture2D(uSampler, textureCoord).r;","highp float v = texture2D(vSampler, textureCoord).r;","gl_FragColor = vec4(y, u, v, 1) * YUV2RGB;","}"].join("\n");r&&e.pixelStorei(e.UNPACK_ALIGNMENT,1);var o=e.createShader(e.VERTEX_SHADER);e.shaderSource(o,t),e.compileShader(o),e.getShaderParameter(o,e.COMPILE_STATUS)||console.log("Vertex shader failed to compile: "+e.getShaderInfoLog(o));var i=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(i,n),e.compileShader(i),e.getShaderParameter(i,e.COMPILE_STATUS)||console.log("Fragment shader failed to compile: "+e.getShaderInfoLog(i));var a=e.createProgram();e.attachShader(a,o),e.attachShader(a,i),e.linkProgram(a),e.getProgramParameter(a,e.LINK_STATUS)||console.log("Program failed to compile: "+e.getProgramInfoLog(a)),e.useProgram(a);var s=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,s),e.bufferData(e.ARRAY_BUFFER,new Float32Array([1,1,-1,1,1,-1,-1,-1]),e.STATIC_DRAW);var l=e.getAttribLocation(a,"vertexPos");e.enableVertexAttribArray(l),e.vertexAttribPointer(l,2,e.FLOAT,!1,0,0);var u=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,u),e.bufferData(e.ARRAY_BUFFER,new Float32Array([1,0,0,0,1,1,0,1]),e.STATIC_DRAW);var c=e.getAttribLocation(a,"texturePos");function d(r,t){var n=e.createTexture();return e.bindTexture(e.TEXTURE_2D,n),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),e.uniform1i(e.getUniformLocation(a,r),t),n}e.enableVertexAttribArray(c),e.vertexAttribPointer(c,2,e.FLOAT,!1,0,0);var f=d("ySampler",0),p=d("uSampler",1),m=d("vSampler",2);return{render:function(r,t,n,o,i){e.viewport(0,0,r,t),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,f),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,r,t,0,e.LUMINANCE,e.UNSIGNED_BYTE,n),e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,p),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,r/2,t/2,0,e.LUMINANCE,e.UNSIGNED_BYTE,o),e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,m),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,r/2,t/2,0,e.LUMINANCE,e.UNSIGNED_BYTE,i),e.drawArrays(e.TRIANGLE_STRIP,0,4)},destroy:function(){try{e.deleteProgram(a),e.deleteBuffer(s),e.deleteBuffer(u),e.deleteTexture(f),e.deleteTexture(p),e.deleteTexture(m)}catch(e){}}}})(this.offscreenCanvasGL,n.opt.openWebglAlignment),this.draw=function(n,i,a,s){const u=l.HEAPU8.subarray(i,i+t),c=l.HEAPU8.subarray(a,a+o),d=l.HEAPU8.subarray(s,s+o);this.webglObj.render(e,r,u,c,d);let f=this.offscreenCanvas.transferToImageBitmap();postMessage({cmd:g,buffer:f,delay:this.delay,ts:n},[f])}):this.draw=function(e,r,n,i){const a=[Uint8Array.from(l.HEAPU8.subarray(r,r+t)),Uint8Array.from(l.HEAPU8.subarray(n,n+o)),Uint8Array.from(l.HEAPU8.subarray(i,i+o))];postMessage({cmd:g,output:a,delay:this.delay,ts:e},a.map((e=>e.buffer)))}},getDelay:function(e){if(!e)return-1;if(this.firstTimestamp){if(e){const r=Date.now()-this.startTimestamp,t=e-this.firstTimestamp;this.delay=r>=t?r-t:t-r}}else this.firstTimestamp=e,this.startTimestamp=Date.now(),this.delay=-1;return this.delay},resetDelay:function(){this.firstTimestamp=null,this.startTimestamp=null,this.delay=-1},init:function(){n.opt.debug&&console.log("Jessibuca: [worker] init");const r=e=>{n.opt.useWCS&&n.useOffscreen()&&e.type===_&&t.decode?t.decode(e.payload,e.ts):e.decoder.decode(e.payload,e.ts)};this.stopId=setInterval((()=>{if(e.length)if(this.dropping){for((t=e.shift()).type===b&&0===t.payload[1]&&r(t);!t.isIFrame&&e.length;)(t=e.shift()).type===b&&0===t.payload[1]&&r(t);t.isIFrame&&(this.dropping=!1,r(t))}else{var t=e[0];if(-1===this.getDelay(t.ts))e.shift(),r(t);else if(this.delay>n.opt.videoBuffer+n.opt.videoBufferDelay)this.resetDelay(),this.dropping=!0;else for(;e.length&&(t=e[0],this.getDelay(t.ts)>n.opt.videoBuffer);)e.shift(),r(t)}}),10)},close:function(){n.opt.debug&&console.log("Jessibuca: [worker]: close"),clearInterval(this.stopId),this.stopId=null,o.clear&&o.clear(),i.clear&&i.clear(),t.reset&&t.reset(),this.firstTimestamp=null,this.startTimestamp=null,this.delay=-1,this.dropping=!1,this.webglObj&&(this.webglObj.destroy(),this.offscreenCanvas=null,this.offscreenCanvasGL=null,this.offscreenCanvasCtx=null),e=[],r=[],delete this.playAudioPlanar,delete this.draw},pushBuffer:function(r,t){t.type===b?e.push({ts:t.ts,payload:r,decoder:o,type:b}):t.type===_&&e.push({ts:t.ts,payload:r,decoder:i,type:_,isIFrame:t.isIFrame})}},o=new l.AudioDecoder(n),i=new l.VideoDecoder(n);postMessage({cmd:T}),self.onmessage=function(e){var r=e.data;switch(r.cmd){case T:try{n.opt=Object.assign(n.opt,JSON.parse(r.opt))}catch(e){}o.sample_rate=r.sampleRate,n.init();break;case k:n.pushBuffer(r.buffer,r.options);break;case S:o.decode(r.buffer,r.ts);break;case C:i.decode(r.buffer,r.ts);break;case P:n.close();break;case A:n.opt[r.key]=r.value}}}})); | ... | ... |
| 1 | +<!DOCTYPE html> | |
| 2 | +<html lang="en"> | |
| 3 | +<head> | |
| 4 | + <meta charset="UTF-8"> | |
| 5 | + <title>Title</title> | |
| 6 | + <script src="./jessibuca.js"></script> | |
| 7 | + <style> | |
| 8 | + .root { | |
| 9 | + display: flex; | |
| 10 | + place-content: center; | |
| 11 | + margin-top: 3rem; | |
| 12 | + } | |
| 13 | + | |
| 14 | + .container-shell { | |
| 15 | + backdrop-filter: blur(5px); | |
| 16 | + background: hsla(0, 0%, 50%, 0.5); | |
| 17 | + padding: 30px 4px 10px 4px; | |
| 18 | + /* border: 2px solid black; */ | |
| 19 | + width: auto; | |
| 20 | + position: relative; | |
| 21 | + border-radius: 5px; | |
| 22 | + box-shadow: 0 10px 20px; | |
| 23 | + } | |
| 24 | + | |
| 25 | + .container-shell:before { | |
| 26 | + content: "jessibuca demo player"; | |
| 27 | + position: absolute; | |
| 28 | + color: darkgray; | |
| 29 | + top: 4px; | |
| 30 | + left: 10px; | |
| 31 | + text-shadow: 1px 1px black; | |
| 32 | + } | |
| 33 | + | |
| 34 | + #container { | |
| 35 | + background: rgba(13, 14, 27, 0.7); | |
| 36 | + width: 640px; | |
| 37 | + height: 398px; | |
| 38 | + } | |
| 39 | + | |
| 40 | + .input { | |
| 41 | + display: flex; | |
| 42 | + margin-top: 10px; | |
| 43 | + color: white; | |
| 44 | + place-content: stretch; | |
| 45 | + } | |
| 46 | + | |
| 47 | + .input2 { | |
| 48 | + bottom: 0px; | |
| 49 | + } | |
| 50 | + | |
| 51 | + .input input { | |
| 52 | + flex: auto; | |
| 53 | + } | |
| 54 | + | |
| 55 | + .err { | |
| 56 | + position: absolute; | |
| 57 | + top: 40px; | |
| 58 | + left: 10px; | |
| 59 | + color: red; | |
| 60 | + } | |
| 61 | + | |
| 62 | + .option { | |
| 63 | + position: absolute; | |
| 64 | + top: 4px; | |
| 65 | + right: 10px; | |
| 66 | + display: flex; | |
| 67 | + place-content: center; | |
| 68 | + font-size: 12px; | |
| 69 | + } | |
| 70 | + | |
| 71 | + .option span { | |
| 72 | + color: white; | |
| 73 | + } | |
| 74 | + | |
| 75 | + .page { | |
| 76 | + background: url('./bg.jpg'); | |
| 77 | + background-repeat: no-repeat; | |
| 78 | + background-position: top; | |
| 79 | + } | |
| 80 | + | |
| 81 | + @media (max-width: 720px) { | |
| 82 | + #container { | |
| 83 | + width: 90vw; | |
| 84 | + height: 52.7vw; | |
| 85 | + } | |
| 86 | + } | |
| 87 | + </style> | |
| 88 | +</head> | |
| 89 | +<body class="page"> | |
| 90 | +<div class="root"> | |
| 91 | + <div class="container-shell"> | |
| 92 | + <div id="container"></div> | |
| 93 | + <div class="input"> | |
| 94 | + <div>输入URL:</div> | |
| 95 | + <input | |
| 96 | + autocomplete="on" | |
| 97 | + id="playUrl" | |
| 98 | + value="" | |
| 99 | + /> | |
| 100 | + <button id="play">播放</button> | |
| 101 | + <button id="pause" style="display: none">停止</button> | |
| 102 | + </div> | |
| 103 | + <div class="input" style="line-height: 30px"> | |
| 104 | + <button id="destroy">销毁</button> | |
| 105 | + </div> | |
| 106 | + </div> | |
| 107 | +</div> | |
| 108 | + | |
| 109 | +<script> | |
| 110 | + var $player = document.getElementById('play'); | |
| 111 | + var $pause = document.getElementById('pause'); | |
| 112 | + var $playHref = document.getElementById('playUrl'); | |
| 113 | + var $container = document.getElementById('container'); | |
| 114 | + var $destroy = document.getElementById('destroy'); | |
| 115 | + | |
| 116 | + var showOperateBtns = false; // 是否显示按钮 | |
| 117 | + var forceNoOffscreen = true; // | |
| 118 | + var jessibuca = null; | |
| 119 | + | |
| 120 | + function create() { | |
| 121 | + jessibuca = new Jessibuca({ | |
| 122 | + container: $container, | |
| 123 | + videoBuffer: 0.2, // 缓存时长 | |
| 124 | + isResize: false, | |
| 125 | + text: "", | |
| 126 | + loadingText: "", | |
| 127 | + useMSE: false, | |
| 128 | + debug: true, | |
| 129 | + showBandwidth: showOperateBtns, // 显示网速 | |
| 130 | + operateBtns: { | |
| 131 | + fullscreen: showOperateBtns, | |
| 132 | + screenshot: showOperateBtns, | |
| 133 | + play: showOperateBtns, | |
| 134 | + audio: false, | |
| 135 | + recorder: false | |
| 136 | + }, | |
| 137 | + forceNoOffscreen: forceNoOffscreen, | |
| 138 | + isNotMute: false, | |
| 139 | + },); | |
| 140 | + | |
| 141 | + jessibuca.on('audioInfo', function (audioInfo) { | |
| 142 | + console.log('audioInfo',audioInfo); | |
| 143 | + }) | |
| 144 | + | |
| 145 | + jessibuca.on('videoInfo', function (videoInfo) { | |
| 146 | + console.log('videoInfo',videoInfo); | |
| 147 | + }) | |
| 148 | + | |
| 149 | + $player.style.display = 'inline-block'; | |
| 150 | + $pause.style.display = 'none'; | |
| 151 | + $destroy.style.display = 'none'; | |
| 152 | + } | |
| 153 | + | |
| 154 | + | |
| 155 | + create(); | |
| 156 | + | |
| 157 | + $player.addEventListener('click', function () { | |
| 158 | + var href = $playHref.value; | |
| 159 | + if (href) { | |
| 160 | + jessibuca.play(href); | |
| 161 | + $player.style.display = 'none'; | |
| 162 | + $pause.style.display = 'inline-block'; | |
| 163 | + $destroy.style.display = 'inline-block'; | |
| 164 | + } | |
| 165 | + }, false) | |
| 166 | + | |
| 167 | + | |
| 168 | + $pause.addEventListener('click', function () { | |
| 169 | + $player.style.display = 'inline-block'; | |
| 170 | + $pause.style.display = 'none'; | |
| 171 | + jessibuca.pause(); | |
| 172 | + }) | |
| 173 | + | |
| 174 | + $destroy.addEventListener('click', function () { | |
| 175 | + if (jessibuca) { | |
| 176 | + jessibuca.destroy(); | |
| 177 | + } | |
| 178 | + create(); | |
| 179 | + }) | |
| 180 | + | |
| 181 | +</script> | |
| 182 | + | |
| 183 | +</body> | |
| 184 | +</html> | |
| 185 | + | ... | ... |
| 1 | +!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e=e||self).uni=n()}(this,(function(){"use strict";try{var e={};Object.defineProperty(e,"passive",{get:function(){!0}}),window.addEventListener("test-passive",null,e)}catch(e){}var n=Object.prototype.hasOwnProperty;function i(e,i){return n.call(e,i)}var t=[];function o(){return window.__dcloud_weex_postMessage||window.__dcloud_weex_}function a(){return window.__uniapp_x_postMessage||window.__uniapp_x_}var r=function(e,n){var i={options:{timestamp:+new Date},name:e,arg:n};if(a()){if("postMessage"===e){var r={data:n};return window.__uniapp_x_postMessage?window.__uniapp_x_postMessage(r):window.__uniapp_x_.postMessage(JSON.stringify(r))}var d={type:"WEB_INVOKE_APPSERVICE",args:{data:i,webviewIds:t}};window.__uniapp_x_postMessage?window.__uniapp_x_postMessageToService(d):window.__uniapp_x_.postMessageToService(JSON.stringify(d))}else if(o()){if("postMessage"===e){var s={data:[n]};return window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessage(s):window.__dcloud_weex_.postMessage(JSON.stringify(s))}var w={type:"WEB_INVOKE_APPSERVICE",args:{data:i,webviewIds:t}};window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessageToService(w):window.__dcloud_weex_.postMessageToService(JSON.stringify(w))}else{if(!window.plus)return window.parent.postMessage({type:"WEB_INVOKE_APPSERVICE",data:i,pageId:""},"*");if(0===t.length){var u=plus.webview.currentWebview();if(!u)throw new Error("plus.webview.currentWebview() is undefined");var g=u.parent(),v="";v=g?g.id:u.id,t.push(v)}if(plus.webview.getWebviewById("__uniapp__service"))plus.webview.postMessageToUniNView({type:"WEB_INVOKE_APPSERVICE",args:{data:i,webviewIds:t}},"__uniapp__service");else{var c=JSON.stringify(i);plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler("'.concat("WEB_INVOKE_APPSERVICE",'",').concat(c,",").concat(JSON.stringify(t),");"))}}},d={navigateTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("navigateTo",{url:encodeURI(n)})},navigateBack:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.delta;r("navigateBack",{delta:parseInt(n)||1})},switchTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("switchTab",{url:encodeURI(n)})},reLaunch:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("reLaunch",{url:encodeURI(n)})},redirectTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("redirectTo",{url:encodeURI(n)})},getEnv:function(e){a()?e({uvue:!0}):o()?e({nvue:!0}):window.plus?e({plus:!0}):e({h5:!0})},postMessage:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};r("postMessage",e.data||{})}},s=/uni-app/i.test(navigator.userAgent),w=/Html5Plus/i.test(navigator.userAgent),u=/complete|loaded|interactive/;var g=window.my&&navigator.userAgent.indexOf(["t","n","e","i","l","C","y","a","p","i","l","A"].reverse().join(""))>-1;var v=window.swan&&window.swan.webView&&/swan/i.test(navigator.userAgent);var c=window.qq&&window.qq.miniProgram&&/QQ/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var p=window.tt&&window.tt.miniProgram&&/toutiaomicroapp/i.test(navigator.userAgent);var _=window.wx&&window.wx.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var m=window.qa&&/quickapp/i.test(navigator.userAgent);var f=window.ks&&window.ks.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var l=window.tt&&window.tt.miniProgram&&/Lark|Feishu/i.test(navigator.userAgent);var E=window.jd&&window.jd.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var x=window.xhs&&window.xhs.miniProgram&&/xhsminiapp/i.test(navigator.userAgent);for(var S,h=function(){window.UniAppJSBridge=!0,document.dispatchEvent(new CustomEvent("UniAppJSBridgeReady",{bubbles:!0,cancelable:!0}))},y=[function(e){if(s||w)return window.__uniapp_x_postMessage||window.__uniapp_x_||window.__dcloud_weex_postMessage||window.__dcloud_weex_?document.addEventListener("DOMContentLoaded",e):window.plus&&u.test(document.readyState)?setTimeout(e,0):document.addEventListener("plusready",e),d},function(e){if(_)return window.WeixinJSBridge&&window.WeixinJSBridge.invoke?setTimeout(e,0):document.addEventListener("WeixinJSBridgeReady",e),window.wx.miniProgram},function(e){if(c)return window.QQJSBridge&&window.QQJSBridge.invoke?setTimeout(e,0):document.addEventListener("QQJSBridgeReady",e),window.qq.miniProgram},function(e){if(g){document.addEventListener("DOMContentLoaded",e);var n=window.my;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){if(v)return document.addEventListener("DOMContentLoaded",e),window.swan.webView},function(e){if(p)return document.addEventListener("DOMContentLoaded",e),window.tt.miniProgram},function(e){if(m){window.QaJSBridge&&window.QaJSBridge.invoke?setTimeout(e,0):document.addEventListener("QaJSBridgeReady",e);var n=window.qa;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){if(f)return window.WeixinJSBridge&&window.WeixinJSBridge.invoke?setTimeout(e,0):document.addEventListener("WeixinJSBridgeReady",e),window.ks.miniProgram},function(e){if(l)return document.addEventListener("DOMContentLoaded",e),window.tt.miniProgram},function(e){if(E)return window.JDJSBridgeReady&&window.JDJSBridgeReady.invoke?setTimeout(e,0):document.addEventListener("JDJSBridgeReady",e),window.jd.miniProgram},function(e){if(x)return window.xhs.miniProgram},function(e){return document.addEventListener("DOMContentLoaded",e),d}],M=0;M<y.length&&!(S=y[M](h));M++);S||(S={});var P="undefined"!=typeof uni?uni:{};if(!P.navigateTo)for(var b in S)i(S,b)&&(P[b]=S[b]);return P.webView=S,P})); | ... | ... |
| 1 | +declare namespace Jessibuca { | |
| 2 | + | |
| 3 | + /** 超时信息 */ | |
| 4 | + enum TIMEOUT { | |
| 5 | + /** 当play()的时候,如果没有数据返回 */ | |
| 6 | + loadingTimeout = 'loadingTimeout', | |
| 7 | + /** 当播放过程中,如果超过timeout之后没有数据渲染 */ | |
| 8 | + delayTimeout = 'delayTimeout', | |
| 9 | + } | |
| 10 | + | |
| 11 | + /** 错误信息 */ | |
| 12 | + enum ERROR { | |
| 13 | + /** 播放错误,url 为空的时候,调用 play 方法 */ | |
| 14 | + playError = 'playError', | |
| 15 | + /** http 请求失败 */ | |
| 16 | + fetchError = 'fetchError', | |
| 17 | + /** websocket 请求失败 */ | |
| 18 | + websocketError = 'websocketError', | |
| 19 | + /** webcodecs 解码 h265 失败 */ | |
| 20 | + webcodecsH265NotSupport = 'webcodecsH265NotSupport', | |
| 21 | + /** mediaSource 解码 h265 失败 */ | |
| 22 | + mediaSourceH265NotSupport = 'mediaSourceH265NotSupport', | |
| 23 | + /** wasm 解码失败 */ | |
| 24 | + wasmDecodeError = 'wasmDecodeError', | |
| 25 | + } | |
| 26 | + | |
| 27 | + interface Config { | |
| 28 | + /** | |
| 29 | + * 播放器容器 | |
| 30 | + * * 若为 string ,则底层调用的是 document.getElementById('id') | |
| 31 | + * */ | |
| 32 | + container: HTMLElement | string; | |
| 33 | + /** | |
| 34 | + * 设置最大缓冲时长,单位秒,播放器会自动消除延迟 | |
| 35 | + */ | |
| 36 | + videoBuffer?: number; | |
| 37 | + /** | |
| 38 | + * worker地址 | |
| 39 | + * * 默认引用的是根目录下面的decoder.js文件 ,decoder.js 与 decoder.wasm文件必须是放在同一个目录下面。 */ | |
| 40 | + decoder?: string; | |
| 41 | + /** | |
| 42 | + * 是否不使用离屏模式(提升渲染能力) | |
| 43 | + */ | |
| 44 | + forceNoOffscreen?: boolean; | |
| 45 | + /** | |
| 46 | + * 是否开启当页面的'visibilityState'变为'hidden'的时候,自动暂停播放。 | |
| 47 | + */ | |
| 48 | + hiddenAutoPause?: boolean; | |
| 49 | + /** | |
| 50 | + * 是否有音频,如果设置`false`,则不对音频数据解码,提升性能。 | |
| 51 | + */ | |
| 52 | + hasAudio?: boolean; | |
| 53 | + /** | |
| 54 | + * 设置旋转角度,只支持,0(默认),180,270 三个值 | |
| 55 | + */ | |
| 56 | + rotate?: boolean; | |
| 57 | + /** | |
| 58 | + * 1. 当为`true`的时候:视频画面做等比缩放后,高或宽对齐canvas区域,画面不被拉伸,但有黑边。 等同于 `setScaleMode(1)` | |
| 59 | + * 2. 当为`false`的时候:视频画面完全填充canvas区域,画面会被拉伸。等同于 `setScaleMode(0)` | |
| 60 | + */ | |
| 61 | + isResize?: boolean; | |
| 62 | + /** | |
| 63 | + * 1. 当为`true`的时候:视频画面做等比缩放后,完全填充canvas区域,画面不被拉伸,没有黑边,但画面显示不全。等同于 `setScaleMode(2)` | |
| 64 | + */ | |
| 65 | + isFullResize?: boolean; | |
| 66 | + /** | |
| 67 | + * 1. 当为`true`的时候:ws协议不检验是否以.flv为依据,进行协议解析。 | |
| 68 | + */ | |
| 69 | + isFlv?: boolean; | |
| 70 | + /** | |
| 71 | + * 是否开启控制台调试打 | |
| 72 | + */ | |
| 73 | + debug?: boolean; | |
| 74 | + /** | |
| 75 | + * 1. 设置超时时长, 单位秒 | |
| 76 | + * 2. 在连接成功之前(loading)和播放中途(heart),如果超过设定时长无数据返回,则回调timeout事件 | |
| 77 | + */ | |
| 78 | + timeout?: number; | |
| 79 | + /** | |
| 80 | + * 1. 设置超时时长, 单位秒 | |
| 81 | + * 2. 在连接成功之前,如果超过设定时长无数据返回,则回调timeout事件 | |
| 82 | + */ | |
| 83 | + heartTimeout?: number; | |
| 84 | + /** | |
| 85 | + * 1. 设置超时时长, 单位秒 | |
| 86 | + * 2. 在连接成功之前,如果超过设定时长无数据返回,则回调timeout事件 | |
| 87 | + */ | |
| 88 | + loadingTimeout?: number; | |
| 89 | + /** | |
| 90 | + * 是否支持屏幕的双击事件,触发全屏,取消全屏事件 | |
| 91 | + */ | |
| 92 | + supportDblclickFullscreen?: boolean; | |
| 93 | + /** | |
| 94 | + * 是否显示网 | |
| 95 | + */ | |
| 96 | + showBandwidth?: boolean; | |
| 97 | + /** | |
| 98 | + * 配置操作按钮 | |
| 99 | + */ | |
| 100 | + operateBtns?: { | |
| 101 | + /** 是否显示全屏按钮 */ | |
| 102 | + fullscreen?: boolean; | |
| 103 | + /** 是否显示截图按钮 */ | |
| 104 | + screenshot?: boolean; | |
| 105 | + /** 是否显示播放暂停按钮 */ | |
| 106 | + play?: boolean; | |
| 107 | + /** 是否显示声音按钮 */ | |
| 108 | + audio?: boolean; | |
| 109 | + /** 是否显示录制按 */ | |
| 110 | + record?: boolean; | |
| 111 | + }; | |
| 112 | + /** | |
| 113 | + * 开启屏幕常亮,在手机浏览器上, canvas标签渲染视频并不会像video标签那样保持屏幕常亮 | |
| 114 | + */ | |
| 115 | + keepScreenOn?: boolean; | |
| 116 | + /** | |
| 117 | + * 是否开启声音,默认是关闭声音播放的 | |
| 118 | + */ | |
| 119 | + isNotMute?: boolean; | |
| 120 | + /** | |
| 121 | + * 加载过程中文案 | |
| 122 | + */ | |
| 123 | + loadingText?: string; | |
| 124 | + /** | |
| 125 | + * 背景图片 | |
| 126 | + */ | |
| 127 | + background?: string; | |
| 128 | + /** | |
| 129 | + * 是否开启MediaSource硬解码 | |
| 130 | + * * 视频编码只支持H.264视频(Safari on iOS不支持) | |
| 131 | + * * 不支持 forceNoOffscreen 为 false (开启离屏渲染) | |
| 132 | + */ | |
| 133 | + useMSE?: boolean; | |
| 134 | + /** | |
| 135 | + * 是否开启Webcodecs硬解码 | |
| 136 | + * * 视频编码只支持H.264视频 (需在chrome 94版本以上,需要https或者localhost环境) | |
| 137 | + * * 支持 forceNoOffscreen 为 false (开启离屏渲染) | |
| 138 | + * */ | |
| 139 | + useWCS?: boolean; | |
| 140 | + /** | |
| 141 | + * 是否开启键盘快捷键 | |
| 142 | + * 目前支持的键盘快捷键有:esc -> 退出全屏;arrowUp -> 声音增加;arrowDown -> 声音减少; | |
| 143 | + */ | |
| 144 | + hotKey?: boolean; | |
| 145 | + /** | |
| 146 | + * 在使用MSE或者Webcodecs 播放H265的时候,是否自动降级到wasm模式。 | |
| 147 | + * 设置为false 则直接关闭播放,抛出Error 异常,设置为true 则会自动切换成wasm模式播放。 | |
| 148 | + */ | |
| 149 | + autoWasm?: boolean; | |
| 150 | + /** | |
| 151 | + * heartTimeout 心跳超时之后自动再播放,不再抛出异常,而直接重新播放视频地址。 | |
| 152 | + */ | |
| 153 | + heartTimeoutReplay?: boolean, | |
| 154 | + /** | |
| 155 | + * heartTimeoutReplay 从试次数,超过之后,不再自动播放 | |
| 156 | + */ | |
| 157 | + heartTimeoutReplayTimes?: number, | |
| 158 | + /** | |
| 159 | + * loadingTimeout loading之后自动再播放,不再抛出异常,而直接重新播放视频地址。 | |
| 160 | + */ | |
| 161 | + loadingTimeoutReplay?: boolean, | |
| 162 | + /** | |
| 163 | + * heartTimeoutReplay 从试次数,超过之后,不再自动播放 | |
| 164 | + */ | |
| 165 | + loadingTimeoutReplayTimes?: number | |
| 166 | + /** | |
| 167 | + * wasm解码报错之后,不再抛出异常,而是直接重新播放视频地址。 | |
| 168 | + */ | |
| 169 | + wasmDecodeErrorReplay?: boolean, | |
| 170 | + /** | |
| 171 | + * https://github.com/langhuihui/jessibuca/issues/152 解决方案 | |
| 172 | + * 例如:WebGL图像预处理默认每次取4字节的数据,但是540x960分辨率下的U、V分量宽度是540/2=270不能被4整除,导致绿屏。 | |
| 173 | + */ | |
| 174 | + openWebglAlignment?: boolean | |
| 175 | + } | |
| 176 | +} | |
| 177 | + | |
| 178 | + | |
| 179 | +declare class Jessibuca { | |
| 180 | + | |
| 181 | + constructor(config?: Jessibuca.Config); | |
| 182 | + | |
| 183 | + /** | |
| 184 | + * 是否开启控制台调试打印 | |
| 185 | + @example | |
| 186 | + // 开启 | |
| 187 | + jessibuca.setDebug(true) | |
| 188 | + // 关闭 | |
| 189 | + jessibuca.setDebug(false) | |
| 190 | + */ | |
| 191 | + setDebug(flag: boolean): void; | |
| 192 | + | |
| 193 | + /** | |
| 194 | + * 静音 | |
| 195 | + @example | |
| 196 | + jessibuca.mute() | |
| 197 | + */ | |
| 198 | + mute(): void; | |
| 199 | + | |
| 200 | + /** | |
| 201 | + * 取消静音 | |
| 202 | + @example | |
| 203 | + jessibuca.cancelMute() | |
| 204 | + */ | |
| 205 | + cancelMute(): void; | |
| 206 | + | |
| 207 | + /** | |
| 208 | + * 留给上层用户操作来触发音频恢复的方法。 | |
| 209 | + * | |
| 210 | + * iPhone,chrome等要求自动播放时,音频必须静音,需要由一个真实的用户交互操作来恢复,不能使用代码。 | |
| 211 | + * | |
| 212 | + * https://developers.google.com/web/updates/2017/09/autoplay-policy-changes | |
| 213 | + */ | |
| 214 | + audioResume(): void; | |
| 215 | + | |
| 216 | + /** | |
| 217 | + * | |
| 218 | + * 设置超时时长, 单位秒 | |
| 219 | + * 在连接成功之前和播放中途,如果超过设定时长无数据返回,则回调timeout事件 | |
| 220 | + | |
| 221 | + @example | |
| 222 | + jessibuca.setTimeout(10) | |
| 223 | + | |
| 224 | + jessibuca.on('timeout',function(){ | |
| 225 | + // | |
| 226 | + }); | |
| 227 | + */ | |
| 228 | + setTimeout(): void; | |
| 229 | + | |
| 230 | + /** | |
| 231 | + * @param mode | |
| 232 | + * 0 视频画面完全填充canvas区域,画面会被拉伸 等同于参数 `isResize` 为false | |
| 233 | + * | |
| 234 | + * 1 视频画面做等比缩放后,高或宽对齐canvas区域,画面不被拉伸,但有黑边 等同于参数 `isResize` 为true | |
| 235 | + * | |
| 236 | + * 2 视频画面做等比缩放后,完全填充canvas区域,画面不被拉伸,没有黑边,但画面显示不全 等同于参数 `isFullResize` 为true | |
| 237 | + @example | |
| 238 | + jessibuca.setScaleMode(0) | |
| 239 | + | |
| 240 | + jessibuca.setScaleMode(1) | |
| 241 | + | |
| 242 | + jessibuca.setScaleMode(2) | |
| 243 | + */ | |
| 244 | + setScaleMode(mode: number): void; | |
| 245 | + | |
| 246 | + /** | |
| 247 | + * 暂停播放 | |
| 248 | + * | |
| 249 | + * 可以在pause 之后,再调用 `play()`方法就继续播放之前的流。 | |
| 250 | + @example | |
| 251 | + jessibuca.pause().then(()=>{ | |
| 252 | + console.log('pause success') | |
| 253 | + | |
| 254 | + jessibuca.play().then(()=>{ | |
| 255 | + | |
| 256 | + }).catch((e)=>{ | |
| 257 | + | |
| 258 | + }) | |
| 259 | + | |
| 260 | + }).catch((e)=>{ | |
| 261 | + console.log('pause error',e); | |
| 262 | + }) | |
| 263 | + */ | |
| 264 | + pause(): Promise<void>; | |
| 265 | + | |
| 266 | + /** | |
| 267 | + * 关闭视频,不释放底层资源 | |
| 268 | + @example | |
| 269 | + jessibuca.close(); | |
| 270 | + */ | |
| 271 | + close(): void; | |
| 272 | + | |
| 273 | + /** | |
| 274 | + * 关闭视频,释放底层资源 | |
| 275 | + @example | |
| 276 | + jessibuca.destroy() | |
| 277 | + */ | |
| 278 | + destroy(): void; | |
| 279 | + | |
| 280 | + /** | |
| 281 | + * 清理画布为黑色背景 | |
| 282 | + @example | |
| 283 | + jessibuca.clearView() | |
| 284 | + */ | |
| 285 | + clearView(): void; | |
| 286 | + | |
| 287 | + /** | |
| 288 | + * 播放视频 | |
| 289 | + @example | |
| 290 | + | |
| 291 | + jessibuca.play('url').then(()=>{ | |
| 292 | + console.log('play success') | |
| 293 | + }).catch((e)=>{ | |
| 294 | + console.log('play error',e) | |
| 295 | + }) | |
| 296 | + // | |
| 297 | + jessibuca.play() | |
| 298 | + */ | |
| 299 | + play(url?: string): Promise<void>; | |
| 300 | + | |
| 301 | + /** | |
| 302 | + * 重新调整视图大小 | |
| 303 | + */ | |
| 304 | + resize(): void; | |
| 305 | + | |
| 306 | + /** | |
| 307 | + * 设置最大缓冲时长,单位秒,播放器会自动消除延迟。 | |
| 308 | + * | |
| 309 | + * 等同于 `videoBuffer` 参数。 | |
| 310 | + * | |
| 311 | + @example | |
| 312 | + // 设置 200ms 缓冲 | |
| 313 | + jessibuca.setBufferTime(0.2) | |
| 314 | + */ | |
| 315 | + setBufferTime(time: number): void; | |
| 316 | + | |
| 317 | + /** | |
| 318 | + * 设置旋转角度,只支持,0(默认) ,180,270 三个值。 | |
| 319 | + * | |
| 320 | + * > 可用于实现监控画面小窗和全屏效果,由于iOS没有全屏API,此方法可以模拟页面内全屏效果而且多端效果一致。 * | |
| 321 | + @example | |
| 322 | + jessibuca.setRotate(0) | |
| 323 | + | |
| 324 | + jessibuca.setRotate(90) | |
| 325 | + | |
| 326 | + jessibuca.setRotate(270) | |
| 327 | + */ | |
| 328 | + setRotate(deg: number): void; | |
| 329 | + | |
| 330 | + /** | |
| 331 | + * | |
| 332 | + * 设置音量大小,取值0 — 1 | |
| 333 | + * | |
| 334 | + * > 区别于 mute 和 cancelMute 方法,虽然设置setVolume(0) 也能达到 mute方法,但是mute 方法是不调用底层播放音频的,能提高性能。而setVolume(0)只是把声音设置为0 ,以达到效果。 | |
| 335 | + * @param volume 当为0时,完全无声;当为1时,最大音量,默认值 | |
| 336 | + @example | |
| 337 | + jessibuca.setVolume(0.2) | |
| 338 | + | |
| 339 | + jessibuca.setVolume(0) | |
| 340 | + | |
| 341 | + jessibuca.setVolume(1) | |
| 342 | + */ | |
| 343 | + setVolume(volume: number): void; | |
| 344 | + | |
| 345 | + /** | |
| 346 | + * 返回是否加载完毕 | |
| 347 | + @example | |
| 348 | + var result = jessibuca.hasLoaded() | |
| 349 | + console.log(result) // true | |
| 350 | + */ | |
| 351 | + hasLoaded(): boolean; | |
| 352 | + | |
| 353 | + /** | |
| 354 | + * 开启屏幕常亮,在手机浏览器上, canvas标签渲染视频并不会像video标签那样保持屏幕常亮。 | |
| 355 | + * H5目前在chrome\edge 84, android chrome 84及以上有原生亮屏API, 需要是https页面 | |
| 356 | + * 其余平台为模拟实现,此时为兼容实现,并不保证所有浏览器都支持 | |
| 357 | + @example | |
| 358 | + jessibuca.setKeepScreenOn() | |
| 359 | + */ | |
| 360 | + setKeepScreenOn(): boolean; | |
| 361 | + | |
| 362 | + /** | |
| 363 | + * 全屏(取消全屏)播放视频 | |
| 364 | + @example | |
| 365 | + jessibuca.setFullscreen(true) | |
| 366 | + // | |
| 367 | + jessibuca.setFullscreen(false) | |
| 368 | + */ | |
| 369 | + setFullscreen(flag: boolean): void; | |
| 370 | + | |
| 371 | + /** | |
| 372 | + * | |
| 373 | + * 截图,调用后弹出下载框保存截图 | |
| 374 | + * @param filename 可选参数, 保存的文件名, 默认 `时间戳` | |
| 375 | + * @param format 可选参数, 截图的格式,可选png或jpeg或者webp ,默认 `png` | |
| 376 | + * @param quality 可选参数, 当格式是jpeg或者webp时,压缩质量,取值0 ~ 1 ,默认 `0.92` | |
| 377 | + * @param type 可选参数, 可选download或者base64或者blob,默认`download` | |
| 378 | + | |
| 379 | + @example | |
| 380 | + | |
| 381 | + jessibuca.screenshot("test","png",0.5) | |
| 382 | + | |
| 383 | + const base64 = jessibuca.screenshot("test","png",0.5,'base64') | |
| 384 | + | |
| 385 | + const fileBlob = jessibuca.screenshot("test",'blob') | |
| 386 | + */ | |
| 387 | + screenshot(filename?: string, format?: string, quality?: number, type?: string): void; | |
| 388 | + | |
| 389 | + /** | |
| 390 | + * 开始录制。 | |
| 391 | + * @param fileName 可选,默认时间戳 | |
| 392 | + * @param fileType 可选,默认webm,支持webm 和mp4 格式 | |
| 393 | + | |
| 394 | + @example | |
| 395 | + jessibuca.startRecord('xxx','webm') | |
| 396 | + */ | |
| 397 | + startRecord(fileName: string, fileType: string): void; | |
| 398 | + | |
| 399 | + /** | |
| 400 | + * 暂停录制并下载。 | |
| 401 | + @example | |
| 402 | + jessibuca.stopRecordAndSave() | |
| 403 | + */ | |
| 404 | + stopRecordAndSave(): void; | |
| 405 | + | |
| 406 | + /** | |
| 407 | + * 返回是否正在播放中状态。 | |
| 408 | + @example | |
| 409 | + var result = jessibuca.isPlaying() | |
| 410 | + console.log(result) // true | |
| 411 | + */ | |
| 412 | + isPlaying(): boolean; | |
| 413 | + | |
| 414 | + /** | |
| 415 | + * 返回是否静音。 | |
| 416 | + @example | |
| 417 | + var result = jessibuca.isMute() | |
| 418 | + console.log(result) // true | |
| 419 | + */ | |
| 420 | + isMute(): boolean; | |
| 421 | + | |
| 422 | + /** | |
| 423 | + * 返回是否正在录制。 | |
| 424 | + @example | |
| 425 | + var result = jessibuca.isRecording() | |
| 426 | + console.log(result) // true | |
| 427 | + */ | |
| 428 | + isRecording(): boolean; | |
| 429 | + | |
| 430 | + | |
| 431 | + /** | |
| 432 | + * 监听 jessibuca 初始化事件 | |
| 433 | + * @example | |
| 434 | + * jessibuca.on("load",function(){console.log('load')}) | |
| 435 | + */ | |
| 436 | + on(event: 'load', callback: () => void): void; | |
| 437 | + | |
| 438 | + /** | |
| 439 | + * 视频播放持续时间,单位ms | |
| 440 | + * @example | |
| 441 | + * jessibuca.on('timeUpdate',function (ts) {console.log('timeUpdate',ts);}) | |
| 442 | + */ | |
| 443 | + on(event: 'timeUpdate', callback: () => void): void; | |
| 444 | + | |
| 445 | + /** | |
| 446 | + * 当解析出视频信息时回调,2个回调参数 | |
| 447 | + * @example | |
| 448 | + * jessibuca.on("videoInfo",function(data){console.log('width:',data.width,'height:',data.width)}) | |
| 449 | + */ | |
| 450 | + on(event: 'videoInfo', callback: (data: { | |
| 451 | + /** 视频宽 */ | |
| 452 | + width: number; | |
| 453 | + /** 视频高 */ | |
| 454 | + height: number; | |
| 455 | + }) => void): void; | |
| 456 | + | |
| 457 | + /** | |
| 458 | + * 当解析出音频信息时回调,2个回调参数 | |
| 459 | + * @example | |
| 460 | + * jessibuca.on("audioInfo",function(data){console.log('numOfChannels:',data.numOfChannels,'sampleRate',data.sampleRate)}) | |
| 461 | + */ | |
| 462 | + on(event: 'audioInfo', callback: (data: { | |
| 463 | + /** 声频通道 */ | |
| 464 | + numOfChannels: number; | |
| 465 | + /** 采样率 */ | |
| 466 | + sampleRate: number; | |
| 467 | + }) => void): void; | |
| 468 | + | |
| 469 | + /** | |
| 470 | + * 信息,包含错误信息 | |
| 471 | + * @example | |
| 472 | + * jessibuca.on("log",function(data){console.log('data:',data)}) | |
| 473 | + */ | |
| 474 | + on(event: 'log', callback: () => void): void; | |
| 475 | + | |
| 476 | + /** | |
| 477 | + * 错误信息 | |
| 478 | + * @example | |
| 479 | + * jessibuca.on("error",function(error){ | |
| 480 | + if(error === Jessibuca.ERROR.fetchError){ | |
| 481 | + // | |
| 482 | + } | |
| 483 | + else if(error === Jessibuca.ERROR.webcodecsH265NotSupport){ | |
| 484 | + // | |
| 485 | + } | |
| 486 | + console.log('error:',error) | |
| 487 | + }) | |
| 488 | + */ | |
| 489 | + on(event: 'error', callback: (err: Jessibuca.ERROR) => void): void; | |
| 490 | + | |
| 491 | + /** | |
| 492 | + * 当前网速, 单位KB 每秒1次, | |
| 493 | + * @example | |
| 494 | + * jessibuca.on("kBps",function(data){console.log('kBps:',data)}) | |
| 495 | + */ | |
| 496 | + on(event: 'kBps', callback: (value: number) => void): void; | |
| 497 | + | |
| 498 | + /** | |
| 499 | + * 渲染开始 | |
| 500 | + * @example | |
| 501 | + * jessibuca.on("start",function(){console.log('start render')}) | |
| 502 | + */ | |
| 503 | + on(event: 'start', callback: () => void): void; | |
| 504 | + | |
| 505 | + /** | |
| 506 | + * 当设定的超时时间内无数据返回,则回调 | |
| 507 | + * @example | |
| 508 | + * jessibuca.on("timeout",function(error){console.log('timeout:',error)}) | |
| 509 | + */ | |
| 510 | + on(event: 'timeout', callback: (error: Jessibuca.TIMEOUT) => void): void; | |
| 511 | + | |
| 512 | + /** | |
| 513 | + * 当play()的时候,如果没有数据返回,则回调 | |
| 514 | + * @example | |
| 515 | + * jessibuca.on("loadingTimeout",function(){console.log('timeout')}) | |
| 516 | + */ | |
| 517 | + on(event: 'loadingTimeout', callback: () => void): void; | |
| 518 | + | |
| 519 | + /** | |
| 520 | + * 当播放过程中,如果超过timeout之后没有数据渲染,则抛出异常。 | |
| 521 | + * @example | |
| 522 | + * jessibuca.on("delayTimeout",function(){console.log('timeout')}) | |
| 523 | + */ | |
| 524 | + on(event: 'delayTimeout', callback: () => void): void; | |
| 525 | + | |
| 526 | + /** | |
| 527 | + * 当前是否全屏 | |
| 528 | + * @example | |
| 529 | + * jessibuca.on("fullscreen",function(flag){console.log('is fullscreen',flag)}) | |
| 530 | + */ | |
| 531 | + on(event: 'fullscreen', callback: () => void): void; | |
| 532 | + | |
| 533 | + /** | |
| 534 | + * 触发播放事件 | |
| 535 | + * @example | |
| 536 | + * jessibuca.on("play",function(flag){console.log('play')}) | |
| 537 | + */ | |
| 538 | + on(event: 'play', callback: () => void): void; | |
| 539 | + | |
| 540 | + /** | |
| 541 | + * 触发暂停事件 | |
| 542 | + * @example | |
| 543 | + * jessibuca.on("pause",function(flag){console.log('pause')}) | |
| 544 | + */ | |
| 545 | + on(event: 'pause', callback: () => void): void; | |
| 546 | + | |
| 547 | + /** | |
| 548 | + * 触发声音事件,返回boolean值 | |
| 549 | + * @example | |
| 550 | + * jessibuca.on("mute",function(flag){console.log('is mute',flag)}) | |
| 551 | + */ | |
| 552 | + on(event: 'mute', callback: () => void): void; | |
| 553 | + | |
| 554 | + /** | |
| 555 | + * 流状态统计,流开始播放后回调,每秒1次。 | |
| 556 | + * @example | |
| 557 | + * jessibuca.on("stats",function(s){console.log("stats is",s)}) | |
| 558 | + */ | |
| 559 | + on(event: 'stats', callback: (stats: { | |
| 560 | + /** 当前缓冲区时长,单位毫秒 */ | |
| 561 | + buf: number; | |
| 562 | + /** 当前视频帧率 */ | |
| 563 | + fps: number; | |
| 564 | + /** 当前音频码率,单位byte */ | |
| 565 | + abps: number; | |
| 566 | + /** 当前视频码率,单位byte */ | |
| 567 | + vbps: number; | |
| 568 | + /** 当前视频帧pts,单位毫秒 */ | |
| 569 | + ts: number; | |
| 570 | + }) => void): void; | |
| 571 | + | |
| 572 | + /** | |
| 573 | + * 渲染性能统计,流开始播放后回调,每秒1次。 | |
| 574 | + * @param performance 0: 表示卡顿,1: 表示流畅,2: 表示非常流程 | |
| 575 | + * @example | |
| 576 | + * jessibuca.on("performance",function(performance){console.log("performance is",performance)}) | |
| 577 | + */ | |
| 578 | + on(event: 'performance', callback: (performance: 0 | 1 | 2) => void): void; | |
| 579 | + | |
| 580 | + /** | |
| 581 | + * 录制开始的事件 | |
| 582 | + | |
| 583 | + * @example | |
| 584 | + * jessibuca.on("recordStart",function(){console.log("record start")}) | |
| 585 | + */ | |
| 586 | + on(event: 'recordStart', callback: () => void): void; | |
| 587 | + | |
| 588 | + /** | |
| 589 | + * 录制结束的事件 | |
| 590 | + | |
| 591 | + * @example | |
| 592 | + * jessibuca.on("recordEnd",function(){console.log("record end")}) | |
| 593 | + */ | |
| 594 | + on(event: 'recordEnd', callback: () => void): void; | |
| 595 | + | |
| 596 | + /** | |
| 597 | + * 录制的时候,返回的录制时长,1s一次 | |
| 598 | + | |
| 599 | + * @example | |
| 600 | + * jessibuca.on("recordingTimestamp",function(timestamp){console.log("recordingTimestamp is",timestamp)}) | |
| 601 | + */ | |
| 602 | + on(event: 'recordingTimestamp', callback: (timestamp: number) => void): void; | |
| 603 | + | |
| 604 | + /** | |
| 605 | + * 监听调用play方法 经过 初始化-> 网络请求-> 解封装 -> 解码 -> 渲染 一系列过程的时间消耗 | |
| 606 | + * @param event | |
| 607 | + * @param callback | |
| 608 | + */ | |
| 609 | + on(event: 'playToRenderTimes', callback: (times: { | |
| 610 | + playInitStart: number, // 1 初始化 | |
| 611 | + playStart: number, // 2 初始化 | |
| 612 | + streamStart: number, // 3 网络请求 | |
| 613 | + streamResponse: number, // 4 网络请求 | |
| 614 | + demuxStart: number, // 5 解封装 | |
| 615 | + decodeStart: number, // 6 解码 | |
| 616 | + videoStart: number, // 7 渲染 | |
| 617 | + playTimestamp: number,// playStart- playInitStart | |
| 618 | + streamTimestamp: number,// streamStart - playStart | |
| 619 | + streamResponseTimestamp: number,// streamResponse - streamStart | |
| 620 | + demuxTimestamp: number, // demuxStart - streamResponse | |
| 621 | + decodeTimestamp: number, // decodeStart - demuxStart | |
| 622 | + videoTimestamp: number,// videoStart - decodeStart | |
| 623 | + allTimestamp: number // videoStart - playInitStart | |
| 624 | + }) => void): void | |
| 625 | + | |
| 626 | + /** | |
| 627 | + * 监听方法 | |
| 628 | + * | |
| 629 | + @example | |
| 630 | + | |
| 631 | + jessibuca.on("load",function(){console.log('load')}) | |
| 632 | + */ | |
| 633 | + on(event: string, callback: Function): void; | |
| 634 | + | |
| 635 | +} | |
| 636 | + | |
| 637 | +export default Jessibuca; | ... | ... |
| 1 | +!function(e,n){"function"==typeof define&&(define.amd||define.cmd)?define(function(){return n(e)}):n(e,!0)}(this,function(r,e){var a,c,n,i,t,s,d,o,l,u,p,f,m,g,h,S,I,y,v,_,k,w;if(!r.jWeixin)return a={config:"preVerifyJSAPI",onMenuShareTimeline:"menu:share:timeline",onMenuShareAppMessage:"menu:share:appmessage",onMenuShareQQ:"menu:share:qq",onMenuShareWeibo:"menu:share:weiboApp",onMenuShareQZone:"menu:share:QZone",previewImage:"imagePreview",getLocation:"geoLocation",openProductSpecificView:"openProductViewWithPid",addCard:"batchAddCard",openCard:"batchViewCard",chooseWXPay:"getBrandWCPayRequest",openEnterpriseRedPacket:"getRecevieBizHongBaoRequest",startSearchBeacons:"startMonitoringBeacons",stopSearchBeacons:"stopMonitoringBeacons",onSearchBeacons:"onBeaconsInRange",consumeAndShareCard:"consumedShareCard",openAddress:"editAddress"},c=function(){var e,n={};for(e in a)n[a[e]]=e;return n}(),n=r.document,i=n.title,t=navigator.userAgent.toLowerCase(),f=navigator.platform.toLowerCase(),s=!(!f.match("mac")&&!f.match("win")),d=-1!=t.indexOf("wxdebugger"),o=-1!=t.indexOf("micromessenger"),l=-1!=t.indexOf("android"),u=-1!=t.indexOf("iphone")||-1!=t.indexOf("ipad"),p=(f=t.match(/micromessenger\/(\d+\.\d+\.\d+)/)||t.match(/micromessenger\/(\d+\.\d+)/))?f[1]:"",m={initStartTime:B(),initEndTime:0,preVerifyStartTime:0,preVerifyEndTime:0},g={version:1,appId:"",initTime:0,preVerifyTime:0,networkType:"",isPreVerifyOk:1,systemType:u?1:l?2:-1,clientVersion:p,url:encodeURIComponent(location.href)},h={},S={_completes:[]},I={state:0,data:{}},L(function(){m.initEndTime=B()}),y=!1,v=[],_={config:function(e){C("config",h=e);var o=!1!==h.check;L(function(){if(o)T(a.config,{verifyJsApiList:V(h.jsApiList)},(S._complete=function(e){m.preVerifyEndTime=B(),I.state=1,I.data=e},S.success=function(e){g.isPreVerifyOk=0},S.fail=function(e){S._fail?S._fail(e):I.state=-1},(t=S._completes).push(function(){var n;s||d||h.debug||p<"6.0.2"||g.systemType<0||(n=new Image,g.appId=h.appId,g.initTime=m.initEndTime-m.initStartTime,g.preVerifyTime=m.preVerifyEndTime-m.preVerifyStartTime,_.getNetworkType({isInnerInvoke:!0,success:function(e){g.networkType=e.networkType,n.src="https://open.weixin.qq.com/sdk/report?v="+g.version+"&o="+g.isPreVerifyOk+"&s="+g.systemType+"&c="+g.clientVersion+"&a="+g.appId+"&n="+g.networkType+"&i="+g.initTime+"&p="+g.preVerifyTime+"&u="+g.url}}))}),S.complete=function(e){for(var n=0,i=t.length;n<i;++n)t[n]();S._completes=[]},S)),m.preVerifyStartTime=B();else{I.state=1;for(var e=S._completes,n=0,i=e.length;n<i;++n)e[n]();S._completes=[]}var t}),_.invoke||(_.invoke=function(e,n,i){r.WeixinJSBridge&&WeixinJSBridge.invoke(e,P(n),i)},_.on=function(e,n){r.WeixinJSBridge&&WeixinJSBridge.on(e,n)})},ready:function(e){(0!=I.state||(S._completes.push(e),!o&&h.debug))&&e()},error:function(e){p<"6.0.2"||(-1==I.state?e(I.data):S._fail=e)},checkJsApi:function(e){T("checkJsApi",{jsApiList:V(e.jsApiList)},(e._complete=function(e){l&&(i=e.checkResult)&&(e.checkResult=JSON.parse(i));var n,i=e,t=i.checkResult;for(n in t){var o=c[n];o&&(t[o]=t[n],delete t[n])}},e))},onMenuShareTimeline:function(e){M(a.onMenuShareTimeline,{complete:function(){T("shareTimeline",{title:e.title||i,desc:e.title||i,img_url:e.imgUrl||"",link:e.link||location.href,type:e.type||"link",data_url:e.dataUrl||""},e)}},e)},onMenuShareAppMessage:function(n){M(a.onMenuShareAppMessage,{complete:function(e){"favorite"===e.scene?T("sendAppMessage",{title:n.title||i,desc:n.desc||"",link:n.link||location.href,img_url:n.imgUrl||"",type:n.type||"link",data_url:n.dataUrl||""}):T("sendAppMessage",{title:n.title||i,desc:n.desc||"",link:n.link||location.href,img_url:n.imgUrl||"",type:n.type||"link",data_url:n.dataUrl||""},n)}},n)},onMenuShareQQ:function(e){M(a.onMenuShareQQ,{complete:function(){T("shareQQ",{title:e.title||i,desc:e.desc||"",img_url:e.imgUrl||"",link:e.link||location.href},e)}},e)},onMenuShareWeibo:function(e){M(a.onMenuShareWeibo,{complete:function(){T("shareWeiboApp",{title:e.title||i,desc:e.desc||"",img_url:e.imgUrl||"",link:e.link||location.href},e)}},e)},onMenuShareQZone:function(e){M(a.onMenuShareQZone,{complete:function(){T("shareQZone",{title:e.title||i,desc:e.desc||"",img_url:e.imgUrl||"",link:e.link||location.href},e)}},e)},updateTimelineShareData:function(e){T("updateTimelineShareData",{title:e.title,link:e.link,imgUrl:e.imgUrl},e)},updateAppMessageShareData:function(e){T("updateAppMessageShareData",{title:e.title,desc:e.desc,link:e.link,imgUrl:e.imgUrl},e)},startRecord:function(e){T("startRecord",{},e)},stopRecord:function(e){T("stopRecord",{},e)},onVoiceRecordEnd:function(e){M("onVoiceRecordEnd",e)},playVoice:function(e){T("playVoice",{localId:e.localId},e)},pauseVoice:function(e){T("pauseVoice",{localId:e.localId},e)},stopVoice:function(e){T("stopVoice",{localId:e.localId},e)},onVoicePlayEnd:function(e){M("onVoicePlayEnd",e)},uploadVoice:function(e){T("uploadVoice",{localId:e.localId,isShowProgressTips:0==e.isShowProgressTips?0:1},e)},downloadVoice:function(e){T("downloadVoice",{serverId:e.serverId,isShowProgressTips:0==e.isShowProgressTips?0:1},e)},translateVoice:function(e){T("translateVoice",{localId:e.localId,isShowProgressTips:0==e.isShowProgressTips?0:1},e)},chooseImage:function(e){T("chooseImage",{scene:"1|2",count:e.count||9,sizeType:e.sizeType||["original","compressed"],sourceType:e.sourceType||["album","camera"]},(e._complete=function(e){if(l){var n=e.localIds;try{n&&(e.localIds=JSON.parse(n))}catch(e){}}},e))},getLocation:function(e){e=e||{},T(a.getLocation,{type:e.type||"wgs84"},(e._complete=function(e){delete e.type},e))},previewImage:function(e){T(a.previewImage,{current:e.current,urls:e.urls},e)},uploadImage:function(e){T("uploadImage",{localId:e.localId,isShowProgressTips:0==e.isShowProgressTips?0:1},e)},downloadImage:function(e){T("downloadImage",{serverId:e.serverId,isShowProgressTips:0==e.isShowProgressTips?0:1},e)},getLocalImgData:function(e){!1===y?(y=!0,T("getLocalImgData",{localId:e.localId},(e._complete=function(e){var n;y=!1,0<v.length&&(n=v.shift(),wx.getLocalImgData(n))},e))):v.push(e)},getNetworkType:function(e){T("getNetworkType",{},(e._complete=function(e){var n=e,e=n.errMsg,i=(n.errMsg="getNetworkType:ok",n.subtype);if(delete n.subtype,i)n.networkType=i;else{var i=e.indexOf(":"),t=e.substring(i+1);switch(t){case"wifi":case"edge":case"wwan":n.networkType=t;break;default:n.errMsg="getNetworkType:fail"}}},e))},openLocation:function(e){T("openLocation",{latitude:e.latitude,longitude:e.longitude,name:e.name||"",address:e.address||"",scale:e.scale||28,infoUrl:e.infoUrl||""},e)},hideOptionMenu:function(e){T("hideOptionMenu",{},e)},showOptionMenu:function(e){T("showOptionMenu",{},e)},closeWindow:function(e){T("closeWindow",{},e=e||{})},hideMenuItems:function(e){T("hideMenuItems",{menuList:e.menuList},e)},showMenuItems:function(e){T("showMenuItems",{menuList:e.menuList},e)},hideAllNonBaseMenuItem:function(e){T("hideAllNonBaseMenuItem",{},e)},showAllNonBaseMenuItem:function(e){T("showAllNonBaseMenuItem",{},e)},scanQRCode:function(e){T("scanQRCode",{needResult:(e=e||{}).needResult||0,scanType:e.scanType||["qrCode","barCode"]},(e._complete=function(e){var n;u&&(n=e.resultStr)&&(n=JSON.parse(n),e.resultStr=n&&n.scan_code&&n.scan_code.scan_result)},e))},openAddress:function(e){T(a.openAddress,{},(e._complete=function(e){(e=e).postalCode=e.addressPostalCode,delete e.addressPostalCode,e.provinceName=e.proviceFirstStageName,delete e.proviceFirstStageName,e.cityName=e.addressCitySecondStageName,delete e.addressCitySecondStageName,e.countryName=e.addressCountiesThirdStageName,delete e.addressCountiesThirdStageName,e.detailInfo=e.addressDetailInfo,delete e.addressDetailInfo},e))},openProductSpecificView:function(e){T(a.openProductSpecificView,{pid:e.productId,view_type:e.viewType||0,ext_info:e.extInfo},e)},addCard:function(e){for(var n=e.cardList,i=[],t=0,o=n.length;t<o;++t){var r=n[t],r={card_id:r.cardId,card_ext:r.cardExt};i.push(r)}T(a.addCard,{card_list:i},(e._complete=function(e){if(n=e.card_list){for(var n,i=0,t=(n=JSON.parse(n)).length;i<t;++i){var o=n[i];o.cardId=o.card_id,o.cardExt=o.card_ext,o.isSuccess=!!o.is_succ,delete o.card_id,delete o.card_ext,delete o.is_succ}e.cardList=n,delete e.card_list}},e))},chooseCard:function(e){T("chooseCard",{app_id:h.appId,location_id:e.shopId||"",sign_type:e.signType||"SHA1",card_id:e.cardId||"",card_type:e.cardType||"",card_sign:e.cardSign,time_stamp:e.timestamp+"",nonce_str:e.nonceStr},(e._complete=function(e){e.cardList=e.choose_card_info,delete e.choose_card_info},e))},openCard:function(e){for(var n=e.cardList,i=[],t=0,o=n.length;t<o;++t){var r=n[t],r={card_id:r.cardId,code:r.code};i.push(r)}T(a.openCard,{card_list:i},e)},consumeAndShareCard:function(e){T(a.consumeAndShareCard,{consumedCardId:e.cardId,consumedCode:e.code},e)},chooseWXPay:function(e){T(a.chooseWXPay,x(e),e)},openEnterpriseRedPacket:function(e){T(a.openEnterpriseRedPacket,x(e),e)},startSearchBeacons:function(e){T(a.startSearchBeacons,{ticket:e.ticket},e)},stopSearchBeacons:function(e){T(a.stopSearchBeacons,{},e)},onSearchBeacons:function(e){M(a.onSearchBeacons,e)},openEnterpriseChat:function(e){T("openEnterpriseChat",{useridlist:e.userIds,chatname:e.groupName},e)},launchMiniProgram:function(e){T("launchMiniProgram",{targetAppId:e.targetAppId,path:function(e){var n;if("string"==typeof e&&0<e.length)return n=e.split("?")[0],n+=".html",void 0!==(e=e.split("?")[1])?n+"?"+e:n}(e.path),envVersion:e.envVersion},e)},miniProgram:{navigateBack:function(e){e=e||{},L(function(){T("invokeMiniProgramAPI",{name:"navigateBack",arg:{delta:e.delta||1}},e)})},navigateTo:function(e){L(function(){T("invokeMiniProgramAPI",{name:"navigateTo",arg:{url:e.url}},e)})},redirectTo:function(e){L(function(){T("invokeMiniProgramAPI",{name:"redirectTo",arg:{url:e.url}},e)})},switchTab:function(e){L(function(){T("invokeMiniProgramAPI",{name:"switchTab",arg:{url:e.url}},e)})},reLaunch:function(e){L(function(){T("invokeMiniProgramAPI",{name:"reLaunch",arg:{url:e.url}},e)})},postMessage:function(e){L(function(){T("invokeMiniProgramAPI",{name:"postMessage",arg:e.data||{}},e)})},getEnv:function(e){L(function(){e({miniprogram:"miniprogram"===r.__wxjs_environment})})}}},k=1,w={},n.addEventListener("error",function(e){var n,i,t;l||(t=(n=e.target).tagName,i=n.src,"IMG"!=t&&"VIDEO"!=t&&"AUDIO"!=t&&"SOURCE"!=t)||-1!=i.indexOf("wxlocalresource://")&&(e.preventDefault(),e.stopPropagation(),(t=n["wx-id"])||(t=k++,n["wx-id"]=t),w[t]||(w[t]=!0,wx.ready(function(){wx.getLocalImgData({localId:i,success:function(e){n.src=e.localData}})})))},!0),n.addEventListener("load",function(e){var n;l||(n=(e=e.target).tagName,e.src,"IMG"!=n&&"VIDEO"!=n&&"AUDIO"!=n&&"SOURCE"!=n)||(n=e["wx-id"])&&(w[n]=!1)},!0),e&&(r.wx=r.jWeixin=_),_;function T(n,e,i){r.WeixinJSBridge?WeixinJSBridge.invoke(n,P(e),function(e){A(n,e,i)}):C(n,i)}function M(n,i,t){r.WeixinJSBridge?WeixinJSBridge.on(n,function(e){t&&t.trigger&&t.trigger(e),A(n,e,i)}):C(n,t||i)}function P(e){return(e=e||{}).appId=h.appId,e.verifyAppId=h.appId,e.verifySignType="sha1",e.verifyTimestamp=h.timestamp+"",e.verifyNonceStr=h.nonceStr,e.verifySignature=h.signature,e}function x(e){return{timeStamp:e.timestamp+"",nonceStr:e.nonceStr,package:e.package,paySign:e.paySign,signType:e.signType||"SHA1"}}function A(e,n,i){"openEnterpriseChat"==e&&(n.errCode=n.err_code),delete n.err_code,delete n.err_desc,delete n.err_detail;var t=n.errMsg,e=(t||(t=n.err_msg,delete n.err_msg,t=function(e,n){var i=c[e];i&&(e=i);i="ok";{var t;n&&(t=n.indexOf(":"),"access denied"!=(i=(i=(i=-1!=(i=-1!=(i="failed"==(i="confirm"==(i=n.substring(t+1))?"ok":i)?"fail":i).indexOf("failed_")?i.substring(7):i).indexOf("fail_")?i.substring(5):i).replace(/_/g," ")).toLowerCase())&&"no permission to execute"!=i||(i="permission denied"),""==(i="config"==e&&"function not exist"==i?"ok":i))&&(i="fail")}return n=e+":"+i}(e,t),n.errMsg=t),(i=i||{})._complete&&(i._complete(n),delete i._complete),t=n.errMsg||"",h.debug&&!i.isInnerInvoke&&alert(JSON.stringify(n)),t.indexOf(":"));switch(t.substring(e+1)){case"ok":i.success&&i.success(n);break;case"cancel":i.cancel&&i.cancel(n);break;default:i.fail&&i.fail(n)}i.complete&&i.complete(n)}function V(e){if(e){for(var n=0,i=e.length;n<i;++n){var t=e[n],t=a[t];t&&(e[n]=t)}return e}}function C(e,n){var i;!h.debug||n&&n.isInnerInvoke||((i=c[e])&&(e=i),n&&n._complete&&delete n._complete,console.log('"'+e+'",',n||""))}function B(){return(new Date).getTime()}function L(e){o&&(r.WeixinJSBridge?e():n.addEventListener&&n.addEventListener("WeixinJSBridgeReady",e,!1))}}); | |
| 0 | 2 | \ No newline at end of file | ... | ... |
| 1 | +!(function () { | |
| 2 | + /** | |
| 3 | + * @param opt | |
| 4 | + * container: DOM 容器 | |
| 5 | + * contextOptions: | |
| 6 | + * videoBuffer: | |
| 7 | + * forceNoGL: | |
| 8 | + * isNotMute: | |
| 9 | + * decoder: | |
| 10 | + * @constructor | |
| 11 | + */ | |
| 12 | + function Jessibuca(opt) { | |
| 13 | + this._opt = opt; | |
| 14 | + | |
| 15 | + if (typeof opt.container === "string") { | |
| 16 | + this._opt.container = document.getElementById(opt.container); | |
| 17 | + } | |
| 18 | + if (!this._opt.container) { | |
| 19 | + throw new Error('Jessibuca need container option'); | |
| 20 | + return; | |
| 21 | + } | |
| 22 | + | |
| 23 | + this._canvasElement = document.createElement("canvas"); | |
| 24 | + this._canvasElement.style.position = "absolute"; | |
| 25 | + this._canvasElement.style.top = 0; | |
| 26 | + this._canvasElement.style.left = 0; | |
| 27 | + this._opt.container.appendChild(this._canvasElement); | |
| 28 | + this._container = this._opt.container; | |
| 29 | + this._container.style.overflow = "hidden"; | |
| 30 | + this._containerOldPostion = { | |
| 31 | + position: this._container.style.position, | |
| 32 | + top: this._container.style.top, | |
| 33 | + left: this._container.style.left, | |
| 34 | + width: this._container.style.width, | |
| 35 | + height: this._container.style.height | |
| 36 | + } | |
| 37 | + if (this._containerOldPostion.position != "absolute") { | |
| 38 | + this._container.style.position = "relative" | |
| 39 | + } | |
| 40 | + this._opt.videoBuffer = opt.videoBuffer || 0; | |
| 41 | + this._opt.text = opt.text || ''; | |
| 42 | + // | |
| 43 | + this._opt.isResize = opt.isResize === false ? opt.isResize : true; | |
| 44 | + this._opt.isFullResize = opt.isFullResize === true ? opt.isFullResize : false; | |
| 45 | + this._opt.isDebug = opt.debug === true; | |
| 46 | + this._opt.timeout = typeof opt.timeout === 'number' ? opt.timeout : 30; | |
| 47 | + this._opt.supportDblclickFullscreen = opt.supportDblclickFullscreen === true; | |
| 48 | + this._opt.showBandwidth = opt.showBandwidth === true; | |
| 49 | + this._opt.operateBtns = Object.assign({ | |
| 50 | + fullscreen: false, | |
| 51 | + screenshot: false, | |
| 52 | + play: false, | |
| 53 | + audio: false | |
| 54 | + }, opt.operateBtns || {}); | |
| 55 | + this._opt.keepScreenOn = opt.keepScreenOn === true; | |
| 56 | + | |
| 57 | + if (!opt.forceNoGL) this._initContextGL(); | |
| 58 | + this._audioContext = new (window.AudioContext || window.webkitAudioContext)(); | |
| 59 | + this._audioEnabled(true); | |
| 60 | + if (!opt.isNotMute) this._audioEnabled(false); | |
| 61 | + if (this._contextGL) { | |
| 62 | + this._initProgram(); | |
| 63 | + this._initBuffers(); | |
| 64 | + this._initTextures(); | |
| 65 | + } | |
| 66 | + this._onresize = () => this.resize(); | |
| 67 | + this._onfullscreenchange = () => this._fullscreenchange(); | |
| 68 | + window.addEventListener("resize", this._onresize); | |
| 69 | + document.addEventListener('fullscreenchange', this._onfullscreenchange); | |
| 70 | + this._decoderWorker = new Worker(opt.decoder || 'ff.js') | |
| 71 | + var _this = this; | |
| 72 | + this._hasLoaded = false; | |
| 73 | + this._stats = { | |
| 74 | + buf: 0, | |
| 75 | + fps: 0, | |
| 76 | + abps: '', | |
| 77 | + vbps: '', | |
| 78 | + ts: '' | |
| 79 | + }; | |
| 80 | + | |
| 81 | + if (this._opt.supportDblclickFullscreen) { | |
| 82 | + this._canvasElement.addEventListener('dblclick', function () { | |
| 83 | + _this.fullscreen = !_this.fullscreen; | |
| 84 | + }, false); | |
| 85 | + } | |
| 86 | + this.onPlay = noop; | |
| 87 | + this.onPause = noop; | |
| 88 | + this.onRecord = noop; | |
| 89 | + this.onFullscreen = noop; | |
| 90 | + this.onMute = noop; | |
| 91 | + this.onLoad = noop; | |
| 92 | + this.onLog = noop; | |
| 93 | + this.onError = noop; | |
| 94 | + this.onTimeUpdate = noop; | |
| 95 | + this.onInitSize = noop; | |
| 96 | + this._onMessage(); | |
| 97 | + this._initDom(); | |
| 98 | + this._initStatus(); | |
| 99 | + this._initEventListener(); | |
| 100 | + this._hideBtns(); | |
| 101 | + // | |
| 102 | + this._initWakeLock(); | |
| 103 | + this._enableWakeLock(); | |
| 104 | + }; | |
| 105 | + | |
| 106 | + function noop() { | |
| 107 | + | |
| 108 | + } | |
| 109 | + | |
| 110 | + Jessibuca.prototype._initDom = function () { | |
| 111 | + var playBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAARVJREFUSMe9laEOglAUhs+5k9lJFpsJ5QWMJoNGbEY0mEy+gr6GNo0a3SiQCegMRILzGdw4hl+Cd27KxPuXb2zA/91z2YXoGRERkX4fvN3A2QxUiv4dFM3n8jZRBLbbVfd+ubJuF4xjiCyXkksueb1uSKCIZYGLBTEx8ekEoV7PkICeVgs8HiGyXoO2bUigCDM4HoPnM7bI8wwJ6Gk0sEXbLSay30Oo2TQkoGcwgFCSQMhxDAvoETEscDiQkJC4LjMz8+XyZ4HrFYWjEQqHQ1asWGWZfmdFAsVINxuw00HhbvfpydpvxWkKTqdYaRCUfUPJCdzv4Gr1uqfli0tOIAzByUT/iCrL6+84y3Bw+D6ui5Ou+jwA8FnIO++FACgAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDCKP7wnAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAw+2IEmwAAAEl0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fZ2Y3MDBzN2IzZncvYm9mYW5nLnN2Z8fICi0AAAAASUVORK5CYII='; | |
| 112 | + var pauseBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAHVJREFUSMftkCESwCAMBEOnCtdXVMKHeC7oInkEeQJXkRoEZWraipxZc8lsQqQZBACAlIS1oqGhhTCdu3oyxyyMcdRf79c5J7SWDBky+z4173rbJvR+VF/e/qwKqIAKqMBDgZyFzAQCoZTpxq7HLDyOrw/9b07l3z4dDnI2IAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMIo/vCcAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDD7YgSbAAAASnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FkbWluL2ljb24tZm9udC90bXAvaWNvbl9nZjcwMHM3YjNmdy96YW50aW5nLnN2ZxqNZJkAAAAASUVORK5CYII='; | |
| 113 | + var screenshotBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAaxJREFUSMfNlLFOAkEQhmevAZMjR6OGRBJKsFBzdkYNpYSaWkopIOFRCBWh1ieA+ALGRgutjK0HzV2H5SX7W/zsmY3cnTEhcZovOzcz9+/s7Ir8d4OGht7fBwAgjvEri2OTl1ffSf0xAMBxRIkS1e3Se3+vcszEMe/6OqmT/aN2m1wsNu/o5YVsNHI7BgA4PCRfXzfXCwKy1RLbcXZG9nrkzc12jvT8nPU/PtatOThgAx8fuS4WyZ0de2e+T87n5OcnuVqRsxl5cpImQDnKUc7DA1fVqpimZCu+vCSjiNH9PlmpJNTQ0INBErfeafZRAakC6FWKfH9nwU7H/l6rGdqCOx3y7c3U+aOARsMMp+1vNskwTLjulB23XJL1epqA9OshIiKeJxAIoug7UyA4OuLi6Ynr52deu+NjOy4MSc9Ln8rMDpTLybBpaOjdXbJUIqdTm8a/t2fn/RSQewR24HicTLmGhnbdzcPquvYtGY3+PIR24UKBUXd35v6Sk4lN47+9NXm/FBAEedfGTjw9JYdDm76fm6+hoS8ujGAxT6L9Im7bTKeurvIEb92+AES1b6x283XSAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABJdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L2NhbWVyYS5zdmeyubWEAAAAAElFTkSuQmCC'; | |
| 114 | + var fullscreenBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAALZJREFUSMftVbsORUAQVSj8DomChvh3lU5CoSVCQq2RObeYu8XG3deVoHCak81kds7Oaz3vxRcAAMwztOg6vX9d6/3XFQQC+b7iAoFhYE7Tvx9EIFAcy/ftO3MQGAQkCfM4MmeZWyajiLnvmYuCeduMAuSzvRBVYNluFHCssSgFp7Sq9ALKkjnPf9ubRtkDL27HNT3QtsY9cAjsNAVheHIKBOwD2wpxFHDbJpwmaHH2L1iWx+2BDy8RbXXtqbRBAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABTdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L3F1YW5waW5nenVpZGFodWEuc3ZnTBoI7AAAAABJRU5ErkJggg=='; | |
| 115 | + var minScreenBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAYJJREFUSMfdVbGKwkAQnQn+geAfWBixUTsVgp3YGKxSWflVNmIjARULwc5KO40ipNHWRgs/wGLniucKa+Jd5ODuuGle5u3szGRmd5bor4iIiMhuB3Sc+HXXBdp2/Lpta7v4dccRJUrUdhtNQIkSVa3C8HwG1uumg34f2OnEB+h0tF1Sv5b+YIsttpZLEhKSdhvscPi8IXFF74GJiYnHY7Cex8zMvFgkbInjmJnv98kqoO30vmhLtaRMB60WtEbDNDudgMUiKiQSzfjOMzFxoQAyCPSfw7/nQZ/PUYnpNGV6OR6BmYzJbzYIoBQCzGaRBDQvJCTdLnTLolg5HN5t6f8V1h/oUT4PrVKJWBotmEzQw+vV3J9Ow851P2/BaoX9Yfh0BrJZYKlk8uUyHOpDeLuBHwzMBJtN2PV6IPUhXK9Nf5cLMAxfluanrmGkRBggtRo03wfq66P/6CsJAnOg+f6rgfZI4BGYiYlHIx048eR6krcnq34kkj1GuVz8+jceo9+SD5A8yGh8CTq7AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABNdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L3p1aXhpYW9odWEuc3ZnoCFr0AAAAABJRU5ErkJggg=='; | |
| 116 | + var quietBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAR9JREFUSMfVlD0LglAYhe9VkwgNihpsjbYQf4JTS7+iuaGxpcGfJjS0NFRLk2NDi6MogafhJGRIX9yEzvJwrx/nvPd9VYh/F3LkyBuN2g3J1QoAgCQhPe/Hxq5Lo+0WlfJ9dYYAgGaTDAIyy/BUnwcwWJlhcLnZkN2ugIBAuy2kkEL2ep8F73S4kjfFcfn6cMj9KLodrWVBiXyf75tMyOOR+4MBOZ8XLXzorboA5UpnM/J0Ivd7+vX7xX2asqGpVKtFXi5sqWmypXefrfIWAACmU/JwKCoun8hu9zA0uk6u13wgirg+n7+bAcsibbt6SB3n9TQXPxwAwHJJpum7M6BcDDQa0SgMaw9QPkJNIxcLMo4ZcDz+eYDqQFLWbqxKV57EtW1WtMbmAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABKdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L2ppbmd5aW4uc3ZnIlMYaQAAAABJRU5ErkJggg=='; | |
| 117 | + var playAudioBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAU5JREFUSMftkzGKwlAURf9PULBQwULSCKK1bZAgNuoaFFyAC3AdZg0uQCwshWzAShEEO7Gy0soUCu9Occ3An5nMGCfdzGsO7+Xy3/03iVL/lbAAACiVIBCI77O37Vi9QCDZbEqLm03ycEBUAoHk818v7nYpul5Jz4tf8HBKYa1mcjwmbzd8rG8NFIsU7ffk8UjmcjE3XK+RtB4G2PT75GbDeblMttumfjSKMRCGLxsQCKTReE9KIJDJxDw/SmKxiOZWWh+ntrSlre2WXRAorbTSrZapip7X66kbMKtQUFBQCENznsmQ93vqBhh5r8fO85jAcsnIrcce1yV3uxgD8zl5uZgU+dGBVlrp6GbTKRPwffaDAek45Gz2/M0AAJ0OeTol+w0rFYrOZ3K1MhNJEjEAwHF4cBA8Z8B1zcXV6msv+JMR2yaHQ1LrXx/8Z+sNRxsWcwZeb6UAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDCKP7wnAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAw+2IEmwAAAEt0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fZ2Y3MDBzN2IzZncvc2hlbmd5aW4uc3ZnFog1MQAAAABJRU5ErkJggg=='; | |
| 118 | + var recordBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAPRJREFUSMflVDEOwjAQO0e8gr2sZYVunREbD6ISfAgmkBjpC/hBEQ+AtTWD6QAI0gBlqRfLp+TiXC5n1nXgMUCS5HBoNBqj6IOMMFwuEpsNAABl6d3HihWrOJaBsuRPkGW+c929HAxuYefb6L+R0ZgkMrJYiItCnCT1sl5Y1jwXj0bNniJNJWqujfX7LyrwJh8AYDxWgulU0dPp20IFlxoODm61kpE4VnS9/puBXyPYgH7LbKY3PhwUnUw+NdC4CdW9+71UgyZspwIBB9No3O0klktxUahyx+Pz+lYG0Xzu84lXRqTqwRQAGAzns8R223gUdxZXGcAK5Hp0ClIAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDCKP7wnAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAw+2IEmwAAAE50RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fZ2Y3MDBzN2IzZncvbHV6aGlzaGlwaW4uc3Zn5Zd7GQAAAABJRU5ErkJggg=='; | |
| 119 | + var recordingBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAahJREFUSMdjYBjpgBFd4NZK+f+soQYG//T+yzFuUFUl2cApjEWM/758UZvysPDn3127GBkZGBgY/v4l6ICb9xTWsRbp6/9f9W8N44Jz5xgCGI4wfGFiIttrR/5n/3/U3KyR8rj8t0RdHS5lcAv+//yXzzhZTY1ii2FAmsGZocna+maD3GnWY62tNzbJBbDOffLkxie5eJYwa2uYMhaigzb2/zyGguPH/y9mTGKYYGlJUIMiYxDjHCen/4oMDAxznJzg4k8Z/jP+l5LCCAFCQP30Y5dfXVZWDI7/zzIs8PNjNGJ4/7/r+XNKA4rkoNZ4/lj0V9TmzUxJv0J+F+jrM3YyvPq/acsWujmA2oBkB9y4LifLxhoa+teAzYFtwtWr/8sZxBj9fHxo7oCbprJ72MqOHWNgZGBkYFy1isGGoZahTFSU0hAgOhcQnfph4P7/df9T9u1jPMn4nyHmxIn/bAzLGe7GxTHsZyj+f+zpUwYGBmmG6bQsiMr+L/v/rqlJY9Njm9889fW4lGEUxXCHwAomUgH3vxBG8c+f1WWf9P98sns3oaJ4FAAAbtWqHTT84QYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6MzU6MjMrMDg6MDBLHbvEAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjM1OjIzKzA4OjAwOkADeAAAAE50RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fcTM1YTFhNHBtY2MvbHV6aGlzaGlwaW4uc3Zn6xlv1QAAAABJRU5ErkJggg=='; | |
| 120 | + var gifBase64 = 'data:image/gif;base64,R0lGODlhgACAAKIAAP///93d3bu7u5mZmQAA/wAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBQAEACwCAAIAfAB8AAAD/0i63P4wygYqmDjrzbtflvWNZGliYXiubKuloivPLlzReD7al+7/Eh5wSFQIi8hHYBkwHUmD6CD5YTJLz49USuVYraRsZ7vtar7XnQ1Kjpoz6LRHvGlz35O4nEPP2O94EnpNc2sef1OBGIOFMId/inB6jSmPdpGScR19EoiYmZobnBCIiZ95k6KGGp6ni4wvqxilrqBfqo6skLW2YBmjDa28r6Eosp27w8Rov8ekycqoqUHODrTRvXsQwArC2NLF29UM19/LtxO5yJd4Au4CK7DUNxPebG4e7+8n8iv2WmQ66BtoYpo/dvfacBjIkITBE9DGlMvAsOIIZjIUAixliv9ixYZVtLUos5GjwI8gzc3iCGghypQqrbFsme8lwZgLZtIcYfNmTJ34WPTUZw5oRxdD9w0z6iOpO15MgTh1BTTJUKos39jE+o/KS64IFVmsFfYT0aU7capdy7at27dw48qdS7eu3bt480I02vUbX2F/JxYNDImw4GiGE/P9qbhxVpWOI/eFKtlNZbWXuzlmG1mv58+gQ4seTbq06dOoU6vGQZJy0FNlMcV+czhQ7SQmYd8eMhPs5BxVdfcGEtV3buDBXQ+fURxx8oM6MT9P+Fh6dOrH2zavc13u9JXVJb520Vp8dvC76wXMuN5Sepm/1WtkEZHDefnzR9Qvsd9+/wi8+en3X0ntYVcSdAE+UN4zs7ln24CaLagghIxBaGF8kFGoIYV+Ybghh841GIyI5ICIFoklJsigihmimJOLEbLYIYwxSgigiZ+8l2KB+Ml4oo/w8dijjcrouCORKwIpnJIjMnkkksalNeR4fuBIm5UEYImhIlsGCeWNNJphpJdSTlkml1jWeOY6TnaRpppUctcmFW9mGSaZceYopH9zkjnjUe59iR5pdapWaGqHopboaYua1qije67GJ6CuJAAAIfkEBQUABAAsCgACAFcAMAAAA/9Iutz+ML5Ag7w46z0r5WAoSp43nihXVmnrdusrv+s332dt4Tyo9yOBUJD6oQBIQGs4RBlHySSKyczVTtHoidocPUNZaZAr9F5FYbGI3PWdQWn1mi36buLKFJvojsHjLnshdhl4L4IqbxqGh4gahBJ4eY1kiX6LgDN7fBmQEJI4jhieD4yhdJ2KkZk8oiSqEaatqBekDLKztBG2CqBACq4wJRi4PZu1sA2+v8C6EJexrBAD1AOBzsLE0g/V1UvYR9sN3eR6lTLi4+TlY1wz6Qzr8u1t6FkY8vNzZTxaGfn6mAkEGFDgL4LrDDJDyE4hEIbdHB6ESE1iD4oVLfLAqPETIsOODwmCDJlv5MSGJklaS6khAQAh+QQFBQAEACwfAAIAVwAwAAAD/0i63P5LSAGrvTjrNuf+YKh1nWieIumhbFupkivPBEzR+GnnfLj3ooFwwPqdAshAazhEGUXJJIrJ1MGOUamJ2jQ9QVltkCv0XqFh5IncBX01afGYnDqD40u2z76JK/N0bnxweC5sRB9vF34zh4gjg4uMjXobihWTlJUZlw9+fzSHlpGYhTminKSepqebF50NmTyor6qxrLO0L7YLn0ALuhCwCrJAjrUqkrjGrsIkGMW/BMEPJcphLgDaABjUKNEh29vdgTLLIOLpF80s5xrp8ORVONgi8PcZ8zlRJvf40tL8/QPYQ+BAgjgMxkPIQ6E6hgkdjoNIQ+JEijMsasNY0RQix4gKP+YIKXKkwJIFF6JMudFEAgAh+QQFBQAEACw8AAIAQgBCAAAD/kg0PPowykmrna3dzXvNmSeOFqiRaGoyaTuujitv8Gx/661HtSv8gt2jlwIChYtc0XjcEUnMpu4pikpv1I71astytkGh9wJGJk3QrXlcKa+VWjeSPZHP4Rtw+I2OW81DeBZ2fCB+UYCBfWRqiQp0CnqOj4J1jZOQkpOUIYx/m4oxg5cuAaYBO4Qop6c6pKusrDevIrG2rkwptrupXB67vKAbwMHCFcTFxhLIt8oUzLHOE9Cy0hHUrdbX2KjaENzey9Dh08jkz8Tnx83q66bt8PHy8/T19vf4+fr6AP3+/wADAjQmsKDBf6AOKjS4aaHDgZMeSgTQcKLDhBYPEswoA1BBAgAh+QQFBQAEACxOAAoAMABXAAAD7Ei6vPOjyUkrhdDqfXHm4OZ9YSmNpKmiqVqykbuysgvX5o2HcLxzup8oKLQQix0UcqhcVo5ORi+aHFEn02sDeuWqBGCBkbYLh5/NmnldxajX7LbPBK+PH7K6narfO/t+SIBwfINmUYaHf4lghYyOhlqJWgqDlAuAlwyBmpVnnaChoqOkpaanqKmqKgGtrq+wsbA1srW2ry63urasu764Jr/CAb3Du7nGt7TJsqvOz9DR0tPU1TIA2ACl2dyi3N/aneDf4uPklObj6OngWuzt7u/d8fLY9PXr9eFX+vv8+PnYlUsXiqC3c6PmUUgAACH5BAUFAAQALE4AHwAwAFcAAAPpSLrc/m7IAau9bU7MO9GgJ0ZgOI5leoqpumKt+1axPJO1dtO5vuM9yi8TlAyBvSMxqES2mo8cFFKb8kzWqzDL7Xq/4LB4TC6bz1yBes1uu9uzt3zOXtHv8xN+Dx/x/wJ6gHt2g3Rxhm9oi4yNjo+QkZKTCgGWAWaXmmOanZhgnp2goaJdpKGmp55cqqusrZuvsJays6mzn1m4uRAAvgAvuBW/v8GwvcTFxqfIycA3zA/OytCl0tPPO7HD2GLYvt7dYd/ZX99j5+Pi6tPh6+bvXuTuzujxXens9fr7YPn+7egRI9PPHrgpCQAAIfkEBQUABAAsPAA8AEIAQgAAA/lIutz+UI1Jq7026h2x/xUncmD5jehjrlnqSmz8vrE8u7V5z/m5/8CgcEgsGo/IpHLJbDqf0Kh0ShBYBdTXdZsdbb/Yrgb8FUfIYLMDTVYz2G13FV6Wz+lX+x0fdvPzdn9WeoJGAYcBN39EiIiKeEONjTt0kZKHQGyWl4mZdREAoQAcnJhBXBqioqSlT6qqG6WmTK+rsa1NtaGsuEu6o7yXubojsrTEIsa+yMm9SL8osp3PzM2cStDRykfZ2tfUtS/bRd3ewtzV5pLo4eLjQuUp70Hx8t9E9eqO5Oku5/ztdkxi90qPg3x2EMpR6IahGocPCxp8AGtigwQAIfkEBQUABAAsHwBOAFcAMAAAA/9Iutz+MMo36pg4682J/V0ojs1nXmSqSqe5vrDXunEdzq2ta3i+/5DeCUh0CGnF5BGULC4tTeUTFQVONYAs4CfoCkZPjFar83rBx8l4XDObSUL1Ott2d1U4yZwcs5/xSBB7dBMBhgEYfncrTBGDW4WHhomKUY+QEZKSE4qLRY8YmoeUfkmXoaKInJ2fgxmpqqulQKCvqRqsP7WooriVO7u8mhu5NacasMTFMMHCm8qzzM2RvdDRK9PUwxzLKdnaz9y/Kt8SyR3dIuXmtyHpHMcd5+jvWK4i8/TXHff47SLjQvQLkU+fG29rUhQ06IkEG4X/Rryp4mwUxSgLL/7IqFETB8eONT6ChCFy5ItqJomES6kgAQAh+QQFBQAEACwKAE4AVwAwAAAD/0i63A4QuEmrvTi3yLX/4MeNUmieITmibEuppCu3sDrfYG3jPKbHveDktxIaF8TOcZmMLI9NyBPanFKJp4A2IBx4B5lkdqvtfb8+HYpMxp3Pl1qLvXW/vWkli16/3dFxTi58ZRcChwIYf3hWBIRchoiHiotWj5AVkpIXi4xLjxiaiJR/T5ehoomcnZ+EGamqq6VGoK+pGqxCtaiiuJVBu7yaHrk4pxqwxMUzwcKbyrPMzZG90NGDrh/JH8t72dq3IN1jfCHb3L/e5ebh4ukmxyDn6O8g08jt7tf26ybz+m/W9GNXzUQ9fm1Q/APoSWAhhfkMAmpEbRhFKwsvCsmosRIHx444PoKcIXKkjIImjTzjkQAAIfkEBQUABAAsAgA8AEIAQgAAA/VIBNz+8KlJq72Yxs1d/uDVjVxogmQqnaylvkArT7A63/V47/m2/8CgcEgsGo/IpHLJbDqf0Kh0Sj0FroGqDMvVmrjgrDcTBo8v5fCZki6vCW33Oq4+0832O/at3+f7fICBdzsChgJGeoWHhkV0P4yMRG1BkYeOeECWl5hXQ5uNIAOjA1KgiKKko1CnqBmqqk+nIbCkTq20taVNs7m1vKAnurtLvb6wTMbHsUq4wrrFwSzDzcrLtknW16tI2tvERt6pv0fi48jh5h/U6Zs77EXSN/BE8jP09ZFA+PmhP/xvJgAMSGBgQINvEK5ReIZhQ3QEMTBLAAAh+QQFBQAEACwCAB8AMABXAAAD50i6DA4syklre87qTbHn4OaNYSmNqKmiqVqyrcvBsazRpH3jmC7yD98OCBF2iEXjBKmsAJsWHDQKmw571l8my+16v+CweEwum8+hgHrNbrvbtrd8znbR73MVfg838f8BeoB7doN0cYZvaIuMjY6PkJGSk2gClgJml5pjmp2YYJ6dX6GeXaShWaeoVqqlU62ir7CXqbOWrLafsrNctjIDwAMWvC7BwRWtNsbGFKc+y8fNsTrQ0dK3QtXAYtrCYd3eYN3c49/a5NVj5eLn5u3s6e7x8NDo9fbL+Mzy9/T5+tvUzdN3Zp+GBAAh+QQJBQAEACwCAAIAfAB8AAAD/0i63P4wykmrvTjrzbv/YCiOZGmeaKqubOu+cCzPdArcQK2TOL7/nl4PSMwIfcUk5YhUOh3M5nNKiOaoWCuWqt1Ou16l9RpOgsvEMdocXbOZ7nQ7DjzTaeq7zq6P5fszfIASAYUBIYKDDoaGIImKC4ySH3OQEJKYHZWWi5iZG0ecEZ6eHEOio6SfqCaqpaytrpOwJLKztCO2jLi1uoW8Ir6/wCHCxMG2x7muysukzb230M6H09bX2Nna29zd3t/g4cAC5OXm5+jn3Ons7eba7vHt2fL16tj2+QL0+vXw/e7WAUwnrqDBgwgTKlzIsKHDh2gGSBwAccHEixAvaqTYcFCjRoYeNyoM6REhyZIHT4o0qPIjy5YTTcKUmHImx5cwE85cmJPnSYckK66sSAAj0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gwxZJAAA7'; | |
| 121 | + var playBigBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwEAYAAAAHkiXEAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAByBJREFUeNrlXFlIVV0U3vsaaINmZoX0YAR6y8oGMkKLoMESSjBoUJEoIogoIggigoryIQoKGqi3Roh6TKGBIkNEe6hMgzTNKLPSUlMrNdvrf/juurlP5zpc7znb+r+X755pn7W+Pe+9zpVimIEUKVKJiUIKKWRqKs5OmwZOTBQkSFBUFK5HR+tPt7WBOzpwX3U1jquqwGVleK6iQkoppSQy7a8xEBERLVwIPnsWXF9PrqCxEXzxInjpUrDH47YO0h2hw8JwtG4deN8+8OzZA0vl7Vt/iZZCCtnUhPPt7fp9o0fjvpgYHHu9uD8+Hsdsh52hggTV1uLg2DHwpUvSIz3S093ttE4hB5qSxYuRAc+f910im5vBFy6As7LALORQ7RgzBullZIBPngQ3NPRt1+vXeH7NGtN69u8oERFFRIDPnQMrZe8YZ0huLhwMDzdjb1gYC4zj4uKAeaFIkbpxAwfWvse48FOngp89s7eeS1p2Nlg63vQF7Y8iRWrlSthZXR2wZhAR0dy55gwlIqI5c8AfPtgbeuUKHIqKMi3soP3z1UzwiRP2NbqtDbxsmXuGacK3tOgG/fwJ3rbNtIDO+J2ZiQzp6ND97uzE+RUrHDaAmxprif/+HQasXm1aKKcBPxcsADc1/VEjFClS8+eH7oXcuSpSpJ480V/Y0wPOyjItjNtgofWmiPHuHa7Hxg79RUT0e1Rjxb/X1ASnDw9vf/3S9bl1K/iEFSlSixbZdz7Xr5t2fLgBuuTn2xfUjRsHmVBYGNg6gWpo+FtHNU4DuowYAZ3Ky+11GzOm/4SIiGjDBvuczM52zAHua4iI6OpVcGEheO1a8PCdP/j9CNRyKFKk9u4doBDWCRXXBOcE0GekgVBUhPuSk00LPTAdCwp0+3n0GBER4AFenbQiJ8cdg7dvpwGB5xunT4PHjTMtuL0/qan29q9fH+AB62jnyxe31moGlwFWNDbCzq1bcez+snLffr14odtrMzrCBet6/Pnz7hoabAZY8fgxT5iGRwbs36/b19kJHjnS49+BEkIIMXmy/vjt26YdCA4pKdgHKC2Fo5cvh2xiFBTu3NGPw8Ox/5CW5tG3/hi8VffokRmDQwUeNOTlwc/KSmRIbq67djx9Cm5p+W2akEKmpfnaSt5zZdTXY8+0udmQcg5h0iQwD3MfPgRPn+7UG6GjUjiqrNSver0eVIWEBP85EiSIN7H/dSxZAuY1roMHHRt02OqamOhrgnoN46SQQn76ZFoad8Hj8kOH4D/PZJOSQvYKW11jYnxNkHWK3NFhWhKz8HrB9+7xaCU06fYKIiBBgiIjfRlgHTf/j+NlNMTFgceOHXJSJEgQ9wXCVyOk9AlvLfEDWDT6X+DAAXSiHz8OOSkppJCRkfrJ9vYR+NHaql8wNV42jVevUFJ37kQ8kHX8PlRMmOD/SYIEtbZ69IAkvsATs38dP36ADx8GJyc7IzyD+xbhqxE1Nb4a8PKlfiE+HsOxyEgYZI1A+9tRUADetQtNTF2dU29CJ84Twhkz9KtVVb4+oKxMvxAWxjM101KFBvX1qNmbNkHwNWucFl4HT/QmTvSfIkGCSks9HC2MsxxzyTekp5uWLjh0dYHz88FeL2ry5ctm7LHq2NMD7rXUg6rC0cKM9+/BfQS1hghDXg1VpEjdvasvLpqHf3VWs/P+/QA3Lltm75jz8T7BZQAvn9tscJgWXpEiNWuWvd2bNwcQwONbnq6p0R8oLnYnA7Zs6Vvw7m7Yd/z4gDe5DQH2Xrum29/SwoObfh7cts1egFWrnDU4Lg785g2Ytx4LC2H4zJmmhe3XD5+dsJsD1xhHjgwwgfBwPFBXpydQXe3uFqXzfU9o7ZUSXFRkX/IHMcENGKXgixY27fBwA8TZudO+5dixY4gJ37xpyQVfvEtmpmnHTQMFMiUFevBeL6OkZMg1GQlER4P5wwTGt29g65bmvw/4HShanD+5mjIlxC+cNw/cKxqYw7RDHZY9TOEXXpEiVVurC8+jtJUrnTNAkSK1fDle2NWlG9DeDs7IMC2UM35zU2Mt8Urhel6eywalp+vCMzhM++hRDlo1LeCg/dNGNdy5Wtt4LvEuCv+HodqHCu/e2Y8Cyss5aNW0sAPzh8fx1uEkgyMGHWxqgjM8NhYGWoNSraMnvm6+89aXDHjmap1AMUpKcD9/+D2MAYNzcsD9fRDNsZMcwsedfehiPJFeUhJ4925wWVnfdvFHiDt2gEM/MXT+rwp47UMKKeT27Ti7Zw+YA6UCgbdKKyr8cTVSSCEbG3Ge/5yDwWtD48fjfv6rAl7C6LUeb4uvX8FnzuD5U6ewjP35s9M6uQaUJP4Qgz8E4SbJ2sk5BV5jevAAvHmzqS9/hs0XJxBi1CgOWtVjVnlHKSEB16Oj/wgoE0L8LsFcM169AldV8Q4UjouKULKtNch9/AdsEf6XQYgIsAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMS0wMS0xMlQxMTo1NjowNSswODowMGcMj/QAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjEtMDEtMTJUMTE6NTY6MDUrMDg6MDAWUTdIAAAASXRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FkbWluL2ljb24tZm9udC90bXAvaWNvbl9wZHMzeWYxNGczYi9ib2Zhbmcuc3Zn11us5wAAAABJRU5ErkJggg=='; | |
| 122 | + | |
| 123 | + function _setStyle(dom, cssObj) { | |
| 124 | + Object.keys(cssObj).forEach(function (key) { | |
| 125 | + dom.style[key] = cssObj[key]; | |
| 126 | + }) | |
| 127 | + } | |
| 128 | + | |
| 129 | + var doms = {}; | |
| 130 | + | |
| 131 | + var fragment = document.createDocumentFragment(); | |
| 132 | + var btnWrap = document.createElement('div'); | |
| 133 | + var control1 = document.createElement('div'); | |
| 134 | + var control2 = document.createElement('div'); | |
| 135 | + var textDom = document.createElement('div'); | |
| 136 | + var speedDom = document.createElement('div'); | |
| 137 | + var playDom = document.createElement('div'); | |
| 138 | + var playBigDom = document.createElement('div'); | |
| 139 | + var pauseDom = document.createElement('div'); | |
| 140 | + var screenshotsDom = document.createElement('div'); | |
| 141 | + var fullscreenDom = document.createElement('div'); | |
| 142 | + var minScreenDom = document.createElement('div'); | |
| 143 | + var loadingDom = document.createElement('div'); | |
| 144 | + var loadingTextDom = document.createElement('div'); | |
| 145 | + var quietAudioDom = document.createElement('div'); | |
| 146 | + var playAudioDom = document.createElement('div'); | |
| 147 | + var recordDom = document.createElement('div'); | |
| 148 | + var recordingDom = document.createElement('div'); | |
| 149 | + var bgDom = document.createElement('div'); | |
| 150 | + | |
| 151 | + loadingTextDom.innerText = this._opt.loadingText || ''; | |
| 152 | + textDom.innerText = this._opt.text || ''; | |
| 153 | + speedDom.innerText = ''; | |
| 154 | + playDom.title = '播放'; | |
| 155 | + pauseDom.title = '暂停'; | |
| 156 | + screenshotsDom.title = '截屏'; | |
| 157 | + fullscreenDom.title = '全屏'; | |
| 158 | + minScreenDom.title = '退出全屏'; | |
| 159 | + quietAudioDom.title = '静音'; | |
| 160 | + playAudioDom.title = '取消静音'; | |
| 161 | + recordDom.title = '录制'; | |
| 162 | + recordingDom.title = '取消录制'; | |
| 163 | + | |
| 164 | + var wrapStyle = { | |
| 165 | + height: '38px', | |
| 166 | + zIndex: 11, | |
| 167 | + position: 'absolute', | |
| 168 | + left: 0, | |
| 169 | + bottom: 0, | |
| 170 | + width: '100%', | |
| 171 | + background: 'rgba(0,0,0)' | |
| 172 | + }; | |
| 173 | + | |
| 174 | + var bgStyle = { | |
| 175 | + position: 'absolute', | |
| 176 | + width: '100%', | |
| 177 | + height: '100%', | |
| 178 | + }; | |
| 179 | + | |
| 180 | + if (this._opt.background) { | |
| 181 | + bgStyle = Object.assign({}, bgStyle, { | |
| 182 | + backgroundRepeat: "no-repeat", | |
| 183 | + backgroundPosition: "center", | |
| 184 | + backgroundSize: '100%', | |
| 185 | + backgroundImage: "url('" + this._opt.background + "')" | |
| 186 | + }) | |
| 187 | + } | |
| 188 | + | |
| 189 | + // | |
| 190 | + var loadingStyle = { | |
| 191 | + position: 'absolute', | |
| 192 | + width: '100%', | |
| 193 | + height: '100%', | |
| 194 | + textAlign: 'center', | |
| 195 | + color: "#fff", | |
| 196 | + display: 'none', | |
| 197 | + backgroundImage: "url('" + gifBase64 + "')", | |
| 198 | + backgroundRepeat: "no-repeat", | |
| 199 | + backgroundPosition: "center", | |
| 200 | + backgroundSize: "40px 40px", | |
| 201 | + }; | |
| 202 | + | |
| 203 | + var playBigStyle = { | |
| 204 | + position: 'absolute', | |
| 205 | + width: '100%', | |
| 206 | + height: '100%', | |
| 207 | + display: 'none', | |
| 208 | + background: 'rgba(0,0,0,0.4)', | |
| 209 | + backgroundImage: "url('" + playBigBase64 + "')", | |
| 210 | + backgroundRepeat: "no-repeat", | |
| 211 | + backgroundPosition: "center", | |
| 212 | + backgroundSize: "48px 48px", | |
| 213 | + cursor: "pointer" | |
| 214 | + }; | |
| 215 | + | |
| 216 | + var loadingTextStyle = { | |
| 217 | + position: 'absolute', | |
| 218 | + width: "100%", | |
| 219 | + top: '60%', | |
| 220 | + textAlign: 'center', | |
| 221 | + } | |
| 222 | + var controlStyle = { | |
| 223 | + position: 'absolute', | |
| 224 | + top: 0, | |
| 225 | + height: '100%', | |
| 226 | + display: 'flex', | |
| 227 | + alignItems: 'center', | |
| 228 | + }; | |
| 229 | + var styleObj = { | |
| 230 | + display: 'none', | |
| 231 | + position: 'relative', | |
| 232 | + fontSize: '13px', | |
| 233 | + color: '#fff', | |
| 234 | + lineHeight: '20px', | |
| 235 | + marginLeft: '5px', | |
| 236 | + marginRight: '5px', | |
| 237 | + userSelect: 'none' | |
| 238 | + }; | |
| 239 | + var styleObj2 = { | |
| 240 | + display: 'none', | |
| 241 | + position: 'relative', | |
| 242 | + width: '16px', | |
| 243 | + height: '16px', | |
| 244 | + marginLeft: '8px', | |
| 245 | + marginRight: '8px', | |
| 246 | + backgroundRepeat: "no-repeat", | |
| 247 | + backgroundPosition: "center", | |
| 248 | + backgroundSize: '100%', | |
| 249 | + cursor: 'pointer', | |
| 250 | + }; | |
| 251 | + _setStyle(bgDom, bgStyle); | |
| 252 | + _setStyle(btnWrap, wrapStyle); | |
| 253 | + _setStyle(loadingDom, loadingStyle); | |
| 254 | + _setStyle(playBigDom, playBigStyle); | |
| 255 | + _setStyle(loadingTextDom, loadingTextStyle); | |
| 256 | + _setStyle(control1, Object.assign({}, controlStyle, { | |
| 257 | + left: 0 | |
| 258 | + })); | |
| 259 | + _setStyle(control2, Object.assign({}, controlStyle, { | |
| 260 | + right: 0 | |
| 261 | + })); | |
| 262 | + _setStyle(textDom, styleObj); | |
| 263 | + _setStyle(speedDom, styleObj); | |
| 264 | + _setStyle(playDom, Object.assign({}, styleObj2, { | |
| 265 | + backgroundImage: "url('" + playBase64 + "')", | |
| 266 | + })); | |
| 267 | + | |
| 268 | + _setStyle(pauseDom, Object.assign({}, styleObj2, { | |
| 269 | + backgroundImage: "url('" + pauseBase64 + "')" | |
| 270 | + })); | |
| 271 | + | |
| 272 | + _setStyle(screenshotsDom, Object.assign({}, styleObj2, { | |
| 273 | + backgroundImage: "url('" + screenshotBase64 + "')" | |
| 274 | + })); | |
| 275 | + | |
| 276 | + _setStyle(fullscreenDom, Object.assign({}, styleObj2, { | |
| 277 | + backgroundImage: "url('" + fullscreenBase64 + "')" | |
| 278 | + })); | |
| 279 | + | |
| 280 | + _setStyle(minScreenDom, Object.assign({}, styleObj2, { | |
| 281 | + backgroundImage: "url('" + minScreenBase64 + "')" | |
| 282 | + })); | |
| 283 | + | |
| 284 | + _setStyle(quietAudioDom, Object.assign({}, styleObj2, { | |
| 285 | + backgroundImage: "url('" + quietBase64 + "')" | |
| 286 | + })); | |
| 287 | + | |
| 288 | + _setStyle(playAudioDom, Object.assign({}, styleObj2, { | |
| 289 | + backgroundImage: "url('" + playAudioBase64 + "')" | |
| 290 | + })); | |
| 291 | + | |
| 292 | + _setStyle(recordDom, Object.assign({}, styleObj2, { | |
| 293 | + backgroundImage: "url('" + recordBase64 + "')" | |
| 294 | + })); | |
| 295 | + | |
| 296 | + _setStyle(recordingDom, Object.assign({}, styleObj2, { | |
| 297 | + backgroundImage: "url('" + recordingBase64 + "')" | |
| 298 | + })); | |
| 299 | + | |
| 300 | + loadingDom.appendChild(loadingTextDom); | |
| 301 | + if (this._opt.text) { | |
| 302 | + control1.appendChild(textDom); | |
| 303 | + doms.textDom = textDom; | |
| 304 | + } | |
| 305 | + if (this._opt.showBandwidth) { | |
| 306 | + control1.appendChild(speedDom); | |
| 307 | + doms.speedDom = speedDom; | |
| 308 | + } | |
| 309 | + | |
| 310 | + // record | |
| 311 | + //control2.appendChild(recordingDom); | |
| 312 | + //control2.appendChild(recordDom); | |
| 313 | + | |
| 314 | + // screenshots | |
| 315 | + if (this._opt.operateBtns.screenshot) { | |
| 316 | + control2.appendChild(screenshotsDom); | |
| 317 | + doms.screenshotsDom = screenshotsDom; | |
| 318 | + } | |
| 319 | + | |
| 320 | + // play stop | |
| 321 | + if (this._opt.operateBtns.play) { | |
| 322 | + control2.appendChild(playDom); | |
| 323 | + control2.appendChild(pauseDom); | |
| 324 | + doms.playDom = playDom; | |
| 325 | + doms.pauseDom = pauseDom; | |
| 326 | + } | |
| 327 | + | |
| 328 | + // audio | |
| 329 | + if (this._opt.operateBtns.audio) { | |
| 330 | + control2.appendChild(playAudioDom); | |
| 331 | + control2.appendChild(quietAudioDom); | |
| 332 | + doms.playAudioDom = playAudioDom; | |
| 333 | + doms.quietAudioDom = quietAudioDom; | |
| 334 | + } | |
| 335 | + | |
| 336 | + // fullscreen | |
| 337 | + if (this._opt.operateBtns.fullscreen) { | |
| 338 | + control2.appendChild(fullscreenDom); | |
| 339 | + control2.appendChild(minScreenDom); | |
| 340 | + doms.fullscreenDom = fullscreenDom; | |
| 341 | + doms.minScreenDom = minScreenDom; | |
| 342 | + } | |
| 343 | + | |
| 344 | + btnWrap.appendChild(control1); | |
| 345 | + btnWrap.appendChild(control2); | |
| 346 | + | |
| 347 | + fragment.appendChild(bgDom); | |
| 348 | + doms.bgDom = bgDom; | |
| 349 | + fragment.appendChild(loadingDom); | |
| 350 | + doms.loadingDom = loadingDom; | |
| 351 | + if (this._showControl()) { | |
| 352 | + fragment.appendChild(btnWrap); | |
| 353 | + } | |
| 354 | + if (this._opt.operateBtns.play) { | |
| 355 | + fragment.appendChild(playBigDom); | |
| 356 | + doms.playBigDom = playBigDom; | |
| 357 | + } | |
| 358 | + this._container.appendChild(fragment); | |
| 359 | + this._doms = doms; | |
| 360 | + }; | |
| 361 | + | |
| 362 | + Jessibuca.prototype._initWakeLock = function () { | |
| 363 | + this._wakeLock = null; | |
| 364 | + var _this = this; | |
| 365 | + var handleWakeLock = () => { | |
| 366 | + if (this._wakeLock !== null && "visible" === document.visibilityState) { | |
| 367 | + _this._enableWakeLock(); | |
| 368 | + } | |
| 369 | + }; | |
| 370 | + | |
| 371 | + document.addEventListener('visibilitychange', handleWakeLock); | |
| 372 | + document.addEventListener('fullscreenchange', handleWakeLock); | |
| 373 | + }; | |
| 374 | + | |
| 375 | + Jessibuca.prototype._enableWakeLock = function () { | |
| 376 | + if (this._opt.keepScreenOn) { | |
| 377 | + if ("wakeLock" in navigator) { | |
| 378 | + var _this = this; | |
| 379 | + navigator.wakeLock.request("screen").then((lock) => { | |
| 380 | + _this._wakeLock = lock; | |
| 381 | + _this._wakeLock.addEventListener('release', function () { | |
| 382 | + }); | |
| 383 | + }) | |
| 384 | + } | |
| 385 | + } | |
| 386 | + }; | |
| 387 | + | |
| 388 | + | |
| 389 | + Jessibuca.prototype._initGainNode = function () { | |
| 390 | + var gainNode = this._audioContext.createGain(); | |
| 391 | + var _this = this; | |
| 392 | + var source; | |
| 393 | + if (!navigator.mediaDevices.getUserMedia) { | |
| 394 | + console.log('getUserMedia not supported on your browser!'); | |
| 395 | + return; | |
| 396 | + } | |
| 397 | + | |
| 398 | + navigator.mediaDevices.getUserMedia( | |
| 399 | + // constraints - only audio needed for this app | |
| 400 | + { | |
| 401 | + audio: true | |
| 402 | + }, | |
| 403 | + | |
| 404 | + // Success callback | |
| 405 | + function (stream) { | |
| 406 | + source = _this._audioContext.createMediaStreamSource(stream); | |
| 407 | + source.connect(gainNode); | |
| 408 | + gainNode.connect(_this._audioContext.destination); | |
| 409 | + _this._gainNode = gainNode; | |
| 410 | + }, | |
| 411 | + | |
| 412 | + // Error callback | |
| 413 | + function (err) { | |
| 414 | + console.log('The following gUM error occurred: ' + err); | |
| 415 | + } | |
| 416 | + ); | |
| 417 | + }; | |
| 418 | + | |
| 419 | + Jessibuca.prototype._showControl = function () { | |
| 420 | + var result = false; | |
| 421 | + | |
| 422 | + var hasBtnShow = false; | |
| 423 | + Object.keys(this._opt.operateBtns).forEach((key) => { | |
| 424 | + if (this._opt.operateBtns[key]) { | |
| 425 | + hasBtnShow = true; | |
| 426 | + } | |
| 427 | + }); | |
| 428 | + | |
| 429 | + if (this._opt.showBandwidth || this._opt.text || hasBtnShow) { | |
| 430 | + result = true; | |
| 431 | + } | |
| 432 | + | |
| 433 | + return result; | |
| 434 | + }; | |
| 435 | + | |
| 436 | + Jessibuca.prototype._onMessage = function () { | |
| 437 | + var _this = this; | |
| 438 | + this._decoderWorker.onmessage = function (event) { | |
| 439 | + var msg = event.data; | |
| 440 | + switch (msg.cmd) { | |
| 441 | + case "init": | |
| 442 | + _this._opt.isDebug && console.log("decoder worker init") | |
| 443 | + _this.setBufferTime(_this._opt.videoBuffer); | |
| 444 | + if (!_this._hasLoaded) { | |
| 445 | + _this._opt.isDebug && console.log("has loaded"); | |
| 446 | + _this._hasLoaded = true; | |
| 447 | + _this.onLoad(); | |
| 448 | + _this._trigger('load'); | |
| 449 | + } | |
| 450 | + break | |
| 451 | + case "initSize": | |
| 452 | + _this._canvasElement.width = msg.w; | |
| 453 | + _this._canvasElement.height = msg.h; | |
| 454 | + _this.onInitSize(); | |
| 455 | + _this.resize(); | |
| 456 | + _this._trigger('videoInfo', {w: msg.w, h: msg.h}); | |
| 457 | + if (_this.isWebGL()) { | |
| 458 | + | |
| 459 | + } else { | |
| 460 | + _this._initRGB(msg.w, msg.h) | |
| 461 | + } | |
| 462 | + break | |
| 463 | + case "render": | |
| 464 | + if (_this._contextGL) { | |
| 465 | + _this._drawNextOutputPictureGL(msg.output); | |
| 466 | + } else { | |
| 467 | + _this._drawNextOutputPictureRGBA(msg.buffer); | |
| 468 | + } | |
| 469 | + if (_this.loading) { | |
| 470 | + _this.loading = false; | |
| 471 | + _this.playing = true; | |
| 472 | + _this._opt.isDebug && console.log("clear check loading timeout"); | |
| 473 | + _this._clearCheckLoading(); | |
| 474 | + } | |
| 475 | + _this._trigger('timeUpdate', msg.ts); | |
| 476 | + _this.onTimeUpdate(msg.ts); | |
| 477 | + _this._updateStats({bps: msg.bps, ts: msg.ts}); | |
| 478 | + _this._checkHeart(); | |
| 479 | + break | |
| 480 | + case "initAudio": | |
| 481 | + _this._initAudioPlay(msg.frameCount, msg.samplerate, msg.channels) | |
| 482 | + _this._trigger('audioInfo', { | |
| 483 | + numOfChannels: msg.channels, // 声频通道 | |
| 484 | + length: msg.frameCount, // 帧数 | |
| 485 | + sampleRate: msg.samplerate // 采样率 | |
| 486 | + }); | |
| 487 | + break | |
| 488 | + case "playAudio": | |
| 489 | + _this._playAudio(msg.buffer) | |
| 490 | + break | |
| 491 | + case "print": | |
| 492 | + _this.onLog(msg.text) | |
| 493 | + this._trigger('log', msg.text); | |
| 494 | + _this._opt.isDebug && console.log(msg.text); | |
| 495 | + break | |
| 496 | + case "printErr": | |
| 497 | + _this.onLog(msg.text); | |
| 498 | + this._trigger('log', msg.text); | |
| 499 | + _this.onError(msg.text); | |
| 500 | + this._trigger('error', msg.text); | |
| 501 | + _this._opt.isDebug && console.error(msg.text); | |
| 502 | + break; | |
| 503 | + case "initAudioPlanar": | |
| 504 | + _this._initAudioPlanar(msg); | |
| 505 | + _this._trigger('audioInfo', { | |
| 506 | + numOfChannels: msg.channels, // 声频通道 | |
| 507 | + length: undefined, // 帧数 | |
| 508 | + sampleRate: msg.samplerate // 采样率 | |
| 509 | + }); | |
| 510 | + break; | |
| 511 | + default: | |
| 512 | + _this._opt.isDebug && console.log(msg); | |
| 513 | + _this[msg.cmd](msg) | |
| 514 | + } | |
| 515 | + }; | |
| 516 | + }; | |
| 517 | + | |
| 518 | + Jessibuca.prototype._initEventListener = function () { | |
| 519 | + var _this = this; | |
| 520 | + | |
| 521 | + this._doms.playDom && this._doms.playDom.addEventListener('click', function (e) { | |
| 522 | + e.stopPropagation(); | |
| 523 | + _this.play(); | |
| 524 | + }, false); | |
| 525 | + | |
| 526 | + this._doms.playBigDom && this._doms.playBigDom.addEventListener('click', function (e) { | |
| 527 | + e.stopPropagation(); | |
| 528 | + _this.play(); | |
| 529 | + }, false); | |
| 530 | + | |
| 531 | + this._doms.pauseDom && this._doms.pauseDom.addEventListener('click', function (e) { | |
| 532 | + e.stopPropagation(); | |
| 533 | + _this.pause(); | |
| 534 | + }, false); | |
| 535 | + | |
| 536 | + // screenshots | |
| 537 | + this._doms.screenshotsDom && this._doms.screenshotsDom.addEventListener('click', function (e) { | |
| 538 | + e.stopPropagation(); | |
| 539 | + var filename = _this._opt.text + '' + _now(); | |
| 540 | + _this._screenshot(filename); | |
| 541 | + }, false); | |
| 542 | + // | |
| 543 | + this._doms.fullscreenDom && this._doms.fullscreenDom.addEventListener('click', function (e) { | |
| 544 | + e.stopPropagation(); | |
| 545 | + _this.fullscreen = true; | |
| 546 | + }, false); | |
| 547 | + // | |
| 548 | + this._doms.minScreenDom && this._doms.minScreenDom.addEventListener('click', function (e) { | |
| 549 | + e.stopPropagation(); | |
| 550 | + _this.fullscreen = false; | |
| 551 | + }, false); | |
| 552 | + // | |
| 553 | + this._doms.recordDom && this._doms.recordDom.addEventListener('click', function (e) { | |
| 554 | + e.stopPropagation(); | |
| 555 | + _this.recording = true; | |
| 556 | + }, false); | |
| 557 | + // | |
| 558 | + this._doms.recordingDom && this._doms.recordingDom.addEventListener('click', function (e) { | |
| 559 | + e.stopPropagation(); | |
| 560 | + _this.recording = false; | |
| 561 | + }, false); | |
| 562 | + | |
| 563 | + this._doms.quietAudioDom && this._doms.quietAudioDom.addEventListener('click', function (e) { | |
| 564 | + e.stopPropagation(); | |
| 565 | + _this.cancelMute(); | |
| 566 | + }, false); | |
| 567 | + | |
| 568 | + this._doms.playAudioDom && this._doms.playAudioDom.addEventListener('click', function (e) { | |
| 569 | + e.stopPropagation(); | |
| 570 | + _this.mute(); | |
| 571 | + }, false); | |
| 572 | + }; | |
| 573 | + /** | |
| 574 | + * set debug | |
| 575 | + * @param flag | |
| 576 | + */ | |
| 577 | + Jessibuca.prototype.setDebug = function (flag) { | |
| 578 | + this._opt.isDebug = !!flag; | |
| 579 | + }; | |
| 580 | + /** | |
| 581 | + * mute | |
| 582 | + */ | |
| 583 | + Jessibuca.prototype.mute = function () { | |
| 584 | + this._audioEnabled(false); | |
| 585 | + this.quieting = true; | |
| 586 | + }; | |
| 587 | + | |
| 588 | + /** | |
| 589 | + * cancel mute | |
| 590 | + */ | |
| 591 | + Jessibuca.prototype.cancelMute = function () { | |
| 592 | + this._audioEnabled(true); | |
| 593 | + this.quieting = false; | |
| 594 | + }; | |
| 595 | + | |
| 596 | + /** | |
| 597 | + * 设置旋转角度 | |
| 598 | + */ | |
| 599 | + Jessibuca.prototype.setRotate = function (deg) { | |
| 600 | + | |
| 601 | + }; | |
| 602 | + | |
| 603 | + Jessibuca.prototype._initStatus = function () { | |
| 604 | + this._loading = true; | |
| 605 | + this.loading = true; | |
| 606 | + this._recording = false; | |
| 607 | + this.recording = false; | |
| 608 | + this._playing = false; | |
| 609 | + this.playing = false; | |
| 610 | + this._quieting = this._opt.isNotMute ? false : true; | |
| 611 | + this.quieting = this._opt.isNotMute ? false : true; | |
| 612 | + this._fullscreen = false; | |
| 613 | + this.fullscreen = false; | |
| 614 | + } | |
| 615 | + | |
| 616 | + Jessibuca.prototype._initBtns = function () { | |
| 617 | + // show | |
| 618 | + _domToggle(this._doms.pauseDom, true); | |
| 619 | + _domToggle(this._doms.screenshotsDom, true); | |
| 620 | + _domToggle(this._doms.fullscreenDom, true); | |
| 621 | + _domToggle(this._doms.quietAudioDom, true); | |
| 622 | + _domToggle(this._doms.textDom, true); | |
| 623 | + _domToggle(this._doms.speedDom, true); | |
| 624 | + _domToggle(this._doms.recordDom, true); | |
| 625 | + // hide | |
| 626 | + _domToggle(this._doms.loadingDom, false); | |
| 627 | + _domToggle(this._doms.playDom, false); | |
| 628 | + _domToggle(this._doms.playBigDom, false); | |
| 629 | + _domToggle(this._doms.bgDom, false); | |
| 630 | + }; | |
| 631 | + | |
| 632 | + Jessibuca.prototype._hideBtns = function () { | |
| 633 | + var _this = this; | |
| 634 | + Object.keys(this._doms).forEach(function (dom) { | |
| 635 | + if (dom !== 'bgDom') { | |
| 636 | + _domToggle(_this._doms[dom], false); | |
| 637 | + } | |
| 638 | + }) | |
| 639 | + }; | |
| 640 | + | |
| 641 | + function _checkFull() { | |
| 642 | + var isFull = document.fullscreenElement || window.webkitFullscreenElement || document.msFullscreenElement; | |
| 643 | + if (isFull === undefined) isFull = false; | |
| 644 | + return !!isFull; | |
| 645 | + } | |
| 646 | + | |
| 647 | + Jessibuca.prototype._updateStats = function (options) { | |
| 648 | + options = options || {}; | |
| 649 | + | |
| 650 | + if (!this._startBpsTime) { | |
| 651 | + this._startBpsTime = _now(); | |
| 652 | + } | |
| 653 | + var _nowTime = _now(); | |
| 654 | + var timestamp = _nowTime - this._startBpsTime; | |
| 655 | + | |
| 656 | + if (timestamp < 1 * 1000) { | |
| 657 | + this._bps += (options.bps || 0); | |
| 658 | + this._stats.fps += 1; | |
| 659 | + this._stats.vbps += parseInt((options.bps || 0)); | |
| 660 | + return; | |
| 661 | + } | |
| 662 | + this._stats.ts = options.ts; | |
| 663 | + this._doms.speedDom && (this._doms.speedDom.innerText = _bpsSize(this._bps)); | |
| 664 | + this._trigger('bps', this._bps); | |
| 665 | + this._trigger('stats', this._stats); | |
| 666 | + this._trigger('performance', _fpsStatus(this._stats.fps)); | |
| 667 | + this._bps = 0; | |
| 668 | + this._stats.fps = 0; | |
| 669 | + this._stats.vbps = 0; | |
| 670 | + this._startBpsTime = _nowTime; | |
| 671 | + }; | |
| 672 | + | |
| 673 | + | |
| 674 | + Jessibuca.prototype._checkHeart = function () { | |
| 675 | + if (this._checkHeartTimeout) { | |
| 676 | + clearTimeout(this._checkHeartTimeout); | |
| 677 | + this._checkHeartTimeout = null; | |
| 678 | + } | |
| 679 | + var _this = this; | |
| 680 | + this._checkHeartTimeout = setTimeout(function () { | |
| 681 | + _this._opt.isDebug && console.log('check heart timeout'); | |
| 682 | + _this._trigger('timeout'); | |
| 683 | + _this.recording = false; | |
| 684 | + _this.playing = false; | |
| 685 | + _this._close(); | |
| 686 | + }, this._opt.timeout * 1000); | |
| 687 | + }; | |
| 688 | + | |
| 689 | + Jessibuca.prototype._checkLoading = function () { | |
| 690 | + if (this._checkLoadingTimeout) { | |
| 691 | + clearTimeout(this._checkLoadingTimeout); | |
| 692 | + this._checkLoadingTimeout = null; | |
| 693 | + } | |
| 694 | + var _this = this; | |
| 695 | + this._checkLoadingTimeout = setTimeout(function () { | |
| 696 | + _this._opt.isDebug && console.log('check loading timeout'); | |
| 697 | + _this._trigger('timeout'); | |
| 698 | + _this.playing = false; | |
| 699 | + _this._close(); | |
| 700 | + _domToggle(_this._doms.loadingDom, false); | |
| 701 | + }, this._opt.timeout * 1000); | |
| 702 | + }; | |
| 703 | + | |
| 704 | + Jessibuca.prototype._clearCheckLoading = function () { | |
| 705 | + if (this._checkLoadingTimeout) { | |
| 706 | + clearTimeout(this._checkLoadingTimeout); | |
| 707 | + this._checkLoadingTimeout = null; | |
| 708 | + } | |
| 709 | + }; | |
| 710 | + | |
| 711 | + Jessibuca.prototype._initCheckVariable = function () { | |
| 712 | + this._startBpsTime = ''; | |
| 713 | + this._bps = 0; | |
| 714 | + if (this._checkHeartTimeout) { | |
| 715 | + clearTimeout(this._checkHeartTimeout); | |
| 716 | + this._checkHeartTimeout = null; | |
| 717 | + } | |
| 718 | + } | |
| 719 | + // | |
| 720 | + Jessibuca.prototype._initAudioPlanar = function (msg) { | |
| 721 | + var channels = msg.channels | |
| 722 | + var samplerate = msg.samplerate | |
| 723 | + var context = this._audioContext; | |
| 724 | + var isPlaying = false; | |
| 725 | + var audioBuffers = []; | |
| 726 | + if (!context) return false; | |
| 727 | + var _this = this | |
| 728 | + this._playAudio = function (buffer) { | |
| 729 | + var frameCount = buffer[0][0].length | |
| 730 | + var audioBuffer = context.createBuffer(channels, frameCount * buffer.length, samplerate); | |
| 731 | + var copyToCtxBuffer = function (fromBuffer) { | |
| 732 | + for (var channel = 0; channel < channels; channel++) { | |
| 733 | + var nowBuffering = audioBuffer.getChannelData(channel); | |
| 734 | + for (var j = 0; j < buffer.length; j++) { | |
| 735 | + for (var i = 0; i < frameCount; i++) { | |
| 736 | + nowBuffering[i + j * frameCount] = fromBuffer[j][channel][i] | |
| 737 | + } | |
| 738 | + //postMessage({ cmd: "setBufferA", buffer: fromBuffer[j] }, '*', fromBuffer[j].map(x => x.buffer)) | |
| 739 | + } | |
| 740 | + } | |
| 741 | + } | |
| 742 | + var playNextBuffer = function () { | |
| 743 | + isPlaying = false; | |
| 744 | + //console.log("~", audioBuffers.length) | |
| 745 | + if (audioBuffers.length) { | |
| 746 | + playAudio(audioBuffers.shift()); | |
| 747 | + } | |
| 748 | + //if (audioBuffers.length > 1) audioBuffers.shift(); | |
| 749 | + }; | |
| 750 | + var playAudio = function (fromBuffer) { | |
| 751 | + if (!fromBuffer) return | |
| 752 | + if (isPlaying) { | |
| 753 | + audioBuffers.push(fromBuffer); | |
| 754 | + //console.log(audioBuffers.length) | |
| 755 | + return; | |
| 756 | + } | |
| 757 | + isPlaying = true; | |
| 758 | + copyToCtxBuffer(fromBuffer); | |
| 759 | + var source = context.createBufferSource(); | |
| 760 | + source.buffer = audioBuffer; | |
| 761 | + source.connect(context.destination); | |
| 762 | + // source.onended = playNextBuffer; | |
| 763 | + source.start(); | |
| 764 | + }; | |
| 765 | + _this._playAudio = playAudio | |
| 766 | + _this.audioInterval = setInterval(playNextBuffer, audioBuffer.duration * 1000); | |
| 767 | + playAudio(buffer) | |
| 768 | + }; | |
| 769 | + } | |
| 770 | + | |
| 771 | + function _unlock(context) { | |
| 772 | + context.resume(); | |
| 773 | + var source = context.createBufferSource(); | |
| 774 | + source.buffer = context.createBuffer(1, 1, 22050); | |
| 775 | + source.connect(context.destination); | |
| 776 | + if (source.noteOn) | |
| 777 | + source.noteOn(0); | |
| 778 | + else | |
| 779 | + source.start(0); | |
| 780 | + } | |
| 781 | + | |
| 782 | + function _domToggle(dom, toggle) { | |
| 783 | + if (dom) { | |
| 784 | + dom.style.display = toggle ? 'block' : "none"; | |
| 785 | + } | |
| 786 | + } | |
| 787 | + | |
| 788 | + function _dataURLToFile(dataURL) { | |
| 789 | + const arr = dataURL.split(","); | |
| 790 | + const bstr = atob(arr[1]); | |
| 791 | + const type = arr[0].replace("data:", "").replace(";base64", "") | |
| 792 | + let n = bstr.length, u8arr = new Uint8Array(n); | |
| 793 | + while (n--) { | |
| 794 | + u8arr[n] = bstr.charCodeAt(n); | |
| 795 | + } | |
| 796 | + return new File([u8arr], 'file', {type}); | |
| 797 | + } | |
| 798 | + | |
| 799 | + function _downloadImg(content, fileName) { | |
| 800 | + const aLink = document.createElement("a"); | |
| 801 | + aLink.download = fileName; | |
| 802 | + aLink.href = URL.createObjectURL(content); | |
| 803 | + aLink.click(); | |
| 804 | + URL.revokeObjectURL(content); | |
| 805 | + } | |
| 806 | + | |
| 807 | + function _bpsSize(value) { | |
| 808 | + if (null == value || value === '') { | |
| 809 | + return "0 KB/S"; | |
| 810 | + } | |
| 811 | + var srcsize = parseFloat(value); | |
| 812 | + var size = srcsize / 1024; | |
| 813 | + size = size.toFixed(2); | |
| 814 | + return size + 'KB/S'; | |
| 815 | + } | |
| 816 | + | |
| 817 | + function _fpsStatus(fps) { | |
| 818 | + var result = 0; | |
| 819 | + if (fps >= 24) { | |
| 820 | + result = 2; | |
| 821 | + } else if (fps >= 15) { | |
| 822 | + result = 1; | |
| 823 | + } | |
| 824 | + | |
| 825 | + return result; | |
| 826 | + } | |
| 827 | + | |
| 828 | + /** | |
| 829 | + * set audio | |
| 830 | + * @param flag | |
| 831 | + */ | |
| 832 | + Jessibuca.prototype._audioEnabled = function (flag) { | |
| 833 | + if (flag) { | |
| 834 | + _unlock(this._audioContext) | |
| 835 | + this._audioEnabled = function (flag) { | |
| 836 | + if (flag) { | |
| 837 | + // 恢复 | |
| 838 | + this._audioContext.resume(); | |
| 839 | + | |
| 840 | + } else { | |
| 841 | + // 暂停 | |
| 842 | + this._audioContext.suspend(); | |
| 843 | + } | |
| 844 | + } | |
| 845 | + } else { | |
| 846 | + this._audioContext.suspend(); | |
| 847 | + } | |
| 848 | + } | |
| 849 | + | |
| 850 | + Jessibuca.prototype._playAudio = function (data) { | |
| 851 | + var context = this._audioContext; | |
| 852 | + var isPlaying = false; | |
| 853 | + var isDecoding = false; | |
| 854 | + if (!context) return false; | |
| 855 | + var audioBuffers = []; | |
| 856 | + var decodeQueue = [] | |
| 857 | + var _this = this | |
| 858 | + var playNextBuffer = function (e) { | |
| 859 | + if (audioBuffers.length) { | |
| 860 | + playBuffer(audioBuffers.shift()) | |
| 861 | + } | |
| 862 | + }; | |
| 863 | + var playBuffer = function (buffer) { | |
| 864 | + isPlaying = true; | |
| 865 | + var audioBufferSouceNode = context.createBufferSource(); | |
| 866 | + audioBufferSouceNode.buffer = buffer; | |
| 867 | + audioBufferSouceNode.connect(context.destination); | |
| 868 | + // audioBufferSouceNode.onended = playNextBuffer; | |
| 869 | + audioBufferSouceNode.start(); | |
| 870 | + if (!_this.audioInterval) { | |
| 871 | + _this.audioInterval = setInterval(playNextBuffer, buffer.duration * 1000 - 1); | |
| 872 | + } | |
| 873 | + } | |
| 874 | + var decodeAudio = function () { | |
| 875 | + if (decodeQueue.length) { | |
| 876 | + context.decodeAudioData(decodeQueue.shift(), tryPlay, decodeAudio); | |
| 877 | + } else { | |
| 878 | + isDecoding = false | |
| 879 | + } | |
| 880 | + } | |
| 881 | + var tryPlay = function (buffer) { | |
| 882 | + decodeAudio() | |
| 883 | + if (isPlaying) { | |
| 884 | + audioBuffers.push(buffer); | |
| 885 | + } else { | |
| 886 | + playBuffer(buffer) | |
| 887 | + } | |
| 888 | + } | |
| 889 | + var playAudio = function (data) { | |
| 890 | + decodeQueue.push(...data) | |
| 891 | + if (!isDecoding) { | |
| 892 | + isDecoding = true | |
| 893 | + decodeAudio() | |
| 894 | + } | |
| 895 | + } | |
| 896 | + this._playAudio = playAudio | |
| 897 | + playAudio(data) | |
| 898 | + } | |
| 899 | + Jessibuca.prototype._initAudioPlay = function (frameCount, samplerate, channels) { | |
| 900 | + var context = this._audioContext; | |
| 901 | + var isPlaying = false; | |
| 902 | + var audioBuffers = []; | |
| 903 | + if (!context) return false; | |
| 904 | + var _this = this | |
| 905 | + var resampled = samplerate < 22050; | |
| 906 | + if (resampled) { | |
| 907 | + _this._opt.isDebug && console.log("resampled!") | |
| 908 | + } | |
| 909 | + var audioBuffer = resampled ? context.createBuffer(channels, frameCount << 1, samplerate << 1) : context.createBuffer(channels, frameCount, samplerate); | |
| 910 | + var playNextBuffer = function () { | |
| 911 | + isPlaying = false; | |
| 912 | + //console.log("~", audioBuffers.length) | |
| 913 | + if (audioBuffers.length) { | |
| 914 | + playAudio(audioBuffers.shift()); | |
| 915 | + } | |
| 916 | + }; | |
| 917 | + | |
| 918 | + var copyToCtxBuffer = channels > 1 ? function (fromBuffer) { | |
| 919 | + for (var channel = 0; channel < channels; channel++) { | |
| 920 | + var nowBuffering = audioBuffer.getChannelData(channel); | |
| 921 | + if (resampled) { | |
| 922 | + for (var i = 0; i < frameCount; i++) { | |
| 923 | + nowBuffering[i * 2] = nowBuffering[i * 2 + 1] = fromBuffer[i * (channel + 1)] / 32768; | |
| 924 | + } | |
| 925 | + } else | |
| 926 | + for (var i = 0; i < frameCount; i++) { | |
| 927 | + nowBuffering[i] = fromBuffer[i * (channel + 1)] / 32768; | |
| 928 | + } | |
| 929 | + | |
| 930 | + } | |
| 931 | + } : function (fromBuffer) { | |
| 932 | + var nowBuffering = audioBuffer.getChannelData(0); | |
| 933 | + for (var i = 0; i < nowBuffering.length; i++) { | |
| 934 | + nowBuffering[i] = fromBuffer[i] / 32768; | |
| 935 | + } | |
| 936 | + }; | |
| 937 | + var playAudio = function (fromBuffer) { | |
| 938 | + if (isPlaying) { | |
| 939 | + audioBuffers.push(fromBuffer); | |
| 940 | + return; | |
| 941 | + } | |
| 942 | + isPlaying = true; | |
| 943 | + copyToCtxBuffer(fromBuffer); | |
| 944 | + var source = context.createBufferSource(); | |
| 945 | + source.buffer = audioBuffer; | |
| 946 | + source.connect(context.destination); | |
| 947 | + if (!_this.audioInterval) { | |
| 948 | + _this.audioInterval = setInterval(playNextBuffer, audioBuffer.duration * 1000); | |
| 949 | + } | |
| 950 | + source.start(); | |
| 951 | + }; | |
| 952 | + this._playAudio = playAudio; | |
| 953 | + } | |
| 954 | + /** | |
| 955 | + * Returns true if the canvas supports WebGL | |
| 956 | + */ | |
| 957 | + Jessibuca.prototype.isWebGL = function () { | |
| 958 | + return !!this._contextGL; | |
| 959 | + }; | |
| 960 | + /** | |
| 961 | + * set timeout | |
| 962 | + * @param time | |
| 963 | + */ | |
| 964 | + Jessibuca.prototype.setTimeout = function (time) { | |
| 965 | + if (typeof time === 'number') { | |
| 966 | + this._opt.timeout = Number(time); | |
| 967 | + } | |
| 968 | + }; | |
| 969 | + | |
| 970 | + /** | |
| 971 | + * @desc 视频缩放模式, 当视频分辨率比例与canvas显示区域比例不同时,缩放效果不同: | |
| 972 | + 0 视频画面完全填充canvas区域,画面会被拉伸 | |
| 973 | + 1 视频画面做等比缩放后,高或宽对齐canvas区域,画面不被拉伸,但有黑边(默认) | |
| 974 | + 2 视频画面做等比缩放后,完全填充canvas区域,画面不被拉伸,没有黑边,但画面显示不全 | |
| 975 | + * @param type | |
| 976 | + * | |
| 977 | + */ | |
| 978 | + Jessibuca.prototype.setScaleMode = function (type) { | |
| 979 | + if (type === 0) { | |
| 980 | + this._opt.isFullResize = false; | |
| 981 | + this._opt.isResize = false; | |
| 982 | + } else if (type === 1) { | |
| 983 | + this._opt.isFullResize = false; | |
| 984 | + this._opt.isResize = true; | |
| 985 | + } else if (type === 2) { | |
| 986 | + this._opt.isFullResize = true; | |
| 987 | + } | |
| 988 | + this.resize(); | |
| 989 | + }; | |
| 990 | + | |
| 991 | + /** | |
| 992 | + * Create the GL context from the canvas element | |
| 993 | + */ | |
| 994 | + Jessibuca.prototype._initContextGL = function () { | |
| 995 | + var canvas = this._canvasElement; | |
| 996 | + var gl = null; | |
| 997 | + | |
| 998 | + var validContextNames = ["webgl", "experimental-webgl", "moz-webgl", "webkit-3d"]; | |
| 999 | + var nameIndex = 0; | |
| 1000 | + | |
| 1001 | + while (!gl && nameIndex < validContextNames.length) { | |
| 1002 | + var contextName = validContextNames[nameIndex]; | |
| 1003 | + | |
| 1004 | + try { | |
| 1005 | + var contextOptions = {preserveDrawingBuffer: true}; | |
| 1006 | + if (this._opt.contextOptions) { | |
| 1007 | + contextOptions = Object.assign(contextOptions, this._opt.contextOptions); | |
| 1008 | + } | |
| 1009 | + | |
| 1010 | + gl = canvas.getContext(contextName, contextOptions); | |
| 1011 | + } catch (e) { | |
| 1012 | + gl = null; | |
| 1013 | + } | |
| 1014 | + | |
| 1015 | + if (!gl || typeof gl.getParameter !== "function") { | |
| 1016 | + gl = null; | |
| 1017 | + } | |
| 1018 | + | |
| 1019 | + ++nameIndex; | |
| 1020 | + } | |
| 1021 | + ; | |
| 1022 | + | |
| 1023 | + this._contextGL = gl; | |
| 1024 | + }; | |
| 1025 | + | |
| 1026 | + /** | |
| 1027 | + * Initialize GL shader program | |
| 1028 | + */ | |
| 1029 | + Jessibuca.prototype._initProgram = function () { | |
| 1030 | + var gl = this._contextGL; | |
| 1031 | + | |
| 1032 | + var vertexShaderScript = [ | |
| 1033 | + 'attribute vec4 vertexPos;', | |
| 1034 | + 'attribute vec4 texturePos;', | |
| 1035 | + 'varying vec2 textureCoord;', | |
| 1036 | + | |
| 1037 | + 'void main()', | |
| 1038 | + '{', | |
| 1039 | + 'gl_Position = vertexPos;', | |
| 1040 | + 'textureCoord = texturePos.xy;', | |
| 1041 | + '}' | |
| 1042 | + ].join('\n'); | |
| 1043 | + | |
| 1044 | + var fragmentShaderScript = [ | |
| 1045 | + 'precision highp float;', | |
| 1046 | + 'varying highp vec2 textureCoord;', | |
| 1047 | + 'uniform sampler2D ySampler;', | |
| 1048 | + 'uniform sampler2D uSampler;', | |
| 1049 | + 'uniform sampler2D vSampler;', | |
| 1050 | + 'const mat4 YUV2RGB = mat4', | |
| 1051 | + '(', | |
| 1052 | + '1.1643828125, 0, 1.59602734375, -.87078515625,', | |
| 1053 | + '1.1643828125, -.39176171875, -.81296875, .52959375,', | |
| 1054 | + '1.1643828125, 2.017234375, 0, -1.081390625,', | |
| 1055 | + '0, 0, 0, 1', | |
| 1056 | + ');', | |
| 1057 | + | |
| 1058 | + 'void main(void) {', | |
| 1059 | + 'highp float y = texture2D(ySampler, textureCoord).r;', | |
| 1060 | + 'highp float u = texture2D(uSampler, textureCoord).r;', | |
| 1061 | + 'highp float v = texture2D(vSampler, textureCoord).r;', | |
| 1062 | + 'gl_FragColor = vec4(y, u, v, 1) * YUV2RGB;', | |
| 1063 | + '}' | |
| 1064 | + ].join('\n'); | |
| 1065 | + | |
| 1066 | + var vertexShader = gl.createShader(gl.VERTEX_SHADER); | |
| 1067 | + gl.shaderSource(vertexShader, vertexShaderScript); | |
| 1068 | + gl.compileShader(vertexShader); | |
| 1069 | + if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) { | |
| 1070 | + this._opt.isDebug && console.log('Vertex shader failed to compile: ' + gl.getShaderInfoLog(vertexShader)); | |
| 1071 | + } | |
| 1072 | + | |
| 1073 | + var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); | |
| 1074 | + gl.shaderSource(fragmentShader, fragmentShaderScript); | |
| 1075 | + gl.compileShader(fragmentShader); | |
| 1076 | + if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { | |
| 1077 | + this._opt.isDebug && console.log('Fragment shader failed to compile: ' + gl.getShaderInfoLog(fragmentShader)); | |
| 1078 | + } | |
| 1079 | + | |
| 1080 | + var program = gl.createProgram(); | |
| 1081 | + gl.attachShader(program, vertexShader); | |
| 1082 | + gl.attachShader(program, fragmentShader); | |
| 1083 | + gl.linkProgram(program); | |
| 1084 | + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { | |
| 1085 | + this._opt.isDebug && console.log('Program failed to compile: ' + gl.getProgramInfoLog(program)); | |
| 1086 | + } | |
| 1087 | + | |
| 1088 | + gl.useProgram(program); | |
| 1089 | + | |
| 1090 | + this._shaderProgram = program; | |
| 1091 | + }; | |
| 1092 | + | |
| 1093 | + /** | |
| 1094 | + * Initialize vertex buffers and attach to shader program | |
| 1095 | + */ | |
| 1096 | + Jessibuca.prototype._initBuffers = function () { | |
| 1097 | + var gl = this._contextGL; | |
| 1098 | + var program = this._shaderProgram; | |
| 1099 | + | |
| 1100 | + var vertexPosBuffer = gl.createBuffer(); | |
| 1101 | + gl.bindBuffer(gl.ARRAY_BUFFER, vertexPosBuffer); | |
| 1102 | + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW); | |
| 1103 | + | |
| 1104 | + var vertexPosRef = gl.getAttribLocation(program, 'vertexPos'); | |
| 1105 | + gl.enableVertexAttribArray(vertexPosRef); | |
| 1106 | + gl.vertexAttribPointer(vertexPosRef, 2, gl.FLOAT, false, 0, 0); | |
| 1107 | + | |
| 1108 | + var texturePosBuffer = gl.createBuffer(); | |
| 1109 | + gl.bindBuffer(gl.ARRAY_BUFFER, texturePosBuffer); | |
| 1110 | + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 0, 0, 0, 1, 1, 0, 1]), gl.STATIC_DRAW); | |
| 1111 | + | |
| 1112 | + var texturePosRef = gl.getAttribLocation(program, 'texturePos'); | |
| 1113 | + gl.enableVertexAttribArray(texturePosRef); | |
| 1114 | + gl.vertexAttribPointer(texturePosRef, 2, gl.FLOAT, false, 0, 0); | |
| 1115 | + | |
| 1116 | + this._texturePosBuffer = texturePosBuffer; | |
| 1117 | + }; | |
| 1118 | + | |
| 1119 | + /** | |
| 1120 | + * Initialize GL textures and attach to shader program | |
| 1121 | + */ | |
| 1122 | + Jessibuca.prototype._initTextures = function () { | |
| 1123 | + var gl = this._contextGL; | |
| 1124 | + var program = this._shaderProgram; | |
| 1125 | + | |
| 1126 | + var yTextureRef = this._initTexture(); | |
| 1127 | + var ySamplerRef = gl.getUniformLocation(program, 'ySampler'); | |
| 1128 | + gl.uniform1i(ySamplerRef, 0); | |
| 1129 | + this._yTextureRef = yTextureRef; | |
| 1130 | + | |
| 1131 | + var uTextureRef = this._initTexture(); | |
| 1132 | + var uSamplerRef = gl.getUniformLocation(program, 'uSampler'); | |
| 1133 | + gl.uniform1i(uSamplerRef, 1); | |
| 1134 | + this._uTextureRef = uTextureRef; | |
| 1135 | + | |
| 1136 | + var vTextureRef = this._initTexture(); | |
| 1137 | + var vSamplerRef = gl.getUniformLocation(program, 'vSampler'); | |
| 1138 | + gl.uniform1i(vSamplerRef, 2); | |
| 1139 | + this._vTextureRef = vTextureRef; | |
| 1140 | + }; | |
| 1141 | + | |
| 1142 | + /** | |
| 1143 | + * Create and configure a single texture | |
| 1144 | + */ | |
| 1145 | + Jessibuca.prototype._initTexture = function () { | |
| 1146 | + var gl = this._contextGL; | |
| 1147 | + | |
| 1148 | + var textureRef = gl.createTexture(); | |
| 1149 | + gl.bindTexture(gl.TEXTURE_2D, textureRef); | |
| 1150 | + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); | |
| 1151 | + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); | |
| 1152 | + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); | |
| 1153 | + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); | |
| 1154 | + gl.bindTexture(gl.TEXTURE_2D, null); | |
| 1155 | + | |
| 1156 | + return textureRef; | |
| 1157 | + }; | |
| 1158 | + | |
| 1159 | + /** | |
| 1160 | + * Draw picture data to the canvas. | |
| 1161 | + * If this object is using WebGL, the data must be an I420 formatted ArrayBuffer, | |
| 1162 | + * Otherwise, data must be an RGBA formatted ArrayBuffer. | |
| 1163 | + */ | |
| 1164 | + Jessibuca.prototype._drawNextOutputPicture = function (data) { | |
| 1165 | + if (this._contextGL) { | |
| 1166 | + this._drawNextOutputPictureGL(data); | |
| 1167 | + } else { | |
| 1168 | + this._drawNextOutputPictureRGBA(data); | |
| 1169 | + } | |
| 1170 | + }; | |
| 1171 | + | |
| 1172 | + /** | |
| 1173 | + * Draw the next output picture using WebGL | |
| 1174 | + */ | |
| 1175 | + Jessibuca.prototype._drawNextOutputPictureGL = function (data) { | |
| 1176 | + var gl = this._contextGL; | |
| 1177 | + var texturePosBuffer = this._texturePosBuffer; | |
| 1178 | + var yTextureRef = this._yTextureRef; | |
| 1179 | + var uTextureRef = this._uTextureRef; | |
| 1180 | + var vTextureRef = this._vTextureRef; | |
| 1181 | + var croppingParams = this.croppingParams | |
| 1182 | + var width = this._canvasElement.width | |
| 1183 | + var height = this._canvasElement.height | |
| 1184 | + if (croppingParams) { | |
| 1185 | + gl.viewport(0, 0, croppingParams.width, croppingParams.height); | |
| 1186 | + var tTop = croppingParams.top / height; | |
| 1187 | + var tLeft = croppingParams.left / width; | |
| 1188 | + var tBottom = croppingParams.height / height; | |
| 1189 | + var tRight = croppingParams.width / width; | |
| 1190 | + var texturePosValues = new Float32Array([tRight, tTop, tLeft, tTop, tRight, tBottom, tLeft, tBottom]); | |
| 1191 | + | |
| 1192 | + gl.bindBuffer(gl.ARRAY_BUFFER, texturePosBuffer); | |
| 1193 | + gl.bufferData(gl.ARRAY_BUFFER, texturePosValues, gl.DYNAMIC_DRAW); | |
| 1194 | + } else { | |
| 1195 | + gl.viewport(0, 0, this._canvasElement.width, this._canvasElement.height); | |
| 1196 | + } | |
| 1197 | + gl.activeTexture(gl.TEXTURE0); | |
| 1198 | + gl.bindTexture(gl.TEXTURE_2D, yTextureRef); | |
| 1199 | + gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, width, height, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data[0]); | |
| 1200 | + | |
| 1201 | + gl.activeTexture(gl.TEXTURE1); | |
| 1202 | + gl.bindTexture(gl.TEXTURE_2D, uTextureRef); | |
| 1203 | + gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, width / 2, height / 2, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data[1]); | |
| 1204 | + | |
| 1205 | + gl.activeTexture(gl.TEXTURE2); | |
| 1206 | + gl.bindTexture(gl.TEXTURE_2D, vTextureRef); | |
| 1207 | + gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, width / 2, height / 2, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data[2]); | |
| 1208 | + | |
| 1209 | + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); | |
| 1210 | + }; | |
| 1211 | + | |
| 1212 | + /** | |
| 1213 | + * Draw next output picture using ARGB data on a 2d canvas. | |
| 1214 | + */ | |
| 1215 | + Jessibuca.prototype._drawNextOutputPictureRGBA = function (data) { | |
| 1216 | + this.imageData.data.set(data); | |
| 1217 | + var croppingParams = this.croppingParams | |
| 1218 | + if (!croppingParams) { | |
| 1219 | + this.ctx2d.putImageData(this.imageData, 0, 0); | |
| 1220 | + } else { | |
| 1221 | + this.ctx2d.putImageData(this.imageData, -croppingParams.left, -croppingParams.top, 0, 0, croppingParams.width, croppingParams.height); | |
| 1222 | + } | |
| 1223 | + }; | |
| 1224 | + Jessibuca.prototype.ctx2d = null; | |
| 1225 | + Jessibuca.prototype.imageData = null; | |
| 1226 | + Jessibuca.prototype._initRGB = function (width, height) { | |
| 1227 | + this.ctx2d = this._canvasElement.getContext('2d'); | |
| 1228 | + this.imageData = this.ctx2d.getImageData(0, 0, width, height); | |
| 1229 | + this.clear = function () { | |
| 1230 | + this.ctx2d.clearRect(0, 0, width, height) | |
| 1231 | + }; | |
| 1232 | + }; | |
| 1233 | + | |
| 1234 | + Jessibuca.prototype.pause = function () { | |
| 1235 | + this._close(); | |
| 1236 | + if (this.loading) { | |
| 1237 | + _domToggle(this._doms.loadingDom, false); | |
| 1238 | + } | |
| 1239 | + this.recording = false; | |
| 1240 | + this.playing = false; | |
| 1241 | + }; | |
| 1242 | + | |
| 1243 | + Jessibuca.prototype._close = function () { | |
| 1244 | + if (this.audioInterval) { | |
| 1245 | + clearInterval(this.audioInterval) | |
| 1246 | + } | |
| 1247 | + delete this._playAudio | |
| 1248 | + this._decoderWorker.postMessage({cmd: "close"}) | |
| 1249 | + | |
| 1250 | + if (this._wakeLock) { | |
| 1251 | + this._wakeLock.release(); | |
| 1252 | + this._wakeLock = null; | |
| 1253 | + } | |
| 1254 | + | |
| 1255 | + // this._contextGL.clear(this._contextGL.COLOR_BUFFER_BIT); | |
| 1256 | + this._initCheckVariable(); | |
| 1257 | + } | |
| 1258 | + /** | |
| 1259 | + * destroy | |
| 1260 | + * @desc delete worker, | |
| 1261 | + */ | |
| 1262 | + Jessibuca.prototype.destroy = function () { | |
| 1263 | + // destroy | |
| 1264 | + this._decoderWorker.terminate() | |
| 1265 | + window.removeEventListener("resize", this._onresize); | |
| 1266 | + window.removeEventListener('fullscreenchange', this._onfullscreenchange); | |
| 1267 | + this._initCheckVariable(); | |
| 1268 | + this._clearCheckLoading(); | |
| 1269 | + this._off(); | |
| 1270 | + this._hasLoaded = false; | |
| 1271 | + // remove dom | |
| 1272 | + while (this._container.firstChild) { | |
| 1273 | + this._container.removeChild(this._container.firstChild); | |
| 1274 | + } | |
| 1275 | + if (this._wakeLock) { | |
| 1276 | + this._wakeLock.release(); | |
| 1277 | + } | |
| 1278 | + } | |
| 1279 | + | |
| 1280 | + /** | |
| 1281 | + * 清理画布为黑色背景 | |
| 1282 | + * 用于canvas重用进行多个流切换播放时,将上一个画面清理 | |
| 1283 | + * 避免后一个视频播放之前出现前一个视频最后一个画面 | |
| 1284 | + */ | |
| 1285 | + Jessibuca.prototype.clearView = function () { | |
| 1286 | + this._contextGL.clear(this._contextGL.COLOR_BUFFER_BIT); | |
| 1287 | + }; | |
| 1288 | + /** | |
| 1289 | + * play | |
| 1290 | + * @param url | |
| 1291 | + */ | |
| 1292 | + Jessibuca.prototype.play = function (url) { | |
| 1293 | + if (!this.playUrl && !url) { | |
| 1294 | + return; | |
| 1295 | + } | |
| 1296 | + var needDelay = false; | |
| 1297 | + if (url) { | |
| 1298 | + if (this.playUrl) { | |
| 1299 | + this._close(); | |
| 1300 | + needDelay = true; | |
| 1301 | + this._contextGL.clear(this._contextGL.COLOR_BUFFER_BIT); | |
| 1302 | + } | |
| 1303 | + this.loading = true; | |
| 1304 | + _domToggle(this._doms.bgDom, false); | |
| 1305 | + this._checkLoading(); | |
| 1306 | + this.playUrl = url; | |
| 1307 | + } else if (this.playUrl) { | |
| 1308 | + // retry | |
| 1309 | + if (this.loading) { | |
| 1310 | + this._hideBtns(); | |
| 1311 | + _domToggle(this._doms.fullscreenDom, true); | |
| 1312 | + _domToggle(this._doms.pauseDom, true); | |
| 1313 | + _domToggle(this._doms.loadingDom, true); | |
| 1314 | + this._checkLoading(); | |
| 1315 | + } else { | |
| 1316 | + this.playing = true; | |
| 1317 | + } | |
| 1318 | + } | |
| 1319 | + this._initCheckVariable(); | |
| 1320 | + | |
| 1321 | + if (needDelay) { | |
| 1322 | + var _this = this; | |
| 1323 | + setTimeout(function () { | |
| 1324 | + _this._decoderWorker.postMessage({cmd: "play", url: _this.playUrl, isWebGL: _this.isWebGL()}) | |
| 1325 | + }, 300); | |
| 1326 | + } else { | |
| 1327 | + this._decoderWorker.postMessage({cmd: "play", url: this.playUrl, isWebGL: this.isWebGL()}) | |
| 1328 | + } | |
| 1329 | + }; | |
| 1330 | + /** | |
| 1331 | + * has loaded | |
| 1332 | + * @returns {boolean} | |
| 1333 | + */ | |
| 1334 | + Jessibuca.prototype.hasLoaded = function () { | |
| 1335 | + return this._hasLoaded; | |
| 1336 | + }; | |
| 1337 | + | |
| 1338 | + Object.defineProperty(Jessibuca.prototype, "fullscreen", { | |
| 1339 | + set(value) { | |
| 1340 | + if (value) { | |
| 1341 | + if (!_checkFull()) { | |
| 1342 | + this._container.requestFullscreen(); | |
| 1343 | + } | |
| 1344 | + _domToggle(this._doms.minScreenDom, true); | |
| 1345 | + _domToggle(this._doms.fullscreenDom, false); | |
| 1346 | + } else { | |
| 1347 | + if (_checkFull()) { | |
| 1348 | + document.exitFullscreen(); | |
| 1349 | + } | |
| 1350 | + _domToggle(this._doms.minScreenDom, false); | |
| 1351 | + _domToggle(this._doms.fullscreenDom, true); | |
| 1352 | + } | |
| 1353 | + | |
| 1354 | + if (this._fullscreen !== value) { | |
| 1355 | + this.onFullscreen(value); | |
| 1356 | + this._trigger('fullscreen', value); | |
| 1357 | + } | |
| 1358 | + this._fullscreen = value; | |
| 1359 | + }, | |
| 1360 | + get() { | |
| 1361 | + return this._fullscreen; | |
| 1362 | + } | |
| 1363 | + }); | |
| 1364 | + | |
| 1365 | + Object.defineProperty(Jessibuca.prototype, 'playing', { | |
| 1366 | + set(value) { | |
| 1367 | + if (value) { | |
| 1368 | + _domToggle(this._doms.playBigDom, false); | |
| 1369 | + _domToggle(this._doms.playDom, false); | |
| 1370 | + _domToggle(this._doms.pauseDom, true); | |
| 1371 | + | |
| 1372 | + _domToggle(this._doms.screenshotsDom, true); | |
| 1373 | + _domToggle(this._doms.recordDom, true); | |
| 1374 | + if (this._quieting) { | |
| 1375 | + _domToggle(this._doms.quietAudioDom, true); | |
| 1376 | + _domToggle(this._doms.playAudioDom, false); | |
| 1377 | + } else { | |
| 1378 | + _domToggle(this._doms.quietAudioDom, false); | |
| 1379 | + _domToggle(this._doms.playAudioDom, true); | |
| 1380 | + } | |
| 1381 | + } else { | |
| 1382 | + this._doms.speedDom && (this._doms.speedDom.innerText = ''); | |
| 1383 | + if (this.playUrl) { | |
| 1384 | + _domToggle(this._doms.playDom, true); | |
| 1385 | + _domToggle(this._doms.playBigDom, true); | |
| 1386 | + _domToggle(this._doms.pauseDom, false); | |
| 1387 | + } | |
| 1388 | + | |
| 1389 | + // 在停止状态下录像,截屏,音量是非激活,只有播放,最大化时可点击 | |
| 1390 | + _domToggle(this._doms.recordDom, false); | |
| 1391 | + _domToggle(this._doms.recordingDom, false); | |
| 1392 | + _domToggle(this._doms.screenshotsDom, false); | |
| 1393 | + _domToggle(this._doms.quietAudioDom, false); | |
| 1394 | + _domToggle(this._doms.playAudioDom, false); | |
| 1395 | + } | |
| 1396 | + | |
| 1397 | + if (this._playing !== value) { | |
| 1398 | + if (value) { | |
| 1399 | + this.onPlay(); | |
| 1400 | + this._trigger('play'); | |
| 1401 | + } else { | |
| 1402 | + this.onPause(); | |
| 1403 | + this._trigger('pause'); | |
| 1404 | + } | |
| 1405 | + } | |
| 1406 | + this._playing = value; | |
| 1407 | + }, | |
| 1408 | + get() { | |
| 1409 | + return this._playing; | |
| 1410 | + } | |
| 1411 | + }); | |
| 1412 | + | |
| 1413 | + Object.defineProperty(Jessibuca.prototype, 'recording', { | |
| 1414 | + set(value) { | |
| 1415 | + if (value) { | |
| 1416 | + _domToggle(this._doms.recordDom, false); | |
| 1417 | + _domToggle(this._doms.recordingDom, true); | |
| 1418 | + } else { | |
| 1419 | + _domToggle(this._doms.recordDom, true); | |
| 1420 | + _domToggle(this._doms.recordingDom, false); | |
| 1421 | + | |
| 1422 | + } | |
| 1423 | + if (this._recording !== value) { | |
| 1424 | + this.onRecord(value); | |
| 1425 | + this._trigger('record', value); | |
| 1426 | + this._recording = value; | |
| 1427 | + } | |
| 1428 | + }, | |
| 1429 | + get() { | |
| 1430 | + return this._recording; | |
| 1431 | + } | |
| 1432 | + }); | |
| 1433 | + | |
| 1434 | + Object.defineProperty(Jessibuca.prototype, 'quieting', { | |
| 1435 | + set(value) { | |
| 1436 | + if (value) { | |
| 1437 | + _domToggle(this._doms.quietAudioDom, true); | |
| 1438 | + _domToggle(this._doms.playAudioDom, false); | |
| 1439 | + } else { | |
| 1440 | + _domToggle(this._doms.quietAudioDom, false); | |
| 1441 | + _domToggle(this._doms.playAudioDom, true); | |
| 1442 | + } | |
| 1443 | + if (this._quieting !== value) { | |
| 1444 | + this.onMute(value); | |
| 1445 | + this._trigger('mute', value); | |
| 1446 | + } | |
| 1447 | + this._quieting = value; | |
| 1448 | + }, | |
| 1449 | + get() { | |
| 1450 | + return this._quieting; | |
| 1451 | + } | |
| 1452 | + }); | |
| 1453 | + | |
| 1454 | + Object.defineProperty(Jessibuca.prototype, 'loading', { | |
| 1455 | + set(value) { | |
| 1456 | + if (value) { | |
| 1457 | + this._hideBtns(); | |
| 1458 | + _domToggle(this._doms.fullscreenDom, true); | |
| 1459 | + _domToggle(this._doms.pauseDom, true); | |
| 1460 | + _domToggle(this._doms.loadingDom, true); | |
| 1461 | + } else { | |
| 1462 | + this._initBtns(); | |
| 1463 | + } | |
| 1464 | + this._loading = value; | |
| 1465 | + }, | |
| 1466 | + get() { | |
| 1467 | + return this._loading; | |
| 1468 | + } | |
| 1469 | + }); | |
| 1470 | + | |
| 1471 | + /** | |
| 1472 | + * resize | |
| 1473 | + */ | |
| 1474 | + Jessibuca.prototype.resize = function () { | |
| 1475 | + var width = this._container.clientWidth; | |
| 1476 | + var height = this._container.clientHeight; | |
| 1477 | + if (this._showControl()) { | |
| 1478 | + height -= 38; | |
| 1479 | + } | |
| 1480 | + var resizeWidth = this._canvasElement.width; | |
| 1481 | + var resizeHeight = this._canvasElement.height; | |
| 1482 | + var wScale = width / resizeWidth; | |
| 1483 | + var hScale = height / resizeHeight; | |
| 1484 | + var scale = wScale > hScale ? hScale : wScale; | |
| 1485 | + if (!this._opt.isResize) { | |
| 1486 | + if (wScale !== hScale) { | |
| 1487 | + scale = wScale + ',' + hScale; | |
| 1488 | + } | |
| 1489 | + } | |
| 1490 | + // | |
| 1491 | + if (this._opt.isFullResize) { | |
| 1492 | + scale = wScale > hScale ? wScale : hScale; | |
| 1493 | + } | |
| 1494 | + | |
| 1495 | + this._opt.isDebug && console.log('wScale', wScale, 'hScale', hScale, 'scale', scale); | |
| 1496 | + this._canvasElement.style.transform = "scale(" + scale + ")" | |
| 1497 | + this._canvasElement.style.left = ((width - resizeWidth) / 2) + "px" | |
| 1498 | + this._canvasElement.style.top = ((height - resizeHeight) / 2) + "px" | |
| 1499 | + } | |
| 1500 | + | |
| 1501 | + Jessibuca.prototype._fullscreenchange = function () { | |
| 1502 | + this.fullscreen = _checkFull(); | |
| 1503 | + } | |
| 1504 | + | |
| 1505 | + /** | |
| 1506 | + * change buffer | |
| 1507 | + * @param buffer | |
| 1508 | + */ | |
| 1509 | + Jessibuca.prototype.changeBuffer = function (buffer) { | |
| 1510 | + this._stats.buf = Number(buffer) * 1000; | |
| 1511 | + this._decoderWorker.postMessage({cmd: "setVideoBuffer", time: Number(buffer)}); | |
| 1512 | + }; | |
| 1513 | + /** | |
| 1514 | + * 设置最大缓冲时长,单位秒,播放器会自动消除延迟。 | |
| 1515 | + * @param buffer | |
| 1516 | + */ | |
| 1517 | + Jessibuca.prototype.setBufferTime = function (buffer) { | |
| 1518 | + this.changeBuffer(buffer); | |
| 1519 | + }; | |
| 1520 | + | |
| 1521 | + /** | |
| 1522 | + * 设置音量大小,取值0.0 — 1.0 | |
| 1523 | + * 当为0.0时,完全无声 | |
| 1524 | + * 当为1.0时,最大音量,默认值 | |
| 1525 | + * @param volume | |
| 1526 | + */ | |
| 1527 | + Jessibuca.prototype.setVolume = function (volume) { | |
| 1528 | + if (this._gainNode) { | |
| 1529 | + this._gainNode.gain.setValueAtTime(volume, this._audioContext.currentTime); | |
| 1530 | + } | |
| 1531 | + }; | |
| 1532 | + | |
| 1533 | + /** | |
| 1534 | + * 开启屏幕常亮, 在play前调用 | |
| 1535 | + * 在手机浏览器上, canvas标签渲染视频并不会像video标签那样保持屏幕常亮 | |
| 1536 | + * H5目前在chrome\edge 84, android chrome 84及以上有原生亮屏API, 需要是https页面 | |
| 1537 | + * 其余平台为模拟实现,此时为兼容实现,并不保证所有浏览器都支持 | |
| 1538 | + */ | |
| 1539 | + Jessibuca.prototype.setKeepScreenOn = function () { | |
| 1540 | + this._opt.keepScreenOn = true; | |
| 1541 | + }; | |
| 1542 | + | |
| 1543 | + | |
| 1544 | + /** | |
| 1545 | + * set fullscreen | |
| 1546 | + * @param flag | |
| 1547 | + */ | |
| 1548 | + Jessibuca.prototype.setFullscreen = function (flag) { | |
| 1549 | + var fullscreen = !!flag; | |
| 1550 | + if (this.fullscreen !== fullscreen) { | |
| 1551 | + this.fullscreen = fullscreen; | |
| 1552 | + } | |
| 1553 | + }; | |
| 1554 | + | |
| 1555 | + function _now() { | |
| 1556 | + return new Date().getTime(); | |
| 1557 | + } | |
| 1558 | + | |
| 1559 | + Jessibuca.prototype._screenshot = function (filename, format, quality) { | |
| 1560 | + filename = filename || _now(); | |
| 1561 | + var formatType = { | |
| 1562 | + png: 'image/png', | |
| 1563 | + jpeg: 'image/jpeg', | |
| 1564 | + webp: 'image/webp' | |
| 1565 | + }; | |
| 1566 | + var encoderOptions = 0.92; | |
| 1567 | + | |
| 1568 | + if (typeof quality !== 'undefined') { | |
| 1569 | + encoderOptions = Number(quality); | |
| 1570 | + } | |
| 1571 | + | |
| 1572 | + var dataURL = this._canvasElement.toDataURL(formatType[format] || formatType.png, encoderOptions); | |
| 1573 | + _downloadImg(_dataURLToFile(dataURL), filename); | |
| 1574 | + } | |
| 1575 | + | |
| 1576 | + /** | |
| 1577 | + * 截图,调用后弹出下载框保存截图 | |
| 1578 | + * @param filename 保存的文件名 默认时间戳 | |
| 1579 | + * @param format 截图的格式,可选png或jpeg或者webp | |
| 1580 | + * @param quality 可选参数,当格式是jpeg或者webp时,压缩质量,取值0.0 ~ 1.0 | |
| 1581 | + */ | |
| 1582 | + Jessibuca.prototype.screenshot = function (filename, format, quality) { | |
| 1583 | + this._screenshot(filename, format, quality); | |
| 1584 | + }; | |
| 1585 | + | |
| 1586 | + | |
| 1587 | + var eventSplitter = /\s+/; | |
| 1588 | + | |
| 1589 | + // Execute callbacks | |
| 1590 | + function _callEach(list, args, context) { | |
| 1591 | + if (list) { | |
| 1592 | + for (var i = 0, len = list.length; i < len; i += 1) { | |
| 1593 | + list[i].apply(context, args); | |
| 1594 | + } | |
| 1595 | + } | |
| 1596 | + } | |
| 1597 | + | |
| 1598 | + /** | |
| 1599 | + * | |
| 1600 | + * @param events | |
| 1601 | + * @param callback | |
| 1602 | + * @returns {Jessibuca} | |
| 1603 | + */ | |
| 1604 | + Jessibuca.prototype.on = function (events, callback) { | |
| 1605 | + var cache, event, list; | |
| 1606 | + if (!callback) return this; | |
| 1607 | + cache = this.__events || (this.__events = {}); | |
| 1608 | + events = events.split(eventSplitter); | |
| 1609 | + while (event = events.shift()) { | |
| 1610 | + list = cache[event] || (cache[event] = []); | |
| 1611 | + list.push(callback); | |
| 1612 | + } | |
| 1613 | + return this; | |
| 1614 | + }; | |
| 1615 | + /** | |
| 1616 | + * | |
| 1617 | + * @param events | |
| 1618 | + * @param callback | |
| 1619 | + * @returns {Jessibuca} | |
| 1620 | + * @private | |
| 1621 | + */ | |
| 1622 | + Jessibuca.prototype._off = function () { | |
| 1623 | + var cache; | |
| 1624 | + if (!(cache = this.__events)) return this; | |
| 1625 | + delete this.__events; | |
| 1626 | + return this; | |
| 1627 | + }; | |
| 1628 | + | |
| 1629 | + /** | |
| 1630 | + * | |
| 1631 | + * @param events | |
| 1632 | + * @returns {Jessibuca} | |
| 1633 | + * @private | |
| 1634 | + */ | |
| 1635 | + Jessibuca.prototype._trigger = function (events) { | |
| 1636 | + var cache, event, all, list, i, len, rest = [], args; | |
| 1637 | + if (!(cache = this.__events)) return this; | |
| 1638 | + events = events.split(eventSplitter); | |
| 1639 | + // Fill up `rest` with the callback arguments. Since we're only copying | |
| 1640 | + // the tail of `arguments`, a loop is much faster than Array#slice. | |
| 1641 | + for (i = 1, len = arguments.length; i < len; i++) { | |
| 1642 | + rest[i - 1] = arguments[i]; | |
| 1643 | + } | |
| 1644 | + // For each event, walk through the list of callbacks twice, first to | |
| 1645 | + // trigger the event, then to trigger any `"all"` callbacks. | |
| 1646 | + while (event = events.shift()) { | |
| 1647 | + if (list = cache[event]) list = list.slice(); | |
| 1648 | + // Execute event callbacks. | |
| 1649 | + _callEach(list, rest, this); | |
| 1650 | + } | |
| 1651 | + return this; | |
| 1652 | + } | |
| 1653 | + | |
| 1654 | + if (typeof define === 'function') { | |
| 1655 | + define(function () { | |
| 1656 | + return Jessibuca; | |
| 1657 | + }); | |
| 1658 | + } else if (typeof exports !== 'undefined') { | |
| 1659 | + module.exports = Jessibuca; | |
| 1660 | + } else { | |
| 1661 | + window.Jessibuca = Jessibuca; | |
| 1662 | + } | |
| 1663 | +})(); | ... | ... |
| 1 | +<!DOCTYPE html> | |
| 2 | +<html lang="en"> | |
| 3 | + <head> | |
| 4 | + <meta charset="UTF-8"> | |
| 5 | + <title>监控视频</title> | |
| 6 | + <script src="./jessibuca.js"></script> | |
| 7 | + </head> | |
| 8 | + <body> | |
| 9 | + <div class="container-shell"> | |
| 10 | + <div id="container" style="width: 100%;height: 600px;"></div> | |
| 11 | + </div> | |
| 12 | + | |
| 13 | + | |
| 14 | + <script> | |
| 15 | + function _play() { | |
| 16 | + let image = document.getElementById("container"); | |
| 17 | + let jessibuca = new Jessibuca({ | |
| 18 | + container: image, | |
| 19 | + videoBuffer: 0.2, // 缓存时长 | |
| 20 | + isResize: false, | |
| 21 | + text: "", | |
| 22 | + loadingText: "", | |
| 23 | + useMSE: false, | |
| 24 | + debug: false, | |
| 25 | + isNotMute: false, | |
| 26 | + operateBtns: { | |
| 27 | + fullscreen: true, | |
| 28 | + screenshot: true, | |
| 29 | + play: true, | |
| 30 | + audio: false, | |
| 31 | + recorder: false | |
| 32 | + }, | |
| 33 | + }); | |
| 34 | + const urlParams = new URLSearchParams(window.location.search); | |
| 35 | + const tt = urlParams.get('tt'); // "john" | |
| 36 | + jessibuca.play( | |
| 37 | + tt | |
| 38 | + ); | |
| 39 | + } | |
| 40 | + | |
| 41 | + _play(); | |
| 42 | + </script> | |
| 43 | + | |
| 44 | + </body> | |
| 45 | +</html> | |
| 0 | 46 | \ No newline at end of file | ... | ... |
| 1 | +<!DOCTYPE html> | |
| 2 | +<html lang="en"> | |
| 3 | + | |
| 4 | +<head> | |
| 5 | + <meta charset="UTF-8"> | |
| 6 | + <title>门禁开门</title> | |
| 7 | + <script src="./jessibuca.js"></script> | |
| 8 | + <script type="text/javascript" src="./jweixin-1.4.0.js"></script> | |
| 9 | + <script type="text/javascript" src="./hybrid_html_uni.webview.1.5.5.js"></script> | |
| 10 | +</head> | |
| 11 | + | |
| 12 | +<body> | |
| 13 | + <div class="container-shell"> | |
| 14 | + <div id="container" style="width: 100%;height: 600px;"></div> | |
| 15 | + | |
| 16 | + <!-- <div style="height: 100px; | |
| 17 | + width: 90%; | |
| 18 | + text-align: center; | |
| 19 | + background-color: #0081ff; | |
| 20 | + color: #fff; | |
| 21 | + font-size: 42px; | |
| 22 | + line-height: 100px; | |
| 23 | + border-radius: 10px; | |
| 24 | + margin: 0 auto; | |
| 25 | + margin-top: 50px;" type="button" onclick="_openDoor()">开 门</div> --> | |
| 26 | + </div> | |
| 27 | + | |
| 28 | + | |
| 29 | + <script> | |
| 30 | + function _play() { | |
| 31 | + let image = document.getElementById("container"); | |
| 32 | + let jessibuca = new Jessibuca({ | |
| 33 | + container: image, | |
| 34 | + videoBuffer: 0.2, // 缓存时长 | |
| 35 | + isResize: false, | |
| 36 | + text: "", | |
| 37 | + loadingText: "", | |
| 38 | + useMSE: false, | |
| 39 | + debug: false, | |
| 40 | + isNotMute: false, | |
| 41 | + operateBtns: { | |
| 42 | + fullscreen: true, | |
| 43 | + screenshot: true, | |
| 44 | + play: true, | |
| 45 | + audio: false, | |
| 46 | + recorder: false | |
| 47 | + }, | |
| 48 | + }); | |
| 49 | + const urlParams = new URLSearchParams(window.location.search); | |
| 50 | + const tt = urlParams.get('tt'); // "john" | |
| 51 | + jessibuca.play( | |
| 52 | + tt | |
| 53 | + ); | |
| 54 | + } | |
| 55 | + | |
| 56 | + _play(); | |
| 57 | + | |
| 58 | + function _openDoor() { | |
| 59 | + uni.postMessage({ | |
| 60 | + data: { | |
| 61 | + action: 'openDoor' | |
| 62 | + } | |
| 63 | + }); | |
| 64 | + } | |
| 65 | + </script> | |
| 66 | + | |
| 67 | +</body> | |
| 68 | + | |
| 69 | +</html> | |
| 0 | 70 | \ No newline at end of file | ... | ... |
| 1 | +<!DOCTYPE html> | |
| 2 | +<html lang="en"> | |
| 3 | + <head> | |
| 4 | + <meta charset="UTF-8"> | |
| 5 | + <title>监控视频</title> | |
| 6 | + <script src="./jessibuca.js"></script> | |
| 7 | + </head> | |
| 8 | + <body> | |
| 9 | + <div class="container-shell"> | |
| 10 | + <div id="container" style="width: 100%;height: 300px;"></div> | |
| 11 | + </div> | |
| 12 | + | |
| 13 | + | |
| 14 | + <script> | |
| 15 | + function _play() { | |
| 16 | + let image = document.getElementById("container"); | |
| 17 | + let jessibuca = new Jessibuca({ | |
| 18 | + container: image, | |
| 19 | + videoBuffer: 0.2, // 缓存时长 | |
| 20 | + isResize: false, | |
| 21 | + text: "", | |
| 22 | + loadingText: "", | |
| 23 | + useMSE: false, | |
| 24 | + debug: false, | |
| 25 | + isNotMute: false, | |
| 26 | + operateBtns: { | |
| 27 | + fullscreen: true, | |
| 28 | + screenshot: true, | |
| 29 | + play: true, | |
| 30 | + audio: false, | |
| 31 | + recorder: false | |
| 32 | + }, | |
| 33 | + }); | |
| 34 | + const urlParams = new URLSearchParams(window.location.search); | |
| 35 | + const tt = urlParams.get('tt'); // "john" | |
| 36 | + jessibuca.play( | |
| 37 | + tt | |
| 38 | + ); | |
| 39 | + } | |
| 40 | + | |
| 41 | + _play(); | |
| 42 | + </script> | |
| 43 | + | |
| 44 | + </body> | |
| 45 | +</html> | |
| 0 | 46 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -3,7 +3,7 @@ import App from './App.vue' |
| 3 | 3 | import router from './router' |
| 4 | 4 | import ElementUI from 'element-ui' |
| 5 | 5 | import 'element-ui/lib/theme-chalk/index.css' |
| 6 | -import 'formiojs/dist/formio.full.min.css' | |
| 6 | +//import 'formiojs/dist/formio.full.min.css' | |
| 7 | 7 | import i18n from './i18n' |
| 8 | 8 | import {getCommunityName,getCommunityId} from '@/api/community/communityApi' |
| 9 | 9 | ... | ... |