diff --git a/polylan_submitter/static_source/vite/assets/opus_magnum-BwlGd4nK.js b/polylan_submitter/static_source/vite/assets/opus_magnum-BwlGd4nK.js
deleted file mode 100644
index f141c62..0000000
--- a/polylan_submitter/static_source/vite/assets/opus_magnum-BwlGd4nK.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import{e as Ut,r as O,m as Bt,t as Vt,c as se,i as ge,a as nt,b as us,d as fs,h as vs,f as ms,g as Gt,o as Wt,w as Ce,n as Se,j as hs,k as ue,l as d,p as c,q as ne,s as e,u as L,v as p,x as E,F as U,y as W,z as q,A as et,B as gs,C as de,D as Ht,E as ce,G as $e,H as ps,I as pe,J as ut,K as Jt,L as bs,M as ze,N as ys,O as _s}from"./style-C9QoPxDN.js";import{_ as ft}from"./RankBadge.vue_vue_type_script_setup_true_lang-CiUtgtLU.js";/*!
- * pinia v3.0.3
- * (c) 2025 Eduardo San Martin Morote
- * @license MIT
- */let Kt;const Pe=o=>Kt=o,Yt=Symbol();function tt(o){return o&&typeof o=="object"&&Object.prototype.toString.call(o)==="[object Object]"&&typeof o.toJSON!="function"}var we;(function(o){o.direct="direct",o.patchObject="patch object",o.patchFunction="patch function"})(we||(we={}));function xs(){const o=Ut(!0),a=o.run(()=>O({}));let s=[],t=[];const n=Bt({install(l){Pe(n),n._a=l,l.provide(Yt,n),l.config.globalProperties.$pinia=n,t.forEach(i=>s.push(i)),t=[]},use(l){return this._a?s.push(l):t.push(l),this},_p:s,_a:null,_e:o,_s:new Map,state:a});return n}const Zt=()=>{};function vt(o,a,s,t=Zt){o.push(a);const n=()=>{const l=o.indexOf(a);l>-1&&(o.splice(l,1),t())};return!s&&Gt()&&Wt(n),n}function he(o,...a){o.slice().forEach(s=>{s(...a)})}const ws=o=>o(),mt=Symbol(),Ee=Symbol();function st(o,a){o instanceof Map&&a instanceof Map?a.forEach((s,t)=>o.set(t,s)):o instanceof Set&&a instanceof Set&&a.forEach(o.add,o);for(const s in a){if(!a.hasOwnProperty(s))continue;const t=a[s],n=o[s];tt(n)&&tt(t)&&o.hasOwnProperty(s)&&!ge(t)&&!nt(t)?o[s]=st(n,t):o[s]=t}return o}const ks=Symbol();function $s(o){return!tt(o)||!Object.prototype.hasOwnProperty.call(o,ks)}const{assign:ve}=Object;function zs(o){return!!(ge(o)&&o.effect)}function Ss(o,a,s,t){const{state:n,actions:l,getters:i}=a,v=s.state.value[o];let g;function b(){v||(s.state.value[o]=n?n():{});const k=hs(s.state.value[o]);return ve(k,l,Object.keys(i||{}).reduce((S,w)=>(S[w]=Bt(se(()=>{Pe(s);const r=s._s.get(o);return i[w].call(r,r)})),S),{}))}return g=Qt(o,b,a,s,t,!0),g}function Qt(o,a,s={},t,n,l){let i;const v=ve({actions:{}},s),g={deep:!0};let b,k,S=[],w=[],r;const u=t.state.value[o];!l&&!u&&(t.state.value[o]={}),O({});let _;function h(R){let j;b=k=!1,typeof R=="function"?(R(t.state.value[o]),j={type:we.patchFunction,storeId:o,events:r}):(st(t.state.value[o],R),j={type:we.patchObject,payload:R,storeId:o,events:r});const B=_=Symbol();Se().then(()=>{_===B&&(b=!0)}),k=!0,he(S,j,t.state.value[o])}const f=l?function(){const{state:j}=s,B=j?j():{};this.$patch(Y=>{ve(Y,B)})}:Zt;function m(){i.stop(),S=[],w=[],t._s.delete(o)}const y=(R,j="")=>{if(mt in R)return R[Ee]=j,R;const B=function(){Pe(t);const Y=Array.from(arguments),re=[],fe=[];function be(V){re.push(V)}function oe(V){fe.push(V)}he(w,{args:Y,name:B[Ee],store:D,after:be,onError:oe});let ae;try{ae=R.apply(this&&this.$id===o?this:D,Y)}catch(V){throw he(fe,V),V}return ae instanceof Promise?ae.then(V=>(he(re,V),V)).catch(V=>(he(fe,V),Promise.reject(V))):(he(re,ae),ae)};return B[mt]=!0,B[Ee]=j,B},M={_p:t,$id:o,$onAction:vt.bind(null,w),$patch:h,$reset:f,$subscribe(R,j={}){const B=vt(S,R,j.detached,()=>Y()),Y=i.run(()=>Ce(()=>t.state.value[o],re=>{(j.flush==="sync"?k:b)&&R({storeId:o,type:we.direct,events:r},re)},ve({},g,j)));return B},$dispose:m},D=ms(M);t._s.set(o,D);const C=(t._a&&t._a.runWithContext||ws)(()=>t._e.run(()=>(i=Ut()).run(()=>a({action:y}))));for(const R in C){const j=C[R];if(ge(j)&&!zs(j)||nt(j))l||(u&&$s(j)&&(ge(j)?j.value=u[R]:st(j,u[R])),t.state.value[o][R]=j);else if(typeof j=="function"){const B=y(j,R);C[R]=B,v.actions[R]=j}}return ve(D,C),ve(Vt(D),C),Object.defineProperty(D,"$state",{get:()=>t.state.value[o],set:R=>{h(j=>{ve(j,R)})}}),t._p.forEach(R=>{ve(D,i.run(()=>R({store:D,app:t._a,pinia:t,options:v})))}),u&&l&&s.hydrate&&s.hydrate(D.$state,u),b=!0,k=!0,D}/*! #__NO_SIDE_EFFECTS__ */function at(o,a,s){let t;const n=typeof a=="function";t=n?s:a;function l(i,v){const g=vs();return i=i||(g?fs(Yt,null):null),i&&Pe(i),i=Kt,i._s.has(o)||(n?Qt(o,a,t,i):Ss(o,t,i)),i._s.get(o)}return l.$id=o,l}function rt(o){const a=Vt(o),s={};for(const t in a){const n=a[t];n.effect?s[t]=se({get:()=>o[t],set(l){o[t]=l}}):(ge(n)||nt(n))&&(s[t]=us(o,t))}return s}const ht="/api";class Cs{async request(a,s={}){try{const t=await fetch(`${ht}${a}`,{headers:{"Content-Type":"application/json",...s.headers},...s}),n=await t.json();return t.ok?{data:n,status:t.status}:{error:n.detail||`HTTP ${t.status}`,status:t.status}}catch(t){return{error:t instanceof Error?t.message:"Network error",status:0}}}async uploadRequest(a,s){try{const t=await fetch(`${ht}${a}`,{method:"POST",body:s}),n=await t.json();return t.ok?{data:n,status:t.status}:{error:n.detail||`HTTP ${t.status}`,status:t.status}}catch(t){return{error:t instanceof Error?t.message:"Network error",status:0}}}async getPuzzles(){return this.request("/submissions/puzzles")}async getCollection(){return this.request("/submissions/collection")}async getTopSubmissions(a=5){return this.request(`/results/top-submissions?limit=${a}`)}async getPuzzleResults(a=5){return this.request(`/results/puzzle-results?limit=${a}`)}async getSubmissions(a=20,s=0){return this.request(`/submissions/submissions?limit=${a}&offset=${s}`)}async getSubmission(a){return this.request(`/submissions/submissions/${a}`)}async createSubmission(a,s){const t=new FormData;return t.append("data",JSON.stringify(a)),s.forEach(n=>{t.append("files",n)}),this.uploadRequest("/submissions/submissions",t)}async validateResponse(a,s){return this.request(`/submissions/responses/${a}/validate`,{method:"PUT",body:JSON.stringify(s)})}async autoValidateResponses(a){return this.request(`/submissions/responses/${a}/validate/auto`,{method:"PUT"})}async getResponsesNeedingValidation(){return this.request("/submissions/responses/needs-validation")}async validateSubmission(a){return this.request(`/submissions/submissions/${a}/validate`,{method:"POST"})}async deleteSubmission(a){return this.request(`/submissions/submissions/${a}`,{method:"DELETE"})}async getStats(){return this.request("/submissions/stats")}async healthCheck(){return this.request("/health")}async getUserInfo(){return this.request("/user")}}const te=new Cs,Ps={async loadPuzzles(){const o=await te.getPuzzles();return o.error?(console.error("Failed to load puzzles:",o.error),[]):o.data||[]},findPuzzleByName(o,a){if(!a)return null;let s=o.find(t=>t.title.toLowerCase()===a.toLowerCase());return s||(s=o.find(t=>t.title.toLowerCase().includes(a.toLowerCase())||a.toLowerCase().includes(t.title.toLowerCase()))),s||null}},gt={async createFromFiles(o,a,s,t){const n=o.map(i=>{const v=Ps.findPuzzleByName(a,i.ocrData?.puzzle||"");if(v)return{puzzle_id:v.id,puzzle_name:i.ocrData?.puzzle||"",cost:i.ocrData?.cost,cycles:i.ocrData?.cycles,area:i.ocrData?.area,needs_manual_validation:(i.ocrData?.confidence.overall??0)<=.8,ocr_confidence_cost:i.ocrData?.confidence?.cost||0,ocr_confidence_cycles:i.ocrData?.confidence?.cycles||0,ocr_confidence_area:i.ocrData?.confidence?.area||0}}).filter(i=>i!==void 0),l=o.map(i=>i.file);return te.createSubmission({notes:s,manual_validation_requested:t,responses:n},l)},async loadSubmissions(o=20,a=0){const s=await te.getSubmissions(o,a);return s.error?(console.error("Failed to load submissions:",s.error),[]):s.data?.items||[]}},Xt={getErrorMessage(o){return typeof o=="string"?o:o instanceof Error?o.message:typeof o=="object"&&o!==null&&"detail"in o?String(o.detail):"An unknown error occurred"},isNetworkError(o){return typeof o=="string"&&o.includes("Network")},isValidationError(o){return o===400},isAuthError(o){return o===401||o===403}},Le=at("puzzles",()=>{const o=O([]),a=O(!1),s=O(""),t=se(()=>o.value.map(v=>v.title)),n=se(()=>v=>{if(!v)return null;const g=o.value.find(k=>k.title.toLowerCase()===v.toLowerCase());return g||o.value.find(k=>k.title.toLowerCase().includes(v.toLowerCase())||v.toLowerCase().includes(k.title.toLowerCase()))||null}),l=async()=>{if(!(o.value.length>0))try{a.value=!0,s.value="";const v=await te.getPuzzles();if(v.error){s.value=v.error,console.error("Failed to load puzzles:",v.error);return}v.data&&(o.value=v.data)}catch(v){s.value="Failed to load puzzles",console.error("Error loading puzzles:",v)}finally{a.value=!1}};return{puzzles:o,isLoading:a,error:s,puzzleNames:t,findPuzzleByName:n,loadPuzzles:l,refreshPuzzles:async()=>{o.value=[],await l()}}}),lt=at("submissions",()=>{const o=O([]),a=O(!1),s=O(""),t=O(!1),n=Le(),{puzzles:l}=rt(n),i=async(w=20,r=0)=>{try{a.value=!0,s.value="";const u=await gt.loadSubmissions(w,r);r===0?o.value=u:o.value.push(...u)}catch(u){s.value="Failed to load submissions",console.error("Error loading submissions:",u)}finally{a.value=!1}},v=async(w,r,u)=>{try{a.value=!0,s.value="";const _=await gt.createFromFiles(w,l.value,r,u);if(_.error)throw s.value=_.error,new Error(_.error);return _.data?(o.value.unshift(_.data),_.data):void 0}catch(_){throw s.value=_ instanceof Error?_.message:"Failed to create submission",_}finally{a.value=!1}},g=()=>{t.value=!0},b=()=>{t.value=!1};return{submissions:o,isLoading:a,error:s,isSubmissionModalOpen:t,loadSubmissions:i,createSubmission:v,openSubmissionModal:g,closeSubmissionModal:b,refreshSubmissions:async()=>{o.value=[],await i()},handleSubmission:async w=>{try{a.value=!0,s.value="";const r=await v(w.files,w.notes,w.manualValidationRequested);if(r){const u=r.responses.map(_=>_.puzzle_name).join(", ");alert(`Solutions submitted successfully for puzzles: ${u}`)}else alert("Submission created successfully!");b()}catch(r){const u=Xt.getErrorMessage(r);s.value=u,alert(`Submission failed: ${u}`),console.error("Submission error:",r)}finally{a.value=!1}}}}),Ls={class:"card-body"},Rs={class:"flex items-start justify-between"},Es={class:"flex-1"},Os={class:"text-sm text-base-content/70 mb-2"},Ms={class:"flex items-center gap-2 mb-3"},Ns={class:"badge badge-primary badge-sm"},As={class:"badge badge-ghost badge-sm"},Ds={key:0,class:"text-sm text-base-content/80 mb-4"},js={key:1,class:"bg-base-200 p-3 rounded-lg mb-4"},Is={class:"grid grid-cols-3 gap-2"},Ts={class:"text-center"},qs={class:"font-bold text-primary"},Fs={class:"text-center"},Us={class:"font-bold text-primary"},Bs={class:"text-center"},Vs={class:"font-bold text-primary"},Gs={key:2,class:"flex flex-wrap gap-1 mb-4"},Ws={key:0,class:"badge badge-outline badge-xs"},Hs={class:"flex flex-col items-end gap-2"},Js={class:"tooltip","data-tip":"View on Steam Workshop"},Ks=["href"],Ys={key:0,class:"mt-1"},Zs={class:"divider"},Qs={class:"text-sm font-medium"},Xs={class:"table table-xs"},eo={key:0,class:"badge badge-success badge-xs"},to={key:1,class:"text-base-content/50"},so={key:0,class:"badge badge-info badge-xs"},oo={key:1,class:"text-base-content/50"},no={key:0,class:"badge badge-warning badge-xs"},ao={key:1,class:"text-base-content/50"},ro={class:"flex items-center gap-1"},lo={class:"badge badge-ghost badge-xs"},io=["data-tip"],co={key:1,class:"tooltip","data-tip":"Needs manual validation"},uo=ue({__name:"PuzzleCard",props:{puzzle:{},responses:{}},setup(o){const{openSubmissionModal:a}=lt();return(s,t)=>(c(),d("div",{class:ne(["card bg-base-100 shadow-lg hover:shadow-2xl transition-shadow duration-300",o.responses?.length==0?"shadow-red-900":"shadow-primary-300"])},[e("div",Ls,[e("div",Rs,[e("div",Es,[e("h3",{class:ne(["card-title text-lg font-bold",o.responses?.length==0?"text-error":"text-primary"])},p(o.puzzle.title),3),e("p",Os," by "+p(o.puzzle.author_name),1),e("div",Ms,[e("div",Ns,p(o.puzzle.steam_item_id),1),e("div",As,"ID: "+p(o.puzzle.id),1)]),o.puzzle.description?(c(),d("p",Ds,p(o.puzzle.description),1)):L("",!0),o.puzzle.points_factor?(c(),d("div",js,[t[7]||(t[7]=e("p",{class:"text-xs text-base-content/70 font-semibold mb-2"},"Points Coefficients",-1)),e("div",Is,[e("div",Ts,[e("span",qs,[t[1]||(t[1]=e("small",null,"x",-1)),E(p(o.puzzle.points_factor.cost),1)]),t[2]||(t[2]=e("p",{class:"text-xs text-base-content/70"},"Cost",-1))]),e("div",Fs,[e("span",Us,[t[3]||(t[3]=e("small",null,"x",-1)),E(p(o.puzzle.points_factor.cycles),1)]),t[4]||(t[4]=e("p",{class:"text-xs text-base-content/70"},"Cycles",-1))]),e("div",Bs,[e("span",Vs,[t[5]||(t[5]=e("small",null,"x",-1)),E(p(o.puzzle.points_factor.area),1)]),t[6]||(t[6]=e("p",{class:"text-xs text-base-content/70"},"Area",-1))])])])):L("",!0),o.puzzle.tags&&o.puzzle.tags.length>0?(c(),d("div",Gs,[(c(!0),d(U,null,W(o.puzzle.tags.slice(0,3),n=>(c(),d("span",{key:n,class:"badge badge-outline badge-xs"},p(n),1))),128)),o.puzzle.tags.length>3?(c(),d("span",Ws," +"+p(o.puzzle.tags.length-3)+" more ",1)):L("",!0)])):L("",!0)]),e("div",Hs,[e("div",Js,[e("a",{href:`https://steamcommunity.com/workshop/filedetails/?id=${o.puzzle.steam_item_id}`,target:"_blank",class:"btn btn-ghost btn-sm btn-square"},[...t[8]||(t[8]=[e("i",{class:"mdi mdi-steam text-lg"},null,-1)])],8,Ks)])])]),o.responses&&o.responses.length>0?(c(),d("div",Ys,[e("div",Zs,[e("span",Qs,"Solutions ("+p(o.responses.length)+")",1)]),e("div",null,[e("table",Xs,[t[11]||(t[11]=e("thead",null,[e("tr",null,[e("th",null,"Cost"),e("th",null,"Cycles"),e("th",null,"Area"),e("th",null,"Files")])],-1)),e("tbody",null,[(c(!0),d(U,null,W(o.responses,n=>(c(),d("tr",{key:n.id,class:"hover"},[e("td",null,[n.final_cost||n.cost?(c(),d("span",eo,p(n.final_cost||n.cost),1)):(c(),d("span",to,"-"))]),e("td",null,[n.final_cycles||n.cycles?(c(),d("span",so,p(n.final_cycles||n.cycles),1)):(c(),d("span",oo,"-"))]),e("td",null,[n.final_area||n.area?(c(),d("span",no,p(n.final_area||n.area),1)):(c(),d("span",ao,"-"))]),e("td",null,[e("div",ro,[e("span",lo,p(n.files?.length||0),1),n.files?.length?(c(),d("div",{key:0,class:"tooltip","data-tip":n.files.map(l=>l.original_filename||l.file?.name).join(", ")},[...t[9]||(t[9]=[e("i",{class:"mdi mdi-information-outline text-xs"},null,-1)])],8,io)):L("",!0),n.needs_manual_validation?(c(),d("div",co,[...t[10]||(t[10]=[e("i",{class:"mdi mdi-alert-circle text-xs text-warning"},null,-1)])])):L("",!0)])])]))),128))])])])])):(c(),d("div",{key:1,class:"mt-6 text-center py-4 border-2 border-dashed border-base-300 rounded-lg hover:border-primary transition-colors duration-300 cursor-pointer",onClick:t[0]||(t[0]=(...n)=>q(a)&&q(a)(...n))},[...t[12]||(t[12]=[e("i",{class:"mdi mdi-upload text-2xl text-base-content/40"},null,-1),e("p",{class:"text-sm text-base-content/60 mt-2"},"No solutions yet",-1),e("p",{class:"text-xs text-base-content/40"}," Upload solutions using the submit button ",-1)])]))])],2))}});var Oe={exports:{}},pt;function fo(){return pt||(pt=1,(function(o){var a=(function(s){var t=Object.prototype,n=t.hasOwnProperty,l=Object.defineProperty||function($,x,z){$[x]=z.value},i,v=typeof Symbol=="function"?Symbol:{},g=v.iterator||"@@iterator",b=v.asyncIterator||"@@asyncIterator",k=v.toStringTag||"@@toStringTag";function S($,x,z){return Object.defineProperty($,x,{value:z,enumerable:!0,configurable:!0,writable:!0}),$[x]}try{S({},"")}catch{S=function(x,z,N){return x[z]=N}}function w($,x,z,N){var P=x&&x.prototype instanceof y?x:y,T=Object.create(P.prototype),K=new ae(N||[]);return l(T,"_invoke",{value:re($,z,K)}),T}s.wrap=w;function r($,x,z){try{return{type:"normal",arg:$.call(x,z)}}catch(N){return{type:"throw",arg:N}}}var u="suspendedStart",_="suspendedYield",h="executing",f="completed",m={};function y(){}function M(){}function D(){}var F={};S(F,g,function(){return this});var C=Object.getPrototypeOf,R=C&&C(C(V([])));R&&R!==t&&n.call(R,g)&&(F=R);var j=D.prototype=y.prototype=Object.create(F);M.prototype=D,l(j,"constructor",{value:D,configurable:!0}),l(D,"constructor",{value:M,configurable:!0}),M.displayName=S(D,k,"GeneratorFunction");function B($){["next","throw","return"].forEach(function(x){S($,x,function(z){return this._invoke(x,z)})})}s.isGeneratorFunction=function($){var x=typeof $=="function"&&$.constructor;return x?x===M||(x.displayName||x.name)==="GeneratorFunction":!1},s.mark=function($){return Object.setPrototypeOf?Object.setPrototypeOf($,D):($.__proto__=D,S($,k,"GeneratorFunction")),$.prototype=Object.create(j),$},s.awrap=function($){return{__await:$}};function Y($,x){function z(T,K,H,X){var G=r($[T],$,K);if(G.type==="throw")X(G.arg);else{var ye=G.arg,me=ye.value;return me&&typeof me=="object"&&n.call(me,"__await")?x.resolve(me.__await).then(function(le){z("next",le,H,X)},function(le){z("throw",le,H,X)}):x.resolve(me).then(function(le){ye.value=le,H(ye)},function(le){return z("throw",le,H,X)})}}var N;function P(T,K){function H(){return new x(function(X,G){z(T,K,X,G)})}return N=N?N.then(H,H):H()}l(this,"_invoke",{value:P})}B(Y.prototype),S(Y.prototype,b,function(){return this}),s.AsyncIterator=Y,s.async=function($,x,z,N,P){P===void 0&&(P=Promise);var T=new Y(w($,x,z,N),P);return s.isGeneratorFunction(x)?T:T.next().then(function(K){return K.done?K.value:T.next()})};function re($,x,z){var N=u;return function(T,K){if(N===h)throw new Error("Generator is already running");if(N===f){if(T==="throw")throw K;return Q()}for(z.method=T,z.arg=K;;){var H=z.delegate;if(H){var X=fe(H,z);if(X){if(X===m)continue;return X}}if(z.method==="next")z.sent=z._sent=z.arg;else if(z.method==="throw"){if(N===u)throw N=f,z.arg;z.dispatchException(z.arg)}else z.method==="return"&&z.abrupt("return",z.arg);N=h;var G=r($,x,z);if(G.type==="normal"){if(N=z.done?f:_,G.arg===m)continue;return{value:G.arg,done:z.done}}else G.type==="throw"&&(N=f,z.method="throw",z.arg=G.arg)}}}function fe($,x){var z=x.method,N=$.iterator[z];if(N===i)return x.delegate=null,z==="throw"&&$.iterator.return&&(x.method="return",x.arg=i,fe($,x),x.method==="throw")||z!=="return"&&(x.method="throw",x.arg=new TypeError("The iterator does not provide a '"+z+"' method")),m;var P=r(N,$.iterator,x.arg);if(P.type==="throw")return x.method="throw",x.arg=P.arg,x.delegate=null,m;var T=P.arg;if(!T)return x.method="throw",x.arg=new TypeError("iterator result is not an object"),x.delegate=null,m;if(T.done)x[$.resultName]=T.value,x.next=$.nextLoc,x.method!=="return"&&(x.method="next",x.arg=i);else return T;return x.delegate=null,m}B(j),S(j,k,"Generator"),S(j,g,function(){return this}),S(j,"toString",function(){return"[object Generator]"});function be($){var x={tryLoc:$[0]};1 in $&&(x.catchLoc=$[1]),2 in $&&(x.finallyLoc=$[2],x.afterLoc=$[3]),this.tryEntries.push(x)}function oe($){var x=$.completion||{};x.type="normal",delete x.arg,$.completion=x}function ae($){this.tryEntries=[{tryLoc:"root"}],$.forEach(be,this),this.reset(!0)}s.keys=function($){var x=Object($),z=[];for(var N in x)z.push(N);return z.reverse(),function P(){for(;z.length;){var T=z.pop();if(T in x)return P.value=T,P.done=!1,P}return P.done=!0,P}};function V($){if($){var x=$[g];if(x)return x.call($);if(typeof $.next=="function")return $;if(!isNaN($.length)){var z=-1,N=function P(){for(;++z<$.length;)if(n.call($,z))return P.value=$[z],P.done=!1,P;return P.value=i,P.done=!0,P};return N.next=N}}return{next:Q}}s.values=V;function Q(){return{value:i,done:!0}}return ae.prototype={constructor:ae,reset:function($){if(this.prev=0,this.next=0,this.sent=this._sent=i,this.done=!1,this.delegate=null,this.method="next",this.arg=i,this.tryEntries.forEach(oe),!$)for(var x in this)x.charAt(0)==="t"&&n.call(this,x)&&!isNaN(+x.slice(1))&&(this[x]=i)},stop:function(){this.done=!0;var $=this.tryEntries[0],x=$.completion;if(x.type==="throw")throw x.arg;return this.rval},dispatchException:function($){if(this.done)throw $;var x=this;function z(X,G){return T.type="throw",T.arg=$,x.next=X,G&&(x.method="next",x.arg=i),!!G}for(var N=this.tryEntries.length-1;N>=0;--N){var P=this.tryEntries[N],T=P.completion;if(P.tryLoc==="root")return z("end");if(P.tryLoc<=this.prev){var K=n.call(P,"catchLoc"),H=n.call(P,"finallyLoc");if(K&&H){if(this.prev
=0;--z){var N=this.tryEntries[z];if(N.tryLoc<=this.prev&&n.call(N,"finallyLoc")&&this.prev=0;--x){var z=this.tryEntries[x];if(z.finallyLoc===$)return this.complete(z.completion,z.afterLoc),oe(z),m}},catch:function($){for(var x=this.tryEntries.length-1;x>=0;--x){var z=this.tryEntries[x];if(z.tryLoc===$){var N=z.completion;if(N.type==="throw"){var P=N.arg;oe(z)}return P}}throw new Error("illegal catch attempt")},delegateYield:function($,x,z){return this.delegate={iterator:V($),resultName:x,nextLoc:z},this.method==="next"&&(this.arg=i),m}},s})(o.exports);try{regeneratorRuntime=a}catch{typeof globalThis=="object"?globalThis.regeneratorRuntime=a:Function("r","regeneratorRuntime = r")(a)}})(Oe)),Oe.exports}var Me,bt;function it(){return bt||(bt=1,Me=(o,a)=>`${o}-${a}-${Math.random().toString(16).slice(3,8)}`),Me}var Ne,yt;function es(){if(yt)return Ne;yt=1;const o=it();let a=0;return Ne=({id:s,action:t,payload:n={}})=>{let l=s;return typeof l>"u"&&(l=o("Job",a),a+=1),{id:l,action:t,payload:n}},Ne}var _e={},_t;function ct(){if(_t)return _e;_t=1;let o=!1;return _e.logging=o,_e.setLogging=a=>{o=a},_e.log=(...a)=>o?console.log.apply(this,a):null,_e}var Ae,xt;function vo(){if(xt)return Ae;xt=1;const o=es(),{log:a}=ct(),s=it();let t=0;return Ae=()=>{const n=s("Scheduler",t),l={},i={};let v=[];t+=1;const g=()=>v.length,b=()=>Object.keys(l).length,k=()=>{if(v.length!==0){const _=Object.keys(l);for(let h=0;h<_.length;h+=1)if(typeof i[_[h]]>"u"){v[0](l[_[h]]);break}}},S=(_,h)=>new Promise((f,m)=>{const y=o({action:_,payload:h});v.push(async M=>{v.shift(),i[M.id]=y;try{f(await M[_].apply(this,[...h,y.id]))}catch(D){m(D)}finally{delete i[M.id],k()}}),a(`[${n}]: Add ${y.id} to JobQueue`),a(`[${n}]: JobQueue length=${v.length}`),k()});return{addWorker:_=>(l[_.id]=_,a(`[${n}]: Add ${_.id}`),a(`[${n}]: Number of workers=${b()}`),k(),_.id),addJob:async(_,...h)=>{if(b()===0)throw Error(`[${n}]: You need to have at least one worker before adding jobs`);return S(_,h)},terminate:async()=>{Object.keys(l).forEach(async _=>{await l[_].terminate()}),v=[]},getQueueLen:g,getNumWorkers:b}},Ae}function mo(o){throw new Error('Could not dynamically require "'+o+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var De,wt;function ho(){if(wt)return De;wt=1;function o(){return!!(typeof window<"u"&&typeof window.process=="object"&&window.process.type==="renderer"||typeof process<"u"&&typeof process.versions=="object"&&process.versions.electron||typeof navigator=="object"&&typeof navigator.userAgent=="string"&&navigator.userAgent.indexOf("Electron")>=0)}return De=o,De}var je,kt;function go(){if(kt)return je;kt=1;const o=ho();return je=a=>{const s={};return typeof WorkerGlobalScope<"u"?s.type="webworker":o()?s.type="electron":typeof document=="object"?s.type="browser":typeof process=="object"&&typeof mo=="function"&&(s.type="node"),typeof a>"u"?s:s[a]},je}var Ie,$t;function po(){if($t)return Ie;$t=1;const a=go()("type")==="browser"?s=>new URL(s,window.location.href).href:s=>s;return Ie=s=>{const t={...s};return["corePath","workerPath","langPath"].forEach(n=>{s[n]&&(t[n]=a(t[n]))}),t},Ie}var Te,zt;function bo(){return zt||(zt=1,Te=o=>{const a=[],s=[],t=[],n=[],l=[];return o.blocks&&o.blocks.forEach(i=>{i.paragraphs.forEach(v=>{v.lines.forEach(g=>{g.words.forEach(b=>{b.symbols.forEach(k=>{l.push({...k,page:o,block:i,paragraph:v,line:g,word:b})}),n.push({...b,page:o,block:i,paragraph:v,line:g})}),t.push({...g,page:o,block:i,paragraph:v})}),s.push({...v,page:o,block:i})}),a.push({...i,page:o})}),{...o,blocks:a,paragraphs:s,lines:t,words:n,symbols:l}}),Te}var qe,St;function ts(){return St||(St=1,qe={TESSERACT_ONLY:0,LSTM_ONLY:1,TESSERACT_LSTM_COMBINED:2,DEFAULT:3}),qe}const yo="5.1.1",_o={version:yo};var Fe,Ct;function xo(){return Ct||(Ct=1,Fe={workerBlobURL:!0,logger:()=>{}}),Fe}var Ue,Pt;function wo(){if(Pt)return Ue;Pt=1;const o=_o.version;return Ue={...xo(),workerPath:`https://cdn.jsdelivr.net/npm/tesseract.js@v${o}/dist/worker.min.js`},Ue}var Be,Lt;function ko(){return Lt||(Lt=1,Be=({workerPath:o,workerBlobURL:a})=>{let s;if(Blob&&URL&&a){const t=new Blob([`importScripts("${o}");`],{type:"application/javascript"});s=new Worker(URL.createObjectURL(t))}else s=new Worker(o);return s}),Be}var Ve,Rt;function $o(){return Rt||(Rt=1,Ve=o=>{o.terminate()}),Ve}var Ge,Et;function zo(){return Et||(Et=1,Ge=(o,a)=>{o.onmessage=({data:s})=>{a(s)}}),Ge}var We,Ot;function So(){return Ot||(Ot=1,We=async(o,a)=>{o.postMessage(a)}),We}var He,Mt;function Co(){if(Mt)return He;Mt=1;const o=s=>new Promise((t,n)=>{const l=new FileReader;l.onload=()=>{t(l.result)},l.onerror=({target:{error:{code:i}}})=>{n(Error(`File could not be read! Code=${i}`))},l.readAsArrayBuffer(s)}),a=async s=>{let t=s;if(typeof s>"u")return"undefined";if(typeof s=="string")/data:image\/([a-zA-Z]*);base64,([^"]*)/.test(s)?t=atob(s.split(",")[1]).split("").map(n=>n.charCodeAt(0)):t=await(await fetch(s)).arrayBuffer();else if(typeof HTMLElement<"u"&&s instanceof HTMLElement)s.tagName==="IMG"&&(t=await a(s.src)),s.tagName==="VIDEO"&&(t=await a(s.poster)),s.tagName==="CANVAS"&&await new Promise(n=>{s.toBlob(async l=>{t=await o(l),n()})});else if(typeof OffscreenCanvas<"u"&&s instanceof OffscreenCanvas){const n=await s.convertToBlob();t=await o(n)}else(s instanceof File||s instanceof Blob)&&(t=await o(s));return new Uint8Array(t)};return He=a,He}var Je,Nt;function Po(){if(Nt)return Je;Nt=1;const o=wo(),a=ko(),s=$o(),t=zo(),n=So(),l=Co();return Je={defaultOptions:o,spawnWorker:a,terminateWorker:s,onMessage:t,send:n,loadImage:l},Je}var Ke,At;function ss(){if(At)return Ke;At=1;const o=po(),a=bo(),s=es(),{log:t}=ct(),n=it(),l=ts(),{defaultOptions:i,spawnWorker:v,terminateWorker:g,onMessage:b,loadImage:k,send:S}=Po();let w=0;return Ke=async(r="eng",u=l.LSTM_ONLY,_={},h={})=>{const f=n("Worker",w),{logger:m,errorHandler:y,...M}=o({...i,..._}),D={},F={},C=typeof r=="string"?r.split("+"):r;let R=u,j=h;const B=[l.DEFAULT,l.LSTM_ONLY].includes(u)&&!M.legacyCore;let Y,re;const fe=new Promise((A,I)=>{re=A,Y=I}),be=A=>{Y(A.message)};let oe=v(M);oe.onerror=be,w+=1;const ae=(A,I)=>{D[A]=I},V=(A,I)=>{F[A]=I},Q=({id:A,action:I,payload:J})=>new Promise((ee,Z)=>{t(`[${f}]: Start ${A}, action=${I}`);const ie=`${I}-${A}`;ae(ie,ee),V(ie,Z),S(oe,{workerId:f,jobId:A,action:I,payload:J})}),$=()=>console.warn("`load` is depreciated and should be removed from code (workers now come pre-loaded)"),x=A=>Q(s({id:A,action:"load",payload:{options:{lstmOnly:B,corePath:M.corePath,logging:M.logging}}})),z=(A,I,J)=>Q(s({id:J,action:"FS",payload:{method:"writeFile",args:[A,I]}})),N=(A,I)=>Q(s({id:I,action:"FS",payload:{method:"readFile",args:[A,{encoding:"utf8"}]}})),P=(A,I)=>Q(s({id:I,action:"FS",payload:{method:"unlink",args:[A]}})),T=(A,I,J)=>Q(s({id:J,action:"FS",payload:{method:A,args:I}})),K=()=>console.warn("`loadLanguage` is depreciated and should be removed from code (workers now come with language pre-loaded)"),H=(A,I)=>Q(s({id:I,action:"loadLanguage",payload:{langs:A,options:{langPath:M.langPath,dataPath:M.dataPath,cachePath:M.cachePath,cacheMethod:M.cacheMethod,gzip:M.gzip,lstmOnly:[l.DEFAULT,l.LSTM_ONLY].includes(R)&&!M.legacyLang}}})),X=()=>console.warn("`initialize` is depreciated and should be removed from code (workers now come pre-initialized)"),G=(A,I,J,ee)=>Q(s({id:ee,action:"initialize",payload:{langs:A,oem:I,config:J}})),ye=(A="eng",I,J,ee)=>{if(B&&[l.TESSERACT_ONLY,l.TESSERACT_LSTM_COMBINED].includes(I))throw Error("Legacy model requested but code missing.");const Z=I||R;R=Z;const ie=J||j;j=ie;const Re=(typeof A=="string"?A.split("+"):A).filter(ds=>!C.includes(ds));return C.push(...Re),Re.length>0?H(Re,ee).then(()=>G(A,Z,ie,ee)):G(A,Z,ie,ee)},me=(A={},I)=>Q(s({id:I,action:"setParameters",payload:{params:A}})),le=async(A,I={},J={blocks:!0,text:!0,hocr:!0,tsv:!0},ee)=>Q(s({id:ee,action:"recognize",payload:{image:await k(A),options:I,output:J}})),rs=(A="Tesseract OCR Result",I=!1,J)=>(console.log("`getPDF` function is depreciated. `recognize` option `savePDF` should be used instead."),Q(s({id:J,action:"getPDF",payload:{title:A,textonly:I}}))),ls=async(A,I)=>{if(B)throw Error("`worker.detect` requires Legacy model, which was not loaded.");return Q(s({id:I,action:"detect",payload:{image:await k(A)}}))},is=async()=>(oe!==null&&(g(oe),oe=null),Promise.resolve());b(oe,({workerId:A,jobId:I,status:J,action:ee,data:Z})=>{const ie=`${ee}-${I}`;if(J==="resolve"){t(`[${A}]: Complete ${I}`);let ke=Z;ee==="recognize"?ke=a(Z):ee==="getPDF"&&(ke=Array.from({...Z,length:Object.keys(Z).length})),D[ie]({jobId:I,data:ke})}else if(J==="reject")if(F[ie](Z),ee==="load"&&Y(Z),y)y(Z);else throw Error(Z);else J==="progress"&&m({...Z,userJobId:I})});const cs={id:f,worker:oe,setResolve:ae,setReject:V,load:$,writeText:z,readText:N,removeFile:P,FS:T,loadLanguage:K,initialize:X,reinitialize:ye,setParameters:me,recognize:le,getPDF:rs,detect:ls,terminate:is};return x().then(()=>H(r)).then(()=>G(r,u,h)).then(()=>re(cs)).catch(()=>{}),fe},Ke}var Ye,Dt;function Lo(){if(Dt)return Ye;Dt=1;const o=ss();return Ye={recognize:async(t,n,l)=>{const i=await o(n,1,l);return i.recognize(t).finally(async()=>{await i.terminate()})},detect:async(t,n)=>{const l=await o("osd",0,n);return l.detect(t).finally(async()=>{await l.terminate()})}},Ye}var Ze,jt;function Ro(){return jt||(jt=1,Ze={AFR:"afr",AMH:"amh",ARA:"ara",ASM:"asm",AZE:"aze",AZE_CYRL:"aze_cyrl",BEL:"bel",BEN:"ben",BOD:"bod",BOS:"bos",BUL:"bul",CAT:"cat",CEB:"ceb",CES:"ces",CHI_SIM:"chi_sim",CHI_TRA:"chi_tra",CHR:"chr",CYM:"cym",DAN:"dan",DEU:"deu",DZO:"dzo",ELL:"ell",ENG:"eng",ENM:"enm",EPO:"epo",EST:"est",EUS:"eus",FAS:"fas",FIN:"fin",FRA:"fra",FRK:"frk",FRM:"frm",GLE:"gle",GLG:"glg",GRC:"grc",GUJ:"guj",HAT:"hat",HEB:"heb",HIN:"hin",HRV:"hrv",HUN:"hun",IKU:"iku",IND:"ind",ISL:"isl",ITA:"ita",ITA_OLD:"ita_old",JAV:"jav",JPN:"jpn",KAN:"kan",KAT:"kat",KAT_OLD:"kat_old",KAZ:"kaz",KHM:"khm",KIR:"kir",KOR:"kor",KUR:"kur",LAO:"lao",LAT:"lat",LAV:"lav",LIT:"lit",MAL:"mal",MAR:"mar",MKD:"mkd",MLT:"mlt",MSA:"msa",MYA:"mya",NEP:"nep",NLD:"nld",NOR:"nor",ORI:"ori",PAN:"pan",POL:"pol",POR:"por",PUS:"pus",RON:"ron",RUS:"rus",SAN:"san",SIN:"sin",SLK:"slk",SLV:"slv",SPA:"spa",SPA_OLD:"spa_old",SQI:"sqi",SRP:"srp",SRP_LATN:"srp_latn",SWA:"swa",SWE:"swe",SYR:"syr",TAM:"tam",TEL:"tel",TGK:"tgk",TGL:"tgl",THA:"tha",TIR:"tir",TUR:"tur",UIG:"uig",UKR:"ukr",URD:"urd",UZB:"uzb",UZB_CYRL:"uzb_cyrl",VIE:"vie",YID:"yid"}),Ze}var Qe,It;function Eo(){return It||(It=1,Qe={OSD_ONLY:"0",AUTO_OSD:"1",AUTO_ONLY:"2",AUTO:"3",SINGLE_COLUMN:"4",SINGLE_BLOCK_VERT_TEXT:"5",SINGLE_BLOCK:"6",SINGLE_LINE:"7",SINGLE_WORD:"8",CIRCLE_WORD:"9",SINGLE_CHAR:"10",SPARSE_TEXT:"11",SPARSE_TEXT_OSD:"12",RAW_LINE:"13"}),Qe}var Xe,Tt;function Oo(){if(Tt)return Xe;Tt=1,fo();const o=vo(),a=ss(),s=Lo(),t=Ro(),n=ts(),l=Eo(),{setLogging:i}=ct();return Xe={languages:t,OEM:n,PSM:l,createScheduler:o,createWorker:a,setLogging:i,...s},Xe}var Mo=Oo();class dt{worker=null;availablePuzzleNames=[];regions={puzzle:{x:15,y:600,width:330,height:28},cost:{x:412,y:603,width:65,height:22},cycles:{x:577,y:603,width:65,height:22},area:{x:739,y:603,width:65,height:22}};async initialize(){this.worker||(this.worker=await Mo.createWorker("eng"),await this.worker.setParameters({tessedit_ocr_engine_mode:"3",tessedit_pageseg_mode:7}))}setAvailablePuzzleNames(a){this.availablePuzzleNames=a,console.log("OCR service updated with puzzle names:",a)}async configurePuzzleOCR(){this.worker&&(await this.worker.setParameters({load_system_dawg:"0",load_freq_dawg:"0",load_punc_dawg:"0",load_number_dawg:"0",load_unambig_dawg:"0",load_bigram_dawg:"0",load_fixed_length_dawgs:"0",tessedit_char_whitelist:this.getPuzzleCharacterSet(),tessedit_pageseg_mode:8,segment_penalty_dict_nonword:"2.0",segment_penalty_dict_frequent_word:"0.001",segment_penalty_dict_case_ok:"0.001",segment_penalty_dict_case_bad:"0.1",classify_enable_learning:"0",classify_enable_adaptive_matcher:"1",preserve_interword_spaces:"1"}),console.log("OCR configured for puzzle names with character set:",this.getPuzzleCharacterSet()))}getPuzzleCharacterSet(){if(this.availablePuzzleNames.length===0)return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 -";const a=new Set;return this.availablePuzzleNames.forEach(s=>{for(const t of s)a.add(t)}),Array.from(a).join("")}async extractOpusMagnumData(a){this.worker||await this.initialize();const s=URL.createObjectURL(a),t=new Image;return new Promise((n,l)=>{t.onload=async()=>{try{const i=document.createElement("canvas"),v=i.getContext("2d");i.width=t.width,i.height=t.height,v.drawImage(t,0,0);const g={},b={};for(const[w,r]of Object.entries(this.regions)){const u=document.createElement("canvas"),_=u.getContext("2d");u.width=r.width,u.height=r.height,_.drawImage(i,r.x,r.y,r.width,r.height,0,0,r.width,r.height);const h=_.getImageData(0,0,r.width,r.height);this.preprocessImage(h),_.putImageData(h,0,0),w==="cost"?await this.worker.setParameters({tessedit_char_whitelist:"0123456789G"}):w==="cycles"||w==="area"?await this.worker.setParameters({tessedit_char_whitelist:"0123456789"}):w==="puzzle"?await this.configurePuzzleOCR():await this.worker.setParameters({tessedit_char_whitelist:""});const{data:{text:f,confidence:m}}=await this.worker.recognize(u);let y=f.trim();if(b[w]=m/100,w==="cost"){if(y.endsWith("6")&&y.length>1){const M=y.slice(0,-1);/^\d+$/.test(M)&&(y=M)}y=y.replace(/G+$/g,""),y=y.replace(/[^0-9]/g,"")}else if(w==="cycles"||w==="area")y=y.replace(/[^0-9]/g,"");else if(w==="puzzle"&&(y=this.findBestPuzzleMatch(y),this.availablePuzzleNames.length>0&&!this.availablePuzzleNames.includes(y))){const M=this.findBestPuzzleMatchForced(y);M&&(y=M,console.log(`Forced OCR match: "${f.trim()}" -> "${y}"`))}g[w]=y}URL.revokeObjectURL(s);const k=Object.values(b),S=k.length>0?k.reduce((w,r)=>w+r,0)/k.length:0;n({puzzle:g.puzzle||"",cost:parseInt(g.cost||""),cycles:parseInt(g.cycles||""),area:parseInt(g.area||""),confidence:{puzzle:b.puzzle||0,cost:b.cost||0,cycles:b.cycles||0,area:b.area||0,overall:S}})}catch(i){URL.revokeObjectURL(s),l(i)}},t.onerror=()=>{URL.revokeObjectURL(s),l(new Error("Failed to load image"))},t.src=s})}preprocessImage(a){const s=a.data;for(let t=0;tArray(a.length+1).fill(null));for(let n=0;n<=a.length;n++)t[0][n]=n;for(let n=0;n<=s.length;n++)t[n][0]=n;for(let n=1;n<=s.length;n++)for(let l=1;l<=a.length;l++){const i=a[l-1]===s[n-1]?0:1;t[n][l]=Math.min(t[n][l-1]+1,t[n-1][l]+1,t[n-1][l-1]+i)}return t[s.length][a.length]}findBestPuzzleMatch(a){if(!this.availablePuzzleNames.length)return a.trim();const s=a.trim();if(!s)return"";const t=this.availablePuzzleNames.find(v=>v.toLowerCase()===s.toLowerCase());if(t)return t;const n=this.availablePuzzleNames.find(v=>v.toLowerCase().includes(s.toLowerCase())||s.toLowerCase().includes(v.toLowerCase()));if(n)return n;let l=s,i=0;for(const v of this.availablePuzzleNames){const g=[this.calculateLevenshteinSimilarity(s,v),this.calculateJaroWinklerSimilarity(s,v),this.calculateNGramSimilarity(s,v,2)],b=Math.max(...g);b>i&&b>.4&&(i=b,l=v)}if(i<.6){const v=this.findBestCharacterMatch(s);v&&(l=v)}return l}calculateLevenshteinSimilarity(a,s){const t=this.levenshteinDistance(a.toLowerCase(),s.toLowerCase()),n=Math.max(a.length,s.length);return n===0?1:1-t/n}calculateJaroWinklerSimilarity(a,s){const t=a.toLowerCase(),n=s.toLowerCase();if(t===n)return 1;const l=Math.floor(Math.max(t.length,n.length)/2)-1;if(l<0)return 0;const i=new Array(t.length).fill(!1),v=new Array(n.length).fill(!1);let g=0,b=0;for(let r=0;rv.has(k))),b=new Set([...i,...v]);return g.size/b.size}findBestCharacterMatch(a){let s=null,t=0;for(const n of this.availablePuzzleNames){const l=this.calculateCharacterFrequencyScore(a.toLowerCase(),n.toLowerCase());l>t&&l>.3&&(t=l,s=n)}return s}calculateCharacterFrequencyScore(a,s){const t=new Map,n=new Map;for(const g of a)t.set(g,(t.get(g)||0)+1);for(const g of s)n.set(g,(n.get(g)||0)+1);const l=new Set([...t.keys(),...n.keys()]);let i=0,v=0;for(const g of l){const b=t.get(g)||0,k=n.get(g)||0;i+=Math.min(b,k),v+=Math.max(b,k)}return v===0?0:i/v}findBestPuzzleMatchForced(a){if(!this.availablePuzzleNames.length||!a.trim())return null;const s=a.trim().toLowerCase();let t=this.availablePuzzleNames[0],n=0;for(const l of this.availablePuzzleNames){const i=[this.calculateLevenshteinSimilarity(s,l),this.calculateJaroWinklerSimilarity(s,l),this.calculateNGramSimilarity(s,l,2),this.calculateCharacterFrequencyScore(s,l.toLowerCase()),this.calculateLengthSimilarity(s,l.toLowerCase())],v=i[0]*.25+i[1]*.25+i[2]*.2+i[3]*.2+i[4]*.1;v>n&&(n=v,t=l)}return console.log(`Forced match for "${a}": "${t}" (score: ${n.toFixed(3)})`),t}calculateLengthSimilarity(a,s){const t=a.length,n=s.length,l=Math.max(t,n),i=Math.min(t,n);return l===0?1:i/l}async terminate(){this.worker&&(await this.worker.terminate(),this.worker=null)}static isValidOpusMagnumImage(a){return["image/jpeg","image/jpg","image/png","image/gif"].includes(a.type)}static drawDebugRegions(a){return new Promise((s,t)=>{const n=URL.createObjectURL(a),l=new Image;l.onload=()=>{const i=document.createElement("canvas"),v=i.getContext("2d");i.width=l.width,i.height=l.height,v.drawImage(l,0,0),v.strokeStyle="#00ff00",v.lineWidth=2;const g=new dt;Object.values(g.regions).forEach(b=>{v.strokeRect(b.x,b.y,b.width,b.height)}),URL.revokeObjectURL(n),s(i.toDataURL())},l.onerror=()=>{URL.revokeObjectURL(n),t(new Error("Failed to load image for debug"))},l.src=n})}}const ot=new dt,xe=.8,os=at("uploads",()=>{const o=O([]),a=se(()=>o.value.some(g=>g.ocrProcessing)),s=se(()=>o.value.some(g=>n(g))),t=se(()=>o.value.filter(g=>g.needsManualPuzzleSelection)),n=g=>g.ocrData?.confidence?g.ocrData.confidence.cost{for(;a.value;){const k=Math.floor(Math.random()*400)+100;console.log(`OCR is already processing, waiting ${k}ms...`),await new Promise(S=>setTimeout(S,k))}const b=o.value.indexOf(g);o.value[b].ocrProcessing=!0,o.value[b].ocrError=void 0,o.value[b].ocrData=void 0;try{console.log("Starting OCR processing for:",g.file.name),await ot.initialize();const k=await ot.extractOpusMagnumData(g.file);console.log("OCR completed:",k),await Se(),o.value[b].ocrData=k,k.confidence.puzzle{const g=o.value.filter(b=>n(b));for(const b of g)l(b)},clearFiles:()=>{o.value=[]},isProcessingOCR:a,hasLowConfidence:s,CONFIDENCE_VALUE:xe}}),No={class:"form-control w-full"},Ao={key:0,class:"space-y-4"},Do={key:1,class:"space-y-4"},jo={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-2 gap-4"},Io={class:"aspect-square rounded-lg overflow-hidden bg-base-200"},To=["src","alt"],qo={class:"absolute inset-0 bg-black/80 opacity-0 group-hover:opacity-100 transition-opacity duration-200 rounded-lg flex items-center justify-center"},Fo=["onClick"],Uo={class:"mt-2"},Bo={class:"text-xs font-medium truncate"},Vo={class:"text-xs text-base-content/60"},Go={key:0,class:"mt-1 flex items-center gap-1"},Wo={key:1,class:"mt-1"},Ho={class:"text-xs text-error"},Jo={key:2,class:"mt-1 space-y-1"},Ko={class:"text-xs flex items-center justify-between"},Yo={class:"flex items-center gap-2"},Zo=["title"],Qo=["onClick"],Xo={class:"text-xs space-y-1 bg-base-200 p-2 rounded"},en={key:0},tn=["title"],sn={key:1},on=["title"],nn={key:2},an=["title"],rn={key:3},ln=["title"],cn={key:3,class:"mt-2"},dn={class:"mt-2"},un=["onUpdate:modelValue","onChange"],fn=["value"],vn={key:4,class:"mt-1"},mn=["onClick"],hn={class:"flex justify-center"},gn={key:0,class:"label"},pn={class:"label-text-alt text-error"},bn=ue({__name:"FileUpload",setup(o){const a=Le(),{submissionFiles:s,processOCR:t}=os(),n=O(),l=O(!1),i=O("");Ce(()=>a.puzzles,f=>{f&&f.length>0&&ot.setAvailablePuzzleNames(a.puzzleNames)},{immediate:!0});const v=f=>{const m=f.target;m.files&&b(Array.from(m.files))},g=f=>{f.preventDefault(),l.value=!1,f.dataTransfer?.files&&b(Array.from(f.dataTransfer.files))},b=async f=>{i.value="";for(const m of f)if(k(m))try{const y=await S(m),M=m.type.startsWith("image/gif")?"gif":"image",D={file:m,file_url:"",preview:y,type:M,ocrProcessing:!1,ocrError:void 0,ocrData:void 0};s.push(D),u(m)&&Se(()=>{t(D)})}catch{i.value=`Failed to process ${m.name}`}},k=f=>f.type.startsWith("image/")?f.size>256*1024*1024?(i.value=`${f.name} is too large (max 256MB)`,!1):!0:(i.value=`${f.name} is not a valid image file`,!1),S=f=>new Promise((m,y)=>{const M=new FileReader;M.onload=D=>m(D.target?.result),M.onerror=y,M.readAsDataURL(f)}),w=f=>{s.splice(f,1)},r=f=>{if(f===0)return"0 Bytes";const m=1024,y=["Bytes","KB","MB","GB"],M=Math.floor(Math.log(f)/Math.log(m));return parseFloat((f/Math.pow(m,M)).toFixed(2))+" "+y[M]},u=f=>f.type.startsWith("image/")&&f.size>5e4,_=f=>f>=.8?"badge-success":f>=.6?"badge-warning":"badge-error",h=f=>{const m=s.findIndex(y=>y.file===f.file);m!==-1&&s[m].manualPuzzleSelection&&(s[m].needsManualPuzzleSelection=!1,console.log(`Manual puzzle selection: ${f.file.name} -> ${s[m].manualPuzzleSelection}`))};return(f,m)=>(c(),d("div",No,[m[19]||(m[19]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Upload Solution Files"),e("span",{class:"label-text-alt text-xs"},"Images or GIFs only")],-1)),e("div",{class:ne(["border-2 border-dashed border-base-300 rounded-lg p-6 text-center hover:border-primary transition-colors duration-300",{"border-primary bg-primary/5":l.value}]),onDrop:g,onDragover:m[2]||(m[2]=et(y=>l.value=!0,["prevent"])),onDragleave:m[3]||(m[3]=y=>l.value=!1),onDragenter:m[4]||(m[4]=et(()=>{},["prevent"]))},[e("input",{ref_key:"fileInput",ref:n,type:"file",multiple:"",accept:"image/*,.gif",class:"hidden",onChange:v},null,544),q(s).length===0?(c(),d("div",Ao,[m[6]||(m[6]=e("div",{class:"mx-auto w-12 h-12 text-base-content/40 flex items-center justify-center"},[e("i",{class:"mdi mdi-cloud-upload text-5xl"})],-1)),e("div",null,[m[5]||(m[5]=e("p",{class:"text-base-content/70 mb-2"},"Drop your files here or",-1)),e("button",{type:"button",onClick:m[0]||(m[0]=y=>n.value?.click()),class:"btn btn-primary btn-sm"}," Choose Files ")]),m[7]||(m[7]=e("p",{class:"text-xs text-base-content/50"}," Supported formats: JPG, PNG, GIF (max 256MB each) ",-1))])):(c(),d("div",Do,[e("div",jo,[(c(!0),d(U,null,W(q(s),(y,M)=>(c(),d("div",{key:M,class:"relative group"},[e("div",Io,[e("img",{src:y.preview,alt:y.file.name,class:"w-full h-full object-cover"},null,8,To)]),e("div",qo,[e("button",{onClick:D=>w(M),class:"btn btn-error btn-lg btn-circle"},[...m[8]||(m[8]=[e("i",{class:"mdi mdi-close"},null,-1)])],8,Fo)]),e("div",Uo,[e("p",Bo,p(y.file.name),1),e("p",Vo,p(r(y.file.size))+" • "+p(y.type.toUpperCase()),1),y.ocrProcessing?(c(),d("div",Go,[...m[9]||(m[9]=[e("span",{class:"loading loading-spinner loading-xs"},null,-1),e("span",{class:"text-xs text-info"},"Extracting puzzle data...",-1)])])):y.ocrError?(c(),d("div",Wo,[e("p",Ho,p(y.ocrError),1)])):y.ocrData?(c(),d("div",Jo,[e("div",Ko,[e("div",Yo,[m[10]||(m[10]=e("span",{class:"font-medium text-success"},"✓ OCR Complete",-1)),y.ocrData.confidence?(c(),d("span",{key:0,class:ne(["badge badge-xs",_(y.ocrData.confidence.overall)]),title:`Overall confidence: ${Math.round(y.ocrData.confidence.overall*100)}%`},p(Math.round(y.ocrData.confidence.overall*100))+"% ",11,Zo)):L("",!0)]),e("button",{onClick:D=>q(t)(y),class:"btn btn-xs btn-ghost",title:"Retry OCR"},[...m[11]||(m[11]=[e("i",{class:"mdi mdi-refresh"},null,-1)])],8,Qo)]),e("div",Xo,[y.ocrData.puzzle?(c(),d("div",en,[m[12]||(m[12]=e("strong",null,"Puzzle:",-1)),E(" "+p(y.ocrData.puzzle)+" ",1),y.ocrData.confidence?.puzzle?(c(),d("span",{key:0,class:"ml-2 opacity-60",title:`Puzzle confidence: ${Math.round(y.ocrData.confidence.puzzle*100)}%`}," ("+p(Math.round(y.ocrData.confidence.puzzle*100))+"%) ",9,tn)):L("",!0)])):L("",!0),y.ocrData.cost?(c(),d("div",sn,[m[13]||(m[13]=e("strong",null,"Cost:",-1)),E(" "+p(y.ocrData.cost)+" ",1),y.ocrData.confidence?.cost?(c(),d("span",{key:0,class:"ml-2 opacity-60",title:`Cost confidence: ${Math.round(y.ocrData.confidence.cost*100)}%`}," ("+p(Math.round(y.ocrData.confidence.cost*100))+"%) ",9,on)):L("",!0)])):L("",!0),y.ocrData.cycles?(c(),d("div",nn,[m[14]||(m[14]=e("strong",null,"Cycles:",-1)),E(" "+p(y.ocrData.cycles)+" ",1),y.ocrData.confidence?.cycles?(c(),d("span",{key:0,class:"ml-2 opacity-60",title:`Cycles confidence: ${Math.round(y.ocrData.confidence.cycles*100)}%`}," ("+p(Math.round(y.ocrData.confidence.cycles*100))+"%) ",9,an)):L("",!0)])):L("",!0),y.ocrData.area?(c(),d("div",rn,[m[15]||(m[15]=e("strong",null,"Area:",-1)),E(" "+p(y.ocrData.area)+" ",1),y.ocrData.confidence?.area?(c(),d("span",{key:0,class:"ml-2 opacity-60",title:`Area confidence: ${Math.round(y.ocrData.confidence.area*100)}%`}," ("+p(Math.round(y.ocrData.confidence.area*100))+"%) ",9,ln)):L("",!0)])):L("",!0)])])):L("",!0),y.needsManualPuzzleSelection?(c(),d("div",cn,[m[17]||(m[17]=gs('Low OCR Confidence
Please select the correct puzzle manually
',1)),e("div",dn,[de(e("select",{"onUpdate:modelValue":D=>y.manualPuzzleSelection=D,class:"select select-bordered select-sm w-full",onChange:D=>h(y)},[m[16]||(m[16]=e("option",{value:""},"Select puzzle...",-1)),(c(!0),d(U,null,W(q(a).puzzles,D=>(c(),d("option",{key:D.id,value:D.title},p(D.title),9,fn))),128))],40,un),[[Ht,y.manualPuzzleSelection]])])])):!y.ocrProcessing&&!y.ocrError&&!y.ocrData?(c(),d("div",vn,[e("button",{onClick:D=>q(t)(y),class:"btn btn-xs btn-outline"},[...m[18]||(m[18]=[e("i",{class:"mdi mdi-text-recognition"},null,-1),E(" Extract Puzzle Data ",-1)])],8,mn)])):L("",!0)])]))),128))]),e("div",hn,[e("button",{type:"button",onClick:m[1]||(m[1]=y=>n.value?.click()),class:"btn btn-outline btn-sm"}," Add More Files ")])]))],34),i.value?(c(),d("div",gn,[e("span",pn,p(i.value),1)])):L("",!0)]))}}),yn={class:"card bg-base-100 shadow-xl"},_n={class:"card-body"},xn={key:0,class:"alert alert-info"},wn={class:"flex-1"},kn={class:"font-bold"},$n={class:"text-sm space-y-1 mt-1"},zn={class:"badge badge-ghost badge-sm ml-2"},Sn={key:1,class:"alert alert-warning"},Cn={class:"flex-1"},Pn={class:"text-sm"},Ln={class:"form-control"},Rn={class:"flex-1"},En={class:"flex label"},On={class:"label-text-alt"},Mn={class:"form-control"},Nn={class:"label cursor-pointer justify-start gap-3"},An=["disabled"],Dn={class:"card-actions justify-end"},jn=["disabled"],In={key:0,class:"loading loading-spinner loading-sm"},Tn={key:1},qn={key:2},Fn={key:3},Un=ue({__name:"SubmissionForm",props:{puzzles:{},findPuzzleByName:{type:Function}},setup(o){const a=o,s=os(),{submissionFiles:t,hasLowConfidence:n,submissionFilesNeedingManualSelection:l}=rt(s),{clearFiles:i,processLowConfidenceOCRFiles:v}=s,{handleSubmission:g}=lt(),b=O(""),k=O(!1),S=O(!1),w=se(()=>b.value.length),r=se(()=>{const h=t.value.length>0,f=!t.value.some(m=>m.needsManualPuzzleSelection);return h&&!S.value&&f});Ce(n,h=>{h&&(k.value=!0)});const u=se(()=>{const h={};return t.value.forEach(f=>{const m=f.manualPuzzleSelection||f.ocrData?.puzzle;m&&(h[m]||(h[m]={puzzle:a.findPuzzleByName(m),files:[]}),h[m].files.push(f))}),h}),_=async()=>{if(r.value){S.value=!0;try{g({files:t.value,notes:b.value.trim()||void 0,manualValidationRequested:n.value||k.value}),i(),b.value="",k.value=!1}catch(h){console.error("Submission error:",h)}finally{S.value=!1}}};return(h,f)=>(c(),d("div",yn,[e("div",_n,[f[9]||(f[9]=e("h2",{class:"card-title text-xl mb-6"},[e("i",{class:"mdi mdi-check-circle text-2xl text-primary"}),E(" Submit Solution ")],-1)),e("form",{onSubmit:et(_,["prevent"]),class:"space-y-6"},[Object.keys(u.value).length>0?(c(),d("div",xn,[f[3]||(f[3]=e("i",{class:"mdi mdi-information-outline text-xl"},null,-1)),e("div",wn,[e("h4",kn," Detected Puzzles ("+p(Object.keys(u.value).length)+") ",1),e("div",$n,[(c(!0),d(U,null,W(u.value,(m,y)=>(c(),d("div",{key:y,class:"flex justify-between"},[e("span",null,p(y),1),e("span",zn,p(m.files.length)+" file(s)",1)]))),128))])])])):L("",!0),ce(bn),q(l).length>0?(c(),d("div",Sn,[f[6]||(f[6]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",Cn,[f[5]||(f[5]=e("div",{class:"font-bold"},"Manual Puzzle Selection Required",-1)),e("div",Pn,p(q(l).length)+" file(s) have low OCR confidence for puzzle names. Please select the correct puzzle for each file before submitting. ",1),e("button",{class:"btn mt-3 w-full",onClick:f[0]||(f[0]=(...m)=>q(v)&&q(v)(...m))},[...f[4]||(f[4]=[e("span",{class:"mdi mdi-reload text-2xl"},null,-1),E(" Retry OCR on low confidence puzzle ",-1)])])])])):L("",!0),e("div",Ln,[e("div",Rn,[e("label",En,[f[7]||(f[7]=e("span",{class:"label-text font-medium"},"Notes (Optional)",-1)),e("span",On,p(w.value)+"/500",1)]),de(e("textarea",{"onUpdate:modelValue":f[1]||(f[1]=m=>b.value=m),class:"flex textarea textarea-bordered h-24 w-full resize-none",placeholder:"Add any notes about your solution, approach, or interesting findings...",maxlength:"500"},null,512),[[$e,b.value]])])]),e("div",Mn,[e("label",Nn,[de(e("input",{type:"checkbox","onUpdate:modelValue":f[2]||(f[2]=m=>k.value=m),class:"checkbox checkbox-primary",disabled:q(n)},null,8,An),[[ps,k.value]]),f[8]||(f[8]=e("div",{class:"flex-1"},[e("span",{class:"label-text font-medium"},"Request manual validation"),e("div",{class:"label-text-alt text-xs opacity-70 mt-1"},[E(" Check this if you want an admin to manually review your submission, even if OCR confidence is high. "),e("br"),e("em",null,"Note: This will be automatically checked if any OCR confidence is below 80%.")])],-1))])]),e("div",Dn,[e("button",{type:"submit",class:"btn btn-primary",disabled:!r.value},[S.value?(c(),d("span",In)):L("",!0),S.value?(c(),d("span",Tn,"Submitting...")):q(l).length>0?(c(),d("span",qn," Select Puzzles ("+p(q(l).length)+" remaining) ",1)):(c(),d("span",Fn,"Submit Solution"))],8,jn)])],32)])]))}}),Bn={class:"card bg-base-100 shadow-xl"},Vn={class:"card-body"},Gn={class:"stats stats-vertical lg:stats-horizontal shadow mb-6"},Wn={class:"stat"},Hn={class:"stat-value text-primary"},Jn={class:"stat"},Kn={class:"stat-value text-secondary"},Yn={class:"stat"},Zn={class:"stat-value text-warning"},Qn={class:"stat"},Xn={class:"stat-value text-success"},ea={key:0},ta={class:"overflow-x-auto"},sa={class:"table table-zebra"},oa={class:"font-bold"},na={class:"text-sm opacity-50"},aa={class:"text-sm space-y-1"},ra={class:"flex justify-between items-center"},la={class:"flex justify-between items-center"},ia={class:"flex justify-between items-center"},ca={class:"badge badge-warning badge-sm"},da=["onClick"],ua=["onClick"],fa={key:1,class:"text-center py-8"},va={key:0,class:"modal modal-open"},ma={class:"modal-box w-11/12 max-w-5xl"},ha=["src"],ga={key:0,class:"space-y-4"},pa={class:"alert alert-info"},ba={class:"font-bold"},ya={class:"grid grid-cols-4 gap-4"},_a={class:"form-control"},xa=["value"],wa={class:"form-control"},ka=["placeholder"],$a={class:"form-control"},za=["placeholder"],Sa={class:"form-control"},Ca=["placeholder"],Pa={class:"modal-action"},La=["disabled"],Ra={key:0,class:"loading loading-spinner loading-sm"},Ea={class:"mockup-code w-full"},Oa=ue({__name:"AdminPanel",setup(o,{expose:a}){const s=Le(),t=O({total_submissions:0,total_responses:0,needs_validation:0,validated_submissions:0,validation_rate:0}),n=O([]),l=O(!1),i=O(!1),v=O({show:!1,response:null,data:{puzzle:-1,validated_cost:0,validated_cycles:0,validated_area:0}}),g=async()=>{try{l.value=!0;try{const f=await te.getStats();f.data&&(t.value=f.data)}catch(f){console.warn("Stats endpoint not available:",f),t.value={total_submissions:0,total_responses:0,needs_validation:0,validated_submissions:0,validation_rate:0}}const h=await te.getResponsesNeedingValidation();h.data&&(n.value=h.data)}catch(h){console.error("Failed to load admin data:",h)}finally{l.value=!1}},b=async()=>{for(const h of Array.from(n.value)){if(!h.id)continue;const{data:f,error:m}=await te.autoValidateResponses(h.id);if(f&&!f.needs_manual_validation)n.value=n.value.filter(y=>y.id!==h.id),t.value.needs_validation-=1;else if(m)break}},k=h=>{v.value.response=h,v.value.data={puzzle:h.puzzle_id||-1,validated_cost:h.cost||0,validated_cycles:h.cycles||0,validated_area:h.area||0},v.value.show=!0},S=()=>{v.value.show=!1,v.value.response=null,v.value.data={puzzle:-1,validated_cost:0,validated_cycles:0,validated_area:0}},w=async h=>{const{data:f}=await te.autoValidateResponses(h);console.log(f),f&&!f.needs_manual_validation&&(n.value=n.value.filter(m=>m.id!==h),console.log(t.value),t.value.needs_validation-=1,console.log(t.value))},r=async()=>{if(v.value.response?.id)try{i.value=!0;const h=await te.validateResponse(v.value.response.id,v.value.data);if(h.error){alert(`Validation failed: ${h.error}`);return}n.value=n.value.filter(f=>f.id!==v.value.response?.id),t.value.needs_validation=Math.max(0,t.value.needs_validation-1),S()}catch(h){console.error("Validation error:",h),alert("Validation failed")}finally{i.value=!1}};pe(()=>{g()});const u=h=>h>=.8?"badge-success":h>=.6?"badge-warning":"badge-error",_=h=>{const f=[h.ocr_confidence_cost,h.ocr_confidence_cycles,h.ocr_confidence_area].filter(y=>y!=null);if(f.length===0)return 0;const m=f.reduce((y,M)=>y+M,0)/f.length;return Math.round(m*100)};return a({refresh:g}),(h,f)=>(c(),d(U,null,[e("div",Bn,[e("div",Vn,[f[14]||(f[14]=e("h2",{class:"card-title"},[e("i",{class:"mdi mdi-shield-account text-2xl text-warning"}),E(" Admin Panel ")],-1)),e("div",Gn,[e("div",Wn,[f[4]||(f[4]=e("div",{class:"stat-title"},"Total Submissions",-1)),e("div",Hn,p(t.value.total_submissions),1)]),e("div",Jn,[f[5]||(f[5]=e("div",{class:"stat-title"},"Total Responses",-1)),e("div",Kn,p(t.value.total_responses),1)]),e("div",Yn,[f[6]||(f[6]=e("div",{class:"stat-title"},"Need Validation",-1)),e("div",Zn,p(t.value.needs_validation),1)]),e("div",Qn,[f[7]||(f[7]=e("div",{class:"stat-title"},"Validation Rate",-1)),e("div",Xn,p(Math.round(t.value.validation_rate*100))+"% ",1)])]),e("button",{class:"btn btn-sm btn-primary",onClick:b},[...f[8]||(f[8]=[e("i",{class:"mdi mdi-check-circle mr-1"},null,-1),E(" Auto validation for all responses ",-1)])]),n.value.length>0?(c(),d("div",ea,[f[12]||(f[12]=e("h3",{class:"text-lg font-bold mb-4"},"Responses Needing Validation",-1)),e("div",ta,[e("table",sa,[f[11]||(f[11]=e("thead",null,[e("tr",null,[e("th",null,"Puzzle"),e("th",null,"OCR Data"),e("th",null,"Confidence"),e("th",null,"Actions")])],-1)),e("tbody",null,[(c(!0),d(U,null,W(n.value,m=>(c(),d("tr",{key:m.id},[e("td",null,[e("div",oa,p(m.puzzle_name),1),e("div",na,"ID: "+p(m.id),1)]),e("td",null,[e("div",aa,[e("div",ra,[e("span",null,"Cost: "+p(m.cost||"-"),1),m.ocr_confidence_cost?(c(),d("span",{key:0,class:ne(["badge badge-xs",u(m.ocr_confidence_cost)])},p(Math.round(m.ocr_confidence_cost*100))+"% ",3)):L("",!0)]),e("div",la,[e("span",null,"Cycles: "+p(m.cycles||"-"),1),m.ocr_confidence_cycles?(c(),d("span",{key:0,class:ne(["badge badge-xs",u(m.ocr_confidence_cycles)])},p(Math.round(m.ocr_confidence_cycles*100))+"% ",3)):L("",!0)]),e("div",ia,[e("span",null,"Area: "+p(m.area||"-"),1),m.ocr_confidence_area?(c(),d("span",{key:0,class:ne(["badge badge-xs",u(m.ocr_confidence_area)])},p(Math.round(m.ocr_confidence_area*100))+"% ",3)):L("",!0)])])]),e("td",null,[e("div",ca,p(_(m))+"% ",1)]),e("td",null,[e("button",{onClick:y=>k(m),class:"btn btn-sm btn-primary mr-2"},[...f[9]||(f[9]=[e("i",{class:"mdi mdi-check-circle mr-1"},null,-1),E(" Validate ",-1)])],8,da),m.id?(c(),d("button",{key:0,onClick:y=>w(m.id),class:"btn btn-sm btn-warning"},[...f[10]||(f[10]=[e("i",{class:"mdi mdi-check-circle mr-1"},null,-1),E(" Auto Validation ",-1)])],8,ua)):L("",!0)])]))),128))])])])])):(c(),d("div",fa,[...f[13]||(f[13]=[e("i",{class:"mdi mdi-check-all text-6xl text-success opacity-50"},null,-1),e("p",{class:"text-lg font-medium mt-2"},"All responses validated!",-1),e("p",{class:"text-sm opacity-70"}," No responses currently need manual validation. ",-1)])]))])]),v.value.show?(c(),d("div",va,[e("div",ma,[f[22]||(f[22]=e("h3",{class:"font-bold text-lg mb-4"},"Validate Response",-1)),(c(!0),d(U,null,W(v.value.response?.files??[],m=>(c(),d("div",null,[e("img",{src:m.file_url},null,8,ha)]))),256)),v.value.response?(c(),d("div",ga,[e("div",pa,[f[16]||(f[16]=e("i",{class:"mdi mdi-information-outline"},null,-1)),e("div",null,[e("div",ba,p(v.value.response.puzzle_name),1),f[15]||(f[15]=e("div",{class:"text-sm"},"Review and correct the OCR data below",-1))])]),e("div",ya,[e("div",_a,[f[18]||(f[18]=e("label",{class:"label"},[e("span",{class:"label-text"},"Puzzle")],-1)),de(e("select",{"onUpdate:modelValue":f[0]||(f[0]=m=>v.value.data.puzzle=m),class:"select select-bordered select-sm w-full"},[f[17]||(f[17]=e("option",{value:""},"Select puzzle...",-1)),(c(!0),d(U,null,W(q(s).puzzles,m=>(c(),d("option",{key:m.id,value:m.id},p(m.title),9,xa))),128))],512),[[Ht,v.value.data.puzzle]])]),e("div",wa,[f[19]||(f[19]=e("label",{class:"label"},[e("span",{class:"label-text"},"Cost")],-1)),de(e("input",{"onUpdate:modelValue":f[1]||(f[1]=m=>v.value.data.validated_cost=m),type:"text",class:"input input-bordered input-sm",placeholder:v.value.response.cost?.toString()||"Enter cost"},null,8,ka),[[$e,v.value.data.validated_cost]])]),e("div",$a,[f[20]||(f[20]=e("label",{class:"label"},[e("span",{class:"label-text"},"Cycles")],-1)),de(e("input",{"onUpdate:modelValue":f[2]||(f[2]=m=>v.value.data.validated_cycles=m),type:"text",class:"input input-bordered input-sm",placeholder:v.value.response.cycles?.toString()||"Enter cycles"},null,8,za),[[$e,v.value.data.validated_cycles]])]),e("div",Sa,[f[21]||(f[21]=e("label",{class:"label"},[e("span",{class:"label-text"},"Area")],-1)),de(e("input",{"onUpdate:modelValue":f[3]||(f[3]=m=>v.value.data.validated_area=m),type:"text",class:"input input-bordered input-sm",placeholder:v.value.response.area?.toString()||"Enter area"},null,8,Ca),[[$e,v.value.data.validated_area]])])]),e("div",Pa,[e("button",{onClick:S,class:"btn btn-ghost"}," Cancel "),e("button",{onClick:r,class:"btn btn-primary",disabled:i.value},[i.value?(c(),d("span",Ra)):L("",!0),E(" "+p(i.value?"Validating...":"Validate"),1)],8,La)]),e("div",Ea,[e("pre",null,[e("code",null,p(v.value),1)])])])):L("",!0)]),e("div",{class:"modal-backdrop",onClick:S})])):L("",!0)],64))}}),Ma={class:"mb-8"},Na={class:"grid grid-cols-1 lg:grid-cols-3 gap-8"},Aa={class:"lg:col-span-1"},Da={class:"card bg-base-100 shadow-lg sticky top-8"},ja={class:"card-body"},Ia={class:"text-center mb-6"},Ta={class:"text-3xl font-bold"},qa={key:0,class:"flex justify-center py-8"},Fa={key:1,class:"space-y-4"},Ua={class:"text-center"},Ba={key:0,class:"text-4xl font-bold text-primary"},Va={key:1,class:"text-2xl text-base-content/50"},Ga={class:"text-center"},Wa={class:"text-2xl font-bold"},Ha={class:"text-center"},Ja={class:"text-2xl font-bold"},Ka={class:"lg:col-span-2"},Ya={class:"card bg-base-100 shadow-lg"},Za={class:"card-body"},Qa={key:0,class:"flex justify-center py-8"},Xa={key:1,class:"text-center py-8"},er={key:2,class:"space-y-6"},tr={class:"tabs tabs-border"},sr={class:"space-y-4"},or={key:0,class:"text-center py-8"},nr={key:1,class:"overflow-x-auto"},ar={class:"table table-zebra w-full"},rr={class:"font-bold"},lr={class:"font-medium"},ir={key:0,class:"badge badge-warning"},cr={class:"text-right"},dr={class:"text-right font-bold"},ur={class:"space-y-6"},fr=["onClick"],vr={class:"ml-auto badge badge-sm"},mr={key:0,class:"card-body"},hr={key:0,class:"text-center py-8"},gr={key:1,class:"space-y-6"},pr={key:0,class:"bg-base-200 p-4 rounded-lg"},br={class:"grid grid-cols-3 gap-4"},yr={class:"text-center"},_r={class:"text-2xl font-bold text-primary"},xr={class:"text-center"},wr={class:"text-2xl font-bold text-primary"},kr={class:"text-center"},$r={class:"text-2xl font-bold text-primary"},zr={class:"grid grid-cols-1 md:grid-cols-3 gap-4"},Sr={class:"card-body p-4"},Cr={class:"text-xs text-base-content/70 font-bold"},Pr={class:"font-bold text-lg"},Lr={key:0,class:"badge badge-warning"},Rr={class:"space-y-2 text-sm"},Er={class:"flex justify-between"},Or={key:0,class:"text-xs text-base-content/60"},Mr={class:"badge badge-sm"},Nr={class:"flex justify-between"},Ar={key:0,class:"text-xs text-base-content/60"},Dr={class:"badge badge-sm"},jr={class:"flex justify-between"},Ir={key:0,class:"text-xs text-base-content/60"},Tr={class:"badge badge-sm"},qr={class:"flex justify-between pt-2 border-t"},Fr={class:"badge badge-sm"},Ur={class:"flex justify-between pt-2 border-t"},Br={class:"badge badge-primary"},Vr={class:"overflow-x-auto"},Gr={class:"table table-zebra w-full table-sm"},Wr={class:"text-center"},Hr={key:0,class:"text-xs text-base-content/60 block"},Jr={class:"text-center"},Kr={key:0,class:"text-xs text-base-content/60 block"},Yr={class:"text-center"},Zr={key:0,class:"text-xs text-base-content/60 block"},Qr={class:"font-bold"},Xr={key:0,class:"badge badge-warning"},el={key:1,class:"badge"},tl={key:2,class:"badge"},sl={key:3},ol={class:"font-medium"},nl={class:"text-center"},al={key:0,class:"badge badge-sm"},rl={key:1,class:"text-base-content/40"},ll={class:"text-center"},il={key:0,class:"badge badge-sm"},cl={key:1,class:"text-base-content/40"},dl={class:"text-center"},ul={key:0,class:"badge badge-sm"},fl={key:1,class:"text-base-content/40"},vl={class:"text-center"},ml={key:0,class:"badge badge-sm"},hl={key:1,class:"text-base-content/40"},gl={class:"text-right font-bold text-primary text-lg"},pl=ue({__name:"Results",setup(o){const a=O(!0),s=O(null),t=O("overall"),n=O(null),l=O({username:"Player",rank:null,totalPoints:0,puzzlesSolved:0,isStaff:!1}),i=async()=>{a.value=!0;try{const w=await fetch("/api/results/results");if(!w.ok)throw new Error("Failed to fetch results");s.value=await w.json()}catch(w){console.error("Error fetching results:",w)}finally{a.value=!1}},v=()=>s.value?s.value.users.map(r=>{const u=s.value.responses_by_userid[r.id]||[],_=u.reduce((f,m)=>f+(m.rank_points||0),0),h=u.length;return{user:r,totalPoints:_,puzzlesSolved:h}}).sort((r,u)=>u.totalPoints-r.totalPoints):[],g=w=>s.value?(s.value.ranking_by_puzzle[w]||[]).map(u=>({user:s.value.users.find(h=>h.id===u.user_id),cost:u.final_cost,cycles:u.final_cycles,area:u.final_area,points:u.points,rank_points:u.rank_points||0})).reverse():[],b=w=>{n.value=n.value===w?null:w},k=async()=>{try{const w=await fetch("/api/cache/clear",{method:"POST"});if(w.ok)alert("Cache cleared successfully!"),await i();else{const r=await w.json();alert(`Error clearing cache: ${r.detail||"Unknown error"}`)}}catch(w){console.error("Error clearing cache:",w),alert("Error clearing cache. Please try again.")}},S=async()=>{try{const w=await fetch("/api/user");if(w.ok){const r=await w.json();if(r.is_authenticated){l.value.username=r.username,l.value.isStaff=r.is_staff||!1,await i();const u=v(),_=u.findIndex(h=>h.user.id===r.id);_!==-1&&(l.value.rank=_+1,l.value.totalPoints=u[_].totalPoints,l.value.puzzlesSolved=u[_].puzzlesSolved)}}}catch(w){console.error("Error loading user data:",w),await i()}};return pe(()=>{S()}),(w,r)=>(c(),d("div",Ma,[e("div",Na,[e("div",Aa,[e("div",Da,[r[9]||(r[9]=e("div",{class:"bg-gradient-to-br from-purple-600 to-purple-400 p-6 text-white rounded-t-2xl"},[e("h3",{class:"text-3xl font-bold"},[e("i",{class:"mdi mdi-trophy text-3xl"}),E(" Your Ranking ")])],-1)),e("div",ja,[e("div",Ia,[r[2]||(r[2]=e("p",{class:"text-sm text-base-content/70"},"Player",-1)),e("p",Ta,p(l.value.username),1)]),r[8]||(r[8]=e("div",{class:"divider"},null,-1)),a.value?(c(),d("div",qa,[...r[3]||(r[3]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):(c(),d("div",Fa,[e("div",Ua,[r[4]||(r[4]=e("p",{class:"text-sm text-base-content/70 mb-1"},"Current Rank",-1)),l.value.rank!==null?(c(),d("p",Ba,[ce(ft,{rank:l.value.rank},null,8,["rank"])])):(c(),d("p",Va,"No rank yet"))]),e("div",Ga,[r[5]||(r[5]=e("p",{class:"text-sm text-base-content/70 mb-1"},"Total Points",-1)),e("p",Wa,p(l.value.totalPoints.toLocaleString()),1)]),e("div",Ha,[r[6]||(r[6]=e("p",{class:"text-sm text-base-content/70 mb-1"},"Puzzles Solved",-1)),e("p",Ja,p(l.value.puzzlesSolved),1)]),l.value.isStaff?(c(),d("button",{key:0,onClick:k,class:"btn btn-error btn-sm w-full mt-6"},[...r[7]||(r[7]=[e("i",{class:"mdi mdi-cache-clear mr-1"},null,-1),E(" Clear Cache ",-1)])])):L("",!0)]))])])]),e("div",Ka,[e("div",Ya,[e("div",Za,[r[37]||(r[37]=e("h2",{class:"card-title text-2xl mb-6"},[e("i",{class:"mdi mdi-trophy text-yellow-500 mr-2"}),E(" General Results ")],-1)),a.value?(c(),d("div",Qa,[...r[10]||(r[10]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):s.value?(c(),d("div",er,[e("div",tr,[e("button",{onClick:r[0]||(r[0]=u=>t.value="overall"),class:ne(["tab",t.value==="overall"?"tab-active":""])},[...r[12]||(r[12]=[e("i",{class:"mdi mdi-chart-line mr-2"},null,-1),E(" Overall Ranking ",-1)])],2),e("button",{onClick:r[1]||(r[1]=u=>t.value="byPuzzle"),class:ne(["tab",t.value==="byPuzzle"?"tab-active":""])},[...r[13]||(r[13]=[e("i",{class:"mdi mdi-puzzle mr-2"},null,-1),E(" By Puzzle ",-1)])],2)]),de(e("div",sr,[v().length===0?(c(),d("div",or,[...r[14]||(r[14]=[e("p",{class:"text-base-content/70"},"No submissions yet",-1)])])):(c(),d("div",nr,[e("table",ar,[r[15]||(r[15]=e("thead",null,[e("tr",null,[e("th",null,"Rank"),e("th",null,"Player"),e("th",{class:"text-right"},"Puzzles Solved"),e("th",{class:"text-right"},"Total Points")])],-1)),e("tbody",null,[(c(!0),d(U,null,W(v(),(u,_)=>(c(),d("tr",{key:u.user.username},[e("td",rr,[ce(ft,{rank:_+1},null,8,["rank"])]),e("td",lr,[E(p(u.user.username)+" ",1),u.user.is_staff?(c(),d("span",ir," admin ")):L("",!0)]),e("td",cr,p(u.puzzlesSolved),1),e("td",dr,p(u.totalPoints),1)]))),128))])])]))],512),[[ut,t.value==="overall"]]),de(e("div",ur,[(c(!0),d(U,null,W(s.value.puzzles,u=>(c(),d("div",{key:u.id,class:"card bg-base-100 border border-base-300"},[e("button",{onClick:_=>b(u.id),class:"btn btn-ghost btn-lg w-full justify-start text-lg font-bold hover:bg-primary/20 rounded-b-none"},[e("i",{class:ne(["mdi mr-2",n.value===u.id?"mdi-chevron-down":"mdi-chevron-right"])},null,2),E(" "+p(u.title)+" ",1),e("span",vr,p(g(u.id).length)+" submissions ",1)],8,fr),n.value===u.id?(c(),d("div",mr,[g(u.id).length===0?(c(),d("div",hr,[...r[16]||(r[16]=[e("p",{class:"text-base-content/70 text-lg"},"No submissions yet",-1)])])):(c(),d("div",gr,[u.points_factor?(c(),d("div",pr,[r[23]||(r[23]=e("p",{class:"text-sm text-base-content/70 mb-3 font-semibold"},"Points Coefficients",-1)),e("div",br,[e("div",yr,[e("span",_r,[r[17]||(r[17]=e("small",null,"x",-1)),E(p(u.points_factor.cost),1)]),r[18]||(r[18]=e("p",{class:"text-xs text-base-content/70"},"Cost",-1))]),e("div",xr,[e("span",wr,[r[19]||(r[19]=e("small",null,"x",-1)),E(p(u.points_factor.cycles),1)]),r[20]||(r[20]=e("p",{class:"text-xs text-base-content/70"},"Cycles",-1))]),e("div",kr,[e("span",$r,[r[21]||(r[21]=e("small",null,"x",-1)),E(p(u.points_factor.area),1)]),r[22]||(r[22]=e("p",{class:"text-xs text-base-content/70"},"Area",-1))])])])):L("",!0),e("div",zr,[(c(!0),d(U,null,W(g(u.id).slice(0,3),(_,h)=>(c(),d("div",{key:h,class:"card bg-base-200"},[e("div",Sr,[e("div",Cr,p(h===0?"🏆 1st Place":h===1?"🥈 2nd Place":"🥉 3rd Place"),1),e("h4",Pr,[E(p(_.user.username)+" ",1),_.user.is_staff?(c(),d("span",Lr," admin ")):L("",!0)]),r[29]||(r[29]=e("div",{class:"divider my-2"},null,-1)),e("div",Rr,[e("div",Er,[e("span",null,[r[24]||(r[24]=E("Cost",-1)),u.points_factor?(c(),d("span",Or," (x"+p(u.points_factor.cost)+") ",1)):L("",!0)]),e("span",Mr,p(_.cost||"N/A"),1)]),e("div",Nr,[e("span",null,[r[25]||(r[25]=E("Cycles",-1)),u.points_factor?(c(),d("span",Ar," (x"+p(u.points_factor.cycles)+") ",1)):L("",!0)]),e("span",Dr,p(_.cycles||"N/A"),1)]),e("div",jr,[e("span",null,[r[26]||(r[26]=E("Area",-1)),u.points_factor?(c(),d("span",Ir," (x"+p(u.points_factor.area)+") ",1)):L("",!0)]),e("span",Tr,p(_.area||"N/A"),1)]),e("div",qr,[r[27]||(r[27]=e("span",null,"Total (with coef.)",-1)),e("span",Fr,p(_.points||"N/A"),1)]),e("div",Ur,[r[28]||(r[28]=e("span",{class:"font-bold"},"Points",-1)),e("span",Br,p(_.rank_points)+" pts",1)])])])]))),128))]),e("div",Vr,[e("table",Gr,[e("thead",null,[e("tr",null,[r[33]||(r[33]=e("th",{class:"w-12"},"Rank",-1)),r[34]||(r[34]=e("th",null,"Player",-1)),e("th",Wr,[r[30]||(r[30]=E(" Cost ",-1)),u.points_factor?(c(),d("span",Hr,"(x"+p(u.points_factor.cost)+")",1)):L("",!0)]),e("th",Jr,[r[31]||(r[31]=E(" Cycles ",-1)),u.points_factor?(c(),d("span",Kr,"(x"+p(u.points_factor.cycles)+")",1)):L("",!0)]),e("th",Yr,[r[32]||(r[32]=E(" Area ",-1)),u.points_factor?(c(),d("span",Zr,"(x"+p(u.points_factor.area)+")",1)):L("",!0)]),r[35]||(r[35]=e("th",{class:"text-center"},"Total (with coef.)",-1)),r[36]||(r[36]=e("th",{class:"text-right"},"Points",-1))])]),e("tbody",null,[(c(!0),d(U,null,W(g(u.id),(_,h)=>(c(),d("tr",{key:h,class:ne({"bg-primary/10":h<3})},[e("td",Qr,[h===0?(c(),d("span",Xr,"🏆")):h===1?(c(),d("span",el,"🥈")):h===2?(c(),d("span",tl,"🥉")):(c(),d("span",sl,"#"+p(h+1),1))]),e("td",ol,p(_.user.username),1),e("td",nl,[_.cost?(c(),d("span",al,p(_.cost),1)):(c(),d("span",rl,"—"))]),e("td",ll,[_.cycles?(c(),d("span",il,p(_.cycles),1)):(c(),d("span",cl,"—"))]),e("td",dl,[_.area?(c(),d("span",ul,p(_.area),1)):(c(),d("span",fl,"—"))]),e("td",vl,[_.points?(c(),d("span",ml,p(_.points),1)):(c(),d("span",hl,"—"))]),e("td",gl,p(_.rank_points),1)],2))),128))])])])]))])):L("",!0)]))),128))],512),[[ut,t.value==="byPuzzle"]])])):(c(),d("div",Xa,[...r[11]||(r[11]=[e("p",{class:"text-base-content/70"},"No results available yet",-1)])]))])])])])]))}}),bl={class:"card bg-base-100 shadow-lg"},yl={class:"card-body"},_l={key:0,class:"flex justify-center py-12"},xl={key:1,class:"alert alert-error"},wl={key:2,class:"text-center py-8"},kl={key:3,class:"overflow-x-auto"},$l={class:"table table-zebra"},zl={class:"font-semibold"},Sl={class:"text-right"},Cl={class:"text-right"},Pl={class:"text-right"},Ll={class:"text-right font-bold"},Rl={class:"text-right font-bold text-primary"},El={class:"text-center"},Ol=["onClick"],Ml={key:1,class:"text-base-content/50"},Nl={key:0,class:"modal modal-open"},Al={class:"modal-box max-w-7xl w-full"},Dl={class:"flex justify-between items-center mb-4"},jl={class:"font-bold text-lg"},Il={class:"flex justify-center bg-base-200 rounded-lg p-4"},Tl=["src","alt"],ql={class:"modal-action mt-4"},Fl=["href"],Ul=ue({__name:"Winners",setup(o){const a=O(!0),s=O(null),t=O(""),n=O(!1),l=O(""),i=O(""),v=async()=>{a.value=!0,t.value="";try{const w=await te.getTopSubmissions(5);w.data?s.value=w.data:w.error&&(t.value=w.error,console.error("Error fetching submissions:",w.error))}catch(w){t.value=w instanceof Error?w.message:"Failed to fetch submissions",console.error("Error fetching submissions:",w)}finally{a.value=!1}},g=w=>w!==void 0?w.toLocaleString():"—",b=se(()=>{if(!s.value)return[];const w=[];return s.value.submissions.forEach(r=>{r.submissions.forEach(u=>{w.push({puzzleName:r.puzzle_title,username:u.username,cost:u.final_cost,cycles:u.final_cycles,area:u.final_area,total:u.rank_points,totalCoef:u.total_coef,files:u.files.map(_=>({url:_.file_url,name:_.original_filename}))})})}),w.sort((r,u)=>(u.total||0)-(r.total||0))}),k=(w,r)=>{l.value=w,i.value=r,n.value=!0},S=()=>{n.value=!1,l.value="",i.value=""};return pe(()=>{v()}),(w,r)=>(c(),d(U,null,[e("div",bl,[e("div",yl,[r[5]||(r[5]=e("h2",{class:"card-title text-2xl flex items-center gap-2"},[e("i",{class:"mdi mdi-trophy text-yellow-500 text-3xl"}),E(" Top Submissions ")],-1)),a.value?(c(),d("div",_l,[...r[0]||(r[0]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):t.value?(c(),d("div",xl,[r[1]||(r[1]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",null,p(t.value),1)])):b.value.length===0?(c(),d("div",wl,[...r[2]||(r[2]=[e("p",{class:"text-base-content/70"},"No results available yet.",-1)])])):(c(),d("div",kl,[e("table",$l,[r[4]||(r[4]=e("thead",null,[e("tr",null,[e("th",null,"Puzzle"),e("th",null,"User"),e("th",{class:"text-right"},"Cost"),e("th",{class:"text-right"},"Cycles"),e("th",{class:"text-right"},"Area"),e("th",{class:"text-right"},"Total Pts"),e("th",{class:"text-right"},"Total Coef"),e("th",{class:"text-center"},"GIF")])],-1)),e("tbody",null,[(c(!0),d(U,null,W(b.value,(u,_)=>(c(),d("tr",{key:_},[e("td",zl,p(u.puzzleName),1),e("td",null,p(u.username),1),e("td",Sl,p(g(u.cost)),1),e("td",Cl,p(g(u.cycles)),1),e("td",Pl,p(g(u.area)),1),e("td",Ll,p(g(u.total)),1),e("td",Rl,p(g(u.totalCoef)),1),e("td",El,[u.files.length>0?(c(),d("button",{key:0,onClick:h=>k(u.files[0].url,u.files[0].name),class:"btn btn-xs btn-primary gap-1"},[...r[3]||(r[3]=[e("i",{class:"mdi mdi-image"},null,-1),E(" View ",-1)])],8,Ol)):(c(),d("span",Ml,"—"))])]))),128))])])]))])]),n.value?(c(),d("div",Nl,[e("div",Al,[e("div",Dl,[e("h3",jl,p(i.value),1),e("button",{onClick:S,class:"btn btn-sm btn-circle btn-ghost"},[...r[6]||(r[6]=[e("i",{class:"mdi mdi-close"},null,-1)])])]),e("div",Il,[e("img",{src:l.value,alt:i.value,class:"object-contain"},null,8,Tl)]),e("div",ql,[e("a",{href:l.value,target:"_blank",class:"btn btn-primary btn-sm"},[...r[7]||(r[7]=[e("i",{class:"mdi mdi-download"},null,-1),E(" Download ",-1)])],8,Fl),e("button",{onClick:S,class:"btn btn-sm"},"Close")])]),e("div",{class:"modal-backdrop",onClick:S})])):L("",!0)],64))}}),Bl={class:"card bg-base-100 shadow-lg"},Vl={class:"card-body"},Gl={key:0,class:"flex justify-center py-12"},Wl={key:1,class:"alert alert-error"},Hl={key:2,class:"text-center py-8"},Jl={key:3,class:"space-y-8"},Kl={class:"mb-4"},Yl={key:0,class:"bg-base-200 p-3 rounded-lg mb-4"},Zl={class:"grid grid-cols-3 gap-2"},Ql={class:"text-center"},Xl={class:"font-bold text-primary"},ei={class:"text-center"},ti={class:"font-bold text-primary"},si={class:"text-center"},oi={class:"font-bold text-primary"},ni={key:1,class:"bg-base-200 p-4 rounded-lg"},ai={class:"flex flex-wrap justify-center gap-6"},ri={key:0,class:"text-center w-96"},li={class:"text-sm text-base-content/70 mb-3 font-semibold truncate"},ii=["onClick"],ci=["src","alt"],di={key:0,class:"overflow-x-auto"},ui={class:"table table-sm table-zebra"},fi={class:"text-center text-lg font-bold"},vi={class:"font-semibold"},mi={class:"text-right"},hi={class:"text-right"},gi={class:"text-right"},pi={class:"text-right font-bold text-primary"},bi={class:"text-center"},yi=["onClick"],_i={key:1,class:"text-base-content/50"},xi={key:1,class:"p-4 bg-base-200 rounded-lg text-center text-base-content/70"},wi={key:0,class:"modal modal-open"},ki={class:"modal-box max-w-7xl w-full"},$i={class:"flex justify-between items-center mb-4"},zi={class:"font-bold text-lg"},Si={class:"flex justify-center bg-base-200 rounded-lg p-4"},Ci=["src","alt"],Pi={class:"modal-action mt-4"},Li=["href"],Ri=ue({__name:"PuzzleResults",setup(o){const a=O(!0),s=O(null),t=O(""),n=O(!1),l=O(""),i=O(""),v=async()=>{a.value=!0,t.value="";try{const r=await te.getPuzzleResults(5);r.data?s.value=r.data:r.error&&(t.value=r.error,console.error("Error fetching results:",r.error))}catch(r){t.value=r instanceof Error?r.message:"Failed to fetch results",console.error("Error fetching results:",r)}finally{a.value=!1}},g=r=>r!==void 0?r.toLocaleString():"—",b=(r,u)=>{l.value=r,i.value=u,n.value=!0},k=()=>{n.value=!1,l.value="",i.value=""},S=r=>["🥇","🥈","🥉"][r-1]||`#${r}`,w=r=>{if(!r.submissions||r.submissions.length===0)return[];const u=r.submissions[0].rank_points;return r.submissions.filter(_=>_.rank_points===u)};return pe(()=>{v()}),(r,u)=>(c(),d(U,null,[e("div",Bl,[e("div",Vl,[u[13]||(u[13]=e("h2",{class:"card-title text-2xl flex items-center gap-2"},[e("i",{class:"mdi mdi-table text-blue-500 text-3xl"}),E(" Results by Puzzle ")],-1)),a.value?(c(),d("div",Gl,[...u[0]||(u[0]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):t.value?(c(),d("div",Wl,[u[1]||(u[1]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",null,p(t.value),1)])):!s.value||s.value.results.length===0?(c(),d("div",Hl,[...u[2]||(u[2]=[e("p",{class:"text-base-content/70"},"No results available yet.",-1)])])):(c(),d("div",Jl,[(c(!0),d(U,null,W(s.value.results,_=>(c(),d("div",{key:_.puzzle_id,class:"border-b pb-8 last:border-b-0"},[e("div",Kl,[_.points_factor?(c(),d("div",Yl,[u[9]||(u[9]=e("p",{class:"text-xs text-base-content/70 font-semibold mb-2"},"Points Coefficients",-1)),e("div",Zl,[e("div",Ql,[e("span",Xl,[u[3]||(u[3]=e("small",null,"x",-1)),E(p(_.points_factor.cost),1)]),u[4]||(u[4]=e("p",{class:"text-xs text-base-content/70"},"Cost",-1))]),e("div",ei,[e("span",ti,[u[5]||(u[5]=e("small",null,"x",-1)),E(p(_.points_factor.cycles),1)]),u[6]||(u[6]=e("p",{class:"text-xs text-base-content/70"},"Cycles",-1))]),e("div",si,[e("span",oi,[u[7]||(u[7]=e("small",null,"x",-1)),E(p(_.points_factor.area),1)]),u[8]||(u[8]=e("p",{class:"text-xs text-base-content/70"},"Area",-1))])])])):L("",!0),_.submissions.length>0&&w(_).length>0?(c(),d("div",ni,[u[10]||(u[10]=e("p",{class:"text-xs text-base-content/70 font-semibold mb-3 text-center"},"🏆 Winning Solutions",-1)),e("div",ai,[(c(!0),d(U,null,W(w(_),h=>(c(),d(U,{key:`${_.puzzle_id}-${h.user_id}`},[h&&h.files&&h.files.length>0?(c(),d("div",ri,[e("div",li,p(h.username),1),e("button",{onClick:f=>b(h.files[0].file_url,h.files[0].original_filename),class:"hover:opacity-80 transition-opacity cursor-pointer w-full flex items-center justify-center"},[e("img",{src:h.files[0].file_url,alt:`${_.puzzle_title} - ${h.username}`,class:"max-h-full max-w-full object-contain"},null,8,ci)],8,ii)])):L("",!0)],64))),128))])])):L("",!0)]),_.submissions.length>0?(c(),d("div",di,[e("table",ui,[u[12]||(u[12]=e("thead",null,[e("tr",null,[e("th",{class:"w-12 text-center"},"Pos"),e("th",null,"User"),e("th",{class:"text-right"},"Cost"),e("th",{class:"text-right"},"Cycles"),e("th",{class:"text-right"},"Area"),e("th",{class:"text-right font-bold"},"Total Pts"),e("th",{class:"text-right font-bold"},"Total Coef"),e("th",{class:"text-center"},"GIF")])],-1)),e("tbody",null,[(c(!0),d(U,null,W(_.submissions,h=>(c(),d("tr",{key:`${_.puzzle_id}-${h.user_id}`},[e("td",fi,p(S(h.rank)),1),e("td",vi,p(h.username),1),e("td",mi,p(g(h.final_cost)),1),e("td",hi,p(g(h.final_cycles)),1),e("td",gi,p(g(h.final_area)),1),e("td",{class:ne(["text-right font-bold",{"text-yellow-600":h.rank===1,"text-gray-600":h.rank===2,"text-orange-600":h.rank===3}])},p(g(h.rank_points)),3),e("td",pi,p(g(h.total_coef)),1),e("td",bi,[h.files.length>0?(c(),d("button",{key:0,onClick:f=>b(h.files[0].file_url,h.files[0].original_filename),class:"btn btn-xs btn-primary gap-1"},[...u[11]||(u[11]=[e("i",{class:"mdi mdi-image"},null,-1),E(" View ",-1)])],8,yi)):(c(),d("span",_i,"—"))])]))),128))])])])):(c(),d("div",xi," No submissions yet "))]))),128))]))])]),n.value?(c(),d("div",wi,[e("div",ki,[e("div",$i,[e("h3",zi,p(i.value),1),e("button",{onClick:k,class:"btn btn-sm btn-circle btn-ghost"},[...u[14]||(u[14]=[e("i",{class:"mdi mdi-close"},null,-1)])])]),e("div",Si,[e("img",{src:l.value,alt:i.value,class:"object-contain"},null,8,Ci)]),e("div",Pi,[e("a",{href:l.value,target:"_blank",class:"btn btn-primary btn-sm"},[...u[15]||(u[15]=[e("i",{class:"mdi mdi-download"},null,-1),E(" Download ",-1)])],8,Li),e("button",{onClick:k,class:"btn btn-sm"},"Close")])]),e("div",{class:"modal-backdrop",onClick:k})])):L("",!0)],64))}}),Ei={class:"card bg-base-100 shadow-lg"},Oi={class:"card-body"},Mi={key:0,class:"flex justify-center py-12"},Ni={key:1,class:"alert alert-error"},Ai={key:2,class:"text-center py-8"},Di={key:3,class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-3"},ji={class:"text-3xl font-bold mb-2"},Ii={class:"font-semibold text-sm mb-2 truncate"},Ti={class:"text-2xl font-bold text-primary"},qi=ue({__name:"TopUsersLeaderboard",setup(o){const a=O(!0),s=O(null),t=O(""),n=async()=>{a.value=!0,t.value="";try{const i=await te.getPuzzleResults(100);i.data?s.value=i.data:i.error&&(t.value=i.error,console.error("Error fetching results:",i.error))}catch(i){t.value=i instanceof Error?i.message:"Failed to fetch results",console.error("Error fetching results:",i)}finally{a.value=!1}},l=()=>{if(!s.value)return[];const i={};return s.value.results.forEach(v=>{v.submissions.forEach(g=>{const b=g.user_id;i[b]||(i[b]={username:g.username,user_id:g.user_id,total_points:0}),i[b].total_points+=g.rank_points||0})}),Object.values(i).sort((v,g)=>g.total_points-v.total_points).slice(0,10)};return pe(()=>{n()}),(i,v)=>(c(),d("div",Ei,[e("div",Oi,[v[3]||(v[3]=e("h2",{class:"card-title text-2xl flex items-center gap-2"},[e("i",{class:"mdi mdi-podium text-yellow-500 text-3xl"}),E(" Top 10 Users ")],-1)),a.value?(c(),d("div",Mi,[...v[0]||(v[0]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):t.value?(c(),d("div",Ni,[v[1]||(v[1]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",null,p(t.value),1)])):l().length===0?(c(),d("div",Ai,[...v[2]||(v[2]=[e("p",{class:"text-base-content/70"},"No results available yet.",-1)])])):(c(),d("div",Di,[(c(!0),d(U,null,W(l(),(g,b)=>(c(),d("div",{key:g.user_id,class:ne(["bg-base-200 p-4 rounded-lg text-center",{"ring-2 ring-yellow-500":b===0,"ring-2 ring-gray-400":b===1,"ring-2 ring-orange-400":b===2}])},[e("div",ji,p(b===0?"🥇":b===1?"🥈":b===2?"🥉":`#${b+1}`),1),e("div",Ii,p(g.username),1),e("div",Ti,p(g.total_points)+" pts",1)],2))),128))]))])]))}});function qt(o,a){return Gt()?(Wt(o,a),!0):!1}const Ft=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;function Fi(o,a=1e3,s={}){const{immediate:t=!0,immediateCallback:n=!1}=s;let l=null;const i=Jt(!1);function v(){l&&(clearInterval(l),l=null)}function g(){i.value=!1,v()}function b(){const k=ze(a);k<=0||(i.value=!0,n&&o(),v(),i.value&&(l=setInterval(o,k)))}return t&&Ft&&b(),(ge(a)||typeof a=="function")&&qt(Ce(a,()=>{i.value&&Ft&&b()})),qt(g),{isActive:bs(i),pause:g,resume:b}}function Ui(o,a){var s,t;const n=Jt(ze(o)),l=Fi(()=>{var k;const S=n.value-1;if(n.value=S<0?0:S,a==null||(k=a.onTick)===null||k===void 0||k.call(a),n.value<=0){var w;l.pause(),a==null||(w=a.onComplete)===null||w===void 0||w.call(a)}},(s=a?.interval)!==null&&s!==void 0?s:1e3,{immediate:(t=a?.immediate)!==null&&t!==void 0?t:!1}),i=k=>{var S;n.value=(S=ze(k))!==null&&S!==void 0?S:ze(o)},v=()=>{l.pause(),i()},g=()=>{l.isActive.value||n.value>0&&l.resume()};return{remaining:n,reset:i,stop:v,start:k=>{i(k),l.resume()},pause:l.pause,resume:g,isActive:l.isActive}}const Bi={class:"min-h-screen bg-base-200"},Vi={class:"navbar bg-base-100 shadow-lg"},Gi={class:"container min-w-3/4 mx-auto w-full flex items-center gap-4"},Wi={class:"flex items-center gap-4"},Hi={key:0,class:"flex items-center gap-2"},Ji={class:"text-sm"},Ki={class:"font-medium"},Yi={key:0,class:"badge badge-warning badge-xs ml-1"},Zi={key:1,class:"text-sm text-base-content/70"},Qi={class:"container min-w-3/4 mx-auto px-4 py-8"},Xi={key:0,class:"flex justify-center"},ec={class:"text-center"},tc={class:"mb-6 text-base-content/70"},sc={key:1,class:"flex justify-center items-center min-h-[400px]"},oc={key:2,class:"alert alert-error max-w-2xl mx-auto"},nc={class:"text-sm"},ac={key:3,class:"space-y-8"},rc={key:0,class:"space-y-8"},lc={class:"mb-8"},ic={class:"card bg-base-100 shadow-lg"},cc={class:"card-body"},dc={class:"card-title text-2xl"},uc={class:"text-base-content/70"},fc={class:"flex flex-wrap gap-4 mt-4"},vc=["disabled"],mc={key:0,class:"alert alert-warning mt-4"},hc={key:0},gc={class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"},pc={key:1,class:"text-center py-12"},bc={key:0,class:"modal modal-open"},yc={class:"modal-box max-w-6xl"},_c={class:"flex justify-between items-center mb-4"},xc=ue({__name:"OpusMagnum",props:{collectionTitle:{},collectionUrl:{},collectionDescription:{}},setup(o){const a=o,s=Le(),t=lt(),{submissions:n,isSubmissionModalOpen:l}=rt(t),{openSubmissionModal:i,loadSubmissions:v,closeSubmissionModal:g}=t,b=O(null),k=O(null),S=O(!0),w=O(""),r=se(()=>b.value?.is_superuser||!1),u=se(()=>!!(k.value&&!k.value.accepting_submissions)),_=se(()=>{const F={};return n.value.forEach(C=>{C.responses.forEach(R=>{F[R.puzzle_id]||(F[R.puzzle_id]=[]),F[R.puzzle_id].push(R)})}),F});async function h(){try{S.value=!0,w.value="",console.log("Starting data load..."),console.log("Loading user info...");const F=await te.getUserInfo();F.data?(b.value=F.data,console.log("User info loaded:",F.data)):F.error&&console.warn("User info error:",F.error),console.log("Loading collection...");const C=await te.getCollection();C.data?(k.value=C.data,console.log("Collection loaded:",C.data)):C.error&&console.warn("Collection error:",C.error),console.log("Loading puzzles..."),await s.loadPuzzles(),console.log("Puzzles loaded:",s.puzzles.length),console.log("Loading submissions..."),await v(),console.log("Submissions loaded:",n.value.length),console.log("Data load complete!")}catch(F){w.value=Xt.getErrorMessage(F),console.error("Failed to load data:",F)}finally{S.value=!1,console.log("Loading state set to false")}b.value?.is_superuser&&m()}const{remaining:f,start:m}=Ui(60,{onComplete(){h()}});pe(async()=>{await h()});const y=F=>s.findPuzzleByName(F),M=()=>{window.location.reload()},D=()=>{window.location.href="/"};return(F,C)=>(c(),d("div",Bi,[e("div",Vi,[e("div",Gi,[e("button",{onClick:D,class:"btn btn-primary btn-sm"},[...C[3]||(C[3]=[e("i",{class:"mdi mdi-arrow-left"},null,-1),E(" Back ",-1)])]),C[6]||(C[6]=e("h1",{class:"text-xl font-bold"},"Opus Magnum Puzzle Submitter",-1)),C[7]||(C[7]=e("div",{class:"flex-1"},null,-1)),e("div",Wi,[b.value?.is_authenticated?(c(),d("div",Hi,[e("div",Ji,[e("span",Ki,p(b.value.username),1),b.value.is_superuser?(c(),d("span",Yi,"Admin")):L("",!0)])])):(c(),d("div",Zi,"Not logged in")),C[4]||(C[4]=e("a",{href:"/api/docs",class:"btn btn-xs"},"API docs",-1)),C[5]||(C[5]=e("a",{href:"/admin",class:"btn btn-xs btn-warning"},"Admin panel",-1))])])]),e("div",Qi,[b.value?.is_superuser?(c(),d("div",Xi,[e("div",ec,[e("p",tc,[C[8]||(C[8]=e("span",{class:"loading loading-spinner loading-lg"},null,-1)),E(" Auto reload page in "+p(q(f))+" seconds ... ",1)])])])):L("",!0),S.value?(c(),d("div",sc,[...C[9]||(C[9]=[e("div",{class:"text-center"},[e("span",{class:"loading loading-spinner loading-lg"}),e("p",{class:"mt-4 text-base-content/70"},"Loading puzzles...")],-1)])])):w.value?(c(),d("div",oc,[C[12]||(C[12]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",null,[C[10]||(C[10]=e("h3",{class:"font-bold"},"Error Loading Data",-1)),e("div",nc,p(w.value),1)]),e("button",{onClick:M,class:"btn btn-sm btn-outline"},[...C[11]||(C[11]=[e("i",{class:"mdi mdi-refresh mr-1"},null,-1),E(" Retry ",-1)])])])):(c(),d("div",ac,[u.value?(c(),d("div",rc,[ce(qi),ce(Ri),ce(Ul)])):(c(),d(U,{key:1},[e("div",lc,[e("div",ic,[e("div",cc,[e("h2",dc,p(a.collectionTitle),1),e("p",uc,p(a.collectionDescription),1),e("div",fc,[e("button",{onClick:C[0]||(C[0]=(...R)=>q(i)&&q(i)(...R)),class:"btn btn-primary",disabled:u.value},[...C[13]||(C[13]=[e("i",{class:"mdi mdi-plus mr-2"},null,-1),E(" Submit Solution ",-1)])],8,vc)]),u.value?(c(),d("div",mc,[...C[14]||(C[14]=[e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1),e("div",null,[e("h3",{class:"font-bold"},"Tournament Closed"),e("div",{class:"text-sm"},"This tournament is no longer accepting new submissions.")],-1)])])):L("",!0)])])]),ce(pl),r.value?(c(),d("div",hc,[ce(Oa)])):L("",!0),e("div",gc,[(c(!0),d(U,null,W(q(s).puzzles,R=>(c(),ys(uo,{key:R.id,puzzle:R,responses:_.value[R.id]||[]},null,8,["puzzle","responses"]))),128))]),q(s).puzzles.length===0?(c(),d("div",pc,[...C[15]||(C[15]=[e("div",{class:"text-6xl mb-4"},"🧩",-1),e("h3",{class:"text-xl font-bold mb-2"},"No Puzzles Available",-1),e("p",{class:"text-base-content/70"}," Check back later for new puzzle collections! ",-1)])])):L("",!0)],64))]))]),q(l)?(c(),d("div",bc,[e("div",yc,[e("div",_c,[C[17]||(C[17]=e("h3",{class:"font-bold text-lg"},"Submit Solution",-1)),e("button",{onClick:C[1]||(C[1]=(...R)=>q(g)&&q(g)(...R)),class:"btn btn-sm btn-circle btn-ghost"},[...C[16]||(C[16]=[e("i",{class:"mdi mdi-close"},null,-1)])])]),ce(Un,{puzzles:q(s).puzzles,"find-puzzle-by-name":y},null,8,["puzzles"])]),e("div",{class:"modal-backdrop",onClick:C[2]||(C[2]=(...R)=>q(g)&&q(g)(...R))})])):L("",!0)]))}}),wc=xs(),ns="#app",kc=document.querySelector(ns),as=_s(xc,{...kc?.dataset});as.use(wc);as.mount(ns);
diff --git a/polylan_submitter/static_source/vite/assets/opus_magnum-Ce7rjJAF.js b/polylan_submitter/static_source/vite/assets/opus_magnum-Ce7rjJAF.js
new file mode 100644
index 0000000..f08d808
--- /dev/null
+++ b/polylan_submitter/static_source/vite/assets/opus_magnum-Ce7rjJAF.js
@@ -0,0 +1,5 @@
+import{e as Ut,r as O,m as Bt,t as Vt,c as se,i as ge,a as nt,b as us,d as fs,h as vs,f as hs,g as Gt,o as Wt,w as Ce,n as Se,j as ms,k as ue,l as d,p as c,q as ne,s as e,u as L,v as p,x as E,F as U,y as W,z as q,A as et,B as gs,C as de,D as Ht,E as ce,G as $e,H as ps,I as pe,J as ut,K as Jt,L as bs,M as ze,N as ys,O as _s}from"./style-C9QoPxDN.js";import{_ as ft}from"./RankBadge.vue_vue_type_script_setup_true_lang-CiUtgtLU.js";/*!
+ * pinia v3.0.3
+ * (c) 2025 Eduardo San Martin Morote
+ * @license MIT
+ */let Kt;const Pe=o=>Kt=o,Yt=Symbol();function tt(o){return o&&typeof o=="object"&&Object.prototype.toString.call(o)==="[object Object]"&&typeof o.toJSON!="function"}var we;(function(o){o.direct="direct",o.patchObject="patch object",o.patchFunction="patch function"})(we||(we={}));function xs(){const o=Ut(!0),a=o.run(()=>O({}));let s=[],t=[];const n=Bt({install(r){Pe(n),n._a=r,r.provide(Yt,n),r.config.globalProperties.$pinia=n,t.forEach(i=>s.push(i)),t=[]},use(r){return this._a?s.push(r):t.push(r),this},_p:s,_a:null,_e:o,_s:new Map,state:a});return n}const Zt=()=>{};function vt(o,a,s,t=Zt){o.push(a);const n=()=>{const r=o.indexOf(a);r>-1&&(o.splice(r,1),t())};return!s&&Gt()&&Wt(n),n}function me(o,...a){o.slice().forEach(s=>{s(...a)})}const ws=o=>o(),ht=Symbol(),Ee=Symbol();function st(o,a){o instanceof Map&&a instanceof Map?a.forEach((s,t)=>o.set(t,s)):o instanceof Set&&a instanceof Set&&a.forEach(o.add,o);for(const s in a){if(!a.hasOwnProperty(s))continue;const t=a[s],n=o[s];tt(n)&&tt(t)&&o.hasOwnProperty(s)&&!ge(t)&&!nt(t)?o[s]=st(n,t):o[s]=t}return o}const ks=Symbol();function $s(o){return!tt(o)||!Object.prototype.hasOwnProperty.call(o,ks)}const{assign:ve}=Object;function zs(o){return!!(ge(o)&&o.effect)}function Ss(o,a,s,t){const{state:n,actions:r,getters:i}=a,v=s.state.value[o];let g;function b(){v||(s.state.value[o]=n?n():{});const k=ms(s.state.value[o]);return ve(k,r,Object.keys(i||{}).reduce((S,w)=>(S[w]=Bt(se(()=>{Pe(s);const l=s._s.get(o);return i[w].call(l,l)})),S),{}))}return g=Qt(o,b,a,s,t,!0),g}function Qt(o,a,s={},t,n,r){let i;const v=ve({actions:{}},s),g={deep:!0};let b,k,S=[],w=[],l;const u=t.state.value[o];!r&&!u&&(t.state.value[o]={}),O({});let y;function m(R){let j;b=k=!1,typeof R=="function"?(R(t.state.value[o]),j={type:we.patchFunction,storeId:o,events:l}):(st(t.state.value[o],R),j={type:we.patchObject,payload:R,storeId:o,events:l});const B=y=Symbol();Se().then(()=>{y===B&&(b=!0)}),k=!0,me(S,j,t.state.value[o])}const f=r?function(){const{state:j}=s,B=j?j():{};this.$patch(Y=>{ve(Y,B)})}:Zt;function h(){i.stop(),S=[],w=[],t._s.delete(o)}const _=(R,j="")=>{if(ht in R)return R[Ee]=j,R;const B=function(){Pe(t);const Y=Array.from(arguments),le=[],fe=[];function be(V){le.push(V)}function oe(V){fe.push(V)}me(w,{args:Y,name:B[Ee],store:D,after:be,onError:oe});let ae;try{ae=R.apply(this&&this.$id===o?this:D,Y)}catch(V){throw me(fe,V),V}return ae instanceof Promise?ae.then(V=>(me(le,V),V)).catch(V=>(me(fe,V),Promise.reject(V))):(me(le,ae),ae)};return B[ht]=!0,B[Ee]=j,B},M={_p:t,$id:o,$onAction:vt.bind(null,w),$patch:m,$reset:f,$subscribe(R,j={}){const B=vt(S,R,j.detached,()=>Y()),Y=i.run(()=>Ce(()=>t.state.value[o],le=>{(j.flush==="sync"?k:b)&&R({storeId:o,type:we.direct,events:l},le)},ve({},g,j)));return B},$dispose:h},D=hs(M);t._s.set(o,D);const C=(t._a&&t._a.runWithContext||ws)(()=>t._e.run(()=>(i=Ut()).run(()=>a({action:_}))));for(const R in C){const j=C[R];if(ge(j)&&!zs(j)||nt(j))r||(u&&$s(j)&&(ge(j)?j.value=u[R]:st(j,u[R])),t.state.value[o][R]=j);else if(typeof j=="function"){const B=_(j,R);C[R]=B,v.actions[R]=j}}return ve(D,C),ve(Vt(D),C),Object.defineProperty(D,"$state",{get:()=>t.state.value[o],set:R=>{m(j=>{ve(j,R)})}}),t._p.forEach(R=>{ve(D,i.run(()=>R({store:D,app:t._a,pinia:t,options:v})))}),u&&r&&s.hydrate&&s.hydrate(D.$state,u),b=!0,k=!0,D}/*! #__NO_SIDE_EFFECTS__ */function at(o,a,s){let t;const n=typeof a=="function";t=n?s:a;function r(i,v){const g=vs();return i=i||(g?fs(Yt,null):null),i&&Pe(i),i=Kt,i._s.has(o)||(n?Qt(o,a,t,i):Ss(o,t,i)),i._s.get(o)}return r.$id=o,r}function lt(o){const a=Vt(o),s={};for(const t in a){const n=a[t];n.effect?s[t]=se({get:()=>o[t],set(r){o[t]=r}}):(ge(n)||nt(n))&&(s[t]=us(o,t))}return s}const mt="/api";class Cs{async request(a,s={}){try{const t=await fetch(`${mt}${a}`,{headers:{"Content-Type":"application/json",...s.headers},...s}),n=await t.json();return t.ok?{data:n,status:t.status}:{error:n.detail||`HTTP ${t.status}`,status:t.status}}catch(t){return{error:t instanceof Error?t.message:"Network error",status:0}}}async uploadRequest(a,s){try{const t=await fetch(`${mt}${a}`,{method:"POST",body:s}),n=await t.json();return t.ok?{data:n,status:t.status}:{error:n.detail||`HTTP ${t.status}`,status:t.status}}catch(t){return{error:t instanceof Error?t.message:"Network error",status:0}}}async getPuzzles(){return this.request("/submissions/puzzles")}async getCollection(){return this.request("/submissions/collection")}async getTopSubmissions(a=5){return this.request(`/results/top-submissions?limit=${a}`)}async getPuzzleResults(a=5){return this.request(`/results/puzzle-results?limit=${a}`)}async getSubmissions(a=20,s=0){return this.request(`/submissions/submissions?limit=${a}&offset=${s}`)}async getSubmission(a){return this.request(`/submissions/submissions/${a}`)}async createSubmission(a,s){const t=new FormData;return t.append("data",JSON.stringify(a)),s.forEach(n=>{t.append("files",n)}),this.uploadRequest("/submissions/submissions",t)}async validateResponse(a,s){return this.request(`/submissions/responses/${a}/validate`,{method:"PUT",body:JSON.stringify(s)})}async autoValidateResponses(a){return this.request(`/submissions/responses/${a}/validate/auto`,{method:"PUT"})}async getResponsesNeedingValidation(){return this.request("/submissions/responses/needs-validation")}async validateSubmission(a){return this.request(`/submissions/submissions/${a}/validate`,{method:"POST"})}async deleteSubmission(a){return this.request(`/submissions/submissions/${a}`,{method:"DELETE"})}async getStats(){return this.request("/submissions/stats")}async healthCheck(){return this.request("/health")}async getUserInfo(){return this.request("/user")}}const te=new Cs,Ps={async loadPuzzles(){const o=await te.getPuzzles();return o.error?(console.error("Failed to load puzzles:",o.error),[]):o.data||[]},findPuzzleByName(o,a){if(!a)return null;let s=o.find(t=>t.title.toLowerCase()===a.toLowerCase());return s||(s=o.find(t=>t.title.toLowerCase().includes(a.toLowerCase())||a.toLowerCase().includes(t.title.toLowerCase()))),s||null}},gt={async createFromFiles(o,a,s,t){const n=o.map(i=>{const v=Ps.findPuzzleByName(a,i.ocrData?.puzzle||"");if(v)return{puzzle_id:v.id,puzzle_name:i.ocrData?.puzzle||"",cost:i.ocrData?.cost,cycles:i.ocrData?.cycles,area:i.ocrData?.area,needs_manual_validation:(i.ocrData?.confidence.overall??0)<=.8,ocr_confidence_cost:i.ocrData?.confidence?.cost||0,ocr_confidence_cycles:i.ocrData?.confidence?.cycles||0,ocr_confidence_area:i.ocrData?.confidence?.area||0}}).filter(i=>i!==void 0),r=o.map(i=>i.file);return te.createSubmission({notes:s,manual_validation_requested:t,responses:n},r)},async loadSubmissions(o=20,a=0){const s=await te.getSubmissions(o,a);return s.error?(console.error("Failed to load submissions:",s.error),[]):s.data?.items||[]}},Xt={getErrorMessage(o){return typeof o=="string"?o:o instanceof Error?o.message:typeof o=="object"&&o!==null&&"detail"in o?String(o.detail):"An unknown error occurred"},isNetworkError(o){return typeof o=="string"&&o.includes("Network")},isValidationError(o){return o===400},isAuthError(o){return o===401||o===403}},Le=at("puzzles",()=>{const o=O([]),a=O(!1),s=O(""),t=se(()=>o.value.map(v=>v.title)),n=se(()=>v=>{if(!v)return null;const g=o.value.find(k=>k.title.toLowerCase()===v.toLowerCase());return g||o.value.find(k=>k.title.toLowerCase().includes(v.toLowerCase())||v.toLowerCase().includes(k.title.toLowerCase()))||null}),r=async()=>{if(!(o.value.length>0))try{a.value=!0,s.value="";const v=await te.getPuzzles();if(v.error){s.value=v.error,console.error("Failed to load puzzles:",v.error);return}v.data&&(o.value=v.data)}catch(v){s.value="Failed to load puzzles",console.error("Error loading puzzles:",v)}finally{a.value=!1}};return{puzzles:o,isLoading:a,error:s,puzzleNames:t,findPuzzleByName:n,loadPuzzles:r,refreshPuzzles:async()=>{o.value=[],await r()}}}),rt=at("submissions",()=>{const o=O([]),a=O(!1),s=O(""),t=O(!1),n=Le(),{puzzles:r}=lt(n),i=async(w=20,l=0)=>{try{a.value=!0,s.value="";const u=await gt.loadSubmissions(w,l);l===0?o.value=u:o.value.push(...u)}catch(u){s.value="Failed to load submissions",console.error("Error loading submissions:",u)}finally{a.value=!1}},v=async(w,l,u)=>{try{a.value=!0,s.value="";const y=await gt.createFromFiles(w,r.value,l,u);if(y.error)throw s.value=y.error,new Error(y.error);return y.data?(o.value.unshift(y.data),y.data):void 0}catch(y){throw s.value=y instanceof Error?y.message:"Failed to create submission",y}finally{a.value=!1}},g=()=>{t.value=!0},b=()=>{t.value=!1};return{submissions:o,isLoading:a,error:s,isSubmissionModalOpen:t,loadSubmissions:i,createSubmission:v,openSubmissionModal:g,closeSubmissionModal:b,refreshSubmissions:async()=>{o.value=[],await i()},handleSubmission:async w=>{try{a.value=!0,s.value="";const l=await v(w.files,w.notes,w.manualValidationRequested);if(l){const u=l.responses.map(y=>y.puzzle_name).join(", ");alert(`Solutions submitted successfully for puzzles: ${u}`)}else alert("Submission created successfully!");b()}catch(l){const u=Xt.getErrorMessage(l);s.value=u,alert(`Submission failed: ${u}`),console.error("Submission error:",l)}finally{a.value=!1}}}}),Ls={class:"card-body"},Rs={class:"flex items-start justify-between"},Es={class:"flex-1"},Os={class:"text-sm text-base-content/70 mb-2"},Ms={class:"flex items-center gap-2 mb-3"},Ns={class:"badge badge-primary badge-sm"},As={class:"badge badge-ghost badge-sm"},Ds={key:0,class:"text-sm text-base-content/80 mb-4"},js={key:1,class:"bg-base-200 p-3 rounded-lg mb-4"},Is={class:"grid grid-cols-3 gap-2"},Ts={class:"text-center"},qs={class:"font-bold text-primary"},Fs={class:"text-center"},Us={class:"font-bold text-primary"},Bs={class:"text-center"},Vs={class:"font-bold text-primary"},Gs={key:2,class:"flex flex-wrap gap-1 mb-4"},Ws={key:0,class:"badge badge-outline badge-xs"},Hs={class:"flex flex-col items-end gap-2"},Js={class:"tooltip","data-tip":"View on Steam Workshop"},Ks=["href"],Ys={key:0,class:"mt-1"},Zs={class:"divider"},Qs={class:"text-sm font-medium"},Xs={class:"table table-xs"},eo={key:0,class:"badge badge-success badge-xs"},to={key:1,class:"text-base-content/50"},so={key:0,class:"badge badge-info badge-xs"},oo={key:1,class:"text-base-content/50"},no={key:0,class:"badge badge-warning badge-xs"},ao={key:1,class:"text-base-content/50"},lo={class:"flex items-center gap-1"},ro={class:"badge badge-ghost badge-xs"},io=["data-tip"],co={key:1,class:"tooltip","data-tip":"Needs manual validation"},uo=ue({__name:"PuzzleCard",props:{puzzle:{},responses:{}},setup(o){const{openSubmissionModal:a}=rt();return(s,t)=>(c(),d("div",{class:ne(["card bg-base-100 shadow-lg hover:shadow-2xl transition-shadow duration-300",o.responses?.length==0?"shadow-red-900":"shadow-primary-300"])},[e("div",Ls,[e("div",Rs,[e("div",Es,[e("h3",{class:ne(["card-title text-lg font-bold",o.responses?.length==0?"text-error":"text-primary"])},p(o.puzzle.title),3),e("p",Os," by "+p(o.puzzle.author_name),1),e("div",Ms,[e("div",Ns,p(o.puzzle.steam_item_id),1),e("div",As,"ID: "+p(o.puzzle.id),1)]),o.puzzle.description?(c(),d("p",Ds,p(o.puzzle.description),1)):L("",!0),o.puzzle.points_factor?(c(),d("div",js,[t[7]||(t[7]=e("p",{class:"text-xs text-base-content/70 font-semibold mb-2"},"Points Coefficients",-1)),e("div",Is,[e("div",Ts,[e("span",qs,[t[1]||(t[1]=e("small",null,"x",-1)),E(p(o.puzzle.points_factor.cost),1)]),t[2]||(t[2]=e("p",{class:"text-xs text-base-content/70"},"Cost",-1))]),e("div",Fs,[e("span",Us,[t[3]||(t[3]=e("small",null,"x",-1)),E(p(o.puzzle.points_factor.cycles),1)]),t[4]||(t[4]=e("p",{class:"text-xs text-base-content/70"},"Cycles",-1))]),e("div",Bs,[e("span",Vs,[t[5]||(t[5]=e("small",null,"x",-1)),E(p(o.puzzle.points_factor.area),1)]),t[6]||(t[6]=e("p",{class:"text-xs text-base-content/70"},"Area",-1))])])])):L("",!0),o.puzzle.tags&&o.puzzle.tags.length>0?(c(),d("div",Gs,[(c(!0),d(U,null,W(o.puzzle.tags.slice(0,3),n=>(c(),d("span",{key:n,class:"badge badge-outline badge-xs"},p(n),1))),128)),o.puzzle.tags.length>3?(c(),d("span",Ws," +"+p(o.puzzle.tags.length-3)+" more ",1)):L("",!0)])):L("",!0)]),e("div",Hs,[e("div",Js,[e("a",{href:`https://steamcommunity.com/workshop/filedetails/?id=${o.puzzle.steam_item_id}`,target:"_blank",class:"btn btn-ghost btn-sm btn-square"},[...t[8]||(t[8]=[e("i",{class:"mdi mdi-steam text-lg"},null,-1)])],8,Ks)])])]),o.responses&&o.responses.length>0?(c(),d("div",Ys,[e("div",Zs,[e("span",Qs,"Solutions ("+p(o.responses.length)+")",1)]),e("div",null,[e("table",Xs,[t[11]||(t[11]=e("thead",null,[e("tr",null,[e("th",null,"Cost"),e("th",null,"Cycles"),e("th",null,"Area"),e("th",null,"Files")])],-1)),e("tbody",null,[(c(!0),d(U,null,W(o.responses,n=>(c(),d("tr",{key:n.id,class:"hover"},[e("td",null,[n.final_cost||n.cost?(c(),d("span",eo,p(n.final_cost||n.cost),1)):(c(),d("span",to,"-"))]),e("td",null,[n.final_cycles||n.cycles?(c(),d("span",so,p(n.final_cycles||n.cycles),1)):(c(),d("span",oo,"-"))]),e("td",null,[n.final_area||n.area?(c(),d("span",no,p(n.final_area||n.area),1)):(c(),d("span",ao,"-"))]),e("td",null,[e("div",lo,[e("span",ro,p(n.files?.length||0),1),n.files?.length?(c(),d("div",{key:0,class:"tooltip","data-tip":n.files.map(r=>r.original_filename||r.file?.name).join(", ")},[...t[9]||(t[9]=[e("i",{class:"mdi mdi-information-outline text-xs"},null,-1)])],8,io)):L("",!0),n.needs_manual_validation?(c(),d("div",co,[...t[10]||(t[10]=[e("i",{class:"mdi mdi-alert-circle text-xs text-warning"},null,-1)])])):L("",!0)])])]))),128))])])])])):(c(),d("div",{key:1,class:"mt-6 text-center py-4 border-2 border-dashed border-base-300 rounded-lg hover:border-primary transition-colors duration-300 cursor-pointer",onClick:t[0]||(t[0]=(...n)=>q(a)&&q(a)(...n))},[...t[12]||(t[12]=[e("i",{class:"mdi mdi-upload text-2xl text-base-content/40"},null,-1),e("p",{class:"text-sm text-base-content/60 mt-2"},"No solutions yet",-1),e("p",{class:"text-xs text-base-content/40"}," Upload solutions using the submit button ",-1)])]))])],2))}});var Oe={exports:{}},pt;function fo(){return pt||(pt=1,(function(o){var a=(function(s){var t=Object.prototype,n=t.hasOwnProperty,r=Object.defineProperty||function($,x,z){$[x]=z.value},i,v=typeof Symbol=="function"?Symbol:{},g=v.iterator||"@@iterator",b=v.asyncIterator||"@@asyncIterator",k=v.toStringTag||"@@toStringTag";function S($,x,z){return Object.defineProperty($,x,{value:z,enumerable:!0,configurable:!0,writable:!0}),$[x]}try{S({},"")}catch{S=function(x,z,N){return x[z]=N}}function w($,x,z,N){var P=x&&x.prototype instanceof _?x:_,T=Object.create(P.prototype),K=new ae(N||[]);return r(T,"_invoke",{value:le($,z,K)}),T}s.wrap=w;function l($,x,z){try{return{type:"normal",arg:$.call(x,z)}}catch(N){return{type:"throw",arg:N}}}var u="suspendedStart",y="suspendedYield",m="executing",f="completed",h={};function _(){}function M(){}function D(){}var F={};S(F,g,function(){return this});var C=Object.getPrototypeOf,R=C&&C(C(V([])));R&&R!==t&&n.call(R,g)&&(F=R);var j=D.prototype=_.prototype=Object.create(F);M.prototype=D,r(j,"constructor",{value:D,configurable:!0}),r(D,"constructor",{value:M,configurable:!0}),M.displayName=S(D,k,"GeneratorFunction");function B($){["next","throw","return"].forEach(function(x){S($,x,function(z){return this._invoke(x,z)})})}s.isGeneratorFunction=function($){var x=typeof $=="function"&&$.constructor;return x?x===M||(x.displayName||x.name)==="GeneratorFunction":!1},s.mark=function($){return Object.setPrototypeOf?Object.setPrototypeOf($,D):($.__proto__=D,S($,k,"GeneratorFunction")),$.prototype=Object.create(j),$},s.awrap=function($){return{__await:$}};function Y($,x){function z(T,K,H,X){var G=l($[T],$,K);if(G.type==="throw")X(G.arg);else{var ye=G.arg,he=ye.value;return he&&typeof he=="object"&&n.call(he,"__await")?x.resolve(he.__await).then(function(re){z("next",re,H,X)},function(re){z("throw",re,H,X)}):x.resolve(he).then(function(re){ye.value=re,H(ye)},function(re){return z("throw",re,H,X)})}}var N;function P(T,K){function H(){return new x(function(X,G){z(T,K,X,G)})}return N=N?N.then(H,H):H()}r(this,"_invoke",{value:P})}B(Y.prototype),S(Y.prototype,b,function(){return this}),s.AsyncIterator=Y,s.async=function($,x,z,N,P){P===void 0&&(P=Promise);var T=new Y(w($,x,z,N),P);return s.isGeneratorFunction(x)?T:T.next().then(function(K){return K.done?K.value:T.next()})};function le($,x,z){var N=u;return function(T,K){if(N===m)throw new Error("Generator is already running");if(N===f){if(T==="throw")throw K;return Q()}for(z.method=T,z.arg=K;;){var H=z.delegate;if(H){var X=fe(H,z);if(X){if(X===h)continue;return X}}if(z.method==="next")z.sent=z._sent=z.arg;else if(z.method==="throw"){if(N===u)throw N=f,z.arg;z.dispatchException(z.arg)}else z.method==="return"&&z.abrupt("return",z.arg);N=m;var G=l($,x,z);if(G.type==="normal"){if(N=z.done?f:y,G.arg===h)continue;return{value:G.arg,done:z.done}}else G.type==="throw"&&(N=f,z.method="throw",z.arg=G.arg)}}}function fe($,x){var z=x.method,N=$.iterator[z];if(N===i)return x.delegate=null,z==="throw"&&$.iterator.return&&(x.method="return",x.arg=i,fe($,x),x.method==="throw")||z!=="return"&&(x.method="throw",x.arg=new TypeError("The iterator does not provide a '"+z+"' method")),h;var P=l(N,$.iterator,x.arg);if(P.type==="throw")return x.method="throw",x.arg=P.arg,x.delegate=null,h;var T=P.arg;if(!T)return x.method="throw",x.arg=new TypeError("iterator result is not an object"),x.delegate=null,h;if(T.done)x[$.resultName]=T.value,x.next=$.nextLoc,x.method!=="return"&&(x.method="next",x.arg=i);else return T;return x.delegate=null,h}B(j),S(j,k,"Generator"),S(j,g,function(){return this}),S(j,"toString",function(){return"[object Generator]"});function be($){var x={tryLoc:$[0]};1 in $&&(x.catchLoc=$[1]),2 in $&&(x.finallyLoc=$[2],x.afterLoc=$[3]),this.tryEntries.push(x)}function oe($){var x=$.completion||{};x.type="normal",delete x.arg,$.completion=x}function ae($){this.tryEntries=[{tryLoc:"root"}],$.forEach(be,this),this.reset(!0)}s.keys=function($){var x=Object($),z=[];for(var N in x)z.push(N);return z.reverse(),function P(){for(;z.length;){var T=z.pop();if(T in x)return P.value=T,P.done=!1,P}return P.done=!0,P}};function V($){if($){var x=$[g];if(x)return x.call($);if(typeof $.next=="function")return $;if(!isNaN($.length)){var z=-1,N=function P(){for(;++z<$.length;)if(n.call($,z))return P.value=$[z],P.done=!1,P;return P.value=i,P.done=!0,P};return N.next=N}}return{next:Q}}s.values=V;function Q(){return{value:i,done:!0}}return ae.prototype={constructor:ae,reset:function($){if(this.prev=0,this.next=0,this.sent=this._sent=i,this.done=!1,this.delegate=null,this.method="next",this.arg=i,this.tryEntries.forEach(oe),!$)for(var x in this)x.charAt(0)==="t"&&n.call(this,x)&&!isNaN(+x.slice(1))&&(this[x]=i)},stop:function(){this.done=!0;var $=this.tryEntries[0],x=$.completion;if(x.type==="throw")throw x.arg;return this.rval},dispatchException:function($){if(this.done)throw $;var x=this;function z(X,G){return T.type="throw",T.arg=$,x.next=X,G&&(x.method="next",x.arg=i),!!G}for(var N=this.tryEntries.length-1;N>=0;--N){var P=this.tryEntries[N],T=P.completion;if(P.tryLoc==="root")return z("end");if(P.tryLoc<=this.prev){var K=n.call(P,"catchLoc"),H=n.call(P,"finallyLoc");if(K&&H){if(this.prev=0;--z){var N=this.tryEntries[z];if(N.tryLoc<=this.prev&&n.call(N,"finallyLoc")&&this.prev=0;--x){var z=this.tryEntries[x];if(z.finallyLoc===$)return this.complete(z.completion,z.afterLoc),oe(z),h}},catch:function($){for(var x=this.tryEntries.length-1;x>=0;--x){var z=this.tryEntries[x];if(z.tryLoc===$){var N=z.completion;if(N.type==="throw"){var P=N.arg;oe(z)}return P}}throw new Error("illegal catch attempt")},delegateYield:function($,x,z){return this.delegate={iterator:V($),resultName:x,nextLoc:z},this.method==="next"&&(this.arg=i),h}},s})(o.exports);try{regeneratorRuntime=a}catch{typeof globalThis=="object"?globalThis.regeneratorRuntime=a:Function("r","regeneratorRuntime = r")(a)}})(Oe)),Oe.exports}var Me,bt;function it(){return bt||(bt=1,Me=(o,a)=>`${o}-${a}-${Math.random().toString(16).slice(3,8)}`),Me}var Ne,yt;function es(){if(yt)return Ne;yt=1;const o=it();let a=0;return Ne=({id:s,action:t,payload:n={}})=>{let r=s;return typeof r>"u"&&(r=o("Job",a),a+=1),{id:r,action:t,payload:n}},Ne}var _e={},_t;function ct(){if(_t)return _e;_t=1;let o=!1;return _e.logging=o,_e.setLogging=a=>{o=a},_e.log=(...a)=>o?console.log.apply(this,a):null,_e}var Ae,xt;function vo(){if(xt)return Ae;xt=1;const o=es(),{log:a}=ct(),s=it();let t=0;return Ae=()=>{const n=s("Scheduler",t),r={},i={};let v=[];t+=1;const g=()=>v.length,b=()=>Object.keys(r).length,k=()=>{if(v.length!==0){const y=Object.keys(r);for(let m=0;m"u"){v[0](r[y[m]]);break}}},S=(y,m)=>new Promise((f,h)=>{const _=o({action:y,payload:m});v.push(async M=>{v.shift(),i[M.id]=_;try{f(await M[y].apply(this,[...m,_.id]))}catch(D){h(D)}finally{delete i[M.id],k()}}),a(`[${n}]: Add ${_.id} to JobQueue`),a(`[${n}]: JobQueue length=${v.length}`),k()});return{addWorker:y=>(r[y.id]=y,a(`[${n}]: Add ${y.id}`),a(`[${n}]: Number of workers=${b()}`),k(),y.id),addJob:async(y,...m)=>{if(b()===0)throw Error(`[${n}]: You need to have at least one worker before adding jobs`);return S(y,m)},terminate:async()=>{Object.keys(r).forEach(async y=>{await r[y].terminate()}),v=[]},getQueueLen:g,getNumWorkers:b}},Ae}function ho(o){throw new Error('Could not dynamically require "'+o+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var De,wt;function mo(){if(wt)return De;wt=1;function o(){return!!(typeof window<"u"&&typeof window.process=="object"&&window.process.type==="renderer"||typeof process<"u"&&typeof process.versions=="object"&&process.versions.electron||typeof navigator=="object"&&typeof navigator.userAgent=="string"&&navigator.userAgent.indexOf("Electron")>=0)}return De=o,De}var je,kt;function go(){if(kt)return je;kt=1;const o=mo();return je=a=>{const s={};return typeof WorkerGlobalScope<"u"?s.type="webworker":o()?s.type="electron":typeof document=="object"?s.type="browser":typeof process=="object"&&typeof ho=="function"&&(s.type="node"),typeof a>"u"?s:s[a]},je}var Ie,$t;function po(){if($t)return Ie;$t=1;const a=go()("type")==="browser"?s=>new URL(s,window.location.href).href:s=>s;return Ie=s=>{const t={...s};return["corePath","workerPath","langPath"].forEach(n=>{s[n]&&(t[n]=a(t[n]))}),t},Ie}var Te,zt;function bo(){return zt||(zt=1,Te=o=>{const a=[],s=[],t=[],n=[],r=[];return o.blocks&&o.blocks.forEach(i=>{i.paragraphs.forEach(v=>{v.lines.forEach(g=>{g.words.forEach(b=>{b.symbols.forEach(k=>{r.push({...k,page:o,block:i,paragraph:v,line:g,word:b})}),n.push({...b,page:o,block:i,paragraph:v,line:g})}),t.push({...g,page:o,block:i,paragraph:v})}),s.push({...v,page:o,block:i})}),a.push({...i,page:o})}),{...o,blocks:a,paragraphs:s,lines:t,words:n,symbols:r}}),Te}var qe,St;function ts(){return St||(St=1,qe={TESSERACT_ONLY:0,LSTM_ONLY:1,TESSERACT_LSTM_COMBINED:2,DEFAULT:3}),qe}const yo="5.1.1",_o={version:yo};var Fe,Ct;function xo(){return Ct||(Ct=1,Fe={workerBlobURL:!0,logger:()=>{}}),Fe}var Ue,Pt;function wo(){if(Pt)return Ue;Pt=1;const o=_o.version;return Ue={...xo(),workerPath:`https://cdn.jsdelivr.net/npm/tesseract.js@v${o}/dist/worker.min.js`},Ue}var Be,Lt;function ko(){return Lt||(Lt=1,Be=({workerPath:o,workerBlobURL:a})=>{let s;if(Blob&&URL&&a){const t=new Blob([`importScripts("${o}");`],{type:"application/javascript"});s=new Worker(URL.createObjectURL(t))}else s=new Worker(o);return s}),Be}var Ve,Rt;function $o(){return Rt||(Rt=1,Ve=o=>{o.terminate()}),Ve}var Ge,Et;function zo(){return Et||(Et=1,Ge=(o,a)=>{o.onmessage=({data:s})=>{a(s)}}),Ge}var We,Ot;function So(){return Ot||(Ot=1,We=async(o,a)=>{o.postMessage(a)}),We}var He,Mt;function Co(){if(Mt)return He;Mt=1;const o=s=>new Promise((t,n)=>{const r=new FileReader;r.onload=()=>{t(r.result)},r.onerror=({target:{error:{code:i}}})=>{n(Error(`File could not be read! Code=${i}`))},r.readAsArrayBuffer(s)}),a=async s=>{let t=s;if(typeof s>"u")return"undefined";if(typeof s=="string")/data:image\/([a-zA-Z]*);base64,([^"]*)/.test(s)?t=atob(s.split(",")[1]).split("").map(n=>n.charCodeAt(0)):t=await(await fetch(s)).arrayBuffer();else if(typeof HTMLElement<"u"&&s instanceof HTMLElement)s.tagName==="IMG"&&(t=await a(s.src)),s.tagName==="VIDEO"&&(t=await a(s.poster)),s.tagName==="CANVAS"&&await new Promise(n=>{s.toBlob(async r=>{t=await o(r),n()})});else if(typeof OffscreenCanvas<"u"&&s instanceof OffscreenCanvas){const n=await s.convertToBlob();t=await o(n)}else(s instanceof File||s instanceof Blob)&&(t=await o(s));return new Uint8Array(t)};return He=a,He}var Je,Nt;function Po(){if(Nt)return Je;Nt=1;const o=wo(),a=ko(),s=$o(),t=zo(),n=So(),r=Co();return Je={defaultOptions:o,spawnWorker:a,terminateWorker:s,onMessage:t,send:n,loadImage:r},Je}var Ke,At;function ss(){if(At)return Ke;At=1;const o=po(),a=bo(),s=es(),{log:t}=ct(),n=it(),r=ts(),{defaultOptions:i,spawnWorker:v,terminateWorker:g,onMessage:b,loadImage:k,send:S}=Po();let w=0;return Ke=async(l="eng",u=r.LSTM_ONLY,y={},m={})=>{const f=n("Worker",w),{logger:h,errorHandler:_,...M}=o({...i,...y}),D={},F={},C=typeof l=="string"?l.split("+"):l;let R=u,j=m;const B=[r.DEFAULT,r.LSTM_ONLY].includes(u)&&!M.legacyCore;let Y,le;const fe=new Promise((A,I)=>{le=A,Y=I}),be=A=>{Y(A.message)};let oe=v(M);oe.onerror=be,w+=1;const ae=(A,I)=>{D[A]=I},V=(A,I)=>{F[A]=I},Q=({id:A,action:I,payload:J})=>new Promise((ee,Z)=>{t(`[${f}]: Start ${A}, action=${I}`);const ie=`${I}-${A}`;ae(ie,ee),V(ie,Z),S(oe,{workerId:f,jobId:A,action:I,payload:J})}),$=()=>console.warn("`load` is depreciated and should be removed from code (workers now come pre-loaded)"),x=A=>Q(s({id:A,action:"load",payload:{options:{lstmOnly:B,corePath:M.corePath,logging:M.logging}}})),z=(A,I,J)=>Q(s({id:J,action:"FS",payload:{method:"writeFile",args:[A,I]}})),N=(A,I)=>Q(s({id:I,action:"FS",payload:{method:"readFile",args:[A,{encoding:"utf8"}]}})),P=(A,I)=>Q(s({id:I,action:"FS",payload:{method:"unlink",args:[A]}})),T=(A,I,J)=>Q(s({id:J,action:"FS",payload:{method:A,args:I}})),K=()=>console.warn("`loadLanguage` is depreciated and should be removed from code (workers now come with language pre-loaded)"),H=(A,I)=>Q(s({id:I,action:"loadLanguage",payload:{langs:A,options:{langPath:M.langPath,dataPath:M.dataPath,cachePath:M.cachePath,cacheMethod:M.cacheMethod,gzip:M.gzip,lstmOnly:[r.DEFAULT,r.LSTM_ONLY].includes(R)&&!M.legacyLang}}})),X=()=>console.warn("`initialize` is depreciated and should be removed from code (workers now come pre-initialized)"),G=(A,I,J,ee)=>Q(s({id:ee,action:"initialize",payload:{langs:A,oem:I,config:J}})),ye=(A="eng",I,J,ee)=>{if(B&&[r.TESSERACT_ONLY,r.TESSERACT_LSTM_COMBINED].includes(I))throw Error("Legacy model requested but code missing.");const Z=I||R;R=Z;const ie=J||j;j=ie;const Re=(typeof A=="string"?A.split("+"):A).filter(ds=>!C.includes(ds));return C.push(...Re),Re.length>0?H(Re,ee).then(()=>G(A,Z,ie,ee)):G(A,Z,ie,ee)},he=(A={},I)=>Q(s({id:I,action:"setParameters",payload:{params:A}})),re=async(A,I={},J={blocks:!0,text:!0,hocr:!0,tsv:!0},ee)=>Q(s({id:ee,action:"recognize",payload:{image:await k(A),options:I,output:J}})),ls=(A="Tesseract OCR Result",I=!1,J)=>(console.log("`getPDF` function is depreciated. `recognize` option `savePDF` should be used instead."),Q(s({id:J,action:"getPDF",payload:{title:A,textonly:I}}))),rs=async(A,I)=>{if(B)throw Error("`worker.detect` requires Legacy model, which was not loaded.");return Q(s({id:I,action:"detect",payload:{image:await k(A)}}))},is=async()=>(oe!==null&&(g(oe),oe=null),Promise.resolve());b(oe,({workerId:A,jobId:I,status:J,action:ee,data:Z})=>{const ie=`${ee}-${I}`;if(J==="resolve"){t(`[${A}]: Complete ${I}`);let ke=Z;ee==="recognize"?ke=a(Z):ee==="getPDF"&&(ke=Array.from({...Z,length:Object.keys(Z).length})),D[ie]({jobId:I,data:ke})}else if(J==="reject")if(F[ie](Z),ee==="load"&&Y(Z),_)_(Z);else throw Error(Z);else J==="progress"&&h({...Z,userJobId:I})});const cs={id:f,worker:oe,setResolve:ae,setReject:V,load:$,writeText:z,readText:N,removeFile:P,FS:T,loadLanguage:K,initialize:X,reinitialize:ye,setParameters:he,recognize:re,getPDF:ls,detect:rs,terminate:is};return x().then(()=>H(l)).then(()=>G(l,u,m)).then(()=>le(cs)).catch(()=>{}),fe},Ke}var Ye,Dt;function Lo(){if(Dt)return Ye;Dt=1;const o=ss();return Ye={recognize:async(t,n,r)=>{const i=await o(n,1,r);return i.recognize(t).finally(async()=>{await i.terminate()})},detect:async(t,n)=>{const r=await o("osd",0,n);return r.detect(t).finally(async()=>{await r.terminate()})}},Ye}var Ze,jt;function Ro(){return jt||(jt=1,Ze={AFR:"afr",AMH:"amh",ARA:"ara",ASM:"asm",AZE:"aze",AZE_CYRL:"aze_cyrl",BEL:"bel",BEN:"ben",BOD:"bod",BOS:"bos",BUL:"bul",CAT:"cat",CEB:"ceb",CES:"ces",CHI_SIM:"chi_sim",CHI_TRA:"chi_tra",CHR:"chr",CYM:"cym",DAN:"dan",DEU:"deu",DZO:"dzo",ELL:"ell",ENG:"eng",ENM:"enm",EPO:"epo",EST:"est",EUS:"eus",FAS:"fas",FIN:"fin",FRA:"fra",FRK:"frk",FRM:"frm",GLE:"gle",GLG:"glg",GRC:"grc",GUJ:"guj",HAT:"hat",HEB:"heb",HIN:"hin",HRV:"hrv",HUN:"hun",IKU:"iku",IND:"ind",ISL:"isl",ITA:"ita",ITA_OLD:"ita_old",JAV:"jav",JPN:"jpn",KAN:"kan",KAT:"kat",KAT_OLD:"kat_old",KAZ:"kaz",KHM:"khm",KIR:"kir",KOR:"kor",KUR:"kur",LAO:"lao",LAT:"lat",LAV:"lav",LIT:"lit",MAL:"mal",MAR:"mar",MKD:"mkd",MLT:"mlt",MSA:"msa",MYA:"mya",NEP:"nep",NLD:"nld",NOR:"nor",ORI:"ori",PAN:"pan",POL:"pol",POR:"por",PUS:"pus",RON:"ron",RUS:"rus",SAN:"san",SIN:"sin",SLK:"slk",SLV:"slv",SPA:"spa",SPA_OLD:"spa_old",SQI:"sqi",SRP:"srp",SRP_LATN:"srp_latn",SWA:"swa",SWE:"swe",SYR:"syr",TAM:"tam",TEL:"tel",TGK:"tgk",TGL:"tgl",THA:"tha",TIR:"tir",TUR:"tur",UIG:"uig",UKR:"ukr",URD:"urd",UZB:"uzb",UZB_CYRL:"uzb_cyrl",VIE:"vie",YID:"yid"}),Ze}var Qe,It;function Eo(){return It||(It=1,Qe={OSD_ONLY:"0",AUTO_OSD:"1",AUTO_ONLY:"2",AUTO:"3",SINGLE_COLUMN:"4",SINGLE_BLOCK_VERT_TEXT:"5",SINGLE_BLOCK:"6",SINGLE_LINE:"7",SINGLE_WORD:"8",CIRCLE_WORD:"9",SINGLE_CHAR:"10",SPARSE_TEXT:"11",SPARSE_TEXT_OSD:"12",RAW_LINE:"13"}),Qe}var Xe,Tt;function Oo(){if(Tt)return Xe;Tt=1,fo();const o=vo(),a=ss(),s=Lo(),t=Ro(),n=ts(),r=Eo(),{setLogging:i}=ct();return Xe={languages:t,OEM:n,PSM:r,createScheduler:o,createWorker:a,setLogging:i,...s},Xe}var Mo=Oo();class dt{worker=null;availablePuzzleNames=[];regions={puzzle:{x:15,y:600,width:330,height:28},cost:{x:412,y:603,width:65,height:22},cycles:{x:577,y:603,width:65,height:22},area:{x:739,y:603,width:65,height:22}};async initialize(){this.worker||(this.worker=await Mo.createWorker("eng"),await this.worker.setParameters({tessedit_ocr_engine_mode:"3",tessedit_pageseg_mode:7}))}setAvailablePuzzleNames(a){this.availablePuzzleNames=a,console.log("OCR service updated with puzzle names:",a)}async configurePuzzleOCR(){this.worker&&(await this.worker.setParameters({load_system_dawg:"0",load_freq_dawg:"0",load_punc_dawg:"0",load_number_dawg:"0",load_unambig_dawg:"0",load_bigram_dawg:"0",load_fixed_length_dawgs:"0",tessedit_char_whitelist:this.getPuzzleCharacterSet(),tessedit_pageseg_mode:8,segment_penalty_dict_nonword:"2.0",segment_penalty_dict_frequent_word:"0.001",segment_penalty_dict_case_ok:"0.001",segment_penalty_dict_case_bad:"0.1",classify_enable_learning:"0",classify_enable_adaptive_matcher:"1",preserve_interword_spaces:"1"}),console.log("OCR configured for puzzle names with character set:",this.getPuzzleCharacterSet()))}getPuzzleCharacterSet(){if(this.availablePuzzleNames.length===0)return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 -";const a=new Set;return this.availablePuzzleNames.forEach(s=>{for(const t of s)a.add(t)}),Array.from(a).join("")}async extractOpusMagnumData(a){this.worker||await this.initialize();const s=URL.createObjectURL(a),t=new Image;return new Promise((n,r)=>{t.onload=async()=>{try{const i=document.createElement("canvas"),v=i.getContext("2d");i.width=t.width,i.height=t.height,v.drawImage(t,0,0);const g={},b={};for(const[w,l]of Object.entries(this.regions)){const u=document.createElement("canvas"),y=u.getContext("2d");u.width=l.width,u.height=l.height,y.drawImage(i,l.x,l.y,l.width,l.height,0,0,l.width,l.height);const m=y.getImageData(0,0,l.width,l.height);this.preprocessImage(m),y.putImageData(m,0,0),w==="cost"?await this.worker.setParameters({tessedit_char_whitelist:"0123456789G"}):w==="cycles"||w==="area"?await this.worker.setParameters({tessedit_char_whitelist:"0123456789"}):w==="puzzle"?await this.configurePuzzleOCR():await this.worker.setParameters({tessedit_char_whitelist:""});const{data:{text:f,confidence:h}}=await this.worker.recognize(u);let _=f.trim();if(b[w]=h/100,w==="cost"){if(_.endsWith("6")&&_.length>1){const M=_.slice(0,-1);/^\d+$/.test(M)&&(_=M)}_=_.replace(/G+$/g,""),_=_.replace(/[^0-9]/g,"")}else if(w==="cycles"||w==="area")_=_.replace(/[^0-9]/g,"");else if(w==="puzzle"&&(_=this.findBestPuzzleMatch(_),this.availablePuzzleNames.length>0&&!this.availablePuzzleNames.includes(_))){const M=this.findBestPuzzleMatchForced(_);M&&(_=M,console.log(`Forced OCR match: "${f.trim()}" -> "${_}"`))}g[w]=_}URL.revokeObjectURL(s);const k=Object.values(b),S=k.length>0?k.reduce((w,l)=>w+l,0)/k.length:0;n({puzzle:g.puzzle||"",cost:parseInt(g.cost||""),cycles:parseInt(g.cycles||""),area:parseInt(g.area||""),confidence:{puzzle:b.puzzle||0,cost:b.cost||0,cycles:b.cycles||0,area:b.area||0,overall:S}})}catch(i){URL.revokeObjectURL(s),r(i)}},t.onerror=()=>{URL.revokeObjectURL(s),r(new Error("Failed to load image"))},t.src=s})}preprocessImage(a){const s=a.data;for(let t=0;tArray(a.length+1).fill(null));for(let n=0;n<=a.length;n++)t[0][n]=n;for(let n=0;n<=s.length;n++)t[n][0]=n;for(let n=1;n<=s.length;n++)for(let r=1;r<=a.length;r++){const i=a[r-1]===s[n-1]?0:1;t[n][r]=Math.min(t[n][r-1]+1,t[n-1][r]+1,t[n-1][r-1]+i)}return t[s.length][a.length]}findBestPuzzleMatch(a){if(!this.availablePuzzleNames.length)return a.trim();const s=a.trim();if(!s)return"";const t=this.availablePuzzleNames.find(v=>v.toLowerCase()===s.toLowerCase());if(t)return t;const n=this.availablePuzzleNames.find(v=>v.toLowerCase().includes(s.toLowerCase())||s.toLowerCase().includes(v.toLowerCase()));if(n)return n;let r=s,i=0;for(const v of this.availablePuzzleNames){const g=[this.calculateLevenshteinSimilarity(s,v),this.calculateJaroWinklerSimilarity(s,v),this.calculateNGramSimilarity(s,v,2)],b=Math.max(...g);b>i&&b>.4&&(i=b,r=v)}if(i<.6){const v=this.findBestCharacterMatch(s);v&&(r=v)}return r}calculateLevenshteinSimilarity(a,s){const t=this.levenshteinDistance(a.toLowerCase(),s.toLowerCase()),n=Math.max(a.length,s.length);return n===0?1:1-t/n}calculateJaroWinklerSimilarity(a,s){const t=a.toLowerCase(),n=s.toLowerCase();if(t===n)return 1;const r=Math.floor(Math.max(t.length,n.length)/2)-1;if(r<0)return 0;const i=new Array(t.length).fill(!1),v=new Array(n.length).fill(!1);let g=0,b=0;for(let l=0;lv.has(k))),b=new Set([...i,...v]);return g.size/b.size}findBestCharacterMatch(a){let s=null,t=0;for(const n of this.availablePuzzleNames){const r=this.calculateCharacterFrequencyScore(a.toLowerCase(),n.toLowerCase());r>t&&r>.3&&(t=r,s=n)}return s}calculateCharacterFrequencyScore(a,s){const t=new Map,n=new Map;for(const g of a)t.set(g,(t.get(g)||0)+1);for(const g of s)n.set(g,(n.get(g)||0)+1);const r=new Set([...t.keys(),...n.keys()]);let i=0,v=0;for(const g of r){const b=t.get(g)||0,k=n.get(g)||0;i+=Math.min(b,k),v+=Math.max(b,k)}return v===0?0:i/v}findBestPuzzleMatchForced(a){if(!this.availablePuzzleNames.length||!a.trim())return null;const s=a.trim().toLowerCase();let t=this.availablePuzzleNames[0],n=0;for(const r of this.availablePuzzleNames){const i=[this.calculateLevenshteinSimilarity(s,r),this.calculateJaroWinklerSimilarity(s,r),this.calculateNGramSimilarity(s,r,2),this.calculateCharacterFrequencyScore(s,r.toLowerCase()),this.calculateLengthSimilarity(s,r.toLowerCase())],v=i[0]*.25+i[1]*.25+i[2]*.2+i[3]*.2+i[4]*.1;v>n&&(n=v,t=r)}return console.log(`Forced match for "${a}": "${t}" (score: ${n.toFixed(3)})`),t}calculateLengthSimilarity(a,s){const t=a.length,n=s.length,r=Math.max(t,n),i=Math.min(t,n);return r===0?1:i/r}async terminate(){this.worker&&(await this.worker.terminate(),this.worker=null)}static isValidOpusMagnumImage(a){return["image/jpeg","image/jpg","image/png","image/gif"].includes(a.type)}static drawDebugRegions(a){return new Promise((s,t)=>{const n=URL.createObjectURL(a),r=new Image;r.onload=()=>{const i=document.createElement("canvas"),v=i.getContext("2d");i.width=r.width,i.height=r.height,v.drawImage(r,0,0),v.strokeStyle="#00ff00",v.lineWidth=2;const g=new dt;Object.values(g.regions).forEach(b=>{v.strokeRect(b.x,b.y,b.width,b.height)}),URL.revokeObjectURL(n),s(i.toDataURL())},r.onerror=()=>{URL.revokeObjectURL(n),t(new Error("Failed to load image for debug"))},r.src=n})}}const ot=new dt,xe=.8,os=at("uploads",()=>{const o=O([]),a=se(()=>o.value.some(g=>g.ocrProcessing)),s=se(()=>o.value.some(g=>n(g))),t=se(()=>o.value.filter(g=>g.needsManualPuzzleSelection)),n=g=>g.ocrData?.confidence?g.ocrData.confidence.cost{for(;a.value;){const k=Math.floor(Math.random()*400)+100;console.log(`OCR is already processing, waiting ${k}ms...`),await new Promise(S=>setTimeout(S,k))}const b=o.value.indexOf(g);o.value[b].ocrProcessing=!0,o.value[b].ocrError=void 0,o.value[b].ocrData=void 0;try{console.log("Starting OCR processing for:",g.file.name),await ot.initialize();const k=await ot.extractOpusMagnumData(g.file);console.log("OCR completed:",k),await Se(),o.value[b].ocrData=k,k.confidence.puzzle{const g=o.value.filter(b=>n(b));for(const b of g)r(b)},clearFiles:()=>{o.value=[]},isProcessingOCR:a,hasLowConfidence:s,CONFIDENCE_VALUE:xe}}),No={class:"form-control w-full"},Ao={key:0,class:"space-y-4"},Do={key:1,class:"space-y-4"},jo={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-2 gap-4"},Io={class:"aspect-square rounded-lg overflow-hidden bg-base-200"},To=["src","alt"],qo={class:"absolute inset-0 bg-black/80 opacity-0 group-hover:opacity-100 transition-opacity duration-200 rounded-lg flex items-center justify-center"},Fo=["onClick"],Uo={class:"mt-2"},Bo={class:"text-xs font-medium truncate"},Vo={class:"text-xs text-base-content/60"},Go={key:0,class:"mt-1 flex items-center gap-1"},Wo={key:1,class:"mt-1"},Ho={class:"text-xs text-error"},Jo={key:2,class:"mt-1 space-y-1"},Ko={class:"text-xs flex items-center justify-between"},Yo={class:"flex items-center gap-2"},Zo=["title"],Qo=["onClick"],Xo={class:"text-xs space-y-1 bg-base-200 p-2 rounded"},en={key:0},tn=["title"],sn={key:1},on=["title"],nn={key:2},an=["title"],ln={key:3},rn=["title"],cn={key:3,class:"mt-2"},dn={class:"mt-2"},un=["onUpdate:modelValue","onChange"],fn=["value"],vn={key:4,class:"mt-1"},hn=["onClick"],mn={class:"flex justify-center"},gn={key:0,class:"label"},pn={class:"label-text-alt text-error"},bn=ue({__name:"FileUpload",setup(o){const a=Le(),{submissionFiles:s,processOCR:t}=os(),n=O(),r=O(!1),i=O("");Ce(()=>a.puzzles,f=>{f&&f.length>0&&ot.setAvailablePuzzleNames(a.puzzleNames)},{immediate:!0});const v=f=>{const h=f.target;h.files&&b(Array.from(h.files))},g=f=>{f.preventDefault(),r.value=!1,f.dataTransfer?.files&&b(Array.from(f.dataTransfer.files))},b=async f=>{i.value="";for(const h of f)if(k(h))try{const _=await S(h),M=h.type.startsWith("image/gif")?"gif":"image",D={file:h,file_url:"",preview:_,type:M,ocrProcessing:!1,ocrError:void 0,ocrData:void 0};s.push(D),u(h)&&Se(()=>{t(D)})}catch{i.value=`Failed to process ${h.name}`}},k=f=>f.type.startsWith("image/")?f.size>256*1024*1024?(i.value=`${f.name} is too large (max 256MB)`,!1):!0:(i.value=`${f.name} is not a valid image file`,!1),S=f=>new Promise((h,_)=>{const M=new FileReader;M.onload=D=>h(D.target?.result),M.onerror=_,M.readAsDataURL(f)}),w=f=>{s.splice(f,1)},l=f=>{if(f===0)return"0 Bytes";const h=1024,_=["Bytes","KB","MB","GB"],M=Math.floor(Math.log(f)/Math.log(h));return parseFloat((f/Math.pow(h,M)).toFixed(2))+" "+_[M]},u=f=>f.type.startsWith("image/")&&f.size>5e4,y=f=>f>=.8?"badge-success":f>=.6?"badge-warning":"badge-error",m=f=>{const h=s.findIndex(_=>_.file===f.file);h!==-1&&s[h].manualPuzzleSelection&&(s[h].needsManualPuzzleSelection=!1,console.log(`Manual puzzle selection: ${f.file.name} -> ${s[h].manualPuzzleSelection}`))};return(f,h)=>(c(),d("div",No,[h[19]||(h[19]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Upload Solution Files"),e("span",{class:"label-text-alt text-xs"},"Images or GIFs only")],-1)),e("div",{class:ne(["border-2 border-dashed border-base-300 rounded-lg p-6 text-center hover:border-primary transition-colors duration-300",{"border-primary bg-primary/5":r.value}]),onDrop:g,onDragover:h[2]||(h[2]=et(_=>r.value=!0,["prevent"])),onDragleave:h[3]||(h[3]=_=>r.value=!1),onDragenter:h[4]||(h[4]=et(()=>{},["prevent"]))},[e("input",{ref_key:"fileInput",ref:n,type:"file",multiple:"",accept:"image/*,.gif",class:"hidden",onChange:v},null,544),q(s).length===0?(c(),d("div",Ao,[h[6]||(h[6]=e("div",{class:"mx-auto w-12 h-12 text-base-content/40 flex items-center justify-center"},[e("i",{class:"mdi mdi-cloud-upload text-5xl"})],-1)),e("div",null,[h[5]||(h[5]=e("p",{class:"text-base-content/70 mb-2"},"Drop your files here or",-1)),e("button",{type:"button",onClick:h[0]||(h[0]=_=>n.value?.click()),class:"btn btn-primary btn-sm"}," Choose Files ")]),h[7]||(h[7]=e("p",{class:"text-xs text-base-content/50"}," Supported formats: JPG, PNG, GIF (max 256MB each) ",-1))])):(c(),d("div",Do,[e("div",jo,[(c(!0),d(U,null,W(q(s),(_,M)=>(c(),d("div",{key:M,class:"relative group"},[e("div",Io,[e("img",{src:_.preview,alt:_.file.name,class:"w-full h-full object-cover"},null,8,To)]),e("div",qo,[e("button",{onClick:D=>w(M),class:"btn btn-error btn-lg btn-circle"},[...h[8]||(h[8]=[e("i",{class:"mdi mdi-close"},null,-1)])],8,Fo)]),e("div",Uo,[e("p",Bo,p(_.file.name),1),e("p",Vo,p(l(_.file.size))+" • "+p(_.type.toUpperCase()),1),_.ocrProcessing?(c(),d("div",Go,[...h[9]||(h[9]=[e("span",{class:"loading loading-spinner loading-xs"},null,-1),e("span",{class:"text-xs text-info"},"Extracting puzzle data...",-1)])])):_.ocrError?(c(),d("div",Wo,[e("p",Ho,p(_.ocrError),1)])):_.ocrData?(c(),d("div",Jo,[e("div",Ko,[e("div",Yo,[h[10]||(h[10]=e("span",{class:"font-medium text-success"},"✓ OCR Complete",-1)),_.ocrData.confidence?(c(),d("span",{key:0,class:ne(["badge badge-xs",y(_.ocrData.confidence.overall)]),title:`Overall confidence: ${Math.round(_.ocrData.confidence.overall*100)}%`},p(Math.round(_.ocrData.confidence.overall*100))+"% ",11,Zo)):L("",!0)]),e("button",{onClick:D=>q(t)(_),class:"btn btn-xs btn-ghost",title:"Retry OCR"},[...h[11]||(h[11]=[e("i",{class:"mdi mdi-refresh"},null,-1)])],8,Qo)]),e("div",Xo,[_.ocrData.puzzle?(c(),d("div",en,[h[12]||(h[12]=e("strong",null,"Puzzle:",-1)),E(" "+p(_.ocrData.puzzle)+" ",1),_.ocrData.confidence?.puzzle?(c(),d("span",{key:0,class:"ml-2 opacity-60",title:`Puzzle confidence: ${Math.round(_.ocrData.confidence.puzzle*100)}%`}," ("+p(Math.round(_.ocrData.confidence.puzzle*100))+"%) ",9,tn)):L("",!0)])):L("",!0),_.ocrData.cost?(c(),d("div",sn,[h[13]||(h[13]=e("strong",null,"Cost:",-1)),E(" "+p(_.ocrData.cost)+" ",1),_.ocrData.confidence?.cost?(c(),d("span",{key:0,class:"ml-2 opacity-60",title:`Cost confidence: ${Math.round(_.ocrData.confidence.cost*100)}%`}," ("+p(Math.round(_.ocrData.confidence.cost*100))+"%) ",9,on)):L("",!0)])):L("",!0),_.ocrData.cycles?(c(),d("div",nn,[h[14]||(h[14]=e("strong",null,"Cycles:",-1)),E(" "+p(_.ocrData.cycles)+" ",1),_.ocrData.confidence?.cycles?(c(),d("span",{key:0,class:"ml-2 opacity-60",title:`Cycles confidence: ${Math.round(_.ocrData.confidence.cycles*100)}%`}," ("+p(Math.round(_.ocrData.confidence.cycles*100))+"%) ",9,an)):L("",!0)])):L("",!0),_.ocrData.area?(c(),d("div",ln,[h[15]||(h[15]=e("strong",null,"Area:",-1)),E(" "+p(_.ocrData.area)+" ",1),_.ocrData.confidence?.area?(c(),d("span",{key:0,class:"ml-2 opacity-60",title:`Area confidence: ${Math.round(_.ocrData.confidence.area*100)}%`}," ("+p(Math.round(_.ocrData.confidence.area*100))+"%) ",9,rn)):L("",!0)])):L("",!0)])])):L("",!0),_.needsManualPuzzleSelection?(c(),d("div",cn,[h[17]||(h[17]=gs('Low OCR Confidence
Please select the correct puzzle manually
',1)),e("div",dn,[de(e("select",{"onUpdate:modelValue":D=>_.manualPuzzleSelection=D,class:"select select-bordered select-sm w-full",onChange:D=>m(_)},[h[16]||(h[16]=e("option",{value:""},"Select puzzle...",-1)),(c(!0),d(U,null,W(q(a).puzzles,D=>(c(),d("option",{key:D.id,value:D.title},p(D.title),9,fn))),128))],40,un),[[Ht,_.manualPuzzleSelection]])])])):!_.ocrProcessing&&!_.ocrError&&!_.ocrData?(c(),d("div",vn,[e("button",{onClick:D=>q(t)(_),class:"btn btn-xs btn-outline"},[...h[18]||(h[18]=[e("i",{class:"mdi mdi-text-recognition"},null,-1),E(" Extract Puzzle Data ",-1)])],8,hn)])):L("",!0)])]))),128))]),e("div",mn,[e("button",{type:"button",onClick:h[1]||(h[1]=_=>n.value?.click()),class:"btn btn-outline btn-sm"}," Add More Files ")])]))],34),i.value?(c(),d("div",gn,[e("span",pn,p(i.value),1)])):L("",!0)]))}}),yn={class:"card bg-base-100 shadow-xl"},_n={class:"card-body"},xn={key:0,class:"alert alert-info"},wn={class:"flex-1"},kn={class:"font-bold"},$n={class:"text-sm space-y-1 mt-1"},zn={class:"badge badge-ghost badge-sm ml-2"},Sn={key:1,class:"alert alert-warning"},Cn={class:"flex-1"},Pn={class:"text-sm"},Ln={class:"form-control"},Rn={class:"flex-1"},En={class:"flex label"},On={class:"label-text-alt"},Mn={class:"form-control"},Nn={class:"label cursor-pointer justify-start gap-3"},An=["disabled"],Dn={class:"card-actions justify-end"},jn=["disabled"],In={key:0,class:"loading loading-spinner loading-sm"},Tn={key:1},qn={key:2},Fn={key:3},Un=ue({__name:"SubmissionForm",props:{puzzles:{},findPuzzleByName:{type:Function}},setup(o){const a=o,s=os(),{submissionFiles:t,hasLowConfidence:n,submissionFilesNeedingManualSelection:r}=lt(s),{clearFiles:i,processLowConfidenceOCRFiles:v}=s,{handleSubmission:g}=rt(),b=O(""),k=O(!1),S=O(!1),w=se(()=>b.value.length),l=se(()=>{const m=t.value.length>0,f=!t.value.some(h=>h.needsManualPuzzleSelection);return m&&!S.value&&f});Ce(n,m=>{m&&(k.value=!0)});const u=se(()=>{const m={};return t.value.forEach(f=>{const h=f.manualPuzzleSelection||f.ocrData?.puzzle;h&&(m[h]||(m[h]={puzzle:a.findPuzzleByName(h),files:[]}),m[h].files.push(f))}),m}),y=async()=>{if(l.value){S.value=!0;try{g({files:t.value,notes:b.value.trim()||void 0,manualValidationRequested:n.value||k.value}),i(),b.value="",k.value=!1}catch(m){console.error("Submission error:",m)}finally{S.value=!1}}};return(m,f)=>(c(),d("div",yn,[e("div",_n,[f[9]||(f[9]=e("h2",{class:"card-title text-xl mb-6"},[e("i",{class:"mdi mdi-check-circle text-2xl text-primary"}),E(" Submit Solution ")],-1)),e("form",{onSubmit:et(y,["prevent"]),class:"space-y-6"},[Object.keys(u.value).length>0?(c(),d("div",xn,[f[3]||(f[3]=e("i",{class:"mdi mdi-information-outline text-xl"},null,-1)),e("div",wn,[e("h4",kn," Detected Puzzles ("+p(Object.keys(u.value).length)+") ",1),e("div",$n,[(c(!0),d(U,null,W(u.value,(h,_)=>(c(),d("div",{key:_,class:"flex justify-between"},[e("span",null,p(_),1),e("span",zn,p(h.files.length)+" file(s)",1)]))),128))])])])):L("",!0),ce(bn),q(r).length>0?(c(),d("div",Sn,[f[6]||(f[6]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",Cn,[f[5]||(f[5]=e("div",{class:"font-bold"},"Manual Puzzle Selection Required",-1)),e("div",Pn,p(q(r).length)+" file(s) have low OCR confidence for puzzle names. Please select the correct puzzle for each file before submitting. ",1),e("button",{class:"btn mt-3 w-full",onClick:f[0]||(f[0]=(...h)=>q(v)&&q(v)(...h))},[...f[4]||(f[4]=[e("span",{class:"mdi mdi-reload text-2xl"},null,-1),E(" Retry OCR on low confidence puzzle ",-1)])])])])):L("",!0),e("div",Ln,[e("div",Rn,[e("label",En,[f[7]||(f[7]=e("span",{class:"label-text font-medium"},"Notes (Optional)",-1)),e("span",On,p(w.value)+"/500",1)]),de(e("textarea",{"onUpdate:modelValue":f[1]||(f[1]=h=>b.value=h),class:"flex textarea textarea-bordered h-24 w-full resize-none",placeholder:"Add any notes about your solution, approach, or interesting findings...",maxlength:"500"},null,512),[[$e,b.value]])])]),e("div",Mn,[e("label",Nn,[de(e("input",{type:"checkbox","onUpdate:modelValue":f[2]||(f[2]=h=>k.value=h),class:"checkbox checkbox-primary",disabled:q(n)},null,8,An),[[ps,k.value]]),f[8]||(f[8]=e("div",{class:"flex-1"},[e("span",{class:"label-text font-medium"},"Request manual validation"),e("div",{class:"label-text-alt text-xs opacity-70 mt-1"},[E(" Check this if you want an admin to manually review your submission, even if OCR confidence is high. "),e("br"),e("em",null,"Note: This will be automatically checked if any OCR confidence is below 80%.")])],-1))])]),e("div",Dn,[e("button",{type:"submit",class:"btn btn-primary",disabled:!l.value},[S.value?(c(),d("span",In)):L("",!0),S.value?(c(),d("span",Tn,"Submitting...")):q(r).length>0?(c(),d("span",qn," Select Puzzles ("+p(q(r).length)+" remaining) ",1)):(c(),d("span",Fn,"Submit Solution"))],8,jn)])],32)])]))}}),Bn={class:"card bg-base-100 shadow-xl"},Vn={class:"card-body"},Gn={class:"stats stats-vertical lg:stats-horizontal shadow mb-6"},Wn={class:"stat"},Hn={class:"stat-value text-primary"},Jn={class:"stat"},Kn={class:"stat-value text-secondary"},Yn={class:"stat"},Zn={class:"stat-value text-warning"},Qn={class:"stat"},Xn={class:"stat-value text-success"},ea={key:0},ta={class:"overflow-x-auto"},sa={class:"table table-zebra"},oa={class:"font-bold"},na={class:"text-sm opacity-50"},aa={class:"text-sm space-y-1"},la={class:"flex justify-between items-center"},ra={class:"flex justify-between items-center"},ia={class:"flex justify-between items-center"},ca={class:"badge badge-warning badge-sm"},da=["onClick"],ua=["onClick"],fa={key:1,class:"text-center py-8"},va={key:0,class:"modal modal-open"},ha={class:"modal-box w-11/12 max-w-5xl"},ma=["src"],ga={key:0,class:"space-y-4"},pa={class:"alert alert-info"},ba={class:"font-bold"},ya={class:"grid grid-cols-4 gap-4"},_a={class:"form-control"},xa=["value"],wa={class:"form-control"},ka=["placeholder"],$a={class:"form-control"},za=["placeholder"],Sa={class:"form-control"},Ca=["placeholder"],Pa={class:"modal-action"},La=["disabled"],Ra={key:0,class:"loading loading-spinner loading-sm"},Ea={class:"mockup-code w-full"},Oa=ue({__name:"AdminPanel",setup(o,{expose:a}){const s=Le(),t=O({total_submissions:0,total_responses:0,needs_validation:0,validated_submissions:0,validation_rate:0}),n=O([]),r=O(!1),i=O(!1),v=O({show:!1,response:null,data:{puzzle:-1,validated_cost:0,validated_cycles:0,validated_area:0}}),g=async()=>{try{r.value=!0;try{const f=await te.getStats();f.data&&(t.value=f.data)}catch(f){console.warn("Stats endpoint not available:",f),t.value={total_submissions:0,total_responses:0,needs_validation:0,validated_submissions:0,validation_rate:0}}const m=await te.getResponsesNeedingValidation();m.data&&(n.value=m.data)}catch(m){console.error("Failed to load admin data:",m)}finally{r.value=!1}},b=async()=>{for(const m of Array.from(n.value)){if(!m.id)continue;const{data:f,error:h}=await te.autoValidateResponses(m.id);if(f&&!f.needs_manual_validation)n.value=n.value.filter(_=>_.id!==m.id),t.value.needs_validation-=1;else if(h)break}},k=m=>{v.value.response=m,v.value.data={puzzle:m.puzzle_id||-1,validated_cost:m.cost||0,validated_cycles:m.cycles||0,validated_area:m.area||0},v.value.show=!0},S=()=>{v.value.show=!1,v.value.response=null,v.value.data={puzzle:-1,validated_cost:0,validated_cycles:0,validated_area:0}},w=async m=>{const{data:f}=await te.autoValidateResponses(m);console.log(f),f&&!f.needs_manual_validation&&(n.value=n.value.filter(h=>h.id!==m),console.log(t.value),t.value.needs_validation-=1,console.log(t.value))},l=async()=>{if(v.value.response?.id)try{i.value=!0;const m=await te.validateResponse(v.value.response.id,v.value.data);if(m.error){alert(`Validation failed: ${m.error}`);return}n.value=n.value.filter(f=>f.id!==v.value.response?.id),t.value.needs_validation=Math.max(0,t.value.needs_validation-1),S()}catch(m){console.error("Validation error:",m),alert("Validation failed")}finally{i.value=!1}};pe(()=>{g()});const u=m=>m>=.8?"badge-success":m>=.6?"badge-warning":"badge-error",y=m=>{const f=[m.ocr_confidence_cost,m.ocr_confidence_cycles,m.ocr_confidence_area].filter(_=>_!=null);if(f.length===0)return 0;const h=f.reduce((_,M)=>_+M,0)/f.length;return Math.round(h*100)};return a({refresh:g}),(m,f)=>(c(),d(U,null,[e("div",Bn,[e("div",Vn,[f[14]||(f[14]=e("h2",{class:"card-title"},[e("i",{class:"mdi mdi-shield-account text-2xl text-warning"}),E(" Admin Panel ")],-1)),e("div",Gn,[e("div",Wn,[f[4]||(f[4]=e("div",{class:"stat-title"},"Total Submissions",-1)),e("div",Hn,p(t.value.total_submissions),1)]),e("div",Jn,[f[5]||(f[5]=e("div",{class:"stat-title"},"Total Responses",-1)),e("div",Kn,p(t.value.total_responses),1)]),e("div",Yn,[f[6]||(f[6]=e("div",{class:"stat-title"},"Need Validation",-1)),e("div",Zn,p(t.value.needs_validation),1)]),e("div",Qn,[f[7]||(f[7]=e("div",{class:"stat-title"},"Validation Rate",-1)),e("div",Xn,p(Math.round(t.value.validation_rate*100))+"% ",1)])]),e("button",{class:"btn btn-sm btn-primary",onClick:b},[...f[8]||(f[8]=[e("i",{class:"mdi mdi-check-circle mr-1"},null,-1),E(" Auto validation for all responses ",-1)])]),n.value.length>0?(c(),d("div",ea,[f[12]||(f[12]=e("h3",{class:"text-lg font-bold mb-4"},"Responses Needing Validation",-1)),e("div",ta,[e("table",sa,[f[11]||(f[11]=e("thead",null,[e("tr",null,[e("th",null,"Puzzle"),e("th",null,"OCR Data"),e("th",null,"Confidence"),e("th",null,"Actions")])],-1)),e("tbody",null,[(c(!0),d(U,null,W(n.value,h=>(c(),d("tr",{key:h.id},[e("td",null,[e("div",oa,p(h.puzzle_name),1),e("div",na,"ID: "+p(h.id),1)]),e("td",null,[e("div",aa,[e("div",la,[e("span",null,"Cost: "+p(h.cost||"-"),1),h.ocr_confidence_cost?(c(),d("span",{key:0,class:ne(["badge badge-xs",u(h.ocr_confidence_cost)])},p(Math.round(h.ocr_confidence_cost*100))+"% ",3)):L("",!0)]),e("div",ra,[e("span",null,"Cycles: "+p(h.cycles||"-"),1),h.ocr_confidence_cycles?(c(),d("span",{key:0,class:ne(["badge badge-xs",u(h.ocr_confidence_cycles)])},p(Math.round(h.ocr_confidence_cycles*100))+"% ",3)):L("",!0)]),e("div",ia,[e("span",null,"Area: "+p(h.area||"-"),1),h.ocr_confidence_area?(c(),d("span",{key:0,class:ne(["badge badge-xs",u(h.ocr_confidence_area)])},p(Math.round(h.ocr_confidence_area*100))+"% ",3)):L("",!0)])])]),e("td",null,[e("div",ca,p(y(h))+"% ",1)]),e("td",null,[e("button",{onClick:_=>k(h),class:"btn btn-sm btn-primary mr-2"},[...f[9]||(f[9]=[e("i",{class:"mdi mdi-check-circle mr-1"},null,-1),E(" Validate ",-1)])],8,da),h.id?(c(),d("button",{key:0,onClick:_=>w(h.id),class:"btn btn-sm btn-warning"},[...f[10]||(f[10]=[e("i",{class:"mdi mdi-check-circle mr-1"},null,-1),E(" Auto Validation ",-1)])],8,ua)):L("",!0)])]))),128))])])])])):(c(),d("div",fa,[...f[13]||(f[13]=[e("i",{class:"mdi mdi-check-all text-6xl text-success opacity-50"},null,-1),e("p",{class:"text-lg font-medium mt-2"},"All responses validated!",-1),e("p",{class:"text-sm opacity-70"}," No responses currently need manual validation. ",-1)])]))])]),v.value.show?(c(),d("div",va,[e("div",ha,[f[22]||(f[22]=e("h3",{class:"font-bold text-lg mb-4"},"Validate Response",-1)),(c(!0),d(U,null,W(v.value.response?.files??[],h=>(c(),d("div",null,[e("img",{src:h.file_url},null,8,ma)]))),256)),v.value.response?(c(),d("div",ga,[e("div",pa,[f[16]||(f[16]=e("i",{class:"mdi mdi-information-outline"},null,-1)),e("div",null,[e("div",ba,p(v.value.response.puzzle_name),1),f[15]||(f[15]=e("div",{class:"text-sm"},"Review and correct the OCR data below",-1))])]),e("div",ya,[e("div",_a,[f[18]||(f[18]=e("label",{class:"label"},[e("span",{class:"label-text"},"Puzzle")],-1)),de(e("select",{"onUpdate:modelValue":f[0]||(f[0]=h=>v.value.data.puzzle=h),class:"select select-bordered select-sm w-full"},[f[17]||(f[17]=e("option",{value:""},"Select puzzle...",-1)),(c(!0),d(U,null,W(q(s).puzzles,h=>(c(),d("option",{key:h.id,value:h.id},p(h.title),9,xa))),128))],512),[[Ht,v.value.data.puzzle]])]),e("div",wa,[f[19]||(f[19]=e("label",{class:"label"},[e("span",{class:"label-text"},"Cost")],-1)),de(e("input",{"onUpdate:modelValue":f[1]||(f[1]=h=>v.value.data.validated_cost=h),type:"text",class:"input input-bordered input-sm",placeholder:v.value.response.cost?.toString()||"Enter cost"},null,8,ka),[[$e,v.value.data.validated_cost]])]),e("div",$a,[f[20]||(f[20]=e("label",{class:"label"},[e("span",{class:"label-text"},"Cycles")],-1)),de(e("input",{"onUpdate:modelValue":f[2]||(f[2]=h=>v.value.data.validated_cycles=h),type:"text",class:"input input-bordered input-sm",placeholder:v.value.response.cycles?.toString()||"Enter cycles"},null,8,za),[[$e,v.value.data.validated_cycles]])]),e("div",Sa,[f[21]||(f[21]=e("label",{class:"label"},[e("span",{class:"label-text"},"Area")],-1)),de(e("input",{"onUpdate:modelValue":f[3]||(f[3]=h=>v.value.data.validated_area=h),type:"text",class:"input input-bordered input-sm",placeholder:v.value.response.area?.toString()||"Enter area"},null,8,Ca),[[$e,v.value.data.validated_area]])])]),e("div",Pa,[e("button",{onClick:S,class:"btn btn-ghost"}," Cancel "),e("button",{onClick:l,class:"btn btn-primary",disabled:i.value},[i.value?(c(),d("span",Ra)):L("",!0),E(" "+p(i.value?"Validating...":"Validate"),1)],8,La)]),e("div",Ea,[e("pre",null,[e("code",null,p(v.value),1)])])])):L("",!0)]),e("div",{class:"modal-backdrop",onClick:S})])):L("",!0)],64))}}),Ma={class:"mb-8"},Na={class:"grid grid-cols-1 lg:grid-cols-3 gap-8"},Aa={class:"lg:col-span-1"},Da={class:"card bg-base-100 shadow-lg sticky top-8"},ja={class:"card-body"},Ia={class:"text-center mb-6"},Ta={class:"text-3xl font-bold"},qa={key:0,class:"flex justify-center py-8"},Fa={key:1,class:"space-y-4"},Ua={class:"text-center"},Ba={key:0,class:"text-4xl font-bold text-primary"},Va={key:1,class:"text-2xl text-base-content/50"},Ga={class:"text-center"},Wa={class:"text-2xl font-bold"},Ha={class:"text-center"},Ja={class:"text-2xl font-bold"},Ka={class:"lg:col-span-2"},Ya={class:"card bg-base-100 shadow-lg"},Za={class:"card-body"},Qa={key:0,class:"flex justify-center py-8"},Xa={key:1,class:"text-center py-8"},el={key:2,class:"space-y-6"},tl={class:"tabs tabs-border"},sl={class:"space-y-4"},ol={key:0,class:"text-center py-8"},nl={key:1,class:"overflow-x-auto"},al={class:"table table-zebra w-full"},ll={class:"font-bold"},rl={class:"font-medium"},il={key:0,class:"badge badge-warning"},cl={class:"text-right"},dl={class:"text-right font-bold"},ul={class:"space-y-6"},fl=["onClick"],vl={class:"ml-auto badge badge-sm"},hl={key:0,class:"card-body"},ml={key:0,class:"text-center py-8"},gl={key:1,class:"space-y-6"},pl={key:0,class:"bg-base-200 p-4 rounded-lg"},bl={class:"grid grid-cols-3 gap-4"},yl={class:"text-center"},_l={class:"text-2xl font-bold text-primary"},xl={class:"text-center"},wl={class:"text-2xl font-bold text-primary"},kl={class:"text-center"},$l={class:"text-2xl font-bold text-primary"},zl={class:"grid grid-cols-1 md:grid-cols-3 gap-4"},Sl={class:"card-body p-4"},Cl={class:"text-xs text-base-content/70 font-bold"},Pl={class:"font-bold text-lg"},Ll={key:0,class:"badge badge-warning"},Rl={class:"space-y-2 text-sm"},El={class:"flex justify-between"},Ol={key:0,class:"text-xs text-base-content/60"},Ml={class:"badge badge-sm"},Nl={class:"flex justify-between"},Al={key:0,class:"text-xs text-base-content/60"},Dl={class:"badge badge-sm"},jl={class:"flex justify-between"},Il={key:0,class:"text-xs text-base-content/60"},Tl={class:"badge badge-sm"},ql={class:"flex justify-between pt-2 border-t"},Fl={class:"badge badge-sm"},Ul={class:"flex justify-between pt-2 border-t"},Bl={class:"badge badge-primary"},Vl={class:"overflow-x-auto"},Gl={class:"table table-zebra w-full table-sm"},Wl={class:"text-center"},Hl={key:0,class:"text-xs text-base-content/60 block"},Jl={class:"text-center"},Kl={key:0,class:"text-xs text-base-content/60 block"},Yl={class:"text-center"},Zl={key:0,class:"text-xs text-base-content/60 block"},Ql={class:"font-bold"},Xl={key:0,class:"badge badge-warning"},er={key:1,class:"badge"},tr={key:2,class:"badge"},sr={key:3},or={class:"font-medium"},nr={class:"text-center"},ar={key:0,class:"badge badge-sm"},lr={key:1,class:"text-base-content/40"},rr={class:"text-center"},ir={key:0,class:"badge badge-sm"},cr={key:1,class:"text-base-content/40"},dr={class:"text-center"},ur={key:0,class:"badge badge-sm"},fr={key:1,class:"text-base-content/40"},vr={class:"text-center"},hr={key:0,class:"badge badge-sm"},mr={key:1,class:"text-base-content/40"},gr={class:"text-right font-bold text-primary text-lg"},pr=ue({__name:"Results",setup(o){const a=O(!0),s=O(null),t=O("overall"),n=O(null),r=O({username:"Player",rank:null,totalPoints:0,puzzlesSolved:0,isStaff:!1}),i=async()=>{a.value=!0;try{const w=await fetch("/api/results/results");if(!w.ok)throw new Error("Failed to fetch results");s.value=await w.json()}catch(w){console.error("Error fetching results:",w)}finally{a.value=!1}},v=()=>s.value?s.value.users.map(l=>{const u=s.value.responses_by_userid[l.id]||[],y=u.reduce((f,h)=>f+(h.rank_points||0),0),m=u.length;return{user:l,totalPoints:y,puzzlesSolved:m}}).sort((l,u)=>u.totalPoints-l.totalPoints):[],g=w=>s.value?(s.value.ranking_by_puzzle[w]||[]).map(u=>({user:s.value.users.find(m=>m.id===u.user_id),cost:u.final_cost,cycles:u.final_cycles,area:u.final_area,points:u.points,rank_points:u.rank_points||0})).reverse():[],b=w=>{n.value=n.value===w?null:w},k=async()=>{try{const w=await fetch("/api/cache/clear",{method:"POST"});if(w.ok)alert("Cache cleared successfully!"),await i();else{const l=await w.json();alert(`Error clearing cache: ${l.detail||"Unknown error"}`)}}catch(w){console.error("Error clearing cache:",w),alert("Error clearing cache. Please try again.")}},S=async()=>{try{const w=await fetch("/api/user");if(w.ok){const l=await w.json();if(l.is_authenticated){r.value.username=l.username,r.value.isStaff=l.is_staff||!1,await i();const u=v(),y=u.findIndex(m=>m.user.id===l.id);y!==-1&&(r.value.rank=y+1,r.value.totalPoints=u[y].totalPoints,r.value.puzzlesSolved=u[y].puzzlesSolved)}}}catch(w){console.error("Error loading user data:",w),await i()}};return pe(()=>{S()}),(w,l)=>(c(),d("div",Ma,[e("div",Na,[e("div",Aa,[e("div",Da,[l[9]||(l[9]=e("div",{class:"bg-gradient-to-br from-purple-600 to-purple-400 p-6 text-white rounded-t-2xl"},[e("h3",{class:"text-3xl font-bold"},[e("i",{class:"mdi mdi-trophy text-3xl"}),E(" Your Ranking ")])],-1)),e("div",ja,[e("div",Ia,[l[2]||(l[2]=e("p",{class:"text-sm text-base-content/70"},"Player",-1)),e("p",Ta,p(r.value.username),1)]),l[8]||(l[8]=e("div",{class:"divider"},null,-1)),a.value?(c(),d("div",qa,[...l[3]||(l[3]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):(c(),d("div",Fa,[e("div",Ua,[l[4]||(l[4]=e("p",{class:"text-sm text-base-content/70 mb-1"},"Current Rank",-1)),r.value.rank!==null?(c(),d("p",Ba,[ce(ft,{rank:r.value.rank},null,8,["rank"])])):(c(),d("p",Va,"No rank yet"))]),e("div",Ga,[l[5]||(l[5]=e("p",{class:"text-sm text-base-content/70 mb-1"},"Total Points",-1)),e("p",Wa,p(r.value.totalPoints.toLocaleString()),1)]),e("div",Ha,[l[6]||(l[6]=e("p",{class:"text-sm text-base-content/70 mb-1"},"Puzzles Solved",-1)),e("p",Ja,p(r.value.puzzlesSolved),1)]),r.value.isStaff?(c(),d("button",{key:0,onClick:k,class:"btn btn-error btn-sm w-full mt-6"},[...l[7]||(l[7]=[e("i",{class:"mdi mdi-cache-clear mr-1"},null,-1),E(" Clear Cache ",-1)])])):L("",!0)]))])])]),e("div",Ka,[e("div",Ya,[e("div",Za,[l[37]||(l[37]=e("h2",{class:"card-title text-2xl mb-6"},[e("i",{class:"mdi mdi-trophy text-yellow-500 mr-2"}),E(" General Results ")],-1)),a.value?(c(),d("div",Qa,[...l[10]||(l[10]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):s.value?(c(),d("div",el,[e("div",tl,[e("button",{onClick:l[0]||(l[0]=u=>t.value="overall"),class:ne(["tab",t.value==="overall"?"tab-active":""])},[...l[12]||(l[12]=[e("i",{class:"mdi mdi-chart-line mr-2"},null,-1),E(" Overall Ranking ",-1)])],2),e("button",{onClick:l[1]||(l[1]=u=>t.value="byPuzzle"),class:ne(["tab",t.value==="byPuzzle"?"tab-active":""])},[...l[13]||(l[13]=[e("i",{class:"mdi mdi-puzzle mr-2"},null,-1),E(" By Puzzle ",-1)])],2)]),de(e("div",sl,[v().length===0?(c(),d("div",ol,[...l[14]||(l[14]=[e("p",{class:"text-base-content/70"},"No submissions yet",-1)])])):(c(),d("div",nl,[e("table",al,[l[15]||(l[15]=e("thead",null,[e("tr",null,[e("th",null,"Rank"),e("th",null,"Player"),e("th",{class:"text-right"},"Puzzles Solved"),e("th",{class:"text-right"},"Total Points")])],-1)),e("tbody",null,[(c(!0),d(U,null,W(v(),(u,y)=>(c(),d("tr",{key:u.user.username},[e("td",ll,[ce(ft,{rank:y+1},null,8,["rank"])]),e("td",rl,[E(p(u.user.username)+" ",1),u.user.is_staff?(c(),d("span",il," admin ")):L("",!0)]),e("td",cl,p(u.puzzlesSolved),1),e("td",dl,p(u.totalPoints),1)]))),128))])])]))],512),[[ut,t.value==="overall"]]),de(e("div",ul,[(c(!0),d(U,null,W(s.value.puzzles,u=>(c(),d("div",{key:u.id,class:"card bg-base-100 border border-base-300"},[e("button",{onClick:y=>b(u.id),class:"btn btn-ghost btn-lg w-full justify-start text-lg font-bold hover:bg-primary/20 rounded-b-none"},[e("i",{class:ne(["mdi mr-2",n.value===u.id?"mdi-chevron-down":"mdi-chevron-right"])},null,2),E(" "+p(u.title)+" ",1),e("span",vl,p(g(u.id).length)+" submissions ",1)],8,fl),n.value===u.id?(c(),d("div",hl,[g(u.id).length===0?(c(),d("div",ml,[...l[16]||(l[16]=[e("p",{class:"text-base-content/70 text-lg"},"No submissions yet",-1)])])):(c(),d("div",gl,[u.points_factor?(c(),d("div",pl,[l[23]||(l[23]=e("p",{class:"text-sm text-base-content/70 mb-3 font-semibold"},"Points Coefficients",-1)),e("div",bl,[e("div",yl,[e("span",_l,[l[17]||(l[17]=e("small",null,"x",-1)),E(p(u.points_factor.cost),1)]),l[18]||(l[18]=e("p",{class:"text-xs text-base-content/70"},"Cost",-1))]),e("div",xl,[e("span",wl,[l[19]||(l[19]=e("small",null,"x",-1)),E(p(u.points_factor.cycles),1)]),l[20]||(l[20]=e("p",{class:"text-xs text-base-content/70"},"Cycles",-1))]),e("div",kl,[e("span",$l,[l[21]||(l[21]=e("small",null,"x",-1)),E(p(u.points_factor.area),1)]),l[22]||(l[22]=e("p",{class:"text-xs text-base-content/70"},"Area",-1))])])])):L("",!0),e("div",zl,[(c(!0),d(U,null,W(g(u.id).slice(0,3),(y,m)=>(c(),d("div",{key:m,class:"card bg-base-200"},[e("div",Sl,[e("div",Cl,p(m===0?"🏆 1st Place":m===1?"🥈 2nd Place":"🥉 3rd Place"),1),e("h4",Pl,[E(p(y.user.username)+" ",1),y.user.is_staff?(c(),d("span",Ll," admin ")):L("",!0)]),l[29]||(l[29]=e("div",{class:"divider my-2"},null,-1)),e("div",Rl,[e("div",El,[e("span",null,[l[24]||(l[24]=E("Cost",-1)),u.points_factor?(c(),d("span",Ol," (x"+p(u.points_factor.cost)+") ",1)):L("",!0)]),e("span",Ml,p(y.cost||"N/A"),1)]),e("div",Nl,[e("span",null,[l[25]||(l[25]=E("Cycles",-1)),u.points_factor?(c(),d("span",Al," (x"+p(u.points_factor.cycles)+") ",1)):L("",!0)]),e("span",Dl,p(y.cycles||"N/A"),1)]),e("div",jl,[e("span",null,[l[26]||(l[26]=E("Area",-1)),u.points_factor?(c(),d("span",Il," (x"+p(u.points_factor.area)+") ",1)):L("",!0)]),e("span",Tl,p(y.area||"N/A"),1)]),e("div",ql,[l[27]||(l[27]=e("span",null,"Total (with coef.)",-1)),e("span",Fl,p(y.points||"N/A"),1)]),e("div",Ul,[l[28]||(l[28]=e("span",{class:"font-bold"},"Points",-1)),e("span",Bl,p(y.rank_points)+" pts",1)])])])]))),128))]),e("div",Vl,[e("table",Gl,[e("thead",null,[e("tr",null,[l[33]||(l[33]=e("th",{class:"w-12"},"Rank",-1)),l[34]||(l[34]=e("th",null,"Player",-1)),e("th",Wl,[l[30]||(l[30]=E(" Cost ",-1)),u.points_factor?(c(),d("span",Hl,"(x"+p(u.points_factor.cost)+")",1)):L("",!0)]),e("th",Jl,[l[31]||(l[31]=E(" Cycles ",-1)),u.points_factor?(c(),d("span",Kl,"(x"+p(u.points_factor.cycles)+")",1)):L("",!0)]),e("th",Yl,[l[32]||(l[32]=E(" Area ",-1)),u.points_factor?(c(),d("span",Zl,"(x"+p(u.points_factor.area)+")",1)):L("",!0)]),l[35]||(l[35]=e("th",{class:"text-center"},"Total (with coef.)",-1)),l[36]||(l[36]=e("th",{class:"text-right"},"Points",-1))])]),e("tbody",null,[(c(!0),d(U,null,W(g(u.id),(y,m)=>(c(),d("tr",{key:m,class:ne({"bg-primary/10":m<3})},[e("td",Ql,[m===0?(c(),d("span",Xl,"🏆")):m===1?(c(),d("span",er,"🥈")):m===2?(c(),d("span",tr,"🥉")):(c(),d("span",sr,"#"+p(m+1),1))]),e("td",or,p(y.user.username),1),e("td",nr,[y.cost?(c(),d("span",ar,p(y.cost),1)):(c(),d("span",lr,"—"))]),e("td",rr,[y.cycles?(c(),d("span",ir,p(y.cycles),1)):(c(),d("span",cr,"—"))]),e("td",dr,[y.area?(c(),d("span",ur,p(y.area),1)):(c(),d("span",fr,"—"))]),e("td",vr,[y.points?(c(),d("span",hr,p(y.points),1)):(c(),d("span",mr,"—"))]),e("td",gr,p(y.rank_points),1)],2))),128))])])])]))])):L("",!0)]))),128))],512),[[ut,t.value==="byPuzzle"]])])):(c(),d("div",Xa,[...l[11]||(l[11]=[e("p",{class:"text-base-content/70"},"No results available yet",-1)])]))])])])])]))}}),br={class:"card bg-base-100 shadow-lg"},yr={class:"card-body"},_r={key:0,class:"flex justify-center py-12"},xr={key:1,class:"alert alert-error"},wr={key:2,class:"text-center py-8"},kr={key:3,class:"overflow-x-auto"},$r={class:"table table-zebra"},zr={class:"font-semibold"},Sr={class:"text-right"},Cr={class:"text-right"},Pr={class:"text-right"},Lr={class:"text-right font-bold"},Rr={class:"text-right font-bold text-primary"},Er={class:"text-center"},Or=["onClick"],Mr={key:1,class:"text-base-content/50"},Nr={key:0,class:"modal modal-open"},Ar={class:"modal-box max-w-7xl w-full"},Dr={class:"flex justify-between items-center mb-4"},jr={class:"font-bold text-lg"},Ir={class:"flex justify-center bg-base-200 rounded-lg p-4"},Tr=["src","alt"],qr={class:"modal-action mt-4"},Fr=["href"],Ur=ue({__name:"Winners",setup(o){const a=O(!0),s=O(null),t=O(""),n=O(!1),r=O(""),i=O(""),v=async()=>{a.value=!0,t.value="";try{const w=await te.getTopSubmissions(5);w.data?s.value=w.data:w.error&&(t.value=w.error,console.error("Error fetching submissions:",w.error))}catch(w){t.value=w instanceof Error?w.message:"Failed to fetch submissions",console.error("Error fetching submissions:",w)}finally{a.value=!1}},g=w=>w!==void 0?w.toLocaleString():"—",b=se(()=>{if(!s.value)return[];const w=[];return s.value.submissions.forEach(l=>{l.submissions.forEach(u=>{w.push({puzzleName:l.puzzle_title,username:u.username,cost:u.final_cost,cycles:u.final_cycles,area:u.final_area,total:u.rank_points,totalCoef:u.total_coef,files:u.files.map(y=>({url:y.file_url,name:y.original_filename}))})})}),w.sort((l,u)=>(u.total||0)-(l.total||0))}),k=(w,l)=>{r.value=w,i.value=l,n.value=!0},S=()=>{n.value=!1,r.value="",i.value=""};return pe(()=>{v()}),(w,l)=>(c(),d(U,null,[e("div",br,[e("div",yr,[l[5]||(l[5]=e("h2",{class:"card-title text-2xl flex items-center gap-2"},[e("i",{class:"mdi mdi-trophy text-yellow-500 text-3xl"}),E(" Top Submissions ")],-1)),a.value?(c(),d("div",_r,[...l[0]||(l[0]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):t.value?(c(),d("div",xr,[l[1]||(l[1]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",null,p(t.value),1)])):b.value.length===0?(c(),d("div",wr,[...l[2]||(l[2]=[e("p",{class:"text-base-content/70"},"No results available yet.",-1)])])):(c(),d("div",kr,[e("table",$r,[l[4]||(l[4]=e("thead",null,[e("tr",null,[e("th",null,"Puzzle"),e("th",null,"User"),e("th",{class:"text-right"},"Cost"),e("th",{class:"text-right"},"Cycles"),e("th",{class:"text-right"},"Area"),e("th",{class:"text-right"},"Total Pts"),e("th",{class:"text-right"},"Total Coef"),e("th",{class:"text-center"},"GIF")])],-1)),e("tbody",null,[(c(!0),d(U,null,W(b.value,(u,y)=>(c(),d("tr",{key:y},[e("td",zr,p(u.puzzleName),1),e("td",null,p(u.username),1),e("td",Sr,p(g(u.cost)),1),e("td",Cr,p(g(u.cycles)),1),e("td",Pr,p(g(u.area)),1),e("td",Lr,p(g(u.total)),1),e("td",Rr,p(g(u.totalCoef)),1),e("td",Er,[u.files.length>0?(c(),d("button",{key:0,onClick:m=>k(u.files[0].url,u.files[0].name),class:"btn btn-xs btn-primary gap-1"},[...l[3]||(l[3]=[e("i",{class:"mdi mdi-image"},null,-1),E(" View ",-1)])],8,Or)):(c(),d("span",Mr,"—"))])]))),128))])])]))])]),n.value?(c(),d("div",Nr,[e("div",Ar,[e("div",Dr,[e("h3",jr,p(i.value),1),e("button",{onClick:S,class:"btn btn-sm btn-circle btn-ghost"},[...l[6]||(l[6]=[e("i",{class:"mdi mdi-close"},null,-1)])])]),e("div",Ir,[e("img",{src:r.value,alt:i.value,class:"object-contain"},null,8,Tr)]),e("div",qr,[e("a",{href:r.value,target:"_blank",class:"btn btn-primary btn-sm"},[...l[7]||(l[7]=[e("i",{class:"mdi mdi-download"},null,-1),E(" Download ",-1)])],8,Fr),e("button",{onClick:S,class:"btn btn-sm"},"Close")])]),e("div",{class:"modal-backdrop",onClick:S})])):L("",!0)],64))}}),Br={class:"card bg-base-100 shadow-lg"},Vr={class:"card-body"},Gr={key:0,class:"flex justify-center py-12"},Wr={key:1,class:"alert alert-error"},Hr={key:2,class:"text-center py-8"},Jr={key:3,class:"space-y-8"},Kr={class:"mb-4"},Yr={class:"text-xl font-bold mb-3"},Zr={key:0,class:"bg-base-200 p-3 rounded-lg mb-4"},Qr={class:"grid grid-cols-3 gap-2"},Xr={class:"text-center"},ei={class:"font-bold text-primary"},ti={class:"text-center"},si={class:"font-bold text-primary"},oi={class:"text-center"},ni={class:"font-bold text-primary"},ai={key:1,class:"bg-base-200 p-4 rounded-lg"},li={class:"flex flex-wrap justify-center gap-6"},ri={key:0,class:"text-center w-96"},ii={class:"text-sm text-base-content/70 mb-3 font-semibold truncate"},ci=["onClick"],di=["src","alt"],ui={key:0,class:"overflow-x-auto"},fi={class:"table table-sm table-zebra"},vi={class:"text-center text-lg font-bold"},hi={class:"font-semibold"},mi={class:"text-right"},gi={class:"text-right"},pi={class:"text-right"},bi={class:"text-right font-bold text-primary"},yi={class:"text-center"},_i=["onClick"],xi={key:1,class:"text-base-content/50"},wi={key:1,class:"p-4 bg-base-200 rounded-lg text-center text-base-content/70"},ki={key:0,class:"modal modal-open"},$i={class:"modal-box max-w-7xl w-full"},zi={class:"flex justify-between items-center mb-4"},Si={class:"font-bold text-lg"},Ci={class:"flex justify-center bg-base-200 rounded-lg p-4"},Pi=["src","alt"],Li={class:"modal-action mt-4"},Ri=["href"],Ei=ue({__name:"PuzzleResults",setup(o){const a=O(!0),s=O(null),t=O(""),n=O(!1),r=O(""),i=O(""),v=async()=>{a.value=!0,t.value="";try{const l=await te.getPuzzleResults(5);l.data?s.value=l.data:l.error&&(t.value=l.error,console.error("Error fetching results:",l.error))}catch(l){t.value=l instanceof Error?l.message:"Failed to fetch results",console.error("Error fetching results:",l)}finally{a.value=!1}},g=l=>l!==void 0?l.toLocaleString():"—",b=(l,u)=>{r.value=l,i.value=u,n.value=!0},k=()=>{n.value=!1,r.value="",i.value=""},S=l=>["🥇","🥈","🥉"][l-1]||`#${l}`,w=l=>{if(!l.submissions||l.submissions.length===0)return[];const u=l.submissions[0].rank_points;return l.submissions.filter(y=>y.rank_points===u)};return pe(()=>{v()}),(l,u)=>(c(),d(U,null,[e("div",Br,[e("div",Vr,[u[13]||(u[13]=e("h2",{class:"card-title text-2xl flex items-center gap-2"},[e("i",{class:"mdi mdi-table text-blue-500 text-3xl"}),E(" Results by Puzzle ")],-1)),a.value?(c(),d("div",Gr,[...u[0]||(u[0]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):t.value?(c(),d("div",Wr,[u[1]||(u[1]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",null,p(t.value),1)])):!s.value||s.value.results.length===0?(c(),d("div",Hr,[...u[2]||(u[2]=[e("p",{class:"text-base-content/70"},"No results available yet.",-1)])])):(c(),d("div",Jr,[(c(!0),d(U,null,W(s.value.results,y=>(c(),d("div",{key:y.puzzle_id,class:"border-b pb-8 last:border-b-0"},[e("div",Kr,[e("h3",Yr,p(y.puzzle_title),1),y.points_factor?(c(),d("div",Zr,[u[9]||(u[9]=e("p",{class:"text-xs text-base-content/70 font-semibold mb-2"},"Points Coefficients",-1)),e("div",Qr,[e("div",Xr,[e("span",ei,[u[3]||(u[3]=e("small",null,"x",-1)),E(p(y.points_factor.cost),1)]),u[4]||(u[4]=e("p",{class:"text-xs text-base-content/70"},"Cost",-1))]),e("div",ti,[e("span",si,[u[5]||(u[5]=e("small",null,"x",-1)),E(p(y.points_factor.cycles),1)]),u[6]||(u[6]=e("p",{class:"text-xs text-base-content/70"},"Cycles",-1))]),e("div",oi,[e("span",ni,[u[7]||(u[7]=e("small",null,"x",-1)),E(p(y.points_factor.area),1)]),u[8]||(u[8]=e("p",{class:"text-xs text-base-content/70"},"Area",-1))])])])):L("",!0),y.submissions.length>0&&w(y).length>0?(c(),d("div",ai,[u[10]||(u[10]=e("p",{class:"text-xs text-base-content/70 font-semibold mb-3 text-center"},"🏆 Winning Solutions",-1)),e("div",li,[(c(!0),d(U,null,W(w(y),m=>(c(),d(U,{key:`${y.puzzle_id}-${m.user_id}`},[m&&m.files&&m.files.length>0?(c(),d("div",ri,[e("div",ii,p(m.username),1),e("button",{onClick:f=>b(m.files[0].file_url,m.files[0].original_filename),class:"hover:opacity-80 transition-opacity cursor-pointer w-full flex items-center justify-center"},[e("img",{src:m.files[0].file_url,alt:`${y.puzzle_title} - ${m.username}`,class:"max-h-full max-w-full object-contain"},null,8,di)],8,ci)])):L("",!0)],64))),128))])])):L("",!0)]),y.submissions.length>0?(c(),d("div",ui,[e("table",fi,[u[12]||(u[12]=e("thead",null,[e("tr",null,[e("th",{class:"w-12 text-center"},"Pos"),e("th",null,"User"),e("th",{class:"text-right"},"Cost"),e("th",{class:"text-right"},"Cycles"),e("th",{class:"text-right"},"Area"),e("th",{class:"text-right font-bold"},"Total Pts"),e("th",{class:"text-right font-bold"},"Total Coef"),e("th",{class:"text-center"},"GIF")])],-1)),e("tbody",null,[(c(!0),d(U,null,W(y.submissions,m=>(c(),d("tr",{key:`${y.puzzle_id}-${m.user_id}`},[e("td",vi,p(S(m.rank)),1),e("td",hi,p(m.username),1),e("td",mi,p(g(m.final_cost)),1),e("td",gi,p(g(m.final_cycles)),1),e("td",pi,p(g(m.final_area)),1),e("td",{class:ne(["text-right font-bold",{"text-yellow-600":m.rank===1,"text-gray-600":m.rank===2,"text-orange-600":m.rank===3}])},p(g(m.rank_points)),3),e("td",bi,p(g(m.total_coef)),1),e("td",yi,[m.files.length>0?(c(),d("button",{key:0,onClick:f=>b(m.files[0].file_url,m.files[0].original_filename),class:"btn btn-xs btn-primary gap-1"},[...u[11]||(u[11]=[e("i",{class:"mdi mdi-image"},null,-1),E(" View ",-1)])],8,_i)):(c(),d("span",xi,"—"))])]))),128))])])])):(c(),d("div",wi," No submissions yet "))]))),128))]))])]),n.value?(c(),d("div",ki,[e("div",$i,[e("div",zi,[e("h3",Si,p(i.value),1),e("button",{onClick:k,class:"btn btn-sm btn-circle btn-ghost"},[...u[14]||(u[14]=[e("i",{class:"mdi mdi-close"},null,-1)])])]),e("div",Ci,[e("img",{src:r.value,alt:i.value,class:"object-contain"},null,8,Pi)]),e("div",Li,[e("a",{href:r.value,target:"_blank",class:"btn btn-primary btn-sm"},[...u[15]||(u[15]=[e("i",{class:"mdi mdi-download"},null,-1),E(" Download ",-1)])],8,Ri),e("button",{onClick:k,class:"btn btn-sm"},"Close")])]),e("div",{class:"modal-backdrop",onClick:k})])):L("",!0)],64))}}),Oi={class:"card bg-base-100 shadow-lg"},Mi={class:"card-body"},Ni={key:0,class:"flex justify-center py-12"},Ai={key:1,class:"alert alert-error"},Di={key:2,class:"text-center py-8"},ji={key:3,class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-3"},Ii={class:"text-3xl font-bold mb-2"},Ti={class:"font-semibold text-sm mb-2 truncate"},qi={class:"text-2xl font-bold text-primary"},Fi=ue({__name:"TopUsersLeaderboard",setup(o){const a=O(!0),s=O(null),t=O(""),n=async()=>{a.value=!0,t.value="";try{const i=await te.getPuzzleResults(100);i.data?s.value=i.data:i.error&&(t.value=i.error,console.error("Error fetching results:",i.error))}catch(i){t.value=i instanceof Error?i.message:"Failed to fetch results",console.error("Error fetching results:",i)}finally{a.value=!1}},r=()=>{if(!s.value)return[];const i={};return s.value.results.forEach(v=>{v.submissions.forEach(g=>{const b=g.user_id;i[b]||(i[b]={username:g.username,user_id:g.user_id,total_points:0}),i[b].total_points+=g.rank_points||0})}),Object.values(i).sort((v,g)=>g.total_points-v.total_points).slice(0,10)};return pe(()=>{n()}),(i,v)=>(c(),d("div",Oi,[e("div",Mi,[v[3]||(v[3]=e("h2",{class:"card-title text-2xl flex items-center gap-2"},[e("i",{class:"mdi mdi-podium text-yellow-500 text-3xl"}),E(" Top 10 Users ")],-1)),a.value?(c(),d("div",Ni,[...v[0]||(v[0]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):t.value?(c(),d("div",Ai,[v[1]||(v[1]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",null,p(t.value),1)])):r().length===0?(c(),d("div",Di,[...v[2]||(v[2]=[e("p",{class:"text-base-content/70"},"No results available yet.",-1)])])):(c(),d("div",ji,[(c(!0),d(U,null,W(r(),(g,b)=>(c(),d("div",{key:g.user_id,class:ne(["bg-base-200 p-4 rounded-lg text-center",{"ring-2 ring-yellow-500":b===0,"ring-2 ring-gray-400":b===1,"ring-2 ring-orange-400":b===2}])},[e("div",Ii,p(b===0?"🥇":b===1?"🥈":b===2?"🥉":`#${b+1}`),1),e("div",Ti,p(g.username),1),e("div",qi,p(g.total_points)+" pts",1)],2))),128))]))])]))}});function qt(o,a){return Gt()?(Wt(o,a),!0):!1}const Ft=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;function Ui(o,a=1e3,s={}){const{immediate:t=!0,immediateCallback:n=!1}=s;let r=null;const i=Jt(!1);function v(){r&&(clearInterval(r),r=null)}function g(){i.value=!1,v()}function b(){const k=ze(a);k<=0||(i.value=!0,n&&o(),v(),i.value&&(r=setInterval(o,k)))}return t&&Ft&&b(),(ge(a)||typeof a=="function")&&qt(Ce(a,()=>{i.value&&Ft&&b()})),qt(g),{isActive:bs(i),pause:g,resume:b}}function Bi(o,a){var s,t;const n=Jt(ze(o)),r=Ui(()=>{var k;const S=n.value-1;if(n.value=S<0?0:S,a==null||(k=a.onTick)===null||k===void 0||k.call(a),n.value<=0){var w;r.pause(),a==null||(w=a.onComplete)===null||w===void 0||w.call(a)}},(s=a?.interval)!==null&&s!==void 0?s:1e3,{immediate:(t=a?.immediate)!==null&&t!==void 0?t:!1}),i=k=>{var S;n.value=(S=ze(k))!==null&&S!==void 0?S:ze(o)},v=()=>{r.pause(),i()},g=()=>{r.isActive.value||n.value>0&&r.resume()};return{remaining:n,reset:i,stop:v,start:k=>{i(k),r.resume()},pause:r.pause,resume:g,isActive:r.isActive}}const Vi={class:"min-h-screen bg-base-200"},Gi={class:"navbar bg-base-100 shadow-lg"},Wi={class:"container min-w-3/4 mx-auto w-full flex items-center gap-4"},Hi={class:"flex items-center gap-4"},Ji={key:0,class:"flex items-center gap-2"},Ki={class:"text-sm"},Yi={class:"font-medium"},Zi={key:0,class:"badge badge-warning badge-xs ml-1"},Qi={key:1,class:"text-sm text-base-content/70"},Xi={class:"container min-w-3/4 mx-auto px-4 py-8"},ec={key:0,class:"flex justify-center"},tc={class:"text-center"},sc={class:"mb-6 text-base-content/70"},oc={key:1,class:"flex justify-center items-center min-h-[400px]"},nc={key:2,class:"alert alert-error max-w-2xl mx-auto"},ac={class:"text-sm"},lc={key:3,class:"space-y-8"},rc={key:0,class:"space-y-8"},ic={class:"mb-8"},cc={class:"card bg-base-100 shadow-lg"},dc={class:"card-body"},uc={class:"card-title text-2xl"},fc={class:"text-base-content/70"},vc={class:"flex flex-wrap gap-4 mt-4"},hc=["disabled"],mc={key:0,class:"alert alert-warning mt-4"},gc={key:0},pc={class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"},bc={key:1,class:"text-center py-12"},yc={key:0,class:"modal modal-open"},_c={class:"modal-box max-w-6xl"},xc={class:"flex justify-between items-center mb-4"},wc=ue({__name:"OpusMagnum",props:{collectionTitle:{},collectionUrl:{},collectionDescription:{}},setup(o){const a=o,s=Le(),t=rt(),{submissions:n,isSubmissionModalOpen:r}=lt(t),{openSubmissionModal:i,loadSubmissions:v,closeSubmissionModal:g}=t,b=O(null),k=O(null),S=O(!0),w=O(""),l=se(()=>b.value?.is_superuser||!1),u=se(()=>!!(k.value&&!k.value.accepting_submissions)),y=se(()=>{const F={};return n.value.forEach(C=>{C.responses.forEach(R=>{F[R.puzzle_id]||(F[R.puzzle_id]=[]),F[R.puzzle_id].push(R)})}),F});async function m(){try{S.value=!0,w.value="",console.log("Starting data load..."),console.log("Loading user info...");const F=await te.getUserInfo();F.data?(b.value=F.data,console.log("User info loaded:",F.data)):F.error&&console.warn("User info error:",F.error),console.log("Loading collection...");const C=await te.getCollection();C.data?(k.value=C.data,console.log("Collection loaded:",C.data)):C.error&&console.warn("Collection error:",C.error),console.log("Loading puzzles..."),await s.loadPuzzles(),console.log("Puzzles loaded:",s.puzzles.length),console.log("Loading submissions..."),await v(),console.log("Submissions loaded:",n.value.length),console.log("Data load complete!")}catch(F){w.value=Xt.getErrorMessage(F),console.error("Failed to load data:",F)}finally{S.value=!1,console.log("Loading state set to false")}b.value?.is_superuser&&h()}const{remaining:f,start:h}=Bi(60,{onComplete(){m()}});pe(async()=>{await m()});const _=F=>s.findPuzzleByName(F),M=()=>{window.location.reload()},D=()=>{window.location.href="/"};return(F,C)=>(c(),d("div",Vi,[e("div",Gi,[e("div",Wi,[e("button",{onClick:D,class:"btn btn-primary btn-sm"},[...C[3]||(C[3]=[e("i",{class:"mdi mdi-arrow-left"},null,-1),E(" Back ",-1)])]),C[6]||(C[6]=e("h1",{class:"text-xl font-bold"},"Opus Magnum Puzzle Submitter",-1)),C[7]||(C[7]=e("div",{class:"flex-1"},null,-1)),e("div",Hi,[b.value?.is_authenticated?(c(),d("div",Ji,[e("div",Ki,[e("span",Yi,p(b.value.username),1),b.value.is_superuser?(c(),d("span",Zi,"Admin")):L("",!0)])])):(c(),d("div",Qi,"Not logged in")),C[4]||(C[4]=e("a",{href:"/api/docs",class:"btn btn-xs"},"API docs",-1)),C[5]||(C[5]=e("a",{href:"/admin",class:"btn btn-xs btn-warning"},"Admin panel",-1))])])]),e("div",Xi,[b.value?.is_superuser?(c(),d("div",ec,[e("div",tc,[e("p",sc,[C[8]||(C[8]=e("span",{class:"loading loading-spinner loading-lg"},null,-1)),E(" Auto reload page in "+p(q(f))+" seconds ... ",1)])])])):L("",!0),S.value?(c(),d("div",oc,[...C[9]||(C[9]=[e("div",{class:"text-center"},[e("span",{class:"loading loading-spinner loading-lg"}),e("p",{class:"mt-4 text-base-content/70"},"Loading puzzles...")],-1)])])):w.value?(c(),d("div",nc,[C[12]||(C[12]=e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1)),e("div",null,[C[10]||(C[10]=e("h3",{class:"font-bold"},"Error Loading Data",-1)),e("div",ac,p(w.value),1)]),e("button",{onClick:M,class:"btn btn-sm btn-outline"},[...C[11]||(C[11]=[e("i",{class:"mdi mdi-refresh mr-1"},null,-1),E(" Retry ",-1)])])])):(c(),d("div",lc,[u.value?(c(),d("div",rc,[ce(Fi),ce(Ei),ce(Ur)])):(c(),d(U,{key:1},[e("div",ic,[e("div",cc,[e("div",dc,[e("h2",uc,p(a.collectionTitle),1),e("p",fc,p(a.collectionDescription),1),e("div",vc,[e("button",{onClick:C[0]||(C[0]=(...R)=>q(i)&&q(i)(...R)),class:"btn btn-primary",disabled:u.value},[...C[13]||(C[13]=[e("i",{class:"mdi mdi-plus mr-2"},null,-1),E(" Submit Solution ",-1)])],8,hc)]),u.value?(c(),d("div",mc,[...C[14]||(C[14]=[e("i",{class:"mdi mdi-alert-circle text-xl"},null,-1),e("div",null,[e("h3",{class:"font-bold"},"Tournament Closed"),e("div",{class:"text-sm"},"This tournament is no longer accepting new submissions.")],-1)])])):L("",!0)])])]),ce(pr),l.value?(c(),d("div",gc,[ce(Oa)])):L("",!0),e("div",pc,[(c(!0),d(U,null,W(q(s).puzzles,R=>(c(),ys(uo,{key:R.id,puzzle:R,responses:y.value[R.id]||[]},null,8,["puzzle","responses"]))),128))]),q(s).puzzles.length===0?(c(),d("div",bc,[...C[15]||(C[15]=[e("div",{class:"text-6xl mb-4"},"🧩",-1),e("h3",{class:"text-xl font-bold mb-2"},"No Puzzles Available",-1),e("p",{class:"text-base-content/70"}," Check back later for new puzzle collections! ",-1)])])):L("",!0)],64))]))]),q(r)?(c(),d("div",yc,[e("div",_c,[e("div",xc,[C[17]||(C[17]=e("h3",{class:"font-bold text-lg"},"Submit Solution",-1)),e("button",{onClick:C[1]||(C[1]=(...R)=>q(g)&&q(g)(...R)),class:"btn btn-sm btn-circle btn-ghost"},[...C[16]||(C[16]=[e("i",{class:"mdi mdi-close"},null,-1)])])]),ce(Un,{puzzles:q(s).puzzles,"find-puzzle-by-name":_},null,8,["puzzles"])]),e("div",{class:"modal-backdrop",onClick:C[2]||(C[2]=(...R)=>q(g)&&q(g)(...R))})])):L("",!0)]))}}),kc=xs(),ns="#app",$c=document.querySelector(ns),as=_s(wc,{...$c?.dataset});as.use(kc);as.mount(ns);
diff --git a/polylan_submitter/static_source/vite/manifest.json b/polylan_submitter/static_source/vite/manifest.json
index 7499ccb..3f1c271 100644
--- a/polylan_submitter/static_source/vite/manifest.json
+++ b/polylan_submitter/static_source/vite/manifest.json
@@ -59,7 +59,7 @@
]
},
"src/opus-magnum.ts": {
- "file": "assets/opus_magnum-BwlGd4nK.js",
+ "file": "assets/opus_magnum-Ce7rjJAF.js",
"name": "opus_magnum",
"src": "src/opus-magnum.ts",
"isEntry": true,