diff --git a/.github/workflows/build.ci.yml b/.github/workflows/build.ci.yml
index a282e83..2da0d69 100644
--- a/.github/workflows/build.ci.yml
+++ b/.github/workflows/build.ci.yml
@@ -70,21 +70,21 @@ jobs:
       - name: "Setup: Checkout"
         uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
       - name: "Setup: GraalVM (Java ${{ vars.JVM_VERSION }})"
-        uses: graalvm/setup-graalvm@d1891786152ae96fee67f86c3a1eae596291bbed # v1
+        uses: graalvm/setup-graalvm@2f25c0caae5b220866f732832d5e3e29ff493338 # v1
         with:
           java-version: ${{ vars.JVM_VERSION || '19' }}
           check-for-updates: true
           github-token: ${{ secrets.GITHUB_TOKEN }}
       - id: "auth"
         name: "Setup: Authorize Service Account"
-        uses: "google-github-actions/auth@35b0e87d162680511bf346c299f71c9c5c379033" # v1
+        uses: "google-github-actions/auth@71fee32a0bb7e97b4d33d548e7d957010649d8fa" # v1
         with:
           credentials_json: "${{ secrets.BUILDBOT_SERVICE_ACCOUNT }}"
           create_credentials_file: true
           export_environment_variables: true
           cleanup_credentials: true
       - name: "Setup: Node"
-        uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3
+        uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v3
         with:
           node-version: ${{ vars.NODE_VERSION }}
       - name: "Setup: PNPM"
@@ -96,7 +96,7 @@ jobs:
       - uses: bazelbuild/setup-bazelisk@95c9bf48d0c570bb3e28e57108f3450cd67c1a44 # v2
       - name: "🛠️ Build"
         id: bazelbuild
-        run: bazel build --config=adc --config=ci //elide/runtime/ts //elide/runtime/js
+        run: bazel build --config=adc --config=ci //elide/runtime/...
       - name: "🛠️ Test"
         id: bazeltest
         env:
diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml
index 9d08491..3335641 100644
--- a/.github/workflows/scorecards.yml
+++ b/.github/workflows/scorecards.yml
@@ -41,7 +41,7 @@ jobs:
           persist-credentials: false
 
       - name: "Run analysis"
-        uses: ossf/scorecard-action@99c53751e09b9529366343771cc321ec74e9bd3d # v2.0.6
+        uses: ossf/scorecard-action@dc50aa9510b46c811795eb24b2f1ba02a914e534 # v2.3.3
         with:
           results_file: results.sarif
           results_format: sarif
@@ -63,7 +63,7 @@ jobs:
       # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
       # format to the repository Actions tab.
       - name: "Upload artifact"
-        uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
+        uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
         with:
           name: SARIF file
           path: results.sarif
