web-ifc-api.js 183 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833
  1. var __commonJS = (callback, module) => () => {
  2. if (!module) {
  3. module = {exports: {}};
  4. callback(module.exports, module);
  5. }
  6. return module.exports;
  7. };
  8. let WasmPath = "";
  9. // dist/web-ifc.js
  10. var require_web_ifc = __commonJS((exports, module) => {
  11. var WebIFCWasm2 = function() {
  12. var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0;
  13. if (typeof __filename !== "undefined")
  14. _scriptDir = _scriptDir || __filename;
  15. return function(WebIFCWasm3) {
  16. WebIFCWasm3 = WebIFCWasm3 || {};
  17. var Module = typeof WebIFCWasm3 !== "undefined" ? WebIFCWasm3 : {};
  18. var readyPromiseResolve, readyPromiseReject;
  19. Module["ready"] = new Promise(function(resolve, reject) {
  20. readyPromiseResolve = resolve;
  21. readyPromiseReject = reject;
  22. });
  23. var moduleOverrides = {};
  24. var key;
  25. for (key in Module) {
  26. if (Module.hasOwnProperty(key)) {
  27. moduleOverrides[key] = Module[key];
  28. }
  29. }
  30. var arguments_ = [];
  31. var thisProgram = "./this.program";
  32. var quit_ = function(status, toThrow) {
  33. throw toThrow;
  34. };
  35. var ENVIRONMENT_IS_WEB = false;
  36. var ENVIRONMENT_IS_WORKER = false;
  37. var ENVIRONMENT_IS_NODE = false;
  38. var ENVIRONMENT_IS_SHELL = false;
  39. ENVIRONMENT_IS_WEB = typeof window === "object";
  40. ENVIRONMENT_IS_WORKER = typeof importScripts === "function";
  41. ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string";
  42. ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
  43. var scriptDirectory = "";
  44. function locateFile(path) {
  45. if (Module["locateFile"]) {
  46. return Module["locateFile"](path, scriptDirectory);
  47. }
  48. return scriptDirectory + path;
  49. }
  50. var read_, readAsync, readBinary, setWindowTitle;
  51. var nodeFS;
  52. var nodePath;
  53. if (ENVIRONMENT_IS_NODE) {
  54. if (ENVIRONMENT_IS_WORKER) {
  55. scriptDirectory = require("path").dirname(scriptDirectory) + "/";
  56. } else {
  57. scriptDirectory = __dirname + "/";
  58. }
  59. read_ = function shell_read(filename, binary) {
  60. if (!nodeFS)
  61. nodeFS = require("fs");
  62. if (!nodePath)
  63. nodePath = require("path");
  64. filename = nodePath["normalize"](filename);
  65. return nodeFS["readFileSync"](filename, binary ? null : "utf8");
  66. };
  67. readBinary = function readBinary2(filename) {
  68. var ret = read_(filename, true);
  69. if (!ret.buffer) {
  70. ret = new Uint8Array(ret);
  71. }
  72. assert(ret.buffer);
  73. return ret;
  74. };
  75. if (process["argv"].length > 1) {
  76. thisProgram = process["argv"][1].replace(/\\/g, "/");
  77. }
  78. arguments_ = process["argv"].slice(2);
  79. process["on"]("uncaughtException", function(ex) {
  80. if (!(ex instanceof ExitStatus)) {
  81. throw ex;
  82. }
  83. });
  84. process["on"]("unhandledRejection", abort);
  85. quit_ = function(status) {
  86. process["exit"](status);
  87. };
  88. Module["inspect"] = function() {
  89. return "[Emscripten Module object]";
  90. };
  91. } else if (ENVIRONMENT_IS_SHELL) {
  92. if (typeof read != "undefined") {
  93. read_ = function shell_read(f) {
  94. return read(f);
  95. };
  96. }
  97. readBinary = function readBinary2(f) {
  98. var data;
  99. if (typeof readbuffer === "function") {
  100. return new Uint8Array(readbuffer(f));
  101. }
  102. data = read(f, "binary");
  103. assert(typeof data === "object");
  104. return data;
  105. };
  106. if (typeof scriptArgs != "undefined") {
  107. arguments_ = scriptArgs;
  108. } else if (typeof arguments != "undefined") {
  109. arguments_ = arguments;
  110. }
  111. if (typeof quit === "function") {
  112. quit_ = function(status) {
  113. quit(status);
  114. };
  115. }
  116. if (typeof print !== "undefined") {
  117. if (typeof console === "undefined")
  118. console = {};
  119. console.log = print;
  120. console.warn = console.error = typeof printErr !== "undefined" ? printErr : print;
  121. }
  122. } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
  123. if (ENVIRONMENT_IS_WORKER) {
  124. scriptDirectory = self.location.href;
  125. } else if (typeof document !== "undefined" && document.currentScript) {
  126. scriptDirectory = document.currentScript.src;
  127. }
  128. if (_scriptDir) {
  129. scriptDirectory = _scriptDir;
  130. }
  131. if (scriptDirectory.indexOf("blob:") !== 0) {
  132. scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1);
  133. } else {
  134. scriptDirectory = "";
  135. }
  136. {
  137. read_ = function shell_read(url) {
  138. var xhr = new XMLHttpRequest();
  139. xhr.open("GET", url, false);
  140. xhr.send(null);
  141. return xhr.responseText;
  142. };
  143. if (ENVIRONMENT_IS_WORKER) {
  144. readBinary = function readBinary2(url) {
  145. var xhr = new XMLHttpRequest();
  146. xhr.open("GET", url, false);
  147. xhr.responseType = "arraybuffer";
  148. xhr.send(null);
  149. return new Uint8Array(xhr.response);
  150. };
  151. }
  152. readAsync = function readAsync2(url, onload, onerror) {
  153. var xhr = new XMLHttpRequest();
  154. xhr.open("GET", url, true);
  155. xhr.responseType = "arraybuffer";
  156. xhr.onload = function xhr_onload() {
  157. if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
  158. onload(xhr.response);
  159. return;
  160. }
  161. onerror();
  162. };
  163. xhr.onerror = onerror;
  164. xhr.send(null);
  165. };
  166. }
  167. setWindowTitle = function(title) {
  168. document.title = title;
  169. };
  170. } else {
  171. }
  172. var out = Module["print"] || console.log.bind(console);
  173. var err = Module["printErr"] || console.warn.bind(console);
  174. for (key in moduleOverrides) {
  175. if (moduleOverrides.hasOwnProperty(key)) {
  176. Module[key] = moduleOverrides[key];
  177. }
  178. }
  179. moduleOverrides = null;
  180. if (Module["arguments"])
  181. arguments_ = Module["arguments"];
  182. if (Module["thisProgram"])
  183. thisProgram = Module["thisProgram"];
  184. if (Module["quit"])
  185. quit_ = Module["quit"];
  186. var STACK_ALIGN = 16;
  187. function alignMemory(size, factor) {
  188. if (!factor)
  189. factor = STACK_ALIGN;
  190. return Math.ceil(size / factor) * factor;
  191. }
  192. var tempRet0 = 0;
  193. var setTempRet0 = function(value) {
  194. tempRet0 = value;
  195. };
  196. var wasmBinary;
  197. if (Module["wasmBinary"])
  198. wasmBinary = Module["wasmBinary"];
  199. var noExitRuntime;
  200. if (Module["noExitRuntime"])
  201. noExitRuntime = Module["noExitRuntime"];
  202. if (typeof WebAssembly !== "object") {
  203. abort("no native wasm support detected");
  204. }
  205. var wasmMemory;
  206. var ABORT = false;
  207. var EXITSTATUS = 0;
  208. function assert(condition, text) {
  209. if (!condition) {
  210. abort("Assertion failed: " + text);
  211. }
  212. }
  213. var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0;
  214. function UTF8ArrayToString(heap, idx, maxBytesToRead) {
  215. var endIdx = idx + maxBytesToRead;
  216. var endPtr = idx;
  217. while (heap[endPtr] && !(endPtr >= endIdx))
  218. ++endPtr;
  219. if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {
  220. return UTF8Decoder.decode(heap.subarray(idx, endPtr));
  221. } else {
  222. var str = "";
  223. while (idx < endPtr) {
  224. var u0 = heap[idx++];
  225. if (!(u0 & 128)) {
  226. str += String.fromCharCode(u0);
  227. continue;
  228. }
  229. var u1 = heap[idx++] & 63;
  230. if ((u0 & 224) == 192) {
  231. str += String.fromCharCode((u0 & 31) << 6 | u1);
  232. continue;
  233. }
  234. var u2 = heap[idx++] & 63;
  235. if ((u0 & 240) == 224) {
  236. u0 = (u0 & 15) << 12 | u1 << 6 | u2;
  237. } else {
  238. u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63;
  239. }
  240. if (u0 < 65536) {
  241. str += String.fromCharCode(u0);
  242. } else {
  243. var ch = u0 - 65536;
  244. str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);
  245. }
  246. }
  247. }
  248. return str;
  249. }
  250. function UTF8ToString(ptr, maxBytesToRead) {
  251. return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : "";
  252. }
  253. function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {
  254. if (!(maxBytesToWrite > 0))
  255. return 0;
  256. var startIdx = outIdx;
  257. var endIdx = outIdx + maxBytesToWrite - 1;
  258. for (var i = 0; i < str.length; ++i) {
  259. var u = str.charCodeAt(i);
  260. if (u >= 55296 && u <= 57343) {
  261. var u1 = str.charCodeAt(++i);
  262. u = 65536 + ((u & 1023) << 10) | u1 & 1023;
  263. }
  264. if (u <= 127) {
  265. if (outIdx >= endIdx)
  266. break;
  267. heap[outIdx++] = u;
  268. } else if (u <= 2047) {
  269. if (outIdx + 1 >= endIdx)
  270. break;
  271. heap[outIdx++] = 192 | u >> 6;
  272. heap[outIdx++] = 128 | u & 63;
  273. } else if (u <= 65535) {
  274. if (outIdx + 2 >= endIdx)
  275. break;
  276. heap[outIdx++] = 224 | u >> 12;
  277. heap[outIdx++] = 128 | u >> 6 & 63;
  278. heap[outIdx++] = 128 | u & 63;
  279. } else {
  280. if (outIdx + 3 >= endIdx)
  281. break;
  282. heap[outIdx++] = 240 | u >> 18;
  283. heap[outIdx++] = 128 | u >> 12 & 63;
  284. heap[outIdx++] = 128 | u >> 6 & 63;
  285. heap[outIdx++] = 128 | u & 63;
  286. }
  287. }
  288. heap[outIdx] = 0;
  289. return outIdx - startIdx;
  290. }
  291. function stringToUTF8(str, outPtr, maxBytesToWrite) {
  292. return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);
  293. }
  294. function lengthBytesUTF8(str) {
  295. var len = 0;
  296. for (var i = 0; i < str.length; ++i) {
  297. var u = str.charCodeAt(i);
  298. if (u >= 55296 && u <= 57343)
  299. u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;
  300. if (u <= 127)
  301. ++len;
  302. else if (u <= 2047)
  303. len += 2;
  304. else if (u <= 65535)
  305. len += 3;
  306. else
  307. len += 4;
  308. }
  309. return len;
  310. }
  311. var UTF16Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf-16le") : void 0;
  312. function UTF16ToString(ptr, maxBytesToRead) {
  313. var endPtr = ptr;
  314. var idx = endPtr >> 1;
  315. var maxIdx = idx + maxBytesToRead / 2;
  316. while (!(idx >= maxIdx) && HEAPU16[idx])
  317. ++idx;
  318. endPtr = idx << 1;
  319. if (endPtr - ptr > 32 && UTF16Decoder) {
  320. return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr));
  321. } else {
  322. var str = "";
  323. for (var i = 0; !(i >= maxBytesToRead / 2); ++i) {
  324. var codeUnit = HEAP16[ptr + i * 2 >> 1];
  325. if (codeUnit == 0)
  326. break;
  327. str += String.fromCharCode(codeUnit);
  328. }
  329. return str;
  330. }
  331. }
  332. function stringToUTF16(str, outPtr, maxBytesToWrite) {
  333. if (maxBytesToWrite === void 0) {
  334. maxBytesToWrite = 2147483647;
  335. }
  336. if (maxBytesToWrite < 2)
  337. return 0;
  338. maxBytesToWrite -= 2;
  339. var startPtr = outPtr;
  340. var numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length;
  341. for (var i = 0; i < numCharsToWrite; ++i) {
  342. var codeUnit = str.charCodeAt(i);
  343. HEAP16[outPtr >> 1] = codeUnit;
  344. outPtr += 2;
  345. }
  346. HEAP16[outPtr >> 1] = 0;
  347. return outPtr - startPtr;
  348. }
  349. function lengthBytesUTF16(str) {
  350. return str.length * 2;
  351. }
  352. function UTF32ToString(ptr, maxBytesToRead) {
  353. var i = 0;
  354. var str = "";
  355. while (!(i >= maxBytesToRead / 4)) {
  356. var utf32 = HEAP32[ptr + i * 4 >> 2];
  357. if (utf32 == 0)
  358. break;
  359. ++i;
  360. if (utf32 >= 65536) {
  361. var ch = utf32 - 65536;
  362. str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);
  363. } else {
  364. str += String.fromCharCode(utf32);
  365. }
  366. }
  367. return str;
  368. }
  369. function stringToUTF32(str, outPtr, maxBytesToWrite) {
  370. if (maxBytesToWrite === void 0) {
  371. maxBytesToWrite = 2147483647;
  372. }
  373. if (maxBytesToWrite < 4)
  374. return 0;
  375. var startPtr = outPtr;
  376. var endPtr = startPtr + maxBytesToWrite - 4;
  377. for (var i = 0; i < str.length; ++i) {
  378. var codeUnit = str.charCodeAt(i);
  379. if (codeUnit >= 55296 && codeUnit <= 57343) {
  380. var trailSurrogate = str.charCodeAt(++i);
  381. codeUnit = 65536 + ((codeUnit & 1023) << 10) | trailSurrogate & 1023;
  382. }
  383. HEAP32[outPtr >> 2] = codeUnit;
  384. outPtr += 4;
  385. if (outPtr + 4 > endPtr)
  386. break;
  387. }
  388. HEAP32[outPtr >> 2] = 0;
  389. return outPtr - startPtr;
  390. }
  391. function lengthBytesUTF32(str) {
  392. var len = 0;
  393. for (var i = 0; i < str.length; ++i) {
  394. var codeUnit = str.charCodeAt(i);
  395. if (codeUnit >= 55296 && codeUnit <= 57343)
  396. ++i;
  397. len += 4;
  398. }
  399. return len;
  400. }
  401. function writeArrayToMemory(array, buffer2) {
  402. HEAP8.set(array, buffer2);
  403. }
  404. function writeAsciiToMemory(str, buffer2, dontAddNull) {
  405. for (var i = 0; i < str.length; ++i) {
  406. HEAP8[buffer2++ >> 0] = str.charCodeAt(i);
  407. }
  408. if (!dontAddNull)
  409. HEAP8[buffer2 >> 0] = 0;
  410. }
  411. function alignUp(x, multiple) {
  412. if (x % multiple > 0) {
  413. x += multiple - x % multiple;
  414. }
  415. return x;
  416. }
  417. var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
  418. function updateGlobalBufferAndViews(buf) {
  419. buffer = buf;
  420. Module["HEAP8"] = HEAP8 = new Int8Array(buf);
  421. Module["HEAP16"] = HEAP16 = new Int16Array(buf);
  422. Module["HEAP32"] = HEAP32 = new Int32Array(buf);
  423. Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf);
  424. Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf);
  425. Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf);
  426. Module["HEAPF32"] = HEAPF32 = new Float32Array(buf);
  427. Module["HEAPF64"] = HEAPF64 = new Float64Array(buf);
  428. }
  429. var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216;
  430. if (Module["wasmMemory"]) {
  431. wasmMemory = Module["wasmMemory"];
  432. } else {
  433. wasmMemory = new WebAssembly.Memory({initial: INITIAL_MEMORY / 65536, maximum: 2147483648 / 65536});
  434. }
  435. if (wasmMemory) {
  436. buffer = wasmMemory.buffer;
  437. }
  438. INITIAL_MEMORY = buffer.byteLength;
  439. updateGlobalBufferAndViews(buffer);
  440. var wasmTable;
  441. var __ATPRERUN__ = [];
  442. var __ATINIT__ = [];
  443. var __ATMAIN__ = [];
  444. var __ATPOSTRUN__ = [];
  445. var runtimeInitialized = false;
  446. var runtimeExited = false;
  447. function preRun() {
  448. if (Module["preRun"]) {
  449. if (typeof Module["preRun"] == "function")
  450. Module["preRun"] = [Module["preRun"]];
  451. while (Module["preRun"].length) {
  452. addOnPreRun(Module["preRun"].shift());
  453. }
  454. }
  455. callRuntimeCallbacks(__ATPRERUN__);
  456. }
  457. function initRuntime() {
  458. runtimeInitialized = true;
  459. if (!Module["noFSInit"] && !FS.init.initialized)
  460. FS.init();
  461. TTY.init();
  462. callRuntimeCallbacks(__ATINIT__);
  463. }
  464. function preMain() {
  465. FS.ignorePermissions = false;
  466. callRuntimeCallbacks(__ATMAIN__);
  467. }
  468. function exitRuntime() {
  469. runtimeExited = true;
  470. }
  471. function postRun() {
  472. if (Module["postRun"]) {
  473. if (typeof Module["postRun"] == "function")
  474. Module["postRun"] = [Module["postRun"]];
  475. while (Module["postRun"].length) {
  476. addOnPostRun(Module["postRun"].shift());
  477. }
  478. }
  479. callRuntimeCallbacks(__ATPOSTRUN__);
  480. }
  481. function addOnPreRun(cb) {
  482. __ATPRERUN__.unshift(cb);
  483. }
  484. function addOnPostRun(cb) {
  485. __ATPOSTRUN__.unshift(cb);
  486. }
  487. var runDependencies = 0;
  488. var runDependencyWatcher = null;
  489. var dependenciesFulfilled = null;
  490. function getUniqueRunDependency(id) {
  491. return id;
  492. }
  493. function addRunDependency(id) {
  494. runDependencies++;
  495. if (Module["monitorRunDependencies"]) {
  496. Module["monitorRunDependencies"](runDependencies);
  497. }
  498. }
  499. function removeRunDependency(id) {
  500. runDependencies--;
  501. if (Module["monitorRunDependencies"]) {
  502. Module["monitorRunDependencies"](runDependencies);
  503. }
  504. if (runDependencies == 0) {
  505. if (runDependencyWatcher !== null) {
  506. clearInterval(runDependencyWatcher);
  507. runDependencyWatcher = null;
  508. }
  509. if (dependenciesFulfilled) {
  510. var callback = dependenciesFulfilled;
  511. dependenciesFulfilled = null;
  512. callback();
  513. }
  514. }
  515. }
  516. Module["preloadedImages"] = {};
  517. Module["preloadedAudios"] = {};
  518. function abort(what) {
  519. if (Module["onAbort"]) {
  520. Module["onAbort"](what);
  521. }
  522. what += "";
  523. err(what);
  524. ABORT = true;
  525. EXITSTATUS = 1;
  526. what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info.";
  527. var e = new WebAssembly.RuntimeError(what);
  528. readyPromiseReject(e);
  529. throw e;
  530. }
  531. function hasPrefix(str, prefix) {
  532. return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0;
  533. }
  534. var dataURIPrefix = "data:application/octet-stream;base64,";
  535. function isDataURI(filename) {
  536. return hasPrefix(filename, dataURIPrefix);
  537. }
  538. var fileURIPrefix = "file://";
  539. function isFileURI(filename) {
  540. return hasPrefix(filename, fileURIPrefix);
  541. }
  542. var wasmBinaryFile = WasmPath + "web-ifc.wasm";
  543. if (!isDataURI(wasmBinaryFile)) {
  544. wasmBinaryFile = locateFile(wasmBinaryFile);
  545. }
  546. function getBinary() {
  547. try {
  548. if (wasmBinary) {
  549. return new Uint8Array(wasmBinary);
  550. }
  551. if (readBinary) {
  552. return readBinary(wasmBinaryFile);
  553. } else {
  554. throw "both async and sync fetching of the wasm failed";
  555. }
  556. } catch (err2) {
  557. abort(err2);
  558. }
  559. }
  560. function getBinaryPromise() {
  561. if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === "function" && !isFileURI(wasmBinaryFile)) {
  562. return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) {
  563. if (!response["ok"]) {
  564. throw "failed to load wasm binary file at '" + wasmBinaryFile + "'";
  565. }
  566. return response["arrayBuffer"]();
  567. }).catch(function() {
  568. return getBinary();
  569. });
  570. }
  571. return Promise.resolve().then(getBinary);
  572. }
  573. function createWasm() {
  574. var info = {a: asmLibraryArg};
  575. function receiveInstance(instance, module2) {
  576. var exports3 = instance.exports;
  577. Module["asm"] = exports3;
  578. wasmTable = Module["asm"]["P"];
  579. removeRunDependency("wasm-instantiate");
  580. }
  581. addRunDependency("wasm-instantiate");
  582. function receiveInstantiatedSource(output) {
  583. receiveInstance(output["instance"]);
  584. }
  585. function instantiateArrayBuffer(receiver) {
  586. return getBinaryPromise().then(function(binary) {
  587. return WebAssembly.instantiate(binary, info);
  588. }).then(receiver, function(reason) {
  589. err("failed to asynchronously prepare wasm: " + reason);
  590. abort(reason);
  591. });
  592. }
  593. function instantiateAsync() {
  594. if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") {
  595. return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) {
  596. var result = WebAssembly.instantiateStreaming(response, info);
  597. return result.then(receiveInstantiatedSource, function(reason) {
  598. err("wasm streaming compile failed: " + reason);
  599. err("falling back to ArrayBuffer instantiation");
  600. return instantiateArrayBuffer(receiveInstantiatedSource);
  601. });
  602. });
  603. } else {
  604. return instantiateArrayBuffer(receiveInstantiatedSource);
  605. }
  606. }
  607. if (Module["instantiateWasm"]) {
  608. try {
  609. var exports2 = Module["instantiateWasm"](info, receiveInstance);
  610. return exports2;
  611. } catch (e) {
  612. err("Module.instantiateWasm callback failed with error: " + e);
  613. return false;
  614. }
  615. }
  616. instantiateAsync().catch(readyPromiseReject);
  617. return {};
  618. }
  619. var tempDouble;
  620. var tempI64;
  621. function callRuntimeCallbacks(callbacks) {
  622. while (callbacks.length > 0) {
  623. var callback = callbacks.shift();
  624. if (typeof callback == "function") {
  625. callback(Module);
  626. continue;
  627. }
  628. var func = callback.func;
  629. if (typeof func === "number") {
  630. if (callback.arg === void 0) {
  631. wasmTable.get(func)();
  632. } else {
  633. wasmTable.get(func)(callback.arg);
  634. }
  635. } else {
  636. func(callback.arg === void 0 ? null : callback.arg);
  637. }
  638. }
  639. }
  640. function dynCallLegacy(sig, ptr, args) {
  641. if (args && args.length) {
  642. return Module["dynCall_" + sig].apply(null, [ptr].concat(args));
  643. }
  644. return Module["dynCall_" + sig].call(null, ptr);
  645. }
  646. function dynCall(sig, ptr, args) {
  647. if (sig.indexOf("j") != -1) {
  648. return dynCallLegacy(sig, ptr, args);
  649. }
  650. return wasmTable.get(ptr).apply(null, args);
  651. }
  652. function ___assert_fail(condition, filename, line, func) {
  653. abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function"]);
  654. }
  655. var PATH = {splitPath: function(filename) {
  656. var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
  657. return splitPathRe.exec(filename).slice(1);
  658. }, normalizeArray: function(parts, allowAboveRoot) {
  659. var up = 0;
  660. for (var i = parts.length - 1; i >= 0; i--) {
  661. var last = parts[i];
  662. if (last === ".") {
  663. parts.splice(i, 1);
  664. } else if (last === "..") {
  665. parts.splice(i, 1);
  666. up++;
  667. } else if (up) {
  668. parts.splice(i, 1);
  669. up--;
  670. }
  671. }
  672. if (allowAboveRoot) {
  673. for (; up; up--) {
  674. parts.unshift("..");
  675. }
  676. }
  677. return parts;
  678. }, normalize: function(path) {
  679. var isAbsolute = path.charAt(0) === "/", trailingSlash = path.substr(-1) === "/";
  680. path = PATH.normalizeArray(path.split("/").filter(function(p) {
  681. return !!p;
  682. }), !isAbsolute).join("/");
  683. if (!path && !isAbsolute) {
  684. path = ".";
  685. }
  686. if (path && trailingSlash) {
  687. path += "/";
  688. }
  689. return (isAbsolute ? "/" : "") + path;
  690. }, dirname: function(path) {
  691. var result = PATH.splitPath(path), root = result[0], dir = result[1];
  692. if (!root && !dir) {
  693. return ".";
  694. }
  695. if (dir) {
  696. dir = dir.substr(0, dir.length - 1);
  697. }
  698. return root + dir;
  699. }, basename: function(path) {
  700. if (path === "/")
  701. return "/";
  702. path = PATH.normalize(path);
  703. path = path.replace(/\/$/, "");
  704. var lastSlash = path.lastIndexOf("/");
  705. if (lastSlash === -1)
  706. return path;
  707. return path.substr(lastSlash + 1);
  708. }, extname: function(path) {
  709. return PATH.splitPath(path)[3];
  710. }, join: function() {
  711. var paths = Array.prototype.slice.call(arguments, 0);
  712. return PATH.normalize(paths.join("/"));
  713. }, join2: function(l, r) {
  714. return PATH.normalize(l + "/" + r);
  715. }};
  716. function getRandomDevice() {
  717. if (typeof crypto === "object" && typeof crypto["getRandomValues"] === "function") {
  718. var randomBuffer = new Uint8Array(1);
  719. return function() {
  720. crypto.getRandomValues(randomBuffer);
  721. return randomBuffer[0];
  722. };
  723. } else if (ENVIRONMENT_IS_NODE) {
  724. try {
  725. var crypto_module = require("crypto");
  726. return function() {
  727. return crypto_module["randomBytes"](1)[0];
  728. };
  729. } catch (e) {
  730. }
  731. }
  732. return function() {
  733. abort("randomDevice");
  734. };
  735. }
  736. var PATH_FS = {resolve: function() {
  737. var resolvedPath = "", resolvedAbsolute = false;
  738. for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
  739. var path = i >= 0 ? arguments[i] : FS.cwd();
  740. if (typeof path !== "string") {
  741. throw new TypeError("Arguments to path.resolve must be strings");
  742. } else if (!path) {
  743. return "";
  744. }
  745. resolvedPath = path + "/" + resolvedPath;
  746. resolvedAbsolute = path.charAt(0) === "/";
  747. }
  748. resolvedPath = PATH.normalizeArray(resolvedPath.split("/").filter(function(p) {
  749. return !!p;
  750. }), !resolvedAbsolute).join("/");
  751. return (resolvedAbsolute ? "/" : "") + resolvedPath || ".";
  752. }, relative: function(from, to) {
  753. from = PATH_FS.resolve(from).substr(1);
  754. to = PATH_FS.resolve(to).substr(1);
  755. function trim(arr) {
  756. var start = 0;
  757. for (; start < arr.length; start++) {
  758. if (arr[start] !== "")
  759. break;
  760. }
  761. var end = arr.length - 1;
  762. for (; end >= 0; end--) {
  763. if (arr[end] !== "")
  764. break;
  765. }
  766. if (start > end)
  767. return [];
  768. return arr.slice(start, end - start + 1);
  769. }
  770. var fromParts = trim(from.split("/"));
  771. var toParts = trim(to.split("/"));
  772. var length = Math.min(fromParts.length, toParts.length);
  773. var samePartsLength = length;
  774. for (var i = 0; i < length; i++) {
  775. if (fromParts[i] !== toParts[i]) {
  776. samePartsLength = i;
  777. break;
  778. }
  779. }
  780. var outputParts = [];
  781. for (var i = samePartsLength; i < fromParts.length; i++) {
  782. outputParts.push("..");
  783. }
  784. outputParts = outputParts.concat(toParts.slice(samePartsLength));
  785. return outputParts.join("/");
  786. }};
  787. var TTY = {ttys: [], init: function() {
  788. }, shutdown: function() {
  789. }, register: function(dev, ops) {
  790. TTY.ttys[dev] = {input: [], output: [], ops};
  791. FS.registerDevice(dev, TTY.stream_ops);
  792. }, stream_ops: {open: function(stream) {
  793. var tty = TTY.ttys[stream.node.rdev];
  794. if (!tty) {
  795. throw new FS.ErrnoError(43);
  796. }
  797. stream.tty = tty;
  798. stream.seekable = false;
  799. }, close: function(stream) {
  800. stream.tty.ops.flush(stream.tty);
  801. }, flush: function(stream) {
  802. stream.tty.ops.flush(stream.tty);
  803. }, read: function(stream, buffer2, offset, length, pos) {
  804. if (!stream.tty || !stream.tty.ops.get_char) {
  805. throw new FS.ErrnoError(60);
  806. }
  807. var bytesRead = 0;
  808. for (var i = 0; i < length; i++) {
  809. var result;
  810. try {
  811. result = stream.tty.ops.get_char(stream.tty);
  812. } catch (e) {
  813. throw new FS.ErrnoError(29);
  814. }
  815. if (result === void 0 && bytesRead === 0) {
  816. throw new FS.ErrnoError(6);
  817. }
  818. if (result === null || result === void 0)
  819. break;
  820. bytesRead++;
  821. buffer2[offset + i] = result;
  822. }
  823. if (bytesRead) {
  824. stream.node.timestamp = Date.now();
  825. }
  826. return bytesRead;
  827. }, write: function(stream, buffer2, offset, length, pos) {
  828. if (!stream.tty || !stream.tty.ops.put_char) {
  829. throw new FS.ErrnoError(60);
  830. }
  831. try {
  832. for (var i = 0; i < length; i++) {
  833. stream.tty.ops.put_char(stream.tty, buffer2[offset + i]);
  834. }
  835. } catch (e) {
  836. throw new FS.ErrnoError(29);
  837. }
  838. if (length) {
  839. stream.node.timestamp = Date.now();
  840. }
  841. return i;
  842. }}, default_tty_ops: {get_char: function(tty) {
  843. if (!tty.input.length) {
  844. var result = null;
  845. if (ENVIRONMENT_IS_NODE) {
  846. var BUFSIZE = 256;
  847. var buf = Buffer.alloc ? Buffer.alloc(BUFSIZE) : new Buffer(BUFSIZE);
  848. var bytesRead = 0;
  849. try {
  850. bytesRead = nodeFS.readSync(process.stdin.fd, buf, 0, BUFSIZE, null);
  851. } catch (e) {
  852. if (e.toString().indexOf("EOF") != -1)
  853. bytesRead = 0;
  854. else
  855. throw e;
  856. }
  857. if (bytesRead > 0) {
  858. result = buf.slice(0, bytesRead).toString("utf-8");
  859. } else {
  860. result = null;
  861. }
  862. } else if (typeof window != "undefined" && typeof window.prompt == "function") {
  863. result = window.prompt("Input: ");
  864. if (result !== null) {
  865. result += "\n";
  866. }
  867. } else if (typeof readline == "function") {
  868. result = readline();
  869. if (result !== null) {
  870. result += "\n";
  871. }
  872. }
  873. if (!result) {
  874. return null;
  875. }
  876. tty.input = intArrayFromString(result, true);
  877. }
  878. return tty.input.shift();
  879. }, put_char: function(tty, val) {
  880. if (val === null || val === 10) {
  881. out(UTF8ArrayToString(tty.output, 0));
  882. tty.output = [];
  883. } else {
  884. if (val != 0)
  885. tty.output.push(val);
  886. }
  887. }, flush: function(tty) {
  888. if (tty.output && tty.output.length > 0) {
  889. out(UTF8ArrayToString(tty.output, 0));
  890. tty.output = [];
  891. }
  892. }}, default_tty1_ops: {put_char: function(tty, val) {
  893. if (val === null || val === 10) {
  894. err(UTF8ArrayToString(tty.output, 0));
  895. tty.output = [];
  896. } else {
  897. if (val != 0)
  898. tty.output.push(val);
  899. }
  900. }, flush: function(tty) {
  901. if (tty.output && tty.output.length > 0) {
  902. err(UTF8ArrayToString(tty.output, 0));
  903. tty.output = [];
  904. }
  905. }}};
  906. function mmapAlloc(size) {
  907. var alignedSize = alignMemory(size, 16384);
  908. var ptr = _malloc(alignedSize);
  909. while (size < alignedSize)
  910. HEAP8[ptr + size++] = 0;
  911. return ptr;
  912. }
  913. var MEMFS = {ops_table: null, mount: function(mount) {
  914. return MEMFS.createNode(null, "/", 16384 | 511, 0);
  915. }, createNode: function(parent, name, mode, dev) {
  916. if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
  917. throw new FS.ErrnoError(63);
  918. }
  919. if (!MEMFS.ops_table) {
  920. MEMFS.ops_table = {dir: {node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, lookup: MEMFS.node_ops.lookup, mknod: MEMFS.node_ops.mknod, rename: MEMFS.node_ops.rename, unlink: MEMFS.node_ops.unlink, rmdir: MEMFS.node_ops.rmdir, readdir: MEMFS.node_ops.readdir, symlink: MEMFS.node_ops.symlink}, stream: {llseek: MEMFS.stream_ops.llseek}}, file: {node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr}, stream: {llseek: MEMFS.stream_ops.llseek, read: MEMFS.stream_ops.read, write: MEMFS.stream_ops.write, allocate: MEMFS.stream_ops.allocate, mmap: MEMFS.stream_ops.mmap, msync: MEMFS.stream_ops.msync}}, link: {node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, readlink: MEMFS.node_ops.readlink}, stream: {}}, chrdev: {node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr}, stream: FS.chrdev_stream_ops}};
  921. }
  922. var node = FS.createNode(parent, name, mode, dev);
  923. if (FS.isDir(node.mode)) {
  924. node.node_ops = MEMFS.ops_table.dir.node;
  925. node.stream_ops = MEMFS.ops_table.dir.stream;
  926. node.contents = {};
  927. } else if (FS.isFile(node.mode)) {
  928. node.node_ops = MEMFS.ops_table.file.node;
  929. node.stream_ops = MEMFS.ops_table.file.stream;
  930. node.usedBytes = 0;
  931. node.contents = null;
  932. } else if (FS.isLink(node.mode)) {
  933. node.node_ops = MEMFS.ops_table.link.node;
  934. node.stream_ops = MEMFS.ops_table.link.stream;
  935. } else if (FS.isChrdev(node.mode)) {
  936. node.node_ops = MEMFS.ops_table.chrdev.node;
  937. node.stream_ops = MEMFS.ops_table.chrdev.stream;
  938. }
  939. node.timestamp = Date.now();
  940. if (parent) {
  941. parent.contents[name] = node;
  942. }
  943. return node;
  944. }, getFileDataAsRegularArray: function(node) {
  945. if (node.contents && node.contents.subarray) {
  946. var arr = [];
  947. for (var i = 0; i < node.usedBytes; ++i)
  948. arr.push(node.contents[i]);
  949. return arr;
  950. }
  951. return node.contents;
  952. }, getFileDataAsTypedArray: function(node) {
  953. if (!node.contents)
  954. return new Uint8Array(0);
  955. if (node.contents.subarray)
  956. return node.contents.subarray(0, node.usedBytes);
  957. return new Uint8Array(node.contents);
  958. }, expandFileStorage: function(node, newCapacity) {
  959. var prevCapacity = node.contents ? node.contents.length : 0;
  960. if (prevCapacity >= newCapacity)
  961. return;
  962. var CAPACITY_DOUBLING_MAX = 1024 * 1024;
  963. newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) >>> 0);
  964. if (prevCapacity != 0)
  965. newCapacity = Math.max(newCapacity, 256);
  966. var oldContents = node.contents;
  967. node.contents = new Uint8Array(newCapacity);
  968. if (node.usedBytes > 0)
  969. node.contents.set(oldContents.subarray(0, node.usedBytes), 0);
  970. return;
  971. }, resizeFileStorage: function(node, newSize) {
  972. if (node.usedBytes == newSize)
  973. return;
  974. if (newSize == 0) {
  975. node.contents = null;
  976. node.usedBytes = 0;
  977. return;
  978. }
  979. if (!node.contents || node.contents.subarray) {
  980. var oldContents = node.contents;
  981. node.contents = new Uint8Array(newSize);
  982. if (oldContents) {
  983. node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes)));
  984. }
  985. node.usedBytes = newSize;
  986. return;
  987. }
  988. if (!node.contents)
  989. node.contents = [];
  990. if (node.contents.length > newSize)
  991. node.contents.length = newSize;
  992. else
  993. while (node.contents.length < newSize)
  994. node.contents.push(0);
  995. node.usedBytes = newSize;
  996. }, node_ops: {getattr: function(node) {
  997. var attr = {};
  998. attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
  999. attr.ino = node.id;
  1000. attr.mode = node.mode;
  1001. attr.nlink = 1;
  1002. attr.uid = 0;
  1003. attr.gid = 0;
  1004. attr.rdev = node.rdev;
  1005. if (FS.isDir(node.mode)) {
  1006. attr.size = 4096;
  1007. } else if (FS.isFile(node.mode)) {
  1008. attr.size = node.usedBytes;
  1009. } else if (FS.isLink(node.mode)) {
  1010. attr.size = node.link.length;
  1011. } else {
  1012. attr.size = 0;
  1013. }
  1014. attr.atime = new Date(node.timestamp);
  1015. attr.mtime = new Date(node.timestamp);
  1016. attr.ctime = new Date(node.timestamp);
  1017. attr.blksize = 4096;
  1018. attr.blocks = Math.ceil(attr.size / attr.blksize);
  1019. return attr;
  1020. }, setattr: function(node, attr) {
  1021. if (attr.mode !== void 0) {
  1022. node.mode = attr.mode;
  1023. }
  1024. if (attr.timestamp !== void 0) {
  1025. node.timestamp = attr.timestamp;
  1026. }
  1027. if (attr.size !== void 0) {
  1028. MEMFS.resizeFileStorage(node, attr.size);
  1029. }
  1030. }, lookup: function(parent, name) {
  1031. throw FS.genericErrors[44];
  1032. }, mknod: function(parent, name, mode, dev) {
  1033. return MEMFS.createNode(parent, name, mode, dev);
  1034. }, rename: function(old_node, new_dir, new_name) {
  1035. if (FS.isDir(old_node.mode)) {
  1036. var new_node;
  1037. try {
  1038. new_node = FS.lookupNode(new_dir, new_name);
  1039. } catch (e) {
  1040. }
  1041. if (new_node) {
  1042. for (var i in new_node.contents) {
  1043. throw new FS.ErrnoError(55);
  1044. }
  1045. }
  1046. }
  1047. delete old_node.parent.contents[old_node.name];
  1048. old_node.name = new_name;
  1049. new_dir.contents[new_name] = old_node;
  1050. old_node.parent = new_dir;
  1051. }, unlink: function(parent, name) {
  1052. delete parent.contents[name];
  1053. }, rmdir: function(parent, name) {
  1054. var node = FS.lookupNode(parent, name);
  1055. for (var i in node.contents) {
  1056. throw new FS.ErrnoError(55);
  1057. }
  1058. delete parent.contents[name];
  1059. }, readdir: function(node) {
  1060. var entries = [".", ".."];
  1061. for (var key2 in node.contents) {
  1062. if (!node.contents.hasOwnProperty(key2)) {
  1063. continue;
  1064. }
  1065. entries.push(key2);
  1066. }
  1067. return entries;
  1068. }, symlink: function(parent, newname, oldpath) {
  1069. var node = MEMFS.createNode(parent, newname, 511 | 40960, 0);
  1070. node.link = oldpath;
  1071. return node;
  1072. }, readlink: function(node) {
  1073. if (!FS.isLink(node.mode)) {
  1074. throw new FS.ErrnoError(28);
  1075. }
  1076. return node.link;
  1077. }}, stream_ops: {read: function(stream, buffer2, offset, length, position) {
  1078. var contents = stream.node.contents;
  1079. if (position >= stream.node.usedBytes)
  1080. return 0;
  1081. var size = Math.min(stream.node.usedBytes - position, length);
  1082. if (size > 8 && contents.subarray) {
  1083. buffer2.set(contents.subarray(position, position + size), offset);
  1084. } else {
  1085. for (var i = 0; i < size; i++)
  1086. buffer2[offset + i] = contents[position + i];
  1087. }
  1088. return size;
  1089. }, write: function(stream, buffer2, offset, length, position, canOwn) {
  1090. if (buffer2.buffer === HEAP8.buffer) {
  1091. canOwn = false;
  1092. }
  1093. if (!length)
  1094. return 0;
  1095. var node = stream.node;
  1096. node.timestamp = Date.now();
  1097. if (buffer2.subarray && (!node.contents || node.contents.subarray)) {
  1098. if (canOwn) {
  1099. node.contents = buffer2.subarray(offset, offset + length);
  1100. node.usedBytes = length;
  1101. return length;
  1102. } else if (node.usedBytes === 0 && position === 0) {
  1103. node.contents = buffer2.slice(offset, offset + length);
  1104. node.usedBytes = length;
  1105. return length;
  1106. } else if (position + length <= node.usedBytes) {
  1107. node.contents.set(buffer2.subarray(offset, offset + length), position);
  1108. return length;
  1109. }
  1110. }
  1111. MEMFS.expandFileStorage(node, position + length);
  1112. if (node.contents.subarray && buffer2.subarray) {
  1113. node.contents.set(buffer2.subarray(offset, offset + length), position);
  1114. } else {
  1115. for (var i = 0; i < length; i++) {
  1116. node.contents[position + i] = buffer2[offset + i];
  1117. }
  1118. }
  1119. node.usedBytes = Math.max(node.usedBytes, position + length);
  1120. return length;
  1121. }, llseek: function(stream, offset, whence) {
  1122. var position = offset;
  1123. if (whence === 1) {
  1124. position += stream.position;
  1125. } else if (whence === 2) {
  1126. if (FS.isFile(stream.node.mode)) {
  1127. position += stream.node.usedBytes;
  1128. }
  1129. }
  1130. if (position < 0) {
  1131. throw new FS.ErrnoError(28);
  1132. }
  1133. return position;
  1134. }, allocate: function(stream, offset, length) {
  1135. MEMFS.expandFileStorage(stream.node, offset + length);
  1136. stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length);
  1137. }, mmap: function(stream, address, length, position, prot, flags) {
  1138. assert(address === 0);
  1139. if (!FS.isFile(stream.node.mode)) {
  1140. throw new FS.ErrnoError(43);
  1141. }
  1142. var ptr;
  1143. var allocated;
  1144. var contents = stream.node.contents;
  1145. if (!(flags & 2) && contents.buffer === buffer) {
  1146. allocated = false;
  1147. ptr = contents.byteOffset;
  1148. } else {
  1149. if (position > 0 || position + length < contents.length) {
  1150. if (contents.subarray) {
  1151. contents = contents.subarray(position, position + length);
  1152. } else {
  1153. contents = Array.prototype.slice.call(contents, position, position + length);
  1154. }
  1155. }
  1156. allocated = true;
  1157. ptr = mmapAlloc(length);
  1158. if (!ptr) {
  1159. throw new FS.ErrnoError(48);
  1160. }
  1161. HEAP8.set(contents, ptr);
  1162. }
  1163. return {ptr, allocated};
  1164. }, msync: function(stream, buffer2, offset, length, mmapFlags) {
  1165. if (!FS.isFile(stream.node.mode)) {
  1166. throw new FS.ErrnoError(43);
  1167. }
  1168. if (mmapFlags & 2) {
  1169. return 0;
  1170. }
  1171. var bytesWritten = MEMFS.stream_ops.write(stream, buffer2, 0, length, offset, false);
  1172. return 0;
  1173. }}};
  1174. var FS = {root: null, mounts: [], devices: {}, streams: [], nextInode: 1, nameTable: null, currentPath: "/", initialized: false, ignorePermissions: true, trackingDelegate: {}, tracking: {openFlags: {READ: 1, WRITE: 2}}, ErrnoError: null, genericErrors: {}, filesystems: null, syncFSRequests: 0, lookupPath: function(path, opts) {
  1175. path = PATH_FS.resolve(FS.cwd(), path);
  1176. opts = opts || {};
  1177. if (!path)
  1178. return {path: "", node: null};
  1179. var defaults = {follow_mount: true, recurse_count: 0};
  1180. for (var key2 in defaults) {
  1181. if (opts[key2] === void 0) {
  1182. opts[key2] = defaults[key2];
  1183. }
  1184. }
  1185. if (opts.recurse_count > 8) {
  1186. throw new FS.ErrnoError(32);
  1187. }
  1188. var parts = PATH.normalizeArray(path.split("/").filter(function(p) {
  1189. return !!p;
  1190. }), false);
  1191. var current = FS.root;
  1192. var current_path = "/";
  1193. for (var i = 0; i < parts.length; i++) {
  1194. var islast = i === parts.length - 1;
  1195. if (islast && opts.parent) {
  1196. break;
  1197. }
  1198. current = FS.lookupNode(current, parts[i]);
  1199. current_path = PATH.join2(current_path, parts[i]);
  1200. if (FS.isMountpoint(current)) {
  1201. if (!islast || islast && opts.follow_mount) {
  1202. current = current.mounted.root;
  1203. }
  1204. }
  1205. if (!islast || opts.follow) {
  1206. var count = 0;
  1207. while (FS.isLink(current.mode)) {
  1208. var link = FS.readlink(current_path);
  1209. current_path = PATH_FS.resolve(PATH.dirname(current_path), link);
  1210. var lookup = FS.lookupPath(current_path, {recurse_count: opts.recurse_count});
  1211. current = lookup.node;
  1212. if (count++ > 40) {
  1213. throw new FS.ErrnoError(32);
  1214. }
  1215. }
  1216. }
  1217. }
  1218. return {path: current_path, node: current};
  1219. }, getPath: function(node) {
  1220. var path;
  1221. while (true) {
  1222. if (FS.isRoot(node)) {
  1223. var mount = node.mount.mountpoint;
  1224. if (!path)
  1225. return mount;
  1226. return mount[mount.length - 1] !== "/" ? mount + "/" + path : mount + path;
  1227. }
  1228. path = path ? node.name + "/" + path : node.name;
  1229. node = node.parent;
  1230. }
  1231. }, hashName: function(parentid, name) {
  1232. var hash = 0;
  1233. for (var i = 0; i < name.length; i++) {
  1234. hash = (hash << 5) - hash + name.charCodeAt(i) | 0;
  1235. }
  1236. return (parentid + hash >>> 0) % FS.nameTable.length;
  1237. }, hashAddNode: function(node) {
  1238. var hash = FS.hashName(node.parent.id, node.name);
  1239. node.name_next = FS.nameTable[hash];
  1240. FS.nameTable[hash] = node;
  1241. }, hashRemoveNode: function(node) {
  1242. var hash = FS.hashName(node.parent.id, node.name);
  1243. if (FS.nameTable[hash] === node) {
  1244. FS.nameTable[hash] = node.name_next;
  1245. } else {
  1246. var current = FS.nameTable[hash];
  1247. while (current) {
  1248. if (current.name_next === node) {
  1249. current.name_next = node.name_next;
  1250. break;
  1251. }
  1252. current = current.name_next;
  1253. }
  1254. }
  1255. }, lookupNode: function(parent, name) {
  1256. var errCode = FS.mayLookup(parent);
  1257. if (errCode) {
  1258. throw new FS.ErrnoError(errCode, parent);
  1259. }
  1260. var hash = FS.hashName(parent.id, name);
  1261. for (var node = FS.nameTable[hash]; node; node = node.name_next) {
  1262. var nodeName = node.name;
  1263. if (node.parent.id === parent.id && nodeName === name) {
  1264. return node;
  1265. }
  1266. }
  1267. return FS.lookup(parent, name);
  1268. }, createNode: function(parent, name, mode, rdev) {
  1269. var node = new FS.FSNode(parent, name, mode, rdev);
  1270. FS.hashAddNode(node);
  1271. return node;
  1272. }, destroyNode: function(node) {
  1273. FS.hashRemoveNode(node);
  1274. }, isRoot: function(node) {
  1275. return node === node.parent;
  1276. }, isMountpoint: function(node) {
  1277. return !!node.mounted;
  1278. }, isFile: function(mode) {
  1279. return (mode & 61440) === 32768;
  1280. }, isDir: function(mode) {
  1281. return (mode & 61440) === 16384;
  1282. }, isLink: function(mode) {
  1283. return (mode & 61440) === 40960;
  1284. }, isChrdev: function(mode) {
  1285. return (mode & 61440) === 8192;
  1286. }, isBlkdev: function(mode) {
  1287. return (mode & 61440) === 24576;
  1288. }, isFIFO: function(mode) {
  1289. return (mode & 61440) === 4096;
  1290. }, isSocket: function(mode) {
  1291. return (mode & 49152) === 49152;
  1292. }, flagModes: {r: 0, "r+": 2, w: 577, "w+": 578, a: 1089, "a+": 1090}, modeStringToFlags: function(str) {
  1293. var flags = FS.flagModes[str];
  1294. if (typeof flags === "undefined") {
  1295. throw new Error("Unknown file open mode: " + str);
  1296. }
  1297. return flags;
  1298. }, flagsToPermissionString: function(flag) {
  1299. var perms = ["r", "w", "rw"][flag & 3];
  1300. if (flag & 512) {
  1301. perms += "w";
  1302. }
  1303. return perms;
  1304. }, nodePermissions: function(node, perms) {
  1305. if (FS.ignorePermissions) {
  1306. return 0;
  1307. }
  1308. if (perms.indexOf("r") !== -1 && !(node.mode & 292)) {
  1309. return 2;
  1310. } else if (perms.indexOf("w") !== -1 && !(node.mode & 146)) {
  1311. return 2;
  1312. } else if (perms.indexOf("x") !== -1 && !(node.mode & 73)) {
  1313. return 2;
  1314. }
  1315. return 0;
  1316. }, mayLookup: function(dir) {
  1317. var errCode = FS.nodePermissions(dir, "x");
  1318. if (errCode)
  1319. return errCode;
  1320. if (!dir.node_ops.lookup)
  1321. return 2;
  1322. return 0;
  1323. }, mayCreate: function(dir, name) {
  1324. try {
  1325. var node = FS.lookupNode(dir, name);
  1326. return 20;
  1327. } catch (e) {
  1328. }
  1329. return FS.nodePermissions(dir, "wx");
  1330. }, mayDelete: function(dir, name, isdir) {
  1331. var node;
  1332. try {
  1333. node = FS.lookupNode(dir, name);
  1334. } catch (e) {
  1335. return e.errno;
  1336. }
  1337. var errCode = FS.nodePermissions(dir, "wx");
  1338. if (errCode) {
  1339. return errCode;
  1340. }
  1341. if (isdir) {
  1342. if (!FS.isDir(node.mode)) {
  1343. return 54;
  1344. }
  1345. if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
  1346. return 10;
  1347. }
  1348. } else {
  1349. if (FS.isDir(node.mode)) {
  1350. return 31;
  1351. }
  1352. }
  1353. return 0;
  1354. }, mayOpen: function(node, flags) {
  1355. if (!node) {
  1356. return 44;
  1357. }
  1358. if (FS.isLink(node.mode)) {
  1359. return 32;
  1360. } else if (FS.isDir(node.mode)) {
  1361. if (FS.flagsToPermissionString(flags) !== "r" || flags & 512) {
  1362. return 31;
  1363. }
  1364. }
  1365. return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
  1366. }, MAX_OPEN_FDS: 4096, nextfd: function(fd_start, fd_end) {
  1367. fd_start = fd_start || 0;
  1368. fd_end = fd_end || FS.MAX_OPEN_FDS;
  1369. for (var fd = fd_start; fd <= fd_end; fd++) {
  1370. if (!FS.streams[fd]) {
  1371. return fd;
  1372. }
  1373. }
  1374. throw new FS.ErrnoError(33);
  1375. }, getStream: function(fd) {
  1376. return FS.streams[fd];
  1377. }, createStream: function(stream, fd_start, fd_end) {
  1378. if (!FS.FSStream) {
  1379. FS.FSStream = function() {
  1380. };
  1381. FS.FSStream.prototype = {object: {get: function() {
  1382. return this.node;
  1383. }, set: function(val) {
  1384. this.node = val;
  1385. }}, isRead: {get: function() {
  1386. return (this.flags & 2097155) !== 1;
  1387. }}, isWrite: {get: function() {
  1388. return (this.flags & 2097155) !== 0;
  1389. }}, isAppend: {get: function() {
  1390. return this.flags & 1024;
  1391. }}};
  1392. }
  1393. var newStream = new FS.FSStream();
  1394. for (var p in stream) {
  1395. newStream[p] = stream[p];
  1396. }
  1397. stream = newStream;
  1398. var fd = FS.nextfd(fd_start, fd_end);
  1399. stream.fd = fd;
  1400. FS.streams[fd] = stream;
  1401. return stream;
  1402. }, closeStream: function(fd) {
  1403. FS.streams[fd] = null;
  1404. }, chrdev_stream_ops: {open: function(stream) {
  1405. var device = FS.getDevice(stream.node.rdev);
  1406. stream.stream_ops = device.stream_ops;
  1407. if (stream.stream_ops.open) {
  1408. stream.stream_ops.open(stream);
  1409. }
  1410. }, llseek: function() {
  1411. throw new FS.ErrnoError(70);
  1412. }}, major: function(dev) {
  1413. return dev >> 8;
  1414. }, minor: function(dev) {
  1415. return dev & 255;
  1416. }, makedev: function(ma, mi) {
  1417. return ma << 8 | mi;
  1418. }, registerDevice: function(dev, ops) {
  1419. FS.devices[dev] = {stream_ops: ops};
  1420. }, getDevice: function(dev) {
  1421. return FS.devices[dev];
  1422. }, getMounts: function(mount) {
  1423. var mounts = [];
  1424. var check = [mount];
  1425. while (check.length) {
  1426. var m = check.pop();
  1427. mounts.push(m);
  1428. check.push.apply(check, m.mounts);
  1429. }
  1430. return mounts;
  1431. }, syncfs: function(populate, callback) {
  1432. if (typeof populate === "function") {
  1433. callback = populate;
  1434. populate = false;
  1435. }
  1436. FS.syncFSRequests++;
  1437. if (FS.syncFSRequests > 1) {
  1438. err("warning: " + FS.syncFSRequests + " FS.syncfs operations in flight at once, probably just doing extra work");
  1439. }
  1440. var mounts = FS.getMounts(FS.root.mount);
  1441. var completed = 0;
  1442. function doCallback(errCode) {
  1443. FS.syncFSRequests--;
  1444. return callback(errCode);
  1445. }
  1446. function done(errCode) {
  1447. if (errCode) {
  1448. if (!done.errored) {
  1449. done.errored = true;
  1450. return doCallback(errCode);
  1451. }
  1452. return;
  1453. }
  1454. if (++completed >= mounts.length) {
  1455. doCallback(null);
  1456. }
  1457. }
  1458. mounts.forEach(function(mount) {
  1459. if (!mount.type.syncfs) {
  1460. return done(null);
  1461. }
  1462. mount.type.syncfs(mount, populate, done);
  1463. });
  1464. }, mount: function(type, opts, mountpoint) {
  1465. var root = mountpoint === "/";
  1466. var pseudo = !mountpoint;
  1467. var node;
  1468. if (root && FS.root) {
  1469. throw new FS.ErrnoError(10);
  1470. } else if (!root && !pseudo) {
  1471. var lookup = FS.lookupPath(mountpoint, {follow_mount: false});
  1472. mountpoint = lookup.path;
  1473. node = lookup.node;
  1474. if (FS.isMountpoint(node)) {
  1475. throw new FS.ErrnoError(10);
  1476. }
  1477. if (!FS.isDir(node.mode)) {
  1478. throw new FS.ErrnoError(54);
  1479. }
  1480. }
  1481. var mount = {type, opts, mountpoint, mounts: []};
  1482. var mountRoot = type.mount(mount);
  1483. mountRoot.mount = mount;
  1484. mount.root = mountRoot;
  1485. if (root) {
  1486. FS.root = mountRoot;
  1487. } else if (node) {
  1488. node.mounted = mount;
  1489. if (node.mount) {
  1490. node.mount.mounts.push(mount);
  1491. }
  1492. }
  1493. return mountRoot;
  1494. }, unmount: function(mountpoint) {
  1495. var lookup = FS.lookupPath(mountpoint, {follow_mount: false});
  1496. if (!FS.isMountpoint(lookup.node)) {
  1497. throw new FS.ErrnoError(28);
  1498. }
  1499. var node = lookup.node;
  1500. var mount = node.mounted;
  1501. var mounts = FS.getMounts(mount);
  1502. Object.keys(FS.nameTable).forEach(function(hash) {
  1503. var current = FS.nameTable[hash];
  1504. while (current) {
  1505. var next = current.name_next;
  1506. if (mounts.indexOf(current.mount) !== -1) {
  1507. FS.destroyNode(current);
  1508. }
  1509. current = next;
  1510. }
  1511. });
  1512. node.mounted = null;
  1513. var idx = node.mount.mounts.indexOf(mount);
  1514. node.mount.mounts.splice(idx, 1);
  1515. }, lookup: function(parent, name) {
  1516. return parent.node_ops.lookup(parent, name);
  1517. }, mknod: function(path, mode, dev) {
  1518. var lookup = FS.lookupPath(path, {parent: true});
  1519. var parent = lookup.node;
  1520. var name = PATH.basename(path);
  1521. if (!name || name === "." || name === "..") {
  1522. throw new FS.ErrnoError(28);
  1523. }
  1524. var errCode = FS.mayCreate(parent, name);
  1525. if (errCode) {
  1526. throw new FS.ErrnoError(errCode);
  1527. }
  1528. if (!parent.node_ops.mknod) {
  1529. throw new FS.ErrnoError(63);
  1530. }
  1531. return parent.node_ops.mknod(parent, name, mode, dev);
  1532. }, create: function(path, mode) {
  1533. mode = mode !== void 0 ? mode : 438;
  1534. mode &= 4095;
  1535. mode |= 32768;
  1536. return FS.mknod(path, mode, 0);
  1537. }, mkdir: function(path, mode) {
  1538. mode = mode !== void 0 ? mode : 511;
  1539. mode &= 511 | 512;
  1540. mode |= 16384;
  1541. return FS.mknod(path, mode, 0);
  1542. }, mkdirTree: function(path, mode) {
  1543. var dirs = path.split("/");
  1544. var d = "";
  1545. for (var i = 0; i < dirs.length; ++i) {
  1546. if (!dirs[i])
  1547. continue;
  1548. d += "/" + dirs[i];
  1549. try {
  1550. FS.mkdir(d, mode);
  1551. } catch (e) {
  1552. if (e.errno != 20)
  1553. throw e;
  1554. }
  1555. }
  1556. }, mkdev: function(path, mode, dev) {
  1557. if (typeof dev === "undefined") {
  1558. dev = mode;
  1559. mode = 438;
  1560. }
  1561. mode |= 8192;
  1562. return FS.mknod(path, mode, dev);
  1563. }, symlink: function(oldpath, newpath) {
  1564. if (!PATH_FS.resolve(oldpath)) {
  1565. throw new FS.ErrnoError(44);
  1566. }
  1567. var lookup = FS.lookupPath(newpath, {parent: true});
  1568. var parent = lookup.node;
  1569. if (!parent) {
  1570. throw new FS.ErrnoError(44);
  1571. }
  1572. var newname = PATH.basename(newpath);
  1573. var errCode = FS.mayCreate(parent, newname);
  1574. if (errCode) {
  1575. throw new FS.ErrnoError(errCode);
  1576. }
  1577. if (!parent.node_ops.symlink) {
  1578. throw new FS.ErrnoError(63);
  1579. }
  1580. return parent.node_ops.symlink(parent, newname, oldpath);
  1581. }, rename: function(old_path, new_path) {
  1582. var old_dirname = PATH.dirname(old_path);
  1583. var new_dirname = PATH.dirname(new_path);
  1584. var old_name = PATH.basename(old_path);
  1585. var new_name = PATH.basename(new_path);
  1586. var lookup, old_dir, new_dir;
  1587. lookup = FS.lookupPath(old_path, {parent: true});
  1588. old_dir = lookup.node;
  1589. lookup = FS.lookupPath(new_path, {parent: true});
  1590. new_dir = lookup.node;
  1591. if (!old_dir || !new_dir)
  1592. throw new FS.ErrnoError(44);
  1593. if (old_dir.mount !== new_dir.mount) {
  1594. throw new FS.ErrnoError(75);
  1595. }
  1596. var old_node = FS.lookupNode(old_dir, old_name);
  1597. var relative = PATH_FS.relative(old_path, new_dirname);
  1598. if (relative.charAt(0) !== ".") {
  1599. throw new FS.ErrnoError(28);
  1600. }
  1601. relative = PATH_FS.relative(new_path, old_dirname);
  1602. if (relative.charAt(0) !== ".") {
  1603. throw new FS.ErrnoError(55);
  1604. }
  1605. var new_node;
  1606. try {
  1607. new_node = FS.lookupNode(new_dir, new_name);
  1608. } catch (e) {
  1609. }
  1610. if (old_node === new_node) {
  1611. return;
  1612. }
  1613. var isdir = FS.isDir(old_node.mode);
  1614. var errCode = FS.mayDelete(old_dir, old_name, isdir);
  1615. if (errCode) {
  1616. throw new FS.ErrnoError(errCode);
  1617. }
  1618. errCode = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name);
  1619. if (errCode) {
  1620. throw new FS.ErrnoError(errCode);
  1621. }
  1622. if (!old_dir.node_ops.rename) {
  1623. throw new FS.ErrnoError(63);
  1624. }
  1625. if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) {
  1626. throw new FS.ErrnoError(10);
  1627. }
  1628. if (new_dir !== old_dir) {
  1629. errCode = FS.nodePermissions(old_dir, "w");
  1630. if (errCode) {
  1631. throw new FS.ErrnoError(errCode);
  1632. }
  1633. }
  1634. try {
  1635. if (FS.trackingDelegate["willMovePath"]) {
  1636. FS.trackingDelegate["willMovePath"](old_path, new_path);
  1637. }
  1638. } catch (e) {
  1639. err("FS.trackingDelegate['willMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message);
  1640. }
  1641. FS.hashRemoveNode(old_node);
  1642. try {
  1643. old_dir.node_ops.rename(old_node, new_dir, new_name);
  1644. } catch (e) {
  1645. throw e;
  1646. } finally {
  1647. FS.hashAddNode(old_node);
  1648. }
  1649. try {
  1650. if (FS.trackingDelegate["onMovePath"])
  1651. FS.trackingDelegate["onMovePath"](old_path, new_path);
  1652. } catch (e) {
  1653. err("FS.trackingDelegate['onMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message);
  1654. }
  1655. }, rmdir: function(path) {
  1656. var lookup = FS.lookupPath(path, {parent: true});
  1657. var parent = lookup.node;
  1658. var name = PATH.basename(path);
  1659. var node = FS.lookupNode(parent, name);
  1660. var errCode = FS.mayDelete(parent, name, true);
  1661. if (errCode) {
  1662. throw new FS.ErrnoError(errCode);
  1663. }
  1664. if (!parent.node_ops.rmdir) {
  1665. throw new FS.ErrnoError(63);
  1666. }
  1667. if (FS.isMountpoint(node)) {
  1668. throw new FS.ErrnoError(10);
  1669. }
  1670. try {
  1671. if (FS.trackingDelegate["willDeletePath"]) {
  1672. FS.trackingDelegate["willDeletePath"](path);
  1673. }
  1674. } catch (e) {
  1675. err("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message);
  1676. }
  1677. parent.node_ops.rmdir(parent, name);
  1678. FS.destroyNode(node);
  1679. try {
  1680. if (FS.trackingDelegate["onDeletePath"])
  1681. FS.trackingDelegate["onDeletePath"](path);
  1682. } catch (e) {
  1683. err("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message);
  1684. }
  1685. }, readdir: function(path) {
  1686. var lookup = FS.lookupPath(path, {follow: true});
  1687. var node = lookup.node;
  1688. if (!node.node_ops.readdir) {
  1689. throw new FS.ErrnoError(54);
  1690. }
  1691. return node.node_ops.readdir(node);
  1692. }, unlink: function(path) {
  1693. var lookup = FS.lookupPath(path, {parent: true});
  1694. var parent = lookup.node;
  1695. var name = PATH.basename(path);
  1696. var node = FS.lookupNode(parent, name);
  1697. var errCode = FS.mayDelete(parent, name, false);
  1698. if (errCode) {
  1699. throw new FS.ErrnoError(errCode);
  1700. }
  1701. if (!parent.node_ops.unlink) {
  1702. throw new FS.ErrnoError(63);
  1703. }
  1704. if (FS.isMountpoint(node)) {
  1705. throw new FS.ErrnoError(10);
  1706. }
  1707. try {
  1708. if (FS.trackingDelegate["willDeletePath"]) {
  1709. FS.trackingDelegate["willDeletePath"](path);
  1710. }
  1711. } catch (e) {
  1712. err("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message);
  1713. }
  1714. parent.node_ops.unlink(parent, name);
  1715. FS.destroyNode(node);
  1716. try {
  1717. if (FS.trackingDelegate["onDeletePath"])
  1718. FS.trackingDelegate["onDeletePath"](path);
  1719. } catch (e) {
  1720. err("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message);
  1721. }
  1722. }, readlink: function(path) {
  1723. var lookup = FS.lookupPath(path);
  1724. var link = lookup.node;
  1725. if (!link) {
  1726. throw new FS.ErrnoError(44);
  1727. }
  1728. if (!link.node_ops.readlink) {
  1729. throw new FS.ErrnoError(28);
  1730. }
  1731. return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link));
  1732. }, stat: function(path, dontFollow) {
  1733. var lookup = FS.lookupPath(path, {follow: !dontFollow});
  1734. var node = lookup.node;
  1735. if (!node) {
  1736. throw new FS.ErrnoError(44);
  1737. }
  1738. if (!node.node_ops.getattr) {
  1739. throw new FS.ErrnoError(63);
  1740. }
  1741. return node.node_ops.getattr(node);
  1742. }, lstat: function(path) {
  1743. return FS.stat(path, true);
  1744. }, chmod: function(path, mode, dontFollow) {
  1745. var node;
  1746. if (typeof path === "string") {
  1747. var lookup = FS.lookupPath(path, {follow: !dontFollow});
  1748. node = lookup.node;
  1749. } else {
  1750. node = path;
  1751. }
  1752. if (!node.node_ops.setattr) {
  1753. throw new FS.ErrnoError(63);
  1754. }
  1755. node.node_ops.setattr(node, {mode: mode & 4095 | node.mode & ~4095, timestamp: Date.now()});
  1756. }, lchmod: function(path, mode) {
  1757. FS.chmod(path, mode, true);
  1758. }, fchmod: function(fd, mode) {
  1759. var stream = FS.getStream(fd);
  1760. if (!stream) {
  1761. throw new FS.ErrnoError(8);
  1762. }
  1763. FS.chmod(stream.node, mode);
  1764. }, chown: function(path, uid, gid, dontFollow) {
  1765. var node;
  1766. if (typeof path === "string") {
  1767. var lookup = FS.lookupPath(path, {follow: !dontFollow});
  1768. node = lookup.node;
  1769. } else {
  1770. node = path;
  1771. }
  1772. if (!node.node_ops.setattr) {
  1773. throw new FS.ErrnoError(63);
  1774. }
  1775. node.node_ops.setattr(node, {timestamp: Date.now()});
  1776. }, lchown: function(path, uid, gid) {
  1777. FS.chown(path, uid, gid, true);
  1778. }, fchown: function(fd, uid, gid) {
  1779. var stream = FS.getStream(fd);
  1780. if (!stream) {
  1781. throw new FS.ErrnoError(8);
  1782. }
  1783. FS.chown(stream.node, uid, gid);
  1784. }, truncate: function(path, len) {
  1785. if (len < 0) {
  1786. throw new FS.ErrnoError(28);
  1787. }
  1788. var node;
  1789. if (typeof path === "string") {
  1790. var lookup = FS.lookupPath(path, {follow: true});
  1791. node = lookup.node;
  1792. } else {
  1793. node = path;
  1794. }
  1795. if (!node.node_ops.setattr) {
  1796. throw new FS.ErrnoError(63);
  1797. }
  1798. if (FS.isDir(node.mode)) {
  1799. throw new FS.ErrnoError(31);
  1800. }
  1801. if (!FS.isFile(node.mode)) {
  1802. throw new FS.ErrnoError(28);
  1803. }
  1804. var errCode = FS.nodePermissions(node, "w");
  1805. if (errCode) {
  1806. throw new FS.ErrnoError(errCode);
  1807. }
  1808. node.node_ops.setattr(node, {size: len, timestamp: Date.now()});
  1809. }, ftruncate: function(fd, len) {
  1810. var stream = FS.getStream(fd);
  1811. if (!stream) {
  1812. throw new FS.ErrnoError(8);
  1813. }
  1814. if ((stream.flags & 2097155) === 0) {
  1815. throw new FS.ErrnoError(28);
  1816. }
  1817. FS.truncate(stream.node, len);
  1818. }, utime: function(path, atime, mtime) {
  1819. var lookup = FS.lookupPath(path, {follow: true});
  1820. var node = lookup.node;
  1821. node.node_ops.setattr(node, {timestamp: Math.max(atime, mtime)});
  1822. }, open: function(path, flags, mode, fd_start, fd_end) {
  1823. if (path === "") {
  1824. throw new FS.ErrnoError(44);
  1825. }
  1826. flags = typeof flags === "string" ? FS.modeStringToFlags(flags) : flags;
  1827. mode = typeof mode === "undefined" ? 438 : mode;
  1828. if (flags & 64) {
  1829. mode = mode & 4095 | 32768;
  1830. } else {
  1831. mode = 0;
  1832. }
  1833. var node;
  1834. if (typeof path === "object") {
  1835. node = path;
  1836. } else {
  1837. path = PATH.normalize(path);
  1838. try {
  1839. var lookup = FS.lookupPath(path, {follow: !(flags & 131072)});
  1840. node = lookup.node;
  1841. } catch (e) {
  1842. }
  1843. }
  1844. var created = false;
  1845. if (flags & 64) {
  1846. if (node) {
  1847. if (flags & 128) {
  1848. throw new FS.ErrnoError(20);
  1849. }
  1850. } else {
  1851. node = FS.mknod(path, mode, 0);
  1852. created = true;
  1853. }
  1854. }
  1855. if (!node) {
  1856. throw new FS.ErrnoError(44);
  1857. }
  1858. if (FS.isChrdev(node.mode)) {
  1859. flags &= ~512;
  1860. }
  1861. if (flags & 65536 && !FS.isDir(node.mode)) {
  1862. throw new FS.ErrnoError(54);
  1863. }
  1864. if (!created) {
  1865. var errCode = FS.mayOpen(node, flags);
  1866. if (errCode) {
  1867. throw new FS.ErrnoError(errCode);
  1868. }
  1869. }
  1870. if (flags & 512) {
  1871. FS.truncate(node, 0);
  1872. }
  1873. flags &= ~(128 | 512 | 131072);
  1874. var stream = FS.createStream({node, path: FS.getPath(node), flags, seekable: true, position: 0, stream_ops: node.stream_ops, ungotten: [], error: false}, fd_start, fd_end);
  1875. if (stream.stream_ops.open) {
  1876. stream.stream_ops.open(stream);
  1877. }
  1878. if (Module["logReadFiles"] && !(flags & 1)) {
  1879. if (!FS.readFiles)
  1880. FS.readFiles = {};
  1881. if (!(path in FS.readFiles)) {
  1882. FS.readFiles[path] = 1;
  1883. err("FS.trackingDelegate error on read file: " + path);
  1884. }
  1885. }
  1886. try {
  1887. if (FS.trackingDelegate["onOpenFile"]) {
  1888. var trackingFlags = 0;
  1889. if ((flags & 2097155) !== 1) {
  1890. trackingFlags |= FS.tracking.openFlags.READ;
  1891. }
  1892. if ((flags & 2097155) !== 0) {
  1893. trackingFlags |= FS.tracking.openFlags.WRITE;
  1894. }
  1895. FS.trackingDelegate["onOpenFile"](path, trackingFlags);
  1896. }
  1897. } catch (e) {
  1898. err("FS.trackingDelegate['onOpenFile']('" + path + "', flags) threw an exception: " + e.message);
  1899. }
  1900. return stream;
  1901. }, close: function(stream) {
  1902. if (FS.isClosed(stream)) {
  1903. throw new FS.ErrnoError(8);
  1904. }
  1905. if (stream.getdents)
  1906. stream.getdents = null;
  1907. try {
  1908. if (stream.stream_ops.close) {
  1909. stream.stream_ops.close(stream);
  1910. }
  1911. } catch (e) {
  1912. throw e;
  1913. } finally {
  1914. FS.closeStream(stream.fd);
  1915. }
  1916. stream.fd = null;
  1917. }, isClosed: function(stream) {
  1918. return stream.fd === null;
  1919. }, llseek: function(stream, offset, whence) {
  1920. if (FS.isClosed(stream)) {
  1921. throw new FS.ErrnoError(8);
  1922. }
  1923. if (!stream.seekable || !stream.stream_ops.llseek) {
  1924. throw new FS.ErrnoError(70);
  1925. }
  1926. if (whence != 0 && whence != 1 && whence != 2) {
  1927. throw new FS.ErrnoError(28);
  1928. }
  1929. stream.position = stream.stream_ops.llseek(stream, offset, whence);
  1930. stream.ungotten = [];
  1931. return stream.position;
  1932. }, read: function(stream, buffer2, offset, length, position) {
  1933. if (length < 0 || position < 0) {
  1934. throw new FS.ErrnoError(28);
  1935. }
  1936. if (FS.isClosed(stream)) {
  1937. throw new FS.ErrnoError(8);
  1938. }
  1939. if ((stream.flags & 2097155) === 1) {
  1940. throw new FS.ErrnoError(8);
  1941. }
  1942. if (FS.isDir(stream.node.mode)) {
  1943. throw new FS.ErrnoError(31);
  1944. }
  1945. if (!stream.stream_ops.read) {
  1946. throw new FS.ErrnoError(28);
  1947. }
  1948. var seeking = typeof position !== "undefined";
  1949. if (!seeking) {
  1950. position = stream.position;
  1951. } else if (!stream.seekable) {
  1952. throw new FS.ErrnoError(70);
  1953. }
  1954. var bytesRead = stream.stream_ops.read(stream, buffer2, offset, length, position);
  1955. if (!seeking)
  1956. stream.position += bytesRead;
  1957. return bytesRead;
  1958. }, write: function(stream, buffer2, offset, length, position, canOwn) {
  1959. if (length < 0 || position < 0) {
  1960. throw new FS.ErrnoError(28);
  1961. }
  1962. if (FS.isClosed(stream)) {
  1963. throw new FS.ErrnoError(8);
  1964. }
  1965. if ((stream.flags & 2097155) === 0) {
  1966. throw new FS.ErrnoError(8);
  1967. }
  1968. if (FS.isDir(stream.node.mode)) {
  1969. throw new FS.ErrnoError(31);
  1970. }
  1971. if (!stream.stream_ops.write) {
  1972. throw new FS.ErrnoError(28);
  1973. }
  1974. if (stream.seekable && stream.flags & 1024) {
  1975. FS.llseek(stream, 0, 2);
  1976. }
  1977. var seeking = typeof position !== "undefined";
  1978. if (!seeking) {
  1979. position = stream.position;
  1980. } else if (!stream.seekable) {
  1981. throw new FS.ErrnoError(70);
  1982. }
  1983. var bytesWritten = stream.stream_ops.write(stream, buffer2, offset, length, position, canOwn);
  1984. if (!seeking)
  1985. stream.position += bytesWritten;
  1986. try {
  1987. if (stream.path && FS.trackingDelegate["onWriteToFile"])
  1988. FS.trackingDelegate["onWriteToFile"](stream.path);
  1989. } catch (e) {
  1990. err("FS.trackingDelegate['onWriteToFile']('" + stream.path + "') threw an exception: " + e.message);
  1991. }
  1992. return bytesWritten;
  1993. }, allocate: function(stream, offset, length) {
  1994. if (FS.isClosed(stream)) {
  1995. throw new FS.ErrnoError(8);
  1996. }
  1997. if (offset < 0 || length <= 0) {
  1998. throw new FS.ErrnoError(28);
  1999. }
  2000. if ((stream.flags & 2097155) === 0) {
  2001. throw new FS.ErrnoError(8);
  2002. }
  2003. if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
  2004. throw new FS.ErrnoError(43);
  2005. }
  2006. if (!stream.stream_ops.allocate) {
  2007. throw new FS.ErrnoError(138);
  2008. }
  2009. stream.stream_ops.allocate(stream, offset, length);
  2010. }, mmap: function(stream, address, length, position, prot, flags) {
  2011. if ((prot & 2) !== 0 && (flags & 2) === 0 && (stream.flags & 2097155) !== 2) {
  2012. throw new FS.ErrnoError(2);
  2013. }
  2014. if ((stream.flags & 2097155) === 1) {
  2015. throw new FS.ErrnoError(2);
  2016. }
  2017. if (!stream.stream_ops.mmap) {
  2018. throw new FS.ErrnoError(43);
  2019. }
  2020. return stream.stream_ops.mmap(stream, address, length, position, prot, flags);
  2021. }, msync: function(stream, buffer2, offset, length, mmapFlags) {
  2022. if (!stream || !stream.stream_ops.msync) {
  2023. return 0;
  2024. }
  2025. return stream.stream_ops.msync(stream, buffer2, offset, length, mmapFlags);
  2026. }, munmap: function(stream) {
  2027. return 0;
  2028. }, ioctl: function(stream, cmd, arg) {
  2029. if (!stream.stream_ops.ioctl) {
  2030. throw new FS.ErrnoError(59);
  2031. }
  2032. return stream.stream_ops.ioctl(stream, cmd, arg);
  2033. }, readFile: function(path, opts) {
  2034. opts = opts || {};
  2035. opts.flags = opts.flags || 0;
  2036. opts.encoding = opts.encoding || "binary";
  2037. if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
  2038. throw new Error('Invalid encoding type "' + opts.encoding + '"');
  2039. }
  2040. var ret;
  2041. var stream = FS.open(path, opts.flags);
  2042. var stat = FS.stat(path);
  2043. var length = stat.size;
  2044. var buf = new Uint8Array(length);
  2045. FS.read(stream, buf, 0, length, 0);
  2046. if (opts.encoding === "utf8") {
  2047. ret = UTF8ArrayToString(buf, 0);
  2048. } else if (opts.encoding === "binary") {
  2049. ret = buf;
  2050. }
  2051. FS.close(stream);
  2052. return ret;
  2053. }, writeFile: function(path, data, opts) {
  2054. opts = opts || {};
  2055. opts.flags = opts.flags || 577;
  2056. var stream = FS.open(path, opts.flags, opts.mode);
  2057. if (typeof data === "string") {
  2058. var buf = new Uint8Array(lengthBytesUTF8(data) + 1);
  2059. var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
  2060. FS.write(stream, buf, 0, actualNumBytes, void 0, opts.canOwn);
  2061. } else if (ArrayBuffer.isView(data)) {
  2062. FS.write(stream, data, 0, data.byteLength, void 0, opts.canOwn);
  2063. } else {
  2064. throw new Error("Unsupported data type");
  2065. }
  2066. FS.close(stream);
  2067. }, cwd: function() {
  2068. return FS.currentPath;
  2069. }, chdir: function(path) {
  2070. var lookup = FS.lookupPath(path, {follow: true});
  2071. if (lookup.node === null) {
  2072. throw new FS.ErrnoError(44);
  2073. }
  2074. if (!FS.isDir(lookup.node.mode)) {
  2075. throw new FS.ErrnoError(54);
  2076. }
  2077. var errCode = FS.nodePermissions(lookup.node, "x");
  2078. if (errCode) {
  2079. throw new FS.ErrnoError(errCode);
  2080. }
  2081. FS.currentPath = lookup.path;
  2082. }, createDefaultDirectories: function() {
  2083. FS.mkdir("/tmp");
  2084. FS.mkdir("/home");
  2085. FS.mkdir("/home/web_user");
  2086. }, createDefaultDevices: function() {
  2087. FS.mkdir("/dev");
  2088. FS.registerDevice(FS.makedev(1, 3), {read: function() {
  2089. return 0;
  2090. }, write: function(stream, buffer2, offset, length, pos) {
  2091. return length;
  2092. }});
  2093. FS.mkdev("/dev/null", FS.makedev(1, 3));
  2094. TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
  2095. TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
  2096. FS.mkdev("/dev/tty", FS.makedev(5, 0));
  2097. FS.mkdev("/dev/tty1", FS.makedev(6, 0));
  2098. var random_device = getRandomDevice();
  2099. FS.createDevice("/dev", "random", random_device);
  2100. FS.createDevice("/dev", "urandom", random_device);
  2101. FS.mkdir("/dev/shm");
  2102. FS.mkdir("/dev/shm/tmp");
  2103. }, createSpecialDirectories: function() {
  2104. FS.mkdir("/proc");
  2105. FS.mkdir("/proc/self");
  2106. FS.mkdir("/proc/self/fd");
  2107. FS.mount({mount: function() {
  2108. var node = FS.createNode("/proc/self", "fd", 16384 | 511, 73);
  2109. node.node_ops = {lookup: function(parent, name) {
  2110. var fd = +name;
  2111. var stream = FS.getStream(fd);
  2112. if (!stream)
  2113. throw new FS.ErrnoError(8);
  2114. var ret = {parent: null, mount: {mountpoint: "fake"}, node_ops: {readlink: function() {
  2115. return stream.path;
  2116. }}};
  2117. ret.parent = ret;
  2118. return ret;
  2119. }};
  2120. return node;
  2121. }}, {}, "/proc/self/fd");
  2122. }, createStandardStreams: function() {
  2123. if (Module["stdin"]) {
  2124. FS.createDevice("/dev", "stdin", Module["stdin"]);
  2125. } else {
  2126. FS.symlink("/dev/tty", "/dev/stdin");
  2127. }
  2128. if (Module["stdout"]) {
  2129. FS.createDevice("/dev", "stdout", null, Module["stdout"]);
  2130. } else {
  2131. FS.symlink("/dev/tty", "/dev/stdout");
  2132. }
  2133. if (Module["stderr"]) {
  2134. FS.createDevice("/dev", "stderr", null, Module["stderr"]);
  2135. } else {
  2136. FS.symlink("/dev/tty1", "/dev/stderr");
  2137. }
  2138. var stdin = FS.open("/dev/stdin", 0);
  2139. var stdout = FS.open("/dev/stdout", 1);
  2140. var stderr = FS.open("/dev/stderr", 1);
  2141. }, ensureErrnoError: function() {
  2142. if (FS.ErrnoError)
  2143. return;
  2144. FS.ErrnoError = function ErrnoError(errno, node) {
  2145. this.node = node;
  2146. this.setErrno = function(errno2) {
  2147. this.errno = errno2;
  2148. };
  2149. this.setErrno(errno);
  2150. this.message = "FS error";
  2151. };
  2152. FS.ErrnoError.prototype = new Error();
  2153. FS.ErrnoError.prototype.constructor = FS.ErrnoError;
  2154. [44].forEach(function(code) {
  2155. FS.genericErrors[code] = new FS.ErrnoError(code);
  2156. FS.genericErrors[code].stack = "<generic error, no stack>";
  2157. });
  2158. }, staticInit: function() {
  2159. FS.ensureErrnoError();
  2160. FS.nameTable = new Array(4096);
  2161. FS.mount(MEMFS, {}, "/");
  2162. FS.createDefaultDirectories();
  2163. FS.createDefaultDevices();
  2164. FS.createSpecialDirectories();
  2165. FS.filesystems = {MEMFS};
  2166. }, init: function(input, output, error) {
  2167. FS.init.initialized = true;
  2168. FS.ensureErrnoError();
  2169. Module["stdin"] = input || Module["stdin"];
  2170. Module["stdout"] = output || Module["stdout"];
  2171. Module["stderr"] = error || Module["stderr"];
  2172. FS.createStandardStreams();
  2173. }, quit: function() {
  2174. FS.init.initialized = false;
  2175. var fflush = Module["_fflush"];
  2176. if (fflush)
  2177. fflush(0);
  2178. for (var i = 0; i < FS.streams.length; i++) {
  2179. var stream = FS.streams[i];
  2180. if (!stream) {
  2181. continue;
  2182. }
  2183. FS.close(stream);
  2184. }
  2185. }, getMode: function(canRead, canWrite) {
  2186. var mode = 0;
  2187. if (canRead)
  2188. mode |= 292 | 73;
  2189. if (canWrite)
  2190. mode |= 146;
  2191. return mode;
  2192. }, findObject: function(path, dontResolveLastLink) {
  2193. var ret = FS.analyzePath(path, dontResolveLastLink);
  2194. if (ret.exists) {
  2195. return ret.object;
  2196. } else {
  2197. return null;
  2198. }
  2199. }, analyzePath: function(path, dontResolveLastLink) {
  2200. try {
  2201. var lookup = FS.lookupPath(path, {follow: !dontResolveLastLink});
  2202. path = lookup.path;
  2203. } catch (e) {
  2204. }
  2205. var ret = {isRoot: false, exists: false, error: 0, name: null, path: null, object: null, parentExists: false, parentPath: null, parentObject: null};
  2206. try {
  2207. var lookup = FS.lookupPath(path, {parent: true});
  2208. ret.parentExists = true;
  2209. ret.parentPath = lookup.path;
  2210. ret.parentObject = lookup.node;
  2211. ret.name = PATH.basename(path);
  2212. lookup = FS.lookupPath(path, {follow: !dontResolveLastLink});
  2213. ret.exists = true;
  2214. ret.path = lookup.path;
  2215. ret.object = lookup.node;
  2216. ret.name = lookup.node.name;
  2217. ret.isRoot = lookup.path === "/";
  2218. } catch (e) {
  2219. ret.error = e.errno;
  2220. }
  2221. return ret;
  2222. }, createPath: function(parent, path, canRead, canWrite) {
  2223. parent = typeof parent === "string" ? parent : FS.getPath(parent);
  2224. var parts = path.split("/").reverse();
  2225. while (parts.length) {
  2226. var part = parts.pop();
  2227. if (!part)
  2228. continue;
  2229. var current = PATH.join2(parent, part);
  2230. try {
  2231. FS.mkdir(current);
  2232. } catch (e) {
  2233. }
  2234. parent = current;
  2235. }
  2236. return current;
  2237. }, createFile: function(parent, name, properties, canRead, canWrite) {
  2238. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  2239. var mode = FS.getMode(canRead, canWrite);
  2240. return FS.create(path, mode);
  2241. }, createDataFile: function(parent, name, data, canRead, canWrite, canOwn) {
  2242. var path = name ? PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name) : parent;
  2243. var mode = FS.getMode(canRead, canWrite);
  2244. var node = FS.create(path, mode);
  2245. if (data) {
  2246. if (typeof data === "string") {
  2247. var arr = new Array(data.length);
  2248. for (var i = 0, len = data.length; i < len; ++i)
  2249. arr[i] = data.charCodeAt(i);
  2250. data = arr;
  2251. }
  2252. FS.chmod(node, mode | 146);
  2253. var stream = FS.open(node, 577);
  2254. FS.write(stream, data, 0, data.length, 0, canOwn);
  2255. FS.close(stream);
  2256. FS.chmod(node, mode);
  2257. }
  2258. return node;
  2259. }, createDevice: function(parent, name, input, output) {
  2260. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  2261. var mode = FS.getMode(!!input, !!output);
  2262. if (!FS.createDevice.major)
  2263. FS.createDevice.major = 64;
  2264. var dev = FS.makedev(FS.createDevice.major++, 0);
  2265. FS.registerDevice(dev, {open: function(stream) {
  2266. stream.seekable = false;
  2267. }, close: function(stream) {
  2268. if (output && output.buffer && output.buffer.length) {
  2269. output(10);
  2270. }
  2271. }, read: function(stream, buffer2, offset, length, pos) {
  2272. var bytesRead = 0;
  2273. for (var i = 0; i < length; i++) {
  2274. var result;
  2275. try {
  2276. result = input();
  2277. } catch (e) {
  2278. throw new FS.ErrnoError(29);
  2279. }
  2280. if (result === void 0 && bytesRead === 0) {
  2281. throw new FS.ErrnoError(6);
  2282. }
  2283. if (result === null || result === void 0)
  2284. break;
  2285. bytesRead++;
  2286. buffer2[offset + i] = result;
  2287. }
  2288. if (bytesRead) {
  2289. stream.node.timestamp = Date.now();
  2290. }
  2291. return bytesRead;
  2292. }, write: function(stream, buffer2, offset, length, pos) {
  2293. for (var i = 0; i < length; i++) {
  2294. try {
  2295. output(buffer2[offset + i]);
  2296. } catch (e) {
  2297. throw new FS.ErrnoError(29);
  2298. }
  2299. }
  2300. if (length) {
  2301. stream.node.timestamp = Date.now();
  2302. }
  2303. return i;
  2304. }});
  2305. return FS.mkdev(path, mode, dev);
  2306. }, forceLoadFile: function(obj) {
  2307. if (obj.isDevice || obj.isFolder || obj.link || obj.contents)
  2308. return true;
  2309. if (typeof XMLHttpRequest !== "undefined") {
  2310. 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.");
  2311. } else if (read_) {
  2312. try {
  2313. obj.contents = intArrayFromString(read_(obj.url), true);
  2314. obj.usedBytes = obj.contents.length;
  2315. } catch (e) {
  2316. throw new FS.ErrnoError(29);
  2317. }
  2318. } else {
  2319. throw new Error("Cannot load without read() or XMLHttpRequest.");
  2320. }
  2321. }, createLazyFile: function(parent, name, url, canRead, canWrite) {
  2322. function LazyUint8Array() {
  2323. this.lengthKnown = false;
  2324. this.chunks = [];
  2325. }
  2326. LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
  2327. if (idx > this.length - 1 || idx < 0) {
  2328. return void 0;
  2329. }
  2330. var chunkOffset = idx % this.chunkSize;
  2331. var chunkNum = idx / this.chunkSize | 0;
  2332. return this.getter(chunkNum)[chunkOffset];
  2333. };
  2334. LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
  2335. this.getter = getter;
  2336. };
  2337. LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
  2338. var xhr = new XMLHttpRequest();
  2339. xhr.open("HEAD", url, false);
  2340. xhr.send(null);
  2341. if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304))
  2342. throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
  2343. var datalength = Number(xhr.getResponseHeader("Content-length"));
  2344. var header;
  2345. var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
  2346. var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip";
  2347. var chunkSize = 1024 * 1024;
  2348. if (!hasByteServing)
  2349. chunkSize = datalength;
  2350. var doXHR = function(from, to) {
  2351. if (from > to)
  2352. throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
  2353. if (to > datalength - 1)
  2354. throw new Error("only " + datalength + " bytes available! programmer error!");
  2355. var xhr2 = new XMLHttpRequest();
  2356. xhr2.open("GET", url, false);
  2357. if (datalength !== chunkSize)
  2358. xhr2.setRequestHeader("Range", "bytes=" + from + "-" + to);
  2359. if (typeof Uint8Array != "undefined")
  2360. xhr2.responseType = "arraybuffer";
  2361. if (xhr2.overrideMimeType) {
  2362. xhr2.overrideMimeType("text/plain; charset=x-user-defined");
  2363. }
  2364. xhr2.send(null);
  2365. if (!(xhr2.status >= 200 && xhr2.status < 300 || xhr2.status === 304))
  2366. throw new Error("Couldn't load " + url + ". Status: " + xhr2.status);
  2367. if (xhr2.response !== void 0) {
  2368. return new Uint8Array(xhr2.response || []);
  2369. } else {
  2370. return intArrayFromString(xhr2.responseText || "", true);
  2371. }
  2372. };
  2373. var lazyArray2 = this;
  2374. lazyArray2.setDataGetter(function(chunkNum) {
  2375. var start = chunkNum * chunkSize;
  2376. var end = (chunkNum + 1) * chunkSize - 1;
  2377. end = Math.min(end, datalength - 1);
  2378. if (typeof lazyArray2.chunks[chunkNum] === "undefined") {
  2379. lazyArray2.chunks[chunkNum] = doXHR(start, end);
  2380. }
  2381. if (typeof lazyArray2.chunks[chunkNum] === "undefined")
  2382. throw new Error("doXHR failed!");
  2383. return lazyArray2.chunks[chunkNum];
  2384. });
  2385. if (usesGzip || !datalength) {
  2386. chunkSize = datalength = 1;
  2387. datalength = this.getter(0).length;
  2388. chunkSize = datalength;
  2389. out("LazyFiles on gzip forces download of the whole file when length is accessed");
  2390. }
  2391. this._length = datalength;
  2392. this._chunkSize = chunkSize;
  2393. this.lengthKnown = true;
  2394. };
  2395. if (typeof XMLHttpRequest !== "undefined") {
  2396. if (!ENVIRONMENT_IS_WORKER)
  2397. throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";
  2398. var lazyArray = new LazyUint8Array();
  2399. Object.defineProperties(lazyArray, {length: {get: function() {
  2400. if (!this.lengthKnown) {
  2401. this.cacheLength();
  2402. }
  2403. return this._length;
  2404. }}, chunkSize: {get: function() {
  2405. if (!this.lengthKnown) {
  2406. this.cacheLength();
  2407. }
  2408. return this._chunkSize;
  2409. }}});
  2410. var properties = {isDevice: false, contents: lazyArray};
  2411. } else {
  2412. var properties = {isDevice: false, url};
  2413. }
  2414. var node = FS.createFile(parent, name, properties, canRead, canWrite);
  2415. if (properties.contents) {
  2416. node.contents = properties.contents;
  2417. } else if (properties.url) {
  2418. node.contents = null;
  2419. node.url = properties.url;
  2420. }
  2421. Object.defineProperties(node, {usedBytes: {get: function() {
  2422. return this.contents.length;
  2423. }}});
  2424. var stream_ops = {};
  2425. var keys = Object.keys(node.stream_ops);
  2426. keys.forEach(function(key2) {
  2427. var fn = node.stream_ops[key2];
  2428. stream_ops[key2] = function forceLoadLazyFile() {
  2429. FS.forceLoadFile(node);
  2430. return fn.apply(null, arguments);
  2431. };
  2432. });
  2433. stream_ops.read = function stream_ops_read(stream, buffer2, offset, length, position) {
  2434. FS.forceLoadFile(node);
  2435. var contents = stream.node.contents;
  2436. if (position >= contents.length)
  2437. return 0;
  2438. var size = Math.min(contents.length - position, length);
  2439. if (contents.slice) {
  2440. for (var i = 0; i < size; i++) {
  2441. buffer2[offset + i] = contents[position + i];
  2442. }
  2443. } else {
  2444. for (var i = 0; i < size; i++) {
  2445. buffer2[offset + i] = contents.get(position + i);
  2446. }
  2447. }
  2448. return size;
  2449. };
  2450. node.stream_ops = stream_ops;
  2451. return node;
  2452. }, createPreloadedFile: function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) {
  2453. Browser.init();
  2454. var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent;
  2455. var dep = getUniqueRunDependency("cp " + fullname);
  2456. function processData(byteArray) {
  2457. function finish(byteArray2) {
  2458. if (preFinish)
  2459. preFinish();
  2460. if (!dontCreateFile) {
  2461. FS.createDataFile(parent, name, byteArray2, canRead, canWrite, canOwn);
  2462. }
  2463. if (onload)
  2464. onload();
  2465. removeRunDependency(dep);
  2466. }
  2467. var handled = false;
  2468. Module["preloadPlugins"].forEach(function(plugin) {
  2469. if (handled)
  2470. return;
  2471. if (plugin["canHandle"](fullname)) {
  2472. plugin["handle"](byteArray, fullname, finish, function() {
  2473. if (onerror)
  2474. onerror();
  2475. removeRunDependency(dep);
  2476. });
  2477. handled = true;
  2478. }
  2479. });
  2480. if (!handled)
  2481. finish(byteArray);
  2482. }
  2483. addRunDependency(dep);
  2484. if (typeof url == "string") {
  2485. Browser.asyncLoad(url, function(byteArray) {
  2486. processData(byteArray);
  2487. }, onerror);
  2488. } else {
  2489. processData(url);
  2490. }
  2491. }, indexedDB: function() {
  2492. return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
  2493. }, DB_NAME: function() {
  2494. return "EM_FS_" + window.location.pathname;
  2495. }, DB_VERSION: 20, DB_STORE_NAME: "FILE_DATA", saveFilesToDB: function(paths, onload, onerror) {
  2496. onload = onload || function() {
  2497. };
  2498. onerror = onerror || function() {
  2499. };
  2500. var indexedDB = FS.indexedDB();
  2501. try {
  2502. var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
  2503. } catch (e) {
  2504. return onerror(e);
  2505. }
  2506. openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
  2507. out("creating db");
  2508. var db = openRequest.result;
  2509. db.createObjectStore(FS.DB_STORE_NAME);
  2510. };
  2511. openRequest.onsuccess = function openRequest_onsuccess() {
  2512. var db = openRequest.result;
  2513. var transaction = db.transaction([FS.DB_STORE_NAME], "readwrite");
  2514. var files = transaction.objectStore(FS.DB_STORE_NAME);
  2515. var ok = 0, fail = 0, total = paths.length;
  2516. function finish() {
  2517. if (fail == 0)
  2518. onload();
  2519. else
  2520. onerror();
  2521. }
  2522. paths.forEach(function(path) {
  2523. var putRequest = files.put(FS.analyzePath(path).object.contents, path);
  2524. putRequest.onsuccess = function putRequest_onsuccess() {
  2525. ok++;
  2526. if (ok + fail == total)
  2527. finish();
  2528. };
  2529. putRequest.onerror = function putRequest_onerror() {
  2530. fail++;
  2531. if (ok + fail == total)
  2532. finish();
  2533. };
  2534. });
  2535. transaction.onerror = onerror;
  2536. };
  2537. openRequest.onerror = onerror;
  2538. }, loadFilesFromDB: function(paths, onload, onerror) {
  2539. onload = onload || function() {
  2540. };
  2541. onerror = onerror || function() {
  2542. };
  2543. var indexedDB = FS.indexedDB();
  2544. try {
  2545. var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
  2546. } catch (e) {
  2547. return onerror(e);
  2548. }
  2549. openRequest.onupgradeneeded = onerror;
  2550. openRequest.onsuccess = function openRequest_onsuccess() {
  2551. var db = openRequest.result;
  2552. try {
  2553. var transaction = db.transaction([FS.DB_STORE_NAME], "readonly");
  2554. } catch (e) {
  2555. onerror(e);
  2556. return;
  2557. }
  2558. var files = transaction.objectStore(FS.DB_STORE_NAME);
  2559. var ok = 0, fail = 0, total = paths.length;
  2560. function finish() {
  2561. if (fail == 0)
  2562. onload();
  2563. else
  2564. onerror();
  2565. }
  2566. paths.forEach(function(path) {
  2567. var getRequest = files.get(path);
  2568. getRequest.onsuccess = function getRequest_onsuccess() {
  2569. if (FS.analyzePath(path).exists) {
  2570. FS.unlink(path);
  2571. }
  2572. FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
  2573. ok++;
  2574. if (ok + fail == total)
  2575. finish();
  2576. };
  2577. getRequest.onerror = function getRequest_onerror() {
  2578. fail++;
  2579. if (ok + fail == total)
  2580. finish();
  2581. };
  2582. });
  2583. transaction.onerror = onerror;
  2584. };
  2585. openRequest.onerror = onerror;
  2586. }};
  2587. var SYSCALLS = {mappings: {}, DEFAULT_POLLMASK: 5, umask: 511, calculateAt: function(dirfd, path) {
  2588. if (path[0] !== "/") {
  2589. var dir;
  2590. if (dirfd === -100) {
  2591. dir = FS.cwd();
  2592. } else {
  2593. var dirstream = FS.getStream(dirfd);
  2594. if (!dirstream)
  2595. throw new FS.ErrnoError(8);
  2596. dir = dirstream.path;
  2597. }
  2598. path = PATH.join2(dir, path);
  2599. }
  2600. return path;
  2601. }, doStat: function(func, path, buf) {
  2602. try {
  2603. var stat = func(path);
  2604. } catch (e) {
  2605. if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) {
  2606. return -54;
  2607. }
  2608. throw e;
  2609. }
  2610. HEAP32[buf >> 2] = stat.dev;
  2611. HEAP32[buf + 4 >> 2] = 0;
  2612. HEAP32[buf + 8 >> 2] = stat.ino;
  2613. HEAP32[buf + 12 >> 2] = stat.mode;
  2614. HEAP32[buf + 16 >> 2] = stat.nlink;
  2615. HEAP32[buf + 20 >> 2] = stat.uid;
  2616. HEAP32[buf + 24 >> 2] = stat.gid;
  2617. HEAP32[buf + 28 >> 2] = stat.rdev;
  2618. HEAP32[buf + 32 >> 2] = 0;
  2619. tempI64 = [stat.size >>> 0, (tempDouble = stat.size, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[buf + 40 >> 2] = tempI64[0], HEAP32[buf + 44 >> 2] = tempI64[1];
  2620. HEAP32[buf + 48 >> 2] = 4096;
  2621. HEAP32[buf + 52 >> 2] = stat.blocks;
  2622. HEAP32[buf + 56 >> 2] = stat.atime.getTime() / 1e3 | 0;
  2623. HEAP32[buf + 60 >> 2] = 0;
  2624. HEAP32[buf + 64 >> 2] = stat.mtime.getTime() / 1e3 | 0;
  2625. HEAP32[buf + 68 >> 2] = 0;
  2626. HEAP32[buf + 72 >> 2] = stat.ctime.getTime() / 1e3 | 0;
  2627. HEAP32[buf + 76 >> 2] = 0;
  2628. tempI64 = [stat.ino >>> 0, (tempDouble = stat.ino, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[buf + 80 >> 2] = tempI64[0], HEAP32[buf + 84 >> 2] = tempI64[1];
  2629. return 0;
  2630. }, doMsync: function(addr, stream, len, flags, offset) {
  2631. var buffer2 = HEAPU8.slice(addr, addr + len);
  2632. FS.msync(stream, buffer2, offset, len, flags);
  2633. }, doMkdir: function(path, mode) {
  2634. path = PATH.normalize(path);
  2635. if (path[path.length - 1] === "/")
  2636. path = path.substr(0, path.length - 1);
  2637. FS.mkdir(path, mode, 0);
  2638. return 0;
  2639. }, doMknod: function(path, mode, dev) {
  2640. switch (mode & 61440) {
  2641. case 32768:
  2642. case 8192:
  2643. case 24576:
  2644. case 4096:
  2645. case 49152:
  2646. break;
  2647. default:
  2648. return -28;
  2649. }
  2650. FS.mknod(path, mode, dev);
  2651. return 0;
  2652. }, doReadlink: function(path, buf, bufsize) {
  2653. if (bufsize <= 0)
  2654. return -28;
  2655. var ret = FS.readlink(path);
  2656. var len = Math.min(bufsize, lengthBytesUTF8(ret));
  2657. var endChar = HEAP8[buf + len];
  2658. stringToUTF8(ret, buf, bufsize + 1);
  2659. HEAP8[buf + len] = endChar;
  2660. return len;
  2661. }, doAccess: function(path, amode) {
  2662. if (amode & ~7) {
  2663. return -28;
  2664. }
  2665. var node;
  2666. var lookup = FS.lookupPath(path, {follow: true});
  2667. node = lookup.node;
  2668. if (!node) {
  2669. return -44;
  2670. }
  2671. var perms = "";
  2672. if (amode & 4)
  2673. perms += "r";
  2674. if (amode & 2)
  2675. perms += "w";
  2676. if (amode & 1)
  2677. perms += "x";
  2678. if (perms && FS.nodePermissions(node, perms)) {
  2679. return -2;
  2680. }
  2681. return 0;
  2682. }, doDup: function(path, flags, suggestFD) {
  2683. var suggest = FS.getStream(suggestFD);
  2684. if (suggest)
  2685. FS.close(suggest);
  2686. return FS.open(path, flags, 0, suggestFD, suggestFD).fd;
  2687. }, doReadv: function(stream, iov, iovcnt, offset) {
  2688. var ret = 0;
  2689. for (var i = 0; i < iovcnt; i++) {
  2690. var ptr = HEAP32[iov + i * 8 >> 2];
  2691. var len = HEAP32[iov + (i * 8 + 4) >> 2];
  2692. var curr = FS.read(stream, HEAP8, ptr, len, offset);
  2693. if (curr < 0)
  2694. return -1;
  2695. ret += curr;
  2696. if (curr < len)
  2697. break;
  2698. }
  2699. return ret;
  2700. }, doWritev: function(stream, iov, iovcnt, offset) {
  2701. var ret = 0;
  2702. for (var i = 0; i < iovcnt; i++) {
  2703. var ptr = HEAP32[iov + i * 8 >> 2];
  2704. var len = HEAP32[iov + (i * 8 + 4) >> 2];
  2705. var curr = FS.write(stream, HEAP8, ptr, len, offset);
  2706. if (curr < 0)
  2707. return -1;
  2708. ret += curr;
  2709. }
  2710. return ret;
  2711. }, varargs: void 0, get: function() {
  2712. SYSCALLS.varargs += 4;
  2713. var ret = HEAP32[SYSCALLS.varargs - 4 >> 2];
  2714. return ret;
  2715. }, getStr: function(ptr) {
  2716. var ret = UTF8ToString(ptr);
  2717. return ret;
  2718. }, getStreamFromFD: function(fd) {
  2719. var stream = FS.getStream(fd);
  2720. if (!stream)
  2721. throw new FS.ErrnoError(8);
  2722. return stream;
  2723. }, get64: function(low, high) {
  2724. return low;
  2725. }};
  2726. function ___sys_ioctl(fd, op, varargs) {
  2727. SYSCALLS.varargs = varargs;
  2728. try {
  2729. var stream = SYSCALLS.getStreamFromFD(fd);
  2730. switch (op) {
  2731. case 21509:
  2732. case 21505: {
  2733. if (!stream.tty)
  2734. return -59;
  2735. return 0;
  2736. }
  2737. case 21510:
  2738. case 21511:
  2739. case 21512:
  2740. case 21506:
  2741. case 21507:
  2742. case 21508: {
  2743. if (!stream.tty)
  2744. return -59;
  2745. return 0;
  2746. }
  2747. case 21519: {
  2748. if (!stream.tty)
  2749. return -59;
  2750. var argp = SYSCALLS.get();
  2751. HEAP32[argp >> 2] = 0;
  2752. return 0;
  2753. }
  2754. case 21520: {
  2755. if (!stream.tty)
  2756. return -59;
  2757. return -28;
  2758. }
  2759. case 21531: {
  2760. var argp = SYSCALLS.get();
  2761. return FS.ioctl(stream, op, argp);
  2762. }
  2763. case 21523: {
  2764. if (!stream.tty)
  2765. return -59;
  2766. return 0;
  2767. }
  2768. case 21524: {
  2769. if (!stream.tty)
  2770. return -59;
  2771. return 0;
  2772. }
  2773. default:
  2774. abort("bad ioctl syscall " + op);
  2775. }
  2776. } catch (e) {
  2777. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  2778. abort(e);
  2779. return -e.errno;
  2780. }
  2781. }
  2782. function ___sys_open(path, flags, varargs) {
  2783. SYSCALLS.varargs = varargs;
  2784. try {
  2785. var pathname = SYSCALLS.getStr(path);
  2786. var mode = SYSCALLS.get();
  2787. var stream = FS.open(pathname, flags, mode);
  2788. return stream.fd;
  2789. } catch (e) {
  2790. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  2791. abort(e);
  2792. return -e.errno;
  2793. }
  2794. }
  2795. var tupleRegistrations = {};
  2796. function runDestructors(destructors) {
  2797. while (destructors.length) {
  2798. var ptr = destructors.pop();
  2799. var del = destructors.pop();
  2800. del(ptr);
  2801. }
  2802. }
  2803. function simpleReadValueFromPointer(pointer) {
  2804. return this["fromWireType"](HEAPU32[pointer >> 2]);
  2805. }
  2806. var awaitingDependencies = {};
  2807. var registeredTypes = {};
  2808. var typeDependencies = {};
  2809. var char_0 = 48;
  2810. var char_9 = 57;
  2811. function makeLegalFunctionName(name) {
  2812. if (name === void 0) {
  2813. return "_unknown";
  2814. }
  2815. name = name.replace(/[^a-zA-Z0-9_]/g, "$");
  2816. var f = name.charCodeAt(0);
  2817. if (f >= char_0 && f <= char_9) {
  2818. return "_" + name;
  2819. } else {
  2820. return name;
  2821. }
  2822. }
  2823. function createNamedFunction(name, body) {
  2824. name = makeLegalFunctionName(name);
  2825. return new Function("body", "return function " + name + '() {\n "use strict"; return body.apply(this, arguments);\n};\n')(body);
  2826. }
  2827. function extendError(baseErrorType, errorName) {
  2828. var errorClass = createNamedFunction(errorName, function(message) {
  2829. this.name = errorName;
  2830. this.message = message;
  2831. var stack = new Error(message).stack;
  2832. if (stack !== void 0) {
  2833. this.stack = this.toString() + "\n" + stack.replace(/^Error(:[^\n]*)?\n/, "");
  2834. }
  2835. });
  2836. errorClass.prototype = Object.create(baseErrorType.prototype);
  2837. errorClass.prototype.constructor = errorClass;
  2838. errorClass.prototype.toString = function() {
  2839. if (this.message === void 0) {
  2840. return this.name;
  2841. } else {
  2842. return this.name + ": " + this.message;
  2843. }
  2844. };
  2845. return errorClass;
  2846. }
  2847. var InternalError = void 0;
  2848. function throwInternalError(message) {
  2849. throw new InternalError(message);
  2850. }
  2851. function whenDependentTypesAreResolved(myTypes, dependentTypes, getTypeConverters) {
  2852. myTypes.forEach(function(type) {
  2853. typeDependencies[type] = dependentTypes;
  2854. });
  2855. function onComplete(typeConverters2) {
  2856. var myTypeConverters = getTypeConverters(typeConverters2);
  2857. if (myTypeConverters.length !== myTypes.length) {
  2858. throwInternalError("Mismatched type converter count");
  2859. }
  2860. for (var i = 0; i < myTypes.length; ++i) {
  2861. registerType(myTypes[i], myTypeConverters[i]);
  2862. }
  2863. }
  2864. var typeConverters = new Array(dependentTypes.length);
  2865. var unregisteredTypes = [];
  2866. var registered = 0;
  2867. dependentTypes.forEach(function(dt, i) {
  2868. if (registeredTypes.hasOwnProperty(dt)) {
  2869. typeConverters[i] = registeredTypes[dt];
  2870. } else {
  2871. unregisteredTypes.push(dt);
  2872. if (!awaitingDependencies.hasOwnProperty(dt)) {
  2873. awaitingDependencies[dt] = [];
  2874. }
  2875. awaitingDependencies[dt].push(function() {
  2876. typeConverters[i] = registeredTypes[dt];
  2877. ++registered;
  2878. if (registered === unregisteredTypes.length) {
  2879. onComplete(typeConverters);
  2880. }
  2881. });
  2882. }
  2883. });
  2884. if (unregisteredTypes.length === 0) {
  2885. onComplete(typeConverters);
  2886. }
  2887. }
  2888. function __embind_finalize_value_array(rawTupleType) {
  2889. var reg = tupleRegistrations[rawTupleType];
  2890. delete tupleRegistrations[rawTupleType];
  2891. var elements = reg.elements;
  2892. var elementsLength = elements.length;
  2893. var elementTypes = elements.map(function(elt) {
  2894. return elt.getterReturnType;
  2895. }).concat(elements.map(function(elt) {
  2896. return elt.setterArgumentType;
  2897. }));
  2898. var rawConstructor = reg.rawConstructor;
  2899. var rawDestructor = reg.rawDestructor;
  2900. whenDependentTypesAreResolved([rawTupleType], elementTypes, function(elementTypes2) {
  2901. elements.forEach(function(elt, i) {
  2902. var getterReturnType = elementTypes2[i];
  2903. var getter = elt.getter;
  2904. var getterContext = elt.getterContext;
  2905. var setterArgumentType = elementTypes2[i + elementsLength];
  2906. var setter = elt.setter;
  2907. var setterContext = elt.setterContext;
  2908. elt.read = function(ptr) {
  2909. return getterReturnType["fromWireType"](getter(getterContext, ptr));
  2910. };
  2911. elt.write = function(ptr, o) {
  2912. var destructors = [];
  2913. setter(setterContext, ptr, setterArgumentType["toWireType"](destructors, o));
  2914. runDestructors(destructors);
  2915. };
  2916. });
  2917. return [{name: reg.name, fromWireType: function(ptr) {
  2918. var rv = new Array(elementsLength);
  2919. for (var i = 0; i < elementsLength; ++i) {
  2920. rv[i] = elements[i].read(ptr);
  2921. }
  2922. rawDestructor(ptr);
  2923. return rv;
  2924. }, toWireType: function(destructors, o) {
  2925. if (elementsLength !== o.length) {
  2926. throw new TypeError("Incorrect number of tuple elements for " + reg.name + ": expected=" + elementsLength + ", actual=" + o.length);
  2927. }
  2928. var ptr = rawConstructor();
  2929. for (var i = 0; i < elementsLength; ++i) {
  2930. elements[i].write(ptr, o[i]);
  2931. }
  2932. if (destructors !== null) {
  2933. destructors.push(rawDestructor, ptr);
  2934. }
  2935. return ptr;
  2936. }, argPackAdvance: 8, readValueFromPointer: simpleReadValueFromPointer, destructorFunction: rawDestructor}];
  2937. });
  2938. }
  2939. var structRegistrations = {};
  2940. function __embind_finalize_value_object(structType) {
  2941. var reg = structRegistrations[structType];
  2942. delete structRegistrations[structType];
  2943. var rawConstructor = reg.rawConstructor;
  2944. var rawDestructor = reg.rawDestructor;
  2945. var fieldRecords = reg.fields;
  2946. var fieldTypes = fieldRecords.map(function(field) {
  2947. return field.getterReturnType;
  2948. }).concat(fieldRecords.map(function(field) {
  2949. return field.setterArgumentType;
  2950. }));
  2951. whenDependentTypesAreResolved([structType], fieldTypes, function(fieldTypes2) {
  2952. var fields = {};
  2953. fieldRecords.forEach(function(field, i) {
  2954. var fieldName = field.fieldName;
  2955. var getterReturnType = fieldTypes2[i];
  2956. var getter = field.getter;
  2957. var getterContext = field.getterContext;
  2958. var setterArgumentType = fieldTypes2[i + fieldRecords.length];
  2959. var setter = field.setter;
  2960. var setterContext = field.setterContext;
  2961. fields[fieldName] = {read: function(ptr) {
  2962. return getterReturnType["fromWireType"](getter(getterContext, ptr));
  2963. }, write: function(ptr, o) {
  2964. var destructors = [];
  2965. setter(setterContext, ptr, setterArgumentType["toWireType"](destructors, o));
  2966. runDestructors(destructors);
  2967. }};
  2968. });
  2969. return [{name: reg.name, fromWireType: function(ptr) {
  2970. var rv = {};
  2971. for (var i in fields) {
  2972. rv[i] = fields[i].read(ptr);
  2973. }
  2974. rawDestructor(ptr);
  2975. return rv;
  2976. }, toWireType: function(destructors, o) {
  2977. for (var fieldName in fields) {
  2978. if (!(fieldName in o)) {
  2979. throw new TypeError('Missing field: "' + fieldName + '"');
  2980. }
  2981. }
  2982. var ptr = rawConstructor();
  2983. for (fieldName in fields) {
  2984. fields[fieldName].write(ptr, o[fieldName]);
  2985. }
  2986. if (destructors !== null) {
  2987. destructors.push(rawDestructor, ptr);
  2988. }
  2989. return ptr;
  2990. }, argPackAdvance: 8, readValueFromPointer: simpleReadValueFromPointer, destructorFunction: rawDestructor}];
  2991. });
  2992. }
  2993. function getShiftFromSize(size) {
  2994. switch (size) {
  2995. case 1:
  2996. return 0;
  2997. case 2:
  2998. return 1;
  2999. case 4:
  3000. return 2;
  3001. case 8:
  3002. return 3;
  3003. default:
  3004. throw new TypeError("Unknown type size: " + size);
  3005. }
  3006. }
  3007. function embind_init_charCodes() {
  3008. var codes = new Array(256);
  3009. for (var i = 0; i < 256; ++i) {
  3010. codes[i] = String.fromCharCode(i);
  3011. }
  3012. embind_charCodes = codes;
  3013. }
  3014. var embind_charCodes = void 0;
  3015. function readLatin1String(ptr) {
  3016. var ret = "";
  3017. var c = ptr;
  3018. while (HEAPU8[c]) {
  3019. ret += embind_charCodes[HEAPU8[c++]];
  3020. }
  3021. return ret;
  3022. }
  3023. var BindingError = void 0;
  3024. function throwBindingError(message) {
  3025. throw new BindingError(message);
  3026. }
  3027. function registerType(rawType, registeredInstance, options) {
  3028. options = options || {};
  3029. if (!("argPackAdvance" in registeredInstance)) {
  3030. throw new TypeError("registerType registeredInstance requires argPackAdvance");
  3031. }
  3032. var name = registeredInstance.name;
  3033. if (!rawType) {
  3034. throwBindingError('type "' + name + '" must have a positive integer typeid pointer');
  3035. }
  3036. if (registeredTypes.hasOwnProperty(rawType)) {
  3037. if (options.ignoreDuplicateRegistrations) {
  3038. return;
  3039. } else {
  3040. throwBindingError("Cannot register type '" + name + "' twice");
  3041. }
  3042. }
  3043. registeredTypes[rawType] = registeredInstance;
  3044. delete typeDependencies[rawType];
  3045. if (awaitingDependencies.hasOwnProperty(rawType)) {
  3046. var callbacks = awaitingDependencies[rawType];
  3047. delete awaitingDependencies[rawType];
  3048. callbacks.forEach(function(cb) {
  3049. cb();
  3050. });
  3051. }
  3052. }
  3053. function __embind_register_bool(rawType, name, size, trueValue, falseValue) {
  3054. var shift = getShiftFromSize(size);
  3055. name = readLatin1String(name);
  3056. registerType(rawType, {name, fromWireType: function(wt) {
  3057. return !!wt;
  3058. }, toWireType: function(destructors, o) {
  3059. return o ? trueValue : falseValue;
  3060. }, argPackAdvance: 8, readValueFromPointer: function(pointer) {
  3061. var heap;
  3062. if (size === 1) {
  3063. heap = HEAP8;
  3064. } else if (size === 2) {
  3065. heap = HEAP16;
  3066. } else if (size === 4) {
  3067. heap = HEAP32;
  3068. } else {
  3069. throw new TypeError("Unknown boolean type size: " + name);
  3070. }
  3071. return this["fromWireType"](heap[pointer >> shift]);
  3072. }, destructorFunction: null});
  3073. }
  3074. function ClassHandle_isAliasOf(other) {
  3075. if (!(this instanceof ClassHandle)) {
  3076. return false;
  3077. }
  3078. if (!(other instanceof ClassHandle)) {
  3079. return false;
  3080. }
  3081. var leftClass = this.$$.ptrType.registeredClass;
  3082. var left = this.$$.ptr;
  3083. var rightClass = other.$$.ptrType.registeredClass;
  3084. var right = other.$$.ptr;
  3085. while (leftClass.baseClass) {
  3086. left = leftClass.upcast(left);
  3087. leftClass = leftClass.baseClass;
  3088. }
  3089. while (rightClass.baseClass) {
  3090. right = rightClass.upcast(right);
  3091. rightClass = rightClass.baseClass;
  3092. }
  3093. return leftClass === rightClass && left === right;
  3094. }
  3095. function shallowCopyInternalPointer(o) {
  3096. return {count: o.count, deleteScheduled: o.deleteScheduled, preservePointerOnDelete: o.preservePointerOnDelete, ptr: o.ptr, ptrType: o.ptrType, smartPtr: o.smartPtr, smartPtrType: o.smartPtrType};
  3097. }
  3098. function throwInstanceAlreadyDeleted(obj) {
  3099. function getInstanceTypeName(handle) {
  3100. return handle.$$.ptrType.registeredClass.name;
  3101. }
  3102. throwBindingError(getInstanceTypeName(obj) + " instance already deleted");
  3103. }
  3104. var finalizationGroup = false;
  3105. function detachFinalizer(handle) {
  3106. }
  3107. function runDestructor($$) {
  3108. if ($$.smartPtr) {
  3109. $$.smartPtrType.rawDestructor($$.smartPtr);
  3110. } else {
  3111. $$.ptrType.registeredClass.rawDestructor($$.ptr);
  3112. }
  3113. }
  3114. function releaseClassHandle($$) {
  3115. $$.count.value -= 1;
  3116. var toDelete = $$.count.value === 0;
  3117. if (toDelete) {
  3118. runDestructor($$);
  3119. }
  3120. }
  3121. function attachFinalizer(handle) {
  3122. if (typeof FinalizationGroup === "undefined") {
  3123. attachFinalizer = function(handle2) {
  3124. return handle2;
  3125. };
  3126. return handle;
  3127. }
  3128. finalizationGroup = new FinalizationGroup(function(iter) {
  3129. for (var result = iter.next(); !result.done; result = iter.next()) {
  3130. var $$ = result.value;
  3131. if (!$$.ptr) {
  3132. console.warn("object already deleted: " + $$.ptr);
  3133. } else {
  3134. releaseClassHandle($$);
  3135. }
  3136. }
  3137. });
  3138. attachFinalizer = function(handle2) {
  3139. finalizationGroup.register(handle2, handle2.$$, handle2.$$);
  3140. return handle2;
  3141. };
  3142. detachFinalizer = function(handle2) {
  3143. finalizationGroup.unregister(handle2.$$);
  3144. };
  3145. return attachFinalizer(handle);
  3146. }
  3147. function ClassHandle_clone() {
  3148. if (!this.$$.ptr) {
  3149. throwInstanceAlreadyDeleted(this);
  3150. }
  3151. if (this.$$.preservePointerOnDelete) {
  3152. this.$$.count.value += 1;
  3153. return this;
  3154. } else {
  3155. var clone = attachFinalizer(Object.create(Object.getPrototypeOf(this), {$$: {value: shallowCopyInternalPointer(this.$$)}}));
  3156. clone.$$.count.value += 1;
  3157. clone.$$.deleteScheduled = false;
  3158. return clone;
  3159. }
  3160. }
  3161. function ClassHandle_delete() {
  3162. if (!this.$$.ptr) {
  3163. throwInstanceAlreadyDeleted(this);
  3164. }
  3165. if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
  3166. throwBindingError("Object already scheduled for deletion");
  3167. }
  3168. detachFinalizer(this);
  3169. releaseClassHandle(this.$$);
  3170. if (!this.$$.preservePointerOnDelete) {
  3171. this.$$.smartPtr = void 0;
  3172. this.$$.ptr = void 0;
  3173. }
  3174. }
  3175. function ClassHandle_isDeleted() {
  3176. return !this.$$.ptr;
  3177. }
  3178. var delayFunction = void 0;
  3179. var deletionQueue = [];
  3180. function flushPendingDeletes() {
  3181. while (deletionQueue.length) {
  3182. var obj = deletionQueue.pop();
  3183. obj.$$.deleteScheduled = false;
  3184. obj["delete"]();
  3185. }
  3186. }
  3187. function ClassHandle_deleteLater() {
  3188. if (!this.$$.ptr) {
  3189. throwInstanceAlreadyDeleted(this);
  3190. }
  3191. if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
  3192. throwBindingError("Object already scheduled for deletion");
  3193. }
  3194. deletionQueue.push(this);
  3195. if (deletionQueue.length === 1 && delayFunction) {
  3196. delayFunction(flushPendingDeletes);
  3197. }
  3198. this.$$.deleteScheduled = true;
  3199. return this;
  3200. }
  3201. function init_ClassHandle() {
  3202. ClassHandle.prototype["isAliasOf"] = ClassHandle_isAliasOf;
  3203. ClassHandle.prototype["clone"] = ClassHandle_clone;
  3204. ClassHandle.prototype["delete"] = ClassHandle_delete;
  3205. ClassHandle.prototype["isDeleted"] = ClassHandle_isDeleted;
  3206. ClassHandle.prototype["deleteLater"] = ClassHandle_deleteLater;
  3207. }
  3208. function ClassHandle() {
  3209. }
  3210. var registeredPointers = {};
  3211. function ensureOverloadTable(proto, methodName, humanName) {
  3212. if (proto[methodName].overloadTable === void 0) {
  3213. var prevFunc = proto[methodName];
  3214. proto[methodName] = function() {
  3215. if (!proto[methodName].overloadTable.hasOwnProperty(arguments.length)) {
  3216. throwBindingError("Function '" + humanName + "' called with an invalid number of arguments (" + arguments.length + ") - expects one of (" + proto[methodName].overloadTable + ")!");
  3217. }
  3218. return proto[methodName].overloadTable[arguments.length].apply(this, arguments);
  3219. };
  3220. proto[methodName].overloadTable = [];
  3221. proto[methodName].overloadTable[prevFunc.argCount] = prevFunc;
  3222. }
  3223. }
  3224. function exposePublicSymbol(name, value, numArguments) {
  3225. if (Module.hasOwnProperty(name)) {
  3226. if (numArguments === void 0 || Module[name].overloadTable !== void 0 && Module[name].overloadTable[numArguments] !== void 0) {
  3227. throwBindingError("Cannot register public name '" + name + "' twice");
  3228. }
  3229. ensureOverloadTable(Module, name, name);
  3230. if (Module.hasOwnProperty(numArguments)) {
  3231. throwBindingError("Cannot register multiple overloads of a function with the same number of arguments (" + numArguments + ")!");
  3232. }
  3233. Module[name].overloadTable[numArguments] = value;
  3234. } else {
  3235. Module[name] = value;
  3236. if (numArguments !== void 0) {
  3237. Module[name].numArguments = numArguments;
  3238. }
  3239. }
  3240. }
  3241. function RegisteredClass(name, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast) {
  3242. this.name = name;
  3243. this.constructor = constructor;
  3244. this.instancePrototype = instancePrototype;
  3245. this.rawDestructor = rawDestructor;
  3246. this.baseClass = baseClass;
  3247. this.getActualType = getActualType;
  3248. this.upcast = upcast;
  3249. this.downcast = downcast;
  3250. this.pureVirtualFunctions = [];
  3251. }
  3252. function upcastPointer(ptr, ptrClass, desiredClass) {
  3253. while (ptrClass !== desiredClass) {
  3254. if (!ptrClass.upcast) {
  3255. throwBindingError("Expected null or instance of " + desiredClass.name + ", got an instance of " + ptrClass.name);
  3256. }
  3257. ptr = ptrClass.upcast(ptr);
  3258. ptrClass = ptrClass.baseClass;
  3259. }
  3260. return ptr;
  3261. }
  3262. function constNoSmartPtrRawPointerToWireType(destructors, handle) {
  3263. if (handle === null) {
  3264. if (this.isReference) {
  3265. throwBindingError("null is not a valid " + this.name);
  3266. }
  3267. return 0;
  3268. }
  3269. if (!handle.$$) {
  3270. throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name);
  3271. }
  3272. if (!handle.$$.ptr) {
  3273. throwBindingError("Cannot pass deleted object as a pointer of type " + this.name);
  3274. }
  3275. var handleClass = handle.$$.ptrType.registeredClass;
  3276. var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
  3277. return ptr;
  3278. }
  3279. function genericPointerToWireType(destructors, handle) {
  3280. var ptr;
  3281. if (handle === null) {
  3282. if (this.isReference) {
  3283. throwBindingError("null is not a valid " + this.name);
  3284. }
  3285. if (this.isSmartPointer) {
  3286. ptr = this.rawConstructor();
  3287. if (destructors !== null) {
  3288. destructors.push(this.rawDestructor, ptr);
  3289. }
  3290. return ptr;
  3291. } else {
  3292. return 0;
  3293. }
  3294. }
  3295. if (!handle.$$) {
  3296. throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name);
  3297. }
  3298. if (!handle.$$.ptr) {
  3299. throwBindingError("Cannot pass deleted object as a pointer of type " + this.name);
  3300. }
  3301. if (!this.isConst && handle.$$.ptrType.isConst) {
  3302. throwBindingError("Cannot convert argument of type " + (handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) + " to parameter type " + this.name);
  3303. }
  3304. var handleClass = handle.$$.ptrType.registeredClass;
  3305. ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
  3306. if (this.isSmartPointer) {
  3307. if (handle.$$.smartPtr === void 0) {
  3308. throwBindingError("Passing raw pointer to smart pointer is illegal");
  3309. }
  3310. switch (this.sharingPolicy) {
  3311. case 0:
  3312. if (handle.$$.smartPtrType === this) {
  3313. ptr = handle.$$.smartPtr;
  3314. } else {
  3315. throwBindingError("Cannot convert argument of type " + (handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) + " to parameter type " + this.name);
  3316. }
  3317. break;
  3318. case 1:
  3319. ptr = handle.$$.smartPtr;
  3320. break;
  3321. case 2:
  3322. if (handle.$$.smartPtrType === this) {
  3323. ptr = handle.$$.smartPtr;
  3324. } else {
  3325. var clonedHandle = handle["clone"]();
  3326. ptr = this.rawShare(ptr, __emval_register(function() {
  3327. clonedHandle["delete"]();
  3328. }));
  3329. if (destructors !== null) {
  3330. destructors.push(this.rawDestructor, ptr);
  3331. }
  3332. }
  3333. break;
  3334. default:
  3335. throwBindingError("Unsupporting sharing policy");
  3336. }
  3337. }
  3338. return ptr;
  3339. }
  3340. function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) {
  3341. if (handle === null) {
  3342. if (this.isReference) {
  3343. throwBindingError("null is not a valid " + this.name);
  3344. }
  3345. return 0;
  3346. }
  3347. if (!handle.$$) {
  3348. throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name);
  3349. }
  3350. if (!handle.$$.ptr) {
  3351. throwBindingError("Cannot pass deleted object as a pointer of type " + this.name);
  3352. }
  3353. if (handle.$$.ptrType.isConst) {
  3354. throwBindingError("Cannot convert argument of type " + handle.$$.ptrType.name + " to parameter type " + this.name);
  3355. }
  3356. var handleClass = handle.$$.ptrType.registeredClass;
  3357. var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
  3358. return ptr;
  3359. }
  3360. function RegisteredPointer_getPointee(ptr) {
  3361. if (this.rawGetPointee) {
  3362. ptr = this.rawGetPointee(ptr);
  3363. }
  3364. return ptr;
  3365. }
  3366. function RegisteredPointer_destructor(ptr) {
  3367. if (this.rawDestructor) {
  3368. this.rawDestructor(ptr);
  3369. }
  3370. }
  3371. function RegisteredPointer_deleteObject(handle) {
  3372. if (handle !== null) {
  3373. handle["delete"]();
  3374. }
  3375. }
  3376. function downcastPointer(ptr, ptrClass, desiredClass) {
  3377. if (ptrClass === desiredClass) {
  3378. return ptr;
  3379. }
  3380. if (desiredClass.baseClass === void 0) {
  3381. return null;
  3382. }
  3383. var rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass);
  3384. if (rv === null) {
  3385. return null;
  3386. }
  3387. return desiredClass.downcast(rv);
  3388. }
  3389. function getInheritedInstanceCount() {
  3390. return Object.keys(registeredInstances).length;
  3391. }
  3392. function getLiveInheritedInstances() {
  3393. var rv = [];
  3394. for (var k in registeredInstances) {
  3395. if (registeredInstances.hasOwnProperty(k)) {
  3396. rv.push(registeredInstances[k]);
  3397. }
  3398. }
  3399. return rv;
  3400. }
  3401. function setDelayFunction(fn) {
  3402. delayFunction = fn;
  3403. if (deletionQueue.length && delayFunction) {
  3404. delayFunction(flushPendingDeletes);
  3405. }
  3406. }
  3407. function init_embind() {
  3408. Module["getInheritedInstanceCount"] = getInheritedInstanceCount;
  3409. Module["getLiveInheritedInstances"] = getLiveInheritedInstances;
  3410. Module["flushPendingDeletes"] = flushPendingDeletes;
  3411. Module["setDelayFunction"] = setDelayFunction;
  3412. }
  3413. var registeredInstances = {};
  3414. function getBasestPointer(class_, ptr) {
  3415. if (ptr === void 0) {
  3416. throwBindingError("ptr should not be undefined");
  3417. }
  3418. while (class_.baseClass) {
  3419. ptr = class_.upcast(ptr);
  3420. class_ = class_.baseClass;
  3421. }
  3422. return ptr;
  3423. }
  3424. function getInheritedInstance(class_, ptr) {
  3425. ptr = getBasestPointer(class_, ptr);
  3426. return registeredInstances[ptr];
  3427. }
  3428. function makeClassHandle(prototype, record) {
  3429. if (!record.ptrType || !record.ptr) {
  3430. throwInternalError("makeClassHandle requires ptr and ptrType");
  3431. }
  3432. var hasSmartPtrType = !!record.smartPtrType;
  3433. var hasSmartPtr = !!record.smartPtr;
  3434. if (hasSmartPtrType !== hasSmartPtr) {
  3435. throwInternalError("Both smartPtrType and smartPtr must be specified");
  3436. }
  3437. record.count = {value: 1};
  3438. return attachFinalizer(Object.create(prototype, {$$: {value: record}}));
  3439. }
  3440. function RegisteredPointer_fromWireType(ptr) {
  3441. var rawPointer = this.getPointee(ptr);
  3442. if (!rawPointer) {
  3443. this.destructor(ptr);
  3444. return null;
  3445. }
  3446. var registeredInstance = getInheritedInstance(this.registeredClass, rawPointer);
  3447. if (registeredInstance !== void 0) {
  3448. if (registeredInstance.$$.count.value === 0) {
  3449. registeredInstance.$$.ptr = rawPointer;
  3450. registeredInstance.$$.smartPtr = ptr;
  3451. return registeredInstance["clone"]();
  3452. } else {
  3453. var rv = registeredInstance["clone"]();
  3454. this.destructor(ptr);
  3455. return rv;
  3456. }
  3457. }
  3458. function makeDefaultHandle() {
  3459. if (this.isSmartPointer) {
  3460. return makeClassHandle(this.registeredClass.instancePrototype, {ptrType: this.pointeeType, ptr: rawPointer, smartPtrType: this, smartPtr: ptr});
  3461. } else {
  3462. return makeClassHandle(this.registeredClass.instancePrototype, {ptrType: this, ptr});
  3463. }
  3464. }
  3465. var actualType = this.registeredClass.getActualType(rawPointer);
  3466. var registeredPointerRecord = registeredPointers[actualType];
  3467. if (!registeredPointerRecord) {
  3468. return makeDefaultHandle.call(this);
  3469. }
  3470. var toType;
  3471. if (this.isConst) {
  3472. toType = registeredPointerRecord.constPointerType;
  3473. } else {
  3474. toType = registeredPointerRecord.pointerType;
  3475. }
  3476. var dp = downcastPointer(rawPointer, this.registeredClass, toType.registeredClass);
  3477. if (dp === null) {
  3478. return makeDefaultHandle.call(this);
  3479. }
  3480. if (this.isSmartPointer) {
  3481. return makeClassHandle(toType.registeredClass.instancePrototype, {ptrType: toType, ptr: dp, smartPtrType: this, smartPtr: ptr});
  3482. } else {
  3483. return makeClassHandle(toType.registeredClass.instancePrototype, {ptrType: toType, ptr: dp});
  3484. }
  3485. }
  3486. function init_RegisteredPointer() {
  3487. RegisteredPointer.prototype.getPointee = RegisteredPointer_getPointee;
  3488. RegisteredPointer.prototype.destructor = RegisteredPointer_destructor;
  3489. RegisteredPointer.prototype["argPackAdvance"] = 8;
  3490. RegisteredPointer.prototype["readValueFromPointer"] = simpleReadValueFromPointer;
  3491. RegisteredPointer.prototype["deleteObject"] = RegisteredPointer_deleteObject;
  3492. RegisteredPointer.prototype["fromWireType"] = RegisteredPointer_fromWireType;
  3493. }
  3494. function RegisteredPointer(name, registeredClass, isReference, isConst, isSmartPointer, pointeeType, sharingPolicy, rawGetPointee, rawConstructor, rawShare, rawDestructor) {
  3495. this.name = name;
  3496. this.registeredClass = registeredClass;
  3497. this.isReference = isReference;
  3498. this.isConst = isConst;
  3499. this.isSmartPointer = isSmartPointer;
  3500. this.pointeeType = pointeeType;
  3501. this.sharingPolicy = sharingPolicy;
  3502. this.rawGetPointee = rawGetPointee;
  3503. this.rawConstructor = rawConstructor;
  3504. this.rawShare = rawShare;
  3505. this.rawDestructor = rawDestructor;
  3506. if (!isSmartPointer && registeredClass.baseClass === void 0) {
  3507. if (isConst) {
  3508. this["toWireType"] = constNoSmartPtrRawPointerToWireType;
  3509. this.destructorFunction = null;
  3510. } else {
  3511. this["toWireType"] = nonConstNoSmartPtrRawPointerToWireType;
  3512. this.destructorFunction = null;
  3513. }
  3514. } else {
  3515. this["toWireType"] = genericPointerToWireType;
  3516. }
  3517. }
  3518. function replacePublicSymbol(name, value, numArguments) {
  3519. if (!Module.hasOwnProperty(name)) {
  3520. throwInternalError("Replacing nonexistant public symbol");
  3521. }
  3522. if (Module[name].overloadTable !== void 0 && numArguments !== void 0) {
  3523. Module[name].overloadTable[numArguments] = value;
  3524. } else {
  3525. Module[name] = value;
  3526. Module[name].argCount = numArguments;
  3527. }
  3528. }
  3529. function getDynCaller(sig, ptr) {
  3530. assert(sig.indexOf("j") >= 0, "getDynCaller should only be called with i64 sigs");
  3531. var argCache = [];
  3532. return function() {
  3533. argCache.length = arguments.length;
  3534. for (var i = 0; i < arguments.length; i++) {
  3535. argCache[i] = arguments[i];
  3536. }
  3537. return dynCall(sig, ptr, argCache);
  3538. };
  3539. }
  3540. function embind__requireFunction(signature, rawFunction) {
  3541. signature = readLatin1String(signature);
  3542. function makeDynCaller() {
  3543. if (signature.indexOf("j") != -1) {
  3544. return getDynCaller(signature, rawFunction);
  3545. }
  3546. return wasmTable.get(rawFunction);
  3547. }
  3548. var fp = makeDynCaller();
  3549. if (typeof fp !== "function") {
  3550. throwBindingError("unknown function pointer with signature " + signature + ": " + rawFunction);
  3551. }
  3552. return fp;
  3553. }
  3554. var UnboundTypeError = void 0;
  3555. function getTypeName(type) {
  3556. var ptr = ___getTypeName(type);
  3557. var rv = readLatin1String(ptr);
  3558. _free(ptr);
  3559. return rv;
  3560. }
  3561. function throwUnboundTypeError(message, types) {
  3562. var unboundTypes = [];
  3563. var seen = {};
  3564. function visit(type) {
  3565. if (seen[type]) {
  3566. return;
  3567. }
  3568. if (registeredTypes[type]) {
  3569. return;
  3570. }
  3571. if (typeDependencies[type]) {
  3572. typeDependencies[type].forEach(visit);
  3573. return;
  3574. }
  3575. unboundTypes.push(type);
  3576. seen[type] = true;
  3577. }
  3578. types.forEach(visit);
  3579. throw new UnboundTypeError(message + ": " + unboundTypes.map(getTypeName).join([", "]));
  3580. }
  3581. function __embind_register_class(rawType, rawPointerType, rawConstPointerType, baseClassRawType, getActualTypeSignature, getActualType, upcastSignature, upcast, downcastSignature, downcast, name, destructorSignature, rawDestructor) {
  3582. name = readLatin1String(name);
  3583. getActualType = embind__requireFunction(getActualTypeSignature, getActualType);
  3584. if (upcast) {
  3585. upcast = embind__requireFunction(upcastSignature, upcast);
  3586. }
  3587. if (downcast) {
  3588. downcast = embind__requireFunction(downcastSignature, downcast);
  3589. }
  3590. rawDestructor = embind__requireFunction(destructorSignature, rawDestructor);
  3591. var legalFunctionName = makeLegalFunctionName(name);
  3592. exposePublicSymbol(legalFunctionName, function() {
  3593. throwUnboundTypeError("Cannot construct " + name + " due to unbound types", [baseClassRawType]);
  3594. });
  3595. whenDependentTypesAreResolved([rawType, rawPointerType, rawConstPointerType], baseClassRawType ? [baseClassRawType] : [], function(base) {
  3596. base = base[0];
  3597. var baseClass;
  3598. var basePrototype;
  3599. if (baseClassRawType) {
  3600. baseClass = base.registeredClass;
  3601. basePrototype = baseClass.instancePrototype;
  3602. } else {
  3603. basePrototype = ClassHandle.prototype;
  3604. }
  3605. var constructor = createNamedFunction(legalFunctionName, function() {
  3606. if (Object.getPrototypeOf(this) !== instancePrototype) {
  3607. throw new BindingError("Use 'new' to construct " + name);
  3608. }
  3609. if (registeredClass.constructor_body === void 0) {
  3610. throw new BindingError(name + " has no accessible constructor");
  3611. }
  3612. var body = registeredClass.constructor_body[arguments.length];
  3613. if (body === void 0) {
  3614. throw new BindingError("Tried to invoke ctor of " + name + " with invalid number of parameters (" + arguments.length + ") - expected (" + Object.keys(registeredClass.constructor_body).toString() + ") parameters instead!");
  3615. }
  3616. return body.apply(this, arguments);
  3617. });
  3618. var instancePrototype = Object.create(basePrototype, {constructor: {value: constructor}});
  3619. constructor.prototype = instancePrototype;
  3620. var registeredClass = new RegisteredClass(name, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast);
  3621. var referenceConverter = new RegisteredPointer(name, registeredClass, true, false, false);
  3622. var pointerConverter = new RegisteredPointer(name + "*", registeredClass, false, false, false);
  3623. var constPointerConverter = new RegisteredPointer(name + " const*", registeredClass, false, true, false);
  3624. registeredPointers[rawType] = {pointerType: pointerConverter, constPointerType: constPointerConverter};
  3625. replacePublicSymbol(legalFunctionName, constructor);
  3626. return [referenceConverter, pointerConverter, constPointerConverter];
  3627. });
  3628. }
  3629. function heap32VectorToArray(count, firstElement) {
  3630. var array = [];
  3631. for (var i = 0; i < count; i++) {
  3632. array.push(HEAP32[(firstElement >> 2) + i]);
  3633. }
  3634. return array;
  3635. }
  3636. function __embind_register_class_constructor(rawClassType, argCount, rawArgTypesAddr, invokerSignature, invoker, rawConstructor) {
  3637. assert(argCount > 0);
  3638. var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
  3639. invoker = embind__requireFunction(invokerSignature, invoker);
  3640. var args = [rawConstructor];
  3641. var destructors = [];
  3642. whenDependentTypesAreResolved([], [rawClassType], function(classType) {
  3643. classType = classType[0];
  3644. var humanName = "constructor " + classType.name;
  3645. if (classType.registeredClass.constructor_body === void 0) {
  3646. classType.registeredClass.constructor_body = [];
  3647. }
  3648. if (classType.registeredClass.constructor_body[argCount - 1] !== void 0) {
  3649. throw new BindingError("Cannot register multiple constructors with identical number of parameters (" + (argCount - 1) + ") for class '" + classType.name + "'! Overload resolution is currently only performed using the parameter count, not actual type info!");
  3650. }
  3651. classType.registeredClass.constructor_body[argCount - 1] = function unboundTypeHandler() {
  3652. throwUnboundTypeError("Cannot construct " + classType.name + " due to unbound types", rawArgTypes);
  3653. };
  3654. whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) {
  3655. classType.registeredClass.constructor_body[argCount - 1] = function constructor_body() {
  3656. if (arguments.length !== argCount - 1) {
  3657. throwBindingError(humanName + " called with " + arguments.length + " arguments, expected " + (argCount - 1));
  3658. }
  3659. destructors.length = 0;
  3660. args.length = argCount;
  3661. for (var i = 1; i < argCount; ++i) {
  3662. args[i] = argTypes[i]["toWireType"](destructors, arguments[i - 1]);
  3663. }
  3664. var ptr = invoker.apply(null, args);
  3665. runDestructors(destructors);
  3666. return argTypes[0]["fromWireType"](ptr);
  3667. };
  3668. return [];
  3669. });
  3670. return [];
  3671. });
  3672. }
  3673. function new_(constructor, argumentList) {
  3674. if (!(constructor instanceof Function)) {
  3675. throw new TypeError("new_ called with constructor type " + typeof constructor + " which is not a function");
  3676. }
  3677. var dummy = createNamedFunction(constructor.name || "unknownFunctionName", function() {
  3678. });
  3679. dummy.prototype = constructor.prototype;
  3680. var obj = new dummy();
  3681. var r = constructor.apply(obj, argumentList);
  3682. return r instanceof Object ? r : obj;
  3683. }
  3684. function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc) {
  3685. var argCount = argTypes.length;
  3686. if (argCount < 2) {
  3687. throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!");
  3688. }
  3689. var isClassMethodFunc = argTypes[1] !== null && classType !== null;
  3690. var needsDestructorStack = false;
  3691. for (var i = 1; i < argTypes.length; ++i) {
  3692. if (argTypes[i] !== null && argTypes[i].destructorFunction === void 0) {
  3693. needsDestructorStack = true;
  3694. break;
  3695. }
  3696. }
  3697. var returns = argTypes[0].name !== "void";
  3698. var argsList = "";
  3699. var argsListWired = "";
  3700. for (var i = 0; i < argCount - 2; ++i) {
  3701. argsList += (i !== 0 ? ", " : "") + "arg" + i;
  3702. argsListWired += (i !== 0 ? ", " : "") + "arg" + i + "Wired";
  3703. }
  3704. var invokerFnBody = "return function " + makeLegalFunctionName(humanName) + "(" + argsList + ") {\nif (arguments.length !== " + (argCount - 2) + ") {\nthrowBindingError('function " + humanName + " called with ' + arguments.length + ' arguments, expected " + (argCount - 2) + " args!');\n}\n";
  3705. if (needsDestructorStack) {
  3706. invokerFnBody += "var destructors = [];\n";
  3707. }
  3708. var dtorStack = needsDestructorStack ? "destructors" : "null";
  3709. var args1 = ["throwBindingError", "invoker", "fn", "runDestructors", "retType", "classParam"];
  3710. var args2 = [throwBindingError, cppInvokerFunc, cppTargetFunc, runDestructors, argTypes[0], argTypes[1]];
  3711. if (isClassMethodFunc) {
  3712. invokerFnBody += "var thisWired = classParam.toWireType(" + dtorStack + ", this);\n";
  3713. }
  3714. for (var i = 0; i < argCount - 2; ++i) {
  3715. invokerFnBody += "var arg" + i + "Wired = argType" + i + ".toWireType(" + dtorStack + ", arg" + i + "); // " + argTypes[i + 2].name + "\n";
  3716. args1.push("argType" + i);
  3717. args2.push(argTypes[i + 2]);
  3718. }
  3719. if (isClassMethodFunc) {
  3720. argsListWired = "thisWired" + (argsListWired.length > 0 ? ", " : "") + argsListWired;
  3721. }
  3722. invokerFnBody += (returns ? "var rv = " : "") + "invoker(fn" + (argsListWired.length > 0 ? ", " : "") + argsListWired + ");\n";
  3723. if (needsDestructorStack) {
  3724. invokerFnBody += "runDestructors(destructors);\n";
  3725. } else {
  3726. for (var i = isClassMethodFunc ? 1 : 2; i < argTypes.length; ++i) {
  3727. var paramName = i === 1 ? "thisWired" : "arg" + (i - 2) + "Wired";
  3728. if (argTypes[i].destructorFunction !== null) {
  3729. invokerFnBody += paramName + "_dtor(" + paramName + "); // " + argTypes[i].name + "\n";
  3730. args1.push(paramName + "_dtor");
  3731. args2.push(argTypes[i].destructorFunction);
  3732. }
  3733. }
  3734. }
  3735. if (returns) {
  3736. invokerFnBody += "var ret = retType.fromWireType(rv);\nreturn ret;\n";
  3737. } else {
  3738. }
  3739. invokerFnBody += "}\n";
  3740. args1.push(invokerFnBody);
  3741. var invokerFunction = new_(Function, args1).apply(null, args2);
  3742. return invokerFunction;
  3743. }
  3744. function __embind_register_class_function(rawClassType, methodName, argCount, rawArgTypesAddr, invokerSignature, rawInvoker, context, isPureVirtual) {
  3745. var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
  3746. methodName = readLatin1String(methodName);
  3747. rawInvoker = embind__requireFunction(invokerSignature, rawInvoker);
  3748. whenDependentTypesAreResolved([], [rawClassType], function(classType) {
  3749. classType = classType[0];
  3750. var humanName = classType.name + "." + methodName;
  3751. if (isPureVirtual) {
  3752. classType.registeredClass.pureVirtualFunctions.push(methodName);
  3753. }
  3754. function unboundTypesHandler() {
  3755. throwUnboundTypeError("Cannot call " + humanName + " due to unbound types", rawArgTypes);
  3756. }
  3757. var proto = classType.registeredClass.instancePrototype;
  3758. var method = proto[methodName];
  3759. if (method === void 0 || method.overloadTable === void 0 && method.className !== classType.name && method.argCount === argCount - 2) {
  3760. unboundTypesHandler.argCount = argCount - 2;
  3761. unboundTypesHandler.className = classType.name;
  3762. proto[methodName] = unboundTypesHandler;
  3763. } else {
  3764. ensureOverloadTable(proto, methodName, humanName);
  3765. proto[methodName].overloadTable[argCount - 2] = unboundTypesHandler;
  3766. }
  3767. whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) {
  3768. var memberFunction = craftInvokerFunction(humanName, argTypes, classType, rawInvoker, context);
  3769. if (proto[methodName].overloadTable === void 0) {
  3770. memberFunction.argCount = argCount - 2;
  3771. proto[methodName] = memberFunction;
  3772. } else {
  3773. proto[methodName].overloadTable[argCount - 2] = memberFunction;
  3774. }
  3775. return [];
  3776. });
  3777. return [];
  3778. });
  3779. }
  3780. var emval_free_list = [];
  3781. var emval_handle_array = [{}, {value: void 0}, {value: null}, {value: true}, {value: false}];
  3782. function __emval_decref(handle) {
  3783. if (handle > 4 && --emval_handle_array[handle].refcount === 0) {
  3784. emval_handle_array[handle] = void 0;
  3785. emval_free_list.push(handle);
  3786. }
  3787. }
  3788. function count_emval_handles() {
  3789. var count = 0;
  3790. for (var i = 5; i < emval_handle_array.length; ++i) {
  3791. if (emval_handle_array[i] !== void 0) {
  3792. ++count;
  3793. }
  3794. }
  3795. return count;
  3796. }
  3797. function get_first_emval() {
  3798. for (var i = 5; i < emval_handle_array.length; ++i) {
  3799. if (emval_handle_array[i] !== void 0) {
  3800. return emval_handle_array[i];
  3801. }
  3802. }
  3803. return null;
  3804. }
  3805. function init_emval() {
  3806. Module["count_emval_handles"] = count_emval_handles;
  3807. Module["get_first_emval"] = get_first_emval;
  3808. }
  3809. function __emval_register(value) {
  3810. switch (value) {
  3811. case void 0: {
  3812. return 1;
  3813. }
  3814. case null: {
  3815. return 2;
  3816. }
  3817. case true: {
  3818. return 3;
  3819. }
  3820. case false: {
  3821. return 4;
  3822. }
  3823. default: {
  3824. var handle = emval_free_list.length ? emval_free_list.pop() : emval_handle_array.length;
  3825. emval_handle_array[handle] = {refcount: 1, value};
  3826. return handle;
  3827. }
  3828. }
  3829. }
  3830. function __embind_register_emval(rawType, name) {
  3831. name = readLatin1String(name);
  3832. registerType(rawType, {name, fromWireType: function(handle) {
  3833. var rv = emval_handle_array[handle].value;
  3834. __emval_decref(handle);
  3835. return rv;
  3836. }, toWireType: function(destructors, value) {
  3837. return __emval_register(value);
  3838. }, argPackAdvance: 8, readValueFromPointer: simpleReadValueFromPointer, destructorFunction: null});
  3839. }
  3840. function _embind_repr(v) {
  3841. if (v === null) {
  3842. return "null";
  3843. }
  3844. var t = typeof v;
  3845. if (t === "object" || t === "array" || t === "function") {
  3846. return v.toString();
  3847. } else {
  3848. return "" + v;
  3849. }
  3850. }
  3851. function floatReadValueFromPointer(name, shift) {
  3852. switch (shift) {
  3853. case 2:
  3854. return function(pointer) {
  3855. return this["fromWireType"](HEAPF32[pointer >> 2]);
  3856. };
  3857. case 3:
  3858. return function(pointer) {
  3859. return this["fromWireType"](HEAPF64[pointer >> 3]);
  3860. };
  3861. default:
  3862. throw new TypeError("Unknown float type: " + name);
  3863. }
  3864. }
  3865. function __embind_register_float(rawType, name, size) {
  3866. var shift = getShiftFromSize(size);
  3867. name = readLatin1String(name);
  3868. registerType(rawType, {name, fromWireType: function(value) {
  3869. return value;
  3870. }, toWireType: function(destructors, value) {
  3871. if (typeof value !== "number" && typeof value !== "boolean") {
  3872. throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name);
  3873. }
  3874. return value;
  3875. }, argPackAdvance: 8, readValueFromPointer: floatReadValueFromPointer(name, shift), destructorFunction: null});
  3876. }
  3877. function __embind_register_function(name, argCount, rawArgTypesAddr, signature, rawInvoker, fn) {
  3878. var argTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
  3879. name = readLatin1String(name);
  3880. rawInvoker = embind__requireFunction(signature, rawInvoker);
  3881. exposePublicSymbol(name, function() {
  3882. throwUnboundTypeError("Cannot call " + name + " due to unbound types", argTypes);
  3883. }, argCount - 1);
  3884. whenDependentTypesAreResolved([], argTypes, function(argTypes2) {
  3885. var invokerArgsArray = [argTypes2[0], null].concat(argTypes2.slice(1));
  3886. replacePublicSymbol(name, craftInvokerFunction(name, invokerArgsArray, null, rawInvoker, fn), argCount - 1);
  3887. return [];
  3888. });
  3889. }
  3890. function integerReadValueFromPointer(name, shift, signed) {
  3891. switch (shift) {
  3892. case 0:
  3893. return signed ? function readS8FromPointer(pointer) {
  3894. return HEAP8[pointer];
  3895. } : function readU8FromPointer(pointer) {
  3896. return HEAPU8[pointer];
  3897. };
  3898. case 1:
  3899. return signed ? function readS16FromPointer(pointer) {
  3900. return HEAP16[pointer >> 1];
  3901. } : function readU16FromPointer(pointer) {
  3902. return HEAPU16[pointer >> 1];
  3903. };
  3904. case 2:
  3905. return signed ? function readS32FromPointer(pointer) {
  3906. return HEAP32[pointer >> 2];
  3907. } : function readU32FromPointer(pointer) {
  3908. return HEAPU32[pointer >> 2];
  3909. };
  3910. default:
  3911. throw new TypeError("Unknown integer type: " + name);
  3912. }
  3913. }
  3914. function __embind_register_integer(primitiveType, name, size, minRange, maxRange) {
  3915. name = readLatin1String(name);
  3916. if (maxRange === -1) {
  3917. maxRange = 4294967295;
  3918. }
  3919. var shift = getShiftFromSize(size);
  3920. var fromWireType = function(value) {
  3921. return value;
  3922. };
  3923. if (minRange === 0) {
  3924. var bitshift = 32 - 8 * size;
  3925. fromWireType = function(value) {
  3926. return value << bitshift >>> bitshift;
  3927. };
  3928. }
  3929. var isUnsignedType = name.indexOf("unsigned") != -1;
  3930. registerType(primitiveType, {name, fromWireType, toWireType: function(destructors, value) {
  3931. if (typeof value !== "number" && typeof value !== "boolean") {
  3932. throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name);
  3933. }
  3934. if (value < minRange || value > maxRange) {
  3935. throw new TypeError('Passing a number "' + _embind_repr(value) + '" from JS side to C/C++ side to an argument of type "' + name + '", which is outside the valid range [' + minRange + ", " + maxRange + "]!");
  3936. }
  3937. return isUnsignedType ? value >>> 0 : value | 0;
  3938. }, argPackAdvance: 8, readValueFromPointer: integerReadValueFromPointer(name, shift, minRange !== 0), destructorFunction: null});
  3939. }
  3940. function __embind_register_memory_view(rawType, dataTypeIndex, name) {
  3941. var typeMapping = [Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array];
  3942. var TA = typeMapping[dataTypeIndex];
  3943. function decodeMemoryView(handle) {
  3944. handle = handle >> 2;
  3945. var heap = HEAPU32;
  3946. var size = heap[handle];
  3947. var data = heap[handle + 1];
  3948. return new TA(buffer, data, size);
  3949. }
  3950. name = readLatin1String(name);
  3951. registerType(rawType, {name, fromWireType: decodeMemoryView, argPackAdvance: 8, readValueFromPointer: decodeMemoryView}, {ignoreDuplicateRegistrations: true});
  3952. }
  3953. function __embind_register_std_string(rawType, name) {
  3954. name = readLatin1String(name);
  3955. var stdStringIsUTF8 = name === "std::string";
  3956. registerType(rawType, {name, fromWireType: function(value) {
  3957. var length = HEAPU32[value >> 2];
  3958. var str;
  3959. if (stdStringIsUTF8) {
  3960. var decodeStartPtr = value + 4;
  3961. for (var i = 0; i <= length; ++i) {
  3962. var currentBytePtr = value + 4 + i;
  3963. if (i == length || HEAPU8[currentBytePtr] == 0) {
  3964. var maxRead = currentBytePtr - decodeStartPtr;
  3965. var stringSegment = UTF8ToString(decodeStartPtr, maxRead);
  3966. if (str === void 0) {
  3967. str = stringSegment;
  3968. } else {
  3969. str += String.fromCharCode(0);
  3970. str += stringSegment;
  3971. }
  3972. decodeStartPtr = currentBytePtr + 1;
  3973. }
  3974. }
  3975. } else {
  3976. var a = new Array(length);
  3977. for (var i = 0; i < length; ++i) {
  3978. a[i] = String.fromCharCode(HEAPU8[value + 4 + i]);
  3979. }
  3980. str = a.join("");
  3981. }
  3982. _free(value);
  3983. return str;
  3984. }, toWireType: function(destructors, value) {
  3985. if (value instanceof ArrayBuffer) {
  3986. value = new Uint8Array(value);
  3987. }
  3988. var getLength;
  3989. var valueIsOfTypeString = typeof value === "string";
  3990. if (!(valueIsOfTypeString || value instanceof Uint8Array || value instanceof Uint8ClampedArray || value instanceof Int8Array)) {
  3991. throwBindingError("Cannot pass non-string to std::string");
  3992. }
  3993. if (stdStringIsUTF8 && valueIsOfTypeString) {
  3994. getLength = function() {
  3995. return lengthBytesUTF8(value);
  3996. };
  3997. } else {
  3998. getLength = function() {
  3999. return value.length;
  4000. };
  4001. }
  4002. var length = getLength();
  4003. var ptr = _malloc(4 + length + 1);
  4004. HEAPU32[ptr >> 2] = length;
  4005. if (stdStringIsUTF8 && valueIsOfTypeString) {
  4006. stringToUTF8(value, ptr + 4, length + 1);
  4007. } else {
  4008. if (valueIsOfTypeString) {
  4009. for (var i = 0; i < length; ++i) {
  4010. var charCode = value.charCodeAt(i);
  4011. if (charCode > 255) {
  4012. _free(ptr);
  4013. throwBindingError("String has UTF-16 code units that do not fit in 8 bits");
  4014. }
  4015. HEAPU8[ptr + 4 + i] = charCode;
  4016. }
  4017. } else {
  4018. for (var i = 0; i < length; ++i) {
  4019. HEAPU8[ptr + 4 + i] = value[i];
  4020. }
  4021. }
  4022. }
  4023. if (destructors !== null) {
  4024. destructors.push(_free, ptr);
  4025. }
  4026. return ptr;
  4027. }, argPackAdvance: 8, readValueFromPointer: simpleReadValueFromPointer, destructorFunction: function(ptr) {
  4028. _free(ptr);
  4029. }});
  4030. }
  4031. function __embind_register_std_wstring(rawType, charSize, name) {
  4032. name = readLatin1String(name);
  4033. var decodeString, encodeString, getHeap, lengthBytesUTF, shift;
  4034. if (charSize === 2) {
  4035. decodeString = UTF16ToString;
  4036. encodeString = stringToUTF16;
  4037. lengthBytesUTF = lengthBytesUTF16;
  4038. getHeap = function() {
  4039. return HEAPU16;
  4040. };
  4041. shift = 1;
  4042. } else if (charSize === 4) {
  4043. decodeString = UTF32ToString;
  4044. encodeString = stringToUTF32;
  4045. lengthBytesUTF = lengthBytesUTF32;
  4046. getHeap = function() {
  4047. return HEAPU32;
  4048. };
  4049. shift = 2;
  4050. }
  4051. registerType(rawType, {name, fromWireType: function(value) {
  4052. var length = HEAPU32[value >> 2];
  4053. var HEAP = getHeap();
  4054. var str;
  4055. var decodeStartPtr = value + 4;
  4056. for (var i = 0; i <= length; ++i) {
  4057. var currentBytePtr = value + 4 + i * charSize;
  4058. if (i == length || HEAP[currentBytePtr >> shift] == 0) {
  4059. var maxReadBytes = currentBytePtr - decodeStartPtr;
  4060. var stringSegment = decodeString(decodeStartPtr, maxReadBytes);
  4061. if (str === void 0) {
  4062. str = stringSegment;
  4063. } else {
  4064. str += String.fromCharCode(0);
  4065. str += stringSegment;
  4066. }
  4067. decodeStartPtr = currentBytePtr + charSize;
  4068. }
  4069. }
  4070. _free(value);
  4071. return str;
  4072. }, toWireType: function(destructors, value) {
  4073. if (!(typeof value === "string")) {
  4074. throwBindingError("Cannot pass non-string to C++ string type " + name);
  4075. }
  4076. var length = lengthBytesUTF(value);
  4077. var ptr = _malloc(4 + length + charSize);
  4078. HEAPU32[ptr >> 2] = length >> shift;
  4079. encodeString(value, ptr + 4, length + charSize);
  4080. if (destructors !== null) {
  4081. destructors.push(_free, ptr);
  4082. }
  4083. return ptr;
  4084. }, argPackAdvance: 8, readValueFromPointer: simpleReadValueFromPointer, destructorFunction: function(ptr) {
  4085. _free(ptr);
  4086. }});
  4087. }
  4088. function __embind_register_value_array(rawType, name, constructorSignature, rawConstructor, destructorSignature, rawDestructor) {
  4089. tupleRegistrations[rawType] = {name: readLatin1String(name), rawConstructor: embind__requireFunction(constructorSignature, rawConstructor), rawDestructor: embind__requireFunction(destructorSignature, rawDestructor), elements: []};
  4090. }
  4091. function __embind_register_value_array_element(rawTupleType, getterReturnType, getterSignature, getter, getterContext, setterArgumentType, setterSignature, setter, setterContext) {
  4092. tupleRegistrations[rawTupleType].elements.push({getterReturnType, getter: embind__requireFunction(getterSignature, getter), getterContext, setterArgumentType, setter: embind__requireFunction(setterSignature, setter), setterContext});
  4093. }
  4094. function __embind_register_value_object(rawType, name, constructorSignature, rawConstructor, destructorSignature, rawDestructor) {
  4095. structRegistrations[rawType] = {name: readLatin1String(name), rawConstructor: embind__requireFunction(constructorSignature, rawConstructor), rawDestructor: embind__requireFunction(destructorSignature, rawDestructor), fields: []};
  4096. }
  4097. function __embind_register_value_object_field(structType, fieldName, getterReturnType, getterSignature, getter, getterContext, setterArgumentType, setterSignature, setter, setterContext) {
  4098. structRegistrations[structType].fields.push({fieldName: readLatin1String(fieldName), getterReturnType, getter: embind__requireFunction(getterSignature, getter), getterContext, setterArgumentType, setter: embind__requireFunction(setterSignature, setter), setterContext});
  4099. }
  4100. function __embind_register_void(rawType, name) {
  4101. name = readLatin1String(name);
  4102. registerType(rawType, {isVoid: true, name, argPackAdvance: 0, fromWireType: function() {
  4103. return void 0;
  4104. }, toWireType: function(destructors, o) {
  4105. return void 0;
  4106. }});
  4107. }
  4108. function __emval_incref(handle) {
  4109. if (handle > 4) {
  4110. emval_handle_array[handle].refcount += 1;
  4111. }
  4112. }
  4113. function __emval_new_array() {
  4114. return __emval_register([]);
  4115. }
  4116. var emval_symbols = {};
  4117. function getStringOrSymbol(address) {
  4118. var symbol = emval_symbols[address];
  4119. if (symbol === void 0) {
  4120. return readLatin1String(address);
  4121. } else {
  4122. return symbol;
  4123. }
  4124. }
  4125. function __emval_new_cstring(v) {
  4126. return __emval_register(getStringOrSymbol(v));
  4127. }
  4128. function __emval_new_object() {
  4129. return __emval_register({});
  4130. }
  4131. function requireHandle(handle) {
  4132. if (!handle) {
  4133. throwBindingError("Cannot use deleted val. handle = " + handle);
  4134. }
  4135. return emval_handle_array[handle].value;
  4136. }
  4137. function __emval_set_property(handle, key2, value) {
  4138. handle = requireHandle(handle);
  4139. key2 = requireHandle(key2);
  4140. value = requireHandle(value);
  4141. handle[key2] = value;
  4142. }
  4143. function requireRegisteredType(rawType, humanName) {
  4144. var impl = registeredTypes[rawType];
  4145. if (impl === void 0) {
  4146. throwBindingError(humanName + " has unknown type " + getTypeName(rawType));
  4147. }
  4148. return impl;
  4149. }
  4150. function __emval_take_value(type, argv) {
  4151. type = requireRegisteredType(type, "_emval_take_value");
  4152. var v = type["readValueFromPointer"](argv);
  4153. return __emval_register(v);
  4154. }
  4155. function _abort() {
  4156. abort();
  4157. }
  4158. var _emscripten_get_now;
  4159. if (ENVIRONMENT_IS_NODE) {
  4160. _emscripten_get_now = function() {
  4161. var t = process["hrtime"]();
  4162. return t[0] * 1e3 + t[1] / 1e6;
  4163. };
  4164. } else if (typeof dateNow !== "undefined") {
  4165. _emscripten_get_now = dateNow;
  4166. } else
  4167. _emscripten_get_now = function() {
  4168. return performance.now();
  4169. };
  4170. var _emscripten_get_now_is_monotonic = true;
  4171. function setErrNo(value) {
  4172. HEAP32[___errno_location() >> 2] = value;
  4173. return value;
  4174. }
  4175. function _clock_gettime(clk_id, tp) {
  4176. var now;
  4177. if (clk_id === 0) {
  4178. now = Date.now();
  4179. } else if ((clk_id === 1 || clk_id === 4) && _emscripten_get_now_is_monotonic) {
  4180. now = _emscripten_get_now();
  4181. } else {
  4182. setErrNo(28);
  4183. return -1;
  4184. }
  4185. HEAP32[tp >> 2] = now / 1e3 | 0;
  4186. HEAP32[tp + 4 >> 2] = now % 1e3 * 1e3 * 1e3 | 0;
  4187. return 0;
  4188. }
  4189. function _emscripten_memcpy_big(dest, src, num) {
  4190. HEAPU8.copyWithin(dest, src, src + num);
  4191. }
  4192. function _emscripten_get_heap_size() {
  4193. return HEAPU8.length;
  4194. }
  4195. function emscripten_realloc_buffer(size) {
  4196. try {
  4197. wasmMemory.grow(size - buffer.byteLength + 65535 >>> 16);
  4198. updateGlobalBufferAndViews(wasmMemory.buffer);
  4199. return 1;
  4200. } catch (e) {
  4201. }
  4202. }
  4203. function _emscripten_resize_heap(requestedSize) {
  4204. requestedSize = requestedSize >>> 0;
  4205. var oldSize = _emscripten_get_heap_size();
  4206. var maxHeapSize = 2147483648;
  4207. if (requestedSize > maxHeapSize) {
  4208. return false;
  4209. }
  4210. var minHeapSize = 16777216;
  4211. for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
  4212. var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);
  4213. overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);
  4214. var newSize = Math.min(maxHeapSize, alignUp(Math.max(minHeapSize, requestedSize, overGrownHeapSize), 65536));
  4215. var replacement = emscripten_realloc_buffer(newSize);
  4216. if (replacement) {
  4217. return true;
  4218. }
  4219. }
  4220. return false;
  4221. }
  4222. var ENV = {};
  4223. function getExecutableName() {
  4224. return thisProgram || "./this.program";
  4225. }
  4226. function getEnvStrings() {
  4227. if (!getEnvStrings.strings) {
  4228. var lang = (typeof navigator === "object" && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8";
  4229. var env = {USER: "web_user", LOGNAME: "web_user", PATH: "/", PWD: "/", HOME: "/home/web_user", LANG: lang, _: getExecutableName()};
  4230. for (var x in ENV) {
  4231. env[x] = ENV[x];
  4232. }
  4233. var strings = [];
  4234. for (var x in env) {
  4235. strings.push(x + "=" + env[x]);
  4236. }
  4237. getEnvStrings.strings = strings;
  4238. }
  4239. return getEnvStrings.strings;
  4240. }
  4241. function _environ_get(__environ, environ_buf) {
  4242. try {
  4243. var bufSize = 0;
  4244. getEnvStrings().forEach(function(string, i) {
  4245. var ptr = environ_buf + bufSize;
  4246. HEAP32[__environ + i * 4 >> 2] = ptr;
  4247. writeAsciiToMemory(string, ptr);
  4248. bufSize += string.length + 1;
  4249. });
  4250. return 0;
  4251. } catch (e) {
  4252. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  4253. abort(e);
  4254. return e.errno;
  4255. }
  4256. }
  4257. function _environ_sizes_get(penviron_count, penviron_buf_size) {
  4258. try {
  4259. var strings = getEnvStrings();
  4260. HEAP32[penviron_count >> 2] = strings.length;
  4261. var bufSize = 0;
  4262. strings.forEach(function(string) {
  4263. bufSize += string.length + 1;
  4264. });
  4265. HEAP32[penviron_buf_size >> 2] = bufSize;
  4266. return 0;
  4267. } catch (e) {
  4268. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  4269. abort(e);
  4270. return e.errno;
  4271. }
  4272. }
  4273. function _fd_close(fd) {
  4274. try {
  4275. var stream = SYSCALLS.getStreamFromFD(fd);
  4276. FS.close(stream);
  4277. return 0;
  4278. } catch (e) {
  4279. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  4280. abort(e);
  4281. return e.errno;
  4282. }
  4283. }
  4284. function _fd_read(fd, iov, iovcnt, pnum) {
  4285. try {
  4286. var stream = SYSCALLS.getStreamFromFD(fd);
  4287. var num = SYSCALLS.doReadv(stream, iov, iovcnt);
  4288. HEAP32[pnum >> 2] = num;
  4289. return 0;
  4290. } catch (e) {
  4291. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  4292. abort(e);
  4293. return e.errno;
  4294. }
  4295. }
  4296. function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
  4297. try {
  4298. var stream = SYSCALLS.getStreamFromFD(fd);
  4299. var HIGH_OFFSET = 4294967296;
  4300. var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0);
  4301. var DOUBLE_LIMIT = 9007199254740992;
  4302. if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) {
  4303. return -61;
  4304. }
  4305. FS.llseek(stream, offset, whence);
  4306. tempI64 = [stream.position >>> 0, (tempDouble = stream.position, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[newOffset >> 2] = tempI64[0], HEAP32[newOffset + 4 >> 2] = tempI64[1];
  4307. if (stream.getdents && offset === 0 && whence === 0)
  4308. stream.getdents = null;
  4309. return 0;
  4310. } catch (e) {
  4311. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  4312. abort(e);
  4313. return e.errno;
  4314. }
  4315. }
  4316. function _fd_write(fd, iov, iovcnt, pnum) {
  4317. try {
  4318. var stream = SYSCALLS.getStreamFromFD(fd);
  4319. var num = SYSCALLS.doWritev(stream, iov, iovcnt);
  4320. HEAP32[pnum >> 2] = num;
  4321. return 0;
  4322. } catch (e) {
  4323. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  4324. abort(e);
  4325. return e.errno;
  4326. }
  4327. }
  4328. function _setTempRet0($i) {
  4329. setTempRet0($i | 0);
  4330. }
  4331. function __isLeapYear(year) {
  4332. return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
  4333. }
  4334. function __arraySum(array, index) {
  4335. var sum = 0;
  4336. for (var i = 0; i <= index; sum += array[i++]) {
  4337. }
  4338. return sum;
  4339. }
  4340. var __MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  4341. var __MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  4342. function __addDays(date, days) {
  4343. var newDate = new Date(date.getTime());
  4344. while (days > 0) {
  4345. var leap = __isLeapYear(newDate.getFullYear());
  4346. var currentMonth = newDate.getMonth();
  4347. var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth];
  4348. if (days > daysInCurrentMonth - newDate.getDate()) {
  4349. days -= daysInCurrentMonth - newDate.getDate() + 1;
  4350. newDate.setDate(1);
  4351. if (currentMonth < 11) {
  4352. newDate.setMonth(currentMonth + 1);
  4353. } else {
  4354. newDate.setMonth(0);
  4355. newDate.setFullYear(newDate.getFullYear() + 1);
  4356. }
  4357. } else {
  4358. newDate.setDate(newDate.getDate() + days);
  4359. return newDate;
  4360. }
  4361. }
  4362. return newDate;
  4363. }
  4364. function _strftime(s, maxsize, format, tm) {
  4365. var tm_zone = HEAP32[tm + 40 >> 2];
  4366. var date = {tm_sec: HEAP32[tm >> 2], tm_min: HEAP32[tm + 4 >> 2], tm_hour: HEAP32[tm + 8 >> 2], tm_mday: HEAP32[tm + 12 >> 2], tm_mon: HEAP32[tm + 16 >> 2], tm_year: HEAP32[tm + 20 >> 2], tm_wday: HEAP32[tm + 24 >> 2], tm_yday: HEAP32[tm + 28 >> 2], tm_isdst: HEAP32[tm + 32 >> 2], tm_gmtoff: HEAP32[tm + 36 >> 2], tm_zone: tm_zone ? UTF8ToString(tm_zone) : ""};
  4367. var pattern = UTF8ToString(format);
  4368. var EXPANSION_RULES_1 = {"%c": "%a %b %d %H:%M:%S %Y", "%D": "%m/%d/%y", "%F": "%Y-%m-%d", "%h": "%b", "%r": "%I:%M:%S %p", "%R": "%H:%M", "%T": "%H:%M:%S", "%x": "%m/%d/%y", "%X": "%H:%M:%S", "%Ec": "%c", "%EC": "%C", "%Ex": "%m/%d/%y", "%EX": "%H:%M:%S", "%Ey": "%y", "%EY": "%Y", "%Od": "%d", "%Oe": "%e", "%OH": "%H", "%OI": "%I", "%Om": "%m", "%OM": "%M", "%OS": "%S", "%Ou": "%u", "%OU": "%U", "%OV": "%V", "%Ow": "%w", "%OW": "%W", "%Oy": "%y"};
  4369. for (var rule in EXPANSION_RULES_1) {
  4370. pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]);
  4371. }
  4372. var WEEKDAYS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
  4373. var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
  4374. function leadingSomething(value, digits, character) {
  4375. var str = typeof value === "number" ? value.toString() : value || "";
  4376. while (str.length < digits) {
  4377. str = character[0] + str;
  4378. }
  4379. return str;
  4380. }
  4381. function leadingNulls(value, digits) {
  4382. return leadingSomething(value, digits, "0");
  4383. }
  4384. function compareByDay(date1, date2) {
  4385. function sgn(value) {
  4386. return value < 0 ? -1 : value > 0 ? 1 : 0;
  4387. }
  4388. var compare;
  4389. if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) {
  4390. if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) {
  4391. compare = sgn(date1.getDate() - date2.getDate());
  4392. }
  4393. }
  4394. return compare;
  4395. }
  4396. function getFirstWeekStartDate(janFourth) {
  4397. switch (janFourth.getDay()) {
  4398. case 0:
  4399. return new Date(janFourth.getFullYear() - 1, 11, 29);
  4400. case 1:
  4401. return janFourth;
  4402. case 2:
  4403. return new Date(janFourth.getFullYear(), 0, 3);
  4404. case 3:
  4405. return new Date(janFourth.getFullYear(), 0, 2);
  4406. case 4:
  4407. return new Date(janFourth.getFullYear(), 0, 1);
  4408. case 5:
  4409. return new Date(janFourth.getFullYear() - 1, 11, 31);
  4410. case 6:
  4411. return new Date(janFourth.getFullYear() - 1, 11, 30);
  4412. }
  4413. }
  4414. function getWeekBasedYear(date2) {
  4415. var thisDate = __addDays(new Date(date2.tm_year + 1900, 0, 1), date2.tm_yday);
  4416. var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4);
  4417. var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4);
  4418. var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
  4419. var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);
  4420. if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) {
  4421. if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) {
  4422. return thisDate.getFullYear() + 1;
  4423. } else {
  4424. return thisDate.getFullYear();
  4425. }
  4426. } else {
  4427. return thisDate.getFullYear() - 1;
  4428. }
  4429. }
  4430. var EXPANSION_RULES_2 = {"%a": function(date2) {
  4431. return WEEKDAYS[date2.tm_wday].substring(0, 3);
  4432. }, "%A": function(date2) {
  4433. return WEEKDAYS[date2.tm_wday];
  4434. }, "%b": function(date2) {
  4435. return MONTHS[date2.tm_mon].substring(0, 3);
  4436. }, "%B": function(date2) {
  4437. return MONTHS[date2.tm_mon];
  4438. }, "%C": function(date2) {
  4439. var year = date2.tm_year + 1900;
  4440. return leadingNulls(year / 100 | 0, 2);
  4441. }, "%d": function(date2) {
  4442. return leadingNulls(date2.tm_mday, 2);
  4443. }, "%e": function(date2) {
  4444. return leadingSomething(date2.tm_mday, 2, " ");
  4445. }, "%g": function(date2) {
  4446. return getWeekBasedYear(date2).toString().substring(2);
  4447. }, "%G": function(date2) {
  4448. return getWeekBasedYear(date2);
  4449. }, "%H": function(date2) {
  4450. return leadingNulls(date2.tm_hour, 2);
  4451. }, "%I": function(date2) {
  4452. var twelveHour = date2.tm_hour;
  4453. if (twelveHour == 0)
  4454. twelveHour = 12;
  4455. else if (twelveHour > 12)
  4456. twelveHour -= 12;
  4457. return leadingNulls(twelveHour, 2);
  4458. }, "%j": function(date2) {
  4459. return leadingNulls(date2.tm_mday + __arraySum(__isLeapYear(date2.tm_year + 1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date2.tm_mon - 1), 3);
  4460. }, "%m": function(date2) {
  4461. return leadingNulls(date2.tm_mon + 1, 2);
  4462. }, "%M": function(date2) {
  4463. return leadingNulls(date2.tm_min, 2);
  4464. }, "%n": function() {
  4465. return "\n";
  4466. }, "%p": function(date2) {
  4467. if (date2.tm_hour >= 0 && date2.tm_hour < 12) {
  4468. return "AM";
  4469. } else {
  4470. return "PM";
  4471. }
  4472. }, "%S": function(date2) {
  4473. return leadingNulls(date2.tm_sec, 2);
  4474. }, "%t": function() {
  4475. return " ";
  4476. }, "%u": function(date2) {
  4477. return date2.tm_wday || 7;
  4478. }, "%U": function(date2) {
  4479. var janFirst = new Date(date2.tm_year + 1900, 0, 1);
  4480. var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7 - janFirst.getDay());
  4481. var endDate = new Date(date2.tm_year + 1900, date2.tm_mon, date2.tm_mday);
  4482. if (compareByDay(firstSunday, endDate) < 0) {
  4483. var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31;
  4484. var firstSundayUntilEndJanuary = 31 - firstSunday.getDate();
  4485. var days = firstSundayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate();
  4486. return leadingNulls(Math.ceil(days / 7), 2);
  4487. }
  4488. return compareByDay(firstSunday, janFirst) === 0 ? "01" : "00";
  4489. }, "%V": function(date2) {
  4490. var janFourthThisYear = new Date(date2.tm_year + 1900, 0, 4);
  4491. var janFourthNextYear = new Date(date2.tm_year + 1901, 0, 4);
  4492. var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
  4493. var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);
  4494. var endDate = __addDays(new Date(date2.tm_year + 1900, 0, 1), date2.tm_yday);
  4495. if (compareByDay(endDate, firstWeekStartThisYear) < 0) {
  4496. return "53";
  4497. }
  4498. if (compareByDay(firstWeekStartNextYear, endDate) <= 0) {
  4499. return "01";
  4500. }
  4501. var daysDifference;
  4502. if (firstWeekStartThisYear.getFullYear() < date2.tm_year + 1900) {
  4503. daysDifference = date2.tm_yday + 32 - firstWeekStartThisYear.getDate();
  4504. } else {
  4505. daysDifference = date2.tm_yday + 1 - firstWeekStartThisYear.getDate();
  4506. }
  4507. return leadingNulls(Math.ceil(daysDifference / 7), 2);
  4508. }, "%w": function(date2) {
  4509. return date2.tm_wday;
  4510. }, "%W": function(date2) {
  4511. var janFirst = new Date(date2.tm_year, 0, 1);
  4512. var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7 - janFirst.getDay() + 1);
  4513. var endDate = new Date(date2.tm_year + 1900, date2.tm_mon, date2.tm_mday);
  4514. if (compareByDay(firstMonday, endDate) < 0) {
  4515. var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31;
  4516. var firstMondayUntilEndJanuary = 31 - firstMonday.getDate();
  4517. var days = firstMondayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate();
  4518. return leadingNulls(Math.ceil(days / 7), 2);
  4519. }
  4520. return compareByDay(firstMonday, janFirst) === 0 ? "01" : "00";
  4521. }, "%y": function(date2) {
  4522. return (date2.tm_year + 1900).toString().substring(2);
  4523. }, "%Y": function(date2) {
  4524. return date2.tm_year + 1900;
  4525. }, "%z": function(date2) {
  4526. var off = date2.tm_gmtoff;
  4527. var ahead = off >= 0;
  4528. off = Math.abs(off) / 60;
  4529. off = off / 60 * 100 + off % 60;
  4530. return (ahead ? "+" : "-") + String("0000" + off).slice(-4);
  4531. }, "%Z": function(date2) {
  4532. return date2.tm_zone;
  4533. }, "%%": function() {
  4534. return "%";
  4535. }};
  4536. for (var rule in EXPANSION_RULES_2) {
  4537. if (pattern.indexOf(rule) >= 0) {
  4538. pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date));
  4539. }
  4540. }
  4541. var bytes = intArrayFromString(pattern, false);
  4542. if (bytes.length > maxsize) {
  4543. return 0;
  4544. }
  4545. writeArrayToMemory(bytes, s);
  4546. return bytes.length - 1;
  4547. }
  4548. function _strftime_l(s, maxsize, format, tm) {
  4549. return _strftime(s, maxsize, format, tm);
  4550. }
  4551. var FSNode = function(parent, name, mode, rdev) {
  4552. if (!parent) {
  4553. parent = this;
  4554. }
  4555. this.parent = parent;
  4556. this.mount = parent.mount;
  4557. this.mounted = null;
  4558. this.id = FS.nextInode++;
  4559. this.name = name;
  4560. this.mode = mode;
  4561. this.node_ops = {};
  4562. this.stream_ops = {};
  4563. this.rdev = rdev;
  4564. };
  4565. var readMode = 292 | 73;
  4566. var writeMode = 146;
  4567. Object.defineProperties(FSNode.prototype, {read: {get: function() {
  4568. return (this.mode & readMode) === readMode;
  4569. }, set: function(val) {
  4570. val ? this.mode |= readMode : this.mode &= ~readMode;
  4571. }}, write: {get: function() {
  4572. return (this.mode & writeMode) === writeMode;
  4573. }, set: function(val) {
  4574. val ? this.mode |= writeMode : this.mode &= ~writeMode;
  4575. }}, isFolder: {get: function() {
  4576. return FS.isDir(this.mode);
  4577. }}, isDevice: {get: function() {
  4578. return FS.isChrdev(this.mode);
  4579. }}});
  4580. FS.FSNode = FSNode;
  4581. FS.staticInit();
  4582. Module["FS_createPath"] = FS.createPath;
  4583. Module["FS_createDataFile"] = FS.createDataFile;
  4584. Module["FS_createPreloadedFile"] = FS.createPreloadedFile;
  4585. Module["FS_createLazyFile"] = FS.createLazyFile;
  4586. Module["FS_createDevice"] = FS.createDevice;
  4587. Module["FS_unlink"] = FS.unlink;
  4588. InternalError = Module["InternalError"] = extendError(Error, "InternalError");
  4589. embind_init_charCodes();
  4590. BindingError = Module["BindingError"] = extendError(Error, "BindingError");
  4591. init_ClassHandle();
  4592. init_RegisteredPointer();
  4593. init_embind();
  4594. UnboundTypeError = Module["UnboundTypeError"] = extendError(Error, "UnboundTypeError");
  4595. init_emval();
  4596. function intArrayFromString(stringy, dontAddNull, length) {
  4597. var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
  4598. var u8array = new Array(len);
  4599. var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);
  4600. if (dontAddNull)
  4601. u8array.length = numBytesWritten;
  4602. return u8array;
  4603. }
  4604. __ATINIT__.push({func: function() {
  4605. ___wasm_call_ctors();
  4606. }});
  4607. var asmLibraryArg = {t: ___assert_fail, I: ___sys_ioctl, J: ___sys_open, N: __embind_finalize_value_array, r: __embind_finalize_value_object, L: __embind_register_bool, n: __embind_register_class, o: __embind_register_class_constructor, d: __embind_register_class_function, K: __embind_register_emval, w: __embind_register_float, l: __embind_register_function, h: __embind_register_integer, g: __embind_register_memory_view, x: __embind_register_std_string, q: __embind_register_std_wstring, O: __embind_register_value_array, e: __embind_register_value_array_element, s: __embind_register_value_object, i: __embind_register_value_object_field, M: __embind_register_void, c: __emval_decref, k: __emval_incref, y: __emval_new_array, p: __emval_new_cstring, z: __emval_new_object, j: __emval_set_property, f: __emval_take_value, b: _abort, G: _clock_gettime, C: _emscripten_memcpy_big, m: _emscripten_resize_heap, E: _environ_get, F: _environ_sizes_get, v: _fd_close, H: _fd_read, A: _fd_seek, u: _fd_write, a: wasmMemory, B: _setTempRet0, D: _strftime_l};
  4608. var asm = createWasm();
  4609. var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() {
  4610. return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["Q"]).apply(null, arguments);
  4611. };
  4612. var _main = Module["_main"] = function() {
  4613. return (_main = Module["_main"] = Module["asm"]["R"]).apply(null, arguments);
  4614. };
  4615. var _malloc = Module["_malloc"] = function() {
  4616. return (_malloc = Module["_malloc"] = Module["asm"]["S"]).apply(null, arguments);
  4617. };
  4618. var ___getTypeName = Module["___getTypeName"] = function() {
  4619. return (___getTypeName = Module["___getTypeName"] = Module["asm"]["T"]).apply(null, arguments);
  4620. };
  4621. var ___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = function() {
  4622. return (___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = Module["asm"]["U"]).apply(null, arguments);
  4623. };
  4624. var ___errno_location = Module["___errno_location"] = function() {
  4625. return (___errno_location = Module["___errno_location"] = Module["asm"]["V"]).apply(null, arguments);
  4626. };
  4627. var _free = Module["_free"] = function() {
  4628. return (_free = Module["_free"] = Module["asm"]["W"]).apply(null, arguments);
  4629. };
  4630. var dynCall_jiji = Module["dynCall_jiji"] = function() {
  4631. return (dynCall_jiji = Module["dynCall_jiji"] = Module["asm"]["X"]).apply(null, arguments);
  4632. };
  4633. var dynCall_viijii = Module["dynCall_viijii"] = function() {
  4634. return (dynCall_viijii = Module["dynCall_viijii"] = Module["asm"]["Y"]).apply(null, arguments);
  4635. };
  4636. var dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = function() {
  4637. return (dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = Module["asm"]["Z"]).apply(null, arguments);
  4638. };
  4639. var dynCall_iiiiij = Module["dynCall_iiiiij"] = function() {
  4640. return (dynCall_iiiiij = Module["dynCall_iiiiij"] = Module["asm"]["_"]).apply(null, arguments);
  4641. };
  4642. var dynCall_iiiiijj = Module["dynCall_iiiiijj"] = function() {
  4643. return (dynCall_iiiiijj = Module["dynCall_iiiiijj"] = Module["asm"]["$"]).apply(null, arguments);
  4644. };
  4645. Module["addRunDependency"] = addRunDependency;
  4646. Module["removeRunDependency"] = removeRunDependency;
  4647. Module["FS_createPath"] = FS.createPath;
  4648. Module["FS_createDataFile"] = FS.createDataFile;
  4649. Module["FS_createPreloadedFile"] = FS.createPreloadedFile;
  4650. Module["FS_createLazyFile"] = FS.createLazyFile;
  4651. Module["FS_createDevice"] = FS.createDevice;
  4652. Module["FS_unlink"] = FS.unlink;
  4653. var calledRun;
  4654. function ExitStatus(status) {
  4655. this.name = "ExitStatus";
  4656. this.message = "Program terminated with exit(" + status + ")";
  4657. this.status = status;
  4658. }
  4659. var calledMain = false;
  4660. dependenciesFulfilled = function runCaller() {
  4661. if (!calledRun)
  4662. run();
  4663. if (!calledRun)
  4664. dependenciesFulfilled = runCaller;
  4665. };
  4666. function callMain(args) {
  4667. var entryFunction = Module["_main"];
  4668. var argc = 0;
  4669. var argv = 0;
  4670. try {
  4671. var ret = entryFunction(argc, argv);
  4672. exit(ret, true);
  4673. } catch (e) {
  4674. if (e instanceof ExitStatus) {
  4675. return;
  4676. } else if (e == "unwind") {
  4677. noExitRuntime = true;
  4678. return;
  4679. } else {
  4680. var toLog = e;
  4681. if (e && typeof e === "object" && e.stack) {
  4682. toLog = [e, e.stack];
  4683. }
  4684. err("exception thrown: " + toLog);
  4685. quit_(1, e);
  4686. }
  4687. } finally {
  4688. calledMain = true;
  4689. }
  4690. }
  4691. function run(args) {
  4692. args = args || arguments_;
  4693. if (runDependencies > 0) {
  4694. return;
  4695. }
  4696. preRun();
  4697. if (runDependencies > 0)
  4698. return;
  4699. function doRun() {
  4700. if (calledRun)
  4701. return;
  4702. calledRun = true;
  4703. Module["calledRun"] = true;
  4704. if (ABORT)
  4705. return;
  4706. initRuntime();
  4707. preMain();
  4708. readyPromiseResolve(Module);
  4709. if (Module["onRuntimeInitialized"])
  4710. Module["onRuntimeInitialized"]();
  4711. if (shouldRunNow)
  4712. callMain(args);
  4713. postRun();
  4714. }
  4715. if (Module["setStatus"]) {
  4716. Module["setStatus"]("Running...");
  4717. setTimeout(function() {
  4718. setTimeout(function() {
  4719. Module["setStatus"]("");
  4720. }, 1);
  4721. doRun();
  4722. }, 1);
  4723. } else {
  4724. doRun();
  4725. }
  4726. }
  4727. Module["run"] = run;
  4728. function exit(status, implicit) {
  4729. if (implicit && noExitRuntime && status === 0) {
  4730. return;
  4731. }
  4732. if (noExitRuntime) {
  4733. } else {
  4734. EXITSTATUS = status;
  4735. exitRuntime();
  4736. if (Module["onExit"])
  4737. Module["onExit"](status);
  4738. ABORT = true;
  4739. }
  4740. quit_(status, new ExitStatus(status));
  4741. }
  4742. if (Module["preInit"]) {
  4743. if (typeof Module["preInit"] == "function")
  4744. Module["preInit"] = [Module["preInit"]];
  4745. while (Module["preInit"].length > 0) {
  4746. Module["preInit"].pop()();
  4747. }
  4748. }
  4749. var shouldRunNow = true;
  4750. if (Module["noInitialRun"])
  4751. shouldRunNow = false;
  4752. noExitRuntime = true;
  4753. run();
  4754. return WebIFCWasm3.ready;
  4755. };
  4756. }();
  4757. if (typeof exports === "object" && typeof module === "object")
  4758. module.exports = WebIFCWasm2;
  4759. else if (typeof define === "function" && define["amd"])
  4760. define([], function() {
  4761. return WebIFCWasm2;
  4762. });
  4763. else if (typeof exports === "object")
  4764. exports["WebIFCWasm"] = WebIFCWasm2;
  4765. });
  4766. // dist/web-ifc-api.ts
  4767. var WebIFCWasm = require_web_ifc();
  4768. function ms() {
  4769. return new Date().getTime();
  4770. }
  4771. var IfcAPI = class {
  4772. constructor() {
  4773. this.wasmModule = void 0;
  4774. }
  4775. async Init() {
  4776. if (WebIFCWasm) {
  4777. this.wasmModule = await WebIFCWasm({noInitialRun: true});
  4778. } else {
  4779. console.error(`Could not find wasm module at './web-ifc' from web-ifc-api.ts`);
  4780. }
  4781. }
  4782. OpenModel(filename, data) {
  4783. this.wasmModule["FS_createDataFile"]("/", "filename", data, true, true, true);
  4784. console.log("Wrote file");
  4785. let result = this.wasmModule.OpenModel(filename);
  4786. this.wasmModule["FS_unlink"]("/filename");
  4787. return result;
  4788. }
  4789. GetGeometry(modelID, geometryExpressID) {
  4790. return this.wasmModule.GetGeometry(modelID, geometryExpressID);
  4791. }
  4792. GetLine(modelID, expressID) {
  4793. return this.wasmModule.GetLine(modelID, expressID);
  4794. }
  4795. GetLineIDsWithType(modelID, type) {
  4796. return this.wasmModule.GetLineIDsWithType(modelID, type);
  4797. }
  4798. SetGeometryTransformation(modelID, transformationMatrix) {
  4799. if (transformationMatrix.length != 16) {
  4800. console.log(`Bad transformation matrix size: ${transformationMatrix.length}`);
  4801. return;
  4802. }
  4803. this.wasmModule.SetGeometryTransformation(modelID, transformationMatrix);
  4804. }
  4805. GetVertexArray(ptr, size) {
  4806. return this.getSubArray(this.wasmModule.HEAPF32, ptr, size);
  4807. }
  4808. GetIndexArray(ptr, size) {
  4809. return this.getSubArray(this.wasmModule.HEAPU32, ptr, size);
  4810. }
  4811. getSubArray(heap, startPtr, sizeBytes) {
  4812. return heap.subarray(startPtr / 4, startPtr / 4 + sizeBytes).slice(0);
  4813. }
  4814. CloseModel(modelID) {
  4815. this.wasmModule.CloseModel(modelID);
  4816. }
  4817. IsModelOpen(modelID) {
  4818. return this.wasmModule.IsModelOpen(modelID);
  4819. }
  4820. LoadAllGeometry(modelID) {
  4821. return this.wasmModule.LoadAllGeometry(modelID);
  4822. }
  4823. SetWasmPath(path){
  4824. WasmPath = path;
  4825. }
  4826. };
  4827. export {
  4828. IfcAPI,
  4829. ms
  4830. };