diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index c0a2b1fc2f376163a2afc927571a1f2b5ad463e6..35cb2516469658c801ec71949c2b200198e68e41 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -3,6 +3,7 @@
   "features": {
     "ghcr.io/devcontainers/features/node:1": {},
     "ghcr.io/devcontainers-contrib/features/turborepo-npm:1": {},
-    "ghcr.io/devcontainers-contrib/features/typescript:2": {}
+    "ghcr.io/devcontainers-contrib/features/typescript:2": {},
+    "ghcr.io/devcontainers-contrib/features/pnpm:2": {}
   }
 }
diff --git a/packages/core/package.json b/packages/core/package.json
index 31b33979faad26d5fd32c87419f2694ca355e016..bd0debc64778c5e183a5394b3d1856115378c4fe 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -3,16 +3,19 @@
   "dependencies": {
     "axios": "^0.26.1",
     "js-tiktoken": "^1.0.7",
+    "lodash": "^4.17.21",
     "openai": "^3.3.0",
     "uuid": "^9.0.0"
   },
-  "devDependencies": {
-    "@types/node": "^18",
-    "@types/uuid": "^9.0.2"
-  },
   "main": "src/index.ts",
   "types": "src/index.ts",
   "scripts": {
     "test": "jest"
+  },
+  "devDependencies": {
+    "@types/lodash": "^4.14.195",
+    "@types/node": "^18",
+    "@types/uuid": "^9.0.2",
+    "node-stdlib-browser": "^1.2.0"
   }
 }
diff --git a/packages/core/src/Document.ts b/packages/core/src/Document.ts
index 3efdf46be9df3bb55c1619b2cfd7d0c8942d11bd..2b2fc3a872a740a8fabec06402e2d26360f081e0 100644
--- a/packages/core/src/Document.ts
+++ b/packages/core/src/Document.ts
@@ -1,4 +1,12 @@
 import { v4 as uuidv4 } from "uuid";