diff --git a/.version b/.version
index 670b460..08808f9 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-1.0.0-alpha9
+1.0.0-alpha10
diff --git a/elide/runtime/js/BUILD.bazel b/elide/runtime/js/BUILD.bazel
index aa9407f..811f3c1 100644
--- a/elide/runtime/js/BUILD.bazel
+++ b/elide/runtime/js/BUILD.bazel
@@ -13,6 +13,7 @@ load(
     "BASE_JS_EXTERNS",
     "TS_MODULES",
     "NODE_BUILTINS",
+    "ELIDE_BUILTINS",
 )
 package(
     default_visibility = ["//visibility:public"],
@@ -44,13 +45,27 @@ ts_config(
 ## -- Entrypoints -- ##
 
 EXTERNS = BASE_JS_EXTERNS + [
-    # Any additional externs here.
+    # Nothing at this time.
 ]
 
+js_library(
+    name = "preload-js",
+    srcs = ["preload.js"],
+    suppress = [
+        "JSC_UNKNOWN_EXPR_TYPE",
+        "JSC_UNDEFINED_VARIABLE",
+    ],
+)
+
 js_library(
     name = "entrypoint-js",
     srcs = ["entrypoint.js"],
+    deps = [":preload-js"],
     ts_deps = TS_MODULES,
+    suppress = [
+        "JSC_UNKNOWN_EXPR_TYPE",
+        "JSC_INEXISTENT_PROPERTY",
+    ],
 )
 
 js_runtime(
@@ -76,4 +91,7 @@ runtime_dist(
     modules = [
         "//elide/runtime/js/modules/%s" % m for m in NODE_BUILTINS
     ],
+    elide_modules = [
+        "//elide/runtime/js/modules/elide/%s" % m for m in ELIDE_BUILTINS
+    ],
 )
diff --git a/elide/runtime/js/MANIFEST.MF b/elide/runtime/js/MANIFEST.MF
index ac440b1..3375052 100644
--- a/elide/runtime/js/MANIFEST.MF
+++ b/elide/runtime/js/MANIFEST.MF
@@ -10,5 +10,5 @@ Name: elide/runtime/js/
 Specification-Title: Elide Runtime for JavaScript
 Specification-Version: 1.0
 Specification-Vendor: Elide Ventures, Inc.
-Name: elide/runtime/js/runtime.gz
+Name: elide/runtime/js/js.runtime.tar.gz
 Content-Type: application/javascript;encoding=gzip;elide-runtime
diff --git a/elide/runtime/js/bridge/BUILD.bazel b/elide/runtime/js/bridge/BUILD.bazel
index 7320b3b..ceb91bf 100644
--- a/elide/runtime/js/bridge/BUILD.bazel
+++ b/elide/runtime/js/bridge/BUILD.bazel
@@ -17,6 +17,10 @@ ts_library(
     deps = [
         "//elide/runtime/js/intrinsics/err",
     ],
+    suppress = [
+        "JSC_INEXISTENT_PROPERTY",
+        "JSC_UNRECOGNIZED_TYPE_ERROR",
+    ],
 )
 
 alias(
diff --git a/elide/runtime/js/bridge/jserror.ts b/elide/runtime/js/bridge/jserror.ts
index bfd7962..b416b7a 100644
--- a/elide/runtime/js/bridge/jserror.ts
+++ b/elide/runtime/js/bridge/jserror.ts
@@ -11,138 +11,8 @@
  * License for the specific language governing permissions and limitations under the License.
  */
 
-import { ValueError } from "../intrinsics/err";
 import { installGlobal } from "../intrinsics/base";
-
-/**
- * # JS: Error Info
- *
- * Interface for information about an error which is to be surfaced in the JavaScript guest context. Errors of this kind
- * carry a `message`, a `code`, and a potential `cause`, which is a recursive reference to another error payload.
- */
-type ErrorInfo = {
-    /** Error message string. */
-    message?: string;
-
-    /** Error code or ID. */
-    code?: string;
-
-    /** Cause of this error. */
-    cause?: ErrorInfo;
-};
-
-/**
- * # JS: Error Options
- *
- * Interface for options which affect creating a bridged JavaScript error. The error can be created and thrown in the
- * same step, or throwing the error can be deferred.
- */
-type ErrorOptions = {
-    /** Whether to immediately throw the error created for the provided `info`. */
-    immediate?: boolean;
-};
-
-/**
- * # JS: Error Constructor.
- *
- * Expected interface for JavaScript errors' constructors. This is included inline to explain to the Closure Compiler
- * how error constructors are expected to behave.
- */
-interface JsErrorConstructor<E extends Error> {
-    new(message?: string): E;
-    (message?: string): E;
-    readonly prototype: E;
-}
-
-/**
- * # JS: Intrinsic Error Bridge
- *
- * Describes the interface of a JavaScript error bridging intrinsic, which is responsible for surfacing JavaScript
- * errors which occur at a deeper level in the VM.
- *
- * When a Java-style exception is raised during VM processing, the outer VM host can reach in and use this bridge to
- * structure the error in a familiar way for JavaScript guest code. The exception is wrapped with contextual information
- * and re-thrown.
- */
-export interface IntrinsicErrorBridge {
-    /**
-     * Create a `TypeError` with the provided `errInfo`.
-     *
-     * @param errInfo Error info to use to create the type error.
-     * @param options Options which apply to throwing this error.
-     * @return Error which should be thrown or consumed.
-     * @export
-     * @public
-     */
-    typeError(errInfo: string | ErrorInfo, options?: ErrorOptions): TypeError;
-
-    /**
-     * Create a `ValueError` with the provided `errInfo`.
-     *
-     * @param errInfo Error info to use to create the value error.
-     * @param options Options which apply to throwing this error.
-     * @return Error which should be thrown or consumed.
-     * @export
-     * @public
-     */
-    valueError(errInfo: string | ErrorInfo, options?: ErrorOptions): ValueError;
-}
-
-/**
- * Create an error from the provided `info`.
- *
- * @template E Error type.
- * @param ctor Constructor for the error type.
- * @param err Error info.
- * @param options Options which apply to throwing this error.
- * @return Error instance.
- * @suppress {checkTypes,reportUnknownTypes}
- */
-function errFromInfo<E extends Error>(ctor: JsErrorConstructor<E>, err: string | ErrorInfo, options?: ErrorOptions): E {
-    let msg;
-    if (typeof err === "string") {
-        msg = err;
-    } else {
-        msg = err.message;
-    }
-    const errObj: E = new ctor(msg);
-    if (options?.immediate == false) {
-        return errObj;
-    } else {
-        throw errObj;
-    }
-}
-
-// Main implementation of the `IntrinsicErrorBridge` interface.
-class IntrinsicErrorBridgeImpl implements IntrinsicErrorBridge {
-    /** @inheritDoc */
-    typeError(errInfo: string | ErrorInfo, options?: ErrorOptions): TypeError {
-        return errFromInfo(TypeError as unknown as JsErrorConstructor<TypeError>, errInfo, options);
-    }
-
-    /** @inheritDoc */
-    valueError(errInfo: string | ErrorInfo, options?: ErrorOptions): ValueError {
-        let msg;
-        if (typeof errInfo === "string") {
-            msg = errInfo;
-        } else {
-            msg = errInfo.message;
-        }
-        const exc = new ValueError(msg);
-        if (options?.immediate === false) {
-            return exc;
-        } else {
-            throw exc;
-        }
-    }
-}
-
-/**
- * Main error bridge singleton.
- *
- * @see IntrinsicErrorBridge for the structure of this singleton.
- */
-export const errBridge: IntrinsicErrorBridge = new IntrinsicErrorBridgeImpl();
+const NativeValueError = primordials['NativeValueError'];
 
 // Install as global.
-installGlobal("__errBridge", errBridge);
+installGlobal("ValueError", NativeValueError);
diff --git a/elide/runtime/js/config.bzl b/elide/runtime/js/config.bzl
index 30ecbd4..3ca29c9 100644
--- a/elide/runtime/js/config.bzl
+++ b/elide/runtime/js/config.bzl
@@ -51,7 +51,6 @@ TS_MODULE_PACKAGE = "//elide/runtime/js/intrinsics"
 TS_MODULES = ["%s:%s" % (TS_MODULE_PACKAGE, t) for t in [
     # Top-level modules.
     "base64",
-    "console",
     "timers",
 ]] + ["%s/%s:%s" % (TS_MODULE_PACKAGE, t, t) for t in [
     # Sub-modules
@@ -105,6 +104,7 @@ NODE_BUILTINS = [
     "stream/web",
     "string_decoder",
     "test",
+    "timers",
     "timers/promises",
     "tls",
     "trace_events",
@@ -117,3 +117,10 @@ NODE_BUILTINS = [
     "worker",
     "zlib",
 ]
+
+## Elide Builtins
+## --------------
+## Registers modules which are provided by Elide, but not Node.
+ELIDE_BUILTINS = [
+    "sqlite",
+]
diff --git a/elide/runtime/js/entrypoint.js b/elide/runtime/js/entrypoint.js
index 6d7a74f..524ecb4 100644
--- a/elide/runtime/js/entrypoint.js
+++ b/elide/runtime/js/entrypoint.js
@@ -17,12 +17,11 @@
 
 goog.module('elide.runtime.js.entry');
 
-// Top-level Intrinsics.
-goog.require('elide.runtime.js.bridge.jserror');
-goog.require('elide.runtime.js.intrinsics.base64');
-goog.require('elide.runtime.js.intrinsics.console');
-goog.require('elide.runtime.js.intrinsics.err.ValueError');
-goog.require('elide.runtime.js.intrinsics.url.URL');
+const {
+  app_env,
+  version,
+  node_process,
+} = primordials;
 
 /**
  * Type structure of a Node process object.
@@ -47,50 +46,26 @@ let NodeProcess;
 */
 let EnhancedNodeProcess;
 
-/**
- * Global symbol where application environment is injected.
- *
- * @const
- * @type {!string}
- */
-const APP_ENV = '__Elide_app_env__';
-
-/**
- * Global symbol where Elide version is injected.
- *
- * @const
- * @type {!string}
- */
-const RUNTIME_VERSION = '__Elide_version__';
-
-/**
- * Global symbol where the intrinsic process object is injected.
- *
- * @const
- * @type {!string}
- */
-const RUNTIME_PROCESS = '__Elide_node_process__';
-
 /**
  * Application environment injected by the Elide runtime.
  *
  * @type {!Object<string, !string>}
  */
-const injectedApplicationEnvironment = globalThis[APP_ENV];
+const injectedApplicationEnvironment = app_env;
 
 /**
  * Elide version provided by the runtime.
  *
  * @type {!string}
  */
-const elideVersion = globalThis[RUNTIME_VERSION];
+const elideVersion = version;
 
 /**
  * Intrinsic process object, injected by the runtime.
  *
  * @type {!EnhancedNodeProcess}
  */
-const intrinsicProcess = globalThis[RUNTIME_PROCESS];
+const intrinsicProcess = node_process;
 
 /**
  * Return the Node Process API to use.
@@ -98,54 +73,8 @@ const intrinsicProcess = globalThis[RUNTIME_PROCESS];
  * @returns {!EnhancedNodeProcess}
  */
 function nodeProcessAPI() {
-    if (!intrinsicProcess) {
-        throw new Error('Node process API is not available.');
-    }
     return intrinsicProcess;
 }
 
 globalThis['window'] = undefined;
 globalThis['gc'] = null;
-
-/**
- * Global application object.
- *
- * @type {!Object<string, *>}
- */
-const App = {};
-globalThis['global'] = App;
-globalThis['self'] = App;
-
-/**
- * Global Elide object.
- *
- * @type {{
- *   version: !string,
- *   process: !EnhancedNodeProcess,
- *   context: {build: boolean, runtime: boolean}
- * }}
- */
-const Elide = {
-    'process': nodeProcessAPI(),
-    'version': elideVersion,
-    'context': {
-        'build': false,
-        'runtime': true
-    },
-};
-
-globalThis['Elide'] = Elide;
-
-/**
- * Global process proxy object.
- *
- * @type {!EnhancedNodeProcess}
- */
-const process = /** @type {!EnhancedNodeProcess} */ ({
-    'pid': Elide.process.pid,
-    'cwd': Elide.process.cwd,
-    'env': Elide.process.env,
-    ...(Elide.process || {}),
-});
-
-globalThis['process'] = process;
diff --git a/elide/runtime/js/intrinsics.externs.js b/elide/runtime/js/intrinsics.externs.js
index 4e0e04d..e99a160 100644
--- a/elide/runtime/js/intrinsics.externs.js
+++ b/elide/runtime/js/intrinsics.externs.js
@@ -19,6 +19,15 @@
  * @author samuel.gammon@gmail.com (Sam Gammon)
  */
 
+// Primordials are provided to runtime internals from the host VM.
+
+/**
+ * Host-provided bindins.
+ *
+ * @type {!Object<string, *>}
+ */
+const primordials = {};
+
 /**
  * Console base.
  *
diff --git a/elide/runtime/js/intrinsics/BUILD.bazel b/elide/runtime/js/intrinsics/BUILD.bazel
index 55aa4e4..9dfd5c0 100644
--- a/elide/runtime/js/intrinsics/BUILD.bazel
+++ b/elide/runtime/js/intrinsics/BUILD.bazel
@@ -38,14 +38,6 @@ ts_library(
     module = MODULE_NAME,
 )
 
-ts_library(
-    name = "console",
-    srcs = [
-        "console.ts",
-    ],
-    module = MODULE_NAME,
-)
-
 ts_library(
     name = "timers",
     srcs = [
diff --git a/elide/runtime/js/intrinsics/base64.ts b/elide/runtime/js/intrinsics/base64.ts
index 857c09b..3d28a3d 100644
--- a/elide/runtime/js/intrinsics/base64.ts
+++ b/elide/runtime/js/intrinsics/base64.ts
@@ -11,33 +11,7 @@
  * License for the specific language governing permissions and limitations under the License.
  */
 
-import {globalContext, installGlobal} from "./base";
-import type {Base64} from "./primordials";
-
-/**
- * @return Intrinsic Base64 bridge.
- */
-function resolveIntrinsic(): Base64 {
-    return globalContext['Base64'] as Base64;
-}
-
-/**
- * Standard DOM `btoa` function which encodes a string to Base64.
- *
- * @param input Input string to encode.
- */
-function base64Encode(input: string): string {
-    return resolveIntrinsic().encode(input);
-}
-
-/**
- * Standard DOM `atob` function which decodes a string from base64.
- *
- * @param input Input string to decode.
- */
-function base64Decode(input: string): string {
-    return resolveIntrinsic().decode(input);
-}
+export {};
 
 declare global {
     /**
@@ -58,6 +32,3 @@ declare global {
     // @ts-ignore
     export const atob: (input: string) => string;
 }
-
-installGlobal('btoa', base64Encode);
-installGlobal('atob', base64Decode);
diff --git a/elide/runtime/js/intrinsics/blob/Blob.ts b/elide/runtime/js/intrinsics/blob/Blob.ts
index 2413c58..3adf246 100644
--- a/elide/runtime/js/intrinsics/blob/Blob.ts
+++ b/elide/runtime/js/intrinsics/blob/Blob.ts
@@ -11,9 +11,5 @@
  * License for the specific language governing permissions and limitations under the License.
  */
 
-/**
- * TBD.
- */
-export interface Blob {
-    // Not yet implemented.
-}
+// @ts-ignore
+export const Blob = globalThis['Blob'];
diff --git a/elide/runtime/js/intrinsics/console.ts b/elide/runtime/js/intrinsics/console.ts
deleted file mode 100644
index 81eecb6..0000000
--- a/elide/runtime/js/intrinsics/console.ts
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- * Copyright (c) 2024 Elide Technologies, Inc.
- *
- * Licensed under the MIT license (the "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   https://opensource.org/license/mit/
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under the License.
- */
-
-// noinspection JSUnusedGlobalSymbols
-
-import { globalContext, installGlobal } from "./base";
-import type { IConsole } from "./primordials";
-
-/** Enumerates available log levels. */
-export enum LogLevel {
-    /** Debug-level logging: informs the console about expected program states. */
-    DEBUG = 'debug',
-
-    /** Info-level logging: informs the console about notable expected program states. */
-    INFO = 'info',
-
-    /** Warn-level logging: notifies the developer of a sub-optimal program state. */
-    WARN = 'warn',
-
-    /** Error-level logging: emits a message about an unexpected and invalid program state. */
-    ERROR = 'error',
-}
-
-// Throw an `Error` describing an unsupported method.
-function throwNotSupported(): Error {
-    return new Error('Method not supported');
-}
-
-/**
- * Abstract console.
- *
- * Provides base implementation code for {@link IConsole} implementations. In particular, rollup and formatting of
- * arguments is implemented here.
- *
- * ### WhatWG Console Specification: Unsupported Features
- *
- * - Extended or non-spec methods for performance measurement are not available (`profile`, etc)
- * - Methods related to "grouping" log messages do nothing, since many server-side log systems are not capable of
- *   grouping messages after the fact.
- */
-abstract class AbstractConsole implements IConsole {
-    /**
-     * Deliver a log message to the console backend.
-     *
-     * During this process, the provided `args` may be converted to string representations.
-     *
-     * @param level Log level of the message.
-     * @param args Arguments (portions) of the message.
-     */
-    abstract deliverLog(level: LogLevel, args: any[]): void;
-
-    /** @inheritDoc */
-    trace(...args: any[]): void {
-        this.deliverLog(LogLevel.DEBUG, args);
-    }
-
-    /** @inheritDoc */
-    log(...args: any[]): void {
-        this.deliverLog(LogLevel.DEBUG, args);
-    }
-
-    /** @inheritDoc */
-    debug(...args: any[]): void {
-        this.deliverLog(LogLevel.DEBUG, args);
-    }
-
-    /** @inheritDoc */
-    info(...args: any[]): void {
-        this.deliverLog(LogLevel.INFO, args);
-    }
-
-    /** @inheritDoc */
-    warn(...args: any[]): void {
-        this.deliverLog(LogLevel.WARN, args);
-    }
-
-    /** @inheritDoc */
-    error(...args: any[]): void {
-        this.deliverLog(LogLevel.ERROR, args);
-    }
-
-    /**
-     * ## Console: `assert`
-     *
-     * Assert the provided `condition`, failing with `data` message portions if the condition is `false`.
-     *
-     * From MDN:
-     * "The console.assert() method writes an error message to the console if the assertion is false. If the assertion
-     * is true, nothing happens."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/assert
-     *
-     * @param condition Condition to assert.
-     * @param data Arguments of any type, which the developer wishes to emit to the console; any number of arguments may
-     *   be passed, and each argument will be emitted to the same console message call.
-     */
-    assert(condition?: boolean, ...data: any[]): void;
-
-    /**
-     * ## Console: `assert`
-     *
-     * Assert the provided `value` is truthy, failing with `message` if the value is `false`, and applying the provided
-     * `optionalParams` to format the message components.
-     *
-     * From MDN:
-     * "The console.assert() method writes an error message to the console if the assertion is false. If the assertion
-     * is true, nothing happens."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/assert
-     *
-     * @param value Condition to assert.
-     * @param message Message to display if the condition is `false`.
-     * @param optionalParams Format parameters for the provided `message`.
-     */
-    assert(value?: unknown, message?: unknown, ...optionalParams: unknown[]): void {
-        throw new Error("Method not implemented.");
-    }
-
-    /**
-     * ## Console: `clear`
-     *
-     * Clear the terminal/console screen, where supported. Server-side, this operation is a no-op.
-     *
-     * From MDN:
-     * "The console.clear() method clears the console if the console allows it. A graphical console, like those running
-     * on browsers, will allow it; a console displaying on the terminal, like the one running on Node, will not support
-     * it, and will have no effect (and no error)."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/clear
-     */
-    clear(): void {
-        // no-op
-    }
-
-    /**
-     * ## Console: `count`
-     *
-     * Apply an increment to the counter represented by `label`.
-     *
-     * From MDN:
-     * "The console.count() method logs the number of times that this particular call to count() has been called."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/count
-     *
-     * @param label Label for the counter to increment.
-     */
-    count(label?: unknown): void {
-        throw throwNotSupported();
-    }
-
-    /**
-     * ## Console: `countReset`
-     *
-     * Reset the counter represented by `label`.
-     *
-     * From MDN:
-     * "The console.countReset() method resets counter used with console.count()."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/countReset
-     *
-     * @param label Label for the counter to reset.
-     */
-    countReset(label?: unknown): void {
-        throw throwNotSupported();
-    }
-
-    /**
-     * ## Console: `dir`
-     *
-     * Where supported, display an interactive list of the properties of the provided `object`. Server-side, this method
-     * may simply print a string representation of the object.
-     *
-     * From MDN:
-     * "The method console.dir() displays an interactive list of the properties of the specified JavaScript object. The
-     * output is presented as a hierarchical listing with disclosure triangles that let you see the contents of child
-     * objects. In other words, console.dir() is the way to see all the properties of a specified JavaScript object in
-     * console by which the developer can easily get the properties of the object."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/dir
-     *
-     * @param obj The JavaScript object to print a directory of.
-     * @param options Options for the output.
-     */
-    dir(obj?: any | unknown, options?: any): void {
-        throw throwNotSupported();
-    }
-
-    /**
-     * ## Console: `dirxml`
-     *
-     * Where supported, display an interactive tree of the properties of the provided `object`. Server-side, this method
-     * may simply print a string representation of the object.
-     *
-     * From MDN:
-     * "The console.dirxml() method displays an interactive tree of the descendant elements of the specified XML/HTML
-     * element. If it is not possible to display as an element the JavaScript Object view is shown instead. The output
-     * is presented as a hierarchical listing of expandable nodes that let you see the contents of child nodes."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/dirxml
-     *
-     * @param data Object to print a directory of.
-     */
-    dirxml(...data: any[]): void {
-        throw throwNotSupported();
-    }
-
-    /**
-     * ## Console: `group`
-     *
-     * Create a new inline group within the output terminal, causing subsequent log messages to be enclosed within the
-     * declared group. Server-side, this method may be a no-op or may emit a regular log message.
-     *
-     * From MDN:
-     * "The console.group() method creates a new inline group in the Web console log, causing any subsequent console
-     * messages to be indented by an additional level, until console.groupEnd() is called."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/group
-     *
-     * @param label Label to display for the group.
-     */
-    group(...label: any[]): void {
-        throw throwNotSupported();
-    }
-
-    /**
-     * ## Console: `groupCollapsed`
-     *
-     * Create a new inline group within the output terminal, causing subsequent log messages to be enclosed within the
-     * declared group. The group should display as collapsed by default. Server-side, this method may be a no-op or may
-     * emit a regular log message.
-     *
-     * From MDN:
-     * "The console.groupCollapsed() method creates a new inline group in the Web Console. Unlike console.group(),
-     * however, the new group is created collapsed. The user will need to use the disclosure button next to it to expand
-     * it, revealing the entries created in the group."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/groupCollapsed
-     *
-     * @param label Label to display for the group.
-     */
-    groupCollapsed(...label: any[]): void {
-        throw throwNotSupported();
-    }
-
-    /**
-     * ## Console: `groupEnd`
-     *
-     * Finish the active inline log group, if active (otherwise, this method is a no-op). Server-side, this method may
-     * be a no-op or may emit a regular log message.
-     *
-     * From MDN:
-     * "The console.groupEnd() method exits the current inline group in the Web console. See Using groups in the console
-     * in the console documentation for details and examples."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/groupEnd
-     */
-    groupEnd(): void {
-        throw throwNotSupported();
-    }
-
-    /**
-     * ## Console: `table`
-     *
-     * Emit a depiction of tabular data to the console, applying the provided `properties` to configure columns.
-     *
-     * From MDN:
-     * "The console.table() method displays tabular data as a table. This function takes one mandatory argument `data`,
-     * which must be an array or an object, and one additional optional parameter columns. It logs data as a table. Each
-     * element in the array (or enumerable property if data is an object) will be a row in the table."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/table
-     *
-     * @param tabularData Tabular data to display; must be an array of rows, or an object.
-     * @param properties Properties to consider as columns for the table.
-     */
-    table(tabularData?: unknown, properties?: unknown): void {
-        throw throwNotSupported();
-    }
-
-    /**
-     * ## Console: `time`
-     *
-     * Starts a named timer for an arbitrary operation.
-     *
-     * From MDN:
-     * "The console.time() method starts a timer you can use to track how long an operation takes. You give each timer a
-     * unique name, and may have up to 10,000 timers running on a given page. When you call console.timeEnd() with the
-     * same name, the browser will output the time, in milliseconds, that elapsed since the timer was started."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/time
-     *
-     * @param label Label for the timer.
-     */
-    time(label?: string | unknown): void {
-        throw throwNotSupported();
-    }
-
-    /**
-     * ## Console: `timeEnd`
-     *
-     * Concludes a named timer for an arbitrary operation, which was previously started with `time`. When this method is
-     * called, the timer result is typically logged.
-     *
-     * From MDN:
-     * "The console.timeEnd() stops a timer that was previously started by calling console.time()."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/timeEnd
-     *
-     * @param label Label for the timer.
-     */
-    timeEnd(label?: string | unknown): void {
-        throw throwNotSupported();
-    }
-
-    /**
-     * ## Console: `timeLog`
-     *
-     * Log the time elapsed since the named timer was started, via `time`. The timer is not reset or otherwise modified
-     * when using this method.
-     *
-     * From MDN:
-     * "The console.timeLog() method logs the current value of a timer that was previously started by calling
-     * console.time()."
-     *
-     * See also:
-     * https://developer.mozilla.org/en-US/docs/Web/API/console/timeLog
-     *
-     * @param label Label for the timer.
-     */
-    timeLog(label: string | unknown): void {
-        throw throwNotSupported();
-    }
-}
-
-/** JS bridge to the console intrinsics. */
-export class ConsoleBridge extends AbstractConsole {
-    // Acquire the intrinsic console so that we can proxy to it.
-    private acquireIntrinsic(): IConsole {
-        return globalContext["Console"] as IConsole;
-    }
-
-    /** @inheritDoc */
-    deliverLog(level: string, args: any[]) {
-        const intrinsic = this.acquireIntrinsic();
-        switch (level) {
-            case 'trace': intrinsic.log(args); break;
-            case 'debug': intrinsic.log(args); break;
-            case 'info': intrinsic.info(args); break;
-            case 'warn': intrinsic.warn(args); break;
-            case 'error': intrinsic.error(args); break;
-        }
-    }
-}
-
-/** Main `console` global. */
-export const console: IConsole = new ConsoleBridge();
-
-declare global {
-    // @ts-ignore
-    export const console: IConsole;
-}
-
-installGlobal('console', console);
diff --git a/elide/runtime/js/intrinsics/crypto/crypto.ts b/elide/runtime/js/intrinsics/crypto/crypto.ts
index a11bb56..1de7f5b 100644
--- a/elide/runtime/js/intrinsics/crypto/crypto.ts
+++ b/elide/runtime/js/intrinsics/crypto/crypto.ts
@@ -11,14 +11,15 @@
  * License for the specific language governing permissions and limitations under the License.
  */
 
-import {globalContext, installGlobal} from "../base";
+import {installGlobal} from "../base";
 import type {Crypto} from "../primordials";
+const { crypto } = primordials;
 
 /**
  * @return Crypto Intrinsic `Crypto` bridge.
  */
 function resolveIntrinsic(): Crypto {
-    return globalContext['__elide_crypto'] as Crypto;
+    return crypto;
 }
 
 declare global {
diff --git a/elide/runtime/js/intrinsics/url/URL.ts b/elide/runtime/js/intrinsics/url/URL.ts
index f149d9e..6962edd 100644
--- a/elide/runtime/js/intrinsics/url/URL.ts
+++ b/elide/runtime/js/intrinsics/url/URL.ts
@@ -13,7 +13,8 @@
 
 // noinspection JSUnusedGlobalSymbols
 
-import type {Blob} from "../blob/Blob";
+import {Blob} from "../blob/Blob";
+
 // import type {IURLSearchParams} from "./IURLSearchParams";
 // import type {URLSearchParams} from "./URLSearchParams";
 import type {IURL, URLInputs} from "./IURL";
@@ -56,7 +57,7 @@ declare global {
          * @param obj `Blob`, or `File`, or `MediaSource` to create a URL for.
          * @return URL reference for the provided resource.
          */
-        createObjectURL(obj: Blob): string;
+        createObjectURL(obj: typeof Blob): string;
 
         /**
          * Revoke a previously-issued temporary URL reference to a [File] or [Blob] object.
diff --git a/elide/runtime/js/modules/assert/assert.ts b/elide/runtime/js/modules/assert/assert.ts
index a01985b..8f65de7 100644
--- a/elide/runtime/js/modules/assert/assert.ts
+++ b/elide/runtime/js/modules/assert/assert.ts
@@ -17,14 +17,23 @@
  * Provides assertion primitives for use in testing and debugging.
  */
 
-const intrinsic: any = globalThis['__Elide_node_assert__'];
+const {
+  node_assert,
+  AssertionError: AssertionErrorSymbol,
+} = primordials;
+
+if (!node_assert) {
+  throw new Error(`The 'assert' module failed to load its intrinsic API.`);
+}
+
+const intrinsic: any = node_assert;
 
 /**
  * Type: `AssertionError`
  *
  * Represents an assertion failure.
  */
-export const AssertionError = globalThis['AssertionError'];
+export const AssertionError = AssertionErrorSymbol;
 
 /**
  * Type: `AssertionErrorOptions`.
@@ -57,19 +66,7 @@ export interface AssertionErrorOptions {
  * @see https://nodejs.org/api/assert.html#assertokvalue-message
  */
 export function ok(condition: any, message?: string): void {
-  if (intrinsic) {
-    intrinsic.ok(condition, message);
-  } else {
-    if (!condition) {
-      throw new AssertionError({
-        message: message || 'Assertion failed',
-        actual: condition,
-        expected: true,
-        operator: '==',
-        stackStartFn: ok
-      });
-    }
-  }
+  intrinsic.ok(condition, message);
 }
 
 /**
diff --git a/elide/runtime/js/modules/assert/strict/strict.ts b/elide/runtime/js/modules/assert/strict/strict.ts
index 7662ef0..c3b78a7 100644
--- a/elide/runtime/js/modules/assert/strict/strict.ts
+++ b/elide/runtime/js/modules/assert/strict/strict.ts
@@ -17,7 +17,12 @@
  * Provides assertion primitives for use in testing and debugging.
  */
 
-const intrinsic: any = globalThis['__Elide_node_assert_strict__'];
+const { node_assert_strict } = primordials;
+if (!node_assert_strict) {
+  throw new Error(`The 'assert/strict' module failed to load the intrinsic API.`);
+}
+
+const intrinsic: any = node_assert_strict;
 
 /**
  * Type: `AssertionError`
diff --git a/elide/runtime/js/modules/buffer/buffer.ts b/elide/runtime/js/modules/buffer/buffer.ts
index 380d1a6..1cadd6d 100644
--- a/elide/runtime/js/modules/buffer/buffer.ts
+++ b/elide/runtime/js/modules/buffer/buffer.ts
@@ -17,6 +17,8 @@
  * Provides a shim which offers a `Buffer` implementation that is compatible with Node.js-style imports.
  */
 
+const { node_buffer_module: node_buffer } = primordials;
+
 /**
  * Maximum buffer size.
  */
@@ -92,7 +94,7 @@ export function resolveObjectURL(blob: Blob): string {
  * @returns The transcoded buffer.
  */
 export function transcode(buffer: Buffer | Uint8Array, fromEnc: string, toEnc: string): Buffer {
-  throw new Error('Not implemented'); 
+  return node_buffer.transcode(buffer, fromEnc, toEnc);
 }
 
 /**
@@ -102,7 +104,7 @@ export function transcode(buffer: Buffer | Uint8Array, fromEnc: string, toEnc: s
  * @returns `true` if the buffer is valid UTF-8, otherwise `false`.
  */
 export function isUtf8(buffer: Buffer | Uint8Array): boolean {
-  throw new Error('Not implemented');
+  return node_buffer.isUtf8(buffer);
 }
 
 /**
@@ -112,7 +114,7 @@ export function isUtf8(buffer: Buffer | Uint8Array): boolean {
  * @returns `true` if the buffer is valid ASCII, otherwise `false`.
  */
 export function isAscii(buffer: Buffer | Uint8Array): boolean {
-  throw new Error('Not implemented');
+  return node_buffer.isAscii(buffer);
 }
 
 /**
@@ -126,7 +128,7 @@ export function isAscii(buffer: Buffer | Uint8Array): boolean {
  * For code running using Node.js APIs, converting between base64-encoded strings and binary data should be performed
  * using Buffer.from(str, 'base64') and buf.toString('base64').
  */
-export const btoa = globalThis['btoa'];
+export const btoa = node_buffer.btoa;
 
 /**
  * Decodes a string of Base64-encoded data into bytes, and encodes those bytes into a string using Latin-1 (ISO-8859-1).
@@ -138,7 +140,7 @@ export const btoa = globalThis['btoa'];
  * code running using Node.js APIs, converting between base64-encoded strings and binary data should be performed
  * using Buffer.from(str, 'base64') and buf.toString('base64').
  */
-export const atob = globalThis['atob'];
+export const atob = node_buffer.atob;
 
 // `Buffer` is assigned as the default export.
 export default Buffer;
diff --git a/elide/runtime/js/modules/elide/BUILD.bazel b/elide/runtime/js/modules/elide/BUILD.bazel
new file mode 100644
index 0000000..e69de29
diff --git a/elide/runtime/js/modules/elide/sqlite/BUILD.bazel b/elide/runtime/js/modules/elide/sqlite/BUILD.bazel
new file mode 100644
index 0000000..de48444
--- /dev/null
+++ b/elide/runtime/js/modules/elide/sqlite/BUILD.bazel
@@ -0,0 +1,16 @@
+load(
+    "//tools/defs:elide.bzl",
+    "js_module",
+)
+package(
+    default_visibility = ["//visibility:public"],
+)
+
+js_module(
+    name = "sqlite",
+    elide_module = True,
+    srcs = [
+        "sqlite.ts",
+        "index.ts",
+    ],
+)
diff --git a/elide/runtime/ts/entrypoint.ts b/elide/runtime/js/modules/elide/sqlite/index.ts
similarity index 76%
rename from elide/runtime/ts/entrypoint.ts
rename to elide/runtime/js/modules/elide/sqlite/index.ts
index 98ea390..f48a811 100644
--- a/elide/runtime/ts/entrypoint.ts
+++ b/elide/runtime/js/modules/elide/sqlite/index.ts
@@ -11,7 +11,4 @@
  * License for the specific language governing permissions and limitations under the License.
  */
 
-import "@elide/runtime/js/intrinsics/console";
-import "@elide/runtime/js/intrinsics/base64";
-import "@elide/runtime/js/intrinsics/blob";
-import "@elide/runtime/js/intrinsics/url";
+export * from "./sqlite";
diff --git a/elide/runtime/js/modules/elide/sqlite/package.json b/elide/runtime/js/modules/elide/sqlite/package.json
new file mode 100644
index 0000000..1469ca5
--- /dev/null
+++ b/elide/runtime/js/modules/elide/sqlite/package.json
@@ -0,0 +1,12 @@
+{
+  "name": "elide:sqlite",
+  "type": "module",
+  "module": "sqlite.mjs",
+  "main": "sqlite.cjs",
+  "exports": {
+    ".": {
+      "import": "./sqlite.mjs",
+      "require": "./sqlite.cjs"
+    }
+  }
+}
diff --git a/elide/runtime/js/modules/elide/sqlite/sqlite.ts b/elide/runtime/js/modules/elide/sqlite/sqlite.ts
new file mode 100644
index 0000000..e9302d0
--- /dev/null
+++ b/elide/runtime/js/modules/elide/sqlite/sqlite.ts
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2024 Elide Technologies, Inc.
+ *
+ * Licensed under the MIT license (the "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   https://opensource.org/license/mit/
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under the License.
+ */
+
+const { sqlite_Database } = primordials;
+if (!sqlite_Database) {
+  throw new Error(`The 'sqlite' module failed to load its intrinsic API.`);
+}
+
+/**
+ * Class: `Database`.
+ *
+ * Main database handle class.
+ */
+export const Database = sqlite_Database;
diff --git a/elide/runtime/js/modules/esbuild.config.js b/elide/runtime/js/modules/esbuild.config.js
index 35622db..d93c1a3 100644
--- a/elide/runtime/js/modules/esbuild.config.js
+++ b/elide/runtime/js/modules/esbuild.config.js
@@ -22,7 +22,7 @@ module.exports = {
   platform: "neutral",
   footer: {
       js: (
-          "// Elide JS Builtins. Copyright (c) 2023, Sam Gammon and the Elide Project Authors. All rights reserved." +
+          "// Elide JS Builtins. Copyright (c) 2023-2024, Sam Gammon and Elide Technologies, Inc. All rights reserved." +
           "\n// Components of this software are licensed separately. See https://github.com/elide-dev/elide for more."
       ),
   }
diff --git a/elide/runtime/js/modules/events/events.ts b/elide/runtime/js/modules/events/events.ts
index 9af445e..4823d56 100644
--- a/elide/runtime/js/modules/events/events.ts
+++ b/elide/runtime/js/modules/events/events.ts
@@ -17,7 +17,13 @@
  * Provides event handling primitives.
  */
 
-const intrinsic: any = globalThis['__Elide_node_events__'];
+const { node_events } = primordials;
+
+if (!node_events) {
+  throw new Error(`The 'events' module failed to load its intrinsic API.`);
+}
+
+const intrinsic: any = node_events;
 
 /**
  * The `Event` class.
diff --git a/elide/runtime/js/modules/fs/fs.ts b/elide/runtime/js/modules/fs/fs.ts
index cf76a3d..f8f6445 100644
--- a/elide/runtime/js/modules/fs/fs.ts
+++ b/elide/runtime/js/modules/fs/fs.ts
@@ -17,7 +17,17 @@
  * Provides a shim which offers a `fs` module implementation that is compatible with Node.js-style imports.
  */
 
-const internals: any = globalThis['__Elide_node_fs__']();
+const { node_fs } = primordials;
+
+if (!node_fs) {
+  throw new Error(`The 'fs' module failed to load its intrinsic API.`);
+}
+
+const intrinsic: any = node_fs();
+
+function internalsAccessor(): any {
+  return intrinsic;
+}
 
 /**
  * File system constants
@@ -138,7 +148,7 @@ export const StatWatcher = globalThis['StatWatcher'];
  * @param callback Callback function to dispatch with failures
  */
 export function access(path: string | Buffer | URL, mode: number = constants.F_OK, callback: (err: NodeJS.ErrnoException) => void): void {
-  internals.access(path, callback);
+  internalsAccessor().access(path, callback);
 }
 
 /**
@@ -153,7 +163,7 @@ export function access(path: string | Buffer | URL, mode: number = constants.F_O
  * @param mode Mode to check; defaults to `fs.constants.F_OK`
  */
 export function accessSync(path: string | Buffer | URL, mode: number = constants.F_OK): void {
-  internals.accessSync(path, mode);
+  internalsAccessor().accessSync(path, mode);
 }
 
 /**
@@ -167,7 +177,7 @@ export function accessSync(path: string | Buffer | URL, mode: number = constants
  * @param callback Callback function to dispatch with the file contents
  */
 export function appendFile(path: string | Buffer | URL, data: any, options: { encoding: string; mode?: number; flag?: string; }, callback: (err: NodeJS.ErrnoException) => void): void {
-  internals.appendFile(path, data, options, callback);
+  internalsAccessor().appendFile(path, data, options, callback);
 }
 
 /**
@@ -180,7 +190,7 @@ export function appendFile(path: string | Buffer | URL, data: any, options: { en
  * @param options Options for appending to the file
  */
 export function appendFileSync(path: string | Buffer | URL, data: any, options: { encoding: string; mode?: number; flag?: string; }): void {
-  internals.appendFileSync(path, data, options);
+  internalsAccessor().appendFileSync(path, data, options);
 }
 
 /**
@@ -193,7 +203,7 @@ export function appendFileSync(path: string | Buffer | URL, data: any, options:
  * @param callback Callback function to dispatch with failures
  */
 export function chmod(path: string | Buffer | URL, mode: number, callback: (err: NodeJS.ErrnoException) => void): void {
-  internals.chmod(path, mode, callback);
+  internalsAccessor().chmod(path, mode, callback);
 }
 
 /**
@@ -205,7 +215,7 @@ export function chmod(path: string | Buffer | URL, mode: number, callback: (err:
  * @param mode Mode to set
  */
 export function chmodSync(path: string | Buffer | URL, mode: number): void {
-  internals.chmodSync(path, mode);
+  internalsAccessor().chmodSync(path, mode);
 }
 
 /**
@@ -219,7 +229,7 @@ export function chmodSync(path: string | Buffer | URL, mode: number): void {
  * @param callback Callback function to dispatch with failures
  */
 export function chown(path: string | Buffer | URL, uid: number, gid: number, callback: (err: NodeJS.ErrnoException) => void): void {
-  internals.chown(path, uid, gid, callback);
+  internalsAccessor().chown(path, uid, gid, callback);
 }
 
 /**
@@ -232,7 +242,7 @@ export function chown(path: string | Buffer | URL, uid: number, gid: number, cal
  * @param gid Group ID to set
  */
 export function chownSync(path: string | Buffer | URL, uid: number, gid: number): void {
-  internals.chownSync(path, uid, gid);
+  internalsAccessor().chownSync(path, uid, gid);
 }
 
 /**
@@ -247,7 +257,7 @@ export function chownSync(path: string | Buffer | URL, uid: number, gid: number)
  * @param callback Callback function to dispatch with failures
  */
 export function open(path: string | Buffer | URL, flags: string | number, mode: number, callback: (err: NodeJS.ErrnoException, fd: number) => void): void {
-  internals.open(path, flags, mode, callback);
+  internalsAccessor().open(path, flags, mode, callback);
 }
 
 /**
@@ -261,7 +271,7 @@ export function open(path: string | Buffer | URL, flags: string | number, mode:
  * @returns The file descriptor
  */
 export function openSync(path: string | Buffer | URL, flags: string | number, mode: number): number {
-  return internals.openSync(path, flags, mode);
+  return internalsAccessor().openSync(path, flags, mode);
 }
 
 /**
@@ -273,7 +283,7 @@ export function openSync(path: string | Buffer | URL, flags: string | number, mo
  * @param callback Callback function to dispatch with failures
  */
 export function close(fd: number, callback: (err: NodeJS.ErrnoException) => void): void {
-  internals.close(fd, callback);
+  internalsAccessor().close(fd, callback);
 }
 
 /**
@@ -284,7 +294,7 @@ export function close(fd: number, callback: (err: NodeJS.ErrnoException) => void
  * @param fd File descriptor to close
  */
 export function closeSync(fd: number): void {
-  internals.closeSync(fd);
+  internalsAccessor().closeSync(fd);
 }
 
 /**
@@ -298,7 +308,7 @@ export function closeSync(fd: number): void {
  * @param callback Callback function to dispatch with failures
  */
 export function copyFile(src: string | Buffer | URL, dest: string | Buffer | URL, flags: number, callback: (err: NodeJS.ErrnoException) => void): void {
-  internals.copyFile(src, dest, flags, callback);
+  internalsAccessor().copyFile(src, dest, flags, callback);
 }
 
 /**
@@ -311,7 +321,7 @@ export function copyFile(src: string | Buffer | URL, dest: string | Buffer | URL
  * @param flags Flags for copying the file
  */
 export function copyFileSync(src: string | Buffer | URL, dest: string | Buffer | URL, flags: number): void {
-  internals.copyFileSync(src, dest, flags);
+  internalsAccessor().copyFileSync(src, dest, flags);
 }
 
 /**
@@ -323,7 +333,7 @@ export function copyFileSync(src: string | Buffer | URL, dest: string | Buffer |
  * @param callback Callback function to dispatch with the result
  */
 export function exists(path: string | Buffer | URL, callback: (exists: boolean) => void): void {
-  internals.exists(path, callback);
+  internalsAccessor().exists(path, callback);
 }
 
 /**
@@ -335,7 +345,7 @@ export function exists(path: string | Buffer | URL, callback: (exists: boolean)
  * @returns Whether the path exists
  */
 export function existsSync(path: string | Buffer | URL): boolean {
-  return internals.existsSync(path);
+  return internalsAccessor().existsSync(path);
 }
 
 /**
@@ -359,9 +369,9 @@ export type MkdirOptions = { recursive?: boolean; mode?: number; }
  */
 export function mkdir(path: string | Buffer | URL, optionsOrCallback: MkdirCallback | MkdirOptions, callback?: MkdirCallback): void {
   if (callback) {
-    internals.mkdir(path, optionsOrCallback as MkdirOptions, callback);
+    internalsAccessor().mkdir(path, optionsOrCallback as MkdirOptions, callback);
   } else {
-    internals.mkdir(path, optionsOrCallback as MkdirCallback);
+    internalsAccessor().mkdir(path, optionsOrCallback as MkdirCallback);
   }
 }
 
@@ -374,7 +384,7 @@ export function mkdir(path: string | Buffer | URL, optionsOrCallback: MkdirCallb
  * @param options Options for creating the directory
  */
 export function mkdirSync(path: string | Buffer | URL, options?: { recursive: boolean; mode?: number; }): void {
-  internals.mkdirSync(path, options);
+  internalsAccessor().mkdirSync(path, options);
 }
 
 /**
@@ -387,7 +397,7 @@ export function mkdirSync(path: string | Buffer | URL, options?: { recursive: bo
  * @param callback Callback function to dispatch with the file contents
  */
 export function readFile(path: string | Buffer | URL, options: { encoding: string; flag?: string; }, callback: (err: NodeJS.ErrnoException, data: string) => void): void {
-  internals.readFile(path, options, callback);
+  internalsAccessor().readFile(path, options, callback);
 }
 
 /**
@@ -400,7 +410,7 @@ export function readFile(path: string | Buffer | URL, options: { encoding: strin
  * @returns The file contents
  */
 export function readFileSync(path: string | Buffer | URL, options?: string | { encoding?: string; flag?: string; }): string {
-  return internals.readFileSync(path, options || null);
+  return internalsAccessor().readFileSync(path, options || null);
 }
 
 /**
@@ -414,7 +424,7 @@ export function readFileSync(path: string | Buffer | URL, options?: string | { e
  * @param callback Callback function to dispatch with the file contents
  */
 export function writeFile(path: string | Buffer | URL, data: any, options: { encoding: string; mode?: number; flag?: string; }, callback: (err: NodeJS.ErrnoException) => void): void {
-  internals.writeFile(path, data, options, callback);
+  internalsAccessor().writeFile(path, data, options, callback);
 }
 
 /**
@@ -427,7 +437,7 @@ export function writeFile(path: string | Buffer | URL, data: any, options: { enc
  * @param options Options for writing the file
  */
 export function writeFileSync(path: string | Buffer | URL, data: any, options: { encoding: string; mode?: number; flag?: string; }): void {
-  internals.writeFileSync(path, data, options);
+  internalsAccessor().writeFileSync(path, data, options);
 }
 
 export default {
diff --git a/elide/runtime/js/modules/fs/promises.ts b/elide/runtime/js/modules/fs/promises.ts
deleted file mode 100644
index 758de6e..0000000
--- a/elide/runtime/js/modules/fs/promises.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Intrinsic: Filesystem (Promises).
- *
- * Provides a shim which offers a `fs/promises` module implementation that is compatible with Node.js-style imports.
- */
-
-export default {};
-
diff --git a/elide/runtime/js/modules/fs/promises/fs-async.ts b/elide/runtime/js/modules/fs/promises/fs-async.ts
index 452e815..37c3541 100644
--- a/elide/runtime/js/modules/fs/promises/fs-async.ts
+++ b/elide/runtime/js/modules/fs/promises/fs-async.ts
@@ -17,7 +17,17 @@
  * Provides a shim which offers a `fs/promises` module implementation that is compatible with Node.js-style imports.
  */
 
-const internals: any = globalThis['__Elide_node_fs_promises__']();
+const { node_fs_promises } = primordials;
+
+if (!node_fs_promises) {
+  throw new Error(`The 'fs/promises' module failed to load its intrinsic API.`);
+}
+
+const intrinsic: any = node_fs_promises();
+
+function internalsAccessor(): any {
+  return intrinsic;
+}
 
 /**
  * File system constants
@@ -42,7 +52,7 @@ const constants = {
  * @returns A promise that resolves if the file is accessible
  */
 export function access(path: string | Buffer | URL, mode: number = constants.F_OK): Promise<void> {
-  return internals.access(path, mode);
+  return internalsAccessor().access(path, mode);
 }
 
 /**
@@ -55,7 +65,7 @@ export function access(path: string | Buffer | URL, mode: number = constants.F_O
  * @returns A promise that resolves with the file contents
  */
 export function readFile(path: string | Buffer | URL, options: { encoding: string; flag?: string; }): Promise<string> {
-  return internals.readFile(path, options);
+  return internalsAccessor().readFile(path, options);
 }
 
 /**
@@ -69,7 +79,7 @@ export function readFile(path: string | Buffer | URL, options: { encoding: strin
  * @returns A promise that resolves when the file is written
  */
 export function writeFile(path: string | Buffer | URL, data: string | Buffer | Uint8Array, options: { encoding: string; flag?: string; }): Promise<void> {
-  return internals.writeFile(path, data, options);
+  return internalsAccessor().writeFile(path, data, options);
 }
 
 /**
@@ -84,7 +94,7 @@ export function writeFile(path: string | Buffer | URL, data: string | Buffer | U
  * @returns A promise that resolves when the directory is created
  */
 export function mkdir(path: string | Buffer | URL, options: { recursive: boolean; }): Promise<void> {
-  return internals.mkdir(path, options);
+  return internalsAccessor().mkdir(path, options);
 }
 
 export default {
diff --git a/elide/runtime/js/modules/os/os.ts b/elide/runtime/js/modules/os/os.ts
index e522e39..4a1e724 100644
--- a/elide/runtime/js/modules/os/os.ts
+++ b/elide/runtime/js/modules/os/os.ts
@@ -17,13 +17,13 @@
  * Provides a shim which offers a `os` module implementation that is compatible with Node.js-style imports.
  */
 
+const { node_os } = primordials;
+if (!node_os) {
+  throw new Error(`The 'os' module failed to load the intrinsic API.`);
+}
+
 function intrinsic(): any {
-  // @ts-expect-error intrinsic symbol
-  const api = __Elide_node_os__;
-  if (!api) {
-    throw new Error(`The 'os' module failed to load the intrinsic API.`);
-  }
-  return api || {};
+  return node_os;
 }
 
 /**
diff --git a/elide/runtime/js/modules/path/path.ts b/elide/runtime/js/modules/path/path.ts
index 6d6af86..a4c8160 100644
--- a/elide/runtime/js/modules/path/path.ts
+++ b/elide/runtime/js/modules/path/path.ts
@@ -17,7 +17,13 @@
  * Provides a shim which offers a `path` module implementation that is compatible with Node.js-style imports.
  */
 
-const internals: any = globalThis['__Elide_node_path__'];
+const { node_path } = primordials;
+
+if (!node_path) {
+  throw new Error(`The 'path' module failed to load its intrinsic API.`);
+}
+
+const internals: any = node_path;
 
 /**
  * Represents an object with path properties.
diff --git a/elide/runtime/js/modules/process/process.ts b/elide/runtime/js/modules/process/process.ts
index fc4cef5..5adc5de 100644
--- a/elide/runtime/js/modules/process/process.ts
+++ b/elide/runtime/js/modules/process/process.ts
@@ -17,10 +17,14 @@
  * Provides a shim which offers a `process` module implementation that is compatible with Node.js-style imports.
  */
 
+const { node_process } = primordials;
+
+if (!node_process) {
+  throw new Error(`The 'process' module failed to load its intrinsic API.`);
+}
+
 function intrinsic(): any {
-  const api = globalThis['__Elide_node_process__'];
-  if (!api) throw new Error(`The 'process' module failed to load the intrinsic API.`);
-  return api || {};
+  return node_process;
 }
 
 /**
diff --git a/elide/runtime/js/modules/timers/BUILD.bazel b/elide/runtime/js/modules/timers/BUILD.bazel
index e69de29..4e62349 100644
--- a/elide/runtime/js/modules/timers/BUILD.bazel
+++ b/elide/runtime/js/modules/timers/BUILD.bazel
@@ -0,0 +1,15 @@
+load(
+    "//tools/defs:elide.bzl",
+    "js_module",
+)
+package(
+    default_visibility = ["//visibility:public"],
+)
+
+js_module(
+    name = "timers",
+    srcs = [
+        "timers.ts",
+        "index.ts",
+    ],
+)
diff --git a/elide/runtime/js/modules/timers/index.ts b/elide/runtime/js/modules/timers/index.ts
new file mode 100644
index 0000000..bd82c29
--- /dev/null
+++ b/elide/runtime/js/modules/timers/index.ts
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) 2024 Elide Technologies, Inc.
+ *
+ * Licensed under the MIT license (the "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   https://opensource.org/license/mit/
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under the License.
+ */
+
+export * from "./timers";
diff --git a/elide/runtime/js/modules/timers/package.json b/elide/runtime/js/modules/timers/package.json
new file mode 100644
index 0000000..1459aee
--- /dev/null
+++ b/elide/runtime/js/modules/timers/package.json
@@ -0,0 +1,12 @@
+{
+  "name": "timers",
+  "type": "module",
+  "module": "timers.mjs",
+  "main": "timers.cjs",
+  "exports": {
+    ".": {
+      "import": "./timers.mjs",
+      "require": "./timers.cjs"
+    }
+  }
+}
diff --git a/elide/runtime/js/modules/timers/timers.ts b/elide/runtime/js/modules/timers/timers.ts
new file mode 100644
index 0000000..f058f0d
--- /dev/null
+++ b/elide/runtime/js/modules/timers/timers.ts
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2024 Elide Technologies, Inc.
+ *
+ * Licensed under the MIT license (the "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   https://opensource.org/license/mit/
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under the License.
+ */
+
+/**
+ * Intrinsic: Timers.
+ *
+ * Implements timers using async functions.
+ */
+
+export {};
diff --git a/elide/runtime/js/modules/url/url.ts b/elide/runtime/js/modules/url/url.ts
index 17670b2..7aebc3c 100644
--- a/elide/runtime/js/modules/url/url.ts
+++ b/elide/runtime/js/modules/url/url.ts
@@ -17,7 +17,8 @@
  * Implements URL parsing and formatting.
  */
 
-const internals: any = globalThis['__Elide_node_url__'];
+const { node_url } = primordials;
+const internals: any = node_url;
 
 // Re-export built-in URL intrinsic.
 export const URL = globalThis['URL'];
diff --git a/elide/runtime/js/polyfills/BUILD.bazel b/elide/runtime/js/polyfills/BUILD.bazel
index 6aa26e1..2f4bc5d 100644
--- a/elide/runtime/js/polyfills/BUILD.bazel
+++ b/elide/runtime/js/polyfills/BUILD.bazel
@@ -16,10 +16,11 @@ package(
 POLYFILLS = {
     "abort-controller": ["abort-controller.js"],
     "buffer": ["base64.js", "buffer.js", "ieee754.js"],
-    "event": ["event-target.js"],
     "once": ["once.js"],
     "readable-stream": ["readable-stream.mjs"],
-    "text-encoder": ["textencoder.js"],
+    # --- Disabled (Implemented Natively) -------
+    # "event": ["event-target.js"],
+    # "text-encoder": ["textencoder.js"],
 }
 
 [filegroup(name = n[0], srcs = n[1]) for n in POLYFILLS.items()]
diff --git a/elide/runtime/js/polyfills/polyfills.js b/elide/runtime/js/polyfills/polyfills.js
index 1ad4ddc..20fb917 100644
--- a/elide/runtime/js/polyfills/polyfills.js
+++ b/elide/runtime/js/polyfills/polyfills.js
@@ -13,7 +13,5 @@
 
 import "./abort-controller.js";
 import "./buffer.js";
-import "./event-target.js";
 import "./once.js";
 import "./readable-stream.mjs";
-import "./textencoder.js";
diff --git a/elide/runtime/js/preload.js b/elide/runtime/js/preload.js
new file mode 100644
index 0000000..7bc620f
--- /dev/null
+++ b/elide/runtime/js/preload.js
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2024 Elide Technologies, Inc.
+ *
+ * Licensed under the MIT license (the "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   https://opensource.org/license/mit/
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under the License.
+ */
+
+goog.module('elide.runtime.js.preload');
+
+const nodeModules = [
+  'assert',
+  'assert/strict',
+  'buffer',
+  'child_process',
+  'cluster',
+  'console',
+  'crypto',
+  'dgram',
+  'diagnostics_channel',
+  'dns',
+  'dns/promises',
+  'domain',
+  'events',
+  'fs',
+  'fs/promises',
+  'http',
+  'http2',
+  'https',
+  'inspector',
+  'module',
+  'net',
+  'os',
+  'path',
+  'perf_hooks',
+  'process',
+  'querystring',
+  'readline',
+  'stream',
+  'stream/promises',
+  'string_decoder',
+  'timers',
+  'timers/promises',
+  'tls',
+  'trace_events',
+  'tty',
+  'url',
+  'util',
+  'v8',
+  'vm',
+  'wasi',
+  'worker_threads',
+  'zlib'
+];
+
+const elideModules = [
+  'sqlite'
+];
+
+/**
+ * Preload all modules.
+ */
+function preload() {
+  try {
+    for (const module of nodeModules) {
+      require(`node:${module}`);
+      import(`node:${module}`);
+      require(`${module}`);
+      import(`${module}`);
+    }
+  } catch (err) {}
+
+  try {
+    for (const module of elideModules) {
+      require(`elide:${module}`);
+      import(`elide:${module}`);
+    }
+  } catch (err) {}
+}
+
+preload();
diff --git a/elide/runtime/js/tsconfig.runtime.json b/elide/runtime/js/tsconfig.runtime.json
index 8f22af2..f93795b 100644
--- a/elide/runtime/js/tsconfig.runtime.json
+++ b/elide/runtime/js/tsconfig.runtime.json
@@ -54,6 +54,8 @@
       "ES2021.Promise",
       "es2021.intl",
       "esnext"
-    ]
+    ],
+    // Mount local type declarations.
+    "typeRoots": ["./types"],
   }
 }
diff --git a/elide/runtime/python/BUILD.bazel b/elide/runtime/python/BUILD.bazel
new file mode 100644
index 0000000..f188ff9
--- /dev/null
+++ b/elide/runtime/python/BUILD.bazel
@@ -0,0 +1,24 @@
+load(
+    "//tools/defs:elide.bzl",
+    "py_runtime",
+    "runtime_dist",
+)
+
+PYTHON_BUILTINS = [
+  "sqlite3",
+]
+
+py_runtime(
+    name = "runtime",
+    deps = ["//elide/runtime/python/%s" % m for m in PYTHON_BUILTINS],
+)
+
+## -- Distribution -- ##
+
+runtime_dist(
+    name = "dist",
+    language = "py",
+    manifest = "MANIFEST.MF",
+    target = ":runtime",
+    modules = ["//elide/runtime/python/%s" % m for m in PYTHON_BUILTINS],
+)
diff --git a/elide/runtime/python/MANIFEST.MF b/elide/runtime/python/MANIFEST.MF
new file mode 100644
index 0000000..5bde93c
--- /dev/null
+++ b/elide/runtime/python/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Created-By: Elide (https://elide.dev)
+Specification-Title: Elide Runtime
+Specification-Version: 1.0
+Specification-Vendor: Elide Ventures, Inc.
+Sealed: true
+Elide-Runtime-ID: PY
+Elide-Runtime-Version: 3.0
+Name: elide/runtime/python/
+Specification-Title: Elide Runtime for Python
+Specification-Version: 1.0
+Specification-Vendor: Elide Ventures, Inc.
+Name: elide/runtime/python/py.runtime.tar.gz
+Content-Type: application/python;encoding=gzip;elide-runtime
diff --git a/elide/runtime/python/elide/__init__.py b/elide/runtime/python/elide/__init__.py
new file mode 100644
index 0000000..cb46749
--- /dev/null
+++ b/elide/runtime/python/elide/__init__.py
@@ -0,0 +1,18 @@
+# -~- coding: utf-8 -~-
+
+#  Copyright (c) 2024 Elide Technologies, Inc.
+#
+#  Licensed under the MIT license (the "License"); you may not use this file except in compliance
+#  with the License. You may obtain a copy of the License at
+#
+#    https://opensource.org/license/mit/
+#
+#  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+#  an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#  License for the specific language governing permissions and limitations under the License.
+
+"""
+ Defines Elide-specific APIs.
+"""
+
+hello = "hi"
diff --git a/elide/runtime/python/sqlite3/BUILD.bazel b/elide/runtime/python/sqlite3/BUILD.bazel
new file mode 100644
index 0000000..5fe02c1
--- /dev/null
+++ b/elide/runtime/python/sqlite3/BUILD.bazel
@@ -0,0 +1,12 @@
+load(
+    "//tools:defs.bzl",
+    "py_library",
+)
+package(
+    default_visibility = ["//visibility:public"],
+)
+
+py_library(
+  name = "sqlite3",
+  srcs = ["__init__.py"],
+)
diff --git a/elide/runtime/python/sqlite3/__init__.py b/elide/runtime/python/sqlite3/__init__.py
new file mode 100644
index 0000000..9fca137
--- /dev/null
+++ b/elide/runtime/python/sqlite3/__init__.py
@@ -0,0 +1,19 @@
+# -~- coding: utf-8 -~-
+
+#  Copyright (c) 2024 Elide Technologies, Inc.
+#
+#  Licensed under the MIT license (the "License"); you may not use this file except in compliance
+#  with the License. You may obtain a copy of the License at
+#
+#    https://opensource.org/license/mit/
+#
+#  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+#  an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#  License for the specific language governing permissions and limitations under the License.
+
+"""
+ Defines the Python-side SQLite3 API for use in Elide; roughly follows the standardized
+ Python `sqlite3` module API.
+"""
+
+hello = "hi"
diff --git a/elide/runtime/ts/BUILD.bazel b/elide/runtime/ts/BUILD.bazel
deleted file mode 100644
index 77c860c..0000000
--- a/elide/runtime/ts/BUILD.bazel
+++ /dev/null
@@ -1,59 +0,0 @@
-package(
-    default_visibility = ["//visibility:public"],
-)
-
-load(
-    "//tools:defs.bzl",
-    "ts_config",
-    "ts_library",
-)
-load(
-    "//tools/defs:elide.bzl",
-    "ts_runtime",
-)
-load(
-    "//elide/runtime/js:config.bzl",
-    "TS_MODULES",
-)
-
-MODULE_NAME = "elide.runtime.ts"
-
-## -- Configuration -- ##
-
-filegroup(
-    name = "runtime_tsconfig_ts_json",
-    srcs = ["tsconfig.ts.json"],
-)
-
-ts_config(
-    name = "tsconfig",
-    src = ":runtime_tsconfig_ts_json",
-    deps = ["//:tsconfig"],
-)
-
-## -- Entrypoints -- ##
-
-ts_runtime(
-    name = "entrypoint-ts",
-    main = "entrypoint.ts",
-    ts_config = ":tsconfig",
-    deps = TS_MODULES + [
-        "@npm//tslib",
-    ],
-    closure_deps = [
-        "//third_party/google/tsickle:bridge",
-        "//third_party/google/tsickle:tslib",
-    ] + [
-        "//elide/runtime/js/intrinsics:base64_js",
-        "//elide/runtime/js/intrinsics:console_js",
-        "//elide/runtime/js/intrinsics/url:url_js",
-    ],
-    extra_sources = [
-        "//third_party/microsoft/typescript/tsc",
-    ],
-)
-
-alias(
-    name = "ts",
-    actual = "entrypoint-ts",
-)
diff --git a/elide/runtime/ts/tsconfig.ts.json b/elide/runtime/ts/tsconfig.ts.json
deleted file mode 100644
index d6a0d60..0000000
--- a/elide/runtime/ts/tsconfig.ts.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
-  "extends": "../../../tsconfig.base.json",
-  "compilerOptions": {
-    "allowJs": false,
-    "checkJs": false,
-    "declaration": true,
-    "paths": {
-      "@elide/runtime/*": [
-        "../*",
-        "./bazel-out/host/bin/elide/runtime/*",
-        "./bazel-out/k8-fastbuild/bin/elide/runtime/*",
-        "./bazel-out/k8-opt/bin/elide/runtime/*",
-        "./bazel-out/k8-dbg/bin/elide/runtime/*",
-        "./bazel-out/k8_amd64-fastbuild/bin/elide/runtime/*",
-        "./bazel-out/k8_amd64-opt/bin/elide/runtime/*",
-        "./bazel-out/k8_amd64-dbg/bin/elide/runtime/*",
-        "./bazel-out/darwin_amd64-opt/bin/elide/runtime/*",
-        "./bazel-out/darwin_amd64-dbg/bin/elide/runtime/*",
-        "./bazel-out/darwin_amd64-fastbuild/bin/elide/runtime/*",
-        "./bazel-out/darwin_arm64-opt/bin/elide/runtime/*",
-        "./bazel-out/darwin_arm64-dbg/bin/elide/runtime/*",
-        "./bazel-out/darwin_arm64-fastbuild/bin/elide/runtime/*"
-      ],
-      "//*": [
-        "../../*",
-        "./bazel-out/host/bin/*",
-        "./bazel-out/k8-fastbuild/bin/*",
-        "./bazel-out/k8-opt/bin/*",
-        "./bazel-out/k8-dbg/bin/*",
-        "./bazel-out/k8_amd64-fastbuild/bin/*",
-        "./bazel-out/k8_amd64-opt/bin/*",
-        "./bazel-out/k8_amd64-dbg/bin/*",
-        "./bazel-out/darwin_amd64-opt/bin/*",
-        "./bazel-out/darwin_amd64-dbg/bin/*",
-        "./bazel-out/darwin_amd64-fastbuild/bin/*",
-        "./bazel-out/darwin_arm64-opt/bin/*",
-        "./bazel-out/darwin_arm64-dbg/bin/*",
-        "./bazel-out/darwin_arm64-fastbuild/bin/*"
-      ]
-    },
-    // Library Environment
-    "lib": [
-      "es5",
-      "es6",
-      "es2015",
-      "es2016",
-      "es2017",
-      "es2018",
-      "es2019",
-      "es2020",
-      "es2021",
-      "ES2021.Promise",
-      "es2021.intl",
-      "esnext"
-    ]
-  }
-}
diff --git a/external/google/closure/externs.bzl b/external/google/closure/externs.bzl
index 2bbecd5..4284344 100644
--- a/external/google/closure/externs.bzl
+++ b/external/google/closure/externs.bzl
@@ -1,8 +1,3 @@
-
-package(
-    default_visibility = ["//visibility:public"],
-)
-
 load(
     "@elide//tools:defs.bzl",
     "closure_extern",
@@ -10,6 +5,10 @@ load(
     "js_extern",
 )
 
+package(
+    default_visibility = ["//visibility:public"],
+)
+
 ## Externs: ECMAScript 3, 5, and 6.
 ## ----------------------------------------------
 ## Always included by Closure Compiler (implied).
diff --git a/package.json b/package.json
index 1c2a4e4..dd258b7 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
     "@bazel/ibazel": "0.16.2",
     "@bazel/labs": "4.6.1",
     "@bazel/typescript": "4.6.2",
-    "@types/node": "20.12.11",
+    "@types/node": "20.14.2",
     "@types/source-map-support": "0.5.10",
     "esbuild": "0.21.2",
     "google-closure-library-types": "0.1.17",
@@ -25,8 +25,11 @@
     "protobufjs": "7.3.0",
     "source-map-support": "0.5.21",
     "tsickle": "0.46.3",
-    "tslib": "2.6.2",
+    "tslib": "2.6.3",
     "tsutils": "3.21.0",
     "typescript": "4.9.5"
+  },
+  "resolutions": {
+    "esbuild": "0.21.2"
   }
 }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ab0b41d..82bfcfe 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,1080 +1,109 @@
-lockfileVersion: '9.0'
+lockfileVersion: '6.0'
 
 settings:
   autoInstallPeers: true
   excludeLinksFromLockfile: false
 
-importers:
-
-  .:
-    devDependencies:
-      '@bazel/buildifier':
-        specifier: 6.1.2
-        version: 7.1.1
-      '@bazel/buildozer':
-        specifier: 6.1.2
-        version: 7.1.1
-      '@bazel/concatjs':
-        specifier: 4.6.2
-        version: 5.8.1(karma-chrome-launcher@3.2.0)(karma-firefox-launcher@2.1.3)(karma-jasmine@5.1.0(karma@6.4.3))(karma-junit-reporter@2.0.1(karma@6.4.3))(karma-requirejs@1.1.0(karma@6.4.3)(requirejs@2.3.6))(karma-sourcemap-loader@0.4.0)(karma@6.4.3)(typescript@5.4.5)
-      '@bazel/esbuild':
-        specifier: 4.6.2
-        version: 5.8.1
-      '@bazel/ibazel':
-        specifier: 0.16.2
-        version: 0.25.0
-      '@bazel/labs':
-        specifier: 4.6.1
-        version: 4.6.1
-      '@bazel/typescript':
-        specifier: 4.6.2
-        version: 5.8.1(typescript@5.4.5)
-      '@types/node':
-        specifier: 20.12.11
-        version: 20.12.11
-      '@types/source-map-support':
-        specifier: 0.5.10
-        version: 0.5.10
-      esbuild:
-        specifier: 0.21.2
-        version: 0.21.2
-      google-closure-library-types:
-        specifier: 0.1.17
-        version: 0.1.17
-      karma:
-        specifier: 6.4.3
-        version: 6.4.3
-      karma-chrome-launcher:
-        specifier: 3.2.0
-        version: 3.2.0
-      karma-firefox-launcher:
-        specifier: 2.1.3
-        version: 2.1.3
-      karma-jasmine:
-        specifier: 5.1.0
-        version: 5.1.0(karma@6.4.3)
-      karma-junit-reporter:
-        specifier: 2.0.1
-        version: 2.0.1(karma@6.4.3)
-      karma-requirejs:
-        specifier: 1.1.0
-        version: 1.1.0(karma@6.4.3)(requirejs@2.3.6)
-      karma-sourcemap-loader:
-        specifier: 0.4.0
-        version: 0.4.0
-      protobufjs:
-        specifier: 7.3.0
-        version: 7.3.0
-      source-map-support:
-        specifier: 0.5.21
-        version: 0.5.21
-      tsickle:
-        specifier: 0.46.3
-        version: 0.46.3(typescript@5.4.5)
-      tslib:
-        specifier: 2.6.2
-        version: 2.6.2
-      tsutils:
-        specifier: 3.21.0
-        version: 3.21.0(typescript@5.4.5)
-      typescript:
-        specifier: 4.9.5
-        version: 5.4.5
+overrides:
+  esbuild: 0.21.2
+
+devDependencies:
+  '@bazel/buildifier':
+    specifier: 6.1.2
+    version: 6.1.2
+  '@bazel/buildozer':
+    specifier: 6.1.2
+    version: 6.1.2
+  '@bazel/concatjs':
+    specifier: 4.6.2
+    version: 4.6.2(karma-chrome-launcher@3.2.0)(karma-firefox-launcher@2.1.3)(karma-jasmine@5.1.0)(karma-junit-reporter@2.0.1)(karma-requirejs@1.1.0)(karma-sourcemap-loader@0.4.0)(karma@6.4.3)(typescript@4.9.5)
+  '@bazel/esbuild':
+    specifier: 4.6.2
+    version: 4.6.2
+  '@bazel/ibazel':
+    specifier: 0.16.2
+    version: 0.16.2
+  '@bazel/labs':
+    specifier: 4.6.1
+    version: 4.6.1
+  '@bazel/typescript':
+    specifier: 4.6.2
+    version: 4.6.2(typescript@4.9.5)
+  '@types/node':
+    specifier: 20.14.2
+    version: 20.14.2
+  '@types/source-map-support':
+    specifier: 0.5.10
+    version: 0.5.10
+  esbuild:
+    specifier: 0.21.2
+    version: 0.21.2
+  google-closure-library-types:
+    specifier: 0.1.17
+    version: 0.1.17
+  karma:
+    specifier: 6.4.3
+    version: 6.4.3
+  karma-chrome-launcher:
+    specifier: 3.2.0
+    version: 3.2.0
+  karma-firefox-launcher:
+    specifier: 2.1.3
+    version: 2.1.3
+  karma-jasmine:
+    specifier: 5.1.0
+    version: 5.1.0(karma@6.4.3)
+  karma-junit-reporter:
+    specifier: 2.0.1
+    version: 2.0.1(karma@6.4.3)
+  karma-requirejs:
+    specifier: 1.1.0
+    version: 1.1.0(karma@6.4.3)(requirejs@2.3.6)
+  karma-sourcemap-loader:
+    specifier: 0.4.0
+    version: 0.4.0
+  protobufjs:
+    specifier: 7.3.0
+    version: 7.3.0
+  source-map-support:
+    specifier: 0.5.21
+    version: 0.5.21
+  tsickle:
+    specifier: 0.46.3
+    version: 0.46.3(typescript@4.9.5)
+  tslib:
+    specifier: 2.6.3
+    version: 2.6.3
+  tsutils:
+    specifier: 3.21.0
+    version: 3.21.0(typescript@4.9.5)
+  typescript:
+    specifier: 4.9.5
+    version: 4.9.5
 
 packages:
 
-  '@bazel/buildifier@7.1.1':
-    resolution: {integrity: sha512-Up4m88XqBea01zvejR/1dNfFtEJp64f7kgodPUNtVOzHKt+CguVG8yTnyWAb/N0mI2ImrXVxgxglIWymfQRjqQ==, tarball: https://registry.npmjs.org/@bazel/buildifier/-/buildifier-7.1.1.tgz}
+  /@bazel/buildifier@6.1.2:
+    resolution: {integrity: sha512-psKePmRkP6acwyePOhXP67R/wdwN7BGJxHqp1j5myaO24feMsaXyyiO+oW49x8YAwOpKVSCujVzkTwX2auAc0A==}
     hasBin: true
+    dev: true
 
-  '@bazel/buildozer@7.1.1':
-    resolution: {integrity: sha512-2hA13haX4+euWnyHSjIW5e24bGc3ZohyUX2Z+M74I6vCyDd+1chMoWdH+BKOz7EDBhznrazHKN+IRPD5N49V+w==, tarball: https://registry.npmjs.org/@bazel/buildozer/-/buildozer-7.1.1.tgz}
+  /@bazel/buildozer@6.1.2:
+    resolution: {integrity: sha512-Ev9yXHMw93CF3k/gyHwOA3UCZCQ9qPry0WHxD+wjUSf8go3PqMbtq9sWWiyBlZP5KtRWUF/aQxmtF/AHdFdniQ==}
     hasBin: true
+    dev: true
 
-  '@bazel/concatjs@5.8.1':
-    resolution: {integrity: sha512-TkARsNUxgi3bjFeGwIGlffmQglNhuR9qK9uE7uKhdBZvQE5caAWVCjYiMTzo3viKDhwKn5QNRcHY5huuJMVFfA==, tarball: https://registry.npmjs.org/@bazel/concatjs/-/concatjs-5.8.1.tgz}
-    hasBin: true
+  /@bazel/concatjs@4.6.2(karma-chrome-launcher@3.2.0)(karma-firefox-launcher@2.1.3)(karma-jasmine@5.1.0)(karma-junit-reporter@2.0.1)(karma-requirejs@1.1.0)(karma-sourcemap-loader@0.4.0)(karma@6.4.3)(typescript@4.9.5):
+    resolution: {integrity: sha512-5wpASLPgWU+ti7+/iHquym0mY1lFZkkNUlHPzCjSOBolzdSWO9yFO/S5k2agzULNbNrZInI9IErakyc6K3xvog==}
+    requiresBuild: true
     peerDependencies:
       karma: '>=4.0.0'
       karma-chrome-launcher: '>=2.0.0'
-      karma-firefox-launcher: '>=1.0.0'
-      karma-jasmine: '>=2.0.0'
-      karma-junit-reporter: '>=2.0.0'
-      karma-requirejs: '>=1.0.0'
-      karma-sourcemap-loader: '>=0.3.0'
-
-  '@bazel/esbuild@5.8.1':
-    resolution: {integrity: sha512-8k4LL8P3ivCnFeBOcjiFxL8U+M5VtEGuOyIqm2hfEiP8xDWsZLS7YQ7KhshKJy7Elh2dlK9oGgMtl0D/x9kxxg==, tarball: https://registry.npmjs.org/@bazel/esbuild/-/esbuild-5.8.1.tgz}
-
-  '@bazel/ibazel@0.25.0':
-    resolution: {integrity: sha512-dtosfsuZCSaqlUe5EyxNdaN7Gow0Y+ZJixdlciytcSieUcB/1lXPFTx6OihxhjgtTHkeFovlQ/QbvArRPnk+nQ==, tarball: https://registry.npmjs.org/@bazel/ibazel/-/ibazel-0.25.0.tgz}
-    hasBin: true
-
-  '@bazel/labs@4.6.1':
-    resolution: {integrity: sha512-7CRtjP9W3ywX6AvTAzV5is0LrXt3zxUSW5SzUGa+LhdsrDc3+VDyW7MOJlwMai2xmBb4J1tqaZKo8KSlr2H2tg==, tarball: https://registry.npmjs.org/@bazel/labs/-/labs-4.6.1.tgz}
-
-  '@bazel/typescript@5.8.1':
-    resolution: {integrity: sha512-NAJ8WQHZL1WE1YmRoCrq/1hhG15Mvy/viWh6TkvFnBeEhNUiQUsA5GYyhU1ztnBIYW03nATO3vwhAEfO7Q0U5g==, tarball: https://registry.npmjs.org/@bazel/typescript/-/typescript-5.8.1.tgz}
-    deprecated: No longer maintained, https://github.com/aspect-build/rules_ts is the recommended replacement
-    hasBin: true
-    peerDependencies:
-      typescript: '>=3.0.0'
-
-  '@bazel/worker@5.8.1':
-    resolution: {integrity: sha512-GMyZSNW3F34f9GjbJqvs1aHyed5BNrNeiDzNJhC1fIizo/UeBM21oBBONIYLBDoBtq936U85VyPZ76JaP/83hw==, tarball: https://registry.npmjs.org/@bazel/worker/-/worker-5.8.1.tgz}
-
-  '@colors/colors@1.5.0':
-    resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, tarball: https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz}
-    engines: {node: '>=0.1.90'}
-
-  '@esbuild/aix-ppc64@0.21.2':
-    resolution: {integrity: sha512-/c7hocx0pm14bHQlqUVKmxwdT/e5/KkyoY1W8F9lk/8CkE037STDDz8PXUP/LE6faj2HqchvDs9GcShxFhI78Q==, tarball: https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [aix]
-
-  '@esbuild/android-arm64@0.21.2':
-    resolution: {integrity: sha512-SGZKngoTWVUriO5bDjI4WDGsNx2VKZoXcds+ita/kVYB+8IkSCKDRDaK+5yu0b5S0eq6B3S7fpiEvpsa2ammlQ==, tarball: https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-
-  '@esbuild/android-arm@0.21.2':
-    resolution: {integrity: sha512-G1ve3b4FeyJeyCjB4MX1CiWyTaIJwT9wAYE+8+IRA53YoN/reC/Bf2GDRXAzDTnh69Fpl+1uIKg76DiB3U6vwQ==, tarball: https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [android]
-
-  '@esbuild/android-x64@0.21.2':
-    resolution: {integrity: sha512-1wzzNoj2QtNkAYwIcWJ66UTRA80+RTQ/kuPMtEuP0X6dp5Ar23Dn566q3aV61h4EYrrgGlOgl/HdcqN/2S/2vg==, tarball: https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-
-  '@esbuild/darwin-arm64@0.21.2':
-    resolution: {integrity: sha512-ZyMkPWc5eTROcLOA10lEqdDSTc6ds6nuh3DeHgKip/XJrYjZDfnkCVSty8svWdy+SC1f77ULtVeIqymTzaB6/Q==, tarball: https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-
-  '@esbuild/darwin-x64@0.21.2':
-    resolution: {integrity: sha512-K4ZdVq1zP9v51h/cKVna7im7G0zGTKKB6bP2yJiSmHjjOykbd8DdhrSi8V978sF69rkwrn8zCyL2t6I3ei6j9A==, tarball: https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-
-  '@esbuild/freebsd-arm64@0.21.2':
-    resolution: {integrity: sha512-4kbOGdpA61CXqadD+Gb/Pw3YXamQGiz9mal/h93rFVSjr5cgMnmJd/gbfPRm+3BMifvnaOfS1gNWaIDxkE2A3A==, tarball: https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-
-  '@esbuild/freebsd-x64@0.21.2':
-    resolution: {integrity: sha512-ShS+R09nuHzDBfPeMUliKZX27Wrmr8UFp93aFf/S8p+++x5BZ+D344CLKXxmY6qzgTL3mILSImPCNJOzD6+RRg==, tarball: https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-
-  '@esbuild/linux-arm64@0.21.2':
-    resolution: {integrity: sha512-Hdu8BL+AmO+eCDvvT6kz/fPQhvuHL8YK4ExKZfANWsNe1kFGOHw7VJvS/FKSLFqheXmB3rTF3xFQIgUWPYsGnA==, tarball: https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-
-  '@esbuild/linux-arm@0.21.2':
-    resolution: {integrity: sha512-nnGXjOAv+7cM3LYRx4tJsYdgy8dGDGkAzF06oIDGppWbUkUKN9SmgQA8H0KukpU0Pjrj9XmgbWqMVSX/U7eeTA==, tarball: https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-
-  '@esbuild/linux-ia32@0.21.2':
-    resolution: {integrity: sha512-m73BOCW2V9lcj7RtEMi+gBfHC6n3+VHpwQXP5offtQMPLDkpVolYn1YGXxOZ9hp4h3UPRKuezL7WkBsw+3EB3Q==, tarball: https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-
-  '@esbuild/linux-loong64@0.21.2':
-    resolution: {integrity: sha512-84eYHwwWHq3myIY/6ikALMcnwkf6Qo7NIq++xH0x+cJuUNpdwh8mlpUtRY+JiGUc60yu7ElWBbVHGWTABTclGw==, tarball: https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
-
-  '@esbuild/linux-mips64el@0.21.2':
-    resolution: {integrity: sha512-9siSZngT0/ZKG+AH+/agwKF29LdCxw4ODi/PiE0F52B2rtLozlDP92umf8G2GPoVV611LN4pZ+nSTckebOscUA==, tarball: https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-
-  '@esbuild/linux-ppc64@0.21.2':
-    resolution: {integrity: sha512-y0T4aV2CA+ic04ULya1A/8M2RDpDSK2ckgTj6jzHKFJvCq0jQg8afQQIn4EM0G8u2neyOiNHgSF9YKPfuqKOVw==, tarball: https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-
-  '@esbuild/linux-riscv64@0.21.2':
-    resolution: {integrity: sha512-x5ssCdXmZC86L2Li1qQPF/VaC4VP20u/Zm8jlAu9IiVOVi79YsSz6cpPDYZl1rfKSHYCJW9XBfFCo66S5gVPSA==, tarball: https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-
-  '@esbuild/linux-s390x@0.21.2':
-    resolution: {integrity: sha512-NP7fTpGSFWdXyvp8iAFU04uFh9ARoplFVM/m+8lTRpaYG+2ytHPZWyscSsMM6cvObSIK2KoPHXiZD4l99WaxbQ==, tarball: https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-
-  '@esbuild/linux-x64@0.21.2':
-    resolution: {integrity: sha512-giZ/uOxWDKda44ZuyfKbykeXznfuVNkTgXOUOPJIjbayJV6FRpQ4zxUy9JMBPLaK9IJcdWtaoeQrYBMh3Rr4vQ==, tarball: https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-
-  '@esbuild/netbsd-x64@0.21.2':
-    resolution: {integrity: sha512-IeFMfGFSQfIj1d4XU+6lkbFzMR+mFELUUVYrZ+jvWzG4NGvs6o53ReEHLHpYkjRbdEjJy2W3lTekTxrFHW7YJg==, tarball: https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-
-  '@esbuild/openbsd-x64@0.21.2':
-    resolution: {integrity: sha512-48QhWD6WxcebNNaE4FCwgvQVUnAycuTd+BdvA/oZu+/MmbpU8pY2dMEYlYzj5uNHWIG5jvdDmFXu0naQeOWUoA==, tarball: https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-
-  '@esbuild/sunos-x64@0.21.2':
-    resolution: {integrity: sha512-90r3nTBLgdIgD4FCVV9+cR6Hq2Dzs319icVsln+NTmTVwffWcCqXGml8rAoocHuJ85kZK36DCteii96ba/PX8g==, tarball: https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-
-  '@esbuild/win32-arm64@0.21.2':
-    resolution: {integrity: sha512-sNndlsBT8OeE/MZDSGpRDJlWuhjuUz/dn80nH0EP4ZzDUYvMDVa7G87DVpweBrn4xdJYyXS/y4CQNrf7R2ODXg==, tarball: https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-
-  '@esbuild/win32-ia32@0.21.2':
-    resolution: {integrity: sha512-Ti2QChGNFzWhUNNVuU4w21YkYTErsNh3h+CzvlEhzgRbwsJ7TrWQqRzW3bllLKKvTppuF3DJ3XP1GEg11AfrEQ==, tarball: https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-
-  '@esbuild/win32-x64@0.21.2':
-    resolution: {integrity: sha512-VEfTCZicoZnZ6sGkjFPGRFFJuL2fZn2bLhsekZl1CJslflp2cJS/VoKs1jMk+3pDfsGW6CfQVUckP707HwbXeQ==, tarball: https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.2.tgz}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-
-  '@protobufjs/aspromise@1.1.2':
-    resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==, tarball: https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz}
-
-  '@protobufjs/base64@1.1.2':
-    resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==, tarball: https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz}
-
-  '@protobufjs/codegen@2.0.4':
-    resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==, tarball: https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz}
-
-  '@protobufjs/eventemitter@1.1.0':
-    resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==, tarball: https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz}
-
-  '@protobufjs/fetch@1.1.0':
-    resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==, tarball: https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz}
-
-  '@protobufjs/float@1.0.2':
-    resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==, tarball: https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz}
-
-  '@protobufjs/inquire@1.1.0':
-    resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==, tarball: https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz}
-
-  '@protobufjs/path@1.1.2':
-    resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==, tarball: https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz}
-
-  '@protobufjs/pool@1.1.0':
-    resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==, tarball: https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz}
-
-  '@protobufjs/utf8@1.1.0':
-    resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==, tarball: https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz}
-
-  '@socket.io/component-emitter@3.1.2':
-    resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==, tarball: https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz}
-
-  '@teppeis/clutz@1.0.2':
-    resolution: {integrity: sha512-Ql8RZ7EJNahPqjXoES8spoVFoTewAtf+RUcEgd8JwJNj4K6dA+TNUJjLZEtW7FB0h1xbXMqRdttryCmEBGz/PQ==, tarball: https://registry.npmjs.org/@teppeis/clutz/-/clutz-1.0.2.tgz}
-    hasBin: true
-
-  '@types/cookie@0.4.1':
-    resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==, tarball: https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz}
-
-  '@types/cors@2.8.17':
-    resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==, tarball: https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz}
-
-  '@types/long@4.0.2':
-    resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==, tarball: https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz}
-
-  '@types/minimist@1.2.2':
-    resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==, tarball: https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz}
-
-  '@types/node@10.17.60':
-    resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==, tarball: https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz}
-
-  '@types/node@20.12.11':
-    resolution: {integrity: sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==, tarball: https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz}
-
-  '@types/source-map-support@0.5.10':
-    resolution: {integrity: sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==, tarball: https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.10.tgz}
-
-  '@yarnpkg/lockfile@1.1.0':
-    resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==, tarball: https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz}
-
-  accepts@1.3.8:
-    resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, tarball: https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz}
-    engines: {node: '>= 0.6'}
-
-  ansi-regex@5.0.1:
-    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, tarball: https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz}
-    engines: {node: '>=8'}
-
-  ansi-styles@4.3.0:
-    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, tarball: https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz}
-    engines: {node: '>=8'}
-
-  anymatch@3.1.3:
-    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, tarball: https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz}
-    engines: {node: '>= 8'}
-
-  at-least-node@1.0.0:
-    resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, tarball: https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz}
-    engines: {node: '>= 4.0.0'}
-
-  balanced-match@1.0.2:
-    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, tarball: https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz}
-
-  base64id@2.0.0:
-    resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==, tarball: https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz}
-    engines: {node: ^4.5.0 || >= 5.9}
-
-  binary-extensions@2.3.0:
-    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, tarball: https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz}
-    engines: {node: '>=8'}
-
-  body-parser@1.20.2:
-    resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==, tarball: https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz}
-    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
-
-  brace-expansion@1.1.11:
-    resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, tarball: https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz}
-
-  braces@3.0.2:
-    resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, tarball: https://registry.npmjs.org/braces/-/braces-3.0.2.tgz}
-    engines: {node: '>=8'}
-
-  buffer-from@1.1.2:
-    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, tarball: https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz}
-
-  bytes@3.1.2:
-    resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, tarball: https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz}
-    engines: {node: '>= 0.8'}
-
-  call-bind@1.0.7:
-    resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, tarball: https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz}
-    engines: {node: '>= 0.4'}
-
-  chalk@4.1.2:
-    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, tarball: https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz}
-    engines: {node: '>=10'}
-
-  chokidar@3.6.0:
-    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, tarball: https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz}
-    engines: {node: '>= 8.10.0'}
-
-  ci-info@2.0.0:
-    resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==, tarball: https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz}
-
-  cliui@7.0.4:
-    resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, tarball: https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz}
-
-  color-convert@2.0.1:
-    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, tarball: https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz}
-    engines: {node: '>=7.0.0'}
-
-  color-name@1.1.4:
-    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, tarball: https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz}
-
-  concat-map@0.0.1:
-    resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, tarball: https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz}
-
-  connect@3.7.0:
-    resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==, tarball: https://registry.npmjs.org/connect/-/connect-3.7.0.tgz}
-    engines: {node: '>= 0.10.0'}
-
-  content-type@1.0.5:
-    resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, tarball: https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz}
-    engines: {node: '>= 0.6'}
-
-  cookie@0.4.2:
-    resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==, tarball: https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz}
-    engines: {node: '>= 0.6'}
-
-  cors@2.8.5:
-    resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==, tarball: https://registry.npmjs.org/cors/-/cors-2.8.5.tgz}
-    engines: {node: '>= 0.10'}
-
-  cross-spawn@6.0.5:
-    resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==, tarball: https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz}
-    engines: {node: '>=4.8'}
-
-  custom-event@1.0.1:
-    resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==, tarball: https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz}
-
-  date-format@4.0.14:
-    resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==, tarball: https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz}
-    engines: {node: '>=4.0'}
-
-  debug@2.6.9:
-    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, tarball: https://registry.npmjs.org/debug/-/debug-2.6.9.tgz}
-    peerDependencies:
-      supports-color: '*'
-    peerDependenciesMeta:
-      supports-color:
-        optional: true
-
-  debug@4.3.4:
-    resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, tarball: https://registry.npmjs.org/debug/-/debug-4.3.4.tgz}
-    engines: {node: '>=6.0'}
-    peerDependencies:
-      supports-color: '*'
-    peerDependenciesMeta:
-      supports-color:
-        optional: true
-
-  define-data-property@1.1.4:
-    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, tarball: https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz}
-    engines: {node: '>= 0.4'}
-
-  depd@2.0.0:
-    resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, tarball: https://registry.npmjs.org/depd/-/depd-2.0.0.tgz}
-    engines: {node: '>= 0.8'}
-
-  destroy@1.2.0:
-    resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, tarball: https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz}
-    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
-
-  di@0.0.1:
-    resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==, tarball: https://registry.npmjs.org/di/-/di-0.0.1.tgz}
-
-  dom-serialize@2.2.1:
-    resolution: {integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==, tarball: https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz}
-
-  ee-first@1.1.1:
-    resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, tarball: https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz}
-
-  emoji-regex@8.0.0:
-    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, tarball: https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz}
-
-  encodeurl@1.0.2:
-    resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, tarball: https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz}
-    engines: {node: '>= 0.8'}
-
-  engine.io-parser@5.2.2:
-    resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==, tarball: https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz}
-    engines: {node: '>=10.0.0'}
-
-  engine.io@6.5.4:
-    resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==, tarball: https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz}
-    engines: {node: '>=10.2.0'}
-
-  ent@2.2.0:
-    resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==, tarball: https://registry.npmjs.org/ent/-/ent-2.2.0.tgz}
-
-  es-define-property@1.0.0:
-    resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, tarball: https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz}
-    engines: {node: '>= 0.4'}
-
-  es-errors@1.3.0:
-    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, tarball: https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz}
-    engines: {node: '>= 0.4'}
-
-  esbuild@0.21.2:
-    resolution: {integrity: sha512-LmHPAa5h4tSxz+g/D8IHY6wCjtIiFx8I7/Q0Aq+NmvtoYvyMnJU0KQJcqB6QH30X9x/W4CemgUtPgQDZFca5SA==, tarball: https://registry.npmjs.org/esbuild/-/esbuild-0.21.2.tgz}
-    engines: {node: '>=12'}
-    hasBin: true
-
-  escalade@3.1.2:
-    resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==, tarball: https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz}
-    engines: {node: '>=6'}
-
-  escape-html@1.0.3:
-    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, tarball: https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz}
-
-  eventemitter3@4.0.7:
-    resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, tarball: https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz}
-
-  extend@3.0.2:
-    resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, tarball: https://registry.npmjs.org/extend/-/extend-3.0.2.tgz}
-
-  fill-range@7.0.1:
-    resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, tarball: https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz}
-    engines: {node: '>=8'}
-
-  finalhandler@1.1.2:
-    resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==, tarball: https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz}
-    engines: {node: '>= 0.8'}
-
-  find-yarn-workspace-root@2.0.0:
-    resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==, tarball: https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz}
-
-  flatted@3.3.1:
-    resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==, tarball: https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz}
-
-  follow-redirects@1.15.6:
-    resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==, tarball: https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz}
-    engines: {node: '>=4.0'}
-    peerDependencies:
-      debug: '*'
-    peerDependenciesMeta:
-      debug:
-        optional: true
-
-  fs-extra@8.1.0:
-    resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, tarball: https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz}
-    engines: {node: '>=6 <7 || >=8'}
-
-  fs-extra@9.1.0:
-    resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, tarball: https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz}
-    engines: {node: '>=10'}
-
-  fs.realpath@1.0.0:
-    resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, tarball: https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz}
-
-  fsevents@2.3.3:
-    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz}
-    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
-    os: [darwin]
-
-  function-bind@1.1.2:
-    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, tarball: https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz}
-
-  get-caller-file@2.0.5:
-    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, tarball: https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz}
-    engines: {node: 6.* || 8.* || >= 10.*}
-
-  get-intrinsic@1.2.4:
-    resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, tarball: https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz}
-    engines: {node: '>= 0.4'}
-
-  glob-parent@5.1.2:
-    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, tarball: https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz}
-    engines: {node: '>= 6'}
-
-  glob@7.2.3:
-    resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, tarball: https://registry.npmjs.org/glob/-/glob-7.2.3.tgz}
-
-  google-closure-library-types@0.1.17:
-    resolution: {integrity: sha512-zFTLlQTt0nQiSK+fbx//rHYGkK628FOH5XSsIuGqA/yaMlZExS62GdmpphQxUFJ5spUNYTXi/e4FmnlX9NWZew==, tarball: https://registry.npmjs.org/google-closure-library-types/-/google-closure-library-types-0.1.17.tgz}
-
-  google-closure-library@20190929.0.0:
-    resolution: {integrity: sha512-ChL2te1OLBqI7z2FYohjapHxoo2Jd7KsFTBKoNv9TiOlWR+7zcS4z1RxeUgczWAW9sji3q5OhbbtG/fJlbs1lw==, tarball: https://registry.npmjs.org/google-closure-library/-/google-closure-library-20190929.0.0.tgz}
-
-  google-protobuf@3.21.2:
-    resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==, tarball: https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz}
-
-  gopd@1.0.1:
-    resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, tarball: https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz}
-
-  graceful-fs@4.2.11:
-    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, tarball: https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz}
-
-  has-flag@4.0.0:
-    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, tarball: https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz}
-    engines: {node: '>=8'}
-
-  has-property-descriptors@1.0.2:
-    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, tarball: https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz}
-
-  has-proto@1.0.3:
-    resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, tarball: https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz}
-    engines: {node: '>= 0.4'}
-
-  has-symbols@1.0.3:
-    resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, tarball: https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz}
-    engines: {node: '>= 0.4'}
-
-  hasown@2.0.2:
-    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, tarball: https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz}
-    engines: {node: '>= 0.4'}
-
-  http-errors@2.0.0:
-    resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, tarball: https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz}
-    engines: {node: '>= 0.8'}
-
-  http-proxy@1.18.1:
-    resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==, tarball: https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz}
-    engines: {node: '>=8.0.0'}
-
-  iconv-lite@0.4.24:
-    resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, tarball: https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz}
-    engines: {node: '>=0.10.0'}
-
-  inflight@1.0.6:
-    resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, tarball: https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz}
-
-  inherits@2.0.4:
-    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, tarball: https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz}
-
-  is-binary-path@2.1.0:
-    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, tarball: https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz}
-    engines: {node: '>=8'}
-
-  is-ci@2.0.0:
-    resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==, tarball: https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz}
-    hasBin: true
-
-  is-docker@2.2.1:
-    resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, tarball: https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz}
-    engines: {node: '>=8'}
-    hasBin: true
-
-  is-extglob@2.1.1:
-    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, tarball: https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-
-  is-fullwidth-code-point@3.0.0:
-    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, tarball: https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz}
-    engines: {node: '>=8'}
-
-  is-glob@4.0.3:
-    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, tarball: https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz}
-    engines: {node: '>=0.10.0'}
-
-  is-number@7.0.0:
-    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, tarball: https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz}
-    engines: {node: '>=0.12.0'}
-
-  is-wsl@2.2.0:
-    resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, tarball: https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz}
-    engines: {node: '>=8'}
-
-  isbinaryfile@4.0.10:
-    resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==, tarball: https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz}
-    engines: {node: '>= 8.0.0'}
-
-  isexe@2.0.0:
-    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, tarball: https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz}
-
-  jasmine-core@4.6.0:
-    resolution: {integrity: sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==, tarball: https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz}
-
-  jsonfile@4.0.0:
-    resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, tarball: https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz}
-
-  jsonfile@6.1.0:
-    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, tarball: https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz}
-
-  karma-chrome-launcher@3.2.0:
-    resolution: {integrity: sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==, tarball: https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz}
-
-  karma-firefox-launcher@2.1.3:
-    resolution: {integrity: sha512-LMM2bseebLbYjODBOVt7TCPP9OI2vZIXCavIXhkO9m+10Uj5l7u/SKoeRmYx8FYHTVGZSpk6peX+3BMHC1WwNw==, tarball: https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.3.tgz}
-
-  karma-jasmine@5.1.0:
-    resolution: {integrity: sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==, tarball: https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz}
-    engines: {node: '>=12'}
-    peerDependencies:
-      karma: ^6.0.0
-
-  karma-junit-reporter@2.0.1:
-    resolution: {integrity: sha512-VtcGfE0JE4OE1wn0LK8xxDKaTP7slN8DO3I+4xg6gAi1IoAHAXOJ1V9G/y45Xg6sxdxPOR3THCFtDlAfBo9Afw==, tarball: https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-2.0.1.tgz}
-    engines: {node: '>= 8'}
-    peerDependencies:
-      karma: '>=0.9'
-
-  karma-requirejs@1.1.0:
-    resolution: {integrity: sha512-MHTOYKdwwJBkvYid0TaYvBzOnFH3TDtzo6ie5E4o9SaUSXXsfMRLa/whUz6efVIgTxj1xnKYasNn/XwEgJeB/Q==, tarball: https://registry.npmjs.org/karma-requirejs/-/karma-requirejs-1.1.0.tgz}
-    peerDependencies:
-      karma: '>=0.9'
-      requirejs: ^2.1.0
-
-  karma-sourcemap-loader@0.4.0:
-    resolution: {integrity: sha512-xCRL3/pmhAYF3I6qOrcn0uhbQevitc2DERMPH82FMnG+4WReoGcGFZb1pURf2a5apyrOHRdvD+O6K7NljqKHyA==, tarball: https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.4.0.tgz}
-
-  karma@6.4.3:
-    resolution: {integrity: sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==, tarball: https://registry.npmjs.org/karma/-/karma-6.4.3.tgz}
-    engines: {node: '>= 10'}
-    hasBin: true
-
-  klaw-sync@6.0.0:
-    resolution: {integrity: sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==, tarball: https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz}
-
-  lodash@4.17.21:
-    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, tarball: https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz}
-
-  log4js@6.9.1:
-    resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==, tarball: https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz}
-    engines: {node: '>=8.0'}
-
-  long@4.0.0:
-    resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==, tarball: https://registry.npmjs.org/long/-/long-4.0.0.tgz}
-
-  long@5.2.3:
-    resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==, tarball: https://registry.npmjs.org/long/-/long-5.2.3.tgz}
-
-  media-typer@0.3.0:
-    resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, tarball: https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz}
-    engines: {node: '>= 0.6'}
-
-  micromatch@4.0.5:
-    resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, tarball: https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz}
-    engines: {node: '>=8.6'}
-
-  mime-db@1.52.0:
-    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, tarball: https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz}
-    engines: {node: '>= 0.6'}
-
-  mime-types@2.1.35:
-    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, tarball: https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz}
-    engines: {node: '>= 0.6'}
-
-  mime@2.6.0:
-    resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==, tarball: https://registry.npmjs.org/mime/-/mime-2.6.0.tgz}
-    engines: {node: '>=4.0.0'}
-    hasBin: true
-
-  minimatch@3.1.2:
-    resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, tarball: https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz}
-
-  minimist@1.2.8:
-    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, tarball: https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz}
-
-  mkdirp@0.5.6:
-    resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, tarball: https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz}
-    hasBin: true
-
-  ms@2.0.0:
-    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, tarball: https://registry.npmjs.org/ms/-/ms-2.0.0.tgz}
-
-  ms@2.1.2:
-    resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, tarball: https://registry.npmjs.org/ms/-/ms-2.1.2.tgz}
-
-  negotiator@0.6.3:
-    resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, tarball: https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz}
-    engines: {node: '>= 0.6'}
-
-  nice-try@1.0.5:
-    resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, tarball: https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz}
-
-  normalize-path@3.0.0:
-    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, tarball: https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-
-  object-assign@4.1.1:
-    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, tarball: https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-
-  object-inspect@1.13.1:
-    resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, tarball: https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz}
-
-  on-finished@2.3.0:
-    resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==, tarball: https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz}
-    engines: {node: '>= 0.8'}
-
-  on-finished@2.4.1:
-    resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, tarball: https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz}
-    engines: {node: '>= 0.8'}
-
-  once@1.4.0:
-    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, tarball: https://registry.npmjs.org/once/-/once-1.4.0.tgz}
-
-  open@7.4.2:
-    resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==, tarball: https://registry.npmjs.org/open/-/open-7.4.2.tgz}
-    engines: {node: '>=8'}
-
-  os-tmpdir@1.0.2:
-    resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, tarball: https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz}
-    engines: {node: '>=0.10.0'}
-
-  parseurl@1.3.3:
-    resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, tarball: https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz}
-    engines: {node: '>= 0.8'}
-
-  patch-package@6.5.1:
-    resolution: {integrity: sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==, tarball: https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz}
-    engines: {node: '>=10', npm: '>5'}
-    hasBin: true
-
-  path-is-absolute@1.0.1:
-    resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, tarball: https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-
-  path-key@2.0.1:
-    resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, tarball: https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz}
-    engines: {node: '>=4'}
-
-  picomatch@2.3.1:
-    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, tarball: https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz}
-    engines: {node: '>=8.6'}
-
-  protobufjs@6.8.8:
-    resolution: {integrity: sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==, tarball: https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz}
-    hasBin: true
-
-  protobufjs@7.3.0:
-    resolution: {integrity: sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==, tarball: https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz}
-    engines: {node: '>=12.0.0'}
-
-  qjobs@1.2.0:
-    resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==, tarball: https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz}
-    engines: {node: '>=0.9'}
-
-  qs@6.11.0:
-    resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, tarball: https://registry.npmjs.org/qs/-/qs-6.11.0.tgz}
-    engines: {node: '>=0.6'}
-
-  range-parser@1.2.1:
-    resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, tarball: https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz}
-    engines: {node: '>= 0.6'}
-
-  raw-body@2.5.2:
-    resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, tarball: https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz}
-    engines: {node: '>= 0.8'}
-
-  readdirp@3.6.0:
-    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, tarball: https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz}
-    engines: {node: '>=8.10.0'}
-
-  require-directory@2.1.1:
-    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, tarball: https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-
-  requirejs@2.3.6:
-    resolution: {integrity: sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==, tarball: https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz}
-    engines: {node: '>=0.4.0'}
-    hasBin: true
-
-  requires-port@1.0.0:
-    resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, tarball: https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz}
-
-  rfdc@1.3.1:
-    resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==, tarball: https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz}
-
-  rimraf@2.7.1:
-    resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, tarball: https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz}
-    hasBin: true
-
-  rimraf@3.0.2:
-    resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, tarball: https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz}
-    hasBin: true
-
-  safer-buffer@2.1.2:
-    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, tarball: https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz}
-
-  semver@5.6.0:
-    resolution: {integrity: sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==, tarball: https://registry.npmjs.org/semver/-/semver-5.6.0.tgz}
-    hasBin: true
-
-  semver@5.7.2:
-    resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, tarball: https://registry.npmjs.org/semver/-/semver-5.7.2.tgz}
-    hasBin: true
-
-  set-function-length@1.2.2:
-    resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, tarball: https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz}
-    engines: {node: '>= 0.4'}
-
-  setprototypeof@1.2.0:
-    resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, tarball: https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz}
-
-  shebang-command@1.2.0:
-    resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, tarball: https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz}
-    engines: {node: '>=0.10.0'}
-
-  shebang-regex@1.0.0:
-    resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, tarball: https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-
-  side-channel@1.0.6:
-    resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, tarball: https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz}
-    engines: {node: '>= 0.4'}
-
-  slash@2.0.0:
-    resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==, tarball: https://registry.npmjs.org/slash/-/slash-2.0.0.tgz}
-    engines: {node: '>=6'}
-
-  socket.io-adapter@2.5.4:
-    resolution: {integrity: sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==, tarball: https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz}
-
-  socket.io-parser@4.2.4:
-    resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==, tarball: https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz}
-    engines: {node: '>=10.0.0'}
-
-  socket.io@4.7.5:
-    resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==, tarball: https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz}
-    engines: {node: '>=10.2.0'}
-
-  source-map-support@0.5.21:
-    resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, tarball: https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz}
-
-  source-map-support@0.5.9:
-    resolution: {integrity: sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==, tarball: https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz}
-
-  source-map@0.6.1:
-    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, tarball: https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz}
-    engines: {node: '>=0.10.0'}
-
-  statuses@1.5.0:
-    resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, tarball: https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz}
-    engines: {node: '>= 0.6'}
-
-  statuses@2.0.1:
-    resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, tarball: https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz}
-    engines: {node: '>= 0.8'}
-
-  streamroller@3.1.5:
-    resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==, tarball: https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz}
-    engines: {node: '>=8.0'}
-
-  string-width@4.2.3:
-    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, tarball: https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz}
-    engines: {node: '>=8'}
-
-  strip-ansi@6.0.1:
-    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, tarball: https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz}
-    engines: {node: '>=8'}
-
-  supports-color@7.2.0:
-    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, tarball: https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz}
-    engines: {node: '>=8'}
-
-  tmp@0.0.33:
-    resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, tarball: https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz}
-    engines: {node: '>=0.6.0'}
-
-  tmp@0.2.3:
-    resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==, tarball: https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz}
-    engines: {node: '>=14.14'}
-
-  to-regex-range@5.0.1:
-    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, tarball: https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz}
-    engines: {node: '>=8.0'}
-
-  toidentifier@1.0.1:
-    resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, tarball: https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz}
-    engines: {node: '>=0.6'}
-
-  tsickle@0.46.3:
-    resolution: {integrity: sha512-9PDXxOrtn2AdpvDin6FLGveXVGg8ec3ga8fh8mPR5lz9KtitW6riVgxgagicdfF1rgiBxDeH+5hVowPXhmZbYQ==, tarball: https://registry.npmjs.org/tsickle/-/tsickle-0.46.3.tgz}
-    peerDependencies:
-      typescript: ~4.7.2
-
-  tslib@1.14.1:
-    resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, tarball: https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz}
-
-  tslib@2.6.2:
-    resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, tarball: https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz}
-
-  tsutils@3.21.0:
-    resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, tarball: https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz}
-    engines: {node: '>= 6'}
-    peerDependencies:
-      typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
-
-  type-is@1.6.18:
-    resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, tarball: https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz}
-    engines: {node: '>= 0.6'}
-
-  typescript@3.9.10:
-    resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==, tarball: https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz}
-    engines: {node: '>=4.2.0'}
-    hasBin: true
-
-  typescript@5.4.5:
-    resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==, tarball: https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz}
-    engines: {node: '>=14.17'}
-    hasBin: true
-
-  ua-parser-js@0.7.37:
-    resolution: {integrity: sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==, tarball: https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz}
-
-  undici-types@5.26.5:
-    resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, tarball: https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz}
-
-  universalify@0.1.2:
-    resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, tarball: https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz}
-    engines: {node: '>= 4.0.0'}
-
-  universalify@2.0.0:
-    resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, tarball: https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz}
-    engines: {node: '>= 10.0.0'}
-
-  unpipe@1.0.0:
-    resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, tarball: https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz}
-    engines: {node: '>= 0.8'}
-
-  utils-merge@1.0.1:
-    resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, tarball: https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz}
-    engines: {node: '>= 0.4.0'}
-
-  vary@1.1.2:
-    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, tarball: https://registry.npmjs.org/vary/-/vary-1.1.2.tgz}
-    engines: {node: '>= 0.8'}
-
-  void-elements@2.0.1:
-    resolution: {integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==, tarball: https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-
-  which@1.3.1:
-    resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, tarball: https://registry.npmjs.org/which/-/which-1.3.1.tgz}
-    hasBin: true
-
-  which@3.0.1:
-    resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==, tarball: https://registry.npmjs.org/which/-/which-3.0.1.tgz}
-    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
-    hasBin: true
-
-  wrap-ansi@7.0.0:
-    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, tarball: https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz}
-    engines: {node: '>=10'}
-
-  wrappy@1.0.2:
-    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, tarball: https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz}
-
-  ws@8.11.0:
-    resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==, tarball: https://registry.npmjs.org/ws/-/ws-8.11.0.tgz}
-    engines: {node: '>=10.0.0'}
-    peerDependencies:
-      bufferutil: ^4.0.1
-      utf-8-validate: ^5.0.2
-    peerDependenciesMeta:
-      bufferutil:
-        optional: true
-      utf-8-validate:
-        optional: true
-
-  xmlbuilder@12.0.0:
-    resolution: {integrity: sha512-lMo8DJ8u6JRWp0/Y4XLa/atVDr75H9litKlb2E5j3V3MesoL50EBgZDWoLT3F/LztVnG67GjPXLZpqcky/UMnQ==, tarball: https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-12.0.0.tgz}
-    engines: {node: '>=6.0'}
-
-  y18n@5.0.8:
-    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, tarball: https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz}
-    engines: {node: '>=10'}
-
-  yaml@1.10.2:
-    resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, tarball: https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz}
-    engines: {node: '>= 6'}
-
-  yargs-parser@20.2.9:
-    resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, tarball: https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz}
-    engines: {node: '>=10'}
-
-  yargs@16.2.0:
-    resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, tarball: https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz}
-    engines: {node: '>=10'}
-
-snapshots:
-
-  '@bazel/buildifier@7.1.1': {}
-
-  '@bazel/buildozer@7.1.1': {}
-
-  '@bazel/concatjs@5.8.1(karma-chrome-launcher@3.2.0)(karma-firefox-launcher@2.1.3)(karma-jasmine@5.1.0(karma@6.4.3))(karma-junit-reporter@2.0.1(karma@6.4.3))(karma-requirejs@1.1.0(karma@6.4.3)(requirejs@2.3.6))(karma-sourcemap-loader@0.4.0)(karma@6.4.3)(typescript@5.4.5)':
+      karma-firefox-launcher: '>=1.0.0'
+      karma-jasmine: '>=2.0.0'
+      karma-junit-reporter: '>=2.0.0'
+      karma-requirejs: '>=1.0.0'
+      karma-sourcemap-loader: '>=0.3.0'
     dependencies:
       karma: 6.4.3
       karma-chrome-launcher: 3.2.0
