rsrc/extra/rsrc.html
2026-10-20 10:07:18 +00:00

22 lines
31 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="color-scheme" content="dark"><meta name="theme-color" content="#050506"><title>rsrc</title><link rel="preconnect" href="https://raw.githubusercontent.com"><link rel="preconnect" href="https://api.fmhy.net"><link rel="dns-prefetch" href="//raw.githubusercontent.com"><link rel="dns-prefetch" href="//api.fmhy.net"><style>:root{--bg:#050506;--panel:#09090b;--panel-hover:#101013;--fg:#e4e4e7;--title:#fff;--head:#d4d4d8;--link:#f4f4f5;--muted:#a1a1aa;--soft:#71717a;--line:#202024;--line-strong:#3a3a42;--mark:#ffffff24;--max:112rem;--sidebar:17rem;--content-max:92rem;--header-h:3.6rem;--chip:#111113;--chip-b:#27272a;--chip-a:#18181b;--chip-t:#d4d4d8;--ok:#86efac;--warn:#facc15}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;min-width:320px;background:radial-gradient(75rem 38rem at 55% -22rem,#1a1a22 0,#08080a 48%,var(--bg) 100%),var(--bg);color:var(--fg);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"SF Pro Text","Segoe UI",Roboto,Helvetica,Arial,sans-serif;font-size:.94rem;line-height:1.62;letter-spacing:-.01em;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;text-transform:lowercase}a{color:var(--link);text-decoration:none;text-decoration-thickness:1px;text-underline-offset:.18em;overflow-wrap:anywhere;text-transform:none}a:focus-visible,a:hover{text-decoration:underline}button,input{font:inherit;text-transform:lowercase}a:focus-visible,button:focus-visible,input:focus-visible{outline:2px solid #fff;outline-offset:3px}.topbar{position:sticky;top:0;z-index:1000;backdrop-filter:saturate(140%) blur(10px);background:linear-gradient(to bottom,rgba(5,5,6,.96),rgba(5,5,6,.88));border-bottom:1px solid var(--line)}.topbar-inner{width:min(96vw,var(--max));height:var(--header-h);margin:0 auto;display:flex;align-items:center;justify-content:space-between;gap:1rem}.topbar-brand{display:inline-flex;align-items:center;gap:.7rem;color:var(--title);font-size:.92rem;font-weight:700;letter-spacing:-.02em;white-space:nowrap;text-transform:lowercase}.brand-mark{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:24px;height:24px;margin-left:.1rem}.brand-mark svg{display:block;width:3px;height:3px;shape-rendering:geometricPrecision}.topbar-nav{display:flex;align-items:center;gap:.4rem;flex-wrap:wrap}.topbar-link{display:inline-flex;align-items:center;min-height:2rem;padding:.38rem .68rem;border:1px solid transparent;border-radius:.5rem;color:var(--muted);font-size:.82rem;line-height:1;white-space:nowrap}.topbar-link:focus-visible,.topbar-link:hover{background:var(--panel-hover);border-color:var(--line-strong);color:var(--head);text-decoration:none}.wrap{width:min(96vw,var(--max));margin:0 auto;padding:clamp(1.5rem,3vw,3rem) 0 4rem;display:grid;grid-template-columns:var(--sidebar) minmax(0,1fr);gap:clamp(2rem,4vw,4.5rem);align-items:start}.sidebar{min-width:0;align-self:start}.sidebar-head{position:sticky;top:var(--header-h);z-index:10;padding:0 0 1rem;background:linear-gradient(to bottom,var(--bg) 82%,#05050600)}.search-wrap{position:relative}.toolbar{display:flex;gap:.45rem;align-items:center;justify-content:flex-start;margin:.65rem 0 0;flex-wrap:wrap}.chips{display:flex;gap:.4rem;flex-wrap:wrap;align-items:center}.chip{display:inline-flex;align-items:center;min-height:1.75rem;padding:.22rem .55rem;border:1px solid var(--chip-b);border-radius:999px;background:var(--chip);color:var(--chip-t);font-size:.72rem;font-weight:600;line-height:1;cursor:pointer;user-select:none}.chip:hover,.chip:focus-visible{background:var(--chip-a);text-decoration:none}.chip.active{background:#f4f4f5;color:#0a0a0b;border-color:#f4f4f5}#search{width:100%;height:2.45rem;padding:.5rem 2.3rem .5rem .75rem;border:1px solid var(--line-strong);border-radius:.6rem;outline:0;background:#0c0c0f;color:var(--title);font-size:.84rem;transition:border-color .18s ease,background .18s ease}#search::placeholder{color:var(--soft);text-transform:lowercase}#search:focus{border-color:#85858e;background:#111114}#search-clear{position:absolute;top:50%;right:.4rem;display:none;width:1.7rem;height:1.7rem;padding:0;border:0;border-radius:.35rem;transform:translateY(-50%);background:0 0;color:var(--muted);line-height:1;cursor:pointer}#search-clear:hover{background:var(--panel-hover);color:var(--title)}.sidebar-nav{display:flex;flex-direction:column;gap:.18rem;padding-bottom:1rem}.sidebar-link{display:flex;align-items:center;gap:.5rem;overflow:hidden;min-height:2rem;padding:.4rem .52rem;border:1px solid transparent;border-radius:.45rem;color:var(--muted);font-size:.8rem;line-height:1.25;text-decoration:none;cursor:pointer}.sidebar-link.active,.sidebar-link:hover{background:var(--panel-hover);color:var(--head);text-decoration:none}.sidebar-link.active{border-color:var(--line-strong);box-shadow:inset 2px 0 0 #fff}.sidebar-link input{flex:0 0 auto;width:.85rem;height:.85rem;margin:0;accent-color:#fff;cursor:pointer}.sidebar-link span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.content{width:min(100%,var(--content-max));min-width:0}.meta{margin:0 0 .3rem;color:var(--title);font-size:1.15rem;font-weight:650;letter-spacing:-.025em;text-transform:lowercase}.statusline{display:flex;gap:.75rem;align-items:center;justify-content:space-between;flex-wrap:wrap;margin:0 0 .7rem}.empty,.status,.freshness,.offline-msg{margin:0;color:var(--soft);font-size:.78rem}.offline-msg,.freshness{padding:.45rem .65rem;border:1px solid var(--line);border-radius:.55rem;background:#0b0b0d}.offline-msg{color:#d4d4d8}.freshness-list{display:flex;gap:.4rem;flex-wrap:wrap}.fresh-source{display:inline-flex;align-items:center;gap:.35rem;min-height:1.55rem;padding:.18rem .45rem;border:1px solid var(--line);border-radius:.4rem;background:#0b0b0d;color:var(--soft);font-size:.7rem}.fresh-source b{color:var(--head);font-weight:650;text-transform:none}.fresh-ok{color:var(--ok)}.fresh-warn{color:var(--warn)}.empty{padding:1.25rem 0;border-top:1px solid var(--line)}.grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2.2rem 3rem;align-items:start}.cat{min-width:0;padding:1rem 0 0;border-top:1px solid var(--line);scroll-margin-top:calc(var(--header-h) + 1.5rem);content-visibility:auto;contain-intrinsic-size:auto 34rem}.cat-title{display:flex;flex-wrap:wrap;align-items:center;gap:.35rem;margin:0 0 .7rem;color:var(--head);font-size:.92rem;line-height:1.35;font-weight:700;letter-spacing:-.01em;text-transform:lowercase}.cat-title>a:first-child{color:var(--head)}.cat-title>a:first-child:hover{color:var(--title)}.source-tag{display:inline-flex;align-items:center;min-height:1.35rem;margin-left:.15rem;padding:.08rem .38rem;border:1px solid var(--line-strong);border-radius:.3rem;color:var(--soft);font-size:.62rem;font-weight:650;letter-spacing:.055em;line-height:1;text-decoration:none;text-transform:uppercase;vertical-align:middle}.source-tag:focus-visible,.source-tag:hover{border-color:#74747d;color:var(--head);text-decoration:none}ul{margin:0;padding-left:1.05rem;list-style:disc}li{margin:.38rem 0;padding-left:0}li::marker{color:#66666f;font-size:.9em}.children{margin-top:.28rem;padding:.08rem 0 .05rem .6rem;border-left:1px solid #25252a}.children ul{padding-left:1rem}.children li{margin:.28rem 0}.inline-links{display:inline;vertical-align:middle}.inline-links .sep{margin:0 .22rem;color:var(--soft)}.item-name,.result-link{color:var(--link);font-weight:620;letter-spacing:-.012em}.result-link:hover{color:var(--title)}.github-link::after{content:" ↗";color:var(--soft);font-size:.75em;font-weight:400}.desc{color:var(--muted)}.result-desc{display:inline;margin:0 0 0 .28rem;color:var(--muted);font-size:.92em;line-height:inherit}.result-desc::before{content:"— ";color:var(--soft)}.item-badges{display:inline-flex;gap:.28rem;flex-wrap:wrap;vertical-align:middle;margin-left:.38rem}.item-badge{display:inline-flex;align-items:center;min-height:1.2rem;padding:.02rem .3rem;border:1px solid var(--line);border-radius:.28rem;background:#0d0d10;color:var(--soft);font-size:.58rem;font-weight:700;letter-spacing:.04em;line-height:1;text-transform:uppercase}mark{padding:0 .1em;border-radius:.15rem;background:var(--mark);color:#fff}.search-selected{border-radius:.2rem;background:#ffffff24;box-shadow:0 0 0 .15rem #ffffff24}#jump-top{position:fixed;right:1rem;bottom:1rem;z-index:999;display:none;align-items:center;justify-content:center;width:2.35rem;height:2.35rem;padding:0;border:1px solid var(--line-strong);border-radius:999px;background:rgba(12,12,15,.92);color:#fff;box-shadow:0 6px 24px rgba(0,0,0,.32);backdrop-filter:blur(10px);cursor:pointer}#jump-top:hover,#jump-top:focus-visible{background:#17171b}footer{margin-top:3rem;padding-top:1rem;border-top:1px solid var(--line);color:var(--soft);font-size:.78rem}footer a{margin-right:.32rem;color:var(--muted)}footer a:hover{color:var(--head)}[hidden]{display:none!important}@media(min-width:122rem){.grid{grid-template-columns:repeat(3,minmax(20rem,1fr));gap:2.3rem 2.75rem}}@media(max-width:72rem){:root{--sidebar:14.5rem}.wrap{width:min(95vw,var(--max));gap:2rem}.topbar-inner{width:min(95vw,var(--max))}.grid{gap:1.6rem 1.8rem}}@media(max-width:56rem){.wrap{grid-template-columns:13rem minmax(0,1fr);gap:1.4rem}.grid{grid-template-columns:1fr;gap:1.4rem}}@media(max-width:40rem){body{font-size:.88rem}:root{--header-h:auto}.topbar{position:sticky;top:0}.topbar-inner{width:92%;min-height:3.4rem;padding:.55rem 0;align-items:flex-start;flex-direction:column;justify-content:center}.wrap{display:block;width:92%;padding-top:1.1rem}.sidebar{margin-bottom:1.35rem}.sidebar-head{position:relative;top:auto;padding-bottom:.65rem}.sidebar-nav{display:grid;grid-template-columns:repeat(auto-fit,minmax(9.5rem,1fr));gap:.32rem;max-height:14rem;overflow-y:auto}.sidebar-link{border-color:var(--line)}.cat{padding-top:.85rem;contain-intrinsic-size:auto 28rem}#jump-top{display:flex}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}#search{transition:none}}</style></head><body><header class="topbar" aria-label="site header"><div class="topbar-inner"><a class="topbar-brand" href="/"><span class="brand-mark" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none"><rect x="3" y="3" width="18" height="18" rx="0" fill="#fff"/><rect x="8" y="8" width="8" height="8" rx="0" fill="#050506"/></svg></span><span></span></a><nav class="topbar-nav" aria-label="site links"><a class="topbar-link" href="#" style="color:#fff!important;transform:translateX(-30px)"></a><a class="topbar-link" href="https://git.backend-3.com/admin/rsrc/" style="color:#f2f2f2!important">src</a><a class="topbar-link" href="https://v2.s1ne.com/" rel="noopener noreferrer external">s1ne</a><a class="topbar-link" href="https://angel.33.backend-3.com/" rel="noopener noreferrer external">☆chat</a><a class="topbar-link" href="https://s1ne.com/gba/" rel="noopener noreferrer external">ds</a><a class="topbar-link" href="https://zone.rootdev.backend-3.com/0.html" rel="noopener noreferrer external">more</a><a class="topbar-link" href="https://s1ne.com/cs2" rel="noopener noreferrer external">cs2</a></nav></div></header><main id="app" class="wrap"></main><button id="jump-top" type="button" aria-label="jump to top">↑</button><script>(()=>{"use strict";const V="v26",TTL=216e5,STTL=31536e6,TO=12e3,MR=3,S=[{id:"awesome",label:"awesome",url:"https://raw.githubusercontent.com/sindresorhus/awesome/refs/heads/main/readme.md",type:"markdown",metaLabel:"awesome"},{id:"billing",label:"awesome billing",url:"https://raw.githubusercontent.com/kdeldycke/awesome-billing/refs/heads/main/readme.md",type:"markdown",metaLabel:"awesome"},{id:"startup-posting",label:"places to post your startup",url:"https://raw.githubusercontent.com/mmccaff/PlacesToPostYourStartup/refs/heads/master/README.md",type:"markdown",metaLabel:"awesome"},{id:"developer-first",label:"awesome developer-first",url:"https://raw.githubusercontent.com/agamm/awesome-developer-first/refs/heads/main/README.md",type:"markdown",metaLabel:"awesome"},{id:"selfhosted",label:"awesome self-hosted",url:"https://raw.githubusercontent.com/awesome-selfhosted/awesome-selfhosted/refs/heads/master/README.md",type:"markdown",metaLabel:"awesome"},{id:"productivity",label:"awesome productivity tools",url:"https://raw.githubusercontent.com/ProductivityDirectory/awesome-productivity-tools/main/README.md",type:"markdown",metaLabel:"awesome"},{id:"privacy",label:"awesome privacy",url:"https://raw.githubusercontent.com/pluja/awesome-privacy/main/README.md",type:"markdown",metaLabel:"awesome"},{id:"fmhy",label:"fmhy",url:"https://api.fmhy.net/single-page",type:"fmhy",metaLabel:"fmhy"}],SK=`awsm-rsrc:selected:${V}`,QK=`awsm-rsrc:query:${V}`,FK=`awsm-rsrc:linkfilter:${V}`,MK=id=>`awsm-rsrc:markdown:${id}:${V}`,METAK=id=>`awsm-rsrc:meta:${id}:${V}`,app=document.getElementById("app"),jump=document.getElementById("jump-top"),mem=new Map,req=new Map;let results=[],selected=-1,frame=0,nodes={},model=null;const esc=v=>String(v??"").replace(/[&<>"']/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[c])),plain=v=>String(v??"").replace(/▷/g,"").replace(/!\[[^\]]*]\([^)]*\)/g,"").replace(/\[([^\]]+)]\([^)]+\)/g,"$1").replace(/<[^>]*>/g,"").replace(/[`*_~\]]/g,"").replace(/&amp;/g,"&").trim(),norm=v=>String(v??"").replace(/▷/g,"").toLocaleLowerCase(),cleanupDesc=v=>String(v??"").replace(/\s*([,/|-]\s*){2,}/g," ").replace(/(?:\s*[·,/|-]\s*)+$/g,"").replace(/^\s*(?:[·,/|-]\s*)+/g,"").replace(/\s{2,}/g," ").trim(),url=v=>{try{let x=String(v??"").trim().replace(/[),.;]+$/,"");if(!x)return"";if(x.startsWith("#"))return x;let u=new URL(x,location.href);return/^https?:$/.test(u.protocol)?u.href:""}catch{return""}},host=v=>{try{return new URL(v).hostname.replace(/^www\./,"")}catch{return v}},gh=v=>{try{return/(^|\.)github\.com$/i.test(new URL(v).hostname)}catch{return!1}},utc=v=>{try{return new Date(v).toISOString()}catch{return""}},cache=(k,f="",age=0)=>{let n=Date.now(),m=mem.get(k);if(m&&(!age||n-m.time<age))return m.value;try{let x=localStorage.getItem(k);if(!x)return f;let p=JSON.parse(x);if(!p||typeof p!="object"||(p.expires&&p.expires<=n))return localStorage.removeItem(k),mem.delete(k),f;return mem.set(k,{value:p.value,time:p.time||n}),p.value}catch{return f}},set=(k,v,t)=>{let time=Date.now();mem.set(k,{value:v,time});try{localStorage.setItem(k,JSON.stringify({value:v,time,expires:time+t}))}catch{}return v},extractFMHY=t=>{try{let p=JSON.parse(t),f=v=>{if(typeof v=="string")return v;if(Array.isArray(v))return v.map(f).filter(Boolean).join("\n");if(v&&typeof v=="object")for(let k of["markdown","content","data","body","text","readme","singlePage","single_page"]){let r=f(v[k]);if(r)return r}return""};return f(p)||t}catch{return t}},sleep=ms=>new Promise(r=>setTimeout(r,ms)),fetchRetry=async(u,{retries=MR,timeout=TO}={})=>{let err;for(let i=0;i<retries;i++){let a=new AbortController,t=setTimeout(()=>a.abort(),timeout);try{let r=await fetch(u,{cache:"force-cache",signal:a.signal});if(!r.ok)throw new Error(`HTTP ${r.status}`);return await r.text()}catch(e){err=e;if(i<retries-1)await sleep(Math.min(800*2**i+Math.random()*220,3200))}finally{clearTimeout(t)}}throw err},normalizeHref=v=>{try{let u=new URL(String(v||"").trim());u.hash="";["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id","utm_name","utm_cid","utm_reader","utm_referrer","utm_social","utm_social-type","fbclid","gclid","ref","ref_src"].forEach(k=>u.searchParams.delete(k));if(/(^|\.)github\.com$/i.test(u.hostname)){u.hostname="github.com";let p=u.pathname.split("/").filter(Boolean);if(p.length>=5&&(p[2]==="blob"||p[2]==="raw"))u.pathname="/"+[p[0],p[1],...p.slice(3)].join("/");else u.pathname="/"+p.join("/")}u.hostname=u.hostname.toLowerCase();u.pathname=u.pathname.replace(/\/+$/,"")||"/";let q=[...u.searchParams.entries()].sort((a,b)=>a[0].localeCompare(b[0])||a[1].localeCompare(b[1]));u.search="";for(let[k,val]of q)u.searchParams.append(k,val);return u.toString()}catch{return String(v||"").trim().replace(/\/+$/,"")}},sourceMeta=id=>cache(METAK(id),null,STTL)||null,setSourceMeta=(id,v)=>set(METAK(id),v,STTL),ids=()=>{let s=new Set;return v=>{let b=plain(v).toLocaleLowerCase().replace(/\s+/g,"-").replace(/[^\p{L}\p{N}-]/gu,"")||"section",i=b,n=2;for(;s.has(i);)i=`${b}-${n++}`;return s.add(i),i}},pickKind=links=>links.length?links.every(l=>l.github)?"github":"external":"text",item=(v,source)=>{let s=String(v??"").replace(/▷/g,"").replace(/^\[[ xX]\]\s*/i,"").trim(),ml=[...s.matchAll(/(?<!!)\[([^\]]+)]\(([^)\s]+(?:\s+"[^"]*")?)\)/g)],rl=[...s.matchAll(/https?:\/\/[^\s<>)"]+/g)],links=[],seen=new Set,add=(t,h)=>{let x=url(String(h??"").trim().replace(/\s+"[^"]*"$/,""));if(!x)return;let k=normalizeHref(x);if(seen.has(k))return;seen.add(k),links.push({title:plain(t)||host(x),href:x,norm:k,github:gh(x),source:source?.id||""})};ml.forEach(m=>add(m[1],m[2]));rl.forEach(m=>add(host(m[0]),m[0]));let d=s;ml.forEach(m=>d=d.replace(m[0]," "));rl.forEach(m=>d=d.replace(m[0]," "));d=cleanupDesc(plain(d.replace(/^\s*[-–—::]\s*/,"").replace(/\s{2,}/g," ")));let f=links[0]||{title:plain(s),href:"",norm:"",github:!1};return{title:f.title||host(f.href),href:f.href,norm:f.norm||normalizeHref(f.href||""),desc:d,links,children:[],sourceIds:source?[source.id]:[],sourceLabels:source?[source.label]:[],kind:pickKind(links)}};const mergeItems=a=>{let by=new Map,walk=list=>(list||[]).forEach(x=>{x.children=mergeItems(x.children||[]);let key=x.norm||normalizeHref(x.href||"")||`text:${norm(x.title)}|${norm(x.desc)}`;if(!by.has(key)){by.set(key,{...x,sourceIds:[...(x.sourceIds||[])],sourceLabels:[...(x.sourceLabels||[])],descs:x.desc?[x.desc]:[],links:[...(x.links||[])],children:[...(x.children||[])]});return}let t=by.get(key);for(let d of x.desc?[x.desc]:[]){d=cleanupDesc(d);d&&!t.descs.includes(d)&&t.descs.push(d)}for(let s of x.sourceIds||[])t.sourceIds.includes(s)||t.sourceIds.push(s);for(let s of x.sourceLabels||[])t.sourceLabels.includes(s)||t.sourceLabels.push(s);let seen=new Set(t.links.map(l=>l.norm||normalizeHref(l.href)));for(let l of x.links||[]){let k=l.norm||normalizeHref(l.href);if(!seen.has(k))seen.add(k),t.links.push(l)}t.children=mergeItems([...(t.children||[]),...(x.children||[])]);t.kind=pickKind(t.links)});walk(a);return[...by.values()].map(x=>({...x,desc:x.descs.filter(Boolean).sort((a,b)=>b.length-a.length)[0]||"",children:mergeItems(x.children||[])})).filter(x=>x.title||x.href||x.desc||x.children?.length).sort((a,b)=>String(a.title||a.href).localeCompare(String(b.title||b.href),void 0,{sensitivity:"base"}))},parse=(md,source)=>{let l=String(md??"").replace(/▷/g,"").replace(/<div\b[^>]*>[\s\S]*?<\/div>\s*/gi,"").replace(/<details\b[^>]*>[\s\S]*?<\/details>\s*/gi,"").replace(/\r/g,"").split("\n"),id=ids(),title="rsrc",sec=[],cur,sub,stack=[];for(let x of l){let m=x.trim().match(/^#\s+(.+?)(?:\s+#*)?$/);if(m){title=plain(m[1])||title;break}}let add=t=>(cur={title:t,id:id(t),items:[]},sec.push(cur),sub=null,stack=[],cur);for(let x of l){x=x.replace(/\t/g," ");let t=x.trim();if(!t||/^<!-/.test(t)||/^\[!\[/.test(t)||/^[-*_]{3,}$/.test(t)||/^<[^>]+>/.test(t))continue;let h=t.match(/^(#{2,6})\s+(.+?)(?:\s+#*)?$/);if(h){let d=h[1].length,n=plain(h[2]);if(!n||/^(table of contents|contents?)$/i.test(n)&&!sec.length)continue;if(stack=[],d===2)add(n);else cur&&(sub={title:n,id:id(n),href:"",desc:"",links:[],children:[],sourceIds:[source.id],sourceLabels:[source.label],kind:"text"},cur.items.push(sub));continue}let q=x.match(/^(\s*)(?:[-*+]|\d+\.)\s+(.*)$/);if(!q)continue;let body=q[2].trim();if(!body||/^[-*_]+$/.test(body))continue;let it=item(body,source),hasContent=!!(it.title||it.href||it.desc||it.links.length);if(!hasContent)continue;cur||add("contents");let ind=q[1].length;for(;stack.length&&ind<=stack.at(-1).ind;)stack.pop();stack.length?stack.at(-1).item.children.push(it):sub?sub.children.push(it):cur.items.push(it);stack.push({ind,item:it})}sec=sec.map(x=>({...x,items:mergeItems(x.items).filter(i=>i.title||i.href||i.desc||i.children?.length)})).filter(x=>(x.items.length&&x.title&&!/^(contents?)$/i.test(x.title))||x.items.length>2);return{title,sections:sec}},merge=docs=>{let id=ids(),m=new Map;docs.forEach(d=>d.sections.forEach(s=>{let k=norm(s.title);m.has(k)||m.set(k,{title:s.title,id:id(s.title),items:[],sources:[]});let t=m.get(k);t.items.push(...s.items);t.sources.some(x=>x.id===d.source.id)||t.sources.push(d.source)}));return{title:"rsrc",sections:[...m.values()].map(x=>({...x,items:mergeItems(x.items)})).filter(x=>x.items.length).sort((a,b)=>a.title.localeCompare(b.title)),sources:docs.map(x=>x.source)}},count=a=>(a||[]).reduce((n,x)=>n+1+count(x.children),0),itemBadges=x=>{let labs=(x.sourceLabels||[]).slice(0,4);return labs.length?`<span class="item-badges">${labs.map(s=>`<span class="item-badge">${esc(s)}</span>`).join("")}</span>`:""},renderLinkList=x=>{let a=x.links?.length?x.links:x.href?[{title:x.title,href:x.href,github:gh(x.href)}]:[];if(!a.length)return`<span class="item-name">${esc(x.title)}</span>${itemBadges(x)}`;return`<span class="inline-links">${a.map((l,i)=>`${i?'<span class="sep">·</span>':""}<a class="result-link${l.github?" github-link":""}" href="${esc(l.href)}" target="_blank" rel="noopener noreferrer external">${esc(l.title||l.href)}</a>`).join(" ")}</span>${itemBadges(x)}`},data=x=>[x.title,x.desc,x.href,x.kind,...(x.links||[]).map(l=>`${l.title} ${l.href}`),...(x.sourceLabels||[]),...(x.children||[]).map(data)].join(" "),items=a=>`<ul>${(a||[]).map(x=>` <li ${x.id?`id="${esc(x.id)}" data-subsection="${esc(x.id)}"`:""} data-kind="${esc(x.kind||"text")}" data-search="${esc(norm(data(x)))}">${renderLinkList(x)}${x.desc?`<span class="desc result-desc">${esc(cleanupDesc(x.desc))}</span>`:""}${x.children?.length?`<div class="children">${items(x.children)}</div>`:""}</li>`).join("")}</ul>`,freshness=arr=>{let grouped=new Map;arr.forEach(m=>{let k=(m.metaLabel||m.label||"").toLowerCase();if(k!=="github"&&k!=="fmhy"&&k!=="awesome")k=m.metaLabel||"awesome";let prev=grouped.get(k);if(!prev||Number(m.updatedAt||0)>Number(prev.updatedAt||0))grouped.set(k,m)});let out=["github","fmhy","awesome"].map(k=>grouped.get(k)).filter(Boolean);return`<div class="freshness"><div class="freshness-list">${out.map(m=>`<span class="fresh-source"><b>${esc((m.metaLabel||m.label||"").replace(/^\w/,c=>c.toUpperCase()))}</b><span class="${m.status==="live"?"fresh-ok":"fresh-warn"}">${esc(m.status)}</span><span>${esc(m.updatedAt?utc(m.updatedAt):"")}</span></span>`).join("")}</div></div>`},side=a=>`
<aside class="sidebar" aria-label="category navigation">
<div class="sidebar-head">
<div class="search-wrap">
<input id="search" type="search" autocomplete="off" spellcheck="false" aria-label="search resources" placeholder="search resources…">
<button id="search-clear" type="button" aria-label="clear search">×</button>
</div>
<div class="toolbar">
<div class="chips">
<button class="chip active" data-kind-filter="all" type="button" style="display:none;">github: off</button>
<button class="chip" id="copy-view" type="button">copy view</button>
</div>
</div>
</div>
<nav id="sidebar-list" class="sidebar-nav">
${a.map(s=>`<label class="sidebar-link"><input type="checkbox" value="${esc(s.id)}"><span>${esc(s.title)}</span></label>`).join("")}
</nav>
</aside>
`,page=d=>{let n=count(d.sections.flatMap(s=>s.items));return`${side(d.sections)}<section class="content"><p class="meta">rsrc</p><div class="statusline"><p class="status" id="filter-status">all ${d.sections.length} categories · ${n} entries</p>${navigator.onLine===!1&&d.sources?.length?`<p class="offline-msg" id="offline-msg">offline: operating from cache when available</p>`:""}</div>${freshness(d.freshness||[])}<p class="empty" id="empty" hidden>no matching categories; choose a category or clear search</p><div class="grid" id="grid">${d.sections.map(s=>` <section class="cat" id="${esc(s.id)}" data-section="${esc(s.id)}" data-search="${esc(norm(s.title+" "+s.sources.map(x=>x.label).join(" ")))}"><h2 class="cat-title"><a href="#${encodeURIComponent(s.id)}">${esc(s.title)}</a>${s.sources.map(x=>`<a class="source-tag" href="${esc(x.url)}" target="_blank" rel="noopener noreferrer external">${esc(x.metaLabel==="awesome"?"awesome":x.label)}</a>`).join("")}</h2>${items(s.items)}</section>`).join("")}</div><footer>sources: ${(d.sources||[]).map((s,i)=>` ${i?'<span class="desc">·</span>':""}<a href="${esc(s.url)}" target="_blank" rel="noopener noreferrer external">${esc(s.label)}</a>`).join("")}</footer></section>`},getKindMode=()=>cache(FK,"all",STTL)||"all",setKindButton=()=>{if(!nodes.kindToggle)return;let mode=getKindMode();nodes.kindToggle.dataset.kindFilter=mode;nodes.kindToggle.classList.toggle("active",mode!=="all");nodes.kindToggle.textContent=`github: ${mode==="all"?"off":mode==="github"?"has":"non"}`},input=()=>nodes.search||document.getElementById("search"),getState=()=>{let q=norm(input()?.value||""),checks=[...(nodes.sidebarInputs||document.querySelectorAll("#sidebar-list input"))],sel=checks.filter(x=>x.checked).map(x=>x.value),kind=getKindMode();return{q,sel,kind}},setURL=st=>{let u=new URL(location.href);st.q?u.searchParams.set("q",st.q):u.searchParams.delete("q");st.sel.length?u.searchParams.set("sections",st.sel.join(",")):u.searchParams.delete("sections");st.kind&&st.kind!=="all"?u.searchParams.set("kind",st.kind):u.searchParams.delete("kind");history.replaceState(null,"",u.toString())},loadURL=()=>{let u=new URL(location.href);return{q:norm(u.searchParams.get("q")||cache(QK,"",STTL)||""),sel:(u.searchParams.get("sections")||"").split(",").filter(Boolean),kind:u.searchParams.get("kind")||cache(FK,"all",STTL)||"all"}},apply=()=>{let st=getState(),secs=nodes.sections||[...document.querySelectorAll("[data-section]")],vc=0,ve=0,kind=st.kind;secs.forEach(s=>{let li=[...s.querySelectorAll("li")].filter(x=>{let okQ=!st.q||x.dataset.search.includes(st.q),okK=kind==="all"||x.dataset.kind===kind;x.hidden=!(okQ&&okK);return okQ&&okK}),ok=(!st.sel.length||st.sel.includes(s.dataset.section))&&(!st.q&&kind==="all"||s.dataset.search.includes(st.q)||li.length);s.hidden=!ok;if(ok)vc++,ve+=li.length});nodes.grid.hidden=!vc;nodes.empty.hidden=!!vc;nodes.clear.style.display=st.q?"block":"none";nodes.status.textContent=st.q||kind!=="all"?`${vc} matching categories · ${ve} entries`:st.sel.length?`${vc} selected categories · ${ve} entries`:`all ${secs.length} categories · ${ve} entries`;set(SK,st.sel,STTL);set(QK,st.q,STTL);set(FK,st.kind,STTL);setURL(st);results=[...document.querySelectorAll(".cat:not([hidden]) .result-link,.cat:not([hidden]) .item-name,.cat:not([hidden]) [data-subsection]")].filter(x=>!x.closest("[hidden]"));selected=-1},copyView=async()=>{try{await navigator.clipboard.writeText(location.href);let b=nodes.copy;b.textContent="copied";setTimeout(()=>b&&(b.textContent="copy view"),1200)}catch{}},init=()=>{nodes={search:document.getElementById("search"),clear:document.getElementById("search-clear"),grid:document.getElementById("grid"),empty:document.getElementById("empty"),status:document.getElementById("filter-status"),sidebarInputs:[...document.querySelectorAll("#sidebar-list input")],sections:[...document.querySelectorAll("[data-section]")],copy:document.getElementById("copy-view"),kindToggle:document.querySelector("[data-kind-filter]")};let saved=loadURL(),savedSet=new Set(saved.sel.length?saved.sel:cache(SK,[],STTL));set(FK,saved.kind,STTL);nodes.sidebarInputs.forEach(x=>{x.checked=savedSet.has(x.value);x.parentElement.classList.toggle("active",x.checked);x.addEventListener("change",()=>{x.parentElement.classList.toggle("active",x.checked);apply()})});if(saved.q)nodes.search.value=saved.q;setKindButton();nodes.kindToggle?.addEventListener("click",()=>{let cur=getKindMode(),next=cur==="all"?"github":cur==="github"?"external":"all";set(FK,next,STTL);setKindButton();apply()});nodes.search.addEventListener("input",()=>{cancelAnimationFrame(frame);frame=requestAnimationFrame(apply)});nodes.clear.addEventListener("click",()=>{nodes.search.value="";apply();nodes.search.focus()});nodes.copy?.addEventListener("click",copyView);document.addEventListener("keydown",e=>{let text=e.target.matches?.("input,textarea")||e.target.isContentEditable;if(e.key==="/"&&!text)e.preventDefault(),nodes.search.focus();if(e.key==="Escape"&&document.activeElement===nodes.search&&nodes.search.value)nodes.search.value="",apply();if(document.activeElement!==nodes.search||!results.length)return;if(e.key==="ArrowDown"||e.key==="ArrowUp"){e.preventDefault();selected=(selected+(e.key==="ArrowDown"?1:-1)+results.length)%results.length;document.querySelectorAll(".search-selected").forEach(x=>x.classList.remove("search-selected"));results[selected].classList.add("search-selected");results[selected].scrollIntoView({block:"center",behavior:"smooth"})}if(e.key==="Enter"){e.preventDefault();let x=results[selected<0?0:selected];x.matches("a")?x.click():x.scrollIntoView({block:"center",behavior:"smooth"})}});window.addEventListener("scroll",()=>{jump.hidden=window.scrollY<500},{passive:!0});jump.addEventListener("click",()=>window.scrollTo({top:0,behavior:"smooth"}));jump.hidden=window.scrollY<500;apply()},mount=h=>{app.innerHTML=h;init()},load=async s=>{let cached=cache(MK(s.id),"",TTL),meta=sourceMeta(s.id),offline=navigator.onLine===!1;if(cached&&offline)return{...s,markdown:cached,meta:{label:s.label,metaLabel:s.metaLabel==="fmhy"?"fmhy":s.url.includes("githubusercontent")||s.url.includes("github.com/raw")||s.url.includes("raw.githubusercontent.com")?"github":s.metaLabel,status:"cache-offline",updatedAt:meta?.updatedAt||Date.now(),cache:!0}};try{let raw=await fetchRetry(s.url),markdown=s.type==="fmhy"?extractFMHY(raw):raw;if(markdown){let ml=s.metaLabel==="fmhy"?"fmhy":s.url.includes("raw.githubusercontent.com")?"github":s.metaLabel;let m={label:s.label,metaLabel:ml,status:"live",updatedAt:Date.now(),cache:!1};set(MK(s.id),markdown,TTL);setSourceMeta(s.id,m);return{...s,markdown,meta:m}}throw 0}catch{if(cached){let ml=s.metaLabel==="fmhy"?"fmhy":s.url.includes("raw.githubusercontent.com")?"github":s.metaLabel;let m={label:s.label,metaLabel:ml,status:"cache-fallback",updatedAt:meta?.updatedAt||Date.now(),cache:!0};setSourceMeta(s.id,m);return{...s,markdown:cached,meta:m}}let ml=s.metaLabel==="fmhy"?"fmhy":s.url.includes("raw.githubusercontent.com")?"github":s.metaLabel;let m={label:s.label,metaLabel:ml,status:"failed",updatedAt:Date.now(),cache:!1};setSourceMeta(s.id,m);return null}},start=async()=>{let cached=S.map(s=>{let markdown=cache(MK(s.id),"",TTL),meta=sourceMeta(s.id);return markdown?{...s,markdown,meta:meta||{label:s.label,metaLabel:s.metaLabel,status:"cache",updatedAt:Date.now(),cache:!0}}:null}).filter(Boolean);if(cached.length){let merged=merge(cached.map(s=>({...parse(s.markdown,s),source:s})));merged.freshness=cached.map(s=>s.meta||{label:s.label,metaLabel:s.metaLabel,status:"cache",updatedAt:Date.now()});model=merged;mount(page(merged))}let loaded=(await Promise.allSettled(S.map(load))).filter(x=>x.status==="fulfilled"&&x.value).map(x=>x.value);if(loaded.length){let merged=merge(loaded.map(s=>({...parse(s.markdown,s),source:s})));merged.freshness=loaded.map(s=>s.meta||{label:s.label,metaLabel:s.metaLabel,status:"live",updatedAt:Date.now()});model=merged;mount(page(merged))}else if(!cached.length)mount(page({title:"rsrc",sources:[],freshness:[],sections:[{title:"error",id:"error",sources:[],items:[{title:"unable to load sources",href:"",desc:"",links:[],children:[],sourceIds:[],sourceLabels:[],kind:"text"}]}]}))};start()})();</script>
</body></html>