+
+export enum NodeType {
+  DOCUMENT,
+  TEXT,
+  IMAGE,
+  INDEX,
+}
+
 export abstract class BaseDocument {
   text: string;
   docId?: string;
@@ -45,14 +53,20 @@ export abstract class BaseDocument {
   getDocHash() {
     return this.docHash;
   }
+
+  abstract getType(): NodeType;
 }
 
 export class Document extends BaseDocument {
-  static getType() {
-    return "Document";
+  getType() {
+    return NodeType.DOCUMENT;
   }
 }
 
-export class ImageDocuemnt extends Document {
+export class ImageDocument extends Document {
   image?: string;
-}
+
+  getType() {
+    return NodeType.IMAGE;
+  }
+}
\ No newline at end of file
diff --git a/packages/core/src/Node.ts b/packages/core/src/Node.ts
index f29e2fc43ca2d77bc2aa1a93c898ab518f167fa3..8247e104b7d63f8581c6fc92a8920368a8c03587 100644
--- a/packages/core/src/Node.ts
+++ b/packages/core/src/Node.ts
@@ -1,4 +1,4 @@
-import { BaseDocument } from "./Document";
+import { BaseDocument, NodeType } from "./Document";
 
 export enum DocumentRelationship {
   SOURCE = "source",
@@ -8,12 +8,6 @@ export enum DocumentRelationship {
   CHILD = "child",
 }
 
-export enum NodeType {
-  TEXT,
-  IMAGE,
-  INDEX,
-}
-
 export class Node extends BaseDocument {
   relationships: { [key in DocumentRelationship]: string | string[] | null };
 
@@ -61,6 +55,10 @@ export class Node extends BaseDocument {
   childNodeIds(): string[] {
     return [];
   }
+
+  getType() {
+    return NodeType.TEXT;
+  }
 }
 
 export interface NodeWithEmbedding {
@@ -71,4 +69,4 @@ export interface NodeWithEmbedding {
 export interface NodeWithScore {
   node: Node;
   score: number;
-}
+}
\ No newline at end of file
diff --git a/packages/core/src/StorageContext.ts b/packages/core/src/StorageContext.ts
deleted file mode 100644
index 7b07e9650f8044886ef0c1d46d39ab5c01ad676a..0000000000000000000000000000000000000000
--- a/packages/core/src/StorageContext.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-interface StorageContext {
-  docStore?: any;
-  indexStore?: any;
-  vectorStore?: any;
-  graphStore?: any;
-}
diff --git a/packages/core/src/dataStructs.ts b/packages/core/src/dataStructs.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f561fbe4fcc7380afde6cc0db2560b834c5611d8
--- /dev/null
+++ b/packages/core/src/dataStructs.ts
@@ -0,0 +1,25 @@
+export enum IndexStructType {
+  SIMPLE_DICT = "simple_dict"
+}
+
+export interface IndexStruct {
+  readonly indexId: string;
+  readonly summary?: string;
+  readonly type: IndexStructType;
+}
+
+export function indexStructToJson(indexStruct: IndexStruct): {[key: string]: any} {
+  return {
+    indexId: indexStruct.indexId,
+    summary: indexStruct.summary,
+    type: indexStruct.type
+  };
+}
+
+export function jsonToIndexStruct(json: any): IndexStruct {
+  return {
+    indexId: json.indexId,
+    summary: json.summary,
+    type: json.type
+  };
+}
diff --git a/packages/core/src/embeddingUtils.ts b/packages/core/src/embeddingUtils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..90e09e4876b0658bf111e972f1ee2084e6d7a5f9
--- /dev/null
+++ b/packages/core/src/embeddingUtils.ts
@@ -0,0 +1,35 @@
+import _ from 'lodash';
+import { VectorStoreQueryMode } from './storage/vectorStore/types';
+
+export function getTopKEmbeddings(
+  queryEmbedding: number[],
+  embeddings: number[][],
+  similarityFn?: ((queryEmbedding: number[], emb: number[]) => number),
+  similarityTopK?: number,
+  embeddingIds?: number[],
+  similarityCutoff?: number,
+): [number[], number[]] {
+  throw new Error('Not implemented');
+}
+
+export function getTopKEmbeddingsLearner(
+  queryEmbedding: number[],
+  embeddings: number[][],
+  similarityTopK?: number,
+  embeddingIds?: number[],
+  queryMode: VectorStoreQueryMode = VectorStoreQueryMode.SVM,
+): [number[], number[]] {
+  throw new Error('Not implemented');
+}
+
+export function getTopKMMREmbeddings(
+  queryEmbedding: number[],
+  embeddings: number[][],
+  similarityFn?: ((queryEmbedding: number[], emb: number[]) => number),
+  similarityTopK?: number,
+  embeddingIds?: number[],
+  similarityCutoff?: number,
+  mmrThreshold?: number,
+): [number[], number[]] {
+  throw new Error('Not implemented');
+}
diff --git a/packages/core/src/storage/FileSystem.ts b/packages/core/src/storage/FileSystem.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9b24e932954b51627395339d1e29c9b2484e10f0
--- /dev/null
+++ b/packages/core/src/storage/FileSystem.ts
@@ -0,0 +1,63 @@
+import _ from "lodash";
+/**
+ * A filesystem interface that is meant to be compatible with
+ * the 'fs' module from Node.js.
+ * Allows for the use of similar inteface implementation on
+ * browsers.
+ */
+
+export interface GenericFileSystem {
+  writeFile(path: string, content: string, options?: any): Promise<void>;
+  readFile(path: string, options?: any): Promise<string>;
+  exists(path: string): Promise<boolean>;
+  mkdir(path: string, options?: any): Promise<void>;
+}
+
+/**
+ * A filesystem implementation that stores files in memory.
+ */
+export class InMemoryFileSystem implements GenericFileSystem {
+  private files: {[filepath: string]: any} = {};
+
+  async writeFile(path: string, content: string, options?: any): Promise<void> {
+    this.files[path] = _.cloneDeep(content);
+  }
+
+  async readFile(path: string, options?: any): Promise<string> {
+    if (!(path in this.files)) {
+      throw new Error(`File ${path} does not exist`);
+    }
+    return _.cloneDeep(this.files[path]);
+  }
+
+  async exists(path: string): Promise<boolean> {
+    return path in this.files;
+  }
+
+  async mkdir(path: string, options?: any): Promise<void> {
+    this.files[path] = _.get(this.files, path, null);
+  }
+}
+
+export function getNodeFS(): GenericFileSystem {
+  const fs = require('fs/promises');
+  return {
+    exists: async (path: string) => {
+      try {
+        await fs.access(path);
+        return true;
+      } catch {
+        return false;
+      }
+    },
+    ...fs
+  }
+}
+
+let fs = null;
+try {
+  fs = getNodeFS();
+} catch (e) {
+  fs = new InMemoryFileSystem();
+}
+export const DEFAULT_FS = fs as GenericFileSystem;
diff --git a/packages/core/src/storage/StorageContext.ts b/packages/core/src/storage/StorageContext.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c39893e65ede0c37dea5cdba560f2205b13ea38e
--- /dev/null
+++ b/packages/core/src/storage/StorageContext.ts
@@ -0,0 +1,40 @@
+import { BaseDocumentStore } from "./docStore/types";
+import { BaseIndexStore } from "./indexStore/types";
+import { VectorStore } from "./vectorStore/types";
+import { SimpleDocumentStore } from "./docStore/SimpleDocumentStore";
+import { SimpleIndexStore } from "./indexStore/SimpleIndexStore";
+import { SimpleVectorStore } from "./vectorStore/SimpleVectorStore";
+import { GenericFileSystem } from "./FileSystem";
+import { DEFAULT_PERSIST_DIR, DEFAULT_FS, DEFAULT_NAMESPACE } from "./constants";
+
+export interface StorageContext {
+  docStore?: BaseDocumentStore;
+  indexStore?: BaseIndexStore;
+  vectorStore?: VectorStore;
+}
+
+type BuilderParams = {
+  docStore?: BaseDocumentStore,
+  indexStore?: BaseIndexStore,
+  vectorStore?: VectorStore,
+  persistDir?: string,
+  fs?: GenericFileSystem,
+};
+
+export async function storageContextFromDefaults({
+  docStore, indexStore, vectorStore, persistDir, fs
+}: BuilderParams): StorageContext {
+  persistDir = persistDir || DEFAULT_PERSIST_DIR;
+
+  fs = fs || DEFAULT_FS;
+
+  docStore = docStore || await SimpleDocumentStore.fromPersistDir(persistDir, DEFAULT_NAMESPACE, fs);
+  indexStore = indexStore || await SimpleIndexStore.fromPersistDir(persistDir, fs);
+  vectorStore = vectorStore || await SimpleVectorStore.fromPersistDir(persistDir, fs);
+
+  return {
+    docStore,
+    indexStore,
+    vectorStore,
+  };
+}
diff --git a/packages/core/src/storage/constants.ts b/packages/core/src/storage/constants.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a0ded7c10f1218b27e5f9ebb88e069c35a83dc8c
--- /dev/null
+++ b/packages/core/src/storage/constants.ts
@@ -0,0 +1,8 @@
+export const DEFAULT_COLLECTION = "data";
+export const DEFAULT_PERSIST_DIR = "./storage";
+export const DEFAULT_INDEX_STORE_PERSIST_FILENAME = "index_store.json";
+export const DEFAULT_DOC_STORE_PERSIST_FILENAME = "docstore.json";
+export const DEFAULT_VECTOR_STORE_PERSIST_FILENAME = "vector_store.json";
+export const DEFAULT_GRAPH_STORE_PERSIST_FILENAME = "graph_store.json";
+export const DEFAULT_NAMESPACE = "docstore";
+export { DEFAULT_FS } from "./FileSystem";
diff --git a/packages/core/src/storage/docStore/KVDocumentStore.ts b/packages/core/src/storage/docStore/KVDocumentStore.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7f72bc2663b93c72a0087bab15d61ee3a9a253cd
--- /dev/null
+++ b/packages/core/src/storage/docStore/KVDocumentStore.ts
@@ -0,0 +1,158 @@
+import { Node } from "../../Node";
+import { BaseDocument } from '../../Document';
+import { BaseDocumentStore, RefDocInfo } from './types';
+import { BaseKVStore } from '../kvStore/types';
+import _, * as lodash from 'lodash';
+import { docToJson, jsonToDoc } from './utils';
+import { DEFAULT_NAMESPACE } from '../constants';
+
+type DocMetaData = { docHash: string, refDocId?: string };
+
+export class KVDocumentStore extends BaseDocumentStore {
+    private kvstore: BaseKVStore;
+    private nodeCollection: string;
+    private refDocCollection: string;
+    private metadataCollection: string;
+
+    constructor(kvstore: BaseKVStore, namespace: string = DEFAULT_NAMESPACE) {
+        super();
+        this.kvstore = kvstore;
+        this.nodeCollection = `${namespace}/data`;
+        this.refDocCollection = `${namespace}/ref_doc_info`;
+        this.metadataCollection = `${namespace}/metadata`;
+    }
+
+    async docs(): Promise<Record<string, BaseDocument>> {
+        let jsonDict = await this.kvstore.getAll(this.nodeCollection);
+        let docs: Record<string, BaseDocument> = {};
+        for (let key in jsonDict) {
+            docs[key] = jsonToDoc(jsonDict[key] as Record<string, any>);
+        }
+        return docs;
+    }
+
+    async addDocuments(docs: BaseDocument[], allowUpdate: boolean = true): Promise<void> {
+        for (var idx = 0; idx < docs.length; idx++) {
+          const doc = docs[idx];
+          if (doc.getDocId() === null) {
+              throw new Error("doc_id not set");
+          }
+          if (!allowUpdate && await this.documentExists(doc.getDocId())) {
+              throw new Error(`doc_id ${doc.getDocId()} already exists. Set allow_update to True to overwrite.`);
+          }
+          let nodeKey = doc.getDocId();
+          let data = docToJson(doc);
+          await this.kvstore.put(nodeKey, data, this.nodeCollection);
+          let metadata: DocMetaData = { docHash: doc.getDocHash() };
+
+          if (doc instanceof Node && doc.refDocId() !== null) {
+              const nodeDoc = doc as Node;
+              let refDocInfo = await this.getRefDocInfo(nodeDoc.refDocId()!) || {docIds: [], extraInfo: {}};
+              refDocInfo.docIds.push(nodeDoc.getDocId());
+              if (_.isEmpty(refDocInfo.extraInfo)) {
+                  refDocInfo.extraInfo = nodeDoc.getNodeInfo() || {};
+              }
+              await this.kvstore.put(nodeDoc.refDocId()!, refDocInfo, this.refDocCollection);
+              metadata.refDocId = nodeDoc.refDocId()!;
+          }
+
+          this.kvstore.put(nodeKey, metadata, this.metadataCollection);
+        }
+    }
+
+    async getDocument(docId: string, raiseError: boolean = true): Promise<BaseDocument | undefined> {
+        let json = await this.kvstore.get(docId, this.nodeCollection);
+        if (_.isNil(json)) {
+            if (raiseError) {
+                throw new Error(`doc_id ${docId} not found.`);
+            } else {
+                return;
+            }
+        }
+        return jsonToDoc(json);
+    }
+
+    async getRefDocInfo(refDocId: string): Promise<RefDocInfo | undefined> {
+        let refDocInfo = await this.kvstore.get(refDocId, this.refDocCollection);
+        return refDocInfo ? _.clone(refDocInfo) as RefDocInfo : undefined;
+    }
+
+    async getAllRefDocInfo(): Promise<Record<string, RefDocInfo> | undefined> {
+        let refDocInfos = await this.kvstore.getAll(this.refDocCollection);
+        if (_.isNil(refDocInfos)) {
+            return;
+        }
+        return refDocInfos as Record<string, RefDocInfo>;
+    }
+
+    async refDocExists(refDocId: string): Promise<boolean> {
+        return !_.isNil(await this.getRefDocInfo(refDocId));
+    }
+
+    async documentExists(docId: string): Promise<boolean> {
+        return !_.isNil(await this.kvstore.get(docId, this.nodeCollection));
+    }
+
+    private async removeRefDocNode(docId: string): Promise<void> {
+        let metadata = await this.kvstore.get(docId, this.metadataCollection);
+        if (metadata === null) {
+            return;
+        }
+
+        let refDocId = metadata.refDocId;
+        if (_.isNil(refDocId)) {
+            return;
+        }
+
+        const refDocInfo = await this.kvstore.get(refDocId, this.refDocCollection);
+        if (!_.isNil(refDocInfo)) {
+            lodash.pull(refDocInfo.docIds, docId);
+
+            if (refDocInfo.docIds.length > 0) {
+                this.kvstore.put(refDocId, refDocInfo.toDict(), this.refDocCollection);
+            }
+            this.kvstore.delete(refDocId, this.metadataCollection);
+        }
+    }
+
+    async deleteDocument(docId: string, raiseError: boolean = true, removeRefDocNode: boolean = true): Promise<void> {
+        if (removeRefDocNode) {
+            await this.removeRefDocNode(docId);
+        }
+
+        let deleteSuccess = await this.kvstore.delete(docId, this.nodeCollection);
+        await this.kvstore.delete(docId, this.metadataCollection);
+
+        if (!deleteSuccess && raiseError) {
+            throw new Error(`doc_id ${docId} not found.`);
+        }
+    }
+
+    async deleteRefDoc(refDocId: string, raiseError: boolean = true): Promise<void> {
+        let refDocInfo = await this.getRefDocInfo(refDocId);
+        if (_.isNil(refDocInfo)) {
+            if (raiseError) {
+                throw new Error(`ref_doc_id ${refDocId} not found.`);
+            } else {
+                return;
+            }
+        }
+
+        for (let docId of refDocInfo.docIds) {
+          await this.deleteDocument(docId, false, false);
+        }
+
+        await this.kvstore.delete(refDocId, this.metadataCollection);
+        await this.kvstore.delete(refDocId, this.refDocCollection);
+    }
+
+    async setDocumentHash(docId: string, docHash: string): Promise<void> {
+      let metadata = { docHash: docHash };
+      await this.kvstore.put(docId, metadata, this.metadataCollection);
+    }
+
+    async getDocumentHash(docId: string): Promise<string | undefined> {
+      let metadata = await this.kvstore.get(docId, this.metadataCollection);
+      return _.get(metadata, 'docHash');
+    }
+}
diff --git a/packages/core/src/storage/docStore/SimpleDocumentStore.ts b/packages/core/src/storage/docStore/SimpleDocumentStore.ts
new file mode 100644
index 0000000000000000000000000000000000000000..968d6247f41fa8d746385a7f62136ef7bf1dab01
--- /dev/null
+++ b/packages/core/src/storage/docStore/SimpleDocumentStore.ts
@@ -0,0 +1,70 @@
+import * as path from 'path';
+import _ from 'lodash';
+import { KVDocumentStore } from './KVDocumentStore';
+import { SimpleKVStore } from '../kvStore/SimpleKVStore';
+import { BaseInMemoryKVStore } from '../kvStore/types';
+import { GenericFileSystem } from '../FileSystem';
+import { 
+  DEFAULT_PERSIST_DIR,
+  DEFAULT_NAMESPACE,
+  DEFAULT_DOC_STORE_PERSIST_FILENAME,
+  DEFAULT_FS
+} from '../constants';
+
+type SaveDict = {[key: string]: any};
+
+export class SimpleDocumentStore extends KVDocumentStore {
+  private kvStore: SimpleKVStore;
+
+  constructor(kvStore?: SimpleKVStore , namespace?: string) {
+    kvStore = kvStore || new SimpleKVStore();
+    namespace = namespace || DEFAULT_NAMESPACE;
+    super(kvStore, namespace);
+    this.kvStore = kvStore;
+  }
+
+  static async fromPersistDir(
+    persistDir: string = DEFAULT_PERSIST_DIR, 
+    namespace?: string, 
+    fsModule?: GenericFileSystem
+  ): Promise<SimpleDocumentStore> {
+    const persistPath = path.join(persistDir, DEFAULT_DOC_STORE_PERSIST_FILENAME);
+    return await SimpleDocumentStore.fromPersistPath(persistPath, namespace, fsModule);
+  }
+
+  static async fromPersistPath(
+    persistPath: string, 
+    namespace?: string, 
+    fs?: GenericFileSystem
+  ): Promise<SimpleDocumentStore> {
+    fs = fs || DEFAULT_FS;
+    const simpleKVStore = await SimpleKVStore.fromPersistPath(persistPath, fs);
+    return new SimpleDocumentStore(simpleKVStore, namespace);
+  }
+
+  async persist(
+    persistPath: string = path.join(DEFAULT_PERSIST_DIR, DEFAULT_DOC_STORE_PERSIST_FILENAME),
+    fs?: GenericFileSystem
+  ): Promise<void> {
+    fs = fs || DEFAULT_FS;
+    if (_.isObject(this.kvStore) && this.kvStore instanceof BaseInMemoryKVStore) {
+      await this.kvStore.persist(persistPath, fs);
+    }
+  }
+
+  static fromDict(
+    saveDict: SaveDict, 
+    namespace?: string
+  ): SimpleDocumentStore {
+    const simpleKVStore = SimpleKVStore.fromDict(saveDict);
+    return new SimpleDocumentStore(simpleKVStore, namespace);
+  }
+
+  toDict(): SaveDict {
+    if (_.isObject(this.kvStore) && this.kvStore instanceof SimpleKVStore) {
+      return this.kvStore.toDict();
+    }
+    // If the kvstore is not a SimpleKVStore, you might want to throw an error or return a default value.
+    throw new Error("KVStore is not a SimpleKVStore");
+  }
+}
diff --git a/packages/core/src/storage/docStore/types.ts b/packages/core/src/storage/docStore/types.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9084e2d04ab63f0b7d39ce868ec3e1b78604a1ae
--- /dev/null
+++ b/packages/core/src/storage/docStore/types.ts
@@ -0,0 +1,63 @@
+import { Node } from "../../Node";
+import { BaseDocument } from "../../Document";
+import { GenericFileSystem } from "../FileSystem";
+import { DEFAULT_PERSIST_DIR, DEFAULT_DOC_STORE_PERSIST_FILENAME } from "../constants";
+
+const defaultPersistPath = `${DEFAULT_PERSIST_DIR}/${DEFAULT_DOC_STORE_PERSIST_FILENAME}`;
+
+
+export interface RefDocInfo {
+    docIds: string[];
+    extraInfo: {[key: string]: any};
+}
+
+export abstract class BaseDocumentStore {
+    // Save/load
+    persist(persistPath: string = defaultPersistPath, fs?: GenericFileSystem): void {
+        // Persist the docstore to a file.
+    }
+
+    // Main interface
+    abstract docs(): Promise<Record<string, BaseDocument>>;
+
+    abstract addDocuments(docs: BaseDocument[], allowUpdate: boolean): void;
+
+    abstract getDocument(docId: string, raiseError: boolean): Promise<BaseDocument | undefined>;
+
+    abstract deleteDocument(docId: string, raiseError: boolean): void;
+
+    abstract documentExists(docId: string): Promise<boolean>;
+
+    // Hash
+    abstract setDocumentHash(docId: string, docHash: string): void;
+
+    abstract getDocumentHash(docId: string): Promise<string | undefined>;
+
+    // Ref Docs
+    abstract getAllRefDocInfo(): Promise<{[key: string]: RefDocInfo} | undefined>;
+
+    abstract getRefDocInfo(refDocId: string): Promise<RefDocInfo | undefined>;
+
+    abstract deleteRefDoc(refDocId: string, raiseError: boolean): Promise<void>;
+
+    // Nodes
+    getNodes(nodeIds: string[], raiseError: boolean = true): Promise<Node[]> {
+        return Promise.all(nodeIds.map(nodeId => this.getNode(nodeId, raiseError)));
+    }
+
+    async getNode(nodeId: string, raiseError: boolean = true): Promise<Node> {
+        let doc = await this.getDocument(nodeId, raiseError);
+        if (!(doc instanceof Node)) {
+            throw new Error(`Document ${nodeId} is not a Node.`);
+        }
+        return doc;
+    }
+
+    async getNodeDict(nodeIdDict: {[index: number]: string}): Promise<{[index: number]: Node}> {
+        let result: {[index: number]: Node} = {};
+        for (let index in nodeIdDict) {
+            result[index] = await this.getNode(nodeIdDict[index]);
+        }
+        return result;
+    }
+}
diff --git a/packages/core/src/storage/docStore/utils.ts b/packages/core/src/storage/docStore/utils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..059174429a12cb462fd898a5bce86cd5632bdaf9
--- /dev/null
+++ b/packages/core/src/storage/docStore/utils.ts
@@ -0,0 +1,31 @@
+import { Node } from "../../Node";
+import { BaseDocument, Document, NodeType } from '../../Document';
+
+const TYPE_KEY = "__type__";
+const DATA_KEY = "__data__";
+
+
+export function docToJson(doc: BaseDocument): Record<string, any> {
+  return {
+      [DATA_KEY]: JSON.stringify(doc),
+      [TYPE_KEY]: doc.getType(),
+  };
+}
+
+export function jsonToDoc(docDict: Record<string, any>): BaseDocument {
+  let docType = docDict[TYPE_KEY];
+  let dataDict = docDict[DATA_KEY];
+  let doc: BaseDocument;
+
+  if (docType === NodeType.DOCUMENT) {
+    doc = new Document(dataDict.text, dataDict.docId, dataDict.embedding, dataDict.docHash);
+  } else if (docType === NodeType.TEXT) {
+    const reslationships = dataDict.relationships;
+    doc = new Node(reslationships.text, reslationships.docId,
+      reslationships.embedding, reslationships.docHash);
+  } else {
+      throw new Error(`Unknown doc type: ${docType}`);
+  }
+
+  return doc;
+}
diff --git a/packages/core/src/storage/indexStore/KVIndexStore.ts b/packages/core/src/storage/indexStore/KVIndexStore.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7e2f5eed044d6143d3a5942b6b6a30258d62dd16
--- /dev/null
+++ b/packages/core/src/storage/indexStore/KVIndexStore.ts
@@ -0,0 +1,47 @@
+import { BaseKVStore } from '../kvStore/types';
+import { IndexStruct, indexStructToJson, jsonToIndexStruct } from '../../dataStructs';
+import _ from 'lodash';
+import { DEFAULT_NAMESPACE } from '../constants';
+import { BaseIndexStore } from './types';
+
+export class KVIndexStore extends BaseIndexStore {
+  private _kvStore: BaseKVStore;
+  private _collection: string;
+
+  constructor(kvStore: BaseKVStore, namespace: string = DEFAULT_NAMESPACE) {
+    super();
+    this._kvStore = kvStore;
+    this._collection = `${namespace}/data`;
+  }
+
+  async addIndexStruct(indexStruct: IndexStruct): Promise<void> {
+    let key = indexStruct.indexId;
+    let data = indexStructToJson(indexStruct);
+    await this._kvStore.put(key, data, this._collection);
+  }
+
+  async deleteIndexStruct(key: string): Promise<void> {
+    await this._kvStore.delete(key, this._collection);
+  }
+
+  async getIndexStruct(structId?: string): Promise<IndexStruct | undefined> {
+    if (_.isNil(structId)) {
+      let structs = await this.getIndexStructs();
+      if (structs.length !== 1) {
+        throw new Error('More than one index struct found');
+      }
+      return structs[0];
+    } else {
+      let json = await this._kvStore.get(structId, this._collection);
+      if (_.isNil(json)) {
+        return;
+      }
+      return jsonToIndexStruct(json);
+    }
+  }
+
+  async getIndexStructs(): Promise<IndexStruct[]> {
+    let jsons = await this._kvStore.getAll(this._collection) as {[key: string]: any};
+    return _.values(jsons).map(json => jsonToIndexStruct(json));
+  }
+}
diff --git a/packages/core/src/storage/indexStore/SimpleIndexStore.ts b/packages/core/src/storage/indexStore/SimpleIndexStore.ts
new file mode 100644
index 0000000000000000000000000000000000000000..82a006913d4f28adefd332827304682f067121c8
--- /dev/null
+++ b/packages/core/src/storage/indexStore/SimpleIndexStore.ts
@@ -0,0 +1,43 @@
+import * as path from 'path';
+import * as _ from 'lodash';
+import { BaseInMemoryKVStore } from "../kvStore/types";
+import { SimpleKVStore, DataType } from "../kvStore/SimpleKVStore";
+import { KVIndexStore } from "./KVIndexStore";
+import { DEFAULT_PERSIST_DIR, DEFAULT_INDEX_STORE_PERSIST_FILENAME, DEFAULT_FS } from '../constants';
+import { GenericFileSystem } from '../FileSystem';
+
+export class SimpleIndexStore extends KVIndexStore {
+  private kvStore: BaseInMemoryKVStore;
+
+  constructor(kvStore?: BaseInMemoryKVStore) {
+    kvStore = kvStore || new SimpleKVStore();
+    super(kvStore);
+    this.kvStore = kvStore;
+  }
+
+  static async fromPersistDir(persistDir: string = DEFAULT_PERSIST_DIR, fs: GenericFileSystem = DEFAULT_FS): Promise<SimpleIndexStore> {;
+    const persistPath = path.join(persistDir, DEFAULT_INDEX_STORE_PERSIST_FILENAME);
+    return this.fromPersistPath(persistPath, fs);
+  }
+
+  static async fromPersistPath(persistPath: string, fs: GenericFileSystem = DEFAULT_FS): Promise<SimpleIndexStore> {
+    let simpleKVStore = await SimpleKVStore.fromPersistPath(persistPath, fs);
+    return new SimpleIndexStore(simpleKVStore);
+  }
+
+  async persist(persistPath: string = DEFAULT_PERSIST_DIR, fs: GenericFileSystem = DEFAULT_FS): Promise<void> {
+    await this.kvStore.persist(persistPath, fs);
+  }
+
+  static fromDict(saveDict: DataType): SimpleIndexStore {
+    let simpleKVStore = SimpleKVStore.fromDict(saveDict);
+    return new SimpleIndexStore(simpleKVStore);
+  }
+
+  toDict(): Record<string, unknown> {
+    if (!(this.kvStore instanceof SimpleKVStore)) {
+        throw new Error("KVStore is not a SimpleKVStore");
+    }
+    return this.kvStore.toDict();
+  }
+}
diff --git a/packages/core/src/storage/indexStore/types.ts b/packages/core/src/storage/indexStore/types.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b2809863ba5470ab13591bc69d4eaa2a9030e503
--- /dev/null
+++ b/packages/core/src/storage/indexStore/types.ts
@@ -0,0 +1,19 @@
+import { IndexStruct } from "llama_index/data_structs/data_structs";
+import { GenericFileSystem } from "../FileSystem";
+import { DEFAULT_PERSIST_DIR, DEFAULT_INDEX_STORE_PERSIST_FILENAME } from "../constants";
+
+const defaultPersistPath = `${DEFAULT_PERSIST_DIR}/${DEFAULT_INDEX_STORE_PERSIST_FILENAME}`;
+
+export abstract class BaseIndexStore {
+    abstract getIndexStructs(): Promise<IndexStruct[]>;
+
+    abstract addIndexStruct(indexStruct: IndexStruct): Promise<void>;
+
+    abstract deleteIndexStruct(key: string): Promise<void>;
+
+    abstract getIndexStruct(structId?: string): Promise<IndexStruct | undefined>;
+
+    async persist(persistPath: string = defaultPersistPath, fs?: GenericFileSystem): Promise<void> {
+        // Persist the index store to disk.
+    }
+}
diff --git a/packages/core/src/storage/kvStore/SimpleKVStore.ts b/packages/core/src/storage/kvStore/SimpleKVStore.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3cc2f4df4e3d266c1b0fb7bd7bc76026d131d904
--- /dev/null
+++ b/packages/core/src/storage/kvStore/SimpleKVStore.ts
@@ -0,0 +1,73 @@
+import * as path from 'path';
+import { GenericFileSystem } from '../FileSystem';
+import { DEFAULT_COLLECTION, DEFAULT_FS } from '../constants';
+import * as _ from "lodash";
+import { BaseKVStore } from "./types";
+
+export interface DataType {
+  [key: string]: { [key: string]: any };
+}
+
+
+export class SimpleKVStore extends BaseKVStore {
+  private data: DataType;
+
+  constructor(data?: DataType) {
+    super();
+    this.data = data || {};
+  }
+
+  async put(key: string, val: any, collection: string = DEFAULT_COLLECTION): Promise<void> {
+    if (!(collection in this.data)) {
+      this.data[collection] = {};
+    }
+    this.data[collection][key] = _.clone(val); // Creating a shallow copy of the object
+  }
+
+  async get(key: string, collection: string = DEFAULT_COLLECTION): Promise<any> {
+    let collectionData = this.data[collection];
+    if (_.isNil(collectionData)) {
+      return null;
+    }
+    if (!(key in collectionData)) {
+      return null;
+    }
+    return _.clone(collectionData[key]); // Creating a shallow copy of the object
+  }
+
+  async getAll(collection: string = DEFAULT_COLLECTION): Promise<DataType> {
+    return _.clone(this.data[collection]); // Creating a shallow copy of the object
+  }
+
+  async delete(key: string, collection: string = DEFAULT_COLLECTION): Promise<boolean> {
+    if (key in this.data[collection]) {
+      delete this.data[collection][key];
+      return true;
+    }
+    return false;
+  }
+
+  async persist(persistPath: string, fs?: GenericFileSystem): Promise<void> {
+    fs = fs || DEFAULT_FS;
+    // TODO: decide on a way to polyfill path
+    let dirPath = path.dirname(persistPath);
+    if (!(await fs.exists(dirPath))) {
+      await fs.mkdir(dirPath);
+    }
+    await fs.writeFile(persistPath, JSON.stringify(this.data));
+  }
+
+  static async fromPersistPath(persistPath: string, fs?: GenericFileSystem ): Promise<SimpleKVStore> {
+    fs = fs || DEFAULT_FS;
+    let data = JSON.parse(await fs.readFile(persistPath, { encoding: 'utf-8' }));
+    return new SimpleKVStore(data);
+  }
+
+  toDict(): DataType {
+    return this.data;
+  }
+
+  static fromDict(saveDict: DataType): SimpleKVStore {
+    return new SimpleKVStore(saveDict);
+  }
+}
diff --git a/packages/core/src/storage/kvStore/types.ts b/packages/core/src/storage/kvStore/types.ts
new file mode 100644
index 0000000000000000000000000000000000000000..333c22e6eaad5c758c5e9ec41432a990bafba9a3
--- /dev/null
+++ b/packages/core/src/storage/kvStore/types.ts
@@ -0,0 +1,18 @@
+import { GenericFileSystem } from "../FileSystem";
+const defaultCollection = "data";
+
+type StoredValue = {[key: string]: any} | null;
+
+export abstract class BaseKVStore {
+    abstract put(key: string, val: {[key: string]: any}, collection?: string): Promise<void>;
+    abstract get(key: string, collection?: string): Promise<StoredValue>;
+    abstract getAll(collection?: string): Promise<{[key: string]: StoredValue}>;
+    abstract delete(key: string, collection?: string): Promise<boolean>;
+}
+
+export abstract class BaseInMemoryKVStore extends BaseKVStore {
+    abstract persist(persistPath: string, fs?: GenericFileSystem): void;
+    static fromPersistPath(persistPath: string): BaseInMemoryKVStore {
+        throw new Error("Method not implemented.");
+    }
+}
diff --git a/packages/core/src/storage/vectorStore/SimpleVectorStore.ts b/packages/core/src/storage/vectorStore/SimpleVectorStore.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c2ef189eb758e6abfa5f6a47f078f93fc5d16797
--- /dev/null
+++ b/packages/core/src/storage/vectorStore/SimpleVectorStore.ts
@@ -0,0 +1,134 @@
+import _ from "lodash";
+import { GenericFileSystem } from "../FileSystem";
+import { NodeWithEmbedding, VectorStore, VectorStoreQuery, VectorStoreQueryMode, VectorStoreQueryResult } from "./types";
+import { getTopKEmbeddings, getTopKEmbeddingsLearner, getTopKMMREmbeddings } from '../../Embedding';
+import { DEFAULT_PERSIST_DIR, DEFAULT_FS } from '../constants';
+
+const LEARNER_MODES = new Set<VectorStoreQueryMode>([
+  VectorStoreQueryMode.SVM,
+  VectorStoreQueryMode.LINEAR_REGRESSION,
+  VectorStoreQueryMode.LOGISTIC_REGRESSION
+]);
+
+const MMR_MODE = VectorStoreQueryMode.MMR;
+
+class SimpleVectorStoreData {
+  embeddingDict: {[key: string]: number[]} = {};
+  textIdToRefDocId: {[key: string]: string} = {};
+}
+
+export class SimpleVectorStore implements VectorStore {
+  storesText: boolean = false;
+  private data: SimpleVectorStoreData = new SimpleVectorStoreData();
+  private fs: GenericFileSystem = DEFAULT_FS;
+
+  constructor(data?: SimpleVectorStoreData, fs?: GenericFileSystem) {
+    this.data = data || new SimpleVectorStoreData();
+    this.fs = fs || DEFAULT_FS;
+  }
+
+  static async fromPersistDir(persistDir: string = DEFAULT_PERSIST_DIR, fs: GenericFileSystem = DEFAULT_FS): Promise<SimpleVectorStore> {
+    let persistPath = `${persistDir}/vector_store.json`;
+    return await SimpleVectorStore.fromPersistPath(persistPath, fs);
+  }
+
+  get client(): any {
+    return null;
+  }
+
+  get(textId: string): number[] {
+    return this.data.embeddingDict[textId];
+  }
+
+  add(embeddingResults: NodeWithEmbedding[]): string[] {
+    for (let result of embeddingResults) {
+      this.data.embeddingDict[result.id()] = result.embedding;
+      this.data.textIdToRefDocId[result.id()] = result.refDocId();
+    }
+    return embeddingResults.map(result => result.id());
+  }
+
+  delete(refDocId: string): void {
+    let textIdsToDelete = Object.keys(this.data.textIdToRefDocId).filter(textId => this.data.textIdToRefDocId[textId] === refDocId);
+    for (let textId of textIdsToDelete) {
+      delete this.data.embeddingDict[textId];
+      delete this.data.textIdToRefDocId[textId];
+    }
+  }
+
+  query(query: VectorStoreQuery): VectorStoreQueryResult {
+    if (!_.isNil(query.filters)) {
+      throw new Error("Metadata filters not implemented for SimpleVectorStore yet.");
+    }
+
+    let items = Object.entries(this.data.embeddingDict);
+
+    let nodeIds: string[], embeddings: number[][];
+    if (query.docIds) {
+      let availableIds = new Set(query.docIds);
+      const queriedItems = items.filter(item => availableIds.has(item[0]));
+      nodeIds = queriedItems.map(item => item[0]);
+      embeddings = queriedItems.map(item => item[1]);
+    } else {
+      // No docIds specified, so use all available items
+      nodeIds = items.map(item => item[0]);
+      embeddings = items.map(item => item[1]);
+    }
+
+    let queryEmbedding = query.queryEmbedding!;
+
+    let topSimilarities: number[], topIds: string[];
+    if (LEARNER_MODES.has(query.mode)) {
+      [topSimilarities, topIds] = getTopKEmbeddingsLearner(queryEmbedding, embeddings, query.similarityTopK, nodeIds);
+    } else if (query.mode === MMR_MODE) {
+      let mmrThreshold = query.mmrThreshold;
+      [topSimilarities, topIds] = getTopKMMREmbeddings(queryEmbedding, embeddings, query.similarityTopK, nodeIds, mmrThreshold);
+    } else if (query.mode === VectorStoreQueryMode.DEFAULT) {
+      [topSimilarities, topIds] = getTopKEmbeddings(queryEmbedding, embeddings, query.similarityTopK, nodeIds);
+    } else {
+      throw new Error(`Invalid query mode: ${query.mode}`);
+    }
+
+    return {
+      similarities: topSimilarities,
+      ids: topIds
+    }
+  }
+
+  async persist(persistPath: string = `${DEFAULT_PERSIST_DIR}/vector_store.json`, fs?: GenericFileSystem): Promise<void> {
+    fs = fs || this.fs;
+    if (!(await fs.exists(persistPath))) {
+      await fs.mkdir(persistPath);
+    }
+
+    await fs.writeFile(persistPath, JSON.stringify(this.data));
+  }
+
+  static async fromPersistPath(persistPath: string, fs?: GenericFileSystem): Promise<SimpleVectorStore> {
+    fs = fs || DEFAULT_FS;
+    if (!(await fs.exists(persistPath))) {
+      throw new Error(`No existing SimpleVectorStore found at ${persistPath}, skipping load.`);
+    }
+
+    console.debug(`Loading SimpleVectorStore from ${persistPath}.`);
+    let dataDict = JSON.parse(await fs.readFile(persistPath, 'utf-8'));
+    let data = new SimpleVectorStoreData();
+    data.embeddingDict = dataDict.embeddingDict;
+    data.textIdToRefDocId = dataDict.textIdToRefDocId;
+    return new SimpleVectorStore(data);
+  }
+
+  static fromDict(saveDict: SimpleVectorStoreData): SimpleVectorStore {
+    let data = new SimpleVectorStoreData();
+    data.embeddingDict = saveDict.embeddingDict;
+    data.textIdToRefDocId = saveDict.textIdToRefDocId;
+    return new SimpleVectorStore(data);
+  }
+
+  toDict(): SimpleVectorStoreData {
+    return {
+      embeddingDict: this.data.embeddingDict,
+      textIdToRefDocId: this.data.textIdToRefDocId
+    };
+  }
+}
diff --git a/packages/core/src/storage/vectorStore/types.ts b/packages/core/src/storage/vectorStore/types.ts
new file mode 100644
index 0000000000000000000000000000000000000000..033301802d6fe05ffab12a5f93a2f45f3c4f9d19
--- /dev/null
+++ b/packages/core/src/storage/vectorStore/types.ts
@@ -0,0 +1,75 @@
+import { Node } from "../../Node";
+import { GenericFileSystem } from "../FileSystem";
+
+export interface NodeWithEmbedding {
+    node: Node;
+    embedding: number[];
+
+    id(): string;
+    refDocId(): string;
+}
+
+export interface VectorStoreQueryResult {
+    nodes?: Node[];
+    similarities?: number[];
+    ids?: string[];
+}
+
+export enum VectorStoreQueryMode {
+    DEFAULT = "default",
+    SPARSE = "sparse",
+    HYBRID = "hybrid",
+    // fit learners
+    SVM = "svm",
+    LOGISTIC_REGRESSION = "logistic_regression",
+    LINEAR_REGRESSION = "linear_regression",
+    // maximum marginal relevance
+    MMR = "mmr"
+}
+
+export interface ExactMatchFilter {
+    key: string;
+    value: string | number;
+}
+
+export interface MetadataFilters {
+    filters: ExactMatchFilter[];
+}
+
+export interface VectorStoreQuerySpec {
+    query: string;
+    filters: ExactMatchFilter[];
+    topK?: number;
+}
+
+export interface MetadataInfo {
+    name: string;
+    type: string;
+    description: string;
+}
+
+export interface VectorStoreInfo {
+    metadataInfo: MetadataInfo[];
+    contentInfo: string;
+}
+
+export interface VectorStoreQuery {
+    queryEmbedding?: number[];
+    similarityTopK: number;
+    docIds?: string[];
+    queryStr?: string;
+    mode: VectorStoreQueryMode;
+    alpha?: number;
+    filters?: MetadataFilters;
+    mmrThreshold?: number;
+}
+
+export interface VectorStore {
+    storesText: boolean;
+    isEmbeddingQuery?: boolean;
+    client(): any;
+    add(embeddingResults: NodeWithEmbedding[]): string[];
+    delete(refDocId: string, deleteKwargs?: any): void;
+    query(query: VectorStoreQuery, kwargs?: any): VectorStoreQueryResult;
+    persist(persistPath: string, fs?: GenericFileSystem): void;
+}
diff --git a/packages/core/src/tests/InMemoryFileSystem.test.ts b/packages/core/src/tests/InMemoryFileSystem.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ac09d816448810567dc880a3e8997f88dae7a442
--- /dev/null
+++ b/packages/core/src/tests/InMemoryFileSystem.test.ts
@@ -0,0 +1,90 @@
+import { GenericFileSystem, getNodeFS, InMemoryFileSystem } from "../storage/FileSystem";
+import os from 'os';
+import path from 'path';
+
+type FileSystemUnderTest = {
+  name: string,
+  prepare: () => Promise<any>,
+  cleanup: () => Promise<any>,
+  implementation: GenericFileSystem,
+  tempDir: string
+};
+
+const nodeFS = getNodeFS() as GenericFileSystem & any;
+
+describe.each<FileSystemUnderTest>([
+  {
+    name: 'InMemoryFileSystem',
+    prepare: async () => {},
+    cleanup: async function() {
+      this.implementation = new InMemoryFileSystem();
+    },
+    implementation: new InMemoryFileSystem(),
+    tempDir: './'
+  },
+  {
+    name: 'Node.js fs',
+    prepare: async function() {
+      this.tempDir = await nodeFS.mkdtemp(path.join(os.tmpdir(), 'jest-'));
+    },
+    cleanup: async function() {
+      await nodeFS.rm(this.tempDir, { recursive: true });
+    },
+    implementation: nodeFS,
+    tempDir: './'
+  }
+])("Test %s", (testParams) => {
+  let testFS: GenericFileSystem;
+  let tempDir: string;
+
+  beforeEach(async () => {
+    await testParams.prepare();
+    testFS = testParams.implementation;
+    tempDir = testParams.tempDir;
+  });
+
+  afterEach(async () => {
+    await testParams.cleanup();
+  });
+
+  test("initializes", () => {
+    expect(testFS).toBeTruthy();
+  });
+
+  describe("writeFile", () => {
+    it("writes file to memory", async () => {
+      await testFS.writeFile(`${tempDir}/test.txt`, "Hello, world!");
+      expect(await testFS.readFile(`${tempDir}/test.txt`, "utf-8")).toBe("Hello, world!");
+    });
+
+    it("overwrites existing file", async () => {
+      await testFS.writeFile(`${tempDir}/test.txt`, "Hello, world!");
+      await testFS.writeFile(`${tempDir}/test.txt`, "Hello, again!");
+      expect(await testFS.readFile(`${tempDir}/test.txt`, "utf-8")).toBe("Hello, again!");
+    });
+  });
+
+  describe("readFile", () => {
+    it("throws error for non-existing file", async () => {
+      await expect(testFS.readFile(`${tempDir}/not_exist.txt`, "utf-8")).rejects.toThrow();
+    });
+  });
+
+  describe("exists", () => {
+    it("returns true for existing file", async () => {
+      await testFS.writeFile(`${tempDir}/test.txt`, "Hello, world!");
+      expect(await testFS.exists(`${tempDir}/test.txt`)).toBe(true);
+    });
+
+    it("returns false for non-existing file", async () => {
+      expect(await testFS.exists(`${tempDir}/not_exist.txt`)).toBe(false);
+    });
+  });
+
+  describe("mkdir", () => {
+    it("creates directory if it doesn't exist", async () => {
+      await testFS.mkdir(`${tempDir}/testDir`);
+      expect(await testFS.exists(`${tempDir}/testDir`)).toBe(true);
+    });
+  });
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a6e071e7b3017bc62858d239eb872d9ef9b14ec3..508749e672d5c9817cdb3b4f77dfe658c840ecad 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -128,6 +128,9 @@ importers:
       js-tiktoken:
         specifier: ^1.0.7
         version: 1.0.7
+      lodash:
+        specifier: ^4.17.21
+        version: 4.17.21
       openai:
         specifier: ^3.3.0
         version: 3.3.0
@@ -135,12 +138,18 @@ importers:
         specifier: ^9.0.0
         version: 9.0.0
     devDependencies:
+      '@types/lodash':
+        specifier: ^4.14.195
+        version: 4.14.195
       '@types/node':
         specifier: ^18
         version: 18.6.0
       '@types/uuid':
         specifier: ^9.0.2
         version: 9.0.2
+      node-stdlib-browser:
+        specifier: ^1.2.0
+        version: 1.2.0
 
   packages/eslint-config-custom:
     dependencies:
@@ -1100,6 +1109,10 @@ packages:
     resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
     dev: false
 
+  /@types/lodash@4.14.195:
+    resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==}
+    dev: true
+
   /@types/minimatch@5.1.2:
     resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==}
     dev: true
@@ -1376,6 +1389,24 @@ packages:
       get-intrinsic: 1.2.0
     dev: false
 
+  /asn1.js@5.4.1:
+    resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==}
+    dependencies:
+      bn.js: 4.12.0
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+      safer-buffer: 2.1.2
+    dev: true
+
+  /assert@2.0.0:
+    resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==}
+    dependencies:
+      es6-object-assign: 1.1.0
+      is-nan: 1.3.2
+      object-is: 1.1.5
+      util: 0.12.5
+    dev: true
+
   /ast-types-flow@0.0.7:
     resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
     dev: false
@@ -1391,7 +1422,6 @@ packages:
   /available-typed-arrays@1.0.5:
     resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
     engines: {node: '>= 0.4'}
-    dev: false
 
   /axe-core@4.7.0:
     resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==}
@@ -1503,6 +1533,14 @@ packages:
       readable-stream: 3.6.2
     dev: true
 
+  /bn.js@4.12.0:
+    resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==}
+    dev: true
+
+  /bn.js@5.2.1:
+    resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==}
+    dev: true
+
   /bplist-parser@0.2.0:
     resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==}
     engines: {node: '>= 5.10.0'}
