diff --git a/.env b/.env
index a999c62..4f23927 100644
--- a/.env
+++ b/.env
@@ -2,6 +2,11 @@ ACCOUNT_ID_PLEX=
 API_KEY_PLAUSIBLE=
 SUPABASE_URL=
 SUPABASE_KEY=
-CF_ACCOUNT_ID=
-CF_ZONE_ID=
-RSS_TO_MASTODON_KV_NAMESPACE_ID=
\ No newline at end of file
+DIRECTUS_URL=
+DIRECTUS_TOKEN=
+ARTIST_IMPORT_TOKEN=
+ARTIST_FLOW_ID=
+ALBUM_FLOW_ID=
+MASTODON_ACCESS_TOKEN=
+FORWARDEMAIL_API_KEY=
+CDN=
diff --git a/.github/workflows/scheduled-deploy.yaml b/.github/workflows/scheduled-deploy.yaml
new file mode 100644
index 0000000..a1b17a8
--- /dev/null
+++ b/.github/workflows/scheduled-deploy.yaml
@@ -0,0 +1,17 @@
+name: Scheduled deploy
+
+on:
+  schedule:
+    - cron: "0 * * * *"
+  workflow_dispatch:
+
+jobs:
+  trigger-netlify-build:
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Trigger Netlify Build Hook
+        run: |
+          curl -X POST -d '{}' \
+            -H "Content-Type: application/json" \
+            "${{secrets.DEPLOY_HOOK}}"
diff --git a/.gitignore b/.gitignore
index e17a9b7..1197a31 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,6 @@
 # build output
 dist/
 
-# workers
-wrangler.toml
-.wrangler
-
 # generated types
 .astro/
 
@@ -23,5 +19,5 @@ pnpm-debug.log*
 # macOS-specific files
 .DS_Store
 
-# VS Code files
-.vscode/
\ No newline at end of file
+# netlify
+.netlify
diff --git a/.npmrc b/.npmrc
deleted file mode 100644
index be83489..0000000
--- a/.npmrc
+++ /dev/null
@@ -1,2 +0,0 @@
-save-exact=true
-cache=~/.npm
\ No newline at end of file
diff --git a/.nvmrc b/.nvmrc
index 8fdd954..209e3ef 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-22
\ No newline at end of file
+20
diff --git a/README.md b/README.md
index 7906580..da47b41 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
 # coryd.dev
 