@@ -1085,173 +114,399 @@ snapshots:
       karma-sourcemap-loader: 0.4.0
       protobufjs: 6.8.8
       source-map-support: 0.5.9
-      tsutils: 3.21.0(typescript@5.4.5)
+      tsutils: 3.21.0(typescript@4.9.5)
     transitivePeerDependencies:
       - typescript
+    dev: true
 
-  '@bazel/esbuild@5.8.1': {}
+  /@bazel/esbuild@4.6.2:
+    resolution: {integrity: sha512-VqmeIlEDq7tVNpIk88zS3DZSAV1F1VN92IBPekKuQqIU6PTt3+iID/v4lkK80SwFBthF4pi/PG0PPaulIe/qGA==}
+    requiresBuild: true
+    dev: true
 
-  '@bazel/ibazel@0.25.0': {}
+  /@bazel/ibazel@0.16.2:
+    resolution: {integrity: sha512-KgqAWMH0emL6f3xH6nqyTryoBMqlJ627LBIe9PT1PRRQPz2FtHib3FIHJPukp1slzF3hJYZvdiVwgPnHbaSOOA==}
+    hasBin: true
+    dev: true
 
-  '@bazel/labs@4.6.1': {}
+  /@bazel/labs@4.6.1:
+    resolution: {integrity: sha512-7CRtjP9W3ywX6AvTAzV5is0LrXt3zxUSW5SzUGa+LhdsrDc3+VDyW7MOJlwMai2xmBb4J1tqaZKo8KSlr2H2tg==}
+    dev: true
 