@@ -1528,6 +1566,71 @@ packages:
     dependencies:
       fill-range: 7.0.1
 
+  /brorand@1.1.0:
+    resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==}
+    dev: true
+
+  /browser-resolve@2.0.0:
+    resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==}
+    dependencies:
+      resolve: 1.22.2
+    dev: true
+
+  /browserify-aes@1.2.0:
+    resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==}
+    dependencies:
+      buffer-xor: 1.0.3
+      cipher-base: 1.0.4
+      create-hash: 1.2.0
+      evp_bytestokey: 1.0.3
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+    dev: true
+
+  /browserify-cipher@1.0.1:
+    resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==}
+    dependencies:
+      browserify-aes: 1.2.0
+      browserify-des: 1.0.2
+      evp_bytestokey: 1.0.3
+    dev: true
+
+  /browserify-des@1.0.2:
+    resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==}
+    dependencies:
+      cipher-base: 1.0.4
+      des.js: 1.1.0
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+    dev: true
+
+  /browserify-rsa@4.1.0:
+    resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==}
+    dependencies:
+      bn.js: 5.2.1
+      randombytes: 2.1.0
+    dev: true
+
+  /browserify-sign@4.2.1:
+    resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==}
+    dependencies:
+      bn.js: 5.2.1
+      browserify-rsa: 4.1.0
+      create-hash: 1.2.0
+      create-hmac: 1.1.7
+      elliptic: 6.5.4
+      inherits: 2.0.4
+      parse-asn1: 5.1.6
+      readable-stream: 3.6.2
+      safe-buffer: 5.2.1
+    dev: true
+
+  /browserify-zlib@0.2.0:
+    resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==}
+    dependencies:
+      pako: 1.0.11
+    dev: true
+
   /browserslist@4.21.9:
     resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==}
     engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
