PageSourceSearch

https://technopark-luzern.lovable.app/assets/IdeasBoard-BOckmlO7.js

js technopark-luzern.lovable.app collected 2026-10-03 03:47:09 UTC 19,359 bytes, 2 lines download raw bytes

1import{Y as W,d as Y,Z as V,s as g,r as x,j as e,B as N,l as J,X as oe,m as q,p as R,y as ce,q as L,I as B,L as K,aI as de}from"./index-BghHNOje.js";import{S as D,a as I,b as A,c as E,d as b}from"./select-BuQ2jC-b.js";import{A as me,b as ue,c as he,d as pe,e as xe,f as ge,g as fe,h as je}from"./alert-dialog-mDrDk6Tk.js";import{B as U}from"./badge-BCCCWQE0.js";import{T as X}from"./textarea-CDQn81xI.js";import{I as ee}from"./IdeaVoiceButton-D58xZGfN.js";import{L as F}from"./loader-circle-B8iw8PN7.js";import{S as ve}from"./send-BJOv5R4x.js";import{I as ye}from"./image-plus-BZDDo5jQ.js";import{T as we}from"./thumbs-up-DLga2DBg.js";import{P as be}from"./pencil-BMlAIgGY.js";import{T as Ne}from"./trash-2-DU-Ld5Bw.js";import{C as Ce}from"./chevron-up-D-aySBK5.js";import{M as _e}from"./message-square-ChptD4Id.js";import{D as Se,a as De,b as Ie,c as Ae,e as Ee,f as ke}from"./dialog-Clo9IObs.js";import{P as Q}from"./plus-BjOZUKUH.js";import"./index-B6H0OFpw.js";import"./index-YvgZ23nC.js";import"./check-Cs64SJZX.js";import"./mic-wTOzDbDU.js";import"./square-CSGF2uBn.js";const Le=()=>{const t=W(),c=Y({queryKey:["admin-ideas"],queryFn:async()=>{var C;const{data:r}=await g.auth.getUser(),d=((C=r==null?void 0:r.user)==null?void 0:C.id)??null,[s,p,a]=await Promise.all([g.from("admin_ideas").select("*").order("created_at",{ascending:!1}),g.from("admin_idea_votes").select("idea_id, admin_id"),g.from("admin_idea_comments").select("idea_id")]);if(s.error)throw s.error;const n=s.data??[],f=p.data??[],y=a.data??[],v=Array.from(new Set(n.map(j=>j.created_by).filter(j=>!!j))),P=new Map;if(v.length){const{data:j}=await g.from("profiles").select("id, full_name, email").in("id",v);(j??[]).forEach(_=>{P.set(_.id,_.full_name||_.email||"Admin")})}return n.map(j=>{const _=f.filter(k=>k.idea_id===j.id);return{...j,authorName:j.created_by?P.get(j.created_by)??"Admin":"Admin",votes:_.length,hasVoted:!!d&&_.some(k=>k.admin_id===d),comments:y.filter(k=>k.idea_id===j.id).length}})}}),i=()=>t.invalidateQueries({queryKey:["admin-ideas"]}),h=V({mutationFn:async r=>{var p;const{data:d}=await g.auth.getUser(),{error:s}=await g.from("admin_ideas").insert({...r,created_by:((p=d==null?void 0:d.user)==null?void 0:p.id)??null});if(s)throw s},onSuccess:i}),m=V({mutationFn:async({id:r,...d})=>{const{error:s}=await g.from("admin_ideas").update(d).eq("id",r);if(s)throw s},onSuccess:i}),l=V({mutationFn:async r=>{const{error:d}=await g.from("admin_ideas").delete().eq("id",r);if(d)throw d},onSuccess:i}),u=V({mutationFn:async({ideaId:r,hasVoted:d})=>{var a;const{data:s}=await g.auth.getUser(),p=(a=s==null?void 0:s.user)==null?void 0:a.id;if(!p)throw new Error("Not signed in");if(d){const{error:n}=await g.from("admin_idea_votes").delete().eq("idea_id",r).eq("admin_id",p);if(n)throw n}else{const{error:n}=await g.from("admin_idea_votes").insert({idea_id:r,admin_id:p});if(n)throw n}},onSuccess:i});return{ideas:c.data??[],isLoading:c.isLoading,error:c.error,createIdea:h,updateIdea:m,deleteIdea:l,toggleVote:u,refetch:c.refetch}},Pe=t=>{const c=W(),i=Y({queryKey:["admin-idea-comments",t],enabled:!!t,queryFn:async()=>{const{data:m,error:l}=await g.from("admin_idea_comments").select("*").eq("idea_id",t).order("created_at",{ascending:!0});if(l)throw l;const u=m??[],r=Array.from(new Set(u.map(s=>s.created_by).filter(s=>!!s))),d=new Map;if(r.length){const{data:s}=await g.from("profiles").select("id, full_name, email").in("id",r);(s??[]).forEach(p=>d.set(p.id,p.full_name||p.email||"Admin"))}return u.map(s=>({...s,authorName:s.created_by?d.get(s.created_by)??"Admin":"Admin"}))}}),h=V({mutationFn:async m=>{var r;const{data:l}=await g.auth.getUser(),{error:u}=await g.from("admin_idea_comments").insert({idea_id:t,body:m,created_by:((r=l==null?void 0:l.user)==null?void 0:r.id)??null});if(u)throw u},onSuccess:()=>{c.invalidateQueries({queryKey:["admin-idea-comments",t]}),c.invalidateQueries({queryKey:["admin-ideas"]})}});return{comments:i.data??[],isLoading:i.isLoading,addComment:h}},Ue=({ideaId:t})=>{const{comments:c,isLoading:i,addComment:h}=Pe(t),[m,l]=x.useState(""),u=async()=>{const r=m.trim();r&&(await h.mutateAsync(r),l(""))};return e.jsxs("div",{className:"space-y-3 border-t pt-3 mt-3",children:[i?e.jsxs("div",{className:"text-xs text-muted-foreground flex items-center gap-2",children:[e.jsx(F,{className:"w-3 h-3 animate-spin"})," Loading comments…"]}):c.length===0?e.jsx("p",{className:"text-xs text-muted-foreground",children:"No comments yet."}):e.jsx("ul",{className:"space-y-2",children:c.map(r=>e.jsxs("li",{className:"rounded-md bg-muted/50 px-3 py-2",children:[e.jsxs("div",{className:"text-xs text-muted-foreground mb-1",children:[r.authorName," · ",new Date(r.created_at).toLocaleStr
1ing("en-GB",{timeZone:"Europe/Zurich"})]}),e.jsx("div",{className:"text-sm whitespace-pre-wrap",children:r.body})]},r.id))}),e.jsx(ee,{context:"Comment on an improvement idea for Technopark Luzern",hint:"Dictate a comment.",onResult:r=>l(d=>d?`${d}
2${r.description}`:r.description)}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(X,{rows:2,value:m,onChange:r=>l(r.target.value),placeholder:"Add a comment…"}),e.jsxs(N,{onClick:u,disabled:!m.trim()||h.isPending,className:"self-end gap-2",children:[h.isPending?e.jsx(F,{className:"w-4 h-4 animate-spin"}):e.jsx(ve,{className:"w-4 h-4"}),"Post"]})]})]})},te="admin-idea-images",Ve=["image/png","image/jpeg","image/webp"],Fe=8*1024*1024,ae=t=>{const[c,i]=x.useState(null);return x.useEffect(()=>{let h=!0;if(!t){i(null);return}return g.storage.from(te).createSignedUrl(t,3600).then(({data:m})=>{h&&i((m==null?void 0:m.signedUrl)??null)}),()=>{h=!1}},[t]),c},Te=({imagePath:t,onChange:c})=>{const{toast:i}=J(),h=x.useRef(null),[m,l]=x.useState(!1),[u,r]=x.useState(null),d=ae(u?null:t),s=u??d;x.useEffect(()=>()=>{u&&URL.revokeObjectURL(u)},[u]);const p=x.useCallback(async n=>{var f,y;if(!Ve.includes(n.type)){i({title:"Unsupported image",description:"Please use a PNG, JPEG or WebP image.",variant:"destructive"});return}if(n.size>Fe){i({title:"Image too large",description:"Please use an image under 8 MB.",variant:"destructive"});return}l(!0);try{const{data:v}=await g.auth.getUser(),P=((f=n.name.split(".").pop())==null?void 0:f.toLowerCase())||"png",C=`${((y=v==null?void 0:v.user)==null?void 0:y.id)??"admin"}/${Date.now()}-${Math.random().toString(36).slice(2,8)}.${P}`,{error:j}=await g.storage.from(te).upload(C,n,{contentType:n.type,upsert:!1});if(j)throw j;r(URL.createObjectURL(n)),c(C,n)}catch(v){i({title:"Upload failed",description:v instanceof Error?v.message:"Please try again.",variant:"destructive"})}finally{l(!1)}},[c,i]),a=()=>{u&&URL.revokeObjectURL(u),r(null),c(null,null),h.current&&(h.current.value="")};return e.jsxs("div",{className:"rounded-lg border border-dashed border-primary/40 bg-primary/5 p-3",onDragOver:n=>n.preventDefault(),onDrop:n=>{var y;n.preventDefault();const f=(y=n.dataTransfer.files)==null?void 0:y[0];f&&p(f)},children:[e.jsx("input",{ref:h,type:"file",accept:"image/png,image/jpeg,image/webp",capture:"environment",className:"hidden",onChange:n=>{var y;const f=(y=n.target.files)==null?void 0:y[0];f&&p(f)}}),s?e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("a",{href:s,target:"_blank",rel:"noopener noreferrer",children:e.jsx("img",{src:s,alt:"Attached idea picture",className:"h-16 w-16 rounded-md object-cover border border-border"})}),e.jsx("div",{className:"flex-1 min-w-0",children:e.jsx("p",{className:"text-xs text-muted-foreground",children:"Picture attached. Speak about it and the AI will use it as context."})}),e.jsxs(N,{type:"button",variant:"ghost",size:"sm",onClick:a,className:"gap-1",children:[e.jsx(oe,{className:"w-4 h-4"})," Remove"]})]}):e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs(N,{type:"button",size:"sm",variant:"secondary",className:"gap-2",disabled:m,onClick:()=>{var n;return(n=h.current)==null?void 0:n.click()},children:[m?e.jsx(F,{className:"w-4 h-4 animate-spin"}):e.jsx(ye,{className:"w-4 h-4"}),m?"Uploading…":"Add picture"]}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"Optional. Drop an image here, or take a photo on mobile."})]})]})},M=[{value:"community",label:"Community & Events"},{value:"facilities",label:"Facilities"},{value:"members",label:"Members & Startups"},{value:"marketing",label:"Marketing"},{value:"operations",label:"Operations"},{value:"other",label:"Other"}],T=[{value:"new",label:"New"},{value:"under_review",label:"Under review"},{value:"planned",label:"Planned"},{value:"in_progress",label:"In progress"},{value:"done",label:"Done"},{value:"parked",label:"Parked"}],Z=[{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"}],qe=t=>{var c;return((c=M.find(i=>i.value===t))==null?void 0:c.label)??"Other"},Re=t=>{switch(t){case"new":return"bg-primary/10 text-primary border-primary/20";case"under_review":return"bg-amber-500/10 text-amber-700 border-amber-500/20";case"planned":return"bg-sky-500/10 text-sky-700 border-sky-500/20";case"in_progress":return"bg-violet-500/10 text-violet-700 border-violet-500/20";case"done":return"bg-emerald-500/10 text-emerald-700 border-emerald-500/20";default:return"bg-muted text-muted-foreground border-border"}},Be=({idea:t,onEdit:c,onDelete:i,onVote:h,onStatusChange:m})=>{var d;const[l,u]=x.useState(!1),r=ae(t.image_path??null);return e.jsx(q,{className:"border-border",children:e.jsxs(R,{className:"p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsxs(N,{variant:t.hasVoted?"default":"outline",size:"sm",className:"flex-col h-auto py-1.5 px-2.5 gap-0.5",onClick:()=>h(t),"aria-label":t.hasVoted?"Remove upvote":"Upvote idea",children:[e.jsx(we,{className:"w-3.5 h-3.5"}),e.jsx("span",{className:"text-xs font-semibold",children:t.votes})]}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"font-semibold leading-snug",children:t.title}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5 mt-1.5",children:[e.jsx(U,{variant:"outline",className:Re(t.status),children:((d=T.find(s=>
2s.value===t.status))==null?void 0:d.label)??t.status}),e.jsx(U,{variant:"secondary",children:qe(t.category)}),e.jsxs(U,{variant:"outline",children:["Impact: ",t.impact]}),e.jsxs(U,{variant:"outline",children:["Effort: ",t.effort]}),t.target&&e.jsx(U,{variant:"outline",children:t.target})]}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-1.5",children:[t.authorName," · ",new Date(t.created_at).toLocaleDateString("en-GB",{timeZone:"Europe/Zurich"})]})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsxs(D,{value:t.status,onValueChange:s=>m(t,s),children:[e.jsx(I,{className:"h-8 w-[140px] text-xs",children:e.jsx(A,{})}),e.jsx(E,{children:T.map(s=>e.jsx(b,{value:s.value,children:s.label},s.value))})]}),e.jsx(N,{variant:"ghost",size:"icon",onClick:()=>c(t),"aria-label":"Edit idea",children:e.jsx(be,{className:"w-4 h-4"})}),e.jsx(N,{variant:"ghost",size:"icon",onClick:()=>i(t),"aria-label":"Delete idea",children:e.jsx(Ne,{className:"w-4 h-4 text-destructive"})})]})]}),r&&e.jsx("a",{href:r,target:"_blank",rel:"noopener noreferrer",className:"inline-block",children:e.jsx("img",{src:r,alt:`Picture for idea: ${t.title}`,className:"h-24 w-auto max-w-full rounded-md object-cover border border-border",loading:"lazy"})}),t.description&&e.jsx("p",{className:`text-sm text-muted-foreground whitespace-pre-wrap ${l?"":"line-clamp-2"}`,children:t.description}),e.jsxs(N,{variant:"ghost",size:"sm",className:"gap-2 text-xs",onClick:()=>u(s=>!s),children:[l?e.jsx(Ce,{className:"w-3.5 h-3.5"}):e.jsx(ce,{className:"w-3.5 h-3.5"}),e.jsx(_e,{className:"w-3.5 h-3.5"}),t.comments," ",t.comments===1?"comment":"comments"]}),l&&e.jsx(Ue,{ideaId:t.id})]})})},H={title:"",description:"",category:"community",status:"new",impact:"medium",effort:"medium",target:"",image_path:null},Me=({open:t,onOpenChange:c,idea:i,onSave:h,saving:m})=>{const[l,u]=x.useState(H),[r,d]=x.useState(null);x.useEffect(()=>{t&&(u(i?{title:i.title,description:i.description,category:i.category,status:i.status,impact:i.impact,effort:i.effort,target:i.target??"",image_path:i.image_path??null}:H),d(null))},[t,i]);const s=(a,n)=>u(f=>({...f,[a]:n})),p=async()=>{var a;l.title.trim()&&(await h({...l,title:l.title.trim(),target:((a=l.target)==null?void 0:a.trim())||null}),c(!1))};return e.jsx(Se,{open:t,onOpenChange:c,children:e.jsxs(De,{className:"max-w-2xl max-h-[90vh] overflow-y-auto",children:[e.jsxs(Ie,{children:[e.jsx(Ae,{children:i?"Edit idea":"New idea"}),e.jsx(Ee,{children:"Capture an improvement idea for Technopark Luzern. You can dictate it and let AI write it up."})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx(Te,{imagePath:l.image_path??null,onChange:(a,n)=>{s("image_path",a),d(n)}}),!i&&e.jsx(ee,{image:r,onResult:a=>u(n=>({...n,title:a.title||n.title,description:a.description||n.description,category:a.category||n.category}))}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(L,{htmlFor:"idea-title",children:"Title"}),e.jsx(B,{id:"idea-title",value:l.title,onChange:a=>s("title",a.target.value),placeholder:"Make Drinks O'Clock a monthly community ritual"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(L,{htmlFor:"idea-description",children:"Description"}),e.jsx(X,{id:"idea-description",rows:6,value:l.description,onChange:a=>s("description",a.target.value),placeholder:"What is the idea, why does it help, and what would be the next step?"})]}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(L,{children:"Category"}),e.jsxs(D,{value:l.category,onValueChange:a=>s("category",a),children:[e.jsx(I,{children:e.jsx(A,{})}),e.jsx(E,{children:M.map(a=>e.jsx(b,{value:a.value,children:a.label},a.value))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(L,{children:"Status"}),e.jsxs(D,{value:l.status,onValueChange:a=>s("status",a),children:[e.jsx(I,{children:e.jsx(A,{})}),e.jsx(E,{children:T.map(a=>e.jsx(b,{value:a.value,children:a.label},a.value))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(L,{children:"Impact"}),e.jsxs(D,{value:l.impact,onValueChange:a=>s("impact",a),children:[e.jsx(I,{children:e.jsx(A,{})}),e.jsx(E,{children:Z.map(a=>e.jsx(b,{value:a.value,children:a.label},a.value))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(L,{children:"Effort"}),e.jsxs(D,{value:l.effort,onValueChange:a=>s("effort",a),children:[e.jsx(I,{children:e.jsx(A,{})}),e.jsx(E,{children:Z.map(a=>e.jsx(b,{value:a.value,children:a.label},a.value))})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(L,{htmlFor:"idea-target",children:"Owner or target (optional)"}),e.jsx(B,{id:"idea-target",value:l.target??"",onChange:a=>s("target",a.target.value),placeholder:"e.g. Julia, Q3 2026"})]})]}),e.jsxs(ke,{children:[e.jsx(N,{variant:"outline",onClick:()=>c(!1),children:"Cancel"}),e.jsxs(N,{onClick:p,disabled:!l.title.trim()||m,children:[m&&e.jsx(F,{className:"w-4 h-4 mr-2 animate-spin"}),i?"Save changes":"Add idea"]})]})]})})},ct=()=>{const{toast:t}=J(),{ideas:c,isLoading:i,createIdea:h,updateIdea:m,deleteIdea:l,toggleVote:u}=Le(),[r,d]=x.useState(!1),[s,p]=x.useState(null),[a,n]=x.useState(null),[f,y]=x.useState(""),[v,P]=x.use
2State("all"),[C,j]=x.useState("all"),[_,k]=x.useState("newest"),O=x.useMemo(()=>{const o=f.trim().toLowerCase(),S=c.filter(w=>!(v!=="all"&&w.status!==v||C!=="all"&&w.category!==C||o&&!`${w.title} ${w.description} ${w.target??""}`.toLowerCase().includes(o)));return _==="votes"?[...S].sort((w,G)=>G.votes-w.votes||+new Date(G.created_at)-+new Date(w.created_at)):S},[c,f,v,C,_]),$=()=>{p(null),d(!0)},se=o=>{p(o),d(!0)},re=async o=>{try{s?(await m.mutateAsync({id:s.id,...o}),t({title:"Idea updated"})):(await h.mutateAsync(o),t({title:"Idea added"}))}catch(S){t({title:"Could not save idea",description:S instanceof Error?S.message:"Please try again.",variant:"destructive"})}},ne=async()=>{if(a)try{await l.mutateAsync(a.id),t({title:"Idea deleted"})}catch(o){t({title:"Could not delete idea",description:o instanceof Error?o.message:"Please try again.",variant:"destructive"})}finally{n(null)}},ie=async o=>{try{await u.mutateAsync({ideaId:o.id,hasVoted:o.hasVoted})}catch(S){t({title:"Vote failed",description:S instanceof Error?S.message:"Please try again.",variant:"destructive"})}},le=async(o,S)=>{try{await m.mutateAsync({id:o.id,status:S})}catch(w){t({title:"Could not update status",description:w instanceof Error?w.message:"Please try again.",variant:"destructive"})}},z=c.filter(o=>!["done","parked"].includes(o.status)).length;return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsxs("h2",{className:"text-xl font-semibold flex items-center gap-2",children:[e.jsx(K,{className:"w-5 h-5 text-primary"})," Ideation board"]}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:[z," open ",z===1?"idea":"ideas"," · dictate a thought and let AI write it up."]})]}),e.jsxs(N,{onClick:$,className:"gap-2",children:[e.jsx(Q,{className:"w-4 h-4"})," New idea"]})]}),e.jsx(q,{children:e.jsxs(R,{className:"p-3 flex flex-wrap gap-2",children:[e.jsxs("div",{className:"relative flex-1 min-w-[200px]",children:[e.jsx(de,{className:"absolute left-2.5 top-2.5 w-4 h-4 text-muted-foreground"}),e.jsx(B,{className:"pl-8",placeholder:"Search ideas…",value:f,onChange:o=>y(o.target.value)})]}),e.jsxs(D,{value:v,onValueChange:P,children:[e.jsx(I,{className:"w-[160px]",children:e.jsx(A,{})}),e.jsxs(E,{children:[e.jsx(b,{value:"all",children:"All statuses"}),T.map(o=>e.jsx(b,{value:o.value,children:o.label},o.value))]})]}),e.jsxs(D,{value:C,onValueChange:j,children:[e.jsx(I,{className:"w-[180px]",children:e.jsx(A,{})}),e.jsxs(E,{children:[e.jsx(b,{value:"all",children:"All categories"}),M.map(o=>e.jsx(b,{value:o.value,children:o.label},o.value))]})]}),e.jsxs(D,{value:_,onValueChange:o=>k(o),children:[e.jsx(I,{className:"w-[150px]",children:e.jsx(A,{})}),e.jsxs(E,{children:[e.jsx(b,{value:"newest",children:"Newest first"}),e.jsx(b,{value:"votes",children:"Most upvotes"})]})]})]})}),i?e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground py-8 justify-center",children:[e.jsx(F,{className:"w-4 h-4 animate-spin"})," Loading ideas…"]}):O.length===0?e.jsx(q,{children:e.jsxs(R,{className:"py-12 text-center space-y-3",children:[e.jsx(K,{className:"w-8 h-8 mx-auto text-muted-foreground"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:c.length===0?"No ideas yet. Capture your first improvement idea.":"No ideas match the current filters."}),c.length===0&&e.jsxs(N,{onClick:$,className:"gap-2",children:[e.jsx(Q,{className:"w-4 h-4"})," New idea"]})]})}):e.jsx("div",{className:"space-y-3",children:O.map(o=>e.jsx(Be,{idea:o,onEdit:se,onDelete:n,onVote:ie,onStatusChange:le},o.id))}),e.jsx(Me,{open:r,onOpenChange:d,idea:s,onSave:re,saving:h.isPending||m.isPending}),e.jsx(me,{open:!!a,onOpenChange:o=>!o&&n(null),children:e.jsxs(ue,{children:[e.jsxs(he,{children:[e.jsx(pe,{children:"Delete this idea?"}),e.jsxs(xe,{children:['"',a==null?void 0:a.title,'" and its comments will be permanently removed.']})]}),e.jsxs(ge,{children:[e.jsx(fe,{children:"Cancel"}),e.jsx(je,{onClick:ne,children:"Delete"})]})]})})]})};export{ct as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.