diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 57a61e99..48f80353 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -26,8 +26,8 @@ If applicable, add screenshots to help explain your problem. **Device info(please complete the following information):** - Device: [e.g. iPhone6] - OS: [ROM and version, ie Havoc-OS 4.12] - - App Version [e.g. 22] - - User Agent [e.g. Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36] + - App Version: [e.g. 22] + - User Agent: [e.g. Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36] **Additional context** Add any other context about the problem here. \ No newline at end of file diff --git a/.github/workflows/build-debug.yml b/.github/workflows/build-debug.yml index 6de23fed..99203191 100644 --- a/.github/workflows/build-debug.yml +++ b/.github/workflows/build-debug.yml @@ -76,28 +76,28 @@ jobs: uses: actions/upload-artifact@v3 with: name: MMRL-default-arm64-v8a-debug - path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-arm64-v8a-debug.apk + path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-arm64-v8a-debug-*-*.apk - name: Upload MMRL-default-armeabi-v7a-debug uses: actions/upload-artifact@v3 with: name: MMRL-default-armeabi-v7a-debug - path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-armeabi-v7a-debug.apk + path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-armeabi-v7a-debug-*-*.apk - name: Upload MMRL-default-universal-debug uses: actions/upload-artifact@v3 with: name: MMRL-default-universal-debug - path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-universal-debug.apk + path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-universal-debug-*-*.apk - name: Upload MMRL-default-x86-debug uses: actions/upload-artifact@v3 with: name: MMRL-default-x86-debug - path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-x86-debug.apk + path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-x86-debug-*-*.apk - name: Upload MMRL-default-x86_64-debug uses: actions/upload-artifact@v3 with: name: MMRL-default-x86_64-debug - path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-x86_64-debug.apk + path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-x86_64-debug-*-*.apk diff --git a/Android/app/build.gradle b/Android/app/build.gradle index 1977aee7..780431b8 100755 --- a/Android/app/build.gradle +++ b/Android/app/build.gradle @@ -17,15 +17,6 @@ android { targetSdk pkg.config.target_sdk versionName pkg.config.version_name versionCode pkg.config.version_code - externalNativeBuild { - cmake { - cppFlags "-llog" - arguments "-DANDROID_STL=c++_shared" - } - } - ndk { - abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64" - } } splits { @@ -37,13 +28,18 @@ android { } } + applicationVariants.configureEach { variant -> + variant.outputs.configureEach { output -> + outputFileName = outputFileName.replace(".apk", "-${variant.versionName}-${variant.versionCode}.apk").replace("-unsigned", "") + } + } + buildTypes { release { resValue "string", "app_name", "${app_name}" minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' multiDexEnabled true - // project.tasks.preBuild.dependsOn("webProd") } debug { resValue "string", "app_name", "${app_name} Debug" @@ -52,12 +48,6 @@ android { minifyEnabled false multiDexEnabled false applicationIdSuffix '.debug' - // project.tasks.preBuild.dependsOn("webDev") - } - } - externalNativeBuild { - cmake { - path = file("src/main/cpp/CMakeLists.txt") } } compileOptions { @@ -65,9 +55,6 @@ android { targetCompatibility JavaVersion.VERSION_1_8 } packagingOptions { - jniLibs { - keepDebugSymbols += ['*/armeabi/*.so', '*/armeabi-v7a/*.so', '*/arm64-v8a/*.so', '*/mips/*.so', '*/mips64/*.so', '*/x86/*.so', '*/x86_64/*.so'] - } resources { excludes += ['META-INF/DEPENDENCIES.txt', 'META-INF/DEPENDENCIES', 'META-INF/LICENSE', 'META-INF/LICENSE.txt', 'META-INF/MANIFEST.MF', 'META-INF/NOTICE', 'META-INF/NOTICE.txt', 'META-INF/ASL2.0'] } @@ -89,11 +76,16 @@ repositories { dependencies { implementation "androidx.browser:browser:1.7.0" + implementation "androidx.appcompat:appcompat:1.6.1" + implementation 'androidx.core:core:1.13.0-alpha04' + implementation 'androidx.webkit:webkit:1.9.0' + implementation "com.github.topjohnwu.libsu:core:5.2.1" implementation "com.github.topjohnwu.libsu:io:5.2.1" - implementation "androidx.appcompat:appcompat:1.6.1" + implementation 'org.apache.cordova:framework:12.0.1' - implementation 'androidx.webkit:webkit:1.9.0' + + implementation 'com.squareup.okhttp3:okhttp:4.12.0' } configurations.implementation.setCanBeResolved(true) diff --git a/Android/app/default/debug/output-metadata.json b/Android/app/default/debug/output-metadata.json index fd7848eb..3dc9e843 100644 --- a/Android/app/default/debug/output-metadata.json +++ b/Android/app/default/debug/output-metadata.json @@ -11,61 +11,61 @@ "type": "UNIVERSAL", "filters": [], "attributes": [], - "versionCode": 171, - "versionName": "1.7.1", - "outputFile": "app-default-universal-debug.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-7", + "outputFile": "app-default-universal-debug-2.13.9_alpha-7-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "armeabi-v7a" + "value": "x86" } ], "attributes": [], - "versionCode": 171, - "versionName": "1.7.1", - "outputFile": "app-default-armeabi-v7a-debug.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-7", + "outputFile": "app-default-x86-debug-2.13.9_alpha-7-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "x86" + "value": "x86_64" } ], "attributes": [], - "versionCode": 171, - "versionName": "1.7.1", - "outputFile": "app-default-x86-debug.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-7", + "outputFile": "app-default-x86_64-debug-2.13.9_alpha-7-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "arm64-v8a" + "value": "armeabi-v7a" } ], "attributes": [], - "versionCode": 171, - "versionName": "1.7.1", - "outputFile": "app-default-arm64-v8a-debug.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-7", + "outputFile": "app-default-armeabi-v7a-debug-2.13.9_alpha-7-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "x86_64" + "value": "arm64-v8a" } ], "attributes": [], - "versionCode": 171, - "versionName": "1.7.1", - "outputFile": "app-default-x86_64-debug.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-7", + "outputFile": "app-default-arm64-v8a-debug-2.13.9_alpha-7-2139.apk" } ], "elementType": "File" diff --git a/Android/app/default/release/output-metadata.json b/Android/app/default/release/output-metadata.json index b18ff3f3..9613efda 100644 --- a/Android/app/default/release/output-metadata.json +++ b/Android/app/default/release/output-metadata.json @@ -11,9 +11,9 @@ "type": "UNIVERSAL", "filters": [], "attributes": [], - "versionCode": 1139, - "versionName": "1.13.9", - "outputFile": "app-default-universal-release.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-7", + "outputFile": "app-default-universal-release-2.13.9_alpha-7-2139.apk" }, { "type": "ONE_OF_MANY", @@ -24,35 +24,35 @@ } ], "attributes": [], - "versionCode": 1139, - "versionName": "1.13.9", - "outputFile": "app-default-x86-release.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-7", + "outputFile": "app-default-x86-release-2.13.9_alpha-7-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "x86_64" + "value": "armeabi-v7a" } ], "attributes": [], - "versionCode": 1139, - "versionName": "1.13.9", - "outputFile": "app-default-x86_64-release.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-7", + "outputFile": "app-default-armeabi-v7a-release-2.13.9_alpha-7-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "armeabi-v7a" + "value": "x86_64" } ], "attributes": [], - "versionCode": 1139, - "versionName": "1.13.9", - "outputFile": "app-default-armeabi-v7a-release.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-7", + "outputFile": "app-default-x86_64-release-2.13.9_alpha-7-2139.apk" }, { "type": "ONE_OF_MANY", @@ -63,9 +63,9 @@ } ], "attributes": [], - "versionCode": 1139, - "versionName": "1.13.9", - "outputFile": "app-default-arm64-v8a-release.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-7", + "outputFile": "app-default-arm64-v8a-release-2.13.9_alpha-7-2139.apk" } ], "elementType": "File" diff --git a/Android/app/src/main/AndroidManifest.xml b/Android/app/src/main/AndroidManifest.xml index 34510dbb..77444436 100755 --- a/Android/app/src/main/AndroidManifest.xml +++ b/Android/app/src/main/AndroidManifest.xml @@ -5,11 +5,6 @@ - - @@ -24,13 +19,15 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" - android:theme="@style/AppTheme" + android:theme="@style/AppTheme.SplashScreen" tools:ignore="GoogleAppIndexingWarning" tools:targetApi="q"> + android:windowSoftInputMode="adjustResize" + android:exported="true" + tools:ignore="Instantiatable"> diff --git a/Android/app/src/main/cpp/CMakeLists.txt b/Android/app/src/main/cpp/CMakeLists.txt deleted file mode 100644 index 1732d38c..00000000 --- a/Android/app/src/main/cpp/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# Sets the minimum version of CMake required to build your native library. -# This ensures that a certain set of CMake features is available to -# your build. - - -cmake_minimum_required(VERSION 3.4.1) - -# Specifies a library name, specifies whether the library is STATIC or -# SHARED, and provides relative paths to the source code. You can -# define multiple libraries by adding multiple add_library() commands, -# and CMake builds them for you. When you build your app, Gradle -# automatically packages shared libraries with your APK. - - -add_library(native-log-lib SHARED - log.cpp) - -add_library(native-properties-lib SHARED - properties.cpp) - -add_library(native-shell-lib SHARED - shell.cpp) \ No newline at end of file diff --git a/Android/app/src/main/cpp/log.cpp b/Android/app/src/main/cpp/log.cpp deleted file mode 100644 index c6c839c7..00000000 --- a/Android/app/src/main/cpp/log.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - - -extern "C" -JNIEXPORT void JNICALL -Java_com_dergoogler_core_NativeLog_native_1log(JNIEnv *env, jclass clazz, jint prio, jstring tag, - jstring msg) { -// unsigned int myPrio = (unsigned int)prio; - - const char *myTag = env->GetStringUTFChars(tag, 0); - const char *myMsg = env->GetStringUTFChars(msg, 0); - __android_log_write(prio, myTag, myMsg); -} \ No newline at end of file diff --git a/Android/app/src/main/cpp/properties.cpp b/Android/app/src/main/cpp/properties.cpp deleted file mode 100644 index c37ccb1d..00000000 --- a/Android/app/src/main/cpp/properties.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include -//#include - -extern "C" -JNIEXPORT jstring JNICALL -Java_com_dergoogler_core_NativeProperties_get(JNIEnv *env, jclass clazz, jstring key, - jstring def) { - const char *myKey = env->GetStringUTFChars(key, 0); - const char *myDef = env->GetStringUTFChars(def, 0); - - char value[PROP_VALUE_MAX] = {0}; - - int iReturn = __system_property_get(myKey, value); - if (!iReturn) strcpy(value, myDef); - - return env->NewStringUTF(value); -} - -extern "C" -JNIEXPORT int JNICALL -Java_com_dergoogler_core_NativeProperties_set(JNIEnv *env, jclass clazz, jstring key, - jstring value) { - const char *myKey = env->GetStringUTFChars(key, 0); - const char *myValue = env->GetStringUTFChars(value, 0); - - int rc = __system_property_set(myKey, myValue); - if (rc == -1) { - return 0; - } - - return 1; -} \ No newline at end of file diff --git a/Android/app/src/main/cpp/shell.cpp b/Android/app/src/main/cpp/shell.cpp deleted file mode 100644 index e1a3104f..00000000 --- a/Android/app/src/main/cpp/shell.cpp +++ /dev/null @@ -1,231 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -bool path_detection(char **paths) { - int len = sizeof(paths) / sizeof(paths[0]); - - bool bRet = false; - for (int i = 0; i < len; i++) { - if (open(paths[i], O_RDONLY) >= 0) { - bRet = true; - break; - } - if (0 == access(paths[i], R_OK)) { - bRet = true; - break; - } - } - - return bRet; -} - -bool mount_detection(char **searchable_mounts) { - int len = sizeof(searchable_mounts) / sizeof(searchable_mounts[0]); - - bool bRet = false; - - FILE *fp = fopen("/proc/self/mounts", "r"); - if (fp == nullptr) { - return false; - } - - fseek(fp, 0L, SEEK_END); - long size = ftell(fp); - /* For some reason size comes as zero */ - if (size == 0) - size = 20000; /*This will differ for different devices */ - char *buffer = (char *) calloc(size, sizeof(char)); - if (buffer == nullptr) { - return false; - } - - size_t read = fread(buffer, 1, size, fp); - int count = 0; - for (int i = 0; i < len; i++) { - char *rem = strstr(buffer, searchable_mounts[i]); - if (rem != nullptr) { - count++; - break; - } - } - if (count > 0) - bRet = true; - - exit: - - free(buffer); - fclose(fp); - - return bRet; -} - -extern "C" -JNIEXPORT jboolean JNICALL -Java_com_dergoogler_core_NativeShell_isMagiskSU(JNIEnv *env, jclass clazz) { - static char *mounts[] = { - "magisk", - "core/mirror", - "core/img" - }; - static char *paths[] = { - "/system/bin/magisk", - "/sbin/magisk", - "/sbin/.magisk", - "/data/adb/magisk.db", - "/data/adb/magisk/busybox", - "/data/adb/magisk/magisk64", - "/data/adb/magisk/magiskboot", - "/data/adb/magisk/magiskinit", - "/data/adb/magisk/magiskpolicy" - }; - - bool bRet = false; - do { - bRet = path_detection(paths); - if (bRet) - break; - bRet = mount_detection(mounts); - if (bRet) - break; - } while (false); - - if (bRet) { - return JNI_TRUE; - } else { - return JNI_FALSE; - } -} - -extern "C" -JNIEXPORT jboolean JNICALL -Java_com_dergoogler_core_NativeShell_isKernelSU(JNIEnv *env, jclass clazz) { - static char *mounts[] = { - "KSU", - "ksu", - "KERNELSU", - "kernelsu" - }; - static char *paths[] = { - // syslink - "/data/adb/ksud", - "/data/adb/ksu/modules.img", - "/data/adb/ksu/bin/busybox", - "/data/adb/ksu/bin/ksud", - "/data/adb/ksu/bin/resetprop" - }; - - bool bRet = false; - do { - bRet = path_detection(paths); - if (bRet) - break; - bRet = mount_detection(mounts); - if (bRet) - break; - } while (false); - - if (bRet) { - return JNI_TRUE; - } else { - return JNI_FALSE; - } -} - -extern "C" -JNIEXPORT jboolean JNICALL -Java_com_dergoogler_core_NativeShell_isAPatchSU(JNIEnv *env, jclass clazz) { - static char *mounts[] = { - "APD", - "apd", - "APatch", - "APATCH" - }; - static char *paths[] = { - "/data/adb/ap", - "/data/adb/apd", - "/data/adb/kpatch", - "/data/adb/ap/modules.img", - "/data/adb/ap/package_config", - "/data/adb/ap/version", - "/data/adb/ap/su_path", - "/data/adb/ap/bin/busybox", - "/data/adb/ap/bin/apd", - "/data/adb/ap/bin/resetprop" - }; - - bool bRet = false; - do { - bRet = path_detection(paths); - if (bRet) - break; - bRet = mount_detection(mounts); - if (bRet) - break; - } while (false); - - if (bRet) { - return JNI_TRUE; - } else { - return JNI_FALSE; - } -} - -extern "C" -JNIEXPORT jstring JNICALL -Java_com_dergoogler_core_NativeShell_getenv(JNIEnv *env, jclass clazz, jstring key) { - const char *name = env->GetStringUTFChars(key, nullptr); - return env->NewStringUTF(getenv(name)); -} - -extern "C" -JNIEXPORT void JNICALL -Java_com_dergoogler_core_NativeShell_setenv(JNIEnv *env, jclass clazz, jstring key, jstring value, - jint override) { - const char *_key = env->GetStringUTFChars(key, nullptr); - const char *_value = env->GetStringUTFChars(value, nullptr); - setenv(_key,_value,(int)override); -} - -extern "C" -JNIEXPORT jint JNICALL -Java_com_dergoogler_core_NativeShell_pw_1uid(JNIEnv *env, jclass clazz) { - struct passwd *p; - if ((p = getpwuid(geteuid())) == nullptr) - return -1; - else { - return (jint) p->pw_uid; - } -} - -extern "C" -JNIEXPORT jint JNICALL -Java_com_dergoogler_core_NativeShell_pw_1gid(JNIEnv *env, jclass clazz) { - struct passwd *p; - if ((p = getpwuid(geteuid())) == nullptr) - return -1; - else { - return (jint) p->pw_gid; - } -} - -extern "C" -JNIEXPORT jstring JNICALL -Java_com_dergoogler_core_NativeShell_pw_1name(JNIEnv *env, jclass clazz) { - struct passwd *p; - if ((p = getpwuid(geteuid())) == nullptr) - return env->NewStringUTF("null"); - else { - return env->NewStringUTF(p->pw_name); - } -} - diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeLog.java b/Android/app/src/main/java/com/dergoogler/core/NativeLog.java index f19eac00..66528c83 100644 --- a/Android/app/src/main/java/com/dergoogler/core/NativeLog.java +++ b/Android/app/src/main/java/com/dergoogler/core/NativeLog.java @@ -1,14 +1,12 @@ package com.dergoogler.core; +import android.util.Log; import android.webkit.JavascriptInterface; public class NativeLog { - - static { - System.loadLibrary("native-log-lib"); - } - @JavascriptInterface - public static native void native_log(int prio, String tag, String msg); + public void native_log(int prio, String tag, String msg) { + Log.println(prio, tag, msg); + } } diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeOS.java b/Android/app/src/main/java/com/dergoogler/core/NativeOS.java index 325fb1c8..631ffb28 100644 --- a/Android/app/src/main/java/com/dergoogler/core/NativeOS.java +++ b/Android/app/src/main/java/com/dergoogler/core/NativeOS.java @@ -143,52 +143,7 @@ public String getMonetColor(String id) { } } - @JavascriptInterface - public int getStatusBarHeight() { - Resources res = ctx.getApplicationContext().getResources(); - int statusBarHeight; - int resourceId = res.getIdentifier("status_bar_height", "dimen", "android"); - if (resourceId > 0) { - statusBarHeight = res.getDimensionPixelSize(resourceId); - return (int) (statusBarHeight / res.getDisplayMetrics().density); - } else { - return 0; - } - } - - @JavascriptInterface - public int getSafeAreaInsets(String type) { - float leftInset = 0, rightInset = 0, topInset = 0, bottomInset = 0; - Resources res = ctx.getApplicationContext().getResources(); - WindowInsets windowInsets = ctx.getWindow().getDecorView().getRootWindowInsets(); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - if (windowInsets != null) { - final DisplayCutout cutout = windowInsets.getDisplayCutout(); - - leftInset = cutout != null ? cutout.getSafeInsetLeft() : 0; - rightInset = cutout != null ? cutout.getSafeInsetRight() : 0; - topInset = cutout != null ? cutout.getSafeInsetTop() : 0; - bottomInset = cutout != null ? cutout.getSafeInsetBottom() : 0; - - @SuppressLint("RestrictedApi") Insets insets = Insets.wrap(windowInsets.getSystemWindowInsets()); - leftInset = Math.max(leftInset, insets.left) / res.getDisplayMetrics().density; - rightInset = Math.max(rightInset, insets.right) / res.getDisplayMetrics().density; - topInset = Math.max(topInset, insets.top) / res.getDisplayMetrics().density; - bottomInset = Math.max(bottomInset, insets.bottom) / res.getDisplayMetrics().density; - } - } - - - if (type.equals("top")) { - return (int) topInset; - } else { - - return (int) bottomInset; - } - } - - + @Deprecated @JavascriptInterface public void setStatusBarColor(String color, boolean white) { if (white) { @@ -205,6 +160,7 @@ public void setStatusBarColor(String color, boolean white) { } } + @Deprecated @JavascriptInterface public void setNavigationBarColor(String color) { try { diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeProperties.java b/Android/app/src/main/java/com/dergoogler/core/NativeProperties.java deleted file mode 100644 index 7e3d195b..00000000 --- a/Android/app/src/main/java/com/dergoogler/core/NativeProperties.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.dergoogler.core; - -import android.webkit.JavascriptInterface; - -public class NativeProperties { - - static { - System.loadLibrary("native-properties-lib"); - } - - @JavascriptInterface - public static native String get(String key, String def); - - @JavascriptInterface - public static native int set(String key, String value); -} diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeShell.java b/Android/app/src/main/java/com/dergoogler/core/NativeShell.java index a1deb998..a65d841c 100644 --- a/Android/app/src/main/java/com/dergoogler/core/NativeShell.java +++ b/Android/app/src/main/java/com/dergoogler/core/NativeShell.java @@ -18,10 +18,6 @@ public NativeShell(WebView wv) { this.wv = wv; } - static { - System.loadLibrary("native-shell-lib"); - } - @JavascriptInterface public void exec(String command) { Shell.cmd(command).exec(); @@ -33,13 +29,13 @@ public String result(String command) { } @JavascriptInterface - public void isSuccess(String command) { - Shell.cmd(command).exec().isSuccess(); + public boolean isSuccess(String command) { + return Shell.cmd(command).exec().isSuccess(); } @JavascriptInterface - public void getCode(String command) { - Shell.cmd(command).exec().getCode(); + public int getCode(String command) { + return Shell.cmd(command).exec().getCode(); } @JavascriptInterface @@ -53,21 +49,6 @@ public boolean isSuAvailable() { } } - @JavascriptInterface - public static native boolean isMagiskSU(); - - @JavascriptInterface - public static native boolean isKernelSU(); - - @JavascriptInterface - public static native boolean isAPatchSU(); - - @JavascriptInterface - public static native String getenv(String key); - - @JavascriptInterface - public static native void setenv(String key, String value, int override); - @JavascriptInterface public boolean isAppGrantedRoot() { return Shell.cmd("if grep ' / ' /proc/mounts | grep -q '/dev/root' &> /dev/null; " + diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeStorage.java b/Android/app/src/main/java/com/dergoogler/core/NativeStorage.java index 77790fc9..1864a4ed 100644 --- a/Android/app/src/main/java/com/dergoogler/core/NativeStorage.java +++ b/Android/app/src/main/java/com/dergoogler/core/NativeStorage.java @@ -12,7 +12,7 @@ public class NativeStorage { private final SharedPreferences localStorage; private String localStorageName; - public NativeStorage(@NonNull Context ctx) { + public NativeStorage(Context ctx) { this.localStorage = ctx.getSharedPreferences("localstorage_v2", Activity.MODE_PRIVATE); } diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeSuFile.java b/Android/app/src/main/java/com/dergoogler/core/NativeSuFile.java index 2086eb51..5cd1cad0 100644 --- a/Android/app/src/main/java/com/dergoogler/core/NativeSuFile.java +++ b/Android/app/src/main/java/com/dergoogler/core/NativeSuFile.java @@ -15,6 +15,7 @@ import java.io.OutputStream; import java.nio.charset.StandardCharsets; +import java.util.Date; public class NativeSuFile { private final MainActivity ctx; @@ -68,8 +69,21 @@ public String list(String delimiter) { } @JavascriptInterface - public boolean create() { - return file.createNewFile(); + public long lastModified() { + return file.lastModified(); + } + + @JavascriptInterface + public boolean create(int type) { + switch (type) { + case 0: + return file.createNewFile(); + case 1: + return file.mkdirs(); + case 2: + return file.mkdir(); + } + return false; } @JavascriptInterface diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeView.java b/Android/app/src/main/java/com/dergoogler/core/NativeView.java new file mode 100644 index 00000000..d4ef2dee --- /dev/null +++ b/Android/app/src/main/java/com/dergoogler/core/NativeView.java @@ -0,0 +1,111 @@ +package com.dergoogler.core; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.res.Resources; +import android.graphics.Color; +import android.os.Build; +import android.util.DisplayMetrics; +import android.util.TypedValue; +import android.view.DisplayCutout; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowInsets; +import android.webkit.JavascriptInterface; +import android.webkit.WebView; + +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.core.view.WindowInsetsControllerCompat; + +import com.dergoogler.mmrl.MainActivity; + +import java.util.ArrayList; + +public class NativeView { + + private final MainActivity ctx; + private Insets insets; + private final WindowInsetsControllerCompat windowInsetsController; + + public NativeView(MainActivity ctx, WebView wv) { + this.ctx = ctx; + ViewCompat.setOnApplyWindowInsetsListener(wv, (v, windowInsets) -> { + this.insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + return WindowInsetsCompat.CONSUMED; + }); + this.windowInsetsController = WindowCompat.getInsetsController(this.ctx.getWindow(), wv); + } + + private int dpToPx(int dp) { + float scale = this.ctx.getResources().getDisplayMetrics().density; + return (int) (dp / scale); + } + + @JavascriptInterface + public int getWindowTopInsets() { + return dpToPx(this.insets.top); + } + + @JavascriptInterface + public int getWindowRightInsets() { + return dpToPx(this.insets.right); + } + + @JavascriptInterface + public int getWindowBottomInsets() { + return dpToPx(this.insets.bottom); + } + + @JavascriptInterface + public int getWindowLeftInsets() { + return dpToPx(this.insets.left); + } + + @JavascriptInterface + public boolean isAppearanceLightNavigationBars() { + return windowInsetsController.isAppearanceLightNavigationBars(); + } + + @JavascriptInterface + public void setAppearanceLightNavigationBars(boolean isLight) { + windowInsetsController.setAppearanceLightNavigationBars(isLight); + } + + @JavascriptInterface + public boolean isAppearanceLightStatusBars() { + return windowInsetsController.isAppearanceLightStatusBars(); + } + + @JavascriptInterface + public void setAppearanceLightStatusBars(boolean isLight) { + windowInsetsController.setAppearanceLightStatusBars(isLight); + } + + @JavascriptInterface + public void setStatusBarColor(String color, boolean white) { + if (white) { + try { + ((Activity) this.ctx).getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } catch (Exception e) { + e.printStackTrace(); + } + } + try { + ((Activity) this.ctx).getWindow().setStatusBarColor(Color.parseColor(color)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @JavascriptInterface + public void setNavigationBarColor(String color) { + try { + ((Activity) this.ctx).getWindow().setNavigationBarColor(Color.parseColor(color)); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java b/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java index 44d76713..769cc611 100755 --- a/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java +++ b/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java @@ -5,30 +5,28 @@ import android.os.Build; import android.os.Bundle; import android.os.StrictMode; -import android.util.Log; import android.webkit.WebSettings; import android.webkit.WebView; +import androidx.core.view.WindowCompat; + import com.dergoogler.core.NativeEnvironment; import com.dergoogler.core.NativeSuFile; import com.dergoogler.core.NativeLog; import com.dergoogler.core.NativeOS; -import com.dergoogler.core.NativeProperties; import com.dergoogler.core.NativeStorage; import com.dergoogler.core.NativeShell; import com.dergoogler.core.NativeBuildConfig; -import com.topjohnwu.superuser.Shell; -import com.topjohnwu.superuser.ShellUtils; +import com.dergoogler.core.NativeView; import org.apache.cordova.*; -import org.json.JSONException; -import org.json.JSONObject; public class MainActivity extends CordovaActivity { @Override @SuppressLint("SetJavaScriptEnabled") public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + WindowCompat.setDecorFitsSystemWindows(getWindow(), false); appView = findViewById(R.id.mmrl_view); super.init(); @@ -73,8 +71,8 @@ public void onCreate(Bundle savedInstanceState) { wv.addJavascriptInterface(new NativeShell(wv), "__shell__"); wv.addJavascriptInterface(new NativeBuildConfig(), "__buildconfig__"); wv.addJavascriptInterface(os, "__os__"); + wv.addJavascriptInterface(new NativeView(this, wv), "__view__"); wv.addJavascriptInterface(ns, "__nativeStorage__"); - wv.addJavascriptInterface(new NativeProperties(), "__properties__"); wv.addJavascriptInterface(new NativeLog(), "__log__"); } @@ -86,9 +84,6 @@ private String mmrlUserAgent() { private void applyTheme(WebView wv, NativeStorage ns, NativeOS os) { String defColor = "#ce93d8"; String bg = ns.getItem("background_color", defColor); - String sbg = ns.getItem("statusbar_color", defColor); - os.setStatusBarColor(sbg.replace("\"", ""),false); - os.setNavigationBarColor(bg.replace("\"", "")); wv.setBackgroundColor(Color.parseColor(bg.replace("\"", ""))); } diff --git a/Android/app/src/main/java/com/dergoogler/plugin/FetchPlugin.java b/Android/app/src/main/java/com/dergoogler/plugin/FetchPlugin.java new file mode 100644 index 00000000..76922a79 --- /dev/null +++ b/Android/app/src/main/java/com/dergoogler/plugin/FetchPlugin.java @@ -0,0 +1,170 @@ +package com.dergoogler.plugin; + +import android.util.Base64; +import android.util.Log; + +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.Call; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +public class FetchPlugin extends CordovaPlugin { + + public static final String LOG_TAG = "FetchPlugin"; + private static CallbackContext callbackContext; + + private OkHttpClient mClient = new OkHttpClient(); + public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8"); + + private static final long DEFAULT_TIMEOUT = 10; + + @Override + public boolean execute(final String action, final JSONArray data, final CallbackContext callbackContext) { + + if (action.equals("fetch")) { + + try { + String method = data.getString(0); + Log.v(LOG_TAG, "execute: method = " + method.toString()); + + String urlString = data.getString(1); + Log.v(LOG_TAG, "execute: urlString = " + urlString.toString()); + + String postBody = data.getString(2); + Log.v(LOG_TAG, "execute: postBody = " + postBody.toString()); + + JSONObject headers = data.getJSONObject(3); + if (headers.has("map") && headers.getJSONObject("map") != null) { + headers = headers.getJSONObject("map"); + } + + Log.v(LOG_TAG, "execute: headers = " + headers.toString()); + + Request.Builder requestBuilder = new Request.Builder(); + + // method + postBody + if (postBody != null && !postBody.equals("null")) { + // requestBuilder.post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody.toString())); + String contentType; + if (headers.has("content-type")) { + JSONArray contentTypeHeaders = headers.getJSONArray("content-type"); + contentType = contentTypeHeaders.getString(0); + } else { + contentType = "application/json"; + } + requestBuilder.post(RequestBody.create(MediaType.parse(contentType), postBody.toString())); + } else { + requestBuilder.method(method, null); + } + + // url + requestBuilder.url(urlString); + + // headers + if (headers != null && headers.names() != null && headers.names().length() > 0) { + for (int i = 0; i < headers.names().length(); i++) { + + String headerName = headers.names().getString(i); + JSONArray headerValues = headers.getJSONArray(headers.names().getString(i)); + + if (headerValues.length() > 0) { + String headerValue = headerValues.getString(0); + Log.v(LOG_TAG, "key = " + headerName + " value = " + headerValue); + requestBuilder.addHeader(headerName, headerValue); + } + } + } + + Request request = requestBuilder.build(); + + mClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException throwable) { + throwable.printStackTrace(); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, throwable.getMessage())); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + + JSONObject result = new JSONObject(); + try { + Headers responseHeaders = response.headers(); + + JSONObject allHeaders = new JSONObject(); + + if (responseHeaders != null) { + for (int i = 0; i < responseHeaders.size(); i++) { + if (responseHeaders.name(i).compareToIgnoreCase("set-cookie") == 0 && + allHeaders.has(responseHeaders.name(i))) { + allHeaders.put(responseHeaders.name(i), allHeaders.get(responseHeaders.name(i)) + ",\n" + responseHeaders.value(i)); + continue; + } + allHeaders.put(responseHeaders.name(i), responseHeaders.value(i)); + } + } + + result.put("headers", allHeaders); + + if (response.body().contentType().type().equals("image")) { + result.put("isBlob", true); + result.put("body", Base64.encodeToString(response.body().bytes(), Base64.DEFAULT)); + } else { + result.put("body", response.body().string()); + } + + result.put("statusText", response.message()); + result.put("status", response.code()); + result.put("url", response.request().url().toString()); + + } catch (Exception e) { + e.printStackTrace(); + } + + Log.v(LOG_TAG, "HTTP code: " + response.code()); + Log.v(LOG_TAG, "returning: " + result.toString()); + + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result)); + } + }); + + } catch (JSONException e) { + Log.e(LOG_TAG, "execute: Got JSON Exception " + e.getMessage()); + callbackContext.error(e.getMessage()); + } + + } else if (action.equals("setTimeout")) { + this.setTimeout(data.optLong(0, DEFAULT_TIMEOUT)); + } else { + Log.e(LOG_TAG, "Invalid action : " + action); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.INVALID_ACTION)); + return false; + } + + return true; + } + + private void setTimeout(long seconds) { + Log.v(LOG_TAG, "setTimeout: " + seconds); + + mClient = mClient.newBuilder() + .connectTimeout(seconds, TimeUnit.SECONDS) + .readTimeout(seconds, TimeUnit.SECONDS) + .writeTimeout(seconds, TimeUnit.SECONDS) + .build(); + } +} \ No newline at end of file diff --git a/Android/app/src/main/java/com/dergoogler/plugin/TerminalPlugin.java b/Android/app/src/main/java/com/dergoogler/plugin/TerminalPlugin.java index 40818140..081257e4 100644 --- a/Android/app/src/main/java/com/dergoogler/plugin/TerminalPlugin.java +++ b/Android/app/src/main/java/com/dergoogler/plugin/TerminalPlugin.java @@ -2,6 +2,8 @@ import android.util.Log; +import com.topjohnwu.superuser.io.SuFile; + import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.PluginResult; @@ -28,13 +30,14 @@ public boolean execute(String action, JSONArray data, CallbackContext callbackCo case "exec": String cmd = data.getString(0); JSONObject envp = data.getJSONObject(1); + String cwd = data.getString(2); this.terminalCallbackContext = callbackContext; String[] commands = {"su", "-p", "-c", cmd}; cordova.getThreadPool().execute(() -> { try { - run(envp, commands); + run(envp, cwd, commands); callbackContext.error(1); } catch (IOException | JSONException e) { callbackContext.error(0); @@ -53,12 +56,13 @@ public boolean execute(String action, JSONArray data, CallbackContext callbackCo } - public void run(JSONObject envp, String... command) throws IOException, JSONException { + public void run(JSONObject envp, String cwd, String... command) throws IOException, JSONException { ProcessBuilder pb = new ProcessBuilder(command).redirectErrorStream(true); if (envp != null) { Map m = pb.environment(); m.putAll(toMap(envp)); } + pb.directory(new SuFile(cwd)); Process process = pb.start(); try (BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()))) { while (true) { diff --git a/Android/app/src/main/res/drawable/ic_cdv_splashscreen.xml b/Android/app/src/main/res/drawable/ic_cdv_splashscreen.xml new file mode 100644 index 00000000..7bc4107d --- /dev/null +++ b/Android/app/src/main/res/drawable/ic_cdv_splashscreen.xml @@ -0,0 +1,5 @@ + + + diff --git a/Android/app/src/main/res/layout/activity_main.xml b/Android/app/src/main/res/layout/activity_main.xml index 1290d583..e06b4638 100755 --- a/Android/app/src/main/res/layout/activity_main.xml +++ b/Android/app/src/main/res/layout/activity_main.xml @@ -2,7 +2,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:fitsSystemWindows="false" + android:orientation="vertical" tools:context=".MainActivity"> + diff --git a/Android/app/src/main/res/xml/config.xml b/Android/app/src/main/res/xml/config.xml index 25724c8d..a478b11d 100644 --- a/Android/app/src/main/res/xml/config.xml +++ b/Android/app/src/main/res/xml/config.xml @@ -8,17 +8,29 @@ Der_Googler + + + + + + - - - + + + + + + + + + \ No newline at end of file diff --git a/Android/build.gradle b/Android/build.gradle index 679b7406..0b4c0f48 100755 --- a/Android/build.gradle +++ b/Android/build.gradle @@ -8,7 +8,6 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:7.4.2' - classpath "com.github.node-gradle:gradle-node-plugin:3.3.0" } } diff --git a/Android/gradle/wrapper/gradle-wrapper.properties b/Android/gradle/wrapper/gradle-wrapper.properties index 50d6c282..ecb8b44e 100755 --- a/Android/gradle/wrapper/gradle-wrapper.properties +++ b/Android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Jul 18 21:46:42 CEST 2022 +#Sat Jan 27 14:48:14 CET 2024 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/README.md b/README.md index a8b6aa3a..3fdad739 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@

Get it on Google Play Get it on GitHub + Get it on GitHub

@@ -18,7 +19,6 @@ GitHub all releases

- # Summary Introducing Magisk Module Repo Loader (MMRL) - the ultimate module manager for Magisk, KernelSU and APatch on Android. This highly configurable app allows users to manage modules effortlessly, all while being completely free of ads. @@ -34,7 +34,7 @@ Introducing Magisk Module Repo Loader (MMRL) - the ultimate module manager for M - [x] Custom repo loading (Since 1.4.2 mutiple repositories are supported) - [x] Translation - [x] Dark mode -- [x] Themes +- [x] Anti-features (partial, needs improvement) ## Android only @@ -42,8 +42,7 @@ Introducing Magisk Module Repo Loader (MMRL) - the ultimate module manager for M - [x] Remove installed modules - [x] Enable/Disable installed modules - [x] Dynamic module configuration -- [x] Module install -- [x] Monet theming +- [x] Installing modules - [x] Logcat logger ([MMRL Install Tools](https://github.com/Googlers-Repo/mmrl_install_tools) required) ### Root Manager (Android) @@ -63,31 +62,10 @@ Introducing Magisk Module Repo Loader (MMRL) - the ultimate module manager for M

-# Supported `module.prop` properties - -```properties -# Magisk supported properties -id= -name= -version= -versionCode= -author= -description= - -# MMRL supported properties -minKernelSU= - -# Fox's Mmm supported properties -minApi= -maxApi= -minMagisk= -needRamdisk= -support= -donate= -config= -changeBoot= -mmtReborn= -``` +# Documentations + +- [ModFS](https://github.com/DerGoogler/MMRL/tree/master/docs/ModFS.md) +- [ModConf](https://github.com/DerGoogler/MMRL/tree/master/docs/ModConf.md) # Credits & Thanks diff --git a/Website/licensefix.js b/Website/licensefix.js new file mode 100644 index 00000000..38ce641a --- /dev/null +++ b/Website/licensefix.js @@ -0,0 +1,40 @@ +const fs = require("fs"); +const path = require("path"); +const package = require(path.resolve(__dirname, "package.json")); + +const NODE_MODULES_PATH = path.resolve(__dirname, "node_modules"); +const OUTPUT = path.resolve(__dirname, "src", "util", "licenses.json"); +const allDependencies = []; + +Object.keys(package.dependencies).forEach((dependency) => { + const depPackage = require(path.resolve(__dirname, NODE_MODULES_PATH, dependency, "package.json")); + + if (depPackage) { + function getSource() { + if (depPackage.repository) { + return depPackage.repository.url ? depPackage.repository.url : null; + } else { + return null; + } + } + + function getAuthor() { + if (depPackage.author) { + return depPackage.author.name ? depPackage.author.name : null; + } else { + return null; + } + } + + allDependencies.push({ + name: depPackage.name, + author: getAuthor(), + license: depPackage.license, + description: depPackage.description, + version: depPackage.version, + source: `https://www.npmjs.com/package/${depPackage.name}`, + }); + } +}); + +fs.writeFileSync(OUTPUT, JSON.stringify(allDependencies, null, 2)); diff --git a/Website/package-lock.json b/Website/package-lock.json index 5eb2c582..c8aca9e1 100644 --- a/Website/package-lock.json +++ b/Website/package-lock.json @@ -37,7 +37,7 @@ "markdown-to-jsx": "^7.4.0", "marked-react": "^1.1.2", "material-icons": "^1.10.8", - "material-ui-confirm": "^3.0.9", + "material-ui-confirm": "^3.0.10", "monaco-editor": "^0.45.0", "monaco-editor-core": "^0.43.0", "monaco-languageclient": "^6.5.0", @@ -1885,15 +1885,6 @@ "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-editor-service-override/node_modules/@codingame/monaco-vscode-quickaccess-service-override": { - "version": "1.83.16", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-1.83.16.tgz", - "integrity": "sha512-uO1xJKkoI7wvyOT+WvopA3Sehy9yLk5bUi+QAESZbXLhvVMutbl2mO1T0stgC7O3cPOJnNh9xIi/kexW2TswOQ==", - "dependencies": { - "monaco-editor": "0.44.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" - } - }, "node_modules/@codingame/monaco-vscode-editor-service-override/node_modules/monaco-editor": { "version": "0.44.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", @@ -1926,15 +1917,6 @@ "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-environment-service-override/node_modules/@codingame/monaco-vscode-quickaccess-service-override": { - "version": "1.83.16", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-1.83.16.tgz", - "integrity": "sha512-uO1xJKkoI7wvyOT+WvopA3Sehy9yLk5bUi+QAESZbXLhvVMutbl2mO1T0stgC7O3cPOJnNh9xIi/kexW2TswOQ==", - "dependencies": { - "monaco-editor": "0.44.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" - } - }, "node_modules/@codingame/monaco-vscode-environment-service-override/node_modules/monaco-editor": { "version": "0.44.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", @@ -1969,15 +1951,6 @@ "vscode-semver": "npm:semver@=5.5.0" } }, - "node_modules/@codingame/monaco-vscode-extensions-service-override/node_modules/@codingame/monaco-vscode-quickaccess-service-override": { - "version": "1.83.16", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-1.83.16.tgz", - "integrity": "sha512-uO1xJKkoI7wvyOT+WvopA3Sehy9yLk5bUi+QAESZbXLhvVMutbl2mO1T0stgC7O3cPOJnNh9xIi/kexW2TswOQ==", - "dependencies": { - "monaco-editor": "0.44.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" - } - }, "node_modules/@codingame/monaco-vscode-extensions-service-override/node_modules/monaco-editor": { "version": "0.44.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", @@ -2010,15 +1983,6 @@ "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-files-service-override/node_modules/@codingame/monaco-vscode-quickaccess-service-override": { - "version": "1.83.16", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-1.83.16.tgz", - "integrity": "sha512-uO1xJKkoI7wvyOT+WvopA3Sehy9yLk5bUi+QAESZbXLhvVMutbl2mO1T0stgC7O3cPOJnNh9xIi/kexW2TswOQ==", - "dependencies": { - "monaco-editor": "0.44.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" - } - }, "node_modules/@codingame/monaco-vscode-files-service-override/node_modules/monaco-editor": { "version": "0.44.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", @@ -2052,21 +2016,44 @@ "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-languages-service-override/node_modules/@codingame/monaco-vscode-quickaccess-service-override": { + "node_modules/@codingame/monaco-vscode-languages-service-override/node_modules/monaco-editor": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", + "integrity": "sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q==" + }, + "node_modules/@codingame/monaco-vscode-languages-service-override/node_modules/vscode": { + "name": "@codingame/monaco-vscode-api", "version": "1.83.16", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-1.83.16.tgz", - "integrity": "sha512-uO1xJKkoI7wvyOT+WvopA3Sehy9yLk5bUi+QAESZbXLhvVMutbl2mO1T0stgC7O3cPOJnNh9xIi/kexW2TswOQ==", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.83.16.tgz", + "integrity": "sha512-8+jBcXKkvqfx5mVfaUQ+TeORIw2zGRASoKCavZCO/BSpnTCrPVTFyT2HN35+Hwun8eGqoWaNaKYunupLiBZRWg==", + "dependencies": { + "@codingame/monaco-vscode-environment-service-override": "1.83.16", + "@codingame/monaco-vscode-extensions-service-override": "1.83.16", + "@codingame/monaco-vscode-files-service-override": "1.83.16", + "@codingame/monaco-vscode-layout-service-override": "1.83.16", + "@codingame/monaco-vscode-quickaccess-service-override": "1.83.16", + "monaco-editor": "0.44.0", + "vscode-semver": "npm:semver@=5.5.0" + }, + "bin": { + "monaco-treemending": "monaco-treemending.js" + } + }, + "node_modules/@codingame/monaco-vscode-layout-service-override": { + "version": "1.83.16", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-layout-service-override/-/monaco-vscode-layout-service-override-1.83.16.tgz", + "integrity": "sha512-DOHpZVqLP8RVDwQYPP3hDd+LPjxSyBbgPL3Ixd1X9LZSmY37bi95ILOPESqG306h2wQZhPzwNC+E7UNY3P/Ing==", "dependencies": { "monaco-editor": "0.44.0", "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-languages-service-override/node_modules/monaco-editor": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.43.0.tgz", - "integrity": "sha512-cnoqwQi/9fml2Szamv1XbSJieGJ1Dc8tENVMD26Kcfl7xGQWp7OBKMjlwKVGYFJ3/AXJjSOGvcqK7Ry/j9BM1Q==" + "node_modules/@codingame/monaco-vscode-layout-service-override/node_modules/monaco-editor": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", + "integrity": "sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q==" }, - "node_modules/@codingame/monaco-vscode-languages-service-override/node_modules/vscode": { + "node_modules/@codingame/monaco-vscode-layout-service-override/node_modules/vscode": { "name": "@codingame/monaco-vscode-api", "version": "1.83.16", "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.83.16.tgz", @@ -2084,16 +2071,39 @@ "monaco-treemending": "monaco-treemending.js" } }, - "node_modules/@codingame/monaco-vscode-layout-service-override": { + "node_modules/@codingame/monaco-vscode-model-service-override": { "version": "1.83.16", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-layout-service-override/-/monaco-vscode-layout-service-override-1.83.16.tgz", - "integrity": "sha512-DOHpZVqLP8RVDwQYPP3hDd+LPjxSyBbgPL3Ixd1X9LZSmY37bi95ILOPESqG306h2wQZhPzwNC+E7UNY3P/Ing==", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-model-service-override/-/monaco-vscode-model-service-override-1.83.16.tgz", + "integrity": "sha512-uvFxzSdxD+PlJ1B9+qCF4gum/bSaMtzmX7YKenGX27CUviOX3JuQlUeMPHgxFn7VlwUxOgxHR99fCieW6h7Y3w==", "dependencies": { "monaco-editor": "0.44.0", "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-layout-service-override/node_modules/@codingame/monaco-vscode-quickaccess-service-override": { + "node_modules/@codingame/monaco-vscode-model-service-override/node_modules/monaco-editor": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", + "integrity": "sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q==" + }, + "node_modules/@codingame/monaco-vscode-model-service-override/node_modules/vscode": { + "name": "@codingame/monaco-vscode-api", + "version": "1.83.16", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.83.16.tgz", + "integrity": "sha512-8+jBcXKkvqfx5mVfaUQ+TeORIw2zGRASoKCavZCO/BSpnTCrPVTFyT2HN35+Hwun8eGqoWaNaKYunupLiBZRWg==", + "dependencies": { + "@codingame/monaco-vscode-environment-service-override": "1.83.16", + "@codingame/monaco-vscode-extensions-service-override": "1.83.16", + "@codingame/monaco-vscode-files-service-override": "1.83.16", + "@codingame/monaco-vscode-layout-service-override": "1.83.16", + "@codingame/monaco-vscode-quickaccess-service-override": "1.83.16", + "monaco-editor": "0.44.0", + "vscode-semver": "npm:semver@=5.5.0" + }, + "bin": { + "monaco-treemending": "monaco-treemending.js" + } + }, + "node_modules/@codingame/monaco-vscode-quickaccess-service-override": { "version": "1.83.16", "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-1.83.16.tgz", "integrity": "sha512-uO1xJKkoI7wvyOT+WvopA3Sehy9yLk5bUi+QAESZbXLhvVMutbl2mO1T0stgC7O3cPOJnNh9xIi/kexW2TswOQ==", @@ -2102,7 +2112,12 @@ "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-model-service-override/node_modules/vscode": { + "node_modules/@codingame/monaco-vscode-quickaccess-service-override/node_modules/monaco-editor": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", + "integrity": "sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q==" + }, + "node_modules/@codingame/monaco-vscode-quickaccess-service-override/node_modules/vscode": { "name": "@codingame/monaco-vscode-api", "version": "1.83.16", "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.83.16.tgz", @@ -3628,7 +3643,8 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "node_modules/accepts": { "version": "1.3.8", @@ -4042,6 +4058,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4275,6 +4292,7 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, "funding": [ { "type": "github", @@ -4421,7 +4439,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", @@ -5358,6 +5377,7 @@ "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, "engines": { "node": ">= 4.9.1" } @@ -5678,7 +5698,8 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -5750,6 +5771,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5816,7 +5838,8 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, "node_modules/growl": { "version": "1.10.5", @@ -5946,7 +5969,8 @@ "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, "node_modules/hpack.js": { "version": "2.1.6", @@ -6273,6 +6297,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -6487,7 +6512,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/isobject": { "version": "3.0.1", @@ -7014,9 +7040,9 @@ "integrity": "sha512-/2YoaB79IjUK2B2JB+vIXXYGtBfHb/XG66LvoKVM5ykHW7yfrV5SP6d7KLX6iijY6/G9GqwgtPQ/sbhFnOURVA==" }, "node_modules/material-ui-confirm": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/material-ui-confirm/-/material-ui-confirm-3.0.9.tgz", - "integrity": "sha512-WEAEG9z4MfwojoUyQiAjrjl8378tYbGKfiwOKz3zHaQKyXcHnFktUmV7b+F+G0yVo8kYrEMk9Bw+HxhA/2Enlw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/material-ui-confirm/-/material-ui-confirm-3.0.10.tgz", + "integrity": "sha512-+o/9Q1n8YmqG/9pzJvGwbNw4dU1+WABVxaPJsHPmcO5SgK4Ci8WdgYbOIUD4cO4+X5HaPlzr1DhxD8+UTXqstw==", "peerDependencies": { "@mui/material": ">= 5.0.0", "react": "^17.0.0 || ^18.0.0", @@ -7155,6 +7181,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7348,6 +7375,11 @@ } } }, + "node_modules/monaco-languageclient/node_modules/monaco-editor": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", + "integrity": "sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q==" + }, "node_modules/monaco-languageclient/node_modules/vscode": { "name": "@codingame/monaco-vscode-api", "version": "1.83.16", @@ -7374,7 +7406,8 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -7440,6 +7473,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, "dependencies": { "abbrev": "1", "osenv": "^0.1.4" @@ -7452,6 +7486,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -7463,6 +7498,7 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "bin": { "semver": "bin/semver" } @@ -10511,6 +10547,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -10519,6 +10556,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -10527,6 +10565,7 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, "dependencies": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -10656,6 +10695,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -12163,6 +12203,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -12477,6 +12518,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -12485,12 +12527,14 @@ "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -12499,7 +12543,8 @@ "node_modules/spdx-license-ids": { "version": "3.0.16", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true }, "node_modules/spdx-ranges": { "version": "2.1.1", @@ -13378,6 +13423,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -13901,6 +13947,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -14000,8677 +14047,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - } - }, - "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==" - }, - "@babel/core": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", - "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.10", - "@babel/parser": "^7.22.10", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.1" - } - }, - "@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", - "requires": { - "@babel/types": "^7.23.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz", - "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - } - }, - "@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" - }, - "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==" - }, - "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - } - }, - "@babel/helpers": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", - "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", - "requires": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10" - } - }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==" - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", - "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", - "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", - "dev": true, - "requires": { - "@babel/plugin-transform-react-jsx": "^7.22.5" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", - "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/preset-env": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.6.tgz", - "integrity": "sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.4", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.5", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", - "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.23.3", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.23.3" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/standalone": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.23.6.tgz", - "integrity": "sha512-+AzS6BZwZdSosrgS/TiGDYLxtlefARKClWgJ4ql//XfmV9KbPWbkEekvbvDRJ8a6qog8E9j3CziHLz5dbIEMyw==" - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", - "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.5", - "@babel/types": "^7.23.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@codingame/monaco-vscode-languages-service-override": { - "version": "1.82.3", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-languages-service-override/-/monaco-vscode-languages-service-override-1.82.3.tgz", - "integrity": "sha512-iw5lb6f9ZY2jo0T6hwKeYKwOzU+ARcsTU5iDWkHnVYoaUfogSDfBBWOV/K1CmFBoNwSbvbMIv3lm0DE93/wKVw==", - "requires": { - "monaco-editor": "0.43.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.82.3" - }, - "dependencies": { - "vscode": { - "version": "npm:@codingame/monaco-vscode-api@1.82.3", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.82.3.tgz", - "integrity": "sha512-3Z4GQ1A9nnZX1MRiMn1U5jXF1YKqmvHnLsW2zKaeEjS7bW7ZU8yyeOAX5J+KbLiMobTaPlzvZ1h6tuQkWGYMWA==", - "requires": { - "monaco-editor": "0.43.0" - } - } - } - }, - "@codingame/monaco-vscode-model-service-override": { - "version": "1.82.3", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-model-service-override/-/monaco-vscode-model-service-override-1.82.3.tgz", - "integrity": "sha512-PJ+8Yv3cT4Re2jbaPtBuKxY5JQnkorAsJO9nqPOfw6qN7l4F/2t5wP9oLJDrPimzRerfauYwLBlQZ4hLmXIZaw==", - "requires": { - "monaco-editor": "0.43.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.82.3" - }, - "dependencies": { - "vscode": { - "version": "npm:@codingame/monaco-vscode-api@1.82.3", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.82.3.tgz", - "integrity": "sha512-3Z4GQ1A9nnZX1MRiMn1U5jXF1YKqmvHnLsW2zKaeEjS7bW7ZU8yyeOAX5J+KbLiMobTaPlzvZ1h6tuQkWGYMWA==", - "requires": { - "monaco-editor": "0.43.0" - } - } - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "dev": true - }, - "@emotion/babel-plugin": { - "version": "11.9.2", - "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/runtime": "^7.13.10", - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.5", - "@emotion/serialize": "^1.0.2", - "babel-plugin-macros": "^2.6.1", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.0.13" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0" - }, - "source-map": { - "version": "0.5.7" - } - } - }, - "@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "requires": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" - }, - "dependencies": { - "@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - } - } - }, - "@emotion/hash": { - "version": "0.8.0" - }, - "@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", - "requires": { - "@emotion/memoize": "^0.8.1" - }, - "dependencies": { - "@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - } - } - }, - "@emotion/memoize": { - "version": "0.7.5" - }, - "@emotion/react": { - "version": "11.9.3", - "requires": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/cache": "^11.9.3", - "@emotion/serialize": "^1.0.4", - "@emotion/utils": "^1.1.0", - "@emotion/weak-memoize": "^0.2.5", - "hoist-non-react-statics": "^3.3.1" - } - }, - "@emotion/serialize": { - "version": "1.0.4", - "requires": { - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.4", - "@emotion/unitless": "^0.7.5", - "@emotion/utils": "^1.0.0", - "csstype": "^3.0.2" - } - }, - "@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "@emotion/styled": { - "version": "11.9.3", - "requires": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/is-prop-valid": "^1.1.3", - "@emotion/serialize": "^1.0.4", - "@emotion/utils": "^1.1.0" - } - }, - "@emotion/unitless": { - "version": "0.7.5" - }, - "@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "@emotion/weak-memoize": { - "version": "0.2.5" - }, - "@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", - "requires": { - "@floating-ui/utils": "^0.1.3" - } - }, - "@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", - "requires": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" - } - }, - "@floating-ui/react-dom": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", - "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", - "requires": { - "@floating-ui/dom": "^1.5.1" - } - }, - "@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" - }, - "@giscus/react": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@giscus/react/-/react-2.4.0.tgz", - "integrity": "sha512-y8d8qiZ2sBuaXRcgn/ZWfMlRs9bx26p62BU/HEKQQ+IfHo3B/kglgPjX/IqudwlX+DOlHUl1NvtFo9C8Eqo0eQ==", - "requires": { - "giscus": "^1.4.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0" - }, - "@jridgewell/set-array": { - "version": "1.1.2" - }, - "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "@lit-labs/ssr-dom-shim": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.2.tgz", - "integrity": "sha512-jnOD+/+dSrfTWYfSXBXlo5l5f0q1UuJo3tkbMDCYA2lKUYq79jaxqtGEvnRoh049nt1vdo1+45RinipU6FGY2g==" - }, - "@lit/reactive-element": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.2.tgz", - "integrity": "sha512-SVOwLAWUQg3Ji1egtOt1UiFe4zdDpnWHyc5qctSceJ5XIu0Uc76YmGpIjZgx9YJ0XtdW0Jm507sDvjOu+HnB8w==", - "requires": { - "@lit-labs/ssr-dom-shim": "^1.1.2" - } - }, - "@monaco-editor/loader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", - "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", - "requires": { - "state-local": "^1.0.6" - } - }, - "@monaco-editor/react": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", - "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", - "requires": { - "@monaco-editor/loader": "^1.4.0" - } - }, - "@mui/base": { - "version": "5.0.0-beta.29", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.29.tgz", - "integrity": "sha512-OXfUssYrB6ch/xpBVHMKAjThPlI9VyGGKdvQLMXef2j39wXfcxPlUVQlwia/lmE3rxWIGvbwkZsDtNYzLMsDUg==", - "requires": { - "@babel/runtime": "^7.23.6", - "@floating-ui/react-dom": "^2.0.4", - "@mui/types": "^7.2.11", - "@mui/utils": "^5.15.2", - "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - } - }, - "@mui/core-downloads-tracker": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.2.tgz", - "integrity": "sha512-0vk4ckS2w1F5PmkSXSd7F/QuRlNcPqWTJ8CPl+HQRLTIhJVS/VKEI+3dQufOdKfn2wS+ecnvlvXerbugs+xZ8Q==" - }, - "@mui/icons-material": { - "version": "5.8.4", - "requires": { - "@babel/runtime": "^7.17.2" - } - }, - "@mui/lab": { - "version": "5.0.0-alpha.146", - "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.146.tgz", - "integrity": "sha512-azkSNz/F4VAzXdXG1Yu/pdWiMQY8dRpwHycLCQCK7oql5AOVh1pVEmw5+nMT161oc5bOzxBkIsNGPCBwXIZ7Ww==", - "requires": { - "@babel/runtime": "^7.22.15", - "@mui/base": "5.0.0-beta.17", - "@mui/system": "^5.14.11", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.11", - "@mui/x-tree-view": "6.0.0-alpha.1", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - }, - "dependencies": { - "@mui/base": { - "version": "5.0.0-beta.17", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.17.tgz", - "integrity": "sha512-xNbk7iOXrglNdIxFBN0k3ySsPIFLWCnFxqsAYl7CIcDkD9low4kJ7IUuy6ctwx/HAy2fenrT3KXHr1sGjAMgpQ==", - "requires": { - "@babel/runtime": "^7.22.15", - "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.11", - "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - } - } - } - }, - "@mui/material": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.2.tgz", - "integrity": "sha512-JnoIrpNmEHG5uC1IyEdgsnDiaiuCZnUIh7f9oeAr87AvBmNiEJPbo7XrD7kBTFWwp+b97rQ12QdSs9CLhT2n/A==", - "requires": { - "@babel/runtime": "^7.23.6", - "@mui/base": "5.0.0-beta.29", - "@mui/core-downloads-tracker": "^5.15.2", - "@mui/system": "^5.15.2", - "@mui/types": "^7.2.11", - "@mui/utils": "^5.15.2", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.0.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1", - "react-is": "^18.2.0", - "react-transition-group": "^4.4.5" - } - }, - "@mui/private-theming": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.2.tgz", - "integrity": "sha512-KlXx5TH1Mw9omSY+Q6rz5TA/P71meSYaAOeopiW8s6o433+fnOxS17rZbmd1RnDZGCo+j24TfCavQuCMBAZnQA==", - "requires": { - "@babel/runtime": "^7.23.6", - "@mui/utils": "^5.15.2", - "prop-types": "^15.8.1" - } - }, - "@mui/styled-engine": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.2.tgz", - "integrity": "sha512-fYEN3IZzbebeHwAmQHhxwruiOIi8W74709qXg/7tgtHV4byQSmPgnnKsZkg0hFlzjEbcJIRZyZI0qEecgpR2cg==", - "requires": { - "@babel/runtime": "^7.23.6", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" - } - }, - "@mui/system": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.2.tgz", - "integrity": "sha512-I7CzLiHDtU/BTobJgSk+wPGGWG95K8lYfdFEnq//wOgSrLDAdOVvl2gleDxJWO+yAbGz4RKEOnR9KuD+xQZH4A==", - "requires": { - "@babel/runtime": "^7.23.6", - "@mui/private-theming": "^5.15.2", - "@mui/styled-engine": "^5.15.2", - "@mui/types": "^7.2.11", - "@mui/utils": "^5.15.2", - "clsx": "^2.0.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" - } - }, - "@mui/types": { - "version": "7.2.11", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.11.tgz", - "integrity": "sha512-KWe/QTEsFFlFSH+qRYf3zoFEj3z67s+qAuSnMMg+gFwbxG7P96Hm6g300inQL1Wy///gSRb8juX7Wafvp93m3w==", - "requires": {} - }, - "@mui/utils": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.2.tgz", - "integrity": "sha512-6dGM9/guFKBlFRHA7/mbM+E7wE7CYDy9Ny4JLtD3J+NTyhi8nd8YxlzgAgTaTVqY0BpdQ2zdfB/q6+p2EdGM0w==", - "requires": { - "@babel/runtime": "^7.23.6", - "@types/prop-types": "^15.7.11", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" - } - }, - "@mui/x-tree-view": { - "version": "6.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-6.0.0-alpha.1.tgz", - "integrity": "sha512-JUG3HmBrmGEALbCFg1b+i7h726e1dWYZs4db3syO1j+Q++E3nbvE4Lehp5yGTFm+8esH0Tny50tuJaa4WX6VSA==", - "requires": { - "@babel/runtime": "^7.22.6", - "@mui/utils": "^5.14.3", - "@types/react-transition-group": "^4.4.6", - "clsx": "^2.0.0", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - } - }, - "@nyariv/sandboxjs": { - "version": "0.8.23", - "resolved": "https://registry.npmjs.org/@nyariv/sandboxjs/-/sandboxjs-0.8.23.tgz", - "integrity": "sha512-OaD3i0czFTZzQFQdwgFVEqNyZVK19N6Jzmx/LjmDc+kiV751FQ2h3xscYkAeY4jfau2vZTZau+xR8fpkKrv/Ng==" - }, - "@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" - }, - "@primer/octicons-react": { - "version": "19.4.0", - "resolved": "https://registry.npmjs.org/@primer/octicons-react/-/octicons-react-19.4.0.tgz", - "integrity": "sha512-6zFbvbQYQdGd9cIgNscnofSe0LkV28PvcL4mWPoKFV1u7Mdn3MlOjgawzuA2oXB18LLkMadTJ4Ky77FybUlrBg==", - "requires": {} - }, - "@remix-run/router": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz", - "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==" - }, - "@tootallnate/once": { - "version": "1.1.2", - "dev": true - }, - "@trysound/sax": { - "version": "0.2.0", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", - "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", - "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__standalone": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/@types/babel__standalone/-/babel__standalone-7.1.7.tgz", - "integrity": "sha512-4RUJX9nWrP/emaZDzxo/+RYW8zzLJTXWJyp2k78HufG459HCz754hhmSymt3VFOU6/Wy+IZqfPvToHfLuGOr7w==", - "dev": true, - "requires": { - "@types/babel__core": "^7.1.0" - } - }, - "@types/babel__template": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", - "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", - "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "8.4.5", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/fs-extra": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", - "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", - "dev": true, - "requires": { - "@types/jsonfile": "*", - "@types/node": "*" - } - }, - "@types/hast": { - "version": "2.3.4", - "requires": { - "@types/unist": "*" - } - }, - "@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/ini": { - "version": "1.3.33", - "resolved": "https://registry.npmjs.org/@types/ini/-/ini-1.3.33.tgz", - "integrity": "sha512-YZDzdPTDxy084i5eVxUKfAHLenhAMVHupzCIg1dzFJNs6xp/UGyWk+8Lp1YxoZH+Hvv7C9OcHEDPndSMwaPVsQ==", - "dev": true - }, - "@types/jsdom": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.15.tgz", - "integrity": "sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==", - "requires": { - "@types/node": "*", - "@types/parse5": "^6.0.3", - "@types/tough-cookie": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "dev": true - }, - "@types/jsonfile": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", - "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "@types/node": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz", - "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==" - }, - "@types/object-assign": { - "version": "4.0.30", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0" - }, - "@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" - }, - "@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/react": { - "version": "18.2.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.8.tgz", - "integrity": "sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.0.6", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/react-onsenui": { - "version": "2.9.18", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/react-syntax-highlighter": { - "version": "15.5.8", - "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.8.tgz", - "integrity": "sha512-GT1PLGzhF3ilGaQiCHFDShxDBb014s01MQi0nWfXJ23efjWfUrZ2i0g4tH1JGdfnIGBtQDge/k3ON3fLoAuU/w==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", - "requires": { - "@types/react": "*" - } - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "@types/scheduler": { - "version": "0.16.2" - }, - "@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "dev": true, - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/source-list-map": { - "version": "0.1.2", - "dev": true - }, - "@types/tapable": { - "version": "1.0.8", - "dev": true - }, - "@types/tough-cookie": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", - "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==" - }, - "@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" - }, - "@types/uglify-js": { - "version": "3.16.0", - "dev": true, - "requires": { - "source-map": "^0.6.1" - } - }, - "@types/uglifyjs-webpack-plugin": { - "version": "1.1.2", - "dev": true, - "requires": { - "@types/webpack": "^4" - }, - "dependencies": { - "@types/webpack": { - "version": "4.41.32", - "dev": true, - "requires": { - "@types/node": "*", - "@types/tapable": "^1", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "anymatch": "^3.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "@types/underscore": { - "version": "1.11.15", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.15.tgz", - "integrity": "sha512-HP38xE+GuWGlbSRq9WrZkousaQ7dragtZCruBVMi0oX1migFZavZ3OROKHSkNp/9ouq82zrWtZpg18jFnVN96g==", - "dev": true - }, - "@types/unist": { - "version": "2.0.6" - }, - "@types/webpack": { - "version": "5.28.5", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.5.tgz", - "integrity": "sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==", - "dev": true, - "requires": { - "@types/node": "*", - "tapable": "^2.2.0", - "webpack": "^5" - } - }, - "@types/webpack-sources": { - "version": "3.2.0", - "dev": true, - "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.4", - "dev": true - } - } - }, - "@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@wasmer/wasmfs": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@wasmer/wasmfs/-/wasmfs-0.12.0.tgz", - "integrity": "sha512-m1ftchyQ1DfSenm5XbbdGIpb6KJHH5z0gODo3IZr6lATkj4WXfX/UeBTZ0aG9YVShBp+kHLdUHvOkqjy6p/GWw==", - "requires": { - "memfs": "3.0.4", - "pako": "^1.0.11", - "tar-stream": "^2.1.0" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "1.2.0", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "1.5.0", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.7.0", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "ace-builds": { - "version": "1.32.2", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.32.2.tgz", - "integrity": "sha512-mnJAc803p+7eeDt07r6XI7ufV7VdkpPq4gJZT8Jb3QsowkaBTVy4tdBgPrVT0WbXLm0toyEQXURKSVNj/7dfJQ==" - }, - "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" - }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==" - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansi-to-react": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/ansi-to-react/-/ansi-to-react-6.1.6.tgz", - "integrity": "sha512-+HWn72GKydtupxX9TORBedqOMsJRiKTqaLUKW8txSBZw9iBpzPKLI8KOu4WzwD4R7hSv1zEspobY6LwlWvwZ6Q==", - "requires": { - "anser": "^1.4.1", - "escape-carriage": "^1.3.0" - } - }, - "anymatch": { - "version": "3.1.2", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-find-index": { - "version": "1.0.2", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "asap": { - "version": "2.0.6", - "dev": true - }, - "asynckit": { - "version": "0.4.0" - }, - "axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dev": true, - "requires": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - } - }, - "babel-plugin-macros": { - "version": "2.8.0", - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "yaml": { - "version": "1.10.2" - } - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", - "semver": "^6.3.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", - "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.32.2" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3" - } - }, - "balanced-match": { - "version": "1.0.2" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "dev": true, - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "dev": true - }, - "browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "requires": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-from": { - "version": "1.1.2", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0" - }, - "caniuse-api": { - "version": "3.0.0", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==" - }, - "chalk": { - "version": "2.4.2", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0" - }, - "supports-color": { - "version": "5.5.0", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "character-entities": { - "version": "1.2.4" - }, - "character-entities-legacy": { - "version": "1.1.4" - }, - "character-reference-invalid": { - "version": "1.1.4" - }, - "chokidar": { - "version": "3.5.3", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" - }, - "color-convert": { - "version": "1.9.3", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3" - }, - "colord": { - "version": "2.9.2", - "dev": true - }, - "colorette": { - "version": "2.0.19", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "comma-separated-tokens": { - "version": "1.0.8" - }, - "commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", - "dev": true - }, - "common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "dev": true - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "core-js": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz", - "integrity": "sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==" - }, - "core-js-compat": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", - "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", - "dev": true, - "requires": { - "browserslist": "^4.22.1" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "requires": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "create-require": { - "version": "1.1.1", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-declaration-sorter": { - "version": "6.3.0", - "dev": true, - "requires": {} - }, - "css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "css-minimizer-webpack-plugin": { - "version": "4.0.0", - "dev": true, - "requires": { - "cssnano": "^5.1.8", - "jest-worker": "^27.5.1", - "postcss": "^8.4.13", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - } - }, - "css-select": { - "version": "4.3.0", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "dev": true - }, - "cssnano": { - "version": "5.1.12", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.12", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "dependencies": { - "yaml": { - "version": "1.10.2", - "dev": true - } - } - }, - "cssnano-preset-default": { - "version": "5.2.12", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.3.0", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "dev": true, - "requires": {} - }, - "csso": { - "version": "4.2.0", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "debug": { - "version": "4.3.4", - "requires": { - "ms": "2.1.2" - } - }, - "debuglog": { - "version": "1.0.1", - "dev": true - }, - "default-composer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/default-composer/-/default-composer-0.6.0.tgz", - "integrity": "sha512-icLwAqlLJUAhLCPN9jBntg3B70VWWisLoayrPQThriuKCUmdj0k/UdUXmjzfHs9YT4j61EroqYsYG9nqeiGc8Q==" - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "requires": { - "execa": "^5.0.0" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "dezalgo": { - "version": "1.0.4", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "4.0.2", - "dev": true - }, - "diff-match-patch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==" - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", - "dev": true, - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "dom-serializer": { - "version": "1.4.1", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.610", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.610.tgz", - "integrity": "sha512-mqi2oL1mfeHYtOdCxbPQYV/PL7YrQlxbvFEZ0Ee8GbDdShimqt2/S6z2RWqysuvlwdOrQdqvE0KZrBTipAeJzg==" - }, - "emojis-list": { - "version": "3.0.0", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "2.2.0", - "dev": true - }, - "envinfo": { - "version": "7.8.1", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "eruda": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eruda/-/eruda-3.0.0.tgz", - "integrity": "sha512-6L8A8aBHOQv0rqeBlNdJEl/hl6OAdLVRtJlVmBIlIJ6Fe1a92HFXO58jHLC0vFyuKV0deTjYjRaWwLo9lJ9K9A==" - }, - "es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "es6-promise": { - "version": "4.2.8", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-carriage": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.1.tgz", - "integrity": "sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5" - }, - "eslint-scope": { - "version": "5.1.1", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "dev": true - }, - "esrecurse": { - "version": "4.3.0", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3" - }, - "fast-extend": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fast-extend/-/fast-extend-1.0.2.tgz", - "integrity": "sha512-XXA9RmlPatkFKUzqVZAFth18R4Wo+Xug/S+C7YlYA3xrXwfPlW3dqNwOb4hvQo7wZJ2cNDYhrYuPzVOfHy5/uQ==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.12", - "dev": true - }, - "fault": { - "version": "1.0.4", - "requires": { - "format": "^0.2.0" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "file-loader": { - "version": "6.2.0", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "fill-range": { - "version": "7.0.1", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "requires": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "dependencies": { - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "requires": { - "p-locate": "^6.0.0" - } - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "requires": { - "p-limit": "^4.0.0" - } - }, - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true - }, - "pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "requires": { - "find-up": "^6.3.0" - } - } - } - }, - "find-root": { - "version": "1.1.0" - }, - "find-up": { - "version": "4.1.0", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flatlist-react": { - "version": "1.5.14", - "resolved": "https://registry.npmjs.org/flatlist-react/-/flatlist-react-1.5.14.tgz", - "integrity": "sha512-TxwnFJk06Ic637L6GexiFFJrqxcBxZL5nnZTI/yDZZ5mYN6ysLiiz9Lz6ksEmF8e63DuDrR5l/cGrz/JuUh/MA==", - "requires": {} - }, - "follow-redirects": { - "version": "1.15.1" - }, - "form-data": { - "version": "4.0.0", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "format": { - "version": "0.2.2" - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "framer-motion": { - "version": "10.16.4", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.4.tgz", - "integrity": "sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==", - "requires": { - "@emotion/is-prop-valid": "^0.8.2", - "tslib": "^2.4.0" - }, - "dependencies": { - "@emotion/is-prop-valid": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", - "optional": true, - "requires": { - "@emotion/memoize": "0.7.4" - } - }, - "@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", - "optional": true - } - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" - }, - "fs.realpath": { - "version": "1.0.0", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1" - }, - "gensync": { - "version": "1.0.0-beta.2" - }, - "get-intrinsic": { - "version": "1.1.2", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "giscus": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/giscus/-/giscus-1.4.0.tgz", - "integrity": "sha512-Pll+pcclTx47NcFDw8nuka2Ja85Gc4XWpzSgL0rszOQaMQRQIV8UMR+zP4a+/N3tV2TXc1SZ537kWlsN6EsAaw==", - "requires": { - "lit": "^3.1.0" - } - }, - "glob": { - "version": "7.2.3", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "dev": true - }, - "globals": { - "version": "11.12.0" - }, - "googlers-tools": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/googlers-tools/-/googlers-tools-1.4.5.tgz", - "integrity": "sha512-8mlIAb/X7zA4TD/s30au+Urb8iJpieKUoGpJ8tBorJDFEYhWd1F4AcLkiB6Rk+z9ji/8CMh0kiTP6Uose9yywA==", - "requires": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "dev": true - }, - "growl": { - "version": "1.10.5", - "dev": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "has": { - "version": "1.0.3", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "dev": true - }, - "hast-util-parse-selector": { - "version": "2.2.5" - }, - "hastscript": { - "version": "6.0.0", - "requires": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "he": { - "version": "1.1.1", - "dev": true - }, - "highlight.js": { - "version": "11.6.0" - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "requires": { - "react-is": "^16.7.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1" - } - } - }, - "hosted-git-info": { - "version": "2.8.9", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } - } - }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "dev": true, - "requires": {} - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, - "immutable": { - "version": "4.1.0", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4" - }, - "ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==" - }, - "install": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", - "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==" - }, - "interpret": { - "version": "2.2.0", - "dev": true - }, - "ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "dev": true - }, - "is-alphabetical": { - "version": "1.0.4" - }, - "is-alphanumerical": { - "version": "1.0.4", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1" - }, - "is-binary-path": { - "version": "2.1.0", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.9.0", - "requires": { - "has": "^1.0.3" - } - }, - "is-decimal": { - "version": "1.0.4" - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "1.0.4" - }, - "is-number": { - "version": "7.0.0", - "dev": true - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "dev": true - }, - "javascript-stringify": { - "version": "2.1.0", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0" - }, - "js-yaml": { - "version": "3.14.1", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "js-yaml-loader": { - "version": "1.2.2", - "dev": true, - "requires": { - "js-yaml": "^3.13.1", - "loader-utils": "^1.2.3", - "un-eval": "^1.2.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "jsesc": { - "version": "2.5.2" - }, - "json-parse-even-better-errors": { - "version": "2.3.1" - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "kind-of": { - "version": "6.0.3", - "dev": true - }, - "klona": { - "version": "2.0.5", - "dev": true - }, - "launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", - "dev": true, - "requires": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" - } - }, - "license-checker": { - "version": "25.0.1", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "debug": "^3.1.0", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "read-installed": "~4.0.3", - "semver": "^5.5.0", - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0", - "spdx-satisfies": "^4.0.0", - "treeify": "^1.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "dev": true - }, - "semver": { - "version": "5.7.1", - "dev": true - } - } - }, - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", - "requires": { - "immediate": "~3.0.5" - } - }, - "lilconfig": { - "version": "2.0.5", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4" - }, - "lit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.0.tgz", - "integrity": "sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==", - "requires": { - "@lit/reactive-element": "^2.0.0", - "lit-element": "^4.0.0", - "lit-html": "^3.1.0" - } - }, - "lit-element": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.2.tgz", - "integrity": "sha512-/W6WQZUa5VEXwC7H9tbtDMdSs9aWil3Ou8hU6z2cOKWbsm/tXPAcsoaHVEtrDo0zcOIE5GF6QgU55tlGL2Nihg==", - "requires": { - "@lit-labs/ssr-dom-shim": "^1.1.2", - "@lit/reactive-element": "^2.0.0", - "lit-html": "^3.1.0" - } - }, - "lit-html": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.0.tgz", - "integrity": "sha512-FwAjq3iNsaO6SOZXEIpeROlJLUlrbyMkn4iuv4f4u1H40Jw8wkeR/OUXZUHUoiYabGk8Y4Y0F/rgq+R4MrOLmA==", - "requires": { - "@types/trusted-types": "^2.0.2" - } - }, - "loader-runner": { - "version": "4.3.0", - "dev": true - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "localforage": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", - "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "requires": { - "lie": "3.1.1" - } - }, - "localized-strings": { - "version": "0.2.4" - }, - "locate-path": { - "version": "5.0.0", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "lodash.memoize": { - "version": "4.1.2", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowlight": { - "version": "1.20.0", - "requires": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" - }, - "dependencies": { - "highlight.js": { - "version": "10.7.3" - } - } - }, - "lru-cache": { - "version": "6.0.0", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "dev": true - }, - "markdown-to-jsx": { - "version": "7.1.7", - "requires": {} - }, - "marked": { - "version": "4.0.17" - }, - "marked-react": { - "version": "1.1.2", - "requires": { - "marked": "^4.0.12" - } - }, - "material-icons": { - "version": "1.11.4" - }, - "material-ui-confirm": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/material-ui-confirm/-/material-ui-confirm-3.0.9.tgz", - "integrity": "sha512-WEAEG9z4MfwojoUyQiAjrjl8378tYbGKfiwOKz3zHaQKyXcHnFktUmV7b+F+G0yVo8kYrEMk9Bw+HxhA/2Enlw==", - "requires": {} - }, - "mdn-data": { - "version": "2.0.14", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "memfs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.0.4.tgz", - "integrity": "sha512-OcZEzwX9E5AoY8SXjuAvw0DbIAYwUzV/I236I8Pqvrlv7sL/Y0E9aRCon05DhaV8pg1b32uxj76RgW0s5xjHBA==", - "requires": { - "fast-extend": "1.0.2", - "fs-monkey": "0.3.3" - }, - "dependencies": { - "fs-monkey": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-0.3.3.tgz", - "integrity": "sha512-FNUvuTAJ3CqCQb5ELn+qCbGR/Zllhf2HtwsdAtBi59s1WeCjKMT81fHcSu7dwIskqGVK+MmOrb7VOBlq3/SItw==" - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0" - }, - "mime-types": { - "version": "2.1.35", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "2.6.1", - "dev": true, - "requires": { - "schema-utils": "^4.0.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "mocha": { - "version": "5.2.0", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "dev": true - }, - "debug": { - "version": "3.1.0", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "diff": { - "version": "3.5.0", - "dev": true - }, - "glob": { - "version": "7.1.2", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "minimatch": { - "version": "3.0.8", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "monaco-editor": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.43.0.tgz", - "integrity": "sha512-cnoqwQi/9fml2Szamv1XbSJieGJ1Dc8tENVMD26Kcfl7xGQWp7OBKMjlwKVGYFJ3/AXJjSOGvcqK7Ry/j9BM1Q==" - }, - "monaco-editor-core": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/monaco-editor-core/-/monaco-editor-core-0.43.0.tgz", - "integrity": "sha512-u+JeEanDWs9gc2+dfV/nVyerpc4r8uzoCqrUd9s1iKLAzoD0myMsWjkZaPufZd8HcGhCxRVsS7w30bSa2GVWmA==" - }, - "monaco-languageclient": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/monaco-languageclient/-/monaco-languageclient-6.5.0.tgz", - "integrity": "sha512-YMH2zjWmXMSPVy/gA4z/DxYgNY9yHqjAtYwmdtIGV+TIYlGwoVrpYTLtsgOgxLsNNNwkUb/MN5TQptRaP6qcDg==", - "requires": { - "@codingame/monaco-vscode-languages-service-override": "~1.82.2", - "@codingame/monaco-vscode-model-service-override": "~1.82.2", - "monaco-editor": "~0.43.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.82.2", - "vscode-jsonrpc": "~8.1.0", - "vscode-languageclient": "~8.1.0" - }, - "dependencies": { - "vscode": { - "version": "npm:@codingame/monaco-vscode-api@1.82.2", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.82.2.tgz", - "integrity": "sha512-DbNeOw3VbTKgHUqtnS3xP2/qo43mnNfnadntJT5kAf3EpRsI9r76cQ7+d3fE4SXag89yANm4T48S1nJ5yjU8iA==", - "requires": { - "monaco-editor": "0.43.0" - } - } - } - }, - "mousetrap": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", - "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" - }, - "ms": { - "version": "2.1.2" - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "dev": true - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true - }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "nopt": { - "version": "4.0.3", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "dev": true - }, - "npm": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-9.8.0.tgz", - "integrity": "sha512-AXeiBAdfM5K2jvBwA7EGLKeYyt0VnhmJRnlq4k2+M0Ao9v7yKJBqF8xFPzQL8kAybzwlfpTPCZwM4uTIszb3xA==", - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.3.0", - "@npmcli/config": "^6.2.1", - "@npmcli/map-workspaces": "^3.0.4", - "@npmcli/package-json": "^4.0.0", - "@npmcli/run-script": "^6.0.2", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^17.1.3", - "chalk": "^5.2.0", - "ci-info": "^3.8.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.2", - "glob": "^10.2.7", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^6.1.1", - "ini": "^4.1.1", - "init-package-json": "^5.0.0", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^3.0.0", - "libnpmaccess": "^7.0.2", - "libnpmdiff": "^5.0.19", - "libnpmexec": "^6.0.2", - "libnpmfund": "^4.0.19", - "libnpmhook": "^9.0.3", - "libnpmorg": "^5.0.4", - "libnpmpack": "^5.0.19", - "libnpmpublish": "^7.5.0", - "libnpmsearch": "^6.0.2", - "libnpmteam": "^5.0.3", - "libnpmversion": "^4.0.2", - "make-fetch-happen": "^11.1.1", - "minimatch": "^9.0.0", - "minipass": "^5.0.0", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^9.4.0", - "nopt": "^7.2.0", - "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.1.1", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-profile": "^7.0.1", - "npm-registry-fetch": "^14.0.5", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^15.2.0", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^2.1.0", - "semver": "^7.5.2", - "sigstore": "^1.7.0", - "ssri": "^10.0.4", - "supports-color": "^9.3.1", - "tar": "^6.1.15", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^3.0.1", - "write-file-atomic": "^5.0.1" - }, - "dependencies": { - "@colors/colors": { - "version": "1.5.0", - "bundled": true, - "optional": true - }, - "@isaacs/cliui": { - "version": "8.0.2", - "bundled": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "bundled": true - }, - "emoji-regex": { - "version": "9.2.2", - "bundled": true - }, - "string-width": { - "version": "5.1.2", - "bundled": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "bundled": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "@isaacs/string-locale-compare": { - "version": "1.1.0", - "bundled": true - }, - "@npmcli/arborist": { - "version": "6.3.0", - "bundled": true, - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^4.0.0", - "@npmcli/query": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "bin-links": "^4.0.1", - "cacache": "^17.0.4", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^9.0.0", - "nopt": "^7.0.0", - "npm-install-checks": "^6.0.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.1", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - } - }, - "@npmcli/config": { - "version": "6.2.1", - "bundled": true, - "requires": { - "@npmcli/map-workspaces": "^3.0.2", - "ci-info": "^3.8.0", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - } - }, - "@npmcli/disparity-colors": { - "version": "3.0.0", - "bundled": true, - "requires": { - "ansi-styles": "^4.3.0" - } - }, - "@npmcli/fs": { - "version": "3.1.0", - "bundled": true, - "requires": { - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "4.1.0", - "bundled": true, - "requires": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - } - }, - "@npmcli/installed-package-contents": { - "version": "2.0.2", - "bundled": true, - "requires": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "@npmcli/map-workspaces": { - "version": "3.0.4", - "bundled": true, - "requires": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - } - }, - "@npmcli/metavuln-calculator": { - "version": "5.0.1", - "bundled": true, - "requires": { - "cacache": "^17.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^15.0.0", - "semver": "^7.3.5" - } - }, - "@npmcli/name-from-folder": { - "version": "2.0.0", - "bundled": true - }, - "@npmcli/node-gyp": { - "version": "3.0.0", - "bundled": true - }, - "@npmcli/package-json": { - "version": "4.0.0", - "bundled": true, - "requires": { - "@npmcli/git": "^4.1.0", - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.1", - "proc-log": "^3.0.0" - } - }, - "@npmcli/promise-spawn": { - "version": "6.0.2", - "bundled": true, - "requires": { - "which": "^3.0.0" - } - }, - "@npmcli/query": { - "version": "3.0.0", - "bundled": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "@npmcli/run-script": { - "version": "6.0.2", - "bundled": true, - "requires": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "bundled": true, - "optional": true - }, - "@sigstore/protobuf-specs": { - "version": "0.1.0", - "bundled": true - }, - "@sigstore/tuf": { - "version": "1.0.2", - "bundled": true, - "requires": { - "@sigstore/protobuf-specs": "^0.1.0", - "tuf-js": "^1.1.7" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "bundled": true - }, - "@tufjs/canonical-json": { - "version": "1.0.0", - "bundled": true - }, - "@tufjs/models": { - "version": "1.0.4", - "bundled": true, - "requires": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - } - }, - "abbrev": { - "version": "2.0.0", - "bundled": true - }, - "abort-controller": { - "version": "3.0.0", - "bundled": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "agent-base": { - "version": "6.0.2", - "bundled": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.3.0", - "bundled": true, - "requires": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "bundled": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "bundled": true - }, - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "2.0.0", - "bundled": true - }, - "archy": { - "version": "1.0.0", - "bundled": true - }, - "are-we-there-yet": { - "version": "4.0.0", - "bundled": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true - }, - "base64-js": { - "version": "1.5.1", - "bundled": true - }, - "bin-links": { - "version": "4.0.1", - "bundled": true, - "requires": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "bundled": true - }, - "brace-expansion": { - "version": "2.0.1", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "buffer": { - "version": "6.0.3", - "bundled": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "builtins": { - "version": "5.0.1", - "bundled": true, - "requires": { - "semver": "^7.0.0" - } - }, - "cacache": { - "version": "17.1.3", - "bundled": true, - "requires": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - } - }, - "chalk": { - "version": "5.2.0", - "bundled": true - }, - "chownr": { - "version": "2.0.0", - "bundled": true - }, - "ci-info": { - "version": "3.8.0", - "bundled": true - }, - "cidr-regex": { - "version": "3.1.1", - "bundled": true, - "requires": { - "ip-regex": "^4.1.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "bundled": true - }, - "cli-columns": { - "version": "4.0.0", - "bundled": true, - "requires": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "cli-table3": { - "version": "0.6.3", - "bundled": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "clone": { - "version": "1.0.4", - "bundled": true - }, - "cmd-shim": { - "version": "6.0.1", - "bundled": true - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true - }, - "color-support": { - "version": "1.1.3", - "bundled": true - }, - "columnify": { - "version": "1.6.0", - "bundled": true, - "requires": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - } - }, - "common-ancestor-path": { - "version": "1.0.1", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "cross-spawn": { - "version": "7.0.3", - "bundled": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "bundled": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "cssesc": { - "version": "3.0.0", - "bundled": true - }, - "debug": { - "version": "4.3.4", - "bundled": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "bundled": true - } - } - }, - "defaults": { - "version": "1.0.4", - "bundled": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delegates": { - "version": "1.0.0", - "bundled": true - }, - "depd": { - "version": "2.0.0", - "bundled": true - }, - "diff": { - "version": "5.1.0", - "bundled": true - }, - "eastasianwidth": { - "version": "0.2.0", - "bundled": true - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true - }, - "encoding": { - "version": "0.1.13", - "bundled": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "env-paths": { - "version": "2.2.1", - "bundled": true - }, - "err-code": { - "version": "2.0.3", - "bundled": true - }, - "event-target-shim": { - "version": "5.0.1", - "bundled": true - }, - "events": { - "version": "3.3.0", - "bundled": true - }, - "exponential-backoff": { - "version": "3.1.1", - "bundled": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "bundled": true - }, - "foreground-child": { - "version": "3.1.1", - "bundled": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - } - }, - "fs-minipass": { - "version": "3.0.2", - "bundled": true, - "requires": { - "minipass": "^5.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "function-bind": { - "version": "1.1.1", - "bundled": true - }, - "gauge": { - "version": "5.0.1", - "bundled": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "glob": { - "version": "10.2.7", - "bundled": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "bundled": true - }, - "has": { - "version": "1.0.3", - "bundled": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true - }, - "hosted-git-info": { - "version": "6.1.1", - "bundled": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "bundled": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "bundled": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "bundled": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "bundled": true - }, - "ignore-walk": { - "version": "6.0.3", - "bundled": true, - "requires": { - "minimatch": "^9.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true - }, - "indent-string": { - "version": "4.0.0", - "bundled": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true - }, - "ini": { - "version": "4.1.1", - "bundled": true - }, - "init-package-json": { - "version": "5.0.0", - "bundled": true, - "requires": { - "npm-package-arg": "^10.0.0", - "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - } - }, - "ip": { - "version": "2.0.0", - "bundled": true - }, - "ip-regex": { - "version": "4.3.0", - "bundled": true - }, - "is-cidr": { - "version": "4.0.2", - "bundled": true, - "requires": { - "cidr-regex": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.12.1", - "bundled": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true - }, - "is-lambda": { - "version": "1.0.1", - "bundled": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true - }, - "jackspeak": { - "version": "2.2.1", - "bundled": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "json-parse-even-better-errors": { - "version": "3.0.0", - "bundled": true - }, - "json-stringify-nice": { - "version": "1.1.4", - "bundled": true - }, - "jsonparse": { - "version": "1.3.1", - "bundled": true - }, - "just-diff": { - "version": "6.0.2", - "bundled": true - }, - "just-diff-apply": { - "version": "5.5.0", - "bundled": true - }, - "libnpmaccess": { - "version": "7.0.2", - "bundled": true, - "requires": { - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmdiff": { - "version": "5.0.19", - "bundled": true, - "requires": { - "@npmcli/arborist": "^6.3.0", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^9.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8", - "tar": "^6.1.13" - } - }, - "libnpmexec": { - "version": "6.0.2", - "bundled": true, - "requires": { - "@npmcli/arborist": "^6.3.0", - "@npmcli/run-script": "^6.0.0", - "ci-info": "^3.7.1", - "npm-package-arg": "^10.1.0", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "proc-log": "^3.0.0", - "read": "^2.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - } - }, - "libnpmfund": { - "version": "4.0.19", - "bundled": true, - "requires": { - "@npmcli/arborist": "^6.3.0" - } - }, - "libnpmhook": { - "version": "9.0.3", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmorg": { - "version": "5.0.4", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmpack": { - "version": "5.0.19", - "bundled": true, - "requires": { - "@npmcli/arborist": "^6.3.0", - "@npmcli/run-script": "^6.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8" - } - }, - "libnpmpublish": { - "version": "7.5.0", - "bundled": true, - "requires": { - "ci-info": "^3.6.1", - "normalize-package-data": "^5.0.0", - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^1.4.0", - "ssri": "^10.0.1" - } - }, - "libnpmsearch": { - "version": "6.0.2", - "bundled": true, - "requires": { - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmteam": { - "version": "5.0.3", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmversion": { - "version": "4.0.2", - "bundled": true, - "requires": { - "@npmcli/git": "^4.0.1", - "@npmcli/run-script": "^6.0.0", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7" - } - }, - "lru-cache": { - "version": "7.18.3", - "bundled": true - }, - "make-fetch-happen": { - "version": "11.1.1", - "bundled": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "minimatch": { - "version": "9.0.1", - "bundled": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "5.0.0", - "bundled": true - }, - "minipass-collect": { - "version": "1.0.2", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-fetch": { - "version": "3.0.3", - "bundled": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "bundled": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-sized": { - "version": "1.0.3", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minizlib": { - "version": "2.1.2", - "bundled": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "bundled": true - }, - "ms": { - "version": "2.1.3", - "bundled": true - }, - "mute-stream": { - "version": "1.0.0", - "bundled": true - }, - "negotiator": { - "version": "0.6.3", - "bundled": true - }, - "node-gyp": { - "version": "9.4.0", - "bundled": true, - "requires": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true - }, - "are-we-there-yet": { - "version": "3.0.1", - "bundled": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "gauge": { - "version": "4.0.4", - "bundled": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "nopt": { - "version": "6.0.0", - "bundled": true, - "requires": { - "abbrev": "^1.0.0" - } - }, - "npmlog": { - "version": "6.0.2", - "bundled": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "bundled": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "signal-exit": { - "version": "3.0.7", - "bundled": true - }, - "which": { - "version": "2.0.2", - "bundled": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "nopt": { - "version": "7.2.0", - "bundled": true, - "requires": { - "abbrev": "^2.0.0" - } - }, - "normalize-package-data": { - "version": "5.0.0", - "bundled": true, - "requires": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "npm-audit-report": { - "version": "5.0.0", - "bundled": true - }, - "npm-bundled": { - "version": "3.0.0", - "bundled": true, - "requires": { - "npm-normalize-package-bin": "^3.0.0" - } - }, - "npm-install-checks": { - "version": "6.1.1", - "bundled": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "3.0.1", - "bundled": true - }, - "npm-package-arg": { - "version": "10.1.0", - "bundled": true, - "requires": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - } - }, - "npm-packlist": { - "version": "7.0.4", - "bundled": true, - "requires": { - "ignore-walk": "^6.0.0" - } - }, - "npm-pick-manifest": { - "version": "8.0.1", - "bundled": true, - "requires": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - } - }, - "npm-profile": { - "version": "7.0.1", - "bundled": true, - "requires": { - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0" - } - }, - "npm-registry-fetch": { - "version": "14.0.5", - "bundled": true, - "requires": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - } - }, - "npm-user-validate": { - "version": "2.0.0", - "bundled": true - }, - "npmlog": { - "version": "7.0.1", - "bundled": true, - "requires": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "p-map": { - "version": "4.0.0", - "bundled": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "pacote": { - "version": "15.2.0", - "bundled": true, - "requires": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - } - }, - "parse-conflict-json": { - "version": "3.0.1", - "bundled": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "path-key": { - "version": "3.1.1", - "bundled": true - }, - "path-scurry": { - "version": "1.9.2", - "bundled": true, - "requires": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" - }, - "dependencies": { - "lru-cache": { - "version": "9.1.1", - "bundled": true - } - } - }, - "postcss-selector-parser": { - "version": "6.0.13", - "bundled": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "proc-log": { - "version": "3.0.0", - "bundled": true - }, - "process": { - "version": "0.11.10", - "bundled": true - }, - "promise-all-reject-late": { - "version": "1.0.1", - "bundled": true - }, - "promise-call-limit": { - "version": "1.0.2", - "bundled": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true - }, - "promise-retry": { - "version": "2.0.1", - "bundled": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "promzard": { - "version": "1.0.0", - "bundled": true, - "requires": { - "read": "^2.0.0" - } - }, - "qrcode-terminal": { - "version": "0.12.0", - "bundled": true - }, - "read": { - "version": "2.1.0", - "bundled": true, - "requires": { - "mute-stream": "~1.0.0" - } - }, - "read-cmd-shim": { - "version": "4.0.0", - "bundled": true - }, - "read-package-json": { - "version": "6.0.4", - "bundled": true, - "requires": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "read-package-json-fast": { - "version": "3.0.2", - "bundled": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "readable-stream": { - "version": "4.4.0", - "bundled": true, - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - } - }, - "retry": { - "version": "0.12.0", - "bundled": true - }, - "rimraf": { - "version": "3.0.2", - "bundled": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "safe-buffer": { - "version": "5.2.1", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "semver": { - "version": "7.5.2", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "shebang-command": { - "version": "2.0.0", - "bundled": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "bundled": true - }, - "signal-exit": { - "version": "4.0.2", - "bundled": true - }, - "sigstore": { - "version": "1.7.0", - "bundled": true, - "requires": { - "@sigstore/protobuf-specs": "^0.1.0", - "@sigstore/tuf": "^1.0.1", - "make-fetch-happen": "^11.0.1" - } - }, - "smart-buffer": { - "version": "4.2.0", - "bundled": true - }, - "socks": { - "version": "2.7.1", - "bundled": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "bundled": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "spdx-correct": { - "version": "3.2.0", - "bundled": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "bundled": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "bundled": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "bundled": true - }, - "ssri": { - "version": "10.0.4", - "bundled": true, - "requires": { - "minipass": "^5.0.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "bundled": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "bundled": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "9.3.1", - "bundled": true - }, - "tar": { - "version": "6.1.15", - "bundled": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "fs-minipass": { - "version": "2.1.0", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - } - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "bundled": true - }, - "treeverse": { - "version": "3.0.0", - "bundled": true - }, - "tuf-js": { - "version": "1.1.7", - "bundled": true, - "requires": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - } - }, - "unique-filename": { - "version": "3.0.0", - "bundled": true, - "requires": { - "unique-slug": "^4.0.0" - } - }, - "unique-slug": { - "version": "4.0.0", - "bundled": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "5.0.0", - "bundled": true, - "requires": { - "builtins": "^5.0.0" - } - }, - "walk-up-path": { - "version": "3.0.1", - "bundled": true - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "3.0.1", - "bundled": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "bundled": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "bundled": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "bundled": true - }, - "ansi-styles": { - "version": "6.2.1", - "bundled": true - }, - "emoji-regex": { - "version": "9.2.2", - "bundled": true - }, - "string-width": { - "version": "5.1.2", - "bundled": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "bundled": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "bundled": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "write-file-atomic": { - "version": "5.0.1", - "bundled": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1" - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "onsenui": { - "version": "2.12.8", - "resolved": "https://registry.npmjs.org/onsenui/-/onsenui-2.12.8.tgz", - "integrity": "sha512-ju5c2nP/pW7ZIOALqG2yVmjlIa2S6Men2winRKB8E7qtMkjSpMcHD6aRLMZZ4bGRLIiubpT7psdXWLWOc/lEyA==" - }, - "open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - } - } - }, - "os-homedir": { - "version": "1.0.2", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "dev": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parent-module": { - "version": "1.0.1", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-entities": { - "version": "2.0.0", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "dev": true - }, - "path-parse": { - "version": "1.0.7" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "path-type": { - "version": "4.0.0" - }, - "picocolors": { - "version": "1.0.0" - }, - "picomatch": { - "version": "2.3.1", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-calc": { - "version": "8.2.4", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.0", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.2", - "dev": true, - "requires": { - "browserslist": "^4.20.3", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "dev": true, - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "dev": true, - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.1.1", - "dev": true, - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "dev": true, - "requires": {} - }, - "postcss-loader": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", - "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", - "dev": true, - "requires": { - "cosmiconfig": "^8.2.0", - "jiti": "^1.18.2", - "semver": "^7.3.8" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "5.1.6", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - } - }, - "postcss-merge-rules": { - "version": "5.1.2", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.3", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "dev": true, - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.0", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "5.1.3", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-initial": { - "version": "5.1.0", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "dev": true - }, - "prismjs": { - "version": "1.28.0" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "prop-types": { - "version": "15.8.1", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1" - } - } - }, - "properties-file": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/properties-file/-/properties-file-3.2.10.tgz", - "integrity": "sha512-yCTkv7clfUR4PGtwTJlK35cmzYVfjD9O4xSaHJe+VQrS2yEEe22s7zx5Ohuory40PzZfATgSZS852TqNufNh9Q==" - }, - "property-information": { - "version": "5.6.0", - "requires": { - "xtend": "^4.0.0" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "punycode": { - "version": "2.1.1" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "randombytes": { - "version": "2.1.0", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "dev": true - } - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - } - } - }, - "raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "react": { - "version": "18.2.0", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-ace": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-10.1.0.tgz", - "integrity": "sha512-VkvUjZNhdYTuKOKQpMIZi7uzZZVgzCjM7cLYu6F64V0mejY8a2XTyPUIMszC6A4trbeMIHbK5fYFcT/wkP/8VA==", - "requires": { - "ace-builds": "^1.4.14", - "diff-match-patch": "^1.0.5", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "prop-types": "^15.7.2" - } - }, - "react-device-detect": { - "version": "2.2.2", - "requires": { - "ua-parser-js": "^1.0.2" - } - }, - "react-disappear": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/react-disappear/-/react-disappear-1.1.3.tgz", - "integrity": "sha512-GkcndrJeg7wBIzCxYGzvudQAYQ5gJLa/B7nf0WvZbj58JX5RdQeQZNswg18vJkgEUgoHN1iK9GcYBLRiRGAp0w==", - "requires": { - "react": "^18.2.0" - } - }, - "react-dom": { - "version": "18.2.0", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - } - }, - "react-fast-marquee": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/react-fast-marquee/-/react-fast-marquee-1.6.1.tgz", - "integrity": "sha512-SFY+FQectFXsuCrcJuIxrh34YzJ+TKH0Lp6BqZaalVhjdmu6Sx11rKKGQiC6vvC/q9ySXYVn9sozoOvPXFSMoQ==", - "requires": {} - }, - "react-from-json": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/react-from-json/-/react-from-json-0.7.2.tgz", - "integrity": "sha512-of/jhr45fs4S+GefkRsj4T5wGp+T9o8ddaxni6nAUyel/VrLFS6ogDbnzaSX/UFfBT5Xah59OVKtQtdrYsBWPw==", - "requires": {} - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "react-jsx-parser": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/react-jsx-parser/-/react-jsx-parser-1.29.0.tgz", - "integrity": "sha512-u0svZd0UsPffRrIK0sTbox54jhEbTmg6ED9ob5FQahp1DeOpd2Rq+KiSTIFNYkZUL+WZi4Ntia/Oj5T4lDJafQ==", - "requires": { - "@types/jsdom": "^16.2.6", - "@types/react": "^17.0.1", - "@types/react-dom": "^17.0.0", - "acorn": "^8.0.5", - "acorn-jsx": "^5.3.1", - "browserslist": "^4.14.5", - "core-js": "^3.8.3" - }, - "dependencies": { - "@types/react": { - "version": "17.0.65", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.65.tgz", - "integrity": "sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ==", - "optional": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", - "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", - "optional": true, - "requires": { - "@types/react": "^17" - } - } - } - }, - "react-onsenui": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/react-onsenui/-/react-onsenui-1.13.2.tgz", - "integrity": "sha512-rBHcopZ5JIjBbz5h1wDOdF1cV8FTH9G+kTFlxzRJwAyE0wD2+oBIPXOk3j0uB5LeZezFUBBk1rD0YF3PLrYtPw==", - "requires": { - "prop-types": "^15.6.0" - } - }, - "react-render-tools": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-render-tools/-/react-render-tools-1.0.1.tgz", - "integrity": "sha512-K3Z735EVqT41oFjnMQl2XF+2/qT7wDmPO/pz+vj+Ve7kUNF6sUluXW3Bfr3SXoXx6i4U9R62H5thamS6EaOYXQ==", - "requires": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - } - }, - "react-router": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz", - "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==", - "requires": { - "@remix-run/router": "1.8.0" - } - }, - "react-router-dom": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz", - "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==", - "requires": { - "@remix-run/router": "1.8.0", - "react-router": "6.15.0" - } - }, - "react-syntax-highlighter": { - "version": "15.5.0", - "requires": { - "@babel/runtime": "^7.3.1", - "highlight.js": "^10.4.1", - "lowlight": "^1.17.0", - "prismjs": "^1.27.0", - "refractor": "^3.6.0" - }, - "dependencies": { - "highlight.js": { - "version": "10.7.3" - } - } - }, - "react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, - "react-zoom-pan-pinch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.3.0.tgz", - "integrity": "sha512-vy1h8aenDzXye+HRqANZaSA8IPHoqOiuDPFBkswoyPUH8uMfsmbeH6gFI4r4BhEJa0xIlcA+FbvhidRWKGUrOg==", - "requires": {} - }, - "read-installed": { - "version": "4.0.3", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "graceful-fs": "^4.1.2", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "slide": "~1.1.3", - "util-extend": "^1.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "dev": true - } - } - }, - "read-package-json": { - "version": "2.1.2", - "dev": true, - "requires": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "readdirp": { - "version": "3.6.0", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.7.1", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "refractor": { - "version": "3.6.0", - "requires": { - "hastscript": "^6.0.0", - "parse-entities": "^2.0.0", - "prismjs": "~1.27.0" - }, - "dependencies": { - "prismjs": { - "version": "1.27.0" - } - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "require-from-string": { - "version": "2.0.2" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0" - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass": { - "version": "1.53.0", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "sass-loader": { - "version": "13.0.2", - "dev": true, - "requires": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - } - }, - "scheduler": { - "version": "0.23.0", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dev": true, - "requires": { - "node-forge": "^1" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "dev": true - }, - "shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slide": { - "version": "1.1.6", - "dev": true - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "source-map": { - "version": "0.6.1", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "space-separated-tokens": { - "version": "1.1.5" - }, - "spdx-compare": { - "version": "1.0.0", - "dev": true, - "requires": { - "array-find-index": "^1.0.2", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, - "spdx-correct": { - "version": "3.1.1", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "dev": true - }, - "spdx-ranges": { - "version": "2.1.1", - "dev": true - }, - "spdx-satisfies": { - "version": "4.0.1", - "dev": true, - "requires": { - "spdx-compare": "^1.0.0", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "sprintf-js": { - "version": "1.0.3", - "dev": true - }, - "stable": { - "version": "0.1.8", - "dev": true - }, - "state-local": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "style-loader": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", - "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", - "dev": true, - "requires": {} - }, - "stylehacks": { - "version": "5.1.0", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - } - }, - "stylis": { - "version": "4.0.13" - }, - "supports-color": { - "version": "8.1.1", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0" - }, - "svgo": { - "version": "2.8.0", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "tapable": { - "version": "2.2.1", - "dev": true - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "terser": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.0.tgz", - "integrity": "sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "textarea-markdown-editor": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/textarea-markdown-editor/-/textarea-markdown-editor-1.0.4.tgz", - "integrity": "sha512-4uA8EZ0FkIL0dq89+xiA0BEo832/rKdtoi2T4Wab0wLZfHys82JE1i5YJf8BKAr/IQELF2NxQ5LITYkb8BGIFA==", - "requires": { - "mousetrap": "^1.6.5" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0" - }, - "to-regex-range": { - "version": "5.0.1", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "treeify": { - "version": "1.1.0", - "dev": true - }, - "ts-loader": { - "version": "9.3.1", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "semver": { - "version": "7.3.7", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true - }, - "ua-parser-js": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", - "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==" - }, - "un-eval": { - "version": "1.2.0", - "dev": true - }, - "underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "uninstall": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/uninstall/-/uninstall-0.0.0.tgz", - "integrity": "sha512-pjP/0+A4gsbDVa8XH/S2GZdT9NPJW8NFMy3GI7HnsWG+NAmFSSj3QidNosXBI9cPtxxNExEDdhKFO6sli8K3mA==" - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "requires": { - "punycode": "^2.1.0" - } - }, - "url-loader": { - "version": "4.1.1", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "usehooks-ts": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.9.1.tgz", - "integrity": "sha512-2FAuSIGHlY+apM9FVlj8/oNhd+1y+Uwv5QNkMQz1oSfdHk4PXo1qoCw9I5M7j0vpH8CSWFJwXbVPeYDjLCx9PA==", - "requires": {} - }, - "util-deprecate": { - "version": "1.0.2" - }, - "util-extend": { - "version": "1.0.3", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "vscode": { - "version": "1.1.37", - "dev": true, - "requires": { - "glob": "^7.1.2", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "mocha": "^5.2.0", - "semver": "^5.4.1", - "source-map-support": "^0.5.0", - "vscode-test": "^0.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "dev": true - } - } - }, - "vscode-jsonrpc": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", - "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==" - }, - "vscode-languageclient": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.1.0.tgz", - "integrity": "sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==", - "requires": { - "minimatch": "^5.1.0", - "semver": "^7.3.7", - "vscode-languageserver-protocol": "3.17.3" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "vscode-languageserver-protocol": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", - "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", - "requires": { - "vscode-jsonrpc": "8.1.0", - "vscode-languageserver-types": "3.17.3" - } - }, - "vscode-languageserver-types": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", - "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" - }, - "vscode-test": { - "version": "0.4.3", - "dev": true, - "requires": { - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1" - }, - "dependencies": { - "agent-base": { - "version": "4.3.0", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "debug": { - "version": "3.1.0", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - } - }, - "https-proxy-agent": { - "version": "2.2.4", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "dev": true - } - } - }, - "watchpack": { - "version": "2.4.0", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "webpack-sources": { - "version": "3.2.3", - "dev": true - } - } - }, - "webpack-cli": { - "version": "4.10.0", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "requires": { - "fs-monkey": "^1.0.4" - } - } - } - }, - "webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "dev": true, - "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - } - }, - "webpack-merge": { - "version": "5.8.0", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "which": { - "version": "2.0.2", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wildcard": { - "version": "2.0.0", - "dev": true - }, - "wrappy": { - "version": "1.0.2" - }, - "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "requires": {} - }, - "xtend": { - "version": "4.0.2" - }, - "yallist": { - "version": "4.0.0" - }, - "yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==" - }, - "yaml-loader": { - "version": "0.8.0", - "dev": true, - "requires": { - "javascript-stringify": "^2.0.1", - "loader-utils": "^2.0.0", - "yaml": "^2.0.0" - } - }, - "yn": { - "version": "3.1.1", - "dev": true - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true - } } } diff --git a/Website/package.json b/Website/package.json index 899376ed..898fae30 100644 --- a/Website/package.json +++ b/Website/package.json @@ -5,24 +5,25 @@ "application_id": "com.dergoogler.mmrl", "min_sdk": 26, "target_sdk": 34, - "version_name": "1.13.9", - "version_code": 1139 + "version_name": "2.13.9_alpha-7", + "version_code": 2139 }, "main": "index.tsx", "keywords": [], "author": "Der_Googler", "license": "GPL-3.0", "scripts": { - "start:dev": "webpack-dev-server --open --config webpack.dev.ts", - "start:prod": "webpack-dev-server --open --config webpack.prod.ts", + "start:dev": "npm run licensefix && webpack-dev-server --open --config webpack.dev.ts", + "start:prod": "npm run licensefix && webpack-dev-server --open --config webpack.prod.ts", "web:dev": "webpack --config webpack.dev.ts", "web:prod": "webpack --config webpack.prod.ts", - "web:dev-app": "npm run web:dev && npm run assetfix:android-clean && npm run assetfix:android-build", - "web:prod-app": "npm run web:prod && npm run assetfix:android-clean && npm run assetfix:android-build", + "web:dev-app": "npm run licensefix && npm run web:dev && npm run assetfix:android-clean && npm run assetfix:android-build", + "web:prod-app": "npm run licensefix && npm run web:prod && npm run assetfix:android-clean && npm run assetfix:android-build", "assetfix:android-build": "node assetfix.js android --build", "assetfix:android-clean": "node assetfix.js android --clean", "assetfix:web-build": "node assetfix.js web --build", - "assetfix:web-clean": "node assetfix.js web --clean" + "assetfix:web-clean": "node assetfix.js web --clean", + "licensefix": "node licensefix.js" }, "resolutions": { "react": "^18.2.0", @@ -60,7 +61,7 @@ "markdown-to-jsx": "^7.4.0", "marked-react": "^1.1.2", "material-icons": "^1.10.8", - "material-ui-confirm": "^3.0.9", + "material-ui-confirm": "^3.0.10", "monaco-editor": "^0.45.0", "monaco-editor-core": "^0.43.0", "monaco-languageclient": "^6.5.0", diff --git a/Website/src/activitys/AboutActivity.tsx b/Website/src/activitys/AboutActivity.tsx index 21bee0fd..b122ebe5 100644 --- a/Website/src/activitys/AboutActivity.tsx +++ b/Website/src/activitys/AboutActivity.tsx @@ -7,7 +7,6 @@ import { useTheme } from "@Hooks/useTheme"; import Badge from "@mui/material/Badge"; import List from "@mui/material/List"; import ListItem from "@mui/material/ListItem"; -import Divider from "@mui/material/Divider"; import ListItemText from "@mui/material/ListItemText"; import Avatar from "@mui/material/Avatar"; import Typography from "@mui/material/Typography"; @@ -15,8 +14,7 @@ import Stack from "@mui/material/Stack"; import CodeRoundedIcon from "@mui/icons-material/CodeRounded"; import { useSettings } from "@Hooks/useSettings"; import { Shell } from "@Native/Shell"; -import DeviceUnknownIcon from "@mui/icons-material/DeviceUnknown"; -import { ListSubheader, SxProps } from "@mui/material"; +import { ListSubheader } from "@mui/material"; import React from "react"; import { BuildConfig } from "@Native/BuildConfig"; import { useFormatDate } from "@Hooks/useFormatDate"; @@ -36,8 +34,7 @@ const checkRoot = (): string | undefined => { const AboutActivity = () => { const { strings } = useStrings(); const { settings } = useSettings(); - const { theme } = useTheme(); - const { context, extra } = useActivity(); + const { context } = useActivity(); const renderToolbar = () => { return ( @@ -50,7 +47,8 @@ const AboutActivity = () => { ); }; - const date = useFormatDate(BuildConfig.BUILD_DATE); + // false to ignore multiplying + const date = useFormatDate(BuildConfig.BUILD_DATE, false); type ListRender = { title: string; diff --git a/Website/src/activitys/ConfigureActivity.tsx b/Website/src/activitys/ConfigureActivity.tsx index ce7f8a79..78ba42c8 100644 --- a/Website/src/activitys/ConfigureActivity.tsx +++ b/Website/src/activitys/ConfigureActivity.tsx @@ -2,22 +2,22 @@ import { useActivity } from "@Hooks/useActivity"; import React from "react"; import { SuFile } from "@Native/SuFile"; import { ConfigureView } from "@Components/ConfigureView"; -import { PreviewErrorBoundary } from "./PlaygroundsActivity"; -import { useModConf } from "@Hooks/useModConf"; +import { useModFS } from "@Hooks/useModFS"; +import { PreviewErrorBoundary } from "./ModConfPlaygroundActivity"; type Extra = { - raw_data?: string; + code?: string; modulename: string; moduleid: string; }; const ConfigureActivity = () => { - const { modConf } = useModConf(); - const { context, extra } = useActivity(); + const { modFS } = useModFS(); + const { extra } = useActivity(); const config: string = React.useMemo(() => { - if (!extra.raw_data) { - const file = new SuFile(modConf("CONFINDEX", { MODID: extra.moduleid })); + if (!extra.code) { + const file = new SuFile(modFS("CONFINDEX", { MODID: extra.moduleid })); if (file.exist()) { return file.read(); @@ -25,12 +25,14 @@ const ConfigureActivity = () => { return `

Config file not found

`; } } else { - return extra.raw_data; + return extra.code; } }, []); return ( - + + + ); }; diff --git a/Website/src/activitys/DescriptonActivity.tsx b/Website/src/activitys/DescriptonActivity.tsx index 733472d9..9f3ecf10 100644 --- a/Website/src/activitys/DescriptonActivity.tsx +++ b/Website/src/activitys/DescriptonActivity.tsx @@ -40,7 +40,7 @@ function DescriptonActivity() { ({ - bgcolor: theme.palette.primary.light, + bgcolor: theme.palette.primary.dark, width: 40, height: 40, boxShadow: "0 -1px 5px rgba(0,0,0,.09), 0 3px 5px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.3), 0 1px 3px rgba(0,0,0,.15)", diff --git a/Website/src/activitys/DownloadActivity/DownloadActivity.tsx b/Website/src/activitys/DownloadActivity/DownloadActivity.tsx deleted file mode 100644 index 26fe5bdb..00000000 --- a/Website/src/activitys/DownloadActivity/DownloadActivity.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { Phones } from "./components/Phones"; -import { Toolbar } from "@Components/onsenui/Toolbar"; -import { Page } from "@Components/onsenui/Page"; -import { Carousel, CarouselItem } from "react-onsenui"; -import { useActivity } from "@Hooks/useActivity"; -import { useTheme } from "@Hooks/useTheme"; -import Paper from "@mui/material/Paper"; -import Button from "@mui/material/Button"; -import ButtonGroup from "@mui/material/ButtonGroup"; -import ArrowDropDownIcon from "@mui/icons-material/ArrowDropDown"; -import ClickAwayListener from "@mui/material/ClickAwayListener"; -import Grow from "@mui/material/Grow"; -import Popper from "@mui/material/Popper"; -import MenuItem from "@mui/material/MenuItem"; -import MenuList from "@mui/material/MenuList"; -import React from "react"; -import Typography from "@mui/material/Typography"; -import Box from "@mui/material/Box"; -import CardMedia from "@mui/material/CardMedia"; - -function DownloadActivity() { - const { context, extra } = useActivity(); - const { scheme, theme } = useTheme(); - - const { _1, _2 } = Phones({ - screenColor: scheme[500], - caseColor: scheme[600], - }); - - const renderToolbar = () => { - return ( - - Download MMRL - - ); - }; - - return ( - - - - - - - - - - ); -} - -export { DownloadActivity }; diff --git a/Website/src/activitys/DownloadActivity/components/Phones.tsx b/Website/src/activitys/DownloadActivity/components/Phones.tsx deleted file mode 100644 index 986be2e9..00000000 --- a/Website/src/activitys/DownloadActivity/components/Phones.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { styled } from "@mui/material"; - -interface Props { - caseColor: string; - screenColor: string; -} - -export const Phones = (props: Partial) => { - const C = styled("div")(({ theme }) => ({ - position: "absolute", - right: "10%", - bottom: "-30%", - width: "300px", - height: "540px", - backgroundColor: props.caseColor || "#333", - borderRadius: "21px", - transform: "rotate(25deg)", - "::before": { - position: "absolute", - top: "10%", - right: "10px", - bottom: "10%", - left: "10px", - content: '""', - backgroundColor: props.screenColor || "rgba(255, 255, 255, 0.1)", - borderRadius: "5px", - }, - })); - - const C2 = styled(C)(({ theme }) => ({ - top: "-25%", - right: "auto", - bottom: 0, - left: "5%", - backgroundColor: props.caseColor || "#e5e5e5", - transform: "rotate(14deg)", - })); - - return { - _1: C, - _2: C2, - }; -}; diff --git a/Website/src/activitys/FetchTextActivity.tsx b/Website/src/activitys/FetchTextActivity.tsx index ca9e1a41..ea3d5f22 100644 --- a/Website/src/activitys/FetchTextActivity.tsx +++ b/Website/src/activitys/FetchTextActivity.tsx @@ -4,9 +4,6 @@ import { useActivity } from "@Hooks/useActivity"; import React from "react"; import { Toolbar } from "@Components/onsenui/Toolbar"; import { Page } from "@Components/onsenui/Page"; -import Stack from "@mui/material/Stack"; -import Box from "@mui/material/Box"; -import Icon from "@Components/Icon"; import { useNetwork } from "@Hooks/useNetwork"; import { MissingInternet } from "@Components/MissingInternet"; diff --git a/Website/src/activitys/LicensesActivity.tsx b/Website/src/activitys/LicensesActivity.tsx new file mode 100644 index 00000000..9a958708 --- /dev/null +++ b/Website/src/activitys/LicensesActivity.tsx @@ -0,0 +1,123 @@ +import { Page } from "@Components/onsenui/Page"; +import { Toolbar } from "@Components/onsenui/Toolbar"; +import { useActivity } from "@Hooks/useActivity"; +import { useStrings } from "@Hooks/useStrings"; +import Typography from "@mui/material/Typography"; +import Button from "@mui/material/Button"; +import Card from "@mui/material/Card"; +import Stack from "@mui/material/Stack"; +import { useSettings } from "@Hooks/useSettings"; +import FlatList from "flatlist-react"; + +import li from "@Util/licenses.json"; +import { os } from "@Native/Os"; +import { useTheme } from "@Hooks/useTheme"; +import FetchTextActivity from "./FetchTextActivity"; + +const DepCard = (props: { dep: (typeof li)[0] }) => { + const { theme } = useTheme(); + const { strings } = useStrings(); + const { context } = useActivity(); + const dep = props.dep; + + const handleOpenSource = () => { + os.open(dep.source, { + target: "_blank", + features: { + color: theme.palette.primary.main, + }, + }); + }; + + const handleOpenLicense = () => { + fetch(`https://raw.githubusercontent.com/spdx/license-list-data/main/website/${dep.license}.json`) + .then((res) => { + if (res.status === 200) { + return res.json(); + } else { + throw new Error("Fetching license failed"); + } + }) + .then((json: LicenseSPX) => { + context.pushPage({ + component: FetchTextActivity, + key: "license_" + dep.license, + extra: { + raw_data: json.licenseText, + modulename: json.name, + }, + }); + }) + .catch((err) => {}); + }; + + return ( + + + + + {dep.author} + + + {dep.license} + + + + + {dep.name} + + + {dep.version} + + + {dep.description} + + + + + + + + + ); +}; + +const LicensesActivity = () => { + const { strings } = useStrings(); + const { settings } = useSettings(); + const { context } = useActivity(); + const { theme } = useTheme(); + + const renderToolbar = () => { + return ( + + + + + {strings("licenses")} + + ); + }; + + return ( + + + } + renderOnScroll + display={{ + row: true, + rowGap: "8px", + }} + /> + + + ); +}; + +export default LicensesActivity; diff --git a/Website/src/activitys/MainApplication.tsx b/Website/src/activitys/MainApplication.tsx index b1748a52..593c4f14 100644 --- a/Website/src/activitys/MainApplication.tsx +++ b/Website/src/activitys/MainApplication.tsx @@ -1,14 +1,15 @@ import CodeRoundedIcon from "@mui/icons-material/CodeRounded"; import React from "react"; import Typography from "@mui/material/Typography"; -import ArrowBackIcon from "@mui/icons-material/ArrowBack"; +import MenuIcon from "@mui/icons-material/Menu"; import FetchTextActivity from "./FetchTextActivity"; import ModuleFragment from "./fragments/ModuleFragment"; import TerminalActivity from "./TerminalActivity"; -import DeviceModule from "@Components/DeviceModule"; +import DeviceModule from "@Components/module/DeviceModule"; +import ExploreModule from "@Components/module/ExploreModule"; +import UpdateModule from "@Components/module/UpdateModule"; import ModuleViewActivity from "./ModuleViewActivity"; import CreateNewFolderIcon from "@mui/icons-material/CreateNewFolder"; -import { Menu } from "@mui/icons-material"; import { useActivity } from "@Hooks/useActivity"; import { Toolbar } from "@Components/onsenui/Toolbar"; import { os } from "@Native/Os"; @@ -17,94 +18,30 @@ import { useStrings } from "@Hooks/useStrings"; import { Tabbar, TabbarRenderTab } from "@Components/onsenui/Tabbar"; import { useRepos } from "@Hooks/useRepos"; import { SuFile } from "@Native/SuFile"; -import { Properties } from "properties-file"; -import { useNativeStorage } from "@Hooks/useNativeStorage"; import { BuildConfig } from "@Native/BuildConfig"; -import { useNewerVersion } from "@Hooks/useNewerVersion"; -import { ExploreModule } from "@Components/ExploreModule"; -import { useSettings } from "@Hooks/useSettings"; -import { useTheme } from "@Hooks/useTheme"; -import { AnimatePresence, motion } from "framer-motion"; -import InputBase from "@mui/material/InputBase"; import SearchIcon from "@mui/icons-material/Search"; -import ClearIcon from "@mui/icons-material/Clear"; -import { useModConf } from "@Hooks/useModConf"; +import { useModFS } from "@Hooks/useModFS"; import Fab from "@Components/onsenui/Fab"; import { useLocalModules } from "@Hooks/useLocalModules"; import { Shell } from "@Native/Shell"; - -interface SearchbarRef { - clear(): void; -} - -interface SearchbarProps { - value: string; - onSearch(term: string): void; - placeholder: string; -} - -const Clear = motion(ClearIcon); -const Search = motion(SearchIcon); -const MotionTypography = motion(Typography); -const MotionInputBase = motion(InputBase); -const SearchBar = React.forwardRef((props, ref) => { - const { onSearch, placeholder, value } = props; - const [term, setTerm] = React.useState(value); - - const handleTermChange = (e) => { - setTerm(e.target.value); - }; - - React.useImperativeHandle( - ref, - () => ({ - clear() { - setTerm(""); - }, - }), - [] - ); - - return ( - - ); -}); +import { SearchActivity } from "./SearchActivity"; +import ListItemButton from "@mui/material/ListItemButton"; +import { StyledListItemText } from "@Components/StyledListItemText"; +import VerifiedIcon from "@mui/icons-material/Verified"; +import ListItemAvatar from "@mui/material/ListItemAvatar"; +import Avatar from "@mui/material/Avatar"; +import Stack from "@mui/material/Stack"; +import Chip from "@mui/material/Chip"; +import { ConfigureView } from "@Components/ConfigureView"; const MainApplication = () => { const { strings } = useStrings(); - const { settings } = useSettings(); - const { modConf } = useModConf(); + const { modFS } = useModFS(); const { context } = useActivity(); - const { theme } = useTheme(); const { modules } = useRepos(); const [index, setIndex] = React.useState(0); const localModules = useLocalModules(); - const searchRef = React.useRef(null); - - const [isVisible, setVisible] = React.useState(false); - const [search, setSearch] = React.useState(""); - React.useEffect(() => { const urlParams = new URLSearchParams(window.location.search); const id = urlParams.get("module"); @@ -118,18 +55,13 @@ const MainApplication = () => { } }, [modules]); - const hasInstallTools = SuFile.exist(`${modConf("MMRLINI")}/module.prop`); + const hasInstallTools = SuFile.exist(`${modFS("MMRLINI")}/module.prop`); const renderTabs = (): TabbarRenderTab[] => { return [ { content: ( - } - /> + } /> ), tab: , }, @@ -138,7 +70,6 @@ const MainApplication = () => { { content: ( } @@ -146,6 +77,11 @@ const MainApplication = () => { if (os.isAndroid && (Shell.isMagiskSU() || Shell.isKernelSU() || Shell.isAPatchSU()) && hasInstallTools) { return ( { Chooser.getFile( "application/zip", @@ -175,71 +111,116 @@ const MainApplication = () => { ), tab: , }, + { + content: ( + } + /> + ), + tab: , + }, ] : []), ]; }; - const [storedCurrentVersion, setStoredCurrentVersion] = useNativeStorage("current_version", "0.0.0"); - const isNewVersion = useNewerVersion(storedCurrentVersion); - React.useEffect(() => { - if (isNewVersion) { - setStoredCurrentVersion(BuildConfig.VERSION_NAME); - context.pushPage({ - component: FetchTextActivity, - key: "FetchTextActivity", - extra: { - url: "https://raw.githubusercontent.com/wiki/DerGoogler/MMRL/Changelog.md", - title: "Changelog", - }, + fetch("https://raw.githubusercontent.com/DerGoogler/MMRL/master/Website/package.json") + .then((res) => res.json()) + .then((json) => { + if (json.config.version_code > BuildConfig.VERSION_CODE) { + context.pushPage({ + component: FetchTextActivity, + key: "changelog", + extra: { + rendering: ConfigureView, + url: "https://raw.githubusercontent.com/wiki/DerGoogler/MMRL/JSX-Changelog.md", + modulename: "Update available!", + }, + }); + } }); - } }, []); const handleOpenSearch = () => { - if (isVisible) { - if (searchRef.current) { - setSearch(""); - searchRef.current.clear(); - } - } else { - setVisible((prev) => !prev); - } - }; + context.pushPage({ + component: SearchActivity, + key: "SearchActivity", + props: { + list: modules, + search: { + by: ["id", "name", "author", "description"], + caseInsensitive: true, + }, - const handleSearch = () => { - if (isVisible) { - setVisible((prev) => { - if (prev && searchRef.current) { - setSearch(""); - searchRef.current.clear(); - } - return !prev; - }); - } else { - context.splitter.show(); - } + renderList(item: Module, index) { + return ( + { + context.pushPage({ + component: ModuleViewActivity, + key: "ModuleViewActivity", + extra: item, + }); + }} + > + + ({ + bgcolor: theme.palette.primary.dark, + boxShadow: "0 -1px 5px rgba(0,0,0,.09), 0 3px 5px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.3), 0 1px 3px rgba(0,0,0,.15)", + borderRadius: "20%", + mr: 1.5, + })} + src={item.track.icon} + > + {item.name.charAt(0).toUpperCase()} + + + + {item.name} + {item.track.verified && ( + ({ color: theme.palette.text.link, fontSize: "unset" })} /> + )} + + } + secondary={ + + {item.version} + + {SuFile.exist(modFS("PROPS", { MODID: item.id })) && } + + + } + /> + + ); + }, + }, + }); }; const renderToolbar = () => { return ( - - - - - - + + + + + { alignItems: "center", }} > - {!isVisible ? ( - - - - MMRL - - - ) : ( - setSearch(term)} - placeholder={strings("search_modules")} - /> - )} - - - - + - - + > + MMRL + + + + + + ); }; diff --git a/Website/src/activitys/ModConfPlaygroundActivity.tsx b/Website/src/activitys/ModConfPlaygroundActivity.tsx new file mode 100644 index 00000000..5cd0605c --- /dev/null +++ b/Website/src/activitys/ModConfPlaygroundActivity.tsx @@ -0,0 +1,241 @@ +import { Box, Stack, styled } from "@mui/material"; +import * as React from "react"; +import useMediaQuery from "@mui/material/useMediaQuery"; +import { Toolbar } from "@Components/onsenui/Toolbar"; +import { Page } from "@Components/onsenui/Page"; +import { IntentPusher, useActivity } from "@Hooks/useActivity"; +import PreviewIcon from "@mui/icons-material/Preview"; +import * as monacoEditor from "monaco-editor/esm/vs/editor/editor.api"; +import Editor, { Monaco } from "@monaco-editor/react"; +import { ErrorBoundaryProps, ErrorBoundaryState, errorBoundaryInitialState } from "@Components/ErrorBoundary"; +import editorTheme from "@Util/editorTheme"; +import { ConfigureView } from "@Components/ConfigureView"; +import { useNativeStorage } from "@Hooks/useNativeStorage"; +import { useStrings } from "@Hooks/useStrings"; + +export interface PlaygroundExtra { + title: string; + editorMode?: string; + defaultText?: string; + previewPage: IntentPusher["component"]; + preview: React.FunctionComponent | React.ComponentType; +} + +export interface PreviewErrorBoundaryChildren extends React.PropsWithChildren { + hasError: boolean; +} + +interface PreviewErrorBoundaryProps extends Omit {} +interface PreviewErrorBoundaryState extends ErrorBoundaryState {} + +export class PreviewErrorBoundary extends React.Component { + public constructor(props: PreviewErrorBoundaryProps) { + super(props); + this.state = errorBoundaryInitialState; + } + + public static getDerivedStateFromError(error: any) { + return { hasError: true }; + } + + public componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { + this.setState({ error, errorInfo }); + } + + public render() { + if (this.state.hasError) { + return ( + +
{this.state.error?.message}
+
+ ); + } + + return this.props.children; + } +} + +const createDependencyProposals = (monaco: typeof monacoEditor, range: any): any => { + // returning a static list of proposals, not even looking at the prefix (filtering is done by the Monaco editor), + // here you could do a server side lookup + return [ + { + label: "native", + kind: monaco.languages.CompletionItemKind.Function, + documentation: "", + insertText: "native", + range: range, + }, + { + label: "ignore", + kind: monaco.languages.CompletionItemKind.Function, + documentation: "", + insertText: "// @ts-ignore", + range: range, + }, + ]; +}; + +const editorDidMount = (editor: monacoEditor.editor.IStandaloneCodeEditor, monaco: Monaco) => { + monaco.editor.defineTheme("editorTheme", editorTheme); + monaco.editor.setTheme("editorTheme"); + + monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({ + noSemanticValidation: true, + noSyntaxValidation: true, + }); + + monaco.languages.typescript.javascriptDefaults.setCompilerOptions({ + jsx: monaco.languages.typescript.JsxEmit.React, + jsxFactory: "React.createElement", + reactNamespace: "React", + allowNonTsExtensions: true, + allowJs: true, + target: monaco.languages.typescript.ScriptTarget.ES2015, + }); + + monaco.languages.registerCompletionItemProvider("javascript", { + provideCompletionItems: (model, position) => { + const word = model.getWordUntilPosition(position); + const range = { + startLineNumber: position.lineNumber, + endLineNumber: position.lineNumber, + startColumn: word.startColumn, + endColumn: word.endColumn, + }; + return { + suggestions: createDependencyProposals(monaco, range), + }; + }, + }); + editor.focus(); +}; + +const ModConfPlaygroundActivity = () => { + const { context, extra } = useActivity(); + const { strings } = useStrings(); + + const [description, setDescription] = useNativeStorage("module-configure-playground", extra.defaultText || ""); + const [errBoundKey, setErrBoundKey] = React.useState(0); + + const isLargeScreen = useMediaQuery("(min-width:600px)"); + + const handlePreview = () => { + context.pushPage({ + component: ConfigureView, + key: extra.title, + extra: { + modulename: "Preview", + }, + props: { + modid: "preview", + children: description, + }, + }); + }; + + const renderToolbar = () => { + return ( + + + + + {strings("modconf_playground")} + {!isLargeScreen && } + + ); + }; + + return ( + +
+ + + + { + if (value) { + setErrBoundKey((prev) => prev + 1); + setDescription(value); + } + }} + onMount={editorDidMount} + options={{ + autoIndent: "full", + contextmenu: true, + fontFamily: "monospace", + fontSize: 13, + lineHeight: 24, + hideCursorInOverviewRuler: true, + matchBrackets: "always", + minimap: { + enabled: false, + }, + scrollbar: { + horizontalSliderSize: 4, + verticalSliderSize: 18, + }, + selectOnLineNumbers: true, + roundedSelection: false, + readOnly: false, + cursorStyle: "line", + automaticLayout: true, + }} + /> + + + {isLargeScreen && ( + + + + + + + + )} + + +
+
+ ); +}; + +const Preview = styled("div")(({ theme }) => ({ + flex: 1, + flexBasis: "50%", + height: "100%", + width: "100%", + minHeight: "100%", + position: "relative", + borderRadius: theme.shape.borderRadius, + borderStyle: "solid", + borderWidth: "1px", + minWidth: "0%", + overflow: "auto", + borderColor: "rgba(0, 0, 0, 0.23)", + section: { + position: "absolute", + overflowY: "scroll", + }, + ".monaco-editor": { + borderRadius: theme.shape.borderRadius / theme.shape.borderRadius, + }, + ".overflow-guard": { + borderRadius: theme.shape.borderRadius / theme.shape.borderRadius, + }, +})); + +export default ModConfPlaygroundActivity; diff --git a/Website/src/activitys/ModConfActivity.tsx b/Website/src/activitys/ModFSActivity.tsx similarity index 58% rename from Website/src/activitys/ModConfActivity.tsx rename to Website/src/activitys/ModFSActivity.tsx index ed5e1fb2..7777147c 100644 --- a/Website/src/activitys/ModConfActivity.tsx +++ b/Website/src/activitys/ModFSActivity.tsx @@ -1,34 +1,40 @@ -import { Alert, Box, Divider, List, ListSubheader } from "@mui/material"; +import { Alert, Box, Button, Divider, List, ListSubheader, Stack, Typography } from "@mui/material"; import AvatarGroup from "@mui/material/AvatarGroup"; import Avatar from "@mui/material/Avatar"; import { Toolbar } from "@Components/onsenui/Toolbar"; import { Page } from "@Components/onsenui/Page"; import { useActivity } from "@Hooks/useActivity"; -import { ModConf, useModConf } from "@Hooks/useModConf"; +import { ModFS, useModFS } from "@Hooks/useModFS"; import { StyledListItemText } from "@Components/StyledListItemText"; import { Shell } from "@Native/Shell"; import { DialogEditTextListItem } from "@Components/DialogEditTextListItem"; import React from "react"; +import Anchor from "@Components/dapi/Anchor"; +import { useStrings } from "@Hooks/useStrings"; -interface ModConfSections { +interface ModFSSections { sectionText: string; - items: ModConfListItem[]; + items: ModFSListItem[]; } -interface ModConfListItem { +interface ModFSListItem { confKey: K; - text: string; + text: React.ReactNode; + dialogDesc?: React.ReactNode; /** * Used for the config requirement */ logoText?: string | Array; disabled?: boolean; + multiline?: boolean; + maxRows?: number; } -function ModConfActivity() { +function ModFSActivity() { const { context } = useActivity(); + const { strings } = useStrings(); - const { _modConf, setModConf } = useModConf(); + const { _modFS, setModFS } = useModFS(); const renderToolbar = () => { return ( @@ -36,12 +42,12 @@ function ModConfActivity() { - ModConf + {strings("modfs")} ); }; - const items: ModConfSections[] = React.useMemo( + const items: ModFSSections[] = React.useMemo( () => [ { sectionText: "Command line interfaces", @@ -177,14 +183,76 @@ function ModConfActivity() { }, ], }, + { + sectionText: "Others", + items: [ + { + text: "MMRL Install Tools", + confKey: "MMRLINI", + }, + { + text: "Config working directory", + confKey: "CONFCWD", + }, + { + text: "Config index file", + confKey: "CONFINDEX", + }, + { + text: "Explore install script", + multiline: true, + maxRows: 10, + dialogDesc: ( + <> + + Check the{" "} + + ModFS documentations + {" "} + for more informations! +
+ {""} and {""} can also be used, shell supported. +
+ + ), + confKey: "EXPLORE_INSTALL", + }, + { + text: "Local install script", + multiline: true, + maxRows: 10, + dialogDesc: ( + <> + + Check the{" "} + + ModFS documentations + {" "} + for more informations! +
+ {""} can also be used, shell supported. +
+ + ), + confKey: "LOCAL_INSTALL", + }, + ], + }, ], [] ); return ( - - + + I am not responsible for anything that may happen to your phone by changing these informations. You do it at your own risk and take the responsibility upon yourself and you are not to blame us or MMRL and its respected developers @@ -202,33 +270,42 @@ function ModConfActivity() { type="text" title={item.text} disabled={item.disabled} - initialValue={_modConf[item.confKey]} + description={item.dialogDesc} + initialValue={_modFS[item.confKey]} onSuccess={(value) => { if (value) { - setModConf(item.confKey, value); + setModFS(item.confKey, value); } }} + multiline={item.multiline} + maxRows={item.maxRows} > - {item.logoText && Array.isArray(item.logoText) ? ( - <> - - {item.logoText.map((logo) => ( - - ))} - - - ) : ( - item.logoText && ( - - ) - )} - [{item.confKey}]: {item.text} - + + {`<${item.confKey}>`} + + {" "} + + {item.logoText && Array.isArray(item.logoText) ? ( + <> + + {item.logoText.map((logo) => ( + + ))} + + + ) : ( + item.logoText && ( + + ) + )} + {item.text} + + + } - secondary={_modConf[item.confKey]} + secondary={_modFS[item.confKey]} /> ))} @@ -241,4 +318,4 @@ function ModConfActivity() { ); } -export default ModConfActivity; +export default ModFSActivity; diff --git a/Website/src/activitys/ModuleViewActivity.tsx b/Website/src/activitys/ModuleViewActivity.tsx index 732f57fc..96a09bd8 100644 --- a/Website/src/activitys/ModuleViewActivity.tsx +++ b/Website/src/activitys/ModuleViewActivity.tsx @@ -14,7 +14,7 @@ import Card from "@mui/material/Card"; import CardContent from "@mui/material/CardContent"; import ImageList from "@mui/material/ImageList"; import ImageListItem from "@mui/material/ImageListItem"; -import ListSubheader from "@mui/material/ListSubheader"; +import { Verified } from "@mui/icons-material"; import Stack from "@mui/material/Stack"; import { useActivity } from "@Hooks/useActivity"; import { StyledListItemText } from "@Components/StyledListItemText"; @@ -28,7 +28,6 @@ import { useCategories } from "@Hooks/useCategories"; import { useFormatDate } from "@Hooks/useFormatDate"; import Chip from "@mui/material/Chip"; import CardMedia from "@mui/material/CardMedia"; -import { useSupportIconForUrl } from "@Hooks/useSupportIconForUrl"; import { useLog } from "@Hooks/native/useLog"; import { SuFile } from "@Native/SuFile"; import DescriptonActivity from "./DescriptonActivity"; @@ -43,17 +42,21 @@ import ListItemIcon from "@mui/material/ListItemIcon"; import { Disappear } from "react-disappear"; import Fade from "@mui/material/Fade"; import TelegramIcon from "@mui/icons-material/Telegram"; -import SecurityUpdateGoodIcon from "@mui/icons-material/SecurityUpdateGood"; import VerifiedIcon from "@mui/icons-material/Verified"; import { useRepos } from "@Hooks/useRepos"; import PicturePreviewActivity from "./PicturePreviewActivity"; import GitHubIcon from "@mui/icons-material/GitHub"; -import TerminalIcon from "@mui/icons-material/Terminal"; -import { isLiteralObject } from "@Util/util"; import { useLowQualityModule } from "@Hooks/useLowQualityModule"; -import AvatarGroup from "@mui/material/AvatarGroup"; -import ProfileActivty from "./ProfileActivity"; -import { useModConf } from "@Hooks/useModConf"; +import FormatAlignLeftIcon from "@mui/icons-material/FormatAlignLeft"; +import { useConfirm } from "material-ui-confirm"; +import InstallMobileIcon from "@mui/icons-material/InstallMobile"; +import DownloadIcon from "@mui/icons-material/Download"; +import Tooltip from "@mui/material/Tooltip"; +import { view } from "@Native/View"; +import AntiFeatureListItem from "@Components/AntiFeatureListItem"; +import FetchTextActivity from "./FetchTextActivity"; +import { Image } from "@Components/dapi/Image"; +import { useModFS } from "@Hooks/useModFS"; function a11yProps(index: number) { return { @@ -62,18 +65,6 @@ function a11yProps(index: number) { }; } -function pickFourElements(jsonArray: Array): Array { - if (jsonArray.length <= 4) { - // Return the array as is if it contains 4 or fewer elements - return jsonArray; - } else { - // Shuffle the array to randomize the selection - const shuffledArray = jsonArray.sort(() => Math.random() - 0.5); - // Return the first four elements of the shuffled array - return shuffledArray.slice(0, 4); - } -} - interface TabPanelProps { children?: React.ReactNode; index: number; @@ -94,21 +85,19 @@ const ModuleViewActivity = () => { const { strings, currentLanguage } = useStrings(); const { settings } = useSettings(); const { modules } = useRepos(); + const confirm = useConfirm(); const { theme, scheme, shade } = useTheme(); const { context, extra } = useActivity(); const log = useLog("ModuleViewActivity"); - const { id, name, version, versionCode, description, author, readme, about, download, mmrl, fox, last_update, updateJson, verified } = - extra; + const { id, name, version, versionCode, description, author, versions, track } = extra; - const categories = useCategories(mmrl.categories); - const { data } = useFetch(readme); - const formatLastUpdate = useFormatDate(last_update); + const categories = useCategories(track.categories); + const { data } = useFetch(track.readme); - const { modConf, __modConf } = useModConf(); - const hasInstallTools = SuFile.exist(`${modConf("MMRLINI")}/module.prop`); - - const { SupportIcon, supportText } = useSupportIconForUrl(fox.support); + const latestVersion = React.useMemo(() => versions[versions.length - 1], [versions]); + + const formatLastUpdate = useFormatDate(latestVersion.timestamp); const search = React.useMemo(() => new URLSearchParams(window.location.search), [window.location.search]); @@ -127,7 +116,18 @@ const ModuleViewActivity = () => { const renderToolbar = () => { return ( - + @@ -158,28 +158,41 @@ const ModuleViewActivity = () => { ); }; + const { modFS } = useModFS(); const [value, setValue] = React.useState(0); const [isNameVisible, setIsNameVisible] = React.useState(true); + const hasInstallTools = SuFile.exist(`${modFS("MMRLINI")}/module.prop`); const handleChange = (event: React.SyntheticEvent, newValue: number) => { setValue(newValue); }; return ( - + - {mmrl.cover && ( + {track.cover && ( ({ - background: `linear-gradient(to top,${theme.palette.primary.main} 0,rgba(0,0,0,0) 56%)`, + background: `linear-gradient(to top,${ + theme.palette.background.default + } 0,rgba(0,0,0,0) calc(56% - ${view.getWindowTopInsets()}px))`, })} > { display: "block", position: "relative", height: { - sm: "calc(calc(50vw - 48px)*9/16)", - xs: "calc(calc(100vw - 48px)*9/16)", + sm: `calc(calc(50vw - 48px + ${view.getWindowTopInsets()}px)*9/16)`, + xs: `calc(calc(100vw - 48px + ${view.getWindowTopInsets()}px)*9/16)`, }, objectFit: "cover", })} - image={mmrl.cover} + image={track.cover} alt={name} /> @@ -202,11 +215,11 @@ const ModuleViewActivity = () => { ({ - pt: mmrl.cover ? 0 : 2, + pt: track.cover ? 0 : 2, pl: 2, pr: 2, pb: 2, - backgroundColor: theme.palette.primary.main, + backgroundColor: theme.palette.background.default, color: "white", display: "flex", flexDirection: "column", @@ -222,7 +235,7 @@ const ModuleViewActivity = () => { ({ - bgcolor: theme.palette.primary.light, + bgcolor: theme.palette.primary.dark, width: 100, height: 100, boxShadow: "0 -1px 5px rgba(0,0,0,.09), 0 3px 5px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.3), 0 1px 3px rgba(0,0,0,.15)", @@ -230,43 +243,25 @@ const ModuleViewActivity = () => { mr: 1.5, fontSize: 50, })} - src={mmrl.logo} + src={track.icon} > {name.charAt(0).toUpperCase()} - setIsNameVisible(!visible)}> - {name} - - - {mmrl.author ? ( - { - context.pushPage({ - component: ProfileActivty, - key: mmrl.author?.name + "_ProfileActivty", - extra: mmrl.author, - }); - }} - > - {mmrl.author.name} {mmrl.author.verified && } - - ) : ( - - {author} - - )} + + setIsNameVisible(!visible)}> + {name} + + {track.verified && ( + + + + )} + + + {author} + @@ -281,36 +276,7 @@ const ModuleViewActivity = () => { alignItems="flex-start" spacing={1} > - {mmrl.author && mmrl.contributors && ( - - - Contributors - - - {pickFourElements(mmrl.contributors).map((contributor) => ( - { - context.pushPage({ - component: ProfileActivty, - key: contributor.name + "_ProfileActivty", - extra: contributor, - }); - }} - /> - ))} - - - )} - {/* DL SECTION */} - { {version} ({versionCode}) - - {fox.support && ( + + {os.isAndroid && (Shell.isMagiskSU() || Shell.isKernelSU() || Shell.isAPatchSU()) && hasInstallTools && ( - )} - - - {os.isAndroid && (Shell.isMagiskSU() || Shell.isKernelSU() || Shell.isAPatchSU()) && hasInstallTools && ( - - )} - - - + )} + + - + + - {mmrl.developerNote && ( - - Developer Note - {mmrl.developerNote.note} - - )} - {fox.minApi && os.sdk <= fox.minApi && ( - - {strings("unsupported")} - {strings("require_sdk", { sdk: parseAndroidVersion(fox.minApi) })} - - )} - {isLowQuality && ( {strings("low_quality_module")} @@ -440,61 +362,73 @@ const ModuleViewActivity = () => { )} - {mmrl.screenshots && ( - - - - {strings("images")} - - - - + + - {mmrl.screenshots.map((image, i) => ( - ({ - ml: 1, - mr: 1, - })} - > - ({ - ":hover": { - cursor: "pointer", + + {strings("about_this_module")} + + {data && ( + { + context.pushPage({ + component: DescriptonActivity, + key: "DescriptonActivity", + extra: { + desc: data, + name: name, + logo: track.icon, }, - boxShadow: "0 1px 2px 0 rgba(60,64,67,.3), 0 1px 3px 1px rgba(60,64,67,.15)", - borderRadius: theme.shape.borderRadius / theme.shape.borderRadius, - })} - onClick={() => { - context.pushPage({ - component: PicturePreviewActivity, - key: "PicturePreviewActivity", - extra: { - picture: image, - }, - }); - }} - /> - - ))} - - - )} + }); + }} + sx={{ ml: 0.5 }} + > + + + )} + - {data ? ( + + {description} + + + {strings("updated_on")} + + {formatLastUpdate} + + + {categories.length !== 0 && ( + + {categories.map((category) => ( + + ))} + + )} + + + + {track.antifeatures ? ( { sx={{ alignItems: "center", }} + variant="h5" direction="row" justifyContent={{ xs: "space-between", sm: "row" }} spacing={1} gutterBottom > - - {strings("about_this_module")} - - { - context.pushPage({ - component: DescriptonActivity, - key: "DescriptonActivity", - extra: { - desc: data, - name: name, - logo: mmrl.logo, - }, - }); - }} - sx={{ ml: 0.5 }} - > - - + {strings("antifeatures")} - - {isLiteralObject(description) ? String((description as ModuleDescription)[currentLanguage]) : String(description)} - - - {strings("updated_on")} - - {formatLastUpdate} - - - {categories.length !== 0 && ( - - {categories.map((category) => ( - - ))} - - )} + + {typeof track.antifeatures === "string" ? ( + + ) : ( + Array.isArray(track.antifeatures) && track.antifeatures.map((anti) => ) + )} + ) : null} - {mmrl.require && ( + {track.require && ( { }} > - {mmrl.require.map((req) => { + {track.require.map((req) => { const findRequire = React.useMemo(() => modules.find((module) => module.id === req), [modules]); if (findRequire) { @@ -616,90 +516,50 @@ const ModuleViewActivity = () => { )} - - - - {strings("requirements")} - - + {track.screenshots && ( + + + + {strings("images")} + + - - {strings("access")}} - > - - - - - - - - - - - - - - {strings("minimum")}} - > - - - - - - - - - - - - - - {strings("recommended")}} + - - - - - - + {track.screenshots.map((image, i) => ( + ({ + ml: 1, + mr: 1, + })} + > + + + ))} + + + )} - {verified && ( + {versions.map((version) => ( + + ))} + + + + + {track.verified && ( @@ -708,28 +568,41 @@ const ModuleViewActivity = () => { )} - {updateJson && ( - - - - - - - )} - - {about.language && ( - + {track.license && ( + { + fetch(`https://raw.githubusercontent.com/spdx/license-list-data/main/website/${track.license}.json`) + .then((res) => { + if (res.status === 200) { + return res.json(); + } else { + throw new Error("Fetching license failed"); + } + }) + .then((json: LicenseSPX) => { + context.pushPage({ + component: FetchTextActivity, + key: "license_" + track.license, + extra: { + raw_data: json.licenseText, + modulename: json.name, + }, + }); + }) + .catch((err) => {}); + }} + > - + - - + + )} - {about.issues && ( + {track.support && ( { - os.open(about.issues, { + os.open(track.support, { target: "_blank", features: { color: theme.palette.primary.main, @@ -740,13 +613,13 @@ const ModuleViewActivity = () => { - + )} { - os.open(about.source, { + os.open(track.source, { target: "_blank", features: { color: theme.palette.primary.main, @@ -757,7 +630,7 @@ const ModuleViewActivity = () => { - + @@ -766,6 +639,69 @@ const ModuleViewActivity = () => { ); }; +interface VersionItemProps { + id: string; + version: Version; +} + +const VersionItem = React.memo(({ id, version }) => { + const ts = useFormatDate(version.timestamp); + const { context } = useActivity(); + const confirm = useConfirm(); + const { theme } = useTheme(); + + const versionName = `${version.version} (${version.versionCode})`; + + const handleInstall = () => { + confirm({ + title: `Install ${versionName}?`, + confirmationText: "Yes", + }).then(() => { + context.pushPage({ + component: TerminalActivity, + key: "TerminalActivity", + extra: { + id: id, + exploreInstall: true, + path: version.zipUrl, + }, + }); + }); + }; + + return ( + + {os.isAndroid && (Shell.isMagiskSU() || Shell.isKernelSU() || Shell.isAPatchSU()) && ( + + + + )} + + { + os.open(version.zipUrl, { + target: "_blank", + features: { + color: theme.palette.primary.main, + }, + }); + }} + edge="end" + aria-label="download" + > + + + + } + > + + + ); +}); + interface State { data?: string; error?: Error; diff --git a/Website/src/activitys/PicturePreviewActivity.tsx b/Website/src/activitys/PicturePreviewActivity.tsx index 02244e56..71a6d596 100644 --- a/Website/src/activitys/PicturePreviewActivity.tsx +++ b/Website/src/activitys/PicturePreviewActivity.tsx @@ -19,11 +19,7 @@ const PicturePreviewActivity = () => { }; return ( - + {this.state.error?.message}; + return ( + +
{this.state.error?.message}
+
+ ); } return ; @@ -113,7 +117,7 @@ const editorDidMount = (editor: monacoEditor.editor.IStandaloneCodeEditor, monac const PlaygroundsActivity = () => { const { context, extra } = useActivity(); - const [description, setDescription] = React.useState(extra.defaultText || ""); + const [description, setDescription] = useNativeStorage("playground_" + extra.title, extra.defaultText || ""); const [errBoundKey, setErrBoundKey] = React.useState(0); const isLargeScreen = useMediaQuery("(min-width:600px)"); diff --git a/Website/src/activitys/ProfileActivity.tsx b/Website/src/activitys/ProfileActivity.tsx deleted file mode 100644 index a9792dd4..00000000 --- a/Website/src/activitys/ProfileActivity.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import { useActivity } from "@Hooks/useActivity"; -import { Toolbar } from "@Components/onsenui/Toolbar"; -import { Page } from "@Components/onsenui/Page"; -import { useStrings } from "@Hooks/useStrings"; -import Stack from "@mui/material/Stack"; -import VerifiedIcon from "@mui/icons-material/Verified"; -import Grid from "@mui/material/Grid"; -import { CardMedia, Box, Typography, Card, SxProps, Theme, Paper, CardContent } from "@mui/material"; -import { colors } from "@Hooks/useSettings"; -import { useRepos } from "@Hooks/useRepos"; -import { ExploreModule } from "@Components/ExploreModule"; -import React from "react"; - -const badgeStyle: (color: (typeof colors)["blue" | "teal" | "red" | "orange"]) => SxProps = (color) => { - return { - px: 1, - py: 0.5, - borderRadius: 1, - display: "flex", - typography: "caption", - bgcolor: (theme) => (theme.palette.mode === "dark" ? color[900] : color[50]), - color: (theme) => (theme.palette.mode === "dark" ? "#fff" : color[700]), - }; -}; - -const ProfileActivty = React.memo(() => { - const { strings } = useStrings(); - const { modules } = useRepos(); - const { context, extra } = useActivity(); - - const { name, bio, avatar, verified, followers } = extra; - - const renderToolbar = () => { - return ( - - - - - {name} - - ); - }; - - return ( - - - - - - - - - {name} {verified && } - - {followers} followers - - - - - - {bio && ( - - - - Biography - - - {bio} - - - - )} - - - - - Participating - - - - {modules - .filter((m) => m.mmrl.author?.name.includes(name) || m.mmrl.contributors?.find((con) => name == con.name)) - .map((module) => ( - - ))} - - - - ); -}); - -export default ProfileActivty; diff --git a/Website/src/activitys/RepoActivity/components/LocalRepository.tsx b/Website/src/activitys/RepoActivity/components/LocalRepository.tsx index a039364d..bcd1964d 100644 --- a/Website/src/activitys/RepoActivity/components/LocalRepository.tsx +++ b/Website/src/activitys/RepoActivity/components/LocalRepository.tsx @@ -6,7 +6,7 @@ import { StyledListItemText } from "@Components/StyledListItemText"; import { useRepos } from "@Hooks/useRepos"; import { useSettings } from "@Hooks/useSettings"; import { useStrings } from "@Hooks/useStrings"; -import { List, ListItem, ListItemButton, ListItemIcon, ListSubheader } from "@mui/material"; +import { IconButton, List, ListItem, ListItemButton, ListItemIcon } from "@mui/material"; import { OverridableComponent } from "@mui/material/OverridableComponent"; import { SvgIconTypeMap } from "@mui/material/SvgIcon/SvgIcon"; import { DeleteRounded, LanguageRounded, SupportRounded, UploadFileRounded, VolunteerActivismRounded } from "@mui/icons-material"; @@ -14,6 +14,8 @@ import { Android12Switch } from "@Components/Android12Switch"; import { os } from "@Native/Os"; import { useFormatDate } from "@Hooks/useFormatDate"; import { useConfirm } from "material-ui-confirm"; +import { useFetch } from "usehooks-ts"; +import DeleteIcon from "@mui/icons-material/Delete"; interface ListItemProps { part?: any; @@ -23,7 +25,7 @@ interface ListItemProps { } interface LocalRepositoryProps { - repo: StoredRepo; + repo: RepoConfig; } const MListItem = React.memo((props) => { @@ -43,98 +45,109 @@ export const LocalRepository = React.memo((props) => { const { settings } = useSettings(); const confirm = useConfirm(); const { actions } = useRepos(); - const [enabled, setEnabled] = React.useState(!settings.disabled_repos.includes(repo.modules)); - - const formatLastUpdate = useFormatDate(repo.last_update); + const [enabled, setEnabled] = React.useState(!settings.disabled_repos.includes(repo.base_url)); const [open, setOpen] = React.useState(false); + const { data } = useFetch(`${repo.base_url}json/modules.json`); + + const formatLastUpdate = useFormatDate(data ? data.metadata.timestamp : 0); + + const handleRepoDelete = () => { + confirm({ + title: "Delete?", + confirmationText: "Sure", + description: strings("confirm_repo_delete", { + name: repo.name, + }), + }).then(() => { + actions.removeRepo({ + id: repo.base_url, + }); + }); + }; + + if (!data) { + return ( + + + + } + > + + + ); + } + const handleClick = () => { setOpen(!open); }; return ( - - - - {open ? : } - + <> + + {open ? : } + - , checked: boolean) => { - actions.setRepoEnabled({ - id: repo.modules, - callback(state) { - setEnabled(!state.some((elem) => elem === repo.modules)); - }, - }); + , checked: boolean) => { + actions.setRepoEnabled({ + id: repo.base_url, + callback(state) { + setEnabled(!state.some((elem) => elem === repo.base_url)); + }, + }); + }} + checked={enabled} + /> + + + + { + if (repo.website) { + os.open(repo.website); + } + }} + /> + { + if (repo.support) { + os.open(repo.support); + } + }} + /> + { + if (repo.donate) { + os.open(repo.donate); + } + }} + /> + { + if (repo.submission) { + os.open(repo.submission); + } }} - checked={enabled} /> - - - - { - if (repo.website) { - os.open(repo.website); - } - }} - /> - { - if (repo.support) { - os.open(repo.support); - } - }} - /> - { - if (repo.donate) { - os.open(repo.donate); - } - }} - /> - { - if (repo.submitModule) { - os.open(repo.submitModule); - } - }} - /> - { - confirm({ - title: "Delete?", - confirmationText: "Sure", - description: strings("confirm_repo_delete", { - name: repo.name, - }), - }).then(() => { - actions.removeRepo({ - id: repo.modules, - }); - }); - }} - /> - - - - + + + + ); }); diff --git a/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx b/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx index 2d2dcf7f..a632fd02 100644 --- a/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx +++ b/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx @@ -1,12 +1,8 @@ -import Icon from "@Components/Icon"; -import Box from "@mui/material/Box"; import IconButton from "@mui/material/IconButton"; -import Typography from "@mui/material/Typography"; import AddIcon from "@mui/icons-material/Add"; -import { StyledCard } from "@Components/StyledCard"; import { useRepos } from "@Hooks/useRepos"; import { os } from "@Native/Os"; -import { ListItem, ListItemText } from "@mui/material"; +import { ListItem } from "@mui/material"; import { StyledListItemText } from "@Components/StyledListItemText"; interface RecommendedRepoProps { @@ -28,7 +24,7 @@ export const RecommendedRepo = (props: RecommendedRepoProps) => { url: props.link, callback: (state) => {}, error: (error) => { - os.toast(error, Toast.LENGTH_SHORT); + os.toast(error.message, Toast.LENGTH_SHORT); }, }); }} @@ -40,4 +36,4 @@ export const RecommendedRepo = (props: RecommendedRepoProps) => { ); -}; +}; \ No newline at end of file diff --git a/Website/src/activitys/RepoActivity/index.tsx b/Website/src/activitys/RepoActivity/index.tsx index 998fae4a..f9047cd4 100644 --- a/Website/src/activitys/RepoActivity/index.tsx +++ b/Website/src/activitys/RepoActivity/index.tsx @@ -29,23 +29,28 @@ import { useNetwork } from "@Hooks/useNetwork"; const recommended_repos = [ { name: "Magisk Modules Alternative Repository", - link: "https://gr.dergoogler.com/magisk/mmar.json", + link: "https://gr.dergoogler.com/mmar/", }, { name: "Googlers Magisk Repo", - link: "https://gr.dergoogler.com/magisk/gmr.json", + link: "https://gr.dergoogler.com/gmr/", }, { - name: "Magisk Modules Repo (Official)", - link: "https://gr.dergoogler.com/magisk/mmr.json", + name: "IzzyOnDroid Magisk Repository", + link: "https://apt.izzysoft.de/magisk/", }, + // { + // name: "Magisk Modules Repo (Official)", + // link: "https://gr.dergoogler.com/mmr/", + // }, ]; -const MemoizdRecommendedRepos = React.memo<{ filteredRepos: StoredRepo[] }>((props) => { +const MemoizdRecommendedRepos = React.memo((props) => { const { strings } = useStrings(); + const { repos } = useRepos(); return ( <> - {props.filteredRepos.length !== 0 && } + {repos.length !== 0 && } ({ bgcolor: theme.palette.background.default })}>{strings("explore_repositories")} @@ -66,7 +71,6 @@ const RepoActivity = () => { const { repos, actions } = useRepos(); const [repoLink, setRepoLink] = React.useState(""); - const [search, setSearch] = React.useState(""); const [open, setOpen] = React.useState(false); @@ -86,11 +90,6 @@ const RepoActivity = () => { setRepoLink(event.target.value); }; - const filteredRepos = React.useMemo( - () => repos.filter((item) => item.name.toLowerCase().includes(search.toLowerCase())), - [repos, search] - ); - const renderToolbar = () => { return ( @@ -109,11 +108,12 @@ const RepoActivity = () => { <> - {filteredRepos.map((repo, index) => ( - - ))} - - {isNetworkAvailable && } + + {repos.map((repo, index) => ( + + ))} + + {isNetworkAvailable && } @@ -144,7 +144,7 @@ const RepoActivity = () => { }, error: (error) => { setRepoLink(""); - os.toast(error, Toast.LENGTH_SHORT); + os.toast(error.message, Toast.LENGTH_SHORT); handleClose(); }, }); diff --git a/Website/src/activitys/SearchActivity.tsx b/Website/src/activitys/SearchActivity.tsx new file mode 100644 index 00000000..a7b717f5 --- /dev/null +++ b/Website/src/activitys/SearchActivity.tsx @@ -0,0 +1,108 @@ +import React from "react"; +import FlatList, { SearchOptionsInterface, FlatListProps } from "flatlist-react"; +import { useActivity } from "@Hooks/useActivity"; +import { Toolbar } from "@Components/onsenui/Toolbar"; +import { Page } from "@Components/onsenui/Page"; +import { useStrings } from "@Hooks/useStrings"; +import InputBase from "@mui/material/InputBase"; +import ClearIcon from "@mui/icons-material/Clear"; +import { Box, List } from "@mui/material"; +import { renderFunc } from "flatlist-react/lib/___subComponents/uiFunctions"; +import { useTheme } from "@Hooks/useTheme"; + +const RenderWhenEmpty = React.memo(() => { + const { theme } = useTheme(); + return ( + + What you looking for? + + ); +}); + +interface SearchActivityProps { + list: any[]; + placeholder?: string; + search?: SearchOptionsInterface; + group?: FlatListProps["group"]; + renderList: renderFunc; +} + +function SearchActivity(props: SearchActivityProps) { + const { strings } = useStrings(); + const { context } = useActivity(); + const { theme } = useTheme(); + + const { placeholder, list, renderList } = props; + const __placeholder = placeholder ? placeholder : strings("search"); + + const [search, setSearch] = React.useState(""); + + const renderToolbar = () => { + return ( + + + + + + setSearch(e.target.value)} + placeholder={__placeholder} + /> + + + + { + setSearch(""); + }} + /> + + + ); + }; + + const __list = React.useMemo(() => (search ? list : []), [search]); + + return ( + + + + } + renderOnScroll + search={{ term: search, ...props.search }} + group={props.group} + /> + + + + ); +} + +export { SearchActivity, SearchActivityProps }; diff --git a/Website/src/activitys/SettingsActivity.tsx b/Website/src/activitys/SettingsActivity.tsx index aee1684d..065f51ea 100644 --- a/Website/src/activitys/SettingsActivity.tsx +++ b/Website/src/activitys/SettingsActivity.tsx @@ -16,12 +16,12 @@ import { Shell } from "@Native/Shell"; import { DialogEditTextListItem } from "@Components/DialogEditTextListItem"; import { Properties } from "@Native/Properties"; import { useLanguageMap } from "./../locales/declaration"; -import { useModConf } from "@Hooks/useModConf"; +import { useModFS } from "@Hooks/useModFS"; import { useLocalModules } from "@Hooks/useLocalModules"; function SettingsActivity() { const { context } = useActivity(); - const { _modConf } = useModConf(); + const { _modFS } = useModFS(); const { strings } = useStrings(); const availableLangs = useLanguageMap(); const { setRepos } = useRepos(); @@ -51,7 +51,7 @@ function SettingsActivity() { ({ bgcolor: theme.palette.background.default })}>{strings("appearance")}} > - + {/* )} - + */} @@ -197,7 +197,7 @@ function SettingsActivity() { version_name: Shell.VERSION_NAME(), version_code: Shell.VERSION_CODE(), }, - modconf: _modConf, + modconf: _modFS, modules: localModules, }, null, diff --git a/Website/src/activitys/TerminalActivity.tsx b/Website/src/activitys/TerminalActivity.tsx index 38b4b8f1..1505a515 100644 --- a/Website/src/activitys/TerminalActivity.tsx +++ b/Website/src/activitys/TerminalActivity.tsx @@ -9,12 +9,14 @@ import React from "react"; import { Shell } from "@Native/Shell"; import { useSettings } from "@Hooks/useSettings"; import { BuildConfig } from "@Native/BuildConfig"; -import { useModConf } from "@Hooks/useModConf"; +import { useModFS } from "@Hooks/useModFS"; +import { INCLUDE_CORE } from "@Util/INCLUDE_CORE"; +import { view } from "@Native/View"; const TerminalActivity = () => { const { context, extra } = useActivity(); const { settings } = useSettings(); - const { modConf, __modConf } = useModConf(); + const { modFS, __modFS } = useModFS(); const [active, setActive] = React.useState(true); const [lines, setLines] = React.useState([]); @@ -22,9 +24,6 @@ const TerminalActivity = () => { const ref = React.useRef(null); const termEndRef = React.useRef(null); - const addLine = (line: string) => { - setLines((lines) => [...lines, line]); - }; if (settings.term_scroll_bottom) { const termBehavior = React.useMemo(() => settings.term_scroll_behavior, [settings]); @@ -34,27 +33,60 @@ const TerminalActivity = () => { }, [lines]); } - const install = () => { - const { exploreInstall, path } = extra; + const processCommand = (rawCommand: string) => { + let arg: string | any[]; + let command: string; + console.log(rawCommand); + const i = rawCommand.indexOf(" "); + if (i != -1 && rawCommand.length != i + 1) { + arg = rawCommand + .substring(i + 1) + .trim() + .split(" "); + command = rawCommand.substring(0, i); + } else { + arg = ""; + command = rawCommand; + } - if (exploreInstall) { - const url = new URL(path).pathname.split("/"); + switch (command) { + case "clearTerminal": + setLines([]); + break; + case "log": + console.log(arg[0]); + break; + } + }; - const name = url[2]; - const branch = url[4].split(".").slice(0, -1).join("."); + const addLine = (line: string) => { + if (line.startsWith("#!mmrl:")) { + processCommand(line.substring(7)); + } else { + setLines((lines) => [...lines, line]); + } + }; + const install = () => { + const { exploreInstall, path, id } = extra; + + if (exploreInstall) { const envp_explore = { MMRL: "true", MMRL_VER: BuildConfig.VERSION_CODE.toString(), - NAME: name, + NAME: id, URL: path, - BRANCH: branch, ROOTMANAGER: Shell.getRootManager(), - ...__modConf, + ...__modFS, }; Terminal.exec({ - command: `${modConf("MMRLINI")}/system/usr/share/mmrl/bin/mmrl_explore_install_v3`, + command: modFS("EXPLORE_INSTALL", { + INCLUDECORE: INCLUDE_CORE, + URL: path, + MODID: id, + }), + cwd: "/data/local/tmp", env: envp_explore, onLine: (line) => { addLine(line); @@ -69,14 +101,19 @@ const TerminalActivity = () => { const envp_local = { MMRL: "true", MMRL_VER: BuildConfig.VERSION_CODE.toString(), + NAME: id, ZIPFILE: path, ROOTMANAGER: Shell.getRootManager(), - ...__modConf, + ...__modFS, }; Terminal.exec({ - command: `${modConf("MMRLINI")}/system/usr/share/mmrl/bin/mmrl_local_install_v3`, + command: modFS("LOCAL_INSTALL", { + INCLUDECORE: INCLUDE_CORE, + ZIPFILE: path, + }), env: envp_local, + cwd: "/data/local/tmp", onLine: (line) => { addLine(line); }, @@ -108,7 +145,6 @@ const TerminalActivity = () => { onShow={install} modifier="noshadow" renderToolbar={renderToolbar} - backgroundStyle="#000000" >
{ style={{ whiteSpace: "pre", flex: "0 0 100%", - backgroundColor: "black", color: "white", height: "100%", }} @@ -135,7 +170,7 @@ const TerminalActivity = () => { ))}
-
+
); }; diff --git a/Website/src/activitys/fragments/DrawerFragment.tsx b/Website/src/activitys/fragments/DrawerFragment.tsx index 9a273831..7f411e67 100644 --- a/Website/src/activitys/fragments/DrawerFragment.tsx +++ b/Website/src/activitys/fragments/DrawerFragment.tsx @@ -13,8 +13,9 @@ import { ConfigureActivity } from "@Activitys/ConfigureActivity"; import { Markup } from "@Components/Markdown"; import { configureSample } from "@Util/configure-sample"; import { dapiSample } from "@Util/dapi-sample"; -import ModConfActivity from "@Activitys/ModConfActivity"; -import { os } from "@Native/Os"; +import ModFSActivity from "@Activitys/ModFSActivity"; +import ModConfPlaygroundActivity from "@Activitys/ModConfPlaygroundActivity"; +import LicensesActivity from "@Activitys/LicensesActivity"; type Props = { renderToolbar: () => JSX.Element; @@ -53,22 +54,19 @@ export const DrawerFragment = (props: Props) => { > - {/* {os.isAndroid && ( */} - <> - { - pushPage({ - component: ModConfActivity, - key: "ModConfActivity", - extra: {}, - }); - hide(); - }} - > - - - - {/* )} */} + + { + pushPage({ + component: ModFSActivity, + key: "ModFSActivity", + extra: {}, + }); + hide(); + }} + > + + @@ -94,21 +92,18 @@ export const DrawerFragment = (props: Props) => { { - pushPage({ - component: PlaygroundsActivity, - key: "configure_playground", + pushPage({ + component: ModConfPlaygroundActivity, + key: "ModConfPlaygroundActivity", extra: { - title: "Configure playground", editorMode: "javascript", defaultText: configureSample, - previewPage: ConfigureActivity, - preview: ConfigureView, }, }); hide(); }} > - + @@ -125,22 +120,18 @@ export const DrawerFragment = (props: Props) => { hide(); }} > - + { pushPage({ - component: FetchTextActivity, + component: LicensesActivity, key: "license", - extra: { - title: "License", - url: "https://raw.githubusercontent.com/wiki/DerGoogler/MMRL/License.md", - }, }); hide(); }} > - + { diff --git a/Website/src/activitys/fragments/ModuleFragment.tsx b/Website/src/activitys/fragments/ModuleFragment.tsx index 677bd57d..d8a27eaf 100644 --- a/Website/src/activitys/fragments/ModuleFragment.tsx +++ b/Website/src/activitys/fragments/ModuleFragment.tsx @@ -1,7 +1,7 @@ import React from "react"; import Stack from "@mui/material/Stack"; import Box from "@mui/material/Box"; -import FlatList from "flatlist-react"; +import FlatList, { FlatListProps } from "flatlist-react"; import { useTheme } from "@Hooks/useTheme"; import { Page, RenderFunction } from "@Components/onsenui/Page"; import { MissingInternet } from "@Components/MissingInternet"; @@ -13,32 +13,32 @@ import Button from "@mui/material/Button"; import Menu, { MenuProps } from "@mui/material/Menu"; import MenuItem from "@mui/material/MenuItem"; import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown"; +import VolunteerActivismIcon from "@mui/icons-material/VolunteerActivism"; +import { os } from "@Native/Os"; const RenderWhenEmpty = React.memo(() => { const { theme } = useTheme(); return ( - - No modules were found - + No modules were found + ); }); export interface ModuleFragmentProps { - search: string; id: "explore" | "update" | "local"; modules: Array; + group?: FlatListProps["group"]; renderItem: renderFunc; renderFixed?: RenderFunction; } @@ -82,7 +82,7 @@ const StyledMenu = styled((props: MenuProps) => ( const ModuleFragment = React.memo((props) => { const { isNetworkAvailable } = useNetwork(); - + const { theme } = useTheme(); const renderItem = React.useCallback>((m, k) => props.renderItem(m, k), []); const [filter, _filter, setFilter] = useModuleFilter(`${props.id}_filter`); @@ -107,14 +107,27 @@ const ModuleFragment = React.memo((props) => { return ( - + + - )} - - - ); -}); - -export default DeviceModule; diff --git a/Website/src/components/DialogEditTextListItem.tsx b/Website/src/components/DialogEditTextListItem.tsx index 1e966998..882743e3 100644 --- a/Website/src/components/DialogEditTextListItem.tsx +++ b/Website/src/components/DialogEditTextListItem.tsx @@ -14,16 +14,18 @@ import { CustomTextField } from "./TextField"; export interface DialogEditTextListItemProps extends React.PropsWithChildren { inputLabel: React.ReactNode; - title: string; + title: React.ReactNode; disabled?: boolean; initialValue: string; - description?: string; + description?: React.ReactNode; type?: React.HTMLInputTypeAttribute; onSuccess: (value: string) => void; InputProps?: Partial; counter?: boolean; helperText?: string; maxLength?: number; + multiline?: boolean; + maxRows?: number; } export const DialogEditTextListItem = (props: DialogEditTextListItemProps) => { @@ -50,7 +52,7 @@ export const DialogEditTextListItem = (props: DialogEditTextListItemProps) => { {props.children} - + {props.title} {props.description && {props.description}} @@ -68,25 +70,13 @@ export const DialogEditTextListItem = (props: DialogEditTextListItemProps) => { counter={props.counter} helperText={props.helperText} inputProps={{ maxLength: props.maxLength }} + multiline={props.multiline} + maxRows={props.maxRows} /> - - + + diff --git a/Website/src/components/ExploreModule.tsx b/Website/src/components/ExploreModule.tsx deleted file mode 100644 index 5e734d0e..00000000 --- a/Website/src/components/ExploreModule.tsx +++ /dev/null @@ -1,171 +0,0 @@ -import { Alert, AlertTitle, Box, Card, CardMedia, Chip, Stack, SxProps, Typography } from "@mui/material"; -import { useActivity } from "@Hooks/useActivity"; -import { useStrings } from "@Hooks/useStrings"; -import { useLowQualityModule } from "@Hooks/useLowQualityModule"; -import { colors, useSettings } from "@Hooks/useSettings"; -import { useFormatDate } from "@Hooks/useFormatDate"; -import { GestureDetector } from "./onsenui/GestureDetector"; -import { useTheme } from "@Hooks/useTheme"; -import ModuleViewActivity from "@Activitys/ModuleViewActivity"; -import StarBorderRoundedIcon from "@mui/icons-material/StarBorderRounded"; -import VerifiedIcon from "@mui/icons-material/Verified"; -import React from "react"; -import { isLiteralObject } from "@Util/util"; - -interface Props { - moduleProps: Module; - disableLowQuality?: boolean; - disableCovers?: boolean; - sx?: SxProps; -} - -export const ExploreModule = React.memo((props) => { - const { context } = useActivity(); - const { strings, currentLanguage } = useStrings(); - const { settings } = useSettings(); - const { theme, scheme, shade } = useTheme(); - - const { id, name, version, versionCode, description, stars, author, last_update, mmrl, valid, hidden } = props.moduleProps; - - const isLowQuality = useLowQualityModule(props.moduleProps, !settings._low_quality_module); - const formatLastUpdate = useFormatDate(last_update); - - if (hidden) { - return null; - } - - if (!settings._invald_module && !valid) { - return null; - } - - const handleOpen = () => { - context.pushPage({ - component: ModuleViewActivity, - key: "ModuleViewActivity", - extra: props.moduleProps, - }); - }; - - const CoverHandler = () => { - if (props.disableCovers) { - return null; - } - - if (mmrl.cover) { - return ( - ({ - height: "100%", - objectFit: "cover", - m: 1, - borderRadius: theme.shape.borderRadius / 8, - boxShadow: "0 1px 2px 0 rgba(60,64,67,.3), 0 1px 10px 1px rgba(60,64,67,.15)", - width: "calc(100% - 16px)", - })} - image={mmrl.cover} - alt={name} - /> - ); - } - - return null; - }; - - return ( - - - - - - {name} - - - - - {version} ({versionCode}) / - - {mmrl.author ? ( - - {mmrl.author.name} {mmrl.author.verified && } - - ) : ( - {author} - )} - - - - {isLiteralObject(description) ? String((description as ModuleDescription)[currentLanguage]) : String(description)} - - - - - ({ - bgcolor: `${settings.darkmode ? shade(scheme[200], -24.5) : shade(scheme[300], 49)}46`, - })} - label={formatLastUpdate} - /> - - - - - {stars} - - - - - {isLowQuality && ( - - {strings("low_quality_module")} - {strings("low_quality_module_warn")} - - )} - - ); -}); diff --git a/Website/src/components/Markdown/StyledMarkdown.tsx b/Website/src/components/Markdown/StyledMarkdown.tsx index aceb30bc..8603abf5 100644 --- a/Website/src/components/Markdown/StyledMarkdown.tsx +++ b/Website/src/components/Markdown/StyledMarkdown.tsx @@ -154,7 +154,7 @@ export const StyledMarkdown = styled("article")(() => { backgroundColor: theme.palette.background.default, borderTop: `thin solid ${theme.palette.divider}`, "&:nth-child(2n)": { - backgroundColor: settings.darkmode ? shade(scheme[900], -85) : "#f6f8fa", + backgroundColor: theme.palette.background.paper, }, }, img: { backgroundColor: "transparent" }, @@ -215,8 +215,8 @@ export const StyledMarkdown = styled("article")(() => { blockquote: { margin: "0", padding: "0 1em", - color: settings.darkmode ? shade(scheme[200], -9.2) : "#57606a", - borderLeft: `0.25em solid ${settings.darkmode ? shade(scheme[200], -9.2) : "#57606a"}`, + color: theme.palette.text.secondary, + borderLeft: `5px solid ${theme.palette.text.secondary}`, }, ul: { marginTop: "0", @@ -261,7 +261,8 @@ export const StyledMarkdown = styled("article")(() => { padding: "16px", overflow: "auto", lineHeight: 1.45, - backgroundColor: "#22272e", + color: theme.palette.text.primary, + backgroundColor: theme.palette.background.paper, borderRadius: theme.shape.borderRadius, "code,\n tt": { display: "inline", @@ -448,8 +449,8 @@ export const StyledMarkdown = styled("article")(() => { padding: "0.2em 0.4em", margin: "0", fontSize: "85%", - color: "#cdd9e5", - backgroundColor: "#22272e", + color: theme.palette.text.primary, + backgroundColor: theme.palette.background.paper, borderRadius: "6px", }, "code br,\n tt br": { display: "none" }, @@ -463,7 +464,8 @@ export const StyledMarkdown = styled("article")(() => { overflow: "auto", fontSize: "85%", lineHeight: 1.45, - backgroundColor: "#22272e", + color: theme.palette.text.primary, + backgroundColor: theme.palette.background.paper, borderRadius: "6px", }, }, @@ -529,8 +531,8 @@ export const StyledMarkdown = styled("article")(() => { display: "block", overflowX: "auto", padding: "0.5em", - color: "#cdd9e5", - background: "#22272e", + color: theme.palette.text.primary, + backgroundColor: theme.palette.background.paper, }, ".hljs-comment,\n.hljs-punctuation": { color: "#768390" }, ".hljs-attr,\n.hljs-attribute,\n.hljs-meta,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-selector-id": { diff --git a/Website/src/components/Markdown/index.tsx b/Website/src/components/Markdown/index.tsx index b4674e00..0619055f 100644 --- a/Website/src/components/Markdown/index.tsx +++ b/Website/src/components/Markdown/index.tsx @@ -9,6 +9,8 @@ import { Image } from "@Components/dapi/Image"; import { StyledMarkdown } from "./StyledMarkdown"; import { DiscordWidget } from "@Components/dapi/DiscordWidget"; import { AlertIcon, BugIcon, CheckIcon, IssueClosedIcon, IssueOpenedIcon, IssueReopenedIcon, XIcon } from "@primer/octicons-react"; +import Code from "@Components/dapi/Code"; +import Pre from "@Components/dapi/Pre"; type Props = { children: string; @@ -75,7 +77,12 @@ export const MarkdownOverrides: MarkdownToJSX.Overrides | undefined = { stack: { component: Stack, }, - + code: { + component: Code, + }, + pre: { + component: Pre, + }, discordwidget: { component: DiscordWidget, }, diff --git a/Website/src/components/dapi/Anchor.tsx b/Website/src/components/dapi/Anchor.tsx index af89a937..b5477641 100644 --- a/Website/src/components/dapi/Anchor.tsx +++ b/Website/src/components/dapi/Anchor.tsx @@ -1,5 +1,5 @@ import { useTheme } from "@Hooks/useTheme"; -import { Box, Typography, styled } from "@mui/material"; +import { Box, Stack, Tooltip, Typography, styled } from "@mui/material"; import { useActivity } from "../../hooks/useActivity"; import Icon from "@Components/Icon"; import NorthEastRoundedIcon from "@mui/icons-material/NorthEastRounded"; @@ -12,7 +12,6 @@ import ModuleViewActivity from "@Activitys/ModuleViewActivity"; import ExtensionIcon from "@mui/icons-material/Extension"; import { useRepos } from "@Hooks/useRepos"; import FetchTextActivity from "@Activitys/FetchTextActivity"; -import { createRoot } from "react-dom/client"; import React from "react"; interface AnchorProps { @@ -20,17 +19,15 @@ interface AnchorProps { module?: string; } -const StyledAnchor = styled("div")(({ theme }) => { +const StyledAnchor = styled("div")(({ theme }: { theme: MMRLTheme }) => { const { scheme } = useTheme(); const { settings } = useSettings(); const s = { cursor: "pointer", - color: settings.darkmode ? scheme[200] : scheme[700], - // color: !settings.darkmode ? "rgb(66, 66, 66)" : scheme[700], + color: theme.palette.text.link, display: "flex", alignItems: "center", - ":hover": { textDecoration: "underline", }, @@ -46,21 +43,18 @@ const StyledAnchor = styled("div")(({ theme }) => { function Anchor(props: JSX.IntrinsicElements["a"] & AnchorProps) { const { href, children, noIcon, module, color } = props; - const { theme, scheme } = useTheme(); - const { settings } = useSettings(); + const { theme } = useTheme(); const { modules } = useRepos(); const { context } = useActivity(); - const _color = !color ? (settings.darkmode ? scheme[200] : scheme[700]) : color; - const s = React.useMemo( () => ({ cursor: "pointer", - color: _color, + color: theme.palette.text.link, display: "flex", alignItems: "center", ":hover": { - textDecorationColor: _color, + textDecorationColor: theme.palette.text.link, textDecoration: "underline", }, }), @@ -69,55 +63,65 @@ function Anchor(props: JSX.IntrinsicElements["a"] & AnchorProps) { const findModule = React.useMemo(() => modules.find((m) => m.id === module), [module]); + const __href = !(module && findModule) ? href : module; + return ( - + { - if (module && findModule) { - context.pushPage({ - component: ModuleViewActivity, - key: "ModuleViewActivity", - extra: findModule, - }); - } else { - if (href) { - os.open(href, { - target: "_blank", - features: { - color: theme.palette.primary.main, - }, - }); - } - } + sx={{ + display: "inline-block", + "& div[href]": s, + "& div[page]": s, }} - color={_color} > - - {children} - - {!noIcon && ( - <> - { + if (module && findModule) { + context.pushPage({ + component: ModuleViewActivity, + key: "ModuleViewActivity", + extra: findModule, + }); + } else { + if (__href) { + os.open(__href, { + target: "_blank", + features: { + color: theme.palette.background.default, + }, + }); + } + } + }} + color={theme.palette.text.link} + > + + {children} + + {!noIcon && ( + - - )} + )} + - + ); } diff --git a/Website/src/components/dapi/Code.tsx b/Website/src/components/dapi/Code.tsx new file mode 100644 index 00000000..ba9f7653 --- /dev/null +++ b/Website/src/components/dapi/Code.tsx @@ -0,0 +1,27 @@ +import React, { useRef } from "react"; + +const Code = React.forwardRef((props, _ref) => { + const ref = (_ref as React.MutableRefObject) || useRef(null); + + React.useEffect(() => { + if (ref.current) { + ref.current.addEventListener( + "contextmenu", + function (event) { + event.returnValue = true; + if (typeof event.stopPropagation === "function") { + event.stopPropagation(); + } + if (typeof event.cancelBubble === "function") { + (event as any).cancelBubble(); + } + }, + true + ); + } + }, []); + + return ; +}); + +export default Code; diff --git a/Website/src/components/dapi/Image.tsx b/Website/src/components/dapi/Image.tsx index 4579920d..ef440d34 100644 --- a/Website/src/components/dapi/Image.tsx +++ b/Website/src/components/dapi/Image.tsx @@ -24,6 +24,7 @@ function Image(props: Props) { cursor: !noOpen ? "pointer" : "unset", }, borderRadius: theme.shape.borderRadius / theme.shape.borderRadius, + border: `1px solid ${theme.palette.divider} !important`, boxShadow: theme.shadows[shadow || 0], }} src={src} diff --git a/Website/src/components/dapi/Pre.tsx b/Website/src/components/dapi/Pre.tsx new file mode 100644 index 00000000..8d9cca30 --- /dev/null +++ b/Website/src/components/dapi/Pre.tsx @@ -0,0 +1,27 @@ +import React, { useRef } from "react"; + +const Pre = React.forwardRef((props, _ref) => { + const ref = (_ref as React.MutableRefObject) || useRef(null); + + React.useEffect(() => { + if (ref.current) { + ref.current.addEventListener( + "contextmenu", + function (event) { + event.returnValue = true; + if (typeof event.stopPropagation === "function") { + event.stopPropagation(); + } + if (typeof event.cancelBubble === "function") { + (event as any).cancelBubble(); + } + }, + true + ); + } + }, []); + + return
;
+});
+
+export default Pre;
diff --git a/Website/src/components/module/DeviceModule.tsx b/Website/src/components/module/DeviceModule.tsx
new file mode 100644
index 00000000..cf09ae23
--- /dev/null
+++ b/Website/src/components/module/DeviceModule.tsx
@@ -0,0 +1,216 @@
+import React from "react";
+import Typography from "@mui/material/Typography";
+import Card from "@mui/material/Card";
+import Stack from "@mui/material/Stack";
+import Chip from "@mui/material/Chip";
+import Divider from "@mui/material/Divider";
+import Button from "@mui/material/Button";
+
+import { ConfigureActivity } from "@Activitys/ConfigureActivity";
+
+import { Android12Switch } from "@Components/Android12Switch";
+
+import { Delete, Settings, RefreshRounded } from "@mui/icons-material";
+
+import { useTheme } from "@Hooks/useTheme";
+import { useSettings } from "@Hooks/useSettings";
+import { useLowQualityModule } from "@Hooks/useLowQualityModule";
+import { useStrings } from "@Hooks/useStrings";
+import { useActivity } from "@Hooks/useActivity";
+import { useLog } from "@Hooks/native/useLog";
+import { ModFS, useModFS } from "@Hooks/useModFS";
+
+import { SuFile } from "@Native/SuFile";
+// @ts-ignore
+import { useConfirm } from "material-ui-confirm";
+
+interface Props {
+  module: Module;
+}
+
+const DeviceModule = React.memo((props) => {
+  const { theme } = useTheme();
+  const { modFS: modConf } = useModFS();
+  const { strings } = useStrings();
+  const { settings } = useSettings();
+  const { context } = useActivity();
+
+  const log = useLog("DeviceModule");
+  const confirm = useConfirm();
+
+  const { id, name, author, version, versionCode, timestamp, description } = props.module;
+
+  const format = React.useCallback<(key: K) => ModFS[K]>((key) => modConf(key, { MODID: id }), []);
+
+  const remove = new SuFile(format("REMOVE"));
+  const disable = new SuFile(format("DISABLE"));
+
+  const [isEnabled, setIsEnabled] = React.useState(!disable.exist());
+  const [isSwitchDisabled, setIsSwitchDisabled] = React.useState(remove.exist());
+
+  const isLowQuality = useLowQualityModule(props.module, !settings._low_quality_module);
+  const isNew = React.useMemo(() => new Date().getTime() - timestamp < 60 * 60 * 1000, [timestamp]);
+  const isDisabledStyle = React.useMemo(() => (isSwitchDisabled ? { textDecoration: "line-through" } : {}), [isSwitchDisabled]);
+
+  const post_service = SuFile.exist(format("POSTSERVICE"));
+  const late_service = SuFile.exist(format("LATESERVICE"));
+  const post_mount = SuFile.exist(format("POSTMOUNT"));
+  const boot_complete = SuFile.exist(format("BOOTCOMP"));
+  const module_config_file = SuFile.exist(format("CONFINDEX"));
+
+  return (
+    
+      
+        
+          {isLowQuality && (
+             {
+                confirm({ title: strings("low_quality_module"), description: strings("low_quality_module_warn") }).then(() => {});
+              }}
+              label={{strings("low_quality_module")}}
+              size="small"
+              sx={{ borderRadius: theme.shape.borderRadius / theme.shape.borderRadius }}
+            />
+          )}
+          {isNew && (
+            {strings("new")}}
+              size="small"
+              sx={{ borderRadius: theme.shape.borderRadius / theme.shape.borderRadius }}
+            />
+          )}
+        
+        
+          
+            
+              {name}
+            
+            
+              {version} ({versionCode}) / {author}
+            
+          
+          
+             {
+                const checked = e.target.checked;
+
+                if (checked) {
+                  if (disable.exist()) {
+                    if (disable.delete()) {
+                      log.d(
+                        strings("module_enabled_LOG", {
+                          name: module,
+                        })
+                      );
+                    }
+                  }
+                } else {
+                  if (!disable.exist()) {
+                    if (disable.create()) {
+                      log.d(
+                        strings("module_disabled_LOG", {
+                          name: module,
+                        })
+                      );
+                    }
+                  }
+                }
+                setIsEnabled(checked);
+              }}
+              sx={{
+                right: -8,
+              }}
+            />
+          
+        
+        
+          {description}
+        
+        
+          
+            {post_service && }
+            {late_service && }
+            {post_mount && }
+            {boot_complete && }
+          
+          
+          
+            
+
+            {isSwitchDisabled ? (
+              
+            ) : (
+              
+            )}
+          
+        
+      
+    
+  );
+});
+
+export default DeviceModule;
diff --git a/Website/src/components/module/ExploreModule.tsx b/Website/src/components/module/ExploreModule.tsx
new file mode 100644
index 00000000..85a40bf2
--- /dev/null
+++ b/Website/src/components/module/ExploreModule.tsx
@@ -0,0 +1,111 @@
+import React from "react";
+
+import Typography from "@mui/material/Typography";
+import Card from "@mui/material/Card";
+import Stack from "@mui/material/Stack";
+import Chip from "@mui/material/Chip";
+import Divider from "@mui/material/Divider";
+import CardMedia from "@mui/material/CardMedia";
+import WarningAmberIcon from "@mui/icons-material/WarningAmber";
+
+import { Verified } from "@mui/icons-material";
+
+import ModuleViewActivity from "@Activitys/ModuleViewActivity";
+
+import { useFormatDate } from "@Hooks/useFormatDate";
+import { useActivity } from "@Hooks/useActivity";
+import Tooltip from "@mui/material/Tooltip";
+import { useStrings } from "@Hooks/useStrings";
+import { GestureDetector } from "@Components/onsenui/GestureDetector";
+import { useTheme } from "@Hooks/useTheme";
+
+interface Props {
+  module: Module;
+}
+
+const ExploreModule = React.memo((props) => {
+  const { id, name, author, description, track, timestamp, version, versions, versionCode } = props.module;
+
+  const { context } = useActivity();
+  const { strings } = useStrings();
+  const { theme } = useTheme();
+
+  const formatLastUpdate = useFormatDate(timestamp ? timestamp : versions[versions.length - 1].timestamp);
+
+  const handleOpenModule = () => {
+    context.pushPage({
+      component: ModuleViewActivity,
+      key: "ModuleViewActivity",
+      extra: props.module,
+    });
+  };
+
+  return (
+    
+      
+        {track.cover && (
+           ({
+              height: "100%",
+              objectFit: "cover",
+              borderRadius: theme.shape.borderRadius / theme.shape.borderRadius,
+              border: `1px solid ${theme.palette.divider} !important`,
+              width: "100%",
+            })}
+            image={track.cover}
+            alt={name}
+          />
+        )}
+
+        
+          
+            {name}
+            {track.verified && (
+              
+                
+              
+            )}
+          
+
+          
+            {version} ({versionCode}) / {author}
+          
+        
+        
+          {description}
+        
+        
+          
+          
+            
+
+            
+              {track.antifeatures && (
+                } />
+              )}
+            
+          
+        
+      
+    
+  );
+});
+
+export default ExploreModule;
diff --git a/Website/src/components/module/UpdateModule.tsx b/Website/src/components/module/UpdateModule.tsx
new file mode 100644
index 00000000..8a8c2b4a
--- /dev/null
+++ b/Website/src/components/module/UpdateModule.tsx
@@ -0,0 +1,142 @@
+import React from "react";
+
+import { ArrowRightAlt } from "@mui/icons-material";
+
+import ButtonGroup from "@mui/material/ButtonGroup";
+import Button from "@mui/material/Button";
+import Typography from "@mui/material/Typography";
+import Card from "@mui/material/Card";
+import Stack from "@mui/material/Stack";
+import Chip from "@mui/material/Chip";
+import Divider from "@mui/material/Divider";
+
+import { useTheme } from "@Hooks/useTheme";
+import { useLog } from "@Hooks/native/useLog";
+import { useStrings } from "@Hooks/useStrings";
+import { useActivity } from "@Hooks/useActivity";
+import { useRepos } from "@Hooks/useRepos";
+
+import TerminalActivity from "@Activitys/TerminalActivity";
+import FetchTextActivity from "@Activitys/FetchTextActivity";
+
+import { link } from "googlers-tools";
+
+interface Props {
+  module: Module;
+}
+
+const UpdateModule = React.memo((props) => {
+  const { theme } = useTheme();
+  const { strings } = useStrings();
+  const { context } = useActivity();
+  const { modules, repos } = useRepos();
+
+  const { id, name, author, version, versionCode, updateJson: __updateJson } = props.module;
+
+  const log = useLog("UpdateModule");
+
+  const [updateJson, setUpdateJson] = React.useState(null);
+
+  if (__updateJson && link.validURL(__updateJson)) {
+    React.useEffect(() => {
+      fetch(__updateJson)
+        .then((res) => res.json())
+        .then((json: UpdateJson) => setUpdateJson(json));
+    }, [repos]);
+  } else {
+    log.d(strings("dm_update_json_fetch_warn", { id: id }));
+  }
+
+  const hasUpdate = React.useMemo(() => {
+    const onlineModule = modules.find((module) => module.id === id);
+    if (__updateJson && updateJson) {
+      return versionCode < Number(updateJson.versionCode);
+    } else {
+      return onlineModule && versionCode < onlineModule.versionCode;
+    }
+  }, [updateJson, modules, repos]);
+
+  const updatedModule = React.useMemo(() => {
+    const onlineModule = modules.find((module) => module.id === id);
+    if (__updateJson && updateJson) {
+      return updateJson;
+    } else {
+      return onlineModule && onlineModule.versions[onlineModule.versions.length - 1];
+    }
+  }, [updateJson, modules, repos]);
+
+  if (!hasUpdate) return null;
+
+  return (
+    
+      
+        
+          {name}
+          {author}
+        
+
+        
+          
+            
+              Version:
+            
+            
+            
+            
+          
+
+          
+            
+              Version code:
+            
+            
+            
+            
+          
+        
+
+        
+          
+          
+            
+            
+          
+        
+      
+    
+  );
+});
+
+export default UpdateModule;
diff --git a/Website/src/components/onsenui/Page.tsx b/Website/src/components/onsenui/Page.tsx
index a9b34029..2a762fb4 100644
--- a/Website/src/components/onsenui/Page.tsx
+++ b/Website/src/components/onsenui/Page.tsx
@@ -18,7 +18,7 @@ interface HTMLPage {
    */
   compSx?: SxProps;
   sx?: SxProps;
-  backgroundStyle?: React.CSSProperties["backgroundColor"];
+  backgroundStyle?: SxProps;
   modifier?: string;
   renderModal?: RenderFunction;
   renderToolbar?: RenderFunction;
@@ -42,21 +42,12 @@ const HTMLPage = onsCustomElement("ons-page", {
 const _Page = React.forwardRef((props, ref) => {
   const { theme } = useTheme();
   const { context } = useActivity();
-  const { renderToolbar, renderBottomToolbar, renderModal, renderFixed, sx, compSx, children, ...rest } = props;
-
-  React.useEffect(() => {
-    if (props.backgroundStyle) {
-      os.setNavigationBarColor(props.backgroundStyle);
-      return () => {
-        os.setNavigationBarColor(theme.palette.background.default);
-      };
-    }
-  }, [props.backgroundStyle]);
+  const { renderToolbar, renderBottomToolbar, renderModal, renderFixed, sx, compSx, children, backgroundStyle, ...rest } = props;
 
   return (
     
       {renderToolbar && renderToolbar(ref, context)}
-      
+      
       
         {children}
       
@@ -99,7 +90,7 @@ const RelativeContent = styled(Content)((props: ContentProps) => {
     minWidth: props.minWidth ? props.minWidth : 200,
     maxWidth: props.maxWidth ? props.maxWidth : 980,
     margin: "0 auto",
-    ...(matches ? { padding: props.zeroMargin ? 0 : 8 } : { padding: 45 }),
+    ...(matches ? { padding: props.zeroMargin ? 0 : 8 } : { padding: "8px 45px 8px 45px" }),
   };
 });
 
diff --git a/Website/src/components/onsenui/Toolbar.tsx b/Website/src/components/onsenui/Toolbar.tsx
index 06e26b1c..f7c7cb80 100644
--- a/Website/src/components/onsenui/Toolbar.tsx
+++ b/Website/src/components/onsenui/Toolbar.tsx
@@ -4,6 +4,7 @@ import Icon from "@Components/Icon";
 import React from "react";
 import { OverridableComponent } from "@mui/material/OverridableComponent";
 import ArrowBackIcon from "@mui/icons-material/ArrowBack";
+import Button from "@mui/material/Button";
 import { SvgIconTypeMap } from "@mui/material/SvgIcon";
 import { SxProps, Theme } from "@mui/material/styles";
 import Box from "@mui/material/Box";
@@ -32,13 +33,10 @@ const HTMLToolbar = onsCustomElement("ons-toolbar", {
 const HTMLToolbarButton = onsCustomElement("ons-toolbar-button")({});
 
 const ToolbarButton = React.forwardRef((props: HTMLToolbarButton, ref: React.Ref) => {
-  return (
-    
-      {props.icon ? (
-        
-      ) : (
-        <>{props.children}
-      )}
+  const { icon, iconProps, keepLight, children, ...rest } = props;
+  return ( 
+    
+      {icon ?  : <>{children}}
     
   );
 });
diff --git a/Website/src/hooks/useFormatDate.ts b/Website/src/hooks/useFormatDate.ts
index 13c5240e..fc1d341e 100644
--- a/Website/src/hooks/useFormatDate.ts
+++ b/Website/src/hooks/useFormatDate.ts
@@ -1,7 +1,7 @@
 import { useMemo } from "react";
 import { useSettings } from "./useSettings";
 
-export const useFormatDate = (date: int) => {
+export const useFormatDate = (date: int, multiply: boolean = true) => {
   const { settings } = useSettings();
 
   return useMemo(
@@ -13,7 +13,7 @@ export const useFormatDate = (date: int) => {
         hour: "2-digit",
         minute: "2-digit",
         hour12: true,
-      }).format(new Date(date)),
+      }).format(new Date(multiply ? date * 1000 : date)),
     [date]
   );
 };
diff --git a/Website/src/hooks/useLocalModules.ts b/Website/src/hooks/useLocalModules.ts
index 8bf4593e..6417b01f 100644
--- a/Website/src/hooks/useLocalModules.ts
+++ b/Website/src/hooks/useLocalModules.ts
@@ -2,24 +2,33 @@ import { os } from "@Native/Os";
 import { SuFile } from "@Native/SuFile";
 import { Properties } from "properties-file";
 import React from "react";
-import { useModConf } from "./useModConf";
+import { useModFS } from "./useModFS";
 import { useSettings } from "./useSettings";
 
 export function useLocalModules() {
-  const { modConf } = useModConf();
+  const { modFS } = useModFS();
   const { settings } = useSettings();
   const [localModules, setLocalModules] = React.useState([]);
 
   if (os.isAndroid) {
     React.useEffect(() => {
-      const folders = SuFile.list(modConf("MODULES"));
+      const folders = SuFile.list(modFS("MODULES"));
       folders.forEach((module) => {
-        const properties = new SuFile(modConf("PROPS", { MODID: module }));
+        const properties = new SuFile(modFS("PROPS", { MODID: module }));
         if (properties.exist()) {
           setLocalModules((prev) => {
             // Preventing duplicates
             const ids = new Set(prev.map((d) => d.id));
-            const merged = [...prev, ...[new Properties(properties.read()).toObject() as unknown as Module].filter((d) => !ids.has(d.id))];
+            const merged = [
+              ...prev,
+              ...[
+                {
+                  ...(new Properties(properties.read()).toObject() as unknown as Module),
+                  timestamp: properties.lastModified(),
+                  __mmrl__local__module__: true,
+                },
+              ].filter((d) => !ids.has(d.id)),
+            ];
             return merged;
           });
         }
diff --git a/Website/src/hooks/useModConf.tsx b/Website/src/hooks/useModConf.tsx
deleted file mode 100644
index 0423a288..00000000
--- a/Website/src/hooks/useModConf.tsx
+++ /dev/null
@@ -1,196 +0,0 @@
-import React, { createContext, useContext } from "react";
-import { defaultComposer } from "default-composer";
-import { useNativeStorage } from "./useNativeStorage";
-import { SetStateAction } from "./useStateCallback";
-
-export interface ModConf {
-  //cli
-  MSUCLI: string;
-  MSUBSU: string;
-  MSURSP: string;
-  KSUCLI: string;
-  KSUBSU: string;
-  KSURSP: string;
-  ASUCLI: string;
-  ASUBSU: string;
-  ASURSP: string;
-
-  // default paths
-  ADB: string;
-  MODULES: string;
-  MODULECWD: string;
-  PROPS: string;
-  SYSTEM: string;
-  SEPOLICY: string;
-  CONFIG: string;
-
-  // service paths
-  LATESERVICE: string;
-  POSTSERVICE: string;
-  POSTMOUNT: string;
-  BOOTCOMP: string;
-
-  // status paths
-  SKIPMOUNT: string;
-  DISABLE: string;
-  REMOVE: string;
-  UPDATE: string;
-
-  // others
-  MMRLINI: string;
-  CONFCWD: string;
-  CONFINDEX: string;
-}
-
-export const INITIAL_MOD_CONF: ModConf = {
-  //cli
-  MSUCLI: "/system/bin/magisk",
-  MSUBSU: "/magisk/busybox",
-  MSURSP: "/system/bin/resetprop",
-  KSUCLI: "/ksu/bin/ksud",
-  KSUBSU: "/ksu/bin/busybox",
-  KSURSP: "/ksu/bin/resetprop",
-  ASUCLI: "/ap/bin/apd",
-  ASUBSU: "/ap/bin/busybox",
-  ASURSP: "/ap/bin/resetprop",
-
-  // default paths
-  ADB: "/data/adb",
-  MODULES: "/modules",
-  MODULECWD: "/",
-  PROPS: "/module.prop",
-  SYSTEM: "/system.prop",
-  SEPOLICY: "/sepolicy.rule",
-  CONFIG: `/system/usr/share/mmrl/config/.mdx`,
-
-  // service paths
-  LATESERVICE: "/service.sh",
-  POSTSERVICE: "/post-fs-data.sh",
-  POSTMOUNT: "/post-mount.sh",
-  BOOTCOMP: "/boot-completed.sh",
-
-  // status paths
-  SKIPMOUNT: "/skip_mount",
-  DISABLE: "/disable",
-  REMOVE: "/remove",
-  UPDATE: "/update",
-
-  // others
-  MMRLINI: "/mmrl_install_tools",
-  CONFCWD: "/system/usr/share/mmrl/config/",
-  CONFINDEX: "/index.jsx",
-};
-
-export interface ModConfContext {
-  _modConf: ModConf;
-  __modConf: ModConf;
-  modConf(key: K, adds?: Record): ModConf[K];
-  setModConf(key: K, state: SetStateAction, callback?: (state: ModConf[K]) => void): void;
-}
-
-export const ModConfContext = createContext({
-  _modConf: INITIAL_MOD_CONF,
-  __modConf: INITIAL_MOD_CONF,
-  modConf(key: K, adds?: Record) {
-    return key;
-  },
-  setModConf(key: K, state: SetStateAction, callback?: (state: ModConf[K]) => void) {},
-});
-
-export const useModConf = () => {
-  return useContext(ModConfContext);
-};
-
-export function formatString(template: string, object: object): string {
-  return template.replace(/\<(\w+(\.\w+)*)\>/gi, (match, key) => {
-    const keys = key.split(".");
-    let value = object;
-    for (const k of keys) {
-      if (k in value) {
-        value = value[k];
-      } else {
-        return match;
-      }
-    }
-    return formatString(String(value), object);
-  });
-}
-
-export function formatObjectEntries(object: O): O {
-  const formatValue = (value: any): any => {
-    if (typeof value === "string") {
-      return value.replace(/\<(\w+(\.\w+)*)\>/gi, (match, key) => {
-        const keys = key.split(".");
-        let tempValue = object;
-        for (const k of keys) {
-          if (k in tempValue) {
-            tempValue = tempValue[k];
-          } else {
-            return match;
-          }
-        }
-        return formatValue(tempValue);
-      });
-    } else if (Array.isArray(value)) {
-      return value.map((item: any) => formatValue(item));
-    } else if (typeof value === "object" && value !== null) {
-      const formattedObject: any = {};
-      for (const prop in value) {
-        formattedObject[prop] = formatValue(value[prop]);
-      }
-      return formattedObject;
-    }
-    return value;
-  };
-
-  const formattedObject: any = {};
-  for (const key in object) {
-    const formattedValue = formatValue(object[key]);
-    formattedObject[key] = formattedValue;
-  }
-  return formattedObject;
-}
-
-export const ModConfProvider = (props: React.PropsWithChildren) => {
-  const [modConf, setModConf] = useNativeStorage("modconf_v4", INITIAL_MOD_CONF);
-
-  // Test purposes
-  // React.useEffect(() => {
-  //   for (const k in modConf) {
-  //     console.info(
-  //       formatString(defaultComposer(INITIAL_MOD_CONF, modConf)[k], {
-  //         ...modConf,
-  //         ...{
-  //           MODID: "node_on_android",
-  //           ZIPFILE: "/sdard/xh.zip",
-  //         },
-  //       })
-  //     );
-  //   }
-  // }, [modConf]);
-
-  const contextValue = React.useMemo(
-    () => ({
-      _modConf: defaultComposer(INITIAL_MOD_CONF, modConf),
-      __modConf: formatObjectEntries(defaultComposer(INITIAL_MOD_CONF, modConf)),
-      modConf: (key, adds) => {
-        return formatString(defaultComposer(INITIAL_MOD_CONF, modConf)[key], { ...modConf, ...adds });
-      },
-      setModConf: (name, state, callback) => {
-        setModConf(
-          (prev) => {
-            const newValue = state instanceof Function ? state(prev[name]) : state;
-            return {
-              ...prev,
-              [name]: newValue,
-            };
-          },
-          (state) => callback && callback(state[name])
-        );
-      },
-    }),
-    [modConf]
-  );
-
-  return ;
-};
diff --git a/Website/src/hooks/useModFS.tsx b/Website/src/hooks/useModFS.tsx
new file mode 100644
index 00000000..db11c966
--- /dev/null
+++ b/Website/src/hooks/useModFS.tsx
@@ -0,0 +1,134 @@
+import React, { createContext, useContext } from "react";
+import { defaultComposer } from "default-composer";
+import { useNativeStorage } from "./useNativeStorage";
+import { SetStateAction } from "./useStateCallback";
+import { formatObjectEntries, formatString } from "@Util/stringFormat";
+import { useNativeFileStorage } from "./useNativeFileStorage";
+
+export interface ModFS {
+  //cli
+  MSUCLI: string;
+  MSUBSU: string;
+  MSURSP: string;
+  KSUCLI: string;
+  KSUBSU: string;
+  KSURSP: string;
+  ASUCLI: string;
+  ASUBSU: string;
+  ASURSP: string;
+
+  // default paths
+  ADB: string;
+  MODULES: string;
+  MODULECWD: string;
+  PROPS: string;
+  SYSTEM: string;
+  SEPOLICY: string;
+  CONFIG: string;
+
+  // service paths
+  LATESERVICE: string;
+  POSTSERVICE: string;
+  POSTMOUNT: string;
+  BOOTCOMP: string;
+
+  // status paths
+  SKIPMOUNT: string;
+  DISABLE: string;
+  REMOVE: string;
+  UPDATE: string;
+
+  // others
+  MMRLINI: string;
+  EXPLORE_INSTALL: string;
+  LOCAL_INSTALL: string;
+  CONFCWD: string;
+  CONFINDEX: string;
+}
+
+export const INITIAL_MOD_CONF: ModFS = {
+  //cli
+  MSUCLI: "/system/bin/magisk",
+  MSUBSU: "/magisk/busybox",
+  MSURSP: "/system/bin/resetprop",
+  KSUCLI: "/ksu/bin/ksud",
+  KSUBSU: "/ksu/bin/busybox",
+  KSURSP: "/ksu/bin/resetprop",
+  ASUCLI: "/ap/bin/apd",
+  ASUBSU: "/ap/bin/busybox",
+  ASURSP: "/ap/bin/resetprop",
+
+  // default paths
+  ADB: "/data/adb",
+  MODULES: "/modules",
+  MODULECWD: "/",
+  PROPS: "/module.prop",
+  SYSTEM: "/system.prop",
+  SEPOLICY: "/sepolicy.rule",
+  CONFIG: `/system/usr/share/mmrl/config/.mdx`,
+
+  // service paths
+  LATESERVICE: "/service.sh",
+  POSTSERVICE: "/post-fs-data.sh",
+  POSTMOUNT: "/post-mount.sh",
+  BOOTCOMP: "/boot-completed.sh",
+
+  // status paths
+  SKIPMOUNT: "/skip_mount",
+  DISABLE: "/disable",
+  REMOVE: "/remove",
+  UPDATE: "/update",
+
+  // others
+  MMRLINI: "/mmrl_install_tools",
+  CONFCWD: "/system/usr/share/mmrl/config/",
+  EXPLORE_INSTALL: "/system/usr/share/mmrl/bin/mmrl_explore_install_v6",
+  LOCAL_INSTALL: "/system/usr/share/mmrl/bin/mmrl_local_install_v6",
+  CONFINDEX: "/index.jsx",
+};
+
+export interface ModConfContext {
+  _modFS: ModFS;
+  __modFS: ModFS;
+  modFS(key: K, adds?: Record): ModFS[K];
+  setModFS(key: K, state: SetStateAction): void;
+}
+
+export const ModConfContext = createContext({
+  _modFS: INITIAL_MOD_CONF,
+  __modFS: INITIAL_MOD_CONF,
+  modFS(key: K, adds?: Record) {
+    return key;
+  },
+  setModFS(key: K, state: SetStateAction) {},
+});
+
+export const useModFS = () => {
+  return useContext(ModConfContext);
+};
+
+export const ModFSProvider = (props: React.PropsWithChildren) => {
+  const [modFS, setModFS] = useNativeFileStorage("/data/adb/mmrl/modfs.v6.json", INITIAL_MOD_CONF);
+
+  const contextValue = React.useMemo(
+    () => ({
+      _modFS: defaultComposer(INITIAL_MOD_CONF, modFS),
+      __modFS: formatObjectEntries(defaultComposer(INITIAL_MOD_CONF, modFS)),
+      modFS: (key, adds) => {
+        return formatString(defaultComposer(INITIAL_MOD_CONF, modFS)[key], { ...modFS, ...adds });
+      },
+      setModFS: (name, state) => {
+        setModFS((prev) => {
+          const newValue = state instanceof Function ? state(prev[name]) : state;
+          return {
+            ...prev,
+            [name]: newValue,
+          };
+        });
+      },
+    }),
+    [modFS]
+  );
+
+  return ;
+};
diff --git a/Website/src/hooks/useModulesFilter.tsx b/Website/src/hooks/useModulesFilter.tsx
index c692b52a..d18a4161 100644
--- a/Website/src/hooks/useModulesFilter.tsx
+++ b/Website/src/hooks/useModulesFilter.tsx
@@ -20,44 +20,44 @@ export const filters = [
     name: "No filter",
     icon: UpdateDisabledIcon,
     value: "none",
-    allowedIds: ["explore", "local"],
+    allowedIds: ["explore", "local", "update"],
   },
   {
-    name: "By date (newest)",
+    name: "Newest date first",
     icon: CalendarMonthIcon,
     value: "date_newest",
-    allowedIds: ["explore"],
+    allowedIds: ["explore", "local", "update"],
   },
   {
-    name: "By date (oldest)",
+    name: "Oldest date first",
     icon: CalendarMonthIcon,
     value: "date_oldest",
-    allowedIds: ["explore"],
+    allowedIds: ["explore", "local", "update"],
   },
   {
-    name: "Alphabetically",
+    name: "Name (A to Z)",
     icon: AbcIcon,
     value: "alphabetically",
-    allowedIds: ["explore", "local"],
+    allowedIds: ["explore", "local", "update"],
   },
   {
-    name: "Alphabetically (reverse)",
+    name: "Name (Z to A)",
     icon: AbcIcon,
     value: "alphabetically_reverse",
-    allowedIds: ["explore", "local"],
-  },
-  {
-    name: "Most stars",
-    icon: StarIcon,
-    value: "most_stars",
-    allowedIds: ["explore"],
-  },
-  {
-    name: "Least stars",
-    icon: StarBorderIcon,
-    value: "least_stars",
-    allowedIds: ["explore"],
+    allowedIds: ["explore", "local", "update"],
   },
+  // {
+  //   name: "Most stars",
+  //   icon: StarIcon,
+  //   value: "most_stars",
+  //   allowedIds: ["explore"],
+  // },
+  // {
+  //   name: "Least stars",
+  //   icon: StarBorderIcon,
+  //   value: "least_stars",
+  //   allowedIds: ["explore"],
+  // },
 ];
 
 export const useModuleFilter = (key: string): [Array, string, SetValue] => {
@@ -66,12 +66,12 @@ export const useModuleFilter = (key: string): [Array, string, SetValue ({
       none: [{}],
-      date_oldest: [{ key: "last_update", descending: false }],
-      date_newest: [{ key: "last_update", descending: true }],
+      date_oldest: [{ key: "timestamp", descending: false }],
+      date_newest: [{ key: "timestamp", descending: true }],
       alphabetically: [{ key: "name", descending: false }],
       alphabetically_reverse: [{ key: "name", descending: true }],
-      least_stars: [{ key: "stars", descending: false }],
-      most_stars: [{ key: "stars", descending: true }],
+      // least_stars: [{ key: "stars", descending: false }],
+      // most_stars: [{ key: "stars", descending: true }],
     }),
     []
   );
diff --git a/Website/src/hooks/useNativeFileStorage.tsx b/Website/src/hooks/useNativeFileStorage.tsx
new file mode 100644
index 00000000..763f1b7f
--- /dev/null
+++ b/Website/src/hooks/useNativeFileStorage.tsx
@@ -0,0 +1,46 @@
+import { useCallback, useEffect, useState } from "react";
+import { useLog } from "./native/useLog";
+import { SuFile } from "@Native/SuFile";
+import { SetValue, parseJSON } from "./useNativeStorage";
+
+export function useNativeFileStorage(key: string, initialValue: T): [T, SetValue] {
+  const log = useLog("useNativeStorage");
+
+  const file = new SuFile(key);
+
+  const readValue = useCallback((): T => {
+    if (typeof window === "undefined") {
+      return initialValue;
+    }
+
+    try {
+      return file.exist() ? (parseJSON(file.read()) as T) : initialValue;
+    } catch (error) {
+      log.w(`Error reading file “${key}”: ${error}`);
+
+      return initialValue;
+    }
+  }, [initialValue, key]);
+
+  const [storedValue, setStoredValue] = useState(readValue);
+
+  const setValue: SetValue = (value) => {
+    if (typeof window === "undefined") {
+      log.w(`Tried setting localStorage key “${key}” even though environment is not a client`);
+    }
+
+    try {
+      const newValue = value instanceof Function ? value(storedValue) : value;
+      file.write(JSON.stringify(newValue));
+      setStoredValue(newValue);
+    } catch (error) {
+      log.w(`Error writing file “${key}”: ${error}`);
+    }
+  };
+
+  useEffect(() => {
+    setStoredValue(readValue());
+  }, []);
+
+  return [storedValue, setValue];
+}
diff --git a/Website/src/hooks/useRepos.tsx b/Website/src/hooks/useRepos.tsx
index eaed2502..a884ab6d 100644
--- a/Website/src/hooks/useRepos.tsx
+++ b/Website/src/hooks/useRepos.tsx
@@ -13,8 +13,8 @@ export interface RepoContextActions {
 }
 
 interface RepoContextInterface {
-  repos: StoredRepo[];
-  setRepos: SetValue;
+  repos: RepoConfig[];
+  setRepos: SetValue;
   modules: Module[];
   actions: RepoContextActions;
 }
@@ -32,13 +32,13 @@ export const RepoContext = React.createContext({
 
 type AddRepoData = {
   url: string;
-  callback?: (state: StoredRepo[]) => void;
-  error?: (error: any) => void;
+  callback?: (state: RepoConfig[]) => void;
+  error?: (error: Error) => void;
 };
 
 type RemoveRepoData = {
   id: string;
-  callback?: (state: StoredRepo[]) => void;
+  callback?: (state: RepoConfig[]) => void;
 };
 
 type SetRepoStateData = {
@@ -49,15 +49,17 @@ type SetRepoStateData = {
 export const RepoProvider = (props: React.PropsWithChildren) => {
   const TAG = "RepoProvider";
   const log = useLog(TAG);
-  const [repos, setRepos] = useNativeStorage("repos_v2", [
+  const [repos, setRepos] = useNativeStorage("repos_v3", [
     {
-      name: "Magisk Modules Alt Repo (pre-configured)",
-      website: "",
-      support: "",
-      donate: "",
-      submitModule: "",
-      last_update: 1690995729000,
-      modules: "https://gr.dergoogler.com/magisk/mmar.json",
+      name: "Googlers Magisk Repo",
+      website: "https://mmrl.dergoogler.com",
+      support: "https://github.com/Googlers-Repo/gmr/issues",
+      donate: "https://github.com/sponsors/DerGoogler",
+      submission: null,
+      base_url: "https://gr.dergoogler.com/gmr/",
+      max_num: 3,
+      enable_log: true,
+      log_dir: "log",
     },
   ]);
 
@@ -65,27 +67,19 @@ export const RepoProvider = (props: React.PropsWithChildren) => {
   const [modules, setModules] = React.useState([]);
 
   const addRepo = (data: AddRepoData) => {
-    if (!repos.some((repo) => repo.modules === data.url)) {
+    if (!repos.some((repo) => repo.base_url === data.url)) {
       if (repos.length <= 4) {
         if (link.validURL(data.url)) {
-          fetch(data.url)
-            .then((response) => response.json())
+          fetch(`${data.url}json/config.json`)
             .then((response) => {
-              setRepos(
-                (prev) => [
-                  ...prev,
-                  {
-                    name: response.name || "Unknown Repository",
-                    website: response.website || null,
-                    support: response.support || null,
-                    donate: response.donate || null,
-                    submitModule: response.submitModules || null,
-                    last_update: response.last_update || 0,
-                    modules: data.url,
-                  },
-                ],
-                data.callback
-              );
+              if (response.status == 200) {
+                return response.json();
+              } else {
+                data.error && data.error(Error("Cannot find given repo link or your link isn't valid"));
+              }
+            })
+            .then((response) => {
+              setRepos((prev) => [...prev, response], data.callback);
             })
             .catch((e) => (data.callback ? data.callback(e) : log.e(e)));
         } else {
@@ -101,7 +95,7 @@ export const RepoProvider = (props: React.PropsWithChildren) => {
 
   const removeRepo = (data: RemoveRepoData) => {
     setRepos((tmp) => {
-      tmp = tmp.filter((remv) => remv.modules != data.id);
+      tmp = tmp.filter((remv) => remv.base_url != data.id);
       return tmp;
     }, data.callback);
   };
@@ -125,9 +119,9 @@ export const RepoProvider = (props: React.PropsWithChildren) => {
     setModules([]);
     const fetchData = async () => {
       for (const repo of repos) {
-        if (settings.disabled_repos.includes(repo.modules)) continue;
+        if (settings.disabled_repos.includes(repo.base_url)) continue;
 
-        fetch(repo.modules)
+        fetch(`${repo.base_url}json/modules.json`)
           .then((res) => {
             if (!res.ok) throw new Error(res.statusText);
             return res.json();
diff --git a/Website/src/hooks/useSettings.tsx b/Website/src/hooks/useSettings.tsx
index 94602e7e..81c69c33 100644
--- a/Website/src/hooks/useSettings.tsx
+++ b/Website/src/hooks/useSettings.tsx
@@ -159,7 +159,6 @@ export interface StorageDeclaration {
   disabled_repos: string[];
   _low_quality_module: boolean;
   _invald_module: boolean;
-  repos: StoredRepo[];
   shade_value: number;
   term_scroll_bottom: boolean;
   term_scroll_behavior: { name: string; value: ScrollBehavior };
@@ -213,7 +212,6 @@ export const SettingsProvider = (props: React.PropsWithChildren) => {
       disabled_repos: [],
       _low_quality_module: true,
       _invald_module: false,
-      repos: [],
       shade_value: -80,
       term_scroll_bottom: true,
       term_scroll_behavior: termScrollBehaviors[0],
diff --git a/Website/src/hooks/useTheme.tsx b/Website/src/hooks/useTheme.tsx
index 4602f17d..b93f29d9 100644
--- a/Website/src/hooks/useTheme.tsx
+++ b/Website/src/hooks/useTheme.tsx
@@ -1,5 +1,5 @@
 import React from "react";
-import { useTheme as useMom, createTheme, ThemeProvider as MumProvider } from "@mui/material";
+import { useTheme as useMom, createTheme, ThemeProvider as MumProvider, Theme } from "@mui/material";
 import useShadeColor from "./useShadeColor";
 import { colors, useSettings } from "./useSettings";
 import { os } from "@Native/Os";
@@ -11,7 +11,7 @@ export const useTheme = () => {
 
   return {
     scheme: colors[settings.accent_scheme.value],
-    theme: theme,
+    theme: theme as MMRLTheme,
     shade: (color: string, percent: number) => {
       // Ignore shading if monet is enabled.
       if (settings.accent_scheme.value === "monet") {
@@ -42,61 +42,100 @@ export const useTheme = () => {
   };
 };
 
+const THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP = createTheme({
+  components: {
+    MuiDialog: {
+      styleOverrides: {
+        root: {
+          "& .MuiDialog-paper": {
+            backgroundColor: "#101010",
+            border: `1px solid #333638`,
+            backgroundImage: "none",
+          },
+          "& .MuiDialogContent-root": {
+            borderTop: "none",
+            borderBottom: "none",
+          },
+          "& .MuiButtonBase-root": {
+            color: "#f3f5f7",
+          },
+        },
+      },
+    },
+    MuiCard: {
+      defaultProps: {
+        elevation: 0,
+      },
+    },
+    MuiTabs: {
+      styleOverrides: {
+        root: {
+          "& .MuiButtonBase-root": {
+            borderBottom: "1px solid #f3f5f726",
+          },
+          "& .MuiTabs-indicator": {
+            height: 1,
+          },
+        },
+      },
+    },
+    MuiButton: {
+      styleOverrides: {
+        root: ({ theme, ownerState }) => ({
+          ...(ownerState.variant === "outlined" && {
+            color: "white",
+            border: `1px solid ${theme.palette.divider}`,
+            boxShadow: "none",
+          }),
+          ...(ownerState.variant === "contained" && {
+            color: "black",
+            ":disabled": {
+              cursor: "not-allowed",
+              color: "black",
+              opacity: ".3",
+              backgroundColor: "#ffffff",
+            },
+          }),
+        }),
+      },
+      defaultProps: {
+        disableElevation: true,
+      },
+    },
+  },
+  shape: {
+    borderRadius: 8,
+  },
+  palette: {
+    mode: "dark",
+    primary: {
+      main: "#ffffff",
+      dark: "#353535",
+    },
+    secondary: {
+      main: "#ffffff",
+      dark: "#0a0a0a",
+    },
+    background: {
+      paper: "#181818",
+      default: "#101010",
+    },
+    text: {
+      link: "#0095F6",
+      primary: "#f3f5f7",
+      secondary: "#777777",
+    },
+    divider: "#333638",
+  },
+} as unknown as MMRLTheme);
+
 export const ThemeProvider = (props: React.PropsWithChildren) => {
   const { settings } = useSettings();
-  const shade = useShadeColor();
 
   const [, setBackgroundColor] = useNativeStorage("background_color", colors[settings.accent_scheme.value][200]);
   const [, setStatusBarColor] = useNativeStorage("statusbar_color", colors[settings.accent_scheme.value][500]);
 
-  const theme = React.useMemo(() => {
-    const THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP = createTheme({
-      shape: {
-        borderRadius: 8,
-      },
-      palette: !settings.darkmode
-        ? {
-            mode: "light",
-            primary: {
-              light: colors[settings.accent_scheme.value][300],
-              main: colors[settings.accent_scheme.value][500],
-              dark: colors[settings.accent_scheme.value][700],
-
-              // light: colors[settings.accent_scheme.value][300],
-              // main: colors[settings.accent_scheme.value][900],
-              // dark: colors[settings.accent_scheme.value][800],
-            },
-            background: {
-              default: colors[settings.accent_scheme.value][200],
-              paper: shade(colors[settings.accent_scheme.value][200], 14.5 * 2),
-            },
-            divider: colors[settings.accent_scheme.value][300],
-            secondary: {
-              main: colors[settings.accent_scheme.value][600],
-            },
-          }
-        : {
-            mode: "dark",
-            primary: {
-              main: shade(colors[settings.accent_scheme.value][200], settings.shade_value),
-              light: shade(colors[settings.accent_scheme.value][100], settings.shade_value),
-              dark: shade(colors[settings.accent_scheme.value][400], settings.shade_value),
-              // light: shade(colors[settings.accent_scheme.value][300], -10),
-              // main: shade(colors[settings.accent_scheme.value][500], -29),
-            },
-            background: {
-              paper: shade(colors[settings.accent_scheme.value][600], settings.shade_value),
-              default: shade(colors[settings.accent_scheme.value][700], settings.shade_value),
-            },
-            divider: shade(colors[settings.accent_scheme.value][900], settings.shade_value),
-            secondary: {
-              main: colors[settings.accent_scheme.value][600],
-            },
-          },
-    });
-
-    os.setStatusBarColor(THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP.palette.primary.main, false);
-    os.setNavigationBarColor(THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP.palette.background.default);
+  const theme = React.useMemo(() => {
     setBackgroundColor(THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP.palette.background.default);
     setStatusBarColor(THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP.palette.primary.main);
     return THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP;
diff --git a/Website/src/index.tsx b/Website/src/index.tsx
index be8c86d4..6d331463 100644
--- a/Website/src/index.tsx
+++ b/Website/src/index.tsx
@@ -10,7 +10,7 @@ import { MainActivity } from "@Activitys/MainActivity";
 import { RepoProvider } from "@Hooks/useRepos";
 
 import { SettingsProvider } from "@Hooks/useSettings";
-import { ModConfProvider } from "@Hooks/useModConf";
+import { ModFSProvider } from "@Hooks/useModFS";
 
 import { MMRLApp } from "./custom-elements/app";
 import { MMRLAnchor } from "./custom-elements/anchor";
@@ -18,6 +18,7 @@ import { MMRLAnchor } from "./custom-elements/anchor";
 import "onsenui/css/onsenui.css";
 import "@Styles/default.scss";
 import { strs } from "./locales/declaration";
+import { SuFile } from "@Native/SuFile";
 
 ons.platform.select("android");
 
@@ -25,9 +26,15 @@ ons.ready(() => {
   customElements.define("mmrl-app", MMRLApp);
   customElements.define("mmrl-anchor", MMRLAnchor);
 
+  const mmrlFolder = new SuFile("/data/adb/mmrl");
+
+  if (!mmrlFolder.exist()) {
+    mmrlFolder.create(SuFile.NEW_FOLDERS);
+  }
+
   render(
     
-      
+      
         
           
             
@@ -43,7 +50,7 @@ ons.ready(() => {
             
           
         
-      
+      
     ,
     "mmrl-app"
   );
diff --git a/Website/src/locales/de.json b/Website/src/locales/de.json
deleted file mode 100644
index 985f44a5..00000000
--- a/Website/src/locales/de.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
-  "search_modules": "Module durchsuchen",
-  "settings": "Einstellungen",
-  "repository": "Repository",
-  "repositories": "Repositorys",
-  "accent_color": "Akzentfarbe",
-  "appearance": "Aussehen",
-  "language": "Sprache",
-  "dark_theme": "Dunkles Thema",
-  "bottom_navigation_text": "Navigation unten",
-  "bottom_navigation_subtext": "Bewegt Tabs an den unteren Bildschirmrand.",
-  "not_supported_in_web_version": "In der Web-Version nicht unterstuetzt",
-  "source_code": "Quellcode",
-  "acknowledgements": "Danksagungen/Lizenzen",
-  "issues": "Issues",
-  "module_verified": "Dieses Modul ist verifiziert und vertrauenswürdig",
-  "download": "Herunterladen",
-  "install": "Installieren",
-  "explore": "Erkunden",
-  "installed": "Installiert",
-  "remove": "Entfernen",
-  "restore": "Wiederherstellen",
-  "module_enabled_LOG": "{name} wurde aktiviert",
-  "module_disabled_LOG": "{name} wurde deaktiviert",
-  "add": "Hinzufügen",
-  "cancel": "Abbrechen",
-  "confirm_repo_delete": "Möchten Sie das {name} Repository wirklich entfernen?",
-  "submit_module": "Ein Module einreichen",
-  "donate": "Spenden",
-  "support": "Support",
-  "website": "Webseite",
-  "no_root": "Kein Root",
-  "failed": "Fehlgeschlagen",
-  "no_root_message": "Bitte stellen Sie sicher, dass Sie über mindestens einen Root-Manager verfügen, andernfalls können Sie MMRL nicht verwenden.",
-  "open_magisk": "Magisk öffnen",
-  "development": "Entwicklung",
-  "enabled": "Aktiviert",
-  "comments": "Kommentare",
-  "verified": "Verifiziert",
-  "configureable": "Anpassbar",
-  "change_boot": "Ändert Boot",
-  "need_ramdisk": "Braucht Ramdisk",
-  "add_repository": "Repository hinzufügen",
-  "add_repository_description": "Fügen Sie Ihr Repository oder ein Repository von einem anderen hinzu.",
-  "explore_repositories": "Entdecke Repositorys",
-  "overview": "Übersicht",
-  "about_this_module": "Über dieses Modul",
-  "about": "Über",
-  "updated_on": "Aktualisiert am",
-  "requirements": "Anforderungen",
-  "access": "Zugriffe",
-  "minimum": "Minimum",
-  "recommended": "Empfohlen",
-  "source": "Quelle",
-  "require_sdk": "Modul erfordert {sdk}",
-  "unsupported": "Nicht unterstützt",
-  "images": "Bilder",
-  "unset": "Unbestimmt",
-  "yes": "Ja",
-  "no": "Nein",
-  "operating_sys": "Betriebssystem",
-  "verified_module": "Verifiziertes Modul",
-  "verified_module_desc": "Dieses Modul wurde einer Überprüfung unterzogen und wurde als vertrauenswürdiges Modul bestätigt, das von einem seriösen Entwickler entwickelt wurde.",
-  "update_json": "Verwendet eigene Update.json",
-  "update_json_desc": "Dieses Modul verwendet seine eigene update.json für Aktualisierungs- und Installationszwecke.",
-  "shading": "Schattierung",
-  "shading_title": "Benutzerdefinierte Schattierung anwenden",
-  "shading_desc": "Seien Sie vorsichtig, wenn es zu dunkel ist, können Sie die Benutzeroberfläche möglicherweise nicht mehr sehen.",
-  "module": "Modul",
-  "low_quality_module": "Modul von geringer Qualität",
-  "low_quality_modules": "Module von geringer Qualität",
-  "low_quality_modules_subtitle": "Zeigt eine Warnung unterhalb des Moduls an, wenn es eine niedrige Qualität hat",
-  "low_quality_module_warn": "Diesem Magisk-Modul fehlen wichtige Eigenschaften wie ID, Version, Versionscode, Autor usw., was sich auf seine Funktionalität und Herkunft auswirken kann.",
-  "invaild_modules": "Ungültige Module",
-  "invaild_modules_subtitle": "Ungültige Module anzeigen",
-  "modconf": "ModConf",
-  "modconf_subtitle": "Eine Möglichkeit, verschiedene Modulsysteme zu verwalten",
-  "enable_install": "Installation aktivieren",
-  "scroll_to_bottom": "Nach unten scrollen",
-  "scroll_to_bottom_subtitle": "Automatisches Scrollen nach unten im Terminal",
-  "scroll_behavior": "Scrollverhalten",
-  "terminal": "Terminal",
-  "eruda_console": "Eruda Konsole",
-  "eruda_console_subtitle": "Nützlich bei der Entwicklung und Fehlersuche",
-  "share_device_infos": "Informationen über das Gerät teilen",
-  "storage": "Speicher",
-  "clear_repos": "Repositorys löschen",
-  "patch_settings": "Einstellungen patchen",
-  "patch_settings_subtitle": "Fehlende Einstellungsschlüssel hinzufügen"
-}
diff --git a/Website/src/locales/de.ts b/Website/src/locales/de.ts
new file mode 100644
index 00000000..b68e2c2b
--- /dev/null
+++ b/Website/src/locales/de.ts
@@ -0,0 +1,99 @@
+export const de = {
+  changelog: "Changelog",
+  new: "Neu",
+  search: "Suche",
+  updates: "Updates",
+  versions: "Versionen",
+  licenses: "Lizenzen",
+  license: "Lizenz",
+  search_modules: "Module durchsuchen",
+  settings: "Einstellungen",
+  repository: "Repository",
+  repositories: "Repositorys",
+  accent_color: "Akzentfarbe",
+  appearance: "Aussehen",
+  language: "Sprache",
+  dark_theme: "Dunkles Thema",
+  bottom_navigation_text: "Navigation unten",
+  bottom_navigation_subtext: "Bewegt Tabs an den unteren Bildschirmrand.",
+  not_supported_in_web_version: "In der Web-Version nicht unterstuetzt",
+  source_code: "Quellcode",
+  acknowledgements: "Danksagungen/Lizenzen",
+  issues: "Issues",
+  module_verified: "Dieses Modul ist verifiziert und vertrauenswürdig",
+  download: "Herunterladen",
+  install: "Installieren",
+  explore: "Erkunden",
+  installed: "Installiert",
+  remove: "Entfernen",
+  restore: "Wiederherstellen",
+  module_enabled_LOG: "{name} wurde aktiviert",
+  module_disabled_LOG: "{name} wurde deaktiviert",
+  add: "Hinzufügen",
+  cancel: "Abbrechen",
+  confirm_repo_delete: "Möchten Sie das {name} Repository wirklich entfernen?",
+  submit_module: "Ein Module einreichen",
+  donate: "Spenden",
+  support: "Support",
+  website: "Webseite",
+  no_root: "Kein Root",
+  failed: "Fehlgeschlagen",
+  no_root_message:
+    "Bitte stellen Sie sicher, dass Sie über mindestens einen Root-Manager verfügen, andernfalls können Sie MMRL nicht verwenden.",
+  open_magisk: "Magisk öffnen",
+  development: "Entwicklung",
+  enabled: "Aktiviert",
+  comments: "Kommentare",
+  verified: "Verifiziert",
+  configureable: "Anpassbar",
+  change_boot: "Ändert Boot",
+  need_ramdisk: "Braucht Ramdisk",
+  add_repository: "Repository hinzufügen",
+  add_repository_description: "Fügen Sie Ihr Repository oder ein Repository von einem anderen hinzu.",
+  explore_repositories: "Entdecke Repositorys",
+  overview: "Übersicht",
+  about_this_module: "Über dieses Modul",
+  about: "Über",
+  updated_on: "Aktualisiert am",
+  requirements: "Anforderungen",
+  access: "Zugriffe",
+  minimum: "Minimum",
+  recommended: "Empfohlen",
+  source: "Quelle",
+  require_sdk: "Modul erfordert {sdk}",
+  unsupported: "Nicht unterstützt",
+  images: "Bilder",
+  unset: "Unbestimmt",
+  yes: "Ja",
+  no: "Nein",
+  operating_sys: "Betriebssystem",
+  verified_module: "Verifiziertes Modul",
+  verified_module_desc:
+    "Dieses Modul wurde einer Überprüfung unterzogen und wurde als vertrauenswürdiges Modul bestätigt, das von einem seriösen Entwickler entwickelt wurde.",
+  update_json: "Verwendet eigene Update.json",
+  update_json_desc: "Dieses Modul verwendet seine eigene update.json für Aktualisierungs- und Installationszwecke.",
+  shading: "Schattierung",
+  shading_title: "Benutzerdefinierte Schattierung anwenden",
+  shading_desc: "Seien Sie vorsichtig, wenn es zu dunkel ist, können Sie die Benutzeroberfläche möglicherweise nicht mehr sehen.",
+  module: "Modul",
+  low_quality_module: "Modul von geringer Qualität",
+  low_quality_modules: "Module von geringer Qualität",
+  low_quality_modules_subtitle: "Zeigt eine Warnung unterhalb des Moduls an, wenn es eine niedrige Qualität hat",
+  low_quality_module_warn:
+    "Diesem Magisk-Modul fehlen wichtige Eigenschaften wie ID, Version, Versionscode, Autor usw., was sich auf seine Funktionalität und Herkunft auswirken kann.",
+  invaild_modules: "Ungültige Module",
+  invaild_modules_subtitle: "Ungültige Module anzeigen",
+  enable_install: "Installation aktivieren",
+  scroll_to_bottom: "Nach unten scrollen",
+  scroll_to_bottom_subtitle: "Automatisches Scrollen nach unten im Terminal",
+  scroll_behavior: "Scrollverhalten",
+  terminal: "Terminal",
+  eruda_console: "Eruda Konsole",
+  eruda_console_subtitle: "Nützlich bei der Entwicklung und Fehlersuche",
+  share_device_infos: "Informationen über das Gerät teilen",
+  storage: "Speicher",
+  clear_repos: "Repositorys löschen",
+  patch_settings: "Einstellungen patchen",
+  patch_settings_subtitle: "Fehlende Einstellungsschlüssel hinzufügen",
+  dm_update_json_fetch_warn: "{id} hat eine leere Eigenschaft „updateJson“ oder der Link ist ungültig",
+};
diff --git a/Website/src/locales/declaration.ts b/Website/src/locales/declaration.ts
index 18e85174..32bfaf9c 100644
--- a/Website/src/locales/declaration.ts
+++ b/Website/src/locales/declaration.ts
@@ -1,6 +1,7 @@
 import { AvailableLangs, useStrings } from "@Hooks/useStrings";
-import de from "./de.json";
-import en from "./en.json";
+import { de } from "./de";
+import { en } from "./en";
+import { zh } from "./zh";
 import React from "react";
 
 /**
@@ -8,7 +9,7 @@ import React from "react";
  */
 export type StringDeclaration = keyof typeof en;
 
-export type AvailableStrs = "en" | "de";
+export type AvailableStrs = "en" | "de" | "zh";
 export type Strs = {
   [code in AvailableStrs]: Partial>;
 };
@@ -16,6 +17,7 @@ export type Strs = {
 export const strs: Strs = {
   en: en,
   de: de,
+  zh: zh,
 };
 
 export const useLanguageMap = (): arr => {
diff --git a/Website/src/locales/en.json b/Website/src/locales/en.json
deleted file mode 100644
index 98fd3817..00000000
--- a/Website/src/locales/en.json
+++ /dev/null
@@ -1,92 +0,0 @@
-{
-  "search_modules": "Search modules",
-  "settings": "Settings",
-  "repository": "Repository",
-  "repositories": "Repositories",
-  "appearance": "Appearance",
-  "accent_color": "Accent color",
-  "language": "Language",
-  "dark_theme": "Dark theme",
-  "bottom_navigation_text": "Bottom navigation",
-  "bottom_navigation_subtext": "Moves tabs to the bottom of screen.",
-  "not_supported_in_web_version": "Not supported in web version",
-  "source_code": "Source code",
-  "acknowledgements": "Acknowledgements",
-  "issues": "Issues",
-  "download": "Download",
-  "install": "Install",
-  "update": "Update",
-  "explore": "Explore",
-  "installed": "Installed",
-  "remove": "Remove",
-  "restore": "Restore",
-  "module_enabled_LOG": "{name} has been enabled",
-  "module_disabled_LOG": "{name} has been disabled",
-  "add": "Add",
-  "cancel": "Cancel",
-  "confirm_repo_delete": "Are you sure to remove {name} repository?",
-  "submit_module": "Submit a module",
-  "donate": "Donate",
-  "support": "Support",
-  "website": "Website",
-  "no_root": "No Root",
-  "failed": "Failed",
-  "no_root_message": "Please make sure that you have at least one root manager, otherwise you can't use MMRL.",
-  "open_magisk": "Open Magisk",
-  "development": "Development",
-  "enabled": "Enabled",
-  "comments": "Comments",
-  "configureable": "Configureable",
-  "change_boot": "Changes boot",
-  "need_ramdisk": "Needs Ramdisk",
-  "add_repository": "Add Repository",
-  "add_repository_description": "Add your repository or an repository from some else.",
-  "explore_repositories": "Explore Repositories",
-  "overview": "Overview",
-  "about_this_module": "About this module",
-  "about": "About",
-  "updated_on": "Updated on",
-  "requirements": "Requirements",
-  "access": "Access",
-  "minimum": "Minimum",
-  "recommended": "Recommended",
-  "source": "Source",
-  "require_sdk": "Module requires {sdk}",
-  "unsupported": "Unsupported",
-  "images": "Images",
-  "unset": "Unset",
-  "yes": "Yes",
-  "no": "No",
-  "operating_sys": "Operating System",
-  "verified_module": "Verified module",
-  "verified_module_desc": "This module has undergone verification and has been confirmed as a trusted module developed by a reputable developer.",
-  "update_json": "Uses own update.json",
-  "update_json_desc": "This module utilizes its own update.json for updating and installation purposes.",
-  "shading": "Shading",
-  "shading_title": "Apply custom shading",
-  "shading_desc": "Use with care, if to dark you may not able to see the UI anymore.",
-  "module": "Module",
-  "low_quality_module": "Low quality module",
-  "low_quality_modules": "Low quality modules",
-  "low_quality_modules_subtitle": "Shows a alert below the module if it has a low quality",
-  "low_quality_module_warn": "This Magisk module is missing crucial properties, such as id, version, versionCode, author, etc., which may affect its functionality and origin.",
-  "invaild_modules": "Invaild modules",
-  "invaild_modules_subtitle": "Show invaild modules",
-  "modconf": "ModConf",
-  "modconf_subtitle": "A way to manage different module systems",
-  "enable_install": "Enable install",
-  "enable_install_subtitle": "Since 1.8.5 the MMRL Install Tools are required",
-  "scroll_to_bottom": "Scroll to bottom",
-  "scroll_to_bottom_subtitle": "Automatically scroll to bottom within the terminal",
-  "scroll_behavior": "Scroll behavior",
-  "terminal": "Terminal",
-  "eruda_console": "Eruda console",
-  "eruda_console_subtitle": "Useful for development and bug hunting",
-  "share_device_infos": "Share device information's",
-  "share_device_infos_subtilte": "Device specs, configured ModConf, app infos and installed modules",
-  "storage": "Storage",
-  "clear_repos": "Clear repositories",
-  "patch_settings": "Patch settings",
-  "patch_settings_subtitle": "Add missing settings keys",
-  "sticky_search_bar": "Disable sticky search bar"
-}
\ No newline at end of file
diff --git a/Website/src/locales/en.ts b/Website/src/locales/en.ts
new file mode 100644
index 00000000..2603bf9c
--- /dev/null
+++ b/Website/src/locales/en.ts
@@ -0,0 +1,130 @@
+export const en = {
+  changelog: "Changelog",
+  new: "New",
+  search: "Search",
+  updates: "Updates",
+  versions: "Versions",
+  licenses: "Licenses",
+  license: "License",
+  search_modules: "Search modules",
+  settings: "Settings",
+  repository: "Repository",
+  repositories: "Repositories",
+  appearance: "Appearance",
+  accent_color: "Accent color",
+  language: "Language",
+  dark_theme: "Dark theme",
+  bottom_navigation_text: "Bottom navigation",
+  bottom_navigation_subtext: "Moves tabs to the bottom of screen.",
+  not_supported_in_web_version: "Not supported in web version",
+  source_code: "Source code",
+  acknowledgements: "Acknowledgements",
+  issues: "Issues",
+  download: "Download",
+  install: "Install",
+  update: "Update",
+  explore: "Explore",
+  installed: "Installed",
+  remove: "Remove",
+  restore: "Restore",
+  module_enabled_LOG: "{name} has been enabled",
+  module_disabled_LOG: "{name} has been disabled",
+  add: "Add",
+  cancel: "Cancel",
+  confirm_repo_delete: "Are you sure to remove {name} repository?",
+  submit_module: "Submit a module",
+  donate: "Donate",
+  support: "Support",
+  website: "Website",
+  no_root: "No Root",
+  failed: "Failed",
+  no_root_message: "Please make sure that you have at least one root manager, otherwise you can't use MMRL.",
+  open_magisk: "Open Magisk",
+  development: "Development",
+  enabled: "Enabled",
+  comments: "Comments",
+  configureable: "Configureable",
+  change_boot: "Changes boot",
+  need_ramdisk: "Needs Ramdisk",
+  add_repository: "Add Repository",
+  add_repository_description: "Add your repository or an repository from some else.",
+  explore_repositories: "Explore Repositories",
+  overview: "Overview",
+  about_this_module: "About this module",
+  about: "About",
+  updated_on: "Updated on",
+  requirements: "Requirements",
+  access: "Access",
+  minimum: "Minimum",
+  recommended: "Recommended",
+  source: "Source",
+  require_sdk: "Module requires {sdk}",
+  unsupported: "Unsupported",
+  images: "Images",
+  unset: "Unset",
+  yes: "Yes",
+  no: "No",
+  operating_sys: "Operating System",
+  verified_module: "Verified module",
+  verified_module_desc:
+    "This module has undergone verification and has been confirmed as a trusted module developed by a reputable developer.",
+  update_json: "Uses own update.json",
+  update_json_desc: "This module utilizes its own update.json for updating and installation purposes.",
+  shading: "Shading",
+  shading_title: "Apply custom shading",
+  shading_desc: "Use with care, if to dark you may not able to see the UI anymore.",
+  module: "Module",
+  low_quality_module: "Low quality module",
+  low_quality_modules: "Low quality modules",
+  low_quality_modules_subtitle: "Shows a alert below the module if it has a low quality",
+  low_quality_module_warn:
+    "This Magisk module is missing crucial properties, such as id, version, versionCode, author, etc., which may affect its functionality and origin.",
+  invaild_modules: "Invaild modules",
+  invaild_modules_subtitle: "Show invaild modules",
+  // no translate
+  modconf: "ModConf",
+  modconf_playground: "ModConf Playground",
+  // no translate
+  modfs: "ModFS",
+  enable_install: "Enable install",
+  enable_install_subtitle: "Since 1.8.5 the MMRL Install Tools are required",
+  scroll_to_bottom: "Scroll to bottom",
+  scroll_to_bottom_subtitle: "Automatically scroll to bottom within the terminal",
+  scroll_behavior: "Scroll behavior",
+  terminal: "Terminal",
+  eruda_console: "Eruda console",
+  eruda_console_subtitle: "Useful for development and bug hunting",
+  share_device_infos: "Share device information's",
+  share_device_infos_subtilte: "Device specs, configured ModConf, app infos and installed modules",
+  storage: "Storage",
+  clear_repos: "Clear repositories",
+  patch_settings: "Patch settings",
+  patch_settings_subtitle: "Add missing settings keys",
+  sticky_search_bar: "Disable sticky search bar",
+  dm_update_json_fetch_warn: "{id} has empty „updateJson“ property or the link isn't valid",
+
+  // Anti-Features
+  antifeature: "Anti-Feature",
+  antifeatures: "Anti-Features",
+  AntiFeature_Ads_desc:
+    "This Anti-Feature is applied to a module that contains advertising.\nNote that most modules that contain advertising are not Free Software because they use proprietary software (e.g., AdMob) to provide that advertising. Those modules will not be found in the repo at all, so the only time you would see this Anti-Feature applied would be a module that contains advertising without using Non-Free Software to do it.",
+  AntiFeature_Tracking_desc:
+    "This Anti-Feature is applied to modules that track you and/or report your activity to somewhere, either without your permission or by default (i.e., you'd have to actively seek out an option to disable it).",
+  AntiFeature_NSFW_desc:
+    "This Anti-Feature is applied to a module that contains content that the user may not want to be publicized or visible everywhere. The marked module may contain nudity, profanity, slurs, violence, intense sexuality, political incorrectness, or other potentially disturbing subject matter. This is especially relevant in environments like workplaces, schools, religious, and family settings. The name comes from the Internet term “Not safe for work.”",
+  "AntiFeature_Non-Free Network Services_desc":
+    "This Anti-Feature is applied to modules that promote or depend entirely on a Non-Free network service, which is impossible or not easy to replace. Replacement requires changes to the module or service. This anti-feature would not apply if there is a simple configuration option that allows pointing the module to a running instance of an alternative, publicly available, self-hostable, free software server solution.",
+  "AntiFeature_Non-Free Addons_desc":
+    "This Anti-Feature is applied to modules that, although Free Software themselves, promote other Non-Free applications or plugins.",
+  "AntiFeature_Non-Free Dependencies_desc":
+    "This Anti-Feature is applied to modules that require things that are not Free Software to run.\nThis does not mean that proprietary software is included in the module, but, for example, it may depend on other software already being installed on your device. A common example would be a module that doesn't run or is not useful unless you have Google Maps installed.",
+  "AntiFeature_Upstream Non-Free_desc":
+    "This Anti-Feature is applied to modules where the upstream source code includes proprietary software by default in their own releases.\nThis does not mean that proprietary software is included in the module. Most likely, the F-Droid build has been patched in some way to remove the Non-Free code/libraries, and/or some functionality may be missing. The module's description will usually go into more detail about this.\nIn our experience, where the upstream developer includes Non-Free libraries, sooner or later they will include more Non-Free libraries or other Anti-Features. Frequently, they become impossible to maintain/update in F-Droid. If there is an alternative, it is recommended that you avoid modules with this Anti-Feature if future updates are important to you.",
+  "AntiFeature_Non-Free Assets_desc":
+    "This Anti-Feature is applied to modules that contain and make use of Non-Free assets. The most common case is modules using artwork - images, sounds, music, etc. - under a license that restricts commercial usage or making derivative works (for example, any Creative Commons license with a “Non-Commercial” (NC) or “No Derivatives” (ND) restriction).",
+  "AntiFeature_Known Vulnerability_desc": "This Anti-Feature is applied to modules with a known security vulnerability.",
+  "AntiFeature_Disabled Algorithm_desc":
+    "This Anti-Feature is applied to modules that were signed using a signature algorithm that is considered outdated or unsafe.",
+  "AntiFeature_No Source Since_desc":
+    "The upstream source for this module is no longer available. Either the module went proprietary, the source repository was dropped, or it has moved to a location currently not known to us. This means there will not be further updates unless the source reappears.",
+};
diff --git a/Website/src/locales/zh.ts b/Website/src/locales/zh.ts
new file mode 100644
index 00000000..08efe03c
--- /dev/null
+++ b/Website/src/locales/zh.ts
@@ -0,0 +1,90 @@
+export const zh = {
+  search_modules: "模块搜索",
+  settings: "设置",
+  repository: "仓库",
+  repositories: "仓库",
+  appearance: "外观",
+  accent_color: "强调颜色",
+  language: "语言",
+  dark_theme: "暗黑主题",
+  bottom_navigation_text: "底部导航",
+  bottom_navigation_subtext: "将选项卡移动到屏幕底部。",
+  not_supported_in_web_version: "Web 版本不支持",
+  source_code: "源代码",
+  acknowledgements: "鸣谢",
+  issues: "问题",
+  download: "下载",
+  install: "安装",
+  update: "更新",
+  explore: "浏览",
+  installed: "已安装",
+  remove: "移除",
+  restore: "恢复",
+  module_enabled_LOG: "{name} 已启用",
+  module_disabled_LOG: "{name} 已禁用",
+  add: "添加",
+  cancel: "取消",
+  confirm_repo_delete: "确定要移除 {name} 仓库吗?",
+  submit_module: "提交模块",
+  donate: "捐赠",
+  support: "支持",
+  website: "网站",
+  no_root: "无 Root 权限",
+  failed: "失败",
+  no_root_message: "请确保您至少有一个 root 管理器,否则无法使用 MMRL。",
+  open_magisk: "打开 Magisk",
+  development: "开发",
+  enabled: "已启用",
+  comments: "评论",
+  configureable: "可配置",
+  change_boot: "更改引导",
+  need_ramdisk: "需要 Ramdisk",
+  add_repository: "添加仓库",
+  add_repository_description: "添加您自己的仓库或其他来源的仓库。",
+  explore_repositories: "浏览仓库",
+  overview: "概览",
+  about_this_module: "关于此模块",
+  about: "关于",
+  updated_on: "更新于",
+  requirements: "要求",
+  access: "访问",
+  minimum: "最低要求",
+  recommended: "推荐",
+  source: "来源",
+  require_sdk: "模块要求 {sdk}",
+  unsupported: "不支持",
+  images: "图片",
+  unset: "未设置",
+  yes: "是",
+  no: "否",
+  operating_sys: "操作系统",
+  verified_module: "已验证模块",
+  verified_module_desc: "此模块经过验证,已确认为由值得信赖的开发人员开发的受信任模块。",
+  update_json: "使用自带的 update.json",
+  update_json_desc: "此模块使用自带的 update.json 进行更新和安装。",
+  shading: "着色",
+  shading_title: "应用自定义着色",
+  shading_desc: "小心使用,如果太暗可能无法看到 UI。",
+  module: "模块",
+  low_quality_module: "低质量模块",
+  low_quality_modules: "低质量模块",
+  low_quality_modules_subtitle: "如果模块质量低,则显示警报",
+  low_quality_module_warn: "此 Magisk 模块缺少关键属性,如 id、version、versionCode、author 等,可能会影响其功能和来源。",
+  invaild_modules: "无效模块",
+  invaild_modules_subtitle: "显示无效模块",
+  enable_install: "启用安装",
+  enable_install_subtitle: "从 1.8.5 版本开始,MMRL 安装工具是必需的",
+  scroll_to_bottom: "滚动到底部",
+  scroll_to_bottom_subtitle: "在终端中自动滚动到底部",
+  scroll_behavior: "滚动行为",
+  terminal: "终端",
+  eruda_console: "Eruda 控制台",
+  eruda_console_subtitle: "用于开发和查找错误",
+  share_device_infos: "共享设备信息",
+  share_device_infos_subtilte: "设备规格、配置的 ModConf、应用信息和已安装的模块",
+  storage: "存储",
+  clear_repos: "清除仓库",
+  patch_settings: "修补设置",
+  patch_settings_subtitle: "添加丢失的设置键",
+  sticky_search_bar: "禁用粘性搜索栏",
+};
diff --git a/Website/src/native/Os.ts b/Website/src/native/Os.ts
index 42995685..d85b8385 100644
--- a/Website/src/native/Os.ts
+++ b/Website/src/native/Os.ts
@@ -115,13 +115,18 @@ class OsClass extends Native {
 
   /**
    * Changes the status bar color
+   * @deprecated
    * @param color Your color
    * @param white `true` makes the status bar white
    */
-  public setStatusBarColor(color: string, white: boolean): void {
+  public setStatusBarColor(color: string, white: boolean = false): void {
     this.isAndroid ? this.interface.setStatusBarColor(color, white) : null;
   }
 
+  /**
+   * @deprecated
+   * @param color
+   */
   public setNavigationBarColor(color: string): void {
     this.isAndroid ? this.interface.setNavigationBarColor(color) : null;
   }
diff --git a/Website/src/native/Properties.ts b/Website/src/native/Properties.ts
index 82f3bcfc..be233383 100644
--- a/Website/src/native/Properties.ts
+++ b/Website/src/native/Properties.ts
@@ -8,12 +8,12 @@ interface IProperties {
 
 class PropertiesClass extends Native {
   public constructor() {
-    super(window.__properties__);
+    super(null as any);
   }
 
   public get(key: string, def: string): string {
     if (this.isAndroid) {
-      return this.interface.get(key, def);
+      return Shell.cmd(`getprop "${key}" "${def}"`).result();
     } else {
       return window.localStorage.getItem(key) || def;
     }
diff --git a/Website/src/native/Shell.ts b/Website/src/native/Shell.ts
index a1d852bf..ed4e3a60 100644
--- a/Website/src/native/Shell.ts
+++ b/Website/src/native/Shell.ts
@@ -1,4 +1,5 @@
 import { Native } from "./Native";
+import { SuFile } from "./SuFile";
 
 interface NativeShell {
   /**
@@ -127,73 +128,65 @@ class ShellClass extends Native {
   }
 
   /**
-   * Determine if MMRL runs with KernelSU
+   * Use regex for better detection
+   * @param searcher
+   * @returns
    */
-  public isKernelSU(): boolean {
-    if (this.isAndroid) {
-      return this.interface.isKernelSU();
+  private _mountDetect(searcher: { [Symbol.search](string: string): number }): boolean {
+    const proc = new SuFile("/proc/self/mounts");
+
+    if (proc.exist()) {
+      return proc.read().search(searcher) !== -1;
     } else {
       return false;
     }
   }
 
+  /**
+   * Determine if MMRL runs with KernelSU
+   */
+  public isKernelSU(): boolean {
+    // `proc.exist()` is always `false` on browsers
+    return this._mountDetect(/(KSU|KernelSU)/i);
+  }
+
   /**
    * Determine if MMRL runs with Magisk
    */
   public isMagiskSU(): boolean {
-    if (this.isAndroid) {
-      return this.interface.isMagiskSU();
-    } else {
-      return false;
-    }
+    // `proc.exist()` is always `false` on browsers
+    return this._mountDetect(/(magisk|core\/mirror|core\/img)/i);
   }
 
   /**
    * Determine if MMRL runs with APatch
    */
   public isAPatchSU(): boolean {
-    if (this.isAndroid) {
-      return this.interface.isAPatchSU();
-    } else {
-      return false;
-    }
-  }
-
-  public getenv(key: string): string {
-    if (this.isAndroid) {
-      return this.interface.getenv(key);
-    } else {
-      return "";
-    }
-  }
-
-  public setenv(key: string, value: string, override = 1): void {
-    if (this.isAndroid) {
-      this.interface.setenv(key, value, override);
-    }
+    // `proc.exist()` is always `false` on browsers
+    return this._mountDetect(/(APD|APatch)/i);
   }
 
   /**
    * Returns the current user id
-   * @returns {number} User ID
+   * @returns {strign} User ID
    */
-  public pw_uid(): number {
+  public pw_uid(): string {
     if (this.isAndroid) {
-      return this.interface.pw_uid();
+      return this.interface.result("id -u");
     } else {
-      return -1;
+      return "Unknown";
     }
   }
 
   /**
    * Returns the current group id
-   * @returns {number} Group ID
+   * @returns {string} Group ID
    */
-  public pw_gid(): number {
+  public pw_gid(): string {
     if (this.isAndroid) {
-      return this.interface.pw_gid();
+      return this.interface.result("id -g");
     } else {
-      return -1;
+      return "Unknown";
     }
   }
 
@@ -203,9 +196,9 @@ class ShellClass extends Native {
    */
   public pw_name(): string {
     if (this.isAndroid) {
-      return this.interface.pw_name();
+      return this.interface.result("id -un");
     } else {
-      return "null";
+      return "Unknown";
     }
   }
 }
diff --git a/Website/src/native/SuFile.ts b/Website/src/native/SuFile.ts
index 89d7b1fa..fcb5791e 100644
--- a/Website/src/native/SuFile.ts
+++ b/Website/src/native/SuFile.ts
@@ -18,7 +18,8 @@ interface NativeSuFileV2 {
     write(data: string): void;
     read(): string;
     list(delimiter: string | null): string;
-    create(): boolean;
+    lastModified(): number;
+    create(type: number): boolean;
     delete(): boolean;
     deleteRecursive(): void;
     exists(): boolean;
@@ -35,6 +36,19 @@ class SuFile extends Native {
   private _fs: IFs = wasmFs.fs;
   private _path: string;
 
+  /**
+   * @returns `0` as number to create a new file
+   */
+  public static readonly NEW_FILE: number = 0;
+  /**
+   * @returns `1` as number to create a new folder with parent folders
+   */
+  public static readonly NEW_FOLDERS: number = 1;
+  /**
+   * @returns `2` as number to create a new folder
+   */
+  public static readonly NEW_FOLDER: number = 2;
+
   public constructor(path?: string) {
     super(window.__sufile__);
 
@@ -70,6 +84,14 @@ class SuFile extends Native {
     }
   }
 
+  public lastModified(): number {
+    if (this.isAndroid) {
+      return this._file.lastModified();
+    } else {
+      return 0;
+    }
+  }
+
   public exist(): boolean {
     if (this.isAndroid) {
       return this._file.exists();
@@ -91,10 +113,20 @@ class SuFile extends Native {
       this._file.deleteRecursive();
     }
   }
-
-  public create(): boolean {
+  /**
+   * Creates a new file or folder
+   * ```
+   * SuFile.NEW_FILE
+   * SuFile.NEW_FOLDER
+   * SuFile.NEW_FOLDERS
+   * ```
+   * @param type
+   * @default SuFile.NEW_FILE
+   * @returns {boolean}
+   */
+  public create(type: number = SuFile.NEW_FILE): boolean {
     if (this.isAndroid) {
-      return this._file.create();
+      return this._file.create(type);
     } else {
       return false;
     }
diff --git a/Website/src/native/View.ts b/Website/src/native/View.ts
new file mode 100644
index 00000000..6e23f43f
--- /dev/null
+++ b/Website/src/native/View.ts
@@ -0,0 +1,134 @@
+import { Native } from "./Native";
+
+interface NativeView {
+  getWindowTopInsets(): number;
+  getWindowRightInsets(): number;
+  getWindowBottomInsets(): number;
+  getWindowLeftInsets(): number;
+  setStatusBarColor(color: string, white: boolean): void;
+  setNavigationBarColor(color: string): void;
+  isAppearanceLightNavigationBars(): boolean;
+  setAppearanceLightNavigationBars(isLight: boolean): void;
+  isAppearanceLightStatusBars(): boolean;
+  setAppearanceLightStatusBars(isLight: boolean): void;
+}
+
+class View extends Native {
+  public constructor() {
+    super(window.__view__);
+  }
+
+  public getWindowTopInsets(): number {
+    if (this.isAndroid) {
+      return this.interface.getWindowTopInsets();
+    } else {
+      return 0;
+    }
+  }
+
+  public getWindowRightInsets(): number {
+    if (this.isAndroid) {
+      return this.interface.getWindowRightInsets();
+    } else {
+      return 0;
+    }
+  }
+
+  public getWindowBottomInsets(): number {
+    if (this.isAndroid) {
+      return this.interface.getWindowBottomInsets();
+    } else {
+      return 0;
+    }
+  }
+
+  public getWindowLeftInsets(): number {
+    if (this.isAndroid) {
+      return this.interface.getWindowLeftInsets();
+    } else {
+      return 0;
+    }
+  }
+
+  /**
+   * Checks if the foreground of the navigation bar is set to light.
+   * ```
+   * ```
+   * This method always returns false on API < 26.
+   *
+   * @return true if the foreground is light
+   */
+  public isAppearanceLightNavigationBars(): boolean {
+    if (this.isAndroid) {
+      return this.interface.isAppearanceLightNavigationBars();
+    } else {
+      return false;
+    }
+  }
+
+  /**
+   * If true, changes the foreground color of the navigation bars to light so that the items on
+   * the bar can be read clearly. If false, reverts to the default appearance.
+   * ```
+   * ```
+   * This method has no effect on API < 26.
+   */
+  public setAppearanceLightNavigationBars(isLight: boolean = false): void {
+    if (this.isAndroid) {
+      this.interface.setAppearanceLightNavigationBars(isLight);
+    }
+  }
+
+  /**
+   * Checks if the foreground of the status bar is set to light.
+   * ```
+   * ```
+   * This method always returns false on API < 23.
+   *
+   * @return true if the foreground is light
+   */
+  public isAppearanceLightStatusBars(): boolean {
+    if (this.isAndroid) {
+      return this.interface.isAppearanceLightStatusBars();
+    } else {
+      return false;
+    }
+  }
+
+  /**
+   * If true, changes the foreground color of the status bars to light so that the items on the
+   * bar can be read clearly. If false, reverts to the default appearance.
+   * ```
+   * ```
+   * This method has no effect on API < 23.
+   */
+
+  public setAppearanceLightStatusBars(isLight: boolean = true): void {
+    if (this.isAndroid) {
+      this.interface.setAppearanceLightStatusBars(isLight);
+    }
+  }
+
+  /**
+   * Changes the status bar color
+   * @param color Your color
+   * @param white `true` makes the status bar white
+   */
+  public setStatusBarColor(color: string, white: boolean = false): void {
+    if (this.isAndroid) {
+      this.interface.setStatusBarColor(color, white);
+    }
+  }
+
+  /**
+   *
+   * @param color
+   */
+  public setNavigationBarColor(color: string): void {
+    if (this.isAndroid) {
+      this.interface.setNavigationBarColor(color);
+    }
+  }
+}
+
+export const view: View = new View();
diff --git a/Website/src/styles/light_theme.tsx b/Website/src/styles/light_theme.tsx
index 96bd8f88..ce63649c 100644
--- a/Website/src/styles/light_theme.tsx
+++ b/Website/src/styles/light_theme.tsx
@@ -1,4 +1,5 @@
 import { os } from "@Native/Os";
+import { view } from "@Native/View";
 import { GlobalStyles, Theme } from "@mui/material";
 
 // export const LightTheme = (theme: Theme): any => ({
@@ -11,6 +12,11 @@ export const LightTheme = () => {
   return (
      ({
+        // eruda tools
+        ".eruda-dev-tools": {
+          paddingBottom: `${view.getWindowBottomInsets()}px !important`,
+        },
+
         html: {
           height: "100%",
           width: "100%",
@@ -80,13 +86,15 @@ export const LightTheme = () => {
           bottom: "0",
           overflowX: "visible",
           overflowY: "hidden",
-          color: "#1f1f21",
+          // color: "#1f1f21",
           msOverflowStyle: "none",
         },
         ".page::-webkit-scrollbar": {
           display: "none",
         },
         ".page__content": {
+          containerType: "inline-size",
+          containerName: "ons-page-content",
           backgroundColor: theme.palette.background.default,
           position: "absolute",
           top: "0",
@@ -95,8 +103,11 @@ export const LightTheme = () => {
           bottom: "0",
           boxSizing: "border-box",
           paddingTop: "0",
+          paddingBottom: view.getWindowBottomInsets(),
         },
         ".page__background": {
+          containerType: "inline-size",
+          containerName: "ons-page-background",
           backgroundColor: theme.palette.background.default,
           position: "absolute",
           top: "0",
@@ -106,6 +117,8 @@ export const LightTheme = () => {
           boxSizing: "border-box",
         },
         ".page--material": {
+          containerType: "inline-size",
+          containerName: "ons-page",
           fontFamily: '"Roboto", "Noto", sans-serif',
           webkitFontSmoothing: "antialiased",
           fontWeight: "400",
@@ -873,17 +886,15 @@ export const LightTheme = () => {
         },
         ".toolbar--material": {
           display: "flex",
-
           webkitFlexWrap: "nowrap",
           flexWrap: "nowrap",
           webkitBoxPack: "justify",
           webkitJustifyContent: "space-between",
           justifyContent: "space-between",
-          height: "56px",
-          borderBottom: "0",
+          paddingTop: view.getWindowTopInsets(),
+          height: `calc(56px + ${view.getWindowTopInsets()}px)`,
           boxShadow: "0 1px 5px rgba(0, 0, 0, 0.3)",
-          padding: "0",
-          backgroundColor: theme.palette.primary.main,
+          backgroundColor: theme.palette.background.default,
           backgroundSize: "0",
         },
         ".toolbar--noshadow": {
@@ -1791,14 +1802,15 @@ export const LightTheme = () => {
         },
         ".tabbar--material": {
           background: "none",
-          backgroundColor: theme.palette.primary.main,
+          backgroundColor: theme.palette.background.default,
           borderBottomWidth: "0",
           // boxShadow: "0 4px 2px -2px rgba(0, 0, 0, 0.14), 0 3px 5px -2px rgba(0, 0, 0, 0.12),\r\n    0 5px 1px -4px rgba(0, 0, 0, 0.2)",
         },
         ".tabbar--material__button": {
           backgroundColor: "transparent",
           color: "rgba(255, 255, 255, 1)",
-
+          // color
+          borderBottom: "1px solid #f3f5f726",
           textTransform: "uppercase",
           fontSize: "14px",
           fontWeight: "400",
@@ -1827,7 +1839,7 @@ export const LightTheme = () => {
           backgroundColor: "rgba(49, 49, 58, 0.1)",
         },
         ".tabbar--material__border": {
-          height: "2px",
+          height: "1px",
           backgroundColor: "rgba(255, 255, 255, 1)",
         },
         ".tabbar--material__icon": {
@@ -3937,7 +3949,8 @@ export const LightTheme = () => {
         },
         "ons-fab.fab--bottom__right, button.fab--bottom__right, .speed-dial.fab--bottom__right": {
           top: "auto",
-          bottom: "20px",
+          // bottom: "20px",
+          bottom: `calc(20px + ${view.getWindowBottomInsets()}px)`,
           right: "20px",
           left: "auto",
           position: "absolute",
@@ -4505,10 +4518,12 @@ export const LightTheme = () => {
           bottom: "44px",
         },
         ".toolbar.toolbar--material + .page__background": {
-          top: "56px",
+          top: `calc(56px + ${view.getWindowTopInsets()}px)`,
+          paddingBottom: view.getWindowBottomInsets(),
         },
         ".toolbar.toolbar--material + .page__background + .page__content": {
-          top: "56px",
+          top: `calc(56px + ${view.getWindowTopInsets()}px)`,
+          paddingBottom: view.getWindowBottomInsets(),
           paddingTop: "0",
         },
         ".toolbar.toolbar--transparent + .page__background": {
diff --git a/Website/src/typings/global.d.ts b/Website/src/typings/global.d.ts
index af945e3d..a7c3e905 100644
--- a/Website/src/typings/global.d.ts
+++ b/Website/src/typings/global.d.ts
@@ -1,5 +1,6 @@
 import { AlertColor } from "@mui/material/Alert";
 import { AvailableStrs, strs } from "./../locales/declaration";
+import { Theme } from "@mui/material";
 
 export {};
 
@@ -72,6 +73,10 @@ declare global {
      * This is an Android only window object
      */
     readonly __os__: I;
+    /**
+     * TODO
+     */
+    readonly __view__: I;
     readonly __log__: I;
     readonly __properties__: I;
     /**
@@ -82,10 +87,19 @@ declare global {
     readonly __nativeStorage__: NativeStorage;
   }
 
+  export type MMRLTheme = Theme & {
+    palette?: {
+      text?: {
+        link?: string;
+      };
+    };
+  };
+
   namespace Terminal {
     export type Exec = {
       command: string;
-      env: Record;
+      env?: Record;
+      cwd?: string;
       onLine: (line: string) => void;
       onExit: (code: number) => void;
     };
@@ -119,111 +133,121 @@ declare global {
 
   const __webpack__mode__: "production" | "development";
 
-  interface StoredRepo extends Omit {
-    modules: string;
-  }
-
-  interface Repo {
-    /**
-     * An required filed, to disply the repository name
-     */
+  export interface RepoConfig {
     name: string;
-    mmrlOwner?: string;
-    /**
-     * An given website link for the repository
-     */
     website?: string;
-    /**
-     * Given support link i.g. Telegram, Xda, GitHub or something
-     */
     support?: string;
     donate?: string;
-    submitModule?: string;
-    last_update: number;
-    modules: Module[];
+    submission?: any;
+    base_url: string;
+    max_num?: number;
+    enable_log?: boolean;
+    log_dir?: string;
   }
 
-  export interface Root {
-    last_update: number;
+  export interface Repo {
     name: string;
-    website: any;
-    support: any;
-    donate: any;
-    submitModule: string;
+    website: string;
+    support: string;
+    donate: string;
+    submission: any;
+    metadata: Metadata;
     modules: Module[];
   }
 
-  /** Allows developers to translate their description */
-  export type ModuleDescription = Record;
+  export interface Metadata {
+    version: number;
+    timestamp: number;
+  }
 
   export interface Module {
     id: string;
     name: string;
-    version?: number;
+    version: string;
     versionCode: number;
-    author?: string;
-    description?: string | ModuleDescription;
-    valid: boolean;
+    author: string;
+    description: string;
+    updateJson?: string;
+    added: number;
+    timestamp: number;
+    track: Track;
+    versions: Version[];
+
+    /**
+     * Local modules only
+     */
+    __mmrl__local__module__?: boolean;
+  }
+
+  export interface Track {
+    type: string;
+    added: number;
+    license: string;
+    homepage: string;
+    source: string;
+    support: string;
+    donate: string;
     verified: boolean;
-    hidden: boolean;
-    download: string;
-    last_update: number;
-    readme: string;
-    stars: number;
-    updateJson: string;
-    about: About;
-    mmrl: Mmrl;
-    fox: Fox;
+    cover?: string;
+    icon?: string;
+    require?: string[];
+    screenshots?: string[];
+    category?: string;
+    categories?: string[];
+    stars?: number;
+    readme?: string;
+    antifeatures?: AntiFeatures | AntiFeatures[];
   }
 
-  export interface UpdateJson {
+  type AntiFeatures =
+    | "Ads"
+    | "Tracking"
+    | "Non-Free Network Services"
+    | "Non-Free Addons"
+    | "Non-Free Dependencies"
+    | "NSFW"
+    | "Upstream Non-Free"
+    | "NonßFree Assets"
+    | "Known Vulnerability"
+    | "Disabled Algorithm"
+    | "No Source Since";
+
+  export interface Version {
+    timestamp: number;
     version: string;
     versionCode: number;
     zipUrl: string;
     changelog: string;
   }
 
-  export interface About {
-    repo_source: string;
-    language: string;
-    issues?: string;
-    source: string;
+  export interface UpdateJson {
+    version: string;
+    versionCode: number;
+    zipUrl: string;
+    changelog: string;
   }
 
-  export interface MmrlAuthor {
+  export interface LicenseSPX {
+    isDeprecatedLicenseId: boolean;
+    isFsfLibre: boolean;
+    licenseText: string;
+    standardLicenseTemplate: string;
     name: string;
-    avatar: string;
-    bio: string;
-    followers: number;
-    verified: boolean;
+    licenseId: string;
+    crossRef: CrossRef[];
+    seeAlso: string[];
+    isOsiApproved: boolean;
+    licenseTextHtml: string;
   }
 
-  export interface Mmrl {
-    author?: MmrlAuthor;
-    contributors?: Array;
-    cover?: string;
-    logo?: string;
-    screenshots?: Array;
-    categories?: Array;
-    require?: Array;
-    developerNote?: {
-      severity?: AlertColor;
-      note?: string;
-    };
-    minKernelSU?: number;
-    supportedRoots?: string
-  }
-
-  export interface Fox {
-    minApi?: number;
-    maxApi?: number;
-    minMagisk?: number;
-    needRamdisk?: boolean;
-    support?: string;
-    donate?: string;
-    config?: string;
-    changeBoot?: boolean;
-    mmtReborn?: boolean;
+  export interface CrossRef {
+    match: string;
+    url: string;
+    isValid: boolean;
+    isLive: boolean;
+    timestamp: string;
+    isWayBackLink: boolean;
+    order: number;
   }
 
   // OnsenUI Types
diff --git a/Website/src/util/INCLUDE_CORE.ts b/Website/src/util/INCLUDE_CORE.ts
new file mode 100644
index 00000000..b394582b
--- /dev/null
+++ b/Website/src/util/INCLUDE_CORE.ts
@@ -0,0 +1,77 @@
+export const INCLUDE_CORE= `GREEN="\\x1b[32m"
+RED="\\x1b[31m"
+CYAN="\\x1b[96m"
+YELLOW="\\x1b[93m"
+UNDERLINE="\\x1b[4m"
+RESET="\\x1b[0m"
+
+function ui_info { echo "$GREEN- $RESET$1"; }
+function ui_error { echo "RED! $RESET$2"; exit $1; }
+function ui_warn { echo "$YELLOW? $RESET$1"; }
+function mmrl_exec { echo "#!mmrl:$@"; }
+
+echo "$GREEN    __  _____  _______  __ $RESET"
+echo "$GREEN   /  |/  /  |/  / __ \\/ / $RESET"
+echo "$GREEN  / /|_/ / /|_/ / /_/ / /  $RESET"
+echo "$GREEN / /  / / /  / / _, _/ /___$RESET"
+echo "$GREEN/_/  /_/_/  /_/_/ |_/_____/$RESET"
+echo ""
+ui_info "Using version $CYAN$MMRL_VER$RESET"
+
+ui_info "Initialize BusyBox"
+bb() {
+   case "$ROOTMANAGER" in
+      "Magisk")
+        ui_info "Found$CYAN Magisk's$RESET BusyBox"
+        exec $MSUBSU $@
+        ;;
+      "KernelSU")
+        ui_info "Found$CYAN KernelSU's$RESET BusyBox"
+        exec $KSUBSU $@
+        ;;
+      "APatchSU")
+        ui_info "Found$CYAN APatch's$RESET BusyBox"
+        exec $ASUBSU $@
+        ;;
+      "Unknown")
+        ui_error 1 "Unable to find BusyBox"
+        ;;
+      *)
+        ui_error 1 "BusyBox error"
+        ;;
+   esac
+}
+
+ui_info "Initialize downloader"
+download_file() {
+    bb wget $URL -O "$1"
+    if [ $(echo $?) -eq 0 ]; then
+        ui_info "Successful downloaded $GREEN$NAME$RESET"
+    else
+        ui_error 1 "Something went wrong"
+    fi
+}
+
+ui_info "Initialize install CLI"
+install_cli() {
+   case "$ROOTMANAGER" in
+      "Magisk")
+        ui_info "Found$CYAN Magisk's$RESET CLI"
+        exec $MSUCLI --install-module "$1"
+        ;;
+      "KernelSU")
+        ui_info "Found$CYAN KernelSU's$RESET CLI"
+        exec $KSUCLI module install "$1"
+        ;;
+      "APatchSU")
+        ui_info "Found$CYAN APatch's$RESET CLI"
+        exec $ASUCLI module install "$1"
+        ;;
+      "Unknown")
+        ui_error 1 "Unable to find root manager"
+        ;;
+      *)
+        ui_error 1 "Install error"
+        ;;
+   esac
+}`
\ No newline at end of file
diff --git a/Website/src/util/extname.ts b/Website/src/util/extname.ts
new file mode 100644
index 00000000..4de14500
--- /dev/null
+++ b/Website/src/util/extname.ts
@@ -0,0 +1,58 @@
+const CHAR_FORWARD_SLASH = 47; /* / */
+const CHAR_DOT = 46; /* . */
+
+export function extname(path: string) {
+  if (typeof path !== "string") {
+    throw new TypeError(`The "path" argument must be of type string. Received type ${typeof path}`);
+  }
+
+  let startDot = -1;
+  let startPart = 0;
+  let end = -1;
+  let matchedSlash = true;
+  // Track the state of characters (if any) we see before our first dot and
+  // after any path separator we find
+  let preDotState = 0;
+  for (let i = path.length - 1; i >= 0; --i) {
+    let code = path.charCodeAt(i);
+    if (code === CHAR_FORWARD_SLASH) {
+      // If we reached a path separator that was not part of a set of path
+      // separators at the end of the string, stop now
+      if (!matchedSlash) {
+        startPart = i + 1;
+        break;
+      }
+      continue;
+    }
+    if (end === -1) {
+      // We saw the first non-path separator, mark this as the end of our
+      // extension
+      matchedSlash = false;
+      end = i + 1;
+    }
+    if (code === CHAR_DOT) {
+      // If this is our first dot, mark it as the start of our extension
+      if (startDot === -1) {
+        startDot = i;
+      } else if (preDotState !== 1) {
+        preDotState = 1;
+      }
+    } else if (startDot !== -1) {
+      // We saw a non-dot and non-path separator before our dot, so we should
+      // have a good chance at having a non-empty extension
+      preDotState = -1;
+    }
+  }
+
+  if (
+    startDot === -1 ||
+    end === -1 ||
+    // We saw a non-dot character immediately before the dot
+    preDotState === 0 ||
+    // The (right-most) trimmed path component is exactly '..'
+    (preDotState === 1 && startDot === end - 1 && startDot === startPart + 1)
+  ) {
+    return "";
+  }
+  return path.slice(startDot, end);
+}
diff --git a/Website/src/util/licenses.json b/Website/src/util/licenses.json
index ce21ba69..5c2ae0ee 100644
--- a/Website/src/util/licenses.json
+++ b/Website/src/util/licenses.json
@@ -1,186 +1,447 @@
 [
-    {
-        "name": "@emotion/react",
-        "description": "There is no description",
-        "author": "Emotion Contributors",
-        "version": "11.9.3",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/@emotion/react"
-    },
-    {
-        "name": "@emotion/styled",
-        "description": "styled API for emotion",
-        "author": "null",
-        "version": "11.9.3",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/@emotion/styled"
-    },
-    {
-        "name": "@js.properties/properties",
-        "description": "JavaScript .properties parser and stringifier",
-        "author": "pallxk ",
-        "version": "0.5.4",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/@js.properties/properties"
-    },
-    {
-        "name": "@mui/icons-material",
-        "description": "Material Design icons distributed as SVG React components.",
-        "author": "MUI Team",
-        "version": "5.8.4",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/@mui/icons-material"
-    },
-    {
-        "name": "@mui/material",
-        "description": "React components that implement Google's Material Design.",
-        "author": "MUI Team",
-        "version": "5.8.7",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/@mui/material"
-    },
-    {
-        "name": "axios",
-        "description": "Promise based HTTP client for the browser and node.js",
-        "author": "Matt Zabriskie",
-        "version": "0.27.2",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/axios"
-    },
-    {
-        "name": "bota64",
-        "description": "It's my first custom encoding :(",
-        "author": "Der_Googler ",
-        "version": "1.0.7",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/bota64"
-    },
-    {
-        "name": "googlers-tools",
-        "description": "My own tools / scripts that i use.",
-        "author": "Der_Googler ",
-        "version": "1.2.8",
-        "license": "GPL-3.0",
-        "repository": "https://www.npmjs.com/package/googlers-tools"
-    },
-    {
-        "name": "highlight.js",
-        "description": "Syntax highlighting with language autodetection.",
-        "author": "Josh Goebel ",
-        "version": "11.6.0",
-        "license": "BSD-3-Clause",
-        "repository": "https://www.npmjs.com/package/highlight.js"
-    },
-    {
-        "name": "jss",
-        "description": "A lib for generating Style Sheets with JavaScript.",
-        "author": "JSS Team",
-        "version": "10.9.0",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/jss"
-    },
-    {
-        "name": "jss-preset-default",
-        "description": "Default preset for JSS with selected plugins.",
-        "author": "JSS Team",
-        "version": "10.9.0",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/jss-preset-default"
-    },
-    {
-        "name": "localized-strings",
-        "description": "Simple module to localize the strings of any JS based program using the same syntax used in the ReactLocalization and ReactNativeLocalization module, use 'npm run build' before publishing",
-        "author": "Stefano Falda  (http://www.babisoft.com)",
-        "version": "0.2.4",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/localized-strings"
-    },
-    {
-        "name": "markdown-to-jsx",
-        "description": "Convert markdown to JSX with ease for React and React-like projects. Super lightweight and highly configurable.",
-        "author": "Evan Jacobs ",
-        "version": "7.1.7",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/markdown-to-jsx"
-    },
-    {
-        "name": "marked-react",
-        "description": "Render Markdown as React components",
-        "author": "sibiraj-s",
-        "version": "1.1.2",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/marked-react"
-    },
-    {
-        "name": "material-icons",
-        "description": "Latest icon fonts and CSS for self-hosting material design icons.",
-        "author": "null",
-        "version": "1.11.4",
-        "license": "Apache-2.0",
-        "repository": "https://www.npmjs.com/package/material-icons"
-    },
-    {
-        "name": "object-assign",
-        "description": "ES2015 `Object.assign()` ponyfill",
-        "author": "Sindre Sorhus",
-        "version": "4.1.1",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/object-assign"
-    },
-    {
-        "name": "onsenui",
-        "description": "HTML5 Mobile Framework & UI Components",
-        "author": "null",
-        "version": "2.12.1",
-        "license": "Apache-2.0",
-        "repository": "https://www.npmjs.com/package/onsenui"
-    },
-    {
-        "name": "react",
-        "description": "React is a JavaScript library for building user interfaces.",
-        "author": "null",
-        "version": "18.2.0",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/react"
-    },
-    {
-        "name": "react-device-detect",
-        "description": "Detect device type and render your component according to it",
-        "author": "Michael Laktionov",
-        "version": "2.2.2",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/react-device-detect"
-    },
-    {
-        "name": "react-disappear",
-        "description": "Detects if the inner children are visible",
-        "author": "Der_Googler",
-        "version": "1.0.0",
-        "license": "null",
-        "repository": "https://www.npmjs.com/package/react-disappear"
-    },
-    {
-        "name": "react-dom",
-        "description": "React package for working with the DOM.",
-        "author": "null",
-        "version": "18.2.0",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/react-dom"
-    },
-    {
-        "name": "react-onsenui",
-        "description": "Onsen UI - React Components for Hybrid Cordova/PhoneGap Apps with Material Design and iOS UI components",
-        "author": "Onsen UI Team ",
-        "version": "1.12.0",
-        "license": "Apache-2.0",
-        "repository": "https://www.npmjs.com/package/react-onsenui"
-    },
-    {
-        "name": "react-syntax-highlighter",
-        "description": "syntax highlighting component for react with prismjs or highlightjs ast using inline styles",
-        "author": "Conor Hastings",
-        "version": "15.5.0",
-        "license": "MIT",
-        "repository": "https://www.npmjs.com/package/react-syntax-highlighter"
-    }
-]
+  {
+    "name": "@babel/runtime",
+    "author": null,
+    "license": "MIT",
+    "description": "babel's modular runtime helpers",
+    "version": "7.23.8",
+    "source": "https://www.npmjs.com/package/@babel/runtime"
+  },
+  {
+    "name": "@babel/standalone",
+    "author": null,
+    "license": "MIT",
+    "description": "Standalone build of Babel for use in non-Node.js environments.",
+    "version": "7.23.8",
+    "source": "https://www.npmjs.com/package/@babel/standalone"
+  },
+  {
+    "name": "@emotion/react",
+    "author": null,
+    "license": "MIT",
+    "version": "11.11.3",
+    "source": "https://www.npmjs.com/package/@emotion/react"
+  },
+  {
+    "name": "@emotion/styled",
+    "author": null,
+    "license": "MIT",
+    "description": "styled API for emotion",
+    "version": "11.11.0",
+    "source": "https://www.npmjs.com/package/@emotion/styled"
+  },
+  {
+    "name": "@giscus/react",
+    "author": null,
+    "version": "2.4.0",
+    "source": "https://www.npmjs.com/package/@giscus/react"
+  },
+  {
+    "name": "@monaco-editor/react",
+    "author": null,
+    "license": "MIT",
+    "description": "Monaco Editor for React - use the monaco-editor in any React application without needing to use webpack (or rollup/parcel/etc) configuration files / plugins",
+    "version": "4.6.0",
+    "source": "https://www.npmjs.com/package/@monaco-editor/react"
+  },
+  {
+    "name": "@mui/icons-material",
+    "author": null,
+    "license": "MIT",
+    "description": "Material Design icons distributed as SVG React components.",
+    "version": "5.15.4",
+    "source": "https://www.npmjs.com/package/@mui/icons-material"
+  },
+  {
+    "name": "@mui/lab",
+    "author": null,
+    "license": "MIT",
+    "description": "Laboratory for new MUI modules.",
+    "version": "5.0.0-alpha.160",
+    "source": "https://www.npmjs.com/package/@mui/lab"
+  },
+  {
+    "name": "@mui/material",
+    "author": null,
+    "license": "MIT",
+    "description": "Material UI is an open-source React component library that implements Google's Material Design. It's comprehensive and can be used in production out of the box.",
+    "version": "5.15.4",
+    "source": "https://www.npmjs.com/package/@mui/material"
+  },
+  {
+    "name": "@nyariv/sandboxjs",
+    "author": null,
+    "license": "MIT",
+    "description": "Javascript sandboxing library.",
+    "version": "0.8.23",
+    "source": "https://www.npmjs.com/package/@nyariv/sandboxjs"
+  },
+  {
+    "name": "@primer/octicons-react",
+    "author": null,
+    "license": "MIT",
+    "description": "A scalable set of icons handcrafted with <3 by GitHub.",
+    "version": "19.8.0",
+    "source": "https://www.npmjs.com/package/@primer/octicons-react"
+  },
+  {
+    "name": "@wasmer/wasmfs",
+    "author": null,
+    "license": "MIT",
+    "description": "Isomorphic library to provide a sandboxed node fs implementation for Node and Browsers. 📂",
+    "version": "0.12.0",
+    "source": "https://www.npmjs.com/package/@wasmer/wasmfs"
+  },
+  {
+    "name": "ace-builds",
+    "author": null,
+    "license": "BSD-3-Clause",
+    "description": "Ace (Ajax.org Cloud9 Editor)",
+    "version": "1.32.3",
+    "source": "https://www.npmjs.com/package/ace-builds"
+  },
+  {
+    "name": "ajv",
+    "author": null,
+    "license": "MIT",
+    "description": "Another JSON Schema Validator",
+    "version": "8.12.0",
+    "source": "https://www.npmjs.com/package/ajv"
+  },
+  {
+    "name": "ansi-to-react",
+    "author": null,
+    "license": "BSD-3-Clause",
+    "description": "ANSI to React Elements",
+    "version": "6.1.6",
+    "source": "https://www.npmjs.com/package/ansi-to-react"
+  },
+  {
+    "name": "axios",
+    "author": null,
+    "license": "MIT",
+    "description": "Promise based HTTP client for the browser and node.js",
+    "version": "1.6.5",
+    "source": "https://www.npmjs.com/package/axios"
+  },
+  {
+    "name": "default-composer",
+    "author": null,
+    "license": "MIT",
+    "description": "A JavaScript library that allows you to set default values for nested objects",
+    "version": "0.6.0",
+    "source": "https://www.npmjs.com/package/default-composer"
+  },
+  {
+    "name": "eruda",
+    "author": null,
+    "license": "MIT",
+    "description": "Console for Mobile Browsers",
+    "version": "3.0.1",
+    "source": "https://www.npmjs.com/package/eruda"
+  },
+  {
+    "name": "flatlist-react",
+    "author": null,
+    "license": "MIT",
+    "description": "A helpful utility component to handle lists in react like a champ",
+    "version": "1.5.14",
+    "source": "https://www.npmjs.com/package/flatlist-react"
+  },
+  {
+    "name": "framer-motion",
+    "author": null,
+    "license": "MIT",
+    "description": "A simple and powerful JavaScript animation library",
+    "version": "10.18.0",
+    "source": "https://www.npmjs.com/package/framer-motion"
+  },
+  {
+    "name": "fs-monkey",
+    "author": null,
+    "license": "Unlicense",
+    "description": "Monkey patches for file system related things.",
+    "version": "1.0.5",
+    "source": "https://www.npmjs.com/package/fs-monkey"
+  },
+  {
+    "name": "googlers-tools",
+    "author": null,
+    "license": "GPL-3.0",
+    "description": "My own tools / scripts that I use.",
+    "version": "1.4.5",
+    "source": "https://www.npmjs.com/package/googlers-tools"
+  },
+  {
+    "name": "highlight.js",
+    "author": null,
+    "license": "BSD-3-Clause",
+    "description": "Syntax highlighting with language autodetection.",
+    "version": "11.9.0",
+    "source": "https://www.npmjs.com/package/highlight.js"
+  },
+  {
+    "name": "ini",
+    "author": null,
+    "license": "ISC",
+    "description": "An ini encoder/decoder for node",
+    "version": "4.1.1",
+    "source": "https://www.npmjs.com/package/ini"
+  },
+  {
+    "name": "install",
+    "author": "Ben Newman",
+    "license": "MIT",
+    "description": "Minimal JavaScript module loader",
+    "version": "0.13.0",
+    "source": "https://www.npmjs.com/package/install"
+  },
+  {
+    "name": "localforage",
+    "author": null,
+    "license": "Apache-2.0",
+    "description": "Offline storage, improved.",
+    "version": "1.10.0",
+    "source": "https://www.npmjs.com/package/localforage"
+  },
+  {
+    "name": "localized-strings",
+    "author": null,
+    "license": "MIT",
+    "description": "Simple module to localize the strings of any JS based program using the same syntax used in the ReactLocalization and ReactNativeLocalization module, use 'npm run build' before publishing",
+    "version": "0.2.4",
+    "source": "https://www.npmjs.com/package/localized-strings"
+  },
+  {
+    "name": "markdown-to-jsx",
+    "author": null,
+    "license": "MIT",
+    "description": "Convert markdown to JSX with ease for React and React-like projects. Super lightweight and highly configurable.",
+    "version": "7.4.0",
+    "source": "https://www.npmjs.com/package/markdown-to-jsx"
+  },
+  {
+    "name": "marked-react",
+    "author": null,
+    "license": "MIT",
+    "description": "Render Markdown as React components",
+    "version": "1.4.0",
+    "source": "https://www.npmjs.com/package/marked-react"
+  },
+  {
+    "name": "material-icons",
+    "author": null,
+    "license": "Apache-2.0",
+    "description": "Latest icon fonts and CSS for self-hosting material design icons.",
+    "version": "1.13.12",
+    "source": "https://www.npmjs.com/package/material-icons"
+  },
+  {
+    "name": "material-ui-confirm",
+    "author": null,
+    "license": "MIT",
+    "description": "Higher order component for straightforward use of @material-ui/core confirmation dialogs.",
+    "version": "3.0.10",
+    "source": "https://www.npmjs.com/package/material-ui-confirm"
+  },
+  {
+    "name": "monaco-editor",
+    "author": null,
+    "license": "MIT",
+    "description": "A browser based code editor",
+    "version": "0.45.0",
+    "source": "https://www.npmjs.com/package/monaco-editor"
+  },
+  {
+    "name": "monaco-editor-core",
+    "author": null,
+    "license": "MIT",
+    "description": "A browser based code editor",
+    "version": "0.43.0",
+    "source": "https://www.npmjs.com/package/monaco-editor-core"
+  },
+  {
+    "name": "monaco-languageclient",
+    "author": "TypeFox GmbH",
+    "license": "MIT",
+    "description": "Monaco Language client implementation",
+    "version": "6.6.1",
+    "source": "https://www.npmjs.com/package/monaco-languageclient"
+  },
+  {
+    "name": "npm",
+    "author": null,
+    "license": "Artistic-2.0",
+    "description": "a package manager for JavaScript",
+    "version": "9.9.2",
+    "source": "https://www.npmjs.com/package/npm"
+  },
+  {
+    "name": "object-assign",
+    "author": "Sindre Sorhus",
+    "license": "MIT",
+    "description": "ES2015 `Object.assign()` ponyfill",
+    "version": "4.1.1",
+    "source": "https://www.npmjs.com/package/object-assign"
+  },
+  {
+    "name": "onsenui",
+    "author": null,
+    "license": "Apache-2.0",
+    "description": "HTML5 Mobile Framework & UI Components",
+    "version": "2.12.8",
+    "source": "https://www.npmjs.com/package/onsenui"
+  },
+  {
+    "name": "properties-file",
+    "author": null,
+    "license": "MIT",
+    "description": ".properties file parser, editor, formatter and Webpack loader.",
+    "version": "3.3.16",
+    "source": "https://www.npmjs.com/package/properties-file"
+  },
+  {
+    "name": "react",
+    "author": null,
+    "license": "MIT",
+    "description": "React is a JavaScript library for building user interfaces.",
+    "version": "18.2.0",
+    "source": "https://www.npmjs.com/package/react"
+  },
+  {
+    "name": "react-ace",
+    "author": null,
+    "license": "MIT",
+    "description": "A react component for Ace Editor",
+    "version": "10.1.0",
+    "source": "https://www.npmjs.com/package/react-ace"
+  },
+  {
+    "name": "react-device-detect",
+    "author": "Michael Laktionov",
+    "license": "MIT",
+    "description": "Detect device type and render your component according to it",
+    "version": "2.2.3",
+    "source": "https://www.npmjs.com/package/react-device-detect"
+  },
+  {
+    "name": "react-disappear",
+    "author": null,
+    "license": "MIT",
+    "description": "Detects if the inner children are visible",
+    "version": "1.1.3",
+    "source": "https://www.npmjs.com/package/react-disappear"
+  },
+  {
+    "name": "react-dom",
+    "author": null,
+    "license": "MIT",
+    "description": "React package for working with the DOM.",
+    "version": "18.2.0",
+    "source": "https://www.npmjs.com/package/react-dom"
+  },
+  {
+    "name": "react-fast-marquee",
+    "author": null,
+    "license": "MIT",
+    "description": "A lightweight React component that utilizes the power of CSS animations to create silky smooth marquees.",
+    "version": "1.6.2",
+    "source": "https://www.npmjs.com/package/react-fast-marquee"
+  },
+  {
+    "name": "react-from-json",
+    "author": null,
+    "license": "MIT",
+    "description": "Declare your React component tree in JSON",
+    "version": "0.7.2",
+    "source": "https://www.npmjs.com/package/react-from-json"
+  },
+  {
+    "name": "react-jsx-parser",
+    "author": null,
+    "license": "MIT",
+    "description": "A React component which can parse JSX and output rendered React Components",
+    "version": "1.29.0",
+    "source": "https://www.npmjs.com/package/react-jsx-parser"
+  },
+  {
+    "name": "react-onsenui",
+    "author": null,
+    "license": "Apache-2.0",
+    "description": "Onsen UI - React Components for Hybrid Cordova/PhoneGap Apps with Material Design and iOS UI components",
+    "version": "1.13.3",
+    "source": "https://www.npmjs.com/package/react-onsenui"
+  },
+  {
+    "name": "react-render-tools",
+    "author": null,
+    "license": "GPL-3.0",
+    "description": "Simple tools to make react render easier to use",
+    "version": "1.0.1",
+    "source": "https://www.npmjs.com/package/react-render-tools"
+  },
+  {
+    "name": "react-router-dom",
+    "author": null,
+    "license": "MIT",
+    "description": "Declarative routing for React web applications",
+    "version": "6.21.2",
+    "source": "https://www.npmjs.com/package/react-router-dom"
+  },
+  {
+    "name": "react-syntax-highlighter",
+    "author": null,
+    "license": "MIT",
+    "description": "syntax highlighting component for react with prismjs or highlightjs ast using inline styles",
+    "version": "15.5.0",
+    "source": "https://www.npmjs.com/package/react-syntax-highlighter"
+  },
+  {
+    "name": "react-zoom-pan-pinch",
+    "author": null,
+    "license": "MIT",
+    "description": "Zoom and pan html elements in easy way",
+    "version": "3.3.0",
+    "source": "https://www.npmjs.com/package/react-zoom-pan-pinch"
+  },
+  {
+    "name": "textarea-markdown-editor",
+    "author": null,
+    "license": "MIT",
+    "description": "UI headless React markdown editor using only textarea",
+    "version": "1.0.4",
+    "source": "https://www.npmjs.com/package/textarea-markdown-editor"
+  },
+  {
+    "name": "underscore",
+    "author": null,
+    "license": "MIT",
+    "description": "JavaScript's functional programming helper library.",
+    "version": "1.13.6",
+    "source": "https://www.npmjs.com/package/underscore"
+  },
+  {
+    "name": "uninstall",
+    "author": null,
+    "license": "MIT",
+    "description": "",
+    "version": "0.0.0",
+    "source": "https://www.npmjs.com/package/uninstall"
+  },
+  {
+    "name": "usehooks-ts",
+    "author": null,
+    "license": "MIT",
+    "description": "React hook library, ready to use, written in Typescript.",
+    "version": "2.9.2",
+    "source": "https://www.npmjs.com/package/usehooks-ts"
+  },
+  {
+    "name": "yaml",
+    "author": null,
+    "license": "ISC",
+    "description": "JavaScript parser and stringifier for YAML",
+    "version": "2.3.4",
+    "source": "https://www.npmjs.com/package/yaml"
+  }
+]
\ No newline at end of file
diff --git a/Website/src/util/stringFormat.ts b/Website/src/util/stringFormat.ts
new file mode 100644
index 00000000..a73d100e
--- /dev/null
+++ b/Website/src/util/stringFormat.ts
@@ -0,0 +1,49 @@
+export function formatString(template: string, object: object): string {
+    return template.replace(/\<(\w+(\.\w+)*)\>/gi, (match, key) => {
+      const keys = key.split(".");
+      let value = object;
+      for (const k of keys) {
+        if (k in value) {
+          value = value[k];
+        } else {
+          return match;
+        }
+      }
+      return formatString(String(value), object);
+    });
+  }
+  
+  export function formatObjectEntries(object: O): O {
+    const formatValue = (value: any): any => {
+      if (typeof value === "string") {
+        return value.replace(/\<(\w+(\.\w+)*)\>/gi, (match, key) => {
+          const keys = key.split(".");
+          let tempValue = object;
+          for (const k of keys) {
+            if (k in tempValue) {
+              tempValue = tempValue[k];
+            } else {
+              return match;
+            }
+          }
+          return formatValue(tempValue);
+        });
+      } else if (Array.isArray(value)) {
+        return value.map((item: any) => formatValue(item));
+      } else if (typeof value === "object" && value !== null) {
+        const formattedObject: any = {};
+        for (const prop in value) {
+          formattedObject[prop] = formatValue(value[prop]);
+        }
+        return formattedObject;
+      }
+      return value;
+    };
+  
+    const formattedObject: any = {};
+    for (const key in object) {
+      const formattedValue = formatValue(object[key]);
+      formattedObject[key] = formattedValue;
+    }
+    return formattedObject;
+  }
\ No newline at end of file
diff --git a/docs/ModConf.md b/docs/ModConf.md
new file mode 100644
index 00000000..d1b7a0bd
--- /dev/null
+++ b/docs/ModConf.md
@@ -0,0 +1,206 @@
+# Module Configure (ModConf)
+
+- TODO
+
+## Available libaries
+
+- `@mmrl/ui`
+- `@mmrl/hooks`
+- `@mmrl/sufile`
+- `@mmrl/terminal`
+- `@mmrl/shell`
+- `@mmrl/buildconfig`
+- `@mmrl/os`
+- `@mmrl/providers`
+- `@mui/material`
+- `@mui/icons-material`
+- `react`
+
+## Diff. between `require` and `import`
+
+With `require` you only can import predefined libaries, you can't includes files with this method anymore.
+
+```js
+const React = require("react");
+// or
+import React from "react";
+```
+
+old way to import files
+
+```js
+const { Component } = require("!conf/Component.jsx");
+// or
+import { Component } from "!conf/Component.jsx";
+```
+
+> Please do not use this, use `include` instead.
+
+---
+
+Using `include` way more stable and supports more including types like
+
+- `*.js`
+- `*.jsx`
+- `*.json`
+- `*.ini`
+- `*.prop`
+- `*.properties`
+
+```js
+const { Component } = include("Component.jsx");
+
+// to ignore cwd restrictions
+const properties = include(`/data/adb/modules/${modid}/module.prop`, {
+  ignoreCwd: true,
+});
+
+const { id, name, author } = properties;
+```
+
+## Defaut functions and variables
+
+There are some default functions and variables that makes the development easier..
+
+> These functions make also usage of the ModConf services.
+
+### `modid`
+
+Types
+
+```ts
+declare const modid: string;
+```
+
+Usage
+
+```js
+log.i(modid);
+```
+
+### `modpath`
+
+Types
+
+```ts
+declare function modpath(path: string): string;
+```
+
+Usage
+
+```js
+const properties = include(modpath("module.prop"), { ignoreCwd: true });
+
+const { id, name, author } = properties;
+```
+
+Will print
+
+```
+/data/adb/modules//module.prop
+```
+
+> Depends how ModConf is configured
+
+### `confpath`
+
+Types
+
+```ts
+declare function confpath(path: string): string;
+```
+
+Usage
+
+```js
+const properties = include(confpath("Component.jsx"), { ignoreCwd: true });
+
+const { id, name, author } = properties;
+```
+
+Will print
+
+```
+/data/adb/modules//system/share/mmrl/config//Component.jsx
+```
+
+# Setup a page
+
+Small sample to setup a page
+
+```jsx
+import React from "react";
+
+import { Page, Toolbar } from "@mmrl/ui";
+import { useActivity } from "@mmrl/hooks";
+
+import { Stack } from "@mui/material";
+import {
+  Timeline,
+  TimelineItem,
+  TimelineSeparator,
+  TimelineConnector,
+  TimelineContent,
+  TimelineDot,
+} from "@mui/lab";
+
+const Config = () => {
+  const { context } = useActivity();
+
+  const renderToolbar = () => {
+    return (
+      
+        
+          {/* Pressing this here will close the editor */}
+          
+        
+        My config
+      
+    );
+  };
+
+  return (
+    
+      
+        
+          
+            
+              
+              
+            
+            Eat
+          
+          
+            
+              
+              
+            
+            Code
+          
+          
+            
+              
+              
+            
+            Sleep
+          
+          
+            
+              
+            
+            Repeat
+          
+        
+      
+    
+  );
+};
+
+export default Config;
+```
diff --git a/docs/ModFS.md b/docs/ModFS.md
new file mode 100644
index 00000000..be879467
--- /dev/null
+++ b/docs/ModFS.md
@@ -0,0 +1,33 @@
+# Module File System (ModFS)
+
+TODO
+
+## Workarounds
+
+Here are some samples to avoid some configs
+
+## Avoid MMRL Install Tools
+
+This workaroud is for people who don't wanna install a extra module for installing other modules
+
+Based on your selected root method
+
+| Root method | CLI        | Busybox    |
+| ----------- | ---------- | ---------- |
+| Magisk      | `` | `` |
+| KernelSU    | `` | `` |
+| APatch      | `` | `` |
+
+### Local install script
+
+```shell
+ --install-module ""
+```
+
+> We use magisk as example. KernelSU or APatch is ` module install ""`
+
+### Explore install script
+
+```shell
+FILE="/data/local/tmp/.zip";  wget "" -O $FILE;  --install-module $FILE;
+```
diff --git a/www/cordova_plugins.js b/www/cordova_plugins.js
index ae395f73..fb5e32e2 100644
--- a/www/cordova_plugins.js
+++ b/www/cordova_plugins.js
@@ -1,14 +1,19 @@
 cordova.define("cordova/plugin_list", function (require, exports, module) {
   module.exports = [
-    {
-      file: "plugins/com.dergoogler.plugin/www/terminal.js",
-      id: "com.dergoogler.plugin.terminal",
-      clobbers: ["Terminal"],
-    },
     {
       file: "plugins/com.dergoogler.plugin/www/chooser.js",
       id: "com.dergoogler.plugin.chooser",
       clobbers: ["Chooser"],
     },
+    {
+      file: "plugins/com.dergoogler.plugin/www/fetch.js",
+      id: "com.dergoogler.plugin.fetch",
+      clobbers: ["fetch"],
+    },
+    {
+      file: "plugins/com.dergoogler.plugin/www/terminal.js",
+      id: "com.dergoogler.plugin.terminal",
+      clobbers: ["Terminal"],
+    },
   ];
 });
diff --git a/www/index.html b/www/index.html
index d87b3ef4..654f2621 100644
--- a/www/index.html
+++ b/www/index.html
@@ -10,20 +10,20 @@
 
     
     
-    
+    
     
     
-    
+    
 
     
     
-    
+    
     
     
-    
+    
 
     
-    
+    
     
     
   
diff --git a/www/plugins/com.dergoogler.plugin/www/fetch.js b/www/plugins/com.dergoogler.plugin/www/fetch.js
new file mode 100644
index 00000000..eda2b247
--- /dev/null
+++ b/www/plugins/com.dergoogler.plugin/www/fetch.js
@@ -0,0 +1,377 @@
+/* global cordova:false */
+
+cordova.define(
+  "com.dergoogler.plugin.fetch",
+  function (require, exports, module) {
+    /*!
+     * Module dependencies.
+     */
+    var exec = require("cordova/exec");
+
+    function normalizeName(name) {
+      if (typeof name !== "string") {
+        name = String(name);
+      }
+      if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
+        throw new TypeError("Invalid character in header field name");
+      }
+      return name.toLowerCase();
+    }
+
+    function normalizeValue(value) {
+      if (typeof value !== "string") {
+        value = String(value);
+      }
+      return value;
+    }
+
+    function Headers(headers) {
+      this.map = {};
+
+      if (headers instanceof Headers || headers instanceof window.Headers) {
+        headers.forEach(function (value, name) {
+          this.append(name, value);
+        }, this);
+      } else if (headers) {
+        Object.getOwnPropertyNames(headers).forEach(function (name) {
+          this.append(name, headers[name]);
+        }, this);
+      }
+    }
+
+    Headers.prototype.append = function (name, value) {
+      name = normalizeName(name);
+      value = normalizeValue(value);
+      var list = this.map[name];
+      if (!list) {
+        list = [];
+        this.map[name] = list;
+      }
+      list.push(value);
+    };
+
+    Headers.prototype["delete"] = function (name) {
+      delete this.map[normalizeName(name)];
+    };
+
+    Headers.prototype.get = function (name) {
+      var values = this.map[normalizeName(name)];
+      return values ? values[0] : null;
+    };
+
+    Headers.prototype.getAll = function (name) {
+      return this.map[normalizeName(name)] || [];
+    };
+
+    Headers.prototype.has = function (name) {
+      return this.map.hasOwnProperty(normalizeName(name));
+    };
+
+    Headers.prototype.set = function (name, value) {
+      this.map[normalizeName(name)] = [normalizeValue(value)];
+    };
+
+    Headers.prototype.forEach = function (callback, thisArg) {
+      Object.getOwnPropertyNames(this.map).forEach(function (name) {
+        this.map[name].forEach(function (value) {
+          callback.call(thisArg, value, name, this);
+        }, this);
+      }, this);
+    };
+
+    function consumed(body) {
+      if (body.bodyUsed) {
+        return Promise.reject(new TypeError("Already read"));
+      }
+      body.bodyUsed = true;
+    }
+
+    function fileReaderReady(reader) {
+      return new Promise(function (resolve, reject) {
+        reader.onload = function () {
+          resolve(reader.result);
+        };
+        reader.onerror = function () {
+          reject(reader.error);
+        };
+      });
+    }
+
+    function readBlobAsArrayBuffer(blob) {
+      var reader = new FileReader();
+      reader.readAsArrayBuffer(blob);
+      return fileReaderReady(reader);
+    }
+
+    function readBlobAsText(blob) {
+      var reader = new FileReader();
+      reader.readAsText(blob);
+      return fileReaderReady(reader);
+    }
+
+    function b64toBlob(b64Data, contentType, sliceSize) {
+      contentType = contentType || "";
+      sliceSize = sliceSize || 512;
+
+      var byteCharacters = atob(b64Data);
+      var byteArrays = [];
+
+      for (
+        var offset = 0;
+        offset < byteCharacters.length;
+        offset += sliceSize
+      ) {
+        var slice = byteCharacters.slice(offset, offset + sliceSize);
+
+        var byteNumbers = new Array(slice.length);
+        for (var i = 0; i < slice.length; i++) {
+          byteNumbers[i] = slice.charCodeAt(i);
+        }
+
+        var byteArray = new Uint8Array(byteNumbers);
+
+        byteArrays.push(byteArray);
+      }
+
+      var blob = new Blob(byteArrays, { type: contentType });
+      return blob;
+    }
+
+    var support = {
+      blob:
+        "FileReader" in self &&
+        "Blob" in self &&
+        (function () {
+          try {
+            new Blob();
+            return true;
+          } catch (e) {
+            return false;
+          }
+        })(),
+      formData: "FormData" in self,
+    };
+
+    function Body() {
+      this.bodyUsed = false;
+
+      this._initBody = function (body) {
+        this._bodyInit = body;
+        if (typeof body === "string") {
+          this._bodyText = body;
+        } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
+          this._bodyBlob = body;
+        } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
+          this._bodyFormData = body;
+        } else if (!body) {
+          this._bodyText = "";
+        } else {
+          throw new Error("unsupported BodyInit type");
+        }
+      };
+
+      if (support.blob) {
+        this.blob = function () {
+          var rejected = consumed(this);
+          if (rejected) {
+            return rejected;
+          }
+
+          if (this._bodyBlob) {
+            return Promise.resolve(this._bodyBlob);
+          } else if (this._bodyFormData) {
+            throw new Error("could not read FormData body as blob");
+          } else {
+            return Promise.resolve(new Blob([this._bodyText]));
+          }
+        };
+
+        this.arrayBuffer = function () {
+          return this.blob().then(readBlobAsArrayBuffer);
+        };
+
+        this.text = function () {
+          var rejected = consumed(this);
+          if (rejected) {
+            return rejected;
+          }
+
+          if (this._bodyBlob) {
+            return readBlobAsText(this._bodyBlob);
+          } else if (this._bodyFormData) {
+            throw new Error("could not read FormData body as text");
+          } else {
+            return Promise.resolve(this._bodyText);
+          }
+        };
+      } else {
+        this.text = function () {
+          var rejected = consumed(this);
+          return rejected ? rejected : Promise.resolve(this._bodyText);
+        };
+      }
+
+      if (support.formData) {
+        this.formData = function () {
+          return this.text().then(decode);
+        };
+      }
+
+      this.json = function () {
+        return this.text().then(JSON.parse);
+      };
+
+      return this;
+    }
+
+    // HTTP methods whose capitalization should be normalized
+    var methods = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"];
+
+    function normalizeMethod(method) {
+      var upcased = method.toUpperCase();
+      return methods.indexOf(upcased) > -1 ? upcased : method;
+    }
+
+    function Request(input, options) {
+      options = options || {};
+      var body = options.body;
+      if (Request.prototype.isPrototypeOf(input)) {
+        if (input.bodyUsed) {
+          throw new TypeError("Already read");
+        }
+        this.url = input.url;
+        this.credentials = input.credentials;
+        if (!options.headers) {
+          this.headers = new Headers(input.headers);
+        }
+        this.method = input.method;
+        this.mode = input.mode;
+        if (!body) {
+          body = input._bodyInit;
+          input.bodyUsed = true;
+        }
+      } else {
+        this.url = input;
+      }
+
+      this.credentials = options.credentials || this.credentials || "omit";
+      if (options.headers || !this.headers) {
+        this.headers = new Headers(options.headers);
+      }
+      this.method = normalizeMethod(options.method || this.method || "GET");
+      this.mode = options.mode || this.mode || null;
+      this.referrer = null;
+
+      if ((this.method === "GET" || this.method === "HEAD") && body) {
+        throw new TypeError("Body not allowed for GET or HEAD requests");
+      }
+      this._initBody(body);
+    }
+
+    function decode(body) {
+      var form = new FormData();
+      body
+        .trim()
+        .split("&")
+        .forEach(function (bytes) {
+          if (bytes) {
+            var split = bytes.split("=");
+            var name = split.shift().replace(/\+/g, " ");
+            var value = split.join("=").replace(/\+/g, " ");
+            form.append(decodeURIComponent(name), decodeURIComponent(value));
+          }
+        });
+      return form;
+    }
+
+    function headers(xhr) {
+      var head = new Headers();
+      var pairs = xhr.getAllResponseHeaders().trim().split("\n");
+      pairs.forEach(function (header) {
+        var split = header.trim().split(":");
+        var key = split.shift().trim();
+        var value = split.join(":").trim();
+        head.append(key, value);
+      });
+      return head;
+    }
+
+    Body.call(Request.prototype);
+
+    function Response(bodyInit, options) {
+      if (!options) {
+        options = {};
+      }
+
+      this._initBody(bodyInit);
+      this.type = "default";
+      this.status = options.status;
+      this.ok = this.status >= 200 && this.status < 300;
+      this.statusText = options.statusText;
+      this.headers =
+        options.headers instanceof Headers
+          ? options.headers
+          : new Headers(options.headers);
+      this.url = options.url || "";
+    }
+
+    Body.call(Response.prototype);
+
+    var cordovaFetch = {};
+
+    cordovaFetch.Headers = Headers;
+    cordovaFetch.Request = Request;
+    cordovaFetch.Response = Response;
+
+    cordovaFetch.fetch = function (input, init) {
+      var request;
+      if (Request.prototype.isPrototypeOf(input) && !init) {
+        request = input;
+      } else {
+        request = new Request(input, init);
+      }
+
+      return new Promise(function (resolve, reject) {
+        exec(
+          function (response) {
+            var options = {
+              status: response.status,
+              statusText: response.statusText,
+              headers: response.headers,
+              url: response.url,
+            };
+
+            var body = response.isBlob
+              ? b64toBlob(response.body)
+              : response.body;
+            var fetchResponse = new Response(body, options);
+            resolve(fetchResponse);
+          },
+          function (response) {
+            reject(new TypeError(response.toString()));
+          },
+          "Fetch",
+          "fetch",
+          [
+            request.method,
+            request.url,
+            typeof request._bodyInit === "undefined" ? null : request._bodyInit,
+            request.headers,
+          ]
+        );
+      });
+    };
+
+    /**
+     * Set timeout of the underlying http request
+     * @param timeout in seconds
+     */
+    cordovaFetch.fetch.setTimeout = function (timeout) {
+      exec(null, null, "FetchPlugin", "setTimeout", [timeout]);
+    };
+
+    cordovaFetch.fetch.polyfill = true;
+
+    module.exports = cordovaFetch.fetch;
+  }
+);
diff --git a/www/plugins/com.dergoogler.plugin/www/terminal.js b/www/plugins/com.dergoogler.plugin/www/terminal.js
index 4ab071c4..a62ea9d6 100644
--- a/www/plugins/com.dergoogler.plugin/www/terminal.js
+++ b/www/plugins/com.dergoogler.plugin/www/terminal.js
@@ -7,7 +7,8 @@ cordova.define(
       exec: function (opt) {
         exec(opt.onLine, opt.onExit, "Terminal", "exec", [
           opt.command,
-          opt.env,
+          opt.env || { HOME: "/" },
+          opt.cwd || "/",
         ]);
       },
       test: function (msg, successCallback, errorCallback) {