-  '@bazel/typescript@5.8.1(typescript@5.4.5)':
+  /@bazel/typescript@4.6.2(typescript@4.9.5):
+    resolution: {integrity: sha512-AUF7kq82bP6DX9Brihr/eQqvNccxVfSXosFxt80h94og5cmMyoc/euXha6rxlOBP3yWXmSo+/qjzO7o8PWJduQ==}
+    deprecated: No longer maintained, https://github.com/aspect-build/rules_ts is the recommended replacement
+    hasBin: true
+    requiresBuild: true
+    peerDependencies:
+      typescript: '>=3.0.0 <4.4.0'
     dependencies:
-      '@bazel/worker': 5.8.1
+      '@bazel/worker': 4.6.2
+      protobufjs: 6.8.8
       semver: 5.6.0
       source-map-support: 0.5.9
-      tsutils: 3.21.0(typescript@5.4.5)
-      typescript: 5.4.5
+      tsutils: 3.21.0(typescript@4.9.5)
+      typescript: 4.9.5
+    dev: true
 
-  '@bazel/worker@5.8.1':
+  /@bazel/worker@4.6.2:
+    resolution: {integrity: sha512-DLpN6iQAH6uiUraAs4CESyqs60u55fcKmYgOOVObGuLSQQuX49Lw7XRIN90NibRPwpbBDQichWE3zfra0yKTTw==}
     dependencies:
       google-protobuf: 3.21.2