@@ -1555,6 +1658,10 @@ packages:
     resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
     dev: true
 
+  /buffer-xor@1.0.3:
+    resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==}
+    dev: true
+
   /buffer@5.7.1:
     resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
     dependencies:
@@ -1562,6 +1669,10 @@ packages:
       ieee754: 1.2.1
     dev: true
 
+  /builtin-status-codes@3.0.0:
+    resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==}
+    dev: true
+
   /builtins@5.0.1:
     resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==}
     dependencies:
@@ -1587,7 +1698,6 @@ packages:
     dependencies:
       function-bind: 1.1.1
       get-intrinsic: 1.2.0
-    dev: false
 
   /callsites@3.1.0:
     resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
@@ -1669,6 +1779,13 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
+  /cipher-base@1.0.4:
+    resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==}
+    dependencies:
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+    dev: true
+
   /cjs-module-lexer@1.2.3:
     resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==}
     dev: true
@@ -1754,6 +1871,10 @@ packages:
   /concat-map@0.0.1:
     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
 
+  /console-browserify@1.2.0:
+    resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==}
+    dev: true
+
   /constant-case@2.0.0:
     resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==}
     dependencies:
@@ -1761,6 +1882,10 @@ packages:
       upper-case: 1.1.3
     dev: true
 
+  /constants-browserify@1.0.0:
+    resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==}
+    dev: true
+
   /convert-source-map@1.9.0:
     resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
 
