(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))o(s);new MutationObserver(s=>{for(const c of s)if(c.type==="childList")for(const u of c.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&o(u)}).observe(document,{childList:!0,subtree:!0});function a(s){const c={};return s.integrity&&(c.integrity=s.integrity),s.referrerPolicy&&(c.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?c.credentials="include":s.crossOrigin==="anonymous"?c.credentials="omit":c.credentials="same-origin",c}function o(s){if(s.ep)return;s.ep=!0;const c=a(s);fetch(s.href,c)}})();const Re=new Worker(new URL("/assets/db-worker-DFFhVJkA.js",import.meta.url),{type:"module"});let fr=0,Ae=null;const et=new Map;function Rn(){return Ae||(Ae=new Promise((e,r)=>{Re.onmessage=o=>{const s=o.data;if(s.type==="ready")return;const c=et.get(s.id);c&&(et.delete(s.id),s.type=="success"?c.resolve(s.data):c.reject(new Error(s.error??s.message??"Неизвестная ошибка Worker")))},Re.onerror=o=>{console.error("[SQLite Worker] Ошибка:",o),r(new Error("Ошибка Worker"))};const a=++fr;et.set(a,{resolve:e,reject:r}),Re.postMessage({type:"start",id:a})}),Ae)}function pr(e,r){return new Promise((a,o)=>{if(!Re){o(new Error("Worker не создан"));return}const s=++fr;et.set(s,{resolve:a,reject:o}),Re.postMessage({type:e,id:s,...r})})}async function ie(e,r){return await pr("query",{sql:e,params:r??[]})}async function hr(e,r){await pr("command",{sql:e,params:r??[]})}function wr(e){return new Date(e*1e3)}function In(){return Math.floor(Date.now()/1e3)}function Jn(e){const r=wr(e),a=String(r.getDate()).padStart(2,"0"),o=String(r.getMonth()+1).padStart(2,"0");return`${a}.${o}.${r.getFullYear()}`}function On(e){const r=wr(e),a=String(r.getHours()).padStart(2,"0"),o=String(r.getMinutes()).padStart(2,"0");return`${Jn(e)} ${a}:${o}`}function Kn(e){if(e==null)return[];const r=String(e).trim();return r?r.split(/[,\s;]+/).map(a=>a.trim()).filter(a=>a.length>0):[]}function Dn(e){const r=new Map;if(e==null)return r;const a=String(e);if(!a)return r;const o=a.split("");for(let s=0;s+10?`WHERE ${r.join(" AND ")}`:"",params:a}}async function Xn(e={}){const{clause:r,params:a}=mr(e),s=(await ie(`SELECT COUNT(*) as cnt FROM words ${r}`,a))[0]?.cnt;return typeof s=="number"?s:Number(s??0)}async function tr(e={}){const{clause:r,params:a}=mr(e),o=Math.max(1,Math.min(e.limit??50,500)),s=Math.max(0,e.offset??0);return(await ie(`SELECT id, key, value, tags, more, group_id FROM words ${r} ORDER BY id LIMIT ? OFFSET ?`,[...a,o,s])).map(gr)}async function zn(){return(await ie("SELECT id, name FROM word_groups ORDER BY id")).map(r=>({id:Number(r.id),name:String(r.name??"")}))}async function Bn(){return(await ie("SELECT id, name, forward, backward, filter FROM decks ORDER BY id")).map(r=>({id:Number(r.id),name:String(r.name??""),forward:String(r.forward??""),backward:String(r.backward??""),filter:String(r.filter??"")}))}async function Vn(e,r){return await hr("UPDATE decks SET forward = ?, backward = ?, filter = ? WHERE id = ?",[r.forward,r.backward,r.filter,e]),nt(e)}async function nt(e){const a=(await ie("SELECT id, name, forward, backward, filter FROM decks WHERE id = ? LIMIT 1",[e]))[0];return a?{id:Number(a.id),name:String(a.name??""),forward:String(a.forward??""),backward:String(a.backward??""),filter:String(a.filter??"")}:null}async function Yn(){const e=await ie("SELECT deck_id, COUNT(*) as cnt FROM states WHERE deck_id IS NOT NULL GROUP BY deck_id"),r=new Map;for(const a of e){if(a.deck_id==null)continue;const o=a.cnt;r.set(Number(a.deck_id),typeof o=="number"?o:Number(o??0))}return r}async function Zn(e){const a=(await ie("SELECT COUNT(DISTINCT word_id) as cnt FROM states WHERE deck_id = ?",[e]))[0]?.cnt;return typeof a=="number"?a:Number(a??0)}async function rr(e){const r=new Map,a=[...new Set(e.filter(s=>Number.isFinite(s)))];if(a.length===0)return r;const o=400;for(let s=0;s"?").join(","),g=await ie(`SELECT id, key, value, tags, more, group_id FROM words WHERE id IN (${u})`,c);for(const y of g.map(gr))r.set(y.id,y)}return r}function Gn(e,r){const a=new Map;a.set("key",e.key),a.set("value",e.value),a.set("tags",e.tagsList.join(", "));for(const o of r){const s=e.more.get(o.id)??"";if(s)for(const c of[o.identifier,o.name]){const u=c.trim().toLowerCase();!u||a.has(u)||a.set(u,s)}}return a}function nr(e,r){const a=[];for(const o of e.split(/\s+/)){const s=o.trim().toLowerCase();if(!s)continue;const c=(r.get(s)??"").trim();c&&a.push(c)}return a}async function ar(e,r){const o=(await ie("SELECT DISTINCT word_id as word_id FROM states WHERE deck_id = ?",[e])).map(s=>Number(s.word_id)).filter(s=>Number.isFinite(s));for(let s=o.length-1;s>0;s--){const c=Math.floor(Math.random()*(s+1));[o[s],o[c]]=[o[c],o[s]]}return o}async function vr(){return(await ie("SELECT id, name, identifier FROM custom_fields ORDER BY id")).map(r=>({id:Number(r.id),name:String(r.name??""),identifier:String(r.identifier??"")}))}async function jn(e,r){const o=(await ie("SELECT score FROM states WHERE deck_id = ? AND word_id = ? ORDER BY id DESC LIMIT 1",[e,r]))[0];if(!o||o.score==null)return null;const s=Number(o.score);return Number.isFinite(s)?s:null}async function Wn(e){await hr("INSERT INTO history (deck_id, word_id, timestamp, answer, before, after, fsrs) VALUES (?, ?, ?, ?, ?, ?, 0)",[e.deckId,e.wordId,In(),e.answer,e.before,e.after])}async function An(e){const a=(await ie("SELECT COUNT(*) as cnt FROM history WHERE deck_id = ?",[e]))[0]?.cnt;return typeof a=="number"?a:Number(a??0)}async function ea(e,r={}){const a=Math.max(1,Math.min(r.limit??50,500)),o=Math.max(0,r.offset??0);return(await ie(`SELECT h.id, h.deck_id, h.word_id, h.timestamp, h.answer, h.before, h.after, h.fsrs, w.key as wkey, w.value as wvalue FROM history h LEFT JOIN words w ON w.id = h.word_id WHERE h.deck_id = ? ORDER BY h.timestamp DESC, h.id DESC LIMIT ? OFFSET ?`,[e,a,o])).map(c=>({id:Number(c.id),deck_id:Number(c.deck_id),word_id:Number(c.word_id),timestamp:Number(c.timestamp??0),answer:Number(c.answer??0),before:Number(c.before??0),after:Number(c.after??0),fsrs:Number(c.fsrs??0),wordKey:c.wkey==null?"":String(c.wkey),wordValue:c.wvalue==null?"":String(c.wvalue)}))}const Ut="japanese_app.db";async function xt(){return navigator.storage.getDirectory()}async function ta(e){e[18]=1,e[19]=1;const a=await(await xt()).getFileHandle(Ut,{create:!0}),o=a.createSyncAccessHandle;if(typeof o=="function")try{const c=await o.call(a);try{c.truncate(0),c.write(e,{at:0}),c.flush()}finally{c.close()}return}catch{}const s=await a.createWritable();try{await s.truncate(0);const c=new Uint8Array(e.length);c.set(e),await s.write(c)}finally{await s.close()}}async function ra(){const e=await xt();let r;try{r=await e.getFileHandle(Ut)}catch{throw new Error("Локальная база не найдена — сначала скачай сохранение")}const a=await r.getFile();if(a.size===0)throw new Error("Локальная база пуста");return new Uint8Array(await a.arrayBuffer())}async function Je(){try{return(await(await(await xt()).getFileHandle(Ut)).getFile()).size>0}catch{return!1}}var na=ArrayBuffer,G=Uint8Array,tt=Uint16Array,aa=Int16Array,at=Int32Array,mt=function(e,r,a){if(G.prototype.slice)return G.prototype.slice.call(e,r,a);(r==null||r<0)&&(r=0),(a==null||a>e.length)&&(a=e.length);var o=new G(a-r);return o.set(e.subarray(r,a)),o},Ie=function(e,r,a,o){if(G.prototype.fill)return G.prototype.fill.call(e,r,a,o);for((a==null||a<0)&&(a=0),(o==null||o>e.length)&&(o=e.length);ae.length)&&(o=e.length);a2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],A=function(e,r,a){var o=new Error(r||ia[e]);if(o.code=e,Error.captureStackTrace&&Error.captureStackTrace(o,A),!a)throw o;return o},sr=function(e,r,a){for(var o=0,s=0;o>>0},ca=function(e,r){var a=e[0]|e[1]<<8|e[2]<<16;if(a==3126568&&e[3]==253){var o=e[4],s=o>>5&1,c=o>>2&1,u=o&3,g=o>>6;o&8&&A(0);var y=6-s,m=u==3?4:u,b=sr(e,y,m);y+=m;var T=g?1<>3);U=N+(N>>3)*(e[5]&7)}U>2145386496&&A(1);var w=new G((r==1?k||U:r?0:U)+12);return w[0]=1,w[4]=4,w[8]=8,{b:y+T,y:0,l:0,d:b,w:r&&r!=1?r:w.subarray(12),e:U,o:new at(w.buffer,0,3),u:k,c,m:Math.min(131072,U)}}else if((a>>4|e[3]<<20)==25481893)return oa(e,4)+8;A(0)},Ce=function(e){for(var r=0;1<a&&A(3);for(var c=1<0;){var J=Ce(u+1),L=o>>3,z=(1<>(o&7)&z,C=(1<C&&(P-=_)),k[++g]=--P,P==-1?(u+=P,E[--b]=g):u-=P,!P)do{var F=o>>3;y=(e[F]|e[F+1]<<8)>>(o&7)&3,o+=2,g+=y}while(y==3)}(g>255||u)&&A(0);for(var X=0,j=(c>>1)+(c>>3)+3,V=c-1,B=0;B<=g;++B){var H=k[B];if(H<1){U[B]=-H;continue}for(m=0;m=b)}}for(X&&A(0),m=0;m>3,{b:s,s:E,n:I,t:N}]},la=function(e,r){var a=0,o=-1,s=new G(292),c=e[r],u=s.subarray(0,256),g=s.subarray(256,268),y=new tt(s.buffer,268);if(c<128){var m=Oe(e,r+1,6),b=m[0],T=m[1];r+=c;var k=b<<3,U=e[r];U||A(0);for(var N=0,w=0,E=T.b,I=E,J=(++r<<3)-8+Ce(U);J-=E,!(J>3;if(N+=(e[L]|e[L+1]<<8)>>(J&7)&(1<>3,w+=(e[L]|e[L+1]<<8)>>(J&7)&(1<255&&A(0)}else{for(o=c-127;a>4,u[a+1]=z&15}++r}var P=0;for(a=0;a11&&A(0),P+=C&&1<0;--a){var B=y[a];Ie(V,a,B,y[a-1]=B+g[a]*(1<<_-a))}for(y[0]!=R&&A(0),a=0;ag&&T>3,U=(e[k]|e[k+1]<<8|e[k+2]<<16)>>(b&7);y=(y<>2,u=c<<1,g=c+u;Pe(e.subarray(o,o+=e[0]|e[1]<<8),r.subarray(0,c),a),Pe(e.subarray(o,o+=e[2]|e[3]<<8),r.subarray(c,u),a),Pe(e.subarray(o,o+=e[4]|e[5]<<8),r.subarray(u,g),a),Pe(e.subarray(o),r.subarray(g),a)},ga=function(e,r,a){var o,s=r.b,c=e[s],u=c>>1&3;r.l=c&1;var g=c>>3|e[s+1]<<5|e[s+2]<<13,y=(s+=3)+g;if(u==1)return s>=e.length?void 0:(r.b=s+1,a?(Ie(a,e[s],r.y,r.y+=g),a):Ie(new G(g),e[s]));if(!(y>e.length)){if(u==0)return r.b=y,a?(a.set(e.subarray(s,y),r.y),r.y+=g,a):mt(e,s,y);if(u==2){var m=e[s],b=m&3,T=m>>2&3,k=m>>4,U=0,N=0;b<2?T&1?k|=e[++s]<<4|(T&2&&e[++s]<<12):k=m>>3:(N=T,T<2?(k|=(e[++s]&63)<<4,U=e[s]>>6|e[++s]<<2):T==2?(k|=e[++s]<<4|(e[++s]&3)<<12,U=e[s]>>2|e[++s]<<6):(k|=e[++s]<<4|(e[++s]&63)<<12,U=e[s]>>6|e[++s]<<2|e[++s]<<10)),++s;var w=a?a.subarray(r.y,r.y+r.m):new G(r.m),E=w.length-k;if(b==0)w.set(e.subarray(s,s+=k),E);else if(b==1)Ie(w,e[s++],E);else{var I=r.h;if(b==2){var J=la(e,s);U+=s-(s=J[0]),r.h=I=J[1]}else I||A(0);(N?wa:Pe)(e.subarray(s,s+=U),w.subarray(E),I)}var L=e[s++];if(L){L==255?L=(e[s++]|e[s++]<<8)+32512:L>127&&(L=L-128<<8|e[s++]);var z=e[s++];z&3&&A(0);for(var P=[da,fa,ua],C=2;C>-1;--C){var _=z>>(C<<1)+2&3;if(_==1){var R=new G([0,0,e[s++]]);P[C]={s:R.subarray(2,3),n:R.subarray(0,1),t:new tt(R.buffer,0,1),b:0}}else _==2?(o=Oe(e,s,9-(C&1)),s=o[0],P[C]=o[1]):_==3&&(r.t||A(0),P[C]=r.t[C])}var F=r.t=P,X=F[0],j=F[1],V=F[2],B=e[y-1];B||A(0);var H=(y<<3)-8+Ce(B)-V.b,v=H>>3,x=0,M=(e[v]|e[v+1]<<8)>>(H&7)&(1<>3;var Q=(e[v]|e[v+1]<<8)>>(H&7)&(1<>3;var O=(e[v]|e[v+1]<<8)>>(H&7)&(1<>3;var ve=1<>>(H&7)&ve-1);v=(H-=Et[xe])>>3;var oe=ha[xe]+((e[v]|e[v+1]<<8|e[v+2]<<16)>>(H&7)&(1<>3;var we=pa[he]+((e[v]|e[v+1]<<8|e[v+2]<<16)>>(H&7)&(1<>3,M=V.t[M]+((e[v]|e[v+1]<<8)>>(H&7)&(1<>3,O=X.t[O]+((e[v]|e[v+1]<<8)>>(H&7)&(1<>3,Q=j.t[Q]+((e[v]|e[v+1]<<8)>>(H&7)&(1<3)r.o[2]=r.o[1],r.o[1]=r.o[0],r.o[0]=ne-=3;else{var $e=ne-(we!=0);$e?(ne=$e==3?r.o[0]-1:r.o[$e],$e>1&&(r.o[2]=r.o[1]),r.o[1]=r.o[0],r.o[0]=ne):ne=r.o[0]}for(var C=0;Coe&&(ae=oe);for(var C=0;C{throw t},o,s=console.log.bind(console),c=console.error.bind(console),u,g=!1,y,m=n=>n.startsWith("file://"),b=!1;function T(){return je.buffer}function k(){if(!R?.buffer?.resizable){var n=T();R=new Int8Array(n),ze=new Int16Array(n),r.HEAPU8=M=new Uint8Array(n),Ne=new Uint16Array(n),Be=new Int32Array(n),O=new Uint32Array(n),It=new Float32Array(n),Jt=new Float64Array(n),Tt=new BigInt64Array(n),Nt=new BigUint64Array(n)}}function U(){b=!0,qe.A()}function N(n){n=`Aborted(${n})`,c(n),g=!0,n+=". Build with -sASSERTIONS for more info.",b&&Bt();var t=new WebAssembly.RuntimeError(n);throw t}var w;let E=()=>"";function I(n){if(n==w&&u)return new Uint8Array(u);throw"both async and sync fetching of the wasm failed"}async function J(n){if(!u)try{var t=await o(n);return new Uint8Array(t)}catch{}return I(n)}async function L(n,t){try{var i=await J(n),l=await WebAssembly.instantiate(i,t);return l}catch(d){c(`failed to asynchronously prepare wasm: ${d}`),N(d)}}async function z(n,t,i){if(!n&&!m(t))try{var l=fetch(t,{credentials:"same-origin"}),d=await WebAssembly.instantiateStreaming(l,i);return d}catch(f){c(`wasm streaming compile failed: ${f}`),c("falling back to ArrayBuffer instantiation")}return L(t,i)}function P(){var n={a:Qn};return n}async function C(){function n(f){return qe=f.exports,_n(qe),k(),qe}function t(f){return n(f.instance)}var i=P();w??=E();var l=await z(u,w,i),d=t(l);return d}class _{name="ExitStatus";constructor(t){this.message=`Program terminated with exit(${t})`,this.status=t}}var R,F=()=>Wt,X=n=>{var t=n.getArg(F(),0);return Gt(t)},j=()=>Zt(),V=n=>Vt(n),B=n=>Yt(n),H=globalThis.TextDecoder&&new TextDecoder,v=(n,t,i,l)=>{var d=t+i;if(l)return d;for(;n[t]&&!(t>=d);)++t;return t},x=(n,t=0,i,l)=>{var d=v(n,t,i,l);if(d-t>16&&n.buffer&&H)return H.decode(n.subarray(t,d));for(var f="";t>10,56320|S&1023)}}return f},M,Q=(n,t,i)=>n?x(M,n,t,i):"",O,he=n=>{var t=j(),i=B(4),l=B(4);jt(n,i,l);var d=O[i>>2],f=O[l>>2],p=Q(d);pe(d);var h;return f&&(h=Q(f),pe(f)),V(t),[p,h]},ue=n=>{var t=X(n);return he(t)},xe=n=>{var t=new WebAssembly.Exception(F(),[n],{traceStack:!0});throw t.message=ue(t),t},Xe=()=>N(""),be={},Me=n=>{for(;n.length;){var t=n.pop(),i=n.pop();i(t)}};function ve(n){return this.fromWireType(O[n>>2])}var ne={},oe={},we={};class $e extends Error{constructor(t){super(t),this.name="InternalError"}}var de=n=>{throw new $e(n)},ae=(n,t,i)=>{n.forEach(h=>we[h]=t);function l(h){var $=i(h);$.length!==n.length&&de("Mismatched type converter count");for(var S=0;S{d[h]=oe[$],++p,p===f.length&&l(d)}));f.length===0&&l(d)},st=n=>{var t=be[n];delete be[n];var i=t.rawConstructor,l=t.rawDestructor,d=t.fields,f=d.map(p=>p.getterReturnType).concat(d.map(p=>p.setterArgumentType));ae([n],f,p=>{var h={};for(var[$,S]of d.entries()){let q=p[$],Y=S.getter,D=S.getterContext,Z=p[$+d.length],ee=S.setter,se=S.setterContext;h[S.fieldName]={read:te=>q.fromWireType(Y(D,te)),write:(te,W)=>{var ye=[];ee(se,te,Z.toWireType(ye,W)),Me(ye)},optional:q.optional}}return[{name:t.name,fromWireType:q=>{var Y={};for(var D in h)Y[D]=h[D].read(q);return l(q),Y},toWireType:(q,Y)=>{for(var D in h)if(!(D in Y)&&!h[D].optional)throw new TypeError(`Missing field: "${D}"`);var Z=i();for(D in h)h[D].write(Z,Y[D]);return q!==null&&q.push(l,Z),Z},readValueFromPointer:ve,destructorFunction:l}]})},re=n=>{for(var t="";;){var i=M[n++];if(!i)return t;t+=String.fromCharCode(i)}};class Te extends Error{constructor(t){super(t),this.name="BindingError"}}var K=n=>{throw new Te(n)};function xr(n,t,i={}){var l=t.name;if(n||K(`type "${l}" must have a positive integer typeid pointer`),oe.hasOwnProperty(n)){if(i.ignoreDuplicateRegistrations)return;K(`Cannot register type '${l}' twice`)}if(oe[n]=t,delete we[n],ne.hasOwnProperty(n)){var d=ne[n];delete ne[n],d.forEach(f=>f())}}function fe(n,t,i={}){return xr(n,t,i)}var ze,Ne,Be,Tt,Nt,St=(n,t,i)=>{switch(t){case 1:return i?l=>R[l]:l=>M[l];case 2:return i?l=>ze[l>>1]:l=>Ne[l>>1];case 4:return i?l=>Be[l>>2]:l=>O[l>>2];case 8:return i?l=>Tt[l>>3]:l=>Nt[l>>3];default:throw new TypeError(`invalid integer width (${t}): ${n}`)}},Mr=(n,t,i,l,d)=>{t=re(t);let f=l===0n,p=h=>h;if(f){let h=i*8;p=$=>BigInt.asUintN(h,$),d=p(d)}fe(n,{name:t,fromWireType:p,toWireType:(h,$)=>(typeof $=="number"&&($=BigInt($)),$),readValueFromPointer:St(t,i,!f),destructorFunction:null})},Tr=(n,t,i,l)=>{t=re(t),fe(n,{name:t,fromWireType:function(d){return!!d},toWireType:function(d,f){return f?i:l},readValueFromPointer:function(d){return this.fromWireType(M[d])},destructorFunction:null})},Nr=n=>({count:n.count,deleteScheduled:n.deleteScheduled,preservePointerOnDelete:n.preservePointerOnDelete,ptr:n.ptr,ptrType:n.ptrType,smartPtr:n.smartPtr,smartPtrType:n.smartPtrType}),it=n=>{function t(i){return i.$$.ptrType.registeredClass.name}K(t(n)+" instance already deleted")},ot=!1,Ht=n=>{},Sr=n=>{n.smartPtr?n.smartPtrType.rawDestructor(n.smartPtr):n.ptrType.registeredClass.rawDestructor(n.ptr)},qt=n=>{n.count.value-=1;var t=n.count.value===0;t&&Sr(n)},Se=n=>globalThis.FinalizationRegistry?(ot=new FinalizationRegistry(t=>{qt(t.$$)}),Se=t=>{var i=t.$$,l=!!i.smartPtr;if(l){var d={$$:i};ot.register(t,d,t)}return t},Ht=t=>ot.unregister(t),Se(n)):(Se=t=>t,n),Hr=()=>{let n=Ve.prototype;Object.assign(n,{isAliasOf(i){if(!(this instanceof Ve)||!(i instanceof Ve))return!1;var l=this.$$.ptrType.registeredClass,d=this.$$.ptr;i.$$=i.$$;for(var f=i.$$.ptrType.registeredClass,p=i.$$.ptr;l.baseClass;)d=l.upcast(d),l=l.baseClass;for(;f.baseClass;)p=f.upcast(p),f=f.baseClass;return l===f&&d===p},clone(){if(this.$$.ptr||it(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var i=Se(Object.create(Object.getPrototypeOf(this),{$$:{value:Nr(this.$$)}}));return i.$$.count.value+=1,i.$$.deleteScheduled=!1,i},delete(){this.$$.ptr||it(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&K("Object already scheduled for deletion"),Ht(this),qt(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||it(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&K("Object already scheduled for deletion"),this.$$.deleteScheduled=!0,this}});let t=Symbol.dispose;t&&(n[t]=n.delete)};function Ve(){}var Lt=(n,t)=>Object.defineProperty(t,"name",{value:n}),Ft={},ct=(n,t,i)=>{if(n[t].overloadTable===void 0){var l=n[t];n[t]=function(...d){return n[t].overloadTable.hasOwnProperty(d.length)||K(`Function '${i}' called with an invalid number of arguments (${d.length}) - expects one of (${n[t].overloadTable})!`),n[t].overloadTable[d.length].apply(this,d)},n[t].overloadTable=[],n[t].overloadTable[l.argCount]=l}},qr=(n,t,i)=>{r.hasOwnProperty(n)?(K(`Cannot register public name '${n}' twice`),ct(r,n,n),r[n].overloadTable.hasOwnProperty(i)&&K(`Cannot register multiple overloads of a function with the same number of arguments (${i})!`),r[n].overloadTable[i]=t):(r[n]=t,r[n].argCount=i)},Lr=48,Fr=57,_r=n=>{n=n.replace(/[^a-zA-Z0-9_]/g,"$");var t=n.charCodeAt(0);return t>=Lr&&t<=Fr?`_${n}`:n};function Qr(n,t,i,l,d,f,p,h){this.name=n,this.constructor=t,this.instancePrototype=i,this.rawDestructor=l,this.baseClass=d,this.getActualType=f,this.upcast=p,this.downcast=h,this.pureVirtualFunctions=[]}var lt=(n,t,i)=>{for(;t!==i;)t.upcast||K(`Expected null or instance of ${i.name}, got an instance of ${t.name}`),n=t.upcast(n),t=t.baseClass;return n},ut=n=>{if(n===null)return"null";var t=typeof n;return t==="object"||t==="array"||t==="function"?n.toString():""+n};function Pr(n,t){if(t===null)return this.isReference&&K(`null is not a valid ${this.name}`),0;t.$$||K(`Cannot pass "${ut(t)}" as a ${this.name}`),t.$$.ptr||K(`Cannot pass deleted object as a pointer of type ${this.name}`);var i=t.$$.ptrType.registeredClass,l=lt(t.$$.ptr,i,this.registeredClass);return l}function Rr(n,t){var i;if(t===null)return this.isReference&&K(`null is not a valid ${this.name}`),this.isSmartPointer?(i=this.rawConstructor(),n!==null&&n.push(this.rawDestructor,i),i):0;(!t||!t.$$)&&K(`Cannot pass "${ut(t)}" as a ${this.name}`),t.$$.ptr||K(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&t.$$.ptrType.isConst&&K(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);var l=t.$$.ptrType.registeredClass;if(i=lt(t.$$.ptr,l,this.registeredClass),this.isSmartPointer)switch(t.$$.smartPtr===void 0&&K("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:t.$$.smartPtrType===this?i=t.$$.smartPtr:K(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:i=t.$$.smartPtr;break;case 2:if(t.$$.smartPtrType===this)i=t.$$.smartPtr;else{var d=t.clone();i=this.rawShare(i,pt.toHandle(()=>d.delete())),n!==null&&n.push(this.rawDestructor,i)}break;default:K("Unsupported sharing policy")}return i}function Ir(n,t){if(t===null)return this.isReference&&K(`null is not a valid ${this.name}`),0;t.$$||K(`Cannot pass "${ut(t)}" as a ${this.name}`),t.$$.ptr||K(`Cannot pass deleted object as a pointer of type ${this.name}`),t.$$.ptrType.isConst&&K(`Cannot convert argument of type ${t.$$.ptrType.name} to parameter type ${this.name}`);var i=t.$$.ptrType.registeredClass,l=lt(t.$$.ptr,i,this.registeredClass);return l}var _t=(n,t,i)=>{if(t===i)return n;if(i.baseClass===void 0)return null;var l=_t(n,t,i.baseClass);return l===null?null:i.downcast(l)},Jr={},Or=(n,t)=>{for(t===void 0&&K("ptr should not be undefined");n.baseClass;)t=n.upcast(t),n=n.baseClass;return t},Kr=(n,t)=>(t=Or(n,t),Jr[t]),Ye=(n,t)=>{(!t.ptrType||!t.ptr)&&de("makeClassHandle requires ptr and ptrType");var i=!!t.smartPtrType,l=!!t.smartPtr;return i!==l&&de("Both smartPtrType and smartPtr must be specified"),t.count={value:1},Se(Object.create(n,{$$:{value:t,writable:!0}}))};function Dr(n){var t=this.getPointee(n);if(!t)return this.destructor(n),null;var i=Kr(this.registeredClass,t);if(i!==void 0){if(i.$$.count.value===0)return i.$$.ptr=t,i.$$.smartPtr=n,i.clone();var l=i.clone();return this.destructor(n),l}function d(){return this.isSmartPointer?Ye(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:t,smartPtrType:this,smartPtr:n}):Ye(this.registeredClass.instancePrototype,{ptrType:this,ptr:n})}var f=this.registeredClass.getActualType(t),p=Ft[f];if(!p)return d.call(this);var h;this.isConst?h=p.constPointerType:h=p.pointerType;var $=_t(t,this.registeredClass,h.registeredClass);return $===null?d.call(this):this.isSmartPointer?Ye(h.registeredClass.instancePrototype,{ptrType:h,ptr:$,smartPtrType:this,smartPtr:n}):Ye(h.registeredClass.instancePrototype,{ptrType:h,ptr:$})}var Xr=()=>{Object.assign(Ze.prototype,{getPointee(n){return this.rawGetPointee&&(n=this.rawGetPointee(n)),n},destructor(n){this.rawDestructor?.(n)},readValueFromPointer:ve,fromWireType:Dr})};function Ze(n,t,i,l,d,f,p,h,$,S,q){this.name=n,this.registeredClass=t,this.isReference=i,this.isConst=l,this.isSmartPointer=d,this.pointeeType=f,this.sharingPolicy=p,this.rawGetPointee=h,this.rawConstructor=$,this.rawShare=S,this.rawDestructor=q,!d&&t.baseClass===void 0?l?(this.toWireType=Pr,this.destructorFunction=null):(this.toWireType=Ir,this.destructorFunction=null):this.toWireType=Rr}var zr=(n,t,i)=>{r.hasOwnProperty(n)||de("Replacing nonexistent public symbol"),r[n].overloadTable!==void 0&&i!==void 0?r[n].overloadTable[i]=t:(r[n]=t,r[n].argCount=i)},Br=n=>At.get(n),le=(n,t,i=!1)=>{n=re(n);function l(){var f=Br(t);return f}var d=l();return typeof d!="function"&&K(`unknown function pointer with signature ${n}: ${t}`),d};class Vr extends Error{}var Yr=n=>{var t=Xt(n),i=re(t);return pe(t),i},Ge=(n,t)=>{var i=[],l={};function d(f){if(!l[f]&&!oe[f]){if(we[f]){we[f].forEach(d);return}i.push(f),l[f]=!0}}throw t.forEach(d),new Vr(`${n}: `+i.map(Yr).join([", "]))},Zr=(n,t,i,l,d,f,p,h,$,S,q,Y,D)=>{q=re(q),f=le(d,f),h&&=le(p,h),S&&=le($,S),D=le(Y,D);var Z=_r(q);qr(Z,function(){Ge(`Cannot construct ${q} due to unbound types`,[l])}),ae([n,t,i],l?[l]:[],ee=>{ee=ee[0];var se,te;l?(se=ee.registeredClass,te=se.instancePrototype):te=Ve.prototype;var W=Lt(q,function(...gt){if(Object.getPrototypeOf(this)!==ye)throw new Te(`Use 'new' to construct ${q}`);if(ce.constructor_body===void 0)throw new Te(`${q} has no accessible constructor`);var er=ce.constructor_body[gt.length];if(er===void 0)throw new Te(`Tried to invoke ctor of ${q} with invalid number of parameters (${gt.length}) - expected (${Object.keys(ce.constructor_body).toString()}) parameters instead!`);return er.apply(this,gt)}),ye=Object.create(te,{constructor:{value:W}});W.prototype=ye;var ce=new Qr(q,W,ye,D,se,f,h,S);ce.baseClass&&(ce.baseClass.__derivedClasses??=[],ce.baseClass.__derivedClasses.push(ce));var wt=new Ze(q,ce,!0,!1,!1),ge=new Ze(q+"*",ce,!1,!1,!1),We=new Ze(q+" const*",ce,!1,!0,!1);return Ft[n]={pointerType:ge,constPointerType:We},zr(Z,W),[wt,ge,We]})};function Gr(n){for(var t=1;t{for(var i=[],l=0;l>2]);return i},Qt=n=>{n=n.trim();let t=n.indexOf("(");return t===-1?n:n.slice(0,t)},jr=(n,t,i,l,d,f,p,h,$)=>{var S=ft(i,l);t=re(t),t=Qt(t),f=le(d,f,h),ae([],[n],q=>{q=q[0];var Y=`${q.name}.${t}`;function D(){Ge(`Cannot call ${Y} due to unbound types`,S)}t.startsWith("@@")&&(t=Symbol[t.substring(2)]);var Z=q.registeredClass.constructor;return Z[t]===void 0?(D.argCount=i-1,Z[t]=D):(ct(Z,t,Y),Z[t].overloadTable[i-1]=D),ae([],S,ee=>{var se=[ee[0],null].concat(ee.slice(1)),te=dt(Y,se,null,f,p);if(Z[t].overloadTable===void 0?(te.argCount=i-1,Z[t]=te):Z[t].overloadTable[i-1]=te,q.registeredClass.__derivedClasses)for(let W of q.registeredClass.__derivedClasses)W.constructor.hasOwnProperty(t)||(W.constructor[t]=te);return[]}),[]})},Wr=(n,t,i,l,d,f)=>{var p=ft(t,i);d=le(l,d),ae([],[n],h=>{h=h[0];var $=`constructor ${h.name}`;if(h.registeredClass.constructor_body===void 0&&(h.registeredClass.constructor_body=[]),h.registeredClass.constructor_body[t-1]!==void 0)throw new Te(`Cannot register multiple constructors with identical number of parameters (${t-1}) for class '${h.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return h.registeredClass.constructor_body[t-1]=()=>{Ge(`Cannot construct ${h.name} due to unbound types`,p)},ae([],p,S=>(S.splice(1,0,null),h.registeredClass.constructor_body[t-1]=dt($,S,null,d,f),[])),[]})},Ar=(n,t,i,l,d,f,p,h,$,S)=>{var q=ft(i,l);t=re(t),t=Qt(t),f=le(d,f,$),ae([],[n],Y=>{Y=Y[0];var D=`${Y.name}.${t}`;t.startsWith("@@")&&(t=Symbol[t.substring(2)]),h&&Y.registeredClass.pureVirtualFunctions.push(t);function Z(){Ge(`Cannot call ${D} due to unbound types`,q)}var ee=Y.registeredClass.instancePrototype,se=ee[t];return se===void 0||se.overloadTable===void 0&&se.className!==Y.name&&se.argCount===i-2?(Z.argCount=i-2,Z.className=Y.name,ee[t]=Z):(ct(ee,t,D),ee[t].overloadTable[i-2]=Z),ae([],q,te=>{var W=dt(D,te,Y,f,p);return ee[t].overloadTable===void 0?(W.argCount=i-2,ee[t]=W):ee[t].overloadTable[i-2]=W,[]}),[]})},Pt=[],ke=[0,1,,1,null,1,!0,1,!1,1],Rt=[],en=n=>{if(n>9&&--ke[n+1]===0){var t=ke[n];ke[n]=void 0;var i=Rt[n];i&&(Rt[n]=void 0,i(t)),Pt.push(n)}},pt={toValue:n=>(n||K(`Cannot use deleted val. handle = ${n}`),ke[n]),toHandle:n=>{switch(n){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:{let t=Pt.pop()||ke.length;return ke[t]=n,ke[t+1]=1,t}}}},tn={name:"emscripten::val",fromWireType:n=>{var t=pt.toValue(n);return en(n),t},toWireType:(n,t)=>pt.toHandle(t),readValueFromPointer:ve,destructorFunction:null},rn=n=>fe(n,tn),It,Jt,nn=(n,t)=>{switch(t){case 4:return function(i){return this.fromWireType(It[i>>2])};case 8:return function(i){return this.fromWireType(Jt[i>>3])};default:throw new TypeError(`invalid float width (${t}): ${n}`)}},an=(n,t,i)=>{t=re(t),fe(n,{name:t,fromWireType:l=>l,toWireType:(l,d)=>d,readValueFromPointer:nn(t,i),destructorFunction:null})},sn=(n,t,i,l,d)=>{t=re(t);let f=l===0,p=$=>$;if(f){var h=32-8*i;p=$=>$<>>h,d=p(d)}fe(n,{name:t,fromWireType:p,toWireType:($,S)=>S,readValueFromPointer:St(t,i,l!==0),destructorFunction:null})},on=(n,t,i)=>{var l=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array],d=l[t];function f(p){var h=O[p>>2],$=O[p+4>>2];return new d(R.buffer,$,h)}i=re(i),fe(n,{name:i,fromWireType:f,readValueFromPointer:f},{ignoreDuplicateRegistrations:!0})},cn=(n,t,i,l)=>{if(!(l>0))return 0;for(var d=i,f=i+l-1,p=0;p=f)break;t[i++]=h}else if(h<=2047){if(i+1>=f)break;t[i++]=192|h>>6,t[i++]=128|h&63}else if(h<=65535){if(i+2>=f)break;t[i++]=224|h>>12,t[i++]=128|h>>6&63,t[i++]=128|h&63}else{if(i+3>=f)break;t[i++]=240|h>>18,t[i++]=128|h>>12&63,t[i++]=128|h>>6&63,t[i++]=128|h&63,p++}}return t[i]=0,i-d},Ot=(n,t,i)=>cn(n,M,t,i),Kt=n=>{for(var t=0,i=0;i=55296&&l<=57343?(t+=4,++i):t+=3}return t},ln=(n,t)=>{t=re(t),fe(n,{name:t,fromWireType(i){var l=O[i>>2],d=i+4,f;return f=Q(d,l,!0),pe(i),f},toWireType(i,l){l instanceof ArrayBuffer&&(l=new Uint8Array(l));var d,f=typeof l=="string";f||ArrayBuffer.isView(l)&&l.BYTES_PER_ELEMENT==1||K("Cannot pass non-string to std::string"),f?d=Kt(l):d=l.length;var p=ht(4+d+1),h=p+4;return O[p>>2]=d,f?Ot(l,h,d+1):M.set(l,h),i!==null&&i.push(pe,p),p},readValueFromPointer:ve,destructorFunction(i){pe(i)}})},Dt=globalThis.TextDecoder?new TextDecoder("utf-16le"):void 0,un=(n,t,i)=>{var l=n>>1,d=v(Ne,l,t/2,i);if(d-l>16&&Dt)return Dt.decode(Ne.subarray(l,d));for(var f="",p=l;p{if(i<2)return 0;i-=2;for(var l=t,d=i>1]=p,t+=2}return ze[t>>1]=0,t-l},fn=n=>n.length*2,pn=(n,t,i)=>{for(var l="",d=n>>2,f=0;!(f>=t/4);f++){var p=O[d+f];if(!p&&!i)break;l+=String.fromCodePoint(p)}return l},hn=(n,t,i=2147483647)=>{if(i<4)return 0;for(var l=t,d=l+i-4,f=0;f65535&&f++,Be[t>>2]=p,t+=4,t+4>d)break}return Be[t>>2]=0,t-l},wn=n=>{for(var t=0,i=0;i65535&&i++,t+=4}return t},gn=(n,t,i)=>{i=re(i);var l,d,f;t===2?(l=un,d=dn,f=fn):(l=pn,d=hn,f=wn),fe(n,{name:i,fromWireType:p=>{var h=O[p>>2],$=l(p+4,h*t,!0);return pe(p),$},toWireType:(p,h)=>{typeof h!="string"&&K(`Cannot pass non-string to C++ string type ${i}`);var $=f(h),S=ht(4+$+t);return O[S>>2]=$/t,d(h,S+4,$+t),p!==null&&p.push(pe,S),S},readValueFromPointer:ve,destructorFunction(p){pe(p)}})},mn=(n,t,i,l,d,f)=>{be[n]={name:re(t),rawConstructor:le(i,l),rawDestructor:le(d,f),fields:[]}},vn=(n,t,i,l,d,f,p,h,$,S)=>{be[n].fields.push({fieldName:re(t),getterReturnType:i,getter:le(l,d),getterContext:f,setterArgumentType:p,setter:le(h,$),setterContext:S})},yn=(n,t)=>{t=re(t),fe(n,{isVoid:!0,name:t,fromWireType:()=>{},toWireType:(i,l)=>{}})},bn=()=>{},He={},kn=n=>{if(n instanceof _||n=="unwind")return y;a(1,n)},En=n=>{y=n,a(n,new _(n))},Cn=n=>{if(!g)try{return n()}catch(t){kn(t)}},$n=()=>performance.now(),Un=(n,t)=>{if(He[n]&&(clearTimeout(He[n].id),delete He[n]),!t)return 0;var i=setTimeout(()=>{delete He[n],Cn(()=>zt(n,$n()))},t);return He[n]={id:i,timeout_ms:t},0},xn=()=>2147483648,Mn=(n,t)=>Math.ceil(n/t)*t,Tn=n=>{var t=je.buffer.byteLength,i=(n-t+65535)/65536|0;try{return je.grow(i),k(),1}catch{}},Nn=n=>{var t=M.length;n>>>=0;var i=xn();if(n>i)return!1;for(var l=1;l<=4;l*=2){var d=t*(1+.2/l);d=Math.min(d,n+100663296);var f=Math.min(i,Mn(Math.max(n,d),65536)),p=Tn(f);if(p)return!0}return!1},Sn=n=>52;function Hn(n,t,i,l){return 70}var qn=[null,[],[]],Ln=(n,t)=>{var i=qn[n];!t||t===10?((n===1?s:c)(x(i)),i.length=0):i.push(t)},Fn=(n,t,i,l)=>{for(var d=0,f=0;f>2],h=O[t+4>>2];t+=8;for(var $=0;$>2]=d,0};Hr(),Xr(),r.wasmBinary&&(u=r.wasmBinary),r.UTF8ToString=Q,r.stringToUTF8=Ot,r.lengthBytesUTF8=Kt;var Xt,ht,pe,zt,Bt,Vt,Yt,Zt,Gt,jt,Wt,je,At;function _n(n){Xt=n.B,ht=r._malloc=n.C,pe=r._free=n.D,zt=n.F,Bt=n.G,Vt=n.H,Yt=n.I,Zt=n.J,Gt=n.K,jt=n.L,je=n.z,At=n.E,Wt=n.M}var Qn={t:xe,x:Xe,f:st,i:Mr,l:Tr,o:Zr,b:jr,n:Wr,d:Ar,y:rn,h:an,c:sn,a:on,k:ln,g:gn,j:mn,e:vn,m:yn,w:bn,p:Un,u:Nn,s:Sn,q:Hn,r:Fn,v:En};async function Pn(){!g&&U()}var qe;return qe=await C(),await Pn(),r}var ba=ya,ka=new Int8Array([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,90,63,64,65,66,-1,67,68,69,70,71,-1,72,73,52,53,54,55,56,57,58,59,60,61,74,75,76,77,78,79,80,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,81,-1,82,83,84,85,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,86,87,88,89,-1]);function Ea(e){let r=new Uint8Array(170930),a=0,o=0,s=0,c=-1;for(let u=0,g=e.length;u127)continue;let m=ka[y];if(!(m<0))if(c<0)c=m;else{c+=m*91,o|=c<88?13:14;do r[a++]=o,o>>>=8,s-=8;while(s>7);c=-1}}return c>=0&&(r[a++]=(o|c<""})}function Ua(){Ct=void 0}var xa=class{_module;constructor(e){this._module=e}malloc(e){let r=this._module._malloc(e);return{ptr:r,size:e,dispose:()=>this.free({ptr:r,size:e,dispose:()=>{}})}}free(e){this._module._free(e.ptr)}dataToHeap(e){let r=this.malloc(e.byteLength);return this._module.HEAPU8.set(e,r.ptr),r}heapView(e){return this._module.HEAPU8.subarray(e.ptr,e.ptr+e.size)}heapToUint8Array(e){return new Uint8Array([...this.heapView(e)])}lengthBytes(e){return this._module.lengthBytesUTF8(e)}stringToHeap(e){let r=this.lengthBytes(e)+1,a=this._module._malloc(r);return this._module.stringToUTF8(e,a,r),{ptr:a,size:r,dispose:()=>this.free({ptr:a,size:r,dispose:()=>{}})}}heapToString(e){return this._module.UTF8ToString(e.ptr,e.size)}hasFilesystem(){let e=this._module;return e.FS_createPath!==void 0&&e.FS_createDataFile!==void 0&&e.FS_preloadFile!==void 0&&e.FS_unlink!==void 0}createPath(e,r=!0,a=!0){return this._module.FS_createPath("/",e,r,a)}createDataFile(e,r,a=!0,o=!0,s=!0){return this._module.FS_createDataFile("/",e,r,a,o,s)}preloadFile(e,r,a=!0,o=!0,s=!1,c=!0,u=!1){return this._module.FS_preloadFile("/",e,r,a,o,s,c,u)}unlink(e){return this._module.FS_unlink(e)}},Le,Ma=4294967295;function Fe(e,r){if(!Number.isInteger(e)||e<0||e>Ma)throw new Error(`${r} length ${e} is outside the WASM32-safe range`)}function vt(e){if(e.length===0)return new Uint8Array(0);if(e.length===1)return e[0];let r=0;for(let s of e)r+=s.length;let a=new Uint8Array(r),o=0;for(let s of e)a.set(s,o),o+=s.length;return a}var Ta=class br{_mainModule;_zstdClass;_zstd;_compressionLevel;_decompressFrameCompleted=!1;_decompressRemaining=0;_decompressSawInput=!1;constructor(r){this._mainModule=new xa(r),this._zstdClass=r.zstd,this._zstd=new this._zstdClass,this._compressionLevel=this._zstdClass.defaultCLevel()}static load(){return Le||(Le=$a().then(r=>new br(r))),Le}static unload(){Ua(),Le?.then(r=>{r?._zstd?.delete()}),Le=void 0}copyHeap(r){return this._mainModule.heapView(r).slice()}mallocChecked(r,a){Fe(r,a);let o=this._mainModule.malloc(r);if(!o.ptr)throw this._mainModule.free(o),new Error(`Failed to allocate ${r} bytes for ${a}`);return o}throwStreamError(r,a){throw new Error(`${r} failed: ${a.errorName||"unknown error"}`)}ensureStreamOk(r,a){a.error&&this.throwStreamError(r,a)}version(){return this._zstdClass.version()}reset(){let r=this._zstd.reset();this.ensureStreamOk("reset",r),this._decompressFrameCompleted=!1,this._decompressRemaining=0,this._decompressSawInput=!1}resetCompression(r){r!==void 0&&(this._compressionLevel=r);let a=this._zstd.resetCompression(this._compressionLevel);this.ensureStreamOk("resetCompression",a)}resetDecompression(){let r=this._zstd.resetDecompression();this.ensureStreamOk("resetDecompression",r),this._decompressFrameCompleted=!1,this._decompressRemaining=0,this._decompressSawInput=!1}setCompressionLevel(r){let a=this._zstd.setCompressionLevel(r);this.ensureStreamOk("setCompressionLevel",a),this._compressionLevel=r}compress(r,a=this.defaultCLevel()){Fe(r.length,"compress input");let o=this._mainModule.dataToHeap(r);try{if(!o.ptr&&r.length>0)throw new Error("Failed to allocate compress input buffer");let s=this._zstdClass.compressBound(r.length),c=this.mallocChecked(s,"compress output");try{if(c.size=this._zstdClass.compress(c.ptr,s,o.ptr,o.size,a),this._zstdClass.isError(c.size))throw new Error(`compress failed: ${this._zstdClass.getErrorName(c.size)}`);return this.copyHeap(c)}finally{this._mainModule.free(c)}}finally{this._mainModule.free(o)}}compressChunk(r){if(Fe(r.length,"compressChunk input"),r.length===0)return new Uint8Array(0);let a=this._mainModule.dataToHeap(r);try{if(!a.ptr)throw new Error("Failed to allocate compressChunk input buffer");let o=this._zstdClass.CStreamOutSize(),s=[],c=0;for(;c0&&(u.size=g.produced,s.push(this.copyHeap(u)))}finally{this._mainModule.free(u)}}return vt(s)}finally{this._mainModule.free(a)}}compressEnd(){let r=this._zstdClass.CStreamOutSize(),a=[],o=1;for(;o!==0;){let s=this.mallocChecked(r,"compressEnd output");try{let c=this._zstd.compressEnd(s.ptr,r);if(this.ensureStreamOk("compressEnd",c),c.produced===0&&c.remaining!==0)throw new Error("compressEnd failed: no progress while finishing stream");o=c.remaining,c.produced>0&&(s.size=c.produced,a.push(this.copyHeap(s)))}finally{this._mainModule.free(s)}}return vt(a)}frameContentSize(r){return this._zstdClass.getFrameContentSize(r.ptr,r.size)}decompress(r){Fe(r.length,"decompress input");let a=this._mainModule.dataToHeap(r);try{if(!a.ptr&&r.length>0)throw new Error("Failed to allocate decompress input buffer");let o=this.frameContentSize(a);if(o.error)throw new Error(`Failed to get frame content size: ${o.errorName}`);let s=o.known;if(s){let c=this._zstdClass.findFrameCompressedSize(a.ptr,a.size);if(this._zstdClass.isError(c))throw new Error(`Failed to find frame compressed size: ${this._zstdClass.getErrorName(c)}`);c0?a.ptr+c:0,b=this._zstd.decompressChunk(g.ptr,o,m,y);if(this.ensureStreamOk("decompressChunk",b),b.consumed===0&&b.produced===0){if(y===0){b.remaining>0&&(this._decompressRemaining=b.remaining);break}throw new Error("decompressChunk failed: no progress while consuming input")}c+=b.consumed,u=b.produced===o&&b.remaining!==0,b.produced>0&&(g.size=b.produced,s.push(this.copyHeap(g))),b.remaining===0?(this._decompressFrameCompleted=!0,this._decompressRemaining=0):this._decompressRemaining=b.remaining}finally{this._mainModule.free(g)}}return vt(s)}finally{this._mainModule.free(a)}}decompressEnd(){if(!this._decompressSawInput)throw new Error("decompressEnd failed: empty compressed input is not a completed frame");if(!this._decompressFrameCompleted||this._decompressRemaining!==0)throw new Error("decompressEnd failed: truncated Zstandard input")}defaultCLevel(){return this._zstdClass.defaultCLevel()}minCLevel(){return this._zstdClass.minCLevel()}maxCLevel(){return this._zstdClass.maxCLevel()}};let yt=null;function Na(){return yt||(yt=Ta.load()),yt}function Sa(e){return e.length>=4&&e[0]===40&&e[1]===181&&e[2]===47&&e[3]===253}function $t(e){const r="SQLite format 3\0";if(e.length/g,">").replace(/"/g,""").replace(/'/g,"'")}function or(e,r,a){const o=e.tagsList[0]??"",s=e.tagsList.length>1?` +${e.tagsList.length-1}`:"",c=Ee(e.tagsList.join(", ")),u=o?`${Ee(o)}${s}`:"",g=e.more.size>0?'':"";return`
`+(a?kr(e,r):"")+"
"}function kr(e,r){const a=[...e.more.entries()].map(([o,s])=>{const c=r.get(o);return`
${c?Ee(c.name):`Поле #${o}`}
${Ee(s)}
`}).join("");return a?`
${a}
`:""}function qa(e,r){e.innerHTML=`

📚 Слова

База ещё не проверена.
`;const a=e.querySelector("#home-db-banner"),o=e.querySelector("#home-db-text"),s=e.querySelector("#home-db-go"),c=e.querySelector("#words-search"),u=e.querySelector("#words-group"),g=e.querySelector("#words-count"),y=e.querySelector("#words-status"),m=e.querySelector("#words-list"),b=e.querySelector("#words-more");function T(v,x){a.hidden=!1,o.textContent=v,s.hidden=!1}function k(){a.hidden=!0}s.addEventListener("click",()=>{document.querySelector('.drawer-btn[data-page="sync"]')?.click()});let U=!1,N=new Map,w=0,E=[],I=null,J=0,L=!1,z=0,P=0;function C(){const v=u.value;if(v==="")return{search:c.value.trim(),groupId:null};const x=Number(v);return{search:c.value.trim(),groupId:Number.isFinite(x)?x:null}}function _(){b.hidden=!(U&&E.lengthor(v,N,v.id===I)).join(""),g.textContent=w>0?`Показано ${E.length} из ${w}`:"",_()}function F(v){if(I===v){v!=null&&X(v),I=null;return}I!=null&&X(I),I=v,v!=null&&j(v)}function X(v){const x=m.querySelector(`.word-row-wrap[data-word-id="${v}"]`);if(!x)return;const M=x.querySelector(".word-row"),Q=x.querySelector(".word-extra");M&&(M.classList.remove("open"),M.setAttribute("aria-expanded","false")),Q&&(Q.hidden=!0,Q.innerHTML="")}function j(v){const x=E.find(he=>he.id===v),M=m.querySelector(`.word-row-wrap[data-word-id="${v}"]`);if(!x||!M)return;const Q=M.querySelector(".word-row"),O=M.querySelector(".word-extra");Q&&(Q.classList.add("open"),Q.setAttribute("aria-expanded","true")),O&&(O.hidden=!1,O.innerHTML=kr(x,N))}function V(v){y.textContent=v,y.hidden=v===""}async function B(){if(!U||L)return;L=!0;const v=++z,x=C();b.disabled=!0,E.length===0&&V("Загрузка слов…");try{const[M,Q]=await Promise.all([Xn({search:x.search,groupId:x.groupId??void 0}),tr({search:x.search,groupId:x.groupId??void 0,limit:ir,offset:0})]);if(v!==z)return;w=M,E=Q,J=Q.length,I!=null&&!E.some(O=>O.id===I)&&(I=null),R(),V(Q.length===0?"По этому запросу слов нет.":""),Q.length===0&&w===0&&(g.textContent="Слов в базе пока нет.")}catch(M){if(v!==z)return;V(`Не удалось загрузить слова: ${M instanceof Error?M.message:String(M)}`)}finally{v===z&&(L=!1,b.disabled=!1,_())}}async function H(){if(!U||L||E.length>=w)return;L=!0;const v=++z,x=C();b.disabled=!0,b.textContent="Загрузка…";try{const M=await tr({search:x.search,groupId:x.groupId??void 0,limit:ir,offset:J});if(v!==z)return;E=E.concat(M),J+=M.length,m.insertAdjacentHTML("beforeend",M.map(Q=>or(Q,N,Q.id===I)).join("")),g.textContent=`Показано ${E.length} из ${w}`,_()}catch(M){if(v!==z)return;V(`Не удалось догрузить: ${M instanceof Error?M.message:String(M)}`)}finally{v===z&&(L=!1,b.disabled=!1,_())}}c.addEventListener("input",()=>{window.clearTimeout(P),P=window.setTimeout(()=>{B()},300)}),c.addEventListener("keydown",v=>{v.key==="Enter"&&(window.clearTimeout(P),B())}),u.addEventListener("change",()=>{B()}),b.addEventListener("click",()=>{H()}),m.addEventListener("click",v=>{const x=v.target.closest(".word-row");if(!x||x.disabled)return;const M=Number(x.dataset.wordId);Number.isFinite(M)&&F(I===M?null:M)}),(async()=>{if(!await Je()){T("Локальной базы нет — скачай сохранение."),V("Нет локальной базы — скачай сохранение на странице «Синхронизация»."),g.textContent="";return}try{const x=await ra();if(!$t(x)){T("Файл в OPFS не похож на SQLite — перекачай сохранение.",!0),V("Файл в OPFS не похож на SQLite — перекачай сохранение.");return}k();try{const[Q,O]=await Promise.all([zn(),vr()]),he=Q;N=new Map(O.map(ue=>[ue.id,ue])),u.innerHTML=''+he.map(ue=>``).join(""),U=!0,await B(),u.options[0].textContent=`Все группы (${w})`}catch(Q){V(`БД есть, но слова не прочитались: ${Q instanceof Error?Q.message:String(Q)}`)}}catch(x){T(`Не удалось прочитать базу: ${x instanceof Error?x.message:String(x)}`)}})()}function cr(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function La(e){const r=e%10,a=e%100;return r===1&&a!==11?"запись":r>=2&&r<=4&&(a<12||a>14)?"записи":"записей"}function Fa(e,r){const a=cr(e.name)||`Колода #${e.id}`;return`
`}function _a(e,r){e.innerHTML=`

🗂️ Колоды

Проверка локальной базы…
`;const a=e.querySelector("#decks-count"),o=e.querySelector("#decks-status"),s=e.querySelector("#decks-list");function c(u){o.textContent=u,o.hidden=u===""}s.addEventListener("click",u=>{const g=u.target.closest("[data-act]");if(!g)return;const y=Number(g.dataset.deckId);Number.isFinite(y)&&(g.dataset.act==="review"?r.goReview(y):r.goDeck(y))}),(async()=>{if(!await Je()){c("Нет локальной базы — скачай сохранение на странице «Синхронизация»."),a.textContent="";return}c("Загрузка колод…");try{const[g,y]=await Promise.all([Bn(),Yn()]);if(g.length===0){a.textContent="Колоды пока отсутствуют.",c(""),s.innerHTML="";return}a.textContent=`Всего: ${g.length}`,c(""),s.innerHTML=g.map(m=>Fa(m,y.get(m.id)??0)).join("")}catch(g){c(`Не удалось загрузить колоды: ${g instanceof Error?g.message:String(g)}`)}})()}function Qa(e){return e?Pa(e):'—'}function Pa(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function bt(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}function Ra(e){const r=e%10,a=e%100;return r===1&&a!==11?"слово":r>=2&&r<=4&&(a<12||a>14)?"слова":"слов"}function Ia(e,r,a){e.innerHTML=`

Колода…

Загрузка колоды…
`;const o=e.querySelector("#deck-back"),s=e.querySelector("#deck-title"),c=e.querySelector("#deck-status"),u=e.querySelector("#deck-body");o.addEventListener("click",()=>a.goDecks()),(async()=>{if(!await Je()){s.textContent="Колода недоступна",c.textContent="Нет локальной базы — скачай сохранение на странице «Синхронизация».";return}let y=null;try{y=await nt(r)}catch(C){s.textContent="Колода недоступна",c.textContent=`Не удалось загрузить колоду: ${C instanceof Error?C.message:String(C)}`;return}if(!y){s.textContent="Колода не найдена",c.textContent=`Колоды с id=${r} нет в локальной базе. Возможно, база обновилась — вернись к списку.`;return}const m=y;s.textContent=m.name||`Колода #${m.id}`,c.hidden=!0;let b=null;try{b=await Zn(m.id)}catch(C){c.hidden=!1,c.textContent=`Данные колоды загружены, а количество слов — нет: ${C instanceof Error?C.message:String(C)}`}u.innerHTML=`
id
${m.id}
name
${Qa(m.name)}

📚 ${b==null?"Количество слов неизвестно":`${b} ${Ra(b)}`}

`;const T=u.querySelector("#deck-form"),k=u.querySelector("#deck-forward"),U=u.querySelector("#deck-backward"),N=u.querySelector("#deck-filter"),w=u.querySelector("#deck-save"),E=u.querySelector("#deck-form-status"),I=u.querySelector("#deck-review"),J=u.querySelector("#deck-history");I.addEventListener("click",()=>a.goReview(m.id)),J.addEventListener("click",()=>a.goHistory(m.id));const L=()=>`${k.value} ${U.value} ${N.value}`;let z=L();function P(){w.disabled=L()===z||w.dataset.busy==="1"}for(const C of[k,U,N])C.addEventListener("input",P);P(),T.addEventListener("submit",C=>{C.preventDefault(),!w.disabled&&(w.dataset.busy="1",w.disabled=!0,w.textContent="Сохранение…",E.textContent="",(async()=>{try{const _=await Vn(m.id,{forward:k.value,backward:U.value,filter:N.value});if(!_){E.textContent="Колода пропала из базы — вернись к списку.";return}k.value=_.forward,U.value=_.backward,N.value=_.filter,z=L(),E.textContent="✅ Сохранено в локальную базу."}catch(_){E.textContent=`Не удалось сохранить: ${_ instanceof Error?_.message:String(_)}`}finally{delete w.dataset.busy,w.textContent="💾 Сохранить",P()}})())})})()}function _e(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const Ja=50,Oa=[{label:"Не получилось",cls:"grade-fail"},{label:"Тяжело",cls:"grade-hard"},{label:"Хорошо",cls:"grade-good"},{label:"Легко",cls:"grade-easy"}];function Ka(e){const r=Oa[e.answer]??{label:`Оценка ${e.answer}`,cls:""},a=e.wordKey?`${_e(e.wordKey)}`+(e.wordValue?` — ${_e(e.wordValue)}`:""):`Слово #${e.word_id} (удалено)`,o=e.before===e.after?`${e.before}`:`${e.before}→${e.after}`;return`
${a}
${_e(r.label)}${_e(On(e.timestamp))} · score ${_e(o)}
`}function Da(e,r,a){e.innerHTML=`

История…

Загрузка истории…
`;const o=e.querySelector("#hist-back"),s=e.querySelector("#hist-title"),c=e.querySelector("#hist-count"),u=e.querySelector("#hist-status"),g=e.querySelector("#hist-list"),y=e.querySelector("#hist-more");o.addEventListener("click",()=>a.goDeck(r));function m(w){u.textContent=w,u.hidden=w===""}let b=0,T=0,k=!1;function U(){const w=b-T;y.hidden=w<=0,w>0&&(y.textContent=`Показать ещё (${w} осталось)`)}async function N(){if(!(k||T>=b)){k=!0,y.disabled=!0,y.textContent="Загрузка…";try{const w=await ea(r,{limit:Ja,offset:T});T+=w.length,g.insertAdjacentHTML("beforeend",w.map(Ka).join("")),c.textContent=`Показано ${T} из ${b}`}catch(w){m(`Не удалось загрузить историю: ${w instanceof Error?w.message:String(w)}`)}finally{k=!1,y.disabled=!1,U()}}}y.addEventListener("click",()=>{N()}),(async()=>{if(!await Je()){s.textContent="История недоступна",m("Нет локальной базы — скачай сохранение на странице «Синхронизация».");return}try{const E=await nt(r);if(!E){s.textContent="Колода не найдена",m(`Колоды с id=${r} нет в локальной базе.`);return}if(s.textContent=`🕘 ${E.name||`Колода #${E.id}`}`,b=await An(E.id),b===0){c.textContent="Ответов пока нет — начни повторение.",m("");return}m(""),await N()}catch(E){s.textContent="История недоступна",m(`Не удалось загрузить историю: ${E instanceof Error?E.message:String(E)}`)}})()}function Xa(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const za=[{value:0,label:"😞 Не получилось",cls:"grade-fail"},{value:1,label:"😟 Тяжело",cls:"grade-hard"},{value:2,label:"🙂 Хорошо",cls:"grade-good"},{value:3,label:"🤩 Легко",cls:"grade-easy"}];function Ba(e,r,a){e.innerHTML=`

Повторение…

Загрузка карточек…
`;const o=e.querySelector("#review-back"),s=e.querySelector("#review-title"),c=e.querySelector("#review-progress"),u=e.querySelector("#review-status"),g=e.querySelector("#review-body");o.addEventListener("click",()=>a.goDecks());function y(R){u.textContent=R,u.hidden=R===""}let m=[],b=new Map,T=[],k="",U="",N=0,w=!1,E=null,I=0,J=!1;function L(R,F){return R.length===0?`
—
`:`
`+R.map(X=>`

${Xa(X)}

`).join("")+"
"}async function z(){const R=++I,F=m[N],X=b.get(F);if(!X){g.innerHTML="",c.textContent="",y("Слово пропало из базы — пропускаю.");return}E=null;let j="";try{E=await jn(r,F)??1}catch{E=1,j=" (score прочитать не удалось — пишу before/after=1)"}if(R!==I)return;J=!1;const V=Gn(X,T),B=nr(k,V),H=w?nr(U,V):null;c.textContent=`Карточка ${N+1} из ${m.length}`,y("");const v=w?L(H??[],"review-back-side"):'

Тап — показать ответ

',x=w?`
${za.map(M=>``).join("")}
`:"";g.innerHTML=` ${x} `,g.querySelector("#review-card").addEventListener("click",()=>{w||(w=!0,z())}),g.querySelectorAll(".review-grade").forEach(M=>{M.addEventListener("click",()=>{const Q=Number(M.dataset.grade);P(Q,j)})})}async function P(R,F){if(J)return;J=!0;const X=m[N],j=E??1,V=[...g.querySelectorAll(".review-grade")];for(const B of V)B.disabled=!0;try{await Wn({deckId:r,wordId:X,answer:R,before:j,after:j})}catch(B){y(`Ответ не записался: ${B instanceof Error?B.message:String(B)}${F}`),J=!1;for(const H of V)H.disabled=!1;return}N+=1,w=!1,E=null,N>=m.length?C():await z()}function C(){c.textContent=`Готово: ${m.length} из ${m.length}`,y(""),g.innerHTML=`

Все карточки сессии просмотрены, ответы записаны в history.

`,g.querySelector("#review-again").addEventListener("click",()=>{_()})}async function _(){if(y("Перемешиваю…"),g.innerHTML="",c.textContent="",m=await ar(r),N=0,w=!1,m.length===0){y("В колоде нет слов для повторения.");return}b=await rr(m),z()}(async()=>{if(!await Je()){s.textContent="Повторение недоступно",y("Нет локальной базы — скачай сохранение на странице «Синхронизация».");return}try{const[F,X]=await Promise.all([nt(r),vr()]);if(!F){s.textContent="Колода не найдена",y(`Колоды с id=${r} нет в локальной базе. Вернись к списку.`);return}if(T=X,k=F.forward,U=F.backward,s.textContent=F.name||`Колода #${F.id}`,m=await ar(F.id),m.length===0){c.textContent="",y("В колоде нет слов для повторения.");return}b=await rr(m),N=0,w=!1,await z()}catch(F){s.textContent="Повторение недоступно",y(`Не удалось загрузить карточки: ${F instanceof Error?F.message:String(F)}`)}})()}const lr=24,Va=/^[A-Za-z0-9]{24}$/,Er="japlearn_sync_token";function ur(e){return e.trim().replace(/\s+/g,"")}function Qe(e){return Va.test(e)}function Ya(){try{return localStorage.getItem(Er)??""}catch{return""}}function dr(e){try{localStorage.setItem(Er,e)}catch{}}const Cr="https://learning.micialware.ru";function Za(e,r=Cr){return`${r.replace(/\/+$/,"")}/download/${encodeURIComponent(e)}`}async function Ga(e,r,a=Cr){const o=Za(e,a);let s;try{s=await fetch(o,{method:"GET",...r})}catch(u){throw new Error(`Нет связи с сервером: ${u instanceof Error?u.message:String(u)}`)}if(!s.ok)throw s.status===404?new Error("Сохранение не найдено (404). Проверь токен."):new Error(`Сервер ответил ${s.status} ${s.statusText}`);const c=await s.arrayBuffer();if(c.byteLength===0)throw new Error("Сервер вернул пустой файл");return new Uint8Array(c)}function ja(e){e.innerHTML=`

📡 Синхронизация

Токен сохранения — 24 символа: латинские буквы и цифры.

0 / 24

Введите токен из 24 символов

`;const r=e.querySelector("#token-input"),a=e.querySelector("#token-error"),o=e.querySelector("#token-counter"),s=e.querySelector("#btn-download"),c=e.querySelector("#status");function u(k){c.textContent=k,console.log(`[JapLearn] ${k}`)}function g(){return ur(r.value)}function y(k){s.disabled=k||!Qe(g()),r.disabled=k}function m(){const k=g(),U=k.length;o.textContent=`${U} / ${lr}`;const N=Qe(k),w=U===0;r.classList.toggle("invalid",!w&&!N),r.setAttribute("aria-invalid",String(!w&&!N)),w?a.textContent="":U!==lr?a.textContent=`Нужно 24 символа, сейчас ${U}`:a.textContent=N?"":"Только латинские буквы и цифры",s.disabled=!N}async function b(){const k=g();if(Qe(k)){dr(k),y(!0),u("Скачивание сохранения...");try{const U=await Ga(k);u(`Скачано ${(U.length/1024).toFixed(1)} КБ, распаковка...`);const N=await Ha(U);u(`Распаковано ${(N.length/1024).toFixed(1)} КБ, сохранение в OPFS...`),await ta(N),u(`Готово: база ${(N.length/1024).toFixed(1)} КБ сохранена локально (OPFS).`)}catch(U){u(`Ошибка скачивания: ${U instanceof Error?U.message:String(U)}`)}finally{y(!1),m()}}}r.addEventListener("input",()=>{m()}),r.addEventListener("change",()=>{const k=g();r.value=k,Qe(k)&&(dr(k),u("Токен сохранён локально. Можно скачивать.")),m()}),s.addEventListener("click",()=>{b()});const T=Ya();T&&(r.value=T),m(),Qe(ur(T))&&u("Токен восстановлен. Нажми «Скачать», чтобы получить базу.")}const Wa={home:"Главная",decks:"Колоды",deck:"Колода",review:"Повторение",history:"История",sync:"Синхронизация"};function Ke(e){const r=document.getElementById(e);if(!r)throw new Error(`[JapLearn] Не найден элемент #${e}`);return r}const $r=Ke("burger-btn"),rt=Ke("drawer"),Ur=Ke("drawer-overlay"),Aa=Ke("page-title"),Ue=Ke("page");let Mt=!1;function De(e){Mt=e,rt.classList.toggle("open",e),Ur.hidden=!e,$r.setAttribute("aria-expanded",String(e)),rt.setAttribute("aria-hidden",String(!e)),document.body.classList.toggle("drawer-open",e)}function es(e){rt.querySelectorAll(".drawer-btn").forEach(r=>{r.classList.toggle("active",r.dataset.page===e)})}function me(e,r){Aa.textContent=Wa[e],es(e==="deck"||e==="review"||e==="history"?"decks":e),e==="home"?qa(Ue):e==="decks"?_a(Ue,{goDeck:a=>me("deck",a),goReview:a=>me("review",a)}):e==="deck"?Ia(Ue,r??0,{goDecks:()=>me("decks"),goReview:a=>me("review",a),goHistory:a=>me("history",a)}):e==="review"?Ba(Ue,r??0,{goDecks:()=>me("decks")}):e==="history"?Da(Ue,r??0,{goDeck:a=>me("deck",a)}):ja(Ue)}$r.addEventListener("click",()=>{De(!Mt)});Ur.addEventListener("click",()=>{De(!1)});document.addEventListener("keydown",e=>{e.key==="Escape"&&Mt&&De(!1)});rt.querySelectorAll(".drawer-btn").forEach(e=>{e.addEventListener("click",()=>{const r=e.dataset.page;(r==="home"||r==="decks"||r==="sync")&&me(r),De(!1)})});await Rn();De(!1);me("home");console.log("[JapLearn] crossOriginIsolated =",window.crossOriginIsolated);