+    dev: true
 
-  '@colors/colors@1.5.0': {}
+  /@colors/colors@1.5.0:
+    resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
+    engines: {node: '>=0.1.90'}
+    dev: true
 
-  '@esbuild/aix-ppc64@0.21.2':
+  /@esbuild/aix-ppc64@0.21.2:
+    resolution: {integrity: sha512-/c7hocx0pm14bHQlqUVKmxwdT/e5/KkyoY1W8F9lk/8CkE037STDDz8PXUP/LE6faj2HqchvDs9GcShxFhI78Q==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [aix]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/android-arm64@0.21.2':
+  /@esbuild/android-arm64@0.21.2:
+    resolution: {integrity: sha512-SGZKngoTWVUriO5bDjI4WDGsNx2VKZoXcds+ita/kVYB+8IkSCKDRDaK+5yu0b5S0eq6B3S7fpiEvpsa2ammlQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/android-arm@0.21.2':
+  /@esbuild/android-arm@0.21.2:
+    resolution: {integrity: sha512-G1ve3b4FeyJeyCjB4MX1CiWyTaIJwT9wAYE+8+IRA53YoN/reC/Bf2GDRXAzDTnh69Fpl+1uIKg76DiB3U6vwQ==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/android-x64@0.21.2':
+  /@esbuild/android-x64@0.21.2:
+    resolution: {integrity: sha512-1wzzNoj2QtNkAYwIcWJ66UTRA80+RTQ/kuPMtEuP0X6dp5Ar23Dn566q3aV61h4EYrrgGlOgl/HdcqN/2S/2vg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/darwin-arm64@0.21.2':
+  /@esbuild/darwin-arm64@0.21.2:
+    resolution: {integrity: sha512-ZyMkPWc5eTROcLOA10lEqdDSTc6ds6nuh3DeHgKip/XJrYjZDfnkCVSty8svWdy+SC1f77ULtVeIqymTzaB6/Q==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/darwin-x64@0.21.2':
+  /@esbuild/darwin-x64@0.21.2:
+    resolution: {integrity: sha512-K4ZdVq1zP9v51h/cKVna7im7G0zGTKKB6bP2yJiSmHjjOykbd8DdhrSi8V978sF69rkwrn8zCyL2t6I3ei6j9A==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/freebsd-arm64@0.21.2':
+  /@esbuild/freebsd-arm64@0.21.2:
+    resolution: {integrity: sha512-4kbOGdpA61CXqadD+Gb/Pw3YXamQGiz9mal/h93rFVSjr5cgMnmJd/gbfPRm+3BMifvnaOfS1gNWaIDxkE2A3A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/freebsd-x64@0.21.2':
+  /@esbuild/freebsd-x64@0.21.2:
+    resolution: {integrity: sha512-ShS+R09nuHzDBfPeMUliKZX27Wrmr8UFp93aFf/S8p+++x5BZ+D344CLKXxmY6qzgTL3mILSImPCNJOzD6+RRg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-arm64@0.21.2':
+  /@esbuild/linux-arm64@0.21.2:
+    resolution: {integrity: sha512-Hdu8BL+AmO+eCDvvT6kz/fPQhvuHL8YK4ExKZfANWsNe1kFGOHw7VJvS/FKSLFqheXmB3rTF3xFQIgUWPYsGnA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-arm@0.21.2':
+  /@esbuild/linux-arm@0.21.2:
+    resolution: {integrity: sha512-nnGXjOAv+7cM3LYRx4tJsYdgy8dGDGkAzF06oIDGppWbUkUKN9SmgQA8H0KukpU0Pjrj9XmgbWqMVSX/U7eeTA==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-ia32@0.21.2':
+  /@esbuild/linux-ia32@0.21.2:
+    resolution: {integrity: sha512-m73BOCW2V9lcj7RtEMi+gBfHC6n3+VHpwQXP5offtQMPLDkpVolYn1YGXxOZ9hp4h3UPRKuezL7WkBsw+3EB3Q==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-loong64@0.21.2':
+  /@esbuild/linux-loong64@0.21.2:
+    resolution: {integrity: sha512-84eYHwwWHq3myIY/6ikALMcnwkf6Qo7NIq++xH0x+cJuUNpdwh8mlpUtRY+JiGUc60yu7ElWBbVHGWTABTclGw==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-mips64el@0.21.2':
+  /@esbuild/linux-mips64el@0.21.2:
+    resolution: {integrity: sha512-9siSZngT0/ZKG+AH+/agwKF29LdCxw4ODi/PiE0F52B2rtLozlDP92umf8G2GPoVV611LN4pZ+nSTckebOscUA==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-ppc64@0.21.2':
+  /@esbuild/linux-ppc64@0.21.2:
+    resolution: {integrity: sha512-y0T4aV2CA+ic04ULya1A/8M2RDpDSK2ckgTj6jzHKFJvCq0jQg8afQQIn4EM0G8u2neyOiNHgSF9YKPfuqKOVw==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-riscv64@0.21.2':
+  /@esbuild/linux-riscv64@0.21.2:
+    resolution: {integrity: sha512-x5ssCdXmZC86L2Li1qQPF/VaC4VP20u/Zm8jlAu9IiVOVi79YsSz6cpPDYZl1rfKSHYCJW9XBfFCo66S5gVPSA==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-s390x@0.21.2':
+  /@esbuild/linux-s390x@0.21.2:
+    resolution: {integrity: sha512-NP7fTpGSFWdXyvp8iAFU04uFh9ARoplFVM/m+8lTRpaYG+2ytHPZWyscSsMM6cvObSIK2KoPHXiZD4l99WaxbQ==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-x64@0.21.2':
+  /@esbuild/linux-x64@0.21.2:
+    resolution: {integrity: sha512-giZ/uOxWDKda44ZuyfKbykeXznfuVNkTgXOUOPJIjbayJV6FRpQ4zxUy9JMBPLaK9IJcdWtaoeQrYBMh3Rr4vQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/netbsd-x64@0.21.2':
+  /@esbuild/netbsd-x64@0.21.2:
+    resolution: {integrity: sha512-IeFMfGFSQfIj1d4XU+6lkbFzMR+mFELUUVYrZ+jvWzG4NGvs6o53ReEHLHpYkjRbdEjJy2W3lTekTxrFHW7YJg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/openbsd-x64@0.21.2':
+  /@esbuild/openbsd-x64@0.21.2:
+    resolution: {integrity: sha512-48QhWD6WxcebNNaE4FCwgvQVUnAycuTd+BdvA/oZu+/MmbpU8pY2dMEYlYzj5uNHWIG5jvdDmFXu0naQeOWUoA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/sunos-x64@0.21.2':
+  /@esbuild/sunos-x64@0.21.2:
+    resolution: {integrity: sha512-90r3nTBLgdIgD4FCVV9+cR6Hq2Dzs319icVsln+NTmTVwffWcCqXGml8rAoocHuJ85kZK36DCteii96ba/PX8g==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/win32-arm64@0.21.2':
+  /@esbuild/win32-arm64@0.21.2:
+    resolution: {integrity: sha512-sNndlsBT8OeE/MZDSGpRDJlWuhjuUz/dn80nH0EP4ZzDUYvMDVa7G87DVpweBrn4xdJYyXS/y4CQNrf7R2ODXg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/win32-ia32@0.21.2':
+  /@esbuild/win32-ia32@0.21.2:
+    resolution: {integrity: sha512-Ti2QChGNFzWhUNNVuU4w21YkYTErsNh3h+CzvlEhzgRbwsJ7TrWQqRzW3bllLKKvTppuF3DJ3XP1GEg11AfrEQ==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/win32-x64@0.21.2':
+  /@esbuild/win32-x64@0.21.2:
+    resolution: {integrity: sha512-VEfTCZicoZnZ6sGkjFPGRFFJuL2fZn2bLhsekZl1CJslflp2cJS/VoKs1jMk+3pDfsGW6CfQVUckP707HwbXeQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@protobufjs/aspromise@1.1.2': {}
+  /@protobufjs/aspromise@1.1.2:
+    resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
+    dev: true
 
-  '@protobufjs/base64@1.1.2': {}
+  /@protobufjs/base64@1.1.2:
+    resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==}
+    dev: true
 
-  '@protobufjs/codegen@2.0.4': {}
+  /@protobufjs/codegen@2.0.4:
+    resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==}
+    dev: true
 
-  '@protobufjs/eventemitter@1.1.0': {}
+  /@protobufjs/eventemitter@1.1.0:
+    resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==}
+    dev: true
 
-  '@protobufjs/fetch@1.1.0':
+  /@protobufjs/fetch@1.1.0:
+    resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==}
     dependencies:
       '@protobufjs/aspromise': 1.1.2
       '@protobufjs/inquire': 1.1.0
+    dev: true
 
-  '@protobufjs/float@1.0.2': {}
+  /@protobufjs/float@1.0.2:
+    resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==}
+    dev: true
 
-  '@protobufjs/inquire@1.1.0': {}
+  /@protobufjs/inquire@1.1.0:
+    resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==}
+    dev: true
 
-  '@protobufjs/path@1.1.2': {}
+  /@protobufjs/path@1.1.2:
+    resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==}
+    dev: true
 
-  '@protobufjs/pool@1.1.0': {}
+  /@protobufjs/pool@1.1.0:
+    resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==}
+    dev: true
 
-  '@protobufjs/utf8@1.1.0': {}
+  /@protobufjs/utf8@1.1.0:
+    resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
+    dev: true
 
-  '@socket.io/component-emitter@3.1.2': {}
+  /@socket.io/component-emitter@3.1.2:
+    resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==}
+    dev: true
 
-  '@teppeis/clutz@1.0.2': {}
+  /@teppeis/clutz@1.0.2:
+    resolution: {integrity: sha512-Ql8RZ7EJNahPqjXoES8spoVFoTewAtf+RUcEgd8JwJNj4K6dA+TNUJjLZEtW7FB0h1xbXMqRdttryCmEBGz/PQ==}
+    hasBin: true
+    dev: true
 
-  '@types/cookie@0.4.1': {}
+  /@types/cookie@0.4.1:
+    resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==}
+    dev: true
 
-  '@types/cors@2.8.17':
+  /@types/cors@2.8.17:
+    resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==}
     dependencies:
-      '@types/node': 20.12.11
+      '@types/node': 20.14.2
+    dev: true
 
-  '@types/long@4.0.2': {}
+  /@types/long@4.0.2:
+    resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==}
+    dev: true
 
-  '@types/minimist@1.2.2': {}
+  /@types/minimist@1.2.5:
+    resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
+    dev: true
 
-  '@types/node@10.17.60': {}
+  /@types/node@10.17.60:
+    resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==}
+    dev: true
 
-  '@types/node@20.12.11':
+  /@types/node@20.14.2:
+    resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==}
     dependencies:
       undici-types: 5.26.5
+    dev: true
 
-  '@types/source-map-support@0.5.10':
+  /@types/source-map-support@0.5.10:
+    resolution: {integrity: sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==}
     dependencies:
       source-map: 0.6.1
+    dev: true
 
-  '@yarnpkg/lockfile@1.1.0': {}
+  /@yarnpkg/lockfile@1.1.0:
+    resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==}
+    dev: true
 
-  accepts@1.3.8:
+  /accepts@1.3.8:
+    resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+    engines: {node: '>= 0.6'}
     dependencies:
       mime-types: 2.1.35
       negotiator: 0.6.3
+    dev: true
 
-  ansi-regex@5.0.1: {}
+  /ansi-regex@5.0.1:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+    dev: true
 
-  ansi-styles@4.3.0:
+  /ansi-styles@4.3.0:
+    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+    engines: {node: '>=8'}
     dependencies:
       color-convert: 2.0.1
+    dev: true
 
-  anymatch@3.1.3:
+  /anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
     dependencies:
       normalize-path: 3.0.0
       picomatch: 2.3.1
+    dev: true
 
-  at-least-node@1.0.0: {}
+  /at-least-node@1.0.0:
+    resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
+    engines: {node: '>= 4.0.0'}
+    dev: true
 
-  balanced-match@1.0.2: {}
+  /balanced-match@1.0.2:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+    dev: true
 
-  base64id@2.0.0: {}
+  /base64id@2.0.0:
+    resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==}
+    engines: {node: ^4.5.0 || >= 5.9}
+    dev: true
 
-  binary-extensions@2.3.0: {}
+  /binary-extensions@2.3.0:
+    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+    dev: true
 
-  body-parser@1.20.2:
+  /body-parser@1.20.2:
+    resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
+    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
     dependencies:
       bytes: 3.1.2
       content-type: 1.0.5
@@ -1267,37 +522,56 @@ snapshots:
       unpipe: 1.0.0
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  brace-expansion@1.1.11:
+  /brace-expansion@1.1.11:
+    resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
     dependencies:
       balanced-match: 1.0.2
       concat-map: 0.0.1
+    dev: true
 
-  braces@3.0.2:
+  /braces@3.0.3:
+    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+    engines: {node: '>=8'}
     dependencies:
-      fill-range: 7.0.1
+      fill-range: 7.1.1
+    dev: true
 
-  buffer-from@1.1.2: {}
+  /buffer-from@1.1.2:
+    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+    dev: true
 
-  bytes@3.1.2: {}
+  /bytes@3.1.2:
+    resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+    engines: {node: '>= 0.8'}
+    dev: true
 
-  call-bind@1.0.7:
+  /call-bind@1.0.7:
+    resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+    engines: {node: '>= 0.4'}
     dependencies:
       es-define-property: 1.0.0
       es-errors: 1.3.0
       function-bind: 1.1.2
       get-intrinsic: 1.2.4
       set-function-length: 1.2.2
+    dev: true
 
-  chalk@4.1.2:
+  /chalk@4.1.2:
+    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+    engines: {node: '>=10'}
     dependencies:
       ansi-styles: 4.3.0
       supports-color: 7.2.0
+    dev: true
 
-  chokidar@3.6.0:
+  /chokidar@3.6.0:
+    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+    engines: {node: '>= 8.10.0'}
     dependencies:
       anymatch: 3.1.3
-      braces: 3.0.2
+      braces: 3.0.3
       glob-parent: 5.1.2
       is-binary-path: 2.1.0
       is-glob: 4.0.3
@@ -1305,24 +579,38 @@ snapshots:
       readdirp: 3.6.0
     optionalDependencies:
       fsevents: 2.3.3
+    dev: true
 
-  ci-info@2.0.0: {}
+  /ci-info@2.0.0:
+    resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
+    dev: true
 
-  cliui@7.0.4:
+  /cliui@7.0.4:
+    resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
     dependencies:
       string-width: 4.2.3
       strip-ansi: 6.0.1
       wrap-ansi: 7.0.0
+    dev: true
 
-  color-convert@2.0.1:
+  /color-convert@2.0.1:
+    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+    engines: {node: '>=7.0.0'}
     dependencies:
       color-name: 1.1.4
+    dev: true
 
-  color-name@1.1.4: {}
+  /color-name@1.1.4:
+    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+    dev: true
 
-  concat-map@0.0.1: {}
+  /concat-map@0.0.1:
+    resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+    dev: true
 
-  connect@3.7.0:
+  /connect@3.7.0:
+    resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==}
+    engines: {node: '>= 0.10.0'}
     dependencies:
       debug: 2.6.9
       finalhandler: 1.1.2
@@ -1330,89 +618,163 @@ snapshots:
       utils-merge: 1.0.1
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  content-type@1.0.5: {}
+  /content-type@1.0.5:
+    resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+    engines: {node: '>= 0.6'}
+    dev: true
 
-  cookie@0.4.2: {}
+  /cookie@0.4.2:
+    resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==}
+    engines: {node: '>= 0.6'}
+    dev: true
 
-  cors@2.8.5:
+  /cors@2.8.5:
+    resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+    engines: {node: '>= 0.10'}
     dependencies:
       object-assign: 4.1.1
       vary: 1.1.2
+    dev: true
 
-  cross-spawn@6.0.5:
+  /cross-spawn@6.0.5:
+    resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==}
+    engines: {node: '>=4.8'}
     dependencies:
       nice-try: 1.0.5
       path-key: 2.0.1
       semver: 5.7.2
       shebang-command: 1.2.0
       which: 1.3.1
+    dev: true
 
-  custom-event@1.0.1: {}
+  /custom-event@1.0.1:
+    resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==}
+    dev: true
 
-  date-format@4.0.14: {}
+  /date-format@4.0.14:
+    resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==}
+    engines: {node: '>=4.0'}
+    dev: true
 
-  debug@2.6.9:
+  /debug@2.6.9:
+    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
     dependencies:
       ms: 2.0.0
+    dev: true
 
-  debug@4.3.4:
+  /debug@4.3.5:
+    resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
     dependencies:
       ms: 2.1.2
+    dev: true
 
-  define-data-property@1.1.4:
+  /define-data-property@1.1.4:
+    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+    engines: {node: '>= 0.4'}
     dependencies:
       es-define-property: 1.0.0
       es-errors: 1.3.0
       gopd: 1.0.1
+    dev: true
 
-  depd@2.0.0: {}
+  /depd@2.0.0:
+    resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+    engines: {node: '>= 0.8'}
+    dev: true
 
-  destroy@1.2.0: {}
+  /destroy@1.2.0:
+    resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+    dev: true
 
-  di@0.0.1: {}
+  /di@0.0.1:
+    resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==}
+    dev: true
 
-  dom-serialize@2.2.1:
+  /dom-serialize@2.2.1:
+    resolution: {integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==}
     dependencies:
       custom-event: 1.0.1
-      ent: 2.2.0
+      ent: 2.2.1
       extend: 3.0.2
       void-elements: 2.0.1
+    dev: true
 
-  ee-first@1.1.1: {}
+  /ee-first@1.1.1:
+    resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+    dev: true
 
-  emoji-regex@8.0.0: {}
+  /emoji-regex@8.0.0:
+    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+    dev: true
 
-  encodeurl@1.0.2: {}
+  /encodeurl@1.0.2:
+    resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+    engines: {node: '>= 0.8'}
+    dev: true
 
-  engine.io-parser@5.2.2: {}
+  /engine.io-parser@5.2.2:
+    resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==}
+    engines: {node: '>=10.0.0'}
+    dev: true
 