@@ -1773,6 +1898,34 @@ packages:
     requiresBuild: true
     dev: true
 
+  /create-ecdh@4.0.4:
+    resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==}
+    dependencies:
+      bn.js: 4.12.0
+      elliptic: 6.5.4
+    dev: true
+
+  /create-hash@1.2.0:
+    resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
+    dependencies:
+      cipher-base: 1.0.4
+      inherits: 2.0.4
+      md5.js: 1.3.5
+      ripemd160: 2.0.2
+      sha.js: 2.4.11
+    dev: true
+
+  /create-hmac@1.1.7:
+    resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==}
+    dependencies:
+      cipher-base: 1.0.4
+      create-hash: 1.2.0
+      inherits: 2.0.4
+      ripemd160: 2.0.2
+      safe-buffer: 5.2.1
+      sha.js: 2.4.11
+    dev: true
+
   /create-require@1.1.1:
     resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
     dev: true
@@ -1785,6 +1938,22 @@ packages:
       shebang-command: 2.0.0
       which: 2.0.2
 
+  /crypto-browserify@3.12.0:
+    resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==}
+    dependencies:
+      browserify-cipher: 1.0.1
+      browserify-sign: 4.2.1
+      create-ecdh: 4.0.4
+      create-hash: 1.2.0
+      create-hmac: 1.1.7
+      diffie-hellman: 5.0.3
+      inherits: 2.0.4
+      pbkdf2: 3.1.2
+      public-encrypt: 4.0.3
+      randombytes: 2.1.0
+      randomfill: 1.0.4
+    dev: true
+
   /csstype@3.1.2:
     resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
     dev: true