+[![Netlify Status](https://api.netlify.com/api/v1/badges/21438096-e0d0-4f14-846d-addd9d8292db/deploy-status)](https://app.netlify.com/sites/coryd/deploys)
+
 Hi! I'm Cory. 👋🏻
 
 This is the code for my personal website and portfolio. Built using [Astro](https://astro.build) and [other tools](https://coryd.dev/colophon).
@@ -24,11 +26,11 @@ This is the code for my personal website and portfolio. Built using [Astro](http
 
 ### Other commands
 
-`npm run build`: builds Astro output.    
-`npm run prevew`: previews built Astro output (uses wrangler command compatible with Cloudflare adapter under the hood).    
-`npm run update:deps`: checks for dependency updates and updates Astro.    
-`npm run build:worker -- WORKER_NAME`: builds the `wrangler.toml` file for the named worker.
-`npm run deploy:worker --worker=WORKER_NAME`: deploys the named worker.
+`npm run build`: builds Astro output.
+`npm run prevew`: previews built Astro output (uses wrangler command compatible with Cloudflare adapter under the hood).
+`npm run update:deps`: checks for dependency updates and updates Astro.
+`netlify dev`: local development with Netlify functions.
+
 
 ## Required environment variables
 
@@ -37,7 +39,12 @@ ACCOUNT_ID_PLEX
 API_KEY_PLAUSIBLE
 SUPABASE_URL
 SUPABASE_KEY
-CF_ACCOUNT_ID
-CF_ZONE_ID
-RSS_TO_MASTODON_KV_NAMESPACE_ID
+DIRECTUS_URL
+DIRECTUS_TOKEN
+ARTIST_IMPORT_TOKEN
+ARTIST_FLOW_ID
+ALBUM_FLOW_ID
+MASTODON_ACCESS_TOKEN
+FORWARDEMAIL_API_KEY
+CDN
 ```
diff --git a/astro.config.mjs b/astro.config.mjs
index 8467269..1eaf4a6 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -1,12 +1,15 @@
 import { defineConfig } from "astro/config";
-import cloudflare from "@astrojs/cloudflare";
+import netlify from "@astrojs/netlify";
 import sitemap from "@astrojs/sitemap";
-import sitemapData from "./src/utils/data/static/sitemapData.json";
+import sitemapData from "./src/utils/data/static/sitemapData.json" assert { type: "json" };
 
 export default defineConfig({
   site: "https://coryd.dev",
   output: "server",
-  adapter: cloudflare(),
+  adapter: netlify({
+    cacheOnDemandPages: true,
+    imageCDN: false,
+  }),
   integrations: [
     sitemap({
       customPages: sitemapData.map((entry) => entry.loc),
diff --git a/functions/artist-import.js b/functions/artist-import.js
new file mode 100644
index 0000000..257fcf5
--- /dev/null
+++ b/functions/artist-import.js
@@ -0,0 +1,204 @@
+import slugify from "slugify";
+import countries from "i18n-iso-countries";
+import enLocale from "i18n-iso-countries/langs/en.json" assert { type: "json" };
+
+countries.registerLocale(enLocale);
+
+function sanitizeMediaString(str) {
+  return slugify(
+    str
+      .normalize("NFD")
+      .replace(/[\u0300-\u036f\u2010\-\.\?\(\)\[\]\{\}]/g, "")
+      .replace(/\.{3}/g, ""),
+    {
+      replacement: "-",
+      remove: /[#,&,+()$~%.'":*?<>{}]/g,
+      lower: true,
+    },
+  );
+}
+
+export async function handler(event, context) {
+  const {
+    DIRECTUS_URL,
+    DIRECTUS_API_TOKEN,
+    ARTIST_IMPORT_TOKEN,
+    ARTIST_FLOW_ID,
+    ALBUM_FLOW_ID,
+  } = process.env;
+
+  const placeholderImageId = "4cef75db-831f-4f5d-9333-79eaa5bb55ee";
+  const requestUrl = new URL(event.rawUrl);
+  const providedToken = requestUrl.searchParams.get("token");
+
+  if (!providedToken || providedToken !== ARTIST_IMPORT_TOKEN) {
+    return {
+      statusCode: 401,
+      body: "Unauthorized",
+    };
+  }
+
+  async function saveToDirectus(endpoint, payload) {
+    try {
+      const response = await fetch(`${DIRECTUS_URL}/items/${endpoint}`, {
+        method: "POST",
+        headers: {
+          "Content-Type": "application/json",
+          Authorization: `Bearer ${DIRECTUS_API_TOKEN}`,
+        },
+        body: JSON.stringify(payload),
+      });
+      const data = await response.json();
+      if (!response.ok) {
+        throw new Error(
+          data.errors?.[0]?.message || "Failed to save to Directus",
+        );
+      }
+      return data.data;
+    } catch (error) {
+      console.error(`Error saving to ${endpoint}:`, error.message);
+      throw error;
+    }
+  }
+
+  async function findGenreIdByName(genreName) {
+    try {
+      const response = await fetch(
+        `${DIRECTUS_URL}/items/genres?filter[name][_eq]=${encodeURIComponent(
+          genreName.toLowerCase(),
+        )}`,
+        { headers: { Authorization: `Bearer ${DIRECTUS_API_TOKEN}` } },
+      );
+      const data = await response.json();
+      return data.data?.[0]?.id || null;
+    } catch (error) {
+      console.error("Error fetching genre ID:", error.message);
+      return null;
+    }
+  }
+
+  const artistId = requestUrl.searchParams.get("artist_id");
+
+  if (!artistId) {
+    return {
+      statusCode: 400,
+      body: "artist_id parameter is required",
+    };
+  }
+
+  let artistData;
+
+  try {
+    const artistResponse = await fetch(
+      `${DIRECTUS_URL}/flows/trigger/${ARTIST_FLOW_ID}?artist_id=${artistId}&import_token=${ARTIST_IMPORT_TOKEN}`,
+      { headers: { Authorization: `Bearer ${DIRECTUS_API_TOKEN}` } },
+    );
+    const artistResult = await artistResponse.json();
+    artistData =
+      artistResult.get_artist_data?.data?.MediaContainer?.Metadata?.[0];
+
+    if (!artistData) throw new Error("Artist data not found");
+  } catch (error) {
+    console.error("Error fetching artist data:", error.message);
+    return {
+      statusCode: 500,
+      body: "Error fetching artist data",
+    };
+  }
+
+  const artistName = artistData.title || "";
+  const artistKey = sanitizeMediaString(artistName);
+  const countryName = artistData.Country?.[0]?.tag || "";
+  const countryIsoCode = countries.getAlpha2Code(countryName, "en") || "";
+  const slug = `/music/artists/${artistKey}-${countryName.toLowerCase()}`;
+  const description = artistData.summary || "";
+  const mbid = artistData.Guid?.[0]?.id?.replace("mbid://", "") || "";
+  const genreNames = artistData.Genre?.map((g) => g.tag.toLowerCase()) || [];
+  let genreId = null;
+
+  for (const genreName of genreNames) {
+    genreId = await findGenreIdByName(genreName);
+    if (genreId) break;
+  }
+
+  const artistPayload = {
+    name: artistName,
+    name_string: artistName,
+    slug,
+    description,
+    mbid,
+    tentative: true,
+    genres: genreId,
+    country: countryIsoCode,
+    art: placeholderImageId,
+  };
+
+  let insertedArtist;
+
+  try {
+    insertedArtist = await saveToDirectus("artists", artistPayload);
+  } catch (error) {
+    console.error("Error saving artist:", error.message);
+    return {
+      statusCode: 500,
+      body: "Error saving artist",
+    };
+  }
+
+  let albumData;
+
+  try {
+    const albumResponse = await fetch(
+      `${DIRECTUS_URL}/flows/trigger/${ALBUM_FLOW_ID}?artist_id=${artistId}&import_token=${ARTIST_IMPORT_TOKEN}`,
+      { headers: { Authorization: `Bearer ${DIRECTUS_API_TOKEN}` } },
+    );
+    const albumResult = await albumResponse.json();
+
+    albumData =
+      albumResult.get_album_data?.data?.MediaContainer?.Metadata || [];
+  } catch (error) {
+    console.error("Error fetching album data:", error.message);
+    return {
+      statusCode: 500,
+      body: "Error fetching album data",
+    };
+  }
+
+  for (const album of albumData) {
+    const albumName = album.title || "";
+    const albumKey = `${artistKey}-${sanitizeMediaString(albumName)}`;
+    const albumSlug = `/music/albums/${albumKey}`;
+    const albumDescription = album.summary || "";
+    const albumReleaseDate = album.originallyAvailableAt || "";
+    const albumReleaseYear = albumReleaseDate
+      ? new Date(albumReleaseDate).getFullYear()
+      : null;
+    const albumGenres = album.Genre?.map((g) => g.tag) || [];
+    const albumMbid = album.Guid?.[0]?.id?.replace("mbid://", "") || null;
+
+    const albumPayload = {
+      name: albumName,
+      key: albumKey,
+      slug: albumSlug,
+      mbid: albumMbid,
+      description: albumDescription,
+      release_year: albumReleaseYear,
+      artist: insertedArtist.id,
+      artist_name: artistName,
+      genres: albumGenres,
+      art: placeholderImageId,
+      tentative: true,
+    };
+
+    try {
+      await saveToDirectus("albums", albumPayload);
+    } catch (error) {
+      console.error("Error saving album:", error.message);
+    }
+  }
+
+  return {
+    statusCode: 200,
+    body: "Artist and albums synced successfully",
+  };
+}
diff --git a/workers/mastodon/index.js b/functions/mastodon.js
similarity index 61%
rename from workers/mastodon/index.js
rename to functions/mastodon.js
index 6488c4c..7dc5c1f 100644
--- a/workers/mastodon/index.js
+++ b/functions/mastodon.js
@@ -1,87 +1,16 @@
 import { XMLParser } from "fast-xml-parser";
-import { convert } from "html-to-text";
 import { createClient } from "@supabase/supabase-js";
 
 const BASE_URL = "https://coryd.dev";
 
-export default {
-  async scheduled(event, env) {
-    await handleMastodonPost(env);
-  },
-};
-
-async function handleMastodonPost(env) {
-  const mastodonApiUrl = "https://follow.coryd.dev/api/v1/statuses";
-  const accessToken = env.MASTODON_ACCESS_TOKEN;
-  const rssFeedUrl = "https://coryd.dev/feeds/syndication.xml";
-  const supabaseUrl = env.SUPABASE_URL;
-  const supabaseKey = env.SUPABASE_KEY;
-  const supabase = createClient(supabaseUrl, supabaseKey);
-
-  try {
-    const latestItems = await fetchRSSFeed(rssFeedUrl);
-
-    for (let i = latestItems.length - 1; i >= 0; i--) {
-      const item = latestItems[i];
-      const existingPost = await env.RSS_TO_MASTODON_NAMESPACE.get(item.link);
-
-      if (existingPost) continue;
-
-      const title = item.title;
-      const link = item.link;
-      const maxLength = 500;
-      const plainTextDescription = convert(item.description, {
-        wordwrap: false,
-        selectors: [
-          { selector: "a", options: { ignoreHref: true } },
-          { selector: "h1", options: { uppercase: false } },
-          { selector: "h2", options: { uppercase: false } },
-          { selector: "h3", options: { uppercase: false } },
-          { selector: "*", format: "block" },
-        ],
-      });
-
-      const cleanedDescription = plainTextDescription
-        .replace(/\s+/g, " ")
-        .trim();
-      const content = truncateContent(
-        title,
-        cleanedDescription,
-        link,
-        maxLength
-      );
-
-      const mastodonPostUrl = await postToMastodon(
-        mastodonApiUrl,
-        accessToken,
-        content
-      );
-      const timestamp = new Date().toISOString();
-
-      await env.RSS_TO_MASTODON_NAMESPACE.put(link, timestamp);
-
-      if (link.includes("coryd.dev/posts")) {
-        const slug = link.replace(BASE_URL, "");
-        await addMastodonUrlToPost(supabase, slug, mastodonPostUrl);
-      }
-
-      console.log(`Posted stored URL: ${link}`);
-    }
-
-    console.log("RSS processed successfully");
-  } catch (error) {
-    console.error("Error in scheduled event:", error);
-  }
-}
-
 async function addMastodonUrlToPost(supabase, slug, mastodonPostUrl) {
-  const { data, error } = await supabase
+  const { error } = await supabase
     .from("posts")
     .update({ mastodon_url: mastodonPostUrl })
     .eq("slug", slug);
 
   if (error) {
-    console.error("Error updating post:", error);
+    console.error("Error updating post in 'posts' table:", error.message);
   } else {
     console.log(`Updated post with Mastodon URL: ${mastodonPostUrl}`);
   }
@@ -112,16 +41,11 @@ async function fetchRSSFeed(rssFeedUrl) {
   const rssData = parser.parse(rssText);
   const items = rssData.rss.channel.item;
 
-  let latestItems = [];
-
-  items.forEach((item) => {
-    const title = item.title;
-    const link = item.link;
-    const description = item.description;
-    latestItems.push({ title, link, description });
-  });
-
-  return latestItems;
+  return items.map((item) => ({
+    title: item.title,
+    link: item.link,
+    description: item.description,
+  }));
 }
 
 async function postToMastodon(apiUrl, accessToken, content) {
@@ -137,13 +61,106 @@ async function postToMastodon(apiUrl, accessToken, content) {
   if (!response.ok) {
     const errorText = await response.text();
     throw new Error(
-      `Error posting to Mastodon: ${response.statusText} - ${errorText}`
+      `Error posting to Mastodon: ${response.statusText} - ${errorText}`,
     );
   }
 
   const responseData = await response.json();
-
-  console.log("Posted to Mastodon successfully.");
-
   return responseData.url;
 }
+
+async function fetchFromSupabase(supabase, link) {
+  const { data, error } = await supabase
+    .from("mastodon_posts")
+    .select("link")
+    .eq("link", link)
+    .single();
+
+  if (error && error.code !== "PGRST116") {
+    console.error("Error fetching from Supabase:", error.message);
+    return null;
+  }
+
+  return data;
+}
+
+async function storeInSupabase(supabase, link, timestamp) {
+  const { error } = await supabase.from("mastodon_posts").insert([
+    {
+      link,
+      created_at: timestamp,
+    },
+  ]);
+
+  if (error) {
+    console.error("Error storing in Supabase:", error.message);
+  } else {
+    console.log("Successfully stored processed link in 'mastodon_posts'");
+  }
+}
+
+async function handleMastodonPost(env, supabase) {
+  const mastodonApiUrl = "https://follow.coryd.dev/api/v1/statuses";
+  const accessToken = env.MASTODON_ACCESS_TOKEN;
+  const rssFeedUrl = "https://coryd.dev/feeds/syndication.xml";
+
+  try {
+    const latestItems = await fetchRSSFeed(rssFeedUrl);
+
+    for (let i = latestItems.length - 1; i >= 0; i--) {
+      const item = latestItems[i];
+      const existingPost = await fetchFromSupabase(supabase, item.link);
+
+      if (existingPost) continue;
+
+      const title = item.title;
+      const link = item.link;
+      const maxLength = 500;
+      const cleanedDescription = item.description.replace(/\s+/g, " ").trim();
+      const content = truncateContent(
+        title,
+        cleanedDescription,
+        link,
+        maxLength,
+      );
+      const mastodonPostUrl = await postToMastodon(
+        mastodonApiUrl,
+        accessToken,
+        content,
+      );
+      const timestamp = new Date().toISOString();
+
+      await storeInSupabase(supabase, item.link, timestamp);
+
+      if (link.includes("coryd.dev/posts")) {
+        const slug = link.replace(BASE_URL, "");
+        await addMastodonUrlToPost(supabase, slug, mastodonPostUrl);
+      }
+
+      console.log(`Posted and stored URL: ${link}`);
+    }
+
+    console.log("RSS processed successfully");
+  } catch (error) {
+    console.error("Error in Mastodon posting process:", error);
+  }
+}
+
+export async function handler(event, context) {
+  const env = process.env;
+
+  try {
+    const supabase = createClient(env.SUPABASE_URL, env.SUPABASE_KEY);
+    await handleMastodonPost(env, supabase);
+    return {
+      statusCode: 200,
+      body: "RSS processed successfully",
+    };
+  } catch (error) {
+    console.error("Error in Netlify function:", error);
+    return {
+      statusCode: 500,
+      body: "Internal Server Error",
+    };
+  }
+}
diff --git a/functions/scrobble.js b/functions/scrobble.js
new file mode 100644
index 0000000..497ed87
--- /dev/null
+++ b/functions/scrobble.js
@@ -0,0 +1,288 @@
+import { createClient } from "@supabase/supabase-js";
+import slugify from "slugify";
+
+const sanitizeMediaString = (str) => {
+  const sanitizedString = str
+    .normalize("NFD")
+    .replace(/[\u0300-\u036f\u2010\-\.\?\(\)\[\]\{\}]/g, "")
+    .replace(/\.{3}/g, "");
+  return slugify(sanitizedString, {
+    replacement: "-",
+    remove: /[#,&,+()$~%.'":*?<>{}]/g,
+    lower: true,
+  });
+};
+
+const sendEmail = async (subject, text, authHeader, maxRetries = 3) => {
+  const emailData = new URLSearchParams({
+    from: "coryd.dev <hi@admin.coryd.dev>",
+    to: "hi@coryd.dev",
+    subject: subject,
+    text: text,
+  }).toString();
+
+  let attempt = 0;
+  let success = false;
+
+  while (attempt < maxRetries && !success) {
+    attempt++;
+    try {
+      const response = await fetch("https://api.forwardemail.net/v1/emails", {
+        method: "POST",
+        headers: {
+          "Content-Type": "application/x-www-form-urlencoded",
+          Authorization: authHeader,
+        },
+        body: emailData,
+      });
+
+      if (!response.ok) {
+        const responseText = await response.text();
+        console.error(
+          `Attempt ${attempt}: Email API response error:`,
+          response.status,
+          responseText,
+        );
+        throw new Error(`Failed to send email: ${responseText}`);
+      }
+
+      console.log("Email sent successfully on attempt", attempt);
+      success = true;
+    } catch (error) {
+      console.error(`Attempt ${attempt}: Error sending email.`);
+
+      if (attempt < maxRetries) {
+        console.log(
+          `Retrying email send (attempt ${attempt + 1}/${maxRetries})...`,
+        );
+      } else {
+        console.error("All attempts to send email failed.");
+      }
+    }
+  }
+
+  return success;
+};
+
+const parseMultipartFormData = (body, boundary) => {
+  const parts = body.split(`--${boundary}`).filter((part) => part.trim());
+  const formData = {};
+
+  parts.forEach((part) => {
+    const [headers, value] = part.split("\r\n\r\n");
+    const nameMatch = headers.match(/name="(.+?)"/);
+    if (nameMatch) {
+      const name = nameMatch[1];
+      formData[name] = value.trim().replace(/\r\n$/, "");
+    }
+  });
+
+  return formData;
+};
+
+export async function handler(event, context) {
+  const supabaseUrl = process.env.SUPABASE_URL;
+  const supabaseKey = process.env.SUPABASE_KEY;
+  const FORWARDEMAIL_API_KEY = process.env.FORWARDEMAIL_API_KEY;
+  const ACCOUNT_ID_PLEX = process.env.ACCOUNT_ID_PLEX;
+  const authHeader = "Basic " + btoa(`${FORWARDEMAIL_API_KEY}:`);
+  const supabase = createClient(supabaseUrl, supabaseKey);
+
+  let id;
+
+  try {
+    const queryParams = new URLSearchParams(event.queryStringParameters || {});
+    id = queryParams.get("id");
+
+    if (!id || id !== ACCOUNT_ID_PLEX)
+      return {
+        statusCode: 403,
+        body: JSON.stringify({
+          status: "Forbidden",
+          message: "Invalid or missing ID",
+        }),
+      };
+  } catch (error) {
+    console.error("Error parsing query parameters.");
+
+    return {
+      statusCode: 400,
+      body: JSON.stringify({
+        status: "Bad request",
+        message: "Oops! Bad request.",
+      }),
+    };
+  }
+
+  const contentType = event.headers["content-type"] || "";
+  if (!contentType.includes("multipart/form-data"))
+    return {
+      statusCode: 400,
+      body: JSON.stringify({
+        status: "Bad request",
+        message: "Invalid Content-Type. Expected multipart/form-data.",
+      }),
+    };
+
+  try {
+    const boundary = contentType.split("boundary=")[1];
+    if (!boundary) throw new Error("Missing boundary in Content-Type");
+
+    const rawBody = Buffer.from(event.body, "base64").toString("utf-8");
+    const formData = parseMultipartFormData(rawBody, boundary);
+    const payload = JSON.parse(formData.payload);
+    console.log("Parsed payload:", payload);
+
+    if (payload?.event === "media.scrobble") {
+      const artistName = payload["Metadata"]["grandparentTitle"];
+      const albumName = payload["Metadata"]["parentTitle"];
+      const trackName = payload["Metadata"]["title"];
+      const listenedAt = Math.floor(Date.now() / 1000);
+      const artistKey = sanitizeMediaString(artistName);
+      const albumKey = `${artistKey}-${sanitizeMediaString(albumName)}`;
+
+      let { data: artistData, error: artistError } = await supabase
+        .from("artists")
+        .select("*")
+        .ilike("name_string", artistName)
+        .single();
+
+      if (artistError && artistError.code === "PGRST116") {
+        const { error: insertArtistError } = await supabase
+          .from("artists")
+          .insert([
+            {
+              mbid: null,
+              art: "4cef75db-831f-4f5d-9333-79eaa5bb55ee",
+              name: artistName,
+              slug: "/music",
+              tentative: true,
+              total_plays: 0,
+            },
+          ]);
+
+        if (insertArtistError) {
+          console.error("Error inserting artist.");
+          return {
+            statusCode: 500,
+            body: JSON.stringify({
+              status: "error",
+              message: "Error inserting artist.",
+            }),
+          };
+        }
+
+        await sendEmail(
+          "New tentative artist record",
+          `A new tentative artist record was inserted:\n\nArtist: ${artistName}\nKey: ${artistKey}`,
+          authHeader,
+        );
+
+        ({ data: artistData, error: artistError } = await supabase
+          .from("artists")
+          .select("*")
+          .ilike("name_string", artistName)
+          .single());
+      }
+
+      if (artistError) {
+        console.error("Artist not found or created.");
+        return {
+          statusCode: 500,
+          body: JSON.stringify({
+            status: "error",
+            message: "Artist not found",
+          }),
+        };
+      }
+
+      let { data: albumData, error: albumError } = await supabase
+        .from("albums")
+        .select("*")
+        .ilike("key", albumKey)
+        .single();
+
+      if (albumError && albumError.code === "PGRST116") {
+        console.log("Inserting new album:", albumName);
+        const { error: insertAlbumError } = await supabase
+          .from("albums")
+          .insert([
+            {
+              mbid: null,
+              art: "4cef75db-831f-4f5d-9333-79eaa5bb55ee",
+              key: albumKey,
+              name: albumName,
+              tentative: true,
+              total_plays: 0,
+              artist: artistData.id,
+            },
+          ]);
+
+        if (insertAlbumError) {
+          console.error("Error inserting album.");
+          return {
+            statusCode: 500,
+            body: JSON.stringify({
+              status: "error",
+              message: "Error inserting album.",
+            }),
+          };
+        }
+
+        await sendEmail(
+          "New tentative album record",
+          `A new tentative album record was inserted:\n\nAlbum: ${albumName}\nKey: ${albumKey}\nArtist: ${artistName}`,
+          authHeader,
+        );
+
+        ({ data: albumData, error: albumError } = await supabase
+          .from("albums")
+          .select("*")
+          .ilike("key", albumKey)
+          .single());
+      }
+
+      if (albumError) {
+        console.error("Album not found or created.");
+        return {
+          statusCode: 500,
+          body: JSON.stringify({ status: "error", message: "Album not found" }),
+        };
+      }
+
+      const { error: listenError } = await supabase.from("listens").insert([
+        {
+          artist_name: artistData.name_string || artistName,
+          album_name: albumData.name || albumName,
+          track_name: trackName,
+          listened_at: listenedAt,
+          album_key: albumKey,
+        },
+      ]);
+
+      if (listenError) {
+        console.error("Error inserting listen.");
+        return {
+          statusCode: 500,
+          body: JSON.stringify({
+            status: "error",
+            message: "Error inserting listen.",
+          }),
+        };
+      }
+
+      console.log("Listen record inserted successfully");
+    }
+
+    return {
+      statusCode: 200,
+      body: JSON.stringify({ status: "success" }),
+    };
+  } catch (e) {
+    console.error("Error occurred during request processing:", e.message, e.stack);
+    return {
+      statusCode: 500,
+      body: JSON.stringify({ status: "error", message: "Oops! Error." }),
+    };
+  }
+}
diff --git a/functions/search.js b/functions/search.js
new file mode 100644
index 0000000..ee2fbaa
--- /dev/null
+++ b/functions/search.js
@@ -0,0 +1,53 @@
+import { createClient } from "@supabase/supabase-js";
+
+export async function handler(event, context) {
+  const supabaseUrl = process.env.SUPABASE_URL;
+  const supabaseKey = process.env.SUPABASE_KEY;
+  const supabase = createClient(supabaseUrl, supabaseKey);
+
+  try {
+    const searchParams = event.queryStringParameters || {};
+    const query = searchParams.q?.trim() || "";
+    const rawTypes = searchParams.type || "";
+    const types = rawTypes ? rawTypes.split(",") : null;
+    const page = parseInt(searchParams.page || "1", 10);
+    const pageSize = parseInt(searchParams.pageSize || "10", 10);
+    const offset = (page - 1) * pageSize;
+
+    if (!query) throw new Error("Missing or invalid 'q' parameter");
+
+    const { data, error } = await supabase.rpc("search_optimized_index", {
+      search_query: query,
+      page_size: pageSize,
+      page_offset: offset,
+      types: types && types.length ? types : null,
+    });
+
+    if (error) {
+      console.error("Error fetching search data:", error.message);
+      return {
+        statusCode: 500,
+        body: JSON.stringify({
+          results: [],
+          total: 0,
+          error: error.message,
+        }),
+      };
+    }
+
+    const total = data.length > 0 ? data[0].total_count : 0;
+    const results = data.map(({ total_count, ...item }) => item);
+
+    return {
+      statusCode: 200,
+      headers: { "Content-Type": "application/json" },
+      body: JSON.stringify({ results, total, page, pageSize }),
+    };
+  } catch (error) {
+    console.error("Unexpected error:", error.message);
+    return {
+      statusCode: error.message.includes("Missing or invalid") ? 400 : 500,
+      body: JSON.stringify({ error: error.message }),
+    };
+  }
+}
diff --git a/netlify.toml b/netlify.toml
new file mode 100644
index 0000000..d1f33c2
--- /dev/null
+++ b/netlify.toml
@@ -0,0 +1,38 @@
+[build]
+command = "npm run build"
+publish = "dist"
+
+[functions]
+directory = "functions"
+
+[functions.mastodon]
+schedule = "*/15 * * * *"
+
+[[redirects]]
+from = "/api/artist-import"
+to = "/.netlify/functions/artist-import"
+status = 200
+
+[[redirects]]
+from = "/api/scrobble"
+to = "/.netlify/functions/scrobble"
+status = 200
+query = "*"
+
+[[redirects]]
+from = "/api/search"
+to = "/.netlify/functions/search"
+status = 200
+query = "*"
+
+[[redirects]]
+from = "/scripts/util.js"
+to = "https://plausible.io/js/plausible.outbound-links.tagged-events.js"
+status = 200
+force = true
+
+[[redirects]]
+from = "/api/event"
+to = "https://plausible.io/api/event"
+status = 200
+force = true
diff --git a/package-lock.json b/package-lock.json
index 17c8c4d..5899a40 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,35 +8,36 @@
       "name": "coryd.dev",
       "version": "1.5.1",
       "dependencies": {
-        "@astrojs/check": "0.9.4",
-        "@astrojs/cloudflare": "^11.2.0",
-        "@astrojs/rss": "4.0.9",
-        "@astrojs/sitemap": "3.2.1",
-        "@cdransf/astro-tabler-icons": "1.2.0",
+        "@astrojs/netlify": "^5.5.4",
         "@supabase/supabase-js": "^2.46.2",
         "astro": "4.16.16",
-        "astro-embed": "0.9.0",
-        "date-fns": "4.1.0",
-        "date-fns-tz": "3.2.0",
+        "cdn-cache-control": "^1.2.0",
         "highlight.js": "11.10.0",
-        "markdown-it": "14.1.0",
-        "markdown-it-anchor": "9.2.0",
-        "markdown-it-footnote": "4.0.0",
-        "minisearch": "7.1.1",
         "sanitize-html": "2.13.1",
-        "truncate-html": "1.1.2",
         "youtube-video-element": "^1.1.6"
       },
       "devDependencies": {
-        "dotenv": "16.4.5",
-        "dotenv-flow": "4.1.0",
+        "@astrojs/check": "0.9.4",
+        "@astrojs/rss": "4.0.9",
+        "@astrojs/sitemap": "3.2.1",
+        "@cdransf/astro-tabler-icons": "1.2.0",
+        "astro-embed": "0.9.0",
+        "date-fns": "4.1.0",
+        "date-fns-tz": "3.2.0",
+        "dotenv": "^16.4.5",
+        "dotenv-flow": "^4.1.0",
         "fast-xml-parser": "4.5.0",
         "html-to-text": "9.0.5",
         "i18n-iso-countries": "7.13.0",
         "ics": "^3.8.1",
+        "markdown-it": "14.1.0",
+        "markdown-it-anchor": "9.2.0",
+        "markdown-it-footnote": "4.0.0",
+        "minisearch": "7.1.1",
         "rimraf": "6.0.1",
         "slugify": "1.6.6",
-        "terser": "5.36.0"
+        "terser": "5.36.0",
+        "truncate-html": "1.1.2"
       }
     },
     "node_modules/@ampproject/remapping": {
@@ -56,6 +57,7 @@
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/@astro-community/astro-embed-baseline-status/-/astro-embed-baseline-status-0.1.2.tgz",
       "integrity": "sha512-u+3BwXCSjBIVW29MGTbdusRhRBhqcjHyE6dgBCsUK/nZ0BohP1Nfih8dB7YltTVZxgECakKWQWoSHabDbYteyA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@astro-community/astro-embed-utils": "^0.1.0"
@@ -68,6 +70,7 @@
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/@astro-community/astro-embed-bluesky/-/astro-embed-bluesky-0.1.2.tgz",
       "integrity": "sha512-DBTRxNOJuQO9BWLzML80lL92mA1vpc3TYkvTZPMCTTDF69szWpgzKBGUVbq7NZCbN4oigfj6IxJHLa3tBmbLyg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@atproto/api": "^0.13.14",
@@ -81,6 +84,7 @@
       "version": "0.8.0",
       "resolved": "https://registry.npmjs.org/@astro-community/astro-embed-integration/-/astro-embed-integration-0.8.0.tgz",
       "integrity": "sha512-WnBBikazuFDSslsYjJ5xGeQexMWYdGqpxpiHl0IiBJ9A51MYwDlBoHAtnXU8a5jkidneN8+BD/vLW5uFWf157A==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@astro-community/astro-embed-link-preview": "^0.2.0",
@@ -99,6 +103,7 @@
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/@astro-community/astro-embed-link-preview/-/astro-embed-link-preview-0.2.2.tgz",
       "integrity": "sha512-eZ/ORqtPCC3Z2cSH6UvOB1w9CBguEQUC4nFdyLmwHYIR3FhkutQgbaP7fgI1r+qUBDbXImpZjYxKS3RB4m/fOA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@astro-community/astro-embed-utils": "^0.1.1"
@@ -108,6 +113,7 @@
       "version": "0.5.8",
       "resolved": "https://registry.npmjs.org/@astro-community/astro-embed-twitter/-/astro-embed-twitter-0.5.8.tgz",
       "integrity": "sha512-O2ptQPw+DfipukK8czjJcTcyVgDsrs3OmrHbc3YmWRglaUTOpSTImzPo076POyNBSWjLaRKloul81DFiAMNjTA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@astro-community/astro-embed-utils": "^0.1.0"
@@ -120,6 +126,7 @@
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/@astro-community/astro-embed-utils/-/astro-embed-utils-0.1.3.tgz",
       "integrity": "sha512-eiMO+vfCdE9GtW6qE7X5Xl6YCKZDCoXJEWqRofQcoC3GHjqN2/WhJlnaxNVRq3demSO03UNtho57Em5p7o7AOA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "linkedom": "^0.14.26"
@@ -129,6 +136,7 @@
       "version": "0.3.10",
       "resolved": "https://registry.npmjs.org/@astro-community/astro-embed-vimeo/-/astro-embed-vimeo-0.3.10.tgz",
       "integrity": "sha512-H7v8BozWXG+EhIOn1DcNKLRO6z3bNXZVESUR25mNFiDd3Ue8MEzp8mWkBeRd6Y2onV9acxR34ZhXN36fsSb8bA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@astro-community/astro-embed-utils": "^0.1.2"
@@ -141,6 +149,7 @@
       "version": "0.5.6",
       "resolved": "https://registry.npmjs.org/@astro-community/astro-embed-youtube/-/astro-embed-youtube-0.5.6.tgz",
       "integrity": "sha512-/mRfCl/eTBUz0kmjD1psOy0qoDDBorVp0QumUacjFcIkBullYtbeFQ2ZGZ+3N/tA6cR/OIyzr2QA4dQXlY6USg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "lite-youtube-embed": "^0.3.3"
@@ -153,6 +162,7 @@
       "version": "0.9.4",
       "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.4.tgz",
       "integrity": "sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@astrojs/language-server": "^2.15.0",
@@ -167,27 +177,6 @@
         "typescript": "^5.0.0"
       }
     },
-    "node_modules/@astrojs/cloudflare": {
-      "version": "11.2.0",
-      "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-11.2.0.tgz",
-      "integrity": "sha512-XSDAYg2NJVo88GLD8kC20sG3ftQb446/+Jvqzd/wTxyLseMIioExdDNYCS51LmxG4De6YHphAF/f0AyyKItSjg==",
-      "license": "MIT",
-      "dependencies": {
-        "@astrojs/internal-helpers": "0.4.1",
-        "@astrojs/underscore-redirects": "^0.3.4",
-        "@cloudflare/workers-types": "^4.20241022.0",
-        "@inox-tools/astro-when": "^0.2.4",
-        "esbuild": "^0.21.5",
-        "estree-walker": "^3.0.3",
-        "magic-string": "^0.30.12",
-        "miniflare": "^3.20241018.0",
-        "tiny-glob": "^0.2.9",
-        "wrangler": "^3.82.0"
-      },
-      "peerDependencies": {
-        "astro": "^4.10.3"
-      }
-    },
     "node_modules/@astrojs/compiler": {
       "version": "2.10.3",
       "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.10.3.tgz",
@@ -204,6 +193,7 @@
       "version": "2.15.4",
       "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.15.4.tgz",
       "integrity": "sha512-JivzASqTPR2bao9BWsSc/woPHH7OGSGc9aMxXL4U6egVTqBycB3ZHdBJPuOCVtcGLrzdWTosAqVPz1BVoxE0+A==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@astrojs/compiler": "^2.10.3",
@@ -267,6 +257,23 @@
         "vfile": "^6.0.3"
       }
     },
+    "node_modules/@astrojs/netlify": {
+      "version": "5.5.4",
+      "resolved": "https://registry.npmjs.org/@astrojs/netlify/-/netlify-5.5.4.tgz",
+      "integrity": "sha512-nIjD8cC/lGCxTtBUDrG50YEwmsgNxGB1nMZS0wwT7tFlmT2iBpYkTz3G+wmpxH89Hzs1xuMs1s21IcITyuKqEw==",
+      "license": "MIT",
+      "dependencies": {
+        "@astrojs/internal-helpers": "0.4.1",
+        "@astrojs/underscore-redirects": "^0.3.4",
+        "@netlify/functions": "^2.8.0",
+        "@vercel/nft": "^0.27.4",
+        "esbuild": "^0.21.5",
+        "vite": "^5.4.8"
+      },
+      "peerDependencies": {
+        "astro": "^4.2.0"
+      }
+    },
     "node_modules/@astrojs/prism": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.1.0.tgz",
@@ -283,6 +290,7 @@
       "version": "4.0.9",
       "resolved": "https://registry.npmjs.org/@astrojs/rss/-/rss-4.0.9.tgz",
       "integrity": "sha512-W1qeLc/WP1vMS5xXa+BnaLU0paeSeGjN8RJVAoBaOIkQuKXjIUA9hvPno89heo73in5i67g40gy70oeeHMqp6A==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "fast-xml-parser": "^4.5.0",
@@ -293,6 +301,7 @@
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.2.1.tgz",
       "integrity": "sha512-uxMfO8f7pALq0ADL6Lk68UV6dNYjJ2xGUzyjjVj60JLBs5a6smtlkBYv3tQ0DzoqwS7c9n4FUx5lgv0yPo/fgA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "sitemap": "^8.0.0",
@@ -328,6 +337,7 @@
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.2.tgz",
       "integrity": "sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "yaml": "^2.5.0"
@@ -337,6 +347,7 @@
       "version": "0.13.18",
       "resolved": "https://registry.npmjs.org/@atproto/api/-/api-0.13.18.tgz",
       "integrity": "sha512-rrl5HhzGYWZ7fiC965TPBUOVItq9M4dxMb6qz8IvAVQliSkrJrKc7UD0QWL89QiiXaOBuX8w+4i5r4wrfBGddg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@atproto/common-web": "^0.3.1",
@@ -353,6 +364,7 @@
       "version": "0.3.1",
       "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.3.1.tgz",
       "integrity": "sha512-N7wiTnus5vAr+lT//0y8m/FaHHLJ9LpGuEwkwDAeV3LCiPif4m/FS8x/QOYrx1PdZQwKso95RAPzCGWQBH5j6Q==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "graphemer": "^1.4.0",
@@ -365,6 +377,7 @@
       "version": "0.4.3",
       "resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.3.tgz",
       "integrity": "sha512-lFVZXe1S1pJP0dcxvJuHP3r/a+EAIBwwU7jUK+r8iLhIja+ml6NmYv8KeFHmIJATh03spEQ9s02duDmFVdCoXg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@atproto/common-web": "^0.3.1",
@@ -378,12 +391,14 @@
       "version": "0.3.1",
       "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.3.1.tgz",
       "integrity": "sha512-fzW0Mg1QUOVCWUD3RgEsDt6d1OZ6DdFmbKcDdbzUfh0t4rhtRAC05KbZYmxuMPWDAiJ4BbbQ5dkAc/mNypMXkw==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/@atproto/xrpc": {
       "version": "0.6.4",
       "resolved": "https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.6.4.tgz",
       "integrity": "sha512-9ZAJ8nsXTqC4XFyS0E1Wlg7bAvonhXQNQ3Ocs1L1LIwFLXvsw/4fNpIHXxvXvqTCVeyHLbImOnE9UiO1c/qIYA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@atproto/lexicon": "^0.4.3",
@@ -682,145 +697,14 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@cdransf/astro-tabler-icons/-/astro-tabler-icons-1.2.0.tgz",
       "integrity": "sha512-hhQAz92ARR2aPr92ARW0ah2BARy1ntjX89eB83k/Z9AGmBtuS+4OOJqPvewAS/r3e45AwDJCQRBrc28XlPsQxg==",
+      "dev": true,
       "license": "MIT"
     },
-    "node_modules/@cloudflare/kv-asset-handler": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz",
-      "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==",
-      "license": "MIT OR Apache-2.0",
-      "dependencies": {
-        "mime": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=16.13"
-      }
-    },
-    "node_modules/@cloudflare/workerd-darwin-64": {
-      "version": "1.20241106.1",
-      "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20241106.1.tgz",
-      "integrity": "sha512-zxvaToi1m0qzAScrxFt7UvFVqU8DxrCO2CinM1yQkv5no7pA1HolpIrwZ0xOhR3ny64Is2s/J6BrRjpO5dM9Zw==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "Apache-2.0",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/@cloudflare/workerd-darwin-arm64": {
-      "version": "1.20241106.1",
-      "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20241106.1.tgz",
-      "integrity": "sha512-j3dg/42D/bPgfNP3cRUBxF+4waCKO/5YKwXNj+lnVOwHxDu+ne5pFw9TIkKYcWTcwn0ZUkbNZNM5rhJqRn4xbg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "Apache-2.0",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/@cloudflare/workerd-linux-64": {
-      "version": "1.20241106.1",
-      "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20241106.1.tgz",
-      "integrity": "sha512-Ih+Ye8E1DMBXcKrJktGfGztFqHKaX1CeByqshmTbODnWKHt6O65ax3oTecUwyC0+abuyraOpAtdhHNpFMhUkmw==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "Apache-2.0",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/@cloudflare/workerd-linux-arm64": {
-      "version": "1.20241106.1",
-      "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20241106.1.tgz",
-      "integrity": "sha512-mdQFPk4+14Yywn7n1xIzI+6olWM8Ybz10R7H3h+rk0XulMumCWUCy1CzIDauOx6GyIcSgKIibYMssVHZR30ObA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "Apache-2.0",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/@cloudflare/workerd-windows-64": {
-      "version": "1.20241106.1",
-      "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20241106.1.tgz",
-      "integrity": "sha512-4rtcss31E/Rb/PeFocZfr+B9i1MdrkhsTBWizh8siNR4KMmkslU2xs2wPaH1z8+ErxkOsHrKRa5EPLh5rIiFeg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "Apache-2.0",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/@cloudflare/workers-shared": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/@cloudflare/workers-shared/-/workers-shared-0.9.0.tgz",
-      "integrity": "sha512-eP6Ir45uPbKnpADVzUCtkRUYxYxjB1Ew6n/whTJvHu8H4m93USHAceCMm736VBZdlxuhXXUjEP3fCUxKPn+cfw==",
-      "license": "MIT OR Apache-2.0",
-      "dependencies": {
-        "mime": "^3.0.0",
-        "zod": "^3.22.3"
-      },
-      "engines": {
-        "node": ">=16.7.0"
-      }
-    },
-    "node_modules/@cloudflare/workers-types": {
-      "version": "4.20241127.0",
-      "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20241127.0.tgz",
-      "integrity": "sha512-UqlvtqV8eI0CdPR7nxlbVlE52+lcjHvGdbYXEPwisy23+39RsFV7OOy0da0moJAhqnL2OhDmWTOaKdsVcPHiJQ==",
-      "license": "MIT OR Apache-2.0"
-    },
-    "node_modules/@cspotcode/source-map-support": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
-      "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/trace-mapping": "0.3.9"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.9",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
-      "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/resolve-uri": "^3.0.3",
-        "@jridgewell/sourcemap-codec": "^1.4.10"
-      }
-    },
     "node_modules/@emmetio/abbreviation": {
       "version": "2.3.3",
       "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz",
       "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@emmetio/scanner": "^1.0.4"
@@ -830,6 +714,7 @@
       "version": "2.1.8",
       "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz",
       "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@emmetio/scanner": "^1.0.4"
@@ -839,6 +724,7 @@
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/@emmetio/css-parser/-/css-parser-0.4.0.tgz",
       "integrity": "sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@emmetio/stream-reader": "^2.2.0",
@@ -849,6 +735,7 @@
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/@emmetio/html-matcher/-/html-matcher-1.3.0.tgz",
       "integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==",
+      "dev": true,
       "license": "ISC",
       "dependencies": {
         "@emmetio/scanner": "^1.0.0"
@@ -858,18 +745,21 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz",
       "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/@emmetio/stream-reader": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz",
       "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/@emmetio/stream-reader-utils": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz",
       "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/@emnapi/runtime": {
@@ -882,40 +772,6 @@
         "tslib": "^2.4.0"
       }
     },
-    "node_modules/@esbuild-plugins/node-globals-polyfill": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz",
-      "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==",
-      "license": "ISC",
-      "peerDependencies": {
-        "esbuild": "*"
-      }
-    },
-    "node_modules/@esbuild-plugins/node-modules-polyfill": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz",
-      "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==",
-      "license": "ISC",
-      "dependencies": {
-        "escape-string-regexp": "^4.0.0",
-        "rollup-plugin-node-polyfills": "^0.2.1"
-      },
-      "peerDependencies": {
-        "esbuild": "*"
-      }
-    },
-    "node_modules/@esbuild-plugins/node-modules-polyfill/node_modules/escape-string-regexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/@esbuild/aix-ppc64": {
       "version": "0.21.5",
       "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
@@ -1284,15 +1140,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/@fastify/busboy": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
-      "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=14"
-      }
-    },
     "node_modules/@img/sharp-darwin-arm64": {
       "version": "0.33.5",
       "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",
@@ -1654,19 +1501,6 @@
         "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/@inox-tools/astro-when": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/@inox-tools/astro-when/-/astro-when-0.2.4.tgz",
-      "integrity": "sha512-A1urUbru+Ni7UnsWui0Cq3rGXE75XsiVmU3vmJXhA9duQ4JyIYxLZALDSsqsT0pAzBrUWokZ09fALJ5eJUPtZQ==",
-      "license": "MIT",
-      "dependencies": {
-        "astro-integration-kit": "~0.16.1",
-        "debug": "^4.3.7"
-      },
-      "peerDependencies": {
-        "astro": "^4"
-      }
-    },
     "node_modules/@isaacs/cliui": {
       "version": "8.0.2",
       "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -1685,6 +1519,19 @@
         "node": ">=12"
       }
     },
+    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
     "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
       "version": "9.2.2",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -1710,6 +1557,22 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
     "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
       "version": "8.1.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
@@ -1787,6 +1650,76 @@
         "@jridgewell/sourcemap-codec": "^1.4.14"
       }
     },
+    "node_modules/@mapbox/node-pre-gyp": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
+      "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "detect-libc": "^2.0.0",
+        "https-proxy-agent": "^5.0.0",
+        "make-dir": "^3.1.0",
+        "node-fetch": "^2.6.7",
+        "nopt": "^5.0.0",
+        "npmlog": "^5.0.1",
+        "rimraf": "^3.0.2",
+        "semver": "^7.3.5",
+        "tar": "^6.1.11"
+      },
+      "bin": {
+        "node-pre-gyp": "bin/node-pre-gyp"
+      }
+    },
+    "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "license": "ISC",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@netlify/functions": {
+      "version": "2.8.2",
+      "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-2.8.2.tgz",
+      "integrity": "sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA==",
+      "license": "MIT",
+      "dependencies": {
+        "@netlify/serverless-functions-api": "1.26.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@netlify/node-cookies": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/@netlify/node-cookies/-/node-cookies-0.1.0.tgz",
+      "integrity": "sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==",
+      "license": "MIT",
+      "engines": {
+        "node": "^14.16.0 || >=16.0.0"
+      }
+    },
+    "node_modules/@netlify/serverless-functions-api": {
+      "version": "1.26.1",
+      "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.26.1.tgz",
+      "integrity": "sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw==",
+      "license": "MIT",
+      "dependencies": {
+        "@netlify/node-cookies": "^0.1.0",
+        "urlpattern-polyfill": "8.0.2"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -1850,16 +1783,10 @@
         }
       }
     },
-    "node_modules/@rollup/pluginutils/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-      "license": "MIT"
-    },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz",
-      "integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.0.tgz",
+      "integrity": "sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==",
       "cpu": [
         "arm"
       ],
@@ -1870,9 +1797,9 @@
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz",
-      "integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.0.tgz",
+      "integrity": "sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==",
       "cpu": [
         "arm64"
       ],
@@ -1883,9 +1810,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz",
-      "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.0.tgz",
+      "integrity": "sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==",
       "cpu": [
         "arm64"
       ],
@@ -1896,9 +1823,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz",
-      "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.0.tgz",
+      "integrity": "sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==",
       "cpu": [
         "x64"
       ],
@@ -1909,9 +1836,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz",
-      "integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.0.tgz",
+      "integrity": "sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==",
       "cpu": [
         "arm64"
       ],
@@ -1922,9 +1849,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz",
-      "integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.0.tgz",
+      "integrity": "sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==",
       "cpu": [
         "x64"
       ],
@@ -1935,9 +1862,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz",
-      "integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.0.tgz",
+      "integrity": "sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==",
       "cpu": [
         "arm"
       ],
@@ -1948,9 +1875,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz",
-      "integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.0.tgz",
+      "integrity": "sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==",
       "cpu": [
         "arm"
       ],
@@ -1961,9 +1888,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz",
-      "integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.0.tgz",
+      "integrity": "sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==",
       "cpu": [
         "arm64"
       ],
@@ -1974,9 +1901,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz",
-      "integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.0.tgz",
+      "integrity": "sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==",
       "cpu": [
         "arm64"
       ],
@@ -1987,9 +1914,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz",
-      "integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.0.tgz",
+      "integrity": "sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==",
       "cpu": [
         "ppc64"
       ],
@@ -2000,9 +1927,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz",
-      "integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.0.tgz",
+      "integrity": "sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==",
       "cpu": [
         "riscv64"
       ],
@@ -2013,9 +1940,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz",
-      "integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.0.tgz",
+      "integrity": "sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==",
       "cpu": [
         "s390x"
       ],
@@ -2026,9 +1953,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz",
-      "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.0.tgz",
+      "integrity": "sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==",
       "cpu": [
         "x64"
       ],
@@ -2039,9 +1966,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz",
-      "integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.0.tgz",
+      "integrity": "sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==",
       "cpu": [
         "x64"
       ],
@@ -2052,9 +1979,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz",
-      "integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.0.tgz",
+      "integrity": "sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==",
       "cpu": [
         "arm64"
       ],
@@ -2065,9 +1992,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz",
-      "integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.0.tgz",
+      "integrity": "sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==",
       "cpu": [
         "ia32"
       ],
@@ -2078,9 +2005,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz",
-      "integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.0.tgz",
+      "integrity": "sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==",
       "cpu": [
         "x64"
       ],
@@ -2304,6 +2231,7 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
       "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+      "dev": true,
       "license": "MIT",
       "peer": true
     },
@@ -2311,6 +2239,7 @@
       "version": "14.1.2",
       "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
       "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
+      "dev": true,
       "license": "MIT",
       "peer": true,
       "dependencies": {
@@ -2331,6 +2260,7 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
       "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+      "dev": true,
       "license": "MIT",
       "peer": true
     },
@@ -2358,15 +2288,6 @@
         "undici-types": "~6.20.0"
       }
     },
-    "node_modules/@types/node-forge": {
-      "version": "1.3.11",
-      "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
-      "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
     "node_modules/@types/phoenix": {
       "version": "1.6.6",
       "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.6.tgz",
@@ -2377,6 +2298,7 @@
       "version": "1.2.7",
       "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz",
       "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@types/node": "*"
@@ -2403,10 +2325,37 @@
       "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
       "license": "ISC"
     },
+    "node_modules/@vercel/nft": {
+      "version": "0.27.7",
+      "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.7.tgz",
+      "integrity": "sha512-FG6H5YkP4bdw9Ll1qhmbxuE8KwW2E/g8fJpM183fWQLeVDGqzeywMIeJ9h2txdWZ03psgWMn6QymTxaDLmdwUg==",
+      "license": "MIT",
+      "dependencies": {
+        "@mapbox/node-pre-gyp": "^1.0.11",
+        "@rollup/pluginutils": "^5.1.3",
+        "acorn": "^8.6.0",
+        "acorn-import-attributes": "^1.9.5",
+        "async-sema": "^3.1.1",
+        "bindings": "^1.4.0",
+        "estree-walker": "2.0.2",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.2.9",
+        "micromatch": "^4.0.8",
+        "node-gyp-build": "^4.2.2",
+        "resolve-from": "^5.0.0"
+      },
+      "bin": {
+        "nft": "out/cli.js"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
     "node_modules/@volar/kit": {
       "version": "2.4.10",
       "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.10.tgz",
       "integrity": "sha512-ul+rLeO9RlFDgkY/FhPWMnpFqAsjvjkKz8VZeOY5YCJMwTblmmSBlNJtFNxSBx9t/k1q80nEthLyxiJ50ZbIAg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@volar/language-service": "2.4.10",
@@ -2423,6 +2372,7 @@
       "version": "2.4.10",
       "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.10.tgz",
       "integrity": "sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@volar/source-map": "2.4.10"
@@ -2432,6 +2382,7 @@
       "version": "2.4.10",
       "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.10.tgz",
       "integrity": "sha512-odQsgrJh8hOXfxkSj/BSnpjThb2/KDhbxZnG/XAEx6E3QGDQv4hAOz9GWuKoNs0tkjgwphQGIwDMT1JYaTgRJw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@volar/language-core": "2.4.10",
@@ -2449,6 +2400,7 @@
       "version": "2.4.10",
       "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.10.tgz",
       "integrity": "sha512-VxUiWS11rnRzakkqw5x1LPhsz+RBfD0CrrFarLGW2/voliYXEdCuSOM3r8JyNRvMvP4uwhD38ccAdTcULQEAIQ==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@volar/language-core": "2.4.10",
@@ -2461,12 +2413,14 @@
       "version": "2.4.10",
       "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.10.tgz",
       "integrity": "sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/@volar/typescript": {
       "version": "2.4.10",
       "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.10.tgz",
       "integrity": "sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@volar/language-core": "2.4.10",
@@ -2478,6 +2432,7 @@
       "version": "2.11.0",
       "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz",
       "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "emmet": "^2.4.3",
@@ -2491,8 +2446,15 @@
       "version": "0.0.18",
       "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz",
       "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==",
+      "dev": true,
       "license": "MIT"
     },
+    "node_modules/abbrev": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+      "license": "ISC"
+    },
     "node_modules/acorn": {
       "version": "8.14.0",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
@@ -2505,22 +2467,32 @@
         "node": ">=0.4.0"
       }
     },
-    "node_modules/acorn-walk": {
-      "version": "8.3.4",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
-      "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
+    "node_modules/acorn-import-attributes": {
+      "version": "1.9.5",
+      "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
+      "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "acorn": "^8"
+      }
+    },
+    "node_modules/agent-base": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
       "license": "MIT",
       "dependencies": {
-        "acorn": "^8.11.0"
+        "debug": "4"
       },
       "engines": {
-        "node": ">=0.4.0"
+        "node": ">= 6.0.0"
       }
     },
     "node_modules/ajv": {
       "version": "8.17.1",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
       "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "fast-deep-equal": "^3.1.3",
@@ -2542,15 +2514,6 @@
         "string-width": "^4.1.0"
       }
     },
-    "node_modules/ansi-align/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/ansi-align/node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -2571,30 +2534,15 @@
         "node": ">=8"
       }
     },
-    "node_modules/ansi-align/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
       "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
       "engines": {
         "node": ">=8"
       }
     },
-    "node_modules/ansi-regex": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
-      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
-      }
-    },
     "node_modules/ansi-styles": {
       "version": "6.2.1",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
@@ -2607,10 +2555,31 @@
         "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
+    "node_modules/aproba": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+      "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
+      "license": "ISC"
+    },
+    "node_modules/are-we-there-yet": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
+      "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+      "deprecated": "This package is no longer supported.",
+      "license": "ISC",
+      "dependencies": {
+        "delegates": "^1.0.0",
+        "readable-stream": "^3.6.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/arg": {
       "version": "5.0.2",
       "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
       "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/argparse": {
@@ -2638,27 +2607,6 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
-    "node_modules/as-table": {
-      "version": "1.0.55",
-      "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz",
-      "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==",
-      "license": "MIT",
-      "dependencies": {
-        "printable-characters": "^1.0.42"
-      }
-    },
-    "node_modules/ast-types": {
-      "version": "0.16.1",
-      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz",
-      "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==",
-      "license": "MIT",
-      "dependencies": {
-        "tslib": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/astro": {
       "version": "4.16.16",
       "resolved": "https://registry.npmjs.org/astro/-/astro-4.16.16.tgz",
@@ -2744,6 +2692,7 @@
       "version": "0.4.4",
       "resolved": "https://registry.npmjs.org/astro-auto-import/-/astro-auto-import-0.4.4.tgz",
       "integrity": "sha512-tiYe1hp+VusdiyaD3INgZgbvXEPamDFiURnQR5Niz+E9fWa6IHYjJ99TwGlHh/evfaXE/U/86jp9MRKWTuJU1A==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@types/node": "^18.0.0",
@@ -2760,6 +2709,7 @@
       "version": "18.19.67",
       "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.67.tgz",
       "integrity": "sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "undici-types": "~5.26.4"
@@ -2769,12 +2719,14 @@
       "version": "5.26.5",
       "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
       "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/astro-embed": {
       "version": "0.9.0",
       "resolved": "https://registry.npmjs.org/astro-embed/-/astro-embed-0.9.0.tgz",
       "integrity": "sha512-koBCZH8n1q7tyXW+s11mdwb5dFsv9kG8uMuF17CUIVFJWqwRxx7YCpa9o2P9PuPeWffsrwmdVJTl65kLLP2Uug==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@astro-community/astro-embed-baseline-status": "^0.1.0",
@@ -2789,23 +2741,26 @@
         "astro": "^2.0.0 || ^3.0.0-beta || ^4.0.0-beta || ^5.0.0-beta"
       }
     },
-    "node_modules/astro-integration-kit": {
-      "version": "0.16.1",
-      "resolved": "https://registry.npmjs.org/astro-integration-kit/-/astro-integration-kit-0.16.1.tgz",
-      "integrity": "sha512-N/iam0PAFrRT9azYZqscP1HowQhC77Dwlp912P0/72k+kwUVgO3m73F26XXukHYoZBsrHgrUrfsWBxuCH3kEUg==",
+    "node_modules/astro/node_modules/estree-walker": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
       "license": "MIT",
       "dependencies": {
-        "pathe": "^1.1.2",
-        "recast": "^0.23.7"
-      },
-      "peerDependencies": {
-        "astro": "^4.12.0"
+        "@types/estree": "^1.0.0"
       }
     },
+    "node_modules/async-sema": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz",
+      "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==",
+      "license": "MIT"
+    },
     "node_modules/await-lock": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz",
       "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/axobject-query": {
@@ -2831,7 +2786,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/base-64": {
@@ -2840,16 +2794,20 @@
       "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==",
       "license": "MIT"
     },
-    "node_modules/blake3-wasm": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz",
-      "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==",
-      "license": "MIT"
+    "node_modules/bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "license": "MIT",
+      "dependencies": {
+        "file-uri-to-path": "1.0.0"
+      }
     },
     "node_modules/boolbase": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
       "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+      "dev": true,
       "license": "ISC"
     },
     "node_modules/boxen": {
@@ -2875,13 +2833,13 @@
       }
     },
     "node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "license": "MIT",
       "dependencies": {
-        "balanced-match": "^1.0.0"
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
     "node_modules/braces": {
@@ -2967,16 +2925,6 @@
       ],
       "license": "CC-BY-4.0"
     },
-    "node_modules/capnp-ts": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz",
-      "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==",
-      "license": "MIT",
-      "dependencies": {
-        "debug": "^4.3.1",
-        "tslib": "^2.2.0"
-      }
-    },
     "node_modules/ccount": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
@@ -2987,6 +2935,12 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
+    "node_modules/cdn-cache-control": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/cdn-cache-control/-/cdn-cache-control-1.2.0.tgz",
+      "integrity": "sha512-om2lvdXD6Wg8gQYCEVx5zjBB+RlZqTOcv4t+4T/BSuLrwmTXIoAifKWi/yp3dhvbdwfEmpFeTk6muYsNOTT4Ow==",
+      "license": "MIT"
+    },
     "node_modules/chalk": {
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
@@ -3033,6 +2987,7 @@
       "version": "1.0.0-rc.12",
       "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
       "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "cheerio-select": "^2.1.0",
@@ -3054,6 +3009,7 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
       "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+      "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
         "boolbase": "^1.0.0",
@@ -3071,6 +3027,7 @@
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
       "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "readdirp": "^4.0.1"
@@ -3082,6 +3039,15 @@
         "url": "https://paulmillr.com/funding/"
       }
     },
+    "node_modules/chownr": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/ci-info": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz",
@@ -3140,6 +3106,7 @@
       "version": "8.0.1",
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
       "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+      "dev": true,
       "license": "ISC",
       "dependencies": {
         "string-width": "^4.2.0",
@@ -3150,19 +3117,11 @@
         "node": ">=12"
       }
     },
-    "node_modules/cliui/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/cliui/node_modules/ansi-styles": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "color-convert": "^2.0.1"
@@ -3178,12 +3137,14 @@
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/cliui/node_modules/string-width": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
@@ -3194,22 +3155,11 @@
         "node": ">=8"
       }
     },
-    "node_modules/cliui/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/cliui/node_modules/wrap-ansi": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.0.0",
@@ -3250,6 +3200,7 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "devOptional": true,
       "license": "MIT",
       "dependencies": {
         "color-name": "~1.1.4"
@@ -3262,6 +3213,7 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "devOptional": true,
       "license": "MIT"
     },
     "node_modules/color-string": {
@@ -3275,6 +3227,15 @@
         "simple-swizzle": "^0.2.2"
       }
     },
+    "node_modules/color-support": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+      "license": "ISC",
+      "bin": {
+        "color-support": "bin.js"
+      }
+    },
     "node_modules/comma-separated-tokens": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
@@ -3298,6 +3259,18 @@
       "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==",
       "license": "ISC"
     },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "license": "MIT"
+    },
+    "node_modules/console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+      "license": "ISC"
+    },
     "node_modules/convert-source-map": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -3332,6 +3305,7 @@
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
       "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+      "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
         "boolbase": "^1.0.0",
@@ -3348,12 +3322,14 @@
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz",
       "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/css-what": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
       "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+      "dev": true,
       "license": "BSD-2-Clause",
       "engines": {
         "node": ">= 6"
@@ -3378,18 +3354,14 @@
       "version": "0.5.0",
       "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
       "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
-      "license": "MIT"
-    },
-    "node_modules/data-uri-to-buffer": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz",
-      "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/date-fns": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
       "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
+      "dev": true,
       "license": "MIT",
       "funding": {
         "type": "github",
@@ -3400,6 +3372,7 @@
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.2.0.tgz",
       "integrity": "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==",
+      "dev": true,
       "license": "MIT",
       "peerDependencies": {
         "date-fns": "^3.0.0 || ^4.0.0"
@@ -3444,10 +3417,10 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/defu": {
-      "version": "6.1.4",
-      "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
-      "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
+    "node_modules/delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
       "license": "MIT"
     },
     "node_modules/dequal": {
@@ -3464,7 +3437,6 @@
       "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
       "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
       "license": "Apache-2.0",
-      "optional": true,
       "engines": {
         "node": ">=8"
       }
@@ -3629,6 +3601,7 @@
       "version": "2.4.11",
       "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz",
       "integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==",
+      "dev": true,
       "license": "MIT",
       "workspaces": [
         "./packages/scanner",
@@ -3744,13 +3717,10 @@
       }
     },
     "node_modules/estree-walker": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
-      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/estree": "^1.0.0"
-      }
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+      "license": "MIT"
     },
     "node_modules/eventemitter3": {
       "version": "5.0.1",
@@ -3758,18 +3728,6 @@
       "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
       "license": "MIT"
     },
-    "node_modules/exit-hook": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz",
-      "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/extend": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -3792,6 +3750,7 @@
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/fast-glob": {
@@ -3814,12 +3773,14 @@
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz",
       "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==",
+      "dev": true,
       "license": "BSD-3-Clause"
     },
     "node_modules/fast-xml-parser": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz",
       "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -3847,6 +3808,12 @@
         "reusify": "^1.0.4"
       }
     },
+    "node_modules/file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+      "license": "MIT"
+    },
     "node_modules/fill-range": {
       "version": "7.1.1",
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@@ -3920,6 +3887,55 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/foreground-child/node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/fs-minipass": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "license": "ISC",
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/fs-minipass/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/fs-minipass/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "license": "ISC"
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "license": "ISC"
+    },
     "node_modules/fsevents": {
       "version": "2.3.3",
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -3934,13 +3950,45 @@
         "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
       }
     },
-    "node_modules/function-bind": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+    "node_modules/gauge": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+      "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+      "deprecated": "This package is no longer supported.",
+      "license": "ISC",
+      "dependencies": {
+        "aproba": "^1.0.3 || ^2.0.0",
+        "color-support": "^1.1.2",
+        "console-control-strings": "^1.0.0",
+        "has-unicode": "^2.0.1",
+        "object-assign": "^4.1.1",
+        "signal-exit": "^3.0.0",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1",
+        "wide-align": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/gauge/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "license": "MIT"
+    },
+    "node_modules/gauge/node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
     "node_modules/gensync": {
@@ -3956,6 +4004,7 @@
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
       "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "dev": true,
       "license": "ISC",
       "engines": {
         "node": "6.* || 8.* || >= 10.*"
@@ -3973,16 +4022,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/get-source": {
-      "version": "2.0.12",
-      "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz",
-      "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==",
-      "license": "Unlicense",
-      "dependencies": {
-        "data-uri-to-buffer": "^2.0.0",
-        "source-map": "^0.6.1"
-      }
-    },
     "node_modules/github-slugger": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
@@ -3990,24 +4029,21 @@
       "license": "ISC"
     },
     "node_modules/glob": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz",
-      "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==",
-      "dev": true,
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "license": "ISC",
       "dependencies": {
-        "foreground-child": "^3.1.0",
-        "jackspeak": "^4.0.1",
-        "minimatch": "^10.0.0",
-        "minipass": "^7.1.2",
-        "package-json-from-dist": "^1.0.0",
-        "path-scurry": "^2.0.0"
-      },
-      "bin": {
-        "glob": "dist/esm/bin.mjs"
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
       },
       "engines": {
-        "node": "20 || >=22"
+        "node": "*"
       },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
@@ -4025,12 +4061,6 @@
         "node": ">= 6"
       }
     },
-    "node_modules/glob-to-regexp": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
-      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
-      "license": "BSD-2-Clause"
-    },
     "node_modules/globals": {
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -4040,18 +4070,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/globalyzer": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
-      "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==",
-      "license": "MIT"
-    },
-    "node_modules/globrex": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
-      "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
-      "license": "MIT"
-    },
     "node_modules/graceful-fs": {
       "version": "4.2.11",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -4062,6 +4080,7 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
       "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/gray-matter": {
@@ -4101,17 +4120,11 @@
         "js-yaml": "bin/js-yaml.js"
       }
     },
-    "node_modules/hasown": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
-      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
-      "license": "MIT",
-      "dependencies": {
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
+    "node_modules/has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+      "license": "ISC"
     },
     "node_modules/hast-util-from-html": {
       "version": "2.0.3",
@@ -4381,6 +4394,19 @@
       "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
       "license": "BSD-2-Clause"
     },
+    "node_modules/https-proxy-agent": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+      "license": "MIT",
+      "dependencies": {
+        "agent-base": "6",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/i18n-iso-countries": {
       "version": "7.13.0",
       "resolved": "https://registry.npmjs.org/i18n-iso-countries/-/i18n-iso-countries-7.13.0.tgz",
@@ -4416,6 +4442,23 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+      "license": "ISC",
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "license": "ISC"
+    },
     "node_modules/is-arrayish": {
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
@@ -4423,21 +4466,6 @@
       "license": "MIT",
       "optional": true
     },
-    "node_modules/is-core-module": {
-      "version": "2.15.1",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
-      "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
-      "license": "MIT",
-      "dependencies": {
-        "hasown": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/is-docker": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
@@ -4590,12 +4618,7 @@
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/iso-datestring-validator/-/iso-datestring-validator-2.2.2.tgz",
       "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==",
-      "license": "MIT"
-    },
-    "node_modules/itty-time": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/itty-time/-/itty-time-1.0.6.tgz",
-      "integrity": "sha512-+P8IZaLLBtFv8hCkIjcymZOp4UJ+xW6bSlQsXGqrkmJh7vSiMFSlNne0mCYagEE0N7HDNR5jJBRxwN0oYv61Rw==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/jackspeak": {
@@ -4648,6 +4671,7 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/json5": {
@@ -4666,6 +4690,7 @@
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz",
       "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/kind-of": {
@@ -4700,6 +4725,7 @@
       "version": "0.14.26",
       "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.14.26.tgz",
       "integrity": "sha512-mK6TrydfFA7phrnp+1j57ycBwFI5bGSW6YXlw9acHoqF+mP/y+FooEYYyniOt5Ot57FSKB3iwmnuQ1UUyNLm5A==",
+      "dev": true,
       "license": "ISC",
       "dependencies": {
         "css-select": "^5.1.0",
@@ -4713,6 +4739,7 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
       "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "uc.micro": "^2.0.0"
@@ -4722,6 +4749,7 @@
       "version": "0.3.3",
       "resolved": "https://registry.npmjs.org/lite-youtube-embed/-/lite-youtube-embed-0.3.3.tgz",
       "integrity": "sha512-gFfVVnj6NRjxVfJKo3qoLtpi0v5mn3AcR4eKD45wrxQuxzveFJUb+7Cr6uV6n+DjO8X3p0UzPPquhGt0H/y+NA==",
+      "dev": true,
       "license": "Apache-2.0"
     },
     "node_modules/load-yaml-file": {
@@ -4777,6 +4805,7 @@
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/log-symbols": {
@@ -4846,10 +4875,35 @@
         "source-map-js": "^1.2.0"
       }
     },
+    "node_modules/make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "license": "MIT",
+      "dependencies": {
+        "semver": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/make-dir/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
     "node_modules/markdown-it": {
       "version": "14.1.0",
       "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
       "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "argparse": "^2.0.1",
@@ -4867,6 +4921,7 @@
       "version": "9.2.0",
       "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-9.2.0.tgz",
       "integrity": "sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg==",
+      "dev": true,
       "license": "Unlicense",
       "peerDependencies": {
         "@types/markdown-it": "*",
@@ -4877,6 +4932,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-4.0.0.tgz",
       "integrity": "sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/markdown-table": {
@@ -5136,6 +5192,7 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
       "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/merge2": {
@@ -5735,18 +5792,6 @@
         "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
-    "node_modules/mime": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
-      "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
-      "license": "MIT",
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
     "node_modules/mimic-function": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
@@ -5759,64 +5804,77 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/miniflare": {
-      "version": "3.20241106.1",
-      "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20241106.1.tgz",
-      "integrity": "sha512-dM3RBlJE8rUFxnqlPCaFCq0E7qQqEQvKbYX7W/APGCK+rLcyLmEBzC4GQR/niXdNM/oV6gdg9AA50ghnn2ALuw==",
-      "license": "MIT",
-      "dependencies": {
-        "@cspotcode/source-map-support": "0.8.1",
-        "acorn": "^8.8.0",
-        "acorn-walk": "^8.2.0",
-        "capnp-ts": "^0.7.0",
-        "exit-hook": "^2.2.1",
-        "glob-to-regexp": "^0.4.1",
-        "stoppable": "^1.1.0",
-        "undici": "^5.28.4",
-        "workerd": "1.20241106.1",
-        "ws": "^8.18.0",
-        "youch": "^3.2.2",
-        "zod": "^3.22.3"
-      },
-      "bin": {
-        "miniflare": "bootstrap.js"
-      },
-      "engines": {
-        "node": ">=16.13"
-      }
-    },
     "node_modules/minimatch": {
-      "version": "10.0.1",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
-      "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
-      "dev": true,
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "license": "ISC",
       "dependencies": {
-        "brace-expansion": "^2.0.1"
+        "brace-expansion": "^1.1.7"
       },
       "engines": {
-        "node": "20 || >=22"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
+        "node": "*"
       }
     },
     "node_modules/minipass": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
-      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
-      "dev": true,
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+      "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
       "license": "ISC",
       "engines": {
-        "node": ">=16 || 14 >=14.17"
+        "node": ">=8"
       }
     },
     "node_modules/minisearch": {
       "version": "7.1.1",
       "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.1.tgz",
       "integrity": "sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==",
+      "dev": true,
       "license": "MIT"
     },
+    "node_modules/minizlib": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+      "license": "MIT",
+      "dependencies": {
+        "minipass": "^3.0.0",
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/minizlib/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/minizlib/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "license": "ISC"
+    },
+    "node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "license": "MIT",
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/mrmime": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz",
@@ -5836,23 +5894,16 @@
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
       "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/multiformats": {
       "version": "9.9.0",
       "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
       "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==",
+      "dev": true,
       "license": "(Apache-2.0 AND MIT)"
     },
-    "node_modules/mustache": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
-      "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
-      "license": "MIT",
-      "bin": {
-        "mustache": "bin/mustache"
-      }
-    },
     "node_modules/nanoid": {
       "version": "3.3.8",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
@@ -5893,13 +5944,35 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/node-forge": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
-      "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
-      "license": "(BSD-3-Clause OR GPL-2.0)",
+    "node_modules/node-fetch": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+      "license": "MIT",
+      "dependencies": {
+        "whatwg-url": "^5.0.0"
+      },
       "engines": {
-        "node": ">= 6.13.0"
+        "node": "4.x || >=6.0.0"
+      },
+      "peerDependencies": {
+        "encoding": "^0.1.0"
+      },
+      "peerDependenciesMeta": {
+        "encoding": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/node-gyp-build": {
+      "version": "4.8.4",
+      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
+      "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
+      "license": "MIT",
+      "bin": {
+        "node-gyp-build": "bin.js",
+        "node-gyp-build-optional": "optional.js",
+        "node-gyp-build-test": "build-test.js"
       }
     },
     "node_modules/node-releases": {
@@ -5908,10 +5981,39 @@
       "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
       "license": "MIT"
     },
+    "node_modules/nopt": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+      "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+      "license": "ISC",
+      "dependencies": {
+        "abbrev": "1"
+      },
+      "bin": {
+        "nopt": "bin/nopt.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/npmlog": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
+      "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+      "deprecated": "This package is no longer supported.",
+      "license": "ISC",
+      "dependencies": {
+        "are-we-there-yet": "^2.0.0",
+        "console-control-strings": "^1.1.0",
+        "gauge": "^3.0.0",
+        "set-blocking": "^2.0.0"
+      }
+    },
     "node_modules/nth-check": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
       "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+      "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
         "boolbase": "^1.0.0"
@@ -5920,11 +6022,23 @@
         "url": "https://github.com/fb55/nth-check?sponsor=1"
       }
     },
-    "node_modules/ohash": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.4.tgz",
-      "integrity": "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==",
-      "license": "MIT"
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "license": "ISC",
+      "dependencies": {
+        "wrappy": "1"
+      }
     },
     "node_modules/onetime": {
       "version": "7.0.0",
@@ -5975,6 +6089,33 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/ora/node_modules/ansi-regex": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/ora/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
     "node_modules/p-limit": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz",
@@ -6107,6 +6248,7 @@
       "version": "7.1.0",
       "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
       "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "domhandler": "^5.0.3",
@@ -6134,6 +6276,7 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
       "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/path-exists": {
@@ -6145,6 +6288,15 @@
         "node": ">=8"
       }
     },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/path-key": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -6155,12 +6307,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "license": "MIT"
-    },
     "node_modules/path-scurry": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
@@ -6188,17 +6334,15 @@
         "node": "20 || >=22"
       }
     },
-    "node_modules/path-to-regexp": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
-      "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
-      "license": "MIT"
-    },
-    "node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
-      "license": "MIT"
+    "node_modules/path-scurry/node_modules/minipass": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
     },
     "node_modules/peberminta": {
       "version": "0.9.0",
@@ -6295,6 +6439,7 @@
       "version": "3.4.1",
       "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz",
       "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==",
+      "dev": true,
       "license": "MIT",
       "optional": true,
       "peer": true,
@@ -6308,12 +6453,6 @@
         "url": "https://github.com/prettier/prettier?sponsor=1"
       }
     },
-    "node_modules/printable-characters": {
-      "version": "1.0.42",
-      "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz",
-      "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==",
-      "license": "Unlicense"
-    },
     "node_modules/prismjs": {
       "version": "1.29.0",
       "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
@@ -6366,6 +6505,7 @@
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
       "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=6"
@@ -6391,10 +6531,25 @@
       ],
       "license": "MIT"
     },
+    "node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/readdirp": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
       "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">= 14.16.0"
@@ -6404,22 +6559,6 @@
         "url": "https://paulmillr.com/funding/"
       }
     },
-    "node_modules/recast": {
-      "version": "0.23.9",
-      "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz",
-      "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==",
-      "license": "MIT",
-      "dependencies": {
-        "ast-types": "^0.16.1",
-        "esprima": "~4.0.0",
-        "source-map": "~0.6.1",
-        "tiny-invariant": "^1.3.3",
-        "tslib": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 4"
-      }
-    },
     "node_modules/regex": {
       "version": "5.0.2",
       "resolved": "https://registry.npmjs.org/regex/-/regex-5.0.2.tgz",
@@ -6590,12 +6729,14 @@
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz",
       "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
       "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
@@ -6605,35 +6746,19 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
       "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "node_modules/resolve": {
-      "version": "1.22.8",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
-      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
-      "license": "MIT",
-      "dependencies": {
-        "is-core-module": "^2.13.0",
-        "path-parse": "^1.0.7",
-        "supports-preserve-symlinks-flag": "^1.0.0"
-      },
-      "bin": {
-        "resolve": "bin/resolve"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/resolve.exports": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
-      "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
+    "node_modules/resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
       "license": "MIT",
       "engines": {
-        "node": ">=10"
+        "node": ">=8"
       }
     },
     "node_modules/restore-cursor": {
@@ -6652,6 +6777,18 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/restore-cursor/node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/retext": {
       "version": "9.0.0",
       "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz",
@@ -6743,10 +6880,70 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/rimraf/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/rimraf/node_modules/glob": {
+      "version": "11.0.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz",
+      "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^4.0.1",
+        "minimatch": "^10.0.0",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^2.0.0"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rimraf/node_modules/minimatch": {
+      "version": "10.0.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
+      "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rimraf/node_modules/minipass": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
     "node_modules/rollup": {
-      "version": "4.27.4",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz",
-      "integrity": "sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==",
+      "version": "4.28.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.0.tgz",
+      "integrity": "sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==",
       "license": "MIT",
       "dependencies": {
         "@types/estree": "1.0.6"
@@ -6759,78 +6956,27 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.27.4",
-        "@rollup/rollup-android-arm64": "4.27.4",
-        "@rollup/rollup-darwin-arm64": "4.27.4",
-        "@rollup/rollup-darwin-x64": "4.27.4",
-        "@rollup/rollup-freebsd-arm64": "4.27.4",
-        "@rollup/rollup-freebsd-x64": "4.27.4",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.27.4",
-        "@rollup/rollup-linux-arm-musleabihf": "4.27.4",
-        "@rollup/rollup-linux-arm64-gnu": "4.27.4",
-        "@rollup/rollup-linux-arm64-musl": "4.27.4",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.27.4",
-        "@rollup/rollup-linux-riscv64-gnu": "4.27.4",
-        "@rollup/rollup-linux-s390x-gnu": "4.27.4",
-        "@rollup/rollup-linux-x64-gnu": "4.27.4",
-        "@rollup/rollup-linux-x64-musl": "4.27.4",
-        "@rollup/rollup-win32-arm64-msvc": "4.27.4",
-        "@rollup/rollup-win32-ia32-msvc": "4.27.4",
-        "@rollup/rollup-win32-x64-msvc": "4.27.4",
+        "@rollup/rollup-android-arm-eabi": "4.28.0",
+        "@rollup/rollup-android-arm64": "4.28.0",
+        "@rollup/rollup-darwin-arm64": "4.28.0",
+        "@rollup/rollup-darwin-x64": "4.28.0",
+        "@rollup/rollup-freebsd-arm64": "4.28.0",
+        "@rollup/rollup-freebsd-x64": "4.28.0",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.28.0",
+        "@rollup/rollup-linux-arm-musleabihf": "4.28.0",
+        "@rollup/rollup-linux-arm64-gnu": "4.28.0",
+        "@rollup/rollup-linux-arm64-musl": "4.28.0",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.28.0",
+        "@rollup/rollup-linux-riscv64-gnu": "4.28.0",
+        "@rollup/rollup-linux-s390x-gnu": "4.28.0",
+        "@rollup/rollup-linux-x64-gnu": "4.28.0",
+        "@rollup/rollup-linux-x64-musl": "4.28.0",
+        "@rollup/rollup-win32-arm64-msvc": "4.28.0",
+        "@rollup/rollup-win32-ia32-msvc": "4.28.0",
+        "@rollup/rollup-win32-x64-msvc": "4.28.0",
         "fsevents": "~2.3.2"
       }
     },
-    "node_modules/rollup-plugin-inject": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz",
-      "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==",
-      "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.",
-      "license": "MIT",
-      "dependencies": {
-        "estree-walker": "^0.6.1",
-        "magic-string": "^0.25.3",
-        "rollup-pluginutils": "^2.8.1"
-      }
-    },
-    "node_modules/rollup-plugin-inject/node_modules/estree-walker": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
-      "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
-      "license": "MIT"
-    },
-    "node_modules/rollup-plugin-inject/node_modules/magic-string": {
-      "version": "0.25.9",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
-      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
-      "license": "MIT",
-      "dependencies": {
-        "sourcemap-codec": "^1.4.8"
-      }
-    },
-    "node_modules/rollup-plugin-node-polyfills": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz",
-      "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==",
-      "license": "MIT",
-      "dependencies": {
-        "rollup-plugin-inject": "^3.0.0"
-      }
-    },
-    "node_modules/rollup-pluginutils": {
-      "version": "2.8.2",
-      "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
-      "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
-      "license": "MIT",
-      "dependencies": {
-        "estree-walker": "^0.6.1"
-      }
-    },
-    "node_modules/rollup-pluginutils/node_modules/estree-walker": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
-      "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
-      "license": "MIT"
-    },
     "node_modules/run-parallel": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -6861,6 +7007,26 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
     "node_modules/sanitize-html": {
       "version": "2.13.1",
       "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.13.1.tgz",
@@ -6891,6 +7057,7 @@
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
       "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+      "dev": true,
       "license": "ISC"
     },
     "node_modules/section-matter": {
@@ -6919,19 +7086,6 @@
         "url": "https://ko-fi.com/killymxi"
       }
     },
-    "node_modules/selfsigned": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
-      "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
-      "license": "MIT",
-      "dependencies": {
-        "@types/node-forge": "^1.3.0",
-        "node-forge": "^1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/semver": {
       "version": "7.6.3",
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
@@ -6944,6 +7098,12 @@
         "node": ">=10"
       }
     },
+    "node_modules/set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+      "license": "ISC"
+    },
     "node_modules/sharp": {
       "version": "0.33.5",
       "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
@@ -7022,16 +7182,10 @@
       }
     },
     "node_modules/signal-exit": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
-      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
-      "license": "ISC",
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "license": "ISC"
     },
     "node_modules/simple-swizzle": {
       "version": "0.2.2",
@@ -7053,6 +7207,7 @@
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.0.tgz",
       "integrity": "sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@types/node": "^17.0.5",
@@ -7072,6 +7227,7 @@
       "version": "17.0.45",
       "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
       "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/slugify": {
@@ -7088,6 +7244,7 @@
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "devOptional": true,
       "license": "BSD-3-Clause",
       "engines": {
         "node": ">=0.10.0"
@@ -7113,13 +7270,6 @@
         "source-map": "^0.6.0"
       }
     },
-    "node_modules/sourcemap-codec": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
-      "deprecated": "Please use @jridgewell/sourcemap-codec instead",
-      "license": "MIT"
-    },
     "node_modules/space-separated-tokens": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
@@ -7136,16 +7286,6 @@
       "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
       "license": "BSD-3-Clause"
     },
-    "node_modules/stacktracey": {
-      "version": "2.1.8",
-      "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz",
-      "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==",
-      "license": "Unlicense",
-      "dependencies": {
-        "as-table": "^1.0.36",
-        "get-source": "^2.0.12"
-      }
-    },
     "node_modules/stdin-discarder": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz",
@@ -7158,22 +7298,22 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/stoppable": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz",
-      "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4",
-        "npm": ">=6"
-      }
-    },
     "node_modules/stream-replace-string": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz",
       "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==",
+      "dev": true,
       "license": "MIT"
     },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
     "node_modules/string-width": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
@@ -7207,16 +7347,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/string-width-cjs/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/string-width-cjs/node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -7224,17 +7354,31 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/string-width-cjs/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
+    "node_modules/string-width/node_modules/ansi-regex": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/string-width/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
       "license": "MIT",
       "dependencies": {
-        "ansi-regex": "^5.0.1"
+        "ansi-regex": "^6.0.1"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
       }
     },
     "node_modules/stringify-entities": {
@@ -7252,18 +7396,15 @@
       }
     },
     "node_modules/strip-ansi": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
-      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "license": "MIT",
       "dependencies": {
-        "ansi-regex": "^6.0.1"
+        "ansi-regex": "^5.0.1"
       },
       "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+        "node": ">=8"
       }
     },
     "node_modules/strip-ansi-cjs": {
@@ -7280,16 +7421,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/strip-bom": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
@@ -7312,20 +7443,32 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
       "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
+      "dev": true,
       "license": "MIT"
     },
-    "node_modules/supports-preserve-symlinks-flag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
-      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
+    "node_modules/tar": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+      "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+      "license": "ISC",
+      "dependencies": {
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "minipass": "^5.0.0",
+        "minizlib": "^2.1.1",
+        "mkdirp": "^1.0.3",
+        "yallist": "^4.0.0"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+      "engines": {
+        "node": ">=10"
       }
     },
+    "node_modules/tar/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "license": "ISC"
+    },
     "node_modules/terser": {
       "version": "5.36.0",
       "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz",
@@ -7352,22 +7495,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/tiny-glob": {
-      "version": "0.2.9",
-      "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
-      "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
-      "license": "MIT",
-      "dependencies": {
-        "globalyzer": "0.1.0",
-        "globrex": "^0.1.2"
-      }
-    },
-    "node_modules/tiny-invariant": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
-      "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
-      "license": "MIT"
-    },
     "node_modules/tinyexec": {
       "version": "0.3.1",
       "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz",
@@ -7378,6 +7505,7 @@
       "version": "1.255.0",
       "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.255.0.tgz",
       "integrity": "sha512-tcwMRIioTcF/FcxLev8MJWxCp+GUALRhFEqbDoZrnowmKSGqPrl5pqS+Sut2m8BgJ6S4FExCSSpGffZ0Tks6Aw==",
+      "dev": true,
       "license": "MIT",
       "bin": {
         "tlds": "bin.js"
@@ -7432,6 +7560,7 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/truncate-html/-/truncate-html-1.1.2.tgz",
       "integrity": "sha512-BiLzO594/Quf0wu3jHnVxHA4X5tl4Gunhqe2mlGTa5ElwHJGw7M/N5JdBvU8OPtR+MaEIvmyUdNxnoEi3YI5Yg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "cheerio": "1.0.0-rc.12"
@@ -7441,6 +7570,7 @@
       "version": "5.5.0",
       "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.5.0.tgz",
       "integrity": "sha512-jqbIpTsa/KKTJYWgPNsFNbLVpwCgzXfFJ1ukNn4I8hMwyQzHMJnk/BqWzggB0xpkILuKzaO/aMYhS0SkaJyKXg==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/tsconfck": {
@@ -7467,7 +7597,8 @@
       "version": "2.8.1",
       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
       "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
-      "license": "0BSD"
+      "license": "0BSD",
+      "optional": true
     },
     "node_modules/type-fest": {
       "version": "4.29.0",
@@ -7485,6 +7616,7 @@
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/typesafe-path/-/typesafe-path-0.2.2.tgz",
       "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/typescript": {
@@ -7505,6 +7637,7 @@
       "version": "0.3.5",
       "resolved": "https://registry.npmjs.org/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.5.tgz",
       "integrity": "sha512-fAIveQKsoYj55CozUiBoj4b/7WpN0i4o74wiGY5JVUEoD0XiqDk1tJqTEjgzL2/AizKQrXxyRosSebyDzBZKjw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "semver": "^7.3.8"
@@ -7514,60 +7647,32 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
       "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
-      "license": "MIT"
-    },
-    "node_modules/ufo": {
-      "version": "1.5.4",
-      "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz",
-      "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/uhyphen": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz",
       "integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==",
+      "dev": true,
       "license": "ISC"
     },
     "node_modules/uint8arrays": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.0.0.tgz",
       "integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "multiformats": "^9.4.2"
       }
     },
-    "node_modules/undici": {
-      "version": "5.28.4",
-      "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
-      "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
-      "license": "MIT",
-      "dependencies": {
-        "@fastify/busboy": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=14.0"
-      }
-    },
     "node_modules/undici-types": {
       "version": "6.20.0",
       "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
       "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
       "license": "MIT"
     },
-    "node_modules/unenv": {
-      "name": "unenv-nightly",
-      "version": "2.0.0-20241121-161142-806b5c0",
-      "resolved": "https://registry.npmjs.org/unenv-nightly/-/unenv-nightly-2.0.0-20241121-161142-806b5c0.tgz",
-      "integrity": "sha512-RnFOasE/O0Q55gBkNB1b84OgKttgLEijGO0JCWpbn+O4XxpyCQg89NmcqQ5RGUiy4y+rMIrKzePTquQcLQF5pQ==",
-      "license": "MIT",
-      "dependencies": {
-        "defu": "^6.1.4",
-        "ohash": "^1.1.4",
-        "pathe": "^1.1.2",
-        "ufo": "^1.5.4"
-      }
-    },
     "node_modules/unified": {
       "version": "11.0.5",
       "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
@@ -7695,6 +7800,7 @@
       "version": "4.0.3",
       "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-4.0.3.tgz",
       "integrity": "sha512-1074+K9VyR3NyUz3lgNtHKm7ln+jSZXtLJM4E22uVuoFn88a/Go2pX8dusrt/W+KWH1ncn8jcd8uCQuvXb/fXA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@types/unist": "^2.0.0",
@@ -7816,6 +7922,18 @@
         "browserslist": ">= 4.21.0"
       }
     },
+    "node_modules/urlpattern-polyfill": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz",
+      "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==",
+      "license": "MIT"
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+      "license": "MIT"
+    },
     "node_modules/vfile": {
       "version": "6.0.3",
       "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
@@ -7957,6 +8075,7 @@
       "version": "0.0.62",
       "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.62.tgz",
       "integrity": "sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "vscode-css-languageservice": "^6.3.0",
@@ -7976,6 +8095,7 @@
       "version": "0.0.62",
       "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.62.tgz",
       "integrity": "sha512-U4dxWDBWz7Pi4plpbXf4J4Z/ss6kBO3TYrACxWNsE29abu75QzVS0paxDDhI6bhqpbDFXlpsDhZ9aXVFpnfGRQ==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@emmetio/css-parser": "^0.4.0",
@@ -7996,6 +8116,7 @@
       "version": "0.0.62",
       "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.62.tgz",
       "integrity": "sha512-Zw01aJsZRh4GTGUjveyfEzEqpULQUdQH79KNEiKVYHZyuGtdBRYCHlrus1sueSNMxwwkuF5WnOHfvBzafs8yyQ==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "vscode-html-languageservice": "^5.3.0",
@@ -8015,6 +8136,7 @@
       "version": "0.0.62",
       "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.62.tgz",
       "integrity": "sha512-h2yk1RqRTE+vkYZaI9KYuwpDfOQRrTEMvoHol0yW4GFKc75wWQRrb5n/5abDrzMPrkQbSip8JH2AXbvrRtYh4w==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "vscode-uri": "^3.0.8"
@@ -8036,6 +8158,7 @@
       "version": "0.0.62",
       "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.62.tgz",
       "integrity": "sha512-p7MPi71q7KOsH0eAbZwPBiKPp9B2+qrdHAd6VY5oTo9BUXatsOAdakTm9Yf0DUj6uWBAaOT01BSeVOPwucMV1g==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "path-browserify": "^1.0.1",
@@ -8058,6 +8181,7 @@
       "version": "0.0.62",
       "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.62.tgz",
       "integrity": "sha512-KxFt4zydyJYYI0kFAcWPTh4u0Ha36TASPZkAnNY784GtgajerUqM80nX/W1d0wVhmcOFfAxkVsf/Ed+tiYU7ng==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "vscode-uri": "^3.0.8"
@@ -8075,6 +8199,7 @@
       "version": "0.0.62",
       "resolved": "https://registry.npmjs.org/volar-service-yaml/-/volar-service-yaml-0.0.62.tgz",
       "integrity": "sha512-k7gvv7sk3wa+nGll3MaSKyjwQsJjIGCHFjVkl3wjaSP2nouKyn9aokGmqjrl39mi88Oy49giog2GkZH526wjig==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "vscode-uri": "^3.0.8",
@@ -8093,6 +8218,7 @@
       "version": "6.3.1",
       "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.1.tgz",
       "integrity": "sha512-1BzTBuJfwMc3A0uX4JBdJgoxp74cjj4q2mDJdp49yD/GuAq4X0k5WtK6fNcMYr+FfJ9nqgR6lpfCSZDkARJ5qQ==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@vscode/l10n": "^0.0.18",
@@ -8105,6 +8231,7 @@
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.3.1.tgz",
       "integrity": "sha512-ysUh4hFeW/WOWz/TO9gm08xigiSsV/FOAZ+DolgJfeLftna54YdmZ4A+lIn46RbdO3/Qv5QHTn1ZGqmrXQhZyA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "@vscode/l10n": "^0.0.18",
@@ -8117,6 +8244,7 @@
       "version": "4.1.8",
       "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.1.8.tgz",
       "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "jsonc-parser": "^3.0.0",
@@ -8133,12 +8261,14 @@
       "version": "3.3.1",
       "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
       "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/vscode-jsonrpc": {
       "version": "8.2.0",
       "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
       "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=14.0.0"
@@ -8148,6 +8278,7 @@
       "version": "9.0.1",
       "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz",
       "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "vscode-languageserver-protocol": "3.17.5"
@@ -8160,6 +8291,7 @@
       "version": "3.17.5",
       "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz",
       "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "vscode-jsonrpc": "8.2.0",
@@ -8170,24 +8302,28 @@
       "version": "1.0.12",
       "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz",
       "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/vscode-languageserver-types": {
       "version": "3.17.5",
       "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
       "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/vscode-nls": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz",
       "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/vscode-uri": {
       "version": "3.0.8",
       "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz",
       "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/web-namespaces": {
@@ -8253,6 +8389,35 @@
         "node": ">=4"
       }
     },
+    "node_modules/wide-align": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+      "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+      "license": "ISC",
+      "dependencies": {
+        "string-width": "^1.0.2 || 2 || 3 || 4"
+      }
+    },
+    "node_modules/wide-align/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "license": "MIT"
+    },
+    "node_modules/wide-align/node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/widest-line": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz",
@@ -8268,460 +8433,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/workerd": {
-      "version": "1.20241106.1",
-      "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20241106.1.tgz",
-      "integrity": "sha512-1GdKl0kDw8rrirr/ThcK66Kbl4/jd4h8uHx5g7YHBrnenY5SX1UPuop2cnCzYUxlg55kPjzIqqYslz1muRFgFw==",
-      "hasInstallScript": true,
-      "license": "Apache-2.0",
-      "bin": {
-        "workerd": "bin/workerd"
-      },
-      "engines": {
-        "node": ">=16"
-      },
-      "optionalDependencies": {
-        "@cloudflare/workerd-darwin-64": "1.20241106.1",
-        "@cloudflare/workerd-darwin-arm64": "1.20241106.1",
-        "@cloudflare/workerd-linux-64": "1.20241106.1",
-        "@cloudflare/workerd-linux-arm64": "1.20241106.1",
-        "@cloudflare/workerd-windows-64": "1.20241106.1"
-      }
-    },
-    "node_modules/wrangler": {
-      "version": "3.91.0",
-      "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.91.0.tgz",
-      "integrity": "sha512-Hdzn6wbY9cz5kL85ZUvWLwLIH7nPaEVRblfms40jhRf4qQO/Zf74aFlku8rQFbe8/2aVZFaxJVfBd6JQMeMSBQ==",
-      "license": "MIT OR Apache-2.0",
-      "dependencies": {
-        "@cloudflare/kv-asset-handler": "0.3.4",
-        "@cloudflare/workers-shared": "0.9.0",
-        "@esbuild-plugins/node-globals-polyfill": "^0.2.3",
-        "@esbuild-plugins/node-modules-polyfill": "^0.2.2",
-        "blake3-wasm": "^2.1.5",
-        "chokidar": "^4.0.1",
-        "date-fns": "^4.1.0",
-        "esbuild": "0.17.19",
-        "itty-time": "^1.0.6",
-        "miniflare": "3.20241106.1",
-        "nanoid": "^3.3.3",
-        "path-to-regexp": "^6.3.0",
-        "resolve": "^1.22.8",
-        "resolve.exports": "^2.0.2",
-        "selfsigned": "^2.0.1",
-        "source-map": "^0.6.1",
-        "unenv": "npm:unenv-nightly@2.0.0-20241121-161142-806b5c0",
-        "workerd": "1.20241106.1",
-        "xxhash-wasm": "^1.0.1"
-      },
-      "bin": {
-        "wrangler": "bin/wrangler.js",
-        "wrangler2": "bin/wrangler.js"
-      },
-      "engines": {
-        "node": ">=16.17.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      },
-      "peerDependencies": {
-        "@cloudflare/workers-types": "^4.20241106.0"
-      },
-      "peerDependenciesMeta": {
-        "@cloudflare/workers-types": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/android-arm": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
-      "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/android-arm64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz",
-      "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/android-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz",
-      "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz",
-      "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/darwin-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz",
-      "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz",
-      "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz",
-      "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/linux-arm": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz",
-      "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/linux-arm64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz",
-      "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/linux-ia32": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz",
-      "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/linux-loong64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz",
-      "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==",
-      "cpu": [
-        "loong64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz",
-      "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==",
-      "cpu": [
-        "mips64el"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz",
-      "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==",
-      "cpu": [
-        "ppc64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz",
-      "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==",
-      "cpu": [
-        "riscv64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/linux-s390x": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz",
-      "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==",
-      "cpu": [
-        "s390x"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/linux-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz",
-      "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz",
-      "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz",
-      "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/sunos-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz",
-      "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/win32-arm64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz",
-      "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/win32-ia32": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz",
-      "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/@esbuild/win32-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz",
-      "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/wrangler/node_modules/esbuild": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz",
-      "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==",
-      "hasInstallScript": true,
-      "license": "MIT",
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "optionalDependencies": {
-        "@esbuild/android-arm": "0.17.19",
-        "@esbuild/android-arm64": "0.17.19",
-        "@esbuild/android-x64": "0.17.19",
-        "@esbuild/darwin-arm64": "0.17.19",
-        "@esbuild/darwin-x64": "0.17.19",
-        "@esbuild/freebsd-arm64": "0.17.19",
-        "@esbuild/freebsd-x64": "0.17.19",
-        "@esbuild/linux-arm": "0.17.19",
-        "@esbuild/linux-arm64": "0.17.19",
-        "@esbuild/linux-ia32": "0.17.19",
-        "@esbuild/linux-loong64": "0.17.19",
-        "@esbuild/linux-mips64el": "0.17.19",
-        "@esbuild/linux-ppc64": "0.17.19",
-        "@esbuild/linux-riscv64": "0.17.19",
-        "@esbuild/linux-s390x": "0.17.19",
-        "@esbuild/linux-x64": "0.17.19",
-        "@esbuild/netbsd-x64": "0.17.19",
-        "@esbuild/openbsd-x64": "0.17.19",
-        "@esbuild/sunos-x64": "0.17.19",
-        "@esbuild/win32-arm64": "0.17.19",
-        "@esbuild/win32-ia32": "0.17.19",
-        "@esbuild/win32-x64": "0.17.19"
-      }
-    },
     "node_modules/wrap-ansi": {
       "version": "9.0.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
@@ -8758,16 +8469,6 @@
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
-    "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -8806,19 +8507,39 @@
         "node": ">=8"
       }
     },
-    "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
+    "node_modules/wrap-ansi/node_modules/ansi-regex": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
       "license": "MIT",
       "dependencies": {
-        "ansi-regex": "^5.0.1"
+        "ansi-regex": "^6.0.1"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
       }
     },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "license": "ISC"
+    },
     "node_modules/ws": {
       "version": "8.18.0",
       "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
@@ -8850,6 +8571,7 @@
       "version": "5.0.8",
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
       "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "dev": true,
       "license": "ISC",
       "engines": {
         "node": ">=10"
@@ -8865,6 +8587,7 @@
       "version": "2.6.1",
       "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz",
       "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==",
+      "dev": true,
       "license": "ISC",
       "bin": {
         "yaml": "bin.mjs"
@@ -8877,6 +8600,7 @@
       "version": "1.15.0",
       "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-1.15.0.tgz",
       "integrity": "sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "ajv": "^8.11.0",
@@ -8901,6 +8625,7 @@
       "version": "2.8.7",
       "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
       "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
+      "dev": true,
       "license": "MIT",
       "optional": true,
       "bin": {
@@ -8917,12 +8642,14 @@
       "version": "0.5.8",
       "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz",
       "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/yaml-language-server/node_modules/vscode-jsonrpc": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz",
       "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=8.0.0 || >=10.0.0"
@@ -8932,6 +8659,7 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz",
       "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "vscode-languageserver-protocol": "3.16.0"
@@ -8944,6 +8672,7 @@
       "version": "3.16.0",
       "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz",
       "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "vscode-jsonrpc": "6.0.0",
@@ -8954,12 +8683,14 @@
       "version": "3.16.0",
       "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz",
       "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/yaml-language-server/node_modules/yaml": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz",
       "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==",
+      "dev": true,
       "license": "ISC",
       "engines": {
         "node": ">= 14"
@@ -8969,6 +8700,7 @@
       "version": "17.7.2",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
       "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "cliui": "^8.0.1",
@@ -8992,25 +8724,18 @@
         "node": ">=12"
       }
     },
-    "node_modules/yargs/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/yargs/node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/yargs/node_modules/string-width": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
@@ -9021,18 +8746,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/yargs/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/yocto-queue": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz",
@@ -9045,17 +8758,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/youch": {
-      "version": "3.3.4",
-      "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.4.tgz",
-      "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==",
-      "license": "MIT",
-      "dependencies": {
-        "cookie": "^0.7.1",
-        "mustache": "^4.2.0",
-        "stacktracey": "^2.1.8"
-      }
-    },
     "node_modules/youtube-video-element": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/youtube-video-element/-/youtube-video-element-1.1.6.tgz",
diff --git a/package.json b/package.json
index 418dadd..705e3c9 100644
--- a/package.json
+++ b/package.json
@@ -3,47 +3,44 @@
   "type": "module",
   "version": "1.5.1",
   "scripts": {
-    "dev": "astro dev",
     "start": "astro dev",
     "build": "astro build",
-    "preview": "wrangler pages dev ./dist",
     "astro": "astro",
     "clean": "rimraf dist",
     "sitemap:generate": "node scripts/sitemap-generate.mjs",
     "update": "npm upgrade && ncu && npx @astrojs/upgrade && npm i && node scripts/sitemap-generate.mjs",
-    "update:deps": "npm upgrade && ncu && npx @astrojs/upgrade && npm i",
-    "build:worker": "node scripts/worker-build.mjs $WORKER_NAME",
-    "deploy:worker": "wrangler deploy --env production --config workers/$npm_config_worker/wrangler.toml"
+    "update:deps": "npm upgrade && ncu && npx @astrojs/upgrade && npm i"
   },
   "dependencies": {
-    "@astrojs/check": "0.9.4",
-    "@astrojs/cloudflare": "^11.2.0",
-    "@astrojs/rss": "4.0.9",
-    "@astrojs/sitemap": "3.2.1",
-    "@cdransf/astro-tabler-icons": "1.2.0",
+    "@astrojs/netlify": "^5.5.4",
     "@supabase/supabase-js": "^2.46.2",
     "astro": "4.16.16",
-    "astro-embed": "0.9.0",
-    "date-fns": "4.1.0",
-    "date-fns-tz": "3.2.0",
+    "cdn-cache-control": "^1.2.0",
     "highlight.js": "11.10.0",
-    "markdown-it": "14.1.0",
-    "markdown-it-anchor": "9.2.0",
-    "markdown-it-footnote": "4.0.0",
-    "minisearch": "7.1.1",
     "sanitize-html": "2.13.1",
-    "truncate-html": "1.1.2",
     "youtube-video-element": "^1.1.6"
   },
   "devDependencies": {
-    "dotenv": "16.4.5",
-    "dotenv-flow": "4.1.0",
+    "@astrojs/check": "0.9.4",
+    "@astrojs/rss": "4.0.9",
+    "@astrojs/sitemap": "3.2.1",
+    "@cdransf/astro-tabler-icons": "1.2.0",
+    "astro-embed": "0.9.0",
+    "date-fns": "4.1.0",
+    "date-fns-tz": "3.2.0",
+    "dotenv": "^16.4.5",
+    "dotenv-flow": "^4.1.0",
     "fast-xml-parser": "4.5.0",
     "html-to-text": "9.0.5",
     "i18n-iso-countries": "7.13.0",
     "ics": "^3.8.1",
+    "markdown-it": "14.1.0",
+    "markdown-it-anchor": "9.2.0",
+    "markdown-it-footnote": "4.0.0",
+    "minisearch": "7.1.1",
     "rimraf": "6.0.1",
     "slugify": "1.6.6",
-    "terser": "5.36.0"
+    "terser": "5.36.0",
+    "truncate-html": "1.1.2"
   }
 }
diff --git a/public/_redirects b/public/_redirects
index 7ed0a61..2ae7c1d 100644
--- a/public/_redirects
+++ b/public/_redirects
@@ -1,3 +1,6 @@
+# apex
+https://coryd.netlify.app/* https://coryd.dev/:splat 301!
+
 # 404s
 /now.html /now 301
 /contact.html /contact 301
diff --git a/scripts/worker-build.mjs b/scripts/worker-build.mjs
deleted file mode 100644
index bf9f438..0000000
--- a/scripts/worker-build.mjs
+++ /dev/null
@@ -1,33 +0,0 @@
-import fs from 'fs/promises'
-import dotenv from 'dotenv-flow'
-
-dotenv.config()
-
-const workerName = process.argv[2]
-
-if (!workerName) {
-  console.error('Please specify a worker name.')
-  process.exit(1)
-}
-
-const templatePath = `workers/${workerName}/wrangler.template.toml`
-const outputPath = `workers/${workerName}/wrangler.toml`
-
-async function generateToml() {
-  try {
-    const template = await fs.readFile(templatePath, 'utf8')
-    const output = template
-      .replace(/\${CF_ACCOUNT_ID}/g, process.env.CF_ACCOUNT_ID)
-      .replace(/\${CF_ZONE_ID}/g, process.env.CF_ZONE_ID)
-      .replace(/\${RSS_TO_MASTODON_KV_NAMESPACE_ID}/g, process.env.RSS_TO_MASTODON_KV_NAMESPACE_ID)
-
-    await fs.writeFile(outputPath, output)
-
-    console.log(`Generated wrangler.toml for ${workerName}`)
-  } catch (error) {
-    console.error('Error generating wrangler.toml:', error)
-    process.exit(1)
-  }
-}
-
-generateToml()
\ No newline at end of file
diff --git a/src/components/IconMapper.astro b/src/components/IconMapper.astro
index fd9c597..00ad334 100644
--- a/src/components/IconMapper.astro
+++ b/src/components/IconMapper.astro
@@ -17,6 +17,7 @@ const {
   IconCoffee,
   IconDeviceWatch,
   IconHeartHandshake,
+  IconCalendarPlus,
 } = icons;
 const { icon, className } = Astro.props;
 const iconComponents = {
@@ -35,6 +36,7 @@ const iconComponents = {
   coffee: IconCoffee,
   "device-watch": IconDeviceWatch,
   "heart-handshake": IconHeartHandshake,
+  "calendar-plus": IconCalendarPlus,
 };
 const SelectedIcon = iconComponents[icon?.toLowerCase()] || null;
 ---
diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro
index f6ac929..dc2f55b 100644
--- a/src/layouts/Layout.astro
+++ b/src/layouts/Layout.astro
@@ -97,7 +97,7 @@ const pageDescription = md(description);
     {
       isProduction && (
         <>
-          <script is:inline defer data-domain="coryd.dev" src="/js/script.js" />
+          <script is:inline defer data-domain="coryd.dev" src="/scripts/util.js" />
           <script is:inline defer>
             window.plausible = window.plausible || function(...args) {
               (window.plausible.q = window.plausible.q || []).push(args);
diff --git a/src/middleware.js b/src/middleware.js
index ee151fe..5db5d85 100644
--- a/src/middleware.js
+++ b/src/middleware.js
@@ -8,6 +8,9 @@ import { fetchShowByUrl } from "@utils/data/dynamic/showByUrl.js";
 import { isbnRegex } from "@utils/helpers/media.js";
 import { isExcludedPath } from "@utils/helpers/general.js";
 import { CACHE_DURATION } from "@utils/constants/index.js";
+import dotenvFlow from "dotenv-flow";
+
+dotenvFlow.config();
 
 let cachedGlobals = null;
 let cachedNav = null;
@@ -20,7 +23,7 @@ export async function onRequest(context, next) {
   const { request, locals } = context;
 
   try {
-    const runtimeEnv = locals.runtime?.env;
+    const runtimeEnv = process.env;
 
     if (!runtimeEnv)
       return new Response("Internal Server Error", { status: 500 });
diff --git a/src/pages/books/[isbn].astro b/src/pages/books/[isbn].astro
index daedada..ff5e0c2 100644
--- a/src/pages/books/[isbn].astro
+++ b/src/pages/books/[isbn].astro
@@ -1,4 +1,5 @@
 ---
+import { CacheHeaders, ONE_HOUR } from 'cdn-cache-control';
 import Layout from "@layouts/Layout.astro";
 import Warning from "@components/blocks/banners/Warning.astro";
 import AssociatedMedia from "@components/blocks/AssociatedMedia.astro";
@@ -12,6 +13,15 @@ const { book, globals } = await fetchGlobalData(Astro, Astro.url.pathname);
 
 if (!book) return Astro.redirect("/404", 404);
 
+const headers = new CacheHeaders()
+  .swr()
+  .ttl(ONE_HOUR)
+  .tag(['book', `book-${book.isbn}`]);
+
+headers.forEach((value, key) => {
+  Astro.response.headers.set(key, value);
+});
+
 const alt = `${book.title}${book.author ? ` by ${book.author}` : ""}`;
 const pageTitle = `${book.title} by ${book.author} / Books`;
 const description =
diff --git a/src/pages/feeds/syndication.xml.js b/src/pages/feeds/syndication.xml.js
index b1c835a..1550b3a 100644
--- a/src/pages/feeds/syndication.xml.js
+++ b/src/pages/feeds/syndication.xml.js
@@ -1,6 +1,7 @@
 import rss from "@astrojs/rss";
 import { fetchGlobals } from "@utils/data/globals.js";
 import { fetchSyndication } from "@utils/data/syndication.js";
+import { htmlToText, sanitizeContent, md } from "@utils/helpers/general.js";
 
 export const prerender = true;
 
@@ -16,7 +17,7 @@ export async function GET() {
       title: item.syndication.title,
       pubDate: item.syndication.date,
       link: item.syndication.url,
-      description: item.syndication.description,
+      description: htmlToText(md(item.syndication.description)),
     })),
   });
 }
diff --git a/src/pages/music/artists/[slug].astro b/src/pages/music/artists/[slug].astro
index 5f5b9f9..5cc316c 100644
--- a/src/pages/music/artists/[slug].astro
+++ b/src/pages/music/artists/[slug].astro
@@ -1,4 +1,5 @@
 ---
+import { CacheHeaders, ONE_HOUR } from 'cdn-cache-control';
 import { parseISO, format } from "date-fns";
 import Layout from "@layouts/Layout.astro";
 import Modal from "@components/blocks/Modal.astro";
@@ -8,11 +9,21 @@ import icons from "@cdransf/astro-tabler-icons";
 import { fetchGlobalData } from "@utils/data/global/index.js";
 import { parseCountries } from "@utils/helpers/media.js";
 import { md } from "@utils/helpers/general.js";
+import slugify from "slugify";
 
 const { artist, globals } = await fetchGlobalData(Astro, Astro.url.pathname);
 
 if (!artist) return Astro.redirect("/404", 404);
 
+const headers = new CacheHeaders()
+  .swr()
+  .ttl(ONE_HOUR)
+  .tag(['artist', `artist-${slugify(artist.name, { lower: true })}`]);
+
+headers.forEach((value, key) => {
+  Astro.response.headers.set(key, value);
+});
+
 const {
   IconArrowLeft,
   IconHeart,
diff --git a/src/pages/music/genres/[slug].astro b/src/pages/music/genres/[slug].astro
index cd6e938..c4ad58c 100644
--- a/src/pages/music/genres/[slug].astro
+++ b/src/pages/music/genres/[slug].astro
@@ -1,14 +1,26 @@
 ---
+import { CacheHeaders, ONE_HOUR } from 'cdn-cache-control';
 import Layout from "@layouts/Layout.astro";
 import AssociatedMedia from "@components/blocks/AssociatedMedia.astro";
 import icons from "@cdransf/astro-tabler-icons";
 import { fetchGlobalData } from "@utils/data/global/index.js";
 import { mediaLinks } from "@utils/helpers/media.js";
 import { md } from "@utils/helpers/general.js";
+import slugify from "slugify";
 
 const { genre } = await fetchGlobalData(Astro, Astro.url.pathname);
+
 if (!genre) return Astro.redirect("/404", 404);
 
+const headers = new CacheHeaders()
+  .swr()
+  .ttl(ONE_HOUR)
+  .tag(['genre', `genre-${slugify(genre.name, { lower: true })}`]);
+
+headers.forEach((value, key) => {
+  Astro.response.headers.set(key, value);
+});
+
 const { IconArrowLeft } = icons;
 const artistCount = genre.artists?.length || 0;
 const connectingWords = artistCount > 1 ? "artists are" : "artist is";
diff --git a/src/pages/watching/movies/[slug].astro b/src/pages/watching/movies/[slug].astro
index bed1922..b91eb69 100644
--- a/src/pages/watching/movies/[slug].astro
+++ b/src/pages/watching/movies/[slug].astro
@@ -1,4 +1,5 @@
 ---
+import { CacheHeaders, ONE_HOUR } from 'cdn-cache-control';
 import { parseISO, format } from "date-fns";;
 import Layout from "@layouts/Layout.astro";
 import AssociatedMedia from "@components/blocks/AssociatedMedia.astro";
@@ -11,6 +12,15 @@ const { globals, movie } = await fetchGlobalData(Astro, Astro.url.pathname);
 
 if (!movie) return Astro.redirect("/404", 404);
 
+const headers = new CacheHeaders()
+  .swr()
+  .ttl(ONE_HOUR)
+  .tag(['movie', `movie-${movie.id}`]);
+
+headers.forEach((value, key) => {
+  Astro.response.headers.set(key, value);
+});
+
 const {
   IconArrowLeft,
   IconHeart,
diff --git a/src/pages/watching/shows/[slug].astro b/src/pages/watching/shows/[slug].astro
index f330fc0..5ade86d 100644
--- a/src/pages/watching/shows/[slug].astro
+++ b/src/pages/watching/shows/[slug].astro
@@ -1,4 +1,5 @@
 ---
+import { CacheHeaders, ONE_HOUR } from 'cdn-cache-control';
 import { parseISO, format } from "date-fns";
 import Layout from "@layouts/Layout.astro";
 import AssociatedMedia from "@components/blocks/AssociatedMedia.astro";
@@ -11,6 +12,15 @@ const { globals, show } = await fetchGlobalData(Astro, Astro.url.pathname);
 
 if (!show) return Astro.redirect("/404", 404);
 
+const headers = new CacheHeaders()
+  .swr()
+  .ttl(ONE_HOUR)
+  .tag(['show', `show-${show.id}`]);
+
+headers.forEach((value, key) => {
+  Astro.response.headers.set(key, value);
+});
+
 const {
   IconArrowLeft,
   IconHeart,
diff --git a/src/styles/base/index.css b/src/styles/base/index.css
index 88533e9..541709a 100644
--- a/src/styles/base/index.css
+++ b/src/styles/base/index.css
@@ -119,6 +119,7 @@ ol {
 .brand-github,
 .brand-mastodon,
 .brand-npm,
+.calendar-plus,
 .coffee,
 .collected,
 .concerts,
@@ -153,6 +154,9 @@ ol {
   &.brand-npm {
     --section-color: var(--brand-npm);
   }
+  &.calendar-plus {
+    --section-color: var(--brand-savvycal);
+  }
   &.coffee {
     --section-color: var(--brand-buy-me-a-coffee);
   }
@@ -507,4 +511,4 @@ pre code {
   white-space: pre-wrap;
   word-wrap: break-word;
   overflow-wrap: break-word;
-}
\ No newline at end of file
+}
diff --git a/src/styles/base/vars.css b/src/styles/base/vars.css
index 66b5429..cabaae2 100644
--- a/src/styles/base/vars.css
+++ b/src/styles/base/vars.css
@@ -45,6 +45,7 @@
   --brand-mastodon: light-dark(#563acc, #858afa);
   --brand-npm: #cb3837;
   --brand-rss: #f26522;
+  --brand-savvycal: light-dark(#00551f, #ff431f);
 
   --article: light-dark(#007272, #00ffff);
   --about: light-dark(#e4513a, #ff967d);
@@ -159,4 +160,4 @@
 
   /* input accent color */
   accent-color: var(--accent-color);
-}
\ No newline at end of file
+}
diff --git a/src/utils/data/static/sitemapData.json b/src/utils/data/static/sitemapData.json
index 36b596b..89a03a3 100644
--- a/src/utils/data/static/sitemapData.json
+++ b/src/utils/data/static/sitemapData.json
@@ -8637,151 +8637,46 @@
     "loc": "https://coryd.dev/music/genres/alternative-metal"
   },
   {
-    "loc": "https://coryd.dev/watching/shows/17968"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/71994"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/19885"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/210178"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/119934"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/113367"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/122530"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/104157"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/61222"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/138564"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/62822"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/1621"
+    "loc": "https://coryd.dev/watching/shows/94028"
   },
   {
     "loc": "https://coryd.dev/watching/shows/1640"
   },
   {
-    "loc": "https://coryd.dev/watching/shows/157085"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/2490"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/85720"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/119826"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/75191"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/1406"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/712"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/70391"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/1920"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/83631"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/1405"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/81241"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/109939"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/80707"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/76887"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/137437"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/1414"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/202557"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/93784"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/126254"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/30991"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/1398"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/81239"
+    "loc": "https://coryd.dev/watching/shows/19885"
   },
   {
     "loc": "https://coryd.dev/watching/shows/655"
   },
   {
-    "loc": "https://coryd.dev/watching/shows/79086"
+    "loc": "https://coryd.dev/watching/shows/93784"
   },
   {
-    "loc": "https://coryd.dev/watching/shows/80558"
+    "loc": "https://coryd.dev/watching/shows/17968"
   },
   {
-    "loc": "https://coryd.dev/watching/shows/15621"
+    "loc": "https://coryd.dev/watching/shows/1426"
   },
   {
-    "loc": "https://coryd.dev/watching/shows/136308"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/157239"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/233629"
+    "loc": "https://coryd.dev/watching/shows/30991"
   },
   {
     "loc": "https://coryd.dev/watching/shows/76231"
   },
   {
-    "loc": "https://coryd.dev/watching/shows/47665"
+    "loc": "https://coryd.dev/watching/shows/126254"
   },
   {
-    "loc": "https://coryd.dev/watching/shows/1436"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/111894"
+    "loc": "https://coryd.dev/watching/shows/65708"
   },
   {
     "loc": "https://coryd.dev/watching/shows/157065"
   },
   {
-    "loc": "https://coryd.dev/watching/shows/1426"
+    "loc": "https://coryd.dev/watching/shows/202879"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/157061"
   },
   {
     "loc": "https://coryd.dev/watching/shows/114471"
@@ -8793,32 +8688,140 @@
     "loc": "https://coryd.dev/watching/shows/79649"
   },
   {
-    "loc": "https://coryd.dev/watching/shows/65708"
+    "loc": "https://coryd.dev/watching/shows/157239"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/1436"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/136308"
   },
   {
     "loc": "https://coryd.dev/watching/shows/92553"
   },
   {
-    "loc": "https://coryd.dev/watching/shows/157061"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/94028"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/202879"
-  },
-  {
-    "loc": "https://coryd.dev/watching/shows/1107"
+    "loc": "https://coryd.dev/watching/shows/15621"
   },
   {
     "loc": "https://coryd.dev/watching/shows/185"
   },
   {
-    "loc": "https://coryd.dev/watching/shows/136311"
+    "loc": "https://coryd.dev/watching/shows/109939"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/62822"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/1107"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/210178"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/1398"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/137437"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/61222"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/1621"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/138564"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/111894"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/1414"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/47665"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/119934"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/104157"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/119826"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/1406"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/113367"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/71994"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/157085"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/2490"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/75191"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/712"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/70391"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/83631"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/122530"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/85720"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/81241"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/80707"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/233629"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/76887"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/202557"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/1920"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/1405"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/79086"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/80558"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/81239"
   },
   {
     "loc": "https://coryd.dev/watching/shows/688"
   },
+  {
+    "loc": "https://coryd.dev/watching/shows/157741"
+  },
+  {
+    "loc": "https://coryd.dev/watching/shows/136311"
+  },
   {
     "loc": "https://coryd.dev/watching/shows/125988"
   },
diff --git a/workers/analytics/index.js b/workers/analytics/index.js
deleted file mode 100644
index 1d0cb7a..0000000
--- a/workers/analytics/index.js
+++ /dev/null
@@ -1,40 +0,0 @@
-const scriptName = "/js/script.js";
-const endpoint = "/api/event";
-
-addEventListener("fetch", (event) => {
-  event.passThroughOnException();
-  event.respondWith(handleRequest(event));
-});
-
-async function handleRequest(event) {
-  const url = new URL(event.request.url);
-  const pathname = url.pathname;
-
-  if (pathname === scriptName) {
-    return getScript(event);
-  } else if (pathname === endpoint) {
-    return postData(event);
-  }
-  return new Response(null, { status: 404 });
-}
-
-async function getScript(event) {
-  const cache = caches.default;
-  let response = await cache.match(event.request);
-
-  if (!response) {
-    const scriptUrl =
-      "https://plausible.io/js/plausible.outbound-links.tagged-events.js";
-    response = await fetch(scriptUrl);
-    if (response.ok)
-      event.waitUntil(cache.put(event.request, response.clone()));
-  }
-
-  return response;
-}
-
-async function postData(event) {
-  const request = new Request(event.request);
-  request.headers.delete("cookie");
-  return await fetch("https://plausible.io/api/event", request);
-}
diff --git a/workers/analytics/wrangler.template.toml b/workers/analytics/wrangler.template.toml
deleted file mode 100644
index 5b39504..0000000
--- a/workers/analytics/wrangler.template.toml
+++ /dev/null
@@ -1,13 +0,0 @@
-name = "analytics-worker"
-main = "./index.js"
-compatibility_date = "2023-01-01"
-
-account_id = "${CF_ACCOUNT_ID}"
-workers_dev = true
-
-[env.production]
-name = "analytics-worker-production"
-routes = [
-  { pattern = "coryd.dev/js/*", zone_id = "${CF_ZONE_ID}" },
-  { pattern = "coryd.dev/api/event", zone_id = "${CF_ZONE_ID}" }
-]
\ No newline at end of file
diff --git a/workers/artist-import/index.js b/workers/artist-import/index.js
deleted file mode 100644
index 3f0585a..0000000
--- a/workers/artist-import/index.js
+++ /dev/null
@@ -1,184 +0,0 @@
-import slugify from "slugify";
-import countries from "i18n-iso-countries";
-
-countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
-
-function sanitizeMediaString(str) {
-  const sanitizedString = str
-    .normalize("NFD")
-    .replace(/[\u0300-\u036f\u2010\-\.\?\(\)\[\]\{\}]/g, "")
-    .replace(/\.{3}/g, "");
-  return slugify(sanitizedString, {
-    replacement: "-",
-    remove: /[#,&,+()$~%.'\":*?<>{}]/g,
-    lower: true,
-  });
-}
-
-export default {
-  async fetch(request, env) {
-    const directusUrl = env.DIRECTUS_URL;
-    const directusToken = env.DIRECTUS_API_TOKEN;
-    const artistImportToken = env.ARTIST_IMPORT_TOKEN;
-    const artistFlowID = env.ARTIST_FLOW_ID;
-    const albumFlowID = env.ALBUM_FLOW_ID;
-    const placeholderImageId = "4cef75db-831f-4f5d-9333-79eaa5bb55ee";
-    const requestUrl = new URL(request["url"]);
-    const providedToken = requestUrl.searchParams.get("token");
-
-    if (!providedToken || providedToken !== artistImportToken) return new Response("Unauthorized", { status: 401 });
-
-    async function saveToDirectus(endpoint, payload) {
-      const response = await fetch(`${directusUrl}/items/${endpoint}`, {
-        method: "POST",
-        headers: {
-          "Content-Type": "application/json",
-          Authorization: `Bearer ${directusToken}`,
-        },
-        body: JSON.stringify(payload),
-      });
-      const data = await response.json();
-      if (!response.ok) {
-        throw new Error(
-          data["errors"]
-            ? data["errors"][0]["message"]
-            : "Failed to save to Directus"
-        );
-      }
-      return data["data"];
-    }
-
-    async function findGenreIdByName(genreName) {
-      try {
-        const response = await fetch(
-          `${directusUrl}/items/genres?filter[name][_eq]=${encodeURIComponent(
-            genreName.toLowerCase()
-          )}`,
-          { headers: { Authorization: `Bearer ${directusToken}` } }
-        );
-        const data = await response.json();
-        return data["data"].length > 0 ? data["data"][0]["id"] : null;
-      } catch (error) {
-        console.error("Error fetching genre ID:", error["message"]);
-        return null;
-      }
-    }
-
-    const artistId = requestUrl.searchParams.get("artist_id");
-    if (!artistId)
-      return new Response("artist_id parameter is required", { status: 400 });
-
-    let artistData;
-    try {
-      const artistResponse = await fetch(
-        `${directusUrl}/flows/trigger/${artistFlowID}?artist_id=${artistId}&import_token=${artistImportToken}`,
-        { headers: { Authorization: `Bearer ${directusToken}` } }
-      );
-      artistData = await artistResponse.json();
-      artistData =
-        artistData["get_artist_data"]["data"]["MediaContainer"]["Metadata"][0];
-    } catch (error) {
-      console.error(
-        "Error fetching artist data from Directus flow:",
-        error["message"]
-      );
-      return new Response("Error fetching artist data", { status: 500 });
-    }
-
-    const artistName = artistData["title"] || "";
-    const artistKey = sanitizeMediaString(artistName);
-    const countryName = artistData["Country"]
-      ? artistData["Country"][0]?.["tag"]
-      : "";
-    const countryIsoCode = countries.getAlpha2Code(countryName, "en") || "";
-    const slug = `/music/artists/${artistKey}-${countryName.toLowerCase()}`;
-    const description = artistData["summary"] || "";
-    const mbid = artistData["Guid"]?.[0]?.["id"]?.replace("mbid://", "") || "";
-
-    const genreNames = artistData["Genre"]
-      ? artistData["Genre"].map((g) => g["tag"].toLowerCase())
-      : [];
-    let genreId = null;
-    for (const genreName of genreNames) {
-      genreId = await findGenreIdByName(genreName);
-      if (genreId) break;
-    }
-
-    const artistPayload = {
-      name: artistName,
-      name_string: artistName,
-      slug: slug,
-      description: description,
-      mbid: mbid,
-      tentative: true,
-      genres: genreId,
-      country: countryIsoCode,
-      art: placeholderImageId,
-    };
-
-    let insertedArtist;
-    try {
-      insertedArtist = await saveToDirectus("artists", artistPayload);
-    } catch (error) {
-      console.error("Error saving artist:", error["message"]);
-      return new Response("Error saving artist", { status: 500 });
-    }
-
-    let albumData;
-    try {
-      const albumResponse = await fetch(
-        `${directusUrl}/flows/trigger/${albumFlowID}?artist_id=${artistId}&import_token=${artistImportToken}`,
-        { headers: { Authorization: `Bearer ${directusToken}` } }
-      );
-      albumData = await albumResponse.json();
-      albumData =
-        albumData["get_album_data"]["data"]["MediaContainer"]["Metadata"];
-    } catch (error) {
-      console.error(
-        "Error fetching album data from Directus flow:",
-        error["message"]
-      );
-      return new Response("Error fetching album data", { status: 500 });
-    }
-
-    for (const album of albumData) {
-      const albumName = album["title"] || "";
-      const albumKey = `${artistKey}-${sanitizeMediaString(albumName)}`;
-      const albumSlug = `/music/albums/${albumKey}`;
-      const albumDescription = album["summary"] || "";
-      const albumReleaseDate = album["originallyAvailableAt"] || "";
-      const albumReleaseYear = albumReleaseDate
-        ? new Date(albumReleaseDate).getFullYear()
-        : null;
-      const albumGenres = album["Genre"]
-        ? album["Genre"].map((g) => g["tag"])
-        : [];
-      const albumMbid =
-        album["Guid"]?.[0]?.["id"]?.replace("mbid://", "") || null;
-
-      const albumPayload = {
-        name: albumName,
-        key: albumKey,
-        slug: albumSlug,
-        mbid: albumMbid,
-        description: albumDescription,
-        release_year: albumReleaseYear,
-        artist: insertedArtist["id"],
-        artist_name: artistName,
-        genres: albumGenres,
-        art: placeholderImageId,
-        tentative: true,
-      };
-
-      try {
-        await saveToDirectus("albums", albumPayload);
-      } catch (error) {
-        console.error("Error saving album:", error["message"]);
-      }
-    }
-
-    return new Response("Artist and albums synced successfully", {
-      status: 200,
-    });
-  },
-};
diff --git a/workers/artist-import/wrangler.template.toml b/workers/artist-import/wrangler.template.toml
deleted file mode 100644
index f6115b8..0000000
--- a/workers/artist-import/wrangler.template.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-name = "import-artist-worker"
-main = "./index.js"
-compatibility_date = "2023-01-01"
-
-account_id = "${CF_ACCOUNT_ID}"
-workers_dev = true
-
-[observability]
-enabled = true
-
-[env.production]
-name = "import-artist-worker-production"
-routes = [
-  { pattern = "coryd.dev/api/import-artist*", zone_id = "${CF_ZONE_ID}" }
-]
diff --git a/workers/contact/index.js b/workers/contact/index.js
deleted file mode 100644
index fde7812..0000000
--- a/workers/contact/index.js
+++ /dev/null
@@ -1,101 +0,0 @@
-import { createClient } from "@supabase/supabase-js";
-
-const RATE_LIMIT = 5;
-const TIME_FRAME = 60 * 120 * 1000;
-const ipSubmissions = new Map();
-
-export default {
-  async fetch(request, env) {
-    if (request.method === "POST") {
-      const ip =
-        request.headers.get("CF-Connecting-IP") ||
-        request.headers.get("X-Forwarded-For") ||
-        request.headers.get("Remote-Addr");
-      const currentTime = Date.now();
-
-      if (!ipSubmissions.has(ip)) ipSubmissions.set(ip, []);
-
-      const submissions = ipSubmissions
-        .get(ip)
-        .filter((time) => currentTime - time < TIME_FRAME);
-
-      if (submissions.length >= RATE_LIMIT)
-        return Response.redirect("https://coryd.dev/rate-limit", 301);
-
-      submissions.push(currentTime);
-      ipSubmissions.set(ip, submissions);
-
-      try {
-        const formData = await request.formData();
-        const name = formData.get("name");
-        const email = formData.get("email");
-        const message = formData.get("message");
-        const hpName = formData.get("hp_name");
-        if (hpName) return new Response("Spam detected", { status: 400 });
-        if (!name || !email || !message)
-          return new Response("Invalid input", { status: 400 });
-
-        const emailDomain = email.split("@")[1].toLowerCase();
-        const supabaseUrl = env.SUPABASE_URL;
-        const supabaseKey = env.SUPABASE_KEY;
-        const supabase = createClient(supabaseUrl, supabaseKey);
-        const { data: blockedDomains, error: domainError } = await supabase
-          .from("blocked_domains")
-          .select("domain_name");
-
-        if (domainError)
-          throw new Error(
-            `Failed to fetch blocked domains: ${domainError.message}`
-          );
-
-        const domainList = blockedDomains.map((item) =>
-          item["domain_name"].toLowerCase()
-        );
-
-        if (domainList.includes(emailDomain))
-          return new Response("Email domain is blocked.", { status: 400 });
-
-        const { error } = await supabase
-          .from("contacts")
-          .insert([{ name, email, message, replied: false }]);
-
-        if (error) throw error;
-
-        const forwardEmailApiKey = env.FORWARDEMAIL_API_KEY;
-        const authHeader = "Basic " + btoa(`${forwardEmailApiKey}:`);
-        const emailData = new URLSearchParams({
-          from: `${name} <hi@admin.coryd.dev>`,
-          to: "hi@coryd.dev",
-          subject: `${message}`,
-          text: `Name: ${name}\nEmail: ${email}\nMessage: ${message}`,
-          replyTo: email,
-        }).toString();
-        const response = await fetch("https://api.forwardemail.net/v1/emails", {
-          method: "POST",
-          headers: {
-            "Content-Type": "application/x-www-form-urlencoded",
-            Authorization: authHeader,
-          },
-          body: emailData,
-        });
-
-        if (!response.ok) {
-          const errorText = await response.text();
-          console.error(
-            "Email API response error:",
-            response.status,
-            errorText
-          );
-          throw new Error(`Failed to send email: ${errorText}`);
-        }
-
-        return Response.redirect("https://coryd.dev/contact-success", 301);
-      } catch (error) {
-        console.error("Error:", error.message);
-        return Response.redirect("https://coryd.dev/broken", 301);
-      }
-    } else {
-      return Response.redirect("https://coryd.dev/not-allowed", 301);
-    }
-  },
-};
diff --git a/workers/contact/wrangler.template.toml b/workers/contact/wrangler.template.toml
deleted file mode 100644
index 2e30b7c..0000000
--- a/workers/contact/wrangler.template.toml
+++ /dev/null
@@ -1,12 +0,0 @@
-name = "contact-form-worker"
-main = "./index.js"
-compatibility_date = "2023-01-01"
-
-account_id = "${CF_ACCOUNT_ID}"
-workers_dev = true
-
-[env.production]
-name = "contact-form-worker-production"
-routes = [
-  { pattern = "coryd.dev/api/contact", zone_id = "${CF_ZONE_ID}" }
-]
\ No newline at end of file
diff --git a/workers/mastodon/wrangler.template.toml b/workers/mastodon/wrangler.template.toml
deleted file mode 100644
index 6b09f65..0000000
--- a/workers/mastodon/wrangler.template.toml
+++ /dev/null
@@ -1,21 +0,0 @@
-name = "rss-to-mastodon-worker"
-main = "./index.js"
-compatibility_date = "2023-01-01"
-
-account_id = "${CF_ACCOUNT_ID}"
-workers_dev = true
-
-[observability]
-enabled = true
-
-[[kv_namespaces]]
-binding = "RSS_TO_MASTODON_NAMESPACE"
-id = "${RSS_TO_MASTODON_KV_NAMESPACE_ID}"
-
-[env.production]
-name = "rss-to-mastodon-worker-production"
-triggers = { crons = ["0 * * * *"] }
-
-[[env.production.kv_namespaces]]
-binding = "RSS_TO_MASTODON_NAMESPACE"
-id = "${RSS_TO_MASTODON_KV_NAMESPACE_ID}"
\ No newline at end of file
diff --git a/workers/rebuild/index.js b/workers/rebuild/index.js
deleted file mode 100644
index 0846001..0000000
--- a/workers/rebuild/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-export default {
-  async scheduled(event, env, ctx) {
-    const deployHookUrl = env.DEPLOY_HOOK_URL;
-
-    const response = await fetch(deployHookUrl, {
-      method: "POST",
-    });
-
-    if (!response.ok) {
-      const errorText = await response.text();
-      console.error(
-        `Error triggering deploy: ${response.statusText}`,
-        errorText
-      );
-      return;
-    }
-
-    console.log("Deploy triggered successfully");
-  },
-};
diff --git a/workers/rebuild/wrangler.template.toml b/workers/rebuild/wrangler.template.toml
deleted file mode 100644
index aacc39d..0000000
--- a/workers/rebuild/wrangler.template.toml
+++ /dev/null
@@ -1,10 +0,0 @@
-name = "scheduled-rebuild-worker"
-main = "./index.js"
-compatibility_date = "2023-01-01"
-
-account_id = "${CF_ACCOUNT_ID}"
-workers_dev = true
-
-[env.production]
-name = "scheduled-rebuild-worker-production"
-triggers = {crons = ["*/15 * * * *"]}
\ No newline at end of file
diff --git a/workers/scrobble/index.js b/workers/scrobble/index.js
deleted file mode 100644
index 2d020fb..0000000
--- a/workers/scrobble/index.js
+++ /dev/null
@@ -1,249 +0,0 @@
-import { createClient } from "@supabase/supabase-js";
-import slugify from "slugify";
-
-const sanitizeMediaString = (str) => {
-  const sanitizedString = str
-    .normalize("NFD")
-    .replace(/[\u0300-\u036f\u2010\-\.\?\(\)\[\]\{\}]/g, "")
-    .replace(/\.{3}/g, "");
-  return slugify(sanitizedString, {
-    replacement: "-",
-    remove: /[#,&,+()$~%.'":*?<>{}]/g,
-    lower: true,
-  });
-};
-
-const sendEmail = async (subject, text, authHeader, maxRetries = 3) => {
-  const emailData = new URLSearchParams({
-    from: "coryd.dev <hi@admin.coryd.dev>",
-    to: "hi@coryd.dev",
-    subject: subject,
-    text: text,
-  }).toString();
-
-  let attempt = 0;
-  let success = false;
-
-  while (attempt < maxRetries && !success) {
-    attempt++;
-    try {
-      const response = await fetch("https://api.forwardemail.net/v1/emails", {
-        method: "POST",
-        headers: {
-          "Content-Type": "application/x-www-form-urlencoded",
-          Authorization: authHeader,
-        },
-        body: emailData,
-      });
-
-      if (!response.ok) {
-        const responseText = await response.text();
-        console.error(
-          `Attempt ${attempt}: Email API response error:`,
-          response.status,
-          responseText
-        );
-        throw new Error(`Failed to send email: ${responseText}`);
-      }
-
-      console.log("Email sent successfully on attempt", attempt);
-      success = true;
-    } catch (error) {
-      console.error(`Attempt ${attempt}: Error sending email:`, error.message);
-
-      if (attempt < maxRetries) {
-        console.log(
-          `Retrying email send (attempt ${attempt + 1}/${maxRetries})...`
-        );
-      } else {
-        console.error("All attempts to send email failed.");
-      }
-    }
-  }
-
-  return success;
-};
-
-export default {
-  async fetch(request, env) {
-    const supabaseUrl = env.SUPABASE_URL;
-    const supabaseKey = env.SUPABASE_KEY;
-    const FORWARDEMAIL_API_KEY = env.FORWARDEMAIL_API_KEY;
-    const ACCOUNT_ID_PLEX = env.ACCOUNT_ID_PLEX;
-    const supabase = createClient(supabaseUrl, supabaseKey);
-    const authHeader = "Basic " + btoa(`${FORWARDEMAIL_API_KEY}:`);
-    const url = new URL(request.url);
-    const params = url.searchParams;
-    const id = params.get("id");
-
-    if (!id)
-      return new Response(JSON.stringify({ status: "Bad request" }), {
-        headers: { "Content-Type": "application/json" },
-      });
-
-    if (id !== ACCOUNT_ID_PLEX)
-      return new Response(JSON.stringify({ status: "Forbidden" }), {
-        headers: { "Content-Type": "application/json" },
-      });
-
-    const contentType = request.headers.get("Content-Type") || "";
-    if (!contentType.includes("multipart/form-data"))
-      return new Response(
-        JSON.stringify({
-          status: "Bad request",
-          message: "Invalid Content-Type. Expected multipart/form-data.",
-        }),
-        { headers: { "Content-Type": "application/json" } }
-      );
-
-    try {
-      const data = await request.formData();
-      const payload = JSON.parse(data.get("payload"));
-
-      if (payload?.event === "media.scrobble") {
-        const artistName = payload["Metadata"]["grandparentTitle"];
-        const albumName = payload["Metadata"]["parentTitle"];
-        const trackName = payload["Metadata"]["title"];
-        const listenedAt = Math.floor(Date.now() / 1000);
-        const artistKey = sanitizeMediaString(artistName);
-        const albumKey = `${artistKey}-${sanitizeMediaString(albumName)}`;
-
-        let { data: artistData, error: artistError } = await supabase
-          .from("artists")
-          .select("*")
-          .ilike("name_string", artistName)
-          .single();
-
-        if (artistError && artistError.code === "PGRST116") {
-          const { error: insertArtistError } = await supabase
-            .from("artists")
-            .insert([
-              {
-                mbid: null,
-                art: "4cef75db-831f-4f5d-9333-79eaa5bb55ee",
-                name: artistName,
-                slug: "/music",
-                tentative: true,
-                total_plays: 0,
-              },
-            ]);
-
-          if (insertArtistError) {
-            console.error(
-              "Error inserting artist: ",
-              insertArtistError.message
-            );
-            return new Response(
-              JSON.stringify({
-                status: "error",
-                message: insertArtistError.message,
-              }),
-              { headers: { "Content-Type": "application/json" } }
-            );
-          }
-
-          await sendEmail(
-            "New tentative artist record",
-            `A new tentative artist record was inserted:\n\nArtist: ${artistName}\nKey: ${artistKey}`,
-            authHeader
-          );
-          ({ data: artistData, error: artistError } = await supabase
-            .from("artists")
-            .select("*")
-            .ilike("name_string", artistName)
-            .single());
-        }
-
-        if (artistError) {
-          console.error("Error fetching artist:", artistError.message);
-          return new Response(
-            JSON.stringify({ status: "error", message: artistError.message }),
-            { headers: { "Content-Type": "application/json" } }
-          );
-        }
-
-        let { data: albumData, error: albumError } = await supabase
-          .from("albums")
-          .select("*")
-          .ilike("key", albumKey)
-          .single();
-
-        if (albumError && albumError.code === "PGRST116") {
-          const { error: insertAlbumError } = await supabase
-            .from("albums")
-            .insert([
-              {
-                mbid: null,
-                art: "4cef75db-831f-4f5d-9333-79eaa5bb55ee",
-                key: albumKey,
-                name: albumName,
-                tentative: true,
-                total_plays: 0,
-                artist: artistData.id,
-              },
-            ]);
-
-          if (insertAlbumError) {
-            console.error("Error inserting album:", insertAlbumError.message);
-            return new Response(
-              JSON.stringify({
-                status: "error",
-                message: insertAlbumError.message,
-              }),
-              { headers: { "Content-Type": "application/json" } }
-            );
-          }
-
-          await sendEmail(
-            "New tentative album record",
-            `A new tentative album record was inserted:\n\nAlbum: ${albumName}\nKey: ${albumKey}\nArtist: ${artistName}`,
-            authHeader
-          );
-          ({ data: albumData, error: albumError } = await supabase
-            .from("albums")
-            .select("*")
-            .ilike("key", albumKey)
-            .single());
-        }
-
-        if (albumError) {
-          console.error("Error fetching album:", albumError.message);
-          return new Response(
-            JSON.stringify({ status: "error", message: albumError.message }),
-            { headers: { "Content-Type": "application/json" } }
-          );
-        }
-
-        const { error: listenError } = await supabase.from("listens").insert([
-          {
-            artist_name: artistData["name_string"] || artistName,
-            album_name: albumData["name"] || albumName,
-            track_name: trackName,
-            listened_at: listenedAt,
-            album_key: albumKey,
-          },
-        ]);
-
-        if (listenError) {
-          console.error("Error inserting listen:", listenError.message);
-          return new Response(
-            JSON.stringify({ status: "error", message: listenError.message }),
-            { headers: { "Content-Type": "application/json" } }
-          );
-        }
-
-        console.log("Listen record inserted successfully");
-      }
-
-      return new Response(JSON.stringify({ status: "success" }), {
-        headers: { "Content-Type": "application/json" },
-      });
-    } catch (e) {
-      console.error("Error processing request:", e.message);
-      return new Response(
-        JSON.stringify({ status: "error", message: e.message }),
-        { headers: { "Content-Type": "application/json" } }
-      );
-    }
-  },
-};
diff --git a/workers/scrobble/wrangler.template.toml b/workers/scrobble/wrangler.template.toml
deleted file mode 100644
index 2b5f490..0000000
--- a/workers/scrobble/wrangler.template.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-name = "scrobble-worker"
-main = "./index.js"
-compatibility_date = "2023-01-01"
-
-account_id = "${CF_ACCOUNT_ID}"
-workers_dev = true
-
-[observability]
-enabled = true
-
-[env.production]
-name = "scrobble-worker-production"
-routes = [
-  { pattern = "coryd.dev/api/scrobble*", zone_id = "${CF_ZONE_ID}" }
-]
diff --git a/workers/search/index.js b/workers/search/index.js
deleted file mode 100644
index 061b788..0000000
--- a/workers/search/index.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import { createClient } from "@supabase/supabase-js";
-
-export default {
-  async fetch(request, env) {
-    const supabaseUrl = env.SUPABASE_URL;
-    const supabaseKey = env.SUPABASE_KEY;
-    const supabase = createClient(supabaseUrl, supabaseKey);
-
-    const { searchParams } = new URL(request.url);
-    const query = searchParams.get("q") || "";
-    const rawTypes = searchParams.getAll("type") || [];
-    const types = rawTypes.length > 0 ? rawTypes[0].split(",") : null;
-
-    const page = parseInt(searchParams.get("page") || "1", 10);
-    const pageSize = parseInt(searchParams.get("pageSize") || "10", 10);
-    const offset = (page - 1) * pageSize;
-
-    try {
-      const { data, error } = await supabase.rpc("search_optimized_index", {
-        search_query: query,
-        page_size: pageSize,
-        page_offset: offset,
-        types: types.length ? types : null,
-      });
-
-      if (error) {
-        console.error("Error fetching search data:", error);
-        return new Response(JSON.stringify({ results: [], total: 0 }), {
-          status: 500,
-        });
-      }
-
-      const total = data.length > 0 ? data[0].total_count : 0;
-      const results = data.map(({ total_count, ...item }) => item);
-
-      return new Response(JSON.stringify({ results, total, page, pageSize }), {
-        headers: { "Content-Type": "application/json" },
-      });
-    } catch (error) {
-      console.error("Unexpected error:", error);
-      return new Response("Internal Server Error", { status: 500 });
-    }
-  },
-};
\ No newline at end of file
diff --git a/workers/search/wrangler.template.toml b/workers/search/wrangler.template.toml
deleted file mode 100644
index a59b41f..0000000
--- a/workers/search/wrangler.template.toml
+++ /dev/null
@@ -1,12 +0,0 @@
-name = "search-worker"
-main = "./index.js"
-compatibility_date = "2023-01-01"
-
-account_id = "${CF_ACCOUNT_ID}"
-workers_dev = true
-
-[env.production]
-name = "search-worker-production"
-routes = [
-  { pattern = "coryd.dev/api/search*", zone_id = "${CF_ZONE_ID}" },
-]
\ No newline at end of file