-  engine.io@6.5.4:
+  /engine.io@6.5.5:
+    resolution: {integrity: sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==}
+    engines: {node: '>=10.2.0'}
     dependencies:
       '@types/cookie': 0.4.1
       '@types/cors': 2.8.17
-      '@types/node': 20.12.11
+      '@types/node': 20.14.2
       accepts: 1.3.8
       base64id: 2.0.0
       cookie: 0.4.2
       cors: 2.8.5
-      debug: 4.3.4
+      debug: 4.3.5
       engine.io-parser: 5.2.2
-      ws: 8.11.0
+      ws: 8.17.1
     transitivePeerDependencies:
       - bufferutil
       - supports-color
       - utf-8-validate
+    dev: true
 
-  ent@2.2.0: {}
+  /ent@2.2.1:
+    resolution: {integrity: sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      punycode: 1.4.1
+    dev: true
 
-  es-define-property@1.0.0:
+  /es-define-property@1.0.0:
+    resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       get-intrinsic: 1.2.4
+    dev: true
 
-  es-errors@1.3.0: {}
+  /es-errors@1.3.0:
+    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+    engines: {node: '>= 0.4'}
+    dev: true
 
-  esbuild@0.21.2:
+  /esbuild@0.21.2:
+    resolution: {integrity: sha512-LmHPAa5h4tSxz+g/D8IHY6wCjtIiFx8I7/Q0Aq+NmvtoYvyMnJU0KQJcqB6QH30X9x/W4CemgUtPgQDZFca5SA==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
     optionalDependencies:
       '@esbuild/aix-ppc64': 0.21.2
       '@esbuild/android-arm': 0.21.2
@@ -1437,20 +799,35 @@ snapshots:
       '@esbuild/win32-arm64': 0.21.2
       '@esbuild/win32-ia32': 0.21.2
       '@esbuild/win32-x64': 0.21.2
+    dev: true
 
-  escalade@3.1.2: {}
+  /escalade@3.1.2:
+    resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+    engines: {node: '>=6'}
+    dev: true
 
-  escape-html@1.0.3: {}
+  /escape-html@1.0.3:
+    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+    dev: true
 
-  eventemitter3@4.0.7: {}
+  /eventemitter3@4.0.7:
+    resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+    dev: true
 
-  extend@3.0.2: {}
+  /extend@3.0.2:
+    resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+    dev: true
 
-  fill-range@7.0.1:
+  /fill-range@7.1.1:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+    engines: {node: '>=8'}
     dependencies:
       to-regex-range: 5.0.1
+    dev: true
 
-  finalhandler@1.1.2:
+  /finalhandler@1.1.2:
+    resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
+    engines: {node: '>= 0.8'}
     dependencies:
       debug: 2.6.9
       encodeurl: 1.0.2
@@ -1461,50 +838,89 @@ snapshots:
       unpipe: 1.0.0
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  find-yarn-workspace-root@2.0.0:
+  /find-yarn-workspace-root@2.0.0:
+    resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==}
     dependencies:
-      micromatch: 4.0.5
+      micromatch: 4.0.7
+    dev: true
 
-  flatted@3.3.1: {}
+  /flatted@3.3.1:
+    resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
+    dev: true
 
-  follow-redirects@1.15.6: {}
+  /follow-redirects@1.15.6:
+    resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      debug: '*'
+    peerDependenciesMeta:
+      debug:
+        optional: true
+    dev: true
 
-  fs-extra@8.1.0:
+  /fs-extra@8.1.0:
+    resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
+    engines: {node: '>=6 <7 || >=8'}
     dependencies:
       graceful-fs: 4.2.11
       jsonfile: 4.0.0
       universalify: 0.1.2
+    dev: true
 
-  fs-extra@9.1.0:
+  /fs-extra@9.1.0:
+    resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
+    engines: {node: '>=10'}
     dependencies:
       at-least-node: 1.0.0
       graceful-fs: 4.2.11
       jsonfile: 6.1.0
-      universalify: 2.0.0
+      universalify: 2.0.1
+    dev: true
 
-  fs.realpath@1.0.0: {}
+  /fs.realpath@1.0.0:
+    resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+    dev: true
 
-  fsevents@2.3.3:
+  /fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  function-bind@1.1.2: {}
+  /function-bind@1.1.2:
+    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+    dev: true
 
-  get-caller-file@2.0.5: {}
+  /get-caller-file@2.0.5:
+    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+    engines: {node: 6.* || 8.* || >= 10.*}
+    dev: true
 
-  get-intrinsic@1.2.4:
+  /get-intrinsic@1.2.4:
+    resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       es-errors: 1.3.0
       function-bind: 1.1.2
       has-proto: 1.0.3
       has-symbols: 1.0.3
       hasown: 2.0.2
+    dev: true
 
-  glob-parent@5.1.2:
+  /glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
     dependencies:
       is-glob: 4.0.3
+    dev: true
 
-  glob@7.2.3:
+  /glob@7.2.3:
+    resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+    deprecated: Glob versions prior to v9 are no longer supported
     dependencies:
       fs.realpath: 1.0.0
       inflight: 1.0.6
@@ -1512,139 +928,239 @@ snapshots:
       minimatch: 3.1.2
       once: 1.4.0
       path-is-absolute: 1.0.1
+    dev: true
 
-  google-closure-library-types@0.1.17:
+  /google-closure-library-types@0.1.17:
+    resolution: {integrity: sha512-zFTLlQTt0nQiSK+fbx//rHYGkK628FOH5XSsIuGqA/yaMlZExS62GdmpphQxUFJ5spUNYTXi/e4FmnlX9NWZew==}
+    requiresBuild: true
     dependencies:
       '@teppeis/clutz': 1.0.2
       google-closure-library: 20190929.0.0
       patch-package: 6.5.1
       typescript: 3.9.10
+    dev: true
 
-  google-closure-library@20190929.0.0: {}
+  /google-closure-library@20190929.0.0:
+    resolution: {integrity: sha512-ChL2te1OLBqI7z2FYohjapHxoo2Jd7KsFTBKoNv9TiOlWR+7zcS4z1RxeUgczWAW9sji3q5OhbbtG/fJlbs1lw==}
+    dev: true
 
-  google-protobuf@3.21.2: {}
+  /google-protobuf@3.21.2:
+    resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==}
+    dev: true
 
-  gopd@1.0.1:
+  /gopd@1.0.1:
+    resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
     dependencies:
       get-intrinsic: 1.2.4
+    dev: true
 
-  graceful-fs@4.2.11: {}
+  /graceful-fs@4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+    dev: true
 
-  has-flag@4.0.0: {}
+  /has-flag@4.0.0:
+    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+    engines: {node: '>=8'}
+    dev: true
 
-  has-property-descriptors@1.0.2:
+  /has-property-descriptors@1.0.2:
+    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
     dependencies:
       es-define-property: 1.0.0
+    dev: true
 
-  has-proto@1.0.3: {}
+  /has-proto@1.0.3:
+    resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
+    engines: {node: '>= 0.4'}
+    dev: true
 
-  has-symbols@1.0.3: {}
+  /has-symbols@1.0.3:
+    resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+    engines: {node: '>= 0.4'}
+    dev: true
 
-  hasown@2.0.2:
+  /hasown@2.0.2:
+    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       function-bind: 1.1.2
+    dev: true
 
-  http-errors@2.0.0:
+  /http-errors@2.0.0:
+    resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+    engines: {node: '>= 0.8'}
     dependencies:
       depd: 2.0.0
       inherits: 2.0.4
       setprototypeof: 1.2.0
       statuses: 2.0.1
       toidentifier: 1.0.1
+    dev: true
 
-  http-proxy@1.18.1:
+  /http-proxy@1.18.1:
+    resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
+    engines: {node: '>=8.0.0'}
     dependencies:
       eventemitter3: 4.0.7
       follow-redirects: 1.15.6
       requires-port: 1.0.0
     transitivePeerDependencies:
       - debug
+    dev: true
 
-  iconv-lite@0.4.24:
+  /iconv-lite@0.4.24:
+    resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       safer-buffer: 2.1.2
+    dev: true
 
-  inflight@1.0.6:
+  /inflight@1.0.6:
+    resolution: {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.
     dependencies:
       once: 1.4.0
       wrappy: 1.0.2
+    dev: true
 
-  inherits@2.0.4: {}
+  /inherits@2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+    dev: true
 
-  is-binary-path@2.1.0:
+  /is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
     dependencies:
       binary-extensions: 2.3.0
+    dev: true
 
-  is-ci@2.0.0:
+  /is-ci@2.0.0:
+    resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==}
+    hasBin: true
     dependencies:
       ci-info: 2.0.0
+    dev: true
 
-  is-docker@2.2.1: {}
+  /is-docker@2.2.1:
+    resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+    engines: {node: '>=8'}
+    hasBin: true
+    dev: true
 
-  is-extglob@2.1.1: {}
+  /is-extglob@2.1.1:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  is-fullwidth-code-point@3.0.0: {}
+  /is-fullwidth-code-point@3.0.0:
+    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+    engines: {node: '>=8'}
+    dev: true
 
-  is-glob@4.0.3:
+  /is-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       is-extglob: 2.1.1
+    dev: true
 
-  is-number@7.0.0: {}
+  /is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+    dev: true
 
-  is-wsl@2.2.0:
+  /is-wsl@2.2.0:
+    resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+    engines: {node: '>=8'}
     dependencies:
       is-docker: 2.2.1
+    dev: true
 
-  isbinaryfile@4.0.10: {}
+  /isbinaryfile@4.0.10:
+    resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==}
+    engines: {node: '>= 8.0.0'}
+    dev: true
 