@@ -1890,7 +2059,6 @@ packages:
     dependencies:
       has-property-descriptors: 1.0.0
       object-keys: 1.1.1
-    dev: false
 
   /del@5.1.0:
     resolution: {integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==}
@@ -1911,6 +2079,13 @@ packages:
     engines: {node: '>=0.4.0'}
     dev: false
 
+  /des.js@1.1.0:
+    resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==}
+    dependencies:
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+    dev: true
+
   /detect-newline@3.1.0:
     resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
     engines: {node: '>=8'}
@@ -1926,6 +2101,14 @@ packages:
     engines: {node: '>=0.3.1'}
     dev: true
 
+  /diffie-hellman@5.0.3:
+    resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==}
+    dependencies:
+      bn.js: 4.12.0
+      miller-rabin: 4.0.1
+      randombytes: 2.1.0
+    dev: true
+
   /dir-glob@3.0.1:
     resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
     engines: {node: '>=8'}
@@ -1945,6 +2128,11 @@ packages:
     dependencies:
       esutils: 2.0.3
 
+  /domain-browser@4.22.0:
+    resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==}
+    engines: {node: '>=10'}
+    dev: true
+
   /dot-case@2.1.1:
     resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==}
     dependencies:
@@ -1954,6 +2142,18 @@ packages:
   /electron-to-chromium@1.4.432:
     resolution: {integrity: sha512-yz3U/khQgAFT2HURJA3/F4fKIyO2r5eK09BQzBZFd6BvBSSaRuzKc2ZNBHtJcO75/EKiRYbVYJZ2RB0P4BuD2g==}
 
