Write on the margins of the internet. Powered by the AT Protocol. margin.at
extension web atproto comments

Bookmarklets #1

open opened by jauntywk.bsky.social targeting main from jauntywk.bsky.social/margin: bookmarklet

A variety of simple bookmarklets ideas. I don't have the capacity to test these yet, alas. But a variety of simple to complex possible bookmarklet ideas, including a loader-ized one that reuses the new slick overlay in the extension.

Labels

None yet.

assignee

None yet.

Participants 1
AT URI
at://did:plc:zjbq26wybii5ojoypkso2mso/sh.tangled.repo.pull/3mesrsbnu3f22
+8786
Diff #0
+1
.gitignore
··· 3 3 4 4 # Build outputs 5 5 dist/ 6 + dist-standalone/ 6 7 build/ 7 8 main 8 9 margin-backend
+37
bookmarklet.annotate-prompt.user.js
··· 1 + // ==UserScript== 2 + // @name Margin.at Annotate with Prompt 3 + // @namespace https://margin.at/ 4 + // @version 1.0 5 + // @description Post annotation to margin.at with prompts for text and tags 6 + // @author margin.at 7 + // @match *://*/* 8 + // @grant none 9 + // ==/UserScript== 10 + 11 + (async function () { 12 + const u = window.location.href; 13 + const s = window.getSelection().toString().trim(); 14 + const q = new URLSearchParams(window.location.search).get("quote") || s; 15 + const t = prompt("Annotation text:"); 16 + if (t === null) return; 17 + const g = prompt("Tags (comma-separated):"); 18 + const b = { url: u }; 19 + if (q) b.selector = { exact: q }; 20 + if (t) b.text = t; 21 + if (g) b.tags = g.split(",").map((x) => x.trim()).filter((x) => x); 22 + try { 23 + const r = await fetch("https://margin.at/api/annotations", { 24 + method: "POST", 25 + headers: { "Content-Type": "application/json" }, 26 + credentials: "include", 27 + body: JSON.stringify(b), 28 + }); 29 + if (r.ok) alert("Posted!"); 30 + else if (r.status === 401) { 31 + alert("Log in first"); 32 + window.open("https://margin.at/login", "_blank"); 33 + } else alert("Error: " + (await r.text())); 34 + } catch (e) { 35 + alert("Failed: " + e.message); 36 + } 37 + })();
+22
bookmarklet.compose.user.js
··· 1 + // ==UserScript== 2 + // @name Margin.at Compose 3 + // @namespace https://margin.at/ 4 + // @version 1.0 5 + // @description Open margin.at compose form with current page URL and selected text 6 + // @author margin.at 7 + // @match *://*/* 8 + // @grant none 9 + // ==/UserScript== 10 + 11 + (function () { 12 + const s = window.getSelection().toString().trim(); 13 + const q = new URLSearchParams(window.location.search).get("quote") || s; 14 + const u = encodeURIComponent(window.location.href); 15 + const p = q 16 + ? "&selector=" + 17 + encodeURIComponent( 18 + JSON.stringify({ type: "TextQuoteSelector", exact: q }), 19 + ) 20 + : ""; 21 + window.open("https://margin.at/new?url=" + u + p, "_blank"); 22 + })();
+46
bookmarklet.overlay-loader.user.js
··· 1 + // ==UserScript== 2 + // @name Margin.at Overlay 3 + // @namespace https://margin.at/ 4 + // @version 1.0 5 + // @description Load the margin.at annotation overlay on any page - view and create annotations without installing the extension 6 + // @author margin.at 7 + // @match *://*/* 8 + // @grant none 9 + // @run-at document-idle 10 + // ==/UserScript== 11 + 12 + (function () { 13 + if (window.MarginOverlay) { 14 + console.log("[margin.at] Overlay already loaded"); 15 + return; 16 + } 17 + 18 + const SCRIPT_URL = "https://cdn.margin.at/overlay/margin-overlay.min.js"; 19 + const STYLE_URL = "https://cdn.margin.at/overlay/margin-overlay.css"; 20 + 21 + const existing = document.querySelector( 22 + `script[src="${SCRIPT_URL}"], script[src="${SCRIPT_URL}?"]`, 23 + ); 24 + if (existing) { 25 + console.log("[margin.at] Overlay script already injected"); 26 + return; 27 + } 28 + 29 + const script = document.createElement("script"); 30 + script.src = SCRIPT_URL; 31 + script.async = true; 32 + script.crossOrigin = "anonymous"; 33 + 34 + script.onload = function () { 35 + console.log("[margin.at] Overlay loaded"); 36 + if (window.MarginOverlay && window.MarginOverlay.init) { 37 + window.MarginOverlay.init(); 38 + } 39 + }; 40 + 41 + script.onerror = function () { 42 + console.error("[margin.at] Failed to load overlay"); 43 + }; 44 + 45 + document.head.appendChild(script); 46 + })();
+32
bookmarklet.quick-highlight.user.js
··· 1 + // ==UserScript== 2 + // @name Margin.at Quick Highlight 3 + // @namespace https://margin.at/ 4 + // @version 1.0 5 + // @description Post a highlight directly to margin.at without opening a form 6 + // @author margin.at 7 + // @match *://*/* 8 + // @grant none 9 + // ==/UserScript== 10 + 11 + (async function () { 12 + const u = window.location.href; 13 + const s = window.getSelection().toString().trim(); 14 + const q = new URLSearchParams(window.location.search).get("quote") || s; 15 + const b = { url: u }; 16 + if (q) b.selector = { exact: q }; 17 + try { 18 + const r = await fetch("https://margin.at/api/annotations", { 19 + method: "POST", 20 + headers: { "Content-Type": "application/json" }, 21 + credentials: "include", 22 + body: JSON.stringify(b), 23 + }); 24 + if (r.ok) alert("Posted!"); 25 + else if (r.status === 401) { 26 + alert("Log in first"); 27 + window.open("https://margin.at/login", "_blank"); 28 + } else alert("Error: " + (await r.text())); 29 + } catch (e) { 30 + alert("Failed: " + e.message); 31 + } 32 + })();
+110
bookmarklet.ts
··· 1 + interface BookmarkletConfig { 2 + mode: "compose" | "post"; 3 + tags?: string[]; 4 + text?: string; 5 + } 6 + 7 + function getSelectedText(): string { 8 + const selection = window.getSelection(); 9 + return selection ? selection.toString().trim() : ""; 10 + } 11 + 12 + function getQuoteParam(): string { 13 + const params = new URLSearchParams(window.location.search); 14 + return params.get("quote") || ""; 15 + } 16 + 17 + function getSelector(exact: string) { 18 + return { type: "TextQuoteSelector", exact }; 19 + } 20 + 21 + function composeBookmarklet() { 22 + const url = encodeURIComponent(window.location.href); 23 + const quote = getSelectedText() || getQuoteParam(); 24 + const selectorParam = quote 25 + ? `&selector=${encodeURIComponent(JSON.stringify(getSelector(quote)))}` 26 + : ""; 27 + window.open(`https://margin.at/new?url=${url}${selectorParam}`, "_blank"); 28 + } 29 + 30 + async function postBookmarklet(config?: BookmarkletConfig) { 31 + const pageUrl = window.location.href; 32 + const quote = getSelectedText() || getQuoteParam(); 33 + 34 + const body: Record<string, unknown> = { 35 + url: pageUrl, 36 + }; 37 + 38 + if (quote) { 39 + body.selector = { exact: quote }; 40 + } 41 + 42 + if (config?.text) { 43 + body.text = config.text; 44 + } 45 + 46 + if (config?.tags && config.tags.length > 0) { 47 + body.tags = config.tags; 48 + } 49 + 50 + try { 51 + const res = await fetch("https://margin.at/api/annotations", { 52 + method: "POST", 53 + headers: { "Content-Type": "application/json" }, 54 + credentials: "include", 55 + body: JSON.stringify(body), 56 + }); 57 + 58 + if (res.ok) { 59 + alert("Annotation posted!"); 60 + } else if (res.status === 401) { 61 + alert("Please log in to margin.at first"); 62 + window.open("https://margin.at/login", "_blank"); 63 + } else { 64 + alert(`Error: ${await res.text()}`); 65 + } 66 + } catch (e) { 67 + alert(`Failed: ${e instanceof Error ? e.message : "Unknown error"}`); 68 + } 69 + } 70 + 71 + async function main() { 72 + const { realpath } = await import("node:fs/promises"); 73 + const resolvedMain = process.argv[1] ? await realpath(process.argv[1]) : null; 74 + const thisFile = new URL(import.meta.url).pathname; 75 + if (resolvedMain && resolvedMain === thisFile) { 76 + console.log("Margin.at Bookmarklet Generator\n"); 77 + console.log("=== Compose Bookmarklet (opens form) ==="); 78 + console.log( 79 + "javascript:" + 80 + encodeURIComponent( 81 + `(function(){const s=window.getSelection().toString().trim();const q=new URLSearchParams(window.location.search).get("quote")||s;const u=encodeURIComponent(window.location.href);const p=q?"&selector="+encodeURIComponent(JSON.stringify({type:"TextQuoteSelector",exact:q})):"";window.open("https://margin.at/new?url="+u+p,"_blank")})()`, 82 + ), 83 + ); 84 + console.log("\n=== Quick Post Bookmarklet (posts directly) ==="); 85 + console.log( 86 + "javascript:" + 87 + encodeURIComponent( 88 + `(async function(){const u=window.location.href;const s=window.getSelection().toString().trim();const q=new URLSearchParams(window.location.search).get("quote")||s;const b={url:u};if(q)b.selector={exact:q};try{const r=await fetch("https://margin.at/api/annotations",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(b)});if(r.ok)alert("Posted!");else if(r.status===401){alert("Log in first");window.open("https://margin.at/login","_blank")}else alert("Error: "+await r.text())}catch(e){alert("Failed: "+e.message)}})()`, 89 + ), 90 + ); 91 + console.log("\n=== Annotate with Prompt (asks for text and tags) ==="); 92 + console.log( 93 + "javascript:" + 94 + encodeURIComponent( 95 + `(async function(){const u=window.location.href;const s=window.getSelection().toString().trim();const q=new URLSearchParams(window.location.search).get("quote")||s;const t=prompt("Annotation text:");if(t===null)return;const g=prompt("Tags (comma-separated):");const b={url:u};if(q)b.selector={exact:q};if(t)b.text=t;if(g)b.tags=g.split(",").map(x=>x.trim()).filter(x=>x);try{const r=await fetch("https://margin.at/api/annotations",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(b)});if(r.ok)alert("Posted!");else if(r.status===401){alert("Log in first");window.open("https://margin.at/login","_blank")}else alert("Error: "+await r.text())}catch(e){alert("Failed: "+e.message)}})()`, 96 + ), 97 + ); 98 + console.log("\n=== Overlay Loader (loads full annotation overlay from CDN) ==="); 99 + console.log( 100 + "javascript:" + 101 + encodeURIComponent( 102 + `(function(){if(window.MarginOverlay)return;var s=document.createElement("script");s.src="https://cdn.margin.at/overlay/margin-overlay.min.js";s.onload=function(){window.MarginOverlay&&window.MarginOverlay.init()};document.head.appendChild(s)})()`, 103 + ), 104 + ); 105 + } 106 + } 107 + 108 + main(); 109 + 110 + export { composeBookmarklet, postBookmarklet };
+144
bookmarklets.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 + <title>Margin.at Bookmarklets</title> 7 + <style> 8 + body { 9 + font-family: system-ui, sans-serif; 10 + max-width: 640px; 11 + margin: 2rem auto; 12 + padding: 1rem; 13 + line-height: 1.6; 14 + } 15 + h1 { margin-bottom: 0.5rem; } 16 + .bookmarklet { 17 + display: inline-block; 18 + background: #2563eb; 19 + color: white; 20 + padding: 0.5rem 1rem; 21 + border-radius: 0.5rem; 22 + text-decoration: none; 23 + margin: 0.5rem 0; 24 + cursor: grab; 25 + } 26 + .bookmarklet:hover { background: #1d4ed8; } 27 + .section { 28 + background: #f5f5f5; 29 + padding: 1rem; 30 + border-radius: 0.5rem; 31 + margin: 1rem 0; 32 + } 33 + code { 34 + background: #e5e5e5; 35 + padding: 0.125rem 0.25rem; 36 + border-radius: 0.25rem; 37 + font-size: 0.9em; 38 + } 39 + pre { 40 + background: #1e1e1e; 41 + color: #d4d4d4; 42 + padding: 1rem; 43 + border-radius: 0.5rem; 44 + overflow-x: auto; 45 + font-size: 0.85em; 46 + } 47 + .tip { 48 + background: #fef3c7; 49 + border-left: 3px solid #f59e0b; 50 + padding: 0.5rem 1rem; 51 + margin: 1rem 0; 52 + } 53 + .script-link { 54 + color: #2563eb; 55 + text-decoration: none; 56 + } 57 + .script-link:hover { 58 + text-decoration: underline; 59 + } 60 + </style> 61 + </head> 62 + <body> 63 + <h1>Margin.at Bookmarklets</h1> 64 + <p name="intro">Drag these links to your bookmarks bar to annotate any page.</p> 65 + 66 + <section name="compose" class="section"> 67 + <h2>Compose Bookmarklet</h2> 68 + <p name="compose-desc">Opens the margin.at compose form with the current page URL and any selected text pre-filled. <a class="script-link" href="bookmarklet.compose.user.js" download="margin-compose.user.js" title="Download userscript">🔗</a></p> 69 + <a name="compose-bookmarklet" class="bookmarklet" href="javascript:(function(){const s=window.getSelection().toString().trim();const q=new URLSearchParams(window.location.search).get(&quot;quote&quot;)||s;const u=encodeURIComponent(window.location.href);const p=q?&quot;&amp;selector=&quot;+encodeURIComponent(JSON.stringify({type:&quot;TextQuoteSelector&quot;,exact:q})):&quot;&quot;;window.open(&quot;https://margin.at/new?url=&quot;+u+p,&quot;_blank&quot;)})()">📎 Annotate on margin.at</a> 70 + 71 + <h3>What it does:</h3> 72 + <ul> 73 + <li>Gets the current page URL</li> 74 + <li>Gets any selected text (or the <code>?quote=...</code> URL parameter)</li> 75 + <li>Opens margin.at/new with url and selector pre-filled</li> 76 + </ul> 77 + </section> 78 + 79 + <section name="quick-highlight" class="section"> 80 + <h2>Quick Highlight Bookmarklet</h2> 81 + <p name="quick-highlight-desc">Posts a highlight directly to margin.at without opening a form. Creates a selector-only annotation. <a class="script-link" href="bookmarklet.quick-highlight.user.js" download="margin-quick-highlight.user.js" title="Download userscript">🔗</a></p> 82 + <a name="quick-highlight-bookmarklet" class="bookmarklet" href="javascript:(async function(){const u=window.location.href;const s=window.getSelection().toString().trim();const q=new URLSearchParams(window.location.search).get(&quot;quote&quot;)||s;const b={url:u};if(q)b.selector={exact:q};try{const r=await fetch(&quot;https://margin.at/api/annotations&quot;,{method:&quot;POST&quot;,headers:{&quot;Content-Type&quot;:&quot;application/json&quot;},credentials:&quot;include&quot;,body:JSON.stringify(b)});if(r.ok)alert(&quot;Posted!&quot;);else if(r.status===401){alert(&quot;Log in first&quot;);window.open(&quot;https://margin.at/login&quot;,&quot;_blank&quot;)}else alert(&quot;Error: &quot;+await r.text())}catch(e){alert(&quot;Failed: &quot;+e.message)}})()">⚡ Quick Highlight</a> 83 + 84 + <p class="tip">You must be logged into margin.at in your browser for this to work.</p> 85 + </section> 86 + 87 + <section name="annotate-prompt" class="section"> 88 + <h2>Annotate with Prompt</h2> 89 + <p name="annotate-prompt-desc">Posts directly with prompts for your annotation text and tags. <a class="script-link" href="bookmarklet.annotate-prompt.user.js" download="margin-annotate-prompt.user.js" title="Download userscript">🔗</a></p> 90 + <a name="annotate-prompt-bookmarklet" class="bookmarklet" href="javascript:(async function(){const u=window.location.href;const s=window.getSelection().toString().trim();const q=new URLSearchParams(window.location.search).get(&quot;quote&quot;)||s;const t=prompt(&quot;Annotation text:&quot;);if(t===null)return;const g=prompt(&quot;Tags (comma-separated):&quot;);const b={url:u};if(q)b.selector={exact:q};if(t)b.text=t;if(g)b.tags=g.split(&quot;,&quot;).map(x=&gt;x.trim()).filter(x=&gt;x);try{const r=await fetch(&quot;https://margin.at/api/annotations&quot;,{method:&quot;POST&quot;,headers:{&quot;Content-Type&quot;:&quot;application/json&quot;},credentials:&quot;include&quot;,body:JSON.stringify(b)});if(r.ok)alert(&quot;Posted!&quot;);else if(r.status===401){alert(&quot;Log in first&quot;);window.open(&quot;https://margin.at/login&quot;,&quot;_blank&quot;)}else alert(&quot;Error: &quot;+await r.text())}catch(e){alert(&quot;Failed: &quot;+e.message)}})()">✏️ Annotate with Text &amp; Tags</a> 91 + 92 + <h3>What it does:</h3> 93 + <ul> 94 + <li>Prompts for annotation text</li> 95 + <li>Prompts for comma-separated tags</li> 96 + <li>Posts to margin.at with URL, selector, text, and tags</li> 97 + </ul> 98 + <p class="tip">You must be logged into margin.at in your browser for this to work.</p> 99 + </section> 100 + 101 + <section name="overlay-loader" class="section"> 102 + <h2>Overlay Loader</h2> 103 + <p name="overlay-loader-desc">Loads the full margin.at annotation overlay from CDN, showing all existing annotations on the page with highlights, popovers, and a compose modal. This provides the same experience as the browser extension without installation. <a class="script-link" href="bookmarklet.overlay-loader.user.js" download="margin-overlay-loader.user.js" title="Download userscript">🔗 userscript</a> <a class="script-link" href="dist-standalone/margin-overlay.iife.js" download="margin-overlay.iife.js" title="Download overlay bundle">📦 bundle</a></p> 104 + <a name="overlay-loader-bookmarklet" class="bookmarklet" href="javascript:(function(){if(window.MarginOverlay)return;var%20s=document.createElement(%22script%22);s.src=%22https://cdn.margin.at/overlay/margin-overlay.min.js%22;s.onload=function(){window.MarginOverlay%26%26window.MarginOverlay.init()};document.head.appendChild(s)})()">📖 Load Overlay</a> 105 + 106 + <h3>What it does:</h3> 107 + <ul> 108 + <li>Injects the margin.at overlay script from CDN (~32KB)</li> 109 + <li>Fetches and displays all annotations for the current page</li> 110 + <li>Highlights annotated text on the page</li> 111 + <li>Shows popovers when clicking highlights</li> 112 + <li>Provides compose modal for creating new annotations</li> 113 + </ul> 114 + <p class="tip">You must be logged into margin.at in your browser to create annotations. Viewing annotations works without login.</p> 115 + </section> 116 + 117 + <section name="api-reference"> 118 + <h2>API Reference</h2> 119 + 120 + <h3>GET /new (Compose Form)</h3> 121 + <p>Query parameters:</p> 122 + <pre>?url=https://example.com/page 123 + &amp;selector={"type":"TextQuoteSelector","exact":"selected text"}</pre> 124 + 125 + <h3>POST /api/annotations (Create Annotation)</h3> 126 + <pre>{ 127 + "url": "https://example.com/page", 128 + "text": "Your comment text", 129 + "selector": { "exact": "quoted text" }, 130 + "tags": ["tag1", "tag2"], 131 + "labels": ["sexual", "violence"] 132 + }</pre> 133 + 134 + <p>Fields:</p> 135 + <ul> 136 + <li><code>url</code> - Required: target URL</li> 137 + <li><code>text</code> - Your annotation/comment</li> 138 + <li><code>selector</code> - Object with <code>exact</code> (and optional <code>prefix</code>/<code>suffix</code>)</li> 139 + <li><code>tags</code> - Array of tag strings (max 10, each max 64 chars)</li> 140 + <li><code>labels</code> - Content warnings: <code>sexual</code>, <code>nudity</code>, <code>violence</code>, <code>gore</code>, <code>spam</code>, <code>misleading</code></li> 141 + </ul> 142 + </section> 143 + </body> 144 + </html>
+216
doc/discovery/hosted-loader.md
··· 1 + # Hosted Loader for Margin.at Overlay 2 + 3 + ## Overview 4 + 5 + This document explores the hosted loader approach for deploying the margin.at overlay as a bookmarklet/userscript that can annotate any webpage without requiring the browser extension. 6 + 7 + ## Journal - Tech Stack Review 8 + 9 + The margin.at project consists of: 10 + 11 + | Component | Tech | Purpose | 12 + |-----------|------|---------| 13 + | Extension | WXT + Vite + TypeScript | Browser extension with overlay | 14 + | Web | Astro + React | Main web application | 15 + | Backend | Go + Chi + SQLite | API server | 16 + 17 + The overlay system in the extension ([`extension/src/utils/overlay.ts`](../extension/src/utils/overlay.ts)) is a ~1095-line shadow DOM-based annotation overlay that: 18 + 19 + - Fetches annotations for the current page 20 + - Highlights annotated text using CSS Custom Highlight API 21 + - Shows popovers when clicking highlights 22 + - Provides compose modal for creating new annotations 23 + - Supports themes (light/dark) 24 + 25 + ## Journal - Problem Statement 26 + 27 + Browser extensions require installation and approval processes. A hosted loader bookmarklet would allow users to: 28 + 29 + 1. Try margin.at without installing anything 30 + 2. Use margin.at on restricted devices (work/school computers) 31 + 3. Share annotation links that work without extension 32 + 33 + The challenge: The overlay code is coupled to extension-specific APIs: 34 + - `@webext-core/messaging` for background script communication 35 + - WXT `storage` for preferences 36 + - `browser.cookies` for session handling 37 + - `browser.runtime.onMessage` for events 38 + 39 + ## Journal - Build Research 40 + 41 + Research documented in [`overlay-build.md`](./overlay-build.md) concluded: 42 + 43 + **Recommended approach**: Parallel Vite build with adapter modules 44 + 45 + - Reuses Vite (already in WXT dependency tree) 46 + - Creates adapter modules in `src/standalone/` that replace extension APIs 47 + - No changes to existing extension code 48 + - ~32KB minified bundle size 49 + - 1 new config file, 1 new npm script 50 + 51 + Key adapters needed: 52 + - `adapters/api.ts` - Direct fetch calls to margin.at API 53 + - `adapters/storage.ts` - localStorage for preferences 54 + - `overlay-standalone.ts` - Adapted overlay without extension deps 55 + 56 + ## Hosted Loader Architecture 57 + 58 + ``` 59 + ┌─────────────────┐ ┌──────────────────────┐ 60 + │ Bookmarklet │ │ CDN (cdn.margin.at) │ 61 + │ (user clicks) │─────▶│ │ 62 + └─────────────────┘ │ margin-overlay.js │ 63 + │ (~32KB minified) │ 64 + └──────────────────────┘ 65 + 66 + 67 + ┌──────────────────────┐ 68 + │ Page DOM │ 69 + │ - Shadow root │ 70 + │ - Highlights │ 71 + │ - Popovers │ 72 + └──────────────────────┘ 73 + 74 + 75 + ┌──────────────────────┐ 76 + │ margin.at API │ 77 + │ - /api/annotations │ 78 + │ - /api/targets │ 79 + │ - /auth/session │ 80 + └──────────────────────┘ 81 + ``` 82 + 83 + ## Loader Implementations 84 + 85 + ### Bookmarklet (inline) 86 + 87 + ```javascript 88 + javascript:(function(){ 89 + var s=document.createElement('script'); 90 + s.src='https://cdn.margin.at/overlay/margin-overlay.min.js'; 91 + s.onload=function(){window.MarginOverlay&&window.MarginOverlay.init()}; 92 + document.head.appendChild(s); 93 + })(); 94 + ``` 95 + 96 + ### Userscript (installable) 97 + 98 + ```javascript 99 + // ==UserScript== 100 + // @name Margin.at Overlay 101 + // @namespace https://margin.at/ 102 + // @version 1.0 103 + // @description Load margin.at annotation overlay on any page 104 + // @author margin.at 105 + // @match *://*/* 106 + // @grant none 107 + // ==/UserScript== 108 + 109 + (function(){ 110 + if (window.MarginOverlay) return; // Already loaded 111 + var s = document.createElement('script'); 112 + s.src = 'https://cdn.margin.at/overlay/margin-overlay.min.js'; 113 + s.onload = function() { window.MarginOverlay && window.MarginOverlay.init(); }; 114 + document.head.appendChild(s); 115 + })(); 116 + ``` 117 + 118 + ## Features and Capabilities 119 + 120 + | Feature | Extension | Hosted Loader | 121 + |---------|-----------|---------------| 122 + | View annotations | ✅ | ✅ | 123 + | Create annotations | ✅ | ✅ | 124 + | Highlights | ✅ | ✅ | 125 + | Tags/autocomplete | ✅ | ✅ | 126 + | Theme support | ✅ | ✅ | 127 + | PDF support | ✅ | ❌* | 128 + | Context menu | ✅ | ❌ | 129 + | Keyboard shortcuts | ✅ | ❌ | 130 + | Sidebar panel | ✅ | ❌ | 131 + | Offline mode | Partial | ❌ | 132 + 133 + *PDF requires special handling via PDF.js integration 134 + 135 + ## API Surfaces 136 + 137 + The hosted loader uses the same public API as the web app: 138 + 139 + ### Authentication 140 + - `GET /auth/session` - Check login status (uses cookies) 141 + - `GET /login` - Redirect to Bluesky OAuth 142 + 143 + ### Annotations 144 + - `GET /api/targets?source=<url>` - Get annotations for URL 145 + - `POST /api/annotations` - Create annotation 146 + - `PUT /api/annotations?uri=<uri>` - Update annotation 147 + - `DELETE /api/annotations?rkey=<rkey>` - Delete annotation 148 + 149 + ### Highlights 150 + - `POST /api/highlights` - Create highlight 151 + - `POST /api/highlights/convert` - Convert to annotation 152 + 153 + ### Tags 154 + - `GET /api/users/<did>/tags` - User's recent tags 155 + - `GET /api/trending-tags` - Trending tags 156 + 157 + ## Options and Alternatives 158 + 159 + ### Option A: Full Overlay Bundle (Recommended) 160 + - Bundle entire overlay with adapters 161 + - Single JS file from CDN 162 + - ~32KB minified 163 + 164 + ### Option B: Simplified Compose-Only 165 + - Minimal modal for creating annotations only 166 + - No highlighting/viewing 167 + - ~8KB minified 168 + 169 + ### Option C: Iframe Embed 170 + - Load margin.at/new in iframe overlay 171 + - No code sharing needed 172 + - Heavier, CORS complexity 173 + 174 + ### Option D: Web Component 175 + - Package as custom element `<margin-overlay>` 176 + - Better encapsulation 177 + - Same bundle size 178 + 179 + ## Decision Points 180 + 181 + 1. **CDN hosting**: Where to host the bundle? 182 + - Options: Cloudflare, margin.at origin, separate CDN 183 + - Recommendation: Cloudflare (already used for avatars) 184 + 185 + 2. **Versioning**: How to handle updates? 186 + - Option A: Semantic versioning in URL (`/overlay/v1.0.0/...`) 187 + - Option B: Always latest with cache headers 188 + - Recommendation: Option B with `Cache-Control: max-age=3600` 189 + 190 + 3. **Authentication UX**: How to handle logged-out users? 191 + - Option A: Show login prompt, redirect to margin.at 192 + - Option B: Show read-only mode 193 + - Recommendation: Option A with clear messaging 194 + 195 + 4. **Bundle format**: IIFE or ESM? 196 + - IIFE: Works everywhere, simpler 197 + - ESM: Modern, tree-shakeable 198 + - Recommendation: IIFE for bookmarklet compatibility 199 + 200 + ## Implementation Checklist 201 + 202 + - [ ] Create `src/standalone/` adapter modules 203 + - [ ] Create standalone entry point 204 + - [ ] Add Vite config for standalone build 205 + - [ ] Add npm script `build:standalone` 206 + - [ ] Test bundle independently 207 + - [ ] Set up CDN hosting 208 + - [ ] Create bookmarklet loader 209 + - [ ] Create userscript loader 210 + - [ ] Update documentation 211 + 212 + ## Related Files 213 + 214 + - [`overlay-build.md`](./overlay-build.md) - Build research 215 + - [`../bookmarklet.ts`](../bookmarklet.ts) - Simple bookmarklet generators 216 + - [`../bookmarklets.html`](../bookmarklets.html) - Bookmarklet installation page
+366
doc/discovery/overlay-api-analysis.md
··· 1 + # Overlay API Analysis for Hosted/Bookmarklet Context 2 + 3 + ## Overview 4 + 5 + This document analyzes the `sendMessage` calls in `extension/src/utils/overlay.ts` and maps them to their public API equivalents, identifying what changes are needed for a standalone/hosted bookmarklet context. 6 + 7 + ## sendMessage Calls and API Equivalents 8 + 9 + ### 1. checkSession (Line 79) 10 + 11 + **Current Usage:** 12 + ```typescript 13 + sendMessage('checkSession', undefined) 14 + .then((session) => { 15 + if (session.authenticated && session.did) { 16 + currentUserDid = session.did; 17 + // fetch user tags... 18 + } 19 + }) 20 + ``` 21 + 22 + **API Endpoint:** `GET /auth/session` 23 + 24 + **Headers:** 25 + - `X-Session-Token: <cookie_value>` (extension reads cookie via browser API) 26 + 27 + **Response:** 28 + ```json 29 + { 30 + "authenticated": true, 31 + "did": "did:plc:...", 32 + "handle": "user.bsky.social", 33 + "accessJwt": "...", 34 + "refreshJwt": "..." 35 + } 36 + ``` 37 + 38 + **Bookmarklet Adaptation:** 39 + - Use `fetch('https://margin.at/auth/session', { credentials: 'include' })` 40 + - Cookie will be sent automatically with `credentials: 'include'` 41 + - No need to manually read cookie 42 + 43 + --- 44 + 45 + ### 2. getUserTags (Line 84) 46 + 47 + **Current Usage:** 48 + ```typescript 49 + sendMessage('getUserTags', { did: session.did }) 50 + ``` 51 + 52 + **API Endpoint:** `GET /api/users/{did}/tags?limit=50` 53 + 54 + **Response:** `string[]` (array of tag strings) 55 + 56 + **Bookmarklet Adaptation:** 57 + - Direct fetch: `fetch('https://margin.at/api/users/{did}/tags?limit=50', { credentials: 'include' })` 58 + 59 + --- 60 + 61 + ### 3. getTrendingTags (Line 85) 62 + 63 + **Current Usage:** 64 + ```typescript 65 + sendMessage('getTrendingTags', undefined) 66 + ``` 67 + 68 + **API Endpoint:** `GET /api/trending-tags?limit=50` 69 + 70 + **Response:** `string[]` 71 + 72 + **Bookmarklet Adaptation:** 73 + - Direct fetch: `fetch('https://margin.at/api/trending-tags?limit=50')` 74 + - No auth required (public endpoint) 75 + 76 + --- 77 + 78 + ### 4. updateBadge (Lines 138, 194, 517, 524, 1015) 79 + 80 + **Current Usage:** 81 + ```typescript 82 + sendMessage('updateBadge', { count: 0 }) 83 + sendMessage('updateBadge', { count: annotations?.length || 0 }) 84 + ``` 85 + 86 + **API Endpoint:** NONE - Extension-only 87 + 88 + **Purpose:** Updates the browser action badge with annotation count 89 + 90 + **Bookmarklet Adaptation:** 91 + - No-op (bookmarklets don't have badges) 92 + - Optional: Could show count in overlay UI itself 93 + - Remove these calls entirely 94 + 95 + --- 96 + 97 + ### 5. createAnnotation (Line 385) 98 + 99 + **Current Usage:** 100 + ```typescript 101 + const res = await sendMessage('createAnnotation', { 102 + url: getPageUrl(), 103 + title: document.title, 104 + text, 105 + selector: { type: 'TextQuoteSelector', exact: quoteText }, 106 + tags: composeTags.length > 0 ? composeTags : undefined, 107 + }); 108 + ``` 109 + 110 + **API Endpoint:** `POST /api/annotations` 111 + 112 + **Request Body:** 113 + ```json 114 + { 115 + "url": "https://example.com/page", 116 + "title": "Page Title", 117 + "text": "Annotation text", 118 + "selector": { "type": "TextQuoteSelector", "exact": "quoted text" }, 119 + "tags": ["tag1", "tag2"] 120 + } 121 + ``` 122 + 123 + **Response:** 124 + ```json 125 + { 126 + "success": true, 127 + "data": { /* Annotation object */ } 128 + } 129 + ``` 130 + 131 + **Bookmarklet Adaptation:** 132 + ```typescript 133 + fetch('https://margin.at/api/annotations', { 134 + method: 'POST', 135 + headers: { 'Content-Type': 'application/json' }, 136 + credentials: 'include', 137 + body: JSON.stringify({ url, title, text, selector, tags }) 138 + }) 139 + ``` 140 + 141 + --- 142 + 143 + ### 6. getAnnotations (Line 522) 144 + 145 + **Current Usage:** 146 + ```typescript 147 + const annotations = await sendMessage('getAnnotations', { url: getPageUrl() }); 148 + ``` 149 + 150 + **API Endpoint:** `GET /api/targets?source={url}` 151 + 152 + **Response:** 153 + ```json 154 + { 155 + "annotations": [...], 156 + "highlights": [...], 157 + "bookmarks": [...] 158 + } 159 + ``` 160 + 161 + **Note:** The extension API client merges these three arrays into a single array. 162 + 163 + **Bookmarklet Adaptation:** 164 + ```typescript 165 + const res = await fetch(`https://margin.at/api/targets?source=${encodeURIComponent(url)}`, { 166 + credentials: 'include' 167 + }); 168 + const data = await res.json(); 169 + const allItems = [...(data.annotations || []), ...(data.highlights || []), ...(data.bookmarks || [])]; 170 + ``` 171 + 172 + --- 173 + 174 + ### 7. cacheAnnotations (Line 527) 175 + 176 + **Current Usage:** 177 + ```typescript 178 + sendMessage('cacheAnnotations', { url: getPageUrl(), annotations }); 179 + ``` 180 + 181 + **API Endpoint:** NONE - Extension storage only 182 + 183 + **Purpose:** Caches annotations in extension storage for offline access 184 + 185 + **Bookmarklet Adaptation:** 186 + - Use `localStorage` or `IndexedDB` instead 187 + - Optional feature - can be skipped for MVP 188 + 189 + --- 190 + 191 + ### 8. convertHighlightToAnnotation (Line 945) 192 + 193 + **Current Usage:** 194 + ```typescript 195 + const result = await sendMessage('convertHighlightToAnnotation', { 196 + highlightUri: uri, 197 + url: getPageUrl(), 198 + title: document.title, 199 + text: noteText, 200 + selector: selector ? { type: 'TextQuoteSelector', exact: selector.exact } : undefined, 201 + }); 202 + ``` 203 + 204 + **API Equivalent:** Two-step process (no single endpoint): 205 + 1. `POST /api/annotations` - Create new annotation 206 + 2. `DELETE /api/highlights?rkey={rkey}` - Delete the highlight 207 + 208 + **Bookmarklet Adaptation:** 209 + ```typescript 210 + // Step 1: Create annotation 211 + const createRes = await fetch('https://margin.at/api/annotations', { 212 + method: 'POST', 213 + headers: { 'Content-Type': 'application/json' }, 214 + credentials: 'include', 215 + body: JSON.stringify({ url, title, text, selector }) 216 + }); 217 + 218 + // Step 2: Delete highlight 219 + const rkey = highlightUri.split('/').pop(); 220 + await fetch(`https://margin.at/api/highlights?rkey=${rkey}`, { 221 + method: 'DELETE', 222 + credentials: 'include' 223 + }); 224 + ``` 225 + 226 + --- 227 + 228 + ## CORS Analysis 229 + 230 + ### Current Backend Configuration 231 + 232 + From `backend/cmd/server/main.go`: 233 + 234 + ```go 235 + r.Use(cors.Handler(cors.Options{ 236 + AllowedOrigins: []string{"https://*", "http://*", "chrome-extension://*"}, 237 + AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, 238 + AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token", "X-Session-Token"}, 239 + ExposedHeaders: []string{"Link"}, 240 + AllowCredentials: true, 241 + MaxAge: 300, 242 + })) 243 + ``` 244 + 245 + ### CORS Status 246 + 247 + | Aspect | Status | Notes | 248 + |--------|--------|-------| 249 + | Wildcard Origins | ✅ | Both `https://*` and `http://*` allowed | 250 + | Credentials | ✅ | `AllowCredentials: true` | 251 + | Required Headers | ✅ | `Content-Type`, `X-Session-Token` both allowed | 252 + | Methods | ✅ | All required methods (GET, POST, PUT, DELETE) allowed | 253 + 254 + **Conclusion:** CORS is properly configured for cross-origin bookmarklet usage. 255 + 256 + ### Cookie Behavior 257 + 258 + The extension currently: 259 + 1. Reads `margin_session` cookie via `browser.cookies.get()` 260 + 2. Passes it as `X-Session-Token` header 261 + 262 + For bookmarklet: 263 + - With `credentials: 'include'`, cookies are sent automatically 264 + - The backend also checks cookies (see `apiRequest` in extension's api.ts uses both header AND `credentials: 'include'`) 265 + - Session validation should work without manual cookie handling 266 + 267 + --- 268 + 269 + ## Issues and Recommendations 270 + 271 + ### 1. Extension-Specific Features to Remove/Replace 272 + 273 + | Feature | Action | 274 + |---------|--------| 275 + | `updateBadge` | Remove entirely | 276 + | `cacheAnnotations` | Replace with localStorage (optional) | 277 + | `overlayEnabledItem.getValue()` | Replace with localStorage | 278 + | `themeItem.getValue()` | Replace with localStorage | 279 + | `browser.runtime.onMessage` | Remove - no background script in bookmarklet | 280 + 281 + ### 2. Storage Migration 282 + 283 + Extension uses `@webext-core/storage` with these items: 284 + - `overlayEnabledItem` - boolean 285 + - `themeItem` - 'light' | 'dark' | 'system' 286 + 287 + **Bookmarklet replacement:** 288 + ```typescript 289 + const getOverlayEnabled = () => localStorage.getItem('margin-overlay-enabled') !== 'false'; 290 + const getTheme = () => localStorage.getItem('margin-theme') || 'system'; 291 + ``` 292 + 293 + ### 3. Message Listener Removal 294 + 295 + Lines 413-428 listen for messages from the background script: 296 + - `SHOW_INLINE_ANNOTATE` - Triggered from context menu 297 + - `REFRESH_ANNOTATIONS` - Manual refresh 298 + - `SCROLL_TO_TEXT` - Navigate to annotation 299 + - `GET_SELECTION` - Return selected text 300 + 301 + **Bookmarklet adaptation:** 302 + - `SHOW_INLINE_ANNOTATE`: Trigger via bookmarklet UI button 303 + - `REFRESH_ANNOTATIONS`: Add a refresh button to overlay 304 + - `SCROLL_TO_TEXT`: Keep (internal function) 305 + - `GET_SELECTION`: Keep (internal function) 306 + 307 + ### 4. API Client Abstraction 308 + 309 + Recommend creating a unified API client that works in both contexts: 310 + 311 + ```typescript 312 + // api-client.ts 313 + const API_URL = 'https://margin.at'; 314 + 315 + async function apiRequest(path: string, options: RequestInit = {}) { 316 + return fetch(`${API_URL}${path}`, { 317 + ...options, 318 + credentials: 'include', 319 + headers: { 320 + 'Content-Type': 'application/json', 321 + ...options.headers, 322 + }, 323 + }); 324 + } 325 + 326 + export const api = { 327 + checkSession: () => apiRequest('/auth/session').then(r => r.json()), 328 + getAnnotations: (url: string) => apiRequest(`/api/targets?source=${encodeURIComponent(url)}`).then(r => r.json()), 329 + createAnnotation: (data: any) => apiRequest('/api/annotations', { method: 'POST', body: JSON.stringify(data) }), 330 + getUserTags: (did: string) => apiRequest(`/api/users/${did}/tags?limit=50`).then(r => r.json()), 331 + getTrendingTags: () => apiRequest('/api/trending-tags?limit=50').then(r => r.json()), 332 + }; 333 + ``` 334 + 335 + ### 5. Authentication Considerations 336 + 337 + - Extension relies on cookies set from margin.at 338 + - Bookmarklet on any domain can access margin.at API with `credentials: 'include'` 339 + - User must be logged in at margin.at for the bookmarklet to work 340 + - Consider showing "Login required" message if session check fails 341 + 342 + ### 6. Potential CORS Edge Cases 343 + 344 + The `go-chi/cors` library handles wildcard origins with credentials, which technically violates the CORS spec (credentials require exact origin). However: 345 + - This works in practice with go-chi/cors 346 + - If issues arise, may need to dynamically set `Access-Control-Allow-Origin` to the exact requesting origin 347 + 348 + --- 349 + 350 + ## Summary 351 + 352 + The overlay's API usage is well-suited for a hosted bookmarklet context: 353 + 354 + 1. **All required API endpoints exist** and are accessible cross-origin 355 + 2. **CORS is properly configured** on the backend 356 + 3. **Cookie-based authentication will work** with `credentials: 'include'` 357 + 4. **Extension-specific features are minimal** and easily replaced: 358 + - Badge updates: no-op 359 + - Extension storage: localStorage 360 + - Background messages: remove or add UI alternatives 361 + 362 + The main work needed is: 363 + 1. Replace `sendMessage` calls with direct `fetch` calls 364 + 2. Replace extension storage with localStorage 365 + 3. Remove badge update calls 366 + 4. Add UI triggers for features that used context menus
+460
doc/discovery/overlay-build.md
··· 1 + # Overlay Standalone Bundle Build Research 2 + 3 + ## Overview 4 + 5 + This document explores options for building the margin.at overlay as a standalone bundle suitable for a hosted loader bookmarklet, with minimal changes to the existing WXT-based extension build. 6 + 7 + ## Current Build Setup 8 + 9 + ### Tools 10 + - **WXT v0.19.13** - Chrome/Firefox extension framework 11 + - **Vite** - Used internally by WXT for bundling 12 + - **TypeScript v5.6.3** 13 + - **React 18** - For popup/sidepanel UI (not used in overlay) 14 + - **@webext-core/messaging v1.4.0** - Type-safe extension messaging 15 + 16 + ### Package Scripts 17 + ```json 18 + { 19 + "dev": "wxt", 20 + "build": "wxt build", 21 + "build:firefox": "wxt build -b firefox" 22 + } 23 + ``` 24 + 25 + ### WXT Config Highlights 26 + - `srcDir: 'src'` - Source in `extension/src/` 27 + - Uses `@wxt-dev/module-react` 28 + - Manifest V3 with standard extension permissions 29 + 30 + ## Overlay Architecture 31 + 32 + ### Core Files 33 + 34 + | File | Lines | Purpose | 35 + |------|-------|---------| 36 + | `overlay.ts` | 1095 | Main overlay logic, DOM manipulation, popovers | 37 + | `overlay-styles.ts` | 701 | CSS-in-JS styles string | 38 + | `text-matcher.ts` | 367 | DOM text search with fuzzy matching | 39 + | `types.ts` | 80 | Type definitions and constants | 40 + | `messaging.ts` | 87 | Extension messaging via @webext-core/messaging | 41 + | `storage.ts` | 12 | Extension storage via WXT | 42 + | `api.ts` | 350 | Backend API client (uses extension cookies) | 43 + 44 + ### Entry Point 45 + ```typescript 46 + // content.ts 47 + export default defineContentScript({ 48 + matches: ['<all_urls>'], 49 + runAt: 'document_idle', 50 + async main(ctx) { 51 + await initContentScript(ctx); 52 + }, 53 + }); 54 + ``` 55 + 56 + ## Extension Dependencies Analysis 57 + 58 + ### Critical Extension-Specific APIs 59 + 60 + The overlay uses these extension-specific features that need replacement: 61 + 62 + #### 1. Messaging (`messaging.ts`) 63 + ```typescript 64 + // Current: Extension messaging 65 + sendMessage('checkSession', undefined) 66 + sendMessage('getUserTags', { did: session.did }) 67 + sendMessage('getTrendingTags', undefined) 68 + sendMessage('getAnnotations', { url: getPageUrl() }) 69 + sendMessage('createAnnotation', { ... }) 70 + sendMessage('convertHighlightToAnnotation', { ... }) 71 + sendMessage('updateBadge', { count }) 72 + ``` 73 + 74 + **Replacement**: Direct API calls to `https://margin.at/api/*` 75 + 76 + #### 2. Storage (`storage.ts`) 77 + ```typescript 78 + // Current: WXT extension storage 79 + export const overlayEnabledItem = storage.defineItem<boolean>('local:overlayEnabled', { fallback: true }); 80 + export const themeItem = storage.defineItem<'light' | 'dark' | 'system'>('local:theme', { fallback: 'system' }); 81 + export const apiUrlItem = storage.defineItem<string>('local:apiUrl', { fallback: 'https://margin.at' }); 82 + ``` 83 + 84 + **Replacement**: localStorage with reactive wrapper 85 + 86 + #### 3. Cookies (`api.ts`) 87 + ```typescript 88 + // Current: Extension cookie API 89 + const cookie = await browser.cookies.get({ 90 + url: apiUrl, 91 + name: 'margin_session', 92 + }); 93 + ``` 94 + 95 + **Replacement**: 96 + - For same-origin: `document.cookie` or `fetch` with `credentials: 'include'` 97 + - For cross-origin: The API already uses `credentials: 'include'`, cookies will work if CORS allows 98 + 99 + #### 4. Runtime Messaging (`overlay.ts`) 100 + ```typescript 101 + // Current: Listen for messages from background 102 + browser.runtime.onMessage.addListener((message) => { 103 + if (message.type === 'SHOW_INLINE_ANNOTATE') { ... } 104 + if (message.type === 'REFRESH_ANNOTATIONS') { ... } 105 + }); 106 + ``` 107 + 108 + **Replacement**: Custom event system or postMessage 109 + 110 + #### 5. Context Invalidation (`overlay.ts`) 111 + ```typescript 112 + ctx.onInvalidated(() => { 113 + // cleanup event listeners 114 + }); 115 + ``` 116 + 117 + **Replacement**: Simple cleanup function export 118 + 119 + ## Recommended Approach: Vite Library Build 120 + 121 + Since WXT already uses Vite internally, we can add a parallel Vite config for the standalone bundle with minimal project changes. 122 + 123 + ### Advantages 124 + - Reuses existing Vite infrastructure 125 + - No new bundler dependency 126 + - TypeScript support out of box 127 + - Tree-shaking for smaller bundle 128 + - Can share code with extension build 129 + 130 + ### Proposed Changes 131 + 132 + #### 1. Create Standalone Entry Point 133 + 134 + **New file: `extension/src/standalone/index.ts`** 135 + ```typescript 136 + import { initStandaloneOverlay } from './overlay-standalone'; 137 + 138 + // Auto-initialize when script loads 139 + if (document.readyState === 'loading') { 140 + document.addEventListener('DOMContentLoaded', () => initStandaloneOverlay()); 141 + } else { 142 + initStandaloneOverlay(); 143 + } 144 + 145 + // Also expose globally for manual control 146 + (window as any).MarginOverlay = { 147 + init: initStandaloneOverlay, 148 + refresh: () => window.dispatchEvent(new CustomEvent('margin:refresh')), 149 + destroy: () => window.dispatchEvent(new CustomEvent('margin:destroy')), 150 + }; 151 + ``` 152 + 153 + #### 2. Create Adapter Modules 154 + 155 + **New file: `extension/src/standalone/adapters/api.ts`** 156 + ```typescript 157 + import type { MarginSession, Annotation, TextSelector } from '@/utils/types'; 158 + 159 + const API_URL = 'https://margin.at'; 160 + 161 + async function apiRequest(path: string, options: RequestInit = {}): Promise<Response> { 162 + const headers: Record<string, string> = { 163 + 'Content-Type': 'application/json', 164 + ...(options.headers as Record<string, string>), 165 + }; 166 + 167 + return fetch(`${API_URL}/api${path}`, { 168 + ...options, 169 + headers, 170 + credentials: 'include', 171 + }); 172 + } 173 + 174 + export async function checkSession(): Promise<MarginSession> { 175 + const res = await fetch(`${API_URL}/auth/session`, { credentials: 'include' }); 176 + if (!res.ok) return { authenticated: false }; 177 + const data = await res.json(); 178 + return { 179 + authenticated: true, 180 + did: data.did, 181 + handle: data.handle, 182 + }; 183 + } 184 + 185 + export async function getAnnotations(url: string): Promise<Annotation[]> { 186 + const res = await fetch(`${API_URL}/api/targets?source=${encodeURIComponent(url)}`); 187 + if (!res.ok) return []; 188 + const data = await res.json(); 189 + return [...(data.annotations || []), ...(data.highlights || []), ...(data.bookmarks || [])]; 190 + } 191 + 192 + export async function createAnnotation(data: { 193 + url: string; 194 + text: string; 195 + title?: string; 196 + selector?: TextSelector; 197 + tags?: string[]; 198 + }): Promise<{ success: boolean; data?: Annotation; error?: string }> { 199 + const res = await apiRequest('/annotations', { 200 + method: 'POST', 201 + body: JSON.stringify(data), 202 + }); 203 + if (!res.ok) return { success: false, error: await res.text() }; 204 + return { success: true, data: await res.json() }; 205 + } 206 + 207 + export async function getUserTags(did: string): Promise<string[]> { 208 + const res = await apiRequest(`/users/${did}/tags?limit=50`); 209 + if (!res.ok) return []; 210 + return (await res.json()).map((t: { tag: string }) => t.tag); 211 + } 212 + 213 + export async function getTrendingTags(): Promise<string[]> { 214 + const res = await apiRequest('/trending-tags?limit=50'); 215 + if (!res.ok) return []; 216 + return (await res.json()).map((t: { tag: string }) => t.tag); 217 + } 218 + 219 + export async function convertHighlightToAnnotation(data: { 220 + highlightUri: string; 221 + url: string; 222 + text: string; 223 + title?: string; 224 + selector?: TextSelector; 225 + }): Promise<{ success: boolean; error?: string }> { 226 + const createResult = await createAnnotation({ 227 + url: data.url, 228 + text: data.text, 229 + title: data.title, 230 + selector: data.selector, 231 + }); 232 + 233 + if (!createResult.success) { 234 + return { success: false, error: createResult.error }; 235 + } 236 + 237 + // Delete highlight 238 + const rkey = data.highlightUri.split('/').pop(); 239 + if (rkey) { 240 + await apiRequest(`/highlights?rkey=${rkey}`, { method: 'DELETE' }); 241 + } 242 + 243 + return { success: true }; 244 + } 245 + ``` 246 + 247 + **New file: `extension/src/standalone/adapters/storage.ts`** 248 + ```typescript 249 + type ChangeListener<T> = (newValue: T) => void; 250 + 251 + class LocalStorageItem<T> { 252 + private key: string; 253 + private fallback: T; 254 + private listeners: Set<ChangeListener<T>> = new Set(); 255 + 256 + constructor(key: string, fallback: T) { 257 + this.key = key; 258 + this.fallback = fallback; 259 + 260 + // Listen for storage changes from other tabs 261 + window.addEventListener('storage', (e) => { 262 + if (e.key === key && e.newValue !== null) { 263 + const value = this.parseValue(e.newValue); 264 + this.listeners.forEach(l => l(value)); 265 + } 266 + }); 267 + } 268 + 269 + private parseValue(value: string | null): T { 270 + if (value === null) return this.fallback; 271 + try { 272 + return JSON.parse(value); 273 + } catch { 274 + return this.fallback; 275 + } 276 + } 277 + 278 + async getValue(): Promise<T> { 279 + return this.parseValue(localStorage.getItem(this.key)); 280 + } 281 + 282 + async setValue(value: T): Promise<void> { 283 + localStorage.setItem(this.key, JSON.stringify(value)); 284 + this.listeners.forEach(l => l(value)); 285 + } 286 + 287 + watch(callback: ChangeListener<T>): () => void { 288 + this.listeners.add(callback); 289 + return () => this.listeners.delete(callback); 290 + } 291 + } 292 + 293 + export const overlayEnabledItem = new LocalStorageItem('margin-overlay-enabled', true); 294 + export const themeItem = new LocalStorageItem<'light' | 'dark' | 'system'>('margin-theme', 'system'); 295 + ``` 296 + 297 + #### 3. Create Standalone Overlay Wrapper 298 + 299 + **New file: `extension/src/standalone/overlay-standalone.ts`** 300 + ```typescript 301 + import { overlayStyles } from '@/utils/overlay-styles'; 302 + import { DOMTextMatcher } from '@/utils/text-matcher'; 303 + import type { Annotation } from '@/utils/types'; 304 + import { APP_URL } from '@/utils/types'; 305 + import * as api from './adapters/api'; 306 + import { overlayEnabledItem, themeItem } from './adapters/storage'; 307 + 308 + // Inline icons (same as overlay.ts) 309 + const Icons = { /* ... copy from overlay.ts ... */ }; 310 + 311 + let cleanupFns: (() => void)[] = []; 312 + 313 + export async function initStandaloneOverlay() { 314 + // Same logic as initContentScript but: 315 + // - Uses api.* instead of sendMessage() 316 + // - Uses storage adapters instead of WXT storage 317 + // - Uses window events instead of browser.runtime 318 + // - No ctx.onInvalidated, just track cleanup functions 319 + 320 + // ... implementation mirrors overlay.ts ... 321 + 322 + // Return cleanup function 323 + return () => { 324 + cleanupFns.forEach(fn => fn()); 325 + cleanupFns = []; 326 + }; 327 + } 328 + ``` 329 + 330 + #### 4. Vite Config for Standalone Build 331 + 332 + **New file: `extension/vite.standalone.config.ts`** 333 + ```typescript 334 + import { defineConfig } from 'vite'; 335 + import { resolve } from 'path'; 336 + 337 + export default defineConfig({ 338 + build: { 339 + lib: { 340 + entry: resolve(__dirname, 'src/standalone/index.ts'), 341 + name: 'MarginOverlay', 342 + fileName: 'margin-overlay', 343 + formats: ['iife'], // Immediately-invoked for bookmarklet 344 + }, 345 + outDir: '../dist-standalone', 346 + emptyOutDir: true, 347 + minify: 'terser', 348 + sourcemap: false, 349 + }, 350 + resolve: { 351 + alias: { 352 + '@': resolve(__dirname, 'src'), 353 + }, 354 + }, 355 + define: { 356 + 'process.env.NODE_ENV': '"production"', 357 + }, 358 + }); 359 + ``` 360 + 361 + #### 5. Package.json Scripts 362 + 363 + Add to `extension/package.json`: 364 + ```json 365 + { 366 + "scripts": { 367 + "build:standalone": "vite build --config vite.standalone.config.ts", 368 + "build:all": "wxt build && pnpm build:standalone" 369 + } 370 + } 371 + ``` 372 + 373 + ## Alternative: esbuild Approach 374 + 375 + If minimizing tooling is preferred, esbuild can be used directly: 376 + 377 + **New file: `extension/build-standalone.ts`** 378 + ```typescript 379 + import * as esbuild from 'esbuild'; 380 + 381 + await esbuild.build({ 382 + entryPoints: ['src/standalone/index.ts'], 383 + bundle: true, 384 + minify: true, 385 + format: 'iife', 386 + globalName: 'MarginOverlay', 387 + outfile: '../dist-standalone/margin-overlay.min.js', 388 + alias: { 389 + '@': './src', 390 + }, 391 + external: [], // bundle everything 392 + }); 393 + ``` 394 + 395 + **Script:** `"build:standalone": "node build-standalone.ts"` 396 + 397 + ## Bundle Size Considerations 398 + 399 + | Component | Est. Size (minified) | 400 + |-----------|---------------------| 401 + | overlay.ts logic | ~15KB | 402 + | overlay-styles.ts CSS | ~8KB | 403 + | text-matcher.ts | ~5KB | 404 + | types.ts | ~1KB | 405 + | Adapter modules | ~3KB | 406 + | **Total** | **~32KB** | 407 + 408 + This is reasonable for a bookmarklet loader that fetches the full bundle from a CDN. 409 + 410 + ## File Structure Summary 411 + 412 + ``` 413 + extension/ 414 + ├── src/ 415 + │ ├── standalone/ # NEW 416 + │ │ ├── index.ts # Entry point 417 + │ │ ├── overlay-standalone.ts # Adapted overlay 418 + │ │ └── adapters/ 419 + │ │ ├── api.ts # Direct API calls 420 + │ │ └── storage.ts # localStorage adapter 421 + │ ├── utils/ # Existing (unchanged) 422 + │ └── entrypoints/ # Existing (unchanged) 423 + ├── vite.standalone.config.ts # NEW 424 + ├── wxt.config.ts # Existing (unchanged) 425 + └── package.json # Add build:standalone script 426 + ``` 427 + 428 + ## Implementation Checklist 429 + 430 + 1. [ ] Create `src/standalone/` directory structure 431 + 2. [ ] Implement `adapters/api.ts` with direct fetch calls 432 + 3. [ ] Implement `adapters/storage.ts` with localStorage 433 + 4. [ ] Create `overlay-standalone.ts` adapted from `overlay.ts` 434 + 5. [ ] Create `index.ts` entry point with auto-init 435 + 6. [ ] Add `vite.standalone.config.ts` 436 + 7. [ ] Add `build:standalone` script to package.json 437 + 8. [ ] Test bundle loads and initializes correctly 438 + 9. [ ] Create bookmarklet loader snippet 439 + 440 + ## Bookmarklet Loader Snippet 441 + 442 + ```javascript 443 + javascript:(function(){ 444 + var s=document.createElement('script'); 445 + s.src='https://cdn.margin.at/overlay/margin-overlay.min.js'; 446 + s.onload=function(){MarginOverlay.init()}; 447 + document.head.appendChild(s); 448 + })(); 449 + ``` 450 + 451 + ## Summary 452 + 453 + The recommended approach uses a parallel Vite build with adapter modules to decouple the overlay from extension-specific APIs. This requires: 454 + 455 + - **No changes** to existing extension code 456 + - **~400 lines** of new adapter code 457 + - **1 new config file** (vite.standalone.config.ts) 458 + - **1 new npm script** (build:standalone) 459 + 460 + The standalone bundle will be ~32KB minified and can be loaded via a simple bookmarklet that injects the script and initializes it.
+3
extension/package.json
··· 14 14 "lint": "eslint src", 15 15 "lint:fix": "eslint src --fix", 16 16 "format": "prettier --write \"src/**/*.{ts,tsx,css}\"", 17 + "build:standalone": "vite build --config vite.standalone.config.ts", 18 + "build:all": "wxt build && pnpm build:standalone", 17 19 "postinstall": "wxt prepare" 18 20 }, 19 21 "dependencies": { ··· 36 38 "tailwindcss": "^3.4.15", 37 39 "typescript": "^5.6.3", 38 40 "typescript-eslint": "^8.54.0", 41 + "vite": "^7.3.1", 39 42 "web-ext": "^9.2.0", 40 43 "wxt": "^0.19.13" 41 44 }
+5936
extension/pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + dependencies: 11 + '@webext-core/messaging': 12 + specifier: ^1.4.0 13 + version: 1.4.0 14 + clsx: 15 + specifier: ^2.1.1 16 + version: 2.1.1 17 + lucide-react: 18 + specifier: ^0.563.0 19 + version: 0.563.0(react@18.3.1) 20 + react: 21 + specifier: ^18.3.1 22 + version: 18.3.1 23 + react-dom: 24 + specifier: ^18.3.1 25 + version: 18.3.1(react@18.3.1) 26 + devDependencies: 27 + '@eslint/js': 28 + specifier: ^9.39.2 29 + version: 9.39.2 30 + '@types/react': 31 + specifier: ^18.3.12 32 + version: 18.3.28 33 + '@types/react-dom': 34 + specifier: ^18.3.1 35 + version: 18.3.7(@types/react@18.3.28) 36 + '@wxt-dev/module-react': 37 + specifier: ^1.1.1 38 + version: 1.1.5(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1))(wxt@0.19.29(@types/node@25.2.3)(rollup@4.57.1)) 39 + autoprefixer: 40 + specifier: ^10.4.20 41 + version: 10.4.24(postcss@8.5.6) 42 + eslint: 43 + specifier: ^9.39.2 44 + version: 9.39.2(jiti@2.6.1) 45 + eslint-config-prettier: 46 + specifier: ^10.1.8 47 + version: 10.1.8(eslint@9.39.2(jiti@2.6.1)) 48 + postcss: 49 + specifier: ^8.4.49 50 + version: 8.5.6 51 + prettier: 52 + specifier: ^3.8.1 53 + version: 3.8.1 54 + tailwindcss: 55 + specifier: ^3.4.15 56 + version: 3.4.19 57 + typescript: 58 + specifier: ^5.6.3 59 + version: 5.9.3 60 + typescript-eslint: 61 + specifier: ^8.54.0 62 + version: 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 63 + vite: 64 + specifier: ^7.3.1 65 + version: 7.3.1(@types/node@25.2.3)(jiti@2.6.1) 66 + web-ext: 67 + specifier: ^9.2.0 68 + version: 9.3.0(jiti@2.6.1) 69 + wxt: 70 + specifier: ^0.19.13 71 + version: 0.19.29(@types/node@25.2.3)(rollup@4.57.1) 72 + 73 + packages: 74 + 75 + '@1natsu/wait-element@4.1.2': 76 + resolution: {integrity: sha512-qWxSJD+Q5b8bKOvESFifvfZ92DuMsY+03SBNjTO34ipJLP6mZ9yK4bQz/vlh48aEQXoJfaZBqUwKL5BdI5iiWw==} 77 + 78 + '@aklinker1/rollup-plugin-visualizer@5.12.0': 79 + resolution: {integrity: sha512-X24LvEGw6UFmy0lpGJDmXsMyBD58XmX1bbwsaMLhNoM+UMQfQ3b2RtC+nz4b/NoRK5r6QJSKJHBNVeUdwqybaQ==} 80 + engines: {node: '>=14'} 81 + hasBin: true 82 + peerDependencies: 83 + rollup: 2.x || 3.x || 4.x 84 + peerDependenciesMeta: 85 + rollup: 86 + optional: true 87 + 88 + '@alloc/quick-lru@5.2.0': 89 + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 90 + engines: {node: '>=10'} 91 + 92 + '@babel/code-frame@7.29.0': 93 + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} 94 + engines: {node: '>=6.9.0'} 95 + 96 + '@babel/compat-data@7.29.0': 97 + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} 98 + engines: {node: '>=6.9.0'} 99 + 100 + '@babel/core@7.29.0': 101 + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} 102 + engines: {node: '>=6.9.0'} 103 + 104 + '@babel/generator@7.29.1': 105 + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} 106 + engines: {node: '>=6.9.0'} 107 + 108 + '@babel/helper-compilation-targets@7.28.6': 109 + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} 110 + engines: {node: '>=6.9.0'} 111 + 112 + '@babel/helper-globals@7.28.0': 113 + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} 114 + engines: {node: '>=6.9.0'} 115 + 116 + '@babel/helper-module-imports@7.28.6': 117 + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} 118 + engines: {node: '>=6.9.0'} 119 + 120 + '@babel/helper-module-transforms@7.28.6': 121 + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} 122 + engines: {node: '>=6.9.0'} 123 + peerDependencies: 124 + '@babel/core': ^7.0.0 125 + 126 + '@babel/helper-plugin-utils@7.28.6': 127 + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} 128 + engines: {node: '>=6.9.0'} 129 + 130 + '@babel/helper-string-parser@7.27.1': 131 + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 132 + engines: {node: '>=6.9.0'} 133 + 134 + '@babel/helper-validator-identifier@7.28.5': 135 + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 136 + engines: {node: '>=6.9.0'} 137 + 138 + '@babel/helper-validator-option@7.27.1': 139 + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 140 + engines: {node: '>=6.9.0'} 141 + 142 + '@babel/helpers@7.28.6': 143 + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} 144 + engines: {node: '>=6.9.0'} 145 + 146 + '@babel/parser@7.29.0': 147 + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} 148 + engines: {node: '>=6.0.0'} 149 + hasBin: true 150 + 151 + '@babel/plugin-transform-react-jsx-self@7.27.1': 152 + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} 153 + engines: {node: '>=6.9.0'} 154 + peerDependencies: 155 + '@babel/core': ^7.0.0-0 156 + 157 + '@babel/plugin-transform-react-jsx-source@7.27.1': 158 + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} 159 + engines: {node: '>=6.9.0'} 160 + peerDependencies: 161 + '@babel/core': ^7.0.0-0 162 + 163 + '@babel/runtime@7.28.2': 164 + resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} 165 + engines: {node: '>=6.9.0'} 166 + 167 + '@babel/runtime@7.28.6': 168 + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} 169 + engines: {node: '>=6.9.0'} 170 + 171 + '@babel/template@7.28.6': 172 + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} 173 + engines: {node: '>=6.9.0'} 174 + 175 + '@babel/traverse@7.29.0': 176 + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} 177 + engines: {node: '>=6.9.0'} 178 + 179 + '@babel/types@7.29.0': 180 + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} 181 + engines: {node: '>=6.9.0'} 182 + 183 + '@devicefarmer/adbkit-logcat@2.1.3': 184 + resolution: {integrity: sha512-yeaGFjNBc/6+svbDeul1tNHtNChw6h8pSHAt5D+JsedUrMTN7tla7B15WLDyekxsuS2XlZHRxpuC6m92wiwCNw==} 185 + engines: {node: '>= 4'} 186 + 187 + '@devicefarmer/adbkit-monkey@1.2.1': 188 + resolution: {integrity: sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg==} 189 + engines: {node: '>= 0.10.4'} 190 + 191 + '@devicefarmer/adbkit@3.3.8': 192 + resolution: {integrity: sha512-7rBLLzWQnBwutH2WZ0EWUkQdihqrnLYCUMaB44hSol9e0/cdIhuNFcqZO0xNheAU6qqHVA8sMiLofkYTgb+lmw==} 193 + engines: {node: '>= 0.10.4'} 194 + hasBin: true 195 + 196 + '@esbuild/aix-ppc64@0.25.12': 197 + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} 198 + engines: {node: '>=18'} 199 + cpu: [ppc64] 200 + os: [aix] 201 + 202 + '@esbuild/aix-ppc64@0.27.3': 203 + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} 204 + engines: {node: '>=18'} 205 + cpu: [ppc64] 206 + os: [aix] 207 + 208 + '@esbuild/android-arm64@0.25.12': 209 + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} 210 + engines: {node: '>=18'} 211 + cpu: [arm64] 212 + os: [android] 213 + 214 + '@esbuild/android-arm64@0.27.3': 215 + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} 216 + engines: {node: '>=18'} 217 + cpu: [arm64] 218 + os: [android] 219 + 220 + '@esbuild/android-arm@0.25.12': 221 + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} 222 + engines: {node: '>=18'} 223 + cpu: [arm] 224 + os: [android] 225 + 226 + '@esbuild/android-arm@0.27.3': 227 + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} 228 + engines: {node: '>=18'} 229 + cpu: [arm] 230 + os: [android] 231 + 232 + '@esbuild/android-x64@0.25.12': 233 + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} 234 + engines: {node: '>=18'} 235 + cpu: [x64] 236 + os: [android] 237 + 238 + '@esbuild/android-x64@0.27.3': 239 + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} 240 + engines: {node: '>=18'} 241 + cpu: [x64] 242 + os: [android] 243 + 244 + '@esbuild/darwin-arm64@0.25.12': 245 + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} 246 + engines: {node: '>=18'} 247 + cpu: [arm64] 248 + os: [darwin] 249 + 250 + '@esbuild/darwin-arm64@0.27.3': 251 + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} 252 + engines: {node: '>=18'} 253 + cpu: [arm64] 254 + os: [darwin] 255 + 256 + '@esbuild/darwin-x64@0.25.12': 257 + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} 258 + engines: {node: '>=18'} 259 + cpu: [x64] 260 + os: [darwin] 261 + 262 + '@esbuild/darwin-x64@0.27.3': 263 + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} 264 + engines: {node: '>=18'} 265 + cpu: [x64] 266 + os: [darwin] 267 + 268 + '@esbuild/freebsd-arm64@0.25.12': 269 + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} 270 + engines: {node: '>=18'} 271 + cpu: [arm64] 272 + os: [freebsd] 273 + 274 + '@esbuild/freebsd-arm64@0.27.3': 275 + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} 276 + engines: {node: '>=18'} 277 + cpu: [arm64] 278 + os: [freebsd] 279 + 280 + '@esbuild/freebsd-x64@0.25.12': 281 + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} 282 + engines: {node: '>=18'} 283 + cpu: [x64] 284 + os: [freebsd] 285 + 286 + '@esbuild/freebsd-x64@0.27.3': 287 + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} 288 + engines: {node: '>=18'} 289 + cpu: [x64] 290 + os: [freebsd] 291 + 292 + '@esbuild/linux-arm64@0.25.12': 293 + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} 294 + engines: {node: '>=18'} 295 + cpu: [arm64] 296 + os: [linux] 297 + 298 + '@esbuild/linux-arm64@0.27.3': 299 + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} 300 + engines: {node: '>=18'} 301 + cpu: [arm64] 302 + os: [linux] 303 + 304 + '@esbuild/linux-arm@0.25.12': 305 + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} 306 + engines: {node: '>=18'} 307 + cpu: [arm] 308 + os: [linux] 309 + 310 + '@esbuild/linux-arm@0.27.3': 311 + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} 312 + engines: {node: '>=18'} 313 + cpu: [arm] 314 + os: [linux] 315 + 316 + '@esbuild/linux-ia32@0.25.12': 317 + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} 318 + engines: {node: '>=18'} 319 + cpu: [ia32] 320 + os: [linux] 321 + 322 + '@esbuild/linux-ia32@0.27.3': 323 + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} 324 + engines: {node: '>=18'} 325 + cpu: [ia32] 326 + os: [linux] 327 + 328 + '@esbuild/linux-loong64@0.25.12': 329 + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} 330 + engines: {node: '>=18'} 331 + cpu: [loong64] 332 + os: [linux] 333 + 334 + '@esbuild/linux-loong64@0.27.3': 335 + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} 336 + engines: {node: '>=18'} 337 + cpu: [loong64] 338 + os: [linux] 339 + 340 + '@esbuild/linux-mips64el@0.25.12': 341 + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} 342 + engines: {node: '>=18'} 343 + cpu: [mips64el] 344 + os: [linux] 345 + 346 + '@esbuild/linux-mips64el@0.27.3': 347 + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} 348 + engines: {node: '>=18'} 349 + cpu: [mips64el] 350 + os: [linux] 351 + 352 + '@esbuild/linux-ppc64@0.25.12': 353 + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} 354 + engines: {node: '>=18'} 355 + cpu: [ppc64] 356 + os: [linux] 357 + 358 + '@esbuild/linux-ppc64@0.27.3': 359 + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} 360 + engines: {node: '>=18'} 361 + cpu: [ppc64] 362 + os: [linux] 363 + 364 + '@esbuild/linux-riscv64@0.25.12': 365 + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} 366 + engines: {node: '>=18'} 367 + cpu: [riscv64] 368 + os: [linux] 369 + 370 + '@esbuild/linux-riscv64@0.27.3': 371 + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} 372 + engines: {node: '>=18'} 373 + cpu: [riscv64] 374 + os: [linux] 375 + 376 + '@esbuild/linux-s390x@0.25.12': 377 + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} 378 + engines: {node: '>=18'} 379 + cpu: [s390x] 380 + os: [linux] 381 + 382 + '@esbuild/linux-s390x@0.27.3': 383 + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} 384 + engines: {node: '>=18'} 385 + cpu: [s390x] 386 + os: [linux] 387 + 388 + '@esbuild/linux-x64@0.25.12': 389 + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} 390 + engines: {node: '>=18'} 391 + cpu: [x64] 392 + os: [linux] 393 + 394 + '@esbuild/linux-x64@0.27.3': 395 + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} 396 + engines: {node: '>=18'} 397 + cpu: [x64] 398 + os: [linux] 399 + 400 + '@esbuild/netbsd-arm64@0.25.12': 401 + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} 402 + engines: {node: '>=18'} 403 + cpu: [arm64] 404 + os: [netbsd] 405 + 406 + '@esbuild/netbsd-arm64@0.27.3': 407 + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} 408 + engines: {node: '>=18'} 409 + cpu: [arm64] 410 + os: [netbsd] 411 + 412 + '@esbuild/netbsd-x64@0.25.12': 413 + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} 414 + engines: {node: '>=18'} 415 + cpu: [x64] 416 + os: [netbsd] 417 + 418 + '@esbuild/netbsd-x64@0.27.3': 419 + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} 420 + engines: {node: '>=18'} 421 + cpu: [x64] 422 + os: [netbsd] 423 + 424 + '@esbuild/openbsd-arm64@0.25.12': 425 + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} 426 + engines: {node: '>=18'} 427 + cpu: [arm64] 428 + os: [openbsd] 429 + 430 + '@esbuild/openbsd-arm64@0.27.3': 431 + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} 432 + engines: {node: '>=18'} 433 + cpu: [arm64] 434 + os: [openbsd] 435 + 436 + '@esbuild/openbsd-x64@0.25.12': 437 + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} 438 + engines: {node: '>=18'} 439 + cpu: [x64] 440 + os: [openbsd] 441 + 442 + '@esbuild/openbsd-x64@0.27.3': 443 + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} 444 + engines: {node: '>=18'} 445 + cpu: [x64] 446 + os: [openbsd] 447 + 448 + '@esbuild/openharmony-arm64@0.25.12': 449 + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} 450 + engines: {node: '>=18'} 451 + cpu: [arm64] 452 + os: [openharmony] 453 + 454 + '@esbuild/openharmony-arm64@0.27.3': 455 + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} 456 + engines: {node: '>=18'} 457 + cpu: [arm64] 458 + os: [openharmony] 459 + 460 + '@esbuild/sunos-x64@0.25.12': 461 + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} 462 + engines: {node: '>=18'} 463 + cpu: [x64] 464 + os: [sunos] 465 + 466 + '@esbuild/sunos-x64@0.27.3': 467 + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} 468 + engines: {node: '>=18'} 469 + cpu: [x64] 470 + os: [sunos] 471 + 472 + '@esbuild/win32-arm64@0.25.12': 473 + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} 474 + engines: {node: '>=18'} 475 + cpu: [arm64] 476 + os: [win32] 477 + 478 + '@esbuild/win32-arm64@0.27.3': 479 + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} 480 + engines: {node: '>=18'} 481 + cpu: [arm64] 482 + os: [win32] 483 + 484 + '@esbuild/win32-ia32@0.25.12': 485 + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} 486 + engines: {node: '>=18'} 487 + cpu: [ia32] 488 + os: [win32] 489 + 490 + '@esbuild/win32-ia32@0.27.3': 491 + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} 492 + engines: {node: '>=18'} 493 + cpu: [ia32] 494 + os: [win32] 495 + 496 + '@esbuild/win32-x64@0.25.12': 497 + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} 498 + engines: {node: '>=18'} 499 + cpu: [x64] 500 + os: [win32] 501 + 502 + '@esbuild/win32-x64@0.27.3': 503 + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} 504 + engines: {node: '>=18'} 505 + cpu: [x64] 506 + os: [win32] 507 + 508 + '@eslint-community/eslint-utils@4.9.1': 509 + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} 510 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 511 + peerDependencies: 512 + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 513 + 514 + '@eslint-community/regexpp@4.12.2': 515 + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} 516 + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 517 + 518 + '@eslint/config-array@0.21.1': 519 + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} 520 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 521 + 522 + '@eslint/config-helpers@0.4.2': 523 + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} 524 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 525 + 526 + '@eslint/core@0.17.0': 527 + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} 528 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 529 + 530 + '@eslint/eslintrc@3.3.3': 531 + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} 532 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 533 + 534 + '@eslint/js@9.39.2': 535 + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} 536 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 537 + 538 + '@eslint/object-schema@2.1.7': 539 + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} 540 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 541 + 542 + '@eslint/plugin-kit@0.4.1': 543 + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} 544 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 545 + 546 + '@fluent/syntax@0.19.0': 547 + resolution: {integrity: sha512-5D2qVpZrgpjtqU4eNOcWGp1gnUCgjfM+vKGE2y03kKN6z5EBhtx0qdRFbg8QuNNj8wXNoX93KJoYb+NqoxswmQ==} 548 + engines: {node: '>=14.0.0', npm: '>=7.0.0'} 549 + 550 + '@fregante/relaxed-json@2.0.0': 551 + resolution: {integrity: sha512-PyUXQWB42s4jBli435TDiYuVsadwRHnMc27YaLouINktvTWsL3FcKrRMGawTayFk46X+n5bE23RjUTWQwrukWw==} 552 + engines: {node: '>= 0.10.0'} 553 + 554 + '@humanfs/core@0.19.1': 555 + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 556 + engines: {node: '>=18.18.0'} 557 + 558 + '@humanfs/node@0.16.7': 559 + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} 560 + engines: {node: '>=18.18.0'} 561 + 562 + '@humanwhocodes/module-importer@1.0.1': 563 + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 564 + engines: {node: '>=12.22'} 565 + 566 + '@humanwhocodes/retry@0.4.3': 567 + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 568 + engines: {node: '>=18.18'} 569 + 570 + '@isaacs/cliui@9.0.0': 571 + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} 572 + engines: {node: '>=18'} 573 + 574 + '@jridgewell/gen-mapping@0.3.13': 575 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 576 + 577 + '@jridgewell/remapping@2.3.5': 578 + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} 579 + 580 + '@jridgewell/resolve-uri@3.1.2': 581 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 582 + engines: {node: '>=6.0.0'} 583 + 584 + '@jridgewell/sourcemap-codec@1.5.5': 585 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 586 + 587 + '@jridgewell/trace-mapping@0.3.31': 588 + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 589 + 590 + '@mdn/browser-compat-data@7.3.0': 591 + resolution: {integrity: sha512-B7X53zLkrQOVNzsWg4d+iE5vbrreOYB9H/2Ikeit9LPb3tqRNRsEAxysQduFLODBJBSgFGr2FkJLq7tMQkqLZQ==} 592 + 593 + '@nodelib/fs.scandir@2.1.5': 594 + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 595 + engines: {node: '>= 8'} 596 + 597 + '@nodelib/fs.stat@2.0.5': 598 + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 599 + engines: {node: '>= 8'} 600 + 601 + '@nodelib/fs.walk@1.2.8': 602 + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 603 + engines: {node: '>= 8'} 604 + 605 + '@pinojs/redact@0.4.0': 606 + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} 607 + 608 + '@pnpm/config.env-replace@1.1.0': 609 + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} 610 + engines: {node: '>=12.22.0'} 611 + 612 + '@pnpm/network.ca-file@1.0.2': 613 + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} 614 + engines: {node: '>=12.22.0'} 615 + 616 + '@pnpm/npm-conf@3.0.2': 617 + resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} 618 + engines: {node: '>=12'} 619 + 620 + '@rolldown/pluginutils@1.0.0-rc.3': 621 + resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} 622 + 623 + '@rollup/pluginutils@5.3.0': 624 + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} 625 + engines: {node: '>=14.0.0'} 626 + peerDependencies: 627 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 628 + peerDependenciesMeta: 629 + rollup: 630 + optional: true 631 + 632 + '@rollup/rollup-android-arm-eabi@4.57.1': 633 + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} 634 + cpu: [arm] 635 + os: [android] 636 + 637 + '@rollup/rollup-android-arm64@4.57.1': 638 + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} 639 + cpu: [arm64] 640 + os: [android] 641 + 642 + '@rollup/rollup-darwin-arm64@4.57.1': 643 + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} 644 + cpu: [arm64] 645 + os: [darwin] 646 + 647 + '@rollup/rollup-darwin-x64@4.57.1': 648 + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} 649 + cpu: [x64] 650 + os: [darwin] 651 + 652 + '@rollup/rollup-freebsd-arm64@4.57.1': 653 + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} 654 + cpu: [arm64] 655 + os: [freebsd] 656 + 657 + '@rollup/rollup-freebsd-x64@4.57.1': 658 + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} 659 + cpu: [x64] 660 + os: [freebsd] 661 + 662 + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': 663 + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} 664 + cpu: [arm] 665 + os: [linux] 666 + libc: [glibc] 667 + 668 + '@rollup/rollup-linux-arm-musleabihf@4.57.1': 669 + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} 670 + cpu: [arm] 671 + os: [linux] 672 + libc: [musl] 673 + 674 + '@rollup/rollup-linux-arm64-gnu@4.57.1': 675 + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} 676 + cpu: [arm64] 677 + os: [linux] 678 + libc: [glibc] 679 + 680 + '@rollup/rollup-linux-arm64-musl@4.57.1': 681 + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} 682 + cpu: [arm64] 683 + os: [linux] 684 + libc: [musl] 685 + 686 + '@rollup/rollup-linux-loong64-gnu@4.57.1': 687 + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} 688 + cpu: [loong64] 689 + os: [linux] 690 + libc: [glibc] 691 + 692 + '@rollup/rollup-linux-loong64-musl@4.57.1': 693 + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} 694 + cpu: [loong64] 695 + os: [linux] 696 + libc: [musl] 697 + 698 + '@rollup/rollup-linux-ppc64-gnu@4.57.1': 699 + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} 700 + cpu: [ppc64] 701 + os: [linux] 702 + libc: [glibc] 703 + 704 + '@rollup/rollup-linux-ppc64-musl@4.57.1': 705 + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} 706 + cpu: [ppc64] 707 + os: [linux] 708 + libc: [musl] 709 + 710 + '@rollup/rollup-linux-riscv64-gnu@4.57.1': 711 + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} 712 + cpu: [riscv64] 713 + os: [linux] 714 + libc: [glibc] 715 + 716 + '@rollup/rollup-linux-riscv64-musl@4.57.1': 717 + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} 718 + cpu: [riscv64] 719 + os: [linux] 720 + libc: [musl] 721 + 722 + '@rollup/rollup-linux-s390x-gnu@4.57.1': 723 + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} 724 + cpu: [s390x] 725 + os: [linux] 726 + libc: [glibc] 727 + 728 + '@rollup/rollup-linux-x64-gnu@4.57.1': 729 + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} 730 + cpu: [x64] 731 + os: [linux] 732 + libc: [glibc] 733 + 734 + '@rollup/rollup-linux-x64-musl@4.57.1': 735 + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} 736 + cpu: [x64] 737 + os: [linux] 738 + libc: [musl] 739 + 740 + '@rollup/rollup-openbsd-x64@4.57.1': 741 + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} 742 + cpu: [x64] 743 + os: [openbsd] 744 + 745 + '@rollup/rollup-openharmony-arm64@4.57.1': 746 + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} 747 + cpu: [arm64] 748 + os: [openharmony] 749 + 750 + '@rollup/rollup-win32-arm64-msvc@4.57.1': 751 + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} 752 + cpu: [arm64] 753 + os: [win32] 754 + 755 + '@rollup/rollup-win32-ia32-msvc@4.57.1': 756 + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} 757 + cpu: [ia32] 758 + os: [win32] 759 + 760 + '@rollup/rollup-win32-x64-gnu@4.57.1': 761 + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} 762 + cpu: [x64] 763 + os: [win32] 764 + 765 + '@rollup/rollup-win32-x64-msvc@4.57.1': 766 + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} 767 + cpu: [x64] 768 + os: [win32] 769 + 770 + '@types/babel__core@7.20.5': 771 + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 772 + 773 + '@types/babel__generator@7.27.0': 774 + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} 775 + 776 + '@types/babel__template@7.4.4': 777 + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 778 + 779 + '@types/babel__traverse@7.28.0': 780 + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} 781 + 782 + '@types/chrome@0.0.280': 783 + resolution: {integrity: sha512-AotSmZrL9bcZDDmSI1D9dE7PGbhOur5L0cKxXd7IqbVizQWCY4gcvupPUVsQ4FfDj3V2tt/iOpomT9EY0s+w1g==} 784 + 785 + '@types/estree@1.0.8': 786 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 787 + 788 + '@types/filesystem@0.0.36': 789 + resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} 790 + 791 + '@types/filewriter@0.0.33': 792 + resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} 793 + 794 + '@types/har-format@1.2.16': 795 + resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} 796 + 797 + '@types/json-schema@7.0.15': 798 + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 799 + 800 + '@types/minimatch@3.0.5': 801 + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} 802 + 803 + '@types/node@25.2.3': 804 + resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} 805 + 806 + '@types/prop-types@15.7.15': 807 + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} 808 + 809 + '@types/react-dom@18.3.7': 810 + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} 811 + peerDependencies: 812 + '@types/react': ^18.0.0 813 + 814 + '@types/react@18.3.28': 815 + resolution: {integrity: sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==} 816 + 817 + '@types/webextension-polyfill@0.12.4': 818 + resolution: {integrity: sha512-wK8YdSI0pDiaehSLDIvtvonYmLwUUivg4Z6JCJO8rkyssMAG82cFJgwPK/V7NO61mJBLg/tXeoXQL8AFzpXZmQ==} 819 + 820 + '@types/yauzl@2.10.3': 821 + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} 822 + 823 + '@typescript-eslint/eslint-plugin@8.55.0': 824 + resolution: {integrity: sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==} 825 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 826 + peerDependencies: 827 + '@typescript-eslint/parser': ^8.55.0 828 + eslint: ^8.57.0 || ^9.0.0 829 + typescript: '>=4.8.4 <6.0.0' 830 + 831 + '@typescript-eslint/parser@8.55.0': 832 + resolution: {integrity: sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==} 833 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 834 + peerDependencies: 835 + eslint: ^8.57.0 || ^9.0.0 836 + typescript: '>=4.8.4 <6.0.0' 837 + 838 + '@typescript-eslint/project-service@8.55.0': 839 + resolution: {integrity: sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==} 840 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 841 + peerDependencies: 842 + typescript: '>=4.8.4 <6.0.0' 843 + 844 + '@typescript-eslint/scope-manager@8.55.0': 845 + resolution: {integrity: sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==} 846 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 847 + 848 + '@typescript-eslint/tsconfig-utils@8.55.0': 849 + resolution: {integrity: sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==} 850 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 851 + peerDependencies: 852 + typescript: '>=4.8.4 <6.0.0' 853 + 854 + '@typescript-eslint/type-utils@8.55.0': 855 + resolution: {integrity: sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==} 856 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 857 + peerDependencies: 858 + eslint: ^8.57.0 || ^9.0.0 859 + typescript: '>=4.8.4 <6.0.0' 860 + 861 + '@typescript-eslint/types@8.55.0': 862 + resolution: {integrity: sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==} 863 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 864 + 865 + '@typescript-eslint/typescript-estree@8.55.0': 866 + resolution: {integrity: sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==} 867 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 868 + peerDependencies: 869 + typescript: '>=4.8.4 <6.0.0' 870 + 871 + '@typescript-eslint/utils@8.55.0': 872 + resolution: {integrity: sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==} 873 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 874 + peerDependencies: 875 + eslint: ^8.57.0 || ^9.0.0 876 + typescript: '>=4.8.4 <6.0.0' 877 + 878 + '@typescript-eslint/visitor-keys@8.55.0': 879 + resolution: {integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==} 880 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 881 + 882 + '@vitejs/plugin-react@5.1.4': 883 + resolution: {integrity: sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==} 884 + engines: {node: ^20.19.0 || >=22.12.0} 885 + peerDependencies: 886 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 887 + 888 + '@webext-core/fake-browser@1.3.4': 889 + resolution: {integrity: sha512-nZcVWr3JpwpS5E6hKpbAwAMBM/AXZShnfW0F76udW8oLd6Kv0nbW6vFS07md4Na/0ntQonk3hFnlQYGYBAlTrA==} 890 + 891 + '@webext-core/isolated-element@1.1.3': 892 + resolution: {integrity: sha512-rbtnReIGdiVQb2UhK3MiECU6JqsiIo2K/luWvOdOw57Ot770Iw4KLCEPXUQMITIH5V5er2jfVK8hSWXaEOQGNQ==} 893 + 894 + '@webext-core/match-patterns@1.0.3': 895 + resolution: {integrity: sha512-NY39ACqCxdKBmHgw361M9pfJma8e4AZo20w9AY+5ZjIj1W2dvXC8J31G5fjfOGbulW9w4WKpT8fPooi0mLkn9A==} 896 + 897 + '@webext-core/messaging@1.4.0': 898 + resolution: {integrity: sha512-gzXQ13HfKR3Yrn9TnrvTC/5seA7uPFvaqxqNFBsFOOdSZa5LyXt58Rhym8BYXarkWUGp+fh8f6AYM3RYuNbS+A==} 899 + 900 + '@wxt-dev/browser@0.1.36': 901 + resolution: {integrity: sha512-48Wn8pItPNg7rCdy10c73z6Alto0z5xkBZohPApKK4/uC8C70j9tJRlaxXdHF/u8+SMZGdrvYtz16oLrOxBu6g==} 902 + 903 + '@wxt-dev/module-react@1.1.5': 904 + resolution: {integrity: sha512-KgsUrsgH5rBT8MwiipnDEOHBXmLvTIdFICrI7KjngqSf9DpVRn92HsKmToxY0AYpkP19hHWta2oNYFTzmmm++g==} 905 + peerDependencies: 906 + wxt: '>=0.19.16' 907 + 908 + '@wxt-dev/storage@1.2.7': 909 + resolution: {integrity: sha512-+rfRmfF2Wd6knXSFfgjLHelKEVnlryI/UG2/gNbO9U/KZJtSvo8QkGSJ1iJQ7jLYCYD+oYCzMZdL7D4BJLCUkw==} 910 + 911 + acorn-jsx@5.3.2: 912 + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 913 + peerDependencies: 914 + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 915 + 916 + acorn@8.15.0: 917 + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 918 + engines: {node: '>=0.4.0'} 919 + hasBin: true 920 + 921 + addons-linter@9.6.0: 922 + resolution: {integrity: sha512-hoZFDg/4Ial7xw2SDrnQJ6iyLtf0KdP/NRhLP1bX+SKNmFLJskDIvWOCbDAC1qUq7cNrt4yCvGlr3UO0VZaluw==} 923 + engines: {node: '>=18.0.0'} 924 + hasBin: true 925 + 926 + addons-moz-compare@1.3.0: 927 + resolution: {integrity: sha512-/rXpQeaY0nOKhNx00pmZXdk5Mu+KhVlL3/pSBuAYwrxRrNiTvI/9xfQI8Lmm7DMMl+PDhtfAHY/0ibTpdeoQQQ==} 928 + 929 + addons-scanner-utils@10.2.0: 930 + resolution: {integrity: sha512-U6XRBTP/2EhLnTN/GHioBWvzaJAKwjVhoGjytwHdA+dIUx8n/9Hr7YTJwsBwJN5GpqV/3Ma87RQh+vEE4X4fwA==} 931 + peerDependencies: 932 + body-parser: 2.2.2 933 + express: 5.2.1 934 + node-fetch: 2.6.11 935 + safe-compare: 1.1.4 936 + peerDependenciesMeta: 937 + body-parser: 938 + optional: true 939 + express: 940 + optional: true 941 + node-fetch: 942 + optional: true 943 + safe-compare: 944 + optional: true 945 + 946 + adm-zip@0.5.16: 947 + resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} 948 + engines: {node: '>=12.0'} 949 + 950 + agent-base@7.1.4: 951 + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} 952 + engines: {node: '>= 14'} 953 + 954 + ajv@6.12.6: 955 + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 956 + 957 + ajv@8.17.1: 958 + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 959 + 960 + ansi-align@3.0.1: 961 + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} 962 + 963 + ansi-escapes@7.3.0: 964 + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} 965 + engines: {node: '>=18'} 966 + 967 + ansi-regex@5.0.1: 968 + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 969 + engines: {node: '>=8'} 970 + 971 + ansi-regex@6.2.2: 972 + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} 973 + engines: {node: '>=12'} 974 + 975 + ansi-styles@4.3.0: 976 + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 977 + engines: {node: '>=8'} 978 + 979 + ansi-styles@6.2.3: 980 + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} 981 + engines: {node: '>=12'} 982 + 983 + any-promise@1.3.0: 984 + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 985 + 986 + anymatch@3.1.3: 987 + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 988 + engines: {node: '>= 8'} 989 + 990 + arg@5.0.2: 991 + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 992 + 993 + argparse@2.0.1: 994 + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 995 + 996 + array-differ@4.0.0: 997 + resolution: {integrity: sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==} 998 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 999 + 1000 + array-union@3.0.1: 1001 + resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==} 1002 + engines: {node: '>=12'} 1003 + 1004 + async-mutex@0.5.0: 1005 + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} 1006 + 1007 + async@3.2.6: 1008 + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} 1009 + 1010 + atomic-sleep@1.0.0: 1011 + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} 1012 + engines: {node: '>=8.0.0'} 1013 + 1014 + atomically@2.1.1: 1015 + resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} 1016 + 1017 + autoprefixer@10.4.24: 1018 + resolution: {integrity: sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==} 1019 + engines: {node: ^10 || ^12 || >=14} 1020 + hasBin: true 1021 + peerDependencies: 1022 + postcss: ^8.1.0 1023 + 1024 + balanced-match@1.0.2: 1025 + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1026 + 1027 + balanced-match@4.0.2: 1028 + resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} 1029 + engines: {node: 20 || >=22} 1030 + 1031 + baseline-browser-mapping@2.9.19: 1032 + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} 1033 + hasBin: true 1034 + 1035 + binary-extensions@2.3.0: 1036 + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 1037 + engines: {node: '>=8'} 1038 + 1039 + bluebird@3.7.2: 1040 + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} 1041 + 1042 + boolbase@1.0.0: 1043 + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} 1044 + 1045 + boxen@8.0.1: 1046 + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} 1047 + engines: {node: '>=18'} 1048 + 1049 + brace-expansion@1.1.12: 1050 + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 1051 + 1052 + brace-expansion@2.0.2: 1053 + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 1054 + 1055 + brace-expansion@5.0.2: 1056 + resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} 1057 + engines: {node: 20 || >=22} 1058 + 1059 + braces@3.0.3: 1060 + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 1061 + engines: {node: '>=8'} 1062 + 1063 + browserslist@4.28.1: 1064 + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} 1065 + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1066 + hasBin: true 1067 + 1068 + buffer-crc32@0.2.13: 1069 + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 1070 + 1071 + buffer-from@1.1.2: 1072 + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 1073 + 1074 + bundle-name@4.1.0: 1075 + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} 1076 + engines: {node: '>=18'} 1077 + 1078 + c12@3.3.3: 1079 + resolution: {integrity: sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==} 1080 + peerDependencies: 1081 + magicast: '*' 1082 + peerDependenciesMeta: 1083 + magicast: 1084 + optional: true 1085 + 1086 + cac@6.7.14: 1087 + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 1088 + engines: {node: '>=8'} 1089 + 1090 + callsites@3.1.0: 1091 + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1092 + engines: {node: '>=6'} 1093 + 1094 + camelcase-css@2.0.1: 1095 + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 1096 + engines: {node: '>= 6'} 1097 + 1098 + camelcase@8.0.0: 1099 + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} 1100 + engines: {node: '>=16'} 1101 + 1102 + caniuse-lite@1.0.30001769: 1103 + resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} 1104 + 1105 + chalk@4.1.2: 1106 + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1107 + engines: {node: '>=10'} 1108 + 1109 + chalk@5.6.2: 1110 + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} 1111 + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 1112 + 1113 + cheerio-select@2.1.0: 1114 + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} 1115 + 1116 + cheerio@1.2.0: 1117 + resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} 1118 + engines: {node: '>=20.18.1'} 1119 + 1120 + chokidar@3.6.0: 1121 + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 1122 + engines: {node: '>= 8.10.0'} 1123 + 1124 + chokidar@4.0.3: 1125 + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 1126 + engines: {node: '>= 14.16.0'} 1127 + 1128 + chokidar@5.0.0: 1129 + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} 1130 + engines: {node: '>= 20.19.0'} 1131 + 1132 + chownr@2.0.0: 1133 + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} 1134 + engines: {node: '>=10'} 1135 + 1136 + chrome-launcher@1.2.0: 1137 + resolution: {integrity: sha512-JbuGuBNss258bvGil7FT4HKdC3SC2K7UAEUqiPy3ACS3Yxo3hAW6bvFpCu2HsIJLgTqxgEX6BkujvzZfLpUD0Q==} 1138 + engines: {node: '>=12.13.0'} 1139 + hasBin: true 1140 + 1141 + ci-info@4.4.0: 1142 + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} 1143 + engines: {node: '>=8'} 1144 + 1145 + citty@0.1.6: 1146 + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} 1147 + 1148 + citty@0.2.1: 1149 + resolution: {integrity: sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg==} 1150 + 1151 + cli-boxes@3.0.0: 1152 + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} 1153 + engines: {node: '>=10'} 1154 + 1155 + cli-cursor@5.0.0: 1156 + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} 1157 + engines: {node: '>=18'} 1158 + 1159 + cli-spinners@2.9.2: 1160 + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} 1161 + engines: {node: '>=6'} 1162 + 1163 + cli-truncate@4.0.0: 1164 + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} 1165 + engines: {node: '>=18'} 1166 + 1167 + cliui@8.0.1: 1168 + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 1169 + engines: {node: '>=12'} 1170 + 1171 + clone@1.0.4: 1172 + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} 1173 + engines: {node: '>=0.8'} 1174 + 1175 + clsx@2.1.1: 1176 + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 1177 + engines: {node: '>=6'} 1178 + 1179 + color-convert@2.0.1: 1180 + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1181 + engines: {node: '>=7.0.0'} 1182 + 1183 + color-name@1.1.4: 1184 + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1185 + 1186 + colorette@2.0.20: 1187 + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} 1188 + 1189 + columnify@1.6.0: 1190 + resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} 1191 + engines: {node: '>=8.0.0'} 1192 + 1193 + commander@2.9.0: 1194 + resolution: {integrity: sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==} 1195 + engines: {node: '>= 0.6.x'} 1196 + 1197 + commander@4.1.1: 1198 + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 1199 + engines: {node: '>= 6'} 1200 + 1201 + commander@9.5.0: 1202 + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} 1203 + engines: {node: ^12.20.0 || >=14} 1204 + 1205 + common-tags@1.8.2: 1206 + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} 1207 + engines: {node: '>=4.0.0'} 1208 + 1209 + concat-map@0.0.1: 1210 + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1211 + 1212 + concat-stream@1.6.2: 1213 + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} 1214 + engines: {'0': node >= 0.8} 1215 + 1216 + confbox@0.1.8: 1217 + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 1218 + 1219 + confbox@0.2.4: 1220 + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} 1221 + 1222 + config-chain@1.1.13: 1223 + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} 1224 + 1225 + configstore@7.1.0: 1226 + resolution: {integrity: sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==} 1227 + engines: {node: '>=18'} 1228 + 1229 + consola@3.4.2: 1230 + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} 1231 + engines: {node: ^14.18.0 || >=16.10.0} 1232 + 1233 + convert-source-map@2.0.0: 1234 + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1235 + 1236 + core-util-is@1.0.3: 1237 + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 1238 + 1239 + cross-spawn@7.0.6: 1240 + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 1241 + engines: {node: '>= 8'} 1242 + 1243 + css-select@5.2.2: 1244 + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} 1245 + 1246 + css-what@6.2.2: 1247 + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} 1248 + engines: {node: '>= 6'} 1249 + 1250 + cssesc@3.0.0: 1251 + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 1252 + engines: {node: '>=4'} 1253 + hasBin: true 1254 + 1255 + cssom@0.5.0: 1256 + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} 1257 + 1258 + csstype@3.2.3: 1259 + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} 1260 + 1261 + debounce@1.2.1: 1262 + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} 1263 + 1264 + debug@4.3.7: 1265 + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 1266 + engines: {node: '>=6.0'} 1267 + peerDependencies: 1268 + supports-color: '*' 1269 + peerDependenciesMeta: 1270 + supports-color: 1271 + optional: true 1272 + 1273 + debug@4.4.3: 1274 + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 1275 + engines: {node: '>=6.0'} 1276 + peerDependencies: 1277 + supports-color: '*' 1278 + peerDependenciesMeta: 1279 + supports-color: 1280 + optional: true 1281 + 1282 + decamelize@6.0.1: 1283 + resolution: {integrity: sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==} 1284 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1285 + 1286 + deep-extend@0.6.0: 1287 + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 1288 + engines: {node: '>=4.0.0'} 1289 + 1290 + deep-is@0.1.4: 1291 + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1292 + 1293 + deepmerge@4.3.1: 1294 + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 1295 + engines: {node: '>=0.10.0'} 1296 + 1297 + default-browser-id@5.0.1: 1298 + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} 1299 + engines: {node: '>=18'} 1300 + 1301 + default-browser@5.5.0: 1302 + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} 1303 + engines: {node: '>=18'} 1304 + 1305 + defaults@1.0.4: 1306 + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} 1307 + 1308 + define-lazy-prop@2.0.0: 1309 + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} 1310 + engines: {node: '>=8'} 1311 + 1312 + define-lazy-prop@3.0.0: 1313 + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} 1314 + engines: {node: '>=12'} 1315 + 1316 + defu@6.1.4: 1317 + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 1318 + 1319 + dequal@2.0.3: 1320 + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 1321 + engines: {node: '>=6'} 1322 + 1323 + destr@2.0.5: 1324 + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} 1325 + 1326 + didyoumean@1.2.2: 1327 + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 1328 + 1329 + dlv@1.1.3: 1330 + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 1331 + 1332 + dom-serializer@2.0.0: 1333 + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 1334 + 1335 + domelementtype@2.3.0: 1336 + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 1337 + 1338 + domhandler@5.0.3: 1339 + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 1340 + engines: {node: '>= 4'} 1341 + 1342 + domutils@3.2.2: 1343 + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} 1344 + 1345 + dot-prop@9.0.0: 1346 + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} 1347 + engines: {node: '>=18'} 1348 + 1349 + dotenv-expand@12.0.3: 1350 + resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==} 1351 + engines: {node: '>=12'} 1352 + 1353 + dotenv@16.6.1: 1354 + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} 1355 + engines: {node: '>=12'} 1356 + 1357 + dotenv@17.3.1: 1358 + resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} 1359 + engines: {node: '>=12'} 1360 + 1361 + electron-to-chromium@1.5.286: 1362 + resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} 1363 + 1364 + emoji-regex@10.6.0: 1365 + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} 1366 + 1367 + emoji-regex@8.0.0: 1368 + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1369 + 1370 + encoding-sniffer@0.2.1: 1371 + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} 1372 + 1373 + entities@4.5.0: 1374 + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 1375 + engines: {node: '>=0.12'} 1376 + 1377 + entities@6.0.1: 1378 + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 1379 + engines: {node: '>=0.12'} 1380 + 1381 + entities@7.0.1: 1382 + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} 1383 + engines: {node: '>=0.12'} 1384 + 1385 + environment@1.1.0: 1386 + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} 1387 + engines: {node: '>=18'} 1388 + 1389 + error-ex@1.3.4: 1390 + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} 1391 + 1392 + es-module-lexer@1.7.0: 1393 + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 1394 + 1395 + es6-error@4.1.1: 1396 + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} 1397 + 1398 + esbuild@0.25.12: 1399 + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} 1400 + engines: {node: '>=18'} 1401 + hasBin: true 1402 + 1403 + esbuild@0.27.3: 1404 + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} 1405 + engines: {node: '>=18'} 1406 + hasBin: true 1407 + 1408 + escalade@3.2.0: 1409 + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 1410 + engines: {node: '>=6'} 1411 + 1412 + escape-goat@4.0.0: 1413 + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} 1414 + engines: {node: '>=12'} 1415 + 1416 + escape-string-regexp@4.0.0: 1417 + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1418 + engines: {node: '>=10'} 1419 + 1420 + escape-string-regexp@5.0.0: 1421 + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 1422 + engines: {node: '>=12'} 1423 + 1424 + eslint-config-prettier@10.1.8: 1425 + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} 1426 + hasBin: true 1427 + peerDependencies: 1428 + eslint: '>=7.0.0' 1429 + 1430 + eslint-plugin-no-unsanitized@4.1.4: 1431 + resolution: {integrity: sha512-cjAoZoq3J+5KJuycYYOWrc0/OpZ7pl2Z3ypfFq4GtaAgheg+L7YGxUo2YS3avIvo/dYU5/zR2hXu3v81M9NxhQ==} 1432 + peerDependencies: 1433 + eslint: ^8 || ^9 1434 + 1435 + eslint-scope@8.4.0: 1436 + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 1437 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1438 + 1439 + eslint-visitor-keys@3.4.3: 1440 + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1441 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1442 + 1443 + eslint-visitor-keys@4.2.1: 1444 + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 1445 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1446 + 1447 + eslint-visitor-keys@5.0.0: 1448 + resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} 1449 + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 1450 + 1451 + eslint@9.39.2: 1452 + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} 1453 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1454 + hasBin: true 1455 + peerDependencies: 1456 + jiti: '*' 1457 + peerDependenciesMeta: 1458 + jiti: 1459 + optional: true 1460 + 1461 + espree@10.4.0: 1462 + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 1463 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1464 + 1465 + espree@11.1.0: 1466 + resolution: {integrity: sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw==} 1467 + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 1468 + 1469 + esprima@4.0.1: 1470 + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1471 + engines: {node: '>=4'} 1472 + hasBin: true 1473 + 1474 + esquery@1.7.0: 1475 + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} 1476 + engines: {node: '>=0.10'} 1477 + 1478 + esrecurse@4.3.0: 1479 + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1480 + engines: {node: '>=4.0'} 1481 + 1482 + estraverse@5.3.0: 1483 + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1484 + engines: {node: '>=4.0'} 1485 + 1486 + estree-walker@2.0.2: 1487 + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1488 + 1489 + estree-walker@3.0.3: 1490 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1491 + 1492 + esutils@2.0.3: 1493 + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1494 + engines: {node: '>=0.10.0'} 1495 + 1496 + eventemitter3@5.0.4: 1497 + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} 1498 + 1499 + execa@8.0.1: 1500 + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} 1501 + engines: {node: '>=16.17'} 1502 + 1503 + exsolve@1.0.8: 1504 + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} 1505 + 1506 + fast-deep-equal@3.1.3: 1507 + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1508 + 1509 + fast-glob@3.3.3: 1510 + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 1511 + engines: {node: '>=8.6.0'} 1512 + 1513 + fast-json-patch@3.1.1: 1514 + resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} 1515 + 1516 + fast-json-stable-stringify@2.1.0: 1517 + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1518 + 1519 + fast-levenshtein@2.0.6: 1520 + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1521 + 1522 + fast-redact@3.5.0: 1523 + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} 1524 + engines: {node: '>=6'} 1525 + 1526 + fast-uri@3.1.0: 1527 + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} 1528 + 1529 + fastq@1.20.1: 1530 + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} 1531 + 1532 + fd-slicer@1.1.0: 1533 + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} 1534 + 1535 + fdir@6.5.0: 1536 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 1537 + engines: {node: '>=12.0.0'} 1538 + peerDependencies: 1539 + picomatch: ^3 || ^4 1540 + peerDependenciesMeta: 1541 + picomatch: 1542 + optional: true 1543 + 1544 + file-entry-cache@8.0.0: 1545 + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 1546 + engines: {node: '>=16.0.0'} 1547 + 1548 + filesize@10.1.6: 1549 + resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} 1550 + engines: {node: '>= 10.4.0'} 1551 + 1552 + fill-range@7.1.1: 1553 + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 1554 + engines: {node: '>=8'} 1555 + 1556 + find-up@5.0.0: 1557 + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1558 + engines: {node: '>=10'} 1559 + 1560 + firefox-profile@4.7.0: 1561 + resolution: {integrity: sha512-aGApEu5bfCNbA4PGUZiRJAIU6jKmghV2UVdklXAofnNtiDjqYw0czLS46W7IfFqVKgKhFB8Ao2YoNGHY4BoIMQ==} 1562 + engines: {node: '>=18'} 1563 + hasBin: true 1564 + 1565 + first-chunk-stream@3.0.0: 1566 + resolution: {integrity: sha512-LNRvR4hr/S8cXXkIY5pTgVP7L3tq6LlYWcg9nWBuW7o1NMxKZo6oOVa/6GIekMGI0Iw7uC+HWimMe9u/VAeKqw==} 1567 + engines: {node: '>=8'} 1568 + 1569 + flat-cache@4.0.1: 1570 + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 1571 + engines: {node: '>=16'} 1572 + 1573 + flatted@3.3.3: 1574 + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 1575 + 1576 + form-data-encoder@4.1.0: 1577 + resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} 1578 + engines: {node: '>= 18'} 1579 + 1580 + formdata-node@6.0.3: 1581 + resolution: {integrity: sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==} 1582 + engines: {node: '>= 18'} 1583 + 1584 + fraction.js@5.3.4: 1585 + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} 1586 + 1587 + fs-extra@11.3.3: 1588 + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} 1589 + engines: {node: '>=14.14'} 1590 + 1591 + fs-minipass@2.1.0: 1592 + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} 1593 + engines: {node: '>= 8'} 1594 + 1595 + fsevents@2.3.3: 1596 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1597 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1598 + os: [darwin] 1599 + 1600 + function-bind@1.1.2: 1601 + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1602 + 1603 + fx-runner@1.4.0: 1604 + resolution: {integrity: sha512-rci1g6U0rdTg6bAaBboP7XdRu01dzTAaKXxFf+PUqGuCv6Xu7o8NZdY1D5MvKGIjb6EdS1g3VlXOgksir1uGkg==} 1605 + hasBin: true 1606 + 1607 + gensync@1.0.0-beta.2: 1608 + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1609 + engines: {node: '>=6.9.0'} 1610 + 1611 + get-caller-file@2.0.5: 1612 + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1613 + engines: {node: 6.* || 8.* || >= 10.*} 1614 + 1615 + get-east-asian-width@1.4.0: 1616 + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} 1617 + engines: {node: '>=18'} 1618 + 1619 + get-port-please@3.2.0: 1620 + resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} 1621 + 1622 + get-stream@8.0.1: 1623 + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} 1624 + engines: {node: '>=16'} 1625 + 1626 + giget@1.2.5: 1627 + resolution: {integrity: sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==} 1628 + hasBin: true 1629 + 1630 + giget@2.0.0: 1631 + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} 1632 + hasBin: true 1633 + 1634 + glob-parent@5.1.2: 1635 + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1636 + engines: {node: '>= 6'} 1637 + 1638 + glob-parent@6.0.2: 1639 + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1640 + engines: {node: '>=10.13.0'} 1641 + 1642 + glob-to-regexp@0.4.1: 1643 + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 1644 + 1645 + global-directory@4.0.1: 1646 + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} 1647 + engines: {node: '>=18'} 1648 + 1649 + globals@14.0.0: 1650 + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 1651 + engines: {node: '>=18'} 1652 + 1653 + graceful-fs@4.2.10: 1654 + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 1655 + 1656 + graceful-fs@4.2.11: 1657 + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1658 + 1659 + graceful-readlink@1.0.1: 1660 + resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==} 1661 + 1662 + growly@1.3.0: 1663 + resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} 1664 + 1665 + has-flag@4.0.0: 1666 + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1667 + engines: {node: '>=8'} 1668 + 1669 + hasown@2.0.2: 1670 + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1671 + engines: {node: '>= 0.4'} 1672 + 1673 + hookable@5.5.3: 1674 + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} 1675 + 1676 + html-escaper@3.0.3: 1677 + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} 1678 + 1679 + htmlparser2@10.1.0: 1680 + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} 1681 + 1682 + https-proxy-agent@7.0.6: 1683 + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} 1684 + engines: {node: '>= 14'} 1685 + 1686 + human-signals@5.0.0: 1687 + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} 1688 + engines: {node: '>=16.17.0'} 1689 + 1690 + iconv-lite@0.6.3: 1691 + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 1692 + engines: {node: '>=0.10.0'} 1693 + 1694 + ignore@5.3.2: 1695 + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1696 + engines: {node: '>= 4'} 1697 + 1698 + ignore@7.0.5: 1699 + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 1700 + engines: {node: '>= 4'} 1701 + 1702 + image-size@2.0.2: 1703 + resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} 1704 + engines: {node: '>=16.x'} 1705 + hasBin: true 1706 + 1707 + immediate@3.0.6: 1708 + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} 1709 + 1710 + import-fresh@3.3.1: 1711 + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 1712 + engines: {node: '>=6'} 1713 + 1714 + import-meta-resolve@4.2.0: 1715 + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} 1716 + 1717 + imurmurhash@0.1.4: 1718 + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1719 + engines: {node: '>=0.8.19'} 1720 + 1721 + index-to-position@1.2.0: 1722 + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} 1723 + engines: {node: '>=18'} 1724 + 1725 + inherits@2.0.4: 1726 + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1727 + 1728 + ini@1.3.8: 1729 + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 1730 + 1731 + ini@4.1.1: 1732 + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} 1733 + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 1734 + 1735 + ini@4.1.3: 1736 + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} 1737 + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 1738 + 1739 + is-absolute@0.1.7: 1740 + resolution: {integrity: sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA==} 1741 + engines: {node: '>=0.10.0'} 1742 + 1743 + is-arrayish@0.2.1: 1744 + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 1745 + 1746 + is-binary-path@2.1.0: 1747 + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1748 + engines: {node: '>=8'} 1749 + 1750 + is-core-module@2.16.1: 1751 + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1752 + engines: {node: '>= 0.4'} 1753 + 1754 + is-docker@2.2.1: 1755 + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} 1756 + engines: {node: '>=8'} 1757 + hasBin: true 1758 + 1759 + is-docker@3.0.0: 1760 + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} 1761 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1762 + hasBin: true 1763 + 1764 + is-extglob@2.1.1: 1765 + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1766 + engines: {node: '>=0.10.0'} 1767 + 1768 + is-fullwidth-code-point@3.0.0: 1769 + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1770 + engines: {node: '>=8'} 1771 + 1772 + is-fullwidth-code-point@4.0.0: 1773 + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} 1774 + engines: {node: '>=12'} 1775 + 1776 + is-fullwidth-code-point@5.1.0: 1777 + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} 1778 + engines: {node: '>=18'} 1779 + 1780 + is-glob@4.0.3: 1781 + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1782 + engines: {node: '>=0.10.0'} 1783 + 1784 + is-in-ci@1.0.0: 1785 + resolution: {integrity: sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==} 1786 + engines: {node: '>=18'} 1787 + hasBin: true 1788 + 1789 + is-in-ssh@1.0.0: 1790 + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} 1791 + engines: {node: '>=20'} 1792 + 1793 + is-inside-container@1.0.0: 1794 + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} 1795 + engines: {node: '>=14.16'} 1796 + hasBin: true 1797 + 1798 + is-installed-globally@1.0.0: 1799 + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} 1800 + engines: {node: '>=18'} 1801 + 1802 + is-interactive@2.0.0: 1803 + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} 1804 + engines: {node: '>=12'} 1805 + 1806 + is-npm@6.1.0: 1807 + resolution: {integrity: sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==} 1808 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1809 + 1810 + is-number@7.0.0: 1811 + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1812 + engines: {node: '>=0.12.0'} 1813 + 1814 + is-path-inside@4.0.0: 1815 + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} 1816 + engines: {node: '>=12'} 1817 + 1818 + is-plain-object@2.0.4: 1819 + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} 1820 + engines: {node: '>=0.10.0'} 1821 + 1822 + is-potential-custom-element-name@1.0.1: 1823 + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} 1824 + 1825 + is-primitive@3.0.1: 1826 + resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==} 1827 + engines: {node: '>=0.10.0'} 1828 + 1829 + is-relative@0.1.3: 1830 + resolution: {integrity: sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==} 1831 + engines: {node: '>=0.10.0'} 1832 + 1833 + is-stream@3.0.0: 1834 + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 1835 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1836 + 1837 + is-unicode-supported@1.3.0: 1838 + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} 1839 + engines: {node: '>=12'} 1840 + 1841 + is-unicode-supported@2.1.0: 1842 + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} 1843 + engines: {node: '>=18'} 1844 + 1845 + is-utf8@0.2.1: 1846 + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} 1847 + 1848 + is-wsl@2.2.0: 1849 + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} 1850 + engines: {node: '>=8'} 1851 + 1852 + is-wsl@3.1.0: 1853 + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} 1854 + engines: {node: '>=16'} 1855 + 1856 + isarray@1.0.0: 1857 + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 1858 + 1859 + isexe@1.1.2: 1860 + resolution: {integrity: sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw==} 1861 + 1862 + isexe@2.0.0: 1863 + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1864 + 1865 + isobject@3.0.1: 1866 + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} 1867 + engines: {node: '>=0.10.0'} 1868 + 1869 + jackspeak@4.2.3: 1870 + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} 1871 + engines: {node: 20 || >=22} 1872 + 1873 + jiti@1.21.7: 1874 + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} 1875 + hasBin: true 1876 + 1877 + jiti@2.6.1: 1878 + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} 1879 + hasBin: true 1880 + 1881 + jose@5.9.6: 1882 + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} 1883 + 1884 + js-tokens@4.0.0: 1885 + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1886 + 1887 + js-tokens@9.0.1: 1888 + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} 1889 + 1890 + js-yaml@4.1.1: 1891 + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 1892 + hasBin: true 1893 + 1894 + jsesc@3.1.0: 1895 + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 1896 + engines: {node: '>=6'} 1897 + hasBin: true 1898 + 1899 + json-buffer@3.0.1: 1900 + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1901 + 1902 + json-merge-patch@1.0.2: 1903 + resolution: {integrity: sha512-M6Vp2GN9L7cfuMXiWOmHj9bEFbeC250iVtcKQbqVgEsDVYnIsrNsbU+h/Y/PkbBQCtEa4Bez+Ebv0zfbC8ObLg==} 1904 + 1905 + json-parse-even-better-errors@3.0.2: 1906 + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} 1907 + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 1908 + 1909 + json-schema-traverse@0.4.1: 1910 + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1911 + 1912 + json-schema-traverse@1.0.0: 1913 + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 1914 + 1915 + json-stable-stringify-without-jsonify@1.0.1: 1916 + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1917 + 1918 + json5@2.2.3: 1919 + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1920 + engines: {node: '>=6'} 1921 + hasBin: true 1922 + 1923 + jsonfile@6.2.0: 1924 + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} 1925 + 1926 + jszip@3.10.1: 1927 + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} 1928 + 1929 + keyv@4.5.4: 1930 + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1931 + 1932 + kleur@3.0.3: 1933 + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 1934 + engines: {node: '>=6'} 1935 + 1936 + ky@1.14.3: 1937 + resolution: {integrity: sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==} 1938 + engines: {node: '>=18'} 1939 + 1940 + latest-version@9.0.0: 1941 + resolution: {integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==} 1942 + engines: {node: '>=18'} 1943 + 1944 + levn@0.4.1: 1945 + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1946 + engines: {node: '>= 0.8.0'} 1947 + 1948 + lie@3.3.0: 1949 + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} 1950 + 1951 + lighthouse-logger@2.0.2: 1952 + resolution: {integrity: sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg==} 1953 + 1954 + lilconfig@3.1.3: 1955 + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 1956 + engines: {node: '>=14'} 1957 + 1958 + lines-and-columns@1.2.4: 1959 + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1960 + 1961 + lines-and-columns@2.0.4: 1962 + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} 1963 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1964 + 1965 + linkedom@0.18.12: 1966 + resolution: {integrity: sha512-jalJsOwIKuQJSeTvsgzPe9iJzyfVaEJiEXl+25EkKevsULHvMJzpNqwvj1jOESWdmgKDiXObyjOYwlUqG7wo1Q==} 1967 + engines: {node: '>=16'} 1968 + peerDependencies: 1969 + canvas: '>= 2' 1970 + peerDependenciesMeta: 1971 + canvas: 1972 + optional: true 1973 + 1974 + listr2@8.3.3: 1975 + resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} 1976 + engines: {node: '>=18.0.0'} 1977 + 1978 + local-pkg@1.1.2: 1979 + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} 1980 + engines: {node: '>=14'} 1981 + 1982 + locate-path@6.0.0: 1983 + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1984 + engines: {node: '>=10'} 1985 + 1986 + lodash.merge@4.6.2: 1987 + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1988 + 1989 + log-symbols@6.0.0: 1990 + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} 1991 + engines: {node: '>=18'} 1992 + 1993 + log-update@6.1.0: 1994 + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} 1995 + engines: {node: '>=18'} 1996 + 1997 + loose-envify@1.4.0: 1998 + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1999 + hasBin: true 2000 + 2001 + lru-cache@5.1.1: 2002 + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 2003 + 2004 + lucide-react@0.563.0: 2005 + resolution: {integrity: sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==} 2006 + peerDependencies: 2007 + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 2008 + 2009 + magic-string@0.30.21: 2010 + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 2011 + 2012 + magicast@0.3.5: 2013 + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} 2014 + 2015 + make-error@1.3.6: 2016 + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 2017 + 2018 + many-keys-map@2.0.1: 2019 + resolution: {integrity: sha512-DHnZAD4phTbZ+qnJdjoNEVU1NecYoSdbOOoVmTDH46AuxDkEVh3MxTVpXq10GtcTC6mndN9dkv1rNfpjRcLnOw==} 2020 + 2021 + marky@1.3.0: 2022 + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} 2023 + 2024 + merge-stream@2.0.0: 2025 + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 2026 + 2027 + merge2@1.4.1: 2028 + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 2029 + engines: {node: '>= 8'} 2030 + 2031 + micromatch@4.0.8: 2032 + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 2033 + engines: {node: '>=8.6'} 2034 + 2035 + mimic-fn@4.0.0: 2036 + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 2037 + engines: {node: '>=12'} 2038 + 2039 + mimic-function@5.0.1: 2040 + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} 2041 + engines: {node: '>=18'} 2042 + 2043 + minimatch@10.2.0: 2044 + resolution: {integrity: sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==} 2045 + engines: {node: 20 || >=22} 2046 + 2047 + minimatch@3.1.2: 2048 + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2049 + 2050 + minimatch@9.0.5: 2051 + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 2052 + engines: {node: '>=16 || 14 >=14.17'} 2053 + 2054 + minimist@1.2.8: 2055 + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 2056 + 2057 + minipass@3.3.6: 2058 + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} 2059 + engines: {node: '>=8'} 2060 + 2061 + minipass@5.0.0: 2062 + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} 2063 + engines: {node: '>=8'} 2064 + 2065 + minizlib@2.1.2: 2066 + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} 2067 + engines: {node: '>= 8'} 2068 + 2069 + mkdirp@1.0.4: 2070 + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 2071 + engines: {node: '>=10'} 2072 + hasBin: true 2073 + 2074 + mlly@1.8.0: 2075 + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} 2076 + 2077 + ms@2.1.3: 2078 + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 2079 + 2080 + multimatch@6.0.0: 2081 + resolution: {integrity: sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ==} 2082 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2083 + 2084 + mz@2.7.0: 2085 + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 2086 + 2087 + nano-spawn@0.2.1: 2088 + resolution: {integrity: sha512-/pULofvsF8mOVcl/nUeVXL/GYOEvc7eJWSIxa+K4OYUolvXa5zwSgevsn4eoHs1xvh/BO3vx/PZiD9+Ow2ZVuw==} 2089 + engines: {node: '>=18.19'} 2090 + 2091 + nanoid@3.3.11: 2092 + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 2093 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2094 + hasBin: true 2095 + 2096 + natural-compare@1.4.0: 2097 + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2098 + 2099 + node-fetch-native@1.6.7: 2100 + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} 2101 + 2102 + node-forge@1.3.3: 2103 + resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} 2104 + engines: {node: '>= 6.13.0'} 2105 + 2106 + node-notifier@10.0.1: 2107 + resolution: {integrity: sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==} 2108 + 2109 + node-releases@2.0.27: 2110 + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} 2111 + 2112 + normalize-path@3.0.0: 2113 + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2114 + engines: {node: '>=0.10.0'} 2115 + 2116 + npm-run-path@5.3.0: 2117 + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} 2118 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2119 + 2120 + nth-check@2.1.1: 2121 + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 2122 + 2123 + nypm@0.3.12: 2124 + resolution: {integrity: sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==} 2125 + engines: {node: ^14.16.0 || >=16.10.0} 2126 + hasBin: true 2127 + 2128 + nypm@0.5.4: 2129 + resolution: {integrity: sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==} 2130 + engines: {node: ^14.16.0 || >=16.10.0} 2131 + hasBin: true 2132 + 2133 + nypm@0.6.5: 2134 + resolution: {integrity: sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==} 2135 + engines: {node: '>=18'} 2136 + hasBin: true 2137 + 2138 + object-assign@4.1.1: 2139 + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 2140 + engines: {node: '>=0.10.0'} 2141 + 2142 + object-hash@3.0.0: 2143 + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 2144 + engines: {node: '>= 6'} 2145 + 2146 + ofetch@1.5.1: 2147 + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} 2148 + 2149 + ohash@1.1.6: 2150 + resolution: {integrity: sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==} 2151 + 2152 + ohash@2.0.11: 2153 + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} 2154 + 2155 + on-exit-leak-free@2.1.2: 2156 + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} 2157 + engines: {node: '>=14.0.0'} 2158 + 2159 + onetime@6.0.0: 2160 + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 2161 + engines: {node: '>=12'} 2162 + 2163 + onetime@7.0.0: 2164 + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} 2165 + engines: {node: '>=18'} 2166 + 2167 + open@10.2.0: 2168 + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} 2169 + engines: {node: '>=18'} 2170 + 2171 + open@11.0.0: 2172 + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} 2173 + engines: {node: '>=20'} 2174 + 2175 + open@8.4.2: 2176 + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} 2177 + engines: {node: '>=12'} 2178 + 2179 + optionator@0.9.4: 2180 + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 2181 + engines: {node: '>= 0.8.0'} 2182 + 2183 + ora@8.2.0: 2184 + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} 2185 + engines: {node: '>=18'} 2186 + 2187 + os-shim@0.1.3: 2188 + resolution: {integrity: sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==} 2189 + engines: {node: '>= 0.4.0'} 2190 + 2191 + p-limit@3.1.0: 2192 + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 2193 + engines: {node: '>=10'} 2194 + 2195 + p-locate@5.0.0: 2196 + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 2197 + engines: {node: '>=10'} 2198 + 2199 + package-json@10.0.1: 2200 + resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==} 2201 + engines: {node: '>=18'} 2202 + 2203 + pako@1.0.11: 2204 + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} 2205 + 2206 + parent-module@1.0.1: 2207 + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2208 + engines: {node: '>=6'} 2209 + 2210 + parse-json@7.1.1: 2211 + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} 2212 + engines: {node: '>=16'} 2213 + 2214 + parse-json@8.3.0: 2215 + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} 2216 + engines: {node: '>=18'} 2217 + 2218 + parse5-htmlparser2-tree-adapter@7.1.0: 2219 + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} 2220 + 2221 + parse5-parser-stream@7.1.2: 2222 + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} 2223 + 2224 + parse5@7.3.0: 2225 + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} 2226 + 2227 + path-exists@4.0.0: 2228 + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2229 + engines: {node: '>=8'} 2230 + 2231 + path-key@3.1.1: 2232 + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2233 + engines: {node: '>=8'} 2234 + 2235 + path-key@4.0.0: 2236 + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 2237 + engines: {node: '>=12'} 2238 + 2239 + path-parse@1.0.7: 2240 + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2241 + 2242 + pathe@1.1.2: 2243 + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 2244 + 2245 + pathe@2.0.3: 2246 + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 2247 + 2248 + pend@1.2.0: 2249 + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} 2250 + 2251 + perfect-debounce@1.0.0: 2252 + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} 2253 + 2254 + perfect-debounce@2.1.0: 2255 + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} 2256 + 2257 + picocolors@1.1.1: 2258 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 2259 + 2260 + picomatch@2.3.1: 2261 + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2262 + engines: {node: '>=8.6'} 2263 + 2264 + picomatch@4.0.3: 2265 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 2266 + engines: {node: '>=12'} 2267 + 2268 + pify@2.3.0: 2269 + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 2270 + engines: {node: '>=0.10.0'} 2271 + 2272 + pino-abstract-transport@2.0.0: 2273 + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} 2274 + 2275 + pino-abstract-transport@3.0.0: 2276 + resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} 2277 + 2278 + pino-std-serializers@7.1.0: 2279 + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} 2280 + 2281 + pino@10.3.0: 2282 + resolution: {integrity: sha512-0GNPNzHXBKw6U/InGe79A3Crzyk9bcSyObF9/Gfo9DLEf5qj5RF50RSjsu0W1rZ6ZqRGdzDFCRBQvi9/rSGPtA==} 2283 + hasBin: true 2284 + 2285 + pino@10.3.1: 2286 + resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} 2287 + hasBin: true 2288 + 2289 + pino@9.7.0: 2290 + resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} 2291 + hasBin: true 2292 + 2293 + pirates@4.0.7: 2294 + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} 2295 + engines: {node: '>= 6'} 2296 + 2297 + pkg-types@1.3.1: 2298 + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 2299 + 2300 + pkg-types@2.3.0: 2301 + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} 2302 + 2303 + postcss-import@15.1.0: 2304 + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 2305 + engines: {node: '>=14.0.0'} 2306 + peerDependencies: 2307 + postcss: ^8.0.0 2308 + 2309 + postcss-js@4.1.0: 2310 + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} 2311 + engines: {node: ^12 || ^14 || >= 16} 2312 + peerDependencies: 2313 + postcss: ^8.4.21 2314 + 2315 + postcss-load-config@6.0.1: 2316 + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 2317 + engines: {node: '>= 18'} 2318 + peerDependencies: 2319 + jiti: '>=1.21.0' 2320 + postcss: '>=8.0.9' 2321 + tsx: ^4.8.1 2322 + yaml: ^2.4.2 2323 + peerDependenciesMeta: 2324 + jiti: 2325 + optional: true 2326 + postcss: 2327 + optional: true 2328 + tsx: 2329 + optional: true 2330 + yaml: 2331 + optional: true 2332 + 2333 + postcss-nested@6.2.0: 2334 + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} 2335 + engines: {node: '>=12.0'} 2336 + peerDependencies: 2337 + postcss: ^8.2.14 2338 + 2339 + postcss-selector-parser@6.1.2: 2340 + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} 2341 + engines: {node: '>=4'} 2342 + 2343 + postcss-value-parser@4.2.0: 2344 + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 2345 + 2346 + postcss@8.5.6: 2347 + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 2348 + engines: {node: ^10 || ^12 || >=14} 2349 + 2350 + powershell-utils@0.1.0: 2351 + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} 2352 + engines: {node: '>=20'} 2353 + 2354 + prelude-ls@1.2.1: 2355 + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2356 + engines: {node: '>= 0.8.0'} 2357 + 2358 + prettier@3.8.1: 2359 + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} 2360 + engines: {node: '>=14'} 2361 + hasBin: true 2362 + 2363 + process-nextick-args@2.0.1: 2364 + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 2365 + 2366 + process-warning@5.0.0: 2367 + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} 2368 + 2369 + promise-toolbox@0.21.0: 2370 + resolution: {integrity: sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg==} 2371 + engines: {node: '>=6'} 2372 + 2373 + prompts@2.4.2: 2374 + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 2375 + engines: {node: '>= 6'} 2376 + 2377 + proto-list@1.2.4: 2378 + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} 2379 + 2380 + publish-browser-extension@3.0.3: 2381 + resolution: {integrity: sha512-cBINZCkLo7YQaGoUvEHthZ0sDzgJQht28IS+SFMT2omSNhGsPiVNRkWir3qLiTrhGhW9Ci2KVHpA1QAMoBdL2g==} 2382 + hasBin: true 2383 + 2384 + punycode@2.3.1: 2385 + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 2386 + engines: {node: '>=6'} 2387 + 2388 + pupa@3.3.0: 2389 + resolution: {integrity: sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==} 2390 + engines: {node: '>=12.20'} 2391 + 2392 + quansync@0.2.11: 2393 + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} 2394 + 2395 + queue-microtask@1.2.3: 2396 + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2397 + 2398 + quick-format-unescaped@4.0.4: 2399 + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} 2400 + 2401 + rc9@2.1.2: 2402 + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} 2403 + 2404 + rc@1.2.8: 2405 + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 2406 + hasBin: true 2407 + 2408 + react-dom@18.3.1: 2409 + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} 2410 + peerDependencies: 2411 + react: ^18.3.1 2412 + 2413 + react-refresh@0.18.0: 2414 + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} 2415 + engines: {node: '>=0.10.0'} 2416 + 2417 + react@18.3.1: 2418 + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} 2419 + engines: {node: '>=0.10.0'} 2420 + 2421 + read-cache@1.0.0: 2422 + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 2423 + 2424 + readable-stream@2.3.8: 2425 + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} 2426 + 2427 + readdirp@3.6.0: 2428 + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2429 + engines: {node: '>=8.10.0'} 2430 + 2431 + readdirp@4.1.2: 2432 + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 2433 + engines: {node: '>= 14.18.0'} 2434 + 2435 + readdirp@5.0.0: 2436 + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} 2437 + engines: {node: '>= 20.19.0'} 2438 + 2439 + real-require@0.2.0: 2440 + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} 2441 + engines: {node: '>= 12.13.0'} 2442 + 2443 + registry-auth-token@5.1.1: 2444 + resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} 2445 + engines: {node: '>=14'} 2446 + 2447 + registry-url@6.0.1: 2448 + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} 2449 + engines: {node: '>=12'} 2450 + 2451 + require-directory@2.1.1: 2452 + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 2453 + engines: {node: '>=0.10.0'} 2454 + 2455 + require-from-string@2.0.2: 2456 + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 2457 + engines: {node: '>=0.10.0'} 2458 + 2459 + resolve-from@4.0.0: 2460 + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2461 + engines: {node: '>=4'} 2462 + 2463 + resolve@1.22.11: 2464 + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} 2465 + engines: {node: '>= 0.4'} 2466 + hasBin: true 2467 + 2468 + restore-cursor@5.1.0: 2469 + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} 2470 + engines: {node: '>=18'} 2471 + 2472 + reusify@1.1.0: 2473 + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 2474 + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2475 + 2476 + rfdc@1.4.1: 2477 + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} 2478 + 2479 + rollup@4.57.1: 2480 + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} 2481 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2482 + hasBin: true 2483 + 2484 + run-applescript@7.1.0: 2485 + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} 2486 + engines: {node: '>=18'} 2487 + 2488 + run-parallel@1.2.0: 2489 + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2490 + 2491 + safe-buffer@5.1.2: 2492 + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 2493 + 2494 + safe-stable-stringify@2.5.0: 2495 + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} 2496 + engines: {node: '>=10'} 2497 + 2498 + safer-buffer@2.1.2: 2499 + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2500 + 2501 + sax@1.4.4: 2502 + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} 2503 + engines: {node: '>=11.0.0'} 2504 + 2505 + scheduler@0.23.2: 2506 + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} 2507 + 2508 + scule@1.3.0: 2509 + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} 2510 + 2511 + semver@6.3.1: 2512 + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 2513 + hasBin: true 2514 + 2515 + semver@7.7.3: 2516 + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 2517 + engines: {node: '>=10'} 2518 + hasBin: true 2519 + 2520 + semver@7.7.4: 2521 + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} 2522 + engines: {node: '>=10'} 2523 + hasBin: true 2524 + 2525 + serialize-error@11.0.3: 2526 + resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} 2527 + engines: {node: '>=14.16'} 2528 + 2529 + set-value@4.1.0: 2530 + resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==} 2531 + engines: {node: '>=11.0'} 2532 + 2533 + setimmediate@1.0.5: 2534 + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} 2535 + 2536 + shebang-command@2.0.0: 2537 + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2538 + engines: {node: '>=8'} 2539 + 2540 + shebang-regex@3.0.0: 2541 + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2542 + engines: {node: '>=8'} 2543 + 2544 + shell-quote@1.7.3: 2545 + resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} 2546 + 2547 + shellwords@0.1.1: 2548 + resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} 2549 + 2550 + signal-exit@4.1.0: 2551 + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 2552 + engines: {node: '>=14'} 2553 + 2554 + sisteransi@1.0.5: 2555 + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 2556 + 2557 + slice-ansi@5.0.0: 2558 + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} 2559 + engines: {node: '>=12'} 2560 + 2561 + slice-ansi@7.1.2: 2562 + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} 2563 + engines: {node: '>=18'} 2564 + 2565 + sonic-boom@4.2.1: 2566 + resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} 2567 + 2568 + source-map-js@1.2.1: 2569 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 2570 + engines: {node: '>=0.10.0'} 2571 + 2572 + source-map-support@0.5.21: 2573 + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 2574 + 2575 + source-map@0.6.1: 2576 + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2577 + engines: {node: '>=0.10.0'} 2578 + 2579 + source-map@0.7.6: 2580 + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} 2581 + engines: {node: '>= 12'} 2582 + 2583 + spawn-sync@1.0.15: 2584 + resolution: {integrity: sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==} 2585 + 2586 + split2@4.2.0: 2587 + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} 2588 + engines: {node: '>= 10.x'} 2589 + 2590 + split@1.0.1: 2591 + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} 2592 + 2593 + stdin-discarder@0.2.2: 2594 + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} 2595 + engines: {node: '>=18'} 2596 + 2597 + string-width@4.2.3: 2598 + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2599 + engines: {node: '>=8'} 2600 + 2601 + string-width@7.2.0: 2602 + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} 2603 + engines: {node: '>=18'} 2604 + 2605 + string_decoder@1.1.1: 2606 + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 2607 + 2608 + strip-ansi@6.0.1: 2609 + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2610 + engines: {node: '>=8'} 2611 + 2612 + strip-ansi@7.1.2: 2613 + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} 2614 + engines: {node: '>=12'} 2615 + 2616 + strip-bom-buf@2.0.0: 2617 + resolution: {integrity: sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ==} 2618 + engines: {node: '>=8'} 2619 + 2620 + strip-bom-stream@4.0.0: 2621 + resolution: {integrity: sha512-0ApK3iAkHv6WbgLICw/J4nhwHeDZsBxIIsOD+gHgZICL6SeJ0S9f/WZqemka9cjkTyMN5geId6e8U5WGFAn3cQ==} 2622 + engines: {node: '>=8'} 2623 + 2624 + strip-bom@5.0.0: 2625 + resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==} 2626 + engines: {node: '>=12'} 2627 + 2628 + strip-final-newline@3.0.0: 2629 + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 2630 + engines: {node: '>=12'} 2631 + 2632 + strip-json-comments@2.0.1: 2633 + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 2634 + engines: {node: '>=0.10.0'} 2635 + 2636 + strip-json-comments@3.1.1: 2637 + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2638 + engines: {node: '>=8'} 2639 + 2640 + strip-json-comments@5.0.2: 2641 + resolution: {integrity: sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g==} 2642 + engines: {node: '>=14.16'} 2643 + 2644 + strip-json-comments@5.0.3: 2645 + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} 2646 + engines: {node: '>=14.16'} 2647 + 2648 + strip-literal@2.1.1: 2649 + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} 2650 + 2651 + stubborn-fs@2.0.0: 2652 + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} 2653 + 2654 + stubborn-utils@1.0.2: 2655 + resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} 2656 + 2657 + sucrase@3.35.1: 2658 + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} 2659 + engines: {node: '>=16 || 14 >=14.17'} 2660 + hasBin: true 2661 + 2662 + supports-color@7.2.0: 2663 + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2664 + engines: {node: '>=8'} 2665 + 2666 + supports-preserve-symlinks-flag@1.0.0: 2667 + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2668 + engines: {node: '>= 0.4'} 2669 + 2670 + tailwindcss@3.4.19: 2671 + resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} 2672 + engines: {node: '>=14.0.0'} 2673 + hasBin: true 2674 + 2675 + tar@6.2.1: 2676 + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} 2677 + engines: {node: '>=10'} 2678 + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me 2679 + 2680 + thenify-all@1.6.0: 2681 + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 2682 + engines: {node: '>=0.8'} 2683 + 2684 + thenify@3.3.1: 2685 + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2686 + 2687 + thread-stream@3.1.0: 2688 + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} 2689 + 2690 + thread-stream@4.0.0: 2691 + resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} 2692 + engines: {node: '>=20'} 2693 + 2694 + through@2.3.8: 2695 + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 2696 + 2697 + tinyexec@0.3.2: 2698 + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 2699 + 2700 + tinyexec@1.0.2: 2701 + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} 2702 + engines: {node: '>=18'} 2703 + 2704 + tinyglobby@0.2.15: 2705 + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 2706 + engines: {node: '>=12.0.0'} 2707 + 2708 + tmp@0.2.5: 2709 + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} 2710 + engines: {node: '>=14.14'} 2711 + 2712 + to-regex-range@5.0.1: 2713 + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2714 + engines: {node: '>=8.0'} 2715 + 2716 + ts-api-utils@2.4.0: 2717 + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} 2718 + engines: {node: '>=18.12'} 2719 + peerDependencies: 2720 + typescript: '>=4.8.4' 2721 + 2722 + ts-interface-checker@0.1.13: 2723 + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 2724 + 2725 + tslib@2.8.1: 2726 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 2727 + 2728 + type-check@0.4.0: 2729 + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2730 + engines: {node: '>= 0.8.0'} 2731 + 2732 + type-fest@2.19.0: 2733 + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} 2734 + engines: {node: '>=12.20'} 2735 + 2736 + type-fest@3.13.1: 2737 + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} 2738 + engines: {node: '>=14.16'} 2739 + 2740 + type-fest@4.41.0: 2741 + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} 2742 + engines: {node: '>=16'} 2743 + 2744 + typedarray@0.0.6: 2745 + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} 2746 + 2747 + typescript-eslint@8.55.0: 2748 + resolution: {integrity: sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw==} 2749 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2750 + peerDependencies: 2751 + eslint: ^8.57.0 || ^9.0.0 2752 + typescript: '>=4.8.4 <6.0.0' 2753 + 2754 + typescript@5.9.3: 2755 + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 2756 + engines: {node: '>=14.17'} 2757 + hasBin: true 2758 + 2759 + ufo@1.6.3: 2760 + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} 2761 + 2762 + uhyphen@0.2.0: 2763 + resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} 2764 + 2765 + undici-types@7.16.0: 2766 + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} 2767 + 2768 + undici@7.22.0: 2769 + resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} 2770 + engines: {node: '>=20.18.1'} 2771 + 2772 + unimport@3.14.6: 2773 + resolution: {integrity: sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==} 2774 + 2775 + universalify@2.0.1: 2776 + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 2777 + engines: {node: '>= 10.0.0'} 2778 + 2779 + unplugin@1.16.1: 2780 + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} 2781 + engines: {node: '>=14.0.0'} 2782 + 2783 + upath@2.0.1: 2784 + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} 2785 + engines: {node: '>=4'} 2786 + 2787 + update-browserslist-db@1.2.3: 2788 + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} 2789 + hasBin: true 2790 + peerDependencies: 2791 + browserslist: '>= 4.21.0' 2792 + 2793 + update-notifier@7.3.1: 2794 + resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==} 2795 + engines: {node: '>=18'} 2796 + 2797 + uri-js@4.4.1: 2798 + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2799 + 2800 + util-deprecate@1.0.2: 2801 + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2802 + 2803 + uuid@8.3.2: 2804 + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} 2805 + hasBin: true 2806 + 2807 + vite-node@3.2.4: 2808 + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} 2809 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 2810 + hasBin: true 2811 + 2812 + vite@6.4.1: 2813 + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} 2814 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 2815 + hasBin: true 2816 + peerDependencies: 2817 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 2818 + jiti: '>=1.21.0' 2819 + less: '*' 2820 + lightningcss: ^1.21.0 2821 + sass: '*' 2822 + sass-embedded: '*' 2823 + stylus: '*' 2824 + sugarss: '*' 2825 + terser: ^5.16.0 2826 + tsx: ^4.8.1 2827 + yaml: ^2.4.2 2828 + peerDependenciesMeta: 2829 + '@types/node': 2830 + optional: true 2831 + jiti: 2832 + optional: true 2833 + less: 2834 + optional: true 2835 + lightningcss: 2836 + optional: true 2837 + sass: 2838 + optional: true 2839 + sass-embedded: 2840 + optional: true 2841 + stylus: 2842 + optional: true 2843 + sugarss: 2844 + optional: true 2845 + terser: 2846 + optional: true 2847 + tsx: 2848 + optional: true 2849 + yaml: 2850 + optional: true 2851 + 2852 + vite@7.3.1: 2853 + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} 2854 + engines: {node: ^20.19.0 || >=22.12.0} 2855 + hasBin: true 2856 + peerDependencies: 2857 + '@types/node': ^20.19.0 || >=22.12.0 2858 + jiti: '>=1.21.0' 2859 + less: ^4.0.0 2860 + lightningcss: ^1.21.0 2861 + sass: ^1.70.0 2862 + sass-embedded: ^1.70.0 2863 + stylus: '>=0.54.8' 2864 + sugarss: ^5.0.0 2865 + terser: ^5.16.0 2866 + tsx: ^4.8.1 2867 + yaml: ^2.4.2 2868 + peerDependenciesMeta: 2869 + '@types/node': 2870 + optional: true 2871 + jiti: 2872 + optional: true 2873 + less: 2874 + optional: true 2875 + lightningcss: 2876 + optional: true 2877 + sass: 2878 + optional: true 2879 + sass-embedded: 2880 + optional: true 2881 + stylus: 2882 + optional: true 2883 + sugarss: 2884 + optional: true 2885 + terser: 2886 + optional: true 2887 + tsx: 2888 + optional: true 2889 + yaml: 2890 + optional: true 2891 + 2892 + watchpack@2.4.4: 2893 + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} 2894 + engines: {node: '>=10.13.0'} 2895 + 2896 + watchpack@2.5.1: 2897 + resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} 2898 + engines: {node: '>=10.13.0'} 2899 + 2900 + wcwidth@1.0.1: 2901 + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} 2902 + 2903 + web-ext-run@0.2.4: 2904 + resolution: {integrity: sha512-rQicL7OwuqWdQWI33JkSXKcp7cuv1mJG8u3jRQwx/8aDsmhbTHs9ZRmNYOL+LX0wX8edIEQX8jj4bB60GoXtKA==} 2905 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2906 + 2907 + web-ext@9.3.0: 2908 + resolution: {integrity: sha512-RDAJvyIyJ/iIFssx2w7VrD7mtkc4X+8VJFPq8Ax3mL2auF4KQsV9ZQmPZOzqP9Ji0k0D6YKAzGZ1Ae67qavDVQ==} 2909 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2910 + hasBin: true 2911 + 2912 + webextension-polyfill@0.10.0: 2913 + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} 2914 + 2915 + webextension-polyfill@0.12.0: 2916 + resolution: {integrity: sha512-97TBmpoWJEE+3nFBQ4VocyCdLKfw54rFaJ6EVQYLBCXqCIpLSZkwGgASpv4oPt9gdKCJ80RJlcmNzNn008Ag6Q==} 2917 + 2918 + webpack-virtual-modules@0.6.2: 2919 + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} 2920 + 2921 + whatwg-encoding@3.1.1: 2922 + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} 2923 + engines: {node: '>=18'} 2924 + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation 2925 + 2926 + whatwg-mimetype@4.0.0: 2927 + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} 2928 + engines: {node: '>=18'} 2929 + 2930 + when-exit@2.1.5: 2931 + resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} 2932 + 2933 + when@3.7.7: 2934 + resolution: {integrity: sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==} 2935 + 2936 + which@1.2.4: 2937 + resolution: {integrity: sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA==} 2938 + hasBin: true 2939 + 2940 + which@2.0.2: 2941 + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2942 + engines: {node: '>= 8'} 2943 + hasBin: true 2944 + 2945 + widest-line@5.0.0: 2946 + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} 2947 + engines: {node: '>=18'} 2948 + 2949 + winreg@0.0.12: 2950 + resolution: {integrity: sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==} 2951 + 2952 + word-wrap@1.2.5: 2953 + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 2954 + engines: {node: '>=0.10.0'} 2955 + 2956 + wrap-ansi@7.0.0: 2957 + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2958 + engines: {node: '>=10'} 2959 + 2960 + wrap-ansi@9.0.2: 2961 + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} 2962 + engines: {node: '>=18'} 2963 + 2964 + wsl-utils@0.1.0: 2965 + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} 2966 + engines: {node: '>=18'} 2967 + 2968 + wsl-utils@0.3.1: 2969 + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} 2970 + engines: {node: '>=20'} 2971 + 2972 + wxt@0.19.29: 2973 + resolution: {integrity: sha512-n6DRR34OAFczJfZOwJeY5dn+j+w2BTquW2nAX32vk3FMLWUhzpv5svMvSUTyNiFq3P0o3U7YxfxHdmKJnXZHBA==} 2974 + hasBin: true 2975 + 2976 + xdg-basedir@5.1.0: 2977 + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} 2978 + engines: {node: '>=12'} 2979 + 2980 + xml2js@0.6.2: 2981 + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} 2982 + engines: {node: '>=4.0.0'} 2983 + 2984 + xmlbuilder@11.0.1: 2985 + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} 2986 + engines: {node: '>=4.0'} 2987 + 2988 + y18n@5.0.8: 2989 + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 2990 + engines: {node: '>=10'} 2991 + 2992 + yallist@3.1.1: 2993 + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 2994 + 2995 + yallist@4.0.0: 2996 + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2997 + 2998 + yargs-parser@21.1.1: 2999 + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 3000 + engines: {node: '>=12'} 3001 + 3002 + yargs@17.7.2: 3003 + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 3004 + engines: {node: '>=12'} 3005 + 3006 + yauzl@2.10.0: 3007 + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} 3008 + 3009 + yocto-queue@0.1.0: 3010 + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 3011 + engines: {node: '>=10'} 3012 + 3013 + zip-dir@2.0.0: 3014 + resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==} 3015 + 3016 + zod@4.3.6: 3017 + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} 3018 + 3019 + snapshots: 3020 + 3021 + '@1natsu/wait-element@4.1.2': 3022 + dependencies: 3023 + defu: 6.1.4 3024 + many-keys-map: 2.0.1 3025 + 3026 + '@aklinker1/rollup-plugin-visualizer@5.12.0(rollup@4.57.1)': 3027 + dependencies: 3028 + open: 8.4.2 3029 + picomatch: 2.3.1 3030 + source-map: 0.7.6 3031 + yargs: 17.7.2 3032 + optionalDependencies: 3033 + rollup: 4.57.1 3034 + 3035 + '@alloc/quick-lru@5.2.0': {} 3036 + 3037 + '@babel/code-frame@7.29.0': 3038 + dependencies: 3039 + '@babel/helper-validator-identifier': 7.28.5 3040 + js-tokens: 4.0.0 3041 + picocolors: 1.1.1 3042 + 3043 + '@babel/compat-data@7.29.0': {} 3044 + 3045 + '@babel/core@7.29.0': 3046 + dependencies: 3047 + '@babel/code-frame': 7.29.0 3048 + '@babel/generator': 7.29.1 3049 + '@babel/helper-compilation-targets': 7.28.6 3050 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) 3051 + '@babel/helpers': 7.28.6 3052 + '@babel/parser': 7.29.0 3053 + '@babel/template': 7.28.6 3054 + '@babel/traverse': 7.29.0 3055 + '@babel/types': 7.29.0 3056 + '@jridgewell/remapping': 2.3.5 3057 + convert-source-map: 2.0.0 3058 + debug: 4.4.3 3059 + gensync: 1.0.0-beta.2 3060 + json5: 2.2.3 3061 + semver: 6.3.1 3062 + transitivePeerDependencies: 3063 + - supports-color 3064 + 3065 + '@babel/generator@7.29.1': 3066 + dependencies: 3067 + '@babel/parser': 7.29.0 3068 + '@babel/types': 7.29.0 3069 + '@jridgewell/gen-mapping': 0.3.13 3070 + '@jridgewell/trace-mapping': 0.3.31 3071 + jsesc: 3.1.0 3072 + 3073 + '@babel/helper-compilation-targets@7.28.6': 3074 + dependencies: 3075 + '@babel/compat-data': 7.29.0 3076 + '@babel/helper-validator-option': 7.27.1 3077 + browserslist: 4.28.1 3078 + lru-cache: 5.1.1 3079 + semver: 6.3.1 3080 + 3081 + '@babel/helper-globals@7.28.0': {} 3082 + 3083 + '@babel/helper-module-imports@7.28.6': 3084 + dependencies: 3085 + '@babel/traverse': 7.29.0 3086 + '@babel/types': 7.29.0 3087 + transitivePeerDependencies: 3088 + - supports-color 3089 + 3090 + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': 3091 + dependencies: 3092 + '@babel/core': 7.29.0 3093 + '@babel/helper-module-imports': 7.28.6 3094 + '@babel/helper-validator-identifier': 7.28.5 3095 + '@babel/traverse': 7.29.0 3096 + transitivePeerDependencies: 3097 + - supports-color 3098 + 3099 + '@babel/helper-plugin-utils@7.28.6': {} 3100 + 3101 + '@babel/helper-string-parser@7.27.1': {} 3102 + 3103 + '@babel/helper-validator-identifier@7.28.5': {} 3104 + 3105 + '@babel/helper-validator-option@7.27.1': {} 3106 + 3107 + '@babel/helpers@7.28.6': 3108 + dependencies: 3109 + '@babel/template': 7.28.6 3110 + '@babel/types': 7.29.0 3111 + 3112 + '@babel/parser@7.29.0': 3113 + dependencies: 3114 + '@babel/types': 7.29.0 3115 + 3116 + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': 3117 + dependencies: 3118 + '@babel/core': 7.29.0 3119 + '@babel/helper-plugin-utils': 7.28.6 3120 + 3121 + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': 3122 + dependencies: 3123 + '@babel/core': 7.29.0 3124 + '@babel/helper-plugin-utils': 7.28.6 3125 + 3126 + '@babel/runtime@7.28.2': {} 3127 + 3128 + '@babel/runtime@7.28.6': {} 3129 + 3130 + '@babel/template@7.28.6': 3131 + dependencies: 3132 + '@babel/code-frame': 7.29.0 3133 + '@babel/parser': 7.29.0 3134 + '@babel/types': 7.29.0 3135 + 3136 + '@babel/traverse@7.29.0': 3137 + dependencies: 3138 + '@babel/code-frame': 7.29.0 3139 + '@babel/generator': 7.29.1 3140 + '@babel/helper-globals': 7.28.0 3141 + '@babel/parser': 7.29.0 3142 + '@babel/template': 7.28.6 3143 + '@babel/types': 7.29.0 3144 + debug: 4.4.3 3145 + transitivePeerDependencies: 3146 + - supports-color 3147 + 3148 + '@babel/types@7.29.0': 3149 + dependencies: 3150 + '@babel/helper-string-parser': 7.27.1 3151 + '@babel/helper-validator-identifier': 7.28.5 3152 + 3153 + '@devicefarmer/adbkit-logcat@2.1.3': {} 3154 + 3155 + '@devicefarmer/adbkit-monkey@1.2.1': {} 3156 + 3157 + '@devicefarmer/adbkit@3.3.8': 3158 + dependencies: 3159 + '@devicefarmer/adbkit-logcat': 2.1.3 3160 + '@devicefarmer/adbkit-monkey': 1.2.1 3161 + bluebird: 3.7.2 3162 + commander: 9.5.0 3163 + debug: 4.3.7 3164 + node-forge: 1.3.3 3165 + split: 1.0.1 3166 + transitivePeerDependencies: 3167 + - supports-color 3168 + 3169 + '@esbuild/aix-ppc64@0.25.12': 3170 + optional: true 3171 + 3172 + '@esbuild/aix-ppc64@0.27.3': 3173 + optional: true 3174 + 3175 + '@esbuild/android-arm64@0.25.12': 3176 + optional: true 3177 + 3178 + '@esbuild/android-arm64@0.27.3': 3179 + optional: true 3180 + 3181 + '@esbuild/android-arm@0.25.12': 3182 + optional: true 3183 + 3184 + '@esbuild/android-arm@0.27.3': 3185 + optional: true 3186 + 3187 + '@esbuild/android-x64@0.25.12': 3188 + optional: true 3189 + 3190 + '@esbuild/android-x64@0.27.3': 3191 + optional: true 3192 + 3193 + '@esbuild/darwin-arm64@0.25.12': 3194 + optional: true 3195 + 3196 + '@esbuild/darwin-arm64@0.27.3': 3197 + optional: true 3198 + 3199 + '@esbuild/darwin-x64@0.25.12': 3200 + optional: true 3201 + 3202 + '@esbuild/darwin-x64@0.27.3': 3203 + optional: true 3204 + 3205 + '@esbuild/freebsd-arm64@0.25.12': 3206 + optional: true 3207 + 3208 + '@esbuild/freebsd-arm64@0.27.3': 3209 + optional: true 3210 + 3211 + '@esbuild/freebsd-x64@0.25.12': 3212 + optional: true 3213 + 3214 + '@esbuild/freebsd-x64@0.27.3': 3215 + optional: true 3216 + 3217 + '@esbuild/linux-arm64@0.25.12': 3218 + optional: true 3219 + 3220 + '@esbuild/linux-arm64@0.27.3': 3221 + optional: true 3222 + 3223 + '@esbuild/linux-arm@0.25.12': 3224 + optional: true 3225 + 3226 + '@esbuild/linux-arm@0.27.3': 3227 + optional: true 3228 + 3229 + '@esbuild/linux-ia32@0.25.12': 3230 + optional: true 3231 + 3232 + '@esbuild/linux-ia32@0.27.3': 3233 + optional: true 3234 + 3235 + '@esbuild/linux-loong64@0.25.12': 3236 + optional: true 3237 + 3238 + '@esbuild/linux-loong64@0.27.3': 3239 + optional: true 3240 + 3241 + '@esbuild/linux-mips64el@0.25.12': 3242 + optional: true 3243 + 3244 + '@esbuild/linux-mips64el@0.27.3': 3245 + optional: true 3246 + 3247 + '@esbuild/linux-ppc64@0.25.12': 3248 + optional: true 3249 + 3250 + '@esbuild/linux-ppc64@0.27.3': 3251 + optional: true 3252 + 3253 + '@esbuild/linux-riscv64@0.25.12': 3254 + optional: true 3255 + 3256 + '@esbuild/linux-riscv64@0.27.3': 3257 + optional: true 3258 + 3259 + '@esbuild/linux-s390x@0.25.12': 3260 + optional: true 3261 + 3262 + '@esbuild/linux-s390x@0.27.3': 3263 + optional: true 3264 + 3265 + '@esbuild/linux-x64@0.25.12': 3266 + optional: true 3267 + 3268 + '@esbuild/linux-x64@0.27.3': 3269 + optional: true 3270 + 3271 + '@esbuild/netbsd-arm64@0.25.12': 3272 + optional: true 3273 + 3274 + '@esbuild/netbsd-arm64@0.27.3': 3275 + optional: true 3276 + 3277 + '@esbuild/netbsd-x64@0.25.12': 3278 + optional: true 3279 + 3280 + '@esbuild/netbsd-x64@0.27.3': 3281 + optional: true 3282 + 3283 + '@esbuild/openbsd-arm64@0.25.12': 3284 + optional: true 3285 + 3286 + '@esbuild/openbsd-arm64@0.27.3': 3287 + optional: true 3288 + 3289 + '@esbuild/openbsd-x64@0.25.12': 3290 + optional: true 3291 + 3292 + '@esbuild/openbsd-x64@0.27.3': 3293 + optional: true 3294 + 3295 + '@esbuild/openharmony-arm64@0.25.12': 3296 + optional: true 3297 + 3298 + '@esbuild/openharmony-arm64@0.27.3': 3299 + optional: true 3300 + 3301 + '@esbuild/sunos-x64@0.25.12': 3302 + optional: true 3303 + 3304 + '@esbuild/sunos-x64@0.27.3': 3305 + optional: true 3306 + 3307 + '@esbuild/win32-arm64@0.25.12': 3308 + optional: true 3309 + 3310 + '@esbuild/win32-arm64@0.27.3': 3311 + optional: true 3312 + 3313 + '@esbuild/win32-ia32@0.25.12': 3314 + optional: true 3315 + 3316 + '@esbuild/win32-ia32@0.27.3': 3317 + optional: true 3318 + 3319 + '@esbuild/win32-x64@0.25.12': 3320 + optional: true 3321 + 3322 + '@esbuild/win32-x64@0.27.3': 3323 + optional: true 3324 + 3325 + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': 3326 + dependencies: 3327 + eslint: 9.39.2(jiti@2.6.1) 3328 + eslint-visitor-keys: 3.4.3 3329 + 3330 + '@eslint-community/regexpp@4.12.2': {} 3331 + 3332 + '@eslint/config-array@0.21.1': 3333 + dependencies: 3334 + '@eslint/object-schema': 2.1.7 3335 + debug: 4.4.3 3336 + minimatch: 3.1.2 3337 + transitivePeerDependencies: 3338 + - supports-color 3339 + 3340 + '@eslint/config-helpers@0.4.2': 3341 + dependencies: 3342 + '@eslint/core': 0.17.0 3343 + 3344 + '@eslint/core@0.17.0': 3345 + dependencies: 3346 + '@types/json-schema': 7.0.15 3347 + 3348 + '@eslint/eslintrc@3.3.3': 3349 + dependencies: 3350 + ajv: 6.12.6 3351 + debug: 4.4.3 3352 + espree: 10.4.0 3353 + globals: 14.0.0 3354 + ignore: 5.3.2 3355 + import-fresh: 3.3.1 3356 + js-yaml: 4.1.1 3357 + minimatch: 3.1.2 3358 + strip-json-comments: 3.1.1 3359 + transitivePeerDependencies: 3360 + - supports-color 3361 + 3362 + '@eslint/js@9.39.2': {} 3363 + 3364 + '@eslint/object-schema@2.1.7': {} 3365 + 3366 + '@eslint/plugin-kit@0.4.1': 3367 + dependencies: 3368 + '@eslint/core': 0.17.0 3369 + levn: 0.4.1 3370 + 3371 + '@fluent/syntax@0.19.0': {} 3372 + 3373 + '@fregante/relaxed-json@2.0.0': {} 3374 + 3375 + '@humanfs/core@0.19.1': {} 3376 + 3377 + '@humanfs/node@0.16.7': 3378 + dependencies: 3379 + '@humanfs/core': 0.19.1 3380 + '@humanwhocodes/retry': 0.4.3 3381 + 3382 + '@humanwhocodes/module-importer@1.0.1': {} 3383 + 3384 + '@humanwhocodes/retry@0.4.3': {} 3385 + 3386 + '@isaacs/cliui@9.0.0': {} 3387 + 3388 + '@jridgewell/gen-mapping@0.3.13': 3389 + dependencies: 3390 + '@jridgewell/sourcemap-codec': 1.5.5 3391 + '@jridgewell/trace-mapping': 0.3.31 3392 + 3393 + '@jridgewell/remapping@2.3.5': 3394 + dependencies: 3395 + '@jridgewell/gen-mapping': 0.3.13 3396 + '@jridgewell/trace-mapping': 0.3.31 3397 + 3398 + '@jridgewell/resolve-uri@3.1.2': {} 3399 + 3400 + '@jridgewell/sourcemap-codec@1.5.5': {} 3401 + 3402 + '@jridgewell/trace-mapping@0.3.31': 3403 + dependencies: 3404 + '@jridgewell/resolve-uri': 3.1.2 3405 + '@jridgewell/sourcemap-codec': 1.5.5 3406 + 3407 + '@mdn/browser-compat-data@7.3.0': {} 3408 + 3409 + '@nodelib/fs.scandir@2.1.5': 3410 + dependencies: 3411 + '@nodelib/fs.stat': 2.0.5 3412 + run-parallel: 1.2.0 3413 + 3414 + '@nodelib/fs.stat@2.0.5': {} 3415 + 3416 + '@nodelib/fs.walk@1.2.8': 3417 + dependencies: 3418 + '@nodelib/fs.scandir': 2.1.5 3419 + fastq: 1.20.1 3420 + 3421 + '@pinojs/redact@0.4.0': {} 3422 + 3423 + '@pnpm/config.env-replace@1.1.0': {} 3424 + 3425 + '@pnpm/network.ca-file@1.0.2': 3426 + dependencies: 3427 + graceful-fs: 4.2.10 3428 + 3429 + '@pnpm/npm-conf@3.0.2': 3430 + dependencies: 3431 + '@pnpm/config.env-replace': 1.1.0 3432 + '@pnpm/network.ca-file': 1.0.2 3433 + config-chain: 1.1.13 3434 + 3435 + '@rolldown/pluginutils@1.0.0-rc.3': {} 3436 + 3437 + '@rollup/pluginutils@5.3.0(rollup@4.57.1)': 3438 + dependencies: 3439 + '@types/estree': 1.0.8 3440 + estree-walker: 2.0.2 3441 + picomatch: 4.0.3 3442 + optionalDependencies: 3443 + rollup: 4.57.1 3444 + 3445 + '@rollup/rollup-android-arm-eabi@4.57.1': 3446 + optional: true 3447 + 3448 + '@rollup/rollup-android-arm64@4.57.1': 3449 + optional: true 3450 + 3451 + '@rollup/rollup-darwin-arm64@4.57.1': 3452 + optional: true 3453 + 3454 + '@rollup/rollup-darwin-x64@4.57.1': 3455 + optional: true 3456 + 3457 + '@rollup/rollup-freebsd-arm64@4.57.1': 3458 + optional: true 3459 + 3460 + '@rollup/rollup-freebsd-x64@4.57.1': 3461 + optional: true 3462 + 3463 + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': 3464 + optional: true 3465 + 3466 + '@rollup/rollup-linux-arm-musleabihf@4.57.1': 3467 + optional: true 3468 + 3469 + '@rollup/rollup-linux-arm64-gnu@4.57.1': 3470 + optional: true 3471 + 3472 + '@rollup/rollup-linux-arm64-musl@4.57.1': 3473 + optional: true 3474 + 3475 + '@rollup/rollup-linux-loong64-gnu@4.57.1': 3476 + optional: true 3477 + 3478 + '@rollup/rollup-linux-loong64-musl@4.57.1': 3479 + optional: true 3480 + 3481 + '@rollup/rollup-linux-ppc64-gnu@4.57.1': 3482 + optional: true 3483 + 3484 + '@rollup/rollup-linux-ppc64-musl@4.57.1': 3485 + optional: true 3486 + 3487 + '@rollup/rollup-linux-riscv64-gnu@4.57.1': 3488 + optional: true 3489 + 3490 + '@rollup/rollup-linux-riscv64-musl@4.57.1': 3491 + optional: true 3492 + 3493 + '@rollup/rollup-linux-s390x-gnu@4.57.1': 3494 + optional: true 3495 + 3496 + '@rollup/rollup-linux-x64-gnu@4.57.1': 3497 + optional: true 3498 + 3499 + '@rollup/rollup-linux-x64-musl@4.57.1': 3500 + optional: true 3501 + 3502 + '@rollup/rollup-openbsd-x64@4.57.1': 3503 + optional: true 3504 + 3505 + '@rollup/rollup-openharmony-arm64@4.57.1': 3506 + optional: true 3507 + 3508 + '@rollup/rollup-win32-arm64-msvc@4.57.1': 3509 + optional: true 3510 + 3511 + '@rollup/rollup-win32-ia32-msvc@4.57.1': 3512 + optional: true 3513 + 3514 + '@rollup/rollup-win32-x64-gnu@4.57.1': 3515 + optional: true 3516 + 3517 + '@rollup/rollup-win32-x64-msvc@4.57.1': 3518 + optional: true 3519 + 3520 + '@types/babel__core@7.20.5': 3521 + dependencies: 3522 + '@babel/parser': 7.29.0 3523 + '@babel/types': 7.29.0 3524 + '@types/babel__generator': 7.27.0 3525 + '@types/babel__template': 7.4.4 3526 + '@types/babel__traverse': 7.28.0 3527 + 3528 + '@types/babel__generator@7.27.0': 3529 + dependencies: 3530 + '@babel/types': 7.29.0 3531 + 3532 + '@types/babel__template@7.4.4': 3533 + dependencies: 3534 + '@babel/parser': 7.29.0 3535 + '@babel/types': 7.29.0 3536 + 3537 + '@types/babel__traverse@7.28.0': 3538 + dependencies: 3539 + '@babel/types': 7.29.0 3540 + 3541 + '@types/chrome@0.0.280': 3542 + dependencies: 3543 + '@types/filesystem': 0.0.36 3544 + '@types/har-format': 1.2.16 3545 + 3546 + '@types/estree@1.0.8': {} 3547 + 3548 + '@types/filesystem@0.0.36': 3549 + dependencies: 3550 + '@types/filewriter': 0.0.33 3551 + 3552 + '@types/filewriter@0.0.33': {} 3553 + 3554 + '@types/har-format@1.2.16': {} 3555 + 3556 + '@types/json-schema@7.0.15': {} 3557 + 3558 + '@types/minimatch@3.0.5': {} 3559 + 3560 + '@types/node@25.2.3': 3561 + dependencies: 3562 + undici-types: 7.16.0 3563 + 3564 + '@types/prop-types@15.7.15': {} 3565 + 3566 + '@types/react-dom@18.3.7(@types/react@18.3.28)': 3567 + dependencies: 3568 + '@types/react': 18.3.28 3569 + 3570 + '@types/react@18.3.28': 3571 + dependencies: 3572 + '@types/prop-types': 15.7.15 3573 + csstype: 3.2.3 3574 + 3575 + '@types/webextension-polyfill@0.12.4': {} 3576 + 3577 + '@types/yauzl@2.10.3': 3578 + dependencies: 3579 + '@types/node': 25.2.3 3580 + 3581 + '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': 3582 + dependencies: 3583 + '@eslint-community/regexpp': 4.12.2 3584 + '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 3585 + '@typescript-eslint/scope-manager': 8.55.0 3586 + '@typescript-eslint/type-utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 3587 + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 3588 + '@typescript-eslint/visitor-keys': 8.55.0 3589 + eslint: 9.39.2(jiti@2.6.1) 3590 + ignore: 7.0.5 3591 + natural-compare: 1.4.0 3592 + ts-api-utils: 2.4.0(typescript@5.9.3) 3593 + typescript: 5.9.3 3594 + transitivePeerDependencies: 3595 + - supports-color 3596 + 3597 + '@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': 3598 + dependencies: 3599 + '@typescript-eslint/scope-manager': 8.55.0 3600 + '@typescript-eslint/types': 8.55.0 3601 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) 3602 + '@typescript-eslint/visitor-keys': 8.55.0 3603 + debug: 4.4.3 3604 + eslint: 9.39.2(jiti@2.6.1) 3605 + typescript: 5.9.3 3606 + transitivePeerDependencies: 3607 + - supports-color 3608 + 3609 + '@typescript-eslint/project-service@8.55.0(typescript@5.9.3)': 3610 + dependencies: 3611 + '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) 3612 + '@typescript-eslint/types': 8.55.0 3613 + debug: 4.4.3 3614 + typescript: 5.9.3 3615 + transitivePeerDependencies: 3616 + - supports-color 3617 + 3618 + '@typescript-eslint/scope-manager@8.55.0': 3619 + dependencies: 3620 + '@typescript-eslint/types': 8.55.0 3621 + '@typescript-eslint/visitor-keys': 8.55.0 3622 + 3623 + '@typescript-eslint/tsconfig-utils@8.55.0(typescript@5.9.3)': 3624 + dependencies: 3625 + typescript: 5.9.3 3626 + 3627 + '@typescript-eslint/type-utils@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': 3628 + dependencies: 3629 + '@typescript-eslint/types': 8.55.0 3630 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) 3631 + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 3632 + debug: 4.4.3 3633 + eslint: 9.39.2(jiti@2.6.1) 3634 + ts-api-utils: 2.4.0(typescript@5.9.3) 3635 + typescript: 5.9.3 3636 + transitivePeerDependencies: 3637 + - supports-color 3638 + 3639 + '@typescript-eslint/types@8.55.0': {} 3640 + 3641 + '@typescript-eslint/typescript-estree@8.55.0(typescript@5.9.3)': 3642 + dependencies: 3643 + '@typescript-eslint/project-service': 8.55.0(typescript@5.9.3) 3644 + '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) 3645 + '@typescript-eslint/types': 8.55.0 3646 + '@typescript-eslint/visitor-keys': 8.55.0 3647 + debug: 4.4.3 3648 + minimatch: 9.0.5 3649 + semver: 7.7.4 3650 + tinyglobby: 0.2.15 3651 + ts-api-utils: 2.4.0(typescript@5.9.3) 3652 + typescript: 5.9.3 3653 + transitivePeerDependencies: 3654 + - supports-color 3655 + 3656 + '@typescript-eslint/utils@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': 3657 + dependencies: 3658 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) 3659 + '@typescript-eslint/scope-manager': 8.55.0 3660 + '@typescript-eslint/types': 8.55.0 3661 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) 3662 + eslint: 9.39.2(jiti@2.6.1) 3663 + typescript: 5.9.3 3664 + transitivePeerDependencies: 3665 + - supports-color 3666 + 3667 + '@typescript-eslint/visitor-keys@8.55.0': 3668 + dependencies: 3669 + '@typescript-eslint/types': 8.55.0 3670 + eslint-visitor-keys: 4.2.1 3671 + 3672 + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1))': 3673 + dependencies: 3674 + '@babel/core': 7.29.0 3675 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) 3676 + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) 3677 + '@rolldown/pluginutils': 1.0.0-rc.3 3678 + '@types/babel__core': 7.20.5 3679 + react-refresh: 0.18.0 3680 + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1) 3681 + transitivePeerDependencies: 3682 + - supports-color 3683 + 3684 + '@webext-core/fake-browser@1.3.4': 3685 + dependencies: 3686 + lodash.merge: 4.6.2 3687 + 3688 + '@webext-core/isolated-element@1.1.3': 3689 + dependencies: 3690 + is-potential-custom-element-name: 1.0.1 3691 + 3692 + '@webext-core/match-patterns@1.0.3': {} 3693 + 3694 + '@webext-core/messaging@1.4.0': 3695 + dependencies: 3696 + serialize-error: 11.0.3 3697 + webextension-polyfill: 0.10.0 3698 + 3699 + '@wxt-dev/browser@0.1.36': 3700 + dependencies: 3701 + '@types/filesystem': 0.0.36 3702 + '@types/har-format': 1.2.16 3703 + 3704 + '@wxt-dev/module-react@1.1.5(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1))(wxt@0.19.29(@types/node@25.2.3)(rollup@4.57.1))': 3705 + dependencies: 3706 + '@vitejs/plugin-react': 5.1.4(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)) 3707 + wxt: 0.19.29(@types/node@25.2.3)(rollup@4.57.1) 3708 + transitivePeerDependencies: 3709 + - supports-color 3710 + - vite 3711 + 3712 + '@wxt-dev/storage@1.2.7': 3713 + dependencies: 3714 + '@wxt-dev/browser': 0.1.36 3715 + async-mutex: 0.5.0 3716 + dequal: 2.0.3 3717 + 3718 + acorn-jsx@5.3.2(acorn@8.15.0): 3719 + dependencies: 3720 + acorn: 8.15.0 3721 + 3722 + acorn@8.15.0: {} 3723 + 3724 + addons-linter@9.6.0(jiti@2.6.1): 3725 + dependencies: 3726 + '@fluent/syntax': 0.19.0 3727 + '@fregante/relaxed-json': 2.0.0 3728 + '@mdn/browser-compat-data': 7.3.0 3729 + addons-moz-compare: 1.3.0 3730 + addons-scanner-utils: 10.2.0 3731 + ajv: 8.17.1 3732 + chalk: 4.1.2 3733 + cheerio: 1.2.0 3734 + columnify: 1.6.0 3735 + common-tags: 1.8.2 3736 + deepmerge: 4.3.1 3737 + eslint: 9.39.2(jiti@2.6.1) 3738 + eslint-plugin-no-unsanitized: 4.1.4(eslint@9.39.2(jiti@2.6.1)) 3739 + eslint-visitor-keys: 5.0.0 3740 + espree: 11.1.0 3741 + esprima: 4.0.1 3742 + fast-json-patch: 3.1.1 3743 + image-size: 2.0.2 3744 + json-merge-patch: 1.0.2 3745 + pino: 10.3.0 3746 + semver: 7.7.3 3747 + source-map-support: 0.5.21 3748 + upath: 2.0.1 3749 + yargs: 17.7.2 3750 + yauzl: 2.10.0 3751 + transitivePeerDependencies: 3752 + - body-parser 3753 + - express 3754 + - jiti 3755 + - node-fetch 3756 + - safe-compare 3757 + - supports-color 3758 + 3759 + addons-moz-compare@1.3.0: {} 3760 + 3761 + addons-scanner-utils@10.2.0: 3762 + dependencies: 3763 + '@types/yauzl': 2.10.3 3764 + common-tags: 1.8.2 3765 + first-chunk-stream: 3.0.0 3766 + strip-bom-stream: 4.0.0 3767 + upath: 2.0.1 3768 + yauzl: 2.10.0 3769 + 3770 + adm-zip@0.5.16: {} 3771 + 3772 + agent-base@7.1.4: {} 3773 + 3774 + ajv@6.12.6: 3775 + dependencies: 3776 + fast-deep-equal: 3.1.3 3777 + fast-json-stable-stringify: 2.1.0 3778 + json-schema-traverse: 0.4.1 3779 + uri-js: 4.4.1 3780 + 3781 + ajv@8.17.1: 3782 + dependencies: 3783 + fast-deep-equal: 3.1.3 3784 + fast-uri: 3.1.0 3785 + json-schema-traverse: 1.0.0 3786 + require-from-string: 2.0.2 3787 + 3788 + ansi-align@3.0.1: 3789 + dependencies: 3790 + string-width: 4.2.3 3791 + 3792 + ansi-escapes@7.3.0: 3793 + dependencies: 3794 + environment: 1.1.0 3795 + 3796 + ansi-regex@5.0.1: {} 3797 + 3798 + ansi-regex@6.2.2: {} 3799 + 3800 + ansi-styles@4.3.0: 3801 + dependencies: 3802 + color-convert: 2.0.1 3803 + 3804 + ansi-styles@6.2.3: {} 3805 + 3806 + any-promise@1.3.0: {} 3807 + 3808 + anymatch@3.1.3: 3809 + dependencies: 3810 + normalize-path: 3.0.0 3811 + picomatch: 2.3.1 3812 + 3813 + arg@5.0.2: {} 3814 + 3815 + argparse@2.0.1: {} 3816 + 3817 + array-differ@4.0.0: {} 3818 + 3819 + array-union@3.0.1: {} 3820 + 3821 + async-mutex@0.5.0: 3822 + dependencies: 3823 + tslib: 2.8.1 3824 + 3825 + async@3.2.6: {} 3826 + 3827 + atomic-sleep@1.0.0: {} 3828 + 3829 + atomically@2.1.1: 3830 + dependencies: 3831 + stubborn-fs: 2.0.0 3832 + when-exit: 2.1.5 3833 + 3834 + autoprefixer@10.4.24(postcss@8.5.6): 3835 + dependencies: 3836 + browserslist: 4.28.1 3837 + caniuse-lite: 1.0.30001769 3838 + fraction.js: 5.3.4 3839 + picocolors: 1.1.1 3840 + postcss: 8.5.6 3841 + postcss-value-parser: 4.2.0 3842 + 3843 + balanced-match@1.0.2: {} 3844 + 3845 + balanced-match@4.0.2: 3846 + dependencies: 3847 + jackspeak: 4.2.3 3848 + 3849 + baseline-browser-mapping@2.9.19: {} 3850 + 3851 + binary-extensions@2.3.0: {} 3852 + 3853 + bluebird@3.7.2: {} 3854 + 3855 + boolbase@1.0.0: {} 3856 + 3857 + boxen@8.0.1: 3858 + dependencies: 3859 + ansi-align: 3.0.1 3860 + camelcase: 8.0.0 3861 + chalk: 5.6.2 3862 + cli-boxes: 3.0.0 3863 + string-width: 7.2.0 3864 + type-fest: 4.41.0 3865 + widest-line: 5.0.0 3866 + wrap-ansi: 9.0.2 3867 + 3868 + brace-expansion@1.1.12: 3869 + dependencies: 3870 + balanced-match: 1.0.2 3871 + concat-map: 0.0.1 3872 + 3873 + brace-expansion@2.0.2: 3874 + dependencies: 3875 + balanced-match: 1.0.2 3876 + 3877 + brace-expansion@5.0.2: 3878 + dependencies: 3879 + balanced-match: 4.0.2 3880 + 3881 + braces@3.0.3: 3882 + dependencies: 3883 + fill-range: 7.1.1 3884 + 3885 + browserslist@4.28.1: 3886 + dependencies: 3887 + baseline-browser-mapping: 2.9.19 3888 + caniuse-lite: 1.0.30001769 3889 + electron-to-chromium: 1.5.286 3890 + node-releases: 2.0.27 3891 + update-browserslist-db: 1.2.3(browserslist@4.28.1) 3892 + 3893 + buffer-crc32@0.2.13: {} 3894 + 3895 + buffer-from@1.1.2: {} 3896 + 3897 + bundle-name@4.1.0: 3898 + dependencies: 3899 + run-applescript: 7.1.0 3900 + 3901 + c12@3.3.3(magicast@0.3.5): 3902 + dependencies: 3903 + chokidar: 5.0.0 3904 + confbox: 0.2.4 3905 + defu: 6.1.4 3906 + dotenv: 17.3.1 3907 + exsolve: 1.0.8 3908 + giget: 2.0.0 3909 + jiti: 2.6.1 3910 + ohash: 2.0.11 3911 + pathe: 2.0.3 3912 + perfect-debounce: 2.1.0 3913 + pkg-types: 2.3.0 3914 + rc9: 2.1.2 3915 + optionalDependencies: 3916 + magicast: 0.3.5 3917 + 3918 + cac@6.7.14: {} 3919 + 3920 + callsites@3.1.0: {} 3921 + 3922 + camelcase-css@2.0.1: {} 3923 + 3924 + camelcase@8.0.0: {} 3925 + 3926 + caniuse-lite@1.0.30001769: {} 3927 + 3928 + chalk@4.1.2: 3929 + dependencies: 3930 + ansi-styles: 4.3.0 3931 + supports-color: 7.2.0 3932 + 3933 + chalk@5.6.2: {} 3934 + 3935 + cheerio-select@2.1.0: 3936 + dependencies: 3937 + boolbase: 1.0.0 3938 + css-select: 5.2.2 3939 + css-what: 6.2.2 3940 + domelementtype: 2.3.0 3941 + domhandler: 5.0.3 3942 + domutils: 3.2.2 3943 + 3944 + cheerio@1.2.0: 3945 + dependencies: 3946 + cheerio-select: 2.1.0 3947 + dom-serializer: 2.0.0 3948 + domhandler: 5.0.3 3949 + domutils: 3.2.2 3950 + encoding-sniffer: 0.2.1 3951 + htmlparser2: 10.1.0 3952 + parse5: 7.3.0 3953 + parse5-htmlparser2-tree-adapter: 7.1.0 3954 + parse5-parser-stream: 7.1.2 3955 + undici: 7.22.0 3956 + whatwg-mimetype: 4.0.0 3957 + 3958 + chokidar@3.6.0: 3959 + dependencies: 3960 + anymatch: 3.1.3 3961 + braces: 3.0.3 3962 + glob-parent: 5.1.2 3963 + is-binary-path: 2.1.0 3964 + is-glob: 4.0.3 3965 + normalize-path: 3.0.0 3966 + readdirp: 3.6.0 3967 + optionalDependencies: 3968 + fsevents: 2.3.3 3969 + 3970 + chokidar@4.0.3: 3971 + dependencies: 3972 + readdirp: 4.1.2 3973 + 3974 + chokidar@5.0.0: 3975 + dependencies: 3976 + readdirp: 5.0.0 3977 + 3978 + chownr@2.0.0: {} 3979 + 3980 + chrome-launcher@1.2.0: 3981 + dependencies: 3982 + '@types/node': 25.2.3 3983 + escape-string-regexp: 4.0.0 3984 + is-wsl: 2.2.0 3985 + lighthouse-logger: 2.0.2 3986 + transitivePeerDependencies: 3987 + - supports-color 3988 + 3989 + ci-info@4.4.0: {} 3990 + 3991 + citty@0.1.6: 3992 + dependencies: 3993 + consola: 3.4.2 3994 + 3995 + citty@0.2.1: {} 3996 + 3997 + cli-boxes@3.0.0: {} 3998 + 3999 + cli-cursor@5.0.0: 4000 + dependencies: 4001 + restore-cursor: 5.1.0 4002 + 4003 + cli-spinners@2.9.2: {} 4004 + 4005 + cli-truncate@4.0.0: 4006 + dependencies: 4007 + slice-ansi: 5.0.0 4008 + string-width: 7.2.0 4009 + 4010 + cliui@8.0.1: 4011 + dependencies: 4012 + string-width: 4.2.3 4013 + strip-ansi: 6.0.1 4014 + wrap-ansi: 7.0.0 4015 + 4016 + clone@1.0.4: {} 4017 + 4018 + clsx@2.1.1: {} 4019 + 4020 + color-convert@2.0.1: 4021 + dependencies: 4022 + color-name: 1.1.4 4023 + 4024 + color-name@1.1.4: {} 4025 + 4026 + colorette@2.0.20: {} 4027 + 4028 + columnify@1.6.0: 4029 + dependencies: 4030 + strip-ansi: 6.0.1 4031 + wcwidth: 1.0.1 4032 + 4033 + commander@2.9.0: 4034 + dependencies: 4035 + graceful-readlink: 1.0.1 4036 + 4037 + commander@4.1.1: {} 4038 + 4039 + commander@9.5.0: {} 4040 + 4041 + common-tags@1.8.2: {} 4042 + 4043 + concat-map@0.0.1: {} 4044 + 4045 + concat-stream@1.6.2: 4046 + dependencies: 4047 + buffer-from: 1.1.2 4048 + inherits: 2.0.4 4049 + readable-stream: 2.3.8 4050 + typedarray: 0.0.6 4051 + 4052 + confbox@0.1.8: {} 4053 + 4054 + confbox@0.2.4: {} 4055 + 4056 + config-chain@1.1.13: 4057 + dependencies: 4058 + ini: 1.3.8 4059 + proto-list: 1.2.4 4060 + 4061 + configstore@7.1.0: 4062 + dependencies: 4063 + atomically: 2.1.1 4064 + dot-prop: 9.0.0 4065 + graceful-fs: 4.2.11 4066 + xdg-basedir: 5.1.0 4067 + 4068 + consola@3.4.2: {} 4069 + 4070 + convert-source-map@2.0.0: {} 4071 + 4072 + core-util-is@1.0.3: {} 4073 + 4074 + cross-spawn@7.0.6: 4075 + dependencies: 4076 + path-key: 3.1.1 4077 + shebang-command: 2.0.0 4078 + which: 2.0.2 4079 + 4080 + css-select@5.2.2: 4081 + dependencies: 4082 + boolbase: 1.0.0 4083 + css-what: 6.2.2 4084 + domhandler: 5.0.3 4085 + domutils: 3.2.2 4086 + nth-check: 2.1.1 4087 + 4088 + css-what@6.2.2: {} 4089 + 4090 + cssesc@3.0.0: {} 4091 + 4092 + cssom@0.5.0: {} 4093 + 4094 + csstype@3.2.3: {} 4095 + 4096 + debounce@1.2.1: {} 4097 + 4098 + debug@4.3.7: 4099 + dependencies: 4100 + ms: 2.1.3 4101 + 4102 + debug@4.4.3: 4103 + dependencies: 4104 + ms: 2.1.3 4105 + 4106 + decamelize@6.0.1: {} 4107 + 4108 + deep-extend@0.6.0: {} 4109 + 4110 + deep-is@0.1.4: {} 4111 + 4112 + deepmerge@4.3.1: {} 4113 + 4114 + default-browser-id@5.0.1: {} 4115 + 4116 + default-browser@5.5.0: 4117 + dependencies: 4118 + bundle-name: 4.1.0 4119 + default-browser-id: 5.0.1 4120 + 4121 + defaults@1.0.4: 4122 + dependencies: 4123 + clone: 1.0.4 4124 + 4125 + define-lazy-prop@2.0.0: {} 4126 + 4127 + define-lazy-prop@3.0.0: {} 4128 + 4129 + defu@6.1.4: {} 4130 + 4131 + dequal@2.0.3: {} 4132 + 4133 + destr@2.0.5: {} 4134 + 4135 + didyoumean@1.2.2: {} 4136 + 4137 + dlv@1.1.3: {} 4138 + 4139 + dom-serializer@2.0.0: 4140 + dependencies: 4141 + domelementtype: 2.3.0 4142 + domhandler: 5.0.3 4143 + entities: 4.5.0 4144 + 4145 + domelementtype@2.3.0: {} 4146 + 4147 + domhandler@5.0.3: 4148 + dependencies: 4149 + domelementtype: 2.3.0 4150 + 4151 + domutils@3.2.2: 4152 + dependencies: 4153 + dom-serializer: 2.0.0 4154 + domelementtype: 2.3.0 4155 + domhandler: 5.0.3 4156 + 4157 + dot-prop@9.0.0: 4158 + dependencies: 4159 + type-fest: 4.41.0 4160 + 4161 + dotenv-expand@12.0.3: 4162 + dependencies: 4163 + dotenv: 16.6.1 4164 + 4165 + dotenv@16.6.1: {} 4166 + 4167 + dotenv@17.3.1: {} 4168 + 4169 + electron-to-chromium@1.5.286: {} 4170 + 4171 + emoji-regex@10.6.0: {} 4172 + 4173 + emoji-regex@8.0.0: {} 4174 + 4175 + encoding-sniffer@0.2.1: 4176 + dependencies: 4177 + iconv-lite: 0.6.3 4178 + whatwg-encoding: 3.1.1 4179 + 4180 + entities@4.5.0: {} 4181 + 4182 + entities@6.0.1: {} 4183 + 4184 + entities@7.0.1: {} 4185 + 4186 + environment@1.1.0: {} 4187 + 4188 + error-ex@1.3.4: 4189 + dependencies: 4190 + is-arrayish: 0.2.1 4191 + 4192 + es-module-lexer@1.7.0: {} 4193 + 4194 + es6-error@4.1.1: {} 4195 + 4196 + esbuild@0.25.12: 4197 + optionalDependencies: 4198 + '@esbuild/aix-ppc64': 0.25.12 4199 + '@esbuild/android-arm': 0.25.12 4200 + '@esbuild/android-arm64': 0.25.12 4201 + '@esbuild/android-x64': 0.25.12 4202 + '@esbuild/darwin-arm64': 0.25.12 4203 + '@esbuild/darwin-x64': 0.25.12 4204 + '@esbuild/freebsd-arm64': 0.25.12 4205 + '@esbuild/freebsd-x64': 0.25.12 4206 + '@esbuild/linux-arm': 0.25.12 4207 + '@esbuild/linux-arm64': 0.25.12 4208 + '@esbuild/linux-ia32': 0.25.12 4209 + '@esbuild/linux-loong64': 0.25.12 4210 + '@esbuild/linux-mips64el': 0.25.12 4211 + '@esbuild/linux-ppc64': 0.25.12 4212 + '@esbuild/linux-riscv64': 0.25.12 4213 + '@esbuild/linux-s390x': 0.25.12 4214 + '@esbuild/linux-x64': 0.25.12 4215 + '@esbuild/netbsd-arm64': 0.25.12 4216 + '@esbuild/netbsd-x64': 0.25.12 4217 + '@esbuild/openbsd-arm64': 0.25.12 4218 + '@esbuild/openbsd-x64': 0.25.12 4219 + '@esbuild/openharmony-arm64': 0.25.12 4220 + '@esbuild/sunos-x64': 0.25.12 4221 + '@esbuild/win32-arm64': 0.25.12 4222 + '@esbuild/win32-ia32': 0.25.12 4223 + '@esbuild/win32-x64': 0.25.12 4224 + 4225 + esbuild@0.27.3: 4226 + optionalDependencies: 4227 + '@esbuild/aix-ppc64': 0.27.3 4228 + '@esbuild/android-arm': 0.27.3 4229 + '@esbuild/android-arm64': 0.27.3 4230 + '@esbuild/android-x64': 0.27.3 4231 + '@esbuild/darwin-arm64': 0.27.3 4232 + '@esbuild/darwin-x64': 0.27.3 4233 + '@esbuild/freebsd-arm64': 0.27.3 4234 + '@esbuild/freebsd-x64': 0.27.3 4235 + '@esbuild/linux-arm': 0.27.3 4236 + '@esbuild/linux-arm64': 0.27.3 4237 + '@esbuild/linux-ia32': 0.27.3 4238 + '@esbuild/linux-loong64': 0.27.3 4239 + '@esbuild/linux-mips64el': 0.27.3 4240 + '@esbuild/linux-ppc64': 0.27.3 4241 + '@esbuild/linux-riscv64': 0.27.3 4242 + '@esbuild/linux-s390x': 0.27.3 4243 + '@esbuild/linux-x64': 0.27.3 4244 + '@esbuild/netbsd-arm64': 0.27.3 4245 + '@esbuild/netbsd-x64': 0.27.3 4246 + '@esbuild/openbsd-arm64': 0.27.3 4247 + '@esbuild/openbsd-x64': 0.27.3 4248 + '@esbuild/openharmony-arm64': 0.27.3 4249 + '@esbuild/sunos-x64': 0.27.3 4250 + '@esbuild/win32-arm64': 0.27.3 4251 + '@esbuild/win32-ia32': 0.27.3 4252 + '@esbuild/win32-x64': 0.27.3 4253 + 4254 + escalade@3.2.0: {} 4255 + 4256 + escape-goat@4.0.0: {} 4257 + 4258 + escape-string-regexp@4.0.0: {} 4259 + 4260 + escape-string-regexp@5.0.0: {} 4261 + 4262 + eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)): 4263 + dependencies: 4264 + eslint: 9.39.2(jiti@2.6.1) 4265 + 4266 + eslint-plugin-no-unsanitized@4.1.4(eslint@9.39.2(jiti@2.6.1)): 4267 + dependencies: 4268 + eslint: 9.39.2(jiti@2.6.1) 4269 + 4270 + eslint-scope@8.4.0: 4271 + dependencies: 4272 + esrecurse: 4.3.0 4273 + estraverse: 5.3.0 4274 + 4275 + eslint-visitor-keys@3.4.3: {} 4276 + 4277 + eslint-visitor-keys@4.2.1: {} 4278 + 4279 + eslint-visitor-keys@5.0.0: {} 4280 + 4281 + eslint@9.39.2(jiti@2.6.1): 4282 + dependencies: 4283 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) 4284 + '@eslint-community/regexpp': 4.12.2 4285 + '@eslint/config-array': 0.21.1 4286 + '@eslint/config-helpers': 0.4.2 4287 + '@eslint/core': 0.17.0 4288 + '@eslint/eslintrc': 3.3.3 4289 + '@eslint/js': 9.39.2 4290 + '@eslint/plugin-kit': 0.4.1 4291 + '@humanfs/node': 0.16.7 4292 + '@humanwhocodes/module-importer': 1.0.1 4293 + '@humanwhocodes/retry': 0.4.3 4294 + '@types/estree': 1.0.8 4295 + ajv: 6.12.6 4296 + chalk: 4.1.2 4297 + cross-spawn: 7.0.6 4298 + debug: 4.4.3 4299 + escape-string-regexp: 4.0.0 4300 + eslint-scope: 8.4.0 4301 + eslint-visitor-keys: 4.2.1 4302 + espree: 10.4.0 4303 + esquery: 1.7.0 4304 + esutils: 2.0.3 4305 + fast-deep-equal: 3.1.3 4306 + file-entry-cache: 8.0.0 4307 + find-up: 5.0.0 4308 + glob-parent: 6.0.2 4309 + ignore: 5.3.2 4310 + imurmurhash: 0.1.4 4311 + is-glob: 4.0.3 4312 + json-stable-stringify-without-jsonify: 1.0.1 4313 + lodash.merge: 4.6.2 4314 + minimatch: 3.1.2 4315 + natural-compare: 1.4.0 4316 + optionator: 0.9.4 4317 + optionalDependencies: 4318 + jiti: 2.6.1 4319 + transitivePeerDependencies: 4320 + - supports-color 4321 + 4322 + espree@10.4.0: 4323 + dependencies: 4324 + acorn: 8.15.0 4325 + acorn-jsx: 5.3.2(acorn@8.15.0) 4326 + eslint-visitor-keys: 4.2.1 4327 + 4328 + espree@11.1.0: 4329 + dependencies: 4330 + acorn: 8.15.0 4331 + acorn-jsx: 5.3.2(acorn@8.15.0) 4332 + eslint-visitor-keys: 5.0.0 4333 + 4334 + esprima@4.0.1: {} 4335 + 4336 + esquery@1.7.0: 4337 + dependencies: 4338 + estraverse: 5.3.0 4339 + 4340 + esrecurse@4.3.0: 4341 + dependencies: 4342 + estraverse: 5.3.0 4343 + 4344 + estraverse@5.3.0: {} 4345 + 4346 + estree-walker@2.0.2: {} 4347 + 4348 + estree-walker@3.0.3: 4349 + dependencies: 4350 + '@types/estree': 1.0.8 4351 + 4352 + esutils@2.0.3: {} 4353 + 4354 + eventemitter3@5.0.4: {} 4355 + 4356 + execa@8.0.1: 4357 + dependencies: 4358 + cross-spawn: 7.0.6 4359 + get-stream: 8.0.1 4360 + human-signals: 5.0.0 4361 + is-stream: 3.0.0 4362 + merge-stream: 2.0.0 4363 + npm-run-path: 5.3.0 4364 + onetime: 6.0.0 4365 + signal-exit: 4.1.0 4366 + strip-final-newline: 3.0.0 4367 + 4368 + exsolve@1.0.8: {} 4369 + 4370 + fast-deep-equal@3.1.3: {} 4371 + 4372 + fast-glob@3.3.3: 4373 + dependencies: 4374 + '@nodelib/fs.stat': 2.0.5 4375 + '@nodelib/fs.walk': 1.2.8 4376 + glob-parent: 5.1.2 4377 + merge2: 1.4.1 4378 + micromatch: 4.0.8 4379 + 4380 + fast-json-patch@3.1.1: {} 4381 + 4382 + fast-json-stable-stringify@2.1.0: {} 4383 + 4384 + fast-levenshtein@2.0.6: {} 4385 + 4386 + fast-redact@3.5.0: {} 4387 + 4388 + fast-uri@3.1.0: {} 4389 + 4390 + fastq@1.20.1: 4391 + dependencies: 4392 + reusify: 1.1.0 4393 + 4394 + fd-slicer@1.1.0: 4395 + dependencies: 4396 + pend: 1.2.0 4397 + 4398 + fdir@6.5.0(picomatch@4.0.3): 4399 + optionalDependencies: 4400 + picomatch: 4.0.3 4401 + 4402 + file-entry-cache@8.0.0: 4403 + dependencies: 4404 + flat-cache: 4.0.1 4405 + 4406 + filesize@10.1.6: {} 4407 + 4408 + fill-range@7.1.1: 4409 + dependencies: 4410 + to-regex-range: 5.0.1 4411 + 4412 + find-up@5.0.0: 4413 + dependencies: 4414 + locate-path: 6.0.0 4415 + path-exists: 4.0.0 4416 + 4417 + firefox-profile@4.7.0: 4418 + dependencies: 4419 + adm-zip: 0.5.16 4420 + fs-extra: 11.3.3 4421 + ini: 4.1.3 4422 + minimist: 1.2.8 4423 + xml2js: 0.6.2 4424 + 4425 + first-chunk-stream@3.0.0: {} 4426 + 4427 + flat-cache@4.0.1: 4428 + dependencies: 4429 + flatted: 3.3.3 4430 + keyv: 4.5.4 4431 + 4432 + flatted@3.3.3: {} 4433 + 4434 + form-data-encoder@4.1.0: {} 4435 + 4436 + formdata-node@6.0.3: {} 4437 + 4438 + fraction.js@5.3.4: {} 4439 + 4440 + fs-extra@11.3.3: 4441 + dependencies: 4442 + graceful-fs: 4.2.11 4443 + jsonfile: 6.2.0 4444 + universalify: 2.0.1 4445 + 4446 + fs-minipass@2.1.0: 4447 + dependencies: 4448 + minipass: 3.3.6 4449 + 4450 + fsevents@2.3.3: 4451 + optional: true 4452 + 4453 + function-bind@1.1.2: {} 4454 + 4455 + fx-runner@1.4.0: 4456 + dependencies: 4457 + commander: 2.9.0 4458 + shell-quote: 1.7.3 4459 + spawn-sync: 1.0.15 4460 + when: 3.7.7 4461 + which: 1.2.4 4462 + winreg: 0.0.12 4463 + 4464 + gensync@1.0.0-beta.2: {} 4465 + 4466 + get-caller-file@2.0.5: {} 4467 + 4468 + get-east-asian-width@1.4.0: {} 4469 + 4470 + get-port-please@3.2.0: {} 4471 + 4472 + get-stream@8.0.1: {} 4473 + 4474 + giget@1.2.5: 4475 + dependencies: 4476 + citty: 0.1.6 4477 + consola: 3.4.2 4478 + defu: 6.1.4 4479 + node-fetch-native: 1.6.7 4480 + nypm: 0.5.4 4481 + pathe: 2.0.3 4482 + tar: 6.2.1 4483 + 4484 + giget@2.0.0: 4485 + dependencies: 4486 + citty: 0.1.6 4487 + consola: 3.4.2 4488 + defu: 6.1.4 4489 + node-fetch-native: 1.6.7 4490 + nypm: 0.6.5 4491 + pathe: 2.0.3 4492 + 4493 + glob-parent@5.1.2: 4494 + dependencies: 4495 + is-glob: 4.0.3 4496 + 4497 + glob-parent@6.0.2: 4498 + dependencies: 4499 + is-glob: 4.0.3 4500 + 4501 + glob-to-regexp@0.4.1: {} 4502 + 4503 + global-directory@4.0.1: 4504 + dependencies: 4505 + ini: 4.1.1 4506 + 4507 + globals@14.0.0: {} 4508 + 4509 + graceful-fs@4.2.10: {} 4510 + 4511 + graceful-fs@4.2.11: {} 4512 + 4513 + graceful-readlink@1.0.1: {} 4514 + 4515 + growly@1.3.0: {} 4516 + 4517 + has-flag@4.0.0: {} 4518 + 4519 + hasown@2.0.2: 4520 + dependencies: 4521 + function-bind: 1.1.2 4522 + 4523 + hookable@5.5.3: {} 4524 + 4525 + html-escaper@3.0.3: {} 4526 + 4527 + htmlparser2@10.1.0: 4528 + dependencies: 4529 + domelementtype: 2.3.0 4530 + domhandler: 5.0.3 4531 + domutils: 3.2.2 4532 + entities: 7.0.1 4533 + 4534 + https-proxy-agent@7.0.6: 4535 + dependencies: 4536 + agent-base: 7.1.4 4537 + debug: 4.4.3 4538 + transitivePeerDependencies: 4539 + - supports-color 4540 + 4541 + human-signals@5.0.0: {} 4542 + 4543 + iconv-lite@0.6.3: 4544 + dependencies: 4545 + safer-buffer: 2.1.2 4546 + 4547 + ignore@5.3.2: {} 4548 + 4549 + ignore@7.0.5: {} 4550 + 4551 + image-size@2.0.2: {} 4552 + 4553 + immediate@3.0.6: {} 4554 + 4555 + import-fresh@3.3.1: 4556 + dependencies: 4557 + parent-module: 1.0.1 4558 + resolve-from: 4.0.0 4559 + 4560 + import-meta-resolve@4.2.0: {} 4561 + 4562 + imurmurhash@0.1.4: {} 4563 + 4564 + index-to-position@1.2.0: {} 4565 + 4566 + inherits@2.0.4: {} 4567 + 4568 + ini@1.3.8: {} 4569 + 4570 + ini@4.1.1: {} 4571 + 4572 + ini@4.1.3: {} 4573 + 4574 + is-absolute@0.1.7: 4575 + dependencies: 4576 + is-relative: 0.1.3 4577 + 4578 + is-arrayish@0.2.1: {} 4579 + 4580 + is-binary-path@2.1.0: 4581 + dependencies: 4582 + binary-extensions: 2.3.0 4583 + 4584 + is-core-module@2.16.1: 4585 + dependencies: 4586 + hasown: 2.0.2 4587 + 4588 + is-docker@2.2.1: {} 4589 + 4590 + is-docker@3.0.0: {} 4591 + 4592 + is-extglob@2.1.1: {} 4593 + 4594 + is-fullwidth-code-point@3.0.0: {} 4595 + 4596 + is-fullwidth-code-point@4.0.0: {} 4597 + 4598 + is-fullwidth-code-point@5.1.0: 4599 + dependencies: 4600 + get-east-asian-width: 1.4.0 4601 + 4602 + is-glob@4.0.3: 4603 + dependencies: 4604 + is-extglob: 2.1.1 4605 + 4606 + is-in-ci@1.0.0: {} 4607 + 4608 + is-in-ssh@1.0.0: {} 4609 + 4610 + is-inside-container@1.0.0: 4611 + dependencies: 4612 + is-docker: 3.0.0 4613 + 4614 + is-installed-globally@1.0.0: 4615 + dependencies: 4616 + global-directory: 4.0.1 4617 + is-path-inside: 4.0.0 4618 + 4619 + is-interactive@2.0.0: {} 4620 + 4621 + is-npm@6.1.0: {} 4622 + 4623 + is-number@7.0.0: {} 4624 + 4625 + is-path-inside@4.0.0: {} 4626 + 4627 + is-plain-object@2.0.4: 4628 + dependencies: 4629 + isobject: 3.0.1 4630 + 4631 + is-potential-custom-element-name@1.0.1: {} 4632 + 4633 + is-primitive@3.0.1: {} 4634 + 4635 + is-relative@0.1.3: {} 4636 + 4637 + is-stream@3.0.0: {} 4638 + 4639 + is-unicode-supported@1.3.0: {} 4640 + 4641 + is-unicode-supported@2.1.0: {} 4642 + 4643 + is-utf8@0.2.1: {} 4644 + 4645 + is-wsl@2.2.0: 4646 + dependencies: 4647 + is-docker: 2.2.1 4648 + 4649 + is-wsl@3.1.0: 4650 + dependencies: 4651 + is-inside-container: 1.0.0 4652 + 4653 + isarray@1.0.0: {} 4654 + 4655 + isexe@1.1.2: {} 4656 + 4657 + isexe@2.0.0: {} 4658 + 4659 + isobject@3.0.1: {} 4660 + 4661 + jackspeak@4.2.3: 4662 + dependencies: 4663 + '@isaacs/cliui': 9.0.0 4664 + 4665 + jiti@1.21.7: {} 4666 + 4667 + jiti@2.6.1: {} 4668 + 4669 + jose@5.9.6: {} 4670 + 4671 + js-tokens@4.0.0: {} 4672 + 4673 + js-tokens@9.0.1: {} 4674 + 4675 + js-yaml@4.1.1: 4676 + dependencies: 4677 + argparse: 2.0.1 4678 + 4679 + jsesc@3.1.0: {} 4680 + 4681 + json-buffer@3.0.1: {} 4682 + 4683 + json-merge-patch@1.0.2: 4684 + dependencies: 4685 + fast-deep-equal: 3.1.3 4686 + 4687 + json-parse-even-better-errors@3.0.2: {} 4688 + 4689 + json-schema-traverse@0.4.1: {} 4690 + 4691 + json-schema-traverse@1.0.0: {} 4692 + 4693 + json-stable-stringify-without-jsonify@1.0.1: {} 4694 + 4695 + json5@2.2.3: {} 4696 + 4697 + jsonfile@6.2.0: 4698 + dependencies: 4699 + universalify: 2.0.1 4700 + optionalDependencies: 4701 + graceful-fs: 4.2.11 4702 + 4703 + jszip@3.10.1: 4704 + dependencies: 4705 + lie: 3.3.0 4706 + pako: 1.0.11 4707 + readable-stream: 2.3.8 4708 + setimmediate: 1.0.5 4709 + 4710 + keyv@4.5.4: 4711 + dependencies: 4712 + json-buffer: 3.0.1 4713 + 4714 + kleur@3.0.3: {} 4715 + 4716 + ky@1.14.3: {} 4717 + 4718 + latest-version@9.0.0: 4719 + dependencies: 4720 + package-json: 10.0.1 4721 + 4722 + levn@0.4.1: 4723 + dependencies: 4724 + prelude-ls: 1.2.1 4725 + type-check: 0.4.0 4726 + 4727 + lie@3.3.0: 4728 + dependencies: 4729 + immediate: 3.0.6 4730 + 4731 + lighthouse-logger@2.0.2: 4732 + dependencies: 4733 + debug: 4.4.3 4734 + marky: 1.3.0 4735 + transitivePeerDependencies: 4736 + - supports-color 4737 + 4738 + lilconfig@3.1.3: {} 4739 + 4740 + lines-and-columns@1.2.4: {} 4741 + 4742 + lines-and-columns@2.0.4: {} 4743 + 4744 + linkedom@0.18.12: 4745 + dependencies: 4746 + css-select: 5.2.2 4747 + cssom: 0.5.0 4748 + html-escaper: 3.0.3 4749 + htmlparser2: 10.1.0 4750 + uhyphen: 0.2.0 4751 + 4752 + listr2@8.3.3: 4753 + dependencies: 4754 + cli-truncate: 4.0.0 4755 + colorette: 2.0.20 4756 + eventemitter3: 5.0.4 4757 + log-update: 6.1.0 4758 + rfdc: 1.4.1 4759 + wrap-ansi: 9.0.2 4760 + 4761 + local-pkg@1.1.2: 4762 + dependencies: 4763 + mlly: 1.8.0 4764 + pkg-types: 2.3.0 4765 + quansync: 0.2.11 4766 + 4767 + locate-path@6.0.0: 4768 + dependencies: 4769 + p-locate: 5.0.0 4770 + 4771 + lodash.merge@4.6.2: {} 4772 + 4773 + log-symbols@6.0.0: 4774 + dependencies: 4775 + chalk: 5.6.2 4776 + is-unicode-supported: 1.3.0 4777 + 4778 + log-update@6.1.0: 4779 + dependencies: 4780 + ansi-escapes: 7.3.0 4781 + cli-cursor: 5.0.0 4782 + slice-ansi: 7.1.2 4783 + strip-ansi: 7.1.2 4784 + wrap-ansi: 9.0.2 4785 + 4786 + loose-envify@1.4.0: 4787 + dependencies: 4788 + js-tokens: 4.0.0 4789 + 4790 + lru-cache@5.1.1: 4791 + dependencies: 4792 + yallist: 3.1.1 4793 + 4794 + lucide-react@0.563.0(react@18.3.1): 4795 + dependencies: 4796 + react: 18.3.1 4797 + 4798 + magic-string@0.30.21: 4799 + dependencies: 4800 + '@jridgewell/sourcemap-codec': 1.5.5 4801 + 4802 + magicast@0.3.5: 4803 + dependencies: 4804 + '@babel/parser': 7.29.0 4805 + '@babel/types': 7.29.0 4806 + source-map-js: 1.2.1 4807 + 4808 + make-error@1.3.6: {} 4809 + 4810 + many-keys-map@2.0.1: {} 4811 + 4812 + marky@1.3.0: {} 4813 + 4814 + merge-stream@2.0.0: {} 4815 + 4816 + merge2@1.4.1: {} 4817 + 4818 + micromatch@4.0.8: 4819 + dependencies: 4820 + braces: 3.0.3 4821 + picomatch: 2.3.1 4822 + 4823 + mimic-fn@4.0.0: {} 4824 + 4825 + mimic-function@5.0.1: {} 4826 + 4827 + minimatch@10.2.0: 4828 + dependencies: 4829 + brace-expansion: 5.0.2 4830 + 4831 + minimatch@3.1.2: 4832 + dependencies: 4833 + brace-expansion: 1.1.12 4834 + 4835 + minimatch@9.0.5: 4836 + dependencies: 4837 + brace-expansion: 2.0.2 4838 + 4839 + minimist@1.2.8: {} 4840 + 4841 + minipass@3.3.6: 4842 + dependencies: 4843 + yallist: 4.0.0 4844 + 4845 + minipass@5.0.0: {} 4846 + 4847 + minizlib@2.1.2: 4848 + dependencies: 4849 + minipass: 3.3.6 4850 + yallist: 4.0.0 4851 + 4852 + mkdirp@1.0.4: {} 4853 + 4854 + mlly@1.8.0: 4855 + dependencies: 4856 + acorn: 8.15.0 4857 + pathe: 2.0.3 4858 + pkg-types: 1.3.1 4859 + ufo: 1.6.3 4860 + 4861 + ms@2.1.3: {} 4862 + 4863 + multimatch@6.0.0: 4864 + dependencies: 4865 + '@types/minimatch': 3.0.5 4866 + array-differ: 4.0.0 4867 + array-union: 3.0.1 4868 + minimatch: 3.1.2 4869 + 4870 + mz@2.7.0: 4871 + dependencies: 4872 + any-promise: 1.3.0 4873 + object-assign: 4.1.1 4874 + thenify-all: 1.6.0 4875 + 4876 + nano-spawn@0.2.1: {} 4877 + 4878 + nanoid@3.3.11: {} 4879 + 4880 + natural-compare@1.4.0: {} 4881 + 4882 + node-fetch-native@1.6.7: {} 4883 + 4884 + node-forge@1.3.3: {} 4885 + 4886 + node-notifier@10.0.1: 4887 + dependencies: 4888 + growly: 1.3.0 4889 + is-wsl: 2.2.0 4890 + semver: 7.7.4 4891 + shellwords: 0.1.1 4892 + uuid: 8.3.2 4893 + which: 2.0.2 4894 + 4895 + node-releases@2.0.27: {} 4896 + 4897 + normalize-path@3.0.0: {} 4898 + 4899 + npm-run-path@5.3.0: 4900 + dependencies: 4901 + path-key: 4.0.0 4902 + 4903 + nth-check@2.1.1: 4904 + dependencies: 4905 + boolbase: 1.0.0 4906 + 4907 + nypm@0.3.12: 4908 + dependencies: 4909 + citty: 0.1.6 4910 + consola: 3.4.2 4911 + execa: 8.0.1 4912 + pathe: 1.1.2 4913 + pkg-types: 1.3.1 4914 + ufo: 1.6.3 4915 + 4916 + nypm@0.5.4: 4917 + dependencies: 4918 + citty: 0.1.6 4919 + consola: 3.4.2 4920 + pathe: 2.0.3 4921 + pkg-types: 1.3.1 4922 + tinyexec: 0.3.2 4923 + ufo: 1.6.3 4924 + 4925 + nypm@0.6.5: 4926 + dependencies: 4927 + citty: 0.2.1 4928 + pathe: 2.0.3 4929 + tinyexec: 1.0.2 4930 + 4931 + object-assign@4.1.1: {} 4932 + 4933 + object-hash@3.0.0: {} 4934 + 4935 + ofetch@1.5.1: 4936 + dependencies: 4937 + destr: 2.0.5 4938 + node-fetch-native: 1.6.7 4939 + ufo: 1.6.3 4940 + 4941 + ohash@1.1.6: {} 4942 + 4943 + ohash@2.0.11: {} 4944 + 4945 + on-exit-leak-free@2.1.2: {} 4946 + 4947 + onetime@6.0.0: 4948 + dependencies: 4949 + mimic-fn: 4.0.0 4950 + 4951 + onetime@7.0.0: 4952 + dependencies: 4953 + mimic-function: 5.0.1 4954 + 4955 + open@10.2.0: 4956 + dependencies: 4957 + default-browser: 5.5.0 4958 + define-lazy-prop: 3.0.0 4959 + is-inside-container: 1.0.0 4960 + wsl-utils: 0.1.0 4961 + 4962 + open@11.0.0: 4963 + dependencies: 4964 + default-browser: 5.5.0 4965 + define-lazy-prop: 3.0.0 4966 + is-in-ssh: 1.0.0 4967 + is-inside-container: 1.0.0 4968 + powershell-utils: 0.1.0 4969 + wsl-utils: 0.3.1 4970 + 4971 + open@8.4.2: 4972 + dependencies: 4973 + define-lazy-prop: 2.0.0 4974 + is-docker: 2.2.1 4975 + is-wsl: 2.2.0 4976 + 4977 + optionator@0.9.4: 4978 + dependencies: 4979 + deep-is: 0.1.4 4980 + fast-levenshtein: 2.0.6 4981 + levn: 0.4.1 4982 + prelude-ls: 1.2.1 4983 + type-check: 0.4.0 4984 + word-wrap: 1.2.5 4985 + 4986 + ora@8.2.0: 4987 + dependencies: 4988 + chalk: 5.6.2 4989 + cli-cursor: 5.0.0 4990 + cli-spinners: 2.9.2 4991 + is-interactive: 2.0.0 4992 + is-unicode-supported: 2.1.0 4993 + log-symbols: 6.0.0 4994 + stdin-discarder: 0.2.2 4995 + string-width: 7.2.0 4996 + strip-ansi: 7.1.2 4997 + 4998 + os-shim@0.1.3: {} 4999 + 5000 + p-limit@3.1.0: 5001 + dependencies: 5002 + yocto-queue: 0.1.0 5003 + 5004 + p-locate@5.0.0: 5005 + dependencies: 5006 + p-limit: 3.1.0 5007 + 5008 + package-json@10.0.1: 5009 + dependencies: 5010 + ky: 1.14.3 5011 + registry-auth-token: 5.1.1 5012 + registry-url: 6.0.1 5013 + semver: 7.7.4 5014 + 5015 + pako@1.0.11: {} 5016 + 5017 + parent-module@1.0.1: 5018 + dependencies: 5019 + callsites: 3.1.0 5020 + 5021 + parse-json@7.1.1: 5022 + dependencies: 5023 + '@babel/code-frame': 7.29.0 5024 + error-ex: 1.3.4 5025 + json-parse-even-better-errors: 3.0.2 5026 + lines-and-columns: 2.0.4 5027 + type-fest: 3.13.1 5028 + 5029 + parse-json@8.3.0: 5030 + dependencies: 5031 + '@babel/code-frame': 7.29.0 5032 + index-to-position: 1.2.0 5033 + type-fest: 4.41.0 5034 + 5035 + parse5-htmlparser2-tree-adapter@7.1.0: 5036 + dependencies: 5037 + domhandler: 5.0.3 5038 + parse5: 7.3.0 5039 + 5040 + parse5-parser-stream@7.1.2: 5041 + dependencies: 5042 + parse5: 7.3.0 5043 + 5044 + parse5@7.3.0: 5045 + dependencies: 5046 + entities: 6.0.1 5047 + 5048 + path-exists@4.0.0: {} 5049 + 5050 + path-key@3.1.1: {} 5051 + 5052 + path-key@4.0.0: {} 5053 + 5054 + path-parse@1.0.7: {} 5055 + 5056 + pathe@1.1.2: {} 5057 + 5058 + pathe@2.0.3: {} 5059 + 5060 + pend@1.2.0: {} 5061 + 5062 + perfect-debounce@1.0.0: {} 5063 + 5064 + perfect-debounce@2.1.0: {} 5065 + 5066 + picocolors@1.1.1: {} 5067 + 5068 + picomatch@2.3.1: {} 5069 + 5070 + picomatch@4.0.3: {} 5071 + 5072 + pify@2.3.0: {} 5073 + 5074 + pino-abstract-transport@2.0.0: 5075 + dependencies: 5076 + split2: 4.2.0 5077 + 5078 + pino-abstract-transport@3.0.0: 5079 + dependencies: 5080 + split2: 4.2.0 5081 + 5082 + pino-std-serializers@7.1.0: {} 5083 + 5084 + pino@10.3.0: 5085 + dependencies: 5086 + '@pinojs/redact': 0.4.0 5087 + atomic-sleep: 1.0.0 5088 + on-exit-leak-free: 2.1.2 5089 + pino-abstract-transport: 3.0.0 5090 + pino-std-serializers: 7.1.0 5091 + process-warning: 5.0.0 5092 + quick-format-unescaped: 4.0.4 5093 + real-require: 0.2.0 5094 + safe-stable-stringify: 2.5.0 5095 + sonic-boom: 4.2.1 5096 + thread-stream: 4.0.0 5097 + 5098 + pino@10.3.1: 5099 + dependencies: 5100 + '@pinojs/redact': 0.4.0 5101 + atomic-sleep: 1.0.0 5102 + on-exit-leak-free: 2.1.2 5103 + pino-abstract-transport: 3.0.0 5104 + pino-std-serializers: 7.1.0 5105 + process-warning: 5.0.0 5106 + quick-format-unescaped: 4.0.4 5107 + real-require: 0.2.0 5108 + safe-stable-stringify: 2.5.0 5109 + sonic-boom: 4.2.1 5110 + thread-stream: 4.0.0 5111 + 5112 + pino@9.7.0: 5113 + dependencies: 5114 + atomic-sleep: 1.0.0 5115 + fast-redact: 3.5.0 5116 + on-exit-leak-free: 2.1.2 5117 + pino-abstract-transport: 2.0.0 5118 + pino-std-serializers: 7.1.0 5119 + process-warning: 5.0.0 5120 + quick-format-unescaped: 4.0.4 5121 + real-require: 0.2.0 5122 + safe-stable-stringify: 2.5.0 5123 + sonic-boom: 4.2.1 5124 + thread-stream: 3.1.0 5125 + 5126 + pirates@4.0.7: {} 5127 + 5128 + pkg-types@1.3.1: 5129 + dependencies: 5130 + confbox: 0.1.8 5131 + mlly: 1.8.0 5132 + pathe: 2.0.3 5133 + 5134 + pkg-types@2.3.0: 5135 + dependencies: 5136 + confbox: 0.2.4 5137 + exsolve: 1.0.8 5138 + pathe: 2.0.3 5139 + 5140 + postcss-import@15.1.0(postcss@8.5.6): 5141 + dependencies: 5142 + postcss: 8.5.6 5143 + postcss-value-parser: 4.2.0 5144 + read-cache: 1.0.0 5145 + resolve: 1.22.11 5146 + 5147 + postcss-js@4.1.0(postcss@8.5.6): 5148 + dependencies: 5149 + camelcase-css: 2.0.1 5150 + postcss: 8.5.6 5151 + 5152 + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6): 5153 + dependencies: 5154 + lilconfig: 3.1.3 5155 + optionalDependencies: 5156 + jiti: 1.21.7 5157 + postcss: 8.5.6 5158 + 5159 + postcss-nested@6.2.0(postcss@8.5.6): 5160 + dependencies: 5161 + postcss: 8.5.6 5162 + postcss-selector-parser: 6.1.2 5163 + 5164 + postcss-selector-parser@6.1.2: 5165 + dependencies: 5166 + cssesc: 3.0.0 5167 + util-deprecate: 1.0.2 5168 + 5169 + postcss-value-parser@4.2.0: {} 5170 + 5171 + postcss@8.5.6: 5172 + dependencies: 5173 + nanoid: 3.3.11 5174 + picocolors: 1.1.1 5175 + source-map-js: 1.2.1 5176 + 5177 + powershell-utils@0.1.0: {} 5178 + 5179 + prelude-ls@1.2.1: {} 5180 + 5181 + prettier@3.8.1: {} 5182 + 5183 + process-nextick-args@2.0.1: {} 5184 + 5185 + process-warning@5.0.0: {} 5186 + 5187 + promise-toolbox@0.21.0: 5188 + dependencies: 5189 + make-error: 1.3.6 5190 + 5191 + prompts@2.4.2: 5192 + dependencies: 5193 + kleur: 3.0.3 5194 + sisteransi: 1.0.5 5195 + 5196 + proto-list@1.2.4: {} 5197 + 5198 + publish-browser-extension@3.0.3: 5199 + dependencies: 5200 + cac: 6.7.14 5201 + consola: 3.4.2 5202 + dotenv: 17.3.1 5203 + form-data-encoder: 4.1.0 5204 + formdata-node: 6.0.3 5205 + listr2: 8.3.3 5206 + ofetch: 1.5.1 5207 + zod: 4.3.6 5208 + 5209 + punycode@2.3.1: {} 5210 + 5211 + pupa@3.3.0: 5212 + dependencies: 5213 + escape-goat: 4.0.0 5214 + 5215 + quansync@0.2.11: {} 5216 + 5217 + queue-microtask@1.2.3: {} 5218 + 5219 + quick-format-unescaped@4.0.4: {} 5220 + 5221 + rc9@2.1.2: 5222 + dependencies: 5223 + defu: 6.1.4 5224 + destr: 2.0.5 5225 + 5226 + rc@1.2.8: 5227 + dependencies: 5228 + deep-extend: 0.6.0 5229 + ini: 1.3.8 5230 + minimist: 1.2.8 5231 + strip-json-comments: 2.0.1 5232 + 5233 + react-dom@18.3.1(react@18.3.1): 5234 + dependencies: 5235 + loose-envify: 1.4.0 5236 + react: 18.3.1 5237 + scheduler: 0.23.2 5238 + 5239 + react-refresh@0.18.0: {} 5240 + 5241 + react@18.3.1: 5242 + dependencies: 5243 + loose-envify: 1.4.0 5244 + 5245 + read-cache@1.0.0: 5246 + dependencies: 5247 + pify: 2.3.0 5248 + 5249 + readable-stream@2.3.8: 5250 + dependencies: 5251 + core-util-is: 1.0.3 5252 + inherits: 2.0.4 5253 + isarray: 1.0.0 5254 + process-nextick-args: 2.0.1 5255 + safe-buffer: 5.1.2 5256 + string_decoder: 1.1.1 5257 + util-deprecate: 1.0.2 5258 + 5259 + readdirp@3.6.0: 5260 + dependencies: 5261 + picomatch: 2.3.1 5262 + 5263 + readdirp@4.1.2: {} 5264 + 5265 + readdirp@5.0.0: {} 5266 + 5267 + real-require@0.2.0: {} 5268 + 5269 + registry-auth-token@5.1.1: 5270 + dependencies: 5271 + '@pnpm/npm-conf': 3.0.2 5272 + 5273 + registry-url@6.0.1: 5274 + dependencies: 5275 + rc: 1.2.8 5276 + 5277 + require-directory@2.1.1: {} 5278 + 5279 + require-from-string@2.0.2: {} 5280 + 5281 + resolve-from@4.0.0: {} 5282 + 5283 + resolve@1.22.11: 5284 + dependencies: 5285 + is-core-module: 2.16.1 5286 + path-parse: 1.0.7 5287 + supports-preserve-symlinks-flag: 1.0.0 5288 + 5289 + restore-cursor@5.1.0: 5290 + dependencies: 5291 + onetime: 7.0.0 5292 + signal-exit: 4.1.0 5293 + 5294 + reusify@1.1.0: {} 5295 + 5296 + rfdc@1.4.1: {} 5297 + 5298 + rollup@4.57.1: 5299 + dependencies: 5300 + '@types/estree': 1.0.8 5301 + optionalDependencies: 5302 + '@rollup/rollup-android-arm-eabi': 4.57.1 5303 + '@rollup/rollup-android-arm64': 4.57.1 5304 + '@rollup/rollup-darwin-arm64': 4.57.1 5305 + '@rollup/rollup-darwin-x64': 4.57.1 5306 + '@rollup/rollup-freebsd-arm64': 4.57.1 5307 + '@rollup/rollup-freebsd-x64': 4.57.1 5308 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 5309 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 5310 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 5311 + '@rollup/rollup-linux-arm64-musl': 4.57.1 5312 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 5313 + '@rollup/rollup-linux-loong64-musl': 4.57.1 5314 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 5315 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 5316 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 5317 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 5318 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 5319 + '@rollup/rollup-linux-x64-gnu': 4.57.1 5320 + '@rollup/rollup-linux-x64-musl': 4.57.1 5321 + '@rollup/rollup-openbsd-x64': 4.57.1 5322 + '@rollup/rollup-openharmony-arm64': 4.57.1 5323 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 5324 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 5325 + '@rollup/rollup-win32-x64-gnu': 4.57.1 5326 + '@rollup/rollup-win32-x64-msvc': 4.57.1 5327 + fsevents: 2.3.3 5328 + 5329 + run-applescript@7.1.0: {} 5330 + 5331 + run-parallel@1.2.0: 5332 + dependencies: 5333 + queue-microtask: 1.2.3 5334 + 5335 + safe-buffer@5.1.2: {} 5336 + 5337 + safe-stable-stringify@2.5.0: {} 5338 + 5339 + safer-buffer@2.1.2: {} 5340 + 5341 + sax@1.4.4: {} 5342 + 5343 + scheduler@0.23.2: 5344 + dependencies: 5345 + loose-envify: 1.4.0 5346 + 5347 + scule@1.3.0: {} 5348 + 5349 + semver@6.3.1: {} 5350 + 5351 + semver@7.7.3: {} 5352 + 5353 + semver@7.7.4: {} 5354 + 5355 + serialize-error@11.0.3: 5356 + dependencies: 5357 + type-fest: 2.19.0 5358 + 5359 + set-value@4.1.0: 5360 + dependencies: 5361 + is-plain-object: 2.0.4 5362 + is-primitive: 3.0.1 5363 + 5364 + setimmediate@1.0.5: {} 5365 + 5366 + shebang-command@2.0.0: 5367 + dependencies: 5368 + shebang-regex: 3.0.0 5369 + 5370 + shebang-regex@3.0.0: {} 5371 + 5372 + shell-quote@1.7.3: {} 5373 + 5374 + shellwords@0.1.1: {} 5375 + 5376 + signal-exit@4.1.0: {} 5377 + 5378 + sisteransi@1.0.5: {} 5379 + 5380 + slice-ansi@5.0.0: 5381 + dependencies: 5382 + ansi-styles: 6.2.3 5383 + is-fullwidth-code-point: 4.0.0 5384 + 5385 + slice-ansi@7.1.2: 5386 + dependencies: 5387 + ansi-styles: 6.2.3 5388 + is-fullwidth-code-point: 5.1.0 5389 + 5390 + sonic-boom@4.2.1: 5391 + dependencies: 5392 + atomic-sleep: 1.0.0 5393 + 5394 + source-map-js@1.2.1: {} 5395 + 5396 + source-map-support@0.5.21: 5397 + dependencies: 5398 + buffer-from: 1.1.2 5399 + source-map: 0.6.1 5400 + 5401 + source-map@0.6.1: {} 5402 + 5403 + source-map@0.7.6: {} 5404 + 5405 + spawn-sync@1.0.15: 5406 + dependencies: 5407 + concat-stream: 1.6.2 5408 + os-shim: 0.1.3 5409 + 5410 + split2@4.2.0: {} 5411 + 5412 + split@1.0.1: 5413 + dependencies: 5414 + through: 2.3.8 5415 + 5416 + stdin-discarder@0.2.2: {} 5417 + 5418 + string-width@4.2.3: 5419 + dependencies: 5420 + emoji-regex: 8.0.0 5421 + is-fullwidth-code-point: 3.0.0 5422 + strip-ansi: 6.0.1 5423 + 5424 + string-width@7.2.0: 5425 + dependencies: 5426 + emoji-regex: 10.6.0 5427 + get-east-asian-width: 1.4.0 5428 + strip-ansi: 7.1.2 5429 + 5430 + string_decoder@1.1.1: 5431 + dependencies: 5432 + safe-buffer: 5.1.2 5433 + 5434 + strip-ansi@6.0.1: 5435 + dependencies: 5436 + ansi-regex: 5.0.1 5437 + 5438 + strip-ansi@7.1.2: 5439 + dependencies: 5440 + ansi-regex: 6.2.2 5441 + 5442 + strip-bom-buf@2.0.0: 5443 + dependencies: 5444 + is-utf8: 0.2.1 5445 + 5446 + strip-bom-stream@4.0.0: 5447 + dependencies: 5448 + first-chunk-stream: 3.0.0 5449 + strip-bom-buf: 2.0.0 5450 + 5451 + strip-bom@5.0.0: {} 5452 + 5453 + strip-final-newline@3.0.0: {} 5454 + 5455 + strip-json-comments@2.0.1: {} 5456 + 5457 + strip-json-comments@3.1.1: {} 5458 + 5459 + strip-json-comments@5.0.2: {} 5460 + 5461 + strip-json-comments@5.0.3: {} 5462 + 5463 + strip-literal@2.1.1: 5464 + dependencies: 5465 + js-tokens: 9.0.1 5466 + 5467 + stubborn-fs@2.0.0: 5468 + dependencies: 5469 + stubborn-utils: 1.0.2 5470 + 5471 + stubborn-utils@1.0.2: {} 5472 + 5473 + sucrase@3.35.1: 5474 + dependencies: 5475 + '@jridgewell/gen-mapping': 0.3.13 5476 + commander: 4.1.1 5477 + lines-and-columns: 1.2.4 5478 + mz: 2.7.0 5479 + pirates: 4.0.7 5480 + tinyglobby: 0.2.15 5481 + ts-interface-checker: 0.1.13 5482 + 5483 + supports-color@7.2.0: 5484 + dependencies: 5485 + has-flag: 4.0.0 5486 + 5487 + supports-preserve-symlinks-flag@1.0.0: {} 5488 + 5489 + tailwindcss@3.4.19: 5490 + dependencies: 5491 + '@alloc/quick-lru': 5.2.0 5492 + arg: 5.0.2 5493 + chokidar: 3.6.0 5494 + didyoumean: 1.2.2 5495 + dlv: 1.1.3 5496 + fast-glob: 3.3.3 5497 + glob-parent: 6.0.2 5498 + is-glob: 4.0.3 5499 + jiti: 1.21.7 5500 + lilconfig: 3.1.3 5501 + micromatch: 4.0.8 5502 + normalize-path: 3.0.0 5503 + object-hash: 3.0.0 5504 + picocolors: 1.1.1 5505 + postcss: 8.5.6 5506 + postcss-import: 15.1.0(postcss@8.5.6) 5507 + postcss-js: 4.1.0(postcss@8.5.6) 5508 + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6) 5509 + postcss-nested: 6.2.0(postcss@8.5.6) 5510 + postcss-selector-parser: 6.1.2 5511 + resolve: 1.22.11 5512 + sucrase: 3.35.1 5513 + transitivePeerDependencies: 5514 + - tsx 5515 + - yaml 5516 + 5517 + tar@6.2.1: 5518 + dependencies: 5519 + chownr: 2.0.0 5520 + fs-minipass: 2.1.0 5521 + minipass: 5.0.0 5522 + minizlib: 2.1.2 5523 + mkdirp: 1.0.4 5524 + yallist: 4.0.0 5525 + 5526 + thenify-all@1.6.0: 5527 + dependencies: 5528 + thenify: 3.3.1 5529 + 5530 + thenify@3.3.1: 5531 + dependencies: 5532 + any-promise: 1.3.0 5533 + 5534 + thread-stream@3.1.0: 5535 + dependencies: 5536 + real-require: 0.2.0 5537 + 5538 + thread-stream@4.0.0: 5539 + dependencies: 5540 + real-require: 0.2.0 5541 + 5542 + through@2.3.8: {} 5543 + 5544 + tinyexec@0.3.2: {} 5545 + 5546 + tinyexec@1.0.2: {} 5547 + 5548 + tinyglobby@0.2.15: 5549 + dependencies: 5550 + fdir: 6.5.0(picomatch@4.0.3) 5551 + picomatch: 4.0.3 5552 + 5553 + tmp@0.2.5: {} 5554 + 5555 + to-regex-range@5.0.1: 5556 + dependencies: 5557 + is-number: 7.0.0 5558 + 5559 + ts-api-utils@2.4.0(typescript@5.9.3): 5560 + dependencies: 5561 + typescript: 5.9.3 5562 + 5563 + ts-interface-checker@0.1.13: {} 5564 + 5565 + tslib@2.8.1: {} 5566 + 5567 + type-check@0.4.0: 5568 + dependencies: 5569 + prelude-ls: 1.2.1 5570 + 5571 + type-fest@2.19.0: {} 5572 + 5573 + type-fest@3.13.1: {} 5574 + 5575 + type-fest@4.41.0: {} 5576 + 5577 + typedarray@0.0.6: {} 5578 + 5579 + typescript-eslint@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): 5580 + dependencies: 5581 + '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 5582 + '@typescript-eslint/parser': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 5583 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) 5584 + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) 5585 + eslint: 9.39.2(jiti@2.6.1) 5586 + typescript: 5.9.3 5587 + transitivePeerDependencies: 5588 + - supports-color 5589 + 5590 + typescript@5.9.3: {} 5591 + 5592 + ufo@1.6.3: {} 5593 + 5594 + uhyphen@0.2.0: {} 5595 + 5596 + undici-types@7.16.0: {} 5597 + 5598 + undici@7.22.0: {} 5599 + 5600 + unimport@3.14.6(rollup@4.57.1): 5601 + dependencies: 5602 + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) 5603 + acorn: 8.15.0 5604 + escape-string-regexp: 5.0.0 5605 + estree-walker: 3.0.3 5606 + fast-glob: 3.3.3 5607 + local-pkg: 1.1.2 5608 + magic-string: 0.30.21 5609 + mlly: 1.8.0 5610 + pathe: 2.0.3 5611 + picomatch: 4.0.3 5612 + pkg-types: 1.3.1 5613 + scule: 1.3.0 5614 + strip-literal: 2.1.1 5615 + unplugin: 1.16.1 5616 + transitivePeerDependencies: 5617 + - rollup 5618 + 5619 + universalify@2.0.1: {} 5620 + 5621 + unplugin@1.16.1: 5622 + dependencies: 5623 + acorn: 8.15.0 5624 + webpack-virtual-modules: 0.6.2 5625 + 5626 + upath@2.0.1: {} 5627 + 5628 + update-browserslist-db@1.2.3(browserslist@4.28.1): 5629 + dependencies: 5630 + browserslist: 4.28.1 5631 + escalade: 3.2.0 5632 + picocolors: 1.1.1 5633 + 5634 + update-notifier@7.3.1: 5635 + dependencies: 5636 + boxen: 8.0.1 5637 + chalk: 5.6.2 5638 + configstore: 7.1.0 5639 + is-in-ci: 1.0.0 5640 + is-installed-globally: 1.0.0 5641 + is-npm: 6.1.0 5642 + latest-version: 9.0.0 5643 + pupa: 3.3.0 5644 + semver: 7.7.4 5645 + xdg-basedir: 5.1.0 5646 + 5647 + uri-js@4.4.1: 5648 + dependencies: 5649 + punycode: 2.3.1 5650 + 5651 + util-deprecate@1.0.2: {} 5652 + 5653 + uuid@8.3.2: {} 5654 + 5655 + vite-node@3.2.4(@types/node@25.2.3)(jiti@2.6.1): 5656 + dependencies: 5657 + cac: 6.7.14 5658 + debug: 4.4.3 5659 + es-module-lexer: 1.7.0 5660 + pathe: 2.0.3 5661 + vite: 7.3.1(@types/node@25.2.3)(jiti@2.6.1) 5662 + transitivePeerDependencies: 5663 + - '@types/node' 5664 + - jiti 5665 + - less 5666 + - lightningcss 5667 + - sass 5668 + - sass-embedded 5669 + - stylus 5670 + - sugarss 5671 + - supports-color 5672 + - terser 5673 + - tsx 5674 + - yaml 5675 + 5676 + vite@6.4.1(@types/node@25.2.3)(jiti@2.6.1): 5677 + dependencies: 5678 + esbuild: 0.25.12 5679 + fdir: 6.5.0(picomatch@4.0.3) 5680 + picomatch: 4.0.3 5681 + postcss: 8.5.6 5682 + rollup: 4.57.1 5683 + tinyglobby: 0.2.15 5684 + optionalDependencies: 5685 + '@types/node': 25.2.3 5686 + fsevents: 2.3.3 5687 + jiti: 2.6.1 5688 + 5689 + vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1): 5690 + dependencies: 5691 + esbuild: 0.27.3 5692 + fdir: 6.5.0(picomatch@4.0.3) 5693 + picomatch: 4.0.3 5694 + postcss: 8.5.6 5695 + rollup: 4.57.1 5696 + tinyglobby: 0.2.15 5697 + optionalDependencies: 5698 + '@types/node': 25.2.3 5699 + fsevents: 2.3.3 5700 + jiti: 2.6.1 5701 + 5702 + watchpack@2.4.4: 5703 + dependencies: 5704 + glob-to-regexp: 0.4.1 5705 + graceful-fs: 4.2.11 5706 + 5707 + watchpack@2.5.1: 5708 + dependencies: 5709 + glob-to-regexp: 0.4.1 5710 + graceful-fs: 4.2.11 5711 + 5712 + wcwidth@1.0.1: 5713 + dependencies: 5714 + defaults: 1.0.4 5715 + 5716 + web-ext-run@0.2.4: 5717 + dependencies: 5718 + '@babel/runtime': 7.28.2 5719 + '@devicefarmer/adbkit': 3.3.8 5720 + chrome-launcher: 1.2.0 5721 + debounce: 1.2.1 5722 + es6-error: 4.1.1 5723 + firefox-profile: 4.7.0 5724 + fx-runner: 1.4.0 5725 + multimatch: 6.0.0 5726 + node-notifier: 10.0.1 5727 + parse-json: 7.1.1 5728 + pino: 9.7.0 5729 + promise-toolbox: 0.21.0 5730 + set-value: 4.1.0 5731 + source-map-support: 0.5.21 5732 + strip-bom: 5.0.0 5733 + strip-json-comments: 5.0.2 5734 + tmp: 0.2.5 5735 + update-notifier: 7.3.1 5736 + watchpack: 2.4.4 5737 + zip-dir: 2.0.0 5738 + transitivePeerDependencies: 5739 + - supports-color 5740 + 5741 + web-ext@9.3.0(jiti@2.6.1): 5742 + dependencies: 5743 + '@babel/runtime': 7.28.6 5744 + '@devicefarmer/adbkit': 3.3.8 5745 + addons-linter: 9.6.0(jiti@2.6.1) 5746 + camelcase: 8.0.0 5747 + chrome-launcher: 1.2.0 5748 + debounce: 1.2.1 5749 + decamelize: 6.0.1 5750 + es6-error: 4.1.1 5751 + firefox-profile: 4.7.0 5752 + fx-runner: 1.4.0 5753 + https-proxy-agent: 7.0.6 5754 + jose: 5.9.6 5755 + jszip: 3.10.1 5756 + multimatch: 6.0.0 5757 + node-notifier: 10.0.1 5758 + open: 11.0.0 5759 + parse-json: 8.3.0 5760 + pino: 10.3.1 5761 + promise-toolbox: 0.21.0 5762 + source-map-support: 0.5.21 5763 + strip-bom: 5.0.0 5764 + strip-json-comments: 5.0.3 5765 + tmp: 0.2.5 5766 + update-notifier: 7.3.1 5767 + watchpack: 2.5.1 5768 + yargs: 17.7.2 5769 + zip-dir: 2.0.0 5770 + transitivePeerDependencies: 5771 + - body-parser 5772 + - express 5773 + - jiti 5774 + - node-fetch 5775 + - safe-compare 5776 + - supports-color 5777 + 5778 + webextension-polyfill@0.10.0: {} 5779 + 5780 + webextension-polyfill@0.12.0: {} 5781 + 5782 + webpack-virtual-modules@0.6.2: {} 5783 + 5784 + whatwg-encoding@3.1.1: 5785 + dependencies: 5786 + iconv-lite: 0.6.3 5787 + 5788 + whatwg-mimetype@4.0.0: {} 5789 + 5790 + when-exit@2.1.5: {} 5791 + 5792 + when@3.7.7: {} 5793 + 5794 + which@1.2.4: 5795 + dependencies: 5796 + is-absolute: 0.1.7 5797 + isexe: 1.1.2 5798 + 5799 + which@2.0.2: 5800 + dependencies: 5801 + isexe: 2.0.0 5802 + 5803 + widest-line@5.0.0: 5804 + dependencies: 5805 + string-width: 7.2.0 5806 + 5807 + winreg@0.0.12: {} 5808 + 5809 + word-wrap@1.2.5: {} 5810 + 5811 + wrap-ansi@7.0.0: 5812 + dependencies: 5813 + ansi-styles: 4.3.0 5814 + string-width: 4.2.3 5815 + strip-ansi: 6.0.1 5816 + 5817 + wrap-ansi@9.0.2: 5818 + dependencies: 5819 + ansi-styles: 6.2.3 5820 + string-width: 7.2.0 5821 + strip-ansi: 7.1.2 5822 + 5823 + wsl-utils@0.1.0: 5824 + dependencies: 5825 + is-wsl: 3.1.0 5826 + 5827 + wsl-utils@0.3.1: 5828 + dependencies: 5829 + is-wsl: 3.1.0 5830 + powershell-utils: 0.1.0 5831 + 5832 + wxt@0.19.29(@types/node@25.2.3)(rollup@4.57.1): 5833 + dependencies: 5834 + '@1natsu/wait-element': 4.1.2 5835 + '@aklinker1/rollup-plugin-visualizer': 5.12.0(rollup@4.57.1) 5836 + '@types/chrome': 0.0.280 5837 + '@types/webextension-polyfill': 0.12.4 5838 + '@webext-core/fake-browser': 1.3.4 5839 + '@webext-core/isolated-element': 1.1.3 5840 + '@webext-core/match-patterns': 1.0.3 5841 + '@wxt-dev/storage': 1.2.7 5842 + async-mutex: 0.5.0 5843 + c12: 3.3.3(magicast@0.3.5) 5844 + cac: 6.7.14 5845 + chokidar: 4.0.3 5846 + ci-info: 4.4.0 5847 + consola: 3.4.2 5848 + defu: 6.1.4 5849 + dotenv: 16.6.1 5850 + dotenv-expand: 12.0.3 5851 + esbuild: 0.25.12 5852 + fast-glob: 3.3.3 5853 + filesize: 10.1.6 5854 + fs-extra: 11.3.3 5855 + get-port-please: 3.2.0 5856 + giget: 1.2.5 5857 + hookable: 5.5.3 5858 + import-meta-resolve: 4.2.0 5859 + is-wsl: 3.1.0 5860 + jiti: 2.6.1 5861 + json5: 2.2.3 5862 + jszip: 3.10.1 5863 + linkedom: 0.18.12 5864 + magicast: 0.3.5 5865 + minimatch: 10.2.0 5866 + nano-spawn: 0.2.1 5867 + normalize-path: 3.0.0 5868 + nypm: 0.3.12 5869 + ohash: 1.1.6 5870 + open: 10.2.0 5871 + ora: 8.2.0 5872 + perfect-debounce: 1.0.0 5873 + picocolors: 1.1.1 5874 + prompts: 2.4.2 5875 + publish-browser-extension: 3.0.3 5876 + scule: 1.3.0 5877 + unimport: 3.14.6(rollup@4.57.1) 5878 + vite: 6.4.1(@types/node@25.2.3)(jiti@2.6.1) 5879 + vite-node: 3.2.4(@types/node@25.2.3)(jiti@2.6.1) 5880 + web-ext-run: 0.2.4 5881 + webextension-polyfill: 0.12.0 5882 + transitivePeerDependencies: 5883 + - '@types/node' 5884 + - canvas 5885 + - less 5886 + - lightningcss 5887 + - rollup 5888 + - sass 5889 + - sass-embedded 5890 + - stylus 5891 + - sugarss 5892 + - supports-color 5893 + - terser 5894 + - tsx 5895 + - yaml 5896 + 5897 + xdg-basedir@5.1.0: {} 5898 + 5899 + xml2js@0.6.2: 5900 + dependencies: 5901 + sax: 1.4.4 5902 + xmlbuilder: 11.0.1 5903 + 5904 + xmlbuilder@11.0.1: {} 5905 + 5906 + y18n@5.0.8: {} 5907 + 5908 + yallist@3.1.1: {} 5909 + 5910 + yallist@4.0.0: {} 5911 + 5912 + yargs-parser@21.1.1: {} 5913 + 5914 + yargs@17.7.2: 5915 + dependencies: 5916 + cliui: 8.0.1 5917 + escalade: 3.2.0 5918 + get-caller-file: 2.0.5 5919 + require-directory: 2.1.1 5920 + string-width: 4.2.3 5921 + y18n: 5.0.8 5922 + yargs-parser: 21.1.1 5923 + 5924 + yauzl@2.10.0: 5925 + dependencies: 5926 + buffer-crc32: 0.2.13 5927 + fd-slicer: 1.1.0 5928 + 5929 + yocto-queue@0.1.0: {} 5930 + 5931 + zip-dir@2.0.0: 5932 + dependencies: 5933 + async: 3.2.6 5934 + jszip: 3.10.1 5935 + 5936 + zod@4.3.6: {}
+142
extension/src/standalone/adapters/api.ts
··· 1 + import type { MarginSession, Annotation, TextSelector } from '@/utils/types'; 2 + 3 + const API_URL = 'https://margin.at'; 4 + 5 + async function apiRequest(path: string, options: RequestInit = {}): Promise<Response> { 6 + const headers: Record<string, string> = { 7 + 'Content-Type': 'application/json', 8 + ...(options.headers as Record<string, string>), 9 + }; 10 + 11 + return fetch(`${API_URL}/api${path}`, { 12 + ...options, 13 + headers, 14 + credentials: 'include', 15 + }); 16 + } 17 + 18 + export async function checkSession(): Promise<MarginSession> { 19 + try { 20 + const res = await fetch(`${API_URL}/auth/session`, { credentials: 'include' }); 21 + if (!res.ok) return { authenticated: false }; 22 + const data = await res.json(); 23 + if (!data.did || !data.handle) { 24 + return { authenticated: false }; 25 + } 26 + return { 27 + authenticated: true, 28 + did: data.did, 29 + handle: data.handle, 30 + accessJwt: data.accessJwt, 31 + refreshJwt: data.refreshJwt, 32 + }; 33 + } catch { 34 + return { authenticated: false }; 35 + } 36 + } 37 + 38 + export async function getAnnotations(url: string): Promise<Annotation[]> { 39 + try { 40 + const res = await fetch(`${API_URL}/api/targets?source=${encodeURIComponent(url)}`, { 41 + credentials: 'include', 42 + }); 43 + if (!res.ok) return []; 44 + const data = await res.json(); 45 + const allItems: Annotation[] = [ 46 + ...(data.annotations || []), 47 + ...(data.highlights || []), 48 + ...(data.bookmarks || []), 49 + ]; 50 + return allItems; 51 + } catch { 52 + return []; 53 + } 54 + } 55 + 56 + export async function createAnnotation(data: { 57 + url: string; 58 + text: string; 59 + title?: string; 60 + selector?: TextSelector; 61 + tags?: string[]; 62 + }): Promise<{ success: boolean; data?: Annotation; error?: string }> { 63 + try { 64 + const res = await apiRequest('/annotations', { 65 + method: 'POST', 66 + body: JSON.stringify({ 67 + url: data.url, 68 + text: data.text, 69 + title: data.title, 70 + selector: data.selector, 71 + tags: data.tags, 72 + }), 73 + }); 74 + if (!res.ok) { 75 + const error = await res.text(); 76 + return { success: false, error }; 77 + } 78 + return { success: true, data: await res.json() }; 79 + } catch (error) { 80 + return { success: false, error: String(error) }; 81 + } 82 + } 83 + 84 + export async function getUserTags(did: string): Promise<string[]> { 85 + try { 86 + const res = await apiRequest(`/users/${did}/tags?limit=50`); 87 + if (!res.ok) return []; 88 + const data = await res.json(); 89 + return (data || []).map((t: { tag: string }) => t.tag); 90 + } catch { 91 + return []; 92 + } 93 + } 94 + 95 + export async function getTrendingTags(): Promise<string[]> { 96 + try { 97 + const res = await apiRequest('/trending-tags?limit=50'); 98 + if (!res.ok) return []; 99 + const data = await res.json(); 100 + return (data || []).map((t: { tag: string }) => t.tag); 101 + } catch { 102 + return []; 103 + } 104 + } 105 + 106 + export async function convertHighlightToAnnotation(data: { 107 + highlightUri: string; 108 + url: string; 109 + text: string; 110 + title?: string; 111 + selector?: TextSelector; 112 + }): Promise<{ success: boolean; error?: string }> { 113 + try { 114 + const createResult = await createAnnotation({ 115 + url: data.url, 116 + text: data.text, 117 + title: data.title, 118 + selector: data.selector, 119 + }); 120 + 121 + if (!createResult.success) { 122 + return { success: false, error: createResult.error }; 123 + } 124 + 125 + const rkey = data.highlightUri.split('/').pop(); 126 + if (rkey) { 127 + await apiRequest(`/highlights?rkey=${rkey}`, { method: 'DELETE' }); 128 + } 129 + 130 + return { success: true }; 131 + } catch (error) { 132 + return { success: false, error: String(error) }; 133 + } 134 + } 135 + 136 + export async function cacheAnnotations(_url: string, _annotations: Annotation[]): Promise<void> { 137 + // No-op for standalone - no background script to cache to 138 + } 139 + 140 + export function updateBadge(_data: { count: number }): void { 141 + // No-op for standalone - no extension badge to update 142 + }
+45
extension/src/standalone/adapters/storage.ts
··· 1 + type ChangeListener<T> = (newValue: T) => void; 2 + 3 + class LocalStorageItem<T> { 4 + private key: string; 5 + private fallback: T; 6 + private listeners: Set<ChangeListener<T>> = new Set(); 7 + 8 + constructor(key: string, fallback: T) { 9 + this.key = key; 10 + this.fallback = fallback; 11 + 12 + window.addEventListener('storage', (e) => { 13 + if (e.key === key && e.newValue !== null) { 14 + const value = this.parseValue(e.newValue); 15 + this.listeners.forEach((l) => l(value)); 16 + } 17 + }); 18 + } 19 + 20 + private parseValue(value: string | null): T { 21 + if (value === null) return this.fallback; 22 + try { 23 + return JSON.parse(value); 24 + } catch { 25 + return this.fallback; 26 + } 27 + } 28 + 29 + async getValue(): Promise<T> { 30 + return this.parseValue(localStorage.getItem(this.key)); 31 + } 32 + 33 + async setValue(value: T): Promise<void> { 34 + localStorage.setItem(this.key, JSON.stringify(value)); 35 + this.listeners.forEach((l) => l(value)); 36 + } 37 + 38 + watch(callback: ChangeListener<T>): () => void { 39 + this.listeners.add(callback); 40 + return () => this.listeners.delete(callback); 41 + } 42 + } 43 + 44 + export const overlayEnabledItem = new LocalStorageItem<boolean>('margin-overlay-enabled', true); 45 + export const themeItem = new LocalStorageItem<'light' | 'dark' | 'system'>('margin-theme', 'system');
+56
extension/src/standalone/index.ts
··· 1 + import { initStandaloneOverlay } from './overlay-standalone'; 2 + 3 + let initialized = false; 4 + let destroyFn: (() => void) | null = null; 5 + 6 + export async function init() { 7 + if (initialized) return; 8 + initialized = true; 9 + destroyFn = await initStandaloneOverlay(); 10 + } 11 + 12 + export function refresh() { 13 + window.dispatchEvent(new CustomEvent('margin:refresh')); 14 + } 15 + 16 + export function destroy() { 17 + if (destroyFn) { 18 + destroyFn(); 19 + destroyFn = null; 20 + } 21 + initialized = false; 22 + } 23 + 24 + export function showCompose(selector: { exact: string }) { 25 + window.dispatchEvent(new CustomEvent('margin:show-compose', { detail: { selector } })); 26 + } 27 + 28 + export function scrollToText(text: string) { 29 + window.dispatchEvent(new CustomEvent('margin:scroll-to-text', { detail: { text } })); 30 + } 31 + 32 + declare global { 33 + interface Window { 34 + MarginOverlay: { 35 + init: typeof init; 36 + refresh: typeof refresh; 37 + destroy: typeof destroy; 38 + showCompose: typeof showCompose; 39 + scrollToText: typeof scrollToText; 40 + }; 41 + } 42 + } 43 + 44 + (window as any).MarginOverlay = { 45 + init, 46 + refresh, 47 + destroy, 48 + showCompose, 49 + scrollToText, 50 + }; 51 + 52 + if (document.readyState === 'loading') { 53 + document.addEventListener('DOMContentLoaded', () => init()); 54 + } else { 55 + init(); 56 + }
+1145
extension/src/standalone/overlay-standalone.ts
··· 1 + import { overlayStyles } from '@/utils/overlay-styles'; 2 + import { DOMTextMatcher } from '@/utils/text-matcher'; 3 + import type { Annotation } from '@/utils/types'; 4 + import { APP_URL } from '@/utils/types'; 5 + import * as api from './adapters/api'; 6 + import { overlayEnabledItem, themeItem } from './adapters/storage'; 7 + 8 + const Icons = { 9 + close: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>`, 10 + reply: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 17 4 12 9 7"/><path d="M20 18v-2a4 4 0 0 0-4-4H4"/></svg>`, 11 + share: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8"/><polyline points="16 6 12 2 8 6"/><line x1="12" x2="12" y1="2" y2="15"/></svg>`, 12 + check: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>`, 13 + highlightMarker: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2L2 7l10 5 10-5-10-5Z"/><path d="m2 17 10 5 10-5"/><path d="m2 12 10 5 10-5"/></svg>`, 14 + message: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>`, 15 + send: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/></svg>`, 16 + }; 17 + 18 + function formatRelativeTime(dateString: string) { 19 + const date = new Date(dateString); 20 + const now = new Date(); 21 + const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000); 22 + 23 + if (diffInSeconds < 60) return 'just now'; 24 + if (diffInSeconds < 3600) return `${Math.floor(diffInSeconds / 60)}m`; 25 + if (diffInSeconds < 86400) return `${Math.floor(diffInSeconds / 3600)}h`; 26 + if (diffInSeconds < 604800) return `${Math.floor(diffInSeconds / 86400)}d`; 27 + return date.toLocaleDateString(); 28 + } 29 + 30 + function escapeHtml(unsafe: string) { 31 + return unsafe 32 + .replace(/&/g, '&amp;') 33 + .replace(/</g, '&lt;') 34 + .replace(/>/g, '&gt;') 35 + .replace(/"/g, '&quot;') 36 + .replace(/'/g, '&#039;'); 37 + } 38 + 39 + let overlayHost: HTMLElement | null = null; 40 + let shadowRoot: ShadowRoot | null = null; 41 + let popoverEl: HTMLElement | null = null; 42 + let hoverIndicator: HTMLElement | null = null; 43 + let composeModal: HTMLElement | null = null; 44 + let activeItems: Array<{ range: Range; item: Annotation }> = []; 45 + let cachedMatcher: DOMTextMatcher | null = null; 46 + const injectedStyles = new Set<string>(); 47 + let overlayEnabled = true; 48 + let currentUserDid: string | null = null; 49 + let cachedUserTags: string[] = []; 50 + let cleanupFns: (() => void)[] = []; 51 + 52 + function getPageUrl(): string { 53 + const pdfUrl = document.documentElement.dataset.marginPdfUrl; 54 + if (pdfUrl) return pdfUrl; 55 + 56 + if (window.location.href.includes('/pdfjs/web/viewer.html')) { 57 + try { 58 + const params = new URLSearchParams(window.location.search); 59 + const fileParam = params.get('file'); 60 + if (fileParam) { 61 + document.documentElement.dataset.marginPdfUrl = fileParam; 62 + return fileParam; 63 + } 64 + } catch { 65 + /* ignore */ 66 + } 67 + } 68 + 69 + return window.location.href; 70 + } 71 + 72 + function isPdfContext(): boolean { 73 + return !!( 74 + document.querySelector('.pdfViewer') || 75 + window.location.href.includes('/pdfjs/web/viewer.html') 76 + ); 77 + } 78 + 79 + async function initSession() { 80 + try { 81 + const session = await api.checkSession(); 82 + if (session.authenticated && session.did) { 83 + currentUserDid = session.did; 84 + const [userTags, trendingTags] = await Promise.all([ 85 + api.getUserTags(session.did).catch(() => [] as string[]), 86 + api.getTrendingTags().catch(() => [] as string[]), 87 + ]); 88 + const seen = new Set(userTags); 89 + cachedUserTags = [...userTags]; 90 + for (const t of trendingTags) { 91 + if (!seen.has(t)) { 92 + cachedUserTags.push(t); 93 + seen.add(t); 94 + } 95 + } 96 + } 97 + } catch { 98 + /* ignore */ 99 + } 100 + } 101 + 102 + function initOverlay() { 103 + overlayHost = document.createElement('div'); 104 + overlayHost.id = 'margin-overlay-host'; 105 + overlayHost.style.cssText = ` 106 + position: absolute; top: 0; left: 0; width: 100%; 107 + height: 0; overflow: visible; 108 + pointer-events: none; z-index: 2147483647; 109 + `; 110 + if (document.body) { 111 + document.body.appendChild(overlayHost); 112 + } else { 113 + document.documentElement.appendChild(overlayHost); 114 + } 115 + 116 + shadowRoot = overlayHost.attachShadow({ mode: 'open' }); 117 + 118 + const styleEl = document.createElement('style'); 119 + styleEl.textContent = overlayStyles; 120 + shadowRoot.appendChild(styleEl); 121 + const overlayContainer = document.createElement('div'); 122 + overlayContainer.className = 'margin-overlay'; 123 + overlayContainer.id = 'margin-overlay-container'; 124 + shadowRoot.appendChild(overlayContainer); 125 + 126 + document.addEventListener('mousemove', handleMouseMove); 127 + document.addEventListener('click', handleDocumentClick, true); 128 + document.addEventListener('keydown', handleKeyDown); 129 + 130 + cleanupFns.push(() => { 131 + document.removeEventListener('mousemove', handleMouseMove); 132 + document.removeEventListener('click', handleDocumentClick, true); 133 + document.removeEventListener('keydown', handleKeyDown); 134 + }); 135 + } 136 + 137 + async function applyTheme() { 138 + if (!overlayHost) return; 139 + const theme = await themeItem.getValue(); 140 + overlayHost.classList.remove('light', 'dark'); 141 + if (theme === 'system' || !theme) { 142 + if (window.matchMedia('(prefers-color-scheme: light)').matches) { 143 + overlayHost.classList.add('light'); 144 + } 145 + } else { 146 + overlayHost.classList.add(theme); 147 + } 148 + } 149 + 150 + export async function initStandaloneOverlay(): Promise<() => void> { 151 + initSession(); 152 + 153 + if (document.body) { 154 + initOverlay(); 155 + } else { 156 + document.addEventListener('DOMContentLoaded', initOverlay); 157 + } 158 + 159 + overlayEnabledItem.getValue().then((enabled) => { 160 + overlayEnabled = enabled; 161 + if (!enabled && overlayHost) { 162 + overlayHost.style.display = 'none'; 163 + api.updateBadge({ count: 0 }); 164 + } else { 165 + applyTheme(); 166 + if ('requestIdleCallback' in window) { 167 + requestIdleCallback(() => fetchAnnotations(), { timeout: 2000 }); 168 + } else { 169 + setTimeout(() => fetchAnnotations(), 100); 170 + } 171 + } 172 + }); 173 + 174 + themeItem.watch((newTheme) => { 175 + if (overlayHost) { 176 + overlayHost.classList.remove('light', 'dark'); 177 + if (newTheme === 'system') { 178 + if (window.matchMedia('(prefers-color-scheme: light)').matches) { 179 + overlayHost.classList.add('light'); 180 + } 181 + } else { 182 + overlayHost.classList.add(newTheme); 183 + } 184 + } 185 + }); 186 + 187 + overlayEnabledItem.watch((enabled) => { 188 + overlayEnabled = enabled; 189 + if (overlayHost) { 190 + overlayHost.style.display = enabled ? '' : 'none'; 191 + if (enabled) { 192 + fetchAnnotations(); 193 + } else { 194 + activeItems = []; 195 + if (typeof CSS !== 'undefined' && CSS.highlights) { 196 + CSS.highlights.clear(); 197 + } 198 + api.updateBadge({ count: 0 }); 199 + } 200 + } 201 + }); 202 + 203 + window.addEventListener('margin:refresh', () => fetchAnnotations()); 204 + window.addEventListener( 205 + 'margin:destroy', 206 + () => { 207 + destroy(); 208 + }, 209 + { once: true } 210 + ); 211 + 212 + window.addEventListener( 213 + 'margin:show-compose', 214 + ((e: CustomEvent<{ selector: { exact: string } }>) => { 215 + if (e.detail?.selector?.exact) { 216 + showComposeModal(e.detail.selector.exact); 217 + } 218 + }) as EventListener 219 + ); 220 + 221 + window.addEventListener( 222 + 'margin:scroll-to-text', 223 + ((e: CustomEvent<{ text: string }>) => { 224 + if (e.detail?.text) { 225 + scrollToText(e.detail.text); 226 + } 227 + }) as EventListener 228 + ); 229 + 230 + setupUrlChangeListener(); 231 + setupMutationObserver(); 232 + setupPdfObserver(); 233 + 234 + window.addEventListener('load', () => { 235 + setTimeout(() => fetchAnnotations(), 500); 236 + }); 237 + 238 + return destroy; 239 + } 240 + 241 + function destroy() { 242 + cleanupFns.forEach((fn) => fn()); 243 + cleanupFns = []; 244 + overlayHost?.remove(); 245 + overlayHost = null; 246 + shadowRoot = null; 247 + popoverEl = null; 248 + hoverIndicator = null; 249 + composeModal = null; 250 + activeItems = []; 251 + cachedMatcher = null; 252 + injectedStyles.clear(); 253 + if (typeof CSS !== 'undefined' && CSS.highlights) { 254 + CSS.highlights.clear(); 255 + } 256 + } 257 + 258 + function handleKeyDown(e: KeyboardEvent) { 259 + if (e.key === 'Escape') { 260 + if (composeModal) { 261 + composeModal.remove(); 262 + composeModal = null; 263 + } 264 + if (popoverEl) { 265 + popoverEl.remove(); 266 + popoverEl = null; 267 + } 268 + } 269 + } 270 + 271 + function showComposeModal(quoteText: string) { 272 + if (!shadowRoot) return; 273 + 274 + const container = shadowRoot.getElementById('margin-overlay-container'); 275 + if (!container) return; 276 + 277 + if (composeModal) composeModal.remove(); 278 + 279 + composeModal = document.createElement('div'); 280 + composeModal.className = 'inline-compose-modal'; 281 + 282 + const left = Math.max(20, (window.innerWidth - 380) / 2); 283 + const top = Math.max(60, window.innerHeight * 0.2); 284 + 285 + composeModal.style.left = `${left}px`; 286 + composeModal.style.top = `${top}px`; 287 + 288 + const truncatedQuote = quoteText.length > 150 ? quoteText.slice(0, 150) + '...' : quoteText; 289 + 290 + const header = document.createElement('div'); 291 + header.className = 'compose-header'; 292 + 293 + const titleSpan = document.createElement('span'); 294 + titleSpan.className = 'compose-title'; 295 + titleSpan.textContent = 'New Annotation'; 296 + header.appendChild(titleSpan); 297 + 298 + const closeBtn = document.createElement('button'); 299 + closeBtn.className = 'compose-close'; 300 + closeBtn.innerHTML = Icons.close; 301 + header.appendChild(closeBtn); 302 + 303 + composeModal.appendChild(header); 304 + 305 + const body = document.createElement('div'); 306 + body.className = 'compose-body'; 307 + 308 + const quoteDiv = document.createElement('div'); 309 + quoteDiv.className = 'inline-compose-quote'; 310 + quoteDiv.textContent = `"${truncatedQuote}"`; 311 + body.appendChild(quoteDiv); 312 + 313 + const textarea = document.createElement('textarea'); 314 + textarea.className = 'inline-compose-textarea'; 315 + textarea.placeholder = 'Write your annotation...'; 316 + body.appendChild(textarea); 317 + 318 + const tagSection = document.createElement('div'); 319 + tagSection.className = 'compose-tags-section'; 320 + 321 + const tagContainer = document.createElement('div'); 322 + tagContainer.className = 'compose-tags-container'; 323 + 324 + const tagInput = document.createElement('input'); 325 + tagInput.type = 'text'; 326 + tagInput.className = 'compose-tag-input'; 327 + tagInput.placeholder = 'Add tags...'; 328 + 329 + const tagSuggestionsDropdown = document.createElement('div'); 330 + tagSuggestionsDropdown.className = 'compose-tag-suggestions'; 331 + tagSuggestionsDropdown.style.display = 'none'; 332 + 333 + const composeTags: string[] = []; 334 + 335 + function renderTags() { 336 + tagContainer.querySelectorAll('.compose-tag-pill').forEach((el) => el.remove()); 337 + composeTags.forEach((tag) => { 338 + const pill = document.createElement('span'); 339 + pill.className = 'compose-tag-pill'; 340 + pill.innerHTML = `${escapeHtml(tag)} <button class="compose-tag-remove">${Icons.close}</button>`; 341 + pill.querySelector('.compose-tag-remove')?.addEventListener('click', (e) => { 342 + e.stopPropagation(); 343 + const idx = composeTags.indexOf(tag); 344 + if (idx > -1) composeTags.splice(idx, 1); 345 + renderTags(); 346 + }); 347 + tagContainer.insertBefore(pill, tagInput); 348 + }); 349 + tagInput.placeholder = composeTags.length === 0 ? 'Add tags...' : ''; 350 + } 351 + 352 + function addComposeTag(tag: string) { 353 + const normalized = tag 354 + .trim() 355 + .toLowerCase() 356 + .replace(/[^a-z0-9_-]/g, ''); 357 + if (normalized && !composeTags.includes(normalized) && composeTags.length < 10) { 358 + composeTags.push(normalized); 359 + renderTags(); 360 + } 361 + tagInput.value = ''; 362 + tagSuggestionsDropdown.style.display = 'none'; 363 + tagInput.focus(); 364 + } 365 + 366 + function showTagSuggestions() { 367 + const query = tagInput.value.trim().toLowerCase(); 368 + if (!query) { 369 + tagSuggestionsDropdown.style.display = 'none'; 370 + return; 371 + } 372 + const matches = cachedUserTags 373 + .filter((t) => t.toLowerCase().includes(query) && !composeTags.includes(t)) 374 + .slice(0, 6); 375 + if (matches.length === 0) { 376 + tagSuggestionsDropdown.style.display = 'none'; 377 + return; 378 + } 379 + tagSuggestionsDropdown.innerHTML = matches 380 + .map((t) => `<button class="compose-tag-suggestion-item">${escapeHtml(t)}</button>`) 381 + .join(''); 382 + tagSuggestionsDropdown.style.display = 'block'; 383 + tagSuggestionsDropdown.querySelectorAll('.compose-tag-suggestion-item').forEach((btn) => { 384 + btn.addEventListener('click', (e) => { 385 + e.stopPropagation(); 386 + addComposeTag(btn.textContent || ''); 387 + }); 388 + }); 389 + } 390 + 391 + tagInput.addEventListener('input', showTagSuggestions); 392 + tagInput.addEventListener('keydown', (e) => { 393 + if (e.key === 'Enter' || e.key === ',') { 394 + e.preventDefault(); 395 + if (tagInput.value.trim()) addComposeTag(tagInput.value); 396 + } else if (e.key === 'Backspace' && !tagInput.value && composeTags.length > 0) { 397 + composeTags.pop(); 398 + renderTags(); 399 + } else if (e.key === 'Escape') { 400 + tagSuggestionsDropdown.style.display = 'none'; 401 + } 402 + }); 403 + 404 + tagContainer.appendChild(tagInput); 405 + tagSection.appendChild(tagContainer); 406 + tagSection.appendChild(tagSuggestionsDropdown); 407 + body.appendChild(tagSection); 408 + 409 + composeModal.appendChild(body); 410 + 411 + const footer = document.createElement('div'); 412 + footer.className = 'compose-footer'; 413 + 414 + const cancelBtn = document.createElement('button'); 415 + cancelBtn.className = 'btn-cancel'; 416 + cancelBtn.textContent = 'Cancel'; 417 + footer.appendChild(cancelBtn); 418 + 419 + const submitBtn = document.createElement('button'); 420 + submitBtn.className = 'btn-submit'; 421 + submitBtn.textContent = 'Post'; 422 + footer.appendChild(submitBtn); 423 + 424 + composeModal.appendChild(footer); 425 + 426 + composeModal.querySelector('.compose-close')?.addEventListener('click', () => { 427 + composeModal?.remove(); 428 + composeModal = null; 429 + }); 430 + 431 + cancelBtn.addEventListener('click', () => { 432 + composeModal?.remove(); 433 + composeModal = null; 434 + }); 435 + 436 + submitBtn.addEventListener('click', async () => { 437 + const text = textarea?.value.trim(); 438 + if (!text) return; 439 + 440 + submitBtn.disabled = true; 441 + submitBtn.textContent = 'Posting...'; 442 + 443 + try { 444 + const res = await api.createAnnotation({ 445 + url: getPageUrl(), 446 + title: document.title, 447 + text, 448 + selector: { type: 'TextQuoteSelector', exact: quoteText }, 449 + tags: composeTags.length > 0 ? composeTags : undefined, 450 + }); 451 + 452 + if (!res.success) { 453 + throw new Error(res.error || 'Unknown error'); 454 + } 455 + 456 + showToast('Annotation created!', 'success'); 457 + composeModal?.remove(); 458 + composeModal = null; 459 + 460 + setTimeout(() => fetchAnnotations(), 500); 461 + } catch (error) { 462 + console.error('Failed to create annotation:', error); 463 + showToast('Failed to create annotation', 'error'); 464 + submitBtn.disabled = false; 465 + submitBtn.textContent = 'Post'; 466 + } 467 + }); 468 + 469 + container.appendChild(composeModal); 470 + setTimeout(() => textarea?.focus(), 100); 471 + } 472 + 473 + function scrollToText(text: string) { 474 + if (!text || text.length < 3) return; 475 + 476 + if (!cachedMatcher) { 477 + cachedMatcher = new DOMTextMatcher(); 478 + } 479 + 480 + const range = cachedMatcher.findRange(text); 481 + if (!range) return; 482 + 483 + const rect = range.getBoundingClientRect(); 484 + const scrollY = window.scrollY + rect.top - window.innerHeight / 3; 485 + window.scrollTo({ top: scrollY, behavior: 'smooth' }); 486 + 487 + if (typeof CSS !== 'undefined' && CSS.highlights) { 488 + const tempHighlight = new Highlight(range); 489 + const hlName = 'margin-scroll-flash'; 490 + CSS.highlights.set(hlName, tempHighlight); 491 + injectHighlightStyle(hlName, '#3b82f6'); 492 + 493 + const flashStyle = document.createElement('style'); 494 + flashStyle.textContent = `::highlight(${hlName}) { 495 + background-color: rgba(99, 102, 241, 0.25); 496 + text-decoration: underline; 497 + text-decoration-color: #3b82f6; 498 + text-decoration-thickness: 3px; 499 + text-underline-offset: 2px; 500 + }`; 501 + document.head.appendChild(flashStyle); 502 + 503 + setTimeout(() => { 504 + CSS.highlights.delete(hlName); 505 + flashStyle.remove(); 506 + }, 2500); 507 + } else { 508 + try { 509 + const highlight = document.createElement('mark'); 510 + highlight.style.cssText = 511 + 'background: rgba(59, 130, 246, 0.25); color: inherit; padding: 2px 0; border-radius: 2px; text-decoration: underline; text-decoration-color: #3b82f6; text-decoration-thickness: 3px; transition: all 0.5s;'; 512 + range.surroundContents(highlight); 513 + 514 + setTimeout(() => { 515 + highlight.style.background = 'transparent'; 516 + highlight.style.textDecoration = 'none'; 517 + setTimeout(() => { 518 + const parent = highlight.parentNode; 519 + if (parent) { 520 + parent.replaceChild(document.createTextNode(highlight.textContent || ''), highlight); 521 + parent.normalize(); 522 + } 523 + }, 500); 524 + }, 2000); 525 + } catch { 526 + // ignore 527 + } 528 + } 529 + } 530 + 531 + function showToast(message: string, type: 'success' | 'error' = 'success') { 532 + if (!shadowRoot) return; 533 + 534 + const container = shadowRoot.getElementById('margin-overlay-container'); 535 + if (!container) return; 536 + 537 + container.querySelectorAll('.margin-toast').forEach((el) => el.remove()); 538 + 539 + const toast = document.createElement('div'); 540 + toast.className = `margin-toast ${type === 'success' ? 'toast-success' : ''}`; 541 + const iconSpan = document.createElement('span'); 542 + iconSpan.className = 'toast-icon'; 543 + iconSpan.innerHTML = type === 'success' ? Icons.check : Icons.close; 544 + toast.appendChild(iconSpan); 545 + 546 + const msgSpan = document.createElement('span'); 547 + msgSpan.textContent = message; 548 + toast.appendChild(msgSpan); 549 + 550 + container.appendChild(toast); 551 + 552 + setTimeout(() => { 553 + toast.classList.add('toast-out'); 554 + setTimeout(() => toast.remove(), 200); 555 + }, 2500); 556 + } 557 + 558 + async function fetchAnnotations(retryCount = 0) { 559 + if (!overlayEnabled) { 560 + api.updateBadge({ count: 0 }); 561 + return; 562 + } 563 + 564 + try { 565 + const annotations = await api.getAnnotations(getPageUrl()); 566 + 567 + api.updateBadge({ count: annotations?.length || 0 }); 568 + 569 + if (annotations) { 570 + api.cacheAnnotations(getPageUrl(), annotations); 571 + } 572 + 573 + if (annotations && annotations.length > 0) { 574 + renderBadges(annotations); 575 + } else if (retryCount < 3) { 576 + setTimeout(() => fetchAnnotations(retryCount + 1), 1000 * (retryCount + 1)); 577 + } 578 + } catch (error) { 579 + console.error('Failed to fetch annotations:', error); 580 + if (retryCount < 3) { 581 + setTimeout(() => fetchAnnotations(retryCount + 1), 1000 * (retryCount + 1)); 582 + } 583 + } 584 + } 585 + 586 + function renderBadges(annotations: Annotation[]) { 587 + if (!shadowRoot) return; 588 + 589 + activeItems = []; 590 + const rangesByColor: Record<string, Range[]> = {}; 591 + 592 + if (!cachedMatcher) { 593 + cachedMatcher = new DOMTextMatcher(); 594 + } 595 + const matcher = cachedMatcher; 596 + 597 + annotations.forEach((item) => { 598 + const selector = item.target?.selector || item.selector; 599 + if (!selector?.exact) return; 600 + 601 + const range = matcher.findRange(selector.exact); 602 + if (range) { 603 + activeItems.push({ range, item }); 604 + 605 + const isHighlight = (item as any).type === 'Highlight'; 606 + const defaultColor = isHighlight ? '#f59e0b' : '#3b82f6'; 607 + const color = item.color || defaultColor; 608 + if (!rangesByColor[color]) rangesByColor[color] = []; 609 + rangesByColor[color].push(range); 610 + } 611 + }); 612 + 613 + if (typeof CSS !== 'undefined' && CSS.highlights) { 614 + CSS.highlights.clear(); 615 + for (const [color, ranges] of Object.entries(rangesByColor)) { 616 + const highlight = new Highlight(...ranges); 617 + const safeColor = color.replace(/[^a-zA-Z0-9]/g, ''); 618 + const name = `margin-hl-${safeColor}`; 619 + CSS.highlights.set(name, highlight); 620 + injectHighlightStyle(name, color); 621 + } 622 + } 623 + } 624 + 625 + function injectHighlightStyle(name: string, color: string) { 626 + if (injectedStyles.has(name)) return; 627 + const style = document.createElement('style'); 628 + 629 + if (isPdfContext()) { 630 + const hex = color.replace('#', ''); 631 + const r = parseInt(hex.substring(0, 2), 16) || 99; 632 + const g = parseInt(hex.substring(2, 4), 16) || 102; 633 + const b = parseInt(hex.substring(4, 6), 16) || 241; 634 + style.textContent = ` 635 + ::highlight(${name}) { 636 + background-color: rgba(${r}, ${g}, ${b}, 0.35); 637 + cursor: pointer; 638 + } 639 + `; 640 + } else { 641 + style.textContent = ` 642 + ::highlight(${name}) { 643 + text-decoration: underline; 644 + text-decoration-color: ${color}; 645 + text-decoration-thickness: 2px; 646 + text-underline-offset: 2px; 647 + cursor: pointer; 648 + } 649 + `; 650 + } 651 + 652 + document.head.appendChild(style); 653 + injectedStyles.add(name); 654 + } 655 + 656 + let hoverRafId: number | null = null; 657 + 658 + function handleMouseMove(e: MouseEvent) { 659 + if (!overlayEnabled || !overlayHost) return; 660 + 661 + if (hoverRafId) cancelAnimationFrame(hoverRafId); 662 + hoverRafId = requestAnimationFrame(() => { 663 + processHover(e.clientX, e.clientY, e); 664 + }); 665 + } 666 + 667 + function processHover(x: number, y: number, e: MouseEvent) { 668 + const foundItems: Array<{ range: Range; item: Annotation; rect: DOMRect }> = []; 669 + let firstRange: Range | null = null; 670 + 671 + for (const { range, item } of activeItems) { 672 + const rects = range.getClientRects(); 673 + for (const rect of rects) { 674 + if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) { 675 + let container: Node | null = range.commonAncestorContainer; 676 + if (container.nodeType === Node.TEXT_NODE) { 677 + container = container.parentNode; 678 + } 679 + 680 + if ( 681 + container && 682 + ((e.target as Node).contains(container) || container.contains(e.target as Node)) 683 + ) { 684 + if (!firstRange) firstRange = range; 685 + if (!foundItems.some((f) => f.item === item)) { 686 + foundItems.push({ range, item, rect }); 687 + } 688 + } 689 + break; 690 + } 691 + } 692 + } 693 + 694 + if (foundItems.length > 0 && shadowRoot) { 695 + document.body.style.cursor = 'pointer'; 696 + 697 + if (!hoverIndicator) { 698 + const container = shadowRoot.getElementById('margin-overlay-container'); 699 + if (container) { 700 + hoverIndicator = document.createElement('div'); 701 + hoverIndicator.className = 'margin-hover-indicator'; 702 + container.appendChild(hoverIndicator); 703 + } 704 + } 705 + 706 + if (hoverIndicator && firstRange) { 707 + const authorsMap = new Map<string, any>(); 708 + foundItems.forEach(({ item }) => { 709 + const author = item.author || item.creator || {}; 710 + const id = author.did || author.handle || 'unknown'; 711 + if (!authorsMap.has(id)) { 712 + authorsMap.set(id, author); 713 + } 714 + }); 715 + 716 + const uniqueAuthors = Array.from(authorsMap.values()); 717 + const maxShow = 3; 718 + const displayAuthors = uniqueAuthors.slice(0, maxShow); 719 + const overflow = uniqueAuthors.length - maxShow; 720 + 721 + let html = displayAuthors 722 + .map((author, i) => { 723 + const avatar = author.avatar; 724 + const handle = author.handle || 'U'; 725 + const marginLeft = i === 0 ? '0' : '-8px'; 726 + 727 + if (avatar) { 728 + return `<img src="${avatar}" style="width: 24px; height: 24px; border-radius: 50%; object-fit: cover; border: 2px solid #09090b; margin-left: ${marginLeft};">`; 729 + } else { 730 + return `<div style="width: 24px; height: 24px; border-radius: 50%; background: #3b82f6; color: white; display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600; font-family: -apple-system, sans-serif; border: 2px solid #09090b; margin-left: ${marginLeft};">${handle[0]?.toUpperCase() || 'U'}</div>`; 731 + } 732 + }) 733 + .join(''); 734 + 735 + if (overflow > 0) { 736 + html += `<div style="width: 24px; height: 24px; border-radius: 50%; background: #27272a; color: #a1a1aa; display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 600; font-family: -apple-system, sans-serif; border: 2px solid #09090b; margin-left: -8px;">+${overflow}</div>`; 737 + } 738 + 739 + hoverIndicator.innerHTML = html; 740 + 741 + const firstRect = firstRange.getClientRects()[0]; 742 + const totalWidth = 743 + Math.min(uniqueAuthors.length, maxShow + (overflow > 0 ? 1 : 0)) * 18 + 8; 744 + const leftPos = firstRect.left - totalWidth; 745 + const topPos = firstRect.top + firstRect.height / 2 - 12; 746 + 747 + hoverIndicator.style.left = `${leftPos}px`; 748 + hoverIndicator.style.top = `${topPos}px`; 749 + hoverIndicator.classList.add('visible'); 750 + } 751 + } else { 752 + document.body.style.cursor = ''; 753 + if (hoverIndicator) { 754 + hoverIndicator.classList.remove('visible'); 755 + } 756 + } 757 + } 758 + 759 + function handleDocumentClick(e: MouseEvent) { 760 + if (!overlayEnabled || !overlayHost) return; 761 + 762 + const x = e.clientX; 763 + const y = e.clientY; 764 + 765 + if (popoverEl) { 766 + const rect = popoverEl.getBoundingClientRect(); 767 + if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) { 768 + return; 769 + } 770 + } 771 + 772 + if (composeModal) { 773 + const rect = composeModal.getBoundingClientRect(); 774 + if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) { 775 + return; 776 + } 777 + composeModal.remove(); 778 + composeModal = null; 779 + } 780 + 781 + const clickedItems: Annotation[] = []; 782 + for (const { range, item } of activeItems) { 783 + const rects = range.getClientRects(); 784 + for (const rect of rects) { 785 + if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) { 786 + let container: Node | null = range.commonAncestorContainer; 787 + if (container.nodeType === Node.TEXT_NODE) { 788 + container = container.parentNode; 789 + } 790 + 791 + if ( 792 + container && 793 + ((e.target as Node).contains(container) || container.contains(e.target as Node)) 794 + ) { 795 + if (!clickedItems.includes(item)) { 796 + clickedItems.push(item); 797 + } 798 + } 799 + break; 800 + } 801 + } 802 + } 803 + 804 + if (clickedItems.length > 0) { 805 + e.preventDefault(); 806 + e.stopPropagation(); 807 + 808 + if (popoverEl) { 809 + const currentIds = popoverEl.dataset.itemIds; 810 + const newIds = clickedItems 811 + .map((i) => i.uri || i.id) 812 + .sort() 813 + .join(','); 814 + if (currentIds === newIds) { 815 + popoverEl.remove(); 816 + popoverEl = null; 817 + return; 818 + } 819 + } 820 + 821 + const firstItem = clickedItems[0]; 822 + const match = activeItems.find((x) => x.item === firstItem); 823 + if (match) { 824 + const rects = match.range.getClientRects(); 825 + if (rects.length > 0) { 826 + const rect = rects[0]; 827 + const top = rect.top + window.scrollY; 828 + const left = rect.left + window.scrollX; 829 + showPopover(clickedItems, top, left); 830 + } 831 + } 832 + } else { 833 + if (popoverEl) { 834 + popoverEl.remove(); 835 + popoverEl = null; 836 + } 837 + } 838 + } 839 + 840 + function showPopover(items: Annotation[], top: number, left: number) { 841 + if (!shadowRoot) return; 842 + if (popoverEl) popoverEl.remove(); 843 + 844 + const container = shadowRoot.getElementById('margin-overlay-container'); 845 + if (!container) return; 846 + 847 + popoverEl = document.createElement('div'); 848 + popoverEl.className = 'margin-popover'; 849 + 850 + const ids = items 851 + .map((i) => i.uri || i.id) 852 + .sort() 853 + .join(','); 854 + popoverEl.dataset.itemIds = ids; 855 + 856 + const popWidth = 320; 857 + const screenWidth = window.innerWidth; 858 + let finalLeft = left; 859 + if (left + popWidth > screenWidth) finalLeft = screenWidth - popWidth - 20; 860 + if (finalLeft < 10) finalLeft = 10; 861 + 862 + popoverEl.style.top = `${top + 24}px`; 863 + popoverEl.style.left = `${finalLeft}px`; 864 + 865 + const count = items.length; 866 + const title = count === 1 ? 'Annotation' : `Annotations`; 867 + 868 + const contentHtml = items 869 + .map((item) => { 870 + const author = item.author || item.creator || {}; 871 + const handle = author.handle || 'User'; 872 + const avatar = author.avatar; 873 + const text = item.body?.value || item.text || ''; 874 + const id = item.id || item.uri; 875 + const isHighlight = (item as any).type === 'Highlight'; 876 + const isOwned = currentUserDid && author.did === currentUserDid; 877 + const createdAt = item.createdAt ? formatRelativeTime(item.createdAt) : ''; 878 + 879 + let avatarHtml = `<div class="comment-avatar">${handle[0]?.toUpperCase() || 'U'}</div>`; 880 + if (avatar) { 881 + avatarHtml = `<img src="${avatar}" class="comment-avatar" style="object-fit: cover;">`; 882 + } 883 + 884 + let bodyHtml = ''; 885 + if (isHighlight && !text) { 886 + bodyHtml = `<div class="highlight-badge">${Icons.highlightMarker} Highlighted</div>`; 887 + } else { 888 + bodyHtml = `<div class="comment-text">${escapeHtml(text)}</div>`; 889 + } 890 + 891 + const addNoteBtn = 892 + isHighlight && isOwned 893 + ? `<button class="comment-action-btn btn-add-note" data-id="${id}" data-uri="${id}">${Icons.message} Annotate</button>` 894 + : ''; 895 + 896 + return ` 897 + <div class="comment-item" data-item-id="${id}"> 898 + <div class="comment-header"> 899 + ${avatarHtml} 900 + <div class="comment-meta"> 901 + <span class="comment-handle">@${handle}</span> 902 + ${createdAt ? `<span class="comment-time">${createdAt}</span>` : ''} 903 + </div> 904 + </div> 905 + ${bodyHtml} 906 + <div class="comment-actions"> 907 + ${addNoteBtn} 908 + ${!isHighlight ? `<button class="comment-action-btn btn-reply" data-id="${id}">${Icons.reply} Reply</button>` : ''} 909 + <button class="comment-action-btn btn-share" data-id="${id}" data-text="${escapeHtml(text)}">${Icons.share} Share</button> 910 + </div> 911 + </div> 912 + `; 913 + }) 914 + .join(''); 915 + 916 + popoverEl.innerHTML = ` 917 + <div class="popover-header"> 918 + <span class="popover-title">${title} <span class="popover-count">${count}</span></span> 919 + <button class="popover-close">${Icons.close}</button> 920 + </div> 921 + <div class="popover-scroll-area"> 922 + ${contentHtml} 923 + </div> 924 + `; 925 + 926 + popoverEl.querySelector('.popover-close')?.addEventListener('click', (e) => { 927 + e.stopPropagation(); 928 + popoverEl?.remove(); 929 + popoverEl = null; 930 + }); 931 + 932 + popoverEl.querySelectorAll('.btn-add-note').forEach((btn) => { 933 + btn.addEventListener('click', (e) => { 934 + e.stopPropagation(); 935 + const uri = (btn as HTMLElement).getAttribute('data-uri') || ''; 936 + const itemId = (btn as HTMLElement).getAttribute('data-id') || ''; 937 + const commentItem = btn.closest('.comment-item'); 938 + if (!commentItem) return; 939 + 940 + if (commentItem.querySelector('.add-note-form')) return; 941 + 942 + const form = document.createElement('div'); 943 + form.className = 'add-note-form'; 944 + form.innerHTML = ` 945 + <textarea class="add-note-textarea" placeholder="Add your note..." rows="3"></textarea> 946 + <div class="add-note-actions"> 947 + <button class="add-note-cancel">${Icons.close}</button> 948 + <button class="add-note-submit">${Icons.send}</button> 949 + </div> 950 + `; 951 + 952 + commentItem.appendChild(form); 953 + const textarea = form.querySelector('textarea') as HTMLTextAreaElement; 954 + textarea?.focus(); 955 + 956 + textarea?.addEventListener('keydown', (ke) => { 957 + if (ke.key === 'Enter' && !ke.shiftKey) { 958 + ke.preventDefault(); 959 + submitNote(); 960 + } 961 + if (ke.key === 'Escape') { 962 + form.remove(); 963 + } 964 + }); 965 + 966 + form.querySelector('.add-note-cancel')?.addEventListener('click', (ce) => { 967 + ce.stopPropagation(); 968 + form.remove(); 969 + }); 970 + 971 + form.querySelector('.add-note-submit')?.addEventListener('click', (se) => { 972 + se.stopPropagation(); 973 + submitNote(); 974 + }); 975 + 976 + async function submitNote() { 977 + const noteText = textarea?.value.trim(); 978 + if (!noteText) return; 979 + 980 + const submitBtn = form.querySelector('.add-note-submit') as HTMLButtonElement; 981 + if (submitBtn) submitBtn.disabled = true; 982 + textarea.disabled = true; 983 + 984 + try { 985 + const matchingItem = items.find((i) => (i.id || i.uri) === itemId); 986 + const selector = matchingItem?.target?.selector || matchingItem?.selector; 987 + 988 + const result = await api.convertHighlightToAnnotation({ 989 + highlightUri: uri, 990 + url: getPageUrl(), 991 + title: document.title, 992 + text: noteText, 993 + selector: selector ? { type: 'TextQuoteSelector', exact: selector.exact } : undefined, 994 + }); 995 + 996 + if (result.success) { 997 + showToast('Highlight converted to annotation!', 'success'); 998 + popoverEl?.remove(); 999 + popoverEl = null; 1000 + cachedMatcher = null; 1001 + setTimeout(() => fetchAnnotations(), 500); 1002 + } else { 1003 + showToast('Failed to convert', 'error'); 1004 + if (submitBtn) submitBtn.disabled = false; 1005 + textarea.disabled = false; 1006 + } 1007 + } catch { 1008 + showToast('Failed to convert', 'error'); 1009 + if (submitBtn) submitBtn.disabled = false; 1010 + textarea.disabled = false; 1011 + } 1012 + } 1013 + }); 1014 + }); 1015 + 1016 + popoverEl.querySelectorAll('.btn-reply').forEach((btn) => { 1017 + btn.addEventListener('click', (e) => { 1018 + e.stopPropagation(); 1019 + const id = (btn as HTMLElement).getAttribute('data-id'); 1020 + if (id) { 1021 + window.open(`${APP_URL}/annotation/${encodeURIComponent(id)}`, '_blank'); 1022 + } 1023 + }); 1024 + }); 1025 + 1026 + popoverEl.querySelectorAll('.btn-share').forEach((btn) => { 1027 + btn.addEventListener('click', async (_e) => { 1028 + const text = (btn as HTMLElement).getAttribute('data-text') || ''; 1029 + try { 1030 + await navigator.clipboard.writeText(text); 1031 + const originalInner = btn.innerHTML; 1032 + btn.innerHTML = `${Icons.check} Copied!`; 1033 + setTimeout(() => { 1034 + btn.innerHTML = originalInner; 1035 + }, 2000); 1036 + } catch (error) { 1037 + console.error('Failed to copy', error); 1038 + } 1039 + }); 1040 + }); 1041 + 1042 + container.appendChild(popoverEl); 1043 + } 1044 + 1045 + function setupUrlChangeListener() { 1046 + let lastPolledUrl = getPageUrl(); 1047 + 1048 + function onUrlChange() { 1049 + lastPolledUrl = getPageUrl(); 1050 + if (typeof CSS !== 'undefined' && CSS.highlights) { 1051 + CSS.highlights.clear(); 1052 + } 1053 + injectedStyles.clear(); 1054 + document.querySelectorAll('style').forEach((s) => { 1055 + if (s.textContent?.includes('::highlight(margin-hl-')) s.remove(); 1056 + }); 1057 + activeItems = []; 1058 + cachedMatcher = null; 1059 + api.updateBadge({ count: 0 }); 1060 + if (overlayEnabled) { 1061 + setTimeout(() => fetchAnnotations(), 300); 1062 + } 1063 + } 1064 + 1065 + window.addEventListener('popstate', onUrlChange); 1066 + 1067 + const originalPushState = history.pushState; 1068 + const originalReplaceState = history.replaceState; 1069 + 1070 + history.pushState = function (...args) { 1071 + originalPushState.apply(this, args); 1072 + onUrlChange(); 1073 + }; 1074 + 1075 + history.replaceState = function (...args) { 1076 + originalReplaceState.apply(this, args); 1077 + onUrlChange(); 1078 + }; 1079 + 1080 + const intervalId = setInterval(() => { 1081 + const currentUrl = getPageUrl(); 1082 + if (currentUrl !== lastPolledUrl) { 1083 + onUrlChange(); 1084 + } 1085 + }, 500); 1086 + 1087 + cleanupFns.push(() => { 1088 + clearInterval(intervalId); 1089 + }); 1090 + } 1091 + 1092 + function setupMutationObserver() { 1093 + let domChangeTimeout: ReturnType<typeof setTimeout> | null = null; 1094 + let domChangeCount = 0; 1095 + 1096 + const observer = new MutationObserver((mutations) => { 1097 + const hasSignificantChange = mutations.some( 1098 + (m) => m.type === 'childList' && (m.addedNodes.length > 3 || m.removedNodes.length > 3) 1099 + ); 1100 + if (hasSignificantChange && overlayEnabled) { 1101 + domChangeCount++; 1102 + if (domChangeTimeout) clearTimeout(domChangeTimeout); 1103 + const delay = Math.min(500 + domChangeCount * 100, 2000); 1104 + domChangeTimeout = setTimeout(() => { 1105 + cachedMatcher = null; 1106 + domChangeCount = 0; 1107 + fetchAnnotations(); 1108 + }, delay); 1109 + } 1110 + }); 1111 + 1112 + observer.observe(document.body || document.documentElement, { 1113 + childList: true, 1114 + subtree: true, 1115 + }); 1116 + 1117 + cleanupFns.push(() => { 1118 + observer.disconnect(); 1119 + }); 1120 + } 1121 + 1122 + function setupPdfObserver() { 1123 + if (document.querySelector('.pdfViewer') || /\.pdf(\?|#|$)/i.test(window.location.href)) { 1124 + const pdfObserver = new MutationObserver(() => { 1125 + const textLayers = document.querySelectorAll('.textLayer span'); 1126 + let domChangeTimeout: ReturnType<typeof setTimeout> | null = null; 1127 + if (textLayers.length > 10) { 1128 + if (domChangeTimeout) clearTimeout(domChangeTimeout); 1129 + domChangeTimeout = setTimeout(() => { 1130 + cachedMatcher = null; 1131 + fetchAnnotations(); 1132 + }, 1000); 1133 + } 1134 + }); 1135 + 1136 + pdfObserver.observe(document.body || document.documentElement, { 1137 + childList: true, 1138 + subtree: true, 1139 + }); 1140 + 1141 + cleanupFns.push(() => { 1142 + pdfObserver.disconnect(); 1143 + }); 1144 + } 1145 + }
+25
extension/vite.standalone.config.ts
··· 1 + import { defineConfig } from 'vite'; 2 + import { resolve } from 'node:path'; 3 + 4 + export default defineConfig({ 5 + build: { 6 + lib: { 7 + entry: resolve(__dirname, 'src/standalone/index.ts'), 8 + name: 'MarginOverlay', 9 + fileName: 'margin-overlay', 10 + formats: ['iife'], 11 + }, 12 + outDir: resolve(__dirname, '../dist-standalone'), 13 + emptyOutDir: true, 14 + minify: 'esbuild', 15 + sourcemap: false, 16 + }, 17 + resolve: { 18 + alias: { 19 + '@': resolve(__dirname, 'src'), 20 + }, 21 + }, 22 + define: { 23 + 'process.env.NODE_ENV': '"production"', 24 + }, 25 + });

History

1 round 0 comments
sign up or login to add to the discussion
4 commits
expand
Add bookmarklet userscripts and HTML page with download links
Add hosted loader documentation and overlay loader bookmarklet
Add standalone overlay bundle for hosted loader
Add overlay bundle download link to bookmarklets.html
no conflicts, ready to merge
expand 0 comments