-  isexe@2.0.0: {}
+  /isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+    dev: true
 
-  jasmine-core@4.6.0: {}
+  /jasmine-core@4.6.1:
+    resolution: {integrity: sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==}
+    dev: true
 
-  jsonfile@4.0.0:
+  /jsonfile@4.0.0:
+    resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
     optionalDependencies:
       graceful-fs: 4.2.11
+    dev: true
 
-  jsonfile@6.1.0:
+  /jsonfile@6.1.0:
+    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
     dependencies:
-      universalify: 2.0.0
+      universalify: 2.0.1
     optionalDependencies:
       graceful-fs: 4.2.11
+    dev: true
 
-  karma-chrome-launcher@3.2.0:
+  /karma-chrome-launcher@3.2.0:
+    resolution: {integrity: sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==}
     dependencies:
       which: 1.3.1
+    dev: true
 
-  karma-firefox-launcher@2.1.3:
+  /karma-firefox-launcher@2.1.3:
+    resolution: {integrity: sha512-LMM2bseebLbYjODBOVt7TCPP9OI2vZIXCavIXhkO9m+10Uj5l7u/SKoeRmYx8FYHTVGZSpk6peX+3BMHC1WwNw==}
     dependencies:
       is-wsl: 2.2.0
       which: 3.0.1
+    dev: true
 
-  karma-jasmine@5.1.0(karma@6.4.3):
+  /karma-jasmine@5.1.0(karma@6.4.3):
+    resolution: {integrity: sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      karma: ^6.0.0
     dependencies:
-      jasmine-core: 4.6.0
+      jasmine-core: 4.6.1
       karma: 6.4.3
+    dev: true
 
-  karma-junit-reporter@2.0.1(karma@6.4.3):
+  /karma-junit-reporter@2.0.1(karma@6.4.3):
+    resolution: {integrity: sha512-VtcGfE0JE4OE1wn0LK8xxDKaTP7slN8DO3I+4xg6gAi1IoAHAXOJ1V9G/y45Xg6sxdxPOR3THCFtDlAfBo9Afw==}
+    engines: {node: '>= 8'}
+    peerDependencies:
+      karma: '>=0.9'
     dependencies:
       karma: 6.4.3
       path-is-absolute: 1.0.1
       xmlbuilder: 12.0.0
+    dev: true
 
-  karma-requirejs@1.1.0(karma@6.4.3)(requirejs@2.3.6):
+  /karma-requirejs@1.1.0(karma@6.4.3)(requirejs@2.3.6):
+    resolution: {integrity: sha512-MHTOYKdwwJBkvYid0TaYvBzOnFH3TDtzo6ie5E4o9SaUSXXsfMRLa/whUz6efVIgTxj1xnKYasNn/XwEgJeB/Q==}
+    peerDependencies:
+      karma: '>=0.9'
+      requirejs: ^2.1.0
     dependencies:
       karma: 6.4.3
       requirejs: 2.3.6
+    dev: true
 
-  karma-sourcemap-loader@0.4.0:
+  /karma-sourcemap-loader@0.4.0:
+    resolution: {integrity: sha512-xCRL3/pmhAYF3I6qOrcn0uhbQevitc2DERMPH82FMnG+4WReoGcGFZb1pURf2a5apyrOHRdvD+O6K7NljqKHyA==}
     dependencies:
       graceful-fs: 4.2.11
+    dev: true
 
-  karma@6.4.3:
+  /karma@6.4.3:
+    resolution: {integrity: sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==}
+    engines: {node: '>= 10'}
+    hasBin: true
     dependencies:
       '@colors/colors': 1.5.0
       body-parser: 1.20.2
-      braces: 3.0.2
+      braces: 3.0.3
       chokidar: 3.6.0
       connect: 3.7.0
       di: 0.0.1
@@ -1664,95 +1180,168 @@ snapshots:
       socket.io: 4.7.5
       source-map: 0.6.1
       tmp: 0.2.3
-      ua-parser-js: 0.7.37
+      ua-parser-js: 0.7.38
       yargs: 16.2.0
     transitivePeerDependencies:
       - bufferutil
       - debug
       - supports-color
       - utf-8-validate
+    dev: true
 
-  klaw-sync@6.0.0:
+  /klaw-sync@6.0.0:
+    resolution: {integrity: sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==}
     dependencies:
       graceful-fs: 4.2.11
+    dev: true
 
-  lodash@4.17.21: {}
+  /lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+    dev: true
 
-  log4js@6.9.1:
+  /log4js@6.9.1:
+    resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==}
+    engines: {node: '>=8.0'}
     dependencies:
       date-format: 4.0.14
-      debug: 4.3.4
+      debug: 4.3.5
       flatted: 3.3.1
-      rfdc: 1.3.1
+      rfdc: 1.4.1
       streamroller: 3.1.5
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  long@4.0.0: {}
+  /long@4.0.0:
+    resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==}
+    dev: true
 
-  long@5.2.3: {}
+  /long@5.2.3:
+    resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==}
+    dev: true
 
-  media-typer@0.3.0: {}
+  /media-typer@0.3.0:
+    resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+    engines: {node: '>= 0.6'}
+    dev: true
 
-  micromatch@4.0.5:
+  /micromatch@4.0.7:
+    resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
+    engines: {node: '>=8.6'}
     dependencies:
-      braces: 3.0.2
+      braces: 3.0.3
       picomatch: 2.3.1
+    dev: true
 
-  mime-db@1.52.0: {}
+  /mime-db@1.52.0:
+    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+    engines: {node: '>= 0.6'}
+    dev: true
 
-  mime-types@2.1.35:
+  /mime-types@2.1.35:
+    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+    engines: {node: '>= 0.6'}
     dependencies:
       mime-db: 1.52.0
+    dev: true
 
-  mime@2.6.0: {}
+  /mime@2.6.0:
+    resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==}
+    engines: {node: '>=4.0.0'}
+    hasBin: true
+    dev: true
 
-  minimatch@3.1.2:
+  /minimatch@3.1.2:
+    resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
     dependencies:
       brace-expansion: 1.1.11
+    dev: true
 
-  minimist@1.2.8: {}
+  /minimist@1.2.8:
+    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+    dev: true
 
-  mkdirp@0.5.6:
+  /mkdirp@0.5.6:
+    resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+    hasBin: true
     dependencies:
       minimist: 1.2.8
+    dev: true
 
-  ms@2.0.0: {}
+  /ms@2.0.0:
+    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+    dev: true
 
-  ms@2.1.2: {}
+  /ms@2.1.2:
+    resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+    dev: true
 
-  negotiator@0.6.3: {}
+  /negotiator@0.6.3:
+    resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+    engines: {node: '>= 0.6'}
+    dev: true
 
-  nice-try@1.0.5: {}
+  /nice-try@1.0.5:
+    resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
+    dev: true
 
-  normalize-path@3.0.0: {}
+  /normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  object-assign@4.1.1: {}
+  /object-assign@4.1.1:
+    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  object-inspect@1.13.1: {}
+  /object-inspect@1.13.2:
+    resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
+    engines: {node: '>= 0.4'}
+    dev: true
 
-  on-finished@2.3.0:
+  /on-finished@2.3.0:
+    resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
+    engines: {node: '>= 0.8'}
     dependencies:
       ee-first: 1.1.1
+    dev: true
 
-  on-finished@2.4.1:
+  /on-finished@2.4.1:
+    resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+    engines: {node: '>= 0.8'}
     dependencies:
       ee-first: 1.1.1
+    dev: true
 
-  once@1.4.0:
+  /once@1.4.0:
+    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
     dependencies:
       wrappy: 1.0.2
+    dev: true
 
-  open@7.4.2:
+  /open@7.4.2:
+    resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==}
+    engines: {node: '>=8'}
     dependencies:
       is-docker: 2.2.1
       is-wsl: 2.2.0
+    dev: true
 
-  os-tmpdir@1.0.2: {}
+  /os-tmpdir@1.0.2:
+    resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  parseurl@1.3.3: {}
+  /parseurl@1.3.3:
+    resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+    engines: {node: '>= 0.8'}
+    dev: true
 
-  patch-package@6.5.1:
+  /patch-package@6.5.1:
+    resolution: {integrity: sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==}
+    engines: {node: '>=10', npm: '>5'}
+    hasBin: true
     dependencies:
       '@yarnpkg/lockfile': 1.1.0
       chalk: 4.1.2
@@ -1768,14 +1357,27 @@ snapshots:
       slash: 2.0.0
       tmp: 0.0.33
       yaml: 1.10.2
+    dev: true
 
-  path-is-absolute@1.0.1: {}
+  /path-is-absolute@1.0.1:
+    resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  path-key@2.0.1: {}
+  /path-key@2.0.1:
+    resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==}
+    engines: {node: '>=4'}
+    dev: true
 
-  picomatch@2.3.1: {}
+  /picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+    dev: true
 
-  protobufjs@6.8.8:
+  /protobufjs@6.8.8:
+    resolution: {integrity: sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==}
+    hasBin: true
+    requiresBuild: true
     dependencies:
       '@protobufjs/aspromise': 1.1.2
       '@protobufjs/base64': 1.1.2
@@ -1790,8 +1392,12 @@ snapshots:
       '@types/long': 4.0.2
       '@types/node': 10.17.60
       long: 4.0.0
+    dev: true
 
-  protobufjs@7.3.0:
+  /protobufjs@7.3.0:
+    resolution: {integrity: sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==}
+    engines: {node: '>=12.0.0'}
+    requiresBuild: true
     dependencies:
       '@protobufjs/aspromise': 1.1.2
       '@protobufjs/base64': 1.1.2
@@ -1803,51 +1409,100 @@ snapshots:
       '@protobufjs/path': 1.1.2
       '@protobufjs/pool': 1.1.0
       '@protobufjs/utf8': 1.1.0
-      '@types/node': 20.12.11
+      '@types/node': 20.14.2
       long: 5.2.3
+    dev: true
 
-  qjobs@1.2.0: {}
+  /punycode@1.4.1:
+    resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+    dev: true
 
-  qs@6.11.0:
+  /qjobs@1.2.0:
+    resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==}
+    engines: {node: '>=0.9'}
+    dev: true
+
+  /qs@6.11.0:
+    resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
+    engines: {node: '>=0.6'}
     dependencies:
       side-channel: 1.0.6
+    dev: true
 
-  range-parser@1.2.1: {}
+  /range-parser@1.2.1:
+    resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+    engines: {node: '>= 0.6'}
+    dev: true
 
-  raw-body@2.5.2:
+  /raw-body@2.5.2:
+    resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
+    engines: {node: '>= 0.8'}
     dependencies:
       bytes: 3.1.2
       http-errors: 2.0.0
       iconv-lite: 0.4.24
       unpipe: 1.0.0
+    dev: true
 
-  readdirp@3.6.0:
+  /readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
     dependencies:
       picomatch: 2.3.1
+    dev: true
 
-  require-directory@2.1.1: {}
+  /require-directory@2.1.1:
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  requirejs@2.3.6: {}
+  /requirejs@2.3.6:
+    resolution: {integrity: sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+    dev: true
 
-  requires-port@1.0.0: {}
+  /requires-port@1.0.0:
+    resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+    dev: true
 
-  rfdc@1.3.1: {}
+  /rfdc@1.4.1:
+    resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+    dev: true
 
-  rimraf@2.7.1:
+  /rimraf@2.7.1:
+    resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
+    deprecated: Rimraf versions prior to v4 are no longer supported
+    hasBin: true
     dependencies:
       glob: 7.2.3
+    dev: true
 
-  rimraf@3.0.2:
+  /rimraf@3.0.2:
+    resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+    deprecated: Rimraf versions prior to v4 are no longer supported
+    hasBin: true
     dependencies:
       glob: 7.2.3
+    dev: true
 
-  safer-buffer@2.1.2: {}
+  /safer-buffer@2.1.2:
+    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+    dev: true
 
-  semver@5.6.0: {}
+  /semver@5.6.0:
+    resolution: {integrity: sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==}
+    hasBin: true
+    dev: true
 
-  semver@5.7.2: {}
+  /semver@5.7.2:
+    resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+    hasBin: true
+    dev: true
 
-  set-function-length@1.2.2:
+  /set-function-length@1.2.2:
+    resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       define-data-property: 1.1.4
       es-errors: 1.3.0
@@ -1855,170 +1510,313 @@ snapshots:
       get-intrinsic: 1.2.4
       gopd: 1.0.1
       has-property-descriptors: 1.0.2
+    dev: true
 
-  setprototypeof@1.2.0: {}
+  /setprototypeof@1.2.0:
+    resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+    dev: true
 
-  shebang-command@1.2.0:
+  /shebang-command@1.2.0:
+    resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       shebang-regex: 1.0.0
+    dev: true
 
-  shebang-regex@1.0.0: {}
+  /shebang-regex@1.0.0:
+    resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  side-channel@1.0.6:
+  /side-channel@1.0.6:
+    resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.7
       es-errors: 1.3.0
       get-intrinsic: 1.2.4
-      object-inspect: 1.13.1
+      object-inspect: 1.13.2
+    dev: true
 
-  slash@2.0.0: {}
+  /slash@2.0.0:
+    resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==}
+    engines: {node: '>=6'}
+    dev: true
 