+  /elliptic@6.5.4:
+    resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==}
+    dependencies:
+      bn.js: 4.12.0
+      brorand: 1.1.0
+      hash.js: 1.1.7
+      hmac-drbg: 1.0.1
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+      minimalistic-crypto-utils: 1.0.1
+    dev: true
+
   /emittery@0.13.1:
     resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
     engines: {node: '>=12'}
@@ -2064,6 +2264,10 @@ packages:
       is-symbol: 1.0.4
     dev: false
 
+  /es6-object-assign@1.1.0:
+    resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==}
+    dev: true
+
   /escalade@3.1.1:
     resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
     engines: {node: '>=6'}
@@ -2419,6 +2623,18 @@ packages:
     resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
     engines: {node: '>=0.10.0'}
 
+  /events@3.3.0:
+    resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+    engines: {node: '>=0.8.x'}
+    dev: true
+
+  /evp_bytestokey@1.0.3:
+    resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
+    dependencies:
+      md5.js: 1.3.5
+      safe-buffer: 5.2.1
+    dev: true
+
   /execa@5.1.1:
     resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
     engines: {node: '>=10'}
@@ -2530,6 +2746,14 @@ packages:
       path-exists: 4.0.0
     dev: true
 
+  /find-up@5.0.0:
+    resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+    engines: {node: '>=10'}
+    dependencies:
+      locate-path: 6.0.0
+      path-exists: 4.0.0
+    dev: true
+
   /flat-cache@3.0.4:
     resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
     engines: {node: ^10.12.0 || >=12.0.0}
@@ -2554,7 +2778,6 @@ packages:
     resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
     dependencies:
       is-callable: 1.2.7
-    dev: false
 
   /form-data@4.0.0:
     resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
@@ -2620,7 +2843,6 @@ packages:
       function-bind: 1.1.1
       has: 1.0.3
       has-symbols: 1.0.3
-    dev: false
 
   /get-package-type@0.1.0:
     resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
@@ -2728,7 +2950,6 @@ packages:
     resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
     dependencies:
       get-intrinsic: 1.2.0
-    dev: false
 
   /graceful-fs@4.2.11:
     resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
@@ -2761,7 +2982,6 @@ packages:
     resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
     dependencies:
       get-intrinsic: 1.2.0
-    dev: false
 
   /has-proto@1.0.1:
     resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
@@ -2771,14 +2991,12 @@ packages:
   /has-symbols@1.0.3:
     resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
     engines: {node: '>= 0.4'}
-    dev: false
 
   /has-tostringtag@1.0.0:
     resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
     engines: {node: '>= 0.4'}
     dependencies:
       has-symbols: 1.0.3
-    dev: false
 
   /has@1.0.3:
     resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
@@ -2786,6 +3004,22 @@ packages:
     dependencies:
       function-bind: 1.1.1
 
+  /hash-base@3.1.0:
+    resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==}
+    engines: {node: '>=4'}
+    dependencies:
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+      safe-buffer: 5.2.1
+    dev: true
+
+  /hash.js@1.1.7:
+    resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
+    dependencies:
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+    dev: true
+
   /header-case@1.0.1:
     resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==}
     dependencies:
@@ -2793,10 +3027,22 @@ packages:
       upper-case: 1.1.3
     dev: true
 
+  /hmac-drbg@1.0.1:
+    resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==}
+    dependencies:
+      hash.js: 1.1.7
+      minimalistic-assert: 1.0.1
+      minimalistic-crypto-utils: 1.0.1
+    dev: true
+
   /html-escaper@2.0.2:
     resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
     dev: true
 
+  /https-browserify@1.0.0:
+    resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==}
+    dev: true
+
   /human-signals@2.1.0:
     resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
     engines: {node: '>=10.17.0'}
@@ -2918,7 +3164,6 @@ packages:
     dependencies:
       call-bind: 1.0.2
       has-tostringtag: 1.0.0
-    dev: false
 
   /is-array-buffer@3.0.2:
     resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
@@ -2949,7 +3194,6 @@ packages:
   /is-callable@1.2.7:
     resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
     engines: {node: '>= 0.4'}
-    dev: false
 
   /is-core-module@2.12.0:
     resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==}
@@ -2986,6 +3230,13 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
+  /is-generator-function@1.0.10:
+    resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      has-tostringtag: 1.0.0
+    dev: true
+
   /is-glob@4.0.3:
     resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
     engines: {node: '>=0.10.0'}
@@ -3014,6 +3265,14 @@ packages:
     resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
     dev: false
 
+  /is-nan@1.3.2:
+    resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+    dev: true
+
   /is-negative-zero@2.0.2:
     resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
     engines: {node: '>= 0.4'}
@@ -3090,7 +3349,6 @@ packages:
       for-each: 0.3.3
       gopd: 1.0.1
       has-tostringtag: 1.0.0
-    dev: false
 
   /is-unicode-supported@0.1.0:
     resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
@@ -3139,6 +3397,11 @@ packages:
   /isexe@2.0.0:
     resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
 
+  /isomorphic-timers-promises@1.0.1:
+    resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==}
+    engines: {node: '>=10'}
+    dev: true
+
   /istanbul-lib-coverage@3.2.0:
     resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==}
     engines: {node: '>=8'}
@@ -3693,6 +3956,13 @@ packages:
       p-locate: 4.1.0
     dev: true
 
+  /locate-path@6.0.0:
+    resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+    engines: {node: '>=10'}
+    dependencies:
+      p-locate: 5.0.0
+    dev: true
+
   /lodash.get@4.4.2:
     resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
     dev: true
@@ -3709,7 +3979,6 @@ packages:
 
   /lodash@4.17.21:
     resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
-    dev: true
 
   /log-symbols@4.1.0:
     resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
@@ -3762,6 +4031,14 @@ packages:
       tmpl: 1.0.5
     dev: true
 
+  /md5.js@1.3.5:
+    resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
+    dependencies:
+      hash-base: 3.1.0
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+    dev: true
+
   /merge-stream@2.0.0:
     resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
 
@@ -3776,6 +4053,14 @@ packages:
       braces: 3.0.2
       picomatch: 2.3.1
 
+  /miller-rabin@4.0.1:
+    resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==}
+    hasBin: true
+    dependencies:
+      bn.js: 4.12.0
+      brorand: 1.1.0
+    dev: true
+
   /mime-db@1.52.0:
     resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
     engines: {node: '>= 0.6'}
@@ -3797,6 +4082,14 @@ packages:
     engines: {node: '>=12'}
     dev: false
 
+  /minimalistic-assert@1.0.1:
+    resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
+    dev: true
+
+  /minimalistic-crypto-utils@1.0.1:
+    resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
+    dev: true
+
   /minimatch@3.1.2:
     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
     dependencies:
@@ -3916,6 +4209,39 @@ packages:
   /node-releases@2.0.12:
     resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==}
 
+  /node-stdlib-browser@1.2.0:
+    resolution: {integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==}
+    engines: {node: '>=10'}
+    dependencies:
+      assert: 2.0.0
+      browser-resolve: 2.0.0
+      browserify-zlib: 0.2.0
+      buffer: 5.7.1
+      console-browserify: 1.2.0
+      constants-browserify: 1.0.0
+      create-require: 1.1.1
+      crypto-browserify: 3.12.0
+      domain-browser: 4.22.0
+      events: 3.3.0
+      https-browserify: 1.0.0
+      isomorphic-timers-promises: 1.0.1
+      os-browserify: 0.3.0
+      path-browserify: 1.0.1
+      pkg-dir: 5.0.0
+      process: 0.11.10
+      punycode: 1.4.1
+      querystring-es3: 0.2.1
+      readable-stream: 3.6.2
+      stream-browserify: 3.0.0
+      stream-http: 3.2.0
+      string_decoder: 1.3.0
+      timers-browserify: 2.0.12
+      tty-browserify: 0.0.1
+      url: 0.11.1
+      util: 0.12.5
+      vm-browserify: 1.1.2
+    dev: true
+
   /normalize-path@3.0.0:
     resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
     engines: {node: '>=0.10.0'}
@@ -3940,7 +4266,6 @@ packages:
 
   /object-inspect@1.12.3:
     resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
-    dev: false
 
   /object-is@1.1.5:
     resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==}
@@ -3948,12 +4273,10 @@ packages:
     dependencies:
       call-bind: 1.0.2
       define-properties: 1.2.0
-    dev: false
 
   /object-keys@1.1.1:
     resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
     engines: {node: '>= 0.4'}
-    dev: false
 
   /object.assign@4.1.4:
     resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
@@ -4062,6 +4385,10 @@ packages:
       wcwidth: 1.0.1
     dev: true
 
+  /os-browserify@0.3.0:
+    resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==}
+    dev: true
+
   /os-tmpdir@1.0.2:
     resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
     engines: {node: '>=0.10.0'}
@@ -4088,6 +4415,13 @@ packages:
       p-limit: 2.3.0
     dev: true
 
+  /p-locate@5.0.0:
+    resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+    engines: {node: '>=10'}
+    dependencies:
+      p-limit: 3.1.0
+    dev: true
+
   /p-map@3.0.0:
     resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==}
     engines: {node: '>=8'}
@@ -4100,6 +4434,10 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
+  /pako@1.0.11:
+    resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
+    dev: true
+
   /param-case@2.1.1:
     resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==}
     dependencies:
@@ -4112,6 +4450,16 @@ packages:
     dependencies:
       callsites: 3.1.0
 
+  /parse-asn1@5.1.6:
+    resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==}
+    dependencies:
+      asn1.js: 5.4.1
+      browserify-aes: 1.2.0
+      evp_bytestokey: 1.0.3
+      pbkdf2: 3.1.2
+      safe-buffer: 5.2.1
+    dev: true
+
   /parse-json@5.2.0:
     resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
     engines: {node: '>=8'}
@@ -4129,6 +4477,10 @@ packages:
       upper-case-first: 1.1.2
     dev: true
 
+  /path-browserify@1.0.1:
+    resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+    dev: true
+
   /path-case@2.1.1:
     resolution: {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==}
     dependencies:
@@ -4160,6 +4512,17 @@ packages:
     resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
     engines: {node: '>=8'}
 
+  /pbkdf2@3.1.2:
+    resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==}
+    engines: {node: '>=0.12'}
+    dependencies:
+      create-hash: 1.2.0
+      create-hmac: 1.1.7
+      ripemd160: 2.0.2
+      safe-buffer: 5.2.1
+      sha.js: 2.4.11
+    dev: true
+
   /picocolors@1.0.0:
     resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
 
@@ -4179,6 +4542,13 @@ packages:
       find-up: 4.1.0
     dev: true
 
+  /pkg-dir@5.0.0:
+    resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==}
+    engines: {node: '>=10'}
+    dependencies:
+      find-up: 5.0.0
+    dev: true
+
   /postcss@8.4.14:
     resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
     engines: {node: ^10 || ^12 || >=14}
@@ -4261,6 +4631,11 @@ packages:
       react-is: 18.2.0
     dev: true
 
+  /process@0.11.10:
+    resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+    engines: {node: '>= 0.6.0'}
+    dev: true
+
   /progress@2.0.3:
     resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
     engines: {node: '>=0.4.0'}
@@ -4281,6 +4656,21 @@ packages:
       react-is: 16.13.1
     dev: false
 
+  /public-encrypt@4.0.3:
+    resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==}
+    dependencies:
+      bn.js: 4.12.0
+      browserify-rsa: 4.1.0
+      create-hash: 1.2.0
+      parse-asn1: 5.1.6
+      randombytes: 2.1.0
+      safe-buffer: 5.2.1
+    dev: true
+
+  /punycode@1.4.1:
+    resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+    dev: true
+
   /punycode@2.3.0:
     resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
     engines: {node: '>=6'}
@@ -4289,9 +4679,34 @@ packages:
     resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==}
     dev: true
 
+  /qs@6.11.2:
+    resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==}
+    engines: {node: '>=0.6'}
+    dependencies:
+      side-channel: 1.0.4
+    dev: true
+
+  /querystring-es3@0.2.1:
+    resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==}
+    engines: {node: '>=0.4.x'}
+    dev: true
+
   /queue-microtask@1.2.3:
     resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
 
+  /randombytes@2.1.0:
+    resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+    dependencies:
+      safe-buffer: 5.2.1
+    dev: true
+
+  /randomfill@1.0.4:
+    resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==}
+    dependencies:
+      randombytes: 2.1.0
+      safe-buffer: 5.2.1
+    dev: true
+
   /rc@1.2.8:
     resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
     dependencies:
@@ -4405,6 +4820,7 @@ packages:
 
   /resolve@1.22.2:
     resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
+    hasBin: true
     dependencies:
       is-core-module: 2.12.0
       path-parse: 1.0.7
@@ -4412,6 +4828,7 @@ packages:
 
   /resolve@2.0.0-next.4:
     resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
+    hasBin: true
     dependencies:
       is-core-module: 2.12.0
       path-parse: 1.0.7
@@ -4435,6 +4852,13 @@ packages:
     dependencies:
       glob: 7.2.3
 
+  /ripemd160@2.0.2:
+    resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
+    dependencies:
+      hash-base: 3.1.0
+      inherits: 2.0.4
+    dev: true
+
   /run-applescript@5.0.0:
     resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==}
     engines: {node: '>=12'}
@@ -4504,6 +4928,18 @@ packages:
       upper-case-first: 1.1.2
     dev: true
 
+  /setimmediate@1.0.5:
+    resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
+    dev: true
+
+  /sha.js@2.4.11:
+    resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
+    hasBin: true
+    dependencies:
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+    dev: true
+
   /shebang-command@2.0.0:
     resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
     engines: {node: '>=8'}
@@ -4520,7 +4956,6 @@ packages:
       call-bind: 1.0.2
       get-intrinsic: 1.2.0
       object-inspect: 1.12.3
-    dev: false
 
   /signal-exit@3.0.7:
     resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
@@ -4586,6 +5021,22 @@ packages:
       internal-slot: 1.0.5
     dev: false
 
+  /stream-browserify@3.0.0:
+    resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==}
+    dependencies:
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+    dev: true
+
+  /stream-http@3.2.0:
+    resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==}
+    dependencies:
+      builtin-status-codes: 3.0.0
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+      xtend: 4.0.2
+    dev: true
+
   /streamsearch@1.1.0:
     resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
     engines: {node: '>=10.0.0'}
@@ -4777,6 +5228,13 @@ packages:
     engines: {node: '>= 14'}
     dev: true
 
+  /timers-browserify@2.0.12:
+    resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==}
+    engines: {node: '>=0.6.0'}
+    dependencies:
+      setimmediate: 1.0.5
+    dev: true
+
   /title-case@2.1.1:
     resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==}
     dependencies:
@@ -4900,6 +5358,10 @@ packages:
       typescript: 4.9.5
     dev: false
 
+  /tty-browserify@0.0.1:
+    resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==}
+    dev: true
+
   /turbo-darwin-64@1.10.3:
     resolution: {integrity: sha512-IIB9IomJGyD3EdpSscm7Ip1xVWtYb7D0x7oH3vad3gjFcjHJzDz9xZ/iw/qItFEW+wGFcLSRPd+1BNnuLM8AsA==}
     cpu: [x64]
@@ -5052,10 +5514,27 @@ packages:
     dependencies:
       punycode: 2.3.0
 
+  /url@0.11.1:
+    resolution: {integrity: sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==}
+    dependencies:
+      punycode: 1.4.1
+      qs: 6.11.2
+    dev: true
+
   /util-deprecate@1.0.2:
     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
     dev: true
 
+  /util@0.12.5:
+    resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
+    dependencies:
+      inherits: 2.0.4
+      is-arguments: 1.1.1
+      is-generator-function: 1.0.10
+      is-typed-array: 1.1.10
+      which-typed-array: 1.1.9
+    dev: true
+
   /uuid@9.0.0:
     resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==}
     hasBin: true
@@ -5084,6 +5563,10 @@ packages:
       builtins: 5.0.1
     dev: true
 
+  /vm-browserify@1.1.2:
+    resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==}
+    dev: true
+
   /walker@1.0.8:
     resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
     dependencies:
@@ -5125,7 +5608,6 @@ packages:
       gopd: 1.0.1
       has-tostringtag: 1.0.0
       is-typed-array: 1.1.10
-    dev: false
 
   /which@2.0.2:
     resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
@@ -5165,6 +5647,11 @@ packages:
       signal-exit: 3.0.7
     dev: true
 
+  /xtend@4.0.2:
+    resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+    engines: {node: '>=0.4'}
+    dev: true
+
   /y18n@5.0.8:
     resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
     engines: {node: '>=10'}