-  socket.io-adapter@2.5.4:
+  /socket.io-adapter@2.5.5:
+    resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==}
     dependencies:
-      debug: 4.3.4
-      ws: 8.11.0
+      debug: 4.3.5
+      ws: 8.17.1
     transitivePeerDependencies:
       - bufferutil
       - supports-color
       - utf-8-validate
+    dev: true
 
-  socket.io-parser@4.2.4:
+  /socket.io-parser@4.2.4:
+    resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==}
+    engines: {node: '>=10.0.0'}
     dependencies:
       '@socket.io/component-emitter': 3.1.2
-      debug: 4.3.4
+      debug: 4.3.5
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  socket.io@4.7.5:
+  /socket.io@4.7.5:
+    resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==}
+    engines: {node: '>=10.2.0'}
     dependencies:
       accepts: 1.3.8
       base64id: 2.0.0
       cors: 2.8.5
-      debug: 4.3.4
-      engine.io: 6.5.4
-      socket.io-adapter: 2.5.4
+      debug: 4.3.5
+      engine.io: 6.5.5
+      socket.io-adapter: 2.5.5
       socket.io-parser: 4.2.4
     transitivePeerDependencies:
       - bufferutil
       - supports-color
       - utf-8-validate
+    dev: true
 
-  source-map-support@0.5.21:
+  /source-map-support@0.5.21:
+    resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
     dependencies:
       buffer-from: 1.1.2
       source-map: 0.6.1
+    dev: true
 
-  source-map-support@0.5.9:
+  /source-map-support@0.5.9:
+    resolution: {integrity: sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==}
     dependencies:
       buffer-from: 1.1.2
       source-map: 0.6.1
+    dev: true
 
-  source-map@0.6.1: {}
+  /source-map@0.6.1:
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  statuses@1.5.0: {}
+  /statuses@1.5.0:
+    resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
+    engines: {node: '>= 0.6'}
+    dev: true
 
-  statuses@2.0.1: {}
+  /statuses@2.0.1:
+    resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+    engines: {node: '>= 0.8'}
+    dev: true
 
-  streamroller@3.1.5:
+  /streamroller@3.1.5:
+    resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==}
+    engines: {node: '>=8.0'}
     dependencies:
       date-format: 4.0.14
-      debug: 4.3.4
+      debug: 4.3.5
       fs-extra: 8.1.0
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  string-width@4.2.3:
+  /string-width@4.2.3:
+    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+    engines: {node: '>=8'}
     dependencies:
       emoji-regex: 8.0.0
       is-fullwidth-code-point: 3.0.0
       strip-ansi: 6.0.1
+    dev: true
 
-  strip-ansi@6.0.1:
+  /strip-ansi@6.0.1:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
     dependencies:
       ansi-regex: 5.0.1
+    dev: true
 
-  supports-color@7.2.0:
+  /supports-color@7.2.0:
+    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+    engines: {node: '>=8'}
     dependencies:
       has-flag: 4.0.0
+    dev: true
 
-  tmp@0.0.33:
+  /tmp@0.0.33:
+    resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+    engines: {node: '>=0.6.0'}
     dependencies:
       os-tmpdir: 1.0.2
+    dev: true
 
-  tmp@0.2.3: {}
+  /tmp@0.2.3:
+    resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==}
+    engines: {node: '>=14.14'}
+    dev: true
 
-  to-regex-range@5.0.1:
+  /to-regex-range@5.0.1:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
     dependencies:
       is-number: 7.0.0
+    dev: true
 
-  toidentifier@1.0.1: {}
+  /toidentifier@1.0.1:
+    resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+    engines: {node: '>=0.6'}
+    dev: true
 
-  tsickle@0.46.3(typescript@5.4.5):
+  /tsickle@0.46.3(typescript@4.9.5):
+    resolution: {integrity: sha512-9PDXxOrtn2AdpvDin6FLGveXVGg8ec3ga8fh8mPR5lz9KtitW6riVgxgagicdfF1rgiBxDeH+5hVowPXhmZbYQ==}
+    peerDependencies:
+      typescript: ~4.7.2
     dependencies:
-      '@types/minimist': 1.2.2
-      typescript: 5.4.5
+      '@types/minimist': 1.2.5
+      typescript: 4.9.5
+    dev: true
 
-  tslib@1.14.1: {}
+  /tslib@1.14.1:
+    resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+    dev: true
 
-  tslib@2.6.2: {}
+  /tslib@2.6.3:
+    resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
+    dev: true
 
-  tsutils@3.21.0(typescript@5.4.5):
+  /tsutils@3.21.0(typescript@4.9.5):
+    resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+    engines: {node: '>= 6'}
+    peerDependencies:
+      typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
     dependencies:
       tslib: 1.14.1
-      typescript: 5.4.5
+      typescript: 4.9.5
+    dev: true
 
-  type-is@1.6.18:
+  /type-is@1.6.18:
+    resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+    engines: {node: '>= 0.6'}
     dependencies:
       media-typer: 0.3.0
       mime-types: 2.1.35
+    dev: true
 
-  typescript@3.9.10: {}
+  /typescript@3.9.10:
+    resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==}
+    engines: {node: '>=4.2.0'}
+    hasBin: true
+    dev: true
 
-  typescript@5.4.5: {}
+  /typescript@4.9.5:
+    resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
+    engines: {node: '>=4.2.0'}
+    hasBin: true
+    dev: true
 
-  ua-parser-js@0.7.37: {}
+  /ua-parser-js@0.7.38:
+    resolution: {integrity: sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA==}
+    dev: true
 
-  undici-types@5.26.5: {}
+  /undici-types@5.26.5:
+    resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+    dev: true
 
-  universalify@0.1.2: {}
+  /universalify@0.1.2:
+    resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+    engines: {node: '>= 4.0.0'}
+    dev: true
 
-  universalify@2.0.0: {}
+  /universalify@2.0.1:
+    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+    engines: {node: '>= 10.0.0'}
+    dev: true
 
-  unpipe@1.0.0: {}
+  /unpipe@1.0.0:
+    resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+    engines: {node: '>= 0.8'}
+    dev: true
 
-  utils-merge@1.0.1: {}
+  /utils-merge@1.0.1:
+    resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+    engines: {node: '>= 0.4.0'}
+    dev: true
 
-  vary@1.1.2: {}
+  /vary@1.1.2:
+    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+    engines: {node: '>= 0.8'}
+    dev: true
 
-  void-elements@2.0.1: {}
+  /void-elements@2.0.1:
+    resolution: {integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  which@1.3.1:
+  /which@1.3.1:
+    resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+    hasBin: true
     dependencies:
       isexe: 2.0.0
+    dev: true
 
-  which@3.0.1:
+  /which@3.0.1:
+    resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==}
+    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+    hasBin: true
     dependencies:
       isexe: 2.0.0
+    dev: true
 
-  wrap-ansi@7.0.0:
+  /wrap-ansi@7.0.0:
+    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+    engines: {node: '>=10'}
     dependencies:
       ansi-styles: 4.3.0
       string-width: 4.2.3
       strip-ansi: 6.0.1
+    dev: true
 
-  wrappy@1.0.2: {}
+  /wrappy@1.0.2:
+    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+    dev: true
 
-  ws@8.11.0: {}
+  /ws@8.17.1:
+    resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==}
+    engines: {node: '>=10.0.0'}
+    peerDependencies:
+      bufferutil: ^4.0.1
+      utf-8-validate: '>=5.0.2'
+    peerDependenciesMeta:
+      bufferutil:
+        optional: true
+      utf-8-validate:
+        optional: true
+    dev: true
 
-  xmlbuilder@12.0.0: {}
+  /xmlbuilder@12.0.0:
+    resolution: {integrity: sha512-lMo8DJ8u6JRWp0/Y4XLa/atVDr75H9litKlb2E5j3V3MesoL50EBgZDWoLT3F/LztVnG67GjPXLZpqcky/UMnQ==}
+    engines: {node: '>=6.0'}
+    dev: true
 
-  y18n@5.0.8: {}
+  /y18n@5.0.8:
+    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+    engines: {node: '>=10'}
+    dev: true
 
-  yaml@1.10.2: {}
+  /yaml@1.10.2:
+    resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+    engines: {node: '>= 6'}
+    dev: true
 
-  yargs-parser@20.2.9: {}
+  /yargs-parser@20.2.9:
+    resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+    engines: {node: '>=10'}
+    dev: true
 
-  yargs@16.2.0:
+  /yargs@16.2.0:
+    resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
+    engines: {node: '>=10'}
     dependencies:
       cliui: 7.0.4
       escalade: 3.1.2
@@ -2027,3 +1825,4 @@ snapshots:
       string-width: 4.2.3
       y18n: 5.0.8
       yargs-parser: 20.2.9
+    dev: true
diff --git a/tools/defs.bzl b/tools/defs.bzl
index 55c3e71..2221dee 100644
--- a/tools/defs.bzl
+++ b/tools/defs.bzl
@@ -4,11 +4,11 @@
 load(
     "@elide//tools/defs/closure:externs.bzl",
     _closure_extern = "closure_extern",
-    _extern = "extern",
     _js_extern = "js_extern",
 )
 load(
     "@elide//tools/defs:elide.bzl",
+    _py_library = "py_library",
     _js_library = "js_library",
     _ts_library = "ts_library",
     _ts_config = "ts_config",
@@ -21,6 +21,7 @@ extern = _js_extern
 js_extern = _js_extern
 
 ## Elide: Macros.
+py_library = _py_library
 js_library = _js_library
 ts_library = _ts_library
 ts_config = _ts_config
diff --git a/tools/defs/elide.bzl b/tools/defs/elide.bzl
index e8de77c..3bda703 100644
--- a/tools/defs/elide.bzl
+++ b/tools/defs/elide.bzl
@@ -71,6 +71,8 @@ _RUNTIME_DEFINES.update({
 _JS_MODULE_PREFIX = "@elide/runtime/module"
 
 _ARCHIVE_ROOT_PREFIX = "__runtime__"
+_ELIDE_MODULE_ROOT_PREFIX = "node_modules"
+_ELIDE_MODULE_PREFIX = "elide"
 
 _common_js_library_config = {
     "language": _JS_LANGUAGE,
@@ -140,6 +142,7 @@ def _js_module(
         entry_point = None,
         module = None,
         host_module = None,
+        elide_module = False,
         js_srcs = [],
         srcs = [],
         deps = [],
@@ -246,6 +249,11 @@ def _js_module(
     archive_prefix = "%s/%s/" % (_ARCHIVE_ROOT_PREFIX, module or name)
     if host_module:
         archive_prefix = "%s/%s/%s/" % (_ARCHIVE_ROOT_PREFIX, host_module, module or name)
+    if elide_module:
+        if host_module:
+            archive_prefix = "%s/%s:%s/%s/" % (_ELIDE_MODULE_ROOT_PREFIX, _ELIDE_MODULE_PREFIX, host_module, module or name)
+        else:
+            archive_prefix = "%s/%s:%s/" % (_ELIDE_MODULE_ROOT_PREFIX, _ELIDE_MODULE_PREFIX, module or name)
 
     _pkg_filegroup(
         name = "%s.tarfilegroup" % name,
@@ -263,6 +271,47 @@ def _js_module(
         actual = "%s.tarfilegroup" % name,
     )
 
+def _py_library(
+        name,
+        srcs,
+        module = None,
+        deps = [],
+        data = [],
+        **kwargs):
+    """Defines a Python package."""
+
+    native.filegroup(
+        name = "%s.files" % name,
+        srcs = srcs + deps,
+        data = data,
+    )
+    _pkg_tar(
+        name = "%s.archive" % name,
+        out = "%s.tar" % name,
+        srcs = [":%s.files" % name],
+        package_dir = "%s/python/%s/" % (_ARCHIVE_ROOT_PREFIX, module or name),
+    )
+    native.alias(
+        name = name,
+        actual = "%s.archive" % name,
+    )
+
+def _py_runtime(
+        name,
+        deps,
+        extra_sources = [],
+        **kwargs):
+    """Single-use target macro which defines the main application entry target for the Elide Python runtime."""
+
+    native.filegroup(
+        name = "%s.files" % name,
+        srcs = extra_sources + deps,
+    )
+    native.alias(
+        name = name,
+        actual = "%s.files" % name,
+    )
+
 def _js_runtime(
         name,
         main,
@@ -440,56 +489,101 @@ def _ts_runtime(
         actual = "tsruntime.tarball",
     )
 
-def _runtime_dist(name, language, target, manifest, info = [], configs = [], modules = [], extra_sources = []):
+def _runtime_dist(name, language, target, manifest, info = [], configs = [], modules = [], elide_modules = [], extra_sources = []):
     """ """
 
     outs = []
 
-    native.filegroup(
-        name = "distfiles",
-        srcs = [
-            "runtime.js.gz",
-            "runtime.js.gz.sha256",
-        ] + configs + extra_sources,
-    )
-    if len(modules) > 0:
+    if language == "js":
+        native.filegroup(
+            name = "distfiles",
+            srcs = [
+                "runtime.js.gz",
+                "runtime.js.gz.sha256",
+            ] + configs + extra_sources,
+        )
+        if len(modules) > 0:
+            _pkg_tar(
+                name = "%s.elide-modules" % language,
+                out = "%s.elide-modules.tar" % language,
+                extension = "tar",
+                srcs = elide_modules,
+            )
+            _pkg_tar(
+                name = "%s.modules" % language,
+                out = "%s.modules.tar" % language,
+                extension = "tar",
+                srcs = modules,
+                deps = ["%s.elide-modules" % language],
+            )
+            outs.append(":%s.modules" % language)
         _pkg_tar(
-            name = "%s.modules" % language,
-            out = "%s.modules.tar.gz" % language,
-            extension = "tar.gz",
+            name = "%s.tarball" % language,
+            out = "%s.dist.tar" % language,
+            srcs = [":distfiles"] + modules,
+        )
+        _jar_resources(
+            name = "%s.runtime" % language,
+            language = language,
+            manifest = manifest,
+            srcs = [":distfiles"],
+        )
+        native.filegroup(
+            name = "distributions",
+            srcs = [
+                ":%s.tarball" % language,
+                ":%s.runtime" % language,
+            ] + info,
+        )
+
+        _pkg_zip(
+            name = "dist-all",
+            out = "%s.dist-all.zip" % language,
+            srcs = [":distributions"],
+        )
+        native.filegroup(
+            name = "dist-all-outs",
+            srcs = [
+                ":dist-all",
+            ] + outs
+        )
+
+    elif language == "py":
+        if len(modules) > 0:
+            _pkg_tar(
+                name = "%s.modules" % language,
+                out = "%s.modules.tar" % language,
+                extension = "tar",
+                deps = modules,
+            )
+            outs.append(":%s.modules" % language)
+
+        _pkg_tar(
+            name = "%s.tarball" % language,
+            out = "%s.dist.tar" % language,
             srcs = modules,
         )
-        outs.append(":%s.modules" % language)
-    _pkg_tar(
-        name = "%s.tarball" % language,
-        out = "%s.dist.tar" % language,
-        srcs = [":distfiles"] + modules,
-    )
-    _jar_resources(
-        name = "%s.runtime" % language,
-        language = language,
-        manifest = manifest,
-        srcs = [":distfiles"],
-    )
-    native.filegroup(
-        name = "distributions",
-        srcs = [
-            ":%s.tarball" % language,
-            ":%s.runtime" % language,
-        ] + info,
-    )
+        native.filegroup(
+            name = "distributions",
+            srcs = [
+                ":%s.tarball" % language,
+            ] + info,
+        )
+        _pkg_tar(
+            name = "dist-all",
+            out = "%s.dist-all.tar" % language,
+            srcs = [":distributions"],
+        )
+        native.filegroup(
+            name = "dist-all-outs",
+            srcs = [
+                ":dist-all",
+            ] + outs
+        )
 
-    _pkg_tar(
-        name = "dist-all",
-        out = "%s.dist-all.tar" % language,
-        srcs = [":distributions"],
-    )
-    native.filegroup(
-        name = "dist-all-outs",
-        srcs = [
-            ":dist-all",
-        ] + outs
-    )
+
+    else:
+        fail("Unrecognized language: %s" % language)
 
     native.alias(
         name = name,
@@ -509,3 +603,5 @@ ts_library = _ts_library
 ts_config = _ts_config
 ts_runtime = _ts_runtime
 runtime_dist = _runtime_dist
+py_library = _py_library
+py_runtime = _py_runtime
diff --git a/tools/defs/tsc/compiler/BUILD.bazel b/tools/defs/tsc/compiler/BUILD.bazel
index 72c9f65..93e7821 100644
--- a/tools/defs/tsc/compiler/BUILD.bazel
+++ b/tools/defs/tsc/compiler/BUILD.bazel
@@ -1,14 +1,13 @@
 """Macros and configurations for integrating TypeScript with Closure."""
-
-package(
-    default_visibility = ["//visibility:public"],
-)
-
 load(
     "@build_bazel_rules_nodejs//:index.bzl",
     "nodejs_binary",
 )
 
+package(
+    default_visibility = ["//visibility:public"],
+)
+
 nodejs_binary(
     name = "tsc_wrapped",
     data = [
diff --git a/tools/defs/tsc/typescript.bzl b/tools/defs/tsc/typescript.bzl
index 356a701..28c47e0 100644
--- a/tools/defs/tsc/typescript.bzl
+++ b/tools/defs/tsc/typescript.bzl
@@ -37,6 +37,7 @@ _BASE_JS_DEPS = [
 
 _BASE_SUPPRESSIONS = [
     "JSC_UNREACHABLE_CODE",
+    "JSC_UNKNOWN_EXPR_TYPE",
 ]
 
 _BASE_TS_ARGS = {
@@ -48,6 +49,8 @@ _BASE_TS_ARGS = {
     "tsconfig": "//elide/runtime/js:tsconfig",
 }
 
+_TS_GLOBAL_TYPES = ["//types"]
+
 def _fixup_shortlabel(label):
     """Fixup a short-label which has no target."""
     if label.startswith("@"):
@@ -66,6 +69,7 @@ def _wrapped_ts_library(
         lib_kwargs = {},
         suppress = [],
         include_tools = True,
+        include_types = True,
         nowrap = False,
         *args,
         **kwargs):
@@ -94,6 +98,8 @@ def _wrapped_ts_library(
     else:
         ts_deps_resolved = _BASE_TS_DEPS + ["%s_ts" % _fixup_shortlabel(i) for i in deps]
         closure_deps_resolved = ["%s_js" % _fixup_shortlabel(i) for i in closure_deps]
+        if include_types:
+            ts_deps_resolved += _TS_GLOBAL_TYPES
         if include_tools:
             ts_deps_resolved += _BASE_TS_TOOLS
 
diff --git a/tsconfig.base.json b/tsconfig.base.json
index d37ebbe..cdff439 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -17,6 +17,7 @@
       "es2021",
       "ES2021.Promise",
       "es2021.intl",
+      "es2022",
       "esnext"
     ],
 
@@ -98,7 +99,10 @@
     // Explicitly set types settings so typescript doesn't auto-discover types.
     // If all types are discovered then all types need to be included as deps
     // or typescript may error out with TS2688: Cannot find type definition file for 'foo'.
-    "types": []
+    "types": [],
+
+    // Mount local type declarations.
+    "typeRoots": ["./types"]
   },
   "exclude": [
     "node_modules"
diff --git a/types/BUILD.bazel b/types/BUILD.bazel
new file mode 100644
index 0000000..7ba88e3
--- /dev/null
+++ b/types/BUILD.bazel
@@ -0,0 +1,24 @@
+load(
+    "@npm//@bazel/typescript:index.bzl",
+    _pure_ts_library = "ts_library",
+)
+
+package(
+    default_visibility = ["//visibility:public"],
+)
+
+filegroup(
+  name = "srcs",
+  srcs = ["primordials.d.ts"],
+)
+
+_pure_ts_library(
+  name = "ts",
+  srcs = [":srcs"],
+)
+
+
+alias(
+  name = "types",
+  actual = ":ts",
+)
diff --git a/types/primordials.d.ts b/types/primordials.d.ts
new file mode 100644
index 0000000..e161edd
--- /dev/null
+++ b/types/primordials.d.ts
@@ -0,0 +1,10 @@
+
+export type PrimordialsObject = {
+  [key: string]: any;
+};
+
+declare global {
+  const primordials: PrimordialsObject;
+}
+
+export {};
diff --git a/yarn.lock b/yarn.lock
index 019a965..87f18b7 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -259,15 +259,10 @@
   resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
   integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
 
-"@types/node@*", "@types/node@>=10.0.0", "@types/node@>=13.7.0":
-  version "20.4.5"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.5.tgz#9dc0a5cb1ccce4f7a731660935ab70b9c00a5d69"
-  integrity sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==
-
-"@types/node@20.12.11":
-  version "20.12.11"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.11.tgz#c4ef00d3507000d17690643278a60dc55a9dc9be"
-  integrity sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==
+"@types/node@*", "@types/node@20.14.2", "@types/node@>=10.0.0", "@types/node@>=13.7.0":
+  version "20.14.2"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18"
+  integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==
   dependencies:
     undici-types "~5.26.4"
 
@@ -652,9 +647,9 @@ flatted@^3.2.7:
   integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
 
 follow-redirects@^1.0.0:
-  version "1.15.2"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
-  integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
+  version "1.15.6"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
+  integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
 
 fs-extra@^8.1.0:
   version "8.1.0"
@@ -1423,10 +1418,10 @@ tsickle@0.46.3:
   dependencies:
     "@types/minimist" "^1.2.1"
 
-tslib@2.6.2:
-  version "2.6.2"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
-  integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
+tslib@2.6.3:
+  version "2.6.3"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0"
+  integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
 
 tslib@^1.8.1:
   version "1.14.1"