From 14d40d995d4326eada12bb5237a1bd928358d050 Mon Sep 17 00:00:00 2001 From: Nagarjuna Date: Tue, 28 Jan 2025 16:17:38 +0530 Subject: [PATCH 01/12] Feat: [:feature:auth] - Migrated to KMP --- .github/workflows/master_dev_ci.yml | 9 +- .run/mifospay-android.run.xml | 70 +++ .run/mifospay-desktop.run.xml | 24 + .run/mifospay-web-js.run.xml | 24 + .run/mifospay-web-wasm.run.xml | 24 + androidApp/build.gradle.kts | 56 +- .../demoDebugRuntimeClasspath.txt | 68 +-- .../demoReleaseRuntimeClasspath.txt | 67 +- .../prodDebugRuntimeClasspath.txt | 68 +-- .../prodReleaseRuntimeClasspath.txt | 67 +- .../kotlin/AndroidFeatureConventionPlugin.kt | 4 +- .../main/kotlin/CMPFeatureConventionPlugin.kt | 4 +- .../main/kotlin/KMPKoinConventionPlugin.kt | 6 + .../org/mifos/mobile/KotlinMultiplatform.kt | 2 +- ci-prepush.bat | 2 + ci-prepush.sh | 2 + .../core/common/utils/StringExtensions.kt | 33 + .../core/ui/PasswordStrengthIndicator.kt | 217 +++++++ .../mobile/core/ui/utils/BackgroundEvent.kt | 18 + .../mobile/core/ui/utils/BaseViewModel.kt | 100 +++ .../mobile/core/ui/utils/EventsEffect.kt | 42 ++ .../mobile/core/ui/utils/PasswordChecker.kt | 94 +++ .../mobile/core/ui/utils/PasswordStrength.kt | 19 + .../ui/utils/PasswordStrengthExtensions.kt | 40 ++ feature/auth/build.gradle.kts | 29 +- .../kotlin}/AndroidManifest.xml | 0 .../drawable/feature_auth_ic_person.xml | 0 .../drawable/feature_auth_lock.xml | 0 .../drawable/feature_auth_mifos_logo.png | Bin .../composeResources}/values/strings.xml | 12 +- .../mobile/feature/auth/di/AuthModule.kt | 22 + .../mobile/feature/auth/login/LoginScreen.kt | 285 +++++++++ .../feature/auth/login/LoginViewModel.kt | 171 ++++++ .../auth/navigation/AuthenticationNavGraph.kt | 6 +- .../AuthenticationNavigationScreen.kt | 0 .../auth/registration/RegistrationScreen.kt | 364 +++++++++++ .../RegistrationVerificationScreen.kt | 234 +++++++ .../RegistrationVerificationViewModel.kt | 147 +++++ .../registration/RegistrationViewModel.kt | 292 +++++++++ .../feature/auth/login/screens/LoginScreen.kt | 445 -------------- .../auth/login/viewmodel/LoginViewModel.kt | 77 --- .../screens/RegistrationScreen.kt | 575 ------------------ .../screens/RegistrationVerificationScreen.kt | 279 --------- .../registration/utils/PasswordStrength.kt | 81 --- .../viewmodel/RegistrationViewModel.kt | 86 --- .../auth/src/main/res/values/validations.xml | 14 - gradle.properties | 3 +- gradle/libs.versions.toml | 2 + settings.gradle.kts | 47 +- 49 files changed, 2408 insertions(+), 1823 deletions(-) create mode 100644 .run/mifospay-android.run.xml create mode 100644 .run/mifospay-desktop.run.xml create mode 100644 .run/mifospay-web-js.run.xml create mode 100644 .run/mifospay-web-wasm.run.xml create mode 100644 core/common/src/commonMain/kotlin/org/mifos/mobile/core/common/utils/StringExtensions.kt create mode 100644 core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/PasswordStrengthIndicator.kt create mode 100644 core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/BackgroundEvent.kt create mode 100644 core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/BaseViewModel.kt create mode 100644 core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/EventsEffect.kt create mode 100644 core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/PasswordChecker.kt create mode 100644 core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/PasswordStrength.kt create mode 100644 core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/PasswordStrengthExtensions.kt rename feature/auth/src/{main => androidMain/kotlin}/AndroidManifest.xml (100%) rename feature/auth/src/{main/res => commonMain/composeResources}/drawable/feature_auth_ic_person.xml (100%) rename feature/auth/src/{main/res => commonMain/composeResources}/drawable/feature_auth_lock.xml (100%) rename feature/auth/src/{main/res => commonMain/composeResources}/drawable/feature_auth_mifos_logo.png (100%) rename feature/auth/src/{main/res => commonMain/composeResources}/values/strings.xml (80%) create mode 100644 feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/di/AuthModule.kt create mode 100644 feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginScreen.kt create mode 100644 feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginViewModel.kt rename feature/auth/src/{main/java => commonMain/kotlin}/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt (92%) rename feature/auth/src/{main/java => commonMain/kotlin}/org/mifos/mobile/feature/auth/navigation/AuthenticationNavigationScreen.kt (100%) create mode 100644 feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationScreen.kt create mode 100644 feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationScreen.kt create mode 100644 feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationViewModel.kt create mode 100644 feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationViewModel.kt delete mode 100644 feature/auth/src/main/java/org/mifos/mobile/feature/auth/login/screens/LoginScreen.kt delete mode 100644 feature/auth/src/main/java/org/mifos/mobile/feature/auth/login/viewmodel/LoginViewModel.kt delete mode 100644 feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/screens/RegistrationScreen.kt delete mode 100644 feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/screens/RegistrationVerificationScreen.kt delete mode 100644 feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/utils/PasswordStrength.kt delete mode 100644 feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/viewmodel/RegistrationViewModel.kt delete mode 100644 feature/auth/src/main/res/values/validations.xml diff --git a/.github/workflows/master_dev_ci.yml b/.github/workflows/master_dev_ci.yml index 4a9e63b96..78347eadb 100644 --- a/.github/workflows/master_dev_ci.yml +++ b/.github/workflows/master_dev_ci.yml @@ -86,7 +86,7 @@ jobs: - name: Check Dependency Guard id: dependencyguard_verify continue-on-error: true - run: ./gradlew dependencyGuard + run: ./gradlew :mifos-android:dependencyGuard - name: Prevent updating Dependency Guard baselines if this is a fork id: checkfork_dependencyguard @@ -99,7 +99,7 @@ jobs: id: dependencyguard_baseline if: steps.dependencyguard_verify.outcome == 'failure' && github.event_name == 'pull_request' run: | - ./gradlew dependencyGuardBaseline + ./gradlew :mifos-android:dependencyGuard - name: Push new Dependency Guard baselines if available uses: stefanzweifel/git-auto-commit-action@v5 @@ -122,7 +122,8 @@ jobs: - name: Run tests run: | - ./gradlew testDebug :lint:test :androidApp:lintRelease :lint:lint + ./gradlew :mifos-android:testDemoDebug +# ./gradlew testDebug :lint:test :androidApp:lintRelease :lint:lint - name: Upload reports if: always() @@ -176,7 +177,7 @@ jobs: java-version: 17 - name: Build APKs - run: ./gradlew :androidApp:assembleDebug + run: ./gradlew :mifos-android:assembleDemoDebug - name: Upload APKs uses: actions/upload-artifact@v4 diff --git a/.run/mifospay-android.run.xml b/.run/mifospay-android.run.xml new file mode 100644 index 000000000..7517eb0f9 --- /dev/null +++ b/.run/mifospay-android.run.xml @@ -0,0 +1,70 @@ + + + + + \ No newline at end of file diff --git a/.run/mifospay-desktop.run.xml b/.run/mifospay-desktop.run.xml new file mode 100644 index 000000000..d49ce6dd5 --- /dev/null +++ b/.run/mifospay-desktop.run.xml @@ -0,0 +1,24 @@ + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/.run/mifospay-web-js.run.xml b/.run/mifospay-web-js.run.xml new file mode 100644 index 000000000..e2e9526dc --- /dev/null +++ b/.run/mifospay-web-js.run.xml @@ -0,0 +1,24 @@ + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/.run/mifospay-web-wasm.run.xml b/.run/mifospay-web-wasm.run.xml new file mode 100644 index 000000000..aedd38d67 --- /dev/null +++ b/.run/mifospay-web-wasm.run.xml @@ -0,0 +1,24 @@ + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index c74ac18df..ef9a4850a 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -14,7 +14,6 @@ plugins { alias(libs.plugins.mifos.android.application) alias(libs.plugins.mifos.android.application.compose) alias(libs.plugins.mifos.android.application.flavors) - alias(libs.plugins.mifos.android.hilt) id("com.google.android.gms.oss-licenses-plugin") } @@ -84,27 +83,27 @@ dependencies { implementation(projects.core.ui) implementation(projects.core.designsystem) - implementation(projects.feature.loan) - implementation(projects.feature.beneficiary) - implementation(projects.feature.guarantor) - implementation(projects.feature.savings) - implementation(projects.feature.qr) - implementation(projects.feature.transferProcess) - implementation(projects.feature.account) - implementation(projects.feature.clientCharge) - implementation(projects.feature.recentTransaction) - implementation(projects.feature.thirdPartyTransfer) - implementation(projects.feature.help) - implementation(projects.feature.notification) - implementation(projects.feature.location) - implementation(projects.feature.about) - implementation(projects.feature.settings) - implementation(projects.feature.updatePassword) - implementation(projects.feature.home) +// implementation(projects.feature.loan) +// implementation(projects.feature.beneficiary) +// implementation(projects.feature.guarantor) +// implementation(projects.feature.savings) +// implementation(projects.feature.qr) +// implementation(projects.feature.transferProcess) +// implementation(projects.feature.account) +// implementation(projects.feature.clientCharge) +// implementation(projects.feature.recentTransaction) +// implementation(projects.feature.thirdPartyTransfer) +// implementation(projects.feature.help) +// implementation(projects.feature.notification) +// implementation(projects.feature.location) +// implementation(projects.feature.about) +// implementation(projects.feature.settings) +// implementation(projects.feature.updatePassword) +// implementation(projects.feature.home) implementation(projects.feature.auth) - implementation(projects.feature.userProfile) +// implementation(projects.feature.userProfile) - implementation(projects.libs.mifosPasscode) +// implementation(projects.libs.mifosPasscode) // Jetpack Compose implementation(libs.androidx.appcompat) @@ -120,7 +119,6 @@ dependencies { implementation(libs.androidx.compose.ui.tooling.preview) implementation(libs.androidx.compose.ui.util) implementation(libs.androidx.lifecycle.runtimeCompose) - implementation(libs.androidx.hilt.navigation.compose) implementation(libs.androidx.core.splashscreen) @@ -129,15 +127,15 @@ dependencies { implementation(libs.google.oss.licenses) implementation(libs.androidx.multidex) - testImplementation(projects.core.testing) - testImplementation(libs.hilt.android.testing) - testImplementation(libs.work.testing) +// testImplementation(projects.core.testing) +// testImplementation(libs.hilt.android.testing) +// testImplementation(libs.work.testing) - androidTestImplementation(kotlin("test")) - androidTestImplementation(projects.core.testing) - androidTestImplementation(libs.androidx.test.espresso.core) - androidTestImplementation(libs.androidx.navigation.testing) - androidTestImplementation(libs.hilt.android.testing) +// androidTestImplementation(kotlin("test")) +// androidTestImplementation(projects.core.testing) +// androidTestImplementation(libs.androidx.test.espresso.core) +// androidTestImplementation(libs.androidx.navigation.testing) +// androidTestImplementation(libs.hilt.android.testing) debugApi(libs.androidx.compose.ui.tooling) } diff --git a/androidApp/dependencies/demoDebugRuntimeClasspath.txt b/androidApp/dependencies/demoDebugRuntimeClasspath.txt index 41c5a4682..e336f2ce5 100644 --- a/androidApp/dependencies/demoDebugRuntimeClasspath.txt +++ b/androidApp/dependencies/demoDebugRuntimeClasspath.txt @@ -9,11 +9,6 @@ androidx.appcompat:appcompat:1.7.0 androidx.arch.core:core-common:2.2.0 androidx.arch.core:core-runtime:2.2.0 androidx.autofill:autofill:1.0.0 -androidx.camera:camera-camera2:1.4.1 -androidx.camera:camera-core:1.4.1 -androidx.camera:camera-lifecycle:1.4.1 -androidx.camera:camera-video:1.4.1 -androidx.camera:camera-view:1.4.1 androidx.collection:collection-jvm:1.4.4 androidx.collection:collection-ktx:1.4.4 androidx.collection:collection:1.4.4 @@ -44,7 +39,6 @@ androidx.compose.ui:ui-geometry-android:1.7.6 androidx.compose.ui:ui-geometry:1.7.6 androidx.compose.ui:ui-graphics-android:1.7.6 androidx.compose.ui:ui-graphics:1.7.6 -androidx.compose.ui:ui-test-manifest:1.7.6 androidx.compose.ui:ui-text-android:1.7.6 androidx.compose.ui:ui-text:1.7.6 androidx.compose.ui:ui-tooling-android:1.7.6 @@ -59,15 +53,13 @@ androidx.compose.ui:ui-util-android:1.7.6 androidx.compose.ui:ui-util:1.7.6 androidx.compose.ui:ui:1.7.6 androidx.compose:compose-bom:2024.12.01 -androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 androidx.core:core-ktx:1.15.0 androidx.core:core-splashscreen:1.0.1 androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 -androidx.customview:customview:1.0.0 -androidx.databinding:viewbinding:7.4.2 +androidx.customview:customview:1.1.0 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 @@ -76,8 +68,6 @@ androidx.exifinterface:exifinterface:1.3.7 androidx.fragment:fragment-ktx:1.8.5 androidx.fragment:fragment:1.8.5 androidx.graphics:graphics-path:1.0.1 -androidx.hilt:hilt-navigation-compose:1.2.0 -androidx.hilt:hilt-navigation:1.2.0 androidx.interpolator:interpolator:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 androidx.lifecycle:lifecycle-common-java8:2.8.7 @@ -103,11 +93,13 @@ androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 androidx.metrics:metrics-performance:1.0.0-beta01 androidx.multidex:multidex:2.0.1 -androidx.navigation:navigation-common-ktx:2.8.5 -androidx.navigation:navigation-common:2.8.5 -androidx.navigation:navigation-compose:2.8.5 -androidx.navigation:navigation-runtime-ktx:2.8.5 -androidx.navigation:navigation-runtime:2.8.5 +androidx.navigation:navigation-common-ktx:2.8.4 +androidx.navigation:navigation-common:2.8.4 +androidx.navigation:navigation-compose:2.8.4 +androidx.navigation:navigation-fragment-ktx:2.8.4 +androidx.navigation:navigation-fragment:2.8.4 +androidx.navigation:navigation-runtime-ktx:2.8.4 +androidx.navigation:navigation-runtime:2.8.4 androidx.print:print:1.0.0 androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05 androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 @@ -120,6 +112,7 @@ androidx.room:room-runtime-android:2.7.0-alpha12 androidx.room:room-runtime:2.7.0-alpha12 androidx.savedstate:savedstate-ktx:1.2.1 androidx.savedstate:savedstate:1.2.1 +androidx.slidingpanelayout:slidingpanelayout:1.2.0 androidx.sqlite:sqlite-android:2.5.0-alpha12 androidx.sqlite:sqlite-bundled-android:2.5.0-alpha12 androidx.sqlite:sqlite-bundled:2.5.0-alpha12 @@ -129,6 +122,7 @@ androidx.sqlite:sqlite:2.5.0-alpha12 androidx.startup:startup-runtime:1.1.1 androidx.tracing:tracing-ktx:1.2.0 androidx.tracing:tracing:1.2.0 +androidx.transition:transition:1.4.1 androidx.vectordrawable:vectordrawable-animated:1.1.0 androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 @@ -152,33 +146,20 @@ com.arkivanov.essenty:utils-internal:2.1.0 com.caverock:androidsvg-aar:1.4 com.google.accompanist:accompanist-drawablepainter:0.36.0 com.google.accompanist:accompanist-pager:0.34.0 -com.google.accompanist:accompanist-permissions:0.34.0 -com.google.android.datatransport:transport-api:2.2.1 -com.google.android.datatransport:transport-backend-cct:2.3.3 -com.google.android.datatransport:transport-runtime:2.2.6 com.google.android.gms:play-services-ads-identifier:18.0.0 com.google.android.gms:play-services-base:18.5.0 com.google.android.gms:play-services-basement:18.4.0 -com.google.android.gms:play-services-maps:18.2.0 com.google.android.gms:play-services-measurement-api:22.1.2 com.google.android.gms:play-services-measurement-base:22.1.2 com.google.android.gms:play-services-measurement-impl:22.1.2 com.google.android.gms:play-services-measurement-sdk-api:22.1.2 com.google.android.gms:play-services-measurement-sdk:22.1.2 com.google.android.gms:play-services-measurement:22.1.2 -com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1 com.google.android.gms:play-services-oss-licenses:17.1.0 com.google.android.gms:play-services-stats:17.0.2 com.google.android.gms:play-services-tasks:18.2.0 -com.google.android.odml:image:1.0.0-beta1 -com.google.auto.value:auto-value-annotations:1.6.3 com.google.code.findbugs:jsr305:3.0.2 -com.google.code.gson:gson:2.10.1 -com.google.dagger:dagger-lint-aar:2.54 -com.google.dagger:dagger:2.54 -com.google.dagger:hilt-android:2.54 -com.google.dagger:hilt-core:2.54 -com.google.errorprone:error_prone_annotations:2.28.0 +com.google.errorprone:error_prone_annotations:2.26.0 com.google.firebase:firebase-analytics-ktx:22.1.2 com.google.firebase:firebase-analytics:22.1.2 com.google.firebase:firebase-annotations:16.2.0 @@ -186,22 +167,13 @@ com.google.firebase:firebase-bom:33.7.0 com.google.firebase:firebase-common-ktx:21.0.0 com.google.firebase:firebase-common:21.0.0 com.google.firebase:firebase-components:18.0.0 -com.google.firebase:firebase-encoders-json:17.1.0 -com.google.firebase:firebase-encoders:17.0.0 com.google.firebase:firebase-installations-interop:17.1.1 com.google.firebase:firebase-installations:18.0.0 com.google.firebase:firebase-measurement-connector:19.0.0 -com.google.guava:failureaccess:1.0.2 -com.google.guava:guava:33.3.1-android +com.google.guava:failureaccess:1.0.1 +com.google.guava:guava:31.1-android com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -com.google.j2objc:j2objc-annotations:3.0.0 -com.google.maps.android:maps-compose:4.4.1 -com.google.maps.android:maps-ktx:5.0.0 -com.google.mlkit:barcode-scanning-common:17.0.0 -com.google.mlkit:barcode-scanning:17.3.0 -com.google.mlkit:common:18.11.0 -com.google.mlkit:vision-common:17.3.0 -com.google.mlkit:vision-interfaces:16.3.0 +com.google.j2objc:j2objc-annotations:1.3 com.russhwolf:multiplatform-settings-android-debug:1.2.0 com.russhwolf:multiplatform-settings-coroutines-android-debug:1.2.0 com.russhwolf:multiplatform-settings-coroutines:1.2.0 @@ -214,8 +186,6 @@ com.squareup.okhttp3:okhttp-sse:4.12.0 com.squareup.okhttp3:okhttp:4.12.0 com.squareup.okio:okio-jvm:3.9.1 com.squareup.okio:okio:3.9.1 -com.squareup.retrofit2:converter-gson:2.11.0 -com.squareup.retrofit2:retrofit:2.11.0 de.jensklingenberg.ktorfit:ktorfit-annotations-android-debug:2.2.0 de.jensklingenberg.ktorfit:ktorfit-annotations:2.2.0 de.jensklingenberg.ktorfit:ktorfit-lib-android-debug:2.2.0 @@ -237,13 +207,13 @@ io.coil-kt.coil3:coil-network-ktor3:3.0.4 io.coil-kt.coil3:coil-svg-android:3.0.4 io.coil-kt.coil3:coil-svg:3.0.4 io.coil-kt.coil3:coil:3.0.4 -io.github.mr0xf00:easycrop:0.1.1 io.github.vinceglb:filekit-compose-android:0.8.7 io.github.vinceglb:filekit-compose:0.8.7 io.github.vinceglb:filekit-core-android:0.8.7 io.github.vinceglb:filekit-core:0.8.7 io.insert-koin:koin-android:4.0.1-RC1 io.insert-koin:koin-androidx-compose:4.0.1-RC1 +io.insert-koin:koin-androidx-navigation:4.0.1-RC1 io.insert-koin:koin-annotations-jvm:1.4.0-RC4 io.insert-koin:koin-annotations:1.4.0-RC4 io.insert-koin:koin-bom:4.0.1-RC1 @@ -289,10 +259,8 @@ io.ktor:ktor-websocket-serialization-jvm:3.0.3 io.ktor:ktor-websocket-serialization:3.0.3 io.ktor:ktor-websockets-jvm:3.0.3 io.ktor:ktor-websockets:3.0.3 -io.michaelrocks:libphonenumber-android:8.13.35 -jakarta.inject:jakarta.inject-api:2.0.1 javax.inject:javax.inject:1 -org.checkerframework:checker-qual:3.43.0 +org.checkerframework:checker-qual:3.12.0 org.jetbrains.androidx.core:core-bundle-android-debug:1.0.1 org.jetbrains.androidx.core:core-bundle:1.0.1 org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.3 @@ -331,7 +299,8 @@ org.jetbrains.compose.ui:ui-util:1.7.0-rc01 org.jetbrains.compose.ui:ui:1.7.0-rc01 org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.23 +org.jetbrains.kotlin:kotlin-reflect:2.1.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22 org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 org.jetbrains.kotlin:kotlin-stdlib:2.1.0 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 @@ -358,5 +327,4 @@ org.jetbrains.kotlinx:kotlinx-serialization-json-io:1.7.3 org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 org.jetbrains:annotations:23.0.0 -org.jspecify:jspecify:1.0.0 org.slf4j:slf4j-api:2.0.16 diff --git a/androidApp/dependencies/demoReleaseRuntimeClasspath.txt b/androidApp/dependencies/demoReleaseRuntimeClasspath.txt index 7aaedb853..bb7db873c 100644 --- a/androidApp/dependencies/demoReleaseRuntimeClasspath.txt +++ b/androidApp/dependencies/demoReleaseRuntimeClasspath.txt @@ -9,11 +9,6 @@ androidx.appcompat:appcompat:1.7.0 androidx.arch.core:core-common:2.2.0 androidx.arch.core:core-runtime:2.2.0 androidx.autofill:autofill:1.0.0 -androidx.camera:camera-camera2:1.4.1 -androidx.camera:camera-core:1.4.1 -androidx.camera:camera-lifecycle:1.4.1 -androidx.camera:camera-video:1.4.1 -androidx.camera:camera-view:1.4.1 androidx.collection:collection-jvm:1.4.4 androidx.collection:collection-ktx:1.4.4 androidx.collection:collection:1.4.4 @@ -54,15 +49,13 @@ androidx.compose.ui:ui-util-android:1.7.6 androidx.compose.ui:ui-util:1.7.6 androidx.compose.ui:ui:1.7.6 androidx.compose:compose-bom:2024.12.01 -androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 androidx.core:core-ktx:1.15.0 androidx.core:core-splashscreen:1.0.1 androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 -androidx.customview:customview:1.0.0 -androidx.databinding:viewbinding:7.4.2 +androidx.customview:customview:1.1.0 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 @@ -71,8 +64,6 @@ androidx.exifinterface:exifinterface:1.3.7 androidx.fragment:fragment-ktx:1.8.5 androidx.fragment:fragment:1.8.5 androidx.graphics:graphics-path:1.0.1 -androidx.hilt:hilt-navigation-compose:1.2.0 -androidx.hilt:hilt-navigation:1.2.0 androidx.interpolator:interpolator:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 androidx.lifecycle:lifecycle-common-java8:2.8.7 @@ -98,11 +89,13 @@ androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 androidx.metrics:metrics-performance:1.0.0-beta01 androidx.multidex:multidex:2.0.1 -androidx.navigation:navigation-common-ktx:2.8.5 -androidx.navigation:navigation-common:2.8.5 -androidx.navigation:navigation-compose:2.8.5 -androidx.navigation:navigation-runtime-ktx:2.8.5 -androidx.navigation:navigation-runtime:2.8.5 +androidx.navigation:navigation-common-ktx:2.8.4 +androidx.navigation:navigation-common:2.8.4 +androidx.navigation:navigation-compose:2.8.4 +androidx.navigation:navigation-fragment-ktx:2.8.4 +androidx.navigation:navigation-fragment:2.8.4 +androidx.navigation:navigation-runtime-ktx:2.8.4 +androidx.navigation:navigation-runtime:2.8.4 androidx.print:print:1.0.0 androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05 androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 @@ -115,6 +108,7 @@ androidx.room:room-runtime-android:2.7.0-alpha12 androidx.room:room-runtime:2.7.0-alpha12 androidx.savedstate:savedstate-ktx:1.2.1 androidx.savedstate:savedstate:1.2.1 +androidx.slidingpanelayout:slidingpanelayout:1.2.0 androidx.sqlite:sqlite-android:2.5.0-alpha12 androidx.sqlite:sqlite-bundled-android:2.5.0-alpha12 androidx.sqlite:sqlite-bundled:2.5.0-alpha12 @@ -124,6 +118,7 @@ androidx.sqlite:sqlite:2.5.0-alpha12 androidx.startup:startup-runtime:1.1.1 androidx.tracing:tracing-ktx:1.2.0 androidx.tracing:tracing:1.2.0 +androidx.transition:transition:1.4.1 androidx.vectordrawable:vectordrawable-animated:1.1.0 androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 @@ -147,33 +142,20 @@ com.arkivanov.essenty:utils-internal:2.1.0 com.caverock:androidsvg-aar:1.4 com.google.accompanist:accompanist-drawablepainter:0.36.0 com.google.accompanist:accompanist-pager:0.34.0 -com.google.accompanist:accompanist-permissions:0.34.0 -com.google.android.datatransport:transport-api:2.2.1 -com.google.android.datatransport:transport-backend-cct:2.3.3 -com.google.android.datatransport:transport-runtime:2.2.6 com.google.android.gms:play-services-ads-identifier:18.0.0 com.google.android.gms:play-services-base:18.5.0 com.google.android.gms:play-services-basement:18.4.0 -com.google.android.gms:play-services-maps:18.2.0 com.google.android.gms:play-services-measurement-api:22.1.2 com.google.android.gms:play-services-measurement-base:22.1.2 com.google.android.gms:play-services-measurement-impl:22.1.2 com.google.android.gms:play-services-measurement-sdk-api:22.1.2 com.google.android.gms:play-services-measurement-sdk:22.1.2 com.google.android.gms:play-services-measurement:22.1.2 -com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1 com.google.android.gms:play-services-oss-licenses:17.1.0 com.google.android.gms:play-services-stats:17.0.2 com.google.android.gms:play-services-tasks:18.2.0 -com.google.android.odml:image:1.0.0-beta1 -com.google.auto.value:auto-value-annotations:1.6.3 com.google.code.findbugs:jsr305:3.0.2 -com.google.code.gson:gson:2.10.1 -com.google.dagger:dagger-lint-aar:2.54 -com.google.dagger:dagger:2.54 -com.google.dagger:hilt-android:2.54 -com.google.dagger:hilt-core:2.54 -com.google.errorprone:error_prone_annotations:2.28.0 +com.google.errorprone:error_prone_annotations:2.26.0 com.google.firebase:firebase-analytics-ktx:22.1.2 com.google.firebase:firebase-analytics:22.1.2 com.google.firebase:firebase-annotations:16.2.0 @@ -181,22 +163,13 @@ com.google.firebase:firebase-bom:33.7.0 com.google.firebase:firebase-common-ktx:21.0.0 com.google.firebase:firebase-common:21.0.0 com.google.firebase:firebase-components:18.0.0 -com.google.firebase:firebase-encoders-json:17.1.0 -com.google.firebase:firebase-encoders:17.0.0 com.google.firebase:firebase-installations-interop:17.1.1 com.google.firebase:firebase-installations:18.0.0 com.google.firebase:firebase-measurement-connector:19.0.0 -com.google.guava:failureaccess:1.0.2 -com.google.guava:guava:33.3.1-android +com.google.guava:failureaccess:1.0.1 +com.google.guava:guava:31.1-android com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -com.google.j2objc:j2objc-annotations:3.0.0 -com.google.maps.android:maps-compose:4.4.1 -com.google.maps.android:maps-ktx:5.0.0 -com.google.mlkit:barcode-scanning-common:17.0.0 -com.google.mlkit:barcode-scanning:17.3.0 -com.google.mlkit:common:18.11.0 -com.google.mlkit:vision-common:17.3.0 -com.google.mlkit:vision-interfaces:16.3.0 +com.google.j2objc:j2objc-annotations:1.3 com.russhwolf:multiplatform-settings-android:1.2.0 com.russhwolf:multiplatform-settings-coroutines-android:1.2.0 com.russhwolf:multiplatform-settings-coroutines:1.2.0 @@ -209,8 +182,6 @@ com.squareup.okhttp3:okhttp-sse:4.12.0 com.squareup.okhttp3:okhttp:4.12.0 com.squareup.okio:okio-jvm:3.9.1 com.squareup.okio:okio:3.9.1 -com.squareup.retrofit2:converter-gson:2.11.0 -com.squareup.retrofit2:retrofit:2.11.0 de.jensklingenberg.ktorfit:ktorfit-annotations-android:2.2.0 de.jensklingenberg.ktorfit:ktorfit-annotations:2.2.0 de.jensklingenberg.ktorfit:ktorfit-lib-android:2.2.0 @@ -232,13 +203,13 @@ io.coil-kt.coil3:coil-network-ktor3:3.0.4 io.coil-kt.coil3:coil-svg-android:3.0.4 io.coil-kt.coil3:coil-svg:3.0.4 io.coil-kt.coil3:coil:3.0.4 -io.github.mr0xf00:easycrop:0.1.1 io.github.vinceglb:filekit-compose-android:0.8.7 io.github.vinceglb:filekit-compose:0.8.7 io.github.vinceglb:filekit-core-android:0.8.7 io.github.vinceglb:filekit-core:0.8.7 io.insert-koin:koin-android:4.0.1-RC1 io.insert-koin:koin-androidx-compose:4.0.1-RC1 +io.insert-koin:koin-androidx-navigation:4.0.1-RC1 io.insert-koin:koin-annotations-jvm:1.4.0-RC4 io.insert-koin:koin-annotations:1.4.0-RC4 io.insert-koin:koin-bom:4.0.1-RC1 @@ -284,10 +255,8 @@ io.ktor:ktor-websocket-serialization-jvm:3.0.3 io.ktor:ktor-websocket-serialization:3.0.3 io.ktor:ktor-websockets-jvm:3.0.3 io.ktor:ktor-websockets:3.0.3 -io.michaelrocks:libphonenumber-android:8.13.35 -jakarta.inject:jakarta.inject-api:2.0.1 javax.inject:javax.inject:1 -org.checkerframework:checker-qual:3.43.0 +org.checkerframework:checker-qual:3.12.0 org.jetbrains.androidx.core:core-bundle-android:1.0.1 org.jetbrains.androidx.core:core-bundle:1.0.1 org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.3 @@ -326,7 +295,8 @@ org.jetbrains.compose.ui:ui-util:1.7.0-rc01 org.jetbrains.compose.ui:ui:1.7.0-rc01 org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.23 +org.jetbrains.kotlin:kotlin-reflect:2.1.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22 org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 org.jetbrains.kotlin:kotlin-stdlib:2.1.0 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 @@ -353,5 +323,4 @@ org.jetbrains.kotlinx:kotlinx-serialization-json-io:1.7.3 org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 org.jetbrains:annotations:23.0.0 -org.jspecify:jspecify:1.0.0 org.slf4j:slf4j-api:2.0.16 diff --git a/androidApp/dependencies/prodDebugRuntimeClasspath.txt b/androidApp/dependencies/prodDebugRuntimeClasspath.txt index 41c5a4682..e336f2ce5 100644 --- a/androidApp/dependencies/prodDebugRuntimeClasspath.txt +++ b/androidApp/dependencies/prodDebugRuntimeClasspath.txt @@ -9,11 +9,6 @@ androidx.appcompat:appcompat:1.7.0 androidx.arch.core:core-common:2.2.0 androidx.arch.core:core-runtime:2.2.0 androidx.autofill:autofill:1.0.0 -androidx.camera:camera-camera2:1.4.1 -androidx.camera:camera-core:1.4.1 -androidx.camera:camera-lifecycle:1.4.1 -androidx.camera:camera-video:1.4.1 -androidx.camera:camera-view:1.4.1 androidx.collection:collection-jvm:1.4.4 androidx.collection:collection-ktx:1.4.4 androidx.collection:collection:1.4.4 @@ -44,7 +39,6 @@ androidx.compose.ui:ui-geometry-android:1.7.6 androidx.compose.ui:ui-geometry:1.7.6 androidx.compose.ui:ui-graphics-android:1.7.6 androidx.compose.ui:ui-graphics:1.7.6 -androidx.compose.ui:ui-test-manifest:1.7.6 androidx.compose.ui:ui-text-android:1.7.6 androidx.compose.ui:ui-text:1.7.6 androidx.compose.ui:ui-tooling-android:1.7.6 @@ -59,15 +53,13 @@ androidx.compose.ui:ui-util-android:1.7.6 androidx.compose.ui:ui-util:1.7.6 androidx.compose.ui:ui:1.7.6 androidx.compose:compose-bom:2024.12.01 -androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 androidx.core:core-ktx:1.15.0 androidx.core:core-splashscreen:1.0.1 androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 -androidx.customview:customview:1.0.0 -androidx.databinding:viewbinding:7.4.2 +androidx.customview:customview:1.1.0 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 @@ -76,8 +68,6 @@ androidx.exifinterface:exifinterface:1.3.7 androidx.fragment:fragment-ktx:1.8.5 androidx.fragment:fragment:1.8.5 androidx.graphics:graphics-path:1.0.1 -androidx.hilt:hilt-navigation-compose:1.2.0 -androidx.hilt:hilt-navigation:1.2.0 androidx.interpolator:interpolator:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 androidx.lifecycle:lifecycle-common-java8:2.8.7 @@ -103,11 +93,13 @@ androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 androidx.metrics:metrics-performance:1.0.0-beta01 androidx.multidex:multidex:2.0.1 -androidx.navigation:navigation-common-ktx:2.8.5 -androidx.navigation:navigation-common:2.8.5 -androidx.navigation:navigation-compose:2.8.5 -androidx.navigation:navigation-runtime-ktx:2.8.5 -androidx.navigation:navigation-runtime:2.8.5 +androidx.navigation:navigation-common-ktx:2.8.4 +androidx.navigation:navigation-common:2.8.4 +androidx.navigation:navigation-compose:2.8.4 +androidx.navigation:navigation-fragment-ktx:2.8.4 +androidx.navigation:navigation-fragment:2.8.4 +androidx.navigation:navigation-runtime-ktx:2.8.4 +androidx.navigation:navigation-runtime:2.8.4 androidx.print:print:1.0.0 androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05 androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 @@ -120,6 +112,7 @@ androidx.room:room-runtime-android:2.7.0-alpha12 androidx.room:room-runtime:2.7.0-alpha12 androidx.savedstate:savedstate-ktx:1.2.1 androidx.savedstate:savedstate:1.2.1 +androidx.slidingpanelayout:slidingpanelayout:1.2.0 androidx.sqlite:sqlite-android:2.5.0-alpha12 androidx.sqlite:sqlite-bundled-android:2.5.0-alpha12 androidx.sqlite:sqlite-bundled:2.5.0-alpha12 @@ -129,6 +122,7 @@ androidx.sqlite:sqlite:2.5.0-alpha12 androidx.startup:startup-runtime:1.1.1 androidx.tracing:tracing-ktx:1.2.0 androidx.tracing:tracing:1.2.0 +androidx.transition:transition:1.4.1 androidx.vectordrawable:vectordrawable-animated:1.1.0 androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 @@ -152,33 +146,20 @@ com.arkivanov.essenty:utils-internal:2.1.0 com.caverock:androidsvg-aar:1.4 com.google.accompanist:accompanist-drawablepainter:0.36.0 com.google.accompanist:accompanist-pager:0.34.0 -com.google.accompanist:accompanist-permissions:0.34.0 -com.google.android.datatransport:transport-api:2.2.1 -com.google.android.datatransport:transport-backend-cct:2.3.3 -com.google.android.datatransport:transport-runtime:2.2.6 com.google.android.gms:play-services-ads-identifier:18.0.0 com.google.android.gms:play-services-base:18.5.0 com.google.android.gms:play-services-basement:18.4.0 -com.google.android.gms:play-services-maps:18.2.0 com.google.android.gms:play-services-measurement-api:22.1.2 com.google.android.gms:play-services-measurement-base:22.1.2 com.google.android.gms:play-services-measurement-impl:22.1.2 com.google.android.gms:play-services-measurement-sdk-api:22.1.2 com.google.android.gms:play-services-measurement-sdk:22.1.2 com.google.android.gms:play-services-measurement:22.1.2 -com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1 com.google.android.gms:play-services-oss-licenses:17.1.0 com.google.android.gms:play-services-stats:17.0.2 com.google.android.gms:play-services-tasks:18.2.0 -com.google.android.odml:image:1.0.0-beta1 -com.google.auto.value:auto-value-annotations:1.6.3 com.google.code.findbugs:jsr305:3.0.2 -com.google.code.gson:gson:2.10.1 -com.google.dagger:dagger-lint-aar:2.54 -com.google.dagger:dagger:2.54 -com.google.dagger:hilt-android:2.54 -com.google.dagger:hilt-core:2.54 -com.google.errorprone:error_prone_annotations:2.28.0 +com.google.errorprone:error_prone_annotations:2.26.0 com.google.firebase:firebase-analytics-ktx:22.1.2 com.google.firebase:firebase-analytics:22.1.2 com.google.firebase:firebase-annotations:16.2.0 @@ -186,22 +167,13 @@ com.google.firebase:firebase-bom:33.7.0 com.google.firebase:firebase-common-ktx:21.0.0 com.google.firebase:firebase-common:21.0.0 com.google.firebase:firebase-components:18.0.0 -com.google.firebase:firebase-encoders-json:17.1.0 -com.google.firebase:firebase-encoders:17.0.0 com.google.firebase:firebase-installations-interop:17.1.1 com.google.firebase:firebase-installations:18.0.0 com.google.firebase:firebase-measurement-connector:19.0.0 -com.google.guava:failureaccess:1.0.2 -com.google.guava:guava:33.3.1-android +com.google.guava:failureaccess:1.0.1 +com.google.guava:guava:31.1-android com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -com.google.j2objc:j2objc-annotations:3.0.0 -com.google.maps.android:maps-compose:4.4.1 -com.google.maps.android:maps-ktx:5.0.0 -com.google.mlkit:barcode-scanning-common:17.0.0 -com.google.mlkit:barcode-scanning:17.3.0 -com.google.mlkit:common:18.11.0 -com.google.mlkit:vision-common:17.3.0 -com.google.mlkit:vision-interfaces:16.3.0 +com.google.j2objc:j2objc-annotations:1.3 com.russhwolf:multiplatform-settings-android-debug:1.2.0 com.russhwolf:multiplatform-settings-coroutines-android-debug:1.2.0 com.russhwolf:multiplatform-settings-coroutines:1.2.0 @@ -214,8 +186,6 @@ com.squareup.okhttp3:okhttp-sse:4.12.0 com.squareup.okhttp3:okhttp:4.12.0 com.squareup.okio:okio-jvm:3.9.1 com.squareup.okio:okio:3.9.1 -com.squareup.retrofit2:converter-gson:2.11.0 -com.squareup.retrofit2:retrofit:2.11.0 de.jensklingenberg.ktorfit:ktorfit-annotations-android-debug:2.2.0 de.jensklingenberg.ktorfit:ktorfit-annotations:2.2.0 de.jensklingenberg.ktorfit:ktorfit-lib-android-debug:2.2.0 @@ -237,13 +207,13 @@ io.coil-kt.coil3:coil-network-ktor3:3.0.4 io.coil-kt.coil3:coil-svg-android:3.0.4 io.coil-kt.coil3:coil-svg:3.0.4 io.coil-kt.coil3:coil:3.0.4 -io.github.mr0xf00:easycrop:0.1.1 io.github.vinceglb:filekit-compose-android:0.8.7 io.github.vinceglb:filekit-compose:0.8.7 io.github.vinceglb:filekit-core-android:0.8.7 io.github.vinceglb:filekit-core:0.8.7 io.insert-koin:koin-android:4.0.1-RC1 io.insert-koin:koin-androidx-compose:4.0.1-RC1 +io.insert-koin:koin-androidx-navigation:4.0.1-RC1 io.insert-koin:koin-annotations-jvm:1.4.0-RC4 io.insert-koin:koin-annotations:1.4.0-RC4 io.insert-koin:koin-bom:4.0.1-RC1 @@ -289,10 +259,8 @@ io.ktor:ktor-websocket-serialization-jvm:3.0.3 io.ktor:ktor-websocket-serialization:3.0.3 io.ktor:ktor-websockets-jvm:3.0.3 io.ktor:ktor-websockets:3.0.3 -io.michaelrocks:libphonenumber-android:8.13.35 -jakarta.inject:jakarta.inject-api:2.0.1 javax.inject:javax.inject:1 -org.checkerframework:checker-qual:3.43.0 +org.checkerframework:checker-qual:3.12.0 org.jetbrains.androidx.core:core-bundle-android-debug:1.0.1 org.jetbrains.androidx.core:core-bundle:1.0.1 org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.3 @@ -331,7 +299,8 @@ org.jetbrains.compose.ui:ui-util:1.7.0-rc01 org.jetbrains.compose.ui:ui:1.7.0-rc01 org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.23 +org.jetbrains.kotlin:kotlin-reflect:2.1.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22 org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 org.jetbrains.kotlin:kotlin-stdlib:2.1.0 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 @@ -358,5 +327,4 @@ org.jetbrains.kotlinx:kotlinx-serialization-json-io:1.7.3 org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 org.jetbrains:annotations:23.0.0 -org.jspecify:jspecify:1.0.0 org.slf4j:slf4j-api:2.0.16 diff --git a/androidApp/dependencies/prodReleaseRuntimeClasspath.txt b/androidApp/dependencies/prodReleaseRuntimeClasspath.txt index 7aaedb853..bb7db873c 100644 --- a/androidApp/dependencies/prodReleaseRuntimeClasspath.txt +++ b/androidApp/dependencies/prodReleaseRuntimeClasspath.txt @@ -9,11 +9,6 @@ androidx.appcompat:appcompat:1.7.0 androidx.arch.core:core-common:2.2.0 androidx.arch.core:core-runtime:2.2.0 androidx.autofill:autofill:1.0.0 -androidx.camera:camera-camera2:1.4.1 -androidx.camera:camera-core:1.4.1 -androidx.camera:camera-lifecycle:1.4.1 -androidx.camera:camera-video:1.4.1 -androidx.camera:camera-view:1.4.1 androidx.collection:collection-jvm:1.4.4 androidx.collection:collection-ktx:1.4.4 androidx.collection:collection:1.4.4 @@ -54,15 +49,13 @@ androidx.compose.ui:ui-util-android:1.7.6 androidx.compose.ui:ui-util:1.7.6 androidx.compose.ui:ui:1.7.6 androidx.compose:compose-bom:2024.12.01 -androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 androidx.core:core-ktx:1.15.0 androidx.core:core-splashscreen:1.0.1 androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 -androidx.customview:customview:1.0.0 -androidx.databinding:viewbinding:7.4.2 +androidx.customview:customview:1.1.0 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 @@ -71,8 +64,6 @@ androidx.exifinterface:exifinterface:1.3.7 androidx.fragment:fragment-ktx:1.8.5 androidx.fragment:fragment:1.8.5 androidx.graphics:graphics-path:1.0.1 -androidx.hilt:hilt-navigation-compose:1.2.0 -androidx.hilt:hilt-navigation:1.2.0 androidx.interpolator:interpolator:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 androidx.lifecycle:lifecycle-common-java8:2.8.7 @@ -98,11 +89,13 @@ androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 androidx.metrics:metrics-performance:1.0.0-beta01 androidx.multidex:multidex:2.0.1 -androidx.navigation:navigation-common-ktx:2.8.5 -androidx.navigation:navigation-common:2.8.5 -androidx.navigation:navigation-compose:2.8.5 -androidx.navigation:navigation-runtime-ktx:2.8.5 -androidx.navigation:navigation-runtime:2.8.5 +androidx.navigation:navigation-common-ktx:2.8.4 +androidx.navigation:navigation-common:2.8.4 +androidx.navigation:navigation-compose:2.8.4 +androidx.navigation:navigation-fragment-ktx:2.8.4 +androidx.navigation:navigation-fragment:2.8.4 +androidx.navigation:navigation-runtime-ktx:2.8.4 +androidx.navigation:navigation-runtime:2.8.4 androidx.print:print:1.0.0 androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05 androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 @@ -115,6 +108,7 @@ androidx.room:room-runtime-android:2.7.0-alpha12 androidx.room:room-runtime:2.7.0-alpha12 androidx.savedstate:savedstate-ktx:1.2.1 androidx.savedstate:savedstate:1.2.1 +androidx.slidingpanelayout:slidingpanelayout:1.2.0 androidx.sqlite:sqlite-android:2.5.0-alpha12 androidx.sqlite:sqlite-bundled-android:2.5.0-alpha12 androidx.sqlite:sqlite-bundled:2.5.0-alpha12 @@ -124,6 +118,7 @@ androidx.sqlite:sqlite:2.5.0-alpha12 androidx.startup:startup-runtime:1.1.1 androidx.tracing:tracing-ktx:1.2.0 androidx.tracing:tracing:1.2.0 +androidx.transition:transition:1.4.1 androidx.vectordrawable:vectordrawable-animated:1.1.0 androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 @@ -147,33 +142,20 @@ com.arkivanov.essenty:utils-internal:2.1.0 com.caverock:androidsvg-aar:1.4 com.google.accompanist:accompanist-drawablepainter:0.36.0 com.google.accompanist:accompanist-pager:0.34.0 -com.google.accompanist:accompanist-permissions:0.34.0 -com.google.android.datatransport:transport-api:2.2.1 -com.google.android.datatransport:transport-backend-cct:2.3.3 -com.google.android.datatransport:transport-runtime:2.2.6 com.google.android.gms:play-services-ads-identifier:18.0.0 com.google.android.gms:play-services-base:18.5.0 com.google.android.gms:play-services-basement:18.4.0 -com.google.android.gms:play-services-maps:18.2.0 com.google.android.gms:play-services-measurement-api:22.1.2 com.google.android.gms:play-services-measurement-base:22.1.2 com.google.android.gms:play-services-measurement-impl:22.1.2 com.google.android.gms:play-services-measurement-sdk-api:22.1.2 com.google.android.gms:play-services-measurement-sdk:22.1.2 com.google.android.gms:play-services-measurement:22.1.2 -com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1 com.google.android.gms:play-services-oss-licenses:17.1.0 com.google.android.gms:play-services-stats:17.0.2 com.google.android.gms:play-services-tasks:18.2.0 -com.google.android.odml:image:1.0.0-beta1 -com.google.auto.value:auto-value-annotations:1.6.3 com.google.code.findbugs:jsr305:3.0.2 -com.google.code.gson:gson:2.10.1 -com.google.dagger:dagger-lint-aar:2.54 -com.google.dagger:dagger:2.54 -com.google.dagger:hilt-android:2.54 -com.google.dagger:hilt-core:2.54 -com.google.errorprone:error_prone_annotations:2.28.0 +com.google.errorprone:error_prone_annotations:2.26.0 com.google.firebase:firebase-analytics-ktx:22.1.2 com.google.firebase:firebase-analytics:22.1.2 com.google.firebase:firebase-annotations:16.2.0 @@ -181,22 +163,13 @@ com.google.firebase:firebase-bom:33.7.0 com.google.firebase:firebase-common-ktx:21.0.0 com.google.firebase:firebase-common:21.0.0 com.google.firebase:firebase-components:18.0.0 -com.google.firebase:firebase-encoders-json:17.1.0 -com.google.firebase:firebase-encoders:17.0.0 com.google.firebase:firebase-installations-interop:17.1.1 com.google.firebase:firebase-installations:18.0.0 com.google.firebase:firebase-measurement-connector:19.0.0 -com.google.guava:failureaccess:1.0.2 -com.google.guava:guava:33.3.1-android +com.google.guava:failureaccess:1.0.1 +com.google.guava:guava:31.1-android com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -com.google.j2objc:j2objc-annotations:3.0.0 -com.google.maps.android:maps-compose:4.4.1 -com.google.maps.android:maps-ktx:5.0.0 -com.google.mlkit:barcode-scanning-common:17.0.0 -com.google.mlkit:barcode-scanning:17.3.0 -com.google.mlkit:common:18.11.0 -com.google.mlkit:vision-common:17.3.0 -com.google.mlkit:vision-interfaces:16.3.0 +com.google.j2objc:j2objc-annotations:1.3 com.russhwolf:multiplatform-settings-android:1.2.0 com.russhwolf:multiplatform-settings-coroutines-android:1.2.0 com.russhwolf:multiplatform-settings-coroutines:1.2.0 @@ -209,8 +182,6 @@ com.squareup.okhttp3:okhttp-sse:4.12.0 com.squareup.okhttp3:okhttp:4.12.0 com.squareup.okio:okio-jvm:3.9.1 com.squareup.okio:okio:3.9.1 -com.squareup.retrofit2:converter-gson:2.11.0 -com.squareup.retrofit2:retrofit:2.11.0 de.jensklingenberg.ktorfit:ktorfit-annotations-android:2.2.0 de.jensklingenberg.ktorfit:ktorfit-annotations:2.2.0 de.jensklingenberg.ktorfit:ktorfit-lib-android:2.2.0 @@ -232,13 +203,13 @@ io.coil-kt.coil3:coil-network-ktor3:3.0.4 io.coil-kt.coil3:coil-svg-android:3.0.4 io.coil-kt.coil3:coil-svg:3.0.4 io.coil-kt.coil3:coil:3.0.4 -io.github.mr0xf00:easycrop:0.1.1 io.github.vinceglb:filekit-compose-android:0.8.7 io.github.vinceglb:filekit-compose:0.8.7 io.github.vinceglb:filekit-core-android:0.8.7 io.github.vinceglb:filekit-core:0.8.7 io.insert-koin:koin-android:4.0.1-RC1 io.insert-koin:koin-androidx-compose:4.0.1-RC1 +io.insert-koin:koin-androidx-navigation:4.0.1-RC1 io.insert-koin:koin-annotations-jvm:1.4.0-RC4 io.insert-koin:koin-annotations:1.4.0-RC4 io.insert-koin:koin-bom:4.0.1-RC1 @@ -284,10 +255,8 @@ io.ktor:ktor-websocket-serialization-jvm:3.0.3 io.ktor:ktor-websocket-serialization:3.0.3 io.ktor:ktor-websockets-jvm:3.0.3 io.ktor:ktor-websockets:3.0.3 -io.michaelrocks:libphonenumber-android:8.13.35 -jakarta.inject:jakarta.inject-api:2.0.1 javax.inject:javax.inject:1 -org.checkerframework:checker-qual:3.43.0 +org.checkerframework:checker-qual:3.12.0 org.jetbrains.androidx.core:core-bundle-android:1.0.1 org.jetbrains.androidx.core:core-bundle:1.0.1 org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.3 @@ -326,7 +295,8 @@ org.jetbrains.compose.ui:ui-util:1.7.0-rc01 org.jetbrains.compose.ui:ui:1.7.0-rc01 org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.23 +org.jetbrains.kotlin:kotlin-reflect:2.1.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22 org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 org.jetbrains.kotlin:kotlin-stdlib:2.1.0 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 @@ -353,5 +323,4 @@ org.jetbrains.kotlinx:kotlinx-serialization-json-io:1.7.3 org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 org.jetbrains:annotations:23.0.0 -org.jspecify:jspecify:1.0.0 org.slf4j:slf4j-api:2.0.16 diff --git a/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt index afd438e2f..30be808c7 100644 --- a/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt @@ -36,13 +36,13 @@ class AndroidFeatureConventionPlugin : Plugin { add("androidTestImplementation", libs.findLibrary("androidx.lifecycle.runtimeTesting").get()) add("testImplementation", kotlin("test")) - add("testImplementation", project(":core:testing")) +// add("testImplementation", project(":core:testing")) add("testImplementation", libs.findLibrary("hilt.android.testing").get()) add("testImplementation", libs.findLibrary("squareup.okhttp").get()) add("debugImplementation", libs.findLibrary("androidx.compose.ui.test.manifest").get()) - add("androidTestImplementation", project(":core:testing")) +// add("androidTestImplementation", project(":core:testing")) add("androidTestImplementation", libs.findLibrary("androidx.navigation.testing").get()) add("androidTestImplementation", libs.findLibrary("androidx.compose.ui.test").get()) add("androidTestImplementation", libs.findLibrary("hilt.android.testing").get()) diff --git a/build-logic/convention/src/main/kotlin/CMPFeatureConventionPlugin.kt b/build-logic/convention/src/main/kotlin/CMPFeatureConventionPlugin.kt index 583eb98b3..9d6eed984 100644 --- a/build-logic/convention/src/main/kotlin/CMPFeatureConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/CMPFeatureConventionPlugin.kt @@ -8,7 +8,7 @@ class CMPFeatureConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { with(pluginManager) { - apply("mifos.kmp.libray") + apply("mifos.kmp.library") apply("mifos.kmp.koin") apply("org.jetbrains.kotlin.plugin.compose") apply("org.jetbrains.compose") @@ -17,7 +17,7 @@ class CMPFeatureConventionPlugin : Plugin { dependencies { add("commonMainImplementation", project(":core:ui")) add("commonMainImplementation", project(":core:designsystem")) - add("commonMainImplementation", project(":core:testing")) +// add("commonMainImplementation", project(":core:testing")) add("commonMainImplementation", project(":core:data")) add("commonMainImplementation", libs.findLibrary("koin.compose").get()) diff --git a/build-logic/convention/src/main/kotlin/KMPKoinConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KMPKoinConventionPlugin.kt index d11be47d9..27c413da7 100644 --- a/build-logic/convention/src/main/kotlin/KMPKoinConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KMPKoinConventionPlugin.kt @@ -1,5 +1,7 @@ +import com.google.devtools.ksp.gradle.KspExtension import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies import org.mifos.mobile.libs @@ -19,6 +21,10 @@ class KMPKoinConventionPlugin : Plugin { add("kspCommonMainMetadata", libs.findLibrary("koin.ksp.compiler").get()) add("commonTestImplementation", libs.findLibrary("koin.test").get()) } + + extensions.configure { + arg("KOIN_CONFIG_CHECK","true") + } } } diff --git a/build-logic/convention/src/main/kotlin/org/mifos/mobile/KotlinMultiplatform.kt b/build-logic/convention/src/main/kotlin/org/mifos/mobile/KotlinMultiplatform.kt index eeb9eaa43..50d5a4455 100644 --- a/build-logic/convention/src/main/kotlin/org/mifos/mobile/KotlinMultiplatform.kt +++ b/build-logic/convention/src/main/kotlin/org/mifos/mobile/KotlinMultiplatform.kt @@ -20,7 +20,7 @@ internal fun Project.configureKotlinMultiplatform() { this.nodejs() binaries.executable() } - wasmJs() { + wasmJs { browser() nodejs() } diff --git a/ci-prepush.bat b/ci-prepush.bat index b08bc0a9e..337cb8b2d 100644 --- a/ci-prepush.bat +++ b/ci-prepush.bat @@ -13,6 +13,8 @@ call :run_gradle_task "check -p build-logic" call :run_gradle_task "spotlessApply --no-configuration-cache" call :run_gradle_task "dependencyGuardBaseline" call :run_gradle_task "detekt" +call :run_gradle_task ":mifos-android:build" +call :run_gradle_task ":mifos-android:updateProdReleaseBadging" echo All checks and tests completed successfully. exit /b 0 diff --git a/ci-prepush.sh b/ci-prepush.sh index ada49c947..841cd8c13 100644 --- a/ci-prepush.sh +++ b/ci-prepush.sh @@ -28,6 +28,8 @@ tasks=( "spotlessApply --no-configuration-cache" "dependencyGuardBaseline" "detekt" + ":mifos-android:build" + ":mifos-android:updateProdReleaseBadging" ) for task in "${tasks[@]}"; do diff --git a/core/common/src/commonMain/kotlin/org/mifos/mobile/core/common/utils/StringExtensions.kt b/core/common/src/commonMain/kotlin/org/mifos/mobile/core/common/utils/StringExtensions.kt new file mode 100644 index 000000000..89e6147e5 --- /dev/null +++ b/core/common/src/commonMain/kotlin/org/mifos/mobile/core/common/utils/StringExtensions.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.core.common.utils + +/** + * Whether or not string is a valid email address. + * + * This just checks if the string contains the "@" symbol. + */ +fun String.isValidEmail(): Boolean = contains("@") + +fun maskString(input: String, maskChar: Char = '*'): String { + if (input.length <= 3) return input + + val visibleCount = 3 + val maskLength = input.length - visibleCount + + return buildString { + append(maskChar.toString().repeat(maskLength)) + append(input.takeLast(visibleCount)) + } +} + +fun String.capitalizeWords(): String = split(" ").joinToString(" ") { it -> + it.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } +} diff --git a/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/PasswordStrengthIndicator.kt b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/PasswordStrengthIndicator.kt new file mode 100644 index 000000000..37fc10c81 --- /dev/null +++ b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/PasswordStrengthIndicator.kt @@ -0,0 +1,217 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.core.ui + +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.animateColorAsState +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.CheckCircle +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.drawBehind +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.TransformOrigin +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.unit.dp +import org.jetbrains.compose.ui.tooling.preview.Preview +import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme + +@Suppress("LongMethod", "CyclomaticComplexMethod", "MagicNumber") +@Composable +fun PasswordStrengthIndicator( + modifier: Modifier = Modifier, + state: PasswordStrengthState, + currentCharacterCount: Int, + minimumCharacterCount: Int? = null, +) { + val widthPercent by animateFloatAsState( + targetValue = when (state) { + PasswordStrengthState.NONE -> 0f + PasswordStrengthState.WEAK_1 -> .25f + PasswordStrengthState.WEAK_2 -> .5f + PasswordStrengthState.WEAK_3 -> .66f + PasswordStrengthState.GOOD -> .82f + PasswordStrengthState.STRONG -> 1f + PasswordStrengthState.VERY_STRONG -> 1f + }, + label = "Width Percent State", + ) + val indicatorColor = when (state) { + PasswordStrengthState.NONE -> MaterialTheme.colorScheme.error + PasswordStrengthState.WEAK_1 -> MaterialTheme.colorScheme.error + PasswordStrengthState.WEAK_2 -> MaterialTheme.colorScheme.error + PasswordStrengthState.WEAK_3 -> weakColor + PasswordStrengthState.GOOD -> MaterialTheme.colorScheme.primary + PasswordStrengthState.STRONG -> strongColor + PasswordStrengthState.VERY_STRONG -> Color.Magenta + } + val animatedIndicatorColor by animateColorAsState( + targetValue = indicatorColor, + label = "Indicator Color State", + ) + val label = when (state) { + PasswordStrengthState.NONE -> "" + PasswordStrengthState.WEAK_1 -> "Weak" + PasswordStrengthState.WEAK_2 -> "Weak" + PasswordStrengthState.WEAK_3 -> "Weak" + PasswordStrengthState.GOOD -> "Good" + PasswordStrengthState.STRONG -> "Strong" + PasswordStrengthState.VERY_STRONG -> "Very Strong" + } + Column( + modifier = modifier, + ) { + Box( + Modifier + .fillMaxWidth() + .height(4.dp) + .background(MaterialTheme.colorScheme.surfaceContainerHigh), + ) { + Box( + modifier = Modifier + .fillMaxHeight() + .fillMaxWidth() + .graphicsLayer { + transformOrigin = TransformOrigin(pivotFractionX = 0f, pivotFractionY = 0f) + scaleX = widthPercent + } + .drawBehind { + drawRect(animatedIndicatorColor) + }, + ) + } + Spacer(Modifier.height(4.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + ) { + minimumCharacterCount?.let { minCount -> + MinimumCharacterCount( + minimumRequirementMet = currentCharacterCount >= minCount, + minimumCharacterCount = minCount, + ) + } + Text( + text = label, + style = MaterialTheme.typography.labelSmall, + color = indicatorColor, + ) + } + } +} + +@Composable +private fun MinimumCharacterCount( + modifier: Modifier = Modifier, + minimumRequirementMet: Boolean, + minimumCharacterCount: Int, +) { + val characterCountColor by animateColorAsState( + targetValue = if (minimumRequirementMet) { + strongColor + } else { + MaterialTheme.colorScheme.surfaceDim + }, + label = "minmumCharacterCountColor", + ) + Row( + modifier = modifier, + verticalAlignment = Alignment.CenterVertically, + ) { + AnimatedContent( + targetState = if (minimumRequirementMet) { + Icons.Default.CheckCircle + } else { + Icons.Default.Close + }, + label = "iconForMinimumCharacterCount", + ) { + Icon( + imageVector = it, + contentDescription = null, + tint = characterCountColor, + modifier = Modifier.size(12.dp), + ) + } + Spacer(modifier = Modifier.width(2.dp)) + Text( + text = "$minimumCharacterCount characters", + color = characterCountColor, + style = MaterialTheme.typography.labelSmall, + ) + } +} + +enum class PasswordStrengthState { + NONE, + WEAK_1, + WEAK_2, + WEAK_3, + GOOD, + STRONG, + VERY_STRONG, +} + +private val strongColor = Color(0xFF41B06D) +private val weakColor = Color(0xFF8B6609) + +@Preview +@Composable +private fun PasswordStrengthIndicatorPreview_minCharMet() { + MifosMobileTheme { + PasswordStrengthIndicator( + state = PasswordStrengthState.WEAK_3, + currentCharacterCount = 12, + minimumCharacterCount = 12, + ) + } +} + +@Preview +@Composable +private fun PasswordStrengthIndicatorPreview_minCharNotMet() { + MifosMobileTheme { + PasswordStrengthIndicator( + state = PasswordStrengthState.WEAK_3, + currentCharacterCount = 11, + minimumCharacterCount = 12, + ) + } +} + +@Preview +@Composable +private fun PasswordStrengthIndicatorPreview_noMinChar() { + MifosMobileTheme { + PasswordStrengthIndicator( + state = PasswordStrengthState.WEAK_3, + currentCharacterCount = 12, + ) + } +} diff --git a/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/BackgroundEvent.kt b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/BackgroundEvent.kt new file mode 100644 index 000000000..fdb2fb4a4 --- /dev/null +++ b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/BackgroundEvent.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.core.ui.utils + +/** + * Almost all the events in the app involve navigation or toasts. To prevent accidentally + * navigating to the same view twice, by default, events are ignored if the view is not currently + * resumed. To avoid that restriction, specific events can implement [BackgroundEvent]. + */ + +interface BackgroundEvent diff --git a/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/BaseViewModel.kt b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/BaseViewModel.kt new file mode 100644 index 000000000..31f4c958e --- /dev/null +++ b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/BaseViewModel.kt @@ -0,0 +1,100 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.core.ui.utils + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.channels.SendChannel +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.consumeAsFlow +import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.launch + +/** + * A base [ViewModel] that helps enforce the unidirectional data flow pattern and associated + * responsibilities of a typical ViewModel: + * + * - Maintaining and emitting a current state (of type [S]) with the given `initialState`. + * - Emitting one-shot events as needed (of type [E]). These should be rare and are typically + * reserved for things such as non-state based navigation. + * - Receiving actions (of type [A]) that may induce changes in the current state, trigger an + * event emission, or both. + */ +abstract class BaseViewModel( + initialState: S, +) : ViewModel() { + protected val mutableStateFlow: MutableStateFlow = MutableStateFlow(initialState) + private val eventChannel: Channel = Channel(capacity = Channel.UNLIMITED) + private val internalActionChannel: Channel = Channel(capacity = Channel.UNLIMITED) + + /** + * A helper that returns the current state of the view model. + */ + protected val state: S get() = mutableStateFlow.value + + /** + * A [StateFlow] representing state updates. + */ + val stateFlow: StateFlow = mutableStateFlow.asStateFlow() + + /** + * A [Flow] of one-shot events. These may be received and consumed by only a single consumer. + * Any additional consumers will receive no events. + */ + val eventFlow: Flow = eventChannel.receiveAsFlow() + + /** + * A [SendChannel] for sending actions to the ViewModel for processing. + */ + val actionChannel: SendChannel = internalActionChannel + + init { + viewModelScope.launch { + internalActionChannel + .consumeAsFlow() + .collect { action -> + handleAction(action) + } + } + } + + /** + * Handles the given [action] in a synchronous manner. + * + * Any changes to internal state that first require asynchronous work should post a follow-up + * action that may be used to then update the state synchronously. + */ + protected abstract fun handleAction(action: A): Unit + + /** + * Convenience method for sending an action to the [actionChannel]. + */ + fun trySendAction(action: A) { + actionChannel.trySend(action) + } + + /** + * Helper method for sending an internal action. + */ + protected suspend fun sendAction(action: A) { + actionChannel.send(action) + } + + /** + * Helper method for sending an event. + */ + protected fun sendEvent(event: E) { + viewModelScope.launch { eventChannel.send(event) } + } +} diff --git a/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/EventsEffect.kt b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/EventsEffect.kt new file mode 100644 index 000000000..f02c8f47c --- /dev/null +++ b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/EventsEffect.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.core.ui.utils + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.compose.LocalLifecycleOwner +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach + +/** + * Convenience method for observing event flow from [BaseViewModel]. + * + * By default, events will only be consumed when the associated screen is + * resumed, to avoid bugs like duplicate navigation calls. To override + * this behavior, a given event type can implement [BackgroundEvent]. + */ +@Composable +fun EventsEffect( + viewModel: BaseViewModel<*, E, *>, + lifecycleOwner: Lifecycle = LocalLifecycleOwner.current.lifecycle, + handler: suspend (E) -> Unit, +) { + LaunchedEffect(key1 = Unit) { + viewModel.eventFlow + .filter { + it is BackgroundEvent || + lifecycleOwner.currentState.isAtLeast(Lifecycle.State.RESUMED) + } + .onEach { handler.invoke(it) } + .launchIn(this) + } +} diff --git a/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/PasswordChecker.kt b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/PasswordChecker.kt new file mode 100644 index 000000000..60d23ae26 --- /dev/null +++ b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/PasswordChecker.kt @@ -0,0 +1,94 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.core.ui.utils + +import kotlin.math.log2 +import kotlin.math.pow + +object PasswordChecker { + private const val MIN_PASSWORD_LENGTH = 8 + private const val STRONG_PASSWORD_LENGTH = 12 + private const val MIN_ENTROPY_BITS = 60.0 + private const val MAX_PASSWORD_LENGTH = 128 + + fun getPasswordStrengthResult(password: String): PasswordStrengthResult { + when { + password.isEmpty() -> return PasswordStrengthResult.Error("Password cannot be empty.") + password.length > MAX_PASSWORD_LENGTH -> { + return PasswordStrengthResult.Error( + "Password is too long. Maximum length is $MAX_PASSWORD_LENGTH characters.", + ) + } + } + + val result = getPasswordStrength(password) + + return PasswordStrengthResult.Success(result) + } + + fun getPasswordStrength(password: String): PasswordStrength { + val length = password.length + val hasUpperCase = password.any { it.isUpperCase() } + val hasLowerCase = password.any { it.isLowerCase() } + val hasNumbers = password.any { it.isDigit() } + val hasSymbols = password.any { !it.isLetterOrDigit() } + + val numTypesPresent = + listOf(hasUpperCase, hasLowerCase, hasNumbers, hasSymbols).count { it } + val entropyBits = calculateEntropy(password) + + return when { + length < MIN_PASSWORD_LENGTH -> PasswordStrength.LEVEL_0 + numTypesPresent == 1 -> PasswordStrength.LEVEL_1 + numTypesPresent == 2 -> PasswordStrength.LEVEL_2 + numTypesPresent == 3 && length >= STRONG_PASSWORD_LENGTH -> PasswordStrength.LEVEL_4 + numTypesPresent == 4 && length >= STRONG_PASSWORD_LENGTH && + entropyBits >= MIN_ENTROPY_BITS -> PasswordStrength.LEVEL_5 + + else -> PasswordStrength.LEVEL_3 + } + } + + private fun calculateEntropy(password: String): Double { + val charPool = 26 + 26 + 10 + 33 // lowercase + uppercase + digits + symbols + return log2(charPool.toDouble().pow(password.length)) + } + + fun getPasswordFeedback(password: String): List { + val feedback = mutableListOf() + + if (password.length < MIN_PASSWORD_LENGTH) { + feedback.add("Password should be at least $MIN_PASSWORD_LENGTH characters long.") + } + if (!password.any { it.isUpperCase() }) { + feedback.add("Include at least one uppercase letter.") + } + if (!password.any { it.isLowerCase() }) { + feedback.add("Include at least one lowercase letter.") + } + if (!password.any { it.isDigit() }) { + feedback.add("Include at least one number.") + } + if (!password.any { !it.isLetterOrDigit() }) { + feedback.add("Include at least one special character.") + } + if (password.length < STRONG_PASSWORD_LENGTH) { + feedback.add("For a stronger password, use at least $STRONG_PASSWORD_LENGTH characters.") + } + + return feedback + } +} + +sealed class PasswordStrengthResult { + data class Success(val passwordStrength: PasswordStrength) : PasswordStrengthResult() + + data class Error(val message: String) : PasswordStrengthResult() +} diff --git a/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/PasswordStrength.kt b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/PasswordStrength.kt new file mode 100644 index 000000000..cf784689f --- /dev/null +++ b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/PasswordStrength.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.core.ui.utils + +enum class PasswordStrength { + LEVEL_0, + LEVEL_1, + LEVEL_2, + LEVEL_3, + LEVEL_4, + LEVEL_5, +} diff --git a/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/PasswordStrengthExtensions.kt b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/PasswordStrengthExtensions.kt new file mode 100644 index 000000000..3ae7d81ab --- /dev/null +++ b/core/ui/src/commonMain/kotlin/org/mifos/mobile/core/ui/utils/PasswordStrengthExtensions.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.core.ui.utils + +/** + * Converts the given [Int] to a [PasswordStrength]. A `null` value is returned if this value is + * not in the [0, 4] range. + */ +@Suppress("MagicNumber") +fun Int.toPasswordStrengthOrNull(): PasswordStrength? = + when (this) { + 0 -> PasswordStrength.LEVEL_0 + 1 -> PasswordStrength.LEVEL_1 + 2 -> PasswordStrength.LEVEL_2 + 3 -> PasswordStrength.LEVEL_3 + 4 -> PasswordStrength.LEVEL_4 + 5 -> PasswordStrength.LEVEL_5 + else -> null + } + +/** + * Converts the given [PasswordStrength] to an [Int]. + */ +@Suppress("MagicNumber") +fun PasswordStrength.toInt(): Int = + when (this) { + PasswordStrength.LEVEL_0 -> 0 + PasswordStrength.LEVEL_1 -> 1 + PasswordStrength.LEVEL_2 -> 2 + PasswordStrength.LEVEL_3 -> 3 + PasswordStrength.LEVEL_4 -> 4 + PasswordStrength.LEVEL_5 -> 5 + } diff --git a/feature/auth/build.gradle.kts b/feature/auth/build.gradle.kts index 383dabd97..935ea1027 100644 --- a/feature/auth/build.gradle.kts +++ b/feature/auth/build.gradle.kts @@ -8,15 +8,32 @@ * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md */ plugins { - alias(libs.plugins.mifos.android.feature) - alias(libs.plugins.mifos.android.library.compose) + alias(libs.plugins.mifos.cmp.feature) + alias(libs.plugins.kotlin.parcelize) + alias(libs.plugins.kotlin.serialization) } android { namespace = "org.mifos.mobile.feature.auth" + buildFeatures { + buildConfig = true + } } -dependencies { - implementation(projects.libs.countryCodePicker) - implementation(libs.squareup.okhttp) -} \ No newline at end of file +kotlin { + sourceSets { + commonMain.dependencies { + implementation(compose.material3) + implementation(compose.foundation) + implementation(compose.ui) + implementation(compose.components.resources) + implementation(compose.components.uiToolingPreview) + implementation(libs.jb.kotlin.stdlib) + implementation(libs.kotlin.reflect) + } + } +} +//dependencies { +// implementation(projects.libs.countryCodePicker) +// implementation(libs.squareup.okhttp) +//} diff --git a/feature/auth/src/main/AndroidManifest.xml b/feature/auth/src/androidMain/kotlin/AndroidManifest.xml similarity index 100% rename from feature/auth/src/main/AndroidManifest.xml rename to feature/auth/src/androidMain/kotlin/AndroidManifest.xml diff --git a/feature/auth/src/main/res/drawable/feature_auth_ic_person.xml b/feature/auth/src/commonMain/composeResources/drawable/feature_auth_ic_person.xml similarity index 100% rename from feature/auth/src/main/res/drawable/feature_auth_ic_person.xml rename to feature/auth/src/commonMain/composeResources/drawable/feature_auth_ic_person.xml diff --git a/feature/auth/src/main/res/drawable/feature_auth_lock.xml b/feature/auth/src/commonMain/composeResources/drawable/feature_auth_lock.xml similarity index 100% rename from feature/auth/src/main/res/drawable/feature_auth_lock.xml rename to feature/auth/src/commonMain/composeResources/drawable/feature_auth_lock.xml diff --git a/feature/auth/src/main/res/drawable/feature_auth_mifos_logo.png b/feature/auth/src/commonMain/composeResources/drawable/feature_auth_mifos_logo.png similarity index 100% rename from feature/auth/src/main/res/drawable/feature_auth_mifos_logo.png rename to feature/auth/src/commonMain/composeResources/drawable/feature_auth_mifos_logo.png diff --git a/feature/auth/src/main/res/values/strings.xml b/feature/auth/src/commonMain/composeResources/values/strings.xml similarity index 80% rename from feature/auth/src/main/res/values/strings.xml rename to feature/auth/src/commonMain/composeResources/values/strings.xml index cba4c9a85..2ab3fe6fa 100644 --- a/feature/auth/src/main/res/values/strings.xml +++ b/feature/auth/src/commonMain/composeResources/values/strings.xml @@ -49,6 +49,16 @@ Username should be greater than 6 alphabets Spaces Invalid Phone Number + Password must be at least 8 characters long Invalid email id - Password does not match. + Password does not match + Please enter a valid email + Mobile number must be 10 digits long + Please enter your account number + Please enter your mobile number + Please enter your first name + Please enter your last name + Please enter your user name + Please enter your country + \ No newline at end of file diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/di/AuthModule.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/di/AuthModule.kt new file mode 100644 index 000000000..3e6963800 --- /dev/null +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/di/AuthModule.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.feature.auth.di + +import org.koin.core.module.dsl.viewModelOf +import org.koin.dsl.module +import org.mifos.mobile.feature.auth.login.LoginViewModel +import org.mifos.mobile.feature.auth.registration.RegistrationVerificationViewModel +import org.mifos.mobile.feature.auth.registration.RegistrationViewModel + +val AuthModule = module { + viewModelOf(::LoginViewModel) + viewModelOf(::RegistrationViewModel) + viewModelOf(::RegistrationVerificationViewModel) +} diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginScreen.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginScreen.kt new file mode 100644 index 000000000..8ac049cff --- /dev/null +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginScreen.kt @@ -0,0 +1,285 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.feature.auth.login + +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import kotlinx.coroutines.launch +import mifos_mobile.feature.auth.generated.resources.Res +import mifos_mobile.feature.auth.generated.resources.create_an_account +import mifos_mobile.feature.auth.generated.resources.feature_auth_ic_person +import mifos_mobile.feature.auth.generated.resources.feature_auth_mifos_logo +import mifos_mobile.feature.auth.generated.resources.login +import mifos_mobile.feature.auth.generated.resources.password +import mifos_mobile.feature.auth.generated.resources.username +import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource +import org.jetbrains.compose.ui.tooling.preview.Preview +import org.koin.compose.viewmodel.koinViewModel +import org.mifos.mobile.core.designsystem.component.BasicDialogState +import org.mifos.mobile.core.designsystem.component.LoadingDialogState +import org.mifos.mobile.core.designsystem.component.MifosBasicDialog +import org.mifos.mobile.core.designsystem.component.MifosButton +import org.mifos.mobile.core.designsystem.component.MifosLoadingDialog +import org.mifos.mobile.core.designsystem.component.MifosOutlinedTextField +import org.mifos.mobile.core.designsystem.component.MifosPasswordField +import org.mifos.mobile.core.designsystem.component.MifosScaffold +import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme +import org.mifos.mobile.core.ui.component.MifosMobileIcon +import org.mifos.mobile.core.ui.utils.EventsEffect + +@Composable +internal fun LoginScreen( + navigateToRegisterScreen: () -> Unit, + navigateToPasscodeScreen: () -> Unit, + modifier: Modifier = Modifier, + viewModel: LoginViewModel = koinViewModel(), +) { + val scope = rememberCoroutineScope() + val snackbarHostState = remember { SnackbarHostState() } + + val state by viewModel.stateFlow.collectAsStateWithLifecycle() + + EventsEffect(viewModel) { event -> + when (event) { + is LoginEvent.NavigateToSignup -> navigateToRegisterScreen.invoke() + is LoginEvent.NavigateToPasscodeScreen -> navigateToPasscodeScreen.invoke() + is LoginEvent.ShowToast -> { + scope.launch { + snackbarHostState.showSnackbar(event.message) + } + } + } + } + + LoginDialogs( + dialogState = state.dialogState, + onDismissRequest = remember(viewModel) { + { viewModel.trySendAction(LoginAction.ErrorDialogDismiss) } + }, + ) + + LoginScreen( + state = state, + snackbarHostState = snackbarHostState, + modifier = modifier, + onAction = remember(viewModel) { + { viewModel.trySendAction(it) } + }, + navigateToRegisterScreen = { navigateToRegisterScreen() }, + ) +} + +@Composable +private fun LoginScreen( + state: LoginState, +// loadClient: () -> Unit, + snackbarHostState: SnackbarHostState, + onAction: (LoginAction) -> Unit, + modifier: Modifier = Modifier, + navigateToRegisterScreen: () -> Unit, +) { + MifosScaffold( + snackbarHostState = snackbarHostState, + modifier = modifier.fillMaxSize(), + containerColor = MaterialTheme.colorScheme.background, + ) { paddingValues -> + LoginScreenContent( + state = state, + onAction = onAction, + modifier = modifier + .fillMaxSize() + .padding(paddingValues), + createAccount = { navigateToRegisterScreen() }, + ) + } +} + +@Composable +private fun LoginDialogs( + dialogState: LoginState.DialogState?, + onDismissRequest: () -> Unit, +) { + when (dialogState) { + is LoginState.DialogState.Error -> MifosBasicDialog( + visibilityState = BasicDialogState.Shown( + message = dialogState.message, + ), + onDismissRequest = onDismissRequest, + ) + + is LoginState.DialogState.Loading -> MifosLoadingDialog( + visibilityState = LoadingDialogState.Shown, + ) + + null -> Unit + } +} + +@Composable +private fun LoginScreenContent( + state: LoginState, + modifier: Modifier = Modifier, + onAction: (LoginAction) -> Unit, + createAccount: () -> Unit, +) { + val keyboardController = LocalSoftwareKeyboardController.current + + Column( + modifier = modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .pointerInput(Unit) { + detectTapGestures( + onTap = { + keyboardController?.hide() + }, + ) + }, + ) { + MifosMobileIcon(mobileIcon = Res.drawable.feature_auth_mifos_logo) + + MifosOutlinedTextField( + value = state.username, + onValueChange = { + onAction(LoginAction.UsernameChanged(it)) + }, + label = stringResource(Res.string.username), + trailingIcon = { + Icon( + painter = painterResource(Res.drawable.feature_auth_ic_person), + contentDescription = null, + ) + }, + ) + + Spacer(modifier = Modifier.height(8.dp)) + + MifosPasswordField( + label = stringResource(Res.string.password), + value = state.password, + onValueChange = { + onAction(LoginAction.PasswordChanged(it)) + }, + modifier = Modifier.fillMaxWidth(), + showPassword = state.isPasswordVisible, + showPasswordChange = { + onAction(LoginAction.TogglePasswordVisibility) + }, + + ) + + Spacer(modifier = Modifier.height(8.dp)) + val isLoginButtonEnabled = state.username.isNotEmpty() && state.password.isNotEmpty() + MifosButton( + modifier = Modifier + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp, top = 4.dp), + contentPadding = PaddingValues(12.dp), + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primary, + ), + enabled = isLoginButtonEnabled, + onClick = { + onAction(LoginAction.LoginClicked) + }, + ) { + Text( + text = stringResource(Res.string.login).uppercase(), + style = MaterialTheme.typography.labelLarge, + color = MaterialTheme.colorScheme.onPrimary, + ) + } + + Spacer(modifier = Modifier.height(16.dp)) + + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly, + ) { + HorizontalDivider( + modifier = Modifier + .fillMaxWidth() + .padding(start = 16.dp) + .weight(1f), + thickness = 1.dp, + color = Color.Gray, + ) + Text( + modifier = Modifier.padding(8.dp), + text = "or", + fontSize = 18.sp, + color = MaterialTheme.colorScheme.onSurface, + ) + HorizontalDivider( + modifier = Modifier + .fillMaxWidth() + .padding(end = 16.dp) + .weight(1f), + thickness = 1.dp, + color = Color.Gray, + ) + } + + MifosButton( + onClick = createAccount, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.CenterHorizontally), + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.primary, + ), + ) { + Text(text = stringResource(Res.string.create_an_account)) + } + } +} + +@Preview +@Composable +private fun LoanScreenPreview() { + MifosMobileTheme { + LoginScreen( + state = LoginState(dialogState = null), + snackbarHostState = remember { SnackbarHostState() }, + onAction = {}, + navigateToRegisterScreen = {}, + ) + } +} diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginViewModel.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginViewModel.kt new file mode 100644 index 000000000..0a03d47d9 --- /dev/null +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginViewModel.kt @@ -0,0 +1,171 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.feature.auth.login + +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import org.mifos.mobile.core.data.repository.ClientRepository +import org.mifos.mobile.core.data.repository.UserAuthRepository +import org.mifos.mobile.core.datastore.UserPreferencesRepository +import org.mifos.mobile.core.model.IgnoredOnParcel +import org.mifos.mobile.core.model.Parcelable +import org.mifos.mobile.core.model.Parcelize +import org.mifos.mobile.core.model.entity.User +import org.mifos.mobile.core.ui.utils.BaseViewModel +import org.mifospay.core.common.DataState + +private const val KEY_STATE = "state" + +class LoginViewModel( + private val userAuthRepositoryImp: UserAuthRepository, + private val clientRepositoryImp: ClientRepository, + private val userPreferencesRepositoryImpl: UserPreferencesRepository, + savedStateHandle: SavedStateHandle, +) : BaseViewModel( + initialState = savedStateHandle[KEY_STATE] ?: LoginState(dialogState = null), +) { + init { + savedStateHandle.get("username")?.let { + trySendAction(LoginAction.UsernameChanged(it)) + } + + viewModelScope.launch { + loadClient() + } + } + + private fun updateState(update: (LoginState) -> LoginState) { + mutableStateFlow.update(update) + } + + override fun handleAction(action: LoginAction) { + when (action) { + is LoginAction.UsernameChanged -> { + updateState { it.copy(username = action.username) } + } + is LoginAction.PasswordChanged -> { + updateState { it.copy(password = action.password) } + } + is LoginAction.TogglePasswordVisibility -> { + updateState { it.copy(isPasswordVisible = !it.isPasswordVisible) } + } + is LoginAction.LoginClicked -> { + loginUser(state.username, state.password) + } + is LoginAction.Internal.ReceiveLoginResult -> { + handleLoginResult(action) + } + is LoginAction.SignupClicked -> { + sendEvent(LoginEvent.NavigateToSignup) + } + is LoginAction.ErrorDialogDismiss -> updateState { it.copy(dialogState = null) } + } + } + + private fun handleLoginResult(action: LoginAction.Internal.ReceiveLoginResult) { + when (action.loginResult) { + is DataState.Error -> { + val message = action.loginResult.exception.message ?: "" + + mutableStateFlow.update { + it.copy(dialogState = LoginState.DialogState.Error(message)) + } + } + + is DataState.Loading -> { + mutableStateFlow.update { + it.copy(dialogState = LoginState.DialogState.Loading) + } + } + + is DataState.Success -> { + mutableStateFlow.update { + it.copy(dialogState = null) + } + sendEvent(LoginEvent.NavigateToPasscodeScreen) + } + } + } + + private fun loginUser( + username: String, + password: String, + ) { + mutableStateFlow.update { + it.copy(dialogState = LoginState.DialogState.Loading) + } + + viewModelScope.launch { + val result = userAuthRepositoryImp.login(username, password) + sendAction(LoginAction.Internal.ReceiveLoginResult(result)) + } + } + + /** + * This method fetches the Client, associated with current Access Token. + */ + private fun loadClient() { + viewModelScope.launch { + try { + val client = clientRepositoryImp.loadClient().firstOrNull() + if (client != null && client.data?.pageItems?.isEmpty() != false) { + val clientId = client.data?.pageItems?.get(0)?.id?.toLong() + val clientName = client.data?.pageItems?.get(0)?.displayName + userPreferencesRepositoryImpl.updateClientId(clientId) + mutableStateFlow.update { it.copy(clientName = clientName ?: "clientName") } + } + } catch (e: Exception) { + mutableStateFlow.update { it.copy(dialogState = LoginState.DialogState.Error(e.message ?: "Error loading client")) } + } + } + } +} + +@Parcelize +data class LoginState( + val username: String = "", + @IgnoredOnParcel + val password: String = "", + val isPasswordVisible: Boolean = false, + val clientName: String = "", + val dialogState: DialogState?, +) : Parcelable { + sealed class DialogState : Parcelable { + @Parcelize + data class Error(val message: String) : DialogState() + + @Parcelize + data object Loading : DialogState() + } +} + +sealed class LoginEvent { + data object NavigateToSignup : LoginEvent() + data object NavigateToPasscodeScreen : LoginEvent() + data class ShowToast(val message: String) : LoginEvent() +} + +sealed class LoginAction { + data class UsernameChanged(val username: String) : LoginAction() + data class PasswordChanged(val password: String) : LoginAction() + data object TogglePasswordVisibility : LoginAction() + data object ErrorDialogDismiss : LoginAction() + data object LoginClicked : LoginAction() + data object SignupClicked : LoginAction() + + sealed class Internal : LoginAction() { + data class ReceiveLoginResult( + val loginResult: DataState, + ) : Internal() + } +} diff --git a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt similarity index 92% rename from feature/auth/src/main/java/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt rename to feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt index cc2c0d51c..14e1742bd 100644 --- a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt @@ -14,9 +14,9 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.compose.composable import androidx.navigation.compose.navigation -import org.mifos.mobile.feature.auth.login.screens.LoginScreen -import org.mifos.mobile.feature.auth.registration.screens.RegistrationScreen -import org.mifos.mobile.feature.auth.registration.screens.RegistrationVerificationScreen +import org.mifos.mobile.feature.auth.login.LoginScreen +import org.mifos.mobile.feature.auth.registration.RegistrationScreen +import org.mifos.mobile.feature.auth.registration.RegistrationVerificationScreen fun NavController.navigateToLoginScreen() { navigate(AuthenticationNavigation.Login.route) { diff --git a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/navigation/AuthenticationNavigationScreen.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/navigation/AuthenticationNavigationScreen.kt similarity index 100% rename from feature/auth/src/main/java/org/mifos/mobile/feature/auth/navigation/AuthenticationNavigationScreen.kt rename to feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/navigation/AuthenticationNavigationScreen.kt diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationScreen.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationScreen.kt new file mode 100644 index 000000000..c7b6dbce9 --- /dev/null +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationScreen.kt @@ -0,0 +1,364 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.feature.auth.registration + +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.RadioButton +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import kotlinx.coroutines.launch +import mifos_mobile.feature.auth.generated.resources.Res +import mifos_mobile.feature.auth.generated.resources.account_number +import mifos_mobile.feature.auth.generated.resources.confirm_password +import mifos_mobile.feature.auth.generated.resources.email +import mifos_mobile.feature.auth.generated.resources.feature_auth_mifos_logo +import mifos_mobile.feature.auth.generated.resources.first_name +import mifos_mobile.feature.auth.generated.resources.last_name +import mifos_mobile.feature.auth.generated.resources.password +import mifos_mobile.feature.auth.generated.resources.phone_number +import mifos_mobile.feature.auth.generated.resources.rb_email +import mifos_mobile.feature.auth.generated.resources.rb_mobile +import mifos_mobile.feature.auth.generated.resources.register +import mifos_mobile.feature.auth.generated.resources.username +import mifos_mobile.feature.auth.generated.resources.verification_mode +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.viewmodel.koinViewModel +import org.mifos.mobile.core.designsystem.component.MifosButton +import org.mifos.mobile.core.designsystem.component.MifosOutlinedTextField +import org.mifos.mobile.core.designsystem.component.MifosScaffold +import org.mifos.mobile.core.designsystem.icon.MifosIcons +import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme +import org.mifos.mobile.core.ui.PasswordStrengthState +import org.mifos.mobile.core.ui.component.MifosMobileIcon +import org.mifos.mobile.core.ui.component.MifosProgressIndicatorOverlay +import org.mifos.mobile.core.ui.utils.DevicePreviews +import org.mifos.mobile.core.ui.utils.EventsEffect + +@Composable +internal fun RegistrationScreen( + onVerified: () -> Unit, + navigateBack: () -> Unit, + modifier: Modifier = Modifier, + viewModel: RegistrationViewModel = koinViewModel(), +) { + val scope = rememberCoroutineScope() + val snackbarHostState = remember { SnackbarHostState() } + + val state by viewModel.stateFlow.collectAsStateWithLifecycle() + + EventsEffect(viewModel) { event -> + when (event) { + is SignUpEvent.ShowToast -> { + scope.launch { + snackbarHostState.showSnackbar(event.message) + } + } + + is SignUpEvent.NavigateToLogin -> onVerified.invoke() + } + } + + RegistrationScreen( + state = state, + snackbarHostState = snackbarHostState, + navigateBack = navigateBack, + onAction = remember(viewModel) { + { viewModel.trySendAction(it) } + }, + modifier = modifier, + ) +} + +@Composable +private fun RegistrationScreen( + state: SignUpState, + snackbarHostState: SnackbarHostState, + navigateBack: () -> Unit, + onAction: (SignUpAction) -> Unit, + modifier: Modifier = Modifier, +) { + MifosScaffold( + snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, + topBarTitle = stringResource(Res.string.register), + backPress = navigateBack, + modifier = modifier, + content = { contentPadding -> + Box( + modifier = Modifier + .padding(contentPadding) + .fillMaxSize(), + ) { + RegistrationScreenContent( + state = state, + onAction = onAction, + ) + + when { + state.dialogState is SignUpDialog.Loading -> { + MifosProgressIndicatorOverlay() + } + } + } + }, + ) +} + +@Composable +@Suppress("LongMethod") +private fun RegistrationScreenContent( + state: SignUpState, + onAction: (SignUpAction) -> Unit, +) { + val keyboardController = LocalSoftwareKeyboardController.current + + val radioOptions = + listOf(stringResource(Res.string.rb_email), stringResource(Res.string.rb_mobile)) + + val scrollState = rememberScrollState() + + LaunchedEffect(scrollState.canScrollForward) { + if (scrollState.canScrollForward) scrollState.scrollTo(scrollState.maxValue) + } + + Column( + modifier = Modifier + .fillMaxSize() + .padding(bottom = 12.dp) + .pointerInput(Unit) { + detectTapGestures( + onTap = { + keyboardController?.hide() + }, + ) + } + .verticalScroll( + state = scrollState, + enabled = true, + ), + ) { + MifosMobileIcon(mobileIcon = Res.drawable.feature_auth_mifos_logo) + + MifosOutlinedTextField( + value = state.accountNumber, + onValueChange = { onAction(SignUpAction.AccountInputChange(it)) }, + label = stringResource(Res.string.account_number), + modifier = Modifier.fillMaxWidth(), + isError = state.accountNumber.isEmpty(), + ) + MifosOutlinedTextField( + value = state.userNameInput, + onValueChange = { onAction(SignUpAction.EmailInputChange(it)) }, + label = stringResource(Res.string.username), + modifier = Modifier.fillMaxWidth(), + isError = state.userNameInput.isEmpty(), + ) + MifosOutlinedTextField( + value = state.firstNameInput, + onValueChange = { onAction(SignUpAction.FirstNameInputChange(it)) }, + label = stringResource(Res.string.first_name), + modifier = Modifier.fillMaxWidth(), + isError = state.firstNameInput.isEmpty(), + ) + MifosOutlinedTextField( + value = state.lastNameInput, + onValueChange = { onAction(SignUpAction.LastNameInputChange(it)) }, + label = stringResource(Res.string.last_name), + modifier = Modifier.fillMaxWidth(), + isError = state.lastNameInput.isEmpty(), + ) + + MifosOutlinedTextField( + value = state.mobileNumberInput, + label = stringResource(Res.string.phone_number), + modifier = Modifier.fillMaxWidth(), + isError = state.mobileNumberInput.isEmpty(), + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Phone, + ), + onValueChange = { + onAction(SignUpAction.MobileNumberInputChange(it)) + }, + ) + + MifosOutlinedTextField( + value = state.emailInput, + onValueChange = { onAction(SignUpAction.EmailInputChange(it)) }, + label = stringResource(Res.string.email), + modifier = Modifier.fillMaxWidth(), + isError = state.emailInput.isEmpty(), + ) + + MifosOutlinedTextField( + value = state.passwordInput, + onValueChange = { + onAction(SignUpAction.PasswordInputChange(it)) + onAction(SignUpAction.IsPasswordChanges(true)) + }, + label = stringResource(Res.string.password), + modifier = Modifier.fillMaxWidth(), + visualTransformation = if (state.isPasswordVisible) { + VisualTransformation.None + } else { + PasswordVisualTransformation() + }, + trailingIcon = { + val image = if (state.isPasswordVisible) { + MifosIcons.Visibility + } else { + MifosIcons.VisibilityOff + } + IconButton(onClick = { onAction(SignUpAction.TogglePasswordVisibility) }) { + Icon(imageVector = image, null) + } + }, + isError = state.passwordInput.isEmpty(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), + ) + + if (state.isPasswordChanged) { + val progress = when (state.passwordStrengthState) { + PasswordStrengthState.NONE -> 0f + PasswordStrengthState.WEAK_1 -> 0.25f + PasswordStrengthState.WEAK_2 -> 0.5f + PasswordStrengthState.WEAK_3 -> 0.75f + PasswordStrengthState.STRONG, + PasswordStrengthState.GOOD, + PasswordStrengthState.VERY_STRONG, + -> 1f + } + LinearProgressIndicator( + progress = { progress }, + modifier = Modifier + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp), + color = when (progress) { + 0.25f -> Color.Red + 0.5f -> Color(alpha = 255, red = 220, green = 185, blue = 0) + 0.75f -> Color.Green + else -> Color.Blue + }, + trackColor = Color.White, + ) + } + + MifosOutlinedTextField( + value = state.confirmPasswordInput, + onValueChange = { onAction(SignUpAction.ConfirmPasswordInputChange(it)) }, + label = stringResource(Res.string.confirm_password), + modifier = Modifier.fillMaxWidth(), + visualTransformation = if (state.isConfirmPasswordVisible) { + VisualTransformation.None + } else { + PasswordVisualTransformation() + }, + trailingIcon = { + val image = if (state.isConfirmPasswordVisible) { + MifosIcons.Visibility + } else { + MifosIcons.VisibilityOff + } + IconButton(onClick = { onAction(SignUpAction.ConfirmTogglePasswordVisibility) }) { + Icon(imageVector = image, null) + } + }, + isError = state.confirmPasswordInput.isEmpty(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + ) + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(start = 16.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = stringResource(Res.string.verification_mode), + modifier = Modifier.padding(end = 8.dp), + color = MaterialTheme.colorScheme.onSurface, + ) + radioOptions.forEach { authMode -> + RadioButton( + selected = (authMode == state.authenticationMode), +// onClick = { authenticationMode = authMode }, + onClick = { onAction(SignUpAction.AuthenticationMode(authMode)) }, + ) + Text( + text = authMode, + color = MaterialTheme.colorScheme.onSurface, + ) + } + } + + MifosButton( + text = { stringResource(Res.string.register) }, + onClick = { + onAction(SignUpAction.SubmitClick) + + keyboardController?.hide() + }, + modifier = Modifier + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp, top = 4.dp), + contentPadding = PaddingValues(12.dp), + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primary, + ), + ) + + Spacer(modifier = Modifier.imePadding()) + } +} + +@DevicePreviews +@Composable +private fun RegistrationScreenPreview() { + MifosMobileTheme { + RegistrationScreen( + state = SignUpState(dialogState = null), + snackbarHostState = remember { SnackbarHostState() }, + navigateBack = {}, + onAction = {}, + modifier = Modifier, + ) + } +} diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationScreen.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationScreen.kt new file mode 100644 index 000000000..3ef607710 --- /dev/null +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationScreen.kt @@ -0,0 +1,234 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.feature.auth.registration + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.arkivanov.essenty.backhandler.BackCallback +import kotlinx.coroutines.launch +import mifos_mobile.feature.auth.generated.resources.Res +import mifos_mobile.feature.auth.generated.resources.authentication_token +import mifos_mobile.feature.auth.generated.resources.dialog_cancel_registration_message +import mifos_mobile.feature.auth.generated.resources.dialog_cancel_registration_title +import mifos_mobile.feature.auth.generated.resources.empty_requestid +import mifos_mobile.feature.auth.generated.resources.feature_auth_mifos_logo +import mifos_mobile.feature.auth.generated.resources.no +import mifos_mobile.feature.auth.generated.resources.register +import mifos_mobile.feature.auth.generated.resources.request_id +import mifos_mobile.feature.auth.generated.resources.verify +import mifos_mobile.feature.auth.generated.resources.yes +import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.viewmodel.koinViewModel +import org.mifos.mobile.core.designsystem.component.MifosButton +import org.mifos.mobile.core.designsystem.component.MifosOutlinedTextField +import org.mifos.mobile.core.designsystem.component.MifosScaffold +import org.mifos.mobile.core.designsystem.component.MifosTextButton +import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme +import org.mifos.mobile.core.ui.component.MifosProgressIndicatorOverlay +import org.mifos.mobile.core.ui.utils.DevicePreviews +import org.mifos.mobile.core.ui.utils.EventsEffect + +@Composable +internal fun RegistrationVerificationScreen( + navigateBack: () -> Unit?, + onVerified: () -> Unit, + modifier: Modifier = Modifier, + viewModel: RegistrationVerificationViewModel = koinViewModel(), +) { + val state by viewModel.stateFlow.collectAsStateWithLifecycle() + val scope = rememberCoroutineScope() + val snackbarHostState = remember { SnackbarHostState() } + + BackCallback(isEnabled = true) { + VerificationAction.ConfirmationDialog(true) + } + + if (state.showConfirmationDialog) { + AlertDialog( + onDismissRequest = { VerificationAction.ConfirmationDialog(false) }, + title = { Text(text = stringResource(Res.string.dialog_cancel_registration_title)) }, + text = { + Text(text = stringResource(Res.string.dialog_cancel_registration_message)) + }, + modifier = modifier, + confirmButton = { + MifosTextButton( + onClick = { + VerificationAction.ConfirmationDialog(false) + navigateBack.invoke() + }, + ) { + Text(text = stringResource(Res.string.yes)) + } + }, + dismissButton = { + MifosTextButton( + onClick = { VerificationAction.ConfirmationDialog(false) }, + ) { + Text(text = stringResource(Res.string.no)) + } + }, + ) + } + + EventsEffect(viewModel) { event -> + when (event) { + is VerificationEvent.ShowToast -> { + scope.launch { + snackbarHostState.showSnackbar(event.message) + } + } + is VerificationEvent.NavigateToLogin -> { + onVerified.invoke() + } + is VerificationEvent.NavigateToRegister -> { + navigateBack.invoke() + } + } + } + RegistrationVerificationScreen( + state = state, + onAction = remember(viewModel) { + { viewModel.trySendAction(it) } + }, + snackbarHostState = snackbarHostState, + navigateBack = { VerificationAction.ConfirmationDialog(true) }, + ) +} + +@Composable +private fun RegistrationVerificationScreen( + state: VerificationState, + onAction: (VerificationAction) -> Unit, + snackbarHostState: SnackbarHostState, + navigateBack: () -> Unit, + modifier: Modifier = Modifier, +) { + MifosScaffold( + topBarTitle = stringResource(Res.string.register), + backPress = navigateBack, + modifier = modifier, + snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, + content = { contentPadding -> + Box( + modifier = Modifier + .padding(contentPadding) + .fillMaxSize(), + ) { + RegistrationVerificationContent(state = state, onAction = onAction) + when (state.dialogState) { + is VerificationDialog.Loading -> MifosProgressIndicatorOverlay() + is VerificationDialog.Error -> {} + null -> {} + } + } + }, + ) +} + +@Composable +private fun RegistrationVerificationContent( + state: VerificationState, + onAction: (VerificationAction) -> Unit, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier.fillMaxSize(), + ) { + Image( + painter = painterResource(Res.drawable.feature_auth_mifos_logo), + contentDescription = null, + contentScale = ContentScale.Fit, + alignment = Alignment.Center, + modifier = Modifier + .padding(16.dp) + .height(100.dp) + .fillMaxWidth(), + ) + + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(80.dp), + ) + + MifosOutlinedTextField( + value = state.requestId, + onValueChange = { + onAction(VerificationAction.RequestIdError) + onAction(VerificationAction.RequestIdChange(it)) + }, + label = stringResource(Res.string.request_id), + errorText = stringResource(Res.string.empty_requestid), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + ) + + MifosOutlinedTextField( + value = state.authenticationToken, + onValueChange = { + onAction(VerificationAction.AuthenticationTokenChange(it)) + }, + label = stringResource(Res.string.authentication_token), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + ) + + MifosButton( + text = { stringResource(Res.string.verify) }, + onClick = { + onAction(VerificationAction.SubmitClick) + }, + modifier = Modifier + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp, top = 12.dp), + contentPadding = PaddingValues(12.dp), + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primary, + ), + ) + } +} + +@DevicePreviews +@Composable +private fun RegistrationVerificationScreenPreview( + state: VerificationState, +) { + MifosMobileTheme { + RegistrationVerificationContent( + state = state, + onAction = {}, + ) + } +} diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationViewModel.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationViewModel.kt new file mode 100644 index 000000000..5e0ea3044 --- /dev/null +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationViewModel.kt @@ -0,0 +1,147 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.feature.auth.registration + +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import mifos_mobile.feature.auth.generated.resources.Res +import mifos_mobile.feature.auth.generated.resources.could_not_register_user_error +import mifos_mobile.feature.auth.generated.resources.empty_authentication_token +import mifos_mobile.feature.auth.generated.resources.empty_requestid +import mifos_mobile.feature.auth.generated.resources.verified +import org.mifos.mobile.core.data.repository.UserAuthRepository +import org.mifos.mobile.core.model.Parcelable +import org.mifos.mobile.core.model.Parcelize +import org.mifos.mobile.core.ui.utils.BaseViewModel +import org.mifospay.core.common.DataState + +private const val KEY_STATE = "verification_state" + +class RegistrationVerificationViewModel( + private val userAuthRepositoryImp: UserAuthRepository, + savedStateHandle: SavedStateHandle, +) : BaseViewModel( + initialState = savedStateHandle[KEY_STATE] ?: VerificationState(), +) { + + private fun updateState(update: (VerificationState) -> VerificationState) { + mutableStateFlow.update(update) + } + + override fun handleAction(action: VerificationAction) { + when (action) { + is VerificationAction.AuthenticationTokenChange -> updateState { it.copy(authenticationToken = action.authenticationToken) } + is VerificationAction.RequestIdChange -> updateState { it.copy(requestId = action.requestId) } + is VerificationAction.RequestIdError -> updateState { it.copy(requestIdError = false) } + is VerificationAction.ConfirmationDialog -> updateState { it.copy(showConfirmationDialog = action.confirmationDialog) } + is VerificationAction.Internal.ReceiveRegisterResult -> handleVerificationResult(action) + is VerificationAction.SubmitClick -> handleSubmitClick() + VerificationAction.ErrorDialogDismiss -> updateState { it.copy(dialogState = null) } + } + } + + private fun handleSubmitClick() { + val errorMessage = validateForm() + if (errorMessage != null) { + updateState { it.copy(dialogState = VerificationDialog.Error(errorMessage)) } + } else { + verifyUser() + } + } + + private fun handleVerificationResult(action: VerificationAction.Internal.ReceiveRegisterResult) { + when (val result = action.registerResult) { + is DataState.Success -> { + updateState { it.copy(dialogState = null) } + sendEvent(VerificationEvent.NavigateToLogin(result.data)) + } + + is DataState.Error -> { + updateState { + it.copy(dialogState = VerificationDialog.Error(result.exception.message ?: "An error occurred.")) + } + } + + DataState.Loading -> updateState { it.copy(dialogState = VerificationDialog.Loading) } + + else -> {} + } + } + + // TODO:: move error messages to strings.xml + private fun validateForm(): String? { + return when { + state.authenticationToken.isEmpty() -> Res.string.empty_authentication_token.toString() + state.requestId.isEmpty() -> Res.string.empty_requestid.toString() + else -> null + } + } + + private fun verifyUser() { + viewModelScope.launch { + try { + userAuthRepositoryImp.verifyUser( + authenticationToken = + state.authenticationToken, + requestId = state.requestId, + ) + + sendEvent(VerificationEvent.ShowToast(Res.string.verified.toString())) + sendAction( + VerificationAction.Internal.ReceiveRegisterResult( + DataState.Success(Res.string.verified.toString()), + ), + ) + } catch (e: Exception) { + updateState { it.copy(dialogState = VerificationDialog.Error((e.message ?: Res.string.could_not_register_user_error).toString())) } + } + } + } +} + +@Parcelize +data class VerificationState( + val authenticationToken: String = "", + val requestId: String = "", + val requestIdError: Boolean = false, + val showConfirmationDialog: Boolean = false, + val dialogState: VerificationDialog? = null, +) : Parcelable + +sealed interface VerificationDialog : Parcelable { + @Parcelize + data object Loading : VerificationDialog + + @Parcelize + data class Error(val message: String) : VerificationDialog +} + +sealed interface VerificationEvent { + data class ShowToast(val message: String) : VerificationEvent + data class NavigateToLogin(val username: String) : VerificationEvent + data object NavigateToRegister : VerificationEvent +} + +sealed interface VerificationAction { + data class RequestIdChange(val requestId: String) : VerificationAction + data class AuthenticationTokenChange(val authenticationToken: String) : VerificationAction + data class ConfirmationDialog(val confirmationDialog: Boolean) : VerificationAction + data object RequestIdError : VerificationAction + data object SubmitClick : VerificationAction + data object ErrorDialogDismiss : VerificationAction + + sealed class Internal : VerificationAction { + data class ReceiveRegisterResult( + val registerResult: DataState, + ) : Internal() + } +} diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationViewModel.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationViewModel.kt new file mode 100644 index 000000000..51b3fed85 --- /dev/null +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationViewModel.kt @@ -0,0 +1,292 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.feature.auth.registration + +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import mifos_mobile.feature.auth.generated.resources.Res +import mifos_mobile.feature.auth.generated.resources.could_not_register_user_error +import mifos_mobile.feature.auth.generated.resources.error_enter_account_number +import mifos_mobile.feature.auth.generated.resources.error_enter_country +import mifos_mobile.feature.auth.generated.resources.error_enter_email +import mifos_mobile.feature.auth.generated.resources.error_enter_first_name +import mifos_mobile.feature.auth.generated.resources.error_enter_last_name +import mifos_mobile.feature.auth.generated.resources.error_enter_mobile_number +import mifos_mobile.feature.auth.generated.resources.error_enter_user_name +import mifos_mobile.feature.auth.generated.resources.error_invalid_email +import mifos_mobile.feature.auth.generated.resources.error_invalid_password +import mifos_mobile.feature.auth.generated.resources.error_mobile_length +import mifos_mobile.feature.auth.generated.resources.error_password_not_match +import mifos_mobile.feature.auth.generated.resources.invalid_phn_number +import mifos_mobile.feature.auth.generated.resources.password_strength_weak +import org.mifos.mobile.core.common.utils.isValidEmail +import org.mifos.mobile.core.data.repository.UserAuthRepository +import org.mifos.mobile.core.model.IgnoredOnParcel +import org.mifos.mobile.core.model.Parcelable +import org.mifos.mobile.core.model.Parcelize +import org.mifos.mobile.core.ui.PasswordStrengthState +import org.mifos.mobile.core.ui.utils.BaseViewModel +import org.mifos.mobile.core.ui.utils.PasswordChecker +import org.mifos.mobile.core.ui.utils.PasswordStrength +import org.mifos.mobile.core.ui.utils.PasswordStrengthResult +import org.mifospay.core.common.DataState + +private const val KEY_STATE = "signup_state" + +class RegistrationViewModel( + private val userAuthRepositoryImp: UserAuthRepository, + savedStateHandle: SavedStateHandle, +) : BaseViewModel( + initialState = savedStateHandle[KEY_STATE] ?: SignUpState(), +) { + + private var passwordStrengthJob: Job = Job().apply { complete() } + + private fun updateState(update: (SignUpState) -> SignUpState) { + mutableStateFlow.update(update) + } + + override fun handleAction(action: SignUpAction) { + when (action) { + is SignUpAction.AccountInputChange -> updateState { it.copy(accountNumber = action.accountNumber) } + is SignUpAction.FirstNameInputChange -> updateState { it.copy(firstNameInput = action.firstName) } + is SignUpAction.LastNameInputChange -> updateState { it.copy(lastNameInput = action.lastName) } + is SignUpAction.EmailInputChange -> updateState { it.copy(emailInput = action.email) } + is SignUpAction.MobileNumberInputChange -> updateState { it.copy(mobileNumberInput = action.mobileNumber) } + is SignUpAction.PasswordInputChange -> handlePasswordInput(action.password) + is SignUpAction.ConfirmPasswordInputChange -> updateState { it.copy(confirmPasswordInput = action.confirmPassword) } + is SignUpAction.UserNameInputChange -> updateState { it.copy(userNameInput = action.username) } + is SignUpAction.CountryInputChange -> updateState { it.copy(countryInput = action.country) } + is SignUpAction.IsPasswordChanges -> updateState { it.copy(isPasswordChanged = true) } + is SignUpAction.AuthenticationMode -> updateState { + it.copy( + authenticationMode = + action.authenticationMode, + ) + } + is SignUpAction.TogglePasswordVisibility -> updateState { + it.copy( + isPasswordVisible = + !it.isPasswordVisible, + ) + } + is SignUpAction.ConfirmTogglePasswordVisibility -> updateState { + it.copy( + isConfirmPasswordVisible = !it + .isPasswordVisible, + ) + } + is SignUpAction.Internal.ReceivePasswordStrengthResult -> handlePasswordStrengthResult(action) + is SignUpAction.Internal.ReceiveRegisterResult -> handleRegisterResult(action) + is SignUpAction.SubmitClick -> handleSubmitClick() + SignUpAction.ErrorDialogDismiss -> updateState { it.copy(dialogState = null) } + } + } + + private fun handlePasswordInput(password: String) { + updateState { it.copy(passwordInput = password) } + passwordStrengthJob.cancel() + + if (password.isEmpty()) { + updateState { it.copy(passwordStrengthState = PasswordStrengthState.NONE) } + } else { + passwordStrengthJob = viewModelScope.launch { + val result = PasswordChecker.getPasswordStrengthResult(password) + trySendAction(SignUpAction.Internal.ReceivePasswordStrengthResult(result)) + } + } + } + + private fun handlePasswordStrengthResult(action: SignUpAction.Internal.ReceivePasswordStrengthResult) { + when (val result = action.result) { + is PasswordStrengthResult.Success -> { + val updatedState = when (result.passwordStrength) { + PasswordStrength.LEVEL_0 -> PasswordStrengthState.WEAK_1 + PasswordStrength.LEVEL_1 -> PasswordStrengthState.WEAK_2 + PasswordStrength.LEVEL_2 -> PasswordStrengthState.WEAK_3 + PasswordStrength.LEVEL_3 -> PasswordStrengthState.GOOD + PasswordStrength.LEVEL_4 -> PasswordStrengthState.STRONG + PasswordStrength.LEVEL_5 -> PasswordStrengthState.VERY_STRONG + } + mutableStateFlow.update { oldState -> + oldState.copy(passwordStrengthState = updatedState) + } + } + + is PasswordStrengthResult.Error -> {} + } + } + + private fun handleSubmitClick() { + val errorMessage = validateForm() + if (errorMessage != null) { + updateState { it.copy(dialogState = SignUpDialog.Error(errorMessage)) } + } else { + registerUser() + } + } + + private fun handleRegisterResult(action: SignUpAction.Internal.ReceiveRegisterResult) { + when (val result = action.registerResult) { + is DataState.Success -> { + updateState { it.copy(dialogState = null) } + sendEvent(SignUpEvent.NavigateToLogin(result.data)) + } + + is DataState.Error -> { + updateState { + it.copy(dialogState = SignUpDialog.Error(result.exception.message ?: "An error occurred.")) + } + } + + DataState.Loading -> updateState { it.copy(dialogState = SignUpDialog.Loading) } + + else -> {} + } + } + + // TODO:: move error messages to strings.xml + private fun validateForm(): String? { + return when { + state.accountNumber.isEmpty() -> Res.string.error_enter_account_number.toString() + state.firstNameInput.isEmpty() -> Res.string.error_enter_first_name.toString() + state.lastNameInput.isEmpty() -> Res.string.error_enter_last_name.toString() + state.userNameInput.isEmpty() -> Res.string.error_enter_user_name.toString() + state.emailInput.isEmpty() -> Res.string.error_enter_email.toString() + !state.emailInput.isValidEmail() -> Res.string.error_invalid_email.toString() + state.mobileNumberInput.isEmpty() -> Res.string.error_enter_mobile_number.toString() + state.mobileNumberInput.length < 10 -> Res.string.error_mobile_length.toString() + isPhoneNumberValid(state.mobileNumberInput) -> Res.string.invalid_phn_number.toString() + state.passwordInput.length < 8 -> Res.string.error_invalid_password.toString() + !state.isPasswordMatch -> Res.string.error_password_not_match.toString() + !state.isPasswordStrong -> Res.string.password_strength_weak.toString() + state.countryInput.isEmpty() -> Res.string.error_enter_country.toString() + else -> null + } + } + + private fun isPhoneNumberValid(fieldText: String?): Boolean { + if (fieldText.isNullOrBlank()) { + return false + } + + val phoneNumberPattern = "^\\+?[0-9]{10,15}\$" + val regex = phoneNumberPattern.toRegex() + return regex.matches(fieldText.trim()) + } + + private fun registerUser() { + viewModelScope.launch { + updateState { it.copy(dialogState = SignUpDialog.Loading) } + try { + userAuthRepositoryImp.registerUser( + accountNumber = state.accountNumber, + authenticationMode = state.authenticationMode, + email = state.emailInput, + firstName = state.firstNameInput, + lastName = state.lastNameInput, + mobileNumber = state.countryInput + state.mobileNumberInput, + password = state.passwordInput, + username = state.userNameInput, + ) + sendEvent(SignUpEvent.ShowToast("Registration successful.")) + sendAction( + SignUpAction.Internal.ReceiveRegisterResult( + DataState.Success("Registration successful."), + ), + ) + } catch (e: Exception) { + updateState { it.copy(dialogState = SignUpDialog.Error((e.message ?: Res.string.could_not_register_user_error).toString())) } + } + } + } +} + +@Parcelize +data class SignUpState( + val accountNumber: String = "", + val userNameInput: String = "", + val firstNameInput: String = "", + val lastNameInput: String = "", + val emailInput: String = "", + val passwordInput: String = "", + val confirmPasswordInput: String = "", + val mobileNumberInput: String = "", + val countryInput: String = "", + val dialogState: SignUpDialog? = null, + val authenticationMode: String = "Email", + val isPasswordChanged: Boolean = false, + val passwordStrengthState: PasswordStrengthState = PasswordStrengthState.NONE, + val isPasswordVisible: Boolean = false, + val isConfirmPasswordVisible: Boolean = false, +) : Parcelable { + @IgnoredOnParcel + val isPasswordStrong: Boolean + get() = when (passwordStrengthState) { + PasswordStrengthState.NONE, + PasswordStrengthState.WEAK_1, + PasswordStrengthState.WEAK_2, + PasswordStrengthState.WEAK_3, + -> false + + PasswordStrengthState.GOOD, + PasswordStrengthState.STRONG, + PasswordStrengthState.VERY_STRONG, + -> true + } + + @IgnoredOnParcel + val isPasswordMatch: Boolean + get() = passwordInput == confirmPasswordInput +} + +sealed interface SignUpDialog : Parcelable { + @Parcelize + data object Loading : SignUpDialog + + @Parcelize + data class Error(val message: String) : SignUpDialog +} + +sealed interface SignUpEvent { + data class ShowToast(val message: String) : SignUpEvent + data class NavigateToLogin(val username: String) : SignUpEvent +} + +sealed interface SignUpAction { + data class AccountInputChange(val accountNumber: String) : SignUpAction + data class UserNameInputChange(val username: String) : SignUpAction + data class FirstNameInputChange(val firstName: String) : SignUpAction + data class LastNameInputChange(val lastName: String) : SignUpAction + data class EmailInputChange(val email: String) : SignUpAction + data class PasswordInputChange(val password: String) : SignUpAction + data class ConfirmPasswordInputChange(val confirmPassword: String) : SignUpAction + data class MobileNumberInputChange(val mobileNumber: String) : SignUpAction + data class CountryInputChange(val country: String) : SignUpAction + data class AuthenticationMode(val authenticationMode: String) : SignUpAction + data class IsPasswordChanges(val isPasswordChanged: Boolean) : SignUpAction + data object TogglePasswordVisibility : SignUpAction + data object ConfirmTogglePasswordVisibility : SignUpAction + data object SubmitClick : SignUpAction + data object ErrorDialogDismiss : SignUpAction + + sealed class Internal : SignUpAction { + data class ReceiveRegisterResult( + val registerResult: DataState, + ) : Internal() + + data class ReceivePasswordStrengthResult( + val result: PasswordStrengthResult, + ) : Internal() + } +} diff --git a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/login/screens/LoginScreen.kt b/feature/auth/src/main/java/org/mifos/mobile/feature/auth/login/screens/LoginScreen.kt deleted file mode 100644 index 05c176dd0..000000000 --- a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/login/screens/LoginScreen.kt +++ /dev/null @@ -1,445 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.feature.auth.login.screens - -import android.content.Context -import android.widget.Toast -import androidx.compose.foundation.background -import androidx.compose.foundation.gestures.detectTapGestures -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalSoftwareKeyboardController -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.input.KeyboardType -import androidx.compose.ui.text.input.PasswordVisualTransformation -import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.text.input.VisualTransformation -import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import org.mifos.mobile.core.common.Network -import org.mifos.mobile.core.designsystem.components.MifosButton -import org.mifos.mobile.core.designsystem.components.MifosOutlinedTextField -import org.mifos.mobile.core.designsystem.components.MifosTextButton -import org.mifos.mobile.core.designsystem.icons.MifosIcons -import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme -import org.mifos.mobile.core.ui.component.MifosMobileIcon -import org.mifos.mobile.core.ui.component.MifosProgressIndicatorOverlay -import org.mifos.mobile.core.ui.utils.DevicePreviews -import org.mifos.mobile.feature.auth.R -import org.mifos.mobile.feature.auth.login.viewmodel.LoginUiState -import org.mifos.mobile.feature.auth.login.viewmodel.LoginViewModel - -@Composable -internal fun LoginScreen( - navigateToRegisterScreen: () -> Unit, - navigateToPasscodeScreen: () -> Unit, - modifier: Modifier = Modifier, - viewModel: LoginViewModel = hiltViewModel(), -) { - val context = LocalContext.current - val uiState by viewModel.loginUiState.collectAsStateWithLifecycle() - - LoginScreen( - uiState = uiState, - loadClient = viewModel::loadClient, - startPassCodeActivity = navigateToPasscodeScreen, - startRegisterActivity = navigateToRegisterScreen, - modifier = modifier, - login = { username, password -> - if (Network.isConnected(context)) { - if (isCredentialsValid(username, password)) { - viewModel.login(username, password) - } - } else { - Toast.makeText( - context, - context.getString(R.string.no_internet_connection), - Toast.LENGTH_SHORT, - ).show() - } - }, - ) -} - -@Composable -private fun LoginScreen( - uiState: LoginUiState, - loadClient: () -> Unit, - startPassCodeActivity: () -> Unit, - startRegisterActivity: () -> Unit, - login: (username: String, password: String) -> Unit, - modifier: Modifier = Modifier, -) { - val context = LocalContext.current - - Box( - modifier = modifier - .fillMaxSize() - .background(MaterialTheme.colorScheme.background), - ) { - LoginContent( - login = login, - createAccount = startRegisterActivity, - ) - - when (uiState) { - LoginUiState.Initial -> Unit - - is LoginUiState.Error -> { - LaunchedEffect(key1 = true) { - showToast(context, context.getString(R.string.login_failed)) - } - } - - LoginUiState.Loading -> MifosProgressIndicatorOverlay() - - is LoginUiState.LoginSuccess -> loadClient.invoke() - - is LoginUiState.LoadClientSuccess -> { - startPassCodeActivity.invoke() - LaunchedEffect(key1 = true) { - showToast( - context, - context.getString(R.string.toast_welcome, uiState.clientName), - ) - } - } - } - } -} - -@Composable -@Suppress("LongMethod") -private fun LoginContent( - login: (username: String, password: String) -> Unit, - createAccount: () -> Unit, - modifier: Modifier = Modifier, -) { - val context = LocalContext.current - val keyboardController = LocalSoftwareKeyboardController.current - - var username by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf( - TextFieldValue(""), - ) - } - var password by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf( - TextFieldValue(""), - ) - } - - var passwordVisibility: Boolean by rememberSaveable { mutableStateOf(false) } - - var usernameError by rememberSaveable { mutableStateOf(false) } - var passwordError by rememberSaveable { mutableStateOf(false) } - val usernameErrorContent = validateUsername(username.text, context) - val passwordErrorContent = validatePassword(password.text, context) - - Column( - modifier = modifier - .fillMaxSize() - .verticalScroll(rememberScrollState()) - .pointerInput(Unit) { - detectTapGestures( - onTap = { - keyboardController?.hide() - }, - ) - }, - ) { - MifosMobileIcon(id = R.drawable.feature_auth_mifos_logo) - - MifosOutlinedTextField( - value = username, - onValueChange = { - username = it - usernameError = false - }, - label = R.string.username, - icon = R.drawable.feature_auth_ic_person, - error = usernameError, - supportingText = usernameErrorContent, - trailingIcon = { - if (usernameError) { - Icon(imageVector = MifosIcons.Error, contentDescription = null) - } - }, - ) - - Spacer(modifier = Modifier.height(8.dp)) - - MifosOutlinedTextField( - value = password, - onValueChange = { - password = it - passwordError = false - }, - label = R.string.password, - icon = R.drawable.feature_auth_lock, - visualTransformation = if (passwordVisibility) { - VisualTransformation.None - } else { - PasswordVisualTransformation() - }, - trailingIcon = { - if (!passwordError) { - val image = if (passwordVisibility) { - MifosIcons.Visibility - } else { - MifosIcons.VisibilityOff - } - IconButton(onClick = { passwordVisibility = !passwordVisibility }) { - Icon(imageVector = image, null) - } - } else { - Icon(imageVector = MifosIcons.Error, contentDescription = null) - } - }, - error = passwordError, - supportingText = passwordErrorContent, - keyboardType = KeyboardType.Password, - ) - - Spacer(modifier = Modifier.height(8.dp)) - - MifosButton( - textResId = R.string.login, - onClick = { - when { - usernameErrorContent.isEmpty() && passwordErrorContent.isEmpty() -> { - login.invoke(username.text, password.text) - } - - usernameErrorContent.isEmpty() && passwordErrorContent.isNotEmpty() -> { - passwordError = true - } - - usernameErrorContent.isNotEmpty() && passwordErrorContent.isEmpty() -> { - usernameError = true - } - - else -> { - passwordError = true - usernameError = true - } - } - keyboardController?.hide() - }, - modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp, top = 4.dp), - contentPadding = PaddingValues(12.dp), - colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.primary, - ), - ) - - Spacer(modifier = Modifier.height(16.dp)) - - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceEvenly, - ) { - HorizontalDivider( - modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp) - .weight(1f), - thickness = 1.dp, - color = Color.Gray, - ) - Text( - modifier = Modifier.padding(8.dp), - text = "or", - fontSize = 18.sp, - color = MaterialTheme.colorScheme.onSurface, - ) - HorizontalDivider( - modifier = Modifier - .fillMaxWidth() - .padding(end = 16.dp) - .weight(1f), - thickness = 1.dp, - color = Color.Gray, - ) - } - - MifosTextButton( - onClick = createAccount, - modifier = Modifier - .fillMaxWidth() - .align(Alignment.CenterHorizontally), - colors = ButtonDefaults.textButtonColors( - contentColor = MaterialTheme.colorScheme.primary, - ), - ) { - Text(text = stringResource(id = R.string.create_an_account)) - } - } -} - -private fun isFieldEmpty(fieldText: String): Boolean { - return fieldText.isEmpty() -} - -private fun isUsernameLengthInadequate(username: String): Boolean { - return username.length < 5 -} - -private fun isPasswordLengthInadequate(password: String): Boolean { - return password.length < 6 -} - -private fun usernameHasSpaces(username: String): Boolean { - return username.trim().contains(" ") -} - -private fun isCredentialsValid(username: String, password: String): Boolean { - var credentialValid = true - when { - isFieldEmpty(username) -> { - credentialValid = false - } - - isUsernameLengthInadequate(username) -> { - credentialValid = false - } - - usernameHasSpaces(username) -> { - credentialValid = false - } - } - - when { - isFieldEmpty(password) -> { - credentialValid = false - } - - isPasswordLengthInadequate(password) -> { - credentialValid = false - } - } - return credentialValid -} - -private fun validateUsername(username: String, context: Context): String { - var usernameError = "" - when { - isFieldEmpty(username) -> { - usernameError = context.getString( - R.string.error_validation_blank, - context.getString(R.string.username), - ) - } - - isUsernameLengthInadequate(username) -> { - usernameError = context.getString( - R.string.error_validation_minimum_chars, - context.getString(R.string.username), - context.resources?.getInteger(R.integer.username_minimum_length), - ) - } - - usernameHasSpaces(username) -> { - usernameError = context.getString( - R.string.error_validation_cannot_contain_spaces, - context.getString(R.string.username), - context.getString(R.string.not_contain_username), - ) - } - } - return usernameError -} - -private fun validatePassword(password: String, context: Context): String { - var passwordError = "" - when { - isFieldEmpty(password) -> { - passwordError = context.getString( - R.string.error_validation_blank, - context.getString(R.string.password), - ) - } - - isPasswordLengthInadequate(password) -> { - passwordError = context.getString( - R.string.error_validation_minimum_chars, - context.getString(R.string.password), - context.resources.getInteger(R.integer.password_minimum_length), - ) - } - } - return passwordError -} - -internal class LoginScreenPreviewProvider : PreviewParameterProvider { - - override val values: Sequence - get() = sequenceOf( - LoginUiState.Loading, - LoginUiState.Error, - LoginUiState.LoginSuccess, - LoginUiState.LoadClientSuccess(""), - LoginUiState.Initial, - ) -} - -private fun showToast(context: Context, text: String) { - Toast.makeText(context, text, Toast.LENGTH_LONG).show() -} - -@DevicePreviews -@Composable -private fun LoginScreenPreview( - @PreviewParameter(LoginScreenPreviewProvider::class) loginUiState: LoginUiState, -) { - MifosMobileTheme { - LoginScreen( - loginUiState, - {}, - {}, - {}, - { _, _ -> }, - ) - } -} diff --git a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/login/viewmodel/LoginViewModel.kt b/feature/auth/src/main/java/org/mifos/mobile/feature/auth/login/viewmodel/LoginViewModel.kt deleted file mode 100644 index 4636f0fb4..000000000 --- a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/login/viewmodel/LoginViewModel.kt +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.feature.auth.login.viewmodel - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.launch -import org.mifos.mobile.core.data.repository.ClientRepository -import org.mifos.mobile.core.data.repository.UserAuthRepository -import javax.inject.Inject - -@HiltViewModel -internal class LoginViewModel @Inject constructor( - private val userAuthRepositoryImp: UserAuthRepository, - private val clientRepositoryImp: ClientRepository, -) : ViewModel() { - - private var _loginUiState = MutableStateFlow(LoginUiState.Initial) - val loginUiState: StateFlow get() = _loginUiState - - /** - * This method attempts to authenticate the user from - * the server and then persist the authentication data if we successfully - * authenticate the credentials or notify about any errors. - */ - fun login(username: String, password: String) { - viewModelScope.launch { - _loginUiState.value = LoginUiState.Loading - userAuthRepositoryImp.login(username, password).catch { - _loginUiState.value = LoginUiState.Error - }.collect { - clientRepositoryImp.saveAuthenticationTokenForSession(it) - _loginUiState.value = LoginUiState.LoginSuccess - } - } - } - - /** - * This method fetches the Client, associated with current Access Token. - */ - fun loadClient() { - viewModelScope.launch { - clientRepositoryImp.loadClient().catch { - _loginUiState.value = LoginUiState.Error - clientRepositoryImp.clearPrefHelper() - clientRepositoryImp.reInitializeService() - }.collect { - if (it.pageItems.isNotEmpty()) { - val clientId = it.pageItems[0].id.toLong() - val clientName = it.pageItems[0].displayName - clientRepositoryImp.setClientId(clientId) - clientRepositoryImp.reInitializeService() - _loginUiState.value = LoginUiState.LoadClientSuccess(clientName) - } - } - } - } -} - -internal sealed class LoginUiState { - data object Initial : LoginUiState() - data object LoginSuccess : LoginUiState() - data object Loading : LoginUiState() - data object Error : LoginUiState() - data class LoadClientSuccess(val clientName: String?) : LoginUiState() -} diff --git a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/screens/RegistrationScreen.kt b/feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/screens/RegistrationScreen.kt deleted file mode 100644 index 55dc476f4..000000000 --- a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/screens/RegistrationScreen.kt +++ /dev/null @@ -1,575 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.feature.auth.registration.screens - -import android.content.Context -import android.widget.Toast -import androidx.compose.foundation.gestures.detectTapGestures -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.imePadding -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.LinearProgressIndicator -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedTextFieldDefaults -import androidx.compose.material3.RadioButton -import androidx.compose.material3.SnackbarDuration -import androidx.compose.material3.SnackbarHost -import androidx.compose.material3.SnackbarHostState -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalSoftwareKeyboardController -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.input.KeyboardType -import androidx.compose.ui.text.input.PasswordVisualTransformation -import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.text.input.VisualTransformation -import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import androidx.compose.ui.unit.dp -import androidx.core.content.ContextCompat.getString -import androidx.core.util.PatternsCompat -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.mifos.library.countrycodepicker.CountryCodePicker -import kotlinx.coroutines.launch -import org.mifos.mobile.core.designsystem.components.MifosButton -import org.mifos.mobile.core.designsystem.components.MifosOutlinedTextField -import org.mifos.mobile.core.designsystem.components.MifosScaffold -import org.mifos.mobile.core.designsystem.icons.MifosIcons -import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme -import org.mifos.mobile.core.ui.component.MifosMobileIcon -import org.mifos.mobile.core.ui.component.MifosProgressIndicatorOverlay -import org.mifos.mobile.core.ui.utils.DevicePreviews -import org.mifos.mobile.feature.auth.R -import org.mifos.mobile.feature.auth.registration.utils.PasswordStrength -import org.mifos.mobile.feature.auth.registration.viewmodel.RegistrationUiState -import org.mifos.mobile.feature.auth.registration.viewmodel.RegistrationViewModel - -@Composable -internal fun RegistrationScreen( - onVerified: () -> Unit, - navigateBack: () -> Unit, - modifier: Modifier = Modifier, - viewModel: RegistrationViewModel = hiltViewModel(), -) { - val uiState by viewModel.registrationUiState.collectAsStateWithLifecycle() - - RegistrationScreen( - uiState = uiState, - onVerified = onVerified, - navigateBack = navigateBack, - register = viewModel::registerUser, - modifier = modifier, - ) -} - -@Composable -private fun RegistrationScreen( - uiState: RegistrationUiState, - onVerified: () -> Unit, - navigateBack: () -> Unit, - register: ( - accountNumber: String, - username: String, - firstName: String, - lastName: String, - phoneNumber: String, - email: String, - password: String, - authMode: String, - countryCode: String, - ) -> Unit, - modifier: Modifier = Modifier, -) { - val context = LocalContext.current - val snackBarHostState = remember { SnackbarHostState() } - - MifosScaffold( - topBarTitleResId = R.string.register, - navigateBack = navigateBack, - modifier = modifier, - snackbarHost = { SnackbarHost(hostState = snackBarHostState) }, - content = { contentPadding -> - Box( - modifier = Modifier - .padding(contentPadding) - .fillMaxSize(), - ) { - RegistrationContent( - register = register, - progress = { - updatePasswordStrengthView(it, context) - }, - snackBarHostState = snackBarHostState, - ) - - when (uiState) { - RegistrationUiState.Initial -> Unit - - is RegistrationUiState.Error -> { - Toast.makeText(context, uiState.exception, Toast.LENGTH_SHORT).show() - } - - RegistrationUiState.Loading -> { - MifosProgressIndicatorOverlay() - } - - RegistrationUiState.Success -> { - onVerified() - } - } - } - }, - ) -} - -@Composable -@Suppress("LongMethod") -private fun RegistrationContent( - register: ( - accountNumber: String, - username: String, - firstName: String, - lastName: String, - phoneNumber: String, - email: String, - password: String, - authMode: String, - countryCode: String, - ) -> Unit, - progress: (String) -> Float, - snackBarHostState: SnackbarHostState, -) { - val context = LocalContext.current - val keyboardController = LocalSoftwareKeyboardController.current - - var accountNumber by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue("")) - } - var username by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue("")) - } - var firstName by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue("")) - } - var lastName by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue("")) - } - var phoneNumber by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue("")) - } - var email by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue("")) - } - var password by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue("")) - } - var onValueChangePassword by rememberSaveable { - mutableStateOf(false) - } - var confirmPassword by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue("")) - } - var countryCode by rememberSaveable { - mutableStateOf("") - } - val radioOptions = - listOf(stringResource(id = R.string.rb_email), stringResource(id = R.string.rb_mobile)) - - var authenticationMode by remember { mutableStateOf(radioOptions[0]) } - - val progressIndicator = progress(password.text) - var passwordVisibility: Boolean by remember { mutableStateOf(false) } - var confirmPasswordVisibility: Boolean by remember { mutableStateOf(false) } - val scrollState = rememberScrollState() - val coroutineScope = rememberCoroutineScope() - - LaunchedEffect(scrollState.canScrollForward) { - if (scrollState.canScrollForward) scrollState.scrollTo(scrollState.maxValue) - } - - fun validateAllFields(): String { - return areFieldsValidated( - context = context, - accountNumberContent = accountNumber.text, - usernameContent = username.text, - firstNameContent = firstName.text, - lastNameContent = lastName.text, - phoneNumberContent = phoneNumber.text, - emailContent = email.text, - passwordContent = password.text, - confirmPasswordContent = confirmPassword.text, - ) - } - - Column( - modifier = Modifier - .fillMaxSize() - .padding(bottom = 12.dp) - .pointerInput(Unit) { - detectTapGestures( - onTap = { - keyboardController?.hide() - }, - ) - } - .verticalScroll( - state = scrollState, - enabled = true, - ), - ) { - MifosMobileIcon(id = R.drawable.feature_auth_mifos_logo) - - MifosOutlinedTextField( - value = accountNumber, - onValueChange = { accountNumber = it }, - label = R.string.account_number, - supportingText = "", - ) - MifosOutlinedTextField( - value = username, - onValueChange = { username = it }, - label = R.string.username, - supportingText = "", - ) - MifosOutlinedTextField( - value = firstName, - onValueChange = { firstName = it }, - label = R.string.first_name, - supportingText = "", - ) - MifosOutlinedTextField( - value = lastName, - onValueChange = { lastName = it }, - label = R.string.last_name, - supportingText = "", - ) - - CountryCodePicker( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp), - shape = RoundedCornerShape(2.dp), - colors = OutlinedTextFieldDefaults.colors( - focusedBorderColor = MaterialTheme.colorScheme.primary, - ), - initialPhoneNumber = phoneNumber.text, - onValueChange = { (code, phone), _ -> - phoneNumber = TextFieldValue(phone) - countryCode = code - }, - label = { Text(stringResource(id = R.string.phone_number)) }, - keyboardActions = KeyboardActions { keyboardController?.hide() }, - ) - - MifosOutlinedTextField( - value = email, - onValueChange = { email = it }, - label = R.string.email, - supportingText = "", - ) - - MifosOutlinedTextField( - value = password, - onValueChange = { - password = it - onValueChangePassword = true - }, - label = R.string.password, - supportingText = "", - visualTransformation = if (passwordVisibility) { - VisualTransformation.None - } else { - PasswordVisualTransformation() - }, - trailingIcon = { - val image = if (passwordVisibility) { - MifosIcons.Visibility - } else { - MifosIcons.VisibilityOff - } - IconButton(onClick = { passwordVisibility = !passwordVisibility }) { - Icon(imageVector = image, null) - } - }, - keyboardType = KeyboardType.Password, - ) - - if (onValueChangePassword) { - LinearProgressIndicator( - progress = { progressIndicator }, - modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp), - color = when (progressIndicator) { - 0.25f -> Color.Red - 0.5f -> Color(alpha = 255, red = 220, green = 185, blue = 0) - 0.75f -> Color.Green - else -> Color.Blue - }, - trackColor = Color.White, - ) - } - - MifosOutlinedTextField( - value = confirmPassword, - onValueChange = { confirmPassword = it }, - label = R.string.confirm_password, - supportingText = "", - visualTransformation = if (confirmPasswordVisibility) { - VisualTransformation.None - } else { - PasswordVisualTransformation() - }, - trailingIcon = { - val image = if (confirmPasswordVisibility) { - MifosIcons.Visibility - } else { - MifosIcons.VisibilityOff - } - IconButton(onClick = { confirmPasswordVisibility = !confirmPasswordVisibility }) { - Icon(imageVector = image, null) - } - }, - keyboardType = KeyboardType.Password, - ) - - Row( - modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp), - verticalAlignment = Alignment.CenterVertically, - ) { - Text( - text = stringResource(id = R.string.verification_mode), - modifier = Modifier.padding(end = 8.dp), - color = MaterialTheme.colorScheme.onSurface, - ) - radioOptions.forEach { authMode -> - RadioButton( - selected = (authMode == authenticationMode), - onClick = { authenticationMode = authMode }, - ) - Text( - text = authMode, - color = MaterialTheme.colorScheme.onSurface, - ) - } - } - - MifosButton( - textResId = R.string.register, - onClick = { - val error = validateAllFields() - - if (error == "") { - register.invoke( - accountNumber.text, - username.text, - firstName.text, - lastName.text, - phoneNumber.text, - email.text, - password.text, - authenticationMode, - countryCode, - ) - } else { - coroutineScope.launch { - snackBarHostState.showSnackbar( - message = error, - actionLabel = "Ok", - duration = SnackbarDuration.Short, - ) - } - } - - keyboardController?.hide() - }, - modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp, top = 4.dp), - contentPadding = PaddingValues(12.dp), - colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.primary, - ), - ) - - Spacer(modifier = Modifier.imePadding()) - } -} - -private fun isInputFieldBlank(fieldText: String) = fieldText.trim().isEmpty() - -private fun isPhoneNumberValid(fieldText: String?): Boolean { - if (fieldText.isNullOrBlank()) { - return false - } - - val phoneNumberPattern = "^\\+?[0-9]{10,15}\$" - val regex = phoneNumberPattern.toRegex() - return regex.matches(fieldText.trim()) -} - -private fun isInputLengthInadequate(fieldText: String) = fieldText.trim().length < 6 - -private fun inputHasSpaces(fieldText: String) = fieldText.trim().contains(" ") - -private fun hasLeadingTrailingSpaces(fieldText: String) = fieldText.trim().length < fieldText.length - -private fun isEmailInvalid(emailText: String) = - !PatternsCompat.EMAIL_ADDRESS.matcher(emailText.trim()).matches() - -@Suppress("CyclomaticComplexMethod") -private fun areFieldsValidated( - context: Context, - accountNumberContent: String, - usernameContent: String, - firstNameContent: String, - lastNameContent: String, - phoneNumberContent: String, - emailContent: String, - passwordContent: String, - confirmPasswordContent: String, -): String { - with(context) { - return when { - isInputFieldBlank(accountNumberContent) -> { - getString( - R.string.error_validation_blank, - context.getString(R.string.account_number), - ) - } - - isInputFieldBlank(usernameContent) -> { - getString(R.string.error_validation_blank, context.getString(R.string.username)) - } - - isInputLengthInadequate(usernameContent) -> { - getString(R.string.error_username_greater_than_six) - } - - inputHasSpaces(usernameContent) -> { - getString( - R.string.error_validation_cannot_contain_spaces, - context.getString(R.string.username), - context.getString(R.string.not_contain_username), - ) - } - - isInputFieldBlank(firstNameContent) -> { - getString(R.string.error_validation_blank, context.getString(R.string.first_name)) - } - - isInputFieldBlank(lastNameContent) -> { - getString(R.string.error_validation_blank, context.getString(R.string.last_name)) - } - - !isPhoneNumberValid(phoneNumberContent) -> { - getString(R.string.invalid_phn_number) - } - - isInputFieldBlank(emailContent) -> { - getString(R.string.error_validation_blank, context.getString(R.string.email)) - } - - isInputFieldBlank(passwordContent) -> { - getString(R.string.error_validation_blank, context.getString(R.string.password)) - } - - hasLeadingTrailingSpaces(passwordContent) -> { - getString( - R.string.error_validation_cannot_contain_leading_or_trailing_spaces, - context.getString(R.string.password), - ) - } - - isEmailInvalid(emailContent) -> { - getString(context, R.string.error_invalid_email) - } - - isInputLengthInadequate(passwordContent) -> { - getString( - R.string.error_validation_minimum_chars, - context.getString(R.string.password), - context.resources.getInteger(R.integer.password_minimum_length), - ) - } - - passwordContent != confirmPasswordContent -> { - getString(R.string.error_password_not_match) - } - - else -> "" - } - } -} - -private fun updatePasswordStrengthView(password: String, context: Context): Float { - val str = PasswordStrength.calculateStrength(password) - return when (str.getText(context)) { - getString(context, R.string.password_strength_weak) -> 0.25f - getString(context, R.string.password_strength_medium) -> 0.5f - getString(context, R.string.password_strength_strong) -> 0.75f - else -> 1f - } -} - -internal class RegistrationScreenPreviewProvider : PreviewParameterProvider { - - override val values: Sequence - get() = sequenceOf( - RegistrationUiState.Loading, - RegistrationUiState.Error(1), - RegistrationUiState.Success, - RegistrationUiState.Initial, - ) -} - -@DevicePreviews -@Composable -private fun RegistrationScreenPreview( - @PreviewParameter(RegistrationScreenPreviewProvider::class) - registrationUiState: RegistrationUiState, -) { - MifosMobileTheme { - RegistrationScreen( - uiState = registrationUiState, - onVerified = {}, - navigateBack = {}, - register = { _, _, _, _, _, _, _, _, _ -> }, - ) - } -} diff --git a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/screens/RegistrationVerificationScreen.kt b/feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/screens/RegistrationVerificationScreen.kt deleted file mode 100644 index 3a01cc6b3..000000000 --- a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/screens/RegistrationVerificationScreen.kt +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.feature.auth.registration.screens - -import android.widget.Toast -import androidx.activity.compose.BackHandler -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.input.KeyboardType -import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import org.mifos.mobile.core.designsystem.components.MifosButton -import org.mifos.mobile.core.designsystem.components.MifosOutlinedTextField -import org.mifos.mobile.core.designsystem.components.MifosScaffold -import org.mifos.mobile.core.designsystem.components.MifosTextButton -import org.mifos.mobile.core.designsystem.icons.MifosIcons -import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme -import org.mifos.mobile.core.ui.component.MifosProgressIndicatorOverlay -import org.mifos.mobile.core.ui.utils.DevicePreviews -import org.mifos.mobile.feature.auth.R -import org.mifos.mobile.feature.auth.registration.viewmodel.RegistrationUiState -import org.mifos.mobile.feature.auth.registration.viewmodel.RegistrationViewModel - -@Composable -internal fun RegistrationVerificationScreen( - navigateBack: () -> Unit?, - onVerified: () -> Unit, - modifier: Modifier = Modifier, - viewModel: RegistrationViewModel = hiltViewModel(), -) { - val uiState by viewModel.registrationVerificationUiState.collectAsStateWithLifecycle() - var showConfirmationDialog by remember { mutableStateOf(false) } - - BackHandler(enabled = true) { - showConfirmationDialog = true - } - - if (showConfirmationDialog) { - AlertDialog( - onDismissRequest = { showConfirmationDialog = false }, - title = { Text(text = stringResource(R.string.dialog_cancel_registration_title)) }, - text = { - Text(text = stringResource(R.string.dialog_cancel_registration_message)) - }, - modifier = modifier, - confirmButton = { - MifosTextButton( - onClick = { - showConfirmationDialog = false - navigateBack.invoke() - }, - ) { - Text(text = stringResource(R.string.yes)) - } - }, - dismissButton = { - MifosTextButton( - onClick = { showConfirmationDialog = false }, - ) { - Text(text = stringResource(R.string.no)) - } - }, - ) - } - - RegistrationVerificationScreen( - uiState = uiState, - verifyUser = { token, id -> viewModel.verifyUser(token, id) }, - onVerified = onVerified, - navigateBack = { showConfirmationDialog = true }, - ) -} - -@Composable -private fun RegistrationVerificationScreen( - uiState: RegistrationUiState, - onVerified: () -> Unit, - navigateBack: () -> Unit, - verifyUser: (authenticationToken: String, requestID: String) -> Unit, - modifier: Modifier = Modifier, -) { - val context = LocalContext.current - - MifosScaffold( - topBarTitleResId = R.string.register, - navigateBack = navigateBack, - modifier = modifier, - content = { contentPadding -> - Box( - modifier = Modifier - .padding(contentPadding) - .fillMaxSize(), - ) { - RegistrationVerificationContent(verifyUser) - - when (uiState) { - is RegistrationUiState.Initial -> Unit - - is RegistrationUiState.Loading -> MifosProgressIndicatorOverlay() - - is RegistrationUiState.Error -> { - Toast.makeText(context, uiState.exception, Toast.LENGTH_SHORT).show() - } - - is RegistrationUiState.Success -> { - Toast.makeText( - context, - stringResource(R.string.verified), - Toast.LENGTH_SHORT, - ).show() - onVerified() - } - } - } - }, - ) -} - -@Composable -private fun RegistrationVerificationContent( - verifyUser: (authenticationToken: String, requestID: String) -> Unit, - modifier: Modifier = Modifier, -) { - var requestID by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue("")) - } - var authenticationToken by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue("")) - } - var requestIDError by remember { mutableStateOf(false) } - var authenticationTokenError by remember { mutableStateOf(false) } - - fun validateInput(): Boolean { - var temp = true - if (requestID.text.isEmpty()) { - requestIDError = true - temp = false - } - if (authenticationToken.text.isEmpty()) { - authenticationTokenError = true - temp = false - } - - return temp - } - - Column( - modifier = modifier.fillMaxSize(), - ) { - Image( - painter = painterResource(R.drawable.feature_auth_mifos_logo), - contentDescription = null, - contentScale = ContentScale.Fit, - alignment = Alignment.Center, - modifier = Modifier - .padding(16.dp) - .height(100.dp) - .fillMaxWidth(), - ) - - Spacer( - modifier = Modifier - .fillMaxWidth() - .height(80.dp), - ) - - MifosOutlinedTextField( - value = requestID, - onValueChange = { - requestID = it - requestIDError = false - }, - label = R.string.request_id, - supportingText = stringResource(R.string.empty_requestid), - error = requestIDError, - keyboardType = KeyboardType.Number, - trailingIcon = { - if (requestIDError) { - Icon(imageVector = MifosIcons.Error, contentDescription = null) - } - }, - ) - - MifosOutlinedTextField( - value = authenticationToken, - onValueChange = { - authenticationToken = it - authenticationTokenError = false - }, - label = R.string.authentication_token, - supportingText = stringResource(R.string.empty_authentication_token), - error = authenticationTokenError, - keyboardType = KeyboardType.Number, - trailingIcon = { - if (authenticationTokenError) { - Icon(imageVector = MifosIcons.Error, contentDescription = null) - } - }, - ) - - MifosButton( - textResId = R.string.verify, - onClick = { - if (validateInput()) { - verifyUser(authenticationToken.toString(), requestID.toString()) - } - }, - modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp, top = 12.dp), - contentPadding = PaddingValues(12.dp), - colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.primary, - ), - ) - } -} - -internal class RegistrationVerificationScreenPreviewProvider : - PreviewParameterProvider { - override val values: Sequence - get() = sequenceOf( - RegistrationUiState.Initial, - RegistrationUiState.Loading, - RegistrationUiState.Success, - RegistrationUiState.Error(R.string.register), - ) -} - -@DevicePreviews -@Composable -private fun RegistrationVerificationScreenPreview( - @PreviewParameter(RegistrationVerificationScreenPreviewProvider::class) - registrationUiState: RegistrationUiState, -) { - MifosMobileTheme { - RegistrationVerificationScreen( - uiState = registrationUiState, - verifyUser = { _, _ -> }, - onVerified = {}, - navigateBack = { }, - ) - } -} diff --git a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/utils/PasswordStrength.kt b/feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/utils/PasswordStrength.kt deleted file mode 100644 index 9fbcb10d1..000000000 --- a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/utils/PasswordStrength.kt +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.feature.auth.registration.utils - -import android.content.Context -import android.graphics.Color -import org.mifos.mobile.feature.auth.R - -enum class PasswordStrength(private val resId: Int, val color: Int) { - WEAK(R.string.password_strength_weak, Color.RED), - MEDIUM(R.string.password_strength_medium, Color.argb(255, 220, 185, 0)), - STRONG(R.string.password_strength_strong, Color.GREEN), - VERY_STRONG(R.string.password_strength_very_strong, Color.BLUE), - ; - - fun getText(ctx: Context?): CharSequence? = ctx?.getText(resId) - - companion object { - private const val REQUIRED_LENGTH = 8 - private const val MAXIMUM_LENGTH = 15 - private const val REQUIRE_SPECIAL_CHARACTERS = true - private const val REQUIRE_DIGITS = true - private const val REQUIRE_LOWER_CASE = true - private const val REQUIRE_UPPER_CASE = false - - fun calculateStrength(password: String): PasswordStrength { - val score = calculateScore(password) - return when { - score >= 3 -> VERY_STRONG - score == 2 -> STRONG - score == 1 -> MEDIUM - else -> WEAK - } - } - - @Suppress("ComplexCondition") - private fun calculateScore(password: String): Int { - if (password.length <= REQUIRED_LENGTH) return 0 - - var score = 0 - val (hasUpper, hasLower, hasDigit, hasSpecial) = password.fold( - BooleanArray(4), - ) { acc, char -> - when { - char.isUpperCase() -> acc[0] = true - char.isLowerCase() -> acc[1] = true - char.isDigit() -> acc[2] = true - !char.isLetterOrDigit() -> acc[3] = true - } - acc - } - - if (hasUpper) score++ - if (hasLower) score++ - if (hasDigit) score++ - if (hasSpecial) score++ - - if (REQUIRE_SPECIAL_CHARACTERS && !hasSpecial || - REQUIRE_UPPER_CASE && !hasUpper || - REQUIRE_LOWER_CASE && !hasLower || - REQUIRE_DIGITS && !hasDigit - ) { - score = 1 - } else { - score = 2 - if (password.length > MAXIMUM_LENGTH) { - score = 3 - } - } - - return score - } - } -} diff --git a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/viewmodel/RegistrationViewModel.kt b/feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/viewmodel/RegistrationViewModel.kt deleted file mode 100644 index a69dd5668..000000000 --- a/feature/auth/src/main/java/org/mifos/mobile/feature/auth/registration/viewmodel/RegistrationViewModel.kt +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.feature.auth.registration.viewmodel - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.launch -import org.mifos.mobile.core.data.repository.UserAuthRepository -import org.mifos.mobile.feature.auth.R -import javax.inject.Inject - -@HiltViewModel -internal class RegistrationViewModel @Inject constructor( - private val userAuthRepositoryImp: UserAuthRepository, -) : ViewModel() { - - private val _registrationUiState = - MutableStateFlow(RegistrationUiState.Initial) - val registrationUiState: StateFlow get() = _registrationUiState - - private val _registrationVerificationUiState = - MutableStateFlow(RegistrationUiState.Initial) - val registrationVerificationUiState: StateFlow get() = _registrationVerificationUiState - - fun registerUser( - accountNumber: String, - authenticationMode: String, - email: String, - firstName: String, - lastName: String, - countryCode: String, - mobileNumber: String, - password: String, - username: String, - ) { - viewModelScope.launch { - _registrationUiState.value = RegistrationUiState.Loading - userAuthRepositoryImp.registerUser( - accountNumber = accountNumber, - authenticationMode = authenticationMode, - email = email, - firstName = firstName, - lastName = lastName, - mobileNumber = countryCode + mobileNumber, - password = password, - username = username, - ).catch { - _registrationUiState.value = - RegistrationUiState.Error(R.string.could_not_register_user_error) - }.collect { - _registrationUiState.value = RegistrationUiState.Success - } - } - } - - fun verifyUser(authenticationToken: String?, requestId: String?) { - viewModelScope.launch { - _registrationVerificationUiState.value = RegistrationUiState.Loading - userAuthRepositoryImp.verifyUser(authenticationToken, requestId).catch { - _registrationVerificationUiState.value = - RegistrationUiState.Error(R.string.could_not_register_user_error) - }.collect { - _registrationVerificationUiState.value = - RegistrationUiState.Success - } - } - } -} - -internal sealed class RegistrationUiState { - data class Error(val exception: Int) : RegistrationUiState() - data object Success : RegistrationUiState() - data object Loading : RegistrationUiState() - data object Initial : RegistrationUiState() -} diff --git a/feature/auth/src/main/res/values/validations.xml b/feature/auth/src/main/res/values/validations.xml deleted file mode 100644 index cdebb2f54..000000000 --- a/feature/auth/src/main/res/values/validations.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - 5 - 6 - \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index c5553b7cd..78a3d9e35 100644 --- a/gradle.properties +++ b/gradle.properties @@ -46,4 +46,5 @@ kotlin.code.style=official # https://developer.android.com/build/releases/gradle-plugin#default-changes android.defaults.buildfeatures.resvalues=false android.defaults.buildfeatures.shaders=false -org.jetbrains.compose.experimental.jscanvas.enabled=true \ No newline at end of file +org.jetbrains.compose.experimental.jscanvas.enabled=true +kotlin.native.ignoreDisabledTargets=true \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4c7a9035c..da62b6b80 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -116,6 +116,7 @@ packageName = "MifosWallet" packageNamespace = "org.mifos.desktop" packageVersion = "1.0.0" roomCommonVersion = "2.6.1" +materialVersion = "1.10.0" [libraries] accompanist-pager = { group = "com.google.accompanist", name = "accompanist-pager", version.ref = "accompanistVersion" } @@ -316,6 +317,7 @@ moko-permission-compose = { group = "dev.icerock.moko", name = "permissions-comp window-size = { group = "dev.chrisbanes.material3", name = "material3-window-size-class-multiplatform", version.ref = "windowsSizeClass" } androidx-room-common = { group = "androidx.room", name = "room-common", version.ref = "roomCommonVersion" } +material = { group = "com.google.android.material", name = "material", version.ref = "materialVersion" } [bundles] androidx-compose-ui-test = [ diff --git a/settings.gradle.kts b/settings.gradle.kts index 577fabcef..31131f4e3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,14 @@ import org.ajoberstar.reckon.gradle.ReckonExtension +include(":mifos-shared") + + +include(":mifos-android") + + +include(":mifos-android") + + pluginManagement { includeBuild("build-logic") repositories { @@ -50,28 +59,28 @@ include(":core:network") include(":core:database") include(":core:datastore") include(":core:qrcode") -include(":core:testing") +//include(":core:testing") // Feature Modules -include(":feature:loan") -include(":feature:beneficiary") -include(":feature:savings") -include(":feature:guarantor") -include(":feature:qr") -include(":feature:transfer-process") -include(":feature:account") -include(":feature:recent-transaction") -include(":feature:client-charge") -include(":feature:third-party-transfer") -include(":feature:help") -include(":feature:notification") -include(":feature:location") -include(":feature:about") -include(":feature:settings") +//include(":feature:loan") +//include(":feature:beneficiary") +//include(":feature:savings") +//include(":feature:guarantor") +//include(":feature:qr") +//include(":feature:transfer-process") +//include(":feature:account") +//include(":feature:recent-transaction") +//include(":feature:client-charge") +//include(":feature:third-party-transfer") +//include(":feature:help") +//include(":feature:notification") +//include(":feature:location") +//include(":feature:about") +//include(":feature:settings") include(":feature:auth") -include(":feature:update-password") -include(":feature:home") -include(":feature:user-profile") +//include(":feature:update-password") +//include(":feature:home") +//include(":feature:user-profile") // Lint Modules //include(":lint") From 78a69d5a6d03f1c6d3cfa2dfe43aa4c1bc7d00a6 Mon Sep 17 00:00:00 2001 From: Nagarjuna Date: Wed, 29 Jan 2025 21:26:10 +0530 Subject: [PATCH 02/12] Refactor: refactored viewmodels --- .github/workflows/master_dev_ci.yml | 2 +- .run/mifospay-android.run.xml | 2 +- ci-prepush.sh | 2 - .../component/MifosBasicDialog.kt | 6 +- .../mobile/feature/auth/login/LoginScreen.kt | 14 +-- .../feature/auth/login/LoginViewModel.kt | 15 +++- .../RegistrationVerificationScreen.kt | 85 ++++++++++++------- .../RegistrationVerificationViewModel.kt | 23 +++-- gradle/libs.versions.toml | 1 - 9 files changed, 84 insertions(+), 66 deletions(-) diff --git a/.github/workflows/master_dev_ci.yml b/.github/workflows/master_dev_ci.yml index 78347eadb..c60d6093c 100644 --- a/.github/workflows/master_dev_ci.yml +++ b/.github/workflows/master_dev_ci.yml @@ -86,7 +86,7 @@ jobs: - name: Check Dependency Guard id: dependencyguard_verify continue-on-error: true - run: ./gradlew :mifos-android:dependencyGuard + run: ./gradlew dependencyGuard - name: Prevent updating Dependency Guard baselines if this is a fork id: checkfork_dependencyguard diff --git a/.run/mifospay-android.run.xml b/.run/mifospay-android.run.xml index 7517eb0f9..186e06fe7 100644 --- a/.run/mifospay-android.run.xml +++ b/.run/mifospay-android.run.xml @@ -1,5 +1,5 @@ - +

lY3eLT!zHBXz3-YVMh5-g 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 + + + ⚠️ You aren’t connected to the internet + diff --git a/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/MifosMobileSharedApp.kt b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/MifosMobileSharedApp.kt new file mode 100644 index 000000000..b535ca683 --- /dev/null +++ b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/MifosMobileSharedApp.kt @@ -0,0 +1,69 @@ +/* + * Copyright 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.shared + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.navigation.compose.rememberNavController +import org.koin.compose.koinInject +import org.koin.compose.viewmodel.koinViewModel +import org.mifos.mobile.core.data.util.NetworkMonitor +import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme +import org.mifos.mobile.shared.navigation.MifosNavGraph.AUTH_GRAPH +import org.mifos.mobile.shared.navigation.MifosNavGraph.PASSCODE_GRAPH +import org.mifos.mobile.shared.navigation.RootNavGraph + +@Composable +fun MifosMobileSharedApp( + modifier: Modifier = Modifier, + networkMonitor: NetworkMonitor = koinInject(), +) { + MifosApp(networkMonitor, modifier) +} + +@Composable +private fun MifosApp( + networkMonitor: NetworkMonitor, + modifier: Modifier = Modifier, + viewModel: MifosMobileViewModel = koinViewModel(), +) { + val uiState by viewModel.uiState.collectAsStateWithLifecycle() + val navController = rememberNavController() + + val navDestination = when (uiState) { + is MainUiState.Loading -> AUTH_GRAPH + is MainUiState.Success -> if ((uiState as MainUiState.Success).userData.isAuthenticated) { + PASSCODE_GRAPH + } else { + AUTH_GRAPH + } + + else -> AUTH_GRAPH + } + + MifosMobileTheme { + RootNavGraph( + navHostController = navController, + startDestination = navDestination, + networkMonitor = networkMonitor, + modifier = modifier, + onClickLogout = { + viewModel.logOut() + navController.navigate(AUTH_GRAPH) { + popUpTo(navController.graph.id) { + inclusive = true + } + } + }, + ) + } +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/MifosMobileViewModel.kt similarity index 54% rename from androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt rename to cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/MifosMobileViewModel.kt index fdfc7e533..3686deb23 100644 --- a/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt +++ b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/MifosMobileViewModel.kt @@ -1,5 +1,5 @@ /* - * Copyright 2024 Mifos Initiative + * Copyright 2025 Mifos Initiative * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this @@ -7,44 +7,46 @@ * * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md */ -package org.mifos.mobile +package org.mifos.mobile.shared import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch -import org.mifos.library.passcode.data.PasscodeManager import org.mifos.mobile.core.data.repository.UserDataRepository import org.mifos.mobile.core.model.UserData -import javax.inject.Inject +import org.mifospay.core.common.DataState -@HiltViewModel -class HomeActivityViewModel @Inject constructor( +class MifosMobileViewModel( private val userDataRepository: UserDataRepository, - private val passcodeManager: PasscodeManager, +// private val passcodeManager: PasscodeManager, ) : ViewModel() { - val uiState: StateFlow = userDataRepository.userData.map { - HomeActivityUiState.Success(it) + val uiState: StateFlow = userDataRepository.userData.map { dataState -> + when (dataState) { + is DataState.Success -> MainUiState.Success(dataState.data) + is DataState.Error -> MainUiState.Error(dataState.exception.message ?: "Unknown error") + DataState.Loading -> MainUiState.Loading + } }.stateIn( scope = viewModelScope, - initialValue = HomeActivityUiState.Loading, + initialValue = MainUiState.Loading, started = SharingStarted.WhileSubscribed(5_000), ) fun logOut() { viewModelScope.launch { userDataRepository.logOut() - passcodeManager.clearPasscode() +// passcodeManager.clearPasscode() } } } -sealed interface HomeActivityUiState { - data object Loading : HomeActivityUiState - data class Success(val userData: UserData) : HomeActivityUiState +sealed interface MainUiState { + data object Loading : MainUiState + data class Error(val error: String) : MainUiState + data class Success(val userData: UserData) : MainUiState } diff --git a/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/KoinModules.kt b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/KoinModules.kt new file mode 100644 index 000000000..d6f4d4a79 --- /dev/null +++ b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/KoinModules.kt @@ -0,0 +1,68 @@ +/* + * Copyright 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.shared.di + +import org.koin.core.context.startKoin +import org.koin.core.module.dsl.viewModelOf +import org.koin.dsl.KoinAppDeclaration +import org.koin.dsl.koinApplication +import org.koin.dsl.module +import org.mifos.mobile.core.common.di.DispatchersModule +import org.mifos.mobile.core.data.di.RepositoryModule +import org.mifos.mobile.core.datastore.di.PreferencesModule +import org.mifos.mobile.core.network.di.NetworkModule +import org.mifos.mobile.feature.auth.di.AuthModule +import org.mifos.mobile.shared.MifosMobileViewModel + +object KoinModules { + private val commonModules = module { + includes(DispatchersModule) + } + private val dataModules = module { + includes(RepositoryModule) + } + private val coreDataStoreModules = module { + includes(PreferencesModule) + } + private val networkModules = module { + includes(NetworkModule) + } + private val sharedModule = module { + viewModelOf(::MifosMobileViewModel) + } + private val featureModules = module { + includes( + AuthModule, + ) + } +// private val LibraryModule = module { +// includes(PasscodeModule) +// } + + val allModules = listOf( + commonModules, + dataModules, + coreDataStoreModules, + networkModules, + featureModules, + sharedModule, + ) +} + +fun koinConfiguration() = koinApplication { + modules(KoinModules.allModules) +} + +fun initKoin(config: KoinAppDeclaration? = null) { + startKoin { + config?.invoke(this) + modules(KoinModules.allModules) + } +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavGraph.kt b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/MifosNavGraph.kt similarity index 92% rename from androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavGraph.kt rename to cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/MifosNavGraph.kt index b20112e4b..66ddd615c 100644 --- a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavGraph.kt +++ b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/MifosNavGraph.kt @@ -7,7 +7,7 @@ * * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md */ -package org.mifos.mobile.navigation +package org.mifos.mobile.shared.navigation internal object MifosNavGraph { const val ROOT_GRAPH = "root_graph" diff --git a/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/MifosNavHost.kt b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/MifosNavHost.kt new file mode 100644 index 000000000..bdd71d491 --- /dev/null +++ b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/MifosNavHost.kt @@ -0,0 +1,275 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.shared.navigation + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import org.mifos.mobile.shared.ui.MifosMobileState + +// import androidx.compose.ui.Modifier +// import androidx.navigation.NavHostController +// import androidx.navigation.compose.NavHost +// import androidx.navigation.compose.rememberNavController +// import org.mifos.mobile.core.common.Constants.TRANSFER_PAY_TO +// import org.mifos.mobile.core.model.enums.AccountType +// import org.mifos.mobile.core.model.enums.ChargeType +// import org.mifos.mobile.feature.about.navigation.aboutUsNavGraph +// import org.mifos.mobile.feature.about.navigation.navigateToAboutUsScreen +// import org.mifos.mobile.feature.account.navigation.clientAccountsNavGraph +// import org.mifos.mobile.feature.account.navigation.navigateToClientAccountsScreen +// import org.mifos.mobile.feature.auth.navigation.navigateToLoginScreen +// import org.mifos.mobile.feature.beneficiary.navigation.beneficiaryNavGraph +// import org.mifos.mobile.feature.beneficiary.navigation.navigateToAddBeneficiaryScreen +// import org.mifos.mobile.feature.beneficiary.navigation.navigateToBeneficiaryApplicationScreen +// import org.mifos.mobile.feature.beneficiary.navigation.navigateToBeneficiaryListScreen +// import org.mifos.mobile.feature.charge.navigation.clientChargeNavGraph +// import org.mifos.mobile.feature.charge.navigation.navigateToClientChargeScreen +// import org.mifos.mobile.feature.guarantor.navigation.guarantorNavGraph +// import org.mifos.mobile.feature.guarantor.navigation.navigateToGuarantorScreen +// import org.mifos.mobile.feature.help.navigation.helpNavGraph +// import org.mifos.mobile.feature.help.navigation.navigateToHelpScreen +// import org.mifos.mobile.feature.home.navigation.HomeDestinations +// import org.mifos.mobile.feature.home.navigation.HomeNavigation +// import org.mifos.mobile.feature.home.navigation.homeNavGraph +// import org.mifos.mobile.feature.loan.navigation.loanNavGraph +// import org.mifos.mobile.feature.loan.navigation.navigateToLoanApplication +// import org.mifos.mobile.feature.loan.navigation.navigateToLoanDetailScreen +// import org.mifos.mobile.feature.location.navigation.locationsNavGraph +// import org.mifos.mobile.feature.location.navigation.navigateToLocationsScreen +// import org.mifos.mobile.feature.notification.navigation.navigateToNotificationScreen +// import org.mifos.mobile.feature.notification.navigation.notificationNavGraph +// import org.mifos.mobile.feature.qr.navigation.navigateToQrDisplayScreen +// import org.mifos.mobile.feature.qr.navigation.navigateToQrImportScreen +// import org.mifos.mobile.feature.qr.navigation.navigateToQrReaderScreen +// import org.mifos.mobile.feature.qr.navigation.qrNavGraph +// import org.mifos.mobile.feature.savings.navigation.navigateToSavingsApplicationScreen +// import org.mifos.mobile.feature.savings.navigation.navigateToSavingsDetailScreen +// import org.mifos.mobile.feature.savings.navigation.navigateToSavingsMakeTransfer +// import org.mifos.mobile.feature.savings.navigation.savingsNavGraph +// import org.mifos.mobile.feature.settings.navigation.navigateToSettings +// import org.mifos.mobile.feature.settings.navigation.settingsNavGraph +// import org.mifos.mobile.feature.third.party.transfer.navigation.navigateToThirdPartyTransfer +// import org.mifos.mobile.feature.third.party.transfer.navigation.thirdPartyTransferNavGraph +// import org.mifos.mobile.feature.transaction.navigation.navigateToRecentTransaction +// import org.mifos.mobile.feature.transaction.navigation.recentTransactionNavGraph +// import org.mifos.mobile.feature.transfer.process.navigation.navigateToTransferProcessScreen +// import org.mifos.mobile.feature.transfer.process.navigation.transferProcessNavGraph +// import org.mifos.mobile.feature.update.password.navigation.navigateToUpdatePassword +// import org.mifos.mobile.feature.update.password.navigation.updatePasswordNavGraph +// import org.mifos.mobile.feature.user.profile.navigation.navigateToUserProfile +// import org.mifos.mobile.feature.user.profile.navigation.userProfileNavGraph +// import org.mifos.mobile.shared.ui.MifosMobileState + +@Composable +fun MifosNavHost( + appState: MifosMobileState, + onClickLogout: () -> Unit, + modifier: Modifier = Modifier, +) {} +// val navController = appState.navController + +// NavHost( +// navController = navController, +// route = MifosNavGraph.MAIN_GRAPH, +// startDestination = HomeNavigation.HomeBase.route, +// modifier = modifier, +// ) { +// homeNavGraph( +// onNavigate = { handleHomeNavigation(navController, it, onClickLogout, context) }, +// callHelpline = { callHelpline(context) }, +// mailHelpline = { mailHelpline(context) }, +// ) + +// guarantorNavGraph(navController = navController) + +// loanNavGraph( +// navController = navController, +// viewQr = navController::navigateToQrDisplayScreen, +// viewGuarantor = navController::navigateToGuarantorScreen, +// viewCharges = navController::navigateToClientChargeScreen, +// makePayment = navController::navigateToSavingsMakeTransfer, +// ) + +// userProfileNavGraph( +// navigateBack = navController::popBackStack, +// navigateToChangePassword = navController::navigateToUpdatePassword, +// ) + +// updatePasswordNavGraph(navigateBack = navController::popBackStack) + +// thirdPartyTransferNavGraph( +// navigateBack = navController::popBackStack, +// addBeneficiary = navController::navigateToAddBeneficiaryScreen, +// reviewTransfer = navController::navigateToTransferProcessScreen, +// ) + +// settingsNavGraph( +// navigateBack = navController::popBackStack, +// changePassword = navController::navigateToUpdatePassword, +// changePasscode = {}, +// navigateToLoginScreen = navController::navigateToLoginScreen, +// languageChanged = { startActivity(context, HomeActivity::class.java) }, +// ) + +// recentTransactionNavGraph(navigateBack = navController::popBackStack) + +// notificationNavGraph(navigateBack = navController::popBackStack) + +// locationsNavGraph() + +// helpNavGraph( +// findLocations = navController::navigateToLocationsScreen, +// navigateBack = navController::popBackStack, +// callHelpline = { callHelpline(context) }, +// mailHelpline = { mailHelpline(context) }, +// ) + +// clientChargeNavGraph(navigateBack = navController::popBackStack) + +// aboutUsNavGraph( +// navController = navController, +// navigateToOssLicense = { +// context.startActivity(Intent(context, OssLicensesMenuActivity::class.java)) +// }, +// ) + +// transferProcessNavGraph(navigateBack = navController::popBackStack) + +// beneficiaryNavGraph( +// navController = navController, +// openQrImportScreen = navController::navigateToQrImportScreen, +// openQrReaderScreen = navController::navigateToQrReaderScreen, +// ) + +// qrNavGraph( +// navController = navController, +// openBeneficiaryApplication = navController::navigateToBeneficiaryApplicationScreen, +// ) + +// savingsNavGraph( +// navController = navController, +// viewCharges = navController::navigateToClientChargeScreen, +// viewQrCode = navController::navigateToQrDisplayScreen, +// callHelpline = { callHelpline(context) }, +// reviewTransfer = navController::navigateToTransferProcessScreen, +// ) + +// clientAccountsNavGraph( +// navController = navController, +// navigateToLoanApplicationScreen = navController::navigateToLoanApplication, +// navigateToSavingsApplicationScreen = navController::navigateToSavingsApplicationScreen, +// navigateToAccountDetail = { accountType, id -> +// when (accountType) { +// AccountType.SAVINGS -> navController.navigateToSavingsDetailScreen(savingsId = id) +// AccountType.LOAN -> navController.navigateToLoanDetailScreen(loanId = id) +// AccountType.SHARE -> {} +// } +// }, +// ) +// } +// } + +// fun handleHomeNavigation( +// navController: NavHostController, +// homeDestinations: HomeDestinations, +// onClickLogout: () -> Unit, +// context: Context, +// ) { +// when (homeDestinations) { +// HomeDestinations.HOME -> Unit +// HomeDestinations.ACCOUNTS -> navController.navigateToClientAccountsScreen() +// HomeDestinations.LOAN_ACCOUNT -> { +// navController.navigateToClientAccountsScreen(accountType = AccountType.LOAN) +// } +// +// HomeDestinations.SAVINGS_ACCOUNT -> { +// navController.navigateToClientAccountsScreen(accountType = AccountType.SAVINGS) +// } +// +// HomeDestinations.RECENT_TRANSACTIONS -> navController.navigateToRecentTransaction() +// HomeDestinations.CHARGES -> navController.navigateToClientChargeScreen(ChargeType.CLIENT) +// HomeDestinations.THIRD_PARTY_TRANSFER -> navController.navigateToThirdPartyTransfer() +// HomeDestinations.SETTINGS -> navController.navigateToSettings() +// HomeDestinations.ABOUT_US -> navController.navigateToAboutUsScreen() +// HomeDestinations.HELP -> navController.navigateToHelpScreen() +// HomeDestinations.SHARE -> { +// shareApp(context) +// } +// +// HomeDestinations.APP_INFO -> { +// openAppInfo(context) +// } +// +// HomeDestinations.LOGOUT -> onClickLogout.invoke() +// HomeDestinations.TRANSFER -> navController.navigateToSavingsMakeTransfer( +// accountId = 1, +// transferType = TRANSFER_PAY_TO, +// ) +// +// HomeDestinations.BENEFICIARIES -> navController.navigateToBeneficiaryListScreen() +// HomeDestinations.SURVEY -> Unit +// HomeDestinations.NOTIFICATIONS -> navController.navigateToNotificationScreen() +// HomeDestinations.PROFILE -> navController.navigateToUserProfile() +// } +// } + +// fun startActivity(context: Context, clazz: Class) { +// context.startActivity(Intent(context, clazz)) +// } + +// private fun callHelpline(context: Context) { +// val intent = Intent(Intent.ACTION_DIAL) +// intent.data = +// Uri.parse("tel:" + context.getString(org.mifos.mobile.feature.home.R.string.help_line_number)) +// context.startActivity(intent) +// } + +// private fun mailHelpline(context: Context) { +// val intent = Intent(Intent.ACTION_SENDTO).apply { +// data = Uri.parse("mailto:") +// putExtra( +// Intent.EXTRA_EMAIL, +// arrayOf(context.getString(org.mifos.mobile.feature.home.R.string.contact_email)), +// ) +// putExtra( +// Intent.EXTRA_SUBJECT, +// context.getString(org.mifos.mobile.feature.home.R.string.user_query), +// ) +// } +// try { +// context.startActivity(intent) +// } catch (e: Exception) { +// Toast.makeText( +// context, +// context.getString(org.mifos.mobile.feature.home.R.string.no_app_to_support_action), +// Toast.LENGTH_SHORT, +// ).show() +// } +// } + +// private fun openAppInfo(context: Context) { +// val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { +// data = Uri.parse("package:${context.packageName}") +// } +// context.startActivity(intent) +// } + +// private fun shareApp(context: Context) { +// val shareText = context.getString( +// R.string.playstore_link, +// context.getString(R.string.share_msg), +// context.packageName, +// ) +// val intent = Intent(Intent.ACTION_SEND).apply { +// type = "text/plain" +// putExtra(Intent.EXTRA_TEXT, shareText) +// } +// context.startActivity(Intent.createChooser(intent, context.getString(R.string.choose))) +// } diff --git a/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/PasscodeNavGraph.kt b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/PasscodeNavGraph.kt new file mode 100644 index 000000000..15c600c1f --- /dev/null +++ b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/PasscodeNavGraph.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.shared.navigation + +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavHostController +import androidx.navigation.navigation +// import org.mifos.library.passcode.PASSCODE_SCREEN +// import org.mifos.library.passcode.passcodeRoute + +internal fun NavGraphBuilder.passcodeNavGraph(navController: NavHostController) { +// navigation( +// route = MifosNavGraph.PASSCODE_GRAPH, +// startDestination = PASSCODE_SCREEN, +// ) { +// passcodeRoute( +// onForgotButton = { +// navController.popBackStack() +// navController.navigate(MifosNavGraph.MAIN_GRAPH) +// }, +// onSkipButton = { +// navController.popBackStack() +// navController.navigate(MifosNavGraph.MAIN_GRAPH) +// }, +// onPasscodeConfirm = { +// navController.popBackStack() +// navController.navigate(MifosNavGraph.MAIN_GRAPH) +// }, +// onPasscodeRejected = { +// navController.popBackStack() +// navController.navigate(MifosNavGraph.MAIN_GRAPH) +// }, +// ) +// } +} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/RootNavGraph.kt similarity index 73% rename from androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt rename to cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/RootNavGraph.kt index cc8d007da..9fe911a1d 100644 --- a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt +++ b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/RootNavGraph.kt @@ -7,22 +7,22 @@ * * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md */ -package org.mifos.mobile.navigation +package org.mifos.mobile.shared.navigation import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable -import org.mifos.library.passcode.navigateToPasscodeScreen +import org.mifos.mobile.core.data.util.NetworkMonitor import org.mifos.mobile.feature.auth.navigation.authenticationNavGraph -import org.mifos.mobile.navigation.MifosNavGraph.AUTH_GRAPH -import org.mifos.mobile.ui.MifosApp -import org.mifos.mobile.ui.MifosMobileState +import org.mifos.mobile.shared.navigation.MifosNavGraph.AUTH_GRAPH +import org.mifos.mobile.shared.ui.MifosApp @Composable internal fun RootNavGraph( - appState: MifosMobileState, +// appState: MifosMobileState, + networkMonitor: NetworkMonitor, navHostController: NavHostController, startDestination: String, onClickLogout: () -> Unit, @@ -37,14 +37,15 @@ internal fun RootNavGraph( authenticationNavGraph( navController = navHostController, route = AUTH_GRAPH, - navigateToPasscodeScreen = navHostController::navigateToPasscodeScreen, +// navigateToPasscodeScreen = navHostController::navigateToPasscodeScreen, + navigateToPasscodeScreen = { }, ) passcodeNavGraph(navHostController) composable(MifosNavGraph.MAIN_GRAPH) { MifosApp( - appState = appState, + networkMonitor = networkMonitor, onClickLogout = onClickLogout, ) } diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosApp.kt b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/ui/MifosMobileApp.kt similarity index 81% rename from androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosApp.kt rename to cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/ui/MifosMobileApp.kt index c8a46c215..8ead7f675 100644 --- a/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosApp.kt +++ b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/ui/MifosMobileApp.kt @@ -7,7 +7,7 @@ * * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md */ -package org.mifos.mobile.ui +package org.mifos.mobile.shared.ui import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.WindowInsets @@ -27,31 +27,31 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.lifecycle.compose.collectAsStateWithLifecycle -import org.mifos.mobile.R +import org.mifos.mobile.core.data.util.NetworkMonitor import org.mifos.mobile.core.designsystem.theme.MifosBackground -import org.mifos.mobile.navigation.MifosNavHost +import org.mifos.mobile.shared.navigation.MifosNavHost -@OptIn(ExperimentalComposeUiApi::class) @Composable fun MifosApp( - appState: MifosMobileState, + networkMonitor: NetworkMonitor, onClickLogout: () -> Unit, modifier: Modifier = Modifier, ) { MifosBackground(modifier) { val snackbarHostState = remember { SnackbarHostState() } + val appState = rememberMifosMobileState( + networkMonitor = networkMonitor, + ) + val isOffline by appState.isOffline.collectAsStateWithLifecycle() - // If user is not connected to the internet show a snack bar to inform them. - val notConnectedMessage = stringResource(R.string.not_connected) + // If user is not connected stringResource the internet show a snack bar to inform them. +// val notConnectedMessage = (Res.string.not_connected) + val notConnectedMessage = "you have lost network connection" LaunchedEffect(isOffline) { if (isOffline) { snackbarHostState.showSnackbar( @@ -62,9 +62,7 @@ fun MifosApp( } Scaffold( - modifier = Modifier.semantics { - testTagsAsResourceId = true - }, + modifier = Modifier, containerColor = Color.Transparent, contentColor = MaterialTheme.colorScheme.onBackground, snackbarHost = { SnackbarHost(snackbarHostState) }, @@ -81,6 +79,7 @@ fun MifosApp( ), ) { MifosNavHost( + appState = appState, onClickLogout = onClickLogout, modifier = Modifier, ) diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosMobileState.kt b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/ui/MifosMobileState.kt similarity index 95% rename from androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosMobileState.kt rename to cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/ui/MifosMobileState.kt index b24792113..6bdc66889 100644 --- a/androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosMobileState.kt +++ b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/ui/MifosMobileState.kt @@ -7,7 +7,7 @@ * * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md */ -package org.mifos.mobile.ui +package org.mifos.mobile.shared.ui import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable @@ -21,7 +21,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn -import org.mifos.mobile.core.data.utils.NetworkMonitor +import org.mifos.mobile.core.data.util.NetworkMonitor @Composable fun rememberMifosMobileState( diff --git a/cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt b/cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt new file mode 100644 index 000000000..c8f153714 --- /dev/null +++ b/cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.shared + +import androidx.compose.ui.window.ComposeUIViewController +import org.mifos.mobile.shared.di.initKoin + +@Suppress("ktlint:standard:function-naming") +fun MainViewController() = ComposeUIViewController( + configure = { + initKoin() + }, +) { + MifosMobileSharedApp() +} diff --git a/cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt b/cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt new file mode 100644 index 000000000..ad2e067a7 --- /dev/null +++ b/cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.shared.di + +import org.koin.core.module.Module + +actual val platformModule: Module + get() = TODO("Not yet implemented") diff --git a/cmp-shared/src/nativeMain/kotlin/org/mifos/mobile/shared/MifosViewController.kt b/cmp-shared/src/nativeMain/kotlin/org/mifos/mobile/shared/MifosViewController.kt new file mode 100644 index 000000000..2736ebc0f --- /dev/null +++ b/cmp-shared/src/nativeMain/kotlin/org/mifos/mobile/shared/MifosViewController.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package org.mifos.mobile.shared + +import androidx.compose.ui.window.ComposeUIViewController +import org.mifos.mobile.shared.di.initKoin + +@Suppress("ktlint:standard:function-naming") +fun MifosViewController() = ComposeUIViewController( + configure = { + initKoin() + }, +) { + MifosMobileSharedApp() +} diff --git a/cmp-web/.gitignore b/cmp-web/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/cmp-web/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/cmp-web/build.gradle.kts b/cmp-web/build.gradle.kts new file mode 100644 index 000000000..854e324f8 --- /dev/null +++ b/cmp-web/build.gradle.kts @@ -0,0 +1,65 @@ +import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl + +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.jetbrainsCompose) + alias(libs.plugins.compose.compiler) +} + +kotlin { + js(IR) { + moduleName = "mifos-web" + browser { + commonWebpackConfig { + outputFileName = "mifos-web.js" + } + } + binaries.executable() + } + + @OptIn(ExperimentalWasmDsl::class) + wasmJs { + moduleName = "mifos-wasm" + browser { + commonWebpackConfig { + outputFileName = "mifos-wasm.js" + } + } + binaries.executable() + } + + applyDefaultHierarchyTemplate() + + sourceSets { + val jsWasmMain by creating { + dependsOn(commonMain.get()) + dependencies { + implementation(projects.cmpShared) + implementation(projects.core.common) + implementation(projects.core.data) + implementation(projects.core.model) + implementation(projects.core.datastore) + + implementation(compose.runtime) + implementation(compose.ui) + implementation(compose.foundation) + implementation(compose.material3) + implementation(compose.components.resources) + + implementation(libs.multiplatform.settings) + implementation(libs.multiplatform.settings.serialization) + implementation(libs.multiplatform.settings.coroutines) + + + } + } + + jsMain.get().dependsOn(jsWasmMain) + wasmJsMain.get().dependsOn(jsWasmMain) + } +} + +compose.resources { + publicResClass = true + generateResClass = always +} \ No newline at end of file diff --git a/cmp-web/proguard-rules.pro b/cmp-web/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/cmp-web/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/cmp-web/src/jsMain/kotlin/Application.kt b/cmp-web/src/jsMain/kotlin/Application.kt new file mode 100644 index 000000000..4bc76dbbf --- /dev/null +++ b/cmp-web/src/jsMain/kotlin/Application.kt @@ -0,0 +1,17 @@ +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.window.ComposeViewport +import kotlinx.browser.document +import org.jetbrains.skiko.wasm.onWasmReady +import org.mifos.mobile.shared.MifosMobileSharedApp +import org.mifos.mobile.shared.di.initKoin + +@OptIn(ExperimentalComposeUiApi::class) +fun main() { + initKoin() + + onWasmReady { + ComposeViewport(document.body!!) { + MifosMobileSharedApp() + } + } +} \ No newline at end of file diff --git a/cmp-web/src/jsMain/resources/favicon.ico b/cmp-web/src/jsMain/resources/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4c553d4387032bbb8b7fed5481b085812383854c GIT binary patch literal 40718 zcmcFq^LHgp6TZR5w(V@pjh)TLwl=nH8ynl&*mkn9ZQHuZjlaBq#5Z$hy3Uzjs(ZSs zo~n8p008^C|GU5dBmhtj0D$!+M<~ciBEsRpeTj%tKgE>(`}*Gl1NAlNIF^|L0R8|e zF<}+=wF_N0ca?w3zQ@g%9jmg}!9pipr}n5^ZqVrSO^G7iYF>zwm7xF z)CM#6;w`1cGx#w_my9Vi(NJc|f7VhBLXk=UST5KCmR)Z6;;`Bidl@Ah-hXR!%8-^|IQuNGcE{vUe$0vsGeonD8iZ<=hK}a7e+eV#a>qY} z4`FK@gXg*X#eeialW7fVpV2>AF)tuk)eF%0<_WNSgiFB8PQ5+yMN8p^=sEltaX2KI zObJ|5;D7PFBe55;&if6CGLQo(#$Zi0++`?(Q7Kqa4@^d^us=Ro2Mzr!^wL%K^>)yf z^45qea-X;&5c!#6Stg~ZD~Dv2Pob&4LBfoRl7k`wuwOswi~Th91La4v1O?zm3v<9y zJm}A)$t@E1DgH*(N&M{*k3s&}bwZo=|!?beYMYJKeEnpM94A=%TZ1R>F%cs_1l| z@ifv@(L5#Z7aXPuz)2;<#0_jQ5Su+kz zbyz@3_XQdHo;KE7d`W?^apr$u!8lgnA<>MY&2(j&A^R&Fj#|ajA0NzONBG`Ke-v-i z9V76eC)KT>k$i2IH`Ma---UK;cRF3SPLoWnCZoEbkD}GNrRIW*GX)@OQ+|68?oUB+ zbx+z*OG;hWMwrTiVxGQ(^hLq^ZS8Bjx7s&gp=klfTBK|@xXctcH|Giqc(@@iP4Nw_ zKpn1#Z++Z(~HkN5P#53I*dQtN_me@ z2Uw9bA52Eo&%`07pdlb6TUQL+90n!KiG}CcF`gq06bQG~yyG&lHjy-=A~W(4{VXS) zT0V7J+|^uaj|L)z7L!r=GfI^Q27B8pZ_q^y&>50(n;XL3{BqYfCXU3 z1JtjdO*dRk&3WZ*NbU@%(JX<>N)Fpcng-FrOUWz2Yog(}U{7EessSW0GYEvr-8|oF zh;IuR3dEtin=O`{Yc^byL>6_jPrcPY=C0W-!ckl@_kHCWiupX$a@nw$s&&g#nymXk zNp&P%2H9v45(X^VLNI;k+JYCnK8Fz0IvjT?xk&N^ZL}^^5r5Prx4=7>;R7u2ci2~d zqhIKgG()aPGb2F6VF(1`-`k4mwt^v7eh9v8ue|PeSELE{)j-PKjM^w;mX|Qs+Ok1G zLUPV(B^X5dxtRCIyP08jF52sDI~k%^;$#RIr#_8Ff+tcKI!NKW+v6k|LP!ES+6oPs z=_C!0CRv)uhu~dAUX@`qLZk6$FznE8U2`!gbDx-U8Qdk=jS}m^d39-{}f2liWn~X^G(w>*~ zIm(5Dg%n(>j+X88^G}1S4MR;XWX_xbmEEvq%|5BjON!?r+Qc?ztz%g5XtFgPRNF3` zBVhF@W&W1-t!iO=YSLcXRC-!1lAkGgW+w9hEDdp`s`t0c_7E6PP~Nd z&vi>V!Y`0rc7k&tK!`zbv&Fq~cC%b1wu{$r(QSS3rWhLRz#>E2{XMmieWhE@`FNZ_ z<+1_k&z7z=dCV)IR*J^5@pGcOp|cBTTDtQWaJchhRtwjn}A};Aw<5@bYbDp_C z1)#IHjJ_M$>P%tILucRmiGLKdw6;hUMzageH|e{Ik5fbbgxSq*5Wrwh zcGBW8NmKK&GPR`J$+`Fmi3zF{Nur$EBlSt)m*P@6*(7D3>wX;QDsuO+VS6<9#Y%HM zre4@9?q|!k?`NHlw5OL?Yvr8WQ-(OY$SjQQ7{6|-J+P2ES@JCIm0ps1jK)G~-4VhQ z^mt}IKdUXG%0!4Kcp-f^nznOPC@|y(q_=lIOIs;=Yk0;x59EheM7j0d9kw=q+W}fU zHZF_HMY~qO3UgzbIaZCiJhYx|__AHu#Imc`d*P-*$^69Yk?#96m4K&+OTF8SG?WVB!jCQv8c_TAB#m-qQ`d2VPtRm0UUZRG-h#gzSG>yBm*t1*v(q z=-{y!FJCpL`U~Y}EabTlzb!Og`PHa;-@i3=nMGe-pY>^`g^P1ku=qR&)kWZv`};r) zFxz_`jk-61V(dR#yBqdo9JbxC5rrs3C}y*6W&!d&<5Pt0kJSIV(VjQJ*c1+!BswSO zPxM!z665MiE)usm%!ia@Nqyx}LCh_%o?iw=0?Y;qjj`jEuvoVD@R#`ZOwY~B^ zUc^@{f6lf3u|Y`Mz0(^WZiaUgs-*san$lYF7k6Qm`^ZO{KT<6y>c%9tw!BcV-2+9W zskZG|SSI!LsEtyPq7qXJ68!mWsn%j|Jb8iyfA+12W7jnvad$Ncm--_Aiqs?O3fQ~=Bde??p_$k5`%mMwoWH=4b=$5Xsfn1hC*yO5RRa?s+^ z;Yn{-3tLY2p+7P-`F-7ZyY=%W8wTbJVUZ2|`MB#H{HXEPAma3`Zw{`LXwYU4TDw$OVVb>0msXW}m&nhx7An z=oh3h2@)J`hQ3Q4&6{p*+~gv0@0w?gHWidM94}%6e_U&dE564OJfML8LgC+c;_0Hs zfD2*?T~1XCh<9SC3nPE(e7d{VRyy+PUSo=5#W}YJ7ut)+ImGa7-A@x3-|jX*@MW;w zI`!1n#*bVtH^^%J`BH4MxzKJtzS1S>?k~boN2cWW)*?Hu-|4#fSrRKxG@;vgh6)fe zDgydv?|<1ftA>F3)j z(6ISn4E7W!GZVDV5rjvg2=^P4xngg#+`t?yN`Z%q7-w}S4bunq_KEgl+90h zW2k@!i@j6=X_M3W!{3S;(!;c2y(fM@mF#RiTDpeQ(yOsfL|*z31BvIHc-)p;Q<0hoQ1KhGOEIhYOffe;X)4SVNpLoL9*(q95?x1AS8S=iN{kkKsP zZARiydjk-D(OQzzWl@nFkMnFSZ71BCBzsREab7Bg^snXfLEw=;%p?PM$7`|U6RW#?%&C-K8`rEc&V~`oTgNb^mTOJ=g!W0Z3I?-zE+sEPbwKDOx_+Q zjW0m=6lE+xB%lD+*3b-HLS> z4XUj*RgDH9sU!s>6lsdZi~99-4WKy+GQsm}oy>Huy;P(Q{V z*JqiQh0f+@ZQ4qT=7D9#>V=G^CpJGiJbCnzX|-HTw)#RsIwV+$*R*cXGZDFeSV`ln ziFH?JM4{pi*t_j$ys6DG?JgqQ&~Y;gJ69p_RG%oIG)nMP5z|IMvv|m_9i0-t+{LQ)tbe(pyX`u9 zVL;hT)en9MM~&T*Amx zQR(@-C3Kd#s|DTTHhcXU$4FzV9!+yeW|+(5-nI-*WxGIevb}Uma<5pSfYNs^obA&0*l7XND>1lb~eM{goc_H$a{uRZ`e0 ztYG8LS=1{}6`=1`oD`?AFp?PI8w;l)yD9brqMQu=r$_emS z0s8&ggVXWr;T2*gVV_n?3BW78$S$*v99Y=rN~AiH?6224PDe8f1zt^~&+mn?*38n1 zy{$L9F}oIB{8&@uIPMlUHerr(Vd!wm_NyaN_WfDPT3?B<`-Y9)Brh8}R_Iq3zfsd$t#9H@;Akan{&uRsSE@4*`pgL?sUnPpx)(tMAhE-pI`o zjnY63(!oE%z@ zI#cOQx4jjo92`XVJxLc+{QdD_QF}k2#1#!199umg1_mG|BXU*6t~bu+r_^ZK-tqr2 zmCYXP`TNf6(rZx>c0^0Y7T!}S^|f~9r&MVZKQ5Du0U5?! zpHMa4%k)8H?^jzz{w$$G_L7L(qr7#M9^W+h2l`H-ZHSWD_ZU+TbRM}va(_?^M|L~- zR0~@5;^tOa>Qr!uXE-dEt&_s?TCHT1?2gOE7(^Q`1dAcaG;5diBn!Tuzm=pPZk_z` zYi{{eztIR@!|1S>C7rfbD2=%~Q9PlBBWm9l;nTi5jaQrWvsZt8xel)-<&6^MQ14P< zdCf{Ex81E7<%Ye+ocwZfAAxu%Z!;wO?O=?%kBcA5_daKfa3;h**9oZz=muBIf z_v(Cyzu0dZ!4wtYwaxdBc{GtYx$Ic=bcI9u<4Dsy&Wl3R{$9EXPAz;&?){2!w6=!& z>bVv2=U!t^-Fb1IkjPW`_M9L&?+r}V;RuKXAtVpzWr7Xz=M7}8jb|f=^TbI*7r-m_ z-G~z;BYMwSyVPH+D*-zE_Btn%dNQNr7QotTc@x!|vq~nO%=H-ynzt5>Lt)QF%6KZj z!&_rc*q_^+0F8AW9CH6F1WiSSWh@~ouvi%uC%2kgqUPC(4b)l9xtyF>9teF*PPz9= zrS987BG=L0OCe;sRoVjtqnWE7%eIF`(CoTE5q}za-|0}Z%(_%E-kBUH8rKz z9B!4~_Nv;gF-;Z%2(rW*`PSL;Lt*3Ne)sb3dsndUxi5d;{sK7yGQV&)$S!7+GvXdm z>Q6T@@FbyG^tDuYqmO)!8Nr?)%!m!CAAixQ;j7S5;(A!~>B=k(oM<>8N=Q=j{L6-pbCo>x0|Q%b8}Xx>ZSuy1||4DI})0`Y*>w^m%;&6M_2w6N{*7T7nk4#QQHrSlOixP^UU zp@)d{F>H4wKI!`x4lTNk*BD(QJCKy486ffP)=qo@+K*2E&0Z9RppnS&GlkOf@*NMN z7M})8H=@OH@3YMFsW)ezeQC_C6GNy?Hlr`AU!v}7w6|pPx(rugtN++}jZcdA$IdV{ zlFplJSnB}N#8{?Wv6~@CJeQmAE5c_i>G%o1sJxbed|#6jXTXF3Uv{`PsmKo9ui+|E zaC$j66I~wf0B7`SN_wVjF*Zc?oB|!?@P^tJA-415dkxS{OAU=8+Uwq+(p<+v=Gtq> ztgSkWw>i;&1ol@w$8DmXLt6`jg@)G0T#*^78o7OXHsKjF& z@`{wC=bUO}8n1_)7}?#B`o;R|w!|Ts-1p zCx;5hes<`!TxJ?eR;tT4_4hlFFDX8BF!jzr6M|bKu_39vtvRo^tBbK|rij zj7&*AWX(iFtVu%H;o%)eu%k?@y$X2fV!k`kRTuno(NuAcv$eu&F_;&sG+&;!n#;i2 z&`7pn;9$JWlbp%Xa!vm(E&0E~lnwh=PyNv@sKU*=LQ%li#=l2)K<)zJUq>brA8f|f z{SfWwvc7o2^RGT{B}e?})dOjV_098L1G{UqB`$<`#noHGGzg2sGEShi)um2`Nj zu$E)a!XtGx1i!lnLfSIrbpAE#<6rAS-7$hJfwz-SQT|a0>asA$0#d&n4u(k;YO4-_ z6pPP6$F}D6I9Z^+nace=2g?`0d^=Nx)^kve9=4q2qhJfYtImPxhS?L_BHbg4Z23pj z+0=Rcc?iHx-wl=-gt;t`>1N_xrx>?XCivAPAjDKv1#L?((aDcDzps(xE>p~pekP-> z$$>kA_NXrVB$vD-SD4mrPg04nP*aDv)0&RbuzbdQ96?+!ow0U zPCZ3&9z^M5SuiQuVHB7|n9mZ#^yj>!Tb=9k0k=)k>BAgl9G}zm+-cbtkLlbczuCT z7@TWY+EkatPLh%9nT4pYL~(279JgHl3HKmVUg>XgFvBw#%m!3q@VcA%t?xc&0+@8KVeMEH1afY7jN&=P|jL1>+|t6Z($^K^@FCT14}grOkRi8+uo6_^B{ZtjAHgxT}MvWF8aw{4ei z5Blk6s7EdN?=KPOeQB(HntzlbZLIgp!)VlpBuPMg1d``oq8`Lf|#lTXcB}AgS1>%1V3DLbjfzwW8T& z-O-?5-epYrsm4-Z(4r}x)8&aGO(_(alf7_>sT7kvnDI^=nDe^FOK(5;(`7y7-A?PX znQh3}t(7Pu_*Uq$Lu09(meN=Zx8!=8D7SdM`OJ;XfZy1dKmsbLK8J)%k$%s z5u-dkvapF-aQ?x=HfcG2TMLcc{}ZmgdcXKrp09`CvT2XNWa*5a?)&Z$~VttRpC#A;&qbfRl4x<31(bnyn&qFEl^avR$6DYu>;3Ij=cyu1rI zp2sPj272VRs#BXmx<%YU5&!Jfh|I2KpBDgFLg9;JDbSTE0(J7Yfhi5o-Ibodu+#$NA>M zfh#FH((8|0Lor%Bh*`PwBns4E6dB?zBJj7c{*?NsX8f zAu{s>NC#!1{BXAmZ>+E8X<0q^2ud>~eHdG|2mpFdVX%!2#vLu#tW= zYHxRNLAgC|HcBq^k&4A?hyYMyY{ukX;2x5FVC>!gSIWalrg+~GHu5hK1&^Zr9eZ^{ z=M;QED||IB+v7|pNEE7sr)Uxg#&`cr#rI*PSPImx!fFgr^>*E5_HL}Ey<2(^*4Oi~ zU-~h?nkC;>^&2Rtiv`O!>$KtB9rM!l$6hjwQUs=1qGG0~S)&<}4(j~VVJ^-GHoY9H z28;VK0I{aDQ{mAf8t}-0#|?X7O3&58<7q4=nOj}{fev1jHu6$ud$oHC-(`Y~#9l~M z)@!(?spkCwh&=m5mOB^QcvIaiOHTeMO;rbN@x5*$rrrkstGcP+wi4sf3Un-;zFm1Pe)??lN9^4?FT;Jk2(LS3AgivjN}X=9sk6_W>sTSz`&BRuhk{p5`Qg>@zR=4^NYedjl5E^JAb_-9K%tuf|VApeZ4sa0|F(lE=_vFMf(2@M@g4U*&~vf2o9c zOLfI_^%WZk8~E4OL1b}}b`_9X1hu6d^yjSy|6mJ|_If3fbn||I6z}kGQBuDp7W3oZ z;+2~V(%YKvf4d!|MNd?+>$8WX*wPesV~8G=Bc2Wu^|YOIr^Uh~Gwx`OV+MlmfAJEV z#}0%P&dt#GMYg3PfC01=h}Y^b+8v$+fAt3(7%x9$>c-3I(FLCH_w7}?SC4}GZ60JDW?0_h;mK*&xUNbTWiySV(U{|z5+eO1jG4^C`0x5 zLz=d^y56%#LpRSIV{$UML0kn-8d^sk*PF>4O!^M9JFo-w1Uj~zu+e{8pDP#?fKxwa zEbH=q6zo>v2Hk#Scs^&>w0ykGHTo{g;-~PC4;%R|8)2S*xW@^FlU5YD8@MX1x9Y(X zQv1>bx0Lq`q;m97NVpU~1<H{=ydB?#`3qKepa_s}A@~S4SKgdb{Eo^Fz6>wjUAr z=OW8vc<B2+)=%Z0@NVBXvmr$^4Rcx1~H!Utvk`{QaBk zta+mEWk*duac*f}NcpoRh!w5|5ARtCxUrE+e@wQu(X^j;p`PRKnu)ltgwUyg!7+7t znU!t3FStAEXBF8TrL&IGa&s|Ygyv@`NE}jYy0hTRTl1=_`fuq~(mjgI_!)P z7s<3V7O}wsAcJ`~`J9#GHFPM-Y#!#tTdgcj8tK|7)x_7eair^OKr!Kaq>Ajf4z+!n zpQa=6o6toMcA}X?GF*8v&(F1=4%;e>|JjO|j}eCYAuLXU!DCLEjn9wKiJI4%H8KaW zNoSbcn2|;w&<<5@T`>n-N8`P#zO*#Gn4*|oBsv?mIxt&%#?j122p1%ugS}YhV`cQP z@P)It1&;nLF0+vk`atdO5|8!b45aAdz=8>3Kz;?>Ak^CHss0OD*}i3cE#SEJJhYz6 z^I)aLd%{H=!qg2$+=LWh*yXLAJ`#@kCsd)&7j-MBjww%3*D|6}*8BJK_w$zI9@o?6 zE4NrY3tHN6i9(pabfyokHhS{~{Ma)GW&=D<*V4sFfS;_1nEU%7pIvQjlPxD{6G+fb zBKgeLob*?(-DrtU7q{0{l^xY3vgr?YInub~h+rH{B=}G2&j*E!oo@Z(l27t!X5Fs7 z&WDqQxBUfhIvj11$BDuqA0CBY4wFShUnoX3ai-H%JjCvj+RYD~ox`nlni&D)El`P! zmGPBk`2bvnO0&7r`qZr$AVk&3Edty`%jjENdI)Hu{slsoBDPeUvsUAuq$OG%3!=b2 z_^d+3MO5J74)Z&_#~*Vt@lc`rYC^XR=;0S*aN@_gsW0qw7tS#-y(xL7VQYX1@;8@H$v)ig<_5-Gixlngs<79^W>el zTZd!vUjbVP6HL?7jdxQo=@EM;63vl$KOZ0XmY=38d!VfF1H&7_d6O+{Z9=HrjMOM=q z8?g68g9z~H_eXL#ov?X7p;uggVGAD=s$caIF3YYEJ0BR(H`gMjfm5{+41i;QD97BJ;L>&EZZ zp?RJcjmyj3TU?`@X7iBv)pZ^3(a+%lNi)qB8d(K)IAIvZ~z2=0eOLJ__-s_Q%wSo zXoH4aZs7!CKo=gr;33(CVXR6qNb_k)#W|wLTPW-FS+eCM`CBPPVgL55`u1;@{gj#( z1E0m`+hrd`XB$x=+@7abcm)@_rRPJ%Dnl0oMP<-Kp}xi~*z_Me+2tH9L6;*s@6KkT zQe;7-j5;*3&!^;pn7;a*30kg6&G;TyJ);Huo-K8DN5k=UMZ85Q{AeU=)%R7pMM?rd zUUYzB5tG$MnmF#grApX{3%|p8Gh`kO91ilw{h4?n{X6g>{S7&lV*=z_%1W>-5P@sN zZEGug&>3*0iD+n~ApVor#g3*FD@W`u>#Y)6a@E(@z7cW^#&OTJBtwBFxGgjD1_b*K zn%~xO`)z0hVxKf1SPdhV6faGwUpmQ;5q5Eo={Z=i7*N{AkN^Gp(P&7^059MUzZD*u znxe873A@^%n!Eb;stKjL+;`uphf-$#9YJkE_x+!h6FpIlo1hX%Z_3lpA&w%^t4tpr znF)Cjc`2_0)?f)26XCIAe(s}yR?OvxiN*a80@B7y*4YE&>X7aF{8vbYGE7;I)N5;C z*GP1c+e76NOPfnLo*LT4Ep(%MMKnrlzuc~|fkpVN{r+ItU>&`Zc)1H}j+_dboYhC)Erx(_X5BPJl(^)WkU1RHBIQ2Q*{PqZmv&Qz82FaLo#$Gl0sIf(y zb)<1~bL%svr>PVnjWi}ws4wwrV_R@Z{y(x!wBm$?M&z`m?@)&o5md)_GQP$`8!OdT zTGGA?JO!+3{G@9p!XgC@?Y%*-PrlGkFbcf_mc9E)CB_VGhozl&x6wB<>W}M zTNi}LrV<29*Z_=Vf0?S*zd#|APpVa~8}QGUZ`aX1ua`em2??2EOEBOwF$oT+T3d6S zM8!4y_Ksgp*nE?(>d>uhBa)sP_KU~2X)EozeQ3~ZO0uh=MM+`6;v0`G@QC?_{J zJY7V0deA>y^DVhB#_*a_TO_C#pOaaN8UAo2=ITDGDlGMUtK~Q>ZyS;&t`<`%bid82 z>(G62y|m)RCCKFglSl4`BUWcxkRE6XusctI&JZ~?QL`G$x{0`NGpWi!kkPdf&6|haY{* zxV4qYKlmNqQcb+0;Jb@7_!ogt18)W4rgm{mmS3cuphvvA`=BqT0c+W^%H%ww<+sM~ z+--fw%;C&s;@(Vg#r^6(S3ee`9y%v JP4!7kn(2*&}r~I64bK5oX>%jl(tm))Azr^hcV#O zqo0jigrf$MIH3V|KlxQe3!ymhaAt&XwKWxfAYbg6T4K;+=;{_=1vyzWEmaRvMKJiMMy05)D5|8L$?W2yqK?9hU0XU~vV zaxCU6%v%Ws&Ij@yW5m81+YDF%!CZvYFTI;>e%lAv%9JWFGwQbgEVO>s#+F~HnBMHR z4#$Dx1Vz?usRsfB&?;}S3}p}9dP5csqW@^MMfl|(z+WAw0CnuFO5E-D;<-hBcIv}- z_-KvHmOv3!S@wPn7rqSEh*qdh3UL{tq1L9sa8z<=>#`%k;bJJTFpB9VEJHK^k-jns zmr0SLGTGWOq*=0ckEn~J%KGG%5u`r6rd!ih8%Id~f_XE{iSAk=o7Zk%lUjkfqPXa5 zY2;r76LNC7Vho+>sv&rPhYx~9>s{OGu2S&)OU}R6v50dmYXbE*7$Cj8r2i)n_X(@3 z&Uh)K!;~v~HL}0?*MrNa?Z_`PjCxyxQ5GWqpNOU3no76m5rLHmxM3g4g?YLMT8@Mp z^vA#o+E06B))Jun&_7-sE(Ew(a`&TD*2*e#2mM!*TX9+8CO>u4txKE2XjGINsy`5B z7w`P{np90sBX+HwGdr}`Bxt^jG=L7ZaY%sN7wmh*&HaiQEqm6(TTvRh4vuRJYcc5 zAWIFz14lzB67d;lW8FtX#?=HvA*1lM?md%&EoYZ=Vn(m>Y2X)JN557DGS89@fd3bU zt4L|cw@|eQYib3rvioi|NN~-4Zft!lm7uO+dF^q4>CaCLV0|E)r=J#RXHA(X9OqAP z$;q}nF%{ZLx~aE=M77bC)47Mv>#AoK@J7)uZ2{6hU_I`FRtK~-^jBQ=Phy8>NdaL* zFBx1_(A>VaVU?3zvp&9Y^e>cKDGwYx6K<;c$bX1%CBVk(bl9=aXAFKg;!9WE3`2ib zxE?H1glI(xR8HfdfWEOz()h>czJMT4SFcX-2<%VS%;ViKTXN~mIdp|(c7Tv-D~ps_ z=%HI7JZ19iP{jSZn(ob7nRXFV1=enAd#qVNr5e1Wyk<0zfz5uowv|$pf9~@Kq|%ey z`fkF{SwJR>mF?eUzsuTl)XwAD*pM=~geRgLO^qcx&9>{iaLYlL%vdT&f@u$ElfiGE zls|YF>TTLc6b#~ju~=5Z=CN;LO$*34l+6>~w#N=Y&b2pi-~y zrVxa4wZ)srN;GqPizwl4rG(x{fM6Vj`kKq18#gXzUhprfdgyGo*#?Q%Cf=efudkd* zx#lks;BmJKyVsbMW+DrV3(eX=EUNWs-~cm44#|W89|x!5XT zU!ekROMsyq7(k#*GK=RN=c|f~Xv~Oc-F;gvTZ4S@xrs2C&Qo4UFf6?MV+F>3T1)@o zQ^Io#Zx1z>?H1+}6BY$L#hR+()vM^q>`kS{?dTFa*(A+95FdGx(rto~NP7eAhbWsy zi;>r&&l~DF1Xq7~L4ps=f$y?fsa7@{|O~Iuxr={j{{hYSi+dqY` z+|x%eLsaQ)#-$O%8|5@xv~W8)91N|ln&{otFois25cBH2d38ZzuV|Z7P(rlgv{qtF z56n@W24>mTyUffB^jov^nOwRK`a{v{M0$eswIyvRnKay zqRh*-a6XK}&JW#N<|rqcVPR{1vO_-OrpU4|E&a;z#%2BCruHFgZ5hFinL05JJ(HqBvrQ%;#Iw-XoK1Q0DkVS$c%I4S_A89H(1t?rtfD|aKny=Zm~O4{j60p zy)iC-dwq0B0y-1$%q-EldrdCAi96_w^B5tOe;VETbvD2IaKP0`aXNw>L_$ikFN=v_ z!2IH~s)U)FJlAS$qDFMFGewADjJQXZXMV1~47_f=K3gHI(3)AM%uiJolP~o*jso=j zCYjpcD6KZc+2IaUOV1}O$|oxmR>w?3z~rGeSR*bF{s*&T7s!$)i&!8F3kP{1U&Ri_ zzo&P~)Ol5)8kgM7^3v>~y-s&?@Z#n$KhxkwckIZsV`DW?KZ<7kgss|T?>gmE-)GHX z=o5JxcG2(pX92NszGeHnwbjQ#8XS%@86(IDKN%&c%oAUl z{f0Q&1NL&J#V5asGbc^?{$D7cXVj>5lwx8cfIqSm6d!Yayhh%=&Btx zKqN`5bk%O{->8rX%$;@tjG3p5Ap_czymOX~t~5^2iLyncd@(IR!U-V5r>Ko@{Fwmt zBaaPIHRzd;Y&rfjQORxKjuKk5II7%u z9WN^soCBKtp7R*rM+X$eH0Uo&Ayt7{rwYn1j30aK_qC50i{IV{M_f2Uzj)hzvH%0~ zCGRhkgdE>vE%;5mYJ=TY)~c^6)r`>Z{;fB32vasQ-b7ls+~)XZsf`ir*@g#a9U$`a zL;1No^LQ~h*CrAVS`iA3I=-BU^R{ZB`zd6ZaGmAKgqt8h2&M$-SKqy0@*(Czm}wag zhl@Hm34!9CjcJYQSr&k%*Z})@H^MtN=p%%)S$p~wf<+9GN*pl-hQ#63MV4bn84-$j z7EFN|2V(+Y)GoCnBCAM_F=JjvRS7!!YMW-(`ysTsI6 z=MeXp>QZP|K}nJ&Tj-heSz0eQsN}P~l%K#+yCq-!+rhkX;@r&}tCQw1GiRD%2LgnF z-V9U3VqZl5?0&8ExlHUOiQJpNL#-I}=}x|!Ew16?k#h#aFh*(>2)Wk61O_j*R_l!= z@oPXf(YH1sI<Dl$yiGfZWP8&}!hQ9y!A!6tL23PKfoqp{?o!Ii_uYdz8Jc%A!6&b(8rwr|*dl-q+c2u27<+00(ENzytAQICPlSQBuUumlhI9rr1lZInU zW*($amO)rZDuVxe)q}n;f0hDHdFN^8;-~uO(g<&Nns#?Ef9fYoHLka3SpB?Lc$y}~ zeyj7JP0ocb%L@6;wc)-HKrgiwVMquIUvnPX&=LHlWM}P>ik-&!`sRQZ^H^gQVt)81 zvIAms5Zt9OP-L9ebJ z&{hSPfDfpyM`jQpiQL%%Tt_;D6z)Cr`Cbc)U{fzgh;|IGC>O_!WGg+)z|x`FYZG?7 z^SJsiXk44T)I7=Md<7H?;7dMi`iFUjT_MfGV59)yFK7Hk!Sd?|$e?lmSfyjO!d?Kh zQ-U36DDR{YL{3HbTq=+CDq!2-HdfZ{1n@#l68Nobu>4HgbJg6k!P>10|Jf2@|C7%; z8{sz%L1;NT`z!gI3;0R(WVXdm*HlPCqb_h$@jPq7asG4-svW*PgmVP zKOs32VG>t^pO)Dlx93nYL~zd^g)d=97fi84abY=+9MW8c0SL@ADr4VIhIS7h9R*nv zd&QwVD30RWw<0^V(S!mmApnzN!2tP>bS)F+F;xkCr1vu4UGnK@P>=7%@hUgBAx;XH z^_w;@jRMw+o*lqEy}IE2OJT|DiWnVxf(|x6=T_~g*;Nh@&B7dnn%uvDNJ#jU?2oIa zXf7?+KS`afSj{)b4BUUoCGv1RQ1&>eFg&r5 z9iDqZ?9i1YLFo<8Jlg+g(}q@U5ic$Gd}@CClmL)Se1~&PS)U;2Sb;K*7A{SqfnxhQ z7oGh?9>5qb!cST{^F8&)SJ%9~j{sVDC1r65?HZF?udioBsE{qF28K)Kz3j0RT944z zFAlVt$js=#jI~g?R`u#f6Bp>?5!l$x=A6S-Y+L66VV?>*jiW#2mYOpT*@7|M+gawwUd9}J5Yrlz;k>;MUjF&Uw!7OxA$ zn`rThHI?f=53Hh9BWZtrF#sB%_PdoM1O%B^fm}AOw|L|3p!_*D|KkG4?4@*w($Mfd zqo?!w#5Y1i8*@fa(CX$m3@F#iI&Adp;YR{CCkL=BA4V8wY_7pE$xA|=G*G(0@GJF! zp)PGMLf0>9p+&Hx{vc-o2T?oEl08hg zsJ&b6h+ZdO1)tH+z3mNbkSNhxq+b1~8$mDDhW`fU9$Qwck*2u;WH*csD1i5Dbq-;q zFkp<*;HR1-x=J;;jHf62`adXvBs<*?PN=1t-VOzYuJWca`O$yE^V?~QlP)E+%yN!d z_{L%Fe*PQE;IcnYr03f7lDTpbWh0Cm(hM%K{r(w!%#B#v-#LC+VdLNDGtQX?qm5s$rS$UwcA(T%bzw~$rqclk#rro5#T0{tp*%$k6vRUz)Xf%Kan^7W& zj)8hk{SRMUaa401e&Df3nyl&nSi8!mINGMWNRR}Vu((@-J3)fGyGw9gT!Kq*_uvvB zEbb1$-GaNj2lr?0_cy#%`-Q44X6KroK5ggpucpKq4rdXV2GZdrI0uK6rLLHjMS=aS z@$Sd7C;Y`zu4`G>K$VD8Mba?R$aG55?5{gPhm_MyX5~wglI2>#vg_;Dg%r(f`)}}Kbr^#4LccSj4t0Mh! z>OHe1S&;PZhu?d*G{moQ-wY*l6Q%p~4KmEXHJ5qMkD^^p{4`#^JV~o^mjPj|b1+Ql zaPtqnr*`lII_?~qwXqTr2PKLe&84@!L@r1TTp5e6V?)ldVRGlL*Iyy2i6Dr454|XM z*TQGIt52x4%mlAH@jlzk6JhL(*dF=rAATBlQg59Q{d$?iko<-+DLwDMf1j>QKOV6; zgq9Xu;mK9DjO9-k!P7Xv%0unyq?%7}-_xmY<{V5W?NrV)&Tc;DtopTUxM+-cm@Xo4 z6_O-Hli%=*hmDz?%Uo2!o*swb)d~6G_#5w- zx5-`3&aamlGIRl&e|~8>L@tQNKMJO^qPN-g^c%8Pb>PzCeZY^+UUdO+s1%s5>TR5# zE#A{QR^*uP5bJySo|~{zo~J3$@c)?p20MW%saDYLgf+U?{KIYoN!U5p*(+exJgBHW zJQ8hKOtlJ@@VKWi$AD#LExh@xw03KB#8V`SX{B#j#o>I5f_wwn7?xaT6sd}xDhB?E zZ*gfR_E^hD>a^zcWDb5Zbpq6!3>M97&e)>zB7VZt@sDm)BTnJ@wwY=cxuGhWRrEuJ zGh{&F0aTkZANBp9wTAortzxS`JA4lQFx^wiA+4&Vt#Gx+R^sU7+LZHViJ*{v;5z#7P^ELA>f*U{WcJ(bT{b>M9R? zC*|z2S{1jN4iZ!7zARo1H&GpcY$9vE#v(>uNF;z81!uFBJWOxFrb~SN_S`6N&JB-U z6pd2vP&Y5B%K@SdG_cXHqvG;V7wwog4kIvjjw_Hgq^3xycp{z(px$S)*&=+z^}0Oi z9!_}BjP7{57na7`?bY2&ga4cCWRAI-i*?OnYNsjl9!8Oe#^Kj-bJI(zh`5jdjmFOOIe4RLt&4Bt>S>ugWnGkCKEVH*K->E1LBBE)FL0i8B5K+?>4|pt!5*N} z`)NkFr>GZs^ep9ld6y40US0wV9@nCxR_fpTz7El%DR7bg8@1k{`m!`J>^`?iglGgq zb9cM3JR(U6Ha?0h?tFatvCYQJ_q+J1A19RFa3k!}&`$v$juqvTr)~ii^h^Y91BnL> zgC`%mmmy%893#Ila)lWk9j{x`v!x--)dn^C>A%G3=&g4bI(FVl&>neu^W*90%l3Y47H4J+wlMJQS{o5jC%XbJ%T|YZz1~UY`{0 znn$>%uX^=&#j)$H!w+D$31#cyo#$&+bL~BVL+V^dZOn zvBZI-7G*s-n7xrJgoYr=bqNCP>aCd@oLaZD^1Mn*)mUezn2t}z_rnx<-}fQ%liN?D zX;ZcUj6kcNgv$|Eld5|9Uu_R|hp`ixE9WgGa9GR-n2?_qi5_2X$uU`2@{dAF$aCW^ zm^eTpJVF~kwKuvC0<9`vKS&WNQ)id)R6t}-rvwDR*-M-gpc8I*vIq)2$|s`#H0U_#2Uy z+NDs~M&FLS%V_7dj+Z9*3{xGQwUAWb3U~)%ouDiT{y%>79u|x+0wdDQU}i231cMw_ zuUj}(uN?O3;wPwW>@HzOZ|E&*b>JY>xZFNEPUzQ_9YYMI{~uOtMT#&h5D1jvpI&Xx z;OQz#tTBt&>g{zGd7*A^-IGS0x}El`I)fW=c>dkZAbBfxp3D|JWBkH==Gs%3HE22Z z<_x}eF}P8aYday_D&}v>U{lq%Cbxl#(jzs7I|=kViR%uFw)V|!%70r1?T>LJed>k= z-TZFYC^B8{2@awdzN873Y7z&DR)Z1jjo!CMk9TXno4+3n?Jap)@;TWG`irBcP>xvW zZikhL5FE(0Yc(5w_Y(FqA^F4oVGpOA0>ji<#JGif`*w;wwPd5gc#_zpLauxrW0uVu zx5r?(O?2kS)$NB~Ys0bKN7%0!rH_N1 z+jryO$&a&a|7?QhJ6l^e3$P8eeTJHdG`m@uE8rzj${1{3r=J))ViMe^v>R8uQ9q2`SmCD?MGJO;DKJmb5K0 z=udB=5Gmqa-_+tU+zol5Zk=Z*8Av;RN>vVlT#S!vHy2_T*nCo%8Hj{*GO9L$X>X@H z8S0|DKevP+4*#^CXR2z_}ivwTe{X5x)b|MIF zX#;8G8n)>lFqvo_P0_CllSeZboe;%2K0{65>uyGZ$fHi|0WU#(l&mZ!Re>&LYwW zGn^wd+IfBc*fkQ*UM(OupB=Mr$r*ateiL}mJT()^{8_8rH*T}ZgSOK##!z+ulPjBJ zwQ%eZNq0tncm*-gsw7RoUbkCnU&rtVG;NGFy6a=BDYqrX|6y~(4i9jB-9N3Qld(yjU|FE>t3Ia*LYu(Ip+bG{%a96 z{AZVxKO`kL1YKk9#flj2?@2D8(-5w0M4A;W*EoBSW%>DS>u|TSgVpEaN6<7tWHE0& zQ*=(B3+E4a`lVmL{-TeS=F;OJk*x3acuN9C{Pw#hTylQxVl6VxBcJ+<{8c45q3-o0 zV2JM4EvI6kGLSc&3i)nNKP+fEr2e|K0 z2>-+kvh{6OY|T45ZS{(aZ$e2$^A3Jqqr=+o78(&*=x1DQTXi+4`W?7DF=K^q3^vMM z^d^->rBr=UV+Sv0(B9%?=|GqAw=;rZE3tNeM+{iTHs;dj4|JYzjwF+RF7 zf^7mg8K!r^r|DfWl~VYLZRCs8$gQsmR6lt=%0%g8K&d zOZCUTAhWESHH*{vlEQ96fhPK2F${L}0>?Y^bH16ji5ag7D+ixM zT8BS<*Xw~AM??FA_u{^MnWE9>cxcAWi5YkENjzYIbXeF|`(CB~0H+-G{-jiy`lzw_ zkXWa>oE7P!KalH!w-D%j(FJW$^3|_08neTGPx6wt0~fHLaO5)_Cf>JJEv!x|LI00K z-<|s&AZ#ic2#zq3EtAuKG_Vqw3|=1vV&}tsbQIT$uMDga-9~q{L1*spAdrmWyLL;i zEk?%x-7CY#Dz+sLH9(3$ScuFiFrASG!U65^?OA;Aw@MFDHMa|q(h3w_ba*8F)v?>_oNQ0d(t$XFgpb8|a7cB|zlU}LIt@sg^!nN8_sw7wXwDK>-sFUPU1^Rrb7-Ge|_#7e5@sUGB|@aKEg1hd-ofC2b%hReg{iFqtbRX`qq^c-5L_+rZdy0VQ!yKaZL!Ts-L1p~WCiO4^QwOD~ z*3kfa5l|LeusUU49W|S)W653eJMp#H{;%~XYhe`qrRvroH3(^fY-($f)mGBxTr==bvbFNC9nPa@76eLR(RlS5@;x$F9wbFN-e_LBG8 zy&m~l7`_-gsEE#0=Sb#wTo?tLqGHYpB{<*xn}%FnEHhGt!w!xRUOaa#UcshU7iyb_ z|KuXa6FUF6crc4GRZEEwxsS|>{ihd{*hPk)^ip!pvMA}(RBC|@ixkWfBSh^#4C*ri z7`+!}OMUsTB!>^O%yu>m4{Vs)OzbV6Z*>74Mrcn!EuIhJYE6VehVwu4Xqjb1BGFZ| z9>uE{l}`bm*{~$?cO6N zh-p_|@tv+E=7Ty{qSC`&4Z*FxFt#s)ZJ(#fH0wo|VL)o^!~BFMzCWYyAR=pyM76Jh zEBs0R%0rUMWxRK1RbFyLK_Y{F>mRfFK?!sDUa3;FL;A6rcq)u7uB+ZIOdimJOTTS8 zFue6c+HBNxa-DNVz_BCX(N9rx|a1dMUd)GUsX`dL?)PE?@mF453Lp+NiwMVpu zb1yZ8TL+3?%9dU9C8@ANdN!%AyRZ3K?h3!;oVyp>weBlNh>!pKQg8%HXN`<6za8sMsv z;|2+s_hxwBtHYrx!$m7cKw?_ZqsHp?y>Nkkt@}(chnJmNqh_c}sHXA9O6xSvte-?! z5XXpK^R008ov>ueDoi1Gp@v0sc}v6L8sa^Ucex-XaIO-9c(L3ZUD9u1vrZXNtXQQQ z?XX{3!45S)VySc=99ojm?;NFH4Vb1B&qh-fzfd8Eo0CYJlQ4ygW_&Z!FO6ad4TF)^ z5OaypedKLjom+Y@#&vlWDivmic~%GUzZlTRkKf?u8+BoD^I@h5MByIRYWTCPOdP@ zr+!hK+X}1S9J%Cu!v%t61zf=ATdrVPo*=YyX&N~X)|-6wBM6q5Le#E@Sb zO#$KHc-+wMhB#JdK6opED(^)=$*{)JU6m^EY7zbto2v9Xb`?_y@A45&<1*slj6U)# zz{6%p8DaBi{kZMqiVxDK(pt>lo}8&5tn@Q9?reau4W&EFCRU6uXmU58KH(qx<+ASi zcKX?N8Y#?LN%n^(i2_o{vix&%>=<*ox3{p>6urr`=1o{5!)FLGgtrai?O@u#=X5Rm z*>R~#jip~nX@9`~x~Y9lA!ZrEUED(S4L{3G$Se_kQF>rINi#>#QM&mptIC?^_6}{S zLvG>Yx*??ykdT#r@72|y|DvB_iN~G8%htX#lSj`eFZ_d=ueGv|FC>PCjKhDmuZZSd z)Qjzxhx+;#N<{w)xK73of55r;a_}40D9|8+pd+$u%6;mkKI`L_rAEf@2i1&YGR6CP zuA+z&mlyQDVmEXr`KbJx#)&NxB~4%$q77h-2B=NJeqbf)2;<_Pqx2WXp9ibeHgesg zKcpiVUeIUdJkSRF2au2NY;DUiMLiuTZC?u(Z`I~A$Jr~2LK$&MY7x@eglCTO)Ck2g9Bfq%H8s@UJ?4m@=cI!d7RqzC>Ay?c3%vc$vafwI#s3qPtm_lufnP;Ul?g;O^@?*?15 z5uRPudkw9=Thb4Z0QIUrpL76;z_0_hl|8@I@5}!uZjeh5Xn2{YZ7;4Cn_u}EooI8T zp`~>_7Z`mw7fms%^0aV9AN@QYX(=&3zF!xcCtP zc*h%qn-Qja$T=r9HW+Q$e{ZUyGV*ZlA8@r=LY$;4Xo^iCHAr(3+1u?kOi#lvxV||A zYNLUR4$@4NV<|H1#D@|^0*QhC`Kx-u$mF9BDr^d8uCNK^(oHr)a4e1#@CJd>7~~fe za+yf>czcZfU>9>T8MDEb2(MIuD7xsa0qDC0787c)NjJ1;7WSPwkHeGC@2fOS2SObk zUCi@pnc{Y3ho|nX20ryHH)*_$H(0d94L%#KZcar7!soM!U}$q8{*8?2bK}id@4qyS z#P312i0ec(r`(b}5=+zJ#~_aWw5~rW!)Z)T-v&SFERD7eLAK=WU}@n!x5@{RYXvS_nDFq=eKs_j##eJp695KF51 zEsCv|Fnz|>j8&G;Nxqz|%|hY0pcjPiBnQVMlxsx;GOzgi*+OObTX!cMii~{yni86c zF_s3EId>#6k`M+w)nzzzV29~ys6!MCCilDVU||7|l39K=B!^v~AFh#5zsJRGCDjR2 z%CaOV45?s|k5tLW?mi^ieH3;L_fpXC%T-tYIkAesThv^7p-Da865ZIIJL%c=}bmU@4zy1=f z1mrT5c;Fjn%a;i4%q$y`&)`lI9RIrp3U*q^?I5I;+tQDUHpXF;vf1y*ZlvAEY-CA( ze?PN*z49&K<(}taU0fAgNvC`|bpl*vD)ZJ$s6teP`;>^c(HSrf#$)NNORAIe(stf2 zL8exQ1tkY0v-ZCxPVy|L;%wi~YQbS2m`7~QT-M2|e%Cx*=S1j6) zmXTIF?ALegr_GJ_C?CrRx4=>Tmh5PUoItM<5i8j4r)SPXAp+Q*Pg0fB=_hu?I1 z$&jQl8Gp=~*A5JO1%M3k@bED1L^OF%DO->oQgQOnMBamU3g@jW?H49@xut&n<$ayWRM7(( z-6rBUi9ZU`AP}1&dJro@!maIV?Rk#N6&@i0Y{qer1<;oz4U2@;w$MNoiOqkC#o(H4 za2@Pmkj4t3LJ@-~GBcNEYAUo`pw;$fz=oSoWE5aa@?XlHCbT^DuP)k|Jih4ma`@|$ zP1}jeD#4VtqQ$niR^0O{NeD@DJJsX55>A@7D?kxRn0jF9QcFJeKJpd@(2C zi-Z}Xh6ZdWSp`qjdfBI}%osf1i0Jx-`~COGMwYZDXuVswU}Np}jR^ATx=pzN6{%Q} zhR?N`aPxoFmzbOau^_kJ?31f+fzAk-H^$|a3aD1(7$R|dGJLuF?ol8&xCE*$78E^i zB^m==6|**vNB;+)5$G)aX8QC&0ejso_c~}4#Y=}GXZdj@Z$WSSctJ5gcz-}3=%ney zdRWUuvkETF(^sYUY}sF$NdPd$ zj;E^w*Ddw{iM)IWZQ490?nQ-=1stYHzPKoTN$**btuT@{N+T3_mXt||Z}OA`;_1eB zq?tbgWFc<`%;lTai~IL*M>Mvsx+fe(Vofd$t*L+)ablyPj?|Q|Op$_X)s$I8euC+fRq%Ej}Os@_D!|;R*(R08*yW_ZJO*-#nuV9^h9(kV;_Av$7SYt3+o4^VIlua_Y^f#hQ*}^ z1)&g1;+;?VEFmKCiMJa=LVyIbTIi0};`HM79IJG}c$>?=ALkqr=^3xwhx7;OG0K6i%As(z`)7)0qWvo89aSq#dMUkJ0QxtA-@q0jg;Jr*7f>ubQ}J z75e&BAJNM_Q96F3e;mTf@b<&5?h*1rcGG=&OjC&veQJU6*Qg&7|EkZoS3UA|=~>xE zOTgPi-%>(Xj1X%Uh1Tr!r*A8q_j_6E*}}Gm`6%5g0E0xoDc3GWsn#lXPxg{0AM5^; z1)mGDnov8ZR0D$)p<#)4+%URnA%mLl^FKw_YXOZkgTWaeI5c5uE3yEzE zh8c2e^6Wt>&NncOxH23ao`oHBR~cy(7%;*dGP|Ny=eU6QjA`MsT-&uXl<{;K(6#)C zrbx2%`23ivd{`=y)3k7#P-X(B$a^s|qujn6Po zR`rU1S*sSF4h0LsmikRput(lRYbqo3b=x&@2wq%W2+7zcW4_XGx~&6Q=y^PF;!nUI zpfSZmfx`!A!;y@Sp1VLRzc8LBHPFrp7NkB7JFMwW=Y1_QNw5>K{de-N_xd*zU~WNU z3>)=@vmU<6)La_(e+&dt{2*p_w~{tTlJocZl%6q!%G;@-Lj6 z?I-B%?#7*x9b@PFx0;8o|i+X7W4aDT&4q&TvePe4YkH7pQ>;@TO zhzt+wP?)`QCw*Ql_?kq+$Y6hZ*dVnnqbq`_?z#I)G|;EquNNUf{pf`j<0JAO+QpEO zJ`=xgACWG(*DLwvvATUp21cTo$|NgZRKa_fBy`TBs+TvgWk595ZNqkouRd^_`S+r; zp4oDF{t7}Oh)qE%J53=8CjplJ!j{*woW^ecsp9fc}#K zFU-W7o;2!vGa+a}#V=}=;v*N~#h1ih>cX{N-i&k=U;4`;F*R1oMdM*JqeB>NMF^Vp zVaM;3KVT{mAtabkH&Tok7*ky=bXb2|T@4o7r^QV@Y%`D<3WCWf#yc!mU3kABW~_DX zI3?Rs5XvY+n$OUjSW;cGv3SoXe!fe3C5d>`*g~V{%Kr|9H6MyrJ7{8~3Vx`EVW79` z$^XXu@7x0@*WjckdCCI~R}RL{H$UOC7Z8j1u*xXTx#*lF)hL;MA2-2nqRg zVex1-gROA$kDiMZ4iVBjW{E;LwS(ei36tIaMKya4(<%K%xtf9M_^I}n*xfs=ieN0l zIQuX_$~W3L-i@T=w4_3onIxd{A7MQsDtS41ZZHKj0Cg6I;kB&_X~YJ!tqEEWcsWay z1Lf9G2g-B?l9#wOl~Gg$6?}X8;`1er4*{GS(2Ih|5fp$ymcmc{|FY4=7?QV~wY}oI zGs_Z199#SPkwypO8*S#D+Z){J1De~3SN47v_=yqaF(*JJqPtsUXLr|ih;`-FKIw1P z(!doz=wy!14bO$oYO%@~E(Db@M3Tf4rF6aw1}-iw&cCh0$LQdD@!fA|LiS`8Y%sq_Ts@C(6`I+dwsX(b0(7@I9 z@96k1%fYq_@skea%9R|=z)qN1dzD4eP1e$u&lEk0T+agxgQ z$)a;32|={P-tt6leEmYAHJj0kc( zYpNPJ9WS1_c)8TBVGzX;mrHkHdAvTQOw!aazu?b7f&KjFo;c915mpP`->n!XN{pgP zi(znLBD6)`11M6o4Zwj0hliI6CI|(-6ES>@D4Sq2=3jG}t`nsup$>I^X8 zZ~Q4h{a_sRAI4xBb#-<#?FN(mBsb+mI*p@{yfU47f&z)?=aJC#F>|%~86jnySfXTh zx`IwdaUNiPCb0xrh_bM*CwQqSFaiqA#*CIAg#|_S)u>O`U7_@7b+l&|S>100p*NH! zieUtI+^smj@gmI9igm}Yg($3oFfX6j4!l4Ea0eQ2ZSvx~IO0QUoMU5PlYBbsmWp{c zgtu&810Np&lpgT!!Qs*=%eq)&a7~dFI*i9C3kosFd@TKk@5__PVvU)lwKXg`{E)PC z(?#Hi$(a?Dc74@tb#Z~u1kr2j3hzaJLamFzA=SQ+TTLFKkTLU~8ncn=i{c+h2tgR) znC)IS{fEU_F{F6UNHX*&Jyo9~oZLAG1TaCPHEsUN-w{m8c7cNuSH4(vU*9|^h>?4{ z9Qc9G&A|~v5p4S;!=}YBw|9L#bF5LO)x1@RXSh-xTA^3}9y0b_|NB;W@pySfN%Oxu z4n-7x=7VMduZ}McfBf-|jtO6@S>6Zwbd&|k-|FtOf zD8<+cE&x=fQOe^r&OMJ9)P)T;2^q7tArbgKBarm>;VBmx-mi+<5f(iLBYXcrOc+Cs zNb=7I5pb}FUk+c^T2j z1Vwx%ab+nqB{?C}``YWgqt<*pv-#0*7B5`vVnY_boLe3 z?3!ei<+(F<*$+{E8sUe?CM|4$60M%SYBDKKfeo|uqOGy> zrUyN*_n^BDRR7|;rnd9T5qN{y_9O|$7c3=5vxlIQu0i5?1QVGAr%y?rk zFx1r>6*(M;iXDh(AsHsaXykv<#b6ik6X-(d3j!+$iyWx_w$3g)DScDf!sFzu9~_iA zzb1*<2D}nRv;^bq?Cii%%h?7JtC%#(=ZK?~to`px(Yi~20^kJiJXQ!{{#e)lz~0)9 zqvOdc+5Ja2qgowZVl+vmgxgAZnzt|z68R|ZK9n_MtbBHs za~nrIyz=*N{^t&_^PkI;lfMsI){L1or#URs5lUwx41FJ{i%Y7l_)VhHM)!oQt&b*f zad8LO`(K@cTo?Zq^6bv29+o$*8MIjM{!;;Mh_TbiWnKWJe#^#J)gBD`!k@vQC>WZ= zW@<)(c6v@m)F~sj?RMmdfeEruSj6_rEK55=Dv`%4oZ&0xSnduP4CgCv({B; zaa|n_;CxRaN-OBg8JOu;U*Ej0Pr}zb{=AWY`utg0SGP3BYwexQvQ7pJhzQc9_`%nI zc{>IZ1PaUFP?VEO)78}cy264|%ka72>)Uf=M^rVcqoX4+DHReDf+%1r69RYL4~sw0eru*rk-A}EgJyTfq}4~(^f3EP`Ho^ljAuG0JV)peFfjYe?K`h1K;@-2~d!V zOY>jJ<^_LoL3+G9MwB_svBpSJ!4OeWSO0-Z$o1`buKYK|Qiz8Lp%6!-6qh6x@uxQa z;K*_GT66owY2*4H9RJ61J45p2lC#5EvJVfBq zE!4bYWGvrkax3+Ddxc}Mo*A^$ZR3@amhM_BL{$~L z0q0|W({K1>b#+S{o1mh@s-?33&Z$$-hsDUqZ|CL=6_DlT%5Z-qOOvBXN>1MFLL`O# z!gTnPPTFPT4-Clv`r5_&^>83e!b~b5cxT7-`g9p_Y-|jONG$E`U&kzjF~p=2Ks~vG zV`DEPtX7tm{>!Hl`ufEAQwNZLbt5Apu<6WB7sbJF_0 zHnMUG3Loh?kqS_tP;CzRTImE!9^!G}aoJCCoN|jg@!{X~5383}d0bXDU4|S7r>8G* z2xF)qZ*C!zbAk9_lzC!4q>mQ0w5_#&K5x1@yHM9O0MrzrrKR!l@ztxjax3 zr4!UzS4rZ`9+>UmmxoY5((>}vp`ym@po0)$SN%I@qGI;pxRmryNl8iOmqa`2$;T4{`zeOtUA-a|sSqBfteCb|eA9jjk)&|+agk&7$e5`b2)RPeGsEFCkm8++iHIq@bMFkZdBvvIQO6s`zbX%pB9le8?l+=-n-jk>9E3O2E zF2P0CKWivj=?jZ)D--g$xVb}NVf>E!qcg1O#FgKCeauy@8FG_8d5OR+?6q5b-_N>Z zhL%?H1*!};XO5TCX1R3tygc1OTzQC1&N}wjoN=}BX+JwP7=smL=O_wI$Y}W0vP$0(pW8BDR;QNq#+-|p44Ps^Z=)BuhZF0V-(o}y~+23=1w>_(A zIIvJ{f|XjS1ysdlugFA@WaXt-Ia~(gXlY5=O4OB;Sl!orCOGt`C68OO3qQ$Z8iO@t zN~UI3h%T574Qj1#j_P>@zI!u`{0lTpWr{X%>3WDW^Q0}eIL8ud{e*oqMfqe=IqxOG zL!@AT^L;>5Q}fPqvoAH}RBN0CrA)VzB#QN__RY&)1^B`~51L!3&nbDRoWa}de68fk z8GB=iz8(wsWOixk`%VM02El%e*Xr^duy;Yv0J4m^>A>Ta5&UMKm9pDp$??T;;E^XL zXw^JXOj*wR=%>X*8DNH7L@_%rjvoM-df?C%!50oh++;*(@|O(_zK-|Cp@Jev^kz|A zq)0+I;us>6lamMDTSK(Wl_lk^GRjF&rxti_9AU~b)bi8(c}jz#NQYxr&*VTHCLJ9e zZ9^Gv*^^D?Z)Zp(h=GK1^SymQNv4ZVe#=vEvoO_yL|;wKTaklcXx7zapuus|VSyMe zbQRdhBt?alePCzPdYTZ){K!faLq-t&-Mgbfy1aZ%PdXvWh^5JzFu*y_h;HKeMq%-_ zaM{3u3QPJ!Xpa?NgWW)flA0vjfTMyBqWf88M|Mz9f1_!cPW$7S6xA2KX^vyJx96-! zWp(*@4jCjRF7N& zId0Q#O2)=opd-?F|@iC+T-=vpHTDf(s!}O0ojO*LoU_rs_Z4YuD zA4;48k}+2)>c>cGz+>03VTE(SkO4;XnFx(GPe1hoZ`L?l_CDn@YG*J;N?MXujoWI= zhmnzCW(}Oa_VTe&``UROyE*v~V-Mb#+JlztKc{K& zR6U)?;nCE_%Gy3W1MkbSVJLK2UELYRpH8}FdXw%We4f}e2WjC9hIm)^RiNZ_-H8!P zTETIP__S-Sv66kPZVz(QDXcV)ND71YcPHVllo1?p=~OEElgnN_SDBoNiC-vMFGtbEp&LJ)|O?6KkTnmE(TQcq7$T}Eb@t%qgw)xR?p`Wp>Y zrBlv`7FrO9aj-lX7~Hd22c$05c0?#3Tgk3D4!DpmD)m`*HT8NYqCB+F_9^Rnb&Nm> zQSNRsAl7h9FS@&adT9rojTtY2p`oGQ)KdLugVCltx8Q3pHsgM#4;N^1=hrVrt_-_q zW3YMWdQRza%TElEQ#Y^nG4t{VeUo>jNcYZW+K!El;Ro=48uUS~KoGXBF+Y=O0+vXJ zLMw)cp*`o#$1%Lo(eglDV0ksmT|`zEu$d5mnOn5CSKzAejwu2#q>gH9*cyGGhl=L` zH)1G5p9})j7-u(KlB5$#dM91KZt}ngrL3Qm{)R$DQ+9trp+_UAJykiL{Z@CG4$qFL z+-u(4Is~8Zq5<&{(Mkh>j2brfkMKbO$SoBagoGJ1csMv?nQUeDH_(Nc%c6BC%r8|QY$*Htg`gEX=#Wed zCc;B>)=ci#qux?6Kub;ix)C1hM=8MQ^Rh5i@SH$3HET29^6As3ehqc?Rbby*2x~u( zd`f7jYbts@9@3J&?qxvS>gQ&kZjadqPQ#znQ<7(PM>P4DXJ$AOFkl;(+pnv7(AvKe zL_dNsVh0$#-(H?aMDs4{Tdj+!q&IkC(&dWGQ>P7pBHJD~q{DY`(pbJgBId%2pX42A zczC!>HibdH0%FP2R9Lvn2Gk%XSzM}{3wL{?A2Kx8ovy~1ZBJDP@LhqCng6IWS;yO|2K%r zlT^aDk(_ymGJuHJz;U3DQSjd&Y_mD1EH5vw>D6v$f-BBCKRcUa z&zdp9+;Ol)o28KI_BWjN_oLbr%V0tSj2@-OZeLV;z^#xu# zpfCzNv`N=70I4k_jKNGX+bHgOD+I;U9agJL>RxA*l1Lo-s@#9UadnocGjl{$vqTbu)FT3WA5d8C(!1t-mWX zD_VMb!0g25JFZ3!NXPCT;oE#8WG(t*WWDWjf|#|Pl>lHyI}Rd9Yd>#3a@j5Mt0~W{ zMX^dH;2bTo?}rmYn(WPah?s!T@@{TsW)J{HYiVie-__M6!YRq}?kk@2n#I}Q|J}eL zqBZrL#$3_R(0qdkt8*3?SzQ8&HYusgfAfjTX zQumejPbjnyuqp-wlXAbgacM--;I=k{F>IQsR_p5nWs6mhZB+K4uE~E&bZQ#P%2PTj zDg>Vx89&U97SVh%REQtP;XwcDdDe_*t_89#mwlv#t1* z@zZ6~>MS1*3#&4YZY=-S#TM}IWavK=b65%?4>;zHFD1wS3=e=qxK~wG?b!4*c;~M~ zH`7?wX1juKkr|RF8tT?0nPLVk!1KQD3N`JEn8jAB_wfx21lMcZS&N&^Is$%)H>SY8 z(d#m7vxlkeu%FQ2--Gu9;2g%NsSEQMbsO$|>^lAuR&<^fuog(_|BQ>P3ft!S@AsCJ z^ZDI!ucM@K9_!cDoxD2!@N*|h1ECAtznx|Qd*{_3@7HxL&e~Pke&S$ZVIc(vGwDOC zJ{#eQXX~43Rx=z?v>XrT!yYrO_tliON4m6fXco#&VZbLSiNH!r{k*3C>9&9CHE|yM zlMLxM-SF8}YYsoZVz%trX!CyNUHg99DMO$^`}a9wJ`H8H^+^`}gkN>HZs$$!KJ58v z82HMaEV84YwRwHy=YrS^l18J=x)KBB(G3OZ2k-7+7(rp01BHMC)MD=TL(|a92WR4{fUgmkp8iarM-s*7uvR`N6aZlD-@ktcKR{ zTOBq$K0iNO*tg%z!2x+#XejCH6@6+^k(H8`7E&UuKC*q|lLHl&mmpTmHKtj0BwfT} zHo`Knkr6I*bra)TH;;5e0x*>t+1E|Wn>Z)e@^5&L zQZgnRbJVn2OK6(oV7`&r2uyRjc(ofUKPKN9E=B zCi?@DD()HoRD*()R}0_jT$vW{_#J1J)NjtBm`=uR;WS4fNAPqINUi)ECgbL}<=$Lb z7GS_3mlI##x`j(;2{6T{j1LeJcbs;Oc?_Opqo!7x(Q~d^ihv1tSYYWK2K>eYSd2nB zmyTe~+qon=Jwe5`aajN`L&JomnYp>!=gzm6oXM%F?^8GjLC$-Bf|0QmNJ@XN5TpEf z1Ozn^VFN}oGBU1m{5A`>AnOIkU!F~-zBR3r9x%#m{T4$B-*lnj1dPEJ^am-B#g?e` zWyz*;RasdX8O21PXJL_-^nbmb^+S{2-^Oox!bBv8fPfBZ7>d#j@<9Ye8I3SP>5!Ce z1O%j&7Nt9-!-+$X5~Vw&%aO9dbH4w?v)@m`?_BDd0$nYKRz4!8nx73QZ8pW z{c})@+TdWYd-bs=GEA9!&!^3N$zhu(KVL>rK!A!X45h@_j2_cH{?Cn<^Wh_{ z!_(H;*Li$ShB}Eib$fDS;`#Z?P*AyU1_!<=jMVnIMC$qYtu-|sJ zyQ9J_%h)UO%80nGgZ0mu_UUAhqMn|fvE@^@NWN&=FgjXTK9n0_R#KkF7xLRKd~wmg z%Kyw0tjE3aCHw+#nwRKs`47>#%U;TsG-&27_C-RW(C# zHwznQ6q>Zoj#4^@KB$mjtJaL2g{K%`Vid*98cn7>kjz0rLngjl=r}*Fcz8$w< z7DXkt5Bb=e?Y5geI0*|^ywvq7jIwr*Pw(>xWp7tljip@}90dOSLV*{J+OtGZ#+)}H z^n{Ez;FO_q(v`#F{x1oQ)sD|{z^xk}=Qf*>oJ{`VF#?f#Rk&^i^)>cYSc%;|c3!t@ z8`>7#-Dk8M3a)v~&~$piFtAte+za@d^NfaNU@kQ&sdj4fFpE!Ut^auaDc?Xgp3B7d z@HgmwT2w+UGB(I*_kd2d(O6siP9F;8zV;SRyu7^pC%E5y@&>7=!2nTfNFL(95lYyBzq@@hp#M)5%GNp>j<(ah@IsxDFa2DRa z=*4d+xJ}GT&q`W6A^nDijeQGW#SUjaWRbwt5J05FNo2(b7ue1IsCbV_wd}wLpwYp3 ztV`>K*$&(=)W?)EqStYRFJ{UkcL(6Ze5DsO&DTic2@h6 z@>X8G^XfoWmDPSyXSD-}^JYAC_4ML~JhGCln~oE(k+`Cgqy4RkV=_fQCbvG}k*Y`X zr;maMS2lUNge^kMQT58E@+b8jc<8&b2{An zx5xu6#h7l=3<>A^ZFpY}Az|UtWNRtlWBqDw{>Q(vvLdV%tJR?lTM*Zx0m5o9H<)Zn z##gy(TF@85~ z@$A0!u+btmuf*HZa)k5Lrmj;FHYT2>3RUoNdZ^jwk&(>Pf@F~G-g)72PE5`;eVpnj ziJ}S@UC`gZmP4#*0mDi`F6<*6q6~izwtDXr&JM=p@wqN^EZp~AjH0jwLzFQ$`qL+} z?5ia;eMor{lKZyaEmfVmx36!mIY=@bGYH(4*igS&}+(Y9rzjP|$C?!=v@7&)#DdSx;p` z{oPGJ@9D^2s9zDhEtH5f3K(WmB*a{O!y&^g8Mk>-VzXNi7Z*1Sq?5|R-ndF+{C|l; zt0d4+UH6o*jD6o_32ibgN~8xAAgdQmbIgEMu6*`tF2f{P+LQ(nG4SJR{Bi5lc0_Zt z&-n+c)z&7z(`dN_zCbh>z26~R2c51z@{3DMHC3-shrGQ3`?BmJDJxGu8!)r+dza9r zUzu%28nkbzEED*ImyiY+hPwLCSl-Q1BePehzh#V#jdoM5-*dy*4a*;z-cLK|XMZs@ zF+OhK{CUDs`$gjYL@PoRN>RJ;CSDc&I|(E(9|J4y(UX&am0z>cH~h9Mv^0*Rbb4xh zToOIz@i6(*u%KSW1}k-V+`udIdq2$f$RFm&3r}t0<9>T&y>SjN|J~+ubmDWoGgAmh zNyhcTK2U}Y#TP#aB~j*9Tnp*#G-aevOtgB@lhQTjuV}r=1O2Q=L+)<8!G<$TwKfW5ql+<@`oWWS_tRra?r#5 z7CDi}C*Yg@ZN)HRSSmGiC8r|jKxBP#AgiTUzud^xVY@lDQhLjz0=Lvu*8FFg3yb=< z(fq6j@0W@}gq4(x#+l>7KCY<0|DR7`rf;U-;Ii=L;u$}YHLBaX8zUEv{fBH;cKR(-}6$Y+P^`4q(iG)~wYxnQt zCI$xMpEjGvr2-97%h~)Ua@jh@oBHq!4?dbbmOoSzc4>dPBJd6sK+w=nEQLXeiAa4U z{rCSZU$skbQYNIWdzaVNbUuo#liz`p{l(KLqLWc^n3pE}&|}6F`aLRkEv^2!ayv0N zopNKhh1QtIOk!h%IQlY4(4vdf%B={)gKjm&O4jmggPYeA`|(apmG-rkfI$C-xm7!0Coa&pow zRSL9x_LJv)%xL{v+{3((o(Fd0)@$V%x#J(VQ-w~)q&{Dbz$iY5X0tL3!A8b=t9+!^U_;!dgZ5|g z3Q7dH!m4nqqCHO-yMr-^$BeANJUt1Px)NMq3(Bd9--VHv*(d?d^kuXa?=)s3o_;9z zfbfQiR2i1Ubn53BkN;95L^x}DksFA~=_OLpGBc2ib)w)m5OCT%?f|}WZa=(>MKyhJ z@dj^!g+OV7>!p1nY`PRsk^S?rjsK7Wr6qR5;=)Y@f0pO5>hU|owb0}FRXEk|a$Y&a zs7BHrT*=*Px-HHt(75x(YsD z*YZY!jgqFl<^}5=Cz%&YPn7<5iiJV5J4G^wbmk;5&e}(K0Jvg_QNj?zq8NgZmtL#h zpo_{hT)d8R?fL$lB&M61`0p@OeYHRQSmESx$HKqOm@L}W^RK#JEvgNg3%e}$pWP7s z{wVwtf38h$Cj+MDQdBJ^fh0YCf6lk#`lGNfm$CEGI1=tpVOZ{oZ(>zG{W353SC|C# zcjVnO_X$^2oELF?D+qRPT;XPrpP0M-D`&MAn3l>)358ek}pFy>BmZDft`}M$oYtBX0QYR+VAn3ZKXSl-*#;5uF+czPCCbn} zGMd0^u;B5g#M^Lec2?F*enkbzE$zm|HwtBymEfWD91_|{GI^r=NG|Z=HZNl(3u8jL zVDIG4l;$Pb;^`hZT+o639#bPjP`B@~=}@h7mNp1f_GTkF5vOhV7{klZC zBmeTi24ndYkA{(CA&yG|i2t@{nmyQBkIy6dWMnpNUe;_XF0yj7$Gs61nDoM;pWedC z?3RV?KKTzEq6u&hL&Hlk=erspOQh6E6?tfA_9Gaab~X#x%XiWqCDOaYxM;K?;r=|O zDP>9uPKnuaZ%)zElUeBBYLd%JN{4`xy`%6^?_VT%j-o?huhfz$rPe9k2TN05??KQM z?I69E!Qq`9+3ruxU1%&p0EFF{$M*N6W4n@XBoGR|)ZY)f9TAV^-^l)3Guem*38xd6 zs>g2j*@UUF&YS^a!nZGt9QFP+CyuW#cZo23+nE3Ma1`783Hs9f{ESkJY3x-IIp}wi0)LjY$ANi8_RHO%ODlc4}U@ z59Y7E%{N8@0B#E~Zdqmq${k^mb{R(M%eUd=jB0kCY{!Sc^|hqqpw8VZibh819iQsl z)li6Q+gIwF>^eC*p=%Yd^87i=c;Gyj zkXZvev+%!2LEgeCYfk^V)Q+8v(j&9m6rfN6AQgGAim@icnvb7C_>$z1cuEiT*{-BP z0#f6h|3w=x-(}TlIgB`>RH`uzPN_HH${449nccYQj=&2rjg4LwQ3y-c=eSQANg==#AUqNXDk~F$ zf)H_6)%l|7nba_#kk~%iXTalPIY#bWi_-H)>mnB=Q(sk_$>^&CJDJaR&wE2vhdtN! z+V;M;lW~KeT2*eYx!SY%>yBiiY_IJ~N~+Bzf0P?E+5I@;Fq1{ls#kDbdU8YK2_w&b zCMIQl-FE&Z&;EN>)_h(HOkTyN_rv+K9iq=%;`H=%EC&b2;nug|Wa$MY z5tzTdDWzVu@Xgpu)gmEWpMbTwFM~!)!O3#@1>PlP)HZo3DL4*hXMy3J-~OD&_E9}{ zatD8^?|V(|xHS5K`i%qv*iB!s2>ZPB&XI3Z_yU#w_};JM=H{k@WF&=SUD0S(jl||F zthcSUN-NtuDdHH237A&vm2u5NNSb0ZkOYhBTzRQvYT736I4R6#`DNoe$SDF7tS3bJ z9z0M9eW9)C)~6++|3vMny?x6K!OZ`8Kz&ahX~lG$UJ5}ydHS?r_0J#Ki~Z)qg!PdE z5{OG{#3g&RmR#w?G&z3SeR*vdlq~5;of5$3!4?q}nu%+FPyJ8x_*QJwckc6LvoCt` zR&t8l%=5BIIH?}b9Cu!PBJJtv33`RUuAX#@=u@dMe^FCj?wE){s3PfE1M3KDRUcPY zNCEWnA?FTB$dcq91>tStmi#k4y`y$yR2!q3wUwcEIZ%;x`S~6`b`N?JdKqwJ(PiWQ z0fEj+bUvje8#PAd3qXa*!y<1`WZxfbbnAblkqF@~1nvv%w2|nyXz(MgwuEt9nbG&W1GY_AwfMQx|$5*^z-S-(c4%%%r(CN zXMgLJ{h|+>bzHFT92~(WS`tr4xHQmcK`osc41&esECznp9XglAQ zJA3At^Pn7J{EDr-r%}eGkk@Q3&8uJfL_4l!xpbefh(X2e9~J_X=w7;;@_LvKIy%}9 zhBws4?u%=6{~Y-#vAlZhQ}XH4!HNGdk;KZ70#Zb3^n$KvUl3nOATR))NcyJMTH@R+ z)g3s)%a$3=cy_U^;z9YdGLP?xJSgklWSZ(U^SN^l8MpZX!UZSFr!aCXM_zaCTHuxm zDdA)(kfLSAwWgvXKuj4%Lr%H`h$_D5UQ)<6yAlg6J_|~=l9=|!i`&jltEc`IrG8%9;O#40B|D0W#z%mAd51Y>WxZJ& zB=#Rl?CvMWzabpqvyWU}FEti?LKdzn%TX;~c~73%PYYu9du(3Q3stqC#JxA5_q{4J zdO_jbJa%9k!c}ueV)a7k<^k6ygcIi_U*GawTquo5!Av^Ps`EqUnX#p-2Ddz$SFZEI zI#JW+h6P;#@!t`VFyBRQ1}tPLsiwzfW>iovU~Ti;@OXP&EjHk$ z$OD>K1ejSUh?+-W*aEQz3l6~;Am!xzbAV^F-$_FBDx2HW*qhT#C7823zL7aL?{H+q z(S-?n+vS=$XHg&V76ZjC1uZoWyfkUUVnoH@WS^&+9wZ`DcBv_V;<){@g;dMf!n0-j zT|qImnhrhI$k>L4!`iXIGBGboTq{a1!j=O1^?vdVP;GwlRZ}E09%Dad?8h97Ksnfw z*|~o;!KSVd`9P!O)}2J8Ta8dHx%S$d6uGYIqjv?ipsWEc6xl`t;0UKf|7w3c!%7NM zq+Is5_hRysY-B$sC*q-8QbpuMmdVe%cic|DUeb49;Ca6ydGra35yZMq&r3F>cDlyq zE#mokd8ww?O)-NkQ_H?DX7CGBeW_{T*oEN;41DEPdj{VFZ8W+(5jm-g{&*=w9Fbbi zZTm#Vte!KBZrqUBVZiDj=kn$e0IIZPIk!pZMAN=im!(<1=eR;#$84Xjp8J0z0FgwS z#t|0FcCqBUoDi7?ip7knJe>eLP0c}k}^(P}w;-$CZ zOeN!(SeTi0pRZV{JXKlhehO?t&}Wt^I#2Fi#x_aeQ!X($RmMyKV1?(uK6(oA+ZK0D zjNgdF%3tN~gpsPV_X$9`*_tHCiekM8Q|!bxCkfk zl0oARnNA;UbS_dk0JjJ1qd>(maLCKZAYrrbc+R-C{%@=)h%Usty7$Dy#?ij?)t_}$;y5+u9KijGdzVk0w^%rljypI!xcBjm-KA&TNg-xkQ>~vypN7Yubfgo_OHq zBDrM*cI}lpW|1OUL*v@!A{)_((GBdW0po}V(}*||)|C{IiniGx_}`}^=L*Z6nSy18 z3o7_65AC|LzaFShlaVqU9O$K|qD4Sm=6hvgZ@Mk^y3{wh1!Xj6Tdg#pSOzZ6q z=?h0DO!bm84TSzABBSzcjB2VK-qpIsEuw5Q84J_ zwjQO**kwaKa*af8od~{w$-zgG-+8W|eglPDI`aGQK-`w>!m3HQm`tT@iGW~@5ZPBt zI!3e{*2|fT4C4MIP=f4>4x=Mg(^DF$uk|Ac^@SvO8#mO~V+*u0mTkm079=y&b(lc5 zDvpljWOH2O`fBl5w~pocKr5Md_O9#(HMB_ODogxj@lI?>kB^@}Nm@FDUQI_SI&5U3y-;>pc{R8H~MZU!-~ShMiuv|n_=9a z_@a@0HC6~p0~;E5y)mN5i2*qv60OyuG!o&A)fuJn-WezKPpTCULJPxflsn1nz{#^N%}Kt zo78cWF93+IxREbKH~RJe + + + + Mifos Mobile + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + \ No newline at end of file diff --git a/cmp-web/src/jsMain/resources/styles.css b/cmp-web/src/jsMain/resources/styles.css new file mode 100644 index 000000000..3e82a3d56 --- /dev/null +++ b/cmp-web/src/jsMain/resources/styles.css @@ -0,0 +1,14 @@ +html, body { + height: 100%; + margin: 0px; + padding: 0px; +} + +canvas { + width: 100vw; + height: 100vh; + display: block; + position: fixed; + top: 0; + left: 0; +} \ No newline at end of file diff --git a/cmp-web/src/wasmJsMain/kotlin/Main.kt b/cmp-web/src/wasmJsMain/kotlin/Main.kt new file mode 100644 index 000000000..fce907efc --- /dev/null +++ b/cmp-web/src/wasmJsMain/kotlin/Main.kt @@ -0,0 +1,21 @@ +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.window.CanvasBasedWindow +import org.jetbrains.compose.resources.configureWebResources +import org.mifos.mobile.shared.MifosMobileSharedApp +import org.mifos.mobile.shared.di.initKoin + +@OptIn(ExperimentalComposeUiApi::class) +fun main() { + initKoin() + + configureWebResources { + resourcePathMapping { path -> "./$path" } + } + + CanvasBasedWindow( + title = "MifosMobile", + canvasElementId = "ComposeTarget", + ) { + MifosMobileSharedApp() + } +} \ No newline at end of file diff --git a/cmp-web/src/wasmJsMain/resources/favicon.ico b/cmp-web/src/wasmJsMain/resources/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4c553d4387032bbb8b7fed5481b085812383854c GIT binary patch literal 40718 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 + + + + + Mifos Mobile + + + + + + \ No newline at end of file diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts index f831942a3..c0bd76297 100644 --- a/core/data/build.gradle.kts +++ b/core/data/build.gradle.kts @@ -35,7 +35,7 @@ kotlin { api(projects.core.common) api(projects.core.datastore) api(projects.core.model) -// api(projects.core.database) + api(projects.core.database) implementation(projects.core.network) implementation(libs.kotlinx.serialization.json) } diff --git a/core/data/src/commonMain/kotlin/org/mifos/mobile/core/data/di/RepositoryModule.kt b/core/data/src/commonMain/kotlin/org/mifos/mobile/core/data/di/RepositoryModule.kt index f56eaca0a..46d1eff16 100644 --- a/core/data/src/commonMain/kotlin/org/mifos/mobile/core/data/di/RepositoryModule.kt +++ b/core/data/src/commonMain/kotlin/org/mifos/mobile/core/data/di/RepositoryModule.kt @@ -54,7 +54,7 @@ val RepositoryModule = module { single { Json { ignoreUnknownKeys = true } } single { AccountsRepositoryImp(get(), get(ioDispatcher)) } - single { AuthenticationUserRepository(get(), get(ioDispatcher)) } + single { AuthenticationUserRepository(get(), get(named(MifosDispatchers.IO.name))) } single { BeneficiaryRepositoryImp(get(), get(ioDispatcher)) } single { ClientChargeRepositoryImp(get(), get(ioDispatcher)) } // TODO single { ClientRepositoryImp(get(), get(ioDispatcher)) } diff --git a/core/model/src/androidMain/kotlin/org/mifos/mobile/core/model/Parcelize.android.kt b/core/model/src/androidMain/kotlin/org/mifos/mobile/core/model/Parcelize.android.kt index 3d224406c..6fea8b75c 100644 --- a/core/model/src/androidMain/kotlin/org/mifos/mobile/core/model/Parcelize.android.kt +++ b/core/model/src/androidMain/kotlin/org/mifos/mobile/core/model/Parcelize.android.kt @@ -11,8 +11,11 @@ package org.mifos.mobile.core.model import android.os.Parcelable import kotlinx.parcelize.IgnoredOnParcel +import kotlinx.parcelize.Parcelize import kotlinx.parcelize.RawValue +actual typealias Parcelize = Parcelize + actual typealias Parcelable = Parcelable actual typealias IgnoredOnParcel = IgnoredOnParcel diff --git a/core/model/src/commonMain/kotlin/org/mifos/mobile/core/model/Parcelize.kt b/core/model/src/commonMain/kotlin/org/mifos/mobile/core/model/Parcelize.kt index 49880d78c..55abb1b01 100644 --- a/core/model/src/commonMain/kotlin/org/mifos/mobile/core/model/Parcelize.kt +++ b/core/model/src/commonMain/kotlin/org/mifos/mobile/core/model/Parcelize.kt @@ -9,7 +9,7 @@ */ package org.mifos.mobile.core.model -annotation class Parcelize() +expect annotation class Parcelize() expect interface Parcelable diff --git a/core/model/src/desktopMain/kotlin/org/mifos/mobile/core/model/Parcelize.desktop.kt b/core/model/src/desktopMain/kotlin/org/mifos/mobile/core/model/Parcelize.desktop.kt index b5dd3dad5..31ab6eb63 100644 --- a/core/model/src/desktopMain/kotlin/org/mifos/mobile/core/model/Parcelize.desktop.kt +++ b/core/model/src/desktopMain/kotlin/org/mifos/mobile/core/model/Parcelize.desktop.kt @@ -9,6 +9,8 @@ */ package org.mifos.mobile.core.model +actual annotation class Parcelize + actual interface Parcelable actual annotation class IgnoredOnParcel diff --git a/core/model/src/jsMain/kotlin/org/mifos/mobile/core/model/Parcelize.js.kt b/core/model/src/jsMain/kotlin/org/mifos/mobile/core/model/Parcelize.js.kt index b5dd3dad5..31ab6eb63 100644 --- a/core/model/src/jsMain/kotlin/org/mifos/mobile/core/model/Parcelize.js.kt +++ b/core/model/src/jsMain/kotlin/org/mifos/mobile/core/model/Parcelize.js.kt @@ -9,6 +9,8 @@ */ package org.mifos.mobile.core.model +actual annotation class Parcelize + actual interface Parcelable actual annotation class IgnoredOnParcel diff --git a/core/model/src/nativeMain/kotlin/org/mifos/mobile/core/model/Parcelize.native.kt b/core/model/src/nativeMain/kotlin/org/mifos/mobile/core/model/Parcelize.native.kt index b5dd3dad5..31ab6eb63 100644 --- a/core/model/src/nativeMain/kotlin/org/mifos/mobile/core/model/Parcelize.native.kt +++ b/core/model/src/nativeMain/kotlin/org/mifos/mobile/core/model/Parcelize.native.kt @@ -9,6 +9,8 @@ */ package org.mifos.mobile.core.model +actual annotation class Parcelize + actual interface Parcelable actual annotation class IgnoredOnParcel diff --git a/core/model/src/wasmJsMain/kotlin/org/mifos/mobile/core/model/Parcelize.wasmJs.kt b/core/model/src/wasmJsMain/kotlin/org/mifos/mobile/core/model/Parcelize.wasmJs.kt index b5dd3dad5..31ab6eb63 100644 --- a/core/model/src/wasmJsMain/kotlin/org/mifos/mobile/core/model/Parcelize.wasmJs.kt +++ b/core/model/src/wasmJsMain/kotlin/org/mifos/mobile/core/model/Parcelize.wasmJs.kt @@ -9,6 +9,8 @@ */ package org.mifos.mobile.core.model +actual annotation class Parcelize + actual interface Parcelable actual annotation class IgnoredOnParcel diff --git a/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/NetworkModule.kt b/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/NetworkModule.kt index 727aef6a0..b284b40bc 100644 --- a/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/NetworkModule.kt +++ b/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/NetworkModule.kt @@ -34,7 +34,7 @@ val NetworkModule = module { single(MifosClient) { KtorfitClient.builder() - .httpClient(get(KtorBaseClient)) + .httpClient(get(KtorClient)) .baseURL(BaseURL().url) .build() } diff --git a/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/Qualifier.kt b/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/Qualifier.kt index f879ce0de..bf2acc3d6 100644 --- a/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/Qualifier.kt +++ b/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/Qualifier.kt @@ -13,4 +13,3 @@ import org.koin.core.qualifier.named val MifosClient = named("MifosClient") val KtorClient = named("KtorClient") -val KtorBaseClient = named("KtorBaseClient") diff --git a/fastlane/AppFile b/fastlane/AppFile index 24e9344da..76cfee016 100644 --- a/fastlane/AppFile +++ b/fastlane/AppFile @@ -1,2 +1,2 @@ -json_key_file("androidApp/playStorePublishServiceCredentialsFile.json") +json_key_file("cmp-android/playStorePublishServiceCredentialsFile.json") package_name("org.mifos.mobile") # e.g. org.mifos.mobile \ No newline at end of file diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginScreen.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginScreen.kt index 8a3f4b35d..19ecc872d 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginScreen.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginScreen.kt @@ -100,7 +100,6 @@ internal fun LoginScreen( onAction = remember(viewModel) { { viewModel.trySendAction(it) } }, - navigateToRegisterScreen = { navigateToRegisterScreen() }, ) } @@ -111,7 +110,6 @@ private fun LoginScreen( snackbarHostState: SnackbarHostState, onAction: (LoginAction) -> Unit, modifier: Modifier = Modifier, - navigateToRegisterScreen: () -> Unit, ) { MifosScaffold( snackbarHostState = snackbarHostState, @@ -124,7 +122,6 @@ private fun LoginScreen( modifier = modifier .fillMaxSize() .padding(paddingValues), - createAccount = navigateToRegisterScreen, ) } } @@ -155,13 +152,13 @@ private fun LoginScreenContent( state: LoginState, modifier: Modifier = Modifier, onAction: (LoginAction) -> Unit, - createAccount: () -> Unit, ) { val keyboardController = LocalSoftwareKeyboardController.current Column( modifier = modifier .fillMaxSize() + .padding(7.dp) .verticalScroll(rememberScrollState()) .pointerInput(Unit) { detectTapGestures( @@ -204,8 +201,7 @@ private fun LoginScreenContent( MifosButton( modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp, top = 4.dp), + .fillMaxWidth(), contentPadding = PaddingValues(12.dp), enabled = state.isLoginButtonEnabled, onClick = { @@ -251,7 +247,7 @@ private fun LoginScreenContent( } MifosButton( - onClick = createAccount, + onClick = { onAction(LoginAction.SignupClicked) }, modifier = Modifier .fillMaxWidth() .align(Alignment.CenterHorizontally), @@ -269,7 +265,6 @@ private fun LoanScreenPreview() { state = LoginState(dialogState = null), snackbarHostState = remember { SnackbarHostState() }, onAction = {}, - navigateToRegisterScreen = {}, ) } } diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginViewModel.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginViewModel.kt index a732aac0b..9a5984d00 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginViewModel.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginViewModel.kt @@ -117,6 +117,11 @@ class LoginViewModel( viewModelScope.launch { val result = userAuthRepositoryImpl.login(username, password) + when (result) { + is DataState.Error -> sendEvent(LoginEvent.ShowToast(result.message)) + is DataState.Loading -> mutableStateFlow.update { it.copy(dialogState = LoginState.DialogState.Loading) } + is DataState.Success -> sendEvent(LoginEvent.ShowToast("Logged in")) // navigate + } sendAction(LoginAction.Internal.ReceiveLoginResult(result)) } } diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt index 14e1742bd..66ae6455f 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt @@ -72,7 +72,7 @@ private fun NavGraphBuilder.registrationRoute( ) { composable(route = AuthenticationNavigation.Registration.route) { RegistrationScreen( - onVerified = onRegistered, + navigateToVerification = onRegistered, navigateBack = navigateBack, ) } @@ -84,8 +84,8 @@ private fun NavGraphBuilder.registrationVerificationRoute( ) { composable(route = AuthenticationNavigation.RegistrationVerification.route) { RegistrationVerificationScreen( - onVerified = onRegistrationVerified, - navigateBack = navigateBack, + navigateToLogin = onRegistrationVerified, + navigateToRegister = navigateBack, ) } } diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationScreen.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationScreen.kt index c7b6dbce9..4bf27845b 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationScreen.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationScreen.kt @@ -22,7 +22,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LinearProgressIndicator @@ -76,7 +75,7 @@ import org.mifos.mobile.core.ui.utils.EventsEffect @Composable internal fun RegistrationScreen( - onVerified: () -> Unit, + navigateToVerification: () -> Unit, navigateBack: () -> Unit, modifier: Modifier = Modifier, viewModel: RegistrationViewModel = koinViewModel(), @@ -94,14 +93,14 @@ internal fun RegistrationScreen( } } - is SignUpEvent.NavigateToLogin -> onVerified.invoke() + is SignUpEvent.NavigateToVerification -> navigateToVerification.invoke() + is SignUpEvent.NavigateBack -> navigateBack.invoke() } } RegistrationScreen( state = state, snackbarHostState = snackbarHostState, - navigateBack = navigateBack, onAction = remember(viewModel) { { viewModel.trySendAction(it) } }, @@ -113,14 +112,13 @@ internal fun RegistrationScreen( private fun RegistrationScreen( state: SignUpState, snackbarHostState: SnackbarHostState, - navigateBack: () -> Unit, onAction: (SignUpAction) -> Unit, modifier: Modifier = Modifier, ) { MifosScaffold( snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, topBarTitle = stringResource(Res.string.register), - backPress = navigateBack, + backPress = { onAction(SignUpAction.BackPress) }, modifier = modifier, content = { contentPadding -> Box( @@ -163,7 +161,7 @@ private fun RegistrationScreenContent( Column( modifier = Modifier .fillMaxSize() - .padding(bottom = 12.dp) + .padding(11.dp) .pointerInput(Unit) { detectTapGestures( onTap = { @@ -187,7 +185,7 @@ private fun RegistrationScreenContent( ) MifosOutlinedTextField( value = state.userNameInput, - onValueChange = { onAction(SignUpAction.EmailInputChange(it)) }, + onValueChange = { onAction(SignUpAction.UserNameInputChange(it)) }, label = stringResource(Res.string.username), modifier = Modifier.fillMaxWidth(), isError = state.userNameInput.isEmpty(), @@ -269,8 +267,7 @@ private fun RegistrationScreenContent( LinearProgressIndicator( progress = { progress }, modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp), + .fillMaxWidth().padding(top = 5.dp), color = when (progress) { 0.25f -> Color.Red 0.5f -> Color(alpha = 255, red = 220, green = 185, blue = 0) @@ -302,24 +299,21 @@ private fun RegistrationScreenContent( } }, isError = state.confirmPasswordInput.isEmpty(), - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), ) Row( modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp), + .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { Text( text = stringResource(Res.string.verification_mode), - modifier = Modifier.padding(end = 8.dp), color = MaterialTheme.colorScheme.onSurface, ) radioOptions.forEach { authMode -> RadioButton( selected = (authMode == state.authenticationMode), -// onClick = { authenticationMode = authMode }, onClick = { onAction(SignUpAction.AuthenticationMode(authMode)) }, ) Text( @@ -330,20 +324,16 @@ private fun RegistrationScreenContent( } MifosButton( - text = { stringResource(Res.string.register) }, onClick = { onAction(SignUpAction.SubmitClick) - keyboardController?.hide() }, modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp, top = 4.dp), + .fillMaxWidth(), contentPadding = PaddingValues(12.dp), - colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.primary, - ), - ) + ) { + Text(text = stringResource(Res.string.register)) + } Spacer(modifier = Modifier.imePadding()) } @@ -356,7 +346,6 @@ private fun RegistrationScreenPreview() { RegistrationScreen( state = SignUpState(dialogState = null), snackbarHostState = remember { SnackbarHostState() }, - navigateBack = {}, onAction = {}, modifier = Modifier, ) diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationScreen.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationScreen.kt index a551f49a1..b3dcd2fbe 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationScreen.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationScreen.kt @@ -12,17 +12,15 @@ package org.mifos.mobile.feature.auth.registration import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -49,11 +47,10 @@ import mifos_mobile.feature.auth.generated.resources.yes import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel +import org.mifos.mobile.core.common.FileUtils.Companion.logger import org.mifos.mobile.core.designsystem.component.BasicDialogState -import org.mifos.mobile.core.designsystem.component.LoadingDialogState import org.mifos.mobile.core.designsystem.component.MifosBasicDialog import org.mifos.mobile.core.designsystem.component.MifosButton -import org.mifos.mobile.core.designsystem.component.MifosLoadingDialog import org.mifos.mobile.core.designsystem.component.MifosOutlinedTextField import org.mifos.mobile.core.designsystem.component.MifosScaffold import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme @@ -63,8 +60,8 @@ import org.mifos.mobile.core.ui.utils.EventsEffect @Composable internal fun RegistrationVerificationScreen( - navigateBack: () -> Unit?, - onVerified: () -> Unit, + navigateToRegister: () -> Unit?, + navigateToLogin: () -> Unit, viewModel: RegistrationVerificationViewModel = koinViewModel(), ) { val state by viewModel.stateFlow.collectAsStateWithLifecycle() @@ -72,17 +69,16 @@ internal fun RegistrationVerificationScreen( val snackbarHostState = remember { SnackbarHostState() } BackCallback(isEnabled = true) { - VerificationAction.ConfirmationDialog(true) + logger.d { "back press clicked" } + viewModel.trySendAction(VerificationAction.ConfirmationDialog(true)) } VerificationDialogs( dialogState = state.dialogState, - showConfirmationDialog = state.showConfirmationDialog, - onDismissRequest = { VerificationAction.ConfirmationDialog(false) }, - onConfirmExit = { - VerificationAction.ConfirmationDialog(false) - navigateBack() + onAction = remember(viewModel) { + { viewModel.trySendAction(it) } }, + onDismissRequest = { viewModel.trySendAction(VerificationAction.ConfirmationDialog(false)) }, ) EventsEffect(viewModel) { event -> @@ -93,10 +89,10 @@ internal fun RegistrationVerificationScreen( } } is VerificationEvent.NavigateToLogin -> { - onVerified.invoke() + navigateToLogin.invoke() } - is VerificationEvent.NavigateToRegister -> { - navigateBack.invoke() + is VerificationEvent.NavigateToRegistration -> { + navigateToRegister.invoke() } } } @@ -106,16 +102,14 @@ internal fun RegistrationVerificationScreen( { viewModel.trySendAction(it) } }, snackbarHostState = snackbarHostState, - navigateBack = { VerificationAction.ConfirmationDialog(true) }, ) } @Composable private fun VerificationDialogs( + onAction: (VerificationAction) -> Unit, dialogState: VerificationState.VerificationDialog?, - showConfirmationDialog: Boolean, onDismissRequest: () -> Unit, - onConfirmExit: () -> Unit, ) { when (dialogState) { is VerificationState.VerificationDialog.Error -> MifosBasicDialog( @@ -126,15 +120,9 @@ private fun VerificationDialogs( onDismissRequest = onDismissRequest, ) - is VerificationState.VerificationDialog.Loading -> MifosLoadingDialog( - visibilityState = LoadingDialogState.Shown, - ) - - null -> Unit - } + is VerificationState.VerificationDialog.Loading -> MifosProgressIndicatorOverlay() - if (showConfirmationDialog) { - MifosBasicDialog( + is VerificationState.VerificationDialog.ConfirmationDialog -> MifosBasicDialog( visibilityState = BasicDialogState.Shown( title = stringResource(Res.string.dialog_cancel_registration_title), message = stringResource(Res.string.dialog_cancel_registration_message), @@ -142,8 +130,10 @@ private fun VerificationDialogs( confirmText = stringResource(Res.string.yes), cancelText = stringResource(Res.string.no), onDismissRequest = onDismissRequest, - onConfirm = onConfirmExit, + onConfirm = { onAction(VerificationAction.NavigateToRegistration) }, ) + + null -> Unit } } @@ -152,12 +142,11 @@ private fun RegistrationVerificationScreen( state: VerificationState, onAction: (VerificationAction) -> Unit, snackbarHostState: SnackbarHostState, - navigateBack: () -> Unit, modifier: Modifier = Modifier, ) { MifosScaffold( topBarTitle = stringResource(Res.string.register), - backPress = navigateBack, + backPress = { onAction(VerificationAction.ConfirmationDialog(true)) }, modifier = modifier, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, content = { contentPadding -> @@ -167,11 +156,6 @@ private fun RegistrationVerificationScreen( .fillMaxSize(), ) { RegistrationVerificationContent(state = state, onAction = onAction) - when (state.dialogState) { - is VerificationState.VerificationDialog.Loading -> MifosProgressIndicatorOverlay() - is VerificationState.VerificationDialog.Error -> {} - null -> {} - } } }, ) @@ -184,7 +168,7 @@ private fun RegistrationVerificationContent( modifier: Modifier = Modifier, ) { Column( - modifier = modifier.fillMaxSize(), + modifier = modifier.fillMaxSize().padding(11.dp), ) { Image( painter = painterResource(Res.drawable.feature_auth_mifos_logo), @@ -222,20 +206,21 @@ private fun RegistrationVerificationContent( label = stringResource(Res.string.authentication_token), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), ) + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(50.dp), + ) MifosButton( - text = { stringResource(Res.string.verify) }, onClick = { onAction(VerificationAction.SubmitClick) }, modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp, top = 12.dp), - contentPadding = PaddingValues(12.dp), - colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.primary, - ), - ) + .fillMaxWidth(), + ) { + Text(text = stringResource(Res.string.verify)) + } } } diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationViewModel.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationViewModel.kt index 3f50eecdb..445ef27b6 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationViewModel.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationViewModel.kt @@ -15,8 +15,6 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import mifos_mobile.feature.auth.generated.resources.Res import mifos_mobile.feature.auth.generated.resources.could_not_register_user_error -import mifos_mobile.feature.auth.generated.resources.empty_authentication_token -import mifos_mobile.feature.auth.generated.resources.empty_requestid import mifos_mobile.feature.auth.generated.resources.verified import org.mifos.mobile.core.data.repository.UserAuthRepository import org.mifos.mobile.core.model.Parcelable @@ -42,9 +40,30 @@ class RegistrationVerificationViewModel( is VerificationAction.AuthenticationTokenChange -> updateState { it.copy(authenticationToken = action.authenticationToken) } is VerificationAction.RequestIdChange -> updateState { it.copy(requestId = action.requestId) } is VerificationAction.RequestIdError -> updateState { it.copy(requestIdError = false) } - is VerificationAction.ConfirmationDialog -> updateState { it.copy(showConfirmationDialog = action.confirmationDialog) } + is VerificationAction.ConfirmationDialog -> { + updateState { it -> + it.copy( + confirmationDialog = action.confirmationDialog, + dialogState = if (action.confirmationDialog) { + VerificationState.VerificationDialog.ConfirmationDialog( + title = "Cancel Registration?", + message = "Are you sure you want to cancel registration?", + confirmText = "Yes", + cancelText = "No", + onConfirm = { + updateState { it.copy(dialogState = null, confirmationDialog = false) } + sendEvent(VerificationEvent.NavigateToRegistration) + }, + ) + } else { + null + }, + ) + } + } is VerificationAction.Internal.ReceiveRegisterResult -> handleVerificationResult(action) is VerificationAction.SubmitClick -> handleSubmitClick() + is VerificationAction.NavigateToRegistration -> sendEvent(VerificationEvent.NavigateToRegistration) VerificationAction.ErrorDialogDismiss -> updateState { it.copy(dialogState = null) } } } @@ -52,7 +71,7 @@ class RegistrationVerificationViewModel( private fun handleSubmitClick() { val errorMessage = validateForm() if (errorMessage != null) { - updateState { it.copy(dialogState = VerificationState.VerificationDialog.Error(errorMessage)) } + sendEvent(VerificationEvent.ShowToast(errorMessage)) } else { verifyUser() } @@ -80,8 +99,8 @@ class RegistrationVerificationViewModel( // TODO:: move error messages to strings.xml private fun validateForm(): String? { return when { - state.authenticationToken.isEmpty() -> Res.string.empty_authentication_token.toString() - state.requestId.isEmpty() -> Res.string.empty_requestid.toString() + state.authenticationToken.isEmpty() -> "Authentication Token cannot be empty" + state.requestId.isEmpty() -> "Request ID cannot be empty" else -> null } } @@ -113,32 +132,42 @@ data class VerificationState( val authenticationToken: String = "", val requestId: String = "", val requestIdError: Boolean = false, - val showConfirmationDialog: Boolean = false, + val confirmationDialog: Boolean = false, val dialogState: VerificationDialog? = null, ) : Parcelable { - sealed interface VerificationDialog : Parcelable { + sealed class VerificationDialog : Parcelable { + @Parcelize + data object Loading : VerificationDialog() + @Parcelize - data object Loading : VerificationDialog + data class Error(val message: String) : VerificationDialog() @Parcelize - data class Error(val message: String) : VerificationDialog + data class ConfirmationDialog( + val title: String, + val message: String, + val confirmText: String, + val cancelText: String, + val onConfirm: () -> Unit, + ) : VerificationDialog() } } -sealed interface VerificationEvent { - data class ShowToast(val message: String) : VerificationEvent - data class NavigateToLogin(val username: String) : VerificationEvent - data object NavigateToRegister : VerificationEvent -} -sealed interface VerificationAction { - data class RequestIdChange(val requestId: String) : VerificationAction - data class AuthenticationTokenChange(val authenticationToken: String) : VerificationAction - data class ConfirmationDialog(val confirmationDialog: Boolean) : VerificationAction - data object RequestIdError : VerificationAction - data object SubmitClick : VerificationAction - data object ErrorDialogDismiss : VerificationAction +sealed class VerificationEvent { + data class ShowToast(val message: String) : VerificationEvent() + data class NavigateToLogin(val username: String) : VerificationEvent() + data object NavigateToRegistration : VerificationEvent() +} - sealed class Internal : VerificationAction { +sealed class VerificationAction { + data class RequestIdChange(val requestId: String) : VerificationAction() + data class AuthenticationTokenChange(val authenticationToken: String) : VerificationAction() + data class ConfirmationDialog(val confirmationDialog: Boolean) : VerificationAction() + data object RequestIdError : VerificationAction() + data object SubmitClick : VerificationAction() + data object ErrorDialogDismiss : VerificationAction() + data object NavigateToRegistration : VerificationAction() + sealed class Internal : VerificationAction() { data class ReceiveRegisterResult( val registerResult: DataState, ) : Internal() diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationViewModel.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationViewModel.kt index 00d28f92d..529d07310 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationViewModel.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationViewModel.kt @@ -16,19 +16,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import mifos_mobile.feature.auth.generated.resources.Res import mifos_mobile.feature.auth.generated.resources.could_not_register_user_error -import mifos_mobile.feature.auth.generated.resources.error_enter_account_number -import mifos_mobile.feature.auth.generated.resources.error_enter_country -import mifos_mobile.feature.auth.generated.resources.error_enter_email -import mifos_mobile.feature.auth.generated.resources.error_enter_first_name -import mifos_mobile.feature.auth.generated.resources.error_enter_last_name -import mifos_mobile.feature.auth.generated.resources.error_enter_mobile_number -import mifos_mobile.feature.auth.generated.resources.error_enter_user_name -import mifos_mobile.feature.auth.generated.resources.error_invalid_email -import mifos_mobile.feature.auth.generated.resources.error_invalid_password -import mifos_mobile.feature.auth.generated.resources.error_mobile_length -import mifos_mobile.feature.auth.generated.resources.error_password_not_match -import mifos_mobile.feature.auth.generated.resources.invalid_phn_number -import mifos_mobile.feature.auth.generated.resources.password_strength_weak +import org.mifos.mobile.core.common.FileUtils.Companion.logger import org.mifos.mobile.core.common.utils.isValidEmail import org.mifos.mobile.core.data.repository.UserAuthRepository import org.mifos.mobile.core.model.IgnoredOnParcel @@ -66,7 +54,7 @@ class RegistrationViewModel( is SignUpAction.PasswordInputChange -> handlePasswordInput(action.password) is SignUpAction.ConfirmPasswordInputChange -> updateState { it.copy(confirmPasswordInput = action.confirmPassword) } is SignUpAction.UserNameInputChange -> updateState { it.copy(userNameInput = action.username) } - is SignUpAction.CountryInputChange -> updateState { it.copy(countryInput = action.country) } +// is SignUpAction.CountryInputChange -> updateState { it.copy(countryInput = action.country) } is SignUpAction.IsPasswordChanges -> updateState { it.copy(isPasswordChanged = true) } is SignUpAction.AuthenticationMode -> updateState { it.copy( @@ -83,12 +71,13 @@ class RegistrationViewModel( is SignUpAction.ConfirmTogglePasswordVisibility -> updateState { it.copy( isConfirmPasswordVisible = !it - .isPasswordVisible, + .isConfirmPasswordVisible, ) } is SignUpAction.Internal.ReceivePasswordStrengthResult -> handlePasswordStrengthResult(action) is SignUpAction.Internal.ReceiveRegisterResult -> handleRegisterResult(action) is SignUpAction.SubmitClick -> handleSubmitClick() + is SignUpAction.BackPress -> sendEvent(SignUpEvent.NavigateBack) SignUpAction.ErrorDialogDismiss -> updateState { it.copy(dialogState = null) } } } @@ -129,8 +118,9 @@ class RegistrationViewModel( private fun handleSubmitClick() { val errorMessage = validateForm() + logger.d { "handleSubmitClick: $errorMessage" } if (errorMessage != null) { - updateState { it.copy(dialogState = SignUpDialog.Error(errorMessage)) } + sendEvent(SignUpEvent.ShowToast(errorMessage)) } else { registerUser() } @@ -140,12 +130,17 @@ class RegistrationViewModel( when (val result = action.registerResult) { is DataState.Success -> { updateState { it.copy(dialogState = null) } - sendEvent(SignUpEvent.NavigateToLogin(result.data)) + sendEvent(SignUpEvent.NavigateToVerification(result.data)) } is DataState.Error -> { updateState { - it.copy(dialogState = SignUpDialog.Error(result.exception.message ?: "An error occurred.")) + it.copy( + dialogState = SignUpDialog.Error( + result.exception.message + ?: "An error occurred.", + ), + ) } } @@ -155,47 +150,37 @@ class RegistrationViewModel( } } - // TODO:: move error messages to strings.xml private fun validateForm(): String? { return when { - state.accountNumber.isEmpty() -> Res.string.error_enter_account_number.toString() - state.firstNameInput.isEmpty() -> Res.string.error_enter_first_name.toString() - state.lastNameInput.isEmpty() -> Res.string.error_enter_last_name.toString() - state.userNameInput.isEmpty() -> Res.string.error_enter_user_name.toString() - state.emailInput.isEmpty() -> Res.string.error_enter_email.toString() - !state.emailInput.isValidEmail() -> Res.string.error_invalid_email.toString() - state.mobileNumberInput.isEmpty() -> Res.string.error_enter_mobile_number.toString() - state.mobileNumberInput.length < 10 -> Res.string.error_mobile_length.toString() - isPhoneNumberValid(state.mobileNumberInput) -> Res.string.invalid_phn_number.toString() - state.passwordInput.length < 8 -> Res.string.error_invalid_password.toString() - !state.isPasswordMatch -> Res.string.error_password_not_match.toString() - !state.isPasswordStrong -> Res.string.password_strength_weak.toString() - state.countryInput.isEmpty() -> Res.string.error_enter_country.toString() + state.accountNumber.isEmpty() -> "Please enter an account number" + state.firstNameInput.isEmpty() -> "Please enter first name" + state.lastNameInput.isEmpty() -> "Please enter last name" + state.userNameInput.isEmpty() -> "Please enter username" + state.emailInput.isEmpty() -> "Please enter email" + !state.emailInput.isValidEmail() -> "Invalid email format" + state.mobileNumberInput.isEmpty() -> "Please enter mobile number" + state.mobileNumberInput.length < 10 -> "Mobile number must be at least 10 digits" + state.passwordInput.length < 8 -> "Password must be at least 8 characters" + !state.isPasswordMatch -> "Passwords do not match" + !state.isPasswordStrong -> "Password is too weak" +// state.countryInput.isEmpty() -> "Please enter country" else -> null } } - private fun isPhoneNumberValid(fieldText: String?): Boolean { - if (fieldText.isNullOrBlank()) { - return false - } - - val phoneNumberPattern = "^\\+?[0-9]{10,15}\$" - val regex = phoneNumberPattern.toRegex() - return regex.matches(fieldText.trim()) - } - private fun registerUser() { viewModelScope.launch { updateState { it.copy(dialogState = SignUpDialog.Loading) } try { + logger.d { state.authenticationMode } userAuthRepositoryImpl.registerUser( accountNumber = state.accountNumber, authenticationMode = state.authenticationMode, email = state.emailInput, firstName = state.firstNameInput, lastName = state.lastNameInput, - mobileNumber = state.countryInput + state.mobileNumberInput, +// mobileNumber = state.countryInput + state.mobileNumberInput, + mobileNumber = state.mobileNumberInput, password = state.passwordInput, username = state.userNameInput, ) @@ -206,7 +191,17 @@ class RegistrationViewModel( ), ) } catch (e: Exception) { - updateState { it.copy(dialogState = SignUpDialog.Error((e.message ?: Res.string.could_not_register_user_error).toString())) } + updateState { + it.copy( + dialogState = SignUpDialog.Error( + ( + e.message + ?: Res.string + .could_not_register_user_error + ).toString(), + ), + ) + } } } } @@ -222,9 +217,9 @@ data class SignUpState( val passwordInput: String = "", val confirmPasswordInput: String = "", val mobileNumberInput: String = "", - val countryInput: String = "", +// val countryInput: String = "", val dialogState: SignUpDialog? = null, - val authenticationMode: String = "Email", + val authenticationMode: String = "email", val isPasswordChanged: Boolean = false, val passwordStrengthState: PasswordStrengthState = PasswordStrengthState.NONE, val isPasswordVisible: Boolean = false, @@ -257,30 +252,32 @@ sealed interface SignUpDialog : Parcelable { @Parcelize data class Error(val message: String) : SignUpDialog } - -sealed interface SignUpEvent { - data class ShowToast(val message: String) : SignUpEvent - data class NavigateToLogin(val username: String) : SignUpEvent +sealed class SignUpEvent { + data class ShowToast(val message: String) : SignUpEvent() + data class NavigateToVerification(val username: String) : SignUpEvent() + data object NavigateBack : SignUpEvent() } -sealed interface SignUpAction { - data class AccountInputChange(val accountNumber: String) : SignUpAction - data class UserNameInputChange(val username: String) : SignUpAction - data class FirstNameInputChange(val firstName: String) : SignUpAction - data class LastNameInputChange(val lastName: String) : SignUpAction - data class EmailInputChange(val email: String) : SignUpAction - data class PasswordInputChange(val password: String) : SignUpAction - data class ConfirmPasswordInputChange(val confirmPassword: String) : SignUpAction - data class MobileNumberInputChange(val mobileNumber: String) : SignUpAction - data class CountryInputChange(val country: String) : SignUpAction - data class AuthenticationMode(val authenticationMode: String) : SignUpAction - data class IsPasswordChanges(val isPasswordChanged: Boolean) : SignUpAction - data object TogglePasswordVisibility : SignUpAction - data object ConfirmTogglePasswordVisibility : SignUpAction - data object SubmitClick : SignUpAction - data object ErrorDialogDismiss : SignUpAction +sealed class SignUpAction { + data class AccountInputChange(val accountNumber: String) : SignUpAction() + data class UserNameInputChange(val username: String) : SignUpAction() + data class FirstNameInputChange(val firstName: String) : SignUpAction() + data class LastNameInputChange(val lastName: String) : SignUpAction() + data class EmailInputChange(val email: String) : SignUpAction() + data class PasswordInputChange(val password: String) : SignUpAction() + data class ConfirmPasswordInputChange(val confirmPassword: String) : SignUpAction() + data class MobileNumberInputChange(val mobileNumber: String) : SignUpAction() + +// data class CountryInputChange(val country: String) : SignUpAction() + data class AuthenticationMode(val authenticationMode: String) : SignUpAction() + data class IsPasswordChanges(val isPasswordChanged: Boolean) : SignUpAction() + data object TogglePasswordVisibility : SignUpAction() + data object ConfirmTogglePasswordVisibility : SignUpAction() + data object SubmitClick : SignUpAction() + data object BackPress : SignUpAction() + data object ErrorDialogDismiss : SignUpAction() - sealed class Internal : SignUpAction { + sealed class Internal : SignUpAction() { data class ReceiveRegisterResult( val registerResult: DataState, ) : Internal() diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5797c0f77..6329c1b42 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -86,7 +86,7 @@ ktorfit = "2.2.0" ktorfitKsp = "2.2.0-1.0.29" # Koin CMP Dependencies -koin = "4.0.1-RC1" +koin = "4.0.2" koinAnnotationsVersion = "1.4.0-RC4" # CMP Libraries @@ -117,6 +117,7 @@ packageNamespace = "org.mifos.desktop" packageVersion = "1.0.0" roomCommonVersion = "2.6.1" materialVersion = "1.10.0" +material = "1.12.0" [libraries] accompanist-pager = { group = "com.google.accompanist", name = "accompanist-pager", version.ref = "accompanistVersion" } @@ -317,6 +318,7 @@ moko-permission-compose = { group = "dev.icerock.moko", name = "permissions-comp window-size = { group = "dev.chrisbanes.material3", name = "material3-window-size-class-multiplatform", version.ref = "windowsSizeClass" } androidx-room-common = { group = "androidx.room", name = "room-common", version.ref = "roomCommonVersion" } +material = { group = "com.google.android.material", name = "material", version.ref = "material" } [bundles] androidx-compose-ui-test = [ diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock new file mode 100644 index 000000000..0d38cc329 --- /dev/null +++ b/kotlin-js-store/yarn.lock @@ -0,0 +1,2897 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@js-joda/core@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@js-joda/core/-/core-3.2.0.tgz#3e61e21b7b2b8a6be746df1335cf91d70db2a273" + integrity sha512-PMqgJ0sw5B7FKb2d5bWYIoxjri+QlW/Pys7+Rw82jSH0QN3rB05jZ/VrrsUdh1w4+i2kw9JOejXGq/KhDOX7Kg== + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== + +"@socket.io/component-emitter@~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/cors@^2.8.12": + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + +"@types/estree@^1.0.5": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" + integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express-serve-static-core@^4.17.33": + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/express@^4.17.13": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/http-proxy@^1.17.8": + version "1.17.15" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.15.tgz#12118141ce9775a6499ecb4c01d02f90fc839d36" + integrity sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ== + dependencies: + "@types/node" "*" + +"@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@>=10.0.0": + version "22.13.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.1.tgz#a2a3fefbdeb7ba6b89f40371842162fac0934f33" + integrity sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew== + dependencies: + undici-types "~6.20.0" + +"@types/qs@*": + version "6.9.18" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" + integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.1": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + +"@types/sockjs@^0.3.33": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== + dependencies: + "@types/node" "*" + +"@types/ws@^8.5.5": + version "8.5.14" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.14.tgz#93d44b268c9127d96026cf44353725dd9b6c3c21" + integrity sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw== + dependencies: + "@types/node" "*" + +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.12.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== + dependencies: + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== + +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== + +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== + +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== + +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" + +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== + +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" + integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== + +"@webpack-cli/info@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" + integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== + +"@webpack-cli/serve@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" + integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== + +acorn@^8.7.1, acorn@^8.8.2: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + 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@^8.0.0, ajv@^8.9.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +body-parser@1.20.3, body-parser@^1.19.0: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + 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.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.3.0" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722" + integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== + dependencies: + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.21.10: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== + dependencies: + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind-apply-helpers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bound@^1.0.2, call-bound@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" + integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== + dependencies: + call-bind-apply-helpers "^1.0.1" + get-intrinsic "^1.2.6" + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001688: + version "1.0.30001696" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz#00c30a2fc11e3c98c25e5125418752af3ae2f49f" + integrity sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ== + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.1, chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.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" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.10, colorette@^2.0.14: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +compressible@~2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93" + integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q== + dependencies: + bytes "3.1.2" + compressible "~2.0.18" + debug "2.6.9" + negotiator "~0.6.4" + on-headers "~1.0.2" + safe-buffer "5.2.1" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== + +cookie@~0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cross-spawn@^7.0.3: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== + +date-format@^4.0.14: + version "4.0.14" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" + integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0, debug@^4.3.4, debug@^4.3.5: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== + +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + +dns-packet@^5.2.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.5.73: + version "1.5.91" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.91.tgz#cf5567f6853062493242133aefd4dc8dc8440abd" + integrity sha512-sNSHHyq048PFmZY4S90ax61q+gLCs0X0YmcOII9wG9S2XwbVr+h4VW2wWhnbp/Eys3cCwTxVF292W3qPaxIapQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +engine.io-parser@~5.2.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== + +engine.io@~6.6.0: + version "6.6.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.4.tgz#0a89a3e6b6c1d4b0c2a2a637495e7c149ec8d8ee" + integrity sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g== + dependencies: + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.7.2" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.17.1" + +enhanced-resolve@^5.17.1: + version "5.18.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz#91eb1db193896b9801251eeff1c6980278b1e404" + integrity sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ent@~2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.2.tgz#22a5ed2fd7ce0cbcff1d1474cf4909a44bdb6e85" + integrity sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + punycode "^1.4.1" + safe-regex-test "^1.1.0" + +envinfo@^7.7.3: + version "7.14.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" + integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== + +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" + integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== + +es-object-atoms@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + 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@^4.17.3: + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.7.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.12" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.7: + version "3.3.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== + +follow-redirects@^1.0.0: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +format-util@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" + integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-monkey@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.6.tgz#8ead082953e88d992cf3ff844faa907b26756da2" + integrity sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.7.tgz#dcfcb33d3272e15f445d15124bc0a216189b9044" + integrity sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + function-bind "^1.1.2" + get-proto "^1.0.0" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3, glob@^7.1.7: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + 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@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" + integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.9" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.9.tgz#b817b3ca0edea6236225000d795378707c169cec" + integrity sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw== + +http-proxy-middleware@^2.0.3: + version "2.0.7" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6" + integrity sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA== + dependencies: + "@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" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +import-local@^3.0.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +karma-chrome-launcher@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz#eb9c95024f2d6dfbb3748d3415ac9b381906b9a9" + integrity sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q== + dependencies: + which "^1.2.1" + +karma-mocha@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" + integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== + dependencies: + minimist "^1.2.3" + +karma-sourcemap-loader@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.4.0.tgz#b01d73f8f688f533bcc8f5d273d43458e13b5488" + integrity sha512-xCRL3/pmhAYF3I6qOrcn0uhbQevitc2DERMPH82FMnG+4WReoGcGFZb1pURf2a5apyrOHRdvD+O6K7NljqKHyA== + dependencies: + graceful-fs "^4.2.10" + +karma-webpack@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.1.tgz#4eafd31bbe684a747a6e8f3e4ad373e53979ced4" + integrity sha512-oo38O+P3W2mSPCSUrQdySSPv1LvPpXP+f+bBimNomS5sW+1V4SuhCuW8TfJzV+rDv921w2fDSDw0xJbPe6U+kQ== + dependencies: + glob "^7.1.3" + minimatch "^9.0.3" + webpack-merge "^4.1.5" + +karma@6.4.4: + version "6.4.4" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.4.tgz#dfa5a426cf5a8b53b43cd54ef0d0d09742351492" + integrity sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w== + dependencies: + "@colors/colors" "1.5.0" + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.5.1" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.4.1" + mime "^2.5.2" + minimatch "^3.0.4" + mkdirp "^0.5.5" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^4.7.2" + source-map "^0.6.1" + tmp "^0.2.1" + ua-parser-js "^0.7.30" + yargs "^16.1.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kotlin-web-helpers@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kotlin-web-helpers/-/kotlin-web-helpers-2.0.0.tgz#b112096b273c1e733e0b86560998235c09a19286" + integrity sha512-xkVGl60Ygn/zuLkDPx+oHj7jeLR7hCvoNF99nhwXMn8a3ApB4lLiC9pk4ol4NHPjyoCbvQctBqvzUcp8pkqyWw== + dependencies: + format-util "^1.0.5" + +launch-editor@^2.6.0: + version "2.9.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.9.1.tgz#253f173bd441e342d4344b4dae58291abb425047" + integrity sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.8.1" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log4js@^6.4.1: + version "6.9.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.9.1.tgz#aba5a3ff4e7872ae34f8b4c533706753709e38b6" + integrity sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g== + dependencies: + date-format "^4.0.14" + debug "^4.3.4" + flatted "^3.2.7" + rfdc "^1.3.0" + streamroller "^3.1.5" + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.4.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== + dependencies: + fs-monkey "^1.0.4" + +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +"mime-db@>= 1.43.0 < 2": + version "1.53.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1, minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.3: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.3, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mocha@10.7.3: + version "10.7.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" + integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + 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" + +readable-stream@^3.0.6: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.20.0: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +rfdc@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0, schema-utils@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.0.tgz#3b669f04f71ff2dfb5aba7ce2d5a9d79b35622c0" + integrity sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== + dependencies: + "@types/node-forge" "^1.3.0" + node-forge "^1" + +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + 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" + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + 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" + +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.0.6: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +socket.io-adapter@~2.5.2: + version "2.5.5" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" + integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg== + dependencies: + debug "~4.3.4" + ws "~8.17.1" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io@^4.7.2: + version "4.8.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.1.tgz#fa0eaff965cc97fdf4245e8d4794618459f7558a" + integrity sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.6.0" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-map-js@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-loader@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-5.0.0.tgz#f593a916e1cc54471cfc8851b905c8a845fc7e38" + integrity sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA== + dependencies: + iconv-lite "^0.6.3" + source-map-js "^1.0.2" + +source-map-support@0.5.21, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + 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" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +streamroller@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" + integrity sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw== + dependencies: + date-format "^4.0.14" + debug "^4.3.4" + fs-extra "^8.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0, supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.3.10: + version "5.3.11" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz#93c21f44ca86634257cac176f884f942b7ba3832" + integrity sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + jest-worker "^27.4.5" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" + +terser@^5.31.1: + version "5.37.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" + integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tmp@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@5.5.4: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + +ua-parser-js@^0.7.30: + version "0.7.40" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.40.tgz#c87d83b7bb25822ecfa6397a0da5903934ea1562" + integrity sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ== + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" + integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== + +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webpack-cli@5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" + integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^2.1.1" + "@webpack-cli/info" "^2.0.2" + "@webpack-cli/serve" "^2.0.5" + colorette "^2.0.14" + commander "^10.0.1" + cross-spawn "^7.0.3" + envinfo "^7.7.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" + integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@4.15.2: + version "4.15.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" + integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== + dependencies: + "@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.4" + ws "^8.13.0" + +webpack-merge@^4.1.5: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-merge@^5.7.3: + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@5.94.0: + version "5.94.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" + integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== + dependencies: + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.7.1" + acorn-import-attributes "^1.9.5" + browserslist "^4.21.10" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.17.1" + 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.11" + 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.10" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@8.18.0, ws@^8.13.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + +ws@~8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@^20.2.2, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@^16.1.1, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/settings.gradle.kts b/settings.gradle.kts index cee2e42ab..ec84eec17 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,12 +1,5 @@ import org.ajoberstar.reckon.gradle.ReckonExtension -include(":mifos-shared") - - -include(":mifos-android") - - - pluginManagement { includeBuild("build-logic") repositories { @@ -44,8 +37,10 @@ rootProject.name = "mifos-mobile" enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") -include(":androidApp") - +include(":cmp-shared") +include(":cmp-android") +include(":cmp-desktop") +include(":cmp-web") // Core Modules include(":core:ui") include(":core:designsystem") @@ -60,6 +55,7 @@ include(":core:qrcode") //include(":core:testing") // Feature Modules +include(":feature:auth") //include(":feature:loan") //include(":feature:beneficiary") //include(":feature:savings") @@ -75,7 +71,6 @@ include(":core:qrcode") //include(":feature:location") //include(":feature:about") //include(":feature:settings") -include(":feature:auth") //include(":feature:update-password") //include(":feature:home") //include(":feature:user-profile") @@ -90,4 +85,3 @@ include(":libs:material3-navigation") include(":libs:mifos-passcode") // Kotlin Multiplatform Modules -include(":shared") \ No newline at end of file diff --git a/shared/src/androidMain/kotlin/org/mifos/mobile/shared/MainActivity.kt b/shared/src/androidMain/kotlin/org/mifos/mobile/shared/MainActivity.kt deleted file mode 100644 index de4845478..000000000 --- a/shared/src/androidMain/kotlin/org/mifos/mobile/shared/MainActivity.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.mifos.mobile.shared - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.runtime.Composable -import androidx.compose.ui.tooling.preview.Preview - -class MainActivity : ComponentActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - setContent { - App() - } - } -} - -@Preview -@Composable -fun AppAndroidPreview() { - App() -} \ No newline at end of file diff --git a/shared/src/androidMain/kotlin/org/mifos/mobile/shared/MyApplication.kt b/shared/src/androidMain/kotlin/org/mifos/mobile/shared/MyApplication.kt deleted file mode 100644 index 8bedfc1b8..000000000 --- a/shared/src/androidMain/kotlin/org/mifos/mobile/shared/MyApplication.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.mifos.mobile.shared - -import android.app.Application -import org.koin.android.ext.koin.androidContext -import org.mifos.mobile.shared.di.initKoin - -class MyApplication: Application() { - - override fun onCreate() { - super.onCreate() - initKoin { - androidContext(this@MyApplication) - } - } -} \ No newline at end of file diff --git a/shared/src/androidMain/kotlin/org/mifos/mobile/shared/Platform.android.kt b/shared/src/androidMain/kotlin/org/mifos/mobile/shared/Platform.android.kt deleted file mode 100644 index c63e13259..000000000 --- a/shared/src/androidMain/kotlin/org/mifos/mobile/shared/Platform.android.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.mifos.mobile.shared - -class AndroidPlatform : Platform { - override val name: String = "Android ${android.os.Build.VERSION.SDK_INT}" -} - -actual fun getPlatform(): Platform = AndroidPlatform() \ No newline at end of file diff --git a/shared/src/androidMain/kotlin/org/mifos/mobile/shared/di/Modules.android.kt b/shared/src/androidMain/kotlin/org/mifos/mobile/shared/di/Modules.android.kt deleted file mode 100644 index 8b285c809..000000000 --- a/shared/src/androidMain/kotlin/org/mifos/mobile/shared/di/Modules.android.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.mifos.mobile.shared.di - -import org.koin.core.module.Module - -actual val platformModule: Module - get() = TODO("Not yet implemented") \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/mifos/mobile/shared/App.kt b/shared/src/commonMain/kotlin/org/mifos/mobile/shared/App.kt deleted file mode 100644 index aefdd9e48..000000000 --- a/shared/src/commonMain/kotlin/org/mifos/mobile/shared/App.kt +++ /dev/null @@ -1,29 +0,0 @@ -package org.mifos.mobile.shared - -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight -import org.koin.compose.KoinContext - -@Composable -fun App() { - KoinContext { - Box( - modifier = Modifier - .fillMaxSize(), - contentAlignment = Alignment.Center - ) { - Text( - text = "Mifos Mobile", - style = MaterialTheme.typography.titleLarge.copy(fontWeight = FontWeight.Bold, - color = MaterialTheme.colorScheme.onSurface) - ) - } - } -} - diff --git a/shared/src/commonMain/kotlin/org/mifos/mobile/shared/Platform.kt b/shared/src/commonMain/kotlin/org/mifos/mobile/shared/Platform.kt deleted file mode 100644 index c6e1c1823..000000000 --- a/shared/src/commonMain/kotlin/org/mifos/mobile/shared/Platform.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.mifos.mobile.shared - -interface Platform { - val name: String -} - -expect fun getPlatform(): Platform \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/Modules.kt b/shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/Modules.kt deleted file mode 100644 index 3a77e9d5e..000000000 --- a/shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/Modules.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.mifos.mobile.shared.di - -import org.koin.core.module.Module -import org.koin.dsl.module - -expect val platformModule: Module - -val sharedModule = module { - single { } -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/initKoin.kt b/shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/initKoin.kt deleted file mode 100644 index 4b050ddde..000000000 --- a/shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/initKoin.kt +++ /dev/null @@ -1,11 +0,0 @@ -package org.mifos.mobile.shared.di - -import org.koin.core.context.startKoin -import org.koin.dsl.KoinAppDeclaration - -fun initKoin(config: KoinAppDeclaration? = null) { - startKoin { - config?.invoke(this) - modules(sharedModule, platformModule) - } -} \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt b/shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt deleted file mode 100644 index 33be09332..000000000 --- a/shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.mifos.mobile.shared - -import androidx.compose.ui.window.ComposeUIViewController -import org.mifos.mobile.shared.di.initKoin - -fun MainViewController() = ComposeUIViewController( - configure = { - initKoin() - } -) { - App() -} \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/org/mifos/mobile/shared/Platform.ios.kt b/shared/src/iosMain/kotlin/org/mifos/mobile/shared/Platform.ios.kt deleted file mode 100644 index a8400cddb..000000000 --- a/shared/src/iosMain/kotlin/org/mifos/mobile/shared/Platform.ios.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.mifos.mobile.shared - -import platform.UIKit.UIDevice - -class IOSPlatform: Platform { - override val name: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion -} - -actual fun getPlatform(): Platform = IOSPlatform() \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt b/shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt deleted file mode 100644 index 8b285c809..000000000 --- a/shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.mifos.mobile.shared.di - -import org.koin.core.module.Module - -actual val platformModule: Module - get() = TODO("Not yet implemented") \ No newline at end of file From fcff923a6d2095d6f90cf8c793d0ff2da1f34e34 Mon Sep 17 00:00:00 2001 From: Nagarjuna Date: Thu, 6 Feb 2025 10:24:07 +0530 Subject: [PATCH 05/12] Revert "feat: added application modules" This reverts commit f31a0b677ea2dce4eb0d24249f0d167c99c1ad3a. --- .../actions/create-release-notes/action.yml | 6 +- .github/actions/inflate-secrets/action.yml | 6 +- .github/workflows/master_dev_ci.yml | 6 +- .../workflows/release_to_internal_or_beta.yml | 8 +- .run/cmp-desktop.run.xml | 24 - .run/cmp-web-js.run.xml | 24 - .run/cmp-web-wasm.run.xml | 24 - .run/mifospay-android.run.xml | 4 +- .run/mifospay-desktop.run.xml | 24 + .run/mifospay-web-js.run.xml | 24 + .run/mifospay-web-wasm.run.xml | 24 + {cmp-android => androidApp}/.gitignore | 0 {cmp-android => androidApp}/README.md | 0 {cmp-android => androidApp}/build.gradle.kts | 11 +- .../debug_keystore.jks | Bin .../demoDebugRuntimeClasspath.txt | 27 +- .../demoReleaseRuntimeClasspath.txt | 27 +- .../prodDebugRuntimeClasspath.txt | 27 +- .../prodReleaseRuntimeClasspath.txt | 27 +- .../releaseRuntimeClasspath.tree.txt | 0 .../dependencies/releaseRuntimeClasspath.txt | 0 {cmp-android => androidApp}/fabric.properties | 0 .../google-services.json | 0 {cmp-android => androidApp}/lint-baseline.xml | 0 .../proguard-rules.pro | 0 .../release-badging.txt | 0 .../org/mifos/mobile/ApplicationTest.kt | 0 .../src/main/AndroidManifest.xml | 4 +- .../src/main/ic_launcher-playstore.png | Bin .../kotlin/org/mifos/mobile/HomeActivity.kt | 115 + .../org/mifos/mobile/HomeActivityViewModel.kt | 32 +- .../org/mifos/mobile/MifosSelfServiceApp.kt | 25 + .../mifos/mobile}/navigation/MifosNavGraph.kt | 2 +- .../mifos/mobile/navigation/MifosNavHost.kt | 281 ++ .../mobile/navigation/PasscodeNavGraph.kt | 42 + .../mifos/mobile}/navigation/RootNavGraph.kt | 17 +- .../kotlin/org/mifos/mobile/ui/MifosApp.kt | 27 +- .../org/mifos/mobile}/ui/MifosMobileState.kt | 4 +- .../src/main/res/drawable/mifos_logo.png | Bin .../res/drawable/mifos_splash_screen_logo.png | Bin .../src/main/res/drawable/splash_icon.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin .../mipmap-hdpi/ic_launcher_foreground.webp | Bin .../res/mipmap-hdpi/ic_launcher_round.webp | Bin .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin .../mipmap-mdpi/ic_launcher_foreground.webp | Bin .../res/mipmap-mdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin .../ic_launcher_foreground.webp | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin .../src/main/res/values-ar/strings.xml | 0 .../src/main/res/values-bn/strings.xml | 0 .../src/main/res/values-es/strings.xml | 0 .../src/main/res/values-fa-rAF/strings.xml | 0 .../src/main/res/values-fr/strings.xml | 0 .../src/main/res/values-hi/strings.xml | 0 .../src/main/res/values-in/strings.xml | 0 .../src/main/res/values-km/strings.xml | 0 .../src/main/res/values-kn/strings.xml | 0 .../src/main/res/values-my/strings.xml | 0 .../src/main/res/values-pl/strings.xml | 0 .../src/main/res/values-pt/strings.xml | 0 .../src/main/res/values-ru/strings.xml | 0 .../src/main/res/values-sw/strings.xml | 0 .../src/main/res/values-te/strings.xml | 0 .../src/main/res/values-ur/strings.xml | 0 .../src/main/res/values/colors.xml | 0 .../res/values/ic_launcher_background.xml | 0 .../src/main/res/values/splash.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/xml/fileproviderpath.xml | 0 .../src/release/res/values/api_keys.xml | 0 ci-prepush.bat | 4 +- .../kotlin/org/mifos/mobile/AndroidApp.kt | 29 - .../kotlin/org/mifos/mobile/MainActivity.kt | 71 - cmp-desktop/.gitignore | 1 - cmp-desktop/build.gradle.kts | 84 - cmp-desktop/icons/ic_launcher.icns | Bin 169178 -> 0 bytes cmp-desktop/icons/ic_launcher.ico | Bin 40718 -> 0 bytes cmp-desktop/icons/ic_launcher.png | Bin 33661 -> 0 bytes cmp-desktop/proguard-rules.pro | 21 - cmp-desktop/src/desktopMain/kotlin/main.kt | 19 - .../composeResources/values/strings.xml | 13 - .../mobile/shared/MifosMobileSharedApp.kt | 69 - .../org/mifos/mobile/shared/di/KoinModules.kt | 68 - .../mobile/shared/navigation/MifosNavHost.kt | 275 -- .../shared/navigation/PasscodeNavGraph.kt | 42 - .../mifos/mobile/shared/MainViewController.kt | 22 - .../mifos/mobile/shared/di/Modules.native.kt | 15 - .../mobile/shared/MifosViewController.kt | 22 - cmp-web/.gitignore | 1 - cmp-web/build.gradle.kts | 65 - cmp-web/proguard-rules.pro | 21 - cmp-web/src/jsMain/kotlin/Application.kt | 17 - cmp-web/src/jsMain/resources/favicon.ico | Bin 40718 -> 0 bytes cmp-web/src/jsMain/resources/index.html | 43 - cmp-web/src/jsMain/resources/styles.css | 14 - cmp-web/src/wasmJsMain/kotlin/Main.kt | 21 - cmp-web/src/wasmJsMain/resources/favicon.ico | Bin 40718 -> 0 bytes cmp-web/src/wasmJsMain/resources/index.html | 13 - core/data/build.gradle.kts | 2 +- .../mobile/core/data/di/RepositoryModule.kt | 2 +- .../mobile/core/model/Parcelize.android.kt | 3 - .../org/mifos/mobile/core/model/Parcelize.kt | 2 +- .../mobile/core/model/Parcelize.desktop.kt | 2 - .../mifos/mobile/core/model/Parcelize.js.kt | 2 - .../mobile/core/model/Parcelize.native.kt | 2 - .../mobile/core/model/Parcelize.wasmJs.kt | 2 - .../mobile/core/network/di/NetworkModule.kt | 2 +- .../mifos/mobile/core/network/di/Qualifier.kt | 1 + fastlane/AppFile | 2 +- .../mobile/feature/auth/login/LoginScreen.kt | 11 +- .../feature/auth/login/LoginViewModel.kt | 5 - .../auth/navigation/AuthenticationNavGraph.kt | 6 +- .../auth/registration/RegistrationScreen.kt | 37 +- .../RegistrationVerificationScreen.kt | 73 +- .../RegistrationVerificationViewModel.kt | 75 +- .../registration/RegistrationViewModel.kt | 131 +- gradle/libs.versions.toml | 4 +- .../iosApp.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../UserInterfaceState.xcuserstate | Bin .../xcschemes/xcschememanagement.plist | 0 .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../iosApp/Assets.xcassets/Contents.json | 0 {cmp-ios => iosApp}/iosApp/ContentView.swift | 0 .../Preview Assets.xcassets/Contents.json | 0 {cmp-ios => iosApp}/iosApp/iosAppApp.swift | 0 kotlin-js-store/yarn.lock | 2897 ----------------- settings.gradle.kts | 16 +- {cmp-shared => shared}/README.md | 0 {cmp-shared => shared}/build.gradle.kts | 32 +- .../org/mifos/mobile/shared/MainActivity.kt | 23 + .../org/mifos/mobile/shared/MyApplication.kt | 15 + .../mifos/mobile/shared/Platform.android.kt | 7 + .../mifos/mobile/shared/di/Modules.android.kt | 6 + .../kotlin/org/mifos/mobile/shared/App.kt | 29 + .../org/mifos/mobile/shared/Platform.kt | 7 + .../org/mifos/mobile/shared/di/Modules.kt | 10 + .../org/mifos/mobile/shared/di/initKoin.kt | 11 + .../mifos/mobile/shared/MainViewController.kt | 12 + .../org/mifos/mobile/shared/Platform.ios.kt | 9 + .../mifos/mobile/shared/di/Modules.native.kt | 6 + 153 files changed, 987 insertions(+), 4249 deletions(-) delete mode 100644 .run/cmp-desktop.run.xml delete mode 100644 .run/cmp-web-js.run.xml delete mode 100644 .run/cmp-web-wasm.run.xml create mode 100644 .run/mifospay-desktop.run.xml create mode 100644 .run/mifospay-web-js.run.xml create mode 100644 .run/mifospay-web-wasm.run.xml rename {cmp-android => androidApp}/.gitignore (100%) rename {cmp-android => androidApp}/README.md (100%) rename {cmp-android => androidApp}/build.gradle.kts (95%) rename {cmp-android => androidApp}/debug_keystore.jks (100%) rename {cmp-android => androidApp}/dependencies/demoDebugRuntimeClasspath.txt (96%) rename {cmp-android => androidApp}/dependencies/demoReleaseRuntimeClasspath.txt (95%) rename {cmp-android => androidApp}/dependencies/prodDebugRuntimeClasspath.txt (96%) rename {cmp-android => androidApp}/dependencies/prodReleaseRuntimeClasspath.txt (95%) rename {cmp-android => androidApp}/dependencies/releaseRuntimeClasspath.tree.txt (100%) rename {cmp-android => androidApp}/dependencies/releaseRuntimeClasspath.txt (100%) rename {cmp-android => androidApp}/fabric.properties (100%) rename {cmp-android => androidApp}/google-services.json (100%) rename {cmp-android => androidApp}/lint-baseline.xml (100%) rename {cmp-android => androidApp}/proguard-rules.pro (100%) rename {cmp-android => androidApp}/release-badging.txt (100%) rename {cmp-android => androidApp}/src/androidTest/kotlin/org/mifos/mobile/ApplicationTest.kt (100%) rename {cmp-android => androidApp}/src/main/AndroidManifest.xml (97%) rename {cmp-android => androidApp}/src/main/ic_launcher-playstore.png (100%) create mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/HomeActivity.kt rename cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/MifosMobileViewModel.kt => androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt (54%) create mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/MifosSelfServiceApp.kt rename {cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared => androidApp/src/main/kotlin/org/mifos/mobile}/navigation/MifosNavGraph.kt (92%) create mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavHost.kt create mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/navigation/PasscodeNavGraph.kt rename {cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared => androidApp/src/main/kotlin/org/mifos/mobile}/navigation/RootNavGraph.kt (73%) rename cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/ui/MifosMobileApp.kt => androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosApp.kt (81%) rename {cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared => androidApp/src/main/kotlin/org/mifos/mobile}/ui/MifosMobileState.kt (95%) rename {cmp-android => androidApp}/src/main/res/drawable/mifos_logo.png (100%) rename {cmp-android => androidApp}/src/main/res/drawable/mifos_splash_screen_logo.png (100%) rename {cmp-android => androidApp}/src/main/res/drawable/splash_icon.xml (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-hdpi/ic_launcher.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-hdpi/ic_launcher_round.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-mdpi/ic_launcher.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-mdpi/ic_launcher_round.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-xhdpi/ic_launcher.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-xhdpi/ic_launcher_round.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-xxhdpi/ic_launcher.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-xxxhdpi/ic_launcher.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp (100%) rename {cmp-android => androidApp}/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp (100%) rename {cmp-android => androidApp}/src/main/res/values-ar/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-bn/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-es/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-fa-rAF/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-fr/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-hi/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-in/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-km/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-kn/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-my/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-pl/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-pt/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-ru/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-sw/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-te/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values-ur/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/values/colors.xml (100%) rename {cmp-android => androidApp}/src/main/res/values/ic_launcher_background.xml (100%) rename {cmp-android => androidApp}/src/main/res/values/splash.xml (100%) rename {cmp-android => androidApp}/src/main/res/values/strings.xml (100%) rename {cmp-android => androidApp}/src/main/res/xml/fileproviderpath.xml (100%) rename {cmp-android => androidApp}/src/release/res/values/api_keys.xml (100%) delete mode 100644 cmp-android/src/main/kotlin/org/mifos/mobile/AndroidApp.kt delete mode 100644 cmp-android/src/main/kotlin/org/mifos/mobile/MainActivity.kt delete mode 100644 cmp-desktop/.gitignore delete mode 100644 cmp-desktop/build.gradle.kts delete mode 100644 cmp-desktop/icons/ic_launcher.icns delete mode 100644 cmp-desktop/icons/ic_launcher.ico delete mode 100644 cmp-desktop/icons/ic_launcher.png delete mode 100644 cmp-desktop/proguard-rules.pro delete mode 100644 cmp-desktop/src/desktopMain/kotlin/main.kt delete mode 100644 cmp-shared/src/commonMain/composeResources/values/strings.xml delete mode 100644 cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/MifosMobileSharedApp.kt delete mode 100644 cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/KoinModules.kt delete mode 100644 cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/MifosNavHost.kt delete mode 100644 cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/PasscodeNavGraph.kt delete mode 100644 cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt delete mode 100644 cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt delete mode 100644 cmp-shared/src/nativeMain/kotlin/org/mifos/mobile/shared/MifosViewController.kt delete mode 100644 cmp-web/.gitignore delete mode 100644 cmp-web/build.gradle.kts delete mode 100644 cmp-web/proguard-rules.pro delete mode 100644 cmp-web/src/jsMain/kotlin/Application.kt delete mode 100644 cmp-web/src/jsMain/resources/favicon.ico delete mode 100644 cmp-web/src/jsMain/resources/index.html delete mode 100644 cmp-web/src/jsMain/resources/styles.css delete mode 100644 cmp-web/src/wasmJsMain/kotlin/Main.kt delete mode 100644 cmp-web/src/wasmJsMain/resources/favicon.ico delete mode 100644 cmp-web/src/wasmJsMain/resources/index.html rename {cmp-ios => iosApp}/iosApp.xcodeproj/project.pbxproj (100%) rename {cmp-ios => iosApp}/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename {cmp-ios => iosApp}/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename {cmp-ios => iosApp}/iosApp.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate (100%) rename {cmp-ios => iosApp}/iosApp.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist (100%) rename {cmp-ios => iosApp}/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename {cmp-ios => iosApp}/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {cmp-ios => iosApp}/iosApp/Assets.xcassets/Contents.json (100%) rename {cmp-ios => iosApp}/iosApp/ContentView.swift (100%) rename {cmp-ios => iosApp}/iosApp/Preview Content/Preview Assets.xcassets/Contents.json (100%) rename {cmp-ios => iosApp}/iosApp/iosAppApp.swift (100%) delete mode 100644 kotlin-js-store/yarn.lock rename {cmp-shared => shared}/README.md (100%) rename {cmp-shared => shared}/build.gradle.kts (56%) create mode 100644 shared/src/androidMain/kotlin/org/mifos/mobile/shared/MainActivity.kt create mode 100644 shared/src/androidMain/kotlin/org/mifos/mobile/shared/MyApplication.kt create mode 100644 shared/src/androidMain/kotlin/org/mifos/mobile/shared/Platform.android.kt create mode 100644 shared/src/androidMain/kotlin/org/mifos/mobile/shared/di/Modules.android.kt create mode 100644 shared/src/commonMain/kotlin/org/mifos/mobile/shared/App.kt create mode 100644 shared/src/commonMain/kotlin/org/mifos/mobile/shared/Platform.kt create mode 100644 shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/Modules.kt create mode 100644 shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/initKoin.kt create mode 100644 shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt create mode 100644 shared/src/iosMain/kotlin/org/mifos/mobile/shared/Platform.ios.kt create mode 100644 shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt diff --git a/.github/actions/create-release-notes/action.yml b/.github/actions/create-release-notes/action.yml index be71adca7..6cc1e7464 100644 --- a/.github/actions/create-release-notes/action.yml +++ b/.github/actions/create-release-notes/action.yml @@ -41,7 +41,7 @@ runs: id: version-generator shell: bash run: | - mkdir -p ./cmp-android/build/outputs/ + mkdir -p ./androidApp/build/outputs/ echo "Previous Release Tag:" echo "${{ steps.latest-release-tag.outputs.result }}" @@ -49,8 +49,8 @@ runs: echo "Full Changelog:" CHANGELOG="${{ steps.generate-notes.outputs.result }}" echo -e "$CHANGELOG" - printf "$CHANGELOG" > ./cmp-android/build/outputs/changelogGithub + printf "$CHANGELOG" > ./androidApp/build/outputs/changelogGithub echo "Beta Changelog:" git log --format="* %s" HEAD^..HEAD - git log --format="* %s" HEAD^..HEAD > ./cmp-android/build/outputs/changelogBeta + git log --format="* %s" HEAD^..HEAD > ./androidApp/build/outputs/changelogBeta diff --git a/.github/actions/inflate-secrets/action.yml b/.github/actions/inflate-secrets/action.yml index 6462800dd..5ba553c3a 100644 --- a/.github/actions/inflate-secrets/action.yml +++ b/.github/actions/inflate-secrets/action.yml @@ -16,21 +16,21 @@ runs: - name: Mock debug google-services.json shell: bash run: | - cp .github/mock-google-services.json cmp-android/google-services.json + cp .github/mock-google-services.json androidApp/google-services.json - name: Inflate release_keystore.keystore shell: bash env: KEYSTORE: ${{ inputs.keystore }} run: | - echo $KEYSTORE | base64 --decode > cmp-android/release_keystore.keystore + echo $KEYSTORE | base64 --decode > androidApp/release_keystore.keystore - name: Inflate google-services.json shell: bash env: GOOGLE_SERVICES: ${{ inputs.google-services }} run: | - echo $GOOGLE_SERVICES > cmp-android/google-services.json + echo $GOOGLE_SERVICES > androidApp/google-services.json - name: Inflate playStorePublishServiceCredentialsFile.json shell: bash diff --git a/.github/workflows/master_dev_ci.yml b/.github/workflows/master_dev_ci.yml index 2dd36e834..c60d6093c 100644 --- a/.github/workflows/master_dev_ci.yml +++ b/.github/workflows/master_dev_ci.yml @@ -99,7 +99,7 @@ jobs: id: dependencyguard_baseline if: steps.dependencyguard_verify.outcome == 'failure' && github.event_name == 'pull_request' run: | - ./gradlew :cmp-android:dependencyGuard + ./gradlew :mifos-android:dependencyGuard - name: Push new Dependency Guard baselines if available uses: stefanzweifel/git-auto-commit-action@v5 @@ -122,7 +122,7 @@ jobs: - name: Run tests run: | - ./gradlew :cmp-android:testDemoDebug + ./gradlew :mifos-android:testDemoDebug # ./gradlew testDebug :lint:test :androidApp:lintRelease :lint:lint - name: Upload reports @@ -177,7 +177,7 @@ jobs: java-version: 17 - name: Build APKs - run: ./gradlew :cmp-android:assembleDemoDebug + run: ./gradlew :mifos-android:assembleDemoDebug - name: Upload APKs uses: actions/upload-artifact@v4 diff --git a/.github/workflows/release_to_internal_or_beta.yml b/.github/workflows/release_to_internal_or_beta.yml index 3b173133c..36eba8093 100644 --- a/.github/workflows/release_to_internal_or_beta.yml +++ b/.github/workflows/release_to_internal_or_beta.yml @@ -65,7 +65,7 @@ jobs: KEYSTORE_ALIAS_PASSWORD: ${{ secrets.ORIGINAL_KEYSTORE_ALIAS_PASSWORD }} VERSION_CODE: ${{ steps.rel_number.outputs.version-code }} run: | - ./gradlew :cmp-android:assembleRelease + ./gradlew :androidApp:assembleRelease - name: Archive Build uses: actions/upload-artifact@v4 @@ -89,8 +89,8 @@ jobs: draft: false prerelease: true files: | - ./cmp-android/build/outputs/apk/release/androidApp-release.apk - ./cmp-android/build/outputs/version_code.txt + ./androidApp/build/outputs/apk/release/androidApp-release.apk + ./androidApp/build/outputs/version_code.txt - name: Print `git status` run: git status @@ -152,7 +152,7 @@ jobs: KEYSTORE_ALIAS_PASSWORD: ${{ secrets.UPLOAD_KEYSTORE_ALIAS_PASSWORD }} VERSION_CODE: ${{ steps.rel_number.outputs.version-code }} run: | - ./gradlew :cmp-android:bundleRelease + ./gradlew :androidApp:bundleRelease - name: Deploy to Play Store Internal run: bundle exec fastlane android deploy_internal diff --git a/.run/cmp-desktop.run.xml b/.run/cmp-desktop.run.xml deleted file mode 100644 index 99179a9e9..000000000 --- a/.run/cmp-desktop.run.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - true - true - false - false - - - \ No newline at end of file diff --git a/.run/cmp-web-js.run.xml b/.run/cmp-web-js.run.xml deleted file mode 100644 index 89a8b9653..000000000 --- a/.run/cmp-web-js.run.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - true - true - false - false - - - \ No newline at end of file diff --git a/.run/cmp-web-wasm.run.xml b/.run/cmp-web-wasm.run.xml deleted file mode 100644 index 386b684f3..000000000 --- a/.run/cmp-web-wasm.run.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - true - true - false - false - - - \ No newline at end of file diff --git a/.run/mifospay-android.run.xml b/.run/mifospay-android.run.xml index f141851fb..186e06fe7 100644 --- a/.run/mifospay-android.run.xml +++ b/.run/mifospay-android.run.xml @@ -1,6 +1,6 @@ - - + +

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 - - - ⚠️ You aren’t connected to the internet - diff --git a/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/MifosMobileSharedApp.kt b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/MifosMobileSharedApp.kt deleted file mode 100644 index b535ca683..000000000 --- a/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/MifosMobileSharedApp.kt +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2025 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.shared - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.ui.Modifier -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.navigation.compose.rememberNavController -import org.koin.compose.koinInject -import org.koin.compose.viewmodel.koinViewModel -import org.mifos.mobile.core.data.util.NetworkMonitor -import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme -import org.mifos.mobile.shared.navigation.MifosNavGraph.AUTH_GRAPH -import org.mifos.mobile.shared.navigation.MifosNavGraph.PASSCODE_GRAPH -import org.mifos.mobile.shared.navigation.RootNavGraph - -@Composable -fun MifosMobileSharedApp( - modifier: Modifier = Modifier, - networkMonitor: NetworkMonitor = koinInject(), -) { - MifosApp(networkMonitor, modifier) -} - -@Composable -private fun MifosApp( - networkMonitor: NetworkMonitor, - modifier: Modifier = Modifier, - viewModel: MifosMobileViewModel = koinViewModel(), -) { - val uiState by viewModel.uiState.collectAsStateWithLifecycle() - val navController = rememberNavController() - - val navDestination = when (uiState) { - is MainUiState.Loading -> AUTH_GRAPH - is MainUiState.Success -> if ((uiState as MainUiState.Success).userData.isAuthenticated) { - PASSCODE_GRAPH - } else { - AUTH_GRAPH - } - - else -> AUTH_GRAPH - } - - MifosMobileTheme { - RootNavGraph( - navHostController = navController, - startDestination = navDestination, - networkMonitor = networkMonitor, - modifier = modifier, - onClickLogout = { - viewModel.logOut() - navController.navigate(AUTH_GRAPH) { - popUpTo(navController.graph.id) { - inclusive = true - } - } - }, - ) - } -} diff --git a/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/KoinModules.kt b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/KoinModules.kt deleted file mode 100644 index d6f4d4a79..000000000 --- a/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/KoinModules.kt +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2025 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.shared.di - -import org.koin.core.context.startKoin -import org.koin.core.module.dsl.viewModelOf -import org.koin.dsl.KoinAppDeclaration -import org.koin.dsl.koinApplication -import org.koin.dsl.module -import org.mifos.mobile.core.common.di.DispatchersModule -import org.mifos.mobile.core.data.di.RepositoryModule -import org.mifos.mobile.core.datastore.di.PreferencesModule -import org.mifos.mobile.core.network.di.NetworkModule -import org.mifos.mobile.feature.auth.di.AuthModule -import org.mifos.mobile.shared.MifosMobileViewModel - -object KoinModules { - private val commonModules = module { - includes(DispatchersModule) - } - private val dataModules = module { - includes(RepositoryModule) - } - private val coreDataStoreModules = module { - includes(PreferencesModule) - } - private val networkModules = module { - includes(NetworkModule) - } - private val sharedModule = module { - viewModelOf(::MifosMobileViewModel) - } - private val featureModules = module { - includes( - AuthModule, - ) - } -// private val LibraryModule = module { -// includes(PasscodeModule) -// } - - val allModules = listOf( - commonModules, - dataModules, - coreDataStoreModules, - networkModules, - featureModules, - sharedModule, - ) -} - -fun koinConfiguration() = koinApplication { - modules(KoinModules.allModules) -} - -fun initKoin(config: KoinAppDeclaration? = null) { - startKoin { - config?.invoke(this) - modules(KoinModules.allModules) - } -} diff --git a/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/MifosNavHost.kt b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/MifosNavHost.kt deleted file mode 100644 index bdd71d491..000000000 --- a/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/MifosNavHost.kt +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.shared.navigation - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import org.mifos.mobile.shared.ui.MifosMobileState - -// import androidx.compose.ui.Modifier -// import androidx.navigation.NavHostController -// import androidx.navigation.compose.NavHost -// import androidx.navigation.compose.rememberNavController -// import org.mifos.mobile.core.common.Constants.TRANSFER_PAY_TO -// import org.mifos.mobile.core.model.enums.AccountType -// import org.mifos.mobile.core.model.enums.ChargeType -// import org.mifos.mobile.feature.about.navigation.aboutUsNavGraph -// import org.mifos.mobile.feature.about.navigation.navigateToAboutUsScreen -// import org.mifos.mobile.feature.account.navigation.clientAccountsNavGraph -// import org.mifos.mobile.feature.account.navigation.navigateToClientAccountsScreen -// import org.mifos.mobile.feature.auth.navigation.navigateToLoginScreen -// import org.mifos.mobile.feature.beneficiary.navigation.beneficiaryNavGraph -// import org.mifos.mobile.feature.beneficiary.navigation.navigateToAddBeneficiaryScreen -// import org.mifos.mobile.feature.beneficiary.navigation.navigateToBeneficiaryApplicationScreen -// import org.mifos.mobile.feature.beneficiary.navigation.navigateToBeneficiaryListScreen -// import org.mifos.mobile.feature.charge.navigation.clientChargeNavGraph -// import org.mifos.mobile.feature.charge.navigation.navigateToClientChargeScreen -// import org.mifos.mobile.feature.guarantor.navigation.guarantorNavGraph -// import org.mifos.mobile.feature.guarantor.navigation.navigateToGuarantorScreen -// import org.mifos.mobile.feature.help.navigation.helpNavGraph -// import org.mifos.mobile.feature.help.navigation.navigateToHelpScreen -// import org.mifos.mobile.feature.home.navigation.HomeDestinations -// import org.mifos.mobile.feature.home.navigation.HomeNavigation -// import org.mifos.mobile.feature.home.navigation.homeNavGraph -// import org.mifos.mobile.feature.loan.navigation.loanNavGraph -// import org.mifos.mobile.feature.loan.navigation.navigateToLoanApplication -// import org.mifos.mobile.feature.loan.navigation.navigateToLoanDetailScreen -// import org.mifos.mobile.feature.location.navigation.locationsNavGraph -// import org.mifos.mobile.feature.location.navigation.navigateToLocationsScreen -// import org.mifos.mobile.feature.notification.navigation.navigateToNotificationScreen -// import org.mifos.mobile.feature.notification.navigation.notificationNavGraph -// import org.mifos.mobile.feature.qr.navigation.navigateToQrDisplayScreen -// import org.mifos.mobile.feature.qr.navigation.navigateToQrImportScreen -// import org.mifos.mobile.feature.qr.navigation.navigateToQrReaderScreen -// import org.mifos.mobile.feature.qr.navigation.qrNavGraph -// import org.mifos.mobile.feature.savings.navigation.navigateToSavingsApplicationScreen -// import org.mifos.mobile.feature.savings.navigation.navigateToSavingsDetailScreen -// import org.mifos.mobile.feature.savings.navigation.navigateToSavingsMakeTransfer -// import org.mifos.mobile.feature.savings.navigation.savingsNavGraph -// import org.mifos.mobile.feature.settings.navigation.navigateToSettings -// import org.mifos.mobile.feature.settings.navigation.settingsNavGraph -// import org.mifos.mobile.feature.third.party.transfer.navigation.navigateToThirdPartyTransfer -// import org.mifos.mobile.feature.third.party.transfer.navigation.thirdPartyTransferNavGraph -// import org.mifos.mobile.feature.transaction.navigation.navigateToRecentTransaction -// import org.mifos.mobile.feature.transaction.navigation.recentTransactionNavGraph -// import org.mifos.mobile.feature.transfer.process.navigation.navigateToTransferProcessScreen -// import org.mifos.mobile.feature.transfer.process.navigation.transferProcessNavGraph -// import org.mifos.mobile.feature.update.password.navigation.navigateToUpdatePassword -// import org.mifos.mobile.feature.update.password.navigation.updatePasswordNavGraph -// import org.mifos.mobile.feature.user.profile.navigation.navigateToUserProfile -// import org.mifos.mobile.feature.user.profile.navigation.userProfileNavGraph -// import org.mifos.mobile.shared.ui.MifosMobileState - -@Composable -fun MifosNavHost( - appState: MifosMobileState, - onClickLogout: () -> Unit, - modifier: Modifier = Modifier, -) {} -// val navController = appState.navController - -// NavHost( -// navController = navController, -// route = MifosNavGraph.MAIN_GRAPH, -// startDestination = HomeNavigation.HomeBase.route, -// modifier = modifier, -// ) { -// homeNavGraph( -// onNavigate = { handleHomeNavigation(navController, it, onClickLogout, context) }, -// callHelpline = { callHelpline(context) }, -// mailHelpline = { mailHelpline(context) }, -// ) - -// guarantorNavGraph(navController = navController) - -// loanNavGraph( -// navController = navController, -// viewQr = navController::navigateToQrDisplayScreen, -// viewGuarantor = navController::navigateToGuarantorScreen, -// viewCharges = navController::navigateToClientChargeScreen, -// makePayment = navController::navigateToSavingsMakeTransfer, -// ) - -// userProfileNavGraph( -// navigateBack = navController::popBackStack, -// navigateToChangePassword = navController::navigateToUpdatePassword, -// ) - -// updatePasswordNavGraph(navigateBack = navController::popBackStack) - -// thirdPartyTransferNavGraph( -// navigateBack = navController::popBackStack, -// addBeneficiary = navController::navigateToAddBeneficiaryScreen, -// reviewTransfer = navController::navigateToTransferProcessScreen, -// ) - -// settingsNavGraph( -// navigateBack = navController::popBackStack, -// changePassword = navController::navigateToUpdatePassword, -// changePasscode = {}, -// navigateToLoginScreen = navController::navigateToLoginScreen, -// languageChanged = { startActivity(context, HomeActivity::class.java) }, -// ) - -// recentTransactionNavGraph(navigateBack = navController::popBackStack) - -// notificationNavGraph(navigateBack = navController::popBackStack) - -// locationsNavGraph() - -// helpNavGraph( -// findLocations = navController::navigateToLocationsScreen, -// navigateBack = navController::popBackStack, -// callHelpline = { callHelpline(context) }, -// mailHelpline = { mailHelpline(context) }, -// ) - -// clientChargeNavGraph(navigateBack = navController::popBackStack) - -// aboutUsNavGraph( -// navController = navController, -// navigateToOssLicense = { -// context.startActivity(Intent(context, OssLicensesMenuActivity::class.java)) -// }, -// ) - -// transferProcessNavGraph(navigateBack = navController::popBackStack) - -// beneficiaryNavGraph( -// navController = navController, -// openQrImportScreen = navController::navigateToQrImportScreen, -// openQrReaderScreen = navController::navigateToQrReaderScreen, -// ) - -// qrNavGraph( -// navController = navController, -// openBeneficiaryApplication = navController::navigateToBeneficiaryApplicationScreen, -// ) - -// savingsNavGraph( -// navController = navController, -// viewCharges = navController::navigateToClientChargeScreen, -// viewQrCode = navController::navigateToQrDisplayScreen, -// callHelpline = { callHelpline(context) }, -// reviewTransfer = navController::navigateToTransferProcessScreen, -// ) - -// clientAccountsNavGraph( -// navController = navController, -// navigateToLoanApplicationScreen = navController::navigateToLoanApplication, -// navigateToSavingsApplicationScreen = navController::navigateToSavingsApplicationScreen, -// navigateToAccountDetail = { accountType, id -> -// when (accountType) { -// AccountType.SAVINGS -> navController.navigateToSavingsDetailScreen(savingsId = id) -// AccountType.LOAN -> navController.navigateToLoanDetailScreen(loanId = id) -// AccountType.SHARE -> {} -// } -// }, -// ) -// } -// } - -// fun handleHomeNavigation( -// navController: NavHostController, -// homeDestinations: HomeDestinations, -// onClickLogout: () -> Unit, -// context: Context, -// ) { -// when (homeDestinations) { -// HomeDestinations.HOME -> Unit -// HomeDestinations.ACCOUNTS -> navController.navigateToClientAccountsScreen() -// HomeDestinations.LOAN_ACCOUNT -> { -// navController.navigateToClientAccountsScreen(accountType = AccountType.LOAN) -// } -// -// HomeDestinations.SAVINGS_ACCOUNT -> { -// navController.navigateToClientAccountsScreen(accountType = AccountType.SAVINGS) -// } -// -// HomeDestinations.RECENT_TRANSACTIONS -> navController.navigateToRecentTransaction() -// HomeDestinations.CHARGES -> navController.navigateToClientChargeScreen(ChargeType.CLIENT) -// HomeDestinations.THIRD_PARTY_TRANSFER -> navController.navigateToThirdPartyTransfer() -// HomeDestinations.SETTINGS -> navController.navigateToSettings() -// HomeDestinations.ABOUT_US -> navController.navigateToAboutUsScreen() -// HomeDestinations.HELP -> navController.navigateToHelpScreen() -// HomeDestinations.SHARE -> { -// shareApp(context) -// } -// -// HomeDestinations.APP_INFO -> { -// openAppInfo(context) -// } -// -// HomeDestinations.LOGOUT -> onClickLogout.invoke() -// HomeDestinations.TRANSFER -> navController.navigateToSavingsMakeTransfer( -// accountId = 1, -// transferType = TRANSFER_PAY_TO, -// ) -// -// HomeDestinations.BENEFICIARIES -> navController.navigateToBeneficiaryListScreen() -// HomeDestinations.SURVEY -> Unit -// HomeDestinations.NOTIFICATIONS -> navController.navigateToNotificationScreen() -// HomeDestinations.PROFILE -> navController.navigateToUserProfile() -// } -// } - -// fun startActivity(context: Context, clazz: Class) { -// context.startActivity(Intent(context, clazz)) -// } - -// private fun callHelpline(context: Context) { -// val intent = Intent(Intent.ACTION_DIAL) -// intent.data = -// Uri.parse("tel:" + context.getString(org.mifos.mobile.feature.home.R.string.help_line_number)) -// context.startActivity(intent) -// } - -// private fun mailHelpline(context: Context) { -// val intent = Intent(Intent.ACTION_SENDTO).apply { -// data = Uri.parse("mailto:") -// putExtra( -// Intent.EXTRA_EMAIL, -// arrayOf(context.getString(org.mifos.mobile.feature.home.R.string.contact_email)), -// ) -// putExtra( -// Intent.EXTRA_SUBJECT, -// context.getString(org.mifos.mobile.feature.home.R.string.user_query), -// ) -// } -// try { -// context.startActivity(intent) -// } catch (e: Exception) { -// Toast.makeText( -// context, -// context.getString(org.mifos.mobile.feature.home.R.string.no_app_to_support_action), -// Toast.LENGTH_SHORT, -// ).show() -// } -// } - -// private fun openAppInfo(context: Context) { -// val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { -// data = Uri.parse("package:${context.packageName}") -// } -// context.startActivity(intent) -// } - -// private fun shareApp(context: Context) { -// val shareText = context.getString( -// R.string.playstore_link, -// context.getString(R.string.share_msg), -// context.packageName, -// ) -// val intent = Intent(Intent.ACTION_SEND).apply { -// type = "text/plain" -// putExtra(Intent.EXTRA_TEXT, shareText) -// } -// context.startActivity(Intent.createChooser(intent, context.getString(R.string.choose))) -// } diff --git a/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/PasscodeNavGraph.kt b/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/PasscodeNavGraph.kt deleted file mode 100644 index 15c600c1f..000000000 --- a/cmp-shared/src/commonMain/kotlin/org/mifos/mobile/shared/navigation/PasscodeNavGraph.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.shared.navigation - -import androidx.navigation.NavGraphBuilder -import androidx.navigation.NavHostController -import androidx.navigation.navigation -// import org.mifos.library.passcode.PASSCODE_SCREEN -// import org.mifos.library.passcode.passcodeRoute - -internal fun NavGraphBuilder.passcodeNavGraph(navController: NavHostController) { -// navigation( -// route = MifosNavGraph.PASSCODE_GRAPH, -// startDestination = PASSCODE_SCREEN, -// ) { -// passcodeRoute( -// onForgotButton = { -// navController.popBackStack() -// navController.navigate(MifosNavGraph.MAIN_GRAPH) -// }, -// onSkipButton = { -// navController.popBackStack() -// navController.navigate(MifosNavGraph.MAIN_GRAPH) -// }, -// onPasscodeConfirm = { -// navController.popBackStack() -// navController.navigate(MifosNavGraph.MAIN_GRAPH) -// }, -// onPasscodeRejected = { -// navController.popBackStack() -// navController.navigate(MifosNavGraph.MAIN_GRAPH) -// }, -// ) -// } -} diff --git a/cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt b/cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt deleted file mode 100644 index c8f153714..000000000 --- a/cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2025 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.shared - -import androidx.compose.ui.window.ComposeUIViewController -import org.mifos.mobile.shared.di.initKoin - -@Suppress("ktlint:standard:function-naming") -fun MainViewController() = ComposeUIViewController( - configure = { - initKoin() - }, -) { - MifosMobileSharedApp() -} diff --git a/cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt b/cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt deleted file mode 100644 index ad2e067a7..000000000 --- a/cmp-shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright 2025 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.shared.di - -import org.koin.core.module.Module - -actual val platformModule: Module - get() = TODO("Not yet implemented") diff --git a/cmp-shared/src/nativeMain/kotlin/org/mifos/mobile/shared/MifosViewController.kt b/cmp-shared/src/nativeMain/kotlin/org/mifos/mobile/shared/MifosViewController.kt deleted file mode 100644 index 2736ebc0f..000000000 --- a/cmp-shared/src/nativeMain/kotlin/org/mifos/mobile/shared/MifosViewController.kt +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2025 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.shared - -import androidx.compose.ui.window.ComposeUIViewController -import org.mifos.mobile.shared.di.initKoin - -@Suppress("ktlint:standard:function-naming") -fun MifosViewController() = ComposeUIViewController( - configure = { - initKoin() - }, -) { - MifosMobileSharedApp() -} diff --git a/cmp-web/.gitignore b/cmp-web/.gitignore deleted file mode 100644 index 42afabfd2..000000000 --- a/cmp-web/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/cmp-web/build.gradle.kts b/cmp-web/build.gradle.kts deleted file mode 100644 index 854e324f8..000000000 --- a/cmp-web/build.gradle.kts +++ /dev/null @@ -1,65 +0,0 @@ -import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl - -plugins { - alias(libs.plugins.kotlinMultiplatform) - alias(libs.plugins.jetbrainsCompose) - alias(libs.plugins.compose.compiler) -} - -kotlin { - js(IR) { - moduleName = "mifos-web" - browser { - commonWebpackConfig { - outputFileName = "mifos-web.js" - } - } - binaries.executable() - } - - @OptIn(ExperimentalWasmDsl::class) - wasmJs { - moduleName = "mifos-wasm" - browser { - commonWebpackConfig { - outputFileName = "mifos-wasm.js" - } - } - binaries.executable() - } - - applyDefaultHierarchyTemplate() - - sourceSets { - val jsWasmMain by creating { - dependsOn(commonMain.get()) - dependencies { - implementation(projects.cmpShared) - implementation(projects.core.common) - implementation(projects.core.data) - implementation(projects.core.model) - implementation(projects.core.datastore) - - implementation(compose.runtime) - implementation(compose.ui) - implementation(compose.foundation) - implementation(compose.material3) - implementation(compose.components.resources) - - implementation(libs.multiplatform.settings) - implementation(libs.multiplatform.settings.serialization) - implementation(libs.multiplatform.settings.coroutines) - - - } - } - - jsMain.get().dependsOn(jsWasmMain) - wasmJsMain.get().dependsOn(jsWasmMain) - } -} - -compose.resources { - publicResClass = true - generateResClass = always -} \ No newline at end of file diff --git a/cmp-web/proguard-rules.pro b/cmp-web/proguard-rules.pro deleted file mode 100644 index 481bb4348..000000000 --- a/cmp-web/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/cmp-web/src/jsMain/kotlin/Application.kt b/cmp-web/src/jsMain/kotlin/Application.kt deleted file mode 100644 index 4bc76dbbf..000000000 --- a/cmp-web/src/jsMain/kotlin/Application.kt +++ /dev/null @@ -1,17 +0,0 @@ -import androidx.compose.ui.ExperimentalComposeUiApi -import androidx.compose.ui.window.ComposeViewport -import kotlinx.browser.document -import org.jetbrains.skiko.wasm.onWasmReady -import org.mifos.mobile.shared.MifosMobileSharedApp -import org.mifos.mobile.shared.di.initKoin - -@OptIn(ExperimentalComposeUiApi::class) -fun main() { - initKoin() - - onWasmReady { - ComposeViewport(document.body!!) { - MifosMobileSharedApp() - } - } -} \ No newline at end of file diff --git a/cmp-web/src/jsMain/resources/favicon.ico b/cmp-web/src/jsMain/resources/favicon.ico deleted file mode 100644 index 4c553d4387032bbb8b7fed5481b085812383854c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40718 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 - - - - Mifos Mobile - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - \ No newline at end of file diff --git a/cmp-web/src/jsMain/resources/styles.css b/cmp-web/src/jsMain/resources/styles.css deleted file mode 100644 index 3e82a3d56..000000000 --- a/cmp-web/src/jsMain/resources/styles.css +++ /dev/null @@ -1,14 +0,0 @@ -html, body { - height: 100%; - margin: 0px; - padding: 0px; -} - -canvas { - width: 100vw; - height: 100vh; - display: block; - position: fixed; - top: 0; - left: 0; -} \ No newline at end of file diff --git a/cmp-web/src/wasmJsMain/kotlin/Main.kt b/cmp-web/src/wasmJsMain/kotlin/Main.kt deleted file mode 100644 index fce907efc..000000000 --- a/cmp-web/src/wasmJsMain/kotlin/Main.kt +++ /dev/null @@ -1,21 +0,0 @@ -import androidx.compose.ui.ExperimentalComposeUiApi -import androidx.compose.ui.window.CanvasBasedWindow -import org.jetbrains.compose.resources.configureWebResources -import org.mifos.mobile.shared.MifosMobileSharedApp -import org.mifos.mobile.shared.di.initKoin - -@OptIn(ExperimentalComposeUiApi::class) -fun main() { - initKoin() - - configureWebResources { - resourcePathMapping { path -> "./$path" } - } - - CanvasBasedWindow( - title = "MifosMobile", - canvasElementId = "ComposeTarget", - ) { - MifosMobileSharedApp() - } -} \ No newline at end of file diff --git a/cmp-web/src/wasmJsMain/resources/favicon.ico b/cmp-web/src/wasmJsMain/resources/favicon.ico deleted file mode 100644 index 4c553d4387032bbb8b7fed5481b085812383854c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40718 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 - - - - - Mifos Mobile - - - - - - \ No newline at end of file diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts index c0bd76297..f831942a3 100644 --- a/core/data/build.gradle.kts +++ b/core/data/build.gradle.kts @@ -35,7 +35,7 @@ kotlin { api(projects.core.common) api(projects.core.datastore) api(projects.core.model) - api(projects.core.database) +// api(projects.core.database) implementation(projects.core.network) implementation(libs.kotlinx.serialization.json) } diff --git a/core/data/src/commonMain/kotlin/org/mifos/mobile/core/data/di/RepositoryModule.kt b/core/data/src/commonMain/kotlin/org/mifos/mobile/core/data/di/RepositoryModule.kt index 46d1eff16..f56eaca0a 100644 --- a/core/data/src/commonMain/kotlin/org/mifos/mobile/core/data/di/RepositoryModule.kt +++ b/core/data/src/commonMain/kotlin/org/mifos/mobile/core/data/di/RepositoryModule.kt @@ -54,7 +54,7 @@ val RepositoryModule = module { single { Json { ignoreUnknownKeys = true } } single { AccountsRepositoryImp(get(), get(ioDispatcher)) } - single { AuthenticationUserRepository(get(), get(named(MifosDispatchers.IO.name))) } + single { AuthenticationUserRepository(get(), get(ioDispatcher)) } single { BeneficiaryRepositoryImp(get(), get(ioDispatcher)) } single { ClientChargeRepositoryImp(get(), get(ioDispatcher)) } // TODO single { ClientRepositoryImp(get(), get(ioDispatcher)) } diff --git a/core/model/src/androidMain/kotlin/org/mifos/mobile/core/model/Parcelize.android.kt b/core/model/src/androidMain/kotlin/org/mifos/mobile/core/model/Parcelize.android.kt index 6fea8b75c..3d224406c 100644 --- a/core/model/src/androidMain/kotlin/org/mifos/mobile/core/model/Parcelize.android.kt +++ b/core/model/src/androidMain/kotlin/org/mifos/mobile/core/model/Parcelize.android.kt @@ -11,11 +11,8 @@ package org.mifos.mobile.core.model import android.os.Parcelable import kotlinx.parcelize.IgnoredOnParcel -import kotlinx.parcelize.Parcelize import kotlinx.parcelize.RawValue -actual typealias Parcelize = Parcelize - actual typealias Parcelable = Parcelable actual typealias IgnoredOnParcel = IgnoredOnParcel diff --git a/core/model/src/commonMain/kotlin/org/mifos/mobile/core/model/Parcelize.kt b/core/model/src/commonMain/kotlin/org/mifos/mobile/core/model/Parcelize.kt index 55abb1b01..49880d78c 100644 --- a/core/model/src/commonMain/kotlin/org/mifos/mobile/core/model/Parcelize.kt +++ b/core/model/src/commonMain/kotlin/org/mifos/mobile/core/model/Parcelize.kt @@ -9,7 +9,7 @@ */ package org.mifos.mobile.core.model -expect annotation class Parcelize() +annotation class Parcelize() expect interface Parcelable diff --git a/core/model/src/desktopMain/kotlin/org/mifos/mobile/core/model/Parcelize.desktop.kt b/core/model/src/desktopMain/kotlin/org/mifos/mobile/core/model/Parcelize.desktop.kt index 31ab6eb63..b5dd3dad5 100644 --- a/core/model/src/desktopMain/kotlin/org/mifos/mobile/core/model/Parcelize.desktop.kt +++ b/core/model/src/desktopMain/kotlin/org/mifos/mobile/core/model/Parcelize.desktop.kt @@ -9,8 +9,6 @@ */ package org.mifos.mobile.core.model -actual annotation class Parcelize - actual interface Parcelable actual annotation class IgnoredOnParcel diff --git a/core/model/src/jsMain/kotlin/org/mifos/mobile/core/model/Parcelize.js.kt b/core/model/src/jsMain/kotlin/org/mifos/mobile/core/model/Parcelize.js.kt index 31ab6eb63..b5dd3dad5 100644 --- a/core/model/src/jsMain/kotlin/org/mifos/mobile/core/model/Parcelize.js.kt +++ b/core/model/src/jsMain/kotlin/org/mifos/mobile/core/model/Parcelize.js.kt @@ -9,8 +9,6 @@ */ package org.mifos.mobile.core.model -actual annotation class Parcelize - actual interface Parcelable actual annotation class IgnoredOnParcel diff --git a/core/model/src/nativeMain/kotlin/org/mifos/mobile/core/model/Parcelize.native.kt b/core/model/src/nativeMain/kotlin/org/mifos/mobile/core/model/Parcelize.native.kt index 31ab6eb63..b5dd3dad5 100644 --- a/core/model/src/nativeMain/kotlin/org/mifos/mobile/core/model/Parcelize.native.kt +++ b/core/model/src/nativeMain/kotlin/org/mifos/mobile/core/model/Parcelize.native.kt @@ -9,8 +9,6 @@ */ package org.mifos.mobile.core.model -actual annotation class Parcelize - actual interface Parcelable actual annotation class IgnoredOnParcel diff --git a/core/model/src/wasmJsMain/kotlin/org/mifos/mobile/core/model/Parcelize.wasmJs.kt b/core/model/src/wasmJsMain/kotlin/org/mifos/mobile/core/model/Parcelize.wasmJs.kt index 31ab6eb63..b5dd3dad5 100644 --- a/core/model/src/wasmJsMain/kotlin/org/mifos/mobile/core/model/Parcelize.wasmJs.kt +++ b/core/model/src/wasmJsMain/kotlin/org/mifos/mobile/core/model/Parcelize.wasmJs.kt @@ -9,8 +9,6 @@ */ package org.mifos.mobile.core.model -actual annotation class Parcelize - actual interface Parcelable actual annotation class IgnoredOnParcel diff --git a/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/NetworkModule.kt b/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/NetworkModule.kt index b284b40bc..727aef6a0 100644 --- a/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/NetworkModule.kt +++ b/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/NetworkModule.kt @@ -34,7 +34,7 @@ val NetworkModule = module { single(MifosClient) { KtorfitClient.builder() - .httpClient(get(KtorClient)) + .httpClient(get(KtorBaseClient)) .baseURL(BaseURL().url) .build() } diff --git a/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/Qualifier.kt b/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/Qualifier.kt index bf2acc3d6..f879ce0de 100644 --- a/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/Qualifier.kt +++ b/core/network/src/commonMain/kotlin/org/mifos/mobile/core/network/di/Qualifier.kt @@ -13,3 +13,4 @@ import org.koin.core.qualifier.named val MifosClient = named("MifosClient") val KtorClient = named("KtorClient") +val KtorBaseClient = named("KtorBaseClient") diff --git a/fastlane/AppFile b/fastlane/AppFile index 76cfee016..24e9344da 100644 --- a/fastlane/AppFile +++ b/fastlane/AppFile @@ -1,2 +1,2 @@ -json_key_file("cmp-android/playStorePublishServiceCredentialsFile.json") +json_key_file("androidApp/playStorePublishServiceCredentialsFile.json") package_name("org.mifos.mobile") # e.g. org.mifos.mobile \ No newline at end of file diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginScreen.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginScreen.kt index 19ecc872d..8a3f4b35d 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginScreen.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginScreen.kt @@ -100,6 +100,7 @@ internal fun LoginScreen( onAction = remember(viewModel) { { viewModel.trySendAction(it) } }, + navigateToRegisterScreen = { navigateToRegisterScreen() }, ) } @@ -110,6 +111,7 @@ private fun LoginScreen( snackbarHostState: SnackbarHostState, onAction: (LoginAction) -> Unit, modifier: Modifier = Modifier, + navigateToRegisterScreen: () -> Unit, ) { MifosScaffold( snackbarHostState = snackbarHostState, @@ -122,6 +124,7 @@ private fun LoginScreen( modifier = modifier .fillMaxSize() .padding(paddingValues), + createAccount = navigateToRegisterScreen, ) } } @@ -152,13 +155,13 @@ private fun LoginScreenContent( state: LoginState, modifier: Modifier = Modifier, onAction: (LoginAction) -> Unit, + createAccount: () -> Unit, ) { val keyboardController = LocalSoftwareKeyboardController.current Column( modifier = modifier .fillMaxSize() - .padding(7.dp) .verticalScroll(rememberScrollState()) .pointerInput(Unit) { detectTapGestures( @@ -201,7 +204,8 @@ private fun LoginScreenContent( MifosButton( modifier = Modifier - .fillMaxWidth(), + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp, top = 4.dp), contentPadding = PaddingValues(12.dp), enabled = state.isLoginButtonEnabled, onClick = { @@ -247,7 +251,7 @@ private fun LoginScreenContent( } MifosButton( - onClick = { onAction(LoginAction.SignupClicked) }, + onClick = createAccount, modifier = Modifier .fillMaxWidth() .align(Alignment.CenterHorizontally), @@ -265,6 +269,7 @@ private fun LoanScreenPreview() { state = LoginState(dialogState = null), snackbarHostState = remember { SnackbarHostState() }, onAction = {}, + navigateToRegisterScreen = {}, ) } } diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginViewModel.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginViewModel.kt index 9a5984d00..a732aac0b 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginViewModel.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/login/LoginViewModel.kt @@ -117,11 +117,6 @@ class LoginViewModel( viewModelScope.launch { val result = userAuthRepositoryImpl.login(username, password) - when (result) { - is DataState.Error -> sendEvent(LoginEvent.ShowToast(result.message)) - is DataState.Loading -> mutableStateFlow.update { it.copy(dialogState = LoginState.DialogState.Loading) } - is DataState.Success -> sendEvent(LoginEvent.ShowToast("Logged in")) // navigate - } sendAction(LoginAction.Internal.ReceiveLoginResult(result)) } } diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt index 66ae6455f..14e1742bd 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/navigation/AuthenticationNavGraph.kt @@ -72,7 +72,7 @@ private fun NavGraphBuilder.registrationRoute( ) { composable(route = AuthenticationNavigation.Registration.route) { RegistrationScreen( - navigateToVerification = onRegistered, + onVerified = onRegistered, navigateBack = navigateBack, ) } @@ -84,8 +84,8 @@ private fun NavGraphBuilder.registrationVerificationRoute( ) { composable(route = AuthenticationNavigation.RegistrationVerification.route) { RegistrationVerificationScreen( - navigateToLogin = onRegistrationVerified, - navigateToRegister = navigateBack, + onVerified = onRegistrationVerified, + navigateBack = navigateBack, ) } } diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationScreen.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationScreen.kt index 4bf27845b..c7b6dbce9 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationScreen.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationScreen.kt @@ -22,6 +22,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LinearProgressIndicator @@ -75,7 +76,7 @@ import org.mifos.mobile.core.ui.utils.EventsEffect @Composable internal fun RegistrationScreen( - navigateToVerification: () -> Unit, + onVerified: () -> Unit, navigateBack: () -> Unit, modifier: Modifier = Modifier, viewModel: RegistrationViewModel = koinViewModel(), @@ -93,14 +94,14 @@ internal fun RegistrationScreen( } } - is SignUpEvent.NavigateToVerification -> navigateToVerification.invoke() - is SignUpEvent.NavigateBack -> navigateBack.invoke() + is SignUpEvent.NavigateToLogin -> onVerified.invoke() } } RegistrationScreen( state = state, snackbarHostState = snackbarHostState, + navigateBack = navigateBack, onAction = remember(viewModel) { { viewModel.trySendAction(it) } }, @@ -112,13 +113,14 @@ internal fun RegistrationScreen( private fun RegistrationScreen( state: SignUpState, snackbarHostState: SnackbarHostState, + navigateBack: () -> Unit, onAction: (SignUpAction) -> Unit, modifier: Modifier = Modifier, ) { MifosScaffold( snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, topBarTitle = stringResource(Res.string.register), - backPress = { onAction(SignUpAction.BackPress) }, + backPress = navigateBack, modifier = modifier, content = { contentPadding -> Box( @@ -161,7 +163,7 @@ private fun RegistrationScreenContent( Column( modifier = Modifier .fillMaxSize() - .padding(11.dp) + .padding(bottom = 12.dp) .pointerInput(Unit) { detectTapGestures( onTap = { @@ -185,7 +187,7 @@ private fun RegistrationScreenContent( ) MifosOutlinedTextField( value = state.userNameInput, - onValueChange = { onAction(SignUpAction.UserNameInputChange(it)) }, + onValueChange = { onAction(SignUpAction.EmailInputChange(it)) }, label = stringResource(Res.string.username), modifier = Modifier.fillMaxWidth(), isError = state.userNameInput.isEmpty(), @@ -267,7 +269,8 @@ private fun RegistrationScreenContent( LinearProgressIndicator( progress = { progress }, modifier = Modifier - .fillMaxWidth().padding(top = 5.dp), + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp), color = when (progress) { 0.25f -> Color.Red 0.5f -> Color(alpha = 255, red = 220, green = 185, blue = 0) @@ -299,21 +302,24 @@ private fun RegistrationScreenContent( } }, isError = state.confirmPasswordInput.isEmpty(), - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), ) Row( modifier = Modifier - .fillMaxWidth(), + .fillMaxWidth() + .padding(start = 16.dp), verticalAlignment = Alignment.CenterVertically, ) { Text( text = stringResource(Res.string.verification_mode), + modifier = Modifier.padding(end = 8.dp), color = MaterialTheme.colorScheme.onSurface, ) radioOptions.forEach { authMode -> RadioButton( selected = (authMode == state.authenticationMode), +// onClick = { authenticationMode = authMode }, onClick = { onAction(SignUpAction.AuthenticationMode(authMode)) }, ) Text( @@ -324,16 +330,20 @@ private fun RegistrationScreenContent( } MifosButton( + text = { stringResource(Res.string.register) }, onClick = { onAction(SignUpAction.SubmitClick) + keyboardController?.hide() }, modifier = Modifier - .fillMaxWidth(), + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp, top = 4.dp), contentPadding = PaddingValues(12.dp), - ) { - Text(text = stringResource(Res.string.register)) - } + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primary, + ), + ) Spacer(modifier = Modifier.imePadding()) } @@ -346,6 +356,7 @@ private fun RegistrationScreenPreview() { RegistrationScreen( state = SignUpState(dialogState = null), snackbarHostState = remember { SnackbarHostState() }, + navigateBack = {}, onAction = {}, modifier = Modifier, ) diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationScreen.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationScreen.kt index b3dcd2fbe..a551f49a1 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationScreen.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationScreen.kt @@ -12,15 +12,17 @@ package org.mifos.mobile.feature.auth.registration import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -47,10 +49,11 @@ import mifos_mobile.feature.auth.generated.resources.yes import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel -import org.mifos.mobile.core.common.FileUtils.Companion.logger import org.mifos.mobile.core.designsystem.component.BasicDialogState +import org.mifos.mobile.core.designsystem.component.LoadingDialogState import org.mifos.mobile.core.designsystem.component.MifosBasicDialog import org.mifos.mobile.core.designsystem.component.MifosButton +import org.mifos.mobile.core.designsystem.component.MifosLoadingDialog import org.mifos.mobile.core.designsystem.component.MifosOutlinedTextField import org.mifos.mobile.core.designsystem.component.MifosScaffold import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme @@ -60,8 +63,8 @@ import org.mifos.mobile.core.ui.utils.EventsEffect @Composable internal fun RegistrationVerificationScreen( - navigateToRegister: () -> Unit?, - navigateToLogin: () -> Unit, + navigateBack: () -> Unit?, + onVerified: () -> Unit, viewModel: RegistrationVerificationViewModel = koinViewModel(), ) { val state by viewModel.stateFlow.collectAsStateWithLifecycle() @@ -69,16 +72,17 @@ internal fun RegistrationVerificationScreen( val snackbarHostState = remember { SnackbarHostState() } BackCallback(isEnabled = true) { - logger.d { "back press clicked" } - viewModel.trySendAction(VerificationAction.ConfirmationDialog(true)) + VerificationAction.ConfirmationDialog(true) } VerificationDialogs( dialogState = state.dialogState, - onAction = remember(viewModel) { - { viewModel.trySendAction(it) } + showConfirmationDialog = state.showConfirmationDialog, + onDismissRequest = { VerificationAction.ConfirmationDialog(false) }, + onConfirmExit = { + VerificationAction.ConfirmationDialog(false) + navigateBack() }, - onDismissRequest = { viewModel.trySendAction(VerificationAction.ConfirmationDialog(false)) }, ) EventsEffect(viewModel) { event -> @@ -89,10 +93,10 @@ internal fun RegistrationVerificationScreen( } } is VerificationEvent.NavigateToLogin -> { - navigateToLogin.invoke() + onVerified.invoke() } - is VerificationEvent.NavigateToRegistration -> { - navigateToRegister.invoke() + is VerificationEvent.NavigateToRegister -> { + navigateBack.invoke() } } } @@ -102,14 +106,16 @@ internal fun RegistrationVerificationScreen( { viewModel.trySendAction(it) } }, snackbarHostState = snackbarHostState, + navigateBack = { VerificationAction.ConfirmationDialog(true) }, ) } @Composable private fun VerificationDialogs( - onAction: (VerificationAction) -> Unit, dialogState: VerificationState.VerificationDialog?, + showConfirmationDialog: Boolean, onDismissRequest: () -> Unit, + onConfirmExit: () -> Unit, ) { when (dialogState) { is VerificationState.VerificationDialog.Error -> MifosBasicDialog( @@ -120,9 +126,15 @@ private fun VerificationDialogs( onDismissRequest = onDismissRequest, ) - is VerificationState.VerificationDialog.Loading -> MifosProgressIndicatorOverlay() + is VerificationState.VerificationDialog.Loading -> MifosLoadingDialog( + visibilityState = LoadingDialogState.Shown, + ) + + null -> Unit + } - is VerificationState.VerificationDialog.ConfirmationDialog -> MifosBasicDialog( + if (showConfirmationDialog) { + MifosBasicDialog( visibilityState = BasicDialogState.Shown( title = stringResource(Res.string.dialog_cancel_registration_title), message = stringResource(Res.string.dialog_cancel_registration_message), @@ -130,10 +142,8 @@ private fun VerificationDialogs( confirmText = stringResource(Res.string.yes), cancelText = stringResource(Res.string.no), onDismissRequest = onDismissRequest, - onConfirm = { onAction(VerificationAction.NavigateToRegistration) }, + onConfirm = onConfirmExit, ) - - null -> Unit } } @@ -142,11 +152,12 @@ private fun RegistrationVerificationScreen( state: VerificationState, onAction: (VerificationAction) -> Unit, snackbarHostState: SnackbarHostState, + navigateBack: () -> Unit, modifier: Modifier = Modifier, ) { MifosScaffold( topBarTitle = stringResource(Res.string.register), - backPress = { onAction(VerificationAction.ConfirmationDialog(true)) }, + backPress = navigateBack, modifier = modifier, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, content = { contentPadding -> @@ -156,6 +167,11 @@ private fun RegistrationVerificationScreen( .fillMaxSize(), ) { RegistrationVerificationContent(state = state, onAction = onAction) + when (state.dialogState) { + is VerificationState.VerificationDialog.Loading -> MifosProgressIndicatorOverlay() + is VerificationState.VerificationDialog.Error -> {} + null -> {} + } } }, ) @@ -168,7 +184,7 @@ private fun RegistrationVerificationContent( modifier: Modifier = Modifier, ) { Column( - modifier = modifier.fillMaxSize().padding(11.dp), + modifier = modifier.fillMaxSize(), ) { Image( painter = painterResource(Res.drawable.feature_auth_mifos_logo), @@ -206,21 +222,20 @@ private fun RegistrationVerificationContent( label = stringResource(Res.string.authentication_token), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), ) - Spacer( - modifier = Modifier - .fillMaxWidth() - .height(50.dp), - ) MifosButton( + text = { stringResource(Res.string.verify) }, onClick = { onAction(VerificationAction.SubmitClick) }, modifier = Modifier - .fillMaxWidth(), - ) { - Text(text = stringResource(Res.string.verify)) - } + .fillMaxWidth() + .padding(start = 16.dp, end = 16.dp, top = 12.dp), + contentPadding = PaddingValues(12.dp), + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primary, + ), + ) } } diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationViewModel.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationViewModel.kt index 445ef27b6..3f50eecdb 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationViewModel.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationVerificationViewModel.kt @@ -15,6 +15,8 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import mifos_mobile.feature.auth.generated.resources.Res import mifos_mobile.feature.auth.generated.resources.could_not_register_user_error +import mifos_mobile.feature.auth.generated.resources.empty_authentication_token +import mifos_mobile.feature.auth.generated.resources.empty_requestid import mifos_mobile.feature.auth.generated.resources.verified import org.mifos.mobile.core.data.repository.UserAuthRepository import org.mifos.mobile.core.model.Parcelable @@ -40,30 +42,9 @@ class RegistrationVerificationViewModel( is VerificationAction.AuthenticationTokenChange -> updateState { it.copy(authenticationToken = action.authenticationToken) } is VerificationAction.RequestIdChange -> updateState { it.copy(requestId = action.requestId) } is VerificationAction.RequestIdError -> updateState { it.copy(requestIdError = false) } - is VerificationAction.ConfirmationDialog -> { - updateState { it -> - it.copy( - confirmationDialog = action.confirmationDialog, - dialogState = if (action.confirmationDialog) { - VerificationState.VerificationDialog.ConfirmationDialog( - title = "Cancel Registration?", - message = "Are you sure you want to cancel registration?", - confirmText = "Yes", - cancelText = "No", - onConfirm = { - updateState { it.copy(dialogState = null, confirmationDialog = false) } - sendEvent(VerificationEvent.NavigateToRegistration) - }, - ) - } else { - null - }, - ) - } - } + is VerificationAction.ConfirmationDialog -> updateState { it.copy(showConfirmationDialog = action.confirmationDialog) } is VerificationAction.Internal.ReceiveRegisterResult -> handleVerificationResult(action) is VerificationAction.SubmitClick -> handleSubmitClick() - is VerificationAction.NavigateToRegistration -> sendEvent(VerificationEvent.NavigateToRegistration) VerificationAction.ErrorDialogDismiss -> updateState { it.copy(dialogState = null) } } } @@ -71,7 +52,7 @@ class RegistrationVerificationViewModel( private fun handleSubmitClick() { val errorMessage = validateForm() if (errorMessage != null) { - sendEvent(VerificationEvent.ShowToast(errorMessage)) + updateState { it.copy(dialogState = VerificationState.VerificationDialog.Error(errorMessage)) } } else { verifyUser() } @@ -99,8 +80,8 @@ class RegistrationVerificationViewModel( // TODO:: move error messages to strings.xml private fun validateForm(): String? { return when { - state.authenticationToken.isEmpty() -> "Authentication Token cannot be empty" - state.requestId.isEmpty() -> "Request ID cannot be empty" + state.authenticationToken.isEmpty() -> Res.string.empty_authentication_token.toString() + state.requestId.isEmpty() -> Res.string.empty_requestid.toString() else -> null } } @@ -132,42 +113,32 @@ data class VerificationState( val authenticationToken: String = "", val requestId: String = "", val requestIdError: Boolean = false, - val confirmationDialog: Boolean = false, + val showConfirmationDialog: Boolean = false, val dialogState: VerificationDialog? = null, ) : Parcelable { - sealed class VerificationDialog : Parcelable { - @Parcelize - data object Loading : VerificationDialog() - + sealed interface VerificationDialog : Parcelable { @Parcelize - data class Error(val message: String) : VerificationDialog() + data object Loading : VerificationDialog @Parcelize - data class ConfirmationDialog( - val title: String, - val message: String, - val confirmText: String, - val cancelText: String, - val onConfirm: () -> Unit, - ) : VerificationDialog() + data class Error(val message: String) : VerificationDialog } } - -sealed class VerificationEvent { - data class ShowToast(val message: String) : VerificationEvent() - data class NavigateToLogin(val username: String) : VerificationEvent() - data object NavigateToRegistration : VerificationEvent() +sealed interface VerificationEvent { + data class ShowToast(val message: String) : VerificationEvent + data class NavigateToLogin(val username: String) : VerificationEvent + data object NavigateToRegister : VerificationEvent } -sealed class VerificationAction { - data class RequestIdChange(val requestId: String) : VerificationAction() - data class AuthenticationTokenChange(val authenticationToken: String) : VerificationAction() - data class ConfirmationDialog(val confirmationDialog: Boolean) : VerificationAction() - data object RequestIdError : VerificationAction() - data object SubmitClick : VerificationAction() - data object ErrorDialogDismiss : VerificationAction() - data object NavigateToRegistration : VerificationAction() - sealed class Internal : VerificationAction() { +sealed interface VerificationAction { + data class RequestIdChange(val requestId: String) : VerificationAction + data class AuthenticationTokenChange(val authenticationToken: String) : VerificationAction + data class ConfirmationDialog(val confirmationDialog: Boolean) : VerificationAction + data object RequestIdError : VerificationAction + data object SubmitClick : VerificationAction + data object ErrorDialogDismiss : VerificationAction + + sealed class Internal : VerificationAction { data class ReceiveRegisterResult( val registerResult: DataState, ) : Internal() diff --git a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationViewModel.kt b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationViewModel.kt index 529d07310..00d28f92d 100644 --- a/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationViewModel.kt +++ b/feature/auth/src/commonMain/kotlin/org/mifos/mobile/feature/auth/registration/RegistrationViewModel.kt @@ -16,7 +16,19 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import mifos_mobile.feature.auth.generated.resources.Res import mifos_mobile.feature.auth.generated.resources.could_not_register_user_error -import org.mifos.mobile.core.common.FileUtils.Companion.logger +import mifos_mobile.feature.auth.generated.resources.error_enter_account_number +import mifos_mobile.feature.auth.generated.resources.error_enter_country +import mifos_mobile.feature.auth.generated.resources.error_enter_email +import mifos_mobile.feature.auth.generated.resources.error_enter_first_name +import mifos_mobile.feature.auth.generated.resources.error_enter_last_name +import mifos_mobile.feature.auth.generated.resources.error_enter_mobile_number +import mifos_mobile.feature.auth.generated.resources.error_enter_user_name +import mifos_mobile.feature.auth.generated.resources.error_invalid_email +import mifos_mobile.feature.auth.generated.resources.error_invalid_password +import mifos_mobile.feature.auth.generated.resources.error_mobile_length +import mifos_mobile.feature.auth.generated.resources.error_password_not_match +import mifos_mobile.feature.auth.generated.resources.invalid_phn_number +import mifos_mobile.feature.auth.generated.resources.password_strength_weak import org.mifos.mobile.core.common.utils.isValidEmail import org.mifos.mobile.core.data.repository.UserAuthRepository import org.mifos.mobile.core.model.IgnoredOnParcel @@ -54,7 +66,7 @@ class RegistrationViewModel( is SignUpAction.PasswordInputChange -> handlePasswordInput(action.password) is SignUpAction.ConfirmPasswordInputChange -> updateState { it.copy(confirmPasswordInput = action.confirmPassword) } is SignUpAction.UserNameInputChange -> updateState { it.copy(userNameInput = action.username) } -// is SignUpAction.CountryInputChange -> updateState { it.copy(countryInput = action.country) } + is SignUpAction.CountryInputChange -> updateState { it.copy(countryInput = action.country) } is SignUpAction.IsPasswordChanges -> updateState { it.copy(isPasswordChanged = true) } is SignUpAction.AuthenticationMode -> updateState { it.copy( @@ -71,13 +83,12 @@ class RegistrationViewModel( is SignUpAction.ConfirmTogglePasswordVisibility -> updateState { it.copy( isConfirmPasswordVisible = !it - .isConfirmPasswordVisible, + .isPasswordVisible, ) } is SignUpAction.Internal.ReceivePasswordStrengthResult -> handlePasswordStrengthResult(action) is SignUpAction.Internal.ReceiveRegisterResult -> handleRegisterResult(action) is SignUpAction.SubmitClick -> handleSubmitClick() - is SignUpAction.BackPress -> sendEvent(SignUpEvent.NavigateBack) SignUpAction.ErrorDialogDismiss -> updateState { it.copy(dialogState = null) } } } @@ -118,9 +129,8 @@ class RegistrationViewModel( private fun handleSubmitClick() { val errorMessage = validateForm() - logger.d { "handleSubmitClick: $errorMessage" } if (errorMessage != null) { - sendEvent(SignUpEvent.ShowToast(errorMessage)) + updateState { it.copy(dialogState = SignUpDialog.Error(errorMessage)) } } else { registerUser() } @@ -130,17 +140,12 @@ class RegistrationViewModel( when (val result = action.registerResult) { is DataState.Success -> { updateState { it.copy(dialogState = null) } - sendEvent(SignUpEvent.NavigateToVerification(result.data)) + sendEvent(SignUpEvent.NavigateToLogin(result.data)) } is DataState.Error -> { updateState { - it.copy( - dialogState = SignUpDialog.Error( - result.exception.message - ?: "An error occurred.", - ), - ) + it.copy(dialogState = SignUpDialog.Error(result.exception.message ?: "An error occurred.")) } } @@ -150,37 +155,47 @@ class RegistrationViewModel( } } + // TODO:: move error messages to strings.xml private fun validateForm(): String? { return when { - state.accountNumber.isEmpty() -> "Please enter an account number" - state.firstNameInput.isEmpty() -> "Please enter first name" - state.lastNameInput.isEmpty() -> "Please enter last name" - state.userNameInput.isEmpty() -> "Please enter username" - state.emailInput.isEmpty() -> "Please enter email" - !state.emailInput.isValidEmail() -> "Invalid email format" - state.mobileNumberInput.isEmpty() -> "Please enter mobile number" - state.mobileNumberInput.length < 10 -> "Mobile number must be at least 10 digits" - state.passwordInput.length < 8 -> "Password must be at least 8 characters" - !state.isPasswordMatch -> "Passwords do not match" - !state.isPasswordStrong -> "Password is too weak" -// state.countryInput.isEmpty() -> "Please enter country" + state.accountNumber.isEmpty() -> Res.string.error_enter_account_number.toString() + state.firstNameInput.isEmpty() -> Res.string.error_enter_first_name.toString() + state.lastNameInput.isEmpty() -> Res.string.error_enter_last_name.toString() + state.userNameInput.isEmpty() -> Res.string.error_enter_user_name.toString() + state.emailInput.isEmpty() -> Res.string.error_enter_email.toString() + !state.emailInput.isValidEmail() -> Res.string.error_invalid_email.toString() + state.mobileNumberInput.isEmpty() -> Res.string.error_enter_mobile_number.toString() + state.mobileNumberInput.length < 10 -> Res.string.error_mobile_length.toString() + isPhoneNumberValid(state.mobileNumberInput) -> Res.string.invalid_phn_number.toString() + state.passwordInput.length < 8 -> Res.string.error_invalid_password.toString() + !state.isPasswordMatch -> Res.string.error_password_not_match.toString() + !state.isPasswordStrong -> Res.string.password_strength_weak.toString() + state.countryInput.isEmpty() -> Res.string.error_enter_country.toString() else -> null } } + private fun isPhoneNumberValid(fieldText: String?): Boolean { + if (fieldText.isNullOrBlank()) { + return false + } + + val phoneNumberPattern = "^\\+?[0-9]{10,15}\$" + val regex = phoneNumberPattern.toRegex() + return regex.matches(fieldText.trim()) + } + private fun registerUser() { viewModelScope.launch { updateState { it.copy(dialogState = SignUpDialog.Loading) } try { - logger.d { state.authenticationMode } userAuthRepositoryImpl.registerUser( accountNumber = state.accountNumber, authenticationMode = state.authenticationMode, email = state.emailInput, firstName = state.firstNameInput, lastName = state.lastNameInput, -// mobileNumber = state.countryInput + state.mobileNumberInput, - mobileNumber = state.mobileNumberInput, + mobileNumber = state.countryInput + state.mobileNumberInput, password = state.passwordInput, username = state.userNameInput, ) @@ -191,17 +206,7 @@ class RegistrationViewModel( ), ) } catch (e: Exception) { - updateState { - it.copy( - dialogState = SignUpDialog.Error( - ( - e.message - ?: Res.string - .could_not_register_user_error - ).toString(), - ), - ) - } + updateState { it.copy(dialogState = SignUpDialog.Error((e.message ?: Res.string.could_not_register_user_error).toString())) } } } } @@ -217,9 +222,9 @@ data class SignUpState( val passwordInput: String = "", val confirmPasswordInput: String = "", val mobileNumberInput: String = "", -// val countryInput: String = "", + val countryInput: String = "", val dialogState: SignUpDialog? = null, - val authenticationMode: String = "email", + val authenticationMode: String = "Email", val isPasswordChanged: Boolean = false, val passwordStrengthState: PasswordStrengthState = PasswordStrengthState.NONE, val isPasswordVisible: Boolean = false, @@ -252,32 +257,30 @@ sealed interface SignUpDialog : Parcelable { @Parcelize data class Error(val message: String) : SignUpDialog } -sealed class SignUpEvent { - data class ShowToast(val message: String) : SignUpEvent() - data class NavigateToVerification(val username: String) : SignUpEvent() - data object NavigateBack : SignUpEvent() -} -sealed class SignUpAction { - data class AccountInputChange(val accountNumber: String) : SignUpAction() - data class UserNameInputChange(val username: String) : SignUpAction() - data class FirstNameInputChange(val firstName: String) : SignUpAction() - data class LastNameInputChange(val lastName: String) : SignUpAction() - data class EmailInputChange(val email: String) : SignUpAction() - data class PasswordInputChange(val password: String) : SignUpAction() - data class ConfirmPasswordInputChange(val confirmPassword: String) : SignUpAction() - data class MobileNumberInputChange(val mobileNumber: String) : SignUpAction() +sealed interface SignUpEvent { + data class ShowToast(val message: String) : SignUpEvent + data class NavigateToLogin(val username: String) : SignUpEvent +} -// data class CountryInputChange(val country: String) : SignUpAction() - data class AuthenticationMode(val authenticationMode: String) : SignUpAction() - data class IsPasswordChanges(val isPasswordChanged: Boolean) : SignUpAction() - data object TogglePasswordVisibility : SignUpAction() - data object ConfirmTogglePasswordVisibility : SignUpAction() - data object SubmitClick : SignUpAction() - data object BackPress : SignUpAction() - data object ErrorDialogDismiss : SignUpAction() +sealed interface SignUpAction { + data class AccountInputChange(val accountNumber: String) : SignUpAction + data class UserNameInputChange(val username: String) : SignUpAction + data class FirstNameInputChange(val firstName: String) : SignUpAction + data class LastNameInputChange(val lastName: String) : SignUpAction + data class EmailInputChange(val email: String) : SignUpAction + data class PasswordInputChange(val password: String) : SignUpAction + data class ConfirmPasswordInputChange(val confirmPassword: String) : SignUpAction + data class MobileNumberInputChange(val mobileNumber: String) : SignUpAction + data class CountryInputChange(val country: String) : SignUpAction + data class AuthenticationMode(val authenticationMode: String) : SignUpAction + data class IsPasswordChanges(val isPasswordChanged: Boolean) : SignUpAction + data object TogglePasswordVisibility : SignUpAction + data object ConfirmTogglePasswordVisibility : SignUpAction + data object SubmitClick : SignUpAction + data object ErrorDialogDismiss : SignUpAction - sealed class Internal : SignUpAction() { + sealed class Internal : SignUpAction { data class ReceiveRegisterResult( val registerResult: DataState, ) : Internal() diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6329c1b42..5797c0f77 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -86,7 +86,7 @@ ktorfit = "2.2.0" ktorfitKsp = "2.2.0-1.0.29" # Koin CMP Dependencies -koin = "4.0.2" +koin = "4.0.1-RC1" koinAnnotationsVersion = "1.4.0-RC4" # CMP Libraries @@ -117,7 +117,6 @@ packageNamespace = "org.mifos.desktop" packageVersion = "1.0.0" roomCommonVersion = "2.6.1" materialVersion = "1.10.0" -material = "1.12.0" [libraries] accompanist-pager = { group = "com.google.accompanist", name = "accompanist-pager", version.ref = "accompanistVersion" } @@ -318,7 +317,6 @@ moko-permission-compose = { group = "dev.icerock.moko", name = "permissions-comp window-size = { group = "dev.chrisbanes.material3", name = "material3-window-size-class-multiplatform", version.ref = "windowsSizeClass" } androidx-room-common = { group = "androidx.room", name = "room-common", version.ref = "roomCommonVersion" } -material = { group = "com.google.android.material", name = "material", version.ref = "material" } [bundles] androidx-compose-ui-test = [ diff --git a/cmp-ios/iosApp.xcodeproj/project.pbxproj b/iosApp/iosApp.xcodeproj/project.pbxproj similarity index 100% rename from cmp-ios/iosApp.xcodeproj/project.pbxproj rename to iosApp/iosApp.xcodeproj/project.pbxproj diff --git a/cmp-ios/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iosApp/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from cmp-ios/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to iosApp/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/cmp-ios/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from cmp-ios/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/cmp-ios/iosApp.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate b/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate similarity index 100% rename from cmp-ios/iosApp.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate rename to iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/cmp-ios/iosApp.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist b/iosApp/iosApp.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist similarity index 100% rename from cmp-ios/iosApp.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist rename to iosApp/iosApp.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/cmp-ios/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json b/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from cmp-ios/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json rename to iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/cmp-ios/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from cmp-ios/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json rename to iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/cmp-ios/iosApp/Assets.xcassets/Contents.json b/iosApp/iosApp/Assets.xcassets/Contents.json similarity index 100% rename from cmp-ios/iosApp/Assets.xcassets/Contents.json rename to iosApp/iosApp/Assets.xcassets/Contents.json diff --git a/cmp-ios/iosApp/ContentView.swift b/iosApp/iosApp/ContentView.swift similarity index 100% rename from cmp-ios/iosApp/ContentView.swift rename to iosApp/iosApp/ContentView.swift diff --git a/cmp-ios/iosApp/Preview Content/Preview Assets.xcassets/Contents.json b/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from cmp-ios/iosApp/Preview Content/Preview Assets.xcassets/Contents.json rename to iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/cmp-ios/iosApp/iosAppApp.swift b/iosApp/iosApp/iosAppApp.swift similarity index 100% rename from cmp-ios/iosApp/iosAppApp.swift rename to iosApp/iosApp/iosAppApp.swift diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock deleted file mode 100644 index 0d38cc329..000000000 --- a/kotlin-js-store/yarn.lock +++ /dev/null @@ -1,2897 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" - integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/source-map@^0.3.3": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" - integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@js-joda/core@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@js-joda/core/-/core-3.2.0.tgz#3e61e21b7b2b8a6be746df1335cf91d70db2a273" - integrity sha512-PMqgJ0sw5B7FKb2d5bWYIoxjri+QlW/Pys7+Rw82jSH0QN3rB05jZ/VrrsUdh1w4+i2kw9JOejXGq/KhDOX7Kg== - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" - integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== - -"@socket.io/component-emitter@~3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" - integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== - -"@types/body-parser@*": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bonjour@^3.5.9": - version "3.5.13" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" - integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== - dependencies: - "@types/node" "*" - -"@types/connect-history-api-fallback@^1.3.5": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" - integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== - dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/cors@^2.8.12": - version "2.8.17" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" - integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== - dependencies: - "@types/node" "*" - -"@types/estree@^1.0.5": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" - integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express-serve-static-core@^4.17.33": - version "4.19.6" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" - integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" - integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/express@^4.17.13": - version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" - integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/http-errors@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== - -"@types/http-proxy@^1.17.8": - version "1.17.15" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.15.tgz#12118141ce9775a6499ecb4c01d02f90fc839d36" - integrity sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ== - dependencies: - "@types/node" "*" - -"@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/node-forge@^1.3.0": - version "1.3.11" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" - integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== - dependencies: - "@types/node" "*" - -"@types/node@*", "@types/node@>=10.0.0": - version "22.13.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.1.tgz#a2a3fefbdeb7ba6b89f40371842162fac0934f33" - integrity sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew== - dependencies: - undici-types "~6.20.0" - -"@types/qs@*": - version "6.9.18" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" - integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/send@*": - version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-index@^1.9.1": - version "1.9.4" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" - integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== - dependencies: - "@types/express" "*" - -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" - integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "*" - -"@types/sockjs@^0.3.33": - version "0.3.36" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" - integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== - dependencies: - "@types/node" "*" - -"@types/ws@^8.5.5": - version "8.5.14" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.14.tgz#93d44b268c9127d96026cf44353725dd9b6c3c21" - integrity sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw== - dependencies: - "@types/node" "*" - -"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.12.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" - integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== - dependencies: - "@webassemblyjs/helper-numbers" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - -"@webassemblyjs/floating-point-hex-parser@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" - integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== - -"@webassemblyjs/helper-api-error@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" - integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== - -"@webassemblyjs/helper-buffer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" - integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== - -"@webassemblyjs/helper-numbers@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" - integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.13.2" - "@webassemblyjs/helper-api-error" "1.13.2" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" - integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== - -"@webassemblyjs/helper-wasm-section@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" - integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/wasm-gen" "1.14.1" - -"@webassemblyjs/ieee754@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" - integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" - integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" - integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== - -"@webassemblyjs/wasm-edit@^1.12.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" - integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/helper-wasm-section" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-opt" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - "@webassemblyjs/wast-printer" "1.14.1" - -"@webassemblyjs/wasm-gen@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" - integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wasm-opt@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" - integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - -"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.12.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" - integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-api-error" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wast-printer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" - integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" - integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== - -"@webpack-cli/info@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" - integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== - -"@webpack-cli/serve@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" - integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -accepts@~1.3.4, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-attributes@^1.9.5: - version "1.9.5" - resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" - integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== - -acorn@^8.7.1, acorn@^8.8.2: - version "8.14.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" - integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - 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@^8.0.0, ajv@^8.9.0: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ansi-colors@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64id@2.0.0, base64id@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -body-parser@1.20.3, body-parser@^1.19.0: - version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - 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.13.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour-service@^1.0.11: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722" - integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== - dependencies: - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browser-stdout@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserslist@^4.21.10: - version "4.24.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" - integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== - dependencies: - caniuse-lite "^1.0.30001688" - electron-to-chromium "^1.5.73" - node-releases "^2.0.19" - update-browserslist-db "^1.1.1" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind-apply-helpers@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" - integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bound@^1.0.2, call-bound@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" - integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== - dependencies: - call-bind-apply-helpers "^1.0.1" - get-intrinsic "^1.2.6" - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001688: - version "1.0.30001696" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz#00c30a2fc11e3c98c25e5125418752af3ae2f49f" - integrity sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ== - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@^3.5.1, chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.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" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" - integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.10, colorette@^2.0.14: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -commander@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -compressible@~2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93" - integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q== - dependencies: - bytes "3.1.2" - compressible "~2.0.18" - debug "2.6.9" - negotiator "~0.6.4" - on-headers "~1.0.2" - safe-buffer "5.2.1" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - -connect@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" - integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== - -cookie@~0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" - integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@~2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cross-spawn@^7.0.3: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -custom-event@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" - integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== - -date-format@^4.0.14: - version "4.0.14" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" - integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4.1.0, debug@^4.3.4, debug@^4.3.5: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - -debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -di@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" - integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== - -diff@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" - integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== - -dns-packet@^5.2.2: - version "5.6.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" - integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -dom-serialize@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" - integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== - dependencies: - custom-event "~1.0.0" - ent "~2.2.0" - extend "^3.0.0" - void-elements "^2.0.0" - -dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.5.73: - version "1.5.91" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.91.tgz#cf5567f6853062493242133aefd4dc8dc8440abd" - integrity sha512-sNSHHyq048PFmZY4S90ax61q+gLCs0X0YmcOII9wG9S2XwbVr+h4VW2wWhnbp/Eys3cCwTxVF292W3qPaxIapQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -encodeurl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - -engine.io-parser@~5.2.1: - version "5.2.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" - integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== - -engine.io@~6.6.0: - version "6.6.4" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.4.tgz#0a89a3e6b6c1d4b0c2a2a637495e7c149ec8d8ee" - integrity sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g== - dependencies: - "@types/cors" "^2.8.12" - "@types/node" ">=10.0.0" - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.7.2" - cors "~2.8.5" - debug "~4.3.1" - engine.io-parser "~5.2.1" - ws "~8.17.1" - -enhanced-resolve@^5.17.1: - version "5.18.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz#91eb1db193896b9801251eeff1c6980278b1e404" - integrity sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -ent@~2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.2.tgz#22a5ed2fd7ce0cbcff1d1474cf4909a44bdb6e85" - integrity sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - punycode "^1.4.1" - safe-regex-test "^1.1.0" - -envinfo@^7.7.3: - version "7.14.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" - integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== - -es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-module-lexer@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" - integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== - -es-object-atoms@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -escalade@^3.1.1, escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - 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@^4.17.3: - version "4.21.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" - integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.12" - proxy-addr "~2.0.7" - qs "6.13.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-uri@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" - integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== - -fastest-levenshtein@^1.0.12: - version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" - integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== - dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.7: - version "3.3.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" - integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== - -follow-redirects@^1.0.0: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - -format-util@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" - integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-monkey@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.6.tgz#8ead082953e88d992cf3ff844faa907b26756da2" - integrity sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.7.tgz#dcfcb33d3272e15f445d15124bc0a216189b9044" - integrity sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - function-bind "^1.1.2" - get-proto "^1.0.0" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-proto@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.1.3, glob@^7.1.7: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - 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@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-entities@^2.3.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" - integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.9" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.9.tgz#b817b3ca0edea6236225000d795378707c169cec" - integrity sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw== - -http-proxy-middleware@^2.0.3: - version "2.0.7" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6" - integrity sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA== - dependencies: - "@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" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -import-local@^3.0.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" - integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -interpret@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" - integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" - integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.16.0: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regex@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" - integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== - dependencies: - call-bound "^1.0.2" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isbinaryfile@^4.0.8: - version "4.0.10" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" - integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -karma-chrome-launcher@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz#eb9c95024f2d6dfbb3748d3415ac9b381906b9a9" - integrity sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q== - dependencies: - which "^1.2.1" - -karma-mocha@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" - integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== - dependencies: - minimist "^1.2.3" - -karma-sourcemap-loader@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.4.0.tgz#b01d73f8f688f533bcc8f5d273d43458e13b5488" - integrity sha512-xCRL3/pmhAYF3I6qOrcn0uhbQevitc2DERMPH82FMnG+4WReoGcGFZb1pURf2a5apyrOHRdvD+O6K7NljqKHyA== - dependencies: - graceful-fs "^4.2.10" - -karma-webpack@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.1.tgz#4eafd31bbe684a747a6e8f3e4ad373e53979ced4" - integrity sha512-oo38O+P3W2mSPCSUrQdySSPv1LvPpXP+f+bBimNomS5sW+1V4SuhCuW8TfJzV+rDv921w2fDSDw0xJbPe6U+kQ== - dependencies: - glob "^7.1.3" - minimatch "^9.0.3" - webpack-merge "^4.1.5" - -karma@6.4.4: - version "6.4.4" - resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.4.tgz#dfa5a426cf5a8b53b43cd54ef0d0d09742351492" - integrity sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w== - dependencies: - "@colors/colors" "1.5.0" - body-parser "^1.19.0" - braces "^3.0.2" - chokidar "^3.5.1" - connect "^3.7.0" - di "^0.0.1" - dom-serialize "^2.2.1" - glob "^7.1.7" - graceful-fs "^4.2.6" - http-proxy "^1.18.1" - isbinaryfile "^4.0.8" - lodash "^4.17.21" - log4js "^6.4.1" - mime "^2.5.2" - minimatch "^3.0.4" - mkdirp "^0.5.5" - qjobs "^1.2.0" - range-parser "^1.2.1" - rimraf "^3.0.2" - socket.io "^4.7.2" - source-map "^0.6.1" - tmp "^0.2.1" - ua-parser-js "^0.7.30" - yargs "^16.1.1" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kotlin-web-helpers@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/kotlin-web-helpers/-/kotlin-web-helpers-2.0.0.tgz#b112096b273c1e733e0b86560998235c09a19286" - integrity sha512-xkVGl60Ygn/zuLkDPx+oHj7jeLR7hCvoNF99nhwXMn8a3ApB4lLiC9pk4ol4NHPjyoCbvQctBqvzUcp8pkqyWw== - dependencies: - format-util "^1.0.5" - -launch-editor@^2.6.0: - version "2.9.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.9.1.tgz#253f173bd441e342d4344b4dae58291abb425047" - integrity sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w== - dependencies: - picocolors "^1.0.0" - shell-quote "^1.8.1" - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash@^4.17.15, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log4js@^6.4.1: - version "6.9.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.9.1.tgz#aba5a3ff4e7872ae34f8b4c533706753709e38b6" - integrity sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g== - dependencies: - date-format "^4.0.14" - debug "^4.3.4" - flatted "^3.2.7" - rfdc "^1.3.0" - streamroller "^3.1.5" - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memfs@^3.4.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" - integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== - dependencies: - fs-monkey "^1.0.4" - -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.2: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -"mime-db@>= 1.43.0 < 2": - version "1.53.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" - integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== - -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.5.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1, minimatch@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.3: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.3, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mkdirp@^0.5.5: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mocha@10.7.3: - version "10.7.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" - integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== - dependencies: - ansi-colors "^4.1.3" - browser-stdout "^1.3.1" - chokidar "^3.5.3" - debug "^4.3.5" - diff "^5.2.0" - escape-string-regexp "^4.0.0" - find-up "^5.0.0" - glob "^8.1.0" - he "^1.2.0" - js-yaml "^4.1.0" - log-symbols "^4.1.0" - minimatch "^5.1.6" - ms "^2.1.3" - serialize-javascript "^6.0.2" - strip-json-comments "^3.1.1" - supports-color "^8.1.1" - workerpool "^6.5.1" - yargs "^16.2.0" - yargs-parser "^20.2.9" - yargs-unparser "^2.0.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.3, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -negotiator@~0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" - integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -node-forge@^1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -object-assign@^4: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.13.3: - version "1.13.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" - integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^8.0.9: - version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" - integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== - -picocolors@^1.0.0, picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -qjobs@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" - integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== - -qs@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== - dependencies: - side-channel "^1.0.6" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -readable-stream@^2.0.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - 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" - -readable-stream@^3.0.6: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" - integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== - dependencies: - resolve "^1.20.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve@^1.20.0: - version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -rfdc@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" - integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex-test@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" - integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-regex "^1.2.1" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -schema-utils@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0, schema-utils@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.0.tgz#3b669f04f71ff2dfb5aba7ce2d5a9d79b35622c0" - integrity sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^2.1.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" - integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== - dependencies: - "@types/node-forge" "^1.3.0" - node-forge "^1" - -send@0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== - dependencies: - 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" - -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - 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" - -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== - dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.19.0" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" - integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== - -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - side-channel-map "^1.0.1" - -side-channel@^1.0.6: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - -signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -socket.io-adapter@~2.5.2: - version "2.5.5" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" - integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg== - dependencies: - debug "~4.3.4" - ws "~8.17.1" - -socket.io-parser@~4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" - integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - -socket.io@^4.7.2: - version "4.8.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.1.tgz#fa0eaff965cc97fdf4245e8d4794618459f7558a" - integrity sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg== - dependencies: - accepts "~1.3.4" - base64id "~2.0.0" - cors "~2.8.5" - debug "~4.3.2" - engine.io "~6.6.0" - socket.io-adapter "~2.5.2" - socket.io-parser "~4.2.4" - -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -source-map-js@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map-loader@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-5.0.0.tgz#f593a916e1cc54471cfc8851b905c8a845fc7e38" - integrity sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA== - dependencies: - iconv-lite "^0.6.3" - source-map-js "^1.0.2" - -source-map-support@0.5.21, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - 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" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -streamroller@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" - integrity sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw== - dependencies: - date-format "^4.0.14" - debug "^4.3.4" - fs-extra "^8.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0, supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.3.10: - version "5.3.11" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz#93c21f44ca86634257cac176f884f942b7ba3832" - integrity sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - jest-worker "^27.4.5" - schema-utils "^4.3.0" - serialize-javascript "^6.0.2" - terser "^5.31.1" - -terser@^5.31.1: - version "5.37.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" - integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tmp@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" - integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typescript@5.5.4: - version "5.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" - integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== - -ua-parser-js@^0.7.30: - version "0.7.40" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.40.tgz#c87d83b7bb25822ecfa6397a0da5903934ea1562" - integrity sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ== - -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" - integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== - -watchpack@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" - integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -webpack-cli@5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" - integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^2.1.1" - "@webpack-cli/info" "^2.0.2" - "@webpack-cli/serve" "^2.0.5" - colorette "^2.0.14" - commander "^10.0.1" - cross-spawn "^7.0.3" - envinfo "^7.7.3" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^3.1.1" - rechoir "^0.8.0" - webpack-merge "^5.7.3" - -webpack-dev-middleware@^5.3.4: - version "5.3.4" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" - integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@4.15.2: - version "4.15.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" - integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== - dependencies: - "@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.4" - ws "^8.13.0" - -webpack-merge@^4.1.5: - version "4.2.2" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" - integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== - dependencies: - lodash "^4.17.15" - -webpack-merge@^5.7.3: - version "5.10.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" - integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.0" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@5.94.0: - version "5.94.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" - integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== - dependencies: - "@types/estree" "^1.0.5" - "@webassemblyjs/ast" "^1.12.1" - "@webassemblyjs/wasm-edit" "^1.12.1" - "@webassemblyjs/wasm-parser" "^1.12.1" - acorn "^8.7.1" - acorn-import-attributes "^1.9.5" - browserslist "^4.21.10" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.1" - 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.11" - 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.10" - watchpack "^2.4.1" - webpack-sources "^3.2.3" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -which@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wildcard@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -workerpool@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" - integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@8.18.0, ws@^8.13.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== - -ws@8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== - -ws@~8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@^20.2.2, yargs-parser@^20.2.9: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@^16.1.1, yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/settings.gradle.kts b/settings.gradle.kts index ec84eec17..cee2e42ab 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,12 @@ import org.ajoberstar.reckon.gradle.ReckonExtension +include(":mifos-shared") + + +include(":mifos-android") + + + pluginManagement { includeBuild("build-logic") repositories { @@ -37,10 +44,8 @@ rootProject.name = "mifos-mobile" enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") -include(":cmp-shared") -include(":cmp-android") -include(":cmp-desktop") -include(":cmp-web") +include(":androidApp") + // Core Modules include(":core:ui") include(":core:designsystem") @@ -55,7 +60,6 @@ include(":core:qrcode") //include(":core:testing") // Feature Modules -include(":feature:auth") //include(":feature:loan") //include(":feature:beneficiary") //include(":feature:savings") @@ -71,6 +75,7 @@ include(":feature:auth") //include(":feature:location") //include(":feature:about") //include(":feature:settings") +include(":feature:auth") //include(":feature:update-password") //include(":feature:home") //include(":feature:user-profile") @@ -85,3 +90,4 @@ include(":libs:material3-navigation") include(":libs:mifos-passcode") // Kotlin Multiplatform Modules +include(":shared") \ No newline at end of file diff --git a/cmp-shared/README.md b/shared/README.md similarity index 100% rename from cmp-shared/README.md rename to shared/README.md diff --git a/cmp-shared/build.gradle.kts b/shared/build.gradle.kts similarity index 56% rename from cmp-shared/build.gradle.kts rename to shared/build.gradle.kts index 62f1a81fd..a7ba5874b 100644 --- a/cmp-shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -1,49 +1,41 @@ -/* - * Copyright 2025 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ plugins { - alias(libs.plugins.mifos.kmp.library) - alias(libs.plugins.mifos.cmp.feature) + alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.android.library) alias(libs.plugins.compose.compiler) alias(libs.plugins.jetbrainsCompose) - alias(libs.plugins.kotlin.parcelize) } kotlin { + androidTarget() + listOf( iosX64(), iosArm64(), iosSimulatorArm64() ).forEach { it.binaries.framework { - baseName = "ComposeApp" + baseName = "shared" isStatic = true } } sourceSets { + androidMain.dependencies { + implementation(compose.preview) + implementation(libs.androidx.activity.compose) + + implementation(libs.koin.android) + implementation(libs.koin.androidx.compose) + } commonMain.dependencies { - api(projects.core.data) - api(projects.core.network) //put your multiplatform dependencies here implementation(compose.material) implementation(compose.material3) api(libs.koin.core) implementation(libs.koin.compose) implementation(libs.koin.compose.viewmodel) - - implementation(projects.feature.auth) } - desktopMain.dependencies { - implementation(compose.desktop.currentOs) - implementation(compose.desktop.common) + commonTest.dependencies { } } task("testClasses") diff --git a/shared/src/androidMain/kotlin/org/mifos/mobile/shared/MainActivity.kt b/shared/src/androidMain/kotlin/org/mifos/mobile/shared/MainActivity.kt new file mode 100644 index 000000000..de4845478 --- /dev/null +++ b/shared/src/androidMain/kotlin/org/mifos/mobile/shared/MainActivity.kt @@ -0,0 +1,23 @@ +package org.mifos.mobile.shared + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContent { + App() + } + } +} + +@Preview +@Composable +fun AppAndroidPreview() { + App() +} \ No newline at end of file diff --git a/shared/src/androidMain/kotlin/org/mifos/mobile/shared/MyApplication.kt b/shared/src/androidMain/kotlin/org/mifos/mobile/shared/MyApplication.kt new file mode 100644 index 000000000..8bedfc1b8 --- /dev/null +++ b/shared/src/androidMain/kotlin/org/mifos/mobile/shared/MyApplication.kt @@ -0,0 +1,15 @@ +package org.mifos.mobile.shared + +import android.app.Application +import org.koin.android.ext.koin.androidContext +import org.mifos.mobile.shared.di.initKoin + +class MyApplication: Application() { + + override fun onCreate() { + super.onCreate() + initKoin { + androidContext(this@MyApplication) + } + } +} \ No newline at end of file diff --git a/shared/src/androidMain/kotlin/org/mifos/mobile/shared/Platform.android.kt b/shared/src/androidMain/kotlin/org/mifos/mobile/shared/Platform.android.kt new file mode 100644 index 000000000..c63e13259 --- /dev/null +++ b/shared/src/androidMain/kotlin/org/mifos/mobile/shared/Platform.android.kt @@ -0,0 +1,7 @@ +package org.mifos.mobile.shared + +class AndroidPlatform : Platform { + override val name: String = "Android ${android.os.Build.VERSION.SDK_INT}" +} + +actual fun getPlatform(): Platform = AndroidPlatform() \ No newline at end of file diff --git a/shared/src/androidMain/kotlin/org/mifos/mobile/shared/di/Modules.android.kt b/shared/src/androidMain/kotlin/org/mifos/mobile/shared/di/Modules.android.kt new file mode 100644 index 000000000..8b285c809 --- /dev/null +++ b/shared/src/androidMain/kotlin/org/mifos/mobile/shared/di/Modules.android.kt @@ -0,0 +1,6 @@ +package org.mifos.mobile.shared.di + +import org.koin.core.module.Module + +actual val platformModule: Module + get() = TODO("Not yet implemented") \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/mifos/mobile/shared/App.kt b/shared/src/commonMain/kotlin/org/mifos/mobile/shared/App.kt new file mode 100644 index 000000000..aefdd9e48 --- /dev/null +++ b/shared/src/commonMain/kotlin/org/mifos/mobile/shared/App.kt @@ -0,0 +1,29 @@ +package org.mifos.mobile.shared + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import org.koin.compose.KoinContext + +@Composable +fun App() { + KoinContext { + Box( + modifier = Modifier + .fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Text( + text = "Mifos Mobile", + style = MaterialTheme.typography.titleLarge.copy(fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.onSurface) + ) + } + } +} + diff --git a/shared/src/commonMain/kotlin/org/mifos/mobile/shared/Platform.kt b/shared/src/commonMain/kotlin/org/mifos/mobile/shared/Platform.kt new file mode 100644 index 000000000..c6e1c1823 --- /dev/null +++ b/shared/src/commonMain/kotlin/org/mifos/mobile/shared/Platform.kt @@ -0,0 +1,7 @@ +package org.mifos.mobile.shared + +interface Platform { + val name: String +} + +expect fun getPlatform(): Platform \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/Modules.kt b/shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/Modules.kt new file mode 100644 index 000000000..3a77e9d5e --- /dev/null +++ b/shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/Modules.kt @@ -0,0 +1,10 @@ +package org.mifos.mobile.shared.di + +import org.koin.core.module.Module +import org.koin.dsl.module + +expect val platformModule: Module + +val sharedModule = module { + single { } +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/initKoin.kt b/shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/initKoin.kt new file mode 100644 index 000000000..4b050ddde --- /dev/null +++ b/shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/initKoin.kt @@ -0,0 +1,11 @@ +package org.mifos.mobile.shared.di + +import org.koin.core.context.startKoin +import org.koin.dsl.KoinAppDeclaration + +fun initKoin(config: KoinAppDeclaration? = null) { + startKoin { + config?.invoke(this) + modules(sharedModule, platformModule) + } +} \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt b/shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt new file mode 100644 index 000000000..33be09332 --- /dev/null +++ b/shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt @@ -0,0 +1,12 @@ +package org.mifos.mobile.shared + +import androidx.compose.ui.window.ComposeUIViewController +import org.mifos.mobile.shared.di.initKoin + +fun MainViewController() = ComposeUIViewController( + configure = { + initKoin() + } +) { + App() +} \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/org/mifos/mobile/shared/Platform.ios.kt b/shared/src/iosMain/kotlin/org/mifos/mobile/shared/Platform.ios.kt new file mode 100644 index 000000000..a8400cddb --- /dev/null +++ b/shared/src/iosMain/kotlin/org/mifos/mobile/shared/Platform.ios.kt @@ -0,0 +1,9 @@ +package org.mifos.mobile.shared + +import platform.UIKit.UIDevice + +class IOSPlatform: Platform { + override val name: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion +} + +actual fun getPlatform(): Platform = IOSPlatform() \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt b/shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt new file mode 100644 index 000000000..8b285c809 --- /dev/null +++ b/shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt @@ -0,0 +1,6 @@ +package org.mifos.mobile.shared.di + +import org.koin.core.module.Module + +actual val platformModule: Module + get() = TODO("Not yet implemented") \ No newline at end of file From 66391663a181842418ba4f04ccfd77771e7f96d3 Mon Sep 17 00:00:00 2001 From: Nagarjuna Date: Thu, 6 Feb 2025 16:28:54 +0530 Subject: [PATCH 06/12] feat: application modules setup --- ...ay-android.run.xml => cmp-android.run.xml} | 2 +- .run/cmp-desktop.run.xml | 24 + .run/cmp-web-js.run.xml | 24 + .run/cmp-web-wasm.run.xml | 24 + .run/mifospay-desktop.run.xml | 24 - .run/mifospay-web-js.run.xml | 24 - .run/mifospay-web-wasm.run.xml | 24 - androidApp/README.md | 3 - androidApp/debug_keystore.jks | Bin 4488 -> 0 bytes .../releaseRuntimeClasspath.tree.txt | 1679 - .../dependencies/releaseRuntimeClasspath.txt | 291 - androidApp/fabric.properties | 4 - androidApp/google-services.json | 55 - androidApp/lint-baseline.xml | 46876 ---------------- androidApp/proguard-rules.pro | 17 - androidApp/release-badging.txt | 136 - .../org/mifos/mobile/ApplicationTest.kt | 29 - androidApp/src/main/AndroidManifest.xml | 79 - androidApp/src/main/ic_launcher-playstore.png | Bin 57605 -> 0 bytes .../kotlin/org/mifos/mobile/HomeActivity.kt | 115 - .../org/mifos/mobile/HomeActivityViewModel.kt | 50 - .../org/mifos/mobile/MifosSelfServiceApp.kt | 25 - .../mifos/mobile/navigation/MifosNavHost.kt | 281 - .../mobile/navigation/PasscodeNavGraph.kt | 42 - .../mifos/mobile/navigation/RootNavGraph.kt | 52 - .../src/main/res/drawable/mifos_logo.png | Bin 60004 -> 0 bytes .../res/drawable/mifos_splash_screen_logo.png | Bin 33661 -> 0 bytes .../src/main/res/drawable/splash_icon.xml | 21 - .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 3344 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 6546 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 4884 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 2478 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 4212 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 3240 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 4618 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 9334 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 6732 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 6652 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 16078 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 10238 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 8784 -> 0 bytes .../ic_launcher_foreground.webp | Bin 24830 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 14318 -> 0 bytes androidApp/src/main/res/values-ar/strings.xml | 456 - androidApp/src/main/res/values-bn/strings.xml | 444 - androidApp/src/main/res/values-es/strings.xml | 433 - .../src/main/res/values-fa-rAF/strings.xml | 437 - androidApp/src/main/res/values-fr/strings.xml | 431 - androidApp/src/main/res/values-hi/strings.xml | 546 - androidApp/src/main/res/values-in/strings.xml | 432 - androidApp/src/main/res/values-km/strings.xml | 432 - androidApp/src/main/res/values-kn/strings.xml | 432 - androidApp/src/main/res/values-my/strings.xml | 455 - androidApp/src/main/res/values-pl/strings.xml | 433 - androidApp/src/main/res/values-pt/strings.xml | 517 - androidApp/src/main/res/values-ru/strings.xml | 433 - androidApp/src/main/res/values-sw/strings.xml | 432 - androidApp/src/main/res/values-te/strings.xml | 433 - androidApp/src/main/res/values-ur/strings.xml | 455 - androidApp/src/main/res/values/colors.xml | 83 - androidApp/src/main/res/values/strings.xml | 658 - cmp-android/.gitignore | 2 + cmp-android/README.md | 18 + {androidApp => cmp-android}/build.gradle.kts | 101 +- .../demoDebugRuntimeClasspath.txt | 15 +- .../demoReleaseRuntimeClasspath.txt | 15 +- .../prodDebugRuntimeClasspath.txt | 15 +- .../prodReleaseRuntimeClasspath.tree.txt | 1542 + .../prodReleaseRuntimeClasspath.txt | 15 +- cmp-android/google-services.json | 63 + cmp-android/lint-baseline.xml | 1510 + cmp-android/prodRelease-badging.txt | 129 + cmp-android/proguard-rules.pro | 135 + cmp-android/src/main/AndroidManifest.xml | 70 + .../src/main/ic_launcher-playstore.png | Bin 0 -> 16896 bytes .../main/kotlin/cmp/android/app/AndroidApp.kt | 34 + .../kotlin/cmp/android/app/MainActivity.kt | 48 + .../res/drawable/ic_launcher_background.xml | 31 + .../res/drawable/ic_launcher_foreground.xml | 60 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 +- .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1300 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 3080 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 928 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1994 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1694 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 4146 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2426 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 6516 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3222 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 9136 bytes .../res/values/ic_launcher_background.xml | 2 +- .../src/main/res/values/splash.xml | 11 +- .../src/main/res/values/strings.xml | 7 +- .../src/main/res/xml/provider_paths.xml | 29 + {androidApp => cmp-desktop}/.gitignore | 0 cmp-desktop/README.md | 22 + cmp-desktop/build.gradle.kts | 88 + cmp-desktop/compose-desktop.pro | 164 + cmp-desktop/icons/ic_launcher.icns | Bin 0 -> 157693 bytes cmp-desktop/icons/ic_launcher.ico | Bin 0 -> 15406 bytes cmp-desktop/icons/ic_launcher.png | Bin 0 -> 112847 bytes cmp-desktop/src/jvmMain/kotlin/main.kt | 49 + cmp-ios/Configuration/Config.xcconfig | 3 + .../iosApp.xcodeproj/project.pbxproj | 235 +- .../contents.xcworkspacedata | 0 .../UserInterfaceState.xcuserstate | Bin 0 -> 144971 bytes .../xcschemes/xcschememanagement.plist | 2 +- .../AccentColor.colorset/Contents.json | 2 +- .../AppIcon.appiconset/Contents.json | 1 + .../AppIcon.appiconset/mifospay_logo_1024.png | Bin 0 -> 36837 bytes .../iosApp/Assets.xcassets/Contents.json | 0 cmp-ios/iosApp/ContentView.swift | 21 + cmp-ios/iosApp/Info.plist | 57 + .../Preview Assets.xcassets/Contents.json | 2 +- .../iosApp/iOSApp.swift | 11 +- cmp-navigation/build.gradle.kts | 45 + .../composeResources/values/strings.xml | 12 +- .../kotlin/cmp/navigation/ComposeApp.kt | 32 + .../kotlin/cmp/navigation/di/KoinModules.kt | 51 + .../navigation/navigation/FeatureNavHost.kt | 57 + .../navigation/navigation/NavGraphRoute.kt | 4 +- .../cmp/navigation/navigation/RootNavGraph.kt | 40 + .../kotlin/cmp/navigation/ui/App.kt | 34 +- .../kotlin/cmp/navigation/ui/AppState.kt | 29 +- cmp-shared/README.md | 73 + cmp-shared/build.gradle.kts | 64 + .../commonMain/kotlin/cmp/shared/SharedApp.kt | 21 + .../kotlin/cmp/shared/utils/KoinExt.kt | 26 + .../kotlin/org/mifos/shared/ViewController.kt | 22 + cmp-web/.gitignore | 1 + cmp-web/README.md | 22 + cmp-web/build.gradle.kts | 65 + cmp-web/src/jsMain/kotlin/Application.kt | 26 + cmp-web/src/jsMain/resources/favicon.ico | Bin 0 -> 15406 bytes cmp-web/src/jsMain/resources/index.html | 43 + cmp-web/src/jsMain/resources/styles.css | 14 + cmp-web/src/wasmJsMain/kotlin/Main.kt | 49 + cmp-web/src/wasmJsMain/resources/favicon.ico | Bin 0 -> 15406 bytes cmp-web/src/wasmJsMain/resources/index.html | 46 + .../src/webpack.config.d/cleanupSourcemap.js | 31 + .../ClientChargeRepositoryImp.kt | 3 - .../mobile/core/model/Parcelize.android.kt | 3 + .../org/mifos/mobile/core/model/Parcelize.kt | 2 +- .../mobile/core/model/Parcelize.desktop.kt | 2 + .../mifos/mobile/core/model/Parcelize.js.kt | 2 + .../mobile/core/model/Parcelize.native.kt | 2 + .../mobile/core/model/Parcelize.wasmJs.kt | 2 + .../mobile/core/network/di/NetworkModule.kt | 2 +- .../mifos/mobile/core/network/di/Qualifier.kt | 1 - fastlane-config/android_config.rb | 23 + fastlane-config/ios_config.rb | 15 + .../feature/auth/login/LoginViewModel.kt | 2 +- .../RegistrationVerificationViewModel.kt | 2 +- .../registration/RegistrationViewModel.kt | 2 +- .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../UserInterfaceState.xcuserstate | Bin 33526 -> 0 bytes iosApp/iosApp/ContentView.swift | 20 - kotlin-js-store/yarn.lock | 2897 + settings.gradle.kts | 18 +- shared/README.md | 3 - shared/build.gradle.kts | 54 - .../org/mifos/mobile/shared/MainActivity.kt | 23 - .../org/mifos/mobile/shared/MyApplication.kt | 15 - .../mifos/mobile/shared/Platform.android.kt | 7 - .../mifos/mobile/shared/di/Modules.android.kt | 6 - .../kotlin/org/mifos/mobile/shared/App.kt | 29 - .../org/mifos/mobile/shared/Platform.kt | 7 - .../org/mifos/mobile/shared/di/Modules.kt | 10 - .../org/mifos/mobile/shared/di/initKoin.kt | 11 - .../mifos/mobile/shared/MainViewController.kt | 12 - .../org/mifos/mobile/shared/Platform.ios.kt | 9 - .../mifos/mobile/shared/di/Modules.native.kt | 6 - 173 files changed, 8122 insertions(+), 58247 deletions(-) rename .run/{mifospay-android.run.xml => cmp-android.run.xml} (98%) create mode 100644 .run/cmp-desktop.run.xml create mode 100644 .run/cmp-web-js.run.xml create mode 100644 .run/cmp-web-wasm.run.xml delete mode 100644 .run/mifospay-desktop.run.xml delete mode 100644 .run/mifospay-web-js.run.xml delete mode 100644 .run/mifospay-web-wasm.run.xml delete mode 100644 androidApp/README.md delete mode 100644 androidApp/debug_keystore.jks delete mode 100644 androidApp/dependencies/releaseRuntimeClasspath.tree.txt delete mode 100644 androidApp/dependencies/releaseRuntimeClasspath.txt delete mode 100644 androidApp/fabric.properties delete mode 100644 androidApp/google-services.json delete mode 100644 androidApp/lint-baseline.xml delete mode 100644 androidApp/proguard-rules.pro delete mode 100644 androidApp/release-badging.txt delete mode 100644 androidApp/src/androidTest/kotlin/org/mifos/mobile/ApplicationTest.kt delete mode 100644 androidApp/src/main/AndroidManifest.xml delete mode 100644 androidApp/src/main/ic_launcher-playstore.png delete mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/HomeActivity.kt delete mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt delete mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/MifosSelfServiceApp.kt delete mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavHost.kt delete mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/navigation/PasscodeNavGraph.kt delete mode 100644 androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt delete mode 100644 androidApp/src/main/res/drawable/mifos_logo.png delete mode 100644 androidApp/src/main/res/drawable/mifos_splash_screen_logo.png delete mode 100644 androidApp/src/main/res/drawable/splash_icon.xml delete mode 100644 androidApp/src/main/res/mipmap-hdpi/ic_launcher.webp delete mode 100644 androidApp/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp delete mode 100644 androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100644 androidApp/src/main/res/mipmap-mdpi/ic_launcher.webp delete mode 100644 androidApp/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp delete mode 100644 androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100644 androidApp/src/main/res/mipmap-xhdpi/ic_launcher.webp delete mode 100644 androidApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp delete mode 100644 androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100644 androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.webp delete mode 100644 androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp delete mode 100644 androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100644 androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp delete mode 100644 androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp delete mode 100644 androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp delete mode 100644 androidApp/src/main/res/values-ar/strings.xml delete mode 100644 androidApp/src/main/res/values-bn/strings.xml delete mode 100644 androidApp/src/main/res/values-es/strings.xml delete mode 100644 androidApp/src/main/res/values-fa-rAF/strings.xml delete mode 100644 androidApp/src/main/res/values-fr/strings.xml delete mode 100644 androidApp/src/main/res/values-hi/strings.xml delete mode 100644 androidApp/src/main/res/values-in/strings.xml delete mode 100644 androidApp/src/main/res/values-km/strings.xml delete mode 100644 androidApp/src/main/res/values-kn/strings.xml delete mode 100644 androidApp/src/main/res/values-my/strings.xml delete mode 100644 androidApp/src/main/res/values-pl/strings.xml delete mode 100644 androidApp/src/main/res/values-pt/strings.xml delete mode 100644 androidApp/src/main/res/values-ru/strings.xml delete mode 100644 androidApp/src/main/res/values-sw/strings.xml delete mode 100644 androidApp/src/main/res/values-te/strings.xml delete mode 100644 androidApp/src/main/res/values-ur/strings.xml delete mode 100644 androidApp/src/main/res/values/colors.xml delete mode 100644 androidApp/src/main/res/values/strings.xml create mode 100644 cmp-android/.gitignore create mode 100644 cmp-android/README.md rename {androidApp => cmp-android}/build.gradle.kts (67%) rename {androidApp => cmp-android}/dependencies/demoDebugRuntimeClasspath.txt (97%) rename {androidApp => cmp-android}/dependencies/demoReleaseRuntimeClasspath.txt (97%) rename {androidApp => cmp-android}/dependencies/prodDebugRuntimeClasspath.txt (97%) create mode 100644 cmp-android/dependencies/prodReleaseRuntimeClasspath.tree.txt rename {androidApp => cmp-android}/dependencies/prodReleaseRuntimeClasspath.txt (97%) create mode 100644 cmp-android/google-services.json create mode 100644 cmp-android/lint-baseline.xml create mode 100644 cmp-android/prodRelease-badging.txt create mode 100644 cmp-android/proguard-rules.pro create mode 100644 cmp-android/src/main/AndroidManifest.xml create mode 100644 cmp-android/src/main/ic_launcher-playstore.png create mode 100644 cmp-android/src/main/kotlin/cmp/android/app/AndroidApp.kt create mode 100644 cmp-android/src/main/kotlin/cmp/android/app/MainActivity.kt create mode 100644 cmp-android/src/main/res/drawable/ic_launcher_background.xml create mode 100644 cmp-android/src/main/res/drawable/ic_launcher_foreground.xml rename {androidApp => cmp-android}/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (70%) rename {androidApp => cmp-android}/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (70%) create mode 100644 cmp-android/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 cmp-android/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 cmp-android/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 cmp-android/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 cmp-android/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 cmp-android/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 cmp-android/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 cmp-android/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 cmp-android/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 cmp-android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp rename {androidApp => cmp-android}/src/main/res/values/ic_launcher_background.xml (87%) rename {androidApp => cmp-android}/src/main/res/values/splash.xml (66%) rename androidApp/src/release/res/values/api_keys.xml => cmp-android/src/main/res/values/strings.xml (64%) create mode 100644 cmp-android/src/main/res/xml/provider_paths.xml rename {androidApp => cmp-desktop}/.gitignore (100%) create mode 100644 cmp-desktop/README.md create mode 100644 cmp-desktop/build.gradle.kts create mode 100644 cmp-desktop/compose-desktop.pro create mode 100644 cmp-desktop/icons/ic_launcher.icns create mode 100644 cmp-desktop/icons/ic_launcher.ico create mode 100644 cmp-desktop/icons/ic_launcher.png create mode 100644 cmp-desktop/src/jvmMain/kotlin/main.kt create mode 100644 cmp-ios/Configuration/Config.xcconfig rename {iosApp => cmp-ios}/iosApp.xcodeproj/project.pbxproj (55%) rename {iosApp => cmp-ios}/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) create mode 100644 cmp-ios/iosApp.xcodeproj/project.xcworkspace/xcuserdata/kapilmaurya.xcuserdatad/UserInterfaceState.xcuserstate rename {iosApp/iosApp.xcodeproj/xcuserdata/apple.xcuserdatad => cmp-ios/iosApp.xcodeproj/xcuserdata/kapilmaurya.xcuserdatad}/xcschemes/xcschememanagement.plist (87%) rename {iosApp => cmp-ios}/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json (98%) rename {iosApp => cmp-ios}/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json (79%) create mode 100644 cmp-ios/iosApp/Assets.xcassets/AppIcon.appiconset/mifospay_logo_1024.png rename {iosApp => cmp-ios}/iosApp/Assets.xcassets/Contents.json (100%) create mode 100644 cmp-ios/iosApp/ContentView.swift create mode 100644 cmp-ios/iosApp/Info.plist rename {iosApp => cmp-ios}/iosApp/Preview Content/Preview Assets.xcassets/Contents.json (96%) rename iosApp/iosApp/iosAppApp.swift => cmp-ios/iosApp/iOSApp.swift (52%) create mode 100644 cmp-navigation/build.gradle.kts rename androidApp/src/main/res/xml/fileproviderpath.xml => cmp-navigation/src/commonMain/composeResources/values/strings.xml (56%) create mode 100644 cmp-navigation/src/commonMain/kotlin/cmp/navigation/ComposeApp.kt create mode 100644 cmp-navigation/src/commonMain/kotlin/cmp/navigation/di/KoinModules.kt create mode 100644 cmp-navigation/src/commonMain/kotlin/cmp/navigation/navigation/FeatureNavHost.kt rename androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavGraph.kt => cmp-navigation/src/commonMain/kotlin/cmp/navigation/navigation/NavGraphRoute.kt (87%) create mode 100644 cmp-navigation/src/commonMain/kotlin/cmp/navigation/navigation/RootNavGraph.kt rename androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosApp.kt => cmp-navigation/src/commonMain/kotlin/cmp/navigation/ui/App.kt (77%) rename androidApp/src/main/kotlin/org/mifos/mobile/ui/MifosMobileState.kt => cmp-navigation/src/commonMain/kotlin/cmp/navigation/ui/AppState.kt (65%) create mode 100644 cmp-shared/README.md create mode 100644 cmp-shared/build.gradle.kts create mode 100644 cmp-shared/src/commonMain/kotlin/cmp/shared/SharedApp.kt create mode 100644 cmp-shared/src/commonMain/kotlin/cmp/shared/utils/KoinExt.kt create mode 100644 cmp-shared/src/nativeMain/kotlin/org/mifos/shared/ViewController.kt create mode 100644 cmp-web/.gitignore create mode 100644 cmp-web/README.md create mode 100644 cmp-web/build.gradle.kts create mode 100644 cmp-web/src/jsMain/kotlin/Application.kt create mode 100644 cmp-web/src/jsMain/resources/favicon.ico create mode 100644 cmp-web/src/jsMain/resources/index.html create mode 100644 cmp-web/src/jsMain/resources/styles.css create mode 100644 cmp-web/src/wasmJsMain/kotlin/Main.kt create mode 100644 cmp-web/src/wasmJsMain/resources/favicon.ico create mode 100644 cmp-web/src/wasmJsMain/resources/index.html create mode 100644 cmp-web/src/webpack.config.d/cleanupSourcemap.js create mode 100644 fastlane-config/android_config.rb create mode 100644 fastlane-config/ios_config.rb delete mode 100644 iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 iosApp/iosApp/ContentView.swift create mode 100644 kotlin-js-store/yarn.lock delete mode 100644 shared/README.md delete mode 100644 shared/build.gradle.kts delete mode 100644 shared/src/androidMain/kotlin/org/mifos/mobile/shared/MainActivity.kt delete mode 100644 shared/src/androidMain/kotlin/org/mifos/mobile/shared/MyApplication.kt delete mode 100644 shared/src/androidMain/kotlin/org/mifos/mobile/shared/Platform.android.kt delete mode 100644 shared/src/androidMain/kotlin/org/mifos/mobile/shared/di/Modules.android.kt delete mode 100644 shared/src/commonMain/kotlin/org/mifos/mobile/shared/App.kt delete mode 100644 shared/src/commonMain/kotlin/org/mifos/mobile/shared/Platform.kt delete mode 100644 shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/Modules.kt delete mode 100644 shared/src/commonMain/kotlin/org/mifos/mobile/shared/di/initKoin.kt delete mode 100644 shared/src/iosMain/kotlin/org/mifos/mobile/shared/MainViewController.kt delete mode 100644 shared/src/iosMain/kotlin/org/mifos/mobile/shared/Platform.ios.kt delete mode 100644 shared/src/iosMain/kotlin/org/mifos/mobile/shared/di/Modules.native.kt diff --git a/.run/mifospay-android.run.xml b/.run/cmp-android.run.xml similarity index 98% rename from .run/mifospay-android.run.xml rename to .run/cmp-android.run.xml index 186e06fe7..0ea27e950 100644 --- a/.run/mifospay-android.run.xml +++ b/.run/cmp-android.run.xml @@ -1,6 +1,6 @@ - + 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 diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivity.kt b/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivity.kt deleted file mode 100644 index 66d7682cb..000000000 --- a/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivity.kt +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge -import androidx.activity.viewModels -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.setValue -import androidx.compose.ui.graphics.toArgb -import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.lifecycleScope -import androidx.lifecycle.repeatOnLifecycle -import androidx.navigation.compose.rememberNavController -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.flow.collect -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch -import org.mifos.mobile.HomeActivityUiState.Success -import org.mifos.mobile.core.data.utils.NetworkMonitor -import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme -import org.mifos.mobile.core.designsystem.theme.darkScrim -import org.mifos.mobile.core.designsystem.theme.lightScrim -import org.mifos.mobile.navigation.MifosNavGraph.AUTH_GRAPH -import org.mifos.mobile.navigation.MifosNavGraph.PASSCODE_GRAPH -import org.mifos.mobile.navigation.RootNavGraph -import org.mifos.mobile.ui.rememberMifosMobileState -import javax.inject.Inject - -@AndroidEntryPoint -class HomeActivity : ComponentActivity() { - - @Inject - lateinit var networkMonitor: NetworkMonitor - - private val viewModel: HomeActivityViewModel by viewModels() - - override fun onCreate(savedInstanceState: Bundle?) { - val splashScreen = installSplashScreen() - super.onCreate(savedInstanceState) - var uiState: HomeActivityUiState by mutableStateOf(HomeActivityUiState.Loading) - - // Update the uiState - lifecycleScope.launch { - lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { - viewModel.uiState - .onEach { uiState = it } - .collect() - } - } - - splashScreen.setKeepOnScreenCondition { - when (uiState) { - HomeActivityUiState.Loading -> true - is Success -> false - } - } - - enableEdgeToEdge() - - setContent { - val navController = rememberNavController() - - val appState = rememberMifosMobileState(networkMonitor = networkMonitor) - val darkTheme = isSystemInDarkTheme() - val navDestination = when (uiState) { - is Success -> if ((uiState as Success).userData.isAuthenticated) { - PASSCODE_GRAPH - } else { - AUTH_GRAPH - } - - else -> AUTH_GRAPH - } - - DisposableEffect(darkTheme) { - window?.statusBarColor = if (darkTheme) darkScrim.toArgb() else lightScrim.toArgb() - window?.navigationBarColor = if (darkTheme) darkScrim.toArgb() else lightScrim.toArgb() - onDispose {} - } - - CompositionLocalProvider { - MifosMobileTheme { - RootNavGraph( - appState = appState, - navHostController = navController, - startDestination = navDestination, - onClickLogout = { - viewModel.logOut() - navController.navigate(AUTH_GRAPH) { - popUpTo(navController.graph.id) { - inclusive = true - } - } - }, - ) - } - } - } - } -} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt b/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt deleted file mode 100644 index fdfc7e533..000000000 --- a/androidApp/src/main/kotlin/org/mifos/mobile/HomeActivityViewModel.kt +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch -import org.mifos.library.passcode.data.PasscodeManager -import org.mifos.mobile.core.data.repository.UserDataRepository -import org.mifos.mobile.core.model.UserData -import javax.inject.Inject - -@HiltViewModel -class HomeActivityViewModel @Inject constructor( - private val userDataRepository: UserDataRepository, - private val passcodeManager: PasscodeManager, -) : ViewModel() { - - val uiState: StateFlow = userDataRepository.userData.map { - HomeActivityUiState.Success(it) - }.stateIn( - scope = viewModelScope, - initialValue = HomeActivityUiState.Loading, - started = SharingStarted.WhileSubscribed(5_000), - ) - - fun logOut() { - viewModelScope.launch { - userDataRepository.logOut() - passcodeManager.clearPasscode() - } - } -} - -sealed interface HomeActivityUiState { - data object Loading : HomeActivityUiState - data class Success(val userData: UserData) : HomeActivityUiState -} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/MifosSelfServiceApp.kt b/androidApp/src/main/kotlin/org/mifos/mobile/MifosSelfServiceApp.kt deleted file mode 100644 index 2d961f23f..000000000 --- a/androidApp/src/main/kotlin/org/mifos/mobile/MifosSelfServiceApp.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile - -import androidx.multidex.MultiDex -import androidx.multidex.MultiDexApplication -import dagger.hilt.android.HiltAndroidApp -import org.mifos.mobile.core.datastore.PreferencesHelper -import org.mifos.mobile.feature.settings.applySavedTheme - -@HiltAndroidApp -class MifosSelfServiceApp : MultiDexApplication() { - override fun onCreate() { - super.onCreate() - MultiDex.install(this) - PreferencesHelper(this).applySavedTheme() - } -} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavHost.kt b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavHost.kt deleted file mode 100644 index e161cd448..000000000 --- a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/MifosNavHost.kt +++ /dev/null @@ -1,281 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.navigation - -import android.app.Activity -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.provider.Settings -import android.widget.Toast -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import androidx.navigation.NavHostController -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.rememberNavController -import com.google.android.gms.oss.licenses.OssLicensesMenuActivity -import org.mifos.mobile.HomeActivity -import org.mifos.mobile.R -import org.mifos.mobile.core.common.Constants.TRANSFER_PAY_TO -import org.mifos.mobile.core.model.enums.AccountType -import org.mifos.mobile.core.model.enums.ChargeType -import org.mifos.mobile.feature.about.navigation.aboutUsNavGraph -import org.mifos.mobile.feature.about.navigation.navigateToAboutUsScreen -import org.mifos.mobile.feature.account.navigation.clientAccountsNavGraph -import org.mifos.mobile.feature.account.navigation.navigateToClientAccountsScreen -import org.mifos.mobile.feature.auth.navigation.navigateToLoginScreen -import org.mifos.mobile.feature.beneficiary.navigation.beneficiaryNavGraph -import org.mifos.mobile.feature.beneficiary.navigation.navigateToAddBeneficiaryScreen -import org.mifos.mobile.feature.beneficiary.navigation.navigateToBeneficiaryApplicationScreen -import org.mifos.mobile.feature.beneficiary.navigation.navigateToBeneficiaryListScreen -import org.mifos.mobile.feature.charge.navigation.clientChargeNavGraph -import org.mifos.mobile.feature.charge.navigation.navigateToClientChargeScreen -import org.mifos.mobile.feature.guarantor.navigation.guarantorNavGraph -import org.mifos.mobile.feature.guarantor.navigation.navigateToGuarantorScreen -import org.mifos.mobile.feature.help.navigation.helpNavGraph -import org.mifos.mobile.feature.help.navigation.navigateToHelpScreen -import org.mifos.mobile.feature.home.navigation.HomeDestinations -import org.mifos.mobile.feature.home.navigation.HomeNavigation -import org.mifos.mobile.feature.home.navigation.homeNavGraph -import org.mifos.mobile.feature.loan.navigation.loanNavGraph -import org.mifos.mobile.feature.loan.navigation.navigateToLoanApplication -import org.mifos.mobile.feature.loan.navigation.navigateToLoanDetailScreen -import org.mifos.mobile.feature.location.navigation.locationsNavGraph -import org.mifos.mobile.feature.location.navigation.navigateToLocationsScreen -import org.mifos.mobile.feature.notification.navigation.navigateToNotificationScreen -import org.mifos.mobile.feature.notification.navigation.notificationNavGraph -import org.mifos.mobile.feature.qr.navigation.navigateToQrDisplayScreen -import org.mifos.mobile.feature.qr.navigation.navigateToQrImportScreen -import org.mifos.mobile.feature.qr.navigation.navigateToQrReaderScreen -import org.mifos.mobile.feature.qr.navigation.qrNavGraph -import org.mifos.mobile.feature.savings.navigation.navigateToSavingsApplicationScreen -import org.mifos.mobile.feature.savings.navigation.navigateToSavingsDetailScreen -import org.mifos.mobile.feature.savings.navigation.navigateToSavingsMakeTransfer -import org.mifos.mobile.feature.savings.navigation.savingsNavGraph -import org.mifos.mobile.feature.settings.navigation.navigateToSettings -import org.mifos.mobile.feature.settings.navigation.settingsNavGraph -import org.mifos.mobile.feature.third.party.transfer.navigation.navigateToThirdPartyTransfer -import org.mifos.mobile.feature.third.party.transfer.navigation.thirdPartyTransferNavGraph -import org.mifos.mobile.feature.transaction.navigation.navigateToRecentTransaction -import org.mifos.mobile.feature.transaction.navigation.recentTransactionNavGraph -import org.mifos.mobile.feature.transfer.process.navigation.navigateToTransferProcessScreen -import org.mifos.mobile.feature.transfer.process.navigation.transferProcessNavGraph -import org.mifos.mobile.feature.update.password.navigation.navigateToUpdatePassword -import org.mifos.mobile.feature.update.password.navigation.updatePasswordNavGraph -import org.mifos.mobile.feature.user.profile.navigation.navigateToUserProfile -import org.mifos.mobile.feature.user.profile.navigation.userProfileNavGraph - -@Composable -fun MifosNavHost( - onClickLogout: () -> Unit, - modifier: Modifier = Modifier, -) { - val context = LocalContext.current - val navController = rememberNavController() - - NavHost( - navController = navController, - route = MifosNavGraph.MAIN_GRAPH, - startDestination = HomeNavigation.HomeBase.route, - modifier = modifier, - ) { - homeNavGraph( - onNavigate = { handleHomeNavigation(navController, it, onClickLogout, context) }, - callHelpline = { callHelpline(context) }, - mailHelpline = { mailHelpline(context) }, - ) - - guarantorNavGraph(navController = navController) - - loanNavGraph( - navController = navController, - viewQr = navController::navigateToQrDisplayScreen, - viewGuarantor = navController::navigateToGuarantorScreen, - viewCharges = navController::navigateToClientChargeScreen, - makePayment = navController::navigateToSavingsMakeTransfer, - ) - - userProfileNavGraph( - navigateBack = navController::popBackStack, - navigateToChangePassword = navController::navigateToUpdatePassword, - ) - - updatePasswordNavGraph(navigateBack = navController::popBackStack) - - thirdPartyTransferNavGraph( - navigateBack = navController::popBackStack, - addBeneficiary = navController::navigateToAddBeneficiaryScreen, - reviewTransfer = navController::navigateToTransferProcessScreen, - ) - - settingsNavGraph( - navigateBack = navController::popBackStack, - changePassword = navController::navigateToUpdatePassword, - changePasscode = {}, - navigateToLoginScreen = navController::navigateToLoginScreen, - languageChanged = { startActivity(context, HomeActivity::class.java) }, - ) - - recentTransactionNavGraph(navigateBack = navController::popBackStack) - - notificationNavGraph(navigateBack = navController::popBackStack) - - locationsNavGraph() - - helpNavGraph( - findLocations = navController::navigateToLocationsScreen, - navigateBack = navController::popBackStack, - callHelpline = { callHelpline(context) }, - mailHelpline = { mailHelpline(context) }, - ) - - clientChargeNavGraph(navigateBack = navController::popBackStack) - - aboutUsNavGraph( - navController = navController, - navigateToOssLicense = { - context.startActivity(Intent(context, OssLicensesMenuActivity::class.java)) - }, - ) - - transferProcessNavGraph(navigateBack = navController::popBackStack) - - beneficiaryNavGraph( - navController = navController, - openQrImportScreen = navController::navigateToQrImportScreen, - openQrReaderScreen = navController::navigateToQrReaderScreen, - ) - - qrNavGraph( - navController = navController, - openBeneficiaryApplication = navController::navigateToBeneficiaryApplicationScreen, - ) - - savingsNavGraph( - navController = navController, - viewCharges = navController::navigateToClientChargeScreen, - viewQrCode = navController::navigateToQrDisplayScreen, - callHelpline = { callHelpline(context) }, - reviewTransfer = navController::navigateToTransferProcessScreen, - ) - - clientAccountsNavGraph( - navController = navController, - navigateToLoanApplicationScreen = navController::navigateToLoanApplication, - navigateToSavingsApplicationScreen = navController::navigateToSavingsApplicationScreen, - navigateToAccountDetail = { accountType, id -> - when (accountType) { - AccountType.SAVINGS -> navController.navigateToSavingsDetailScreen(savingsId = id) - AccountType.LOAN -> navController.navigateToLoanDetailScreen(loanId = id) - AccountType.SHARE -> {} - } - }, - ) - } -} - -fun handleHomeNavigation( - navController: NavHostController, - homeDestinations: HomeDestinations, - onClickLogout: () -> Unit, - context: Context, -) { - when (homeDestinations) { - HomeDestinations.HOME -> Unit - HomeDestinations.ACCOUNTS -> navController.navigateToClientAccountsScreen() - HomeDestinations.LOAN_ACCOUNT -> { - navController.navigateToClientAccountsScreen(accountType = AccountType.LOAN) - } - - HomeDestinations.SAVINGS_ACCOUNT -> { - navController.navigateToClientAccountsScreen(accountType = AccountType.SAVINGS) - } - - HomeDestinations.RECENT_TRANSACTIONS -> navController.navigateToRecentTransaction() - HomeDestinations.CHARGES -> navController.navigateToClientChargeScreen(ChargeType.CLIENT) - HomeDestinations.THIRD_PARTY_TRANSFER -> navController.navigateToThirdPartyTransfer() - HomeDestinations.SETTINGS -> navController.navigateToSettings() - HomeDestinations.ABOUT_US -> navController.navigateToAboutUsScreen() - HomeDestinations.HELP -> navController.navigateToHelpScreen() - HomeDestinations.SHARE -> { - shareApp(context) - } - - HomeDestinations.APP_INFO -> { - openAppInfo(context) - } - - HomeDestinations.LOGOUT -> onClickLogout.invoke() - HomeDestinations.TRANSFER -> navController.navigateToSavingsMakeTransfer( - accountId = 1, - transferType = TRANSFER_PAY_TO, - ) - - HomeDestinations.BENEFICIARIES -> navController.navigateToBeneficiaryListScreen() - HomeDestinations.SURVEY -> Unit - HomeDestinations.NOTIFICATIONS -> navController.navigateToNotificationScreen() - HomeDestinations.PROFILE -> navController.navigateToUserProfile() - } -} - -fun startActivity(context: Context, clazz: Class) { - context.startActivity(Intent(context, clazz)) -} - -private fun callHelpline(context: Context) { - val intent = Intent(Intent.ACTION_DIAL) - intent.data = - Uri.parse("tel:" + context.getString(org.mifos.mobile.feature.home.R.string.help_line_number)) - context.startActivity(intent) -} - -private fun mailHelpline(context: Context) { - val intent = Intent(Intent.ACTION_SENDTO).apply { - data = Uri.parse("mailto:") - putExtra( - Intent.EXTRA_EMAIL, - arrayOf(context.getString(org.mifos.mobile.feature.home.R.string.contact_email)), - ) - putExtra( - Intent.EXTRA_SUBJECT, - context.getString(org.mifos.mobile.feature.home.R.string.user_query), - ) - } - try { - context.startActivity(intent) - } catch (e: Exception) { - Toast.makeText( - context, - context.getString(org.mifos.mobile.feature.home.R.string.no_app_to_support_action), - Toast.LENGTH_SHORT, - ).show() - } -} - -private fun openAppInfo(context: Context) { - val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { - data = Uri.parse("package:${context.packageName}") - } - context.startActivity(intent) -} - -private fun shareApp(context: Context) { - val shareText = context.getString( - R.string.playstore_link, - context.getString(R.string.share_msg), - context.packageName, - ) - val intent = Intent(Intent.ACTION_SEND).apply { - type = "text/plain" - putExtra(Intent.EXTRA_TEXT, shareText) - } - context.startActivity(Intent.createChooser(intent, context.getString(R.string.choose))) -} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/PasscodeNavGraph.kt b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/PasscodeNavGraph.kt deleted file mode 100644 index b9be8e693..000000000 --- a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/PasscodeNavGraph.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.navigation - -import androidx.navigation.NavGraphBuilder -import androidx.navigation.NavHostController -import androidx.navigation.navigation -import org.mifos.library.passcode.PASSCODE_SCREEN -import org.mifos.library.passcode.passcodeRoute - -internal fun NavGraphBuilder.passcodeNavGraph(navController: NavHostController) { - navigation( - route = MifosNavGraph.PASSCODE_GRAPH, - startDestination = PASSCODE_SCREEN, - ) { - passcodeRoute( - onForgotButton = { - navController.popBackStack() - navController.navigate(MifosNavGraph.MAIN_GRAPH) - }, - onSkipButton = { - navController.popBackStack() - navController.navigate(MifosNavGraph.MAIN_GRAPH) - }, - onPasscodeConfirm = { - navController.popBackStack() - navController.navigate(MifosNavGraph.MAIN_GRAPH) - }, - onPasscodeRejected = { - navController.popBackStack() - navController.navigate(MifosNavGraph.MAIN_GRAPH) - }, - ) - } -} diff --git a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt b/androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt deleted file mode 100644 index cc8d007da..000000000 --- a/androidApp/src/main/kotlin/org/mifos/mobile/navigation/RootNavGraph.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2024 Mifos Initiative - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md - */ -package org.mifos.mobile.navigation - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.navigation.NavHostController -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import org.mifos.library.passcode.navigateToPasscodeScreen -import org.mifos.mobile.feature.auth.navigation.authenticationNavGraph -import org.mifos.mobile.navigation.MifosNavGraph.AUTH_GRAPH -import org.mifos.mobile.ui.MifosApp -import org.mifos.mobile.ui.MifosMobileState - -@Composable -internal fun RootNavGraph( - appState: MifosMobileState, - navHostController: NavHostController, - startDestination: String, - onClickLogout: () -> Unit, - modifier: Modifier = Modifier, -) { - NavHost( - navController = navHostController, - startDestination = startDestination, - route = MifosNavGraph.ROOT_GRAPH, - modifier = modifier, - ) { - authenticationNavGraph( - navController = navHostController, - route = AUTH_GRAPH, - navigateToPasscodeScreen = navHostController::navigateToPasscodeScreen, - ) - - passcodeNavGraph(navHostController) - - composable(MifosNavGraph.MAIN_GRAPH) { - MifosApp( - appState = appState, - onClickLogout = onClickLogout, - ) - } - } -} diff --git a/androidApp/src/main/res/drawable/mifos_logo.png b/androidApp/src/main/res/drawable/mifos_logo.png deleted file mode 100644 index 39bef3caf150b0a43215c933e3798a3d1fa6d60e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60004 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

^E8+GaYYC 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 - - - - - - - - \ No newline at end of file diff --git a/androidApp/src/main/res/mipmap-hdpi/ic_launcher.webp b/androidApp/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index 2ab722b856b0a6a5e66308be076568ee565aac75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3344 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 E06qwY@Bjb+ diff --git a/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index 67e766a4ee59e4a537a1ef3a7ee902dc94b0a02f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4884 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 TK&-|7>IMDBQvv?;j2IV4&6 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 K?R*ZZGZ_FBcl|^F diff --git a/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.webp deleted file mode 100644 index 2a6d454d9fdafed3a96762eebe6bc33e004b9c57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3240 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 a>UgdF#+V;iJtiM z_E90|9Bd~JTII~JqyOI`*~(eaMHfI$>Q3Ymjmvd+cfa@eIb+>3bNuwUyU+BvySG$N z_gs13x2oUj-UChsiy-nnxI=hWK6_iVFg6@ECAPCKxDDA0@v_LgzdoHCB9prAOK(?Ny>+J@4DA&tv2o=5`9>3!TC_=iakr`kT93C82;w>6)!lu7uja9R*d!Ur9AoKz($spZI%?Tp2a> zZpT0kbc%=yc_kE0l7ed^3OX}wS3pJFv2x%>vh6DBD2WD}WL^OHSg<;ZwY1iA;ncS6 zs+x}u98iIU?BuC@a;Pvsn|}@qj1Wo3qy&% zk3$me{mLl7Bi8pq&(n>kq^72;)|G*1GbH-I`s%C8vCo~+SldC4j_q&#f72IaZ{NAy z?OhM^dr1JBtZ2sHodW({Jm+l_s`mPBdp>R4;{R(mO7ijNom<@AD!j1K1wQ-gS6@Eq zdAjjHFy2q&P-~$Ul!9EqF(gpIg4pB)Uu!G+BBCRz=65sz)B`}If;dUZWFm1~@2rW2 z1OT8ud= zJ?^odM4gk{Xc4u(MgP||nTS%?-D%%+YIv~~*w;S9Auf*n(3-Pa_x2KlV9}NOJE^|q z`bRvwk^pJ|0HB^ka)u{L8ZZm*HR6(~uYd zkgs0!{rC$Jr4~o-kL!gf}gETOk!O1{7wro)s%ZDu&^VxlgS55&KCbc{=2frEbTKrh!VO7(|b-vf3XmT-GlMEohFbi_wocKP;2WMr6j z{*DgP$`U2|4v3UEA*iJ@)oBH@*=)hi3T)_T00ybPxz~&N9W4g;pnc=W@eKLr7pSX+ zQ`2274iHpr0K9qu_@scS&OWjR!9}|DTo@5u-$WTDd=~~K5SPBK;&Zn=X! zYM2LvvNcC1zn3jH#fan=cgwdVP(QKEN_9Q|tK*nEi2TmXK(maYweH%|bc z$Dh3h#S&&Wa%RwsMq^i6RJ2=9LtwDI6`UXPbF||Y>hDu_ePM6Jl$yk(jHQm#-;6v| zQZOUK6x`ceu|mMQJhq>XTlG^1n0EDG>ISAi#3cyh3Dl# zbY=qZG%|_u=yYMkVkC3_6jXV|0l1SU=I3yTOHEQ?AAnG~V_DE1W+voN_7E#hhMB`;$JNR<901S~sTnkw z-j)p$k9Iu^k;-`c)T|P5KB(P1DVdzPJYYFD0<-C29%|;&*6nA&FG;=Mevg+)nz?Hv z(iue`!ZJ#7O~8>!I+mJRUctauLej?aoaz5vCz!jj6?=Tw+}@!D{>q^P4O2B z6H98CxlMUmiI@*N?J<~_xtob-21eI+MSgD}8DfV@4uT}J7K=Fpnh@pgT@U)V^v-z8 zk_$dkLwHxiUXY}PB|9Uytp!LyW8XjY?gyhr0IR%vff?1M`g58@S|k6S4~sF58mw0L)qNp zc7W90Kl+Ehd3+5j9tr@KbSX2Bg_dxs&_Et|yP~+mM4~v-0prdTu$;mcF}04Koh`kn zV8XI*MW#_!vS8;-ERB;COyma!AgUv9sS}BXY$3nGCY4qznsWg_OSECsVEuBU)2^(> zF@ThB*k;ug69mDUm$8T|q+remWS@x|s65k#lV�u8)zU42T96c>ny1p81?ODRv~{ z9sbOg>?{E{pc=L_(>dssvk<%)99WlIYw_mp8rp$$EMJ`b&4(H&)gO!Q}@b1`9QT10;PaHjyMj zpvsz;HG{g0q-;{TWdZKiWcD9qi)a7ODQrpd%!pJC2okpO`SUl)=U?<`Zt4@H7g#wqxFOc}ExN^U{)yIs`oq7OOhvUKw#;jsA25M|H5Q8O+_adG*(8=wsYcM|GZWTHdwteAwrR6Reqn-ka$yJPpGgjw9GR3 z15pZEVli#;nPe<{8haKZlSlLmRNF+@jSScUZTJ~{%x#ML402)L6Nj6oG&+BKMBQ%l zTD)JytjE*lQv_i41m&Iq5C+H1tSKSzv9LX4dAz4Y>}GZsA(4f4D5H64@AYd&&fSOO z!NEfH<5^FlVq1P4ffuKcTLYrll6wB};b3xU$IQuW)v50D*fdSy9Fb`~E!GZuiX z>hUdziZ;b2CivW$Y>LUqiU?`u+#y{v*KdTD@~-yQkN;V1~(-OybXB zTu4KUG$e%ceK&0?F|)Q5KdX9t4dTJ$MN7#R&mI8)*UGyW05TcE@M3#G3Z>pT3;it) zJMOAAv80jAO%8ugAZpII5}U_F`x%uUSu0GwC4GU1{Q7(GY4&l z7ZY1)Hv@ zOr*I?F`q#+5EHDm(35%+wDb6B8z%1T{3c*!_{%@1SC%0rX3~~=Hvkx}sB;#=U#FH= z(moJ1F+j|&aKctXVVwEo3Qg5gb7gbAuT+ zDxjfv{aTa>OUo(f+$2Gia1y9`;Jv-dCcEJrBrZo>hWxh3c63c(N=Rg8T`7UG0h1k9 zYwz=mKUX-C3An4naHV6ujFMc8M{krwUyI*SmaMYzQz%4rZ6)JjgMT{5pNRy-1<>Y6KS$vQLPhDj{`Ez9#T$ z#htoDT@o(j%GYf71lmj{gTcgq+}J)4h`_tAy=@U!h)>PvBr=r21k~~50$|pYPz)qY zEw758lSa4m1u!^)_@to+DiT%hoq(e#9^DXTP?f3PGhwCEb6K4&MWYi{^IHn!jT+`% ze&E2C78=C>4(0c{Q9~tLUNSoJ?cx;=R&a3$ePKHMjwgzYj)+T5N-E4ttuD)GZ_4g( z%OCD5yf{)kJyUjlq5SSz<^7GS*{zzzy{A3xIhC_p<+oQ#CTH?4k5YbfDW8NxsTRj{ zjk@zS-LT|lrB0==SG00Ae7K*rm7lE*M>~#*jYhVA^A<`90;xjrIE7u-)6LJ(F$Vke z=2q&WlM|}8uVDz}K2%%*d>w!GkyR*86tnxRSvZH?O!)I^sJ|br;c=O1)!P>%$G&A2 z0Doyr$05}n>e%r;!`h2A9E2&lFprtW9B=?IFg`njlApcZzMB&|KRzm)9ZIPF%Z6QGfkB`~ps*1<-XsgiZV|x0%>!6O z8-vWXk+EcLphK+*I@IFPhWo0uNsL%q07SD55+L~eNwo7 z%oVP86fPeN1#3?rE|)6`*N=C_pdR{tekkq@*RLNxKRaOna|VIvoZz0*YQTt60QhOs AS^xk5 diff --git a/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp deleted file mode 100644 index 9f4fb0fd0f01a9ea87d8c35f6ba5edc1e736ffa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9334 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 diff --git a/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index 91d6f36d597cc0fdbc2e904b09f709ebea26cc00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6732 zcmV-S8nfk6Nk&FQ8UO%SMM6+kP&iCC8UO$I8b%vs#s-Q9I&&$DOd zoRKT>uK>0QBqb$ucWA*IxEUT3^V|wt}OiH{xpk=sAwDFCo zgJ?TIwhZiqXt)mr5EJP}#M**RbVDA?G@<|^ig3&JA@k5>HpMM+h}=$iZwbVdpc~`T z#o#WnhE%~r0k;4wvTGT+!}dV~618nR-00~^_8?Yaol$M3sqIerPi@<_xsEoItt4vO zcDT_~H=WwH+f?9?xDqioH6hZRMZ3YumQ%O_s8-Z95z3YLgVHrtUatM{C=* zZSS7(%(iXYwhza)ZF?sFpO=9fDQ;##kc0I81-sd{ExV=cnSqRhh=`cfT^b-GcXwYd z+uhyWZMnO<`&#Vf?(V;g{qOU>-}kNxc7&63zI@l36tU$5lshk(15NO4~g9y(9lcRDeh2#J6%kMrA`AB1OOl#NqO^n_ik)6 zs%<8<-Hxr=wi`+i0I-atl*8SzjSlN}I;+mAm^YqnV{O~!*|ragwQb9kG=kII7C>^h z$U+<%RF*)UL-fun7^-V_?eoq1T@c(zQY1OMZ*X}VX72|O_z)i9r@*y-!jv?uc zGjLD@Y@AW!^kH_AK0tzSU~pj9!9f|&9Irm=F4s9yt?s^c-n4tmVcI1FF|iSf8JpdH zoA7kgku687>*sk=2?x&6GQiWvB!2@yBl?`Gwr)=sOnBzk?&GisN~IaV-X4c09AY~Q z1zgAWG8dIr-RL8Bh5}#*kzr!hVA><+nf9(f#e^)k6ZO_&*rXQ2mOlC9zytY0(z?d> zY1=>EQNjB^Dg@G>5TwNy?@uZG0ImNCgU9|F6zb_hF;(s5ZFwC}ahQjL0l*R0=a>MO z@%ue)zG3gjgv=0)9C+X(d?97AQEXrnjc;8=C;xsxNm9q*K)I&POv!t>nDV)sX$rj&=RN9_9+5%C+gSHeKT3Lf1wWh$Uffmq)p)gkTNyhSzI z1XRX0lN#HNP8H9pgJ;p7bFG#WR%fXw<%A;u4pX}_eMR-p9LLkO7`F5@wY*#dvMSF= znSZcaJj0mB2^z3U0iw%mS2V*hnN{m;I|3CUVvuLm3r#EoQvp_&3+n&~VGjHU{wV*2EiPLwDpZgooGJ3qVq~@$eG04)1`H;OLa1!6*1>p?R-XVi`P5p=io)5nXjc zr1U?H44ebcVSs=%Xy~vWvD8DX9L#;W%0XKT@dmSZeq1L6`ifF10JMJp0$BehD3%{_ zyFg6-fz_fZ&M=�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 diff --git a/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100644 index 6e2e93e94634cdbe7c2e699d688501cd0d65a906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6652 zcmVs0BS^~G;}x|FGHPi)((i=A{AZCIU@R%>2Net~V{ zVuh8B?%p!boHErZS5T$3liJ+BAeGJY1A-sG{p1&1Re4Soc6n@L1rY}=A>+qSY)`zM>PvAgRd?F3utMl8Z^DdP#)MSXcLg>Bo;M%ta! zHb?c;?%2~d^Zmrp+V`Te087&z6;V@RGD9o))~4wvos`{O97lvGJ0Q0^sSQUFC|e|5;a5(xkAf5eAMEsV=Zd^RwGoDd8B28Za3NY z-_{H?WO6~&5-zKnMq%6efR%<`G_T5`=2_NUidwp zbzN;M5}69%ekIZ8N+K4Ef(Rn1P*QyLTAY1cq`g|XW zMAQtL08NaPr#3}cMn#xM5GmR=uJH0DrEq|vQpv2Ogw<5W7WN#choM*Liy8&$7<9JD zt9qD6`2bWtKMxbl&8dI-&C(7fC+e0uB3Zy=nBOqEO$00y3Vnf|N=CGdP)aolFD-lr zk&)<|SDF1xOFW9u#Gv9!uD?H^hd#@0h-1&?IRyd?AbEaYXwPM4beA`v^}OP}*A!w| zCp_AVW&Z1Z26nfN#(K>FYjwaW%M+reia`f$tua>+@12D&(mEz%?;dHsfTB_a+sv z&T~(ninNTt@|cN%1yzq zN)>>v&J0FB?=f)xYmCNu9S&TpAo{!W$pA7LO0Kj#TN9jA8DZmoilPvOQt}7H+pBOa zl@_@}TG&BRH3}j=yB^(iIi}Xu>a*iPK~=Y3`29PE8?$HSkaXJ}3ZX>KNQ)=4GcMs3{dhymq{L8hV)!Et{LxqW~?Dq}f?!yv`(~>yoPUk32Fa2H4d? zCLtL?t0gWCm1kSrpldA(*ZBQUf`1;HXvc)&_*-hZg2J?541QOd%baAd=9o}kQ7#FA zYSTaX*BocYEv)BKB-x)%@KCInzslX>zX$BZktx& zp*D6YHx?T+A#+gYiQ+aClxALcYuMZ?h7#F-RnFI5VJnNPd9@~@XW>+n5jyUtED2D! zip>9_os&>ju6+Cgb(K<4Bxv7hSrgit>k1MeMSfpk{V8T_?&X8=EFa`KJ6pZv@`S18 zP15~(Vw_Z&=vjwo-9aNWC|vpNwrKkV#D2T>?I+Y#*5suYaYr1biG@$dLrVZE+-uhFu+n&1jdXdmpJT}93wY+kCuc%F%2VP zy!SgULArCF9T zMsb;=#5Wccpp|)|**Rw2+Y5baf#Z9EwLx`HGVBZmS*>Y|%}ku?J=)`VLGs+5fZ7xI zP5(W?nxML888%u5ng5L@n{H#`W&vl+8bIYI8_tC1^!gxmQ2nzM+QFvYm`pU@f#Y=G z@)EA?pd*~5xjAOu)BE>@)xXFfeZ~Z1olG3{GW4p=Nr2?vyMmj~8V=}#H9=~Lg`!jh z0wONmby*zEww7i9RV4m*dBXv>rlg8n6_)Q#zcX2x6MHo$&*P;+L%&w zY|zAjvW!QZ-xkAVt9MHUSsiF2d~E!8Qkg-UF_bl#C=`0^@a^nYeoIh&<_AC3F}&wo znl%lzdTG-&K6))e$!&sew4Tn{m039oI)#-aq2@krb6e5=e~MOlxX#l&~r1T1a^j zP<`g7r{}qI&ySiIAQE0;9&3`Fx{n|TBj&ay4f#-5nxd*NNCfXYOgP>N`VU{w5w!+T z*~tdasv-RLJxSI&YMBMEw=EtBu~+vIfF_#g^h9cfL6KGGWIVUMmTkR`Q6a|;&>>*D z^)@rVg^UKg4E#s>V~(0U0m?zmS=b#_^({luy@mUh&$pXQFO~IRL;)J5B3d_s-?|Wo zIIq^jkR>3pO+3{h_NtmnX0aS+)a0c6BQBFpwV7nHUFDY?NcO!exaAyPbFN7%J~1#r z%HLEbnCK#)8()_*gEws4q!SZj~Lq<5@X~&jJR+WO)&IdDJ!NXA{`7*Yugj)Jzn!kqJVaWI66K^O$>c z(x8|Y{8x|=x7(1wsczbwxhzSU|BV!~00)CkH$-bk1k|16Sv7>OoNLpP9kmRQ)0k+o zlfbp*7jj1BrF9;ceLR)q@t5N0E25cM16t1V`E%6e@zDTHfIKe(FObe-Nf0pVX~_DT zf~=NO7NG2{MN!ySnffd*_*C5Zq~NBre19L|Sv`zr=UMJ8N$|%G_Fj%pz^c1GXMRUq zZd&h}jg(7|Rr~*&;^=E>YpbHvH$C}vcvTI#H63{ycHcA5TE_q>eA0Rd0k;vet)?ZV zZ0?V8O(Rt_y!n$NmgvqxFKmpc>U*32f53zL3{!5^D-HA5hf zZIY>Wr%W+29@<*ea>dQmK72R$d`nU2rEJdwsq1T!jPv5hC%sm9|1}|<7d>rI(-}dH zrv%g<*P4Ir$pkl?wl95GYfl0XC+jQVm^Q8%oog~3&9y$IPD>S}IeEWh$XW#TO|H`&v^J52E2qiuqzqAeAQTI&kz8F^bll z-KnMl5@J=iQ1WSkGy}?jngE#a^aDl}FX-Xpeoi%+p!SzF8955t z%>4E^8yS5@yAA$Og8nA*B4&f*8nT>-fj5Q$z2RLdNF55|d(!=Oe+Nm7+igG~W3t(H zZvnb0-|i^4#-xCOu=r({KYk6BAkf5sABF*{9+dIxjevJh(r+;elJH_v8(Rp3Ouy9R z7eLE(>Gk?0yFy3(#O@m9F)hifl#&-P@IVug|M%{Q0S_k%kBp$7tI;pwakiw)VNTf$ zsP09^qd5Wo&3d)Rg$xHAM!|u}f9$7ysxi+Ne!zb$*AoKzUO-zH~l&9KmTjWk`yx81#OoOgHI;%JRFtzz0O7<3Y?HY(D<6XvKJLd+>#rg*iFrk31bsoRoKVk=z17( zNa~@_`bfre2NFLv=`)Zkf$rP&Rv~DD@h-ImDagk7#+*1a>kClh zroXE9a1U~hsV*gMch%2S`HzT zPIr(L#XwC2!RjEs8E9JYRFtjzi#)A$hJ-yY&v^eBPG#Z~%HGnKKgW8Cqb83eW9Wz< z&qNMf%h|z;a1@oKB<3G+drA_{oTp!s7kruy$p4hSsx6INanH->&9;*Ezu0bR(~!_H zKYsE1drZUIzrZI~QyAM!Jkddvuvs7aL5X|0Q&Ja1Bd2`$C2?ZPH$%RDd~Kfat8QC< z7mj}1X6UEF0*)9*9S6@-*5suiQ8QlrGWcWzydUr94HE>xHr-;g-=fG2>GvknEi|*| zI9R8l#{<0+WAfmYfSMCs%@;w&^&H6(TDwT!h{rgVO-}Shjmc-*;H*9k`BZ=;EIaXv z*tpO;Aflw5O#pJxaAsU;l$X^rpg*{OA27*O2hO_b^2*;-AW615d}3#uA1f}lJ9HeV zCe{MZIMnfrcgX9SjOfRcb|`+2#LS0BB1MT$XUn{b?X<- z@()$@C37#+&Ntf-hw;RaoUqlBJTm*;w-K_w1)VYM2UT9XK2Z1VrhiD1&3{}ZL*nmVJCGON@8paH|xvI=s9l$9O3_>&qE{5 zYC+1bb#)Zx2J(2m$WGAQd+%FUda_-p?Dx z^-S}p6Js{)YqtkG=v^u3!0D$~fj9>PAhnNj?#)U3J1^e!WV7uA&YjW8jian-3I5`u zXI^P=6X8IG`@K09S2&`&GobiI>$|4h2R%{JW__SBo8=v;ATsk(1MC%x6@E84 zWz|p;F;easL&pMm<82_NFKR0Y_&xr#re*USkWY8a#+Q5w9*MrJ zVI%V>z*C;<+ur?!a~*$o%aV7g%6p~K3%#sun?$oi#H3HKI>@glqU$Su%DFbpS(V1o zQ+&^oF7;_{O(`C&@%VPdEjH}0Jqhb3>#ifT#CFryEs*N?_GeLVMCz^CHC;H?gC#1F zwcO#H;88z9Zpb3dS1s9I>!70NJi;gHg^UCY&;kUn+RAm*Ben=FQgf)SL$+`|~o1W6tN+7xTHR*J_e!j5e8>`xa z)cPoHM&RQ{!x)XiXlabW0NxOS>$<0YkpkI9Jmq}$gsAfxkEkM+fs&7meqwQK6>{ic z6UcWH)66$>->R2-XC^6$EzL(is0I3cc5ZZTOOl|IY#+V+OiK+yjvQ1ni-!)Hc0S#Q z2s&$u*;ciA2_8}qbrq5JoU~q#;Vj*Gp|V#M$OV?f-@3pDmF5Z_MWa+48ZRh_sE87B z>@Y%i9JP6;4EeVR^N2{xsFRFyPfPUAOWs+xl}GUZ&W3kPZBGV%5bLbE9Gj$E#|F>DJ12f^ogHAt+$sFS0Hqa%GsyFuT0 zXxT@Pk(s48TjUC_y+t43UK|qubL$+y7W6zgsSM#~HG1fBbmM=;DGLf#n%qD_jC0bE z%xCTGEwUN?V+Y)A-3wsB-L3;O>n;G7G%Ea0o#68Xr3#2|O!|&=)6EFnb1{P6Ez&j) zUxIf|_1jP2^8`i2|27_QjdjO?Id=@OV?1Ct1Dsn){OL{^(W)ItMv$A;n8wt?p5y4k ze2%y^fEx1!ajt2&9#g!tMv^ONZ>1nw)e{K>K4gIN9{Wx(>^`t}WH|7ul!%;Y)ecqu zDKo!4=Hzu?DpRX*phx;h+{?&0eX5Z!YHuYYaw+*lW(VFFx$D3_3=FWg{lHEJID6ZH zYx5QQ;fE1VG_B!<{31?$hr5y2cf1?4*3*%B@Bp58&#bcBZ8Et6oKM(5B$(*eZ2@jv ze!GEPuYrL97CQ!<#{id42Rxle|wr69q)!kUGx51 zJ2WkE40;34-}vp1#lZk`2H3Z4z-0_@-Q2{#mP+IsF6C0XZVYTtPMZGyKzbUo*=KcM z$hOa#zIcax(E9jz}WJXHLWZJnFjvU8+s1MQRSj!m37@Gi6 z6m}%KrbVsa!m((}sEp8Ubsv9NpbjgCh##Zhx&g1e!EKMU-bovV*BJZN3~FH-hL-cSfI01-!S7z}=_+AS-=! z>-#vb7+@y@oW%f_J^%x(Zvn8q1;D}W10LEX;PKr84(&Q{2+=O`f(?xC#~jA+OWI^1I($e=Zach8ewzfvX`j(4W-$GHmPO49YZ|Ns)xma9hY0H82t&vLW z`^(aMZxL|aHN4n{FBO>Bg8`Ndu;)@oGQb5ZF~G%lbV|JLj_zosa~{b6XI}5kwNCu; z8mB&XH4L!(dKqBv(R?+pJDQ`p-e+6Q*i(Ov)=A`zJGqln9}c>cJ85}~V6QP8)V8mb GY6Adjf$B8? diff --git a/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp deleted file mode 100644 index fa30b40fe7fcdc4a9fc4c0e6b553cfe77bb0da34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16078 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 diff --git a/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp deleted file mode 100644 index 797fa51e26a465076de582a443b47fdc601ab54e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10238 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 E0K$^Eg8%>k diff --git a/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index 9591870edc91ad20c956f0cc259b6d38920fe153..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8784 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 Gn+gCPa^lDU diff --git a/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp deleted file mode 100644 index 0f923702c3f3ff84f28e6592e6ca623764baf293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24830 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 diff --git a/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp deleted file mode 100644 index 1c6a1ddf9c152a1fc58c97ac0865b6f8b9bfec1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14318 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 diff --git a/androidApp/src/main/res/values-ar/strings.xml b/androidApp/src/main/res/values-ar/strings.xml deleted file mode 100644 index fc9dfe802..000000000 --- a/androidApp/src/main/res/values-ar/strings.xml +++ /dev/null @@ -1,456 +0,0 @@ - - - - ميفوس موبايل - تسجيل الدخول - %1$s أهلا بك - غير متصل بالإنترنت - الأساسية - اسم المستخدم - تسجيل الدخول - جار التحميل - كلمه السر - البريد الإلكتروني - حسابات - عملاء - تحويل رصيد - التحويلات الاخيرة - شحنة - استطلاع - معلومات عنا - حفظ تفاصيل الحساب - حساب التوفير - خطأ في تحميل تفاصيل حسابات القروض - معدل الفائدة الاسمي - رقم حساب - رصيد الحساب - مجموع الودائع - افتح الدرج - أغلق الدرج - الصفحة الرئيسية - نص متوسط - نص صغير - حسابات العملاء - دفقة - إنقاذ - قرض - حساب القرض - شارك - حصة الحساب - شيء العميل - العمل - صورة الحالة - جدول الدفع - آخر معاملة - صنع على - إجراء تحويل - اختر منتج القرض * - الغرض من القرض* - المبلغ الرئيسي * - كمية - تعليق - تاريخ الصرف المتوقع - تاريخ التقديم - قدمت - إنفاق - تاريخ التحويل - التقدم بطلب للحصول على قرض - تحديث القرض - سحب القرض - سبب سحب القرض - سحب حساب القرض بنجاح - تقديم القرض - طلب قرض جديد - تحديث طلب القرض - نوع الفائدة - الإطفاء - فترة احتساب الفائدة - استراتيجية السداد - دفع إلى - ادفع من - إلغاء - إعادة النظر - حول إلى - تحويل من - جعل النقل - الوديعة - أدخل المبلغ - ملاحظة إلزامية - وافق - قيد الانتظار - دفع - توازن - مرفوض - انتظار - زائدة - في المتأخرات - حدد كل ما تريد تطبيقه - تصفية حسابات التوفير - تصفية حسابات القروض - تصفية حصة الحسابات - بحث - حدد الحساب للدفع إلى - اختر الحساب للدفع من - أدخل ملاحظات للنقل - حدد المستفيد - استمر - قريب - اختر نوع النقل - نقل الى الادخار - نقل من الادخار - رسوم القرض - رسوم الادخار - نشيط - مغلق - سحب - تحتاج الى موافقة - قيد الانتظار - نضجت - انشئ حساب - الاسم الاول - الكنية - رقم الهاتف - تسجيل - طلب معرف - رمز المصادقة - التحقق - التحقق - توقيع - تم التحقق من المستخدم بنجاح - التليفون المحمول - البريد الإلكتروني - وضع التحقق - - استيراد QR - عرض الضامن - إضافة الضامن - حذف الضامن - تحديث الضامن - نوع الضامن - لا ضمانات - انقر لإضافة الضامن - تفاصيل الضامن - تاريخ الانضمام - خضع - - يجب أن يكون الحساب نشطًا لتنفيذ الوديعة - يجب أن يكون الحساب نشطًا لتنفيذ نقل - - لا يوجد حساب SavingsAccount مرتبط بك - لا يوجد LoanAccount مرتبط بك - لا يوجد ShareAccount مرتبط بك - لا توجد معاملات مرتبطة بك - لا يوجد جدول سداد مرتبط بك - لا مزيد من المعاملات المتاحة - لا صفقة - لم يتم العثور على DOB. - غير معين مع أي مجموعة - - اسم المتسخدم / كلمة المرور غير صحيحة - خطأ في تحميل الاستجابة من الخادم - %1$s لا يمكن أن يكون فارغًا - لا يمكن أن يكون %1$s أقل من %2$d من الأحرف - لا يمكن أن تحتوي %1$s على %2$s - لا يمكن بد %1$s أو -         نهاية مع مساحة فارغة - - خطأ في الخادم الداخلي ، يرجى المحاولة مرة أخرى - خطأ في تحميل قائمة العملاء - خطأ في تحميل قائمة حسابات القروض - حدث خطأ في تحميل قائمة الحسابات - حدث خطأ في تحميل تفاصيل الحسابات      - حدث خطأ في التحميل في المعاملات الحديثة - خطأ في تحميل رسوم العميل - لا توجد رسوم - العميل غير موجود - فشل جلب العميل - فشل إحضار ملف تعريف المستخدم - فشل جلب الحسابات - فشل في جلب جدول السداد - لا يمكن نقل مع في نفس الحساب - خطأ في جلب تحويل الحساب قالب - فشل في جلب المستفيدين - فشل في جلب قالب المستفيد - فشل جلب القالب - فشل في إنشاء المستفيد - فشل تحديث المستفيد - فشل في حذف المستفيد - خطأ في سحب حساب القرض - خطأ في إحضار نقل طرف ثالث قالب - في الوقت الحالي ، ليس لديك أي مستفيد. يرجى إضافة المستفيد - - أنك غير مخول - رمز الاستجابة السريعة - شارك رمز الاستجابة السريعة - مراقب - إختر خيارا - عرض المعاملات - عرض الرسوم - عرض ملخص القرض - عرض جدول السداد - عرض رمز QR لهذا الحساب - آخر تفاصيل العملية - يجب أن يكون اسم المستخدم أكبر من 6 أحرف      - معرف البريد الإلكتروني غير صالح - اسفل الخادم ، حاول بعد بعض الوقت - رسوم العميل -  خطأ أثناء قراءة QR ، تأكد من تحديد المنطقة المناسبة      - خطأ في جلب الصورة - جلب العميل - - المساحات - اسم العميل - حالة الحساب - اسم المنتج - مجموع السحوبات - دقيقة. مطلوب - اسم المنتج - الغرض من القرض - المالك - رأس المال المصروف - آن. سعر الفائدة - الفائدة مشحونة - الفائدة المدفوعة - تفاصيل حساب القرض - ملخص القرض - اسم القرض - فائدة - رسوم - ضربات الجزاء - مجموع السداد المتوقع - مجموع المبالغ المدفوعة - مصلحة التنازل - العقوبات تنازلت - رسوم التنازل - توازن رائع - القسط التالي - تاريخ الاستحقاق - قم بالدفع - نوع القرض - دقة - جدول الدفع - المعاملات - نقل - في انتظار الموافقة - في انتظار الصرف - مغلقة بسبب بعض الالتزامات - القرض مغلق - تاريخ الاستحقاق: - بسبب: - دفع: - لوح: - أمتياز: - مثال - إضافة القطعة - مساعدة - مبادرة Mifos - مبادرة Mifos ، سياتل ، واشنطن 98121 - سياتل - موطن لصناعة التكنولوجيا الكبيرة - تفاصيل حساب القرض - تقديم طلب القرض بنجاح - تم تحديث طلب القرض بنجاح - طلب قرض ينسحب بنجاح - لا شيء - الكل - 4 أسابيع - 3 اشهر - 6 اشهر - منقي - تاريخ البدء - تاريخ الانتهاء - مصفى - يرجى تحديد تاريخ البدء وتاريخ الانتهاء - يجب أن يكون تاريخ الانتهاء أكبر من تاريخ البدء - حفظ معاملات الحساب - لا اتصال إنترنت - تاريخ صرف - عدد الدفعات - تاريخ - رصيد القرض - السداد - سداد القروض - نقل سريع - يرجى التأكد من اتصالك بالإنترنت - المستفيد - إدارة المستفيدين - المستفيدون - تفاصيل المستفيد - أسم المستفيد - نوع الحساب - حد النقل - أضف المستفيد - اسم المكتب - اختر نوع الحساب * - تقديم المستفيد - أدخل اسم مكتب المستفيد - أدخل اسم المستفيد - أدخل حد النقل - أدخل رقم حساب المستفيد - حدد نوع الحساب من القائمة المنسدلة - المستفيد تم إنشاؤه بنجاح - تم تحديث المستفيد بنجاح - تحديث المستفيد - حذف المستفيد - هل أنت متأكد أنك تريد حذف هذا المستفيد - حذف - المستفيد المحذوف بنجاح - نقل طرف ثالث - إجمالي القرض - مجموع المدخرات - نظرة عامة على الحساب - إظهار أو إخفاء إجمالي مبلغ القرض - ***** - الدراسات الاستقصائية - تفعيل التسجيل - المجموعات - بيانات المستخدم - نوع العميل - تصنيف العميل - حدد الوضع - إضافة المستفيدين من الأطراف الثالثة إلى حسابك. n\ أدخل يدويا أو مسح رمز الاستجابة السريعة حساب - لا يمكنك اتخاذ إجراء في حسابك ، يرجى مسح مستخدم آخر حساب الادخار والقروض QRCode - إضافة - تفحص - أدخل رمز المرور المكون من 4 أرقام - يجب أن يكون رمز المرور من 4 أرقام - رمز المرور غير صحيح - لقد أدخلت رمز المرور غير صحيح أكثر من ثلاث مرات - تخطى - حفظ - قم بإعداد رمز مرور لتسجيل الدخول - يرجى إعادة إدخال رمز المرور الخاص بك - رمز المرور غير متطابق. - نسيت رمز المرور ، ادخل يدويا - تقدم - يجب أن يكون المبلغ أكبر من الصفر - من نحن تحت الإنشاء - مساعدة تحت الإنشاء - الخروج - تنزيل تطبيق الخدمة الذاتية هنا: https://play.google.com/store/apps/details؟id= - اختر التطبيق - NA - تحميل QR - اختر المنطقة مع رمز الاستجابة السريعة - - اتصل بنا - - تم نقله بنجاح - - مجموع: - - A / C - منتج القرض - غير نشط - نشيط - غير نشط - - - هل أنت متأكد أنك تريد تسجيل الخروج؟ - حسنا - إلغاء - الى الخلف - طلب الاذن مرفوض - انا متاكد - إعادة المحاولة - إعدادات التطبيقات - بدون إذن الكاميرا سوف لن تتمكن من مسح رمز الاستجابة السريعة ضوئيًا لإضافة المستفيد.هل تريد بالتأكيد رفض هذا الإذن؟ - لقد رفضت الحصول على إذن استخدام الكاميرا ، بدون هذا الإذن لن تتمكن من إضافة المستفيدين باستخدام رمز الاستجابة السريعة. يرجى تمكينها في الإعدادات - بدون إذن التخزين سوف لا يمكنك تحميل رمز الاستجابة السريعة لإضافة المستفيد.هل تريد بالتأكيد رفض هذا الإذن؟ - لقد رفضت الحصول على إذن قراءة التخزين ، بدون هذا الإذن لن تتمكن من إضافة المستفيدين باستخدام QR Code. يرجى تمكينها في الإعدادات - لقد رفضت الحصول على إذن الكتابة إلى التخزين ، بدون هذا الإذن لن تتمكن من إضافة المستفيدين باستخدام رمز الاستجابة السريعة. يرجى تمكينها في الإعدادات - هذا الإذن مطلوب لعرض العملة وفقًا لبلدك.هل تريد بالتأكيد إنكارها؟ - لقد رفضت الإذن         لجلب حالة الهاتف ، بدون هذا الإذن ، قد لا تظهر العملة بالشكل الصحيح. يرجى تمكينها في الإعدادات - حدث خطأ ما في العثور على نشاط الإعدادات. n\ انتقل إلى \ "الإعدادات \" ومنح الإذن يدويًا. - تم رفض الإذن للتخزين - هل أنت متأكد أنك تريد %1$s؟ - - - %1$s ،مرحبا - %1$.2f - %2$s %1$.2f - %2$s %1$s - %2$.2f %1$s - %2$d :%1$s - مبلغ غير صحيح - اضغط مرة أخرى للخروج - - تم رفض الإذن باستخدام الكاميرا - ١ - ٢ - ٣ - ٤ - ٥ - ٦ - ٧ - ٨ - ٩ - ٠ - - أسئلة مكررة - استعلام المستخدم - اتصل الان - اترك بريدًا إلكترونيًا - البحث عن المواقع - لا انسحابات - مسح مرشحات - إدارة الحسابات - أكثر من - الإعدادات - لغة - اختر لغتك - إخطارات - عنوان URL الأساسي - مستأجر - - - كيف أتقدم بطلب للحصول على حساب قرض جديد؟ - أين يمكنني مشاهدة معلومات ملفي الشخصي؟ - أين يمكنني رؤية معاملات حسابات التوفير الخاصة بي؟ - ما هو استخدام رمز الاستجابة السريعة؟ - كيفية إنشاء المستفيد باستخدام رمز الاستجابة السريعة؟ - كيفية إجراء الدفع لحساب القرض؟ - - - - لتقديم طلب للحصول على حساب القرض ، انقر على \ "تقديم طلب للحصول على قرض \" على الشاشة الرئيسية. - يمكنك عرض معلومات ملف التعريف الخاص بك بالنقر فوق "صورة المستخدم" الموجودة على Home شاشة. - لعرض معاملات حساب التوفير الخاص بك ، انتقل إلى "أقسام الحسابات" ، انقر فوق حساب التوفير المطلوب ، انقر على ثلاث نقاط موجودة في أعلى اليمين واختر خيار المعاملات. - يمكن تقاسم QrCode لأي قرض أو حسابات التوفير مع المستخدمين الآخرين والتي سوف السماح لهم بإنشاء المستفيد. - لإنشاء مستفيد ، انتقل إلى خيار المستفيد من الشاشة الرئيسية ، ثم انقر فوق على الزر الدائري الموجود في أسفل اليمين ، اختر خيار المسح الضوئي الذي يفتح كاميرا جهازك ، ومسح رمز الاستجابة السريعة للشخص الآخر الذي تريد إنشاء المستفيد ، بعد ملء التفاصيل المطلوبة الأخرى ، ستتمكن من إنشاء المستفيد باستخدام رمز الاستجابة السريعة. - لإجراء دفع لحساب قرض ، انتقل إلى "أقسام الحسابات" ، واختر "القرض" ثم افتح حساب القرض المطلوب الخاص بك وانقر على خيار "إجراء الدفع". - - - - مجموع رصيد المدخرات - مجموع رصيد القرض - فوق رصيد القرض والادخار هي تحسب نيابة عن جميع حسابات الادخار والحسابات الخاصة بك. - هل أنت متأكد من أنك تريد إلغاء التحويل؟ - نعم فعلا - تأكيد كلمة المرور - كلمة السر غير متطابقة. - %1$s الإصدار - ©2016-%1$s Mifos Initiative. - كل الحقوق محفوظة. - تراخيص - يتعذر إكمال النقل ، يرجى المحاولة مرة أخرى في وقت لاحق - ارجوك انتظر… - رسالة - لا يوجد إشعارات - - تحديث نقطة النهاية - انقر هنا لتغيير تكوينات نقطة النهاية - أدخل عنوان URL الأساسي - أدخل المستأجر - معلومات التطبيق - إظهار أو إخفاء إجمالي مبلغ التوفير - فشل تسجيل الدخول يرجى المحاولة مرة أخرى في وقت لاحق. - \ No newline at end of file diff --git a/androidApp/src/main/res/values-bn/strings.xml b/androidApp/src/main/res/values-bn/strings.xml deleted file mode 100644 index 3b469b8fc..000000000 --- a/androidApp/src/main/res/values-bn/strings.xml +++ /dev/null @@ -1,444 +0,0 @@ - - - - লগ ইন করুন - হ্যালো, %1$s। - কোন ইন্টারনেট সংযোগ নেই - প্রাথমিক - ব্যবহারকারীর নাম - লগিন করো - বোঝাই - পাসওয়ার্ড - ই-মেল ঠিকানা - অ্যাকাউন্ট - গ্রাহকদের - তহবিল স্থানান্তর - সাম্প্রতিক লেনদেন - ফি - প্রশ্নাবলী - আমাদের সম্পর্কে - অ্যাকাউন্ট বিবরণ সংরক্ষণ করা হচ্ছে - সঞ্চয় অ্যাকাউন্ট - ক্রেডিট অ্যাকাউন্ট তথ্য লোড করার সময় ত্রুটি - নামমাত্র সুদের হার - অ্যাকাউন্ট নম্বর - অ্যাকাউন্ট ভারসাম্য - মোট আমানত - ন্যাভিগেশন প্যানেল খুলুন - পুনরুদ্ধারের প্যানেল বন্ধ করুন - হোম পেজ - মাঝারি টেক্সট - ছোট টেক্সট - গ্রাহক অ্যাকাউন্ট - স্বাগতম পর্দা - সঞ্চয় - ঋণ - ক্রেডিট অ্যাকাউন্ট - শেয়ার - আপনার অ্যাকাউন্ট শেয়ার করুন - একটি গ্রাহক চয়ন করুন - কাজ - রাষ্ট্রের ছবি - পরিশোধের সময়সূচী - শেষ লেনদেন - উপর তৈরি - একটি স্থানান্তর করুন - একটি ক্রেডিট পণ্য চয়ন করুন * - ঋণ উদ্দেশ্য * - প্রধান পরিমাণ * - সংখ্যা - সতর্কতা - প্রত্যাশিত বেতন তারিখ - জমা দেওয়ার জন্য নির্দিষ্ট সময়সীমা - আপলোড - ব্যয় - স্থানান্তর তারিখ - একটি ঋণ জন্য আবেদন করুন - ঋণ আপডেট করুন - ঋণ মুক্তি - ঋণ পরিশোধ করার কারণ - ঋণ অ্যাকাউন্ট সফলভাবে প্রত্যাহার করা হয়েছে - একটি ঋণ জমা দিন - নতুন ঋণ ক্রেডিট আবেদন - আপনার ক্রেডিট আবেদন আপডেট করুন - আগ্রহের ধরন - ঘাত-শোষণ - সুদের সময় - ঋণ পরিশোধের কৌশল - পেমেন্ট - থেকে পেমেন্ট - বাতিল - পূর্বরূপ - স্থানান্তর - থেকে স্থানান্তর - একটি স্থানান্তর করা - আমানত - পরিমাণ লিখুন - নোট বাধ্যতামূলক - অনুমোদিত - প্রত্যাশা - অর্থ প্রদান - ভারসাম্য - প্রত্যাখ্যাত - প্রতীক্ষা - অতিরিক্ত - বকেয়া - আপনি আবেদন করতে চান সবকিছু চয়ন করুন - ফিল্টার সঞ্চয় অ্যাকাউন্ট - ফিল্টার ক্রেডিট অ্যাকাউন্ট - ফিল্টার অ্যাকাউন্ট শেয়ারিং - অনুসন্ধান - পরিশোধ বিকল্প হতে অ্যাকাউন্ট নির্বাচন করুন - সঙ্গে একটি অ্যাকাউন্ট চয়ন করুন - স্থানান্তর নোট লিখুন - সুবিধাভোগী নির্বাচন করুন - অধিকতর - ঘনিষ্ঠ - স্থানান্তর ধরনের নির্বাচন করুন - সঞ্চয় স্থানান্তর - সঞ্চয় থেকে স্থানান্তর - ঋণের জন্য ফি - জমা - সক্রিয় - বন্ধ - অপসারিত - অনুমোদন প্রয়োজন - প্রত্যাশা - পরিণত - একটি অ্যাকাউন্ট তৈরি করুন - নাম - নাম - ফোন নম্বর - রেজিস্টার - আইডি অনুরোধ - প্রমাণীকরণ টোকেন - যাচাই করুন - যাচাই করা হচ্ছে - লগিন করো - ব্যবহারকারী সফলভাবে যাচাই করা হয়েছে - মোবাইল - ই-মেল ঠিকানা - যাচাই মোড - খালি - ইমপোর্ট QR - গ্যারান্টি দেখুন - একটি গ্যারান্টি যোগ করুন - গ্যারান্টি সরান - গ্যারান্টি আপডেট করুন - গ্যারান্টি টাইপ - কোন গ্যারান্টি - একটি গ্যারান্টি যোগ করার জন্য আলতো চাপুন - গ্যারান্টি বিস্তারিত - সংযুক্তি তারিখ - জমা দিন - - অ্যাকাউন্ট একটি আমানত করতে সক্রিয় করা উচিত - অ্যাকাউন্ট একটি স্থানান্তর করতে সক্রিয় করা উচিত - - আপনার সাথে সংযুক্ত কোন সঞ্চয় অ্যাকাউন্ট আছে - আপনার সাথে যুক্ত কোন ঋণ অ্যাকাউন্ট আছে - আপনার সাথে যুক্ত কোন ভাগ অ্যাকাউন্ট আছে - আপনার সাথে কোন লেনদেন আছে - আপনার সাথে যুক্ত কোন পরিশোধের সময়সূচী নেই - কোন লেনদেন উপলব্ধ নেই - কোন লেনদেন - DOB পাওয়া যায় নি। - কোন গ্রুপ থেকে unassigned - - ভুল ব্যবহারকারীর নাম / পাসওয়ার্ড - সার্ভার থেকে একটি প্রতিক্রিয়া পেয়ে যখন ত্রুটি - %1$s খালি থাকতে পারে না - %1$s %2$d অক্ষরের চেয়ে কম হতে পারে না - %1$s এর মধ্যে %2$s থাকতে পারে না - %1$s একটি স্থান দিয়ে শুরু বা শেষ করতে পারে না - অভ্যন্তরীণ সার্ভারে ত্রুটি, পরে আবার চেষ্টা করুন - গ্রাহক তালিকা লোড করার সময় একটি ত্রুটি ঘটেছে - ঋণ অ্যাকাউন্ট তালিকা লোড হচ্ছে - সঞ্চয় অ্যাকাউন্টের তালিকা লোড করার সময় ত্রুটি - সঞ্চয় অ্যাকাউন্ট সম্পর্কে বিস্তারিত লোড করার সময় ত্রুটি - সাম্প্রতিক লেনদেনে লোড করার সময় একটি ত্রুটি ঘটেছে - অ্যাকাউন্ট গ্রহণযোগ্য ত্রুটি লোড হচ্ছে - গ্রাহক পাওয়া যায় নি - ক্লায়েন্ট ডাউনলোড করা যাবে না - ব্যবহারকারী প্রোফাইল ডাউনলোড করতে অক্ষম - অ্যাকাউন্ট ডাউনলোড করতে অক্ষম - পরিশোধের সময়সূচী পুনরুদ্ধার করা যাবে না - আপনি নিজের অ্যাকাউন্টে স্থানান্তর করতে পারবেন না - স্থানান্তর টেমপ্লেট ডাউনলোড করা যাবে না - ক্রেডিট প্রাপ্ত করা যায়নি - উত্তরাধিকারী এর টেমপ্লেট ডাউনলোড করা যাবে না - টেমপ্লেট ডাউনলোড করা যাবে না - উত্তরাধিকারী সফল হয়নি - উত্তরাধিকারী আপডেট করা হয়েছে - উত্তরাধিকারী অপসারণ করা সম্ভব ছিল না - ঋণ অ্যাকাউন্ট প্রত্যাহার করা যাবে না - তৃতীয় পক্ষের স্থানান্তর টেমপ্লেট ডাউনলোড ত্রুটি - আপনি বর্তমানে কোন উত্তরাধিকারী আছে। উত্তরাধিকার যোগ করুন - - আপনি অনুমোদিত হয় না - QR কোড - QR কোড শেয়ার করুন - মনিটর - একটি বিকল্প চয়ন করুন - লেনদেন দেখুন - ফি দেখুন - ঋণ সারসংক্ষেপ দেখুন - পরিশোধের সময়সূচী দেখুন - এই অ্যাকাউন্টের জন্য QR কোড দেখুন - শেষ লেনদেনের বিবরণ - ব্যবহারকারীর নাম 6 অক্ষর চেয়ে বড় হওয়া উচিত - অবৈধ ইমেইল আইডি - সার্ভার ডাউন, কিছু সময় পরে চেষ্টা করুন - গ্রাহক ফি - QR পড়তে ত্রুটি, আপনি সঠিক অঞ্চল নির্বাচন করুন তা নিশ্চিত করুন - ইমেজ ডাউনলোড করার সময় ত্রুটি - ক্লায়েন্ট ডাউনলোড - - শূন্যস্থানের - গ্রাহক নাম - অ্যাকাউন্টের অবস্থা - পণ্যের নাম - মোট পেমেন্ট - ন্যূনতম প্রয়োজনীয় ব্যালেন্স - পণ্যের নাম - ঋণ উদ্দেশ্য - পরিচালক - প্রিন্সিপাল পরিশোধ আউট - বার্ষিক সুদের হার - সুদ অর্জন - সুদ দেওয়া - ক্রেডিট অ্যাকাউন্টের বিবরণ - ঋণ সংক্ষিপ্তসার - ঋণের নাম - সুদ - ফি - জরিমানা - মোট প্রত্যাশিত পেমেন্ট - মোট পরিশোধ - সুদ waived - পেনাল্টি ভাঙ্গা - ফি ক্ষমা করা হয় - অসামান্য ভারসাম্য - পরবর্তী কিস্তি - পেমেন্ট সময়সীমা - একটি পেমেন্ট করুন - ঋণের ধরন - মুদ্রা - পরিশোধের সময়সূচী - লেনদেন - হস্তান্তর - অগ্রগতি অনুমোদন - পেমেন্ট জন্য অপেক্ষা করছে - কিছু বাধ্যবাধকতা কারণে বন্ধ - ঋণ বন্ধ - তারিখ অনুসারে: - দ্বারা: - অর্থ প্রদান: - সমর্পিত: - বিলম্বিত: - EXAMPLE টি - উইজেট যোগ করুন - সাহায্য - বড় প্রযুক্তিগত শিল্পের স্থান - ঋণ হিসাব বিবরণী - ক্রেডিট আবেদন সফলভাবে পাঠানো হয়েছে - ঋণ আবেদন সফলভাবে আপডেট করা হয়েছে - ঋণ আবেদন সফলভাবে প্রত্যাহার - কিছু না - সব - ৪ সপ্তাহ - ৩ মাস - ৬ মাস - ফিল্টার - শুরু তারিখ - সমাপ্তির তারিখ - ফিল্টার - শুরু এবং শেষ তারিখ চয়ন করুন - শেষ তারিখ শুরু তারিখের চেয়ে বড় হতে হবে - আপনার অ্যাকাউন্টে লেনদেন সংরক্ষণ - কোন ইন্টারনেট সংযোগ নেই - পেমেন্ট তারিখ - পেমেন্ট সংখ্যা - তারিখ - ঋণের ভারসাম্য - পরিশোধ - ঋণ পরিশোধের - দ্রুত স্থানান্তর - আপনি একটি ইন্টারনেট সংযোগ আছে তা নিশ্চিত করুন - উত্তরাধিকারী - উত্তরাধিকার পরিচালনা করুন - সুবিধাভোগী - উত্তরাধিকার বিবরণ - উত্তরাধিকারীর নাম - অ্যাকাউন্ট টাইপ - স্থানান্তর সীমা - উত্তরাধিকার যোগ করুন - অফিসের নাম - অ্যাকাউন্ট টাইপ নির্বাচন করুন * - একটি উত্তরাধিকার জমা দিন - উত্তরাধিকারী অফিসের নাম লিখুন - উত্তরাধিকারীর নাম লিখুন - স্থানান্তর সীমা লিখুন - উত্তরাধিকারী অ্যাকাউন্ট নম্বর লিখুন - ড্রপ ডাউন মেনু থেকে অ্যাকাউন্ট টাইপ নির্বাচন করুন - উত্তরাধিকার সফলভাবে তৈরি করা হয়েছে - উত্তরাধিকার সফলভাবে আপডেট করা হয়েছে - আপনার উত্তরাধিকার আপডেট করুন - উত্তরাধিকারী সরান - আপনি এই উত্তরাধিকারী অপসারণ করতে চান আপনি কি নিশ্চিত? - মুছতে - উত্তরাধিকারী মুছে ফেলা হয়েছে - একটি তৃতীয় পক্ষের স্থানান্তর - মোট ঋণ - মোট সঞ্চয় - অ্যাকাউন্ট ওভারভিউ - মোট ঋণের পরিমাণ দেখান বা লুকান - ***** - সার্ভে - অ্যাক্টিভেশন তারিখ - গ্রুপ - ব্যবহারকারীর তথ্য - গ্রাহক টাইপ - গ্রাহক শ্রেণীবিভাগ - মোড নির্বাচন করুন - আপনার অ্যাকাউন্টে বাইরের উত্তরাধিকার যোগ করুন। \nম্যানুয়ালি লিখুন অথবা আপনার অ্যাকাউন্টের QR কোডটি স্ক্যান করুন - আপনি আপনার অ্যাকাউন্টে কর্ম সঞ্চালন করতে পারবেন না, সঞ্চয় অ্যাকাউন্ট থেকে QR কোড স্ক্যান করুন অথবা অন্য ব্যবহারকারীর ঋণ অ্যাকাউন্ট স্ক্যান করুন - যোগ - স্ক্যান - ৪ সংখ্যার অ্যাক্সেস কোডটি প্রবেশ করান - অ্যাক্সেস কোড ৪ ডিজিট হওয়া উচিত - ভুল অ্যাক্সেস কোড - আপনি 3 বার বেশি ভুল অ্যাক্সেস কোড প্রবেশ করেছেন - এড়িয়ে যান - সংরক্ষণ করুন - লগ ইন পিন সেট করুন - পিন পুনরায় লিখুন - অ্যাক্সেস কোড মেলে না। - আমি পিন ভুলে গেছি, আমি পাসওয়ার্ড দিয়ে লগ ইন করব - অবিরত - পরিমাণ শূন্য চেয়ে বড় হওয়া উচিত - বুকমার্ক নির্মাণ অধীনে আমাদের সম্পর্কে - নির্মাণ ট্যাব অধীনে সহায়তা - লগ আউট করুন - এখানে স্ব পরিষেবা অ্যাপ্লিকেশনটি ডাউনলোড করুন: https://play.google.com/store/apps/details?id= - আবেদন নির্বাচন করুন - পাওয়া যায় না - QR জমা দিন - QR কোড সঙ্গে অঞ্চল নির্বাচন করুন - - আমাদের সাথে যোগাযোগ করুন - সফল স্থানান্তর - - মোট: - - এবং/সি - ঋণ পণ্য - নিষ্ক্রিয় - সক্রিয় - নিষ্ক্রিয় - - - আপনি কি লগ আউট করতে চান? - ঠিক আছে - বাতিল - প্রত্যাবর্তন - প্রবেশ অস্বীকার - আমি নিশ্চিত - আবার চেষ্টা করুন - অ্যাপ্লিকেশন সেটিংস - ক্যামেরা ব্যবহার করার অনুমতি ছাড়া, আপনি উত্তরাধিকার যোগ করার জন্য QR কোড স্ক্যান করতে পারবেন না। আপনি এই বৈশিষ্ট্য নিষিদ্ধ করতে চান আপনি কি নিশ্চিত? - আপনি ক্যামেরা ব্যবহার করার অনুমতি প্রত্যাখ্যান করেছেন, এই অনুমতি ব্যতিরেকে আপনি QR কোড ব্যবহার করে উত্তরাধিকার যুক্ত করতে পারবেন না। সেটিংস এটি চালু করুন - মেমরি থেকে পড়ার অনুমতি ছাড়া, আপনি উত্তরাধিকার যোগ করার জন্য একটি QR কোড পাঠাতে পারবেন না। আপনি এই বৈশিষ্ট্য নিষিদ্ধ করতে চান আপনি কি নিশ্চিত? - আপনি ডিভাইসের মেমরি থেকে পড়ার অনুমতি প্রত্যাখ্যান করেছেন, এই অনুমতি ব্যতিরেকে আপনি QR কোড ব্যবহার করে উত্তরাধিকার যুক্ত করতে পারবেন না। সেটিংস এটি চালু করুন - আপনি ডিভাইসের মেমরিতে লিখতে অস্বীকার করেছেন, এই অনুমতি ব্যতীত আপনি QR কোড ব্যবহার করে উত্তরাধিকার যোগ করতে পারবেন না। সেটিংস এটি চালু করুন - এই অনুমতি দেশের উপর নির্ভর করে মুদ্রা প্রদর্শন করতে হবে। আপনি এই বৈশিষ্ট্য নিষিদ্ধ করতে চান আপনি কি নিশ্চিত? - আপনি অনুমতি ছাড়াই ডিভাইসের অবস্থা পড়ার অনুমতি প্রত্যাখ্যান করেছেন, অনুমতি ছাড়া মুদ্রা সঠিক বিন্যাসে প্রদর্শিত হতে পারে না। সেটিংস এটি চালু করুন - সেটিংস কার্যকলাপ খুঁজে বের করার সময় কিছু ভুল হয়েছে। \n \'সেটিংস\' এ যান এবং ম্যানুয়ালি অনুমতি দিন। - স্টোরেজ refusesals প্রত্যাখ্যান করা হয় - আপনি কি নিশ্চিত %1$s চান? - - - হ্যালো, %1$s - অবৈধ পরিমাণ - প্রস্থান করার জন্য আবার চাপুন - - ক্যামেরা ব্যবহার করার অনুমতি প্রত্যাখ্যান - - প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী - ব্যবহারকারী অনুরোধ - এখন কল করুন - একটি ইমেইল বার্তা ছেড়ে দিন - অবস্থান খুঁজুন - কোন পেমেন্ট - ফিল্টার সাফ করুন - অ্যাকাউন্ট পরিচালনা করুন - অধিক - সেটিংস - ভাষা - আপনার ভাষা চয়ন করুন - বিজ্ঞপ্তিগুলি - প্রাথমিক ইউআরএল - ভাড়াটিয়া - - - একটি নতুন ক্রেডিট অ্যাকাউন্টের জন্য কিভাবে আবেদন করবেন? - আমি কোথায় আমার প্রোফাইল সম্পর্কে তথ্য দেখতে পারি? - আমি কোথায় আমার সঞ্চয় অ্যাকাউন্ট লেনদেন দেখতে পারেন? - একটি QR কোড ব্যবহার কি? - কিভাবে একটি QR কোড ব্যবহার করে একটি সুবিধাভোগী তৈরি করতে? - কিভাবে একটি ক্রেডিট অ্যাকাউন্টের জন্য একটি পেমেন্ট করতে? - - - - ক্রেডিট অ্যাকাউন্টের জন্য আবেদন করতে, হোম স্ক্রীনে \"ঋণের আবেদন প্রতিবেদন করুন\" ক্লিক করুন। - আপনি প্রধান অ্যাপ্লিকেশন পৃষ্ঠায় প্রোফাইল ছবিতে ক্লিক করে আপনার প্রোফাইল তথ্য দেখতে পারেন। - আপনার সঞ্চয় অ্যাকাউন্টে লেনদেন দেখতে, অ্যাকাউন্ট বিভাগে যান, প্রয়োজনীয় সঞ্চয় অ্যাকাউন্টটি ক্লিক করুন, উপরের ডান কোণে উপস্থিত তিনটি বিন্দু ক্লিক করুন এবং লেনদেন বিকল্পটি নির্বাচন করুন। - সমস্ত ক্রেডিট বা সঞ্চয় অ্যাকাউন্টগুলির জন্য QR কোডটি অন্যান্য ব্যবহারকারীদের সাথে ভাগ করা যেতে পারে যারা তাদের উত্তরাধিকারী তৈরি করতে পারবে - একটি উত্তরাধিকারী তৈরি করতে হলে, হোম পেজে আবেদন উত্তরাধিকারী যান, এবং তারপর নীচের ডান কোণায় থাকা বোতামে ক্লিক করুন, স্ক্যান, যা ক্যামেরা ডিভাইস খুলবে নির্বাচন QR কোড ব্যক্তির জন্য আপনি একটি উত্তরাধিকারী তৈরি করতে চান স্ক্যান প্রয়োজনীয় তথ্য পূরণ করতে সক্ষম হবে পরে, একটি QR কোড ব্যবহার উত্তরাধিকারী তৈরি - ঋণের অ্যাকাউন্টের জন্য অর্থ প্রদান করতে, অ্যাকাউন্ট বিভাগে যান, LOAN বিকল্পটি নির্বাচন করুন, তারপরে লক্ষ্য ক্রেডিট অ্যাকাউন্ট খুলুন এবং একটি পেমেন্ট বিকল্পটি ক্লিক করুন। - - - - সঞ্চয় মোট ভারসাম্য - মোট ঋণ ভারসাম্য - সর্বোপরি ব্যাংক অ্যাকাউন্ট এবং সঞ্চয় অ্যাকাউন্টের ব্যালেন্স সমস্ত সঞ্চয় এবং ঋণ অ্যাকাউন্টের ভিত্তিতে হিসাব করা হয় - আপনি কি হস্তান্তর বাতিল করতে চান? - সুতরাং - পাসওয়ার্ড নিশ্চিত করুন - পাসওয়ার্ড মেলে না। - সংস্করণ %1$s - সমস্ত অধিকার সংরক্ষিত। - লাইসেন্সকরণ - একটি স্থানান্তর করতে পারবেন না, পরে আবার চেষ্টা করুন - অনুগ্রহ করে অপেক্ষা করুন … - বার্তা - কোন বিজ্ঞপ্তি নেই - - শেষ বিন্দু আপডেট করুন - Endpoint কনফিগারেশন পরিবর্তন করতে এখানে ক্লিক করুন - প্রাথমিক URL লিখুন - ভাড়াটে যান - কোন অভিযোগ পাওয়া যায় নি - সিয়াটেল - - - - - - - - - - - অ্যাপের তথ্য - মোট সঞ্চয় পরিমাণ দেখান বা লুকান - পরে আবার চেষ্টা করুন ব্যর্থ লগইন. - diff --git a/androidApp/src/main/res/values-es/strings.xml b/androidApp/src/main/res/values-es/strings.xml deleted file mode 100644 index 10af9cd67..000000000 --- a/androidApp/src/main/res/values-es/strings.xml +++ /dev/null @@ -1,433 +0,0 @@ - - - - Iniciar sesión - Hola, %1$s. - Falta conexión internet - Primario - Nombre de usuario - Acceder - Carga - Contraseña - Dirección de correo electrónico - Cuentas - Clientes - Transferencia de fondos - Transacciones recientes - Honorarios - Cuestionario - Sobre nosotros - Guardar detalles de la cuenta - Cuenta de ahorros - Error al cargar la información de la cuenta de crédito - Tasas de interés nominales - Numero de cuenta - Saldo de cuenta - Depósitos totales - Abre el panel de navegación - Cerrar el panel de navegación - Página de inicio - Texto medio - Texto pequeño - Cuentas de clientes - Pantalla de bienvenida - Ahorro - Préstamo - Cuenta de credito - Cuota - Comparte tu cuenta - Elige un cliente - Laboral - Imagen del estado - Calendario de reembolso - Ultima transaccion - Hecho en - Hacer una transferencia - Elija un producto de crédito * - Propósito del préstamo * - La cantidad principal * - Número - Precaución - Fecha de pago esperada - Plazo de presentación. - Subidas - Gasto - Fecha de transferencia - Solicitar un préstamo - Actualizar el prestamo - Liberar el prestamo - La razón para pagar el préstamo. - La cuenta del préstamo ha sido retirada con éxito. - Presentar un préstamo - Nueva solicitud de crédito para - Actualice su solicitud de crédito para - Tipo de interés - Amortización - Período de interés - Estrategia de pago - Pago a - Pago desde - Cancelar - Preestreno - Transferir a - Transferencia de - Haciendo una transferencia - Depósito - Introduce la cantidad - Nota es obligatoria - Aprobado - En anticipación - Pagado - Equilibrio - Rechazado - Espera - Pagado en exceso - En mora - Elige todo lo que quieras aplicar. - Filtrar cuentas de ahorro. - Filtrar cuentas de crédito - Filtrar el intercambio de cuentas - Búsqueda - Seleccione la opción Cuenta a pagar. - Elija una cuenta para pagar con - Introduce notas para transferir - Seleccione el beneficiario - Además - Cerca - Elija el tipo de transferencia - Transferencia a ahorros - Transferencia de ahorros - Cargos por préstamos - Ahorros - Activo - Cerrado - Retirado - Requiere aprobación - En anticipación - Maduro - Crear una cuenta - Nombre - Nombre - Numero de telefono - Registro - Solicitud de identificación - Token de autenticación - Verificar - Verificación - Acceder - El usuario ha sido verificado exitosamente. - Móvil - Dirección de correo electrónico - Modo de verificación - Vacía - Importar QR - Ver el Garante - Añadir un garante - Quitar el garante - Actualizar el garante - Tipo de garante - Sin garantes - Toque para agregar un garante - Detalles del garante. - Fecha de apego - Presentar - - La cuenta debe estar activa para hacer un depósito. - La cuenta debe estar activa para realizar una transferencia. - - No hay cuentas de ahorro vinculadas a usted. - No hay cuentas de préstamo asociadas con usted - No hay cuentas compartidas asociadas con usted - No hay transacciones relacionadas con usted. - No hay un calendario de pago asociado con usted - No hay transacciones disponibles - Ninguna transacción - DOB no encontrado. - Sin asignar a ningún grupo. - - Nombre de usuario / contraseña incorrectos - Error al obtener una respuesta del servidor. - %1$s no puede estar vacío - %1$s no puede tener menos de %2$d caracteres - %1$s no puede contener %2$s - %1$s no puede comenzar o terminar con un espacio - Error en el servidor interno, intente de nuevo más tarde - Se ha producido un error al cargar la lista de clientes. - Error al cargar la lista de cuentas de préstamo - Error al cargar la lista de cuentas de ahorro - Error al cargar detalles sobre cuentas de ahorro - Se produjo un error al cargar en transacciones recientes - Error al cargar las cuentas por cobrar - Cliente no encontrado - El cliente no pudo ser descargado - No se puede descargar el perfil de usuario - No se pueden descargar cuentas - El calendario de reembolso no puede ser recuperado - No puedes hacer una transferencia a tu propia cuenta. - La plantilla de transferencia no se pudo descargar - No se pudieron obtener créditos. - No se pudo descargar la plantilla del heredero. - No se pudo descargar la plantilla. - El heredero no tuvo éxito. - El heredero no ha sido actualizado. - El heredero no pudo ser removido. - La cuenta del préstamo no pudo ser retirada. - Error al descargar la plantilla de transferencia de terceros - Actualmente no tienes heredero. Añadir heredero - - No estas autorizado - Código QR - Comparte el código QR - Monitor - Elige una opción - Ver transacciones - Ver tarifas - Ver el resumen del préstamo. - Ver el calendario de amortización. - Ver el código QR para esta cuenta - Detalles de la última transacción - El nombre de usuario debe tener más de 6 caracteres. - ID de correo electrónico no válido - Servidor abajo, intente después de un tiempo - Honorarios del cliente - Error al leer QR, asegúrate de elegir la región correcta - Error al descargar la imagen. - Descarga de cliente - - Espacios - Nombre del cliente - Estado de la cuenta - Nombre del producto - Pago total - Min. Bola requerida. - Nombre del producto - Propósito del préstamo - Director - Director pagado - Tasa de interes anual - Intereses acumulados - Intereses pagados - Detalles de la cuenta de crédito. - Resumen del préstamo - El nombre del prestamo - Interés - Honorarios - Sanciones - Pago total esperado - Total pagado - Interés no cobrado - Pena rota - No se cobra la tarifa. - Saldo pendiente - Próxima entrega - Plazo de pago - Hacer un pago - El tipo de prestamo - Moneda - Calendario de reembolso - Transacciones - Transferencia - Aprobación en curso - Esperando el pago - Cerrado debido a algunas obligaciones. - Préstamo cerrado - Por fecha: - Por: - Pagado: - Cedido: - Atrasados: - Ejemplo - Añadir widget - Ayudar - El lugar de las grandes industrias tecnológicas. - Detalles de la cuenta del préstamo. - Solicitud de crédito enviada con éxito. - La solicitud de préstamo ha sido actualizada con éxito. - Solicitud de préstamo retirada exitosamente - Nada - Todos - 4 semanas - Tres meses - 6 meses - Filtro - Fecha de inicio - Fecha de finalización - Filtrado - Elija fecha de inicio y final - La fecha de finalización debe ser mayor que la fecha de inicio. - Guardando transacciones en su cuenta - Sin conexión a internet - Fecha de pago - El numero de pagos - Fecha - Saldo de prestamo - Reembolso - Amortización del préstamo - Transferencia rápida - Asegúrate de tener conexión a internet - Heredero - Administrar herederos - Los descendientes - Detalles del heredero - Nombre del heredero - Tipo de cuenta - Límite de transferencia - Añadir heredero - El nombre de la oficina - Elija el tipo de cuenta * - Presentar un heredero - Ingrese el nombre de la oficina del heredero - Introduce el nombre del heredero - Ingrese el límite de transferencia - Ingrese el número de cuenta del heredero - Seleccione el tipo de cuenta en el menú desplegable - El heredero ha sido creado con éxito. - El heredero ha sido actualizado exitosamente. - Actualiza tu heredero - Remover al heredero - ¿Estás seguro de que quieres eliminar a este heredero? - Borrar - El heredero ha sido removido. - Transferencia de un tercero - Préstamo total - Ahorro total - Resumen de cuenta - Mostrar u ocultar la cantidad total de ahorro - Mostrar u ocultar el monto total del préstamo - ***** - Encuestas - Fecha de activación - Grupo - Datos de usuario - Tipo de cliente - Clasificación de clientes - Elige el modo - Agregue herederos externos a su cuenta. \nIngrese manualmente o escanee el código QR de su cuenta - No puede realizar acciones en su cuenta, escanear el código QR de la cuenta de ahorros o la cuenta de préstamo de otro usuario - Añadir - Tomografía - Ingrese el código de acceso de 4 dígitos - El código de acceso debe constar de 4 dígitos. - Código de acceso incorrecto - Ha ingresado el código de acceso incorrecto más de 3 veces - Omitir - Guardar - Establecer el pin para iniciar sesión - Vuelva a introducir el pin - El código de acceso no coincide. - Olvidé el pin, iniciaré sesión con la contraseña. - Continuar - La cantidad debe ser mayor que cero - Bookmark acerca de nosotros en construcción - Ayuda en la ficha construcción - Finalizar la sesión - Descargue la aplicación de autoservicio aquí: https://play.google.com/store/apps/details?id= - Seleccione la aplicación - LA - Enviar QR - Elija región con código QR - - Contactanos - - Transferencia exitosa - - Total: - - A/C - Producto de préstamo - Inactivo - ACTIVO - INACTIVO - - - ¿Estás seguro de que quieres cerrar sesión? - Bueno - Cancelar - Regreso - Acceso denegado - Estoy seguro - Por favor intente de nuevo - Configuración de la aplicación - Sin el permiso para usar la cámara, no podrá escanear el código QR para agregar el heredero. ¿Estás seguro de que quieres prohibir esta función? - Ha rechazado el permiso para usar la cámara, sin este permiso no podrá agregar herederos utilizando el código QR. Encenderlo en la configuración - Sin el permiso para leer de la memoria, no podrá enviar un código QR para agregar el heredero. ¿Estás seguro de que quieres prohibir esta función? - Ha rechazado el permiso para leer de la memoria del dispositivo, sin este permiso no podrá agregar herederos utilizando el código QR. Encenderlo en la configuración - Se ha negado a escribir en la memoria del dispositivo, sin este permiso no podrá agregar herederos utilizando el código QR. Encenderlo en la configuración - Este permiso es requerido para mostrar la moneda dependiendo del país. ¿Estás seguro de que quieres prohibir esta función? - Ha rechazado el permiso para leer el estado del dispositivo; sin este permiso, es posible que la moneda no se muestre en el formato correcto. Encenderlo en la configuración - Algo salió mal al encontrar actividad en la configuración. \nVaya a \'Configuración\' y conceda permisos manualmente. - Las denegaciones de almacenamiento fueron rechazadas. - ¿Estás seguro de que quieres %1$s? - - - Hola, %1$s. - Cantidad inválida - Presione de nuevo para salir - - Rechazo del permiso para utilizar la cámara. - - Preguntas frecuentes - Solicitud del usuario - Llama ahora - Deja un mensaje de correo electrónico - Encontrar ubicaciones - Sin pagos - Borrar filtros - Administrar cuentas - Más - Ajustes - Idioma - Elige tu idioma - Notificaciones - URL principal - Inquilino - - - ¿Cómo solicitar una nueva cuenta de crédito? - ¿Dónde puedo ver información sobre mi perfil? - ¿Dónde puedo ver las transacciones de mi cuenta de ahorros? - ¿Cuál es el uso de un código QR? - ¿Cómo crear un beneficiario utilizando un código QR? - ¿Cómo hacer un pago para una cuenta de crédito? - - - - Para solicitar una cuenta de crédito, haga clic en \"Informe de solicitud de préstamo\" en la pantalla de inicio. - Puede ver la información de su perfil haciendo clic en la imagen del perfil en la página principal de la aplicación. - Para ver las transacciones en su cuenta de ahorros, vaya a la sección Cuentas, haga clic en la cuenta de ahorros requerida, haga clic en los tres puntos presentes en la esquina superior derecha y seleccione la opción Transacción. - El código QR para todas las cuentas de crédito o de ahorro puede compartirse con otros usuarios que les permitirán crear un heredero - Para crear un heredero, vaya al heredero en la página principal de la aplicación, luego haga clic en el botón en la esquina inferior derecha, seleccione la opción de escaneo que abrirá la cámara del dispositivo, escanee el código QR de la persona para la que desea crear un heredero, después de completar los datos requeridos, crear herederos utilizando el código QR - Para realizar un pago de una cuenta de préstamo, vaya a la sección Cuentas, seleccione la opción PRÉSTAMO, luego abra la cuenta de crédito objetivo y haga clic en la opción Realizar un pago. - - - - El saldo total del ahorro. - El saldo total del préstamo. - Más arriba está el saldo de la cuenta bancaria y la cuenta de ahorros calculada sobre la base de todas las cuentas de ahorros y préstamos. - ¿Seguro que quieres cancelar la transferencia? - Tan - Confirmar contraseña - La contraseña no coincide. - Versión%1$s - Todos los derechos reservados. - La concesión de licencias - No se puede hacer una transferencia, por favor intente de nuevo más tarde - Por favor espere₀ - Mensaje - Sin notificación - - Actualizar punto final - Haga clic aquí para cambiar las configuraciones de punto final. - Introduce la URL principal - Ir al inquilino - Informacion de la applicacion - No se pudo entrar Inténtelo más tarde. - \ No newline at end of file diff --git a/androidApp/src/main/res/values-fa-rAF/strings.xml b/androidApp/src/main/res/values-fa-rAF/strings.xml deleted file mode 100644 index ea2f3b877..000000000 --- a/androidApp/src/main/res/values-fa-rAF/strings.xml +++ /dev/null @@ -1,437 +0,0 @@ - - - - Mifos Mobile - درباره ما - "درباره ما در ساخت و ساز " - موجودی حساب - شناسه حساب - برای انجام سپرده باید حساب فعال باشد - برای انجام انتقال باید حساب کاربری فعال باشد - شماره حساب - A/C - وضعیت حساب - نوع حساب - حساب ها - نمای کلی حساب - تاریخ فعال سازی - فعال - فعال - اضافه کردن - ذینفع اضافه کنید - ذینفعان شخص ثالث را به حساب خود اضافه کد.ی را وارد کنید یا کد QR حساب را اسکن کنید - ضمانت را اضافه کنید - ویجت را اضافه کنید - همه - کلیه حقوق محفوظ است - استهلاک - مقدار - مقتضی: - مقدار باید بیشتر از صفر باشد - برجسته: - پرداخت شده: - موج دار: - نرخ بهره سالانه - درخواست دادن - درخواست وام دهید - درخواست حساب پس انداز - در انتظار تایید - تایید شده - مثال - تأیید اعتبار - تعادل - پایه ای - بهره بردار - ذینفع - ذینفع با موفقیت ایجاد شد - ذینفع با موفقیت حذف شد - جزئیات بهره بردار - نام ذینفع - ذینفع با موفقیت به روز شد - تماس بگیر - لغو - آیا مطمئن هستید که می خواهید انتقال را لغو کنید؟ - گذرواژه حساب خود را تغییر دهید - تغییر کد عبور برنامه - تغییر کد عبور - تغییر رمز عبور - هزینه ها - برنامه را انتخاب کنید - نوع حساب راانتخاب کنید - زبان خود را انتخاب کنید - گزینه را انتخاب کنید - نوع انتقال را انتخاب کنید - فیلترها را پاک کنید - حساب های مشتری - هزینه مشتری - طبقه بندی مشتری - نام مشتری - نوع مشتری - مشتری - مشتری را انتخاب کنید - بستن - کشو را ببندید - بسته شد - به دلیل برخی تعهدات بسته شد - رمز عبور را تأیید کنید - ادامه هید - ایجاد یک حساب کاربری - واحد پول - گذرواژه فعلی - تاریخ - حذف - ذینفع را حذف کنید - مطمئن هستید که می خواهید این مزایا را حذف کنید - ضمانت را حذف کنید - سپرده - جزئیات - تنظیمات برنامه - بازگشت - لغو - من مطمئن هستم - تأیید - دوباره امتحان کنید - آیا برای خارج شدن مطمئن هستید؟ - بدون مجوز دوربین شما قادر به اسکن کد QR برای اضافه کردن ذینفع نخواهید بود. آیا مطمئن هستید که می خواهید این مجوز را انکار کنید؟ - شما مجوز استفاده از دوربین را رد کرده اید ، بدون این مجوز قادر نخواهید بود با استفاده از QR Code ذینفعان اضافه کنید. لطفاً آن را در تنظیمات فعال کنید - این مجوز برای نشان دادن ارز با توجه به کشور شما لازم است. آیا مطمئن هستید که می خواهید آن را انکار کنید؟ - شما اجازه واکشی حالت تلفن را رد کرده اید ، بدون این مجوز ممکن است ارز با فرمت مناسب نشان داده نشود. لطفاً آن را در تنظیمات فعال کنید - شما مجوز خواندن ذخیره سازی را رد کرده اید ، بدون این مجوز قادر نخواهید بود با استفاده از QR Code ذینفعان اضافه کنید. لطفاً آن را در تنظیمات فعال کنید - بدون اجازه ذخیره نمی توانید کد QR را برای اضافه کردن ذینفع بارگذاری کنید. آیا مطمئن هستید که می خواهید این مجوز را انکار کنید؟ - شما مجوز نوشتن در انبار را رد کرده اید ، بدون این مجوز قادر نخواهید بود با استفاده از QR Code ذینفع اضافه کنید. لطفاً آن را در تنظیمات فعال کنید - اجازه رد شد - پرداخت - تاریخ پرداخت - پرداخت سود سهام - سر رسید - سر رسید: - ویرایش - پست الکترونیک - هیچ حساب قرضه مربوط به شما وجود ندارد - هیچ برنامه ای بازپرداخت وجود ندارد - هیچ حساب پس انداز مرتبط با شما وجود ندارد - هیچ حساب اشتراکی مربوط به شما وجود ندارد - هیچ معاملات مربوط به شما وجود ندارد - تاریخ پایان - تاریخ پایان باید بیشتر از تاریخ شروع باشد - شماره حساب ذینفع را وارد کنید - مقدار را وارد کنید - URL Base را وارد کنید - نام ذینفع را وارد کنید - نام دفتر ذینفع را وارد کنید - کد عبور 4 رقمی را وارد کنید - اظهارات را برای انتقال وارد کنید - مستاجر را وارد کنید - حد انتقال را وارد کنید - خطا در بارگیری در هزینه مشتری - خطا در بارگیری لیست مشتری - مشتری یافت نشد - ایجاد ذینفع انجام نشد - حذف ذینفع انجام نشد - "خطا در واگذاری قالب حساب انتقال " - واگذاری حساب ها انجام نشد - واگذاری مجوزها انجام نشد - واگذاری قالب ذینفع انجام نشد - واگذاری مشتری انجام نشد - خطا در واگذاری تصویر - واگذاری برنامه بازپرداخت انجام نشد - قالب بارگیری نشد - خطا در بارگیری قالب انتقال شخص سوم - بارگیری نمایه کاربر انجام نشد - خطایی در سرور داخلی ، لطفاً دوباره امتحان کنید - ایمیل نامعتبر است - خطا در بارگیری در جزئیات حساب قرضه - خطایی در برداشت حساب قرضه - خطا در بارگیری در لیست حساب های قرضه - خطا در بارگیری پاسخ از سرور - اتهامی یافت نشد - کد عبور باید 4 رقمی باشد - رمز عبور مطابقت ندارد. - هنگام خواندن QR خطایی وجود دارد ، مطمئن شوید منطقه مناسبی را انتخاب کرده اید - خطا در بارگیری در معاملات اخیر - با همان حساب قابل انتقال نیست - خطا در بارگیری در ذخیره جزئیات حساب - خطا در بارگیری در ذخیره لیست حساب ها - " سرور از کار افتاد ، بعد از مدتی امتحان کنید " - نام کاربری / رمز عبور نامعتبر است - به روزرسانی ذینفع انجام نشد - نام کاربری باید از 6 الفبا بیشتر باشد - دوباره به عقب فشار دهید تا خارج شوید - تاریخ پرداخت پیش بینی شده - سوالات متداول - کسر هزینه - هزینه - هزینه پرداخت - واگذاری مشتری - فیلتر - حساب های قرضه را فیلتر کنید - حساب های پس انداز را فیلتر کنید - حساب اشتراکی را فیلتر کنید - فیلتر شده - یافتن مکان - نام - رمز عبور را فراموش کرده اید؟ ، به صورت دستی وارد شوید - یافت - 4 هفته - انتقال سرمایه - جنسیت - گروه ها - جزئیات ضامن - نوع ضمانت - کمک - راهنما در دست ساخت - خانه - وارد QR - در عقب افتادگی ها - غیر فعال - غیر فعال - وام تولید درآمد - کد عبور نادرست - شما بیش از 3 بار گذرواژه اشتباه را وارد کرده اید - علاقه - دوره محاسبه ای سود - نرخ سود متهم شد - سود پرداخت شد - ارسال علاقه - امتناع کرد از سود - لطفاً مطمئن شوید که به اینترنت متصل هستید - مقدار نامعتبر است - شما نمی توانید وارد حساب خود شوید ، لطفاً کد QR حساب پس انداز و وام کاربر را اسکن کنید - تاریخ عضویت - زبان - متن بزرگ - نام خانوادگی - آخرین جزئیات معامله - آخرین معامله - یک ایمیل بگذارید - مجوزها - قرضه - حساب قرضه - جزئیات حساب قرضه - حساب قرضه با موفقیت برداشت شد - پرداخت شده - درخواست قرضه با موفقیت ارسال شد - برنامه قرضه با موفقیت به روز شد - برنامه قرضه با موفقیت برداشت شد - توازن قرض - هزینه های قرضه - قرضه بسته شد - نوع سود - نام قرضه - محصول قرضه - نام محصول - هدف قرضه - ارائه نشده است - بازپرداخت قرضه - برنامه بازپرداخت - خلاصه قرضه - جزئیات حساب قرضه - نوع قرضه - ورود به سیستم - آیا مطمئن هستید که می خواهید با استفاده از رمز ورود به سیستم وارد شوید؟ - خروج - ساخته شده در - پرداخت - انتقال - انجام انتقال - مدیریت حسابها - ذینفعان را مدیریت کنید - خانه به صنعت بزرگ فناوری - سیاتل - بالغ - متن متوسط - پیام - حداقل تعادل مورد نیاز - مانیتور - هنگام یافتن فعالیت تنظیمات ، مشکلی پیش آمد. به \"تنظیمات\" بروید و به صورت دستی مجوز دهید. - به تأیید احتیاج دارید - با ما تماس بگیرید - درخواست قرضه جدید برای - رمز عبور جدید - برنامه جدید حساب پس انداز - حساب پس انداز جدید با موفقیت ایجاد شد. - اقساط بعدی - نه - در حال حاضر ، هیچ مزایایی ندارید. لطفاً ذینفع اضافه کنید - هیچ DOB یافت نشد. - بدون ضمانت - بدون اتصال به اینترنت - حساب قرضه - معاملات بیشتری در دسترس نیست - بدون اطلاع رسانی - تعداد پرداخت ها - ذخیره حساب - اشتراک حساب - بدون معامله - بدون برداشت - نرخ سود اسمی - هیچ کدام - قابل اجرا نیست - با هیچ گروهی واگذار نشده است - فاصله - اطلاعیه - نام دفتر - کشوی باز - دیگر - "مقدار پرداخت نا شده " - هزینه اضافه برداشت - اضافه پرداخت - کد عبور - کد عبور مطابقت ندارد. - یک رمز عبور برای ورود به سیستم تنظیم کنید - رمز عبور - متوسط - قوی - بسیار قوی - ضعیف - پرداخت از - پرداخت به - مجازات - مجازات برداشته شدند - در انتظار - اجازه استفاده از دوربین رد شد - اجازه ذخیره سازی رد شد - شماره تلفن - لطفا صبر کنید... - برای تغییر تنظیمات Endpoint خود اینجا را کلیک کنید - Endpoint را به روز کنید - " اصلی" - مقدار اصلی* - اصلی پرداخت شده - سیاست حفظ حریم خصوصی - ادامه دهید - تولید - محصول - بارگیری - ورود به سیستم - هدف قرضه * - پرسشنامه - کد QR - انتقال سریع - پست الکترونیک - تلفن - معاملات اخیر - لطفا کد عبور خود را دوباره وارد کنید - تازه کردن - ثبت نام - رد شد - انتقال رد شد - اظهار نظریه - اظهار نظر اجباری است - بازپرداخت - برنامه بازپرداخت - استراتژی بازپرداخت - درخواست شناسه - مرور - مرور - ذخيره - " اطلاعات صرفه جویی " - معاملات در حساب صرفه جوی - " حساب پس انداز با موفقیت به روز شد " - نام محصول - پس انداز - حساب پس انداز - معاملات حساب پس انداز - حساب پس انداز برداشت موفقیت آمیز است - هزینه های پس انداز - اسکن - جستجو کردن - نوع حساب را انتخاب کنید * - ذینفع را انتخاب کنید - لطفا تاریخ شروع و تاریخ پایان را انتخاب کنید - انتخاب محصول قرضه * - حالت را انتخاب کنید - حساب پرداخت را انتخاب کنید - برای پرداخت به حساب خود را انتخاب کنید - شناسه محصول را انتخاب کنید * - منطقه ای را با کد QR انتخاب کنید - تمام آنچه را که می خواهید درخواست کنید را انتخاب کنید - تنظیمات - اشتراک گذاری - حساب اشتراکی - کد QR را به اشتراک بگذارید - در انتظار - ثبت نام - 6 ماه - جست - متن کوچک - تاریخ شروع - تصویر وضعیت - تاریخ ارسال - ارسال - ارسال ذینفع - " ارسال قرض" - ارسال شده - نمایش یا پنهان کردن کل مبلغ پس انداز - نمایش یا پنهان کردن کل مبلغ وام - ***** - بررسی ها - برای افزودن ضمانت بر روی ضربه بزنید - مستاجر - انتقال شخص ثالث - 3 ماه - جمع: - کل سپرده ها - مجموع قروض - بيلانس مجموعي قروض - مانده حساب وام و پس انداز از طرف تمام حساب پس انداز و قرضه شما محاسبه می شود. - مجموع پرداختی - بازپرداخت کل پیش بینی شده - مجموع پس انداز - مجموع موجودی پس انداز - مجموع برداشت ها - دوره معامله - نوع معامله - معاملات - انتقال - تاریخ انتقال - انتقال نا موفق بود، لطفا بعدا دوباره امتحان کنید - انتقال از - انتقال از پس انداز - حد انتقال - انتقال به - انتقال به پس انداز - با موفقیت منتقل شد - به اینترنت متصل نیست - شما حق استفاده را ندارید - به روز رسانی - ذینفع را به روز کنید - ضمانت را به روز کنید - قرضه را به روز کنید - به روزرسانی برنامه قرضه برای - حساب پس انداز را به روز کنید - QR را بارگذاری کنید - جزئیات کاربر - پرسش کاربر - نام کاربری - حالت تأیید - کاربر با موفقیت تأیید شد - تأیید کنید - تأیید - مشاهده هزینه ها - ضمانت را مشاهده کنید - مشاهده خلاصه قرضه - کد QR را برای این حساب مشاهده کنید - مشاهده برنامه بازپرداخت - معاملات را مشاهده کنید - در انتظار - منتظر اعزام - برداشت قرضه - دلیل برداشت قرضه - برداشت حساب پس انداز - برداشت از حساب - تاریخ برداشت - انتقال برداشت - برداشت - کار کردن - بلي - اطلاعات برنامه - ورود ناموفق بود، لطفاً بعداً دوباره امتحان کنید. - \ No newline at end of file diff --git a/androidApp/src/main/res/values-fr/strings.xml b/androidApp/src/main/res/values-fr/strings.xml deleted file mode 100644 index eb067a45d..000000000 --- a/androidApp/src/main/res/values-fr/strings.xml +++ /dev/null @@ -1,431 +0,0 @@ - - - - Se connecter - Bonjour, %1$s. - Pas de connexion internet - Primaire - Nom d\'utilisateur - Se connecter - Chargement - Mot de passe - Adresse e-mail - Comptes - Clientèle - Transfert de fonds - Transactions récentes - Honoraires - Questionnaire - À propos de nous - Enregistrer les détails du compte - Compte d\'épargne - Erreur lors du chargement des informations du compte de crédit - Taux d\'intérêt nominaux - Numéro de compte - Solde du compte - Total des dépôts - Ouvrez le panneau de navigation - Fermez le panneau de récupération - Page d\'accueil - Texte moyen - Petit texte - Comptes clients - Écran de bienvenue - Économie - Prêt - Compte créditeur - Part - Partagez votre compte - Choisissez un client - Travail - Image de l\'état - Calendrier de remboursement - Dernière transaction - Fabriqué sur - Faire un transfert - Choisissez un produit de crédit * - Objet du prêt * - Le montant principal * - Nombre - Prudence - Date de paiement attendue - Date limite de soumission - Uploads - Frais - Date de transfert - Demander un prêt - Mettre à jour le prêt - Libérer le prêt - La raison pour payer le prêt - Le compte de prêt a été retiré avec succès - Soumettre un prêt - Nouvelle demande de crédit pour - Mettez à jour votre demande de crédit pour - Type d\'intérêt - Amortissement - Période d\'intérêt - Stratégie de remboursement - Paiement à - Paiement de - Annuler - Avant-première - Transférer à - Transfert de - Faire un transfert - Dépôt - Entrez la quantité - La note est obligatoire - Approuvé - Par anticipation - Payé - Équilibre - Rejeté - Attente - Surpayé - En retard - Choisissez tout ce que vous voulez appliquer - Filtrer les comptes d\'épargne - Filtrer les comptes de crédit - Filtrer le partage de compte - Recherche - Sélectionnez l\'option Compte à payer - Choisissez un compte pour payer avec - Entrer les notes à transférer - Sélectionnez le bénéficiaire - Plus - Près - Choisissez le type de transfert - Virement à l\'épargne - Virement d\'épargne - Frais de prêt - Épargnes - Actif - Fermé - Retiré - Nécessite l\'approbation - Par anticipation - Mature - Créer un compte - Nom - Nom - Numéro de téléphone - S\'inscrire - Demande d\'identité - Jeton d\'authentification - Vérifier - Vérification - Se connecter - L\'utilisateur a été vérifié avec succès - Mobile - Adresse e-mail - Mode de vérification - Vide - Importer QR - Voir le garant - Ajouter un garant - Retirer le garant - Mettre à jour le garant - Type de garant - Pas de garants - Appuyez sur pour ajouter un garant - Détails du garant - Date de fixation - Soumettre - - Le compte doit être actif pour effectuer un dépôt - Le compte doit être actif pour effectuer un transfert - - Il n\'y a pas de compte d\'épargne lié à vous - Aucun compte de prêt ne vous est associé. - Aucun compte partagé ne vous est associé. - Il n\'y a aucune transaction liée à vous - Aucun calendrier de remboursement ne vous est associé. - Aucune transaction disponible - Aucune transaction - Date de naissance non trouvée. - Non affecté à un groupe - - Nom d\'utilisateur / mot de passe incorrect - Erreur lors de l\'obtention d\'une réponse du serveur - %1$s ne peut pas être vide - %1$s ne peut pas être inférieur à %2$d caractères - %1$s ne peut pas contenir %2$s - %1$s ne peut pas commencer ou se terminer par un espace - Erreur sur le serveur interne, réessayez plus tard - Une erreur s\'est produite lors du chargement de la liste de clients - Erreur lors du chargement de la liste des comptes de prêt - Erreur lors du chargement de la liste des comptes d\'épargne - Erreur lors du chargement des détails sur les comptes d\'épargne - Une erreur s\'est produite lors du chargement dans les transactions récentes - Erreur lors du chargement des comptes clients - Client non trouvé - Le client n\'a pas pu être téléchargé - Impossible de télécharger le profil de l\'utilisateur - Impossible de télécharger des comptes - Le calendrier de remboursement ne peut pas être récupéré - Vous ne pouvez pas effectuer de transfert sur votre propre compte - Le modèle de transfert n\'a pas pu être téléchargé - Les crédits n\'ont pas pu être obtenus - Le modèle de l\'héritier n\'a pas pu être téléchargé - Le modèle n\'a pas pu être téléchargé - L\'héritier n\'a pas réussi - L\'héritier n\'a pas été mis à jour - L\'héritier n\'a pas pu être enlevé - Le compte de prêt n\'a pas pu être retiré - Erreur lors du téléchargement du modèle de transfert tiers - Vous n\'avez actuellement aucun héritier. Ajouter l\'héritier - - Vous n\'êtes pas autorisé - Code QR - Partager le code QR - Moniteur - Choisissez une option - Voir les transactions - Voir les frais - Voir le résumé du prêt - Voir le calendrier de remboursement - Voir le code QR pour ce compte - Détails de la dernière transaction - Le nom d\'utilisateur doit comporter plus de 6 caractères. - Identifiant email invalide - Serveur en panne, essayez après un certain temps - Frais de client - Erreur de lecture du code QR, assurez-vous de choisir la bonne région. - Erreur lors du téléchargement de l\'image - Téléchargement du client - - Espaces - Nom du client - État du compte - Nom du produit - Paiement total - Balle minimale requise. - Nom du produit - But du prêt - Directeur - Principal payé - Taux d\'intérêt annuel - Intérêts courus - Intérêts payés - Détails du compte de crédit - Résumé du prêt - Le nom du prêt - Intérêt - Honoraires - Pénalités - Paiement total attendu - Total payé - Intérêt renoncé - Pénalité brisée - La taxe est levée - Solde exceptionnel - Prochain versement - Date limite de paiement - Faire un paiement - Le type de prêt - Monnaie - Calendrier de remboursement - Transactions - Transfert - Approbation en cours - En attente de paiement - Fermé en raison d\'obligations - Prêt fermé - Par date: - Par: - Payés: - Cédé: - En retard: - EXEMPLE - Ajouter un widget - Aider - Détails du compte de prêt - Demande de crédit envoyée avec succès - La demande de prêt a été mise à jour avec succès - Demande de prêt retirée avec succès - Rien - Tous - 4 semaines - Trois mois - 6 mois - Filtre - Date de début - Date de fin - Filtré - Choisissez la date de début et de fin - La date de fin doit être supérieure à la date de début - Enregistrement des transactions sur votre compte - Pas de connexion internet - Date de paiement - Le nombre de paiements - Date - Solde du prêt - Remboursement - Remboursement de prêt - Transfert rapide - Assurez-vous d\'avoir une connexion internet - Héritier - Gérer les héritiers - Les descendants - Détails de l\'héritier - Nom de l\'héritier - Type de compte - Limite de transfert - Ajouter l\'héritier - Le nom du bureau - Choisissez le type de compte * - Soumettre un héritier - Entrez le nom du bureau de l\'héritier - Entrez le nom de l\'héritier - Entrez la limite de transfert - Entrez le numéro de compte de l\'héritier - Sélectionnez le type de compte dans le menu déroulant. - L\'héritier a été créé avec succès - L\'héritier a été mis à jour avec succès - Mettez à jour votre héritier - Enlever l\'héritier - Êtes-vous sûr de vouloir supprimer cet héritier? - Effacer - L\'héritier a été enlevé - Transfert d\'un tiers - Prêt total - Total épargne - Aperçu du compte - Afficher ou masquer le montant total du prêt - ***** - Enquêtes - Date d\'activation - Groupe - Données utilisateur - Type de client - Classement client - Choisissez le mode - Ajoutez des héritiers externes à votre compte. \ nEntrer manuellement ou scanner le code QR du compte - Vous ne pouvez pas effectuer d\'actions sur votre compte, scanner le code QR du compte d\'épargne ou du compte de prêt d\'un autre utilisateur - Ajouter - Balayage - Entrez le code d\'accès à 4 chiffres - Le code d\'accès doit être composé de 4 chiffres - Code d\'accès incorrect - Vous avez entré le mauvais code d\'accès plus de 3 fois - Sauter - Enregistrer - Définissez le code PIN pour vous connecter - Re-entrer la broche - Le code d\'accès ne correspond pas. - J\'ai oublié le code PIN, je vais me connecter avec le mot de passe - Continuer - Le montant doit être supérieur à zéro - Bookmark A propos de nous en construction - Assistance en construction - Deconnexion - Téléchargez l\'application Self Service ici: https://play.google.com/store/apps/details?id= - Sélectionnez l\'application - LA - Soumettre un QR - Choisissez une région avec un code QR - - Nous contacter - Transfert réussi - - Total: - - A / C - Produit de prêt - Inactif - ACTIVE - INACTIVE - - - Êtes-vous sûr de vouloir vous déconnecter? - Bien - Annuler - Retour - Accès refusé - Je suis sur - Veuillez réessayer - Paramètres de l\'application - Sans la permission d\'utiliser l\'appareil photo, vous ne pourrez pas scanner le code QR pour ajouter l\'héritier. Êtes-vous sûr de vouloir interdire cette fonctionnalité? - Vous avez refusé la permission d\'utiliser la caméra. Sans cette permission, vous ne pourrez pas ajouter d\'héritiers à l\'aide du code QR. Activer dans les paramètres - Sans la permission de lire de la mémoire, vous ne pourrez pas envoyer de code QR pour ajouter l\'héritier. Êtes-vous sûr de vouloir interdire cette fonctionnalité? - Vous avez refusé la permission de lire dans la mémoire de l\'appareil. Sans cette permission, vous ne pourrez pas ajouter d\'héritiers à l\'aide du code QR. Activer dans les paramètres - Vous avez refusé d\'écrire dans la mémoire de l\'appareil. Sans cette autorisation, vous ne pourrez pas ajouter d\'héritiers à l\'aide du code QR. Activer dans les paramètres - Cette autorisation est nécessaire pour afficher la devise en fonction du pays. Êtes-vous sûr de vouloir interdire cette fonctionnalité? - Vous avez refusé la permission de lire le statut du périphérique. Sans cette permission, la devise pourrait ne pas s\'afficher au format correct. Activer dans les paramètres - Une erreur s\'est produite lors de la recherche d\'activité dans les paramètres. \ nAccédez à "Paramètres" et accordez les autorisations manuellement. - Les refus de stockage ont été refusés - Êtes-vous sûr de vouloir %1$s? - - - Bonjour, %1$s - Montant invalide - Appuyez à nouveau pour quitter - - Refus de l\'autorisation d\'utiliser l\'appareil photo - - Foire Aux Questions - Demande de l\'utilisateur - Appelez maintenant - Laisser un message électronique - Trouver des lieux - Aucun paiement - Effacer les filtres - Gérer les comptes - Plus - Paramètres - Langue - Choisissez votre langue - Notifications - URL primaire - Locataire - - - Comment demander un nouveau compte de crédit? - Où puis-je voir les informations sur mon profil? - Où puis-je voir les transactions de mon compte d\'épargne? - Quelle est l\'utilisation d\'un code QR? - Comment créer un bénéficiaire à l\'aide d\'un code QR? - Comment faire un paiement pour un compte de crédit? - - - - Pour demander un compte de crédit, cliquez sur \ "Signaler la demande de prêt \" sur l\'écran d\'accueil. - Vous pouvez afficher les informations de votre profil en cliquant sur l’image de profil sur la page principale de l’application. - Pour afficher les transactions dans votre compte d\'épargne, allez à la section Comptes, cliquez sur le compte d\'épargne requis, cliquez sur les trois points présents dans le coin supérieur droit et sélectionnez l\'option Transaction. - Le code QR de tous les comptes de crédit ou d’épargne peut être partagé avec d’autres utilisateurs qui leur permettront de créer un héritier - Pour créer un héritier, allez à l\'héritier sur la page principale de l\'application, puis cliquez sur le bouton dans le coin inférieur droit, sélectionnez l\'option de numérisation qui ouvrira la caméra de l\'appareil, scannez le code QR de la personne pour laquelle vous souhaitez créer un héritier, après avoir rempli les données requises, créer des héritiers en utilisant le code QR - Pour effectuer un paiement pour un compte de prêt, allez à la section Comptes, sélectionnez l\'option PRÊT, ouvrez le compte de crédit cible et cliquez sur l\'option Effectuer un paiement. - - - - Le solde total de l\'épargne - Le solde total du prêt - Ci-dessus le solde du compte bancaire et du compte d’épargne calculé sur la base de tous les comptes d’épargne et de prêt - Êtes-vous sûr de vouloir annuler le transfert? - Si - Confirmer le mot de passe - Le mot de passe ne correspond pas. - Version %1$s - Tous droits réservés. - Licence - Impossible d\'effectuer un transfert, veuillez réessayer ultérieurement - S\'il vous plaît attendez… - Message - Aucune notification - - Mettre à jour le point final - Cliquez ici pour modifier les configurations de point final - Entrez l\'URL primaire - Aller au locataire - Informations sur l\'application - Afficher ou masquer le montant total de l\'épargne - Authentification échouée, essayez plus tard. - \ No newline at end of file diff --git a/androidApp/src/main/res/values-hi/strings.xml b/androidApp/src/main/res/values-hi/strings.xml deleted file mode 100644 index 74c44b9c9..000000000 --- a/androidApp/src/main/res/values-hi/strings.xml +++ /dev/null @@ -1,546 +0,0 @@ - - - - Mifos Mobile - लॉग इन करें - स्वागत हे %1$s - इंटरनेट से कनेक्ट नहीं है - बुनियादी - उपयोगकर्ता का नाम - लॉगिन हो रहा है - लोड हो रहा है - पासवर्ड - ईमेल - खाता - ग्राहकों - फंड ट्रांसफर - हाल ही के लेनदेन - प्रभार - प्रश्नावली - हमारे बारे में - बचत खाते का विवरण - बचत खाता - ऋण खातों के विवरण में लोड करने में त्रुटि - मामूली ब्याज दर - खाता बनाएं - खाता संख्या - खाते में शेष - कुल जमा - Open Drawer - Close Drawer - होम - Medium Text - Small Text - ग्राहक खाते - Splash - बचत - ऋण - ऋण खाता - बचत प्रभार - शेयर - शेयर खाता - एक ग्राहक चुनें - काम कर रहे - जमा किया गया - अदायगी - स्थिति छवि - पुनः भुगतान कार्यक्रम - पिछले लेनदेन - बनाया गया - ट्रांसफर करें - अंतिम नाम - फ़ोन नंबर - ईमेल - मोबाइल - सत्यापन मोड - ऋण उत्पाद चुनें* - ऋण का उद्देश्य* - मुख्य राशि* - रकम - टिप्पणी - अपेक्षित वितरण तिथि - जमा की तारीख - ट्रांसफर की तारीख - ऋण के लिए आवेदन करें - ऋण को अपडेट करें - ऋण वापस ले लें - ऋण वापस लेने का कारण - ऋण खाता सफलतापूर्वक वापस ले लिया गया - समीक्षा करें - ऋण जमा करें - नया ऋण आवेदन: - ऋण आवेदन अपडेट करें: - ब्याज प्रकार - ऋणपरिशोध - ब्याज गणना अवधि - चुकौती रणनीति - को भुगतान करें - से भुगतान करें - रद्द करें - ट्रांसफर की समीक्षा - के लिए ट्रांसफर - इससे ट्रांसफर करें - ट्रांसफर कर रहे हैं - जमा - राशी डालें - ट्रांसफर के लिए टिप्पणी दर्ज करें - लाभार्थी का चयन करें - टिप्पणी अनिवार्य है - मंजूर - अपूर्ण - भुगतान किया गया - शेष - अस्वीकृत - इंतज़ार - रजिस्टर - अनुरोध आईडी - अधिक भुगतान - बकाया राशि में - उन सभी का चयन करें जिन्हें आप आवेदन करना चाहते हैं - बचत खाते को फ़िल्टर करें - ऋण खातों को फ़िल्टर करें - शेयर खाते फ़िल्टर करें - खोजें - ट्रांसफर टाइप चुनें - सक्रिय - बन्द है - अनुमोदन आवश्यक - अपूर्ण - परिपक्व - आगे बढ़ें - बंद करें - बचत खाते में स्थानांतरण - बचत खाते से स्थानांतरण - Withdrawn -   - क्यूआर आयात करें - प्रमाणीकरण चिह्न - प्रमाणित करे - प्रमाणित किया जा रहा है - साइन उप हो रहा है - उपयोगकर्ता को सफलतापूर्वक सत्यापित किया गया है - टच आईडी का प्रयोग करें - गारंटर देखें - गारंटर जोड़ें - गारंटर हटाएं - गारंटर को अद्यतन करें - गारंटर का प्रकार - कोई गारंटर नहीं - गारंटर जोड़ने के लिए टैप करें - गारंटर विवरण - शामिल होने की तारीख - जमा करे - उत्पाद आईडी चुनें - खाता आईडी - नया बचत खाता आवेदन - बचत खाता अद्यतन करें - बचत खाता निकालें - वापसी की तारीख - नया बचत खाता सफलतापूर्वक बनाया गया। - बचत खाता सफलतापूर्वक अपडेट किया गया - बचत खाते से निकासी सफल - %1$s बचत खाता - लागू करे - बचत खाता लागू करें - अद्यतन करे - संपादित करें - पासकोड - अन्य - लिंग - नहीं - मिलाx - - आपके पास कोई बचत खाता नहीं है - आपके पास कोई ऋण खाता नहीं है - आपके साथ कोई साझा खाता नहीं है - आपके साथ कोई लेन-देन जुड़े नहीं है - आपके साथ संबद्ध कोई भी पुनर्भुगतान शेड्यूल नहीं है - कोई और लेनदेन उपलब्ध नहीं है - कोई लेनदेन नहीं - कोई जन्मतिथि नहीं मिली. - किसी भी समूह के साथ नियुक्त नहीं - - स्थानांतरण पूर्ण करने में असमर्थ, कृपया बाद में फिर से प्रयास करेंं - - अमान्य उपयोगकर्ता नाम / पासवर्ड - सर्वर से प्रतिक्रिया लोड करने में त्रुटि - %1$s खाली नहीं हो सकता है - %1$s %2$d वर्णों से कम नहीं हो सकता - %1$s में %2$s शामिल नहीं हो सकते - आंतरिक सर्वर में त्रुटि, कृपया फिर से प्रयास करें - क्लाइंट सूची को लोड करने में त्रुटि - ऋण खातों की सूची में लोड करने में त्रुटि - बचत खातों की सूची को सहेजने में त्रुटि हो रही है - बचत खातों की विवरण में लोड करने में त्रुटि - - - क्यूआर कोड - हालिया लेनदेन में लोड करने में त्रुटि - क्लाइंट शुल्क में लोड करने में त्रुटि - कोई शुल्क नहीं मिला - ग्राहक नहीं मिला - ग्राहक लाने में विफल - उपयोगकर्ता प्रोफ़ाइल लाने में विफल - खाते को लाने में विफल - चुकौती कार्यक्रम प्राप्त करने में विफल - एक ही खाते में ट्रांसफर नहीं कर सकते - खाता ट्रांसफर टेम्पलेट को लाने में त्रुटि - लाभार्थियों को लाने में असफल - लाभार्थी टेम्प्लेट लाने में विफल - उपयोगकर्ता विवरण - सक्रियण दिनांक - क्लाइंट टाइप - समूह - क्लाइंट वर्गीकरण - टेम्पलेट को लाने में विफल - लाभार्थी बनाने में विफल - लाभार्थी को अपडेट करने में विफल - लाभार्थी को हटाने में विफल - ऋण खाता वापस लेने में त्रुटि - -वर्तमान में, आपके पास कोई लाभार्थी नहीं है। कृपया लाभार्थी जोड़ें - - आप अधिकृत नहीं है - - आप अपने खाते में कार्रवाई नहीं कर सकते हैं, कृपया अन्य उपयोगकर्ता के बचत और ऋण - खाते के क्यूआर को स्कैन करें - जोड़ें - स्कैन - मोड का चयन करें - यहां सेल्फ सर्विस ऐप डाउनलोड करें: https://play.google.com/store/apps/details?id= - 4 अंकों का पासकोड दर्ज करें - पासकोड 4 अंकों का होनी चाहिए - पासकोड गलत है - आपने 3 बार से अधिक गलत पासकोड दर्ज किया है - पासकोड भूल गए, मैन्युअल रूप से लॉगिन करें - आगे बढ़ें - छोड़ दें - सहेजें - राशि शून्य से अधिक होनी चाहिए - निर्माण के तहत सहायता - लॉग आउट - ऋण प्रभार - लेनदेन देखें - प्रभार देखें - ऋण सारांश देखें - पुनर्भुगतान शेड्यूल देखें - क्यूआर कोड साझा करें - निगरानी करें - विकल्प चुनें - इस खाते के लिए क्यूआर कोड देखें - पिछले लेनदेन का विवरण - लॉगिन करने के लिए एक पासकोड सेटअप करें - कृपया अपना पासकोड दोबारा दर्ज करें - पासकोड मेल नहीं खा रहा है - - थर्ड पार्टी ट्रांसफर टेम्प्लेट को लाने में त्रुटि - एप्लिकेशन चुनें - क्यूआर अपलोड करें - क्यूआर कोड वाले क्षेत्र का चयन करें - - उपयोगकर्ता नाम 6 अक्षरों से अधिक होना चाहिए - अमान्य ईमेल आईडी - सर्वर डाउन है, कुछ देर बाद प्रयास करें - ग्राहक शुल्क - क्यूआर पढ़ते समय त्रुटि हुई, सुनिश्चित करें कि आपने उचित क्षेत्र का चयन किया है - तस्वीर लाने में त्रुटि - अमान्य फोन नंबर - - क्लाइंट ला रहा है - - Spaces - ग्राहक का नाम - खाते की स्थिति - उत्पाद का नाम - कुल निकासी - न्यूनतम आवश्यक शेष राशि - उत्पाद का नाम - ऋण का उद्देश्य - मुख्य राशि - मुख्य संवितरित राशि - वार्षिक ब्याज दर - ब्याज लगाया - ब्याज भुगतान - ऋण खाते का विवरण - ऋण सारांश - ऋण का नाम - ब्याज - फीस - दंड - कुल अपेक्षित पुनर्भुगतान - कुल भुगतान - ब्याज पर छूट - दंड पर छूट - फीस पर छूट - बकाया राशि - अगली किस्त - नियत तारीख - भुगतान करो - ऋण प्रकार - मुद्रा - पुनः भुगतान कार्यक्रम - लेन-देन - ट्रांसफर - स्वीकृति लंबित - व्यय की प्रतीक्षा की जा रही है - कुछ दायित्वों के कारण बंद - ऋण बंद - नियत तारीख: - देय राशि: - भुगतान: - छूट दी गई राशि: - बकाया: - EXAMPLE - Add widget - मदद - मिफोस इनिशिएटिव - मिफोस इनिशिएटिव , सिएटल, वॉशिंगटन 98121 - सिएटल - बड़े तकनीक उद्योग के लिए घर - ऋण खाते का विवरण - लोन आवेदन सफलतापूर्वक जमा - ऋण आवेदन सफलतापूर्वक अपडेट किया गया - ऋण आवेदन पत्र सफलतापूर्वक वापस लिया गया - कोई नहीं - सब - 4 सप्ताह - 3 महीने - 6 महीने - फिल्टर - आरंभ करने की तिथि - अंतिम तिथि - फ़िल्टर दकर िया गया - प्रारंभ तिथि और समाप्ति तिथि का चयन करें - समाप्ति तारीख आरंभ तारीख से बड़ी होनी चाहिए - बचत खाते का लेनदेन - कोई इंटरनेट कनेक्शन नहीं - संवितरण तिथि - भुगतान की संख्या - तारीख - ऋण की शेष राशि - चुकौती - ऋण भुगतान - शीघ्र ट्रांसफर - कृपया सुनिश्चित करें कि आप इंटरनेट से कनेक्ट हैं - लाभार्थी - लाभार्थियों को प्रबंधित करें - लाभार्थी - लाभार्थी विवरण - लाभार्थी का नाम - खाते का प्रकार - ट्रांसफर सीमा - लाभार्थी को जोड़ें - कार्यालय का नाम - अपने खाते में तीसरे पक्ष के लाभार्थी जोड़ें या तो मैन्युअल रूप से दर्ज करें या - खाता क्यूआर कोड को स्कैन करें - आय सृजन ऋण - लागू नहीं - 143.00 - खाता प्रकार चुनें* - लाभार्थी जमा करें - लाभार्थी कार्यालय का नाम दर्ज करें - लाभार्थी का नाम दर्ज करें - ट्रांसफर सीमा दर्ज करें - लाभार्थी की खाता संख्या दर्ज करें - ड्रॉपडाउन से खाता प्रकार चुनें - लाभार्थी सफलतापूर्वक बनाया - लाभार्थी सफलतापूर्वक अद्यतन - लाभार्थी को अपडेट करें - लाभार्थी को हटाएं - कुल ऋण - कुल बचत - खाता निरीक्षण - कुल बचत राशि दिखाएँ या छुपाएँ - कुल ऋण राशि दिखाएं या छुपाएं - ***** - सर्वेक्षण - पहला नाम - क्या आप वाकई इस लाभार्थी को हटाना चाहते हैं - क्या आप वाकई पासवर्ड का उपयोग करके लॉगिन करना चाहते हैं? - हटा दें - "हमारे बारे में" निर्माणाधीन - लाभार्थी सफलतापूर्वक हटा दिया गया - तृतीय पक्ष हस्तांतरण - - - हमसे संपर्क करें - - सफलतापूर्वक ट्रांसफर किया गया - - कुल: - - खाता - ऋण उत्पाद - िष्क्रिय - सक्रिय - निष्क्रिय - - - क्या आप लॉग आउट करना चाहते हैं? - ठीक - रद्द करें - वापस जाएं - अनुमति नहीं मिली - मुझे यकीन है - पुन: प्रयास करें - एप्लिकेशन सेटिंग - कैमरा अनुमति के बिना आप लाभार्थी को जोड़ने के - लिए क्यूआर कोड स्कैन नहीं कर पाएंगे। क्या आप वाकई इस अनुमति से इनकार करना चाहते हैं? - स्टोरेज की अनुमति के बिना आप लाभार्थी को जोड़ने के लिए क्यूआर कोड अपलोड नहीं कर पाएंगे। क्या आप वाकई इस अनुमति को अस्वीकार करना चाहते हैं? - आपने स्टोरेज को पढ़ने की अनुमति से इनकार कर दिया है, इस अनुमति के बिना आप क्यूआर कोड का उपयोग करके लाभार्थियों को नहीं जोड़ पाएंगे। कृपया इसे सेटिंग्स में सक्षम करें - आपने स्टोरेज को लिखने की अनुमति से इनकार कर दिया है, इस अनुमति के बिना आप क्यूआर कोड का उपयोग करके लाभार्थियों को नहीं जोड़ पाएंगे। कृपया इसे सेटिंग्स में सक्षम करें - - इस अनुमति के बिना, आप कैमरे का उपयोग - करने की अनुमति से वंचित हैं, आप क्यूआर कोड का उपयोग कर लाभार्थियों को नहीं जोड़ पाएंगे। - कृपया इसे सेटिंग्स में सक्षम करें - आपके देश के अनुसार मुद्रा दिखाने के - लिए इस अनुमति की आवश्यकता है। क्या आप वाकई इसे अस्वीकार करना चाहते हैं? - आपने फोन स्टेट को लाने की अनुमति - से इनकार कर दिया है, इस अनुमति के बिना उचित प्रारूप में दिखाया जा सकता है। कृपया इसे सेटिंग्स में सक्षम करें - सेटिंग गतिविधि ढूंढने में कुछ गलत हो गया - सेटिंग पर जाएं और स्वयं को अनुमति दें। - - स्टोरेज की अनुमति नहीं दी गयी - क्या आप निश्चित हैं कि आप ऐसा करना चाहते हैं %1$s? - लॉगिन के दौरान त्रुटि - - - - नमस्ते, %1$s - %1$.2f %2$s - %1$s %2$s - %1$s: %2$.2f - %1$s: %2$d - अवैध राशि - बाहर निकलने के लिए वापस बटन फिर से दबाएं - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 0 - - अक्सर पूछे जाने वाले प्रश्न - उपयोगकर्ता क्वेरी - कॉल करें - एक ईमेल छोड़ दो - स्थान ढूंढें - सेटिंग्स - भाषा - अपनी भाषा चुनिए - - कैमरे का उपयोग करने के लिए अनुमति अस्वीकृत - No withdrawals - फ़िल्टर हटाएँ - सूचनाएं - आधार यूआरएल - किराएदार - बचत खाता - ऋण खाते - Sharing Accounts - - ऋण उत्पाद चुनें - फ़िंगरप्रिंट का उपयोग करके साइन इन करें - अपना फ़िंगरप्रिंट स्कैन करें - - - Manage Accounts - More - Total Savings Balance - Total Loan Balance - Above Loan and Savings accout balance are - calculated on behalf of your all savings and loan accounts. - - क्या आप वाकई हस्तांतरण रद्द करना चाहते हैं? - हाँ - Confirm Password - Password doesnot match. - Version %1$s - ©2016-%1$s Mifos Initiative. - All rights reserved. - Licenses - गोपनीयता नीति - पासकोड बदलें - ऐप पासवर्ड बदलें - पासवर्ड बदलें - अपना खाता पासवर्ड बदलें - वर्तमान पासवर्ड - नया पासवर्ड - %1$s सफलतापूर्वक बदला गया - संदेश - कोई अधिसूचना नहीं - - जमा करने के लिए खाता सक्रिय होना चाहिए - स्थानांतरण करने के लिए खाता सक्रिय होना चाहिए - - - मैं नए ऋण खाते के लिए आवेदन कैसे करूं? - मैं अपना प्रोफ़ाइल विवरण कहां देख सकता हूं? - मैं अपने बचत खातों के लेन-देन कहां देख सकता हूं? - क्यूआर कोड का क्या उपयोग है? - क्यूआर कोड का उपयोग करने के लिए लाभार्थी कैसे बना सकते हैं? - किसी ऋण खाते के लिए भुगतान कैसे करें? - - - - लोन अकाउंट के लिए आवेदन करने के लिए होम स्क्रीन पर दी गई \ "ऋण के लिए आवेदन करें \" पर क्लिक करें - आप होम स्क्रीन पर मौजूद उपयोगकर्ता छवि उपस्थिति पर क्लिक करके अपनी प्रोफ़ाइल जानकारी देख सकते हैं - अपने बचत खाते के लेन-देन को देखने के लिए, खाता अनुभाग पर जाएं, आवश्यक बचत खाते पर क्लिक करें, ऊपर दायीं - ओर मौजूद तीन बिंदुओं पर क्लिक करें और लेनदेन विकल्प चुनें - किसी भी ऋण या बचत खातों के लिए क्यूआरकोड अन्य उपयोगकर्ताओं के साथ साझा किया जा सकता है जो - उन्हें लाभार्थी बनाने की अनुमति देगा। - लाभार्थी बनाने के लिए, होम स्क्रीन से लाभार्थी विकल्प पर क्लिक करें, नीचे दाईं ओर स्थित परिपत्र बटन पर क्लिक करें, - स्कैन करने का विकल्प चुनें, जो आपके डिवाइस के कैमरे को खोलता है, उस अन्य व्यक्ति के क्यूआर कोड को स्कैन करें जिसके - लिए आप लाभार्थी बनाना चाहते हैं, अन्य आवश्यक विवरणों को भरने के बाद, आप क्यूआर कोड का उपयोग कर लाभार्थी बनाने - में सक्षम होंगे - ऋण खाते के लिए भुगतान करने के लिए, खाता अनुभाग पर जाएं, ऋण चुनें और आवश्यक ऋण खाता खोलें - और भुगतान करें विकल्प पर क्लिक करें। - - कृपया प्रतीक्षा करें - अनुप्रयोग की जानकारी - विफल प्रवेश कृपया बाद में पुन: प्रयास करें। - समापन बिंदु अद्यतन करें - अपने समापन बिंदु कॉन्फ़िगरेशन को बदलने के लिए यहां क्लिक करें - बेस यूआरएल दर्ज करें - किरायेदार दर्ज करें - Refresh - - - कमज़ोर - मध्यम - मज़बूत - बहुत मजबूत - उपलब्ध नहीं कराया - विवरण - उत्पाद - - लाभांश भुगतान - निकासी - रुचि पोस्टिंग - शुल्क कटौती - निकासी स्थानांतरण - अस्वीकृत स्थानांतरण - ओवरड्राफ्ट शुल्क - बचत खाता लेनदेन - लेन-देन की अवधि - सौदे का प्रकार - प्रशन - सफलतापूर्वक लॉग आउट हो गए - - क्या आप नये खाते का पंजीकरण रद्द करना चाहते हैं? - पंजीकरण रद्द करें - - \ No newline at end of file diff --git a/androidApp/src/main/res/values-in/strings.xml b/androidApp/src/main/res/values-in/strings.xml deleted file mode 100644 index 95b39ad04..000000000 --- a/androidApp/src/main/res/values-in/strings.xml +++ /dev/null @@ -1,432 +0,0 @@ - - - - Masuk - Halo, %1$s. - Tidak ada koneksi internet - Primer - Nama pengguna - Login - Pemuatan - Kata sandi - E-mail address - Account - Pelanggan - Transfer dana - Transaksi terbaru - Biaya - Daftar pertanyaan - Tentang kami - Menyimpan detail akun - Rekening Tabungan - Kesalahan memuat informasi akun kredit - Suku bunga nominal - Nomor akun - Saldo akun - Total deposit - Buka Panel Navigasi - Tutup panel pemulihan - Halaman rumah - Teks sedang - Teks kecil - Akun pelanggan - Layar selamat datang - Hemat - Pinjaman - Akun kredit - Saham - Bagikan akun Anda - Pilih pelanggan - Kerja - Citra negara - Jadwal pembayaran kembali - Transaksi terakhir - Dibuat - Lakukan transfer - Pilih produk kredit * - Tujuan pinjaman * - Jumlah utama * - Jumlah - Hati-hati - Tanggal pembayaran yang diharapkan - Batas waktu untuk pengiriman - Upload - Biaya - Tanggal transfer - Ajukan pinjaman - Perbarui pinjaman - Bebaskan pinjaman - Alasan membayar pinjaman - Rekening pinjaman telah berhasil ditarik - Kirim pinjaman - Aplikasi kredit baru untuk - Perbarui aplikasi kredit Anda untuk - Jenis minat - Amortisasi - Periode bunga - Strategi pembayaran kembali - Pembayaran ke - Pembayaran dari - Membatalkan - Preview - Transfer ke - Transfer dari - Melakukan transfer - Deposito - Masukkan jumlahnya - Catatan adalah wajib - Disetujui - Dalam antisipasi - Dibayar - Keseimbangan - Ditolak - Menunggu - Membayar lebih - Tunggakan - Pilih semua yang ingin Anda terapkan - Filter rekening tabungan - Filter akun kredit - Filter berbagi akun - Pencarian - Pilih opsi Akun yang akan dibayar - Pilih akun untuk membayar - Masukkan catatan untuk ditransfer - Pilih penerima - Lebih lanjut - Dekat - Pilih jenis transfer - Transfer ke tabungan - Transfer dari tabungan - Biaya pinjaman - Tabungan - Aktif - Tertutup - Pendiam - Membutuhkan persetujuan - Dalam antisipasi - Dewasa - Buat akun - Nama - Nama - Nomor telepon - Mendaftarkan - Permintaan ID - Token autentikasi - Memeriksa - Memverifikasi - Login - Pengguna telah berhasil diverifikasi - Mobil - E-mail address - Mode verifikasi - Kosong - Impor QR - Lihat Penjamin - Tambahkan penjamin - Hapus penjaminnya - Perbarui penjamin - Jenis penjamin - Tanpa Jaminan - Ketuk untuk menambahkan penjamin - Rincian penjamin - Tanggal lampiran - Menyerahkan - - Akun harus aktif untuk melakukan setoran - Akun harus aktif untuk melakukan transfer - - Tidak ada rekening tabungan yang terhubung dengan Anda - Tidak ada rekening pinjaman yang terkait dengan Anda - Tidak ada akun bersama yang dikaitkan dengan Anda - Tidak ada transaksi yang terkait dengan Anda - Tidak ada jadwal pembayaran kembali yang terkait dengan Anda - Tidak ada transaksi yang tersedia - Tidak ada transaksi - DOB tidak ditemukan. - Tidak ditetapkan ke grup mana pun - - Nama pengguna / kata sandi salah - Kesalahan saat mendapatkan respons dari server - %1$s tidak boleh kosong - %1$s tidak boleh kurang dari %2$d karakter - %1$s tidak boleh berisi %2$s - %1$s tidak dapat memulai atau mengakhiri dengan spasi - Kesalahan pada server internal, coba lagi nanti - Terjadi kesalahan saat memuat daftar pelanggan - Kesalahan memuat daftar akun pinjaman - Kesalahan memuat daftar rekening tabungan - Kesalahan memuat detail tentang rekening tabungan - Terjadi kesalahan saat memuat dalam transaksi terkini - Kesalahan saat memuat piutang - Pelanggan tidak ditemukan - Klien tidak dapat diunduh - Tidak dapat mengunduh profil pengguna - Tidak dapat mengunduh akun - Jadwal pembayaran tidak dapat diambil - Anda tidak dapat melakukan transfer ke akun Anda sendiri - Template transfer tidak dapat diunduh - Kredit tidak dapat diperoleh - Template pewaris tidak dapat diunduh - Template tidak dapat diunduh - Ahli waris tidak berhasil - Ahli waris belum diperbarui - Pewaris tidak bisa dihapus - Rekening pinjaman tidak dapat ditarik - Kesalahan mengunduh template transfer pihak ketiga - Anda saat ini tidak memiliki pewaris. Tambahkan pewaris - - Anda tidak berwenang - Kode QR - Bagikan kode QR - Monitor - Pilih satu opsi - Lihat transaksi - Lihat biaya - Lihat ringkasan pinjaman - Lihat jadwal pembayaran kembali - Lihat kode QR untuk akun ini - Detail transaksi terakhir - Nama pengguna harus lebih dari 6 karakter - ID email tidak valid - Server turun, coba setelah beberapa saat - Biaya pelanggan - Kesalahan saat membaca QR, pastikan Anda memilih wilayah yang tepat - Kesalahan saat mengunduh gambar - Unduhan klien - - Spasi - Nama pelanggan - Status akun - Nama produk - Pembayaran total - Min. Bola yang Diperlukan. - Nama produk - Tujuan pinjaman - Direktur - Pokok dibayarkan - Suku bunga tahunan - Bunga terkumpul - Bunga dibayar - Detail akun kredit - Ringkasan pinjaman - Nama pinjaman - Bunga - Biaya - Hukuman - Total pembayaran yang diharapkan - Total dibayar - Bunga dibebaskan - Hukuman rusak - Biaya tersebut dibebaskan - Keseimbangan luar biasa - Angsuran berikutnya - Batas waktu pembayaran - Lakukan pembayaran - Jenis pinjaman - Mata uang - Jadwal pembayaran kembali - Transaksi - Transfer - Persetujuan sedang berlangsung - Menunggu pembayaran - Ditutup karena beberapa kewajiban - Pinjaman ditutup - Menurut tanggal: - Oleh: - Dibayar: - Menyerahkan: - Terlambat: - CONTOH - Tambahkan widget - Membantu - Tempat industri teknologi besar - Detail dari akun pinjaman - Aplikasi kredit berhasil dikirim - Aplikasi pinjaman telah berhasil diperbarui - Aplikasi pinjaman berhasil ditarik - Tidak ada - Semua - 4 minggu - Tiga bulan - 6 bulan - Filter - Tanggal mulai - Tanggal berakhir - Tersaring - Pilih tanggal mulai dan akhir - Tanggal akhir harus lebih besar dari tanggal mulai - Menyimpan transaksi di akun Anda - Tidak ada koneksi internet - Tanggal pembayaran - Jumlah pembayaran - Tanggal - Saldo pinjaman - Pembayaran kembali - Pembayaran pinjaman - Transfer cepat - Pastikan Anda memiliki koneksi internet - Pewaris - Kelola ahli waris - The Descendants - Rincian ahli waris - Nama ahli waris - Tipe akun - Batas transfer - Tambahkan pewaris - Nama kantornya - Pilih jenis akun * - Kirim pewaris - Masukkan nama kantor pewaris - Masukkan nama ahli waris - Masukkan batas transfer - Masukkan nomor rekening ahli waris - Pilih Jenis akun dari menu drop-down - Pewaris telah berhasil dibuat - Ahli waris telah berhasil diperbarui - Perbarui pewaris Anda - Hapus pewarisnya - Anda yakin ingin menghapus pewaris ini? - Hapus - Pewaris telah dihapus - Transfer dari pihak ketiga - Total pinjaman - Penghematan total - Ikhtisar akun - Tampilkan atau sembunyikan jumlah total tabungan - Tampilkan atau sembunyikan jumlah total pinjaman - ***** - Survei - Tanggal aktivasi - Kelompok - Data pengguna - Jenis pelanggan - Klasifikasi pelanggan - Pilih mode - Tambahkan pewaris eksternal ke akun Anda. \ nMasukkan secara manual atau pindai kode QR akun - Anda tidak dapat melakukan tindakan di akun Anda, memindai kode QR dari rekening tabungan atau akun pinjaman pengguna lain - Menambahkan - Pindai - Masukkan kode akses 4-digit - Kode akses harus terdiri dari 4 digit - Kode akses salah - Anda telah memasukkan kode akses yang salah lebih dari 3 kali - Melewatkan - Simpan - Setel pin untuk masuk - Masukkan kembali pin - Kode akses tidak cocok. - Saya lupa pin, saya akan masuk dengan kata sandi - Terus - Jumlahnya harus lebih besar dari nol - Bookmark Tentang kami sedang dibangun - Bantuan dalam tab konstruksi - Log out - Download aplikasi Self Service di sini: https://play.google.com/store/apps/details?id= - Pilih aplikasi - THE - Kirim QR - Pilih wilayah dengan kode QR - - Hubungi kami - Transfer berhasil - - Total: - - A/C - Produk pinjaman - Non-aktif - AKTIF - NON-AKTIF - - - Anda yakin ingin keluar? - Oke - Membatalkan - Kembali - Akses ditolak - Aku yakin - Silakan coba lagi - Pengaturan aplikasi - Tanpa izin untuk menggunakan kamera, Anda tidak akan dapat memindai kode QR untuk menambahkan pewaris. Anda yakin ingin mencekal fitur ini? - Anda telah menolak izin untuk menggunakan kamera, tanpa izin ini Anda tidak akan dapat menambahkan ahli waris menggunakan kode QR. Aktifkan dalam pengaturan - Tanpa izin untuk membaca dari memori, Anda tidak akan dapat mengirim kode QR untuk menambahkan pewaris. Anda yakin ingin mencekal fitur ini? - Anda telah menolak izin untuk membaca dari memori perangkat, tanpa izin ini Anda tidak akan dapat menambahkan ahli waris menggunakan kode QR. Aktifkan dalam pengaturan - Anda telah menolak untuk menulis ke memori perangkat, tanpa izin ini Anda tidak akan dapat menambahkan ahli waris menggunakan kode QR. Aktifkan dalam pengaturan - Izin ini diperlukan untuk menunjukkan mata uang tergantung pada negara. Anda yakin ingin mencekal fitur ini? - Anda telah menolak izin untuk membaca status perangkat, tanpa izin ini mata uang tidak dapat ditampilkan dalam format yang benar. Aktifkan dalam pengaturan - Terjadi kesalahan saat mencari aktivitas di setelan. \nBuka \'Pengaturan \' dan berikan izin secara manual. - Penolakan penyimpanan ditolak - Anda yakin ingin %1$s? - - - Halo, %1$s. - Jumlah tidak valid - Tekan lagi untuk keluar - - Penolakan izin untuk menggunakan kamera - - Pertanyaan yang Sering Diajukan - Permintaan pengguna - Hubungi sekarang - Tinggalkan pesan e-mail - Temukan lokasi - Tidak ada pembayaran - Hapus filter - Kelola akun - Lebih - Pengaturan - Bahasa - Pilih bahasa Anda - Pemberitahuan - URL utama - Penyewa - - - Bagaimana cara mengajukan permohonan untuk akun kredit baru? - Di mana saya dapat melihat informasi tentang profil saya? - Di mana saya dapat melihat transaksi rekening tabungan saya? - Apa gunanya kode QR? - Bagaimana cara membuat penerima menggunakan kode QR? - Bagaimana cara melakukan pembayaran untuk akun kredit? - - - - Untuk mengajukan permohonan akun kredit, klik \ "Laporkan aplikasi pinjaman \" di layar beranda. - Anda dapat melihat informasi profil Anda dengan mengklik pada gambar profil di halaman aplikasi utama. - Untuk melihat transaksi di rekening tabungan Anda, buka bagian Akun, klik rekening tabungan yang diperlukan, klik tiga titik yang ada di sudut kanan atas dan pilih Opsi transaksi. - Kode QR untuk semua kredit atau rekening tabungan dapat dibagikan dengan pengguna lain yang akan memungkinkan mereka untuk membuat ahli waris - Untuk membuat penggantinya, pergi ke ahli waris dari aplikasi halaman rumah, dan kemudian klik pada tombol di pojok kanan bawah, pilih scan, yang akan membuka perangkat kamera, memindai kode QR orang untuk siapa Anda ingin membuat ahli waris, setelah mengisi data yang dibutuhkan akan dapat membuat ahli waris menggunakan kode QR - Untuk melakukan pembayaran untuk akun pinjaman, buka bagian Akun, pilih opsi PINDAH, lalu buka akun kredit target dan klik opsi Lakukan pembayaran. - - - - Total saldo tabungan - Total saldo pinjaman - Di atas adalah saldo rekening bank dan rekening tabungan yang dihitung berdasarkan semua tabungan dan rekening pinjaman - Anda yakin ingin membatalkan transfer? - Jadi - Konfirmasi kata sandi - Kata Sandi Tidak cocok. - Versi %1$s - Hak cipta dilindungi. - Perizinan - Tidak dapat melakukan transfer, silakan coba lagi nanti - Tolong tunggu… - Pesan - Tanpa pemberitahuan - - Perbarui Endpoint - Klik di sini untuk mengubah konfigurasi Endpoint - Masukkan URL utama - Pergi ke Tenant - Info Aplikasi - Login Gagal, Silakan Coba Lagi Nanti. - diff --git a/androidApp/src/main/res/values-km/strings.xml b/androidApp/src/main/res/values-km/strings.xml deleted file mode 100644 index 839a28e33..000000000 --- a/androidApp/src/main/res/values-km/strings.xml +++ /dev/null @@ -1,432 +0,0 @@ - - - - ចូល - សួស្តី, %1$s ។ - គ្មានការតភ្ជាប់អ៊ីនធឺណិត - បឋម - ឈ្មោះអ្នកប្រើ - ចូល - ផ្ទុក - ការពាក្យសម្ងាត់ - អាសយដ្ឋានអ៊ីមែល - គណនី - អតិថិជន - ផ្ទេរមូលនិធិ - ប្រតិបត្តិការថ្មីៗ - ថ្លៃសេវា - សំណួរ - អំពីយើង - ការរក្សាទុកព័ត៌មានលម្អិតគណនី - គណនីសន្សំ - កំហុសក្នុងការផ្ទុកព័ត៌មានគណនីឥណទាន - អត្រាការប្រាក់នាមករណ៍ - លេខគណនី - សមតុល្យគណនី - ប្រាក់បញ្ញើសរុប - បើកបន្ទះរុករក - បិទបន្ទះស្តារឡើងវិញ - ទំព័រដើម - អត្ថបទមធ្យម - អត្ថបទតូច - គណនីអតិថិជន - អេក្រង់ស្វាគមន៍ - ការរក្សាទុក - ប្រាក់កម្ចី - គណនីឥណទាន - ចែករំលែក - ចែករំលែកគណនីរបស់អ្នក - ជ្រើសរើសអតិថិជន - ធ្វើការ - រូបភាពរបស់រដ្ឋ - កាលវិភាគសងប្រាក់ - កិច្ចការចុងក្រោយ - បានធ្វើឡើង - ធ្វើការផ្ទេរ - ជ្រើសរើសផលិតផលឥណទាន * - គោលបំណងនៃប្រាក់កម្ចី * - ចំនួនទឹកប្រាក់សំខាន់ * - ចំនួន - ការប្រុងប្រយ័ត្ន - កាលបរិច្ឆេទទូទាត់ដែលរំពឹងទុក - ថ្ងៃផុតកំណត់សម្រាប់ការដាក់ស្នើ - ផ្ទុកឡើង - ចំណាយ - កាលបរិច្ឆេទផ្ទេរ - ដាក់ពាក្យសុំប្រាក់កម្ចី - ធ្វើបច្ចុប្បន្នភាពប្រាក់កម្ចី - បញ្ចេញប្រាក់កម្ចី - ហេតុផលសម្រាប់ការបង់ប្រាក់កម្ចី - គណនីប្រាក់កម្ចីត្រូវបានដកចេញដោយជោគជ័យ - ដាក់ប្រាក់កម្ចី - កម្មវិធីឥណទានថ្មីសម្រាប់ - ធ្វើបច្ចុប្បន្នភាពកម្មវិធីឥណទានរបស់អ្នក - ប្រភេទនៃការប្រាក់ - រំលស់ - រយៈពេលការប្រាក់ - យុទ្ធសាស្ត្រសងប្រាក់ - ការទូទាត់ទៅ - ការទូទាត់ពី - បោះបង់ - មើលជាមុន - ផ្ទេរទៅ - ផ្ទេរពី - ធ្វើការផ្ទេរ - ការដាក់ប្រាក់ - បញ្ចូលបរិមាណ - ចំណាំគឺជាកាតព្វកិច្ច - បានអនុម័ត - នៅក្នុងការស្មានទុកជាមុន - បានបង់ប្រាក់ - តុល្យភាព - ច្រានចោល - ការរង់ចាំ - ប្រាក់ - នៅបំណុល - ជ្រើសរើសអ្វីគ្រប់យ៉ាងដែលអ្នកចង់អនុវត្ត - ត្រងគណនីសន្សំ - ត្រងគណនីឥណទាន - តម្រងការចែករំលែកគណនី - ស្វែងរក - ជ្រើសជម្រើសគណនីត្រូវបង់ - ជ្រើសរើសគណនីដើម្បីទូទាត់ប្រាក់ជាមួយ - បញ្ចូលកំណត់សម្គាល់ដើម្បីផ្ទេរ - ជ្រើសអ្នកទទួលអត្ថប្រយោជន៍ - បន្ថែមទៀត - ការជិតស្និទ្ធ - ជ្រើសរើសប្រភេទនៃការផ្ទេរ - ផ្ទេរទៅសន្សំ - ផ្ទេរពីការសន្សំ - កម្រៃសម្រាប់ប្រាក់កម្ចី - សន្សំ - សកម្ម - បិទ - ដក - តម្រូវឱ្យមានការយល់ព្រម - នៅក្នុងការស្មានទុកជាមុន - ចាស់ទុំ - បង្កើតគណនី - ឈ្មោះ - ឈ្មោះ - លេខទូរស័ព្ទ - ចុះឈ្មោះ - សំណើលេខសម្គាល់ - និមិត្តសញ្ញាផ្ទៀងផ្ទាត់ - ផ្ទៀងផ្ទាត់ - ការផ្ទៀងផ្ទាត់ - ចូល - អ្នកប្រើត្រូវបានផ្ទៀងផ្ទាត់ដោយជោគជ័យ - ទូរស័ព្ទដៃ - អាសយដ្ឋានអ៊ីមែល - របៀបផ្ទៀងផ្ទាត់ - ទទេ - នាំចូល QR - មើលធានា - បន្ថែមអ្នកធានា - យកអ្នកធានាចេញ - ធ្វើបច្ចុប្បន្នភាពអ្នកធានា - ប្រភេទអ្នកធានា - គ្មានអ្នកធានា - ប៉ះដើម្បីបន្ថែមអ្នកធានា - ព័ត៌មានលម្អិតអំពីអ្នកធានា - កាលបរិច្ឆេទនៃឯកសារភ្ជាប់ - ដាក់ស្នើ - - គណនីគួរតែសកម្មដើម្បីដាក់ប្រាក់ - គណនីគួរតែសកម្មដើម្បីធ្វើការផ្ទេរ - - មិនមានគណនីសន្សំមានទំនាក់ទំនងជាមួយអ្នកទេ - មិនមានគណនីប្រាក់កម្ចីដែលជាប់ទាក់ទងជាមួយអ្នកទេ - មិនមានគណនីចែករំលែកត្រូវបានភ្ជាប់ជាមួយអ្នកទេ - មិនមានប្រតិបត្តិការទាក់ទងនឹងអ្នកទេ - មិនមានកាលវិភាគសងប្រាក់ដែលជាប់ទាក់ទងជាមួយអ្នកទេ - មិនមានប្រតិបត្តិការទេ - គ្មានប្រតិបត្តិការ - រកមិនឃើញ DOB ។ - មិនបានចាត់ចែងទៅក្រុមណាមួយទេ - - ឈ្មោះអ្នកប្រើប្រាស់ / ពាក្យសម្ងាត់មិនត្រឹមត្រូវ - កំហុសនៅពេលទទួលបានការឆ្លើយតបពីម៉ាស៊ីនមេ - %1$s មិនអាចទទេបានទេ - %1$s មិនអាចតិចជាង %2$d តួអក្សរ - %1$s មិនអាចមាន %2$s - %1$s មិនអាចចាប់ផ្តើមឬបញ្ចប់ដោយដកឃ្លាបានទេ - កំហុសនៅលើម៉ាស៊ីនមេខាងក្នុងសូមព្យាយាមម្តងទៀតពេលក្រោយ - កំហុសបានកើតឡើងនៅពេលផ្ទុកបញ្ជីអតិថិជន - កំហុសក្នុងការផ្ទុកបញ្ជីគណនីប្រាក់កម្ចី - កំហុសក្នុងការផ្ទុកបញ្ជីគណនីសន្សំ - កំហុសក្នុងការផ្ទុកព័ត៌មានលម្អិតអំពីគណនីសន្សំ - កំហុសបានកើតឡើងនៅពេលផ្ទុកនៅក្នុងប្រតិបត្តិការថ្មីៗ - កំហុសក្នុងការផ្ទុកគណនីដែលត្រូវទទួល - អតិថិជនមិនត្រូវបានរកឃើញ - មិនអាចទាញយកម៉ាស៊ីនកូន - មិនអាចទាញយកទម្រង់អ្នកប្រើ - មិនអាចទាញយកគណនី - មិនអាចទាញយកកាលវិភាគការសងប្រាក់ - អ្នកមិនអាចធ្វើការផ្ទេរទៅគណនីផ្ទាល់ខ្លួនរបស់អ្នកបានទេ - មិនអាចទាញយកពុម្ពផ្ទេរបានទេ - មិនអាចទទួលបានឥណទាន - គំរូរបស់អ្នកស្នងមរតកមិនអាចទាញយកបានទេ - មិនអាចទាញយកពុម្ពបានទេ - អ្នកគ្រងមរតកមិនបានជោគជ័យទេ - អ្នកស្នងមរតកមិនទាន់បានធ្វើបច្ចុប្បន្នភាពទេ - អ្នកស្នងមរតកមិនអាចយកចេញបានទេ - គណនីប្រាក់កម្ចីមិនអាចដកបាន - កំហុសក្នុងការទាញយកគំរូផ្ទេរភាគីទីបី - បច្ចុប្បន្នអ្នកមិនមានអ្នកស្នងទេ។ បន្ថែមអ្នកស្នង - - អ្នកមិនត្រូវបានអនុញ្ញាត - QR code - ចែករំលែកលេខកូដ QR - ម៉ូនីទ័រ - ជ្រើសរើសជម្រើស - មើលប្រតិបត្តិការ - មើលថ្លៃ - សូមមើលសេចក្តីសង្ខេបប្រាក់កម្ចី - សូមមើលកាលវិភាគសង - មើលកូដ QR សម្រាប់គណនីនេះ - ព័ត៌មានលម្អិតនៃប្រតិបត្តិការចុងក្រោយ - ឈ្មោះអ្នកប្រើប្រាស់គួរតែធំជាង 6 តួអក្សរ - លេខសម្គាល់អ៊ីម៉ែលមិនត្រឹមត្រូវ - ម៉ាស៊ីនបម្រើចុះ, ព្យាយាមពេលក្រោយ - ថ្លៃសេវាអតិថិជន - កំហុសក្នុងការអាន QR ត្រូវប្រាកដថាអ្នកជ្រើសរើសតំបន់ត្រឹមត្រូវ - កំហុសក្នុងការទាញយករូបភាព - ទាញយកអតិថិជន - - ចន្លោះ - ឈ្មោះអតិថិជន - ស្ថានភាពគណនី - ឈ្មោះផលិតផល - ការទូទាត់សរុប - គ្រាប់បាល់ចាំបាច់។ - ឈ្មោះផលិតផល - គោលបំណងនៃប្រាក់កម្ចី - នាយក - នាយកចំណាយ - អត្រាការប្រាក់ប្រចាំឆ្នាំ - ការប្រាក់បានកើនឡើង - ការប្រាក់ដែលបានបង់ - ព័ត៌មានលម្អិតនៃគណនីឥណទាន - សង្ខេបនៃប្រាក់កម្ចី - ឈ្មោះប្រាក់កម្ចី - អត្រាការប្រាក់ - ថ្លៃសេវា - ពិន័យ - ការទូទាត់ដែលរំពឹងទុកសរុប - សរុបបង់ - ការចាប់អារម្មណ៍បានត្រូវផ្អាក - ពិន័យជាប្រាក់ - តម្លៃនេះត្រូវបានលើកលែង - សមតុល្យឆ្នើម - ការដំឡើងបន្ទាប់ - ថ្ងៃផុតកំណត់ - ធ្វើការទូទាត់ - ប្រភេទនៃប្រាក់កម្ចី - រូបិយប័ណ្ណ - កាលវិភាគសងប្រាក់ - ប្រតិបតិ្តការ - ការផ្ទេរប្រាក់ - ការអនុម័តនៅក្នុងដំណើរការ - រង់ចាំការទូទាត់ - បានបិទដោយសារតែកាតព្វកិច្ចមួយចំនួន - ឥណទានបានបិទ - តាមកាលបរិច្ឆេទ: - ដោយ: - បង់ប្រាក់: - ប្រគល់: - ហួសកាលកំណត់: - គំរូ - បន្ថែមធាតុក្រាហ្វិក - ជួយ - កន្លែងនៃឧស្សាហកម្មបច្ចេកវិទ្យាធំ ៗ - ព័ត៌មានលម្អិតអំពីគណនីប្រាក់កម្ចី - កម្មវិធីឥណទានត្រូវបានផ្ញើដោយជោគជ័យ - កម្មវិធីឥណទានត្រូវបានធ្វើបច្ចុប្បន្នភាពដោយជោគជ័យ - បានដកប្រាក់ឥណទានដោយជោគជ័យ - គ្មានអ្វី - ទាំងអស់ - 4 សប្តាហ៍ - បីខែ - 6 ខែ - តម្រង - កាលបរិច្ឆេទចាប់ផ្ដើម - កាលបរិច្ឆេទបញ្ចប់ - ត្រង - ជ្រើសកាលបរិច្ឆេទចាប់ផ្ដើមនិងបញ្ចប់ - កាលបរិច្ឆេទបញ្ចប់ត្រូវតែធំជាងកាលបរិច្ឆេទចាប់ផ្តើម - ការរក្សាទុកប្រតិបត្តិការលើគណនីរបស់អ្នក - គ្មានការតភ្ជាប់អ៊ីនធឺណិត - កាលបរិច្ឆេទនៃការបង់ប្រាក់ - ចំនួននៃការបង់ប្រាក់ - កាលបរិច្ឆេទ - សមតុល្យឥណទាន - ការទូទាត់សង - ការសងប្រាក់កម្ចី - បញ្ជូនរហ័ស - ត្រូវប្រាកដថាអ្នកមានអ៊ីនធឺណិត - ទាយាទ - គ្រប់គ្រងអ្នកគ្រងមរតក - កូនចៅ - ព័ត៌មានលម្អិតអំពីអ្នកស្នងមរតក - ឈ្មោះរបស់អ្នកស្នង - ប្រភេទគណនី - ដែនកំណត់ផ្ទេរ - បន្ថែមអ្នកស្នង - ឈ្មោះការិយាល័យ - ជ្រើសរើសប្រភេទគណនី * - ដាក់ស្នើអ្នកស្នងរាជ្យ - បញ្ចូលឈ្មោះការិយាល័យរបស់អ្នកស្នង - បញ្ចូលឈ្មោះរបស់អ្នកស្នង - បញ្ចូលដែនកំណត់ផ្ទេរ - បញ្ចូលលេខគណនីរបស់អ្នកស្នង - ជ្រើសប្រភេទគណនីពីម៉ឺនុយទម្លាក់ចុះ - អ្នកគ្រងមរតកត្រូវបានបង្កើតដោយជោគជ័យ - អ្នកស្នងមរតកត្រូវបានធ្វើបច្ចុប្បន្នភាពដោយជោគជ័យ - ធ្វើបច្ចុប្បន្នភាពអ្នកស្នងរបស់អ្នក - យកអ្នកស្នងមរតកទៅ - តើអ្នកប្រាកដថាអ្នកចង់ដកអ្នកនេះចេញទេ? - លុប - អ្នកស្នងមរតកត្រូវបានដកចេញ - ផ្ទេរភាគីទីបី - ឥណទានសរុប - ការសន្សំសរុប - ទិដ្ឋភាពគណនី - បង្ហាញ ឬលាក់ចំនួនទឹកប្រាក់សន្សំសរុប - បង្ហាញ ឬលាក់ចំនួនប្រាក់កម្ចីសរុប - ***** - ការស្ទង់មតិ - កាលបរិច្ឆេទសកម្ម - ក្រុម - ទិន្នន័យអ្នកប្រើ - ប្រភេទអតិថិជន - ការបែងចែកអតិថិជន - ជ្រើសរបៀប - បន្ថែម heirs ខាងក្រៅទៅគណនីរបស់អ្នក។ \n បញ្ចូលដោយដៃឬស្កេនកូដ QR នៃគណនីរបស់អ្នក - អ្នកមិនអាចធ្វើសកម្មភាពនៅលើគណនីរបស់អ្នកស្កេនកូដ QR ពីគណនីសន្សំឬគណនីប្រាក់កម្ចីអ្នកប្រើផ្សេងទៀត - បន្ថែម - វិភាគ - បញ្ចូលលេខកូដចូល 4 ខ្ទង់ - កូដចូលដំណើរការគួរតែមាន 4 ខ្ទង់ - កូដចូលដំណើរការមិនត្រឹមត្រូវ - អ្នកបានបញ្ចូលកូដចូលខុសច្រើនជាង 3 ដង - រំលង - រក្សាទុក - កំណត់ដំបងដើម្បីចូល - បញ្ចូលម្ជុលម្តងទៀត - លេខកូដចូលមិនដូចគ្នាទេ។ - ខ្ញុំភ្លេចលេខកូដសម្ងាត់ខ្ញុំនឹងចូលជាមួយពាក្យសម្ងាត់ - បន្ត - ចំនួនទឹកប្រាក់គួរតែធំជាងសូន្យ - ចំណាំអំពីយើងកំពុងសាងសង់ - ជំនួយនៅក្រោមផ្ទាំងសំណង់ - ចេញ - ទាញយកកម្មវិធីសេវាដោយខ្លួនឯងនៅទីនេះ: https://play.google.com/store/apps/details?id= - ជ្រើសកម្មវិធី - នេះ - ដាក់ស្នើ QR - ជ្រើសរើសតំបន់ដែលមានកូដ QR - - ទាក់ទងយើង - ផ្ទេរជោគជ័យ - - ចំនួនសរុប: - - A / C - ផលិតផលឥណទាន - អសកម្ម - សកម្ម - អសកម្ម - - - តើអ្នកប្រាកដថាអ្នកចង់ចាកចេញមែនទេ? - យល់ព្រម - បោះបង់ - ត្រឡប់មកវិញ - បានបដិសេធការចូល - ខ្ញុំប្រាកដ - សូមព្យាយាមម្តងទៀត - ការកំណត់កម្មវិធី - ដោយគ្មានការអនុញ្ញាតឱ្យប្រើកាមេរ៉ាអ្នកនឹងមិនអាចស្កេនកូដ QR ដើម្បីបន្ថែមអ្នកស្នងបានទេ។ តើអ្នកប្រាកដថាអ្នកចង់ហាមវាទេ? - អ្នកបានបដិសេធមិនអនុញ្ញាតប្រើកាមេរ៉ាដោយគ្មានការអនុញ្ញាតនេះអ្នកនឹងមិនអាចបន្ថែមអ្នកទទួលបានដោយប្រើកូដ QR ទេ។ បើកវានៅក្នុងការកំណត់ - ដោយគ្មានការអនុញ្ញាតអានពីការចងចាំអ្នកនឹងមិនអាចផ្ញើលេខកូដ QR ដើម្បីបន្ថែមអ្នកស្នងបានទេ។ តើអ្នកប្រាកដថាអ្នកចង់ហាមវាទេ? - អ្នកបានបដិសេធការអនុញ្ញាតិឱ្យអានពីការចងចាំរបស់ឧបករណ៍ដោយគ្មានការអនុញ្ញាតនេះអ្នកនឹងមិនអាចបន្ថែមអ្នកទទួលមរតកបានទេដោយប្រើលេខកូដ QR ។ បើកវានៅក្នុងការកំណត់ - អ្នកបានបដិសេធមិនសរសេរទៅការចងចាំរបស់ឧបករណ៍ដោយគ្មានការអនុញ្ញាតនេះអ្នកនឹងមិនអាចបន្ថែមអ្នកទទួលបានដោយប្រើលេខកូដ QR នោះទេ។ បើកវានៅក្នុងការកំណត់ - ការអនុញ្ញាតនេះតម្រូវឱ្យបង្ហាញរូបិយប័ណ្ណអាស្រ័យលើប្រទេស។ តើអ្នកប្រាកដថាអ្នកចង់ហាមវាទេ? - អ្នកបានបដិសេធការអនុញ្ញាតិឱ្យអានស្ថានភាពឧបករណ៍ដោយគ្មានការអនុញ្ញាតនេះរូបិយប័ណ្ណប្រហែលជាមិនត្រូវបានបង្ហាញក្នុងទំរង់ត្រឹមត្រូវទេ។ បើកវានៅក្នុងការកំណត់ - មានអ្វីមួយមិនប្រក្រតីខណៈដែលកំពុងស្វែងរកសកម្មភាពនៅក្នុងការកំណត់។ \n ទៅ \'ការកំណត់\' និងផ្តល់សិទ្ធិដោយដៃ។ - ការបដិសេធការផ្ទុកត្រូវបានបដិសេធ - តើអ្នកប្រាកដជាចង់បាន %1$s មែនទេ? - - - សួស្តី, %1$s - ចំនួនទឹកប្រាក់មិនត្រឹមត្រូវ - ចុចម្តងទៀតដើម្បីចេញ - - ការបដិសេធមិនអនុញ្ញាតឱ្យប្រើកាមេរ៉ា - - សំណួរដែលសួរជាញឹកញាប់ - សំណើរសុំរបស់អ្នកប្រើ - ហៅមកឥឡូវ - ទុកសារអេឡិចត្រូនិច - រកទីតាំង - គ្មានការទូទាត់ - ជម្រះតម្រង - គ្រប់គ្រងគណនី - ច្រើនទៀត - ការកំណត់ - ភាសា - ជ្រើសរើសភាសារបស់អ្នក - ការជូនដំណឹង - URL ចម្បង - ជួល - - - របៀបដាក់ពាក្យស្នើសុំគណនីថ្មី? - តើខ្ញុំអាចមើលព័ត៌មានអំពីប្រវត្តិរូបរបស់ខ្ញុំនៅឯណា? - តើខ្ញុំអាចមើលឃើញពីប្រតិបត្តិការគណនីសន្សំរបស់ខ្ញុំនៅឯណា? - តើអ្វីទៅជាការប្រើកូដ QR មួយ? - តើធ្វើដូចម្តេចដើម្បីបង្កើតអ្នកទទួលផលដោយប្រើកូដ QR មួយ? - តើធ្វើដូចម្តេចដើម្បីធ្វើឱ្យការទូទាត់សម្រាប់គណនីឥណទាន? - - - - ដើម្បីស្នើសុំគណនីឥណទានសូមចុច \"រាយការណ៍ពីកម្មវិធីឥណទាន\" នៅលើអេក្រង់ដើម។ - អ្នកអាចមើលព័ត៌មានប្រវត្តិរូបរបស់អ្នកដោយចុចលើរូបភាពប្រវត្តិរូបនៅលើទំព័រកម្មវិធីចម្បង។ - ដើម្បីមើលប្រតិបត្តិការនៅក្នុងគណនីសន្សំរបស់អ្នកចូលទៅផ្នែកគណនីចុចលើគណនីសន្សំដែលត្រូវការចុចចំណុចបីដែលមាននៅជ្រុងខាងស្តាំហើយជ្រើសជម្រើសប្រតិបត្តិការ។ - កូដ QR សម្រាប់គណនីឥណទានឬគណនីសន្សំទាំងអស់អាចត្រូវបានចែករំលែកជាមួយអ្នកប្រើផ្សេងទៀតដែលនឹងអនុញ្ញាតឱ្យពួកគេបង្កើតអ្នកស្នង - ដើម្បីបង្កើតស្នងតំណែងមួយទៅកាន់អ្នកទទួលមរតកនៃកម្មវិធីទំព័រផ្ទះ, ហើយបន្ទាប់មកចុចលើប៊ូតុងនៅជ្រុងខាងស្តាំជ្រើសស្កេនដែលនឹងបើកឧបករណ៍កាមេរ៉ា, ស្កេនលេខកូដ QR មនុស្សម្នាក់ដែលអ្នកចង់បង្កើតទាយាទមួយ, បន្ទាប់ពីការបំពេញនៅក្នុងទិន្នន័យដែលបានទាមទារនឹងអាច បង្កើតអ្នកទទួលមរតកដោយប្រើកូដ QR - ដើម្បីទូទាត់គណនីប្រាក់កម្ចីសូមចូលទៅផ្នែកគណនីជ្រើសជម្រើសកម្ចីបន្ទាប់មកបើកគណនីឥណទានគោលដៅហើយចុចជម្រើសបង់ប្រាក់។ - - - - សមតុល្យសរុបនៃការសន្សំ - សមតុល្យឥណទានសរុប - ខាងលើគឺជាសមតុល្យនៃគណនីធនាគារនិងគណនីសន្សំដែលត្រូវបានគណនាដោយផ្អែកលើគណនីសន្សំនិងគណនីប្រាក់កម្ចីទាំងអស់ - តើអ្នកប្រាកដថាអ្នកចង់លុបចោលការផ្ទេរប្រាក់ទេ? - ដូច្នេះ - បញ្ជាក់ពាក្យសម្ងាត់ - ពាក្យសម្ងាត់មិនត្រូវគ្នា។ - កំណែ %1$s - រក្សាសិទ្ធិគ្រប់យ៉ាង។ - អាជ្ញាបណ្ណ - មិនអាចផ្ទេរបានសូមព្យាយាមម្តងទៀតពេលក្រោយ - សូមរង់ចាំ… - សារ - គ្មានការជូនដំណឹង - - បញ្ចប់ចំណុចបញ្ចប់ - សូមចុចទីនេះដើម្បីប្តូរការកំណត់រចនាសម្ព័ន្ធ ចំណុចបញ្ចប់ - បញ្ចូល URL ចម្បង - ចូលទៅកាន់ភតិកៈ - ព័ត៌មានកម្មវិធី - ការចូលបានបរាជ័យ សូមព្យាយាមម្តងទៀតនៅពេលក្រោយ។ - diff --git a/androidApp/src/main/res/values-kn/strings.xml b/androidApp/src/main/res/values-kn/strings.xml deleted file mode 100644 index 47c9e6fb7..000000000 --- a/androidApp/src/main/res/values-kn/strings.xml +++ /dev/null @@ -1,432 +0,0 @@ - - - - ಲಾಗ್ ಇನ್ ಮಾಡಿ - ಹಲೋ, %1$s. - ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವಿಲ್ಲ - ಪ್ರಾಥಮಿಕ - ಬಳಕೆದಾರಹೆಸರು - ಲಾಗ್ - ಲೋಡ್ - ಪಾಸ್ವರ್ಡ್ - ಇ ಮೇಲ್ - ಖಾತೆಗಳನ್ನು - ಗ್ರಾಹಕರಿಗೆ - ಹಣದ ವರ್ಗಾವಣೆ - ಇತ್ತೀಚಿನ ವಹಿವಾಟುಗಳು - ಶುಲ್ಕ - ಪ್ರಶ್ನಾವಳಿಯನ್ನು - ನಮ್ಮ ಬಗ್ಗೆ - ಖಾತೆ ವಿವರಗಳನ್ನು ಉಳಿಸಲಾಗುತ್ತಿದೆ - ಉಳಿತಾಯ ಖಾತೆ - ಕ್ರೆಡಿಟ್ ಖಾತೆ ಮಾಹಿತಿಯನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ದೋಷ - ನಾಮಮಾತ್ರ ಬಡ್ಡಿ ದರಗಳು - ಖಾತೆ ಸಂಖ್ಯೆ - ಖಾತೆ ಬಾಕಿ - ಒಟ್ಟು ಠೇವಣಿಗಳು - ನ್ಯಾವಿಗೇಷನ್ ಪ್ಯಾನಲ್ ತೆರೆಯಿರಿ - ಮರುಪಡೆಯುವಿಕೆ ಫಲಕವನ್ನು ಮುಚ್ಚಿ - ಮುಖಪುಟ - ಮಧ್ಯಮ ಪಠ್ಯ - ಸಣ್ಣ ಪಠ್ಯ - ಗ್ರಾಹಕ ಖಾತೆಗಳು - ಸ್ವಾಗತ ಪರದೆಯ - ಉಳಿಸುವ - ಸಾಲ - ಕ್ರೆಡಿಟ್ ಖಾತೆ - ಹಂಚಿಕೊಳ್ಳಿ - ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಹಂಚಿಕೊಳ್ಳಿ - ಗ್ರಾಹಕರನ್ನು ಆಯ್ಕೆ ಮಾಡಿ - ಕೆಲಸ - ರಾಜ್ಯದ ಚಿತ್ರ - ಮರುಪಾವತಿಯ ವೇಳಾಪಟ್ಟಿ - ಕೊನೆಯ ವಹಿವಾಟು - ಮೇಡ್ ಆನ್ - ವರ್ಗಾವಣೆ ಮಾಡಿ - ಕ್ರೆಡಿಟ್ ಉತ್ಪನ್ನವನ್ನು ಆಯ್ಕೆಮಾಡಿ * - ಸಾಲದ ಉದ್ದೇಶ * - ಮುಖ್ಯ ಮೊತ್ತ * - ಸಂಖ್ಯೆ - ಎಚ್ಚರಿಕೆ - ನಿರೀಕ್ಷಿತ ಪಾವತಿಯ ದಿನಾಂಕ - ಸಲ್ಲಿಕೆಗಾಗಿ ಅಂತಿಮ ದಿನಾಂಕ - ಅಪ್ಲೋಡ್ಗಳನ್ನು - ವೆಚ್ಚದಲ್ಲಿ - ವರ್ಗಾವಣೆಯ ದಿನಾಂಕ - ಸಾಲದ ಅರ್ಜಿ - ಸಾಲವನ್ನು ನವೀಕರಿಸಿ - ಸಾಲವನ್ನು ಬಿಡುಗಡೆ ಮಾಡಿ - ಸಾಲವನ್ನು ಪಾವತಿಸಲು ಕಾರಣ - ಸಾಲ ಖಾತೆಯನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಹಿಂತೆಗೆದುಕೊಳ್ಳಲಾಗಿದೆ - ಸಾಲವನ್ನು ಸಲ್ಲಿಸಿ - ಗಾಗಿ ಹೊಸ ಕ್ರೆಡಿಟ್ ಅಪ್ಲಿಕೇಶನ್ - ಗಾಗಿ ನಿಮ್ಮ ಕ್ರೆಡಿಟ್ ಅರ್ಜಿಯನ್ನು ನವೀಕರಿಸಿ - ಆಸಕ್ತಿಯ ಪ್ರಕಾರ - ಭೋಗ್ಯ - ಆಸಕ್ತಿ ಅವಧಿ - ಮರುಪಾವತಿ ತಂತ್ರ - ಗೆ ಪಾವತಿ - ನಿಂದ ಪಾವತಿ - ರದ್ದು - ಮುನ್ನೋಟ - ವರ್ಗಾಯಿಸಿ - ರಿಂದ ವರ್ಗಾಯಿಸಿ - ವರ್ಗಾವಣೆ ಮಾಡುವುದು - ಠೇವಣಿ - ಪ್ರಮಾಣವನ್ನು ನಮೂದಿಸಿ - ಗಮನಿಸಿ ಕಡ್ಡಾಯವಾಗಿದೆ - ಅನುಮೋದನೆ - ನಿರೀಕ್ಷೆಯಲ್ಲಿ - ಹಣ - ಸಮತೋಲನ - ತಿರಸ್ಕರಿಸಿದರು - ಕಾಯುವ - ಓವರ್ಪೇಯ್ಡ್ - ಬಾಕಿಗಳಲ್ಲಿ - ನೀವು ಅನ್ವಯಿಸಲು ಬಯಸುವ ಎಲ್ಲವನ್ನೂ ಆಯ್ಕೆ ಮಾಡಿ - ಫಿಲ್ಟರ್ ಉಳಿತಾಯ ಖಾತೆಗಳು - ಕ್ರೆಡಿಟ್ ಖಾತೆಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡಿ - ಫಿಲ್ಟರ್ ಖಾತೆ ಹಂಚಿಕೆ - ಹುಡುಕು - ಪಾವತಿಸಬೇಕಾದ ಆಯ್ಕೆಯನ್ನು ಆಯ್ಕೆ ಮಾಡಿ - ಪಾವತಿಸಲು ಖಾತೆ ಆಯ್ಕೆಮಾಡಿ - ವರ್ಗಾಯಿಸಲು ಟಿಪ್ಪಣಿಗಳನ್ನು ನಮೂದಿಸಿ - ಫಲಾನುಭವಿ ಆಯ್ಕೆಮಾಡಿ - ಮತ್ತಷ್ಟು - ನಿಕಟ - ವರ್ಗಾವಣೆಯ ಪ್ರಕಾರವನ್ನು ಆರಿಸಿ - ಉಳಿತಾಯಕ್ಕೆ ವರ್ಗಾಯಿಸಿ - ಉಳಿತಾಯದಿಂದ ವರ್ಗಾವಣೆ - ಸಾಲಗಳಿಗೆ ಶುಲ್ಕ - ಉಳಿತಾಯ - ಸಕ್ರಿಯ - ಮುಚ್ಚಲಾಗಿದೆ - ಹಿಂದಕ್ಕೆ - ಅನುಮೋದನೆ ಅಗತ್ಯವಿದೆ - ನಿರೀಕ್ಷೆಯಲ್ಲಿ - ಪ್ರೌಢ - ಖಾತೆಯನ್ನು ರಚಿಸಿ - ಹೆಸರು - ಹೆಸರು - ಫೋನ್ ಸಂಖ್ಯೆ - ನೋಂದಣಿ - ID ವಿನಂತಿಯನ್ನು - ದೃಢೀಕರಣ ಟೋಕನ್ - ಪರಿಶೀಲಿಸಿ - ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ - ಲಾಗ್ - ಬಳಕೆದಾರರನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಪರಿಶೀಲಿಸಲಾಗಿದೆ - ಮೊಬೈಲ್ - ಇ ಮೇಲ್ - ಪರಿಶೀಲನೆ ಮೋಡ್ - ಖಾಲಿ - ಆಮದು QR - ಖಾತರಿಯನ್ನು ವೀಕ್ಷಿಸಿ - ಖಾತರಿದಾರರನ್ನು ಸೇರಿಸಿ - ಗ್ಯಾರಂಜರ್ ತೆಗೆದುಹಾಕಿ - ಗ್ಯಾರಂಜರ್ ಅನ್ನು ನವೀಕರಿಸಿ - ಖಾತರಿ ಪ್ರಕಾರ - ಯಾವುದೇ ಭರವಸೆಗಳಿಲ್ಲ - ಗ್ಯಾರಂಟರನ್ನು ಸೇರಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ - ಖಾತರಿಯ ವಿವರಗಳು - ಲಗತ್ತು ದಿನಾಂಕ - ಸಲ್ಲಿಸಿ - - ಠೇವಣಿ ಮಾಡಲು ಖಾತೆ ಸಕ್ರಿಯವಾಗಿರಬೇಕು - ವರ್ಗಾವಣೆ ಮಾಡಲು ಖಾತೆ ಸಕ್ರಿಯವಾಗಿರಬೇಕು - - ನಿಮ್ಮೊಂದಿಗೆ ಯಾವುದೇ ಉಳಿತಾಯ ಖಾತೆಗಳಿಲ್ಲ - ನಿಮ್ಮೊಂದಿಗೆ ಯಾವುದೇ ಸಾಲ ಖಾತೆಗಳಿಲ್ಲ - ನಿಮ್ಮೊಂದಿಗೆ ಸಂಯೋಜಿತವಾಗಿರುವ ಯಾವುದೇ ಖಾತೆಗಳಿಲ್ಲ - ನಿಮಗೆ ಸಂಬಂಧಿಸಿದ ಯಾವುದೇ ವಹಿವಾಟುಗಳಿಲ್ಲ - ನಿಮ್ಮೊಂದಿಗೆ ಯಾವುದೇ ಮರುಪಾವತಿಯ ವೇಳಾಪಟ್ಟಿ ಇಲ್ಲ - ಯಾವುದೇ ವ್ಯವಹಾರ ಲಭ್ಯವಿಲ್ಲ - ವ್ಯವಹಾರ ಇಲ್ಲ - DOB ಕಂಡುಬಂದಿಲ್ಲ. - ಯಾವುದೇ ಗುಂಪಿಗೆ ನಿಯೋಜಿಸಲಾಗಿಲ್ಲ - - ತಪ್ಪಾದ ಬಳಕೆದಾರಹೆಸರು / ಪಾಸ್ವರ್ಡ್ - ಸರ್ವರ್ನಿಂದ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಪಡೆದಾಗ ದೋಷ - %1$s ಖಾಲಿಯಾಗಿರಬಾರದು - %1$s %2$d ಅಕ್ಷರಗಳಿಗಿಂತ ಕಡಿಮೆ ಇರುವಂತಿಲ್ಲ - %1$s %2$s ಅನ್ನು ಒಳಗೊಂಡಿರಬಾರದು - %1$s ಸ್ಥಳಾವಕಾಶದೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸುವುದಿಲ್ಲ ಅಥವಾ ಕೊನೆಗೊಳ್ಳುವುದಿಲ್ಲ - ಆಂತರಿಕ ಸರ್ವರ್ನಲ್ಲಿ ದೋಷ, ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ - ಗ್ರಾಹಕರ ಪಟ್ಟಿಯನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ ದೋಷ ಸಂಭವಿಸಿದೆ - ಸಾಲದ ಖಾತೆಗಳ ಪಟ್ಟಿಯನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ದೋಷ - ಉಳಿತಾಯ ಖಾತೆಗಳ ಪಟ್ಟಿಯನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ದೋಷ - ಉಳಿತಾಯ ಖಾತೆಗಳ ಬಗ್ಗೆ ವಿವರಗಳನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ದೋಷ - ಇತ್ತೀಚಿನ ವ್ಯವಹಾರಗಳಲ್ಲಿ ಲೋಡ್ ಮಾಡುವಾಗ ದೋಷ ಸಂಭವಿಸಿದೆ - ಖಾತೆಗಳನ್ನು ಸ್ವೀಕರಿಸುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ - ಗ್ರಾಹಕ ಕಂಡುಬಂದಿಲ್ಲ - ಗ್ರಾಹಕನನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗಲಿಲ್ಲ - ಬಳಕೆದಾರರ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ - ಖಾತೆಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ - ಮರುಪಾವತಿಯ ವೇಳಾಪಟ್ಟಿ ಮರುಪಡೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ - ನಿಮ್ಮ ಸ್ವಂತ ಖಾತೆಗೆ ನೀವು ವರ್ಗಾವಣೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ - ವರ್ಗಾವಣೆ ಟೆಂಪ್ಲೆಟ್ ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗಲಿಲ್ಲ - ಕ್ರೆಡಿಟ್ಗಳನ್ನು ಪಡೆಯಲಾಗಲಿಲ್ಲ - ಉತ್ತರಾಧಿಕಾರಿ ಟೆಂಪ್ಲೇಟ್ ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗಲಿಲ್ಲ - ಟೆಂಪ್ಲೇಟ್ ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗಲಿಲ್ಲ - ಉತ್ತರಾಧಿಕಾರಿ ಯಶಸ್ವಿಯಾಗಲಿಲ್ಲ - ಉತ್ತರಾಧಿಕಾರಿ ಅನ್ನು ನವೀಕರಿಸಲಾಗಿಲ್ಲ - ಉತ್ತರಾಧಿಕಾರಿ ತೆಗೆದುಹಾಕಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ - ಸಾಲ ಖಾತೆಯನ್ನು ಹಿಂಪಡೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ - ಮೂರನೇ ವ್ಯಕ್ತಿಯ ವರ್ಗಾವಣೆ ಟೆಂಪ್ಲೆಟ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ದೋಷ - ನಿಮಗೆ ಪ್ರಸ್ತುತ ಉತ್ತರಾಧಿಕಾರಿ ಇಲ್ಲ. ಉತ್ತರಾಧಿಕಾರಿ ಸೇರಿಸಿ - - ನಿಮಗೆ ಅಧಿಕಾರ ಇಲ್ಲ - QR ಕೋಡ್ - QR ಕೋಡ್ ಹಂಚಿಕೊಳ್ಳಿ - ಮಾನಿಟರ್ - ಒಂದು ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ - ವಹಿವಾಟುಗಳನ್ನು ವೀಕ್ಷಿಸಿ - ಶುಲ್ಕಗಳು ನೋಡಿ - ಸಾಲ ಸಾರಾಂಶವನ್ನು ನೋಡಿ - ಮರುಪಾವತಿಯ ವೇಳಾಪಟ್ಟಿ ನೋಡಿ - ಈ ಖಾತೆಗಾಗಿ QR ಕೋಡ್ ಅನ್ನು ವೀಕ್ಷಿಸಿ - ಕೊನೆಯ ವಹಿವಾಟಿನ ವಿವರಗಳು - ಬಳಕೆದಾರಹೆಸರು 6 ಅಕ್ಷರಗಳಿಗಿಂತ ಹೆಚ್ಚಿರಬೇಕು - ಅಮಾನ್ಯ ಇಮೇಲ್ ID - ಸರ್ವರ್ ಕೆಳಗೆ, ಸ್ವಲ್ಪ ಸಮಯದ ನಂತರ ಪ್ರಯತ್ನಿಸಿ - ಗ್ರಾಹಕ ಶುಲ್ಕ - QR ಓದುವಲ್ಲಿ ದೋಷ, ನೀವು ಸರಿಯಾದ ಪ್ರದೇಶವನ್ನು ಆಯ್ಕೆ ಮಾಡಿಕೊಳ್ಳಿ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ - ಚಿತ್ರವನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡುವಾಗ ದೋಷ ಸಂಭವಿಸಿದೆ - ಗ್ರಾಹಕ ಡೌನ್ಲೋಡ್ - - ಸ್ಪೇಸಸ್ - ಗ್ರಾಹಕ ಹೆಸರು - ಖಾತೆ ಸ್ಥಿತಿ - ಉತ್ಪನ್ನದ ಹೆಸರು - ಒಟ್ಟು ಪಾವತಿ - ಕನಿಷ್ಠ ಬಾಲ್ ಅಗತ್ಯವಿದೆ. - ಉತ್ಪನ್ನದ ಹೆಸರು - ಸಾಲದ ಉದ್ದೇಶ - ನಿರ್ದೇಶಕ - ಪ್ರಧಾನ ಪಾವತಿಸಿತು - ವಾರ್ಷಿಕ ಬಡ್ಡಿ ದರ - ಆಸಕ್ತಿ ಹೆಚ್ಚಿದೆ - ಆಸಕ್ತಿ ನೀಡಲಾಗಿದೆ - ಕ್ರೆಡಿಟ್ ಖಾತೆಯ ವಿವರಗಳು - ಸಾಲದ ಸಾರಾಂಶ - ಸಾಲದ ಹೆಸರು - ಆಸಕ್ತಿ - ಶುಲ್ಕ - ದಂಡ - ಒಟ್ಟು ನಿರೀಕ್ಷಿತ ಪಾವತಿ - ಒಟ್ಟು ಪಾವತಿಸಲಾಗಿದೆ - ಆಸಕ್ತಿಯುಂಟಾಯಿತು - ಪೆನಾಲ್ಟಿ ಮುರಿದಿದೆ - ಶುಲ್ಕವನ್ನು ಮನ್ನಾ ಮಾಡಲಾಗಿದೆ - ಅತ್ಯುತ್ತಮ ಸಮತೋಲನ - ಮುಂದಿನ ಕಂತು - ಪಾವತಿ ಗಡುವು - ಪಾವತಿ ಮಾಡಿ - ಸಾಲದ ಪ್ರಕಾರ - ಕರೆನ್ಸಿ - ಮರುಪಾವತಿಯ ವೇಳಾಪಟ್ಟಿ - ವ್ಯವಹಾರ - ವರ್ಗಾವಣೆ - ಅನುಮೋದನೆ ಪ್ರಗತಿಯಲ್ಲಿದೆ - ಪಾವತಿಗಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ - ಕೆಲವು ಜವಾಬ್ದಾರಿಗಳಿಂದಾಗಿ ಮುಚ್ಚಲಾಗಿದೆ - ಸಾಲ ಮುಚ್ಚಲಾಗಿದೆ - ದಿನಾಂಕದಂದು: - ಮೂಲಕ: - ಸಲ್ಲಿಸುತ್ತಾ: - ಬಿಟ್ಟುಕೊಟ್ಟಿತು: - ಮಿತಿಮೀರಿದ: - ಉದಾಹರಣೆಗೆ - ವಿಜೆಟ್ ಸೇರಿಸಿ - ಸಹಾಯ - ದೊಡ್ಡ ತಾಂತ್ರಿಕ ಕೈಗಾರಿಕೆಗಳ ಸ್ಥಳ - ಸಾಲ ಖಾತೆಯ ವಿವರಗಳು - ಕ್ರೆಡಿಟ್ ಅಪ್ಲಿಕೇಶನ್ ಯಶಸ್ವಿಯಾಗಿ ಕಳುಹಿಸಲಾಗಿದೆ - ಸಾಲದ ಅರ್ಜಿಯನ್ನು ಯಶಸ್ವಿಯಾಗಿ ನವೀಕರಿಸಲಾಗಿದೆ - ಸಾಲ ಅರ್ಜಿಯನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಹಿಂಪಡೆಯಲಾಗಿದೆ - ನಥಿಂಗ್ - ಎಲ್ಲಾ - 4 ವಾರಗಳು - ಮೂರು ತಿಂಗಳು - 6 ತಿಂಗಳು - ಫಿಲ್ಟರ್ - ಪ್ರಾರಂಭ ದಿನಾಂಕ - ಅಂತ್ಯದ ದಿನಾಂಕ - ಫಿಲ್ಟರ್ - ಪ್ರಾರಂಭ ಮತ್ತು ಅಂತಿಮ ದಿನಾಂಕವನ್ನು ಆರಿಸಿ - ಅಂತಿಮ ದಿನಾಂಕವು ಪ್ರಾರಂಭ ದಿನಾಂಕಕ್ಕಿಂತ ಹೆಚ್ಚಿನದಾಗಿರಬೇಕು - ನಿಮ್ಮ ಖಾತೆಯಲ್ಲಿ ವ್ಯವಹಾರಗಳನ್ನು ಉಳಿಸಲಾಗುತ್ತಿದೆ - ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವಿಲ್ಲ - ಪಾವತಿ ದಿನಾಂಕ - ಪಾವತಿಗಳ ಸಂಖ್ಯೆ - ದಿನಾಂಕ - ಸಾಲದ ಬಾಕಿ - ಮರುಪಾವತಿಯ - ಸಾಲ ಮರುಪಾವತಿ - ಫಾಸ್ಟ್ ವರ್ಗಾವಣೆ - ನಿಮಗೆ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ - ಉತ್ತರಾಧಿಕಾರಿ - ಉತ್ತರಾಧಿಕಾರಿಗಳನ್ನು ನಿರ್ವಹಿಸಿ - ವಂಶಸ್ಥರು - ಉತ್ತರಾಧಿಕಾರಿ ವಿವರಗಳು - ಉತ್ತರಾಧಿಕಾರಿ ಹೆಸರು - ಖಾತೆ ಪ್ರಕಾರ - ವರ್ಗಾವಣೆ ಮಿತಿ - ಉತ್ತರಾಧಿಕಾರಿ ಸೇರಿಸಿ - ಕಚೇರಿಯ ಹೆಸರು - ಖಾತೆಯ ಪ್ರಕಾರವನ್ನು ಆರಿಸಿ * - ಉತ್ತರಾಧಿಕಾರಿಯನ್ನು ಸಲ್ಲಿಸಿ - ಉತ್ತರಾಧಿಕಾರಿ ಕಚೇರಿಯ ಹೆಸರನ್ನು ನಮೂದಿಸಿ - ಉತ್ತರಾಧಿಕಾರಿ ಹೆಸರನ್ನು ನಮೂದಿಸಿ - ವರ್ಗಾವಣೆ ಮಿತಿಯನ್ನು ನಮೂದಿಸಿ - ಉತ್ತರಾಧಿಕಾರಿಯ ಖಾತೆ ಸಂಖ್ಯೆಯನ್ನು ನಮೂದಿಸಿ - ಡ್ರಾಪ್-ಡೌನ್ ಮೆನುವಿನಿಂದ ಖಾತೆ ಪ್ರಕಾರವನ್ನು ಆಯ್ಕೆಮಾಡಿ - ಉತ್ತರಾಧಿಕಾರಿ ಯಶಸ್ವಿಯಾಗಿ ರಚಿಸಲಾಗಿದೆ - ಉತ್ತರಾಧಿಕಾರಿ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ನವೀಕರಿಸಲಾಗಿದೆ - ನಿಮ್ಮ ಉತ್ತರಾಧಿಕಾರಿಗಳನ್ನು ನವೀಕರಿಸಿ - ಉತ್ತರಾಧಿಕಾರಿ ತೆಗೆದುಹಾಕಿ - ಈ ಉತ್ತರಾಧಿಕಾರಿಗಳನ್ನು ತೆಗೆದುಹಾಕಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? - ಅಳಿಸಿ - ಉತ್ತರಾಧಿಕಾರಿ ತೆಗೆದುಹಾಕಲಾಗಿದೆ - ಮೂರನೇ ವ್ಯಕ್ತಿಯ ವರ್ಗಾವಣೆ - ಒಟ್ಟು ಸಾಲ - ಒಟ್ಟು ಉಳಿತಾಯ - ಖಾತೆ ಅವಲೋಕನ - ಒಟ್ಟು ಉಳಿತಾಯದ ಮೊತ್ತವನ್ನು ತೋರಿಸಿ ಅಥವಾ ಮರೆಮಾಡಿ - ಒಟ್ಟು ಸಾಲದ ಮೊತ್ತವನ್ನು ತೋರಿಸಿ ಅಥವಾ ಮರೆಮಾಡಿ - ***** - ಸಮೀಕ್ಷೆಗಳು - ಸಕ್ರಿಯಗೊಳಿಸುವ ದಿನಾಂಕ - ಗುಂಪು - ಬಳಕೆದಾರ ಡೇಟಾ - ಗ್ರಾಹಕ ಪ್ರಕಾರ - ಗ್ರಾಹಕ ವರ್ಗೀಕರಣ - ಮೋಡ್ ಅನ್ನು ಆರಿಸಿ - ನಿಮ್ಮ ಖಾತೆಗೆ ಬಾಹ್ಯ ಉತ್ತರಾಧಿಕಾರಿಗಳನ್ನು ಸೇರಿಸಿ. \nಖಾತೆಯ QR ಕೋಡ್ ಅನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ ಅಥವಾ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ - ನಿಮ್ಮ ಖಾತೆಯಲ್ಲಿ ನೀವು ಕ್ರಮಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ, ಉಳಿತಾಯ ಖಾತೆ ಅಥವಾ ಇನ್ನೊಂದು ಬಳಕೆದಾರನ ಸಾಲದ ಖಾತೆಯಿಂದ QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಬಹುದು - ಸೇರಿಸಿ - ಸ್ಕ್ಯಾನ್ - 4-ಅಂಕಿಯ ಪ್ರವೇಶ ಕೋಡ್ ನಮೂದಿಸಿ - ಪ್ರವೇಶ ಕೋಡ್ 4 ಅಂಕಿಗಳನ್ನು ಒಳಗೊಂಡಿರಬೇಕು - ತಪ್ಪಾದ ಪ್ರವೇಶ ಕೋಡ್ - ನೀವು ತಪ್ಪಾದ ಪ್ರವೇಶ ಕೋಡ್ ಅನ್ನು 3 ಕ್ಕೂ ಹೆಚ್ಚು ಬಾರಿ ನಮೂದಿಸಿದ್ದೀರಿ - ಸ್ಕಿಪ್ - ಉಳಿಸಿ - ಲಾಗ್ ಇನ್ ಮಾಡಲು ಪಿನ್ ಹೊಂದಿಸಿ - ಪಿನ್ ಅನ್ನು ಮತ್ತೆ ನಮೂದಿಸಿ - ಪ್ರವೇಶ ಕೋಡ್ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. - ನಾನು ಪಿನ್ ಅನ್ನು ಮರೆತಿದ್ದೇನೆ, ನಾನು ಪಾಸ್ವರ್ಡ್ನೊಂದಿಗೆ ಪ್ರವೇಶಿಸುತ್ತೇನೆ - ಮುಂದುವರಿಸಲು - ಮೊತ್ತ ಶೂನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚಿನದಾಗಿರಬೇಕು - ಬುಕ್ಮಾರ್ಕ್ ನಮ್ಮ ಬಗ್ಗೆ ನಿರ್ಮಾಣ ಹಂತದಲ್ಲಿದೆ - ನಿರ್ಮಾಣ ಟ್ಯಾಬ್ ಅಡಿಯಲ್ಲಿ ಸಹಾಯ - ಲಾಗ್ ಔಟ್ - ಇಲ್ಲಿ ಸ್ವಯಂ ಸೇವಾ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ: https://play.google.com/store/apps/details?id= - ಅಪ್ಲಿಕೇಶನ್ ಆಯ್ಕೆಮಾಡಿ - ದಿ - QR ಸಲ್ಲಿಸಿ - QR ಕೋಡ್ನೊಂದಿಗೆ ಪ್ರದೇಶವನ್ನು ಆರಿಸಿ - - ನಮ್ಮನ್ನು ಸಂಪರ್ಕಿಸಿ - ಯಶಸ್ವಿ ವರ್ಗಾವಣೆ - - ಒಟ್ಟು: - - ಎ/ಸಿ - ಸಾಲದ ಉತ್ಪನ್ನ - ನಿಷ್ಕ್ರಿಯ - ಸಕ್ರಿಯ - ನಿಷ್ಕ್ರಿಯ - - - ಲಾಗ್ ಔಟ್ ಮಾಡಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? - ಸರಿ - ರದ್ದು - ರಿಟರ್ನ್ - ಪ್ರವೇಶವನ್ನು ನಿರಾಕರಿಸಲಾಗಿದೆ - ನನಗೆ ಖಚಿತವಾಗಿದೆ - ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ - ಅಪ್ಲಿಕೇಶನ್ ಸೆಟ್ಟಿಂಗ್ಗಳು - ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಲು ಅನುಮತಿಯಿಲ್ಲದೆ, ಉತ್ತರಾಧಿಕಾರಿಗಳನ್ನು ಸೇರಿಸಲು ನೀವು QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ನಿಷೇಧಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? - ಕ್ಯಾಮರಾ ಬಳಸಲು ಅನುಮತಿಯನ್ನು ನಿರಾಕರಿಸಿದ್ದೀರಿ, ಈ ಅನುಮತಿಯಿಲ್ಲದೆ ನೀವು QR ಕೋಡ್ ಬಳಸಿ ಉತ್ತರಾಧಿಕಾರಿಗಳನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಅದನ್ನು ಆನ್ ಮಾಡಿ - ಮೆಮೊರಿಯಿಂದ ಓದಲು ಅನುಮತಿಯಿಲ್ಲದೆ, ಉತ್ತರಾಧಿಕಾರಿ ಸೇರಿಸಲು ನೀವು QR ಕೋಡ್ ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ನಿಷೇಧಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? - ಸಾಧನದ ಮೆಮೊರಿಯಿಂದ ಓದಲು ಅನುಮತಿಯನ್ನು ನೀವು ನಿರಾಕರಿಸಿದ್ದೀರಿ, ಈ ಅನುಮತಿಯಿಲ್ಲದೆ ನೀವು QR ಕೋಡ್ ಬಳಸಿಕೊಂಡು ಉತ್ತರಾಧಿಕಾರಿಗಳನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಅದನ್ನು ಆನ್ ಮಾಡಿ - ಸಾಧನದ ಮೆಮೊರಿಗೆ ಬರೆಯಲು ನೀವು ನಿರಾಕರಿಸಿದ್ದೀರಿ, ಈ ಅನುಮತಿಯಿಲ್ಲದೆ ನೀವು QR ಕೋಡ್ ಬಳಸಿ ಉತ್ತರಾಧಿಕಾರಿಗಳನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಅದನ್ನು ಆನ್ ಮಾಡಿ - ದೇಶವನ್ನು ಅವಲಂಬಿಸಿ ಕರೆನ್ಸಿ ತೋರಿಸಲು ಈ ಅನುಮತಿ ಅಗತ್ಯವಿದೆ. ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ನಿಷೇಧಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? - ಈ ಅನುಮತಿಯಿಲ್ಲದೆ, ಸರಿಯಾದ ಸ್ಥಿತಿಯಲ್ಲಿ ಕರೆನ್ಸಿ ಪ್ರದರ್ಶಿಸದೆ ಇರಬಹುದು, ಸಾಧನ ಸ್ಥಿತಿಯನ್ನು ಓದಲು ನೀವು ಅನುಮತಿಯನ್ನು ನಿರಾಕರಿಸಿದ್ದೀರಿ. ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಅದನ್ನು ಆನ್ ಮಾಡಿ - ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಚಟುವಟಿಕೆಯನ್ನು ಹುಡುಕುತ್ತಿರುವಾಗ ಯಾವುದೋ ತಪ್ಪು ಸಂಭವಿಸಿದೆ. \n \'ಸೆಟ್ಟಿಂಗ್ಗಳು\' ಗೆ ಹೋಗಿ ಮತ್ತು ಅನುಮತಿಗಳನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ನೀಡಿ. - ಶೇಖರಣಾ ನಿರಾಕರಣೆಗಳು ನಿರಾಕರಿಸಲ್ಪಟ್ಟವು - %1$s ಅನ್ನು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? - - - ಹಲೋ, %1$s - ಅಮಾನ್ಯವಾದ ಮೊತ್ತ - ನಿರ್ಗಮಿಸಲು ಮತ್ತೆ ಒತ್ತಿರಿ - - ಕ್ಯಾಮೆರಾ ಬಳಸಲು ಅನುಮತಿ ನಿರಾಕರಣೆ - - ಪದೇ ಪದೇ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು - ಬಳಕೆದಾರ ವಿನಂತಿಯನ್ನು - ಈಗ ಕಾಲ್ - ಇ-ಮೇಲ್ ಸಂದೇಶವನ್ನು ಬಿಡಿ - ಸ್ಥಳಗಳನ್ನು ಹುಡುಕಿ - ಪಾವತಿಗಳು ಇಲ್ಲ - ಫಿಲ್ಟರ್ಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ - ಖಾತೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ - ಹೆಚ್ಚು - ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು - ಭಾಷೆಯನ್ನು - ನಿಮ್ಮ ಭಾಷೆಯನ್ನು ಆರಿಸಿ - ಸೂಚನೆಗಳು - ಪ್ರಾಥಮಿಕ URL - ಹಿಡುವಳಿದಾರನು - - - ಹೊಸ ಕ್ರೆಡಿಟ್ ಖಾತೆಗೆ ಹೇಗೆ ಅರ್ಜಿ ಸಲ್ಲಿಸುವುದು? - ನನ್ನ ಪ್ರೊಫೈಲ್ ಬಗ್ಗೆ ನಾನು ಎಲ್ಲಿ ಮಾಹಿತಿಯನ್ನು ನೋಡಬಹುದು? - ನನ್ನ ಉಳಿತಾಯ ಖಾತೆ ವ್ಯವಹಾರಗಳನ್ನು ನಾನು ಎಲ್ಲಿ ನೋಡಬಹುದು? - QR ಕೋಡ್ನ ಬಳಕೆ ಏನು? - QR ಕೋಡ್ ಬಳಸಿಕೊಂಡು ಫಲಾನುಭವಿಗಳನ್ನು ಹೇಗೆ ರಚಿಸುವುದು? - ಕ್ರೆಡಿಟ್ ಖಾತೆಗೆ ಪಾವತಿ ಮಾಡುವುದು ಹೇಗೆ? - - - - ಕ್ರೆಡಿಟ್ ಅಕೌಂಟ್ಗಾಗಿ ಅರ್ಜಿ ಮಾಡಲು, ಹೋಮ್ ಪರದೆಯಲ್ಲಿ \"ಸಾಲದ ಅರ್ಜಿಯನ್ನು ವರದಿ ಮಾಡಿ\" ಕ್ಲಿಕ್ ಮಾಡಿ. - ಮುಖ್ಯ ಅಪ್ಲಿಕೇಶನ್ ಪುಟದಲ್ಲಿನ ಪ್ರೊಫೈಲ್ ಚಿತ್ರದ ಮೇಲೆ ಕ್ಲಿಕ್ ಮಾಡುವುದರ ಮೂಲಕ ನಿಮ್ಮ ಪ್ರೊಫೈಲ್ ಮಾಹಿತಿಯನ್ನು ನೀವು ವೀಕ್ಷಿಸಬಹುದು. - ನಿಮ್ಮ ಉಳಿತಾಯ ಖಾತೆಯಲ್ಲಿನ ವ್ಯವಹಾರಗಳನ್ನು ವೀಕ್ಷಿಸಲು, ಖಾತೆಗಳ ವಿಭಾಗಕ್ಕೆ ಹೋಗಿ, ಅಗತ್ಯವಾದ ಉಳಿತಾಯ ಖಾತೆ ಕ್ಲಿಕ್ ಮಾಡಿ, ಮೇಲಿನ ಬಲ ಮೂಲೆಯಲ್ಲಿರುವ ಮೂರು ಚುಕ್ಕೆಗಳನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು ವಹಿವಾಟು ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ. - ಎಲ್ಲಾ ಕ್ರೆಡಿಟ್ ಅಥವಾ ಉಳಿತಾಯ ಖಾತೆಗಳಿಗಾಗಿನ QR ಕೋಡ್ ಅನ್ನು ಇತರ ಬಳಕೆದಾರರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಬಹುದಾಗಿದೆ, ಅವರು ಉತ್ತರಾಧಿಕಾರಿಗಳನ್ನು ರಚಿಸಲು ಅವಕಾಶ ನೀಡುತ್ತಾರೆ - , ಉತ್ತರಾಧಿಕಾರಿ ರಚಿಸಲು ಮುಖಪುಟ ಅಪ್ಲಿಕೇಶನ್ ಉತ್ತರಾಧಿಕಾರಿಗಳನ್ನು ಗೆ ಹೋಗಿ, ನಂತರ ಬಲ ಕಡಿಮೆ ಮೂಲೆಯಲ್ಲಿ ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡಿ, ಕ್ಯಾಮರಾ ತೆರೆಯುವಂತಹ ಸ್ಕ್ಯಾನ್, ಆಯ್ಕೆ ಅಗತ್ಯ ದಶಮಾಂಶ ತುಂಬುವ ಸಾಧ್ಯವಾಗುತ್ತದೆ ನಂತರ, QR ಕೋಡ್ ನೀವು ಉತ್ತರಾಧಿಕಾರಿ ರಚಿಸಲು ಬಯಸುವ ಅವರಲ್ಲಿ ವ್ಯಕ್ತಿಯ ಸ್ಕ್ಯಾನ್ QR ಕೋಡ್ ಬಳಸಿಕೊಂಡು ಉತ್ತರಾಧಿಕಾರಿಗಳನ್ನು ರಚಿಸಲು - ಸಾಲ ಖಾತೆಗೆ ಪಾವತಿಯನ್ನು ಮಾಡಲು, ಖಾತೆಗಳ ವಿಭಾಗಕ್ಕೆ ಹೋಗಿ, ಸಾಲ ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ, ನಂತರ ಗುರಿ ಕ್ರೆಡಿಟ್ ಖಾತೆಯನ್ನು ತೆರೆಯಿರಿ ಮತ್ತು ಪಾವತಿ ಆಯ್ಕೆಯನ್ನು ಮಾಡಿ ಕ್ಲಿಕ್ ಮಾಡಿ. - - - - ಉಳಿತಾಯದ ಒಟ್ಟು ಸಮತೋಲನ - ಒಟ್ಟು ಸಾಲದ ಬಾಕಿ - ಎಲ್ಲಾ ಉಳಿತಾಯ ಮತ್ತು ಸಾಲದ ಖಾತೆಗಳ ಆಧಾರದ ಮೇಲೆ ಲೆಕ್ಕಹಾಕಲ್ಪಟ್ಟ ಬ್ಯಾಂಕಿನ ಖಾತೆ ಮತ್ತು ಉಳಿತಾಯ ಖಾತೆಯ ಸಮತೋಲನವು ಮೇಲಿರುತ್ತದೆ - ವರ್ಗಾವಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? - ಆದ್ದರಿಂದ - ಪಾಸ್ವರ್ಡ್ ದೃಢೀಕರಿಸಿ - ಪಾಸ್ವರ್ಡ್ ಹೊಂದುತ್ತಿಲ್ಲ. - ಆವೃತ್ತಿ%1$s - ಎಲ್ಲಾ ಹಕ್ಕುಗಳನ್ನು ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ. - ಪರವಾನಗಿ - ವರ್ಗಾವಣೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ, ದಯವಿಟ್ಟು ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ - ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ… - ಸಂದೇಶ - ಅಧಿಸೂಚನೆಯಿಲ್ಲ - - ಎಂಡ್ಪೋಯಿಂಟ್ ನವೀಕರಿಸಿ - ಎಂಡ್ಪೋಯಿಂಟ್ ಸಂರಚನೆಗಳನ್ನು ಬದಲಾಯಿಸಲು ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ - ಪ್ರಾಥಮಿಕ URL ಅನ್ನು ನಮೂದಿಸಿ - ಟೆನಂಟ್ಗೆ ಹೋಗಿ - ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ - ಲಾಗಿನ್ ವಿಫಲವಾಗಿದೆ ದಯವಿಟ್ಟು ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ. - diff --git a/androidApp/src/main/res/values-my/strings.xml b/androidApp/src/main/res/values-my/strings.xml deleted file mode 100644 index ac34907d1..000000000 --- a/androidApp/src/main/res/values-my/strings.xml +++ /dev/null @@ -1,455 +0,0 @@ - - - - Mifos မိုဘိုင်း - လော့ဂ်အင် - %1$s ကိုမှလှိုက်လှဲစွာကြိုဆိုပါသည် - အင်တာနက်ချိတ်ဆက်မ - အခြေခံပညာ - username - ဝင်ရောက်သည် - loading - Password ကို - အီးမေးလ်ပို့ရန် - accounts ကို - clients - ရန်ပုံငွေလွှဲပြောင်း - မကြာမီကအရောင်းအဝယ် - စွဲချက် - မေးခွန်းပုံစံ - ကျွန်ုပ်တို့အကြောင်း - အကောင့်အသေးစိတ်ကိုသိမ်းဆည်းနေ - ငွေစုဘဏ်စာရင်း - ချေးငွေအတွက်တင်ပေးမှုအမှားအသေးစိတ်အကောင့် - အမည်ခံအတိုးနှုန်း - အကောင့်နံပါတ် - အကောင့် Balance - စုစုပေါင်းစာရင်း - ပွင့်လင်းအံဆွဲမီနူး - အနီးကပ်အံဆွဲမီနူး - နေအိမ် - အလတ်စားစာသား - အသေးစားစာသား - client Accounts ကို - ရေပက် - သိမ်းဆည်းနေ - ခြေးငှေ - ချေးငွေအကောင့် - ဝေစု - ဝေမျှမယ်အကောင့် - တစ်ဦးကို client ကို ရွေးချယ်. - အလုပ်အဖွဲ့ - အဆင့်အတန်းပုံရိပ် - ပြန်ဆပ်ဇယား - နောက်ဆုံးငွေသွင်းငွေထုတ် - အပေါ်ကိုဖန်ဆင်း - တစ်ဦးလွှဲပြောင်း Make - * ချေးငွေထုတ်ကုန်ပစ္စည်းကို Select လုပ်ပါ - ချေးငွေ၏ရည်ရွယ်ချက် * - ကျောင်းအုပ်ကြီးငွေပမာဏ * - ငွေပမာဏ - ပွောဆို - မျှော်လင့်ထားသည့်ငွေပေးချေနေ့စွဲ - တင်သွင်းခဲ့တဲ့နေ့စွဲ - Submitted - ငွေပေးချေ - လွှဲပြောင်းနေ့စွဲ - ချေးငွေအဘို့အ Apply - Update ကိုချေးငွေ - ချေးငွေထုတ်ယူ - ချေးငွေငွေထုတ်ဖို့အကြောင်းရင်း - ချေးငွေအကောင့်ကိုအောင်မြင်စွာဆုတ်ခွာ - ချေးငွေ Submit - အသစ်ချေးငွေလျှောက်လွှာ - များအတွက် Update ကိုချေးငွေလျှောက်လွှာ - အကျိုးစီးပွားအမျိုးအစား - Amortization - အကျိုးစီးပွားတွက်ချက်မှုကာလ - ပြန်ဆပ်မဟာဗျူဟာ - ရန်ပေးဆောင် - မှစ. ပေးဆောင် - Cancel - ဆန်းစစ်ခြင်း - ရန်လွှဲပြောင်း - မှစ. လွှဲပြောင်း - လွှဲပြောင်း Making - အပျငှေ - ငွေပမာဏကိုရိုက်ထည့် - မှတ်ချက်မဖြစ်မနေဖြစ်ပါသည် - approved - လာမည့် - paid - ချိန်ခွင်လျှာ - ပယ်ချ - စောင့်ဆိုင်းနေ - Overpaid - ကြွေးကျန်အတွက် - သငျသညျလျှောက်ထားချင်အားလုံးကို Select လုပ်ပါ - ချွေတာသုံးစွဲ Accounts ကို Filter - ချေးငွေ Accounts ကို Filter - filter ဝေမျှမယ် Accounts ကို - ရှာဖှေ - ရန်ငွေပေးချေရန်အကောင့်ကိုရွေးချယ်ပါ - မှစ. ငွေပေးချေရန်အကောင့်ကိုရွေးချယ်ပါ - လွှဲပြောင်းမှတ်ချက် Enter - အကျိုးခံစား Select လုပ်ပါ - ဆက်လက် - ပိတ် - လွှဲပြောင်းအမျိုးအစားကိုရွေးချယ်ပါ - ချွေတာသုံးစွဲနိုင်ရန်လွှဲပြောင်း - ချွေတာသုံးစွဲရာမှလွှဲပြောင်း - ချေးငွေစွပ်စွဲချက် - ချွေတာသုံးစွဲစွပ်စွဲချက် - active - ပိတ်သိမ်း - ဆုတ်ခွာ - အတည်ပြုချက်လိုအပ် - လာမည့် - ရင့်ကျက် - အကောင့်တစ်ခုဖန်တီးသည် - နာမည် - မျိုးနွယ်အမည် - ဖုန်းနံပါတ် - စာရင်း - တောင်းဆိုမှု Id - authentication တိုကင် - Verify - အတည်ပြု - တက်လက်မှတ်ထိုး - အသုံးပြုသူကိုအောင်မြင်စွာအတည်ပြုလိုက်ပါပြီ - မိုဘိုင်း - အီးမေးလ်က - verification Mode ကို - - သွင်းကုန် QR - ကြည့်ရန်အာမခံ - အာမခံ Add - အာမခံကိုဖျက်မည် - Update ကိုအာမခံ - အာမခံအမျိုးအစား - အဘယ်သူမျှမအာမခံ - အာမခံ Add ရန်ကိုအသာပုတ် - အာမခံအသေးစိတ် - ဝင်ရောက်ခဲ့ပြီးနေ့စွဲ - Submit - - အကောင့်တစ်ခုဖျော်ဖြေဖို့ Active ကိုဖြစ်သင့်တယ်အပျငှေ - အကောင့်တစ်ခုဖျော်ဖြေဖို့ Active ကိုဖြစ်သင့်တယ်လွှဲပြောင်း - - သင်နှင့်အတူဆက်နွယ်ခြင်းမရှိ SavingsAccount ရှိပါတယ် - သင်နှင့်အတူဆက်နွယ်ခြင်းမရှိ LoanAccount ရှိပါတယ် - သင်နှင့်အတူဆက်နွယ်ခြင်းမရှိ ShareAccount ရှိပါတယ် - သင်နှင့်အတူဆက်နွယ်ခြင်းမရှိငွေကြေးလွှဲပြောင်းမှုမှာရှိပါတယ် - သင်နှင့်အတူဆက်နွယ်ခြင်းမရှိပြန်ဆပ်အချိန်ဇယားရှိပါတယ်      - ရရှိနိုင်ပါကပိုအရောင်းအဘယ်သူမျှမက - အဘယ်သူမျှမငွေသွင်းငွေထုတ် - DOB မတွေ့ပါ။ - မည်သည့်အဖွဲ့တစ်ဖွဲ့နှင့်အတူ Assigned မဟုတ် - - မှားနေသောအသုံးပြုသူအမည် / Password ကို - server ကနေတင်ပေးမှုအမှားတုန့်ပြန် - %1$s ကိုအလွတ်မဖွစျနိုငျ - %1$s ကို %2$d ဃဇာတ်ကောင်ထက်လျော့နည်းမဖွစျနိုငျ - %1$s ကို %2$s ကိုဆံ့မခံနိုင်သည် - ကိုစတင်မနိုင် %1$s သို့မဟုတ်ဗလာဖြင့်အဆုံး - ပြည်တွင်းရေး server ကိုအမှား,ျေးဇူးပြု.ထပ်ကြိုးစား - မှားယွင်းနေသည်တင်clientကိုစာရင်း - ချေးငွေအကောင့်စာရင်းထဲတွင်တင်ပေးမှုအမှား - အကောင့်စာရင်းချွေတာအတွက်တင်ပေးမှုအမှား - ချွေတာရေးအတွက်တင်ပေးမှုအမှားအသေးစိတ်အကောင - လတ်တလောအရောင်းအဝယ်အတွက်တင်ပေးမှုအမှား - client ကိုစွဲချက်အတွက်တင်ပေးမှုအမှား - စွဲချက်မျှမတွေ့ - client တွေ့မ - လိုင်းဆွဲယူရန်မအောင်မြင်ခဲ့ပါ - အသုံးပြုသူပရိုဖိုင်ဆွဲယူရန်မအောင်မြင်ခဲ့ပါ - Accounts ကိုဆွဲယူရန်မအောင်မြင်ခဲ့ပါ - ပြန်ဆပ်အချိန်ဇယားကိုဆွဲယူနိုင်ရန် Failed - တူညီသောအကောင့်အတွင်းလွှဲပြောင်းမပေးနိုင် - ရယူအကောင့်လွှဲပြောင်းရန်မှားယွင်းနေသည်template ကို - အကျိုးခံစားရသူများဆွဲယူရန်မအောင်မြင်ခဲ့ပါ - အကျိုးခံစား Template ကိုဆွဲယူရန်မအောင်မြင်ခဲ့ပါ - template ကိုဆွဲယူရန်မအောင်မြင်ခဲ့ပါ - အကျိုးခံစားဖန်တီးရန်မအောင်မြင်ခဲ့ပါ - အကျိုးခံစားအပ်ဒိတ်လုပ်ရန်မအောင်မြင်ခဲ့ပါ - အကျိုးခံစား delete ရန်မအောင်မြင်ခဲ့ပါ - ချေးငွေအကောင့်ဆုတ်ခွာအတွက်မှားယွင်းနေသည် - တတိယပါတီလွှဲပြောင်းယူခဲ့ပါရန်မှားယွင်းနေသည်template ကို - လောလောဆယ်ကသင်သည်မည်သည့်အကျိုးခံစားစရာမလိုပါ။ အကျိုးခံစား add ပေးပါ - - သငျသညျအခွင့်မရှိပါ - QR Code ကို - ဝေမျှမယ်ဖို့အတွက် QR Code ကို - စောငျ့ရှောကျ - option ကိုရှေးခယျြပါ - ကြည့်ရန်အရောင်းအဝယ် - ကြည့်ရန်စွပ်စွဲချက် - ကြည့်ရန်ချေးငွေအကျဉ်းချုပ် - ကြည့်ရန်ပြန်ဆပ်ဇယား - ဒီအကောင့်ဖို့အတွက် QR Code ကို View - နောက်ဆုံးငွေသွင်းငွေထုတ်အသေးစိတ် - username 6 အက္ခရာစဉ်တွေထက် သာ. ကြီးမြတ်ဖြစ်သင - မှားနေသောအီးမေးလ်ကအိုင်ဒီ - Server ကို Down, အခြို့အချိန်ပြီးနောက်ကြိုးစားပါ - client စွပ်စွဲချက် -  မှားယွင်းနေသည် QR ဖတ်နေစဉ်တွင်သေချာသငျသညျသငျ့လျြောသောဒေသကို select လုပ - ရယူမှုအမှားပုံရိပ်ကို - ရယူလိုင်း - - spaces - client အမည် - အကောင့်အခြေအနေ - ထုတ်ကုန်အမည် - စုစုပေါင်းရုပ်သိမ်းပေးရန် - min ။ လိုအပ်တဲ့ Bal ။ - ထုတ်ကုန်အမည် - ချေးငွေရည်ရွယ်ချက် - ကြောငျးအုပျကွီး - ကျောင်းအုပ်ကြီးထုတ်ချေး - အမ်း။ အတိုးနှုန်း - အကျိုးစီးပွားအားသွင်းပြီး - အကျိုးစီးပွား Paid - ချေးငွေအကောင့်အသေးစိတ် - ချေးငွေအကျဉ်းချုပ် - ချေးငွေအမည် - စိတ်ဝင်စားမှု - အဖိုးအခ - ပြစ်ဒဏ်များ - စုစုပေါင်းမျှော်လင့်ထားပြန်ဆပ် - Paid စုစုပေါင်း - အကျိုးစီးပွားသက်ညှာ - သက်ညှာပြစ်ဒဏ်များ - အခကြေးငွေ Waived - ထူးချွန် Balance - next ကို installation - နောက်ဆုံးရက် - ငွေပေးချေမှုရမည့် Make - ချေးငွေအမျိုးအစား - ငွေကြေးစနစ် - ပြန်ဆပ်ဇယား - အရောင်းအ - လွှဲပြောင်း - ခွင့်ပြုချက်ဆိုင်းငံ့ထား - ငွေပေးချေဘို့စောင့်ဆိုင်းနေ - ဘာဖြစ်လို့လဲဆိုတော့တချို့တာဝန်၏အပိတ် - ချေးငွေပိတ်သည် - နောက်ဆုံးရက်: - ကြောင့်: - paid: - ချီလွှဲ: - ထူးချွန်: - ဥပမာ - ဝစ်ဂျက်ကို Add - ကူညီပါ - Mifos Initiative - Mifos Initiative မှ, ဆီယက်တဲလ်ဝါရှင်တန် 98121 - ဆီယက်တဲလ် - ကြီးမားသောနည်းပညာစက်မှုလုပ်ငန်းမှနေအိမ် - ချေးငွေအကောင့်အသေးစိတ် - အောင်မြင်စွာ Submitted ချေးငွေလျှောက်လွှာ - ချေးငွေလျှောက်လွှာအောင်မြင်စွာနောက်ဆုံးရေးသားချိန် - ချေးငွေလျှောက်လွှာအောင်မြင်စွာရုတ်သိမ်း - အဘယ်သူမျှမ - အားလုံး - ၄ သီတင်းပါတ် - ၃ လ - ၆ လ - ရေစစ် - စတင်သည့်ရက်စွဲ - အဆုံးနေ့စွဲ - စစ်ထုတ်သည် - စတင်ရက်စွဲနှင့်အဆုံးသည့်ရက်စွဲကို select ပေးပါ - အဆုံးနေ့စွဲ Start ကိုရက်စွဲထက် သာ. ကြီးမြတ်ဖြစ်ရမည် - အကောင့်အရောင်းအဝယ်သိမ်းဆည်းနေ - အဘယ်သူမျှမအင်တာနက်ကော်နက်ရှင် - ငွေပေးချေနေ့စွဲ - ငွေပေးချေမှုအရေအတွက် - နေ့စှဲ - ချေးငွေ Balance - ပြန်ဆပ်ခြင်း - ချေးငွေပြန်ဆပ် - လျင်မြန်စွာလွှဲပြောင်း - သေချာသင်အင်တာနက်ချိတ်ဆက်ထားသေချာအောင်လုပ်ပါ - အသကျမှေးမှုကြေးဇူးခံစားရသူ - အကျိုးခံစားရသူများစီမံခန့်ခွဲရန် - အကျိုးခံစားခွင့် - အကျိုးခံစားအသေးစိတ် - Beneficiary အမည် - အကောင့်အမျိုးအစား - လွှဲပြောင်းကန့်သတ် - အကျိုးခံစား Add - Office ကိုအမည် - * အကောင့်အမျိုးအစားကိုရွေးချယ်ပါ - အကျိုးခံစား Submit - အကျိုးခံစားရုံးမှအမည် Enter - အကျိုးခံစားအမည် Enter - လွှဲပြောင်းကန့်သတ် Enter - အကျိုးခံစားအကောင့်နံပါတ်ရိုက်ထည့်ပါ - Dropdown မှအကောင့်အမျိုးအစားကိုရွေးချယ်ပါ - အောင်မြင်စွာဖန်တီးအကျိုးခံစား - အကျိုးခံစားအောင်မြင်စွာ updated - Update ကိုအကျိုးခံစား - အကျိုးခံစားဖျက်ပစ်ပါ - သင်ဤပယ်ဖျက်ဖို့လိုတာသေချာအသကျမှေးမှုကြေးဇူးခံစားရသူ - ဖျက်ပစ်ပါ - အကျိုးခံစားအောင်မြင်စွာဖျက်ပစ် - တတိယပါတီလွှဲပြောင်း - စုစုပေါင်းချေးငွေ - စုစုပေါင်းချွေတာသုံးစွဲ - အကောင့်ခြုံငုံသုံးသပ်ချက် - စုစုပေါင်းချေးငွေပမာဏကို ပြပါ သို့မဟုတ် ဝှက်ပါ။ - ***** - စစ်တမ်းများ - activation နေ့စွဲ - အဖွဲ့များ - အသုံးပြုသူအသေးစိတျ - client အမျိုးအစား - client ခွဲခြားရေး - ကို Select လုပ်ပါ Mode ကို - သင့်အကောင့်မှတတိယပါတီအကျိုးခံစားရသူများ Add ။ \ မဟုတ်         ကိုယ်တိုင်ရိုက်ထည့်ပါသို့မဟုတ်အကောင့် QR ကုဒ်ကိုစကင်ဖတ်စစ်ဆေး      - သင်သည်သင်၏အကောင့်သို့အရေးယူမှုလုပ်မပေးနိုငျသညျ, အခြားအသုံးပြုသူချွေတာသုံးစွဲခြင်းနှင့်ချေးငွေအကောင့်ဖို့အတွက် QR Code ကို scan ကျေးဇူးပြုပြီး - ပေါင်း - scan - ၄ ဂဏန်း passcode ကိုရိုက်ထည့် - passcode ၄ ဂဏန်း၏ဖြစ်သင့် - မှားယွင်းနေ passcode - သင်ပိုမိုထက်မမှန်ကန်ကြောင်း passcode ထဲသို့ဝင်ခဲ့ကြကြိမ် - ကြိုးခုန် - ကြော်ငြာကို Save လုပ်ရန် - login မှ Setup ကိုတစ်ပတ်စ်ကုတ် - re-ရိုက်ထည့်ပေးပါသင့်ရဲ့ပတ်စ်ကုတ် - passcode မကိုက်ညီပါဘူး။ - ပတ်စ်ကုတ်မေ့နေ, ကိုယ်တိုင် login - ဆက်လက်ဆောင်ရွက် - ငွေပမာဏသုညထက်ကြီးမြတ်ဖြစ်သင့် - ဆောက်လုပ်ရေးလက်အောက်တွင်ကြှနျုပျတို့အကွောငျး - ဆောက်လုပ်ရေးလက်အောက်တွင်အကူအညီ - logout - ကိုယ်ပိုင်ဝန်ဆောင်မှု App ကိုဒီနေရာမှာ Download: https://play.google.com/store/apps/details?id= - လျှောက်လွှာကိုရွေးချယ်ပါ - NA - QR Upload လုပ်ပါ - QR ကုဒ်ကိုနှင့်အတူဒေသကိုရွေးချယ်ပါ - - ကြှနျုပျတို့ကိုဆကျသှယျရနျ - - အောင်မြင်စွာလွှဲပြောင်း - - စုစုပေါင်း: - - A / C - ချေးငွေထုတ်ကုန်ပစ္စည်း - မလှုပ်ရှားတတ်သော - ACTIVE - မလှုပ်မရှား - - - သငျသညျထွက်ပြီးချင်သင်သေချာပါသလား? - အဆင်ပြေလား - Cancel - ပြန်. - ခွင့်တောင်းမှုငြင်းဆိုခြင်း - သေချာပါတယ် - ပြန်ကြိုးစားမည် - App ကိုချိန်ညှိမှုများ - ကင်မရာကိုခွင့်ပြုချက်မရှိဘဲသင်လိမ့်မည်သင်ဤငြင်းပယ်ဖို့လိုတာသေချာ beneficiary.Are ထည့်သွင်းဖို့ QR ကုဒ်ကိုစကင်ဖတ်စစ်ဆေးနိုင်မည်မဟုတ်ပါခွင့်ပြုချက်? - သငျသညျမှခွင့်ပြုချက်ကိုငြင်းပယ်ကြပါပြီသငျသညျဖို့အတွက် QR Code ကိုသုံးပြီးအကျိုးခံစားခွင့်ရှိသူများကိုထည့်သွင်းနိုင်ပါလိမ့်မည်မဟုတ်ဒီခွင့်ပြုချက်မရှိဘဲ, ကင်မရာကိုအသုံးပြုပါ။setting တွင်ပြုလုပ် enable ပေးပါ - သိုလှောင်မှုခွင့်ပြုချက်မရှိဘဲသင်လိမ့်မည်သင်ဤငြင်းပယ်ဖို့လိုတာသေချာ beneficiary.Are ထည့်သွင်းဖို့ QR ကုဒ်ကို upload တင်နိုင်တော့မည်မဟုတ်ခွင့်ပြုချက်? - သငျသညျမှခွင့်ပြုချက်ကိုငြင်းပယ်ကြပါပြီသိုလှောင်မှုကိုဖတ်, ဒီခွင့်ပြုချက်မရှိဘဲသင်ဖို့အတွက် QR Code ကိုသုံးပြီးအကျိုးခံစားခွင့်ရှိသူများကိုထည့်သွင်းနိုင်ပါလိမ့်မည်မဟုတ်။ setting တွင်ပြုလုပ် enable ပေးပါ - သငျသညျမှခွင့်ပြုချက်ကိုငြင်းပယ်ကြပါပြီဒီခွင့်ပြုချက်မရှိဘဲသင်ဖို့အတွက် QR Code ကိုသုံးပြီးအကျိုးခံစားခွင့်ရှိသူများကိုထည့်သွင်းနိုင်ပါလိမ့်မည်မဟုတ်, သိုလှောင်မှုမှရေးပါ။setting တွင်ပြုလုပ် enable ပေးပါ - ဒီအခွင့်ပြုချက်လိုအပ်သည်သင့်ရဲ့ country.Are သည်နှင့်အညီငွေကြေးပြသနိုင်ဖို့သေချာပြီလားသင်ကငြင်းပယ်လိုပါသလား? - သငျသညျခွင့်ပြုချက်ငြင်းပယ်ခဲ့ကြဖုန်းပြည်နယ်ဆွဲယူဖို့, ဒီခွင့်ပြုချက်ငွေကြေးမရှိဘဲသင့်လျော် format နဲ့ပြမရပေလိမ့်မည်။setting တွင်ပြုလုပ် enable ပေးပါ - တစ်ခုခုက Settings လှုပ်ရှားမှုရှာဖွေတာမှားသွားတယ်။ \n က \'Settings\' ကိုသွားပြီးကိုယ်တိုင်ခွင့်ပြုချက်ပေးရန်။ - ခွင့်ပြုချက်သိုလှောင်မှုမှငြင်းဆို - သငျသညျ%1$s ချင်သောသင်သေချာပါသလား? - - - မင်္ဂလာပါ %1$s ကို - %1$.2f - %1$.2f %2$s ကို - %1$s ကို %2$s ကို - %1$s ကို %2$.2f - %1$s ကို: %2$ ဃ - မှားနေသောငွေပမာဏ - နောက်ကျောကိုထပ်ထွက်ပေါက်မှသတင်းထုတ် - - ခွင့်ပြုချက်ကင်မရာသုံးစွဲဖို့ Denied - - - - - - - - - - င် - - မေးမြန်းလေ့ရှိသောမေးခွန်းများ - အသုံးပြုသူ Query - ယခု Call - အီးမေးလ်တစ်စောင် Leave - တည်နေရာကိုရှာပါ - အဘယ်သူမျှမထုတ်ယူ - Clear ကိုစိစစ်မှုများ - Manage Accounts ကို - နောက်ထပ် - Settings များ - ဘာသာစကား - သင်၏ဘာသာစကားကိုရွေးချယ်ပါ - အသိပေးချက်များ - base URL ကို - အိမ်ငှါး - - - အဘယ်သို့ငါအသစ်ကချေးငွေအကောင့်လျှောက်ထားသလဲ? - ငါသည်ငါ့ profile သတင်းအချက်အလက်များကိုဘယ်မှာကြည့်ရှုနိုင်သလဲ - ငါသည်ငါ့ချွေတာသုံးစွဲအရောင်းအဝယ်အကောင့်ကိုဘယ်မှာတွေ့နိုင်ပါသည်? - QR Code ကိုအသုံးပြုခြင်းကဘာလဲ? - QR Code ကိုသုံးပြီးအကျိုးခံစားခွင့်ကိုဖန်တီးရန်ဘယ်လိုနေသလဲ? - တစ်ချေးငွေအကောင့်အတွက်ငွေပေးချေရန်ဘယ်လိုနေသလဲ? - - - - ချေးငွေအကောင့်လျှောက်ထားရန်, ပင်မစာမျက်နှာအပေါ်ပေးထားသော "ချေးငွေ\များအတွက် Apply"\ ပေါ်ကလစ်နှိပ်ပါ။ - သငျသညျမူလစာမျက်နှာပေါ်တွင်အသုံးပြုသူ Image ကိုပစ္စုပ္ပန်ပေါ်နှိပ်ခြင်းအားဖြင့်သင့်ရဲ့ပရိုဖိုင်းကိုသတင်းအချက်အလက်ကြည့်ရှုနိုင်ပါသည်မျက်နှာပြင်။ - , သင့်ငွေစုအကောင့်အရောင်းအရှုမြင် Accounts ကိုကဏ္ဍများမှ navigate ပေါ်တွင်ကလစ်လုပ်ပါရန်လိုအပ်သောငွေစုအကောင့်, ညာဘက်ထိပ်ပေါ်ပစ္စုပ္ပန်သုံးစက်ပေါ် click နှိပ်ပြီး select လုပ်ပါအရောင်းအ option ကို။ - မည်သည့်ချေးငွေသို့မဟုတ်ငွေစုအကောင့် QrCode ထားတဲ့လိမ့်မည်အခြားအသုံးပြုသူများနှင့်အတူမျှဝေနိုင်ပါတယ်သူတို့ကိုတစ်ဦးအကျိုးခံစားခွင့်ကိုဖန်တီးရန်ခွင့်ပြုသည်။ - မူလစာမျက်နှာ Screen ကနေတစ်ဦးအကျိုးခံစား, ကို goto အကျိုးခံစား option ကိုဖန်တီးနိုင်ရန်အတွက်နှိပ်ပါအောက်ခြေညာဘက်အပေါ်မြို့ပတ်ရထား button ကိုပစ္စုပ္ပန်ပေါ်ဖွင့်လှစ်ထားတဲ့စကင်ဖတ်ရန် option ကိုရွေးပါသင့်ရဲ့ device ကိုကင်မရာ, သင်တစ်ဦးဖန်တီးလိုသည့်အခြားပုဂ္ဂိုလ်တစ်ဦး၏ဖို့အတွက် QR Code ကို scan             အကျိုးခံစားခွင့်, အခြားလိုအပ်သောအသေးစိတ်ဖြည့်အပြီးသင်တစ်ဦးဖန်တီးနိုင်ပါလိမ့်မည်             QR Code ကိုသုံးပြီးအကျိုးခံစား။          - တစ်ချေးငွေအကောင့်အတွက်ငွေပေးချေမှု Accounts ကိုကဏ္ဍများမှ navigate, ချေးငွေများရွေးချယ်ဖို့ထို့နောက်သင့်လိုအပ်သောချေးငွေအကောင့်ဖွင့်လှစ်ခြင်းနှင့်ငွေပေးချေမှု option ကို click လုပ်ပါ။ - - - - စုစုပေါင်းချွေတာသုံးစွဲ Balance - စုစုပေါင်းချေးငွေ Balance - ချေးငွေနှင့်ချွေတာသုံးစွဲအကောင့်ချိန်ခွင်လျှာအထက်များမှာသင့်ရဲ့အားလုံးငွေစုနှင့်ငွေချေးအကောင့်အသစ်များ၏ကိုယ်စားတွက်ချက်။ - သငျသညျလွှဲပြောင်းသင်ပယ်ဖျက်လိုတာသေချာလား? - ဟုတ်ကဲ့ - စကားဝှက်ကိုအတည်ပြုပါ - Password ကိုမကိုက်ညီပါဘူး။ - ဗားရှင်း %1$s ကို - ©2016-%1$s Mifos Initiative. - မူပိုင်ခွင့်များရယူပြီး။ - လိုင်စင် - လွှဲပြောင်းဖြည့်စွက်ဖို့မအောင်မြင်ဘူး, နောက်မှာထပ်ကြိုးစားကြည့်ပါ - ကျေးဇူးပြုပြီးခဏစောင့်ပါ… - မက်ဆေ့ခ်ျကို - အဘယ်သူမျှမသတိပေးချက် - - Update ကိုဆုံးမှတ် - သင့်ရဲ့ဆုံးမှတ် Configuration ကိုပြောင်းလဲရန်ဒီနေရာကိုနှိပ်ပါ - အဆိုပါအခြေစိုက်စခန်း URL ကိုရိုက်ထည့်ပါ - ဥယျာဉ်စောင့် Enter - အက်ပ်အချက်အလက် - စုစုပေါင်းချွေတာသည့်ပမာဏကို ပြပါ သို့မဟုတ် ဝှက်ပါ။ - အကောင့်ဝင်ခြင်း မအောင်မြင်ပါ၊ ကျေးဇူးပြု၍ နောက်မှ ထပ်စမ်းကြည့်ပါ။ - - \ No newline at end of file diff --git a/androidApp/src/main/res/values-pl/strings.xml b/androidApp/src/main/res/values-pl/strings.xml deleted file mode 100644 index d2dd4bbbb..000000000 --- a/androidApp/src/main/res/values-pl/strings.xml +++ /dev/null @@ -1,433 +0,0 @@ - - - - Zaloguj Się - Witaj, %1$s. - Brak połączenia z Internetem - Podstawowy - Nazwa Użytkownika - Logowanie - Ładowanie - Hasło - E-mail - Konta - Klienci - Przelew funduszy - Ostatnie transakcje - Opłaty - Ankieta - O nas - Zapisywanie szczegółów konta - Konto oszczędnościowe - Błąd podczas ładowania danych konta kredytowego - Nominalne stopy procentowe - Numer konta - Bilans konta - Łączne depozyty - Otwórz Panel Nawigacyjny - Zamknij Panel nawiagacyjny - Strona główna - Średni tekst - Mały tekst - Konta klientów - Ekran powitalny - Oszczędność - Pożyczka - Konto kredytowe - Udostępnij - Udostępnij konto - Wybierz klienta - Pracujący - Obraz stanu - Harmonogram spłaty - Ostatnia transakcja - Wykonane na - Zrób przelew - Wybierz produkt kredytowy* - Cel pożyczki* - Główna kwota* - Ilość - Uwaga - Oczekiwana data wypłaty - Termin składania - Przesłane - Wydatek - Data przelewu - Złóż wniosek o pożyczkę - Zaktualizuj pożyczkę - Wypłać pożyczkę - Powód do wypłaty pożyczki - Konto pożyczkowe zostało pomyślnie wycofane - Prześlij pożyczkę - Nowa aplikacja kredytowa dla - Zaktualizuj aplikację kredytową dla - Rodzaj odsetek - Umorzenie - Okres naliczania odsetek - Strategia spłaty - Wpłata do - Wpłata od - Anuluj - Podgląd - Przelew do - Przelew od - Dokonywanie przelewu - Kaucja - Wprowadź ilość - Uwaga jest obowiązkowa - Zatwierdzony - W oczekiwaniu - Płatny - Saldo - Odrzucono - Czekanie - Nadpłacony - W zaległości - Wybierz wszystko, co chcesz zastosować - Filtruj konta oszczędnościowe - Filtruj konta kredytowe - Filtruj udostępnianie kont - Szukaj - Wybierz opcję Konto do zapłaty - Wybierz konto do zapłaty z - Wprowadź uwagi do przeniesienia - Wybierz beneficjenta - dalej - Blisko - Wybierz rodzaj przelewu - Przelew do oszczędności - Przelew z oszczędności - Opłaty za pożyczki - Oszczędności - Aktywny - Zamknięte - Wycofane - Wymaga zatwierdzenia - W oczekiwaniu - Dojrzałe - Utwórz konto - Imię - Nazwisko - Numer telefonu - Zarejestrować - Żądanie ID - Token uwierzytelniania - Zweryfikuj - Weryfikowanie - Logowanie - Użytkownik został zweryfikowany pomyślnie - mobilny - e-mail - Tryb weryfikacji - Puste - Zaimportuj QR - Wyświetl Poręczyciela - Dodaj Poręczyciela - Usuń Poręczyciela - Zaktualizuj Poręczyciela - Typ Poręczyciela - Brak Poręczycieli - Stuknij, aby dodać Poręczyciela - Dane Poręczyciela - Data dołączenia - Zatwierdź - - Konto powinno być aktywne, aby dokonać kaucji - Konto powinno być aktywne, aby wykonać przelew - - Brak powiązanych z tobą kont oszczędnościowych - Brak powiązanych z tobą kont pożyczkowych - Brak powiązanych z tobą kont współdzielonych - Brak powiązanych z tobą transakcji - Brak powiązanego z tobą harmonogramu spłat - Brak dostępnych transakcji - Brak transakcji - Nie znaleziono DOB. - Nieprzypisany do żadnej grupy - - Nieprawidłowa nazwa użytkownika / hasło - Błąd podczas uzyskiwania odpowiedzi z serwera - %1$s nie może być puste - %1$s nie może mieć mniej niż %2$d znaków - %1$s nie może zawierać %2$s - %1$s nie może się rozpoczynać lub konczyć się odstępem - Błąd na wewnętrznym serwerze, spróbuj ponownie póżniej - Podczas ładowania listy klientów wystąpił błąd - Błąd ładowania listy kont pożyczkowych - Błąd podczas ładowania listy kont oszczędnościowych - Błąd podczas wczytywania szczegółów dotyczących kont oszczędnościowych - Wystąpił błąd podczas ładowania w ostatnich transakcjach - Błąd ładowania kont należnościowych - Nie znaleziono klienta - Nie udało się pobrać klienta - Nie udało się pobrać profilu użytkownika - Nie można pobrać kont - Nie można pobrać harmonogramu spłat - Nie można dokonać przelewu na własne konto - Nie udało się pobrać szablonu przelewu - Nie udało się pobrać spadkobierców - Nie udało się pobrać szablonu spadkobiercy - Nie udało się pobrać szablonu - Nie udało się stworzyć spadkobiercy - Nie udało się zaktualizować spadkobiercy - Nie udało się usunąć spadkobiercy - Nie udało się wycofać konta pożyczkowego - Błąd pobierania szablonu przelewu strony trzeciej - Obecnie nie masz żadnego spadkobiercy. Dodaj spadkobiercę - - Nie jesteś upoważniony - Kod QR - Udostępnij kod QR - Monitor - Wybierz opcję - Wyświetl transakcje - Zobacz opłaty - Zobacz podsumowanie pożyczki - Zobacz harmonogram spłat - Wyświetl kod QR dla tego konta - Ostatnie szczegóły transakcji - Nazwa użytkownika powinna być większa niż 6 znaków - Nieprawidłowy identyfikator e-maila - Serwer w dół, spróbuj po pewnym czasie - Opłaty klienta -  Błąd podczas czytania QR, upewnij się, że wybierasz właściwy region - Błąd podczas pobierania obrazu - Pobieranie klienta - - Spaces - Nazwa klienta - Status Konta - Nazwa produktu - Całkowita wypłata - Min. Wymagany Bal. - Nazwa produktu - Cel pożyczki - Dyrektor - Zleceniodawca wypłacony - Roczna stopa procentowa - Odsetki naliczone - Wypłacane odsetki - Szczegóły konta kredytowego - Podsumowanie pożyczki - Nazwa pożyczki - Zainteresowanie - Opłaty - Kary - Całkowita spodziewana spłata - Łącznie zapłacono - Interest Waived - Kary zerwane - Opłata uchylony - Wybitna równowaga - Następna rata - Termin płatności - Dokonać płatności - Rodzaj pożyczki - Waluta - Harmonogram spłaty - Transakcje - Przelew - Zatwierdzenie w toku - Oczekiwanie na wypłatę - Zamknięte z powodu niektórych zobowiązań - Pożyczka zamknięta - Według daty: - Według: - Zapłacona: - Odstąpiona: - Zaległa: - PRZYKŁAD - Dodaj widget - Pomoc - Miejsce dużych przemysłow technologicznych - Szczegóły konta pożyczkowego - Wniosek kredytowy przesłany pomyślnie - Wniosek o pożyczkę został zaktualizowany pomyślnie - Wniosek pożyczkowy wycofany pomyślnie - Żadne - Wszystko - 4 tygodnie - 3 miesiące - 6 miesięcy - Filtr - Data rozpoczęcia - Data zakonczenia - Przefiltrowany - Wybierz datę początkową i końcową - Data zakończenia musi być większa niż data rozpoczęcia - Zapisywanie transakcji na koncie - Brak połączenia z internetem - Data wypłaty - Liczba płatności - Data - Saldo kredytu - Spłata - Spłata pożyczki - Szybki przelew - Upewnij się, że masz połączenie z internetem - Spadkobierca - Zarządzaj spadkobiercami - Spadkobiercy - Szczegóły spadkobiercy - Nazwa spadkobiercy - typ konta - Limit przelewu - Dodaj spadkobierce - Nazwa biura - Wybierz typ konta * - Prześlij spadkobiercę - Wprowadź nazwę biura spadkobiercy - Wprowadź nazwę spadkobiercy - Wprowadź limit przelewu - Wprowadź numer konta spadkobiercy - Wybierz Typ konta z menu rozwijanego - Spadkobierca został utworzony pomyślnie - Spadkobierca zaktualizowany pomyślnie - Zaktualizuj spadkobiercę - Usuń spadkobiercę - Czy na pewno chcesz to usunąć spadkobiercę? - Kasować - Spadkobierca został usunięty - Przelew osoby trzeciej - Łączna pożyczka - Całkowite oszczędności - Przegląd konta - Pokaż lub ukryj całkowitą kwotę oszczędności - Pokaż lub ukryj całkowitą kwotę pożyczki - ***** - Ankiety - Data aktywacji - Grupy - Dane użytkownika - Typ klienta - Klasyfikacja klientów - Wybierz tryb - Dodaj do swojego konta spadkobierców zewnętrznych. \nWprowadź ręcznie lub zeskanuj kod QR konta - Nie możesz wykonać czynności na swoim koncie, zeskanuj kod QR z konta oszczędnościowego, lub pożyczkowego innego użytkownika - Dodaj - Skanuj - Wprowadź 4-cyfrowy kod dostępu - Kod dostępu powinien składać się z 4 cyfr - Niepoprawny kod dostępu - Podałeś nieprawidłowy kod dostępu więcej niż 3 razy - Pomiń - Zapisz - Ustaw pin, aby się zalogować - Wprowadź ponownie pin - Kod dostępu nie pasuje. - Zapomniałem pinu, zaloguję się za pomocą hasła - Kontynuuj - Kwota powinna być większa od zera - Zakładka O nas w budowie - Zakładka Pomoc w budowie - Wyloguj - Pobierz aplikację Self Service tutaj: https://play.google.com/store/apps/details?id= - Wybierz aplikację - NA - Prześlij QR - Wybierz region z kodem QR - - Skontaktuj się z nami - Przelew pomyślny - - Całkowity: - - A/C - Produkt pożyczkowy - Nieaktywny - AKTYWNY - NIEAKTYWNY - - - Czy na pewno chcesz się wylogować? - OK - Anuluj - Powrót - Odmowa dostępu - Jestem pewien - Spróbuj ponownie - Ustawienia aplikacji - Bez zezwolenia na użycie kamery nie będziesz mógł przeskanować kodu QR, aby dodać spadkobiorcę. Na pewno chcesz zabronić tej funkcji? - Odmówiłeś zgody na użycie kamery, bez tego pozwolenia nie będziesz mógł dodawać spadkobierców za pomocą kodu QR. Włącz ją w ustawieniach - Bez zezwolenia na odczyt z pamięci nie będziesz mógł przesłać kodu QR, aby dodać spadkobiorcę. Na pewno chcesz zabronić tej funkcji? - Odmówiłeś zgody na odczyt z pamięci urzadzenia, bez tego pozwolenia nie będziesz mógł dodawać spadkobierców za pomocą kodu QR. Włącz ją w ustawieniach - Odmówiłeś zgody na zapis do pamięci urzadzenia, bez tego pozwolenia nie będziesz mógł dodawać spadkobierców za pomocą kodu QR. Włącz ją w ustawieniach - To uprawnienie jest wymagane by pokazać walutę w zależności od kraju. Jesteś pewien, że chcesz zabronić tej funkcji? - Odmówiłeś zgody na odczyt stanu urządzenia, bez tego pozwolenia waluta może nie być wyświetlana we właściwym formacie. Włącz ją w ustawieniach - Coś poszło nie tak podczas znajdowania aktywności w ustawieniach. \nPrzejdź do \'Ustawienia\' i nadaj uprawnienia ręcznie. - Odmówiono zgody na przechowywanie - Czy na pewno chcesz %1$s? - - - Witaj, %1$s - Nieprawidłowa kwota - Naciśnij ponownie, aby wyjść - - package - Odmowa zezwolenia na korzystanie z kamery - - Często Zadawane Pytania - Zapytanie użytkownika - Zadzwoń teraz - Pozostaw wiadomość e-mail - Znajdź lokalizacje - Brak wypłat - Wyczyść filtry - Zarządzaj kontami - Więcej - Ustawienia - Język - Wybierz swój język - Powiadomienia - Podstawowy adres URL - Najemca - - - Jak złożyć wniosek o nowe konto kredytowe? - Gdzie mogę wyświetlić informacje o moim profilu? - Gdzie mogę zobaczyć transakcje mojego konta oszczędnościowego? - Jaki jest pożytek z kodu QR? - Jak utworzyć beneficjenta za pomocą kodu QR? - Jak dokonać płatności za konto kredytowe? - - - - Aby złożyć wniosek o rachunek kredytowy, kliknij \"Zgłoś wniosek o pożyczkę\" na ekranie głównym. - Możesz przeglądać swoje informacje o profilu, klikając na zdjęcie profilowe na stronie głownej aplikacji. - Aby wyświetlić transakcje na koncie oszczędnościowym, przejdź do sekcji Rachunki, kliknij wymagane konto oszczędnościowe, kliknij trzy kropki obecne w prawym górnym rogu i wybierz Opcja transakcji. - Kod QR dla wszystkich rachunków kredytowych lub oszczędnościowych może być udostępniany innym użytkownikom, który zezwoli im na stworzenie spadkobiercy - Aby utworzyć spadkobiercę, przejdź do Spadkobiercy na stronie głównej aplikacji, a następnie kliknij na przycisk znajdujący się w prawym dolnym rogu, wybierz opcję skanowania, która otworzy aparat urządzenia, zeskanuj kod QR osoby, dla której chcesz utworzyć spadkobiercę, po wypełnieniu wymaganych danych będziesz mógł stworzyć spadkobierców korzystający z kodu QR - Aby dokonać płatności za konto pożyczkowe, przejdź do sekcji Konta, wybierz opcję POŻYCZKA następnie otwórz docelowe konto kredytowe i kliknij opcję Dokonaj płatności. - - - - Całkowite saldo oszczędności - Całkowite saldo pożyczki - Powyżej znajduje się saldo rachunku bankowego, oraz oszczędnościowego obliczane na podstawie wszystkich rachunków oszczędnościowo-pożyczkowych - Czy na pewno chcesz anulować przelew? - Tak - Potwierdź hasło - Hasło Nie pasuje. - Wersja %1$s - Wszelkie prawa zastrzeżone. - Licencje - Nie można wykonać przelewu, spróbuj ponownie później - Proszę czekać… - wiadomość - Brak powiadomienia - - Zaktualizuj Endpoint - Kliknij tutaj, aby zmienić konfiguracje Endpoint\'u - Wprowadź podstawowy adres URL - Wejdź do Lokatora - Informacje o aplikacji - Zły login, proszę spróbować ponownie. - diff --git a/androidApp/src/main/res/values-pt/strings.xml b/androidApp/src/main/res/values-pt/strings.xml deleted file mode 100644 index 80ec682fd..000000000 --- a/androidApp/src/main/res/values-pt/strings.xml +++ /dev/null @@ -1,517 +0,0 @@ - - - - Mifos Mobile - Entrar - Bem-vindo %1$s - Não conectado à internet - Básico - Nome de Utilizador - exploração madeireira em - Carregando - Senha - O email - Contas - Clientes - Transferência de Fundos - Transações recentes - Cobranças - Questionário - Sobre nós - Detalhes da conta de poupança - Conta Poupança - Taxa de Interesse Nominal - Número da conta - Saldo da Conta - Depósitos Totais - Gaveta aberta - Fechar gaveta - Lar - Texto médio - Texto pequeno - Contas de Clientes - esguicho - Poupança - Empréstimo - Conta de Empréstimos - Partilhar - Partilhar conta - Escolheu um cliente - A trabalhar - Imagem de Status - Cronograma de Reembolso - Última Transação - Feito em - Faça uma transferência - Selecione o produto de empréstimo * - Finalidade do Empréstimo * - Quantia Principal* - Quantia - Observação - Data de desembolso esperada - Data de submissão - Submetido - Desembolso - Data de transferência - Solicitar empréstimo - Atualizar empréstimo - Levantar empréstimo - Razão para levantar empréstimo - Conta de empréstimo retirada com sucesso - Submeter Empréstimo - Novo pedido de empréstimo para - Atualizar pedido de empréstimo para - Tipo de interesse - Amortização - Período de calculo de juro - Estratégia de Reembolso - Pagar para - Pagar da - Cancelar - Rever - Transferir para - Transferir da - Fazendo Transferência - Depositar - Digite Montante - Observação é obrigatória - Aprovado - Pendente - Pago - Saldo - Rejeitado - À espera - Excesso de pagamento - Em atraso - Selecione tudo o que você deseja aplicar - Filtrar Contas Poupança - Filtrar Contas Empréstimo - Filtrar contas de compartilhamento - Procurar - Selecione uma conta para pagar - Selecione uma conta para pagar - Insira comentários para transferência - Selecione Beneficiário - Continuar - Fechar - Escolha o tipo de transferência - Transferir para as poupanças - Transferir da poupança - Cobranças de empréstimos - Cobranças de poupanças - Ativo - Fechado - Retirada - Necessita de aprovação - Pendente - Amadurecido - Crie uma conta - Primeiro Nome - Último Nome - Número de Telefone - Registo - ID de Pedido - Token de Autenticação - Verificar - A verificar - A registar - Utilizador foi verificado com sucesso - móvel - o email - Modo de verificação -   - Importar QR - Ver fiador - Adicionar fiador - Remover fiador - Atualizar fiador - Tipo de fiador - Sem fiadores - Toque para adicionar fiador - Detalhes de fiador - Data de ingresso - Submeter - - Conta deve estar ativa para depositar - - - Conta deve estar ativa para transferir - - - Não existe nenhuma Conta Poupança associada - Não existe nenhuma Conta de Empréstimo associada - Não existe nenhuma Conta Partilha associada - Não existem transações associadas - Não existe nenhum cronograma de reembolso associado - Não há mais transações disponíveis - Sem transações - Nenhum DOB encontrado. - Não atribuído a nenhum grupo - - Nome de utilizador / Palavra-passe inválidos - Erro ao carregar resposta do servidor - %1$s não pode estar em branco - %1$s não pode ter menos que %2$d caracteres - %1$s não pode conter %2$s - %1$s cannot begin or - end with blank space - - Erro interno do servidor, por favor, tente novamente - Erro ao carregar a lista de clientes - Erro ao carregar a lista de contas - Erro ao carregar a lista de contas poupança - Erro ao carregar detalhes das contas poupança - - Erro ao carregar Transações Recentes - Erro ao carregar cobranças de cliente - Nenhuma cobrança encontrada - Cliente não encontrado - Erro ao buscar cliente - Falha ao buscar o perfil do usuário - Erro ao buscar contas - Erro ao buscar Repayment Schedule - Não é possível transferir dentro da mesma conta - Erro ao buscar modelo de transferência de conta - - - Erro ao buscar Beneficiários - Erro ao buscar modelo de beneficiários - Erro ao buscar o modelo - Erro ao criar Beneficiário - Erro ao atualizar Beneficiário - Erro ao remover Beneficiário - Erro ao levantar da conta empréstimo - Erro ao buscar modelo de transferência de terceiros - - - Não existem Beneficiários. Por favor, adicione um. - - Sem autorização - Código QR - Partilhar código QR - Monitor - Escolha opção - Ver Transações - Ver Cobranças - Ver resumo de Empréstimos - Ver Cronograma de Reembolso - Ver código QR desta conta - Detalhes da última transação - Nome de utilizador deverá ter mais do que 6 caracteres - - Email inválido - Servidor em baixo, por favor tente mais tarde - Cobranças do Cliente - Erro ao ler código QR, verifique se selecionou a região correta - - Erro ao buscar imagem - Buscando Cliente - - Espaços - Nome de Cliente - Status da conta - Nome do produto - Total de levantamentos - saldo mínimo exigido - Nome do produto - Objetivo do empréstimo - Principal - Principal desembolsado - Taxa de juro anual - Juros cobrados - Juros pagos - Detalhes da conta de empréstimo - Resumo de empréstimos - Nome de empréstimo - Juros - Taxas - Multas - Reembolso total esperado - Total Pago - Juros dispensados - Multas dispensadas - Taxas dispensadas - Saldo excecional - Próxima prestação - Data de vencimento - Fazer pagamento - Tipo de empréstimo - Moeda - Cronograma de pagamento - Transações - Transferência - Aprovação pendente - À espera de desembolso - Fechado devido a algumas obrigações - Empréstimo fechado - Data de vencimento: - Vencimento: - Pago: - Dispensado: - Excecional: - EXEMPLO - Adicionar ferramenta - Ajuda - Iniciativa Mifos - Iniciativa Mifos, Seattle, Washington 98121 - Seattle - Lar para uma grande indústria de tecnologia - Detalhes da conta de empréstimo - Solicitação de empréstimo submetida com sucesso - Solicitação de empréstimo atualizada com sucesso - Solicitação de empréstimo levantada com sucesso - - - Nenhuma - Todas - 4 Semanas - 3 Meses - 6 Meses - Filtro - Data inicial - Data final - Filtrado - Por favor, selecione a data inicial e final - End date must be greater than Start date - Transações da conta poupança - Sem ligação à internet - Data de desembolso - Número de pagamentos - Data - Saldo de empréstimo - Reembolso - Reembolso de empréstimo - Transferência rápida - Por favor, verifique a ligação à internet - Beneficiário - Gerir beneficiários - Beneficiários - Detalhes de beneficiário - Nome do beneficiário - Tipo de conta - Limite de transferência - Adicionar beneficiário - Nome do escritório - Selecione o tipo de conta* - Subemeter beneficiário - Insira o nome do escritório do beneficiário - Insira o nome do beneficiário - Insira o limite de transferência - Insira o número da conta do beneficiário - Selecione o tipo de conta da lista - Beneficiário criado com sucesso - Beneficiário atualizado com sucesso - Atualizar Beneficiário - Remover Beneficiário - Tem a certeza que deseja remover este beneficiário? - - - Remover - Beneficiário removido com sucesso - Transferência de terceiros - Empréstimo Total - Poupança Total - Visão Global da Conta - Mostrar ou ocultar o valor total economizado - Mostrar ou ocultar o valor total do empréstimo - ***** - Sondagens - Data de Ativação - Grupos - Detalhes de utilizador - Tipo de Cliente - Classificação de Cliente - Selecione Modo - Adicionar Terceiros Beneficiários à sua conta. Manualmente ou com código QR - - - Não pode fazer ações na sua conta, por favor, digitalize outro utilizador - Código QR de Contas poupança e empréstimo - - Adicionar - Scan - Insira um PIN de 4 dígitos - PIN deverá ter 4 dígitos - PIN Incorreto - Introduziu um PIN incorreto mais do que 3 vezes - - - Saltar - Guardar - Configure um PIN para entrar - Por favor reinsira o seu PIN - O PIN não corresponde. - Esqueci-me do PIN, entrar manualmente - Avançar - Quantia deverá ser maior que 0 - Sobre Nós em construção - Ajuda em construção - Sair - Transfira a aplicação aqui: - https://play.google.com/store/apps/details?id= - - Escolha a aplicação - ND - Enviar QR - Selecione região com código QR - - Necessita de ajuda? Contacte a sua linha de suporte - - Transferido com sucesso - - Total: - - C/C - Produto de empréstimo - Inativo - ATIVO - INATIVO - - - Tem a certeza que deseja sair? - OK - Cancelar - de volta - Permissão recusada - Tenho a certeza - Tentar novamente - Definições da App - Sem permissão da câmera não conseguirá - digitalizar o código QR para adicionar beneficiário. Tem a certeza que deseja recusar esta permissão? - - - Você negou permissão para usar a câmera, sem essa permissão você não poderá adicionar beneficiários usando o QR Code. Por favor, habilite-o nas configurações - Sem permissão de armazenamento não conseguirá - enviar um código QR para adicionar beneficiário. Tem a certeza que quer recusar esta permissão? - - - Recusou a permissão para - ler do armazenamento. Sem esta permissão, não conseguirá adicionar beneficiários usando código QR. - Por favor, ative-a nas definições. - - Recusou a permissão para - escrever no armazenamento. Sem esta permissão, não conseguirá adicionar beneficiários usando código QR. - Por favor, ative-a nas definições. - - Esta permissão é necessária - para mostrar a moeda de acordo com o seu país. Tem a certeza que quer recusá-la? - - Recusou a permissão para buscar - o estado do telemóvel. Sem esta permissão, a moeda pode não ser mostrada no formato correto. - Por favor, ative-a nas definições. - - Algo correu mal ao procurar a Settings Activity. - \nVá a \'Settings\' e dê permissão manualmente. - - Permissão recusada para o armazenamento. - Tem a certeza que deseja %1$s? - - - Olá, %1$s - %1$.2f - %1$.2f %2$s - %1$s%2$s - %1$s: %2$.2f - %1$s: %2$d - Quantia inválida - Pressione outra vez para sair - - Permissão Recusada para usar a Câmera - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 0 - - Perguntas Frequentes - Consulta do Utilizador - Chamar agora - Deixar um email - Procurar Lugares - Nenhum levantamento - Limpar os Filtros - Gerir contas - Mais - Definições - Língua - Escolha a sua língua - Notificações - URL Base - Inquilino - - - Como solicito uma nova conta empréstimo? - Onde posso ver a informação do meu perfil? - Onde posso ver as transações das minhas Contas Poupança? - Qual é o uso do código QR? - Como criar um beneficiário usando o código QR? - Como fazer um pagamento para uma conta empréstimo? - - - - Para solicitar empréstimo, clique em \"Solicitar Empréstimo\" em Home. - - Pode ver a informação do seu perful clicando na imagem do utilizador presente em Home. - - - Para ver as transações da conta poupança, navegue para as secções de contas, clique em - conta necessária de poupança, clique nos 3 pontos e selecione a opção de Transações. - - - Um código QR para qualquer conta poupança ou de empréstimo pode ser partilhado com outros utilizadores que lhes permite criar beneficiário. - - - De forma a criar Beneficiário, vá à opção Beneficiário em Home, clique no botão circular presente - no lado inferior direito, escolha a opção de Scan que abre a sua câmera, - digitalize o código QR de outra pessoa da qual deseja criar um beneficiário, - e depois de preencher os detalhes necessários conseguirá criar um beneficiário usando QR. - - - Para fazer um pagamento a uma conta empréstimo, naveuge para as secções de conta, escolha Empréstimo, - clique em Conta Empréstimo necessária e clique na opção Fazer PagamentoT. - - - - - - Saldo total de poupanças - Saldo total de empréstimos - Os saldos das contas de poupança e empréstimo são - calculadas em nome de todas as contas poupança e empréstimo. - - Tem a certeza que deseja cancelar a transferência? - Sim - Confirme a palavra-passe - A palavra-passe não coincide. - Versão %1$s - ©2016-%1$s Inicitiva Mifos. - Todos os direitos reservados. - Licenças - Não é possível concluir a transferência, por favor, tente novamente mais tarde - Por favor espere… - mensagem - Sem notificações - - Atualizar Endpoint - Clique aqui para alterar as configurações de Endpoint - Insira o URl Base - Insira o inquilino - accountType.loan - Erro ao carregar em detalhes de contas de empréstimo - Informações do aplicativo - O login falhou por favor tente novamente mais tarde. - - diff --git a/androidApp/src/main/res/values-ru/strings.xml b/androidApp/src/main/res/values-ru/strings.xml deleted file mode 100644 index 655eba2f7..000000000 --- a/androidApp/src/main/res/values-ru/strings.xml +++ /dev/null @@ -1,433 +0,0 @@ - - - - Вход - Здравствуйте, %1$s. - Нет подключения к интернету - Первичный - Имя пользователя - Войти - Погрузка - Пароль - Адрес электронной почты - Счета - Клиенты - Перевод средств - Последние транзакции - Сборы - Вопросник - О КОМПАНИИ - Сохранение данных учетной записи - Сберегательный счет - Ошибка при загрузке информации об учетной записи - Номинальные процентные ставки - Номер счета - Сальдо счета - Всего депозитов - Откройте панель навигации - Закройте панель восстановления - Главная страница - Средний текст - Маленький текст - Счета клиентов - Экран приветствия - Экономия - Ссуда - Кредитный счет - Доля - Поделитесь своим аккаунтом - Выберите клиента - Работа - Изображение государства - График погашения - Последняя сделка - Сделано на - Сделать передачу - Выберите кредитный продукт * - Цель кредита * - Основная сумма * - Номер - Предосторожность - Ожидаемая дата выплаты - Крайний срок подачи - Добавления - Расходы - Дата передачи - Подать заявку на кредит - Обновить кредит - Освободить кредит - Причина выплаты кредита - Ссудный счет успешно отозван - Подать кредит - Новая кредитная заявка на - Обновите свою кредитную заявку для - Тип интереса - Амортизация - Процентный период - Стратегия погашения - Оплата - Оплата с - Отменить - Предварительный просмотр - Передача - Перевод с - Создание перевода - Депозит - Введите количество - Примечание обязательное - Утвержденный - В ожидании - Оплаченный - Баланс - Отвергнуто - Ожидание - Переплатил - Задолженность - Выберите все, что вы хотите применить - Фильтровать сберегательные счета - Фильтрация кредитных счетов - Слияние фильтров - Поиск - Выберите опцию «Учетная запись, подлежащая оплате» - Выберите аккаунт для оплаты - Введите заметки для передачи - Выберите получателя - Далее - Близко - Выберите тип перевода - Переход на сбережения - Переход от сбережений - Сборы за кредиты - Экономия - Активный - Закрыто - Отозваны - Требуется разрешение - В ожидании - Зрелый - Создать учетную запись - Имя - Имя - Номер телефона - Регистр - Запрос идентификатора - Идентификатор аутентификации - Проверить - Проверка - Войти - Пользователь был успешно проверен - Мобильный - Адрес электронной почты - Режим проверки - Пустой - Импорт QR - Просмотр Гаранта - Добавить гаранта - Удалить гаранта - Обновите гаранта - Тип поручителя - Нет гарантий - Нажмите, чтобы добавить гаранта - Подробная информация об гаранте - Дата присоединения - Представить - - Аккаунт должен быть активным для внесения депозита - Аккаунт должен быть активным, чтобы сделать передачу - - Нет сберегательных счетов, связанных с вами - С вами не связаны ссудные счета - С вами не связаны общие аккаунты - Нет транзакций, связанных с вами - График погашения, связанный с вами, не существует - Нет доступных транзакций - Без транзакций - DOB не найден. - Не назначено ни одной группе - - Неверное имя пользователя / пароль - Ошибка при получении ответа с сервера - %1$s не может быть пустым - %1$s не может быть меньше, чем %2$d символов - %1$s не может содержать %2$s - %1$s не может начинаться или заканчиваться пробелом - Ошибка на внутреннем сервере, повторите попытку позже - Произошла ошибка при загрузке списка клиентов - Ошибка при загрузке списка ссудных счетов - Ошибка при загрузке списка сберегательных счетов - Ошибка загрузки сведений о сберегательных счетах - Произошла ошибка при загрузке в последних транзакциях - Ошибка при загрузке дебиторской задолженности - Клиент не найден - Клиент не может быть загружен - Не удалось скачать профиль пользователя - Не удалось загрузить учетные записи - График погашения не может быть получен - Вы не можете сделать перевод на свой собственный счет - Шаблон переноса не может быть загружен - Кредиты не могут быть получены - Шаблон наследника не может быть загружен - Не удалось загрузить шаблон - Наследнику не удалось - Наследник не был обновлен - Наследник не был удален - Ссудный счет не может быть отозван - Ошибка при загрузке стороннего шаблона передачи - У вас нет наследника. Добавить наследника - - Вы не авторизованы - QR-код - Поделитесь QR-кодом - Монитор - Выберите вариант - Просмотр транзакций - См. Сборы - См. Резюме займа - См. График погашения - Посмотреть QR-код для этой учетной записи - Последние данные о транзакции - Имя пользователя должно быть больше 6 символов. - Недопустимый идентификатор электронной почты - Сервер вниз, попробуйте через некоторое время - Плата за обслуживание - Ошибка чтения QR, убедитесь, что вы выбрали правильный регион - Ошибка при загрузке изображения - Загрузка клиента - - Пространства - Имя клиента - Статус учетной записи - Название продукта - Общий платеж - Минимальный требуемый бал. - Название продукта - Цель кредита - Директор - Принципал выплачен - Годовая процентная ставка - Начисленные проценты - Проценты - Подробная информация о кредитном счете - Сводная информация о займе - Название кредита - Интерес - Сборы - Штрафы - Общий ожидаемый платеж - Всего оплачено - Проценты - Штраф за нарушение - Комиссия не взимается - Выдающийся баланс - Следующий взнос - Срок оплаты - Сделать платеж - Тип кредита - Валюта - График погашения - Операции - Перевод - Продвинутое одобрение - Ожидание платежа - Закрыто из-за некоторых обязательств - Кредит закрыт - По дате: - По: - Оплачивается: - Уступило: - Просрочен: - Пример - Добавить виджет - Помощь - Место крупных технологических отраслей - Детали ссудного счета - Кредитное приложение успешно отправлено - Заявление на получение кредита успешно обновлено - Заявление на получение кредита успешно отменено - Ничего - Все - 4 недели - Три месяца - 6 месяцев - Фильтр - Дата начала - Дата окончания - Отфильтрованный - Выберите дату начала и окончания - Дата окончания должна быть больше даты начала - Сохранение транзакций в вашей учетной записи - Нет подключения к интернету - Дата платежа - Количество платежей - Дата - Кредитный баланс - Погашение - Выплата кредита - Быстрая передача - Убедитесь, что у вас есть подключение к Интернету - Наследник - Управление наследниками - Потомки - Подробная информация о наследнике - Имя наследника - Тип учетной записи - Предел передачи - Добавить наследника - Название офиса - Выберите тип учетной записи * - Отправить наследнику - Введите имя офиса наследника - Введите имя наследника - Введите лимит перевода - Введите номер счета наследника - В раскрывающемся меню выберите тип учетной записи - Наследник успешно создан - Наследник успешно обновлен - Обновите своего наследника - Удалить наследника - Вы действительно хотите удалить этого наследника? - Удалять - Наследник был удален - Передача третьей стороны - Общий кредит - Общая экономия - Обзор учетной записи - Mostrar ou ocultar o valor total economizado - Показать или скрыть общую сумму кредита - ***** - Обзоры - Дата активации - Группа - Данные пользователя - Тип клиента - Классификация клиентов - Выберите режим - Добавьте внешних наследников в свою учетную запись. \nВведите вручную или сканируйте QR-код своей учетной записи - Вы не можете выполнять действия в своей учетной записи, сканировать QR-код со сберегательного счета или другого ссудного счета другого пользователя - Добавлять - Сканирование - Введите четырехзначный код доступа - Код доступа должен состоять из 4 цифр - Неверный код доступа - Вы ввели неправильный код доступа более 3 раз - Скакать - Сохранить - Установите контакт для входа в систему - Повторно введите PIN-код - Код доступа не соответствует. - Я забыл булавку, я войду с паролем - Продолжать - Сумма должна быть больше нуля - Закладка О нас в стадии строительства - Вкладка «Содействие» - Выйти - Загрузите приложение Self Service здесь: https://play.google.com/store/apps/details?id= - Выберите приложение - - Отправить QR - Выберите регион с QR-кодом - - Как с нами связаться - Успешная передача - - Всего: - - A / C - Кредитный продукт - Неактивный - ACTIVE - АКТИВНО - - - Вы действительно хотите выйти? - Хорошо - Отменить - Возвращение - Доступ запрещен - Я уверен - Повторите попытку - Настройки приложения - Без разрешения на использование камеры вы не сможете сканировать QR-код, чтобы добавить наследника. Вы действительно хотите запретить эту функцию? - Вы отказались от разрешения на использование камеры, без этого разрешения вы не сможете добавлять наследников с помощью QR-кода. Включить его в настройках - Без разрешения на чтение из памяти вы не сможете отправить QR-код, чтобы добавить наследника. Вы действительно хотите запретить эту функцию? - Вы отказались от разрешения на чтение из памяти устройства, без этого разрешения вы не сможете добавлять наследников с помощью QR-кода. Включить его в настройках - Вы отказались писать в память устройства, без этого разрешения вы не сможете добавлять наследников с помощью QR-кода. Включить его в настройках - Это разрешение требуется для отображения валюты в зависимости от страны. Вы действительно хотите запретить эту функцию? - Вы отказались от разрешения на чтение статуса устройства, без этого разрешения валюта может не отображаться в правильном формате. Включить его в настройках - При поиске активности в настройках что-то пошло не так. \ nУдалить \ "Настройки \" и предоставить разрешения вручную. - Отказ от хранения был отклонен - Вы уверены, что хотите %1$s? - - - Привет, %1$s - Недопустимая сумма - Нажмите еще раз, чтобы выйти - - Package - Отказ от разрешения на использование камеры - - Часто задаваемые вопросы - Запрос пользователя - Позвоните сейчас - Оставьте сообщение электронной почты - Поиск местоположений - Нет выплат - Очистить фильтры - Управление аккаунтами - Более - Настройки - Язык - Выберите язык - Уведомления - Первичный URL - Арендатор - - - Как подать заявку на новый кредитный счет? - Где я могу просмотреть информацию о моем профиле? - Где я могу просмотреть транзакции с сберегательным счетом? - Что такое QR-код? - Как создать бенефициара с помощью QR-кода? - Как произвести оплату кредитной карты? - - - - Чтобы подать заявку на кредитную учетную запись, нажмите «Сообщить о кредите» на главном экране. - Вы можете просмотреть информацию о своем профиле, нажав на изображение профиля на главной странице приложения. - Чтобы просмотреть транзакции на вашем сберегательном счете, перейдите в раздел «Аккаунты», щелкните необходимую сберегательную учетную запись, щелкните три точки, присутствующие в правом верхнем углу, и выберите «Транзакция». - QR-код для всех кредитных или сберегательных счетов может быть передан другим пользователям, которые позволят им создать наследника - Чтобы создать наследника, перейдите к наследнику на главной странице приложения, затем нажмите кнопку в правом нижнем углу, выберите опцию сканирования, которая откроет камеру устройства, сканирует QR-код человека, для которого вы хотите создать наследника, после заполнения необходимых данных создавать наследников с помощью QR-кода - Чтобы оплатить кредитную учетную запись, перейдите в раздел «Аккаунты», выберите вариант «LOAN», затем откройте целевую учетную запись и нажмите «Сделать платеж». - - - - Общий баланс сбережений - Общий остаток по ссудам - Выше находится баланс банковского счета и сберегательного счета, рассчитанный на основе всех сберегательных и кредитных счетов - Вы действительно хотите отменить передачу? - Так - Подтвердить пароль - Пароль не соответствует. - Версия %1$s - Все права сохранены. - Лицензирование - Невозможно осуществить перевод, повторите попытку позже - Пожалуйста, подождите … - Сообщение - Нет уведомлений - - Обновить конечную точку - Нажмите здесь, чтобы изменить конфигурации конечных точек - Введите основной URL-адрес - Перейти к Арендатору - Информация о приложении - Войти не удалось, пожалуйста, повторите попытку позже. - \ No newline at end of file diff --git a/androidApp/src/main/res/values-sw/strings.xml b/androidApp/src/main/res/values-sw/strings.xml deleted file mode 100644 index 075d11734..000000000 --- a/androidApp/src/main/res/values-sw/strings.xml +++ /dev/null @@ -1,432 +0,0 @@ - - - - Ingia - Sawadi, %1$s. - Hakuna uhusiano wa internet - Msingi - Jina la mtumiaji - Ingia - Upakiaji - Nenosiri - E-mail anwani - Akaunti - Wateja - Uhamisho wa fedha - Shughuli za hivi karibuni - Ada - Dodoso - Kuhusu sisi - Inahifadhi maelezo ya akaunti - Akaunti ya akiba - Hitilafu kupakua habari ya akaunti ya mikopo - Vigezo vya riba - Nambari ya Akaunti - Usawa wa Akaunti - Jumla ya amana - Fungua Jopo la Navigation - Funga jopo la kupona - Ukurasa wa nyumbani - Nakala ya kati - Nakala ndogo - Akaunti ya Wateja - Karibu skrini - Kuokoa - Mkopo - Akaunti ya mikopo - Kushiriki - Shiriki akaunti yako - Chagua mteja - Kazi - Picha ya hali - Ratiba ya kulipa - Shughuli ya mwisho - Imefanywa - Fanya uhamisho - Chagua bidhaa za mkopo * - Kusudi la mkopo * - Kiasi kikubwa * - Idadi - Tahadhari - Tarehe inayotarajiwa ya kulipa - Mwisho wa kuwasilisha - Uploads - Gharama - Tarehe ya uhamisho - Tumia mkopo - Sasisha mkopo - Toa mkopo - Sababu ya kulipa mkopo - Akaunti ya mkopo imeondolewa kwa ufanisi - Tuma mkopo - Programu mpya ya mkopo kwa - Sasisha maombi yako ya mkopo - Aina ya riba - Madeni - Kipindi cha riba - Mkakati wa kulipa - Malipo kwa - Malipo kutoka - Kufuta - Preview - Tuma kwa - Uhamisho kutoka - Kufanya uhamisho - Amana - Ingiza wingi - Kumbuka ni lazima - Kupitishwa - Kwa kutarajia - Kulipwa - Usawa - Kukataliwa - Kusubiri - Kulipwa zaidi - Katika madeni - Chagua kila kitu unachotaka kuomba - Akaunti za akiba za kuchuja - Chuja akaunti za mikopo - Chuja kugawana akaunti - Search - Chagua Akaunti ya kulipwa chaguo - Chagua akaunti kulipa - Ingiza maelezo ili uhamishe - Chagua mrithi - Zaidi - Karibu - Chagua aina ya uhamisho - Transfer to savings - Uhamisho kutoka kwa akiba - Malipo ya mikopo - Akiba - Kazi - C. - Kuondoka - Inahitaji idhini - Kwa kutarajia - Kukomaa - Unda akaunti - Jina - Jina - Nambari ya simu - Kujiandikisha - Ombi la idhini - Tokisho la uthibitishaji - Thibitisha - Inathibitisha - Ingia - Mtumiaji amehakikishwa kwa mafanikio - Simu - E-mail anwani - Hali ya uthibitisho - Tupu - Weka QR - Tazama Dhamana - Ongeza dhamana - Ondoa mdhamini - Sasisha mdhamini - Aina ya mdhamini - Hakuna Guarantors - Gonga ili kuongeza mdhamini - Maelezo ya mdhamini - Tarehe ya kushikilia - Wasilisha - - Akaunti inapaswa kuwa hai kufanya amana - Akaunti inapaswa kuwa hai kufanya uhamisho - - Hakuna akaunti za akiba zilizounganishwa na wewe - Hakuna akaunti za mkopo zilizohusishwa na wewe - Hakuna akaunti zilizoshirikiwa zinazohusiana na wewe - Hakuna shughuli zinazohusiana na wewe - Hakuna ratiba ya kulipa yanayohusiana na wewe - Hakuna shughuli zinazopatikana - Hakuna mkataba - DOB haipatikani. - Haijashirikiwa kundi lolote - - Jina la mtumiaji / password isiyo sahihi - Hitilafu wakati wa kupata majibu kutoka kwa seva - %1$s haiwezi kuwa tupu - %1$s haiwezi kuwa chini ya wahusika %2$d - %1$s haiwezi kuwa na %2$s - %1$s haiwezi kuanza au kumaliza nafasi - Hitilafu kwenye seva ya ndani, jaribu tena baadaye - Hitilafu ilitokea wakati wa kupakia orodha ya wateja - Hitilafu kupakia orodha ya akaunti za mkopo - Hitilafu kupakia orodha ya akaunti za akiba - Hitilafu kupakia maelezo kuhusu akaunti za akiba - Hitilafu ilitokea wakati wa kupakia katika shughuli za hivi karibuni - Hitilafu kupakua akaunti zinazokubalika - Wateja haipatikani - Mteja hakuweza kupakuliwa - Haiwezi kupakua wasifu wa mtumiaji - Haiwezi kupakua akaunti - Ratiba ya kulipa haipatikani - Huwezi kufanya uhamisho kwenye akaunti yako mwenyewe - Template ya uhamisho haikuweza kupakuliwa - Mikopo haikuweza kupatikana - Template mrithi haikuweza kupakuliwa - Template haikuweza kupakuliwa - Mrithi hakufanikiwa - Mrithi haijasasishwa - Mrithi hakuweza kuondolewa - Akaunti ya mkopo haikuweza kufutwa - Hitilafu kupakua template ya uhamisho wa tatu - Kwa sasa huna mrithi. Ongeza mrithi - - Huna mamlaka - QR code - Shiriki msimbo wa QR - Kufuatilia - Chagua chaguo - Angalia shughuli - Angalia ada - Angalia muhtasari wa mkopo - Angalia ratiba ya kulipa - Angalia msimbo wa QR kwa akaunti hii - Maelezo ya mwisho ya shughuli - Jina la mtumiaji linapaswa kuwa kubwa kuliko wahusika 6 - Kitambulisho cha barua pepe batili - Seva chini, jaribu baada ya muda - Ada ya Wateja - Hitilafu ya kusoma QR, hakikisha kuchagua eneo linalofaa - Hitilafu wakati wa kupakua picha - Mteja wa kupakua - - Nafasi - Jina la Wateja - Hali ya Akaunti - Jina la bidhaa - Jumla ya malipo - Mpira wa Kidogo Unaohitajika. - Jina la bidhaa - Kusudi la mkopo - Mkurugenzi - Mkuu alilipwa nje - Kiwango cha riba ya kila mwaka - Maslahi yameongezeka - Nia kulipwa - Maelezo ya akaunti ya mikopo - Muhtasari wa mkopo - Jina la mkopo - Riba - Ada - Adhabu - Jumla ya malipo yaliyotarajiwa - Jumla ya kulipwa - Nia ya Waived - Adhabu imevunjika - Malipo yanaondolewa - Usawa bora - Kipindi cha pili - Siku ya mwisho ya malipo - Fanya malipo - Aina ya mkopo - Fedha - Ratiba ya kulipa - Shughuli - Uhamisho - Idhini inaendelea - Inasubiri malipo - Ilifungwa kwa sababu ya majukumu fulani - Mkopo ulifungwa - Kwa tarehe: - Kwa: - Kulipia: - Ceded: - Muafaka: - MFANO - Ongeza widget - Msaada - Mahali ya viwanda vingi vya teknolojia - Maelezo ya akaunti ya mkopo - Programu ya mikopo imepelekwa kwa mafanikio - Programu ya mkopo imesasishwa kwa mafanikio - Programu ya mikopo inaondolewa kwa mafanikio - Hakuna - Kila - Wiki 4 - Miezi mitatu - Miezi 6 - Chuja - Tarehe ya kuanza - Tarehe ya kumaliza - Kuchujwa - Chagua tarehe ya kuanza na mwisho - Tarehe ya mwisho lazima iwe kubwa kuliko tarehe ya kuanza - Inahifadhi shughuli kwenye akaunti yako - Hakuna uhusiano wa internet - Tarehe ya malipo - Idadi ya malipo - Tarehe - Usawa wa mkopo - Malipo - Malipo ya kulipia - Uhamisho wa haraka - Hakikisha una uhusiano wa internet - Mrithi - Dhibiti warithi - Wana - Maelezo ya mrithi - Jina la mrithi - Aina ya akaunti - Uhamisho wa kikomo - Ongeza mrithi - Jina la ofisi - Chagua aina ya akaunti * - Tuma mrithi - Ingiza jina la ofisi ya mrithi - Ingiza jina la mrithi - Ingiza kikomo cha uhamisho - Ingiza nambari ya akaunti ya mrithi - Chagua aina ya Akaunti kutoka kwenye orodha ya kushuka - Mrithi ameumbwa kwa ufanisi - Mrithi imekuwa updated kwa mafanikio - Sasisha mrithi wako - Ondoa mrithi - Una uhakika unataka kuondoa mrithi huyu? - Kufuta - Mrithi ameondolewa - Uhamisho wa mtu wa tatu - Jumla ya mkopo - Uhifadhi wa jumla - Maelezo ya Akaunti - Onyesha au ufiche jumla ya kiasi kilichohifadhiwa - Onyesha au ufiche jumla ya kiasi cha mkopo - ***** - Surveys - Tarehe ya uanzishaji - Kundi - Data ya mtumiaji - Aina ya Wateja - Uainishaji wa Wateja - Chagua mode - Ongeza warithi wa nje kwenye akaunti yako. \n Ingiza kwa manually au soma msimbo wa QR wa akaunti yako - Huwezi kufanya vitendo kwenye akaunti yako, soma msimbo wa QR kutoka akaunti ya akiba au akaunti ya mkopo wa mtumiaji mwingine - Kuongeza - Scan - Ingiza msimbo wa kufikia tarakimu nne - Nambari ya upatikanaji lazima iwe na tarakimu nne - Nambari ya ufikiaji isiyo sahihi - Umeingia msimbo usio sahihi wa zaidi ya mara 3 - Ruka - Save - Weka pini ili uingie - Rejesha tena siri - Msimbo wa kufikia haufanani. - Nilisahau siri, nitaingia na nenosiri - Kuendelea - Kiasi kinapaswa kuwa kikubwa kuliko sifuri - Bookmark Kuhusu sisi chini ya ujenzi - Msaada chini ya kichupo cha ujenzi - Ondoka kwenye - Pakua programu ya Self Service hapa: https://play.google.com/store/apps/details?id= - Chagua programu - THE - Weka QR - Chagua kanda na msimbo wa QR - - Unahitaji msaada? Wasiliana na mstari wa usaidizi wako - Uhamisho ufanisi - - Jumla: - - A/C - Bidhaa ya mikopo - Inaktiv - TENDAJI - INAKTIV - - - Una uhakika unataka kuingia nje? - SAWA - Kufuta - Kurudi - Ufikiaji umekataliwa - Nina hakika - Tafadhali jaribu tena - Mazingira ya Maombi - Bila ruhusa ya kutumia kamera, huwezi kusoma msimbo wa QR ili kuongeza mrithi. Una uhakika unataka kupiga marufuku kipengele hiki? - Umekataa ruhusa ya kutumia kamera, bila kibali hiki huwezi kuongezea warithi kwa kutumia msimbo wa QR. Pindisha kwenye mipangilio - Bila idhini ya kusoma kutoka kwa kumbukumbu, huwezi kutuma msimbo wa QR ili kuongeza mrithi. Una uhakika unataka kupiga marufuku kipengele hiki? - Umekataa ruhusa ya kusoma kutoka kwa kumbukumbu ya kifaa, bila ruhusa hii huwezi kuongezea warithi kwa kutumia msimbo wa QR. Pindisha kwenye mipangilio - Umekataa kuandika kwenye kumbukumbu ya kifaa, bila idhini hii huwezi kuongeza wamiliki wa kutumia kificho cha QR. Pindisha kwenye mipangilio - Ruhusa hii inahitajika ili kuonyesha sarafu kulingana na nchi. Una uhakika unataka kupiga marufuku kipengele hiki? - Umekataa ruhusa ya kusoma hali ya kifaa, bila ruhusa hii sarafu haiwezi kuonyeshwa kwenye muundo sahihi. Pindisha kwenye mipangilio - Kitu kilichokosa wakati wa kutafuta shughuli katika mipangilio. \nGo kwa \'Mipangilio\' na ruhusu idhini kwa kibinafsi. - Kukataliwa kwa kuhifadhi kulikataliwa - Una uhakika unataka %1$s? - - - Sawadi, %1$s - Kiasi batili - Bonyeza tena ili uondoke - - Kukataa ruhusa ya kutumia kamera - - Maswali yanayoulizwa mara kwa mara - Ombi la mtumiaji - Piga simu sasa - Acha ujumbe wa barua pepe - Pata maeneo - Hakuna malipo - Kuchuja wazi - Dhibiti akaunti - Zaidi - Mazingira - Lugha - Chagua lugha yako - Taarifa - URL ya Msingi - Mpangaji - - - Jinsi ya kuomba akaunti mpya ya mkopo? - Ninaweza kuona wapi taarifa kuhusu wasifu wangu? - Ninaweza kuona wapi shughuli za akaunti yangu za akiba? - Je! Matumizi ya code QR ni nini? - Jinsi ya kuunda mrithi kutumia code QR? - Jinsi ya kufanya malipo kwa akaunti ya mikopo? - - - - Kuomba akaunti ya mikopo, bonyeza \"Ripoti programu ya mkopo\" kwenye skrini ya nyumbani. - Unaweza kuona maelezo yako ya wasifu kwa kubonyeza picha ya wasifu kwenye ukurasa kuu wa maombi. - Kuangalia shughuli katika akaunti yako ya akiba, nenda kwenye sehemu ya Akaunti, bofya akaunti iliyohifadhiwa inayotakiwa, bofya dots tatu zilizopo kwenye kona ya juu ya kulia na chagua chaguo la Transaction. - Nambari ya QR kwa akaunti zote za mikopo au akiba zinaweza kugawanywa na watumiaji wengine ambao watawawezesha kurithi - Kujenga mrithi, kwenda kwa warithi wa maombi ukurasa wa nyumbani, na kisha bonyeza kifungo katika kona ya chini wa kulia, kuchagua Scan, ambayo itakuwa wazi kifaa kamera, Scan QR code mtu ambaye wanataka kujenga mrithi, baada ya kujaza data required kuwa na uwezo wa kujenga warithi kutumia QR - Kufanya malipo kwa akaunti ya mkopo, enda kwenye sehemu ya Akaunti, chagua chaguo LOAN, kisha ufungua akaunti ya mikopo ya lengo na bofya Chagua chaguo la malipo. - - - - Uwiano wa jumla wa akiba - Uwiano wa mkopo wa jumla - Halafu ni usawa wa akaunti ya benki na akaunti ya akiba ya mahesabu kwa msingi wa akaunti zote za akiba na mkopo - Una uhakika unataka kufuta uhamisho? - Hivyo - Thibitisha nenosiri - Nenosiri hailingani. - Toleo la %1$s - Haki zote zimehifadhiwa. - Leseni - Haiwezi kufanya uhamisho, tafadhali jaribu tena baadaye - Tafadhali subiri… - Ujumbe - Hakuna taarifa - - Sasisha Mwisho wa Mwisho - Bonyeza hapa ili kubadilisha mipangilio ya Mwisho - Ingiza URL ya msingi - Nenda kwa Mpangaji - Maelezo ya Programu - Kuingia Kumeshindwa, Tafadhali Jaribu Tena Baadaye. - \ No newline at end of file diff --git a/androidApp/src/main/res/values-te/strings.xml b/androidApp/src/main/res/values-te/strings.xml deleted file mode 100644 index 979e447fc..000000000 --- a/androidApp/src/main/res/values-te/strings.xml +++ /dev/null @@ -1,433 +0,0 @@ - - - - Mifos Mobile - లాగిన్ - స్వాగతం %1$s - మా గురించి - ఇంటర్నెట్కి కనెక్ట్ చేయబడలేదు - ప్రాథమిక - వాడుకరి పేరు - లోనికి ప్రవేశించపడుతుoది - లోడ్ అవుతున్నది - పాస్వర్డ్ - ఇమెయిల్ - ఖాతాలు - ఖాతాదారులకు - నిధుల బదిలీ - ఇటీవలి లావాదేవీలు - ఆరోపణలు - ప్రశ్నాపత్రం - పొదుపు ఖాతా వివరాలు - పొదుపు ఖాతా - రుణ ఖాతాల వివరాలను లోడ్ చేయడంలో లోపం - నామమాత్ర వడ్డీ రేటు - ఖాతా సంఖ్య - ఖాతా నిలువ - మొత్తం డిపాజిట్లు - ఓపెన్ నావిగేషన్ ప్యానెల్ - రికవరీ ప్యానెల్ని మూసివేయి - హోమ్ - మీడియం వచనం - చిన్న వచనం - క్లయింట్ ఖాతాలు - స్క్రీన్ స్వాగతం - పొదుపు - ఋణం - రుణ ఖాతా - వాటా - వాటా ఖాతా - ఒక క్లయింట్ ఎంచుకోండి - వర్కింగ్ - స్థితి చిత్రం - తిరిగి చెల్లింపు షెడ్యూల్ - చివరి లావాదేవీ - చేసిన - బదిలీ చేయండి - రుణ ఉత్పత్తి ఎంచుకోండి * - రుణ ప్రయోజనం * - అసలు మెుత్తం* - మొత్తం - వ్యాఖ్య - ఊహించిన చెల్లింపు తేదీ - సమర్పణ తేదీ - సమర్పించిన - చెల్లించుట - బదిలీ తేదీ - రుణ కోసం దరఖాస్తు - రుణాన్ని నవీకరించండి - రుణ ఉపసంహరణ - రుణ ఉపసంహరణకు కారణం - రుణ ఖాతా విజయవంతంగా ఉపసంహరించబడింది - రుణం సమర్పించండి - కొత్త రుణ దరఖాస్తు - మీ క్రెడిట్ అప్లికేషన్ కోసం నవీకరించండి - వడ్డీ రకం - రుణ విమోచన - వడ్డీ లెక్కింపు కాలం - తిరిగి చెల్లించే వ్యూహం - చెల్లించండి - చెల్లింపు - రద్దు - సమీక్ష - బదిలీ చేయుట - బదిలీ నుండి - బదిలీని చేస్తోంది - జమ - మొత్తాన్ని నమోదు చేయండి - గమనిక తప్పనిసరి - ఆమోదించబడింది - పెండింగ్ - చెల్లించిన - సంతులనం - తిరస్కరించింది - వేచి - జీతాలు చెల్లించిందన్న - పెండింగ్లో ఉంది - మీరు దరఖాస్తు చేయదలచిన అన్నింటిని ఎంచుకోండి - ఫిల్టర్ సేవింగ్స్ ఖాతాలు - వడపోత రుణ ఖాతాలు - ఫిల్టర్ భాగస్వామ్యం ఖాతాలు - శోధన - చెల్లించడానికి ఖాతా ఎంచుకోండి - చెల్లించటానికి ఖాతాని ఎంచుకోండి - బదిలీ కోసం వ్యాఖ్యలను నమోదు చేయండి - లబ్దిదారుని ఎంచుకోండి - కొనసాగించు - క్లోస్ - బదిలీ పద్ధతి ఎంచుకోండి - సేవింగ్స్ బదిలీ - సేవింగ్స్ నుండి బదిలీ - రుణ ఆరోపణలు - సేవింగ్స్ ఛార్జీలు - చురుకుగా - మూసివేయబడింది - ఉపసంహరించుకున్నారు - ఆమోదం అవసరం - పెండింగ్ - పక్వమైనది - ఒక ఖాతాను సృష్టించండి - మొదటి పేరు - చివరి పేరు - ఫోను నంబరు - నమోదు - అభ్యర్థన ఐడి - ప్రామాణీకరణ టోకెన్ - ధ్రువీకరించడం - ధ్రువీకరిస్తోంది - సైన్ అప్ - వినియోగదారు విజయవంతంగా ధృవీకరించబడింది - మొబైల్ - ఇమెయిల్ - ధృవీకరణ మోడ్ - ఖాళీ - దిగుమతి QR - హామీని వీక్షించండి - హామీని జోడించండి - హామీని తొలగించండి - హామీని నవీకరించండి - హామీనిచ్చే పద్ధతి - హామీ లేదు - హామీని జోడించేందుకు నొక్కండి - హామీ వివరాలు - తేదీన చేరారు - సమర్పించండి - - ఖాతా డిపాజిట్ కోసం చురుకుగా ఉండాలి - బదిలీ కోసం ఖాతా క్రియాశీలకంగా ఉండాలి - - మీకు పొదుపు ఖాతాలు లేవు - మీకు రుణ ఖాతాలు లేవు - మీతో సంబంధం ఉన్న ఖాతాలు ఏవీ లేవు - మీకు సంబంధం ఉన్న లావాదేవీలు లేవు - మీకు తిరిగి చెల్లింపు షెడ్యూల్ లేదు - మరిన్ని లావాదేవీలు లేవు - లావాదేవీ లేదు - DOB కనుగొనబడలేదు. - ఏ సమూహంతో కేటాయించబడలేదు - - తప్పు వినియోగదారు పేరు / పాస్వర్డ్ - సర్వర్ నుండి అభిప్రాయాన్ని స్వీకరించడంలో లోపం - %1$s ఖాళీగా ఉండకూడదు - %1$s %2$d అక్షరాల కంటే తక్కువ ఉండకూడదు - %1$sలో %2$s ఉండకూడదు - %1$s ఖాళీతో ప్రారంభం కాకూడదు లేదా ముగియదు - అంతర్గత సర్వర్లో లోపం, దయచేసి మళ్ళీ ప్రయత్నించండి - క్లయింట్ జాబితాను లోడ్ చేయడంలో లోపం - రుణ ఖాతాల జాబితాలో లోడ్ చేయడంలో లోపం - పొదుపు ఖాతాల జాబితాను లోడ్ చేయడంలో లోపం - పొదుపు ఖాతాల గురించి వివరాలను లోడ్ చేయడంలో లోపం - ఇటీవలి లావాదేవీల్లో లోడ్ చేయడంలో లోపం - క్లయింట్ ఆరోపణల్లో లోడ్ అవుతున్నప్పుడు లోపం ఏర్పడింది - ఛార్జీలు కనుగొనబడలేదు - క్లయింట్ కనుగొనబడలేదు - క్లయింట్ని పొందడంలో విఫలమైంది - వినియోగదారు ప్రొఫైల్ని పొందడంలో విఫలమైంది - ఖాతాలను పొందడంలో విఫలమైంది - తిరిగి చెల్లించే షెడ్యూల్ను పొందడంలో విఫలమైంది - అదే ఖాతాతో బదిలీ చేయలేరు - బదిలీ టెంప్లేట్ డౌన్లోడ్ చేయబడలేదు - లబ్ధిదారులను పొందడంలో విఫలమైంది - లబ్ధిదారుల మూసను పొందడంలో విఫలమైంది - టెంప్లేట్ను పొందడంలో విఫలమైంది - లబ్దిదారుని సృష్టించడం విఫలమైంది - లబ్ధిదారుడిని నవీకరించడంలో విఫలమైంది - లబ్ధిదారుని తొలగించడంలో విఫలమైంది - రుణ ఖాతాను ఉపసంహరించడంలో లోపం - మూడవ పార్టీ బదిలీ టెంప్లేట్ను డౌన్లోడ్ చేయడంలో లోపం - ప్రస్తుతం, మీకు ఏ లబ్దిదారుడి లేదు. దయచేసి లబ్దిదారుడిని జోడించండి - - మీకు అధికారం లేదు - QR కోడ్ - QR కోడ్ను భాగస్వామ్యం చేయండి - మానిటర్ - ఎంపికను ఎంచుకోండి - లావాదేవీలను వీక్షించండి - ఛార్జ్లను వీక్షించండి - రుణ సారాంశాన్ని వీక్షించండి - తిరిగి చెల్లింపు షెడ్యూల్ చూడండి - ఈ ఖాతా కోసం QR కోడ్ను వీక్షించండి - చివరి లావాదేవీ వివరాలు - చెల్లని ఇమెయిల్ ఐడి - వినియోగదారు పేరు తప్పనిసరిగా 6 అక్షరాల కంటే ఎక్కువగా ఉండాలి - డౌన్ సర్వర్, కొంత సమయం తర్వాత ప్రయత్నించండి - క్లయింట్ ఛార్జీలు - QR ను చదవడంలో లోపం, మీరు సరైన ప్రాంతాన్ని ఎంచుకున్నారని నిర్ధారించుకోండి - చిత్రాన్ని పొందడంలో లోపం - క్లయింట్ పొందడం - - ఖాళీలు - క్లయింట్ పేరు - ఖాతా స్థితి - ఉత్పత్తి పేరు - మొత్తం ఉపసంహరణలు - కనీస అవసరం సంతులనం - ఉత్పత్తి పేరు - రుణ ప్రయోజనం - ప్రిన్సిపాల్ - ప్రిన్సిపల్ పంపిణీ చేయబడింది - వార్షిక వడ్డీ రేటు - వడ్డీ వసూలు - చెల్లించిన వడ్డీ - రుణ ఖాతా వివరాలు - రుణ సారాంశం - లోన్ పేరు - వడ్డీ - ఫీజు - జరిమానాలు - మొత్తం అంచనా వేయబడింది - మొత్తం చెల్లింపు - ఆసక్తి వడ్డీ - జరిమానాలు చెల్లించబడ్డాయి - ఫీజు చెల్లించినది - అత్యుత్తమ సంతులనం - తదుపరి వాయిద్యం - గడువు తేది - చెల్లింపు చేయండి - రుణ పద్ధతి - కరెన్సీ - తిరిగి చెల్లింపు షెడ్యూల్ - లావాదేవీలు - బదిలీ - ఆమోదం పెండింగ్లో ఉంది - డిస్బర్స్ కోసం వేచి ఉంది - కొన్ని ఆబ్లిగేషన్స్ కారణంగా మూసివేయబడింది - రుణ మూసివేయబడింది - గడువు తేది: - గడువు: - చెల్లించింది: - బెర్కిలీలను: - అసాధారణ: - ఉదాహరణ - విడ్జెట్ను జోడించు - సహాయం - పెద్ద టెక్ పరిశ్రమకు హోమ్ - రుణ ఖాతా వివరాలు - క్రెడిట్ అప్లికేషన్ విజయవంతంగా పంపబడింది - రుణ అనువర్తనం విజయవంతంగా నవీకరించబడింది - రుణ అనువర్తనం విజయవంతంగా ఉపసంహరించబడింది - నథింగ్ - అన్ని - 4 వారాలు - 3 నెలలు - 6 నెలలు - వడపోత - ప్రారంబపు తేది - ఆఖరి తేది - ఫిల్టర్ - దయచేసి ప్రారంభ తేదీ మరియు ముగింపు తేదీని ఎంచుకోండి - ప్రారంభ తేదీ కంటే ముగింపు తేదీ తప్పనిసరిగా ఉండాలి - సేవ్ ఖాతా లావాదేవీలు - ఇంటర్నెట్ కనెక్షన్ లేదు - పంపిణీ తేదీ - చెల్లింపుల సంఖ్య - తేదీ - రుణ సంతులనం - తిరిగి చెల్లించే - ఋణాన్ని తిరిగి చెల్లించడం - శీఘ్ర బదిలీ - దయచేసి మీరు ఇంటర్నెట్కు కనెక్ట్ చేయబడ్డారని నిర్ధారించుకోండి - లబ్ధిదారులు - లబ్ధిదారులను నిర్వహించండి - లబ్దిదారులు - లబ్ధిదారుల వివరాలు - లబ్దిదారుని పేరు - ఖాతా రకం - బదిలీ పరిమితి - లబ్దిదారుడిని జోడించండి - ఆఫీస్ పేరు - ఖాతా రకం ఎంచుకోండి * - లబ్ధిదారుడిని సమర్పించండి - లబ్దిదారు కార్యాలయ పేరుని నమోదు చేయండి - లబ్దిదారు పేరును నమోదు చేయండి - బదిలీ పరిమితిని నమోదు చేయండి - లబ్దిదారు ఖాతా ఖాతాను నమోదు చేయండి - డౌన్ నుండి ఖాతా రకం ఎంచుకోండి - లబ్దిదారుడు విజయవంతంగా సృష్టించారు - లబ్ధిదారుడు విజయవంతంగా నవీకరించబడింది - లబ్దిదారుడిని నవీకరించండి - లబ్ధిదారుని తొలగించండి - మీరు ఖచ్చితంగా ఈ వారసులను తీసివేయాలనుకుంటున్నారా? - తొలగించండి - లబ్ధిదారుడు విజయవంతంగా తొలగించారు - మూడవ పార్టీ బదిలీ - మొత్తం రుణ - మొత్తం పొదుపు - ఖాతా సారాంశం - మొత్తం పొదుపు మొత్తాన్ని చూపండి లేదా దాచండి - మొత్తం లోన్ మొత్తాన్ని చూపండి లేదా దాచండి - ***** - సర్వేలు - ఆక్టివేషన్ తేదీ - గుంపులు - యూజర్ వివరాలు - క్లయింట్ రకం - క్లయింట్ వర్గీకరణ - మోడ్ను ఎంచుకోండి - మీ ఖాతాకు బాహ్య వారసులను జోడించండి. \\ n దయచేసి ఖాతా యొక్క QR కోడ్ను మాన్యువల్గా స్కాన్ చేయండి లేదా స్కాన్ చేయండి - మీరు మీ ఖాతాలో చర్యలు చేయలేరు, పొదుపు ఖాతా లేదా మరొక వినియోగదారు యొక్క క్రెడిట్ ఖాతా నుండి QR కోడ్ను స్కాన్ చేయండి - జోడించండి - స్కాన్ - 4 అంకెల పాస్కోడ్ను నమోదు చేయండి - పాస్కోడ్ 4 అంకె అయి ఉండాలి - పాస్కోడ్ తప్పు - మీరు తప్పు ప్రాప్యత కోడ్ను 3 సార్లు కంటే ఎక్కువ నమోదు చేసారు - దాటవేయి - సేవ్ - లాగిన్ చేయడానికి పాస్కోడ్ను సెటప్ చేయండి - దయచేసి మీ పాస్కోడ్ను మళ్లీ నమోదు చేయండి - పాస్కోడ్ సరిపోలడం లేదు. - పాస్కోడ్ను మర్చిపోండి, మానవీయంగా లాగిన్ అవ్వండి - కొనసాగండి - మొత్తం సున్నా కంటే ఎక్కువగా ఉండాలి - మా గురించి అండర్ కన్స్ట్రక్షన్ - అండర్ కన్స్ట్రక్షన్ సహాయం - లాగౌట్ - ఇక్కడ స్వీయ-సేవ అనువర్తనాన్ని డౌన్లోడ్ చేయండి: https://play.google.com/store/apps/details?id= - దరఖాస్తును ఎంచుకోండి - అందుబాటులో లేదు - QR ని అప్లోడ్ చేయండి - QR కోడ్తో ప్రాంతాన్ని ఎంచుకోండి - - మమ్మల్ని సంప్రదించండి - విజయవంతంగా బదిలీ చేయబడింది - - మొత్తం: - - ಎ/ಸಿ - రుణ ఉత్పత్తి - అసక్రియంగా - సక్రియంగా - అసక్రియంగా - - - మీరు ఖచ్చితంగా లాగ్అవుట్ చేయాలనుకుంటున్నారా? - అలాగే - రద్దు - బ్యాక్ - అనుమతి నిరాకరించబడింది - నేను ఖచ్చితంగా ఉన్నాను - తిరిగి ప్రయత్నించు - అప్లికేషన్ సెట్టింగ్లు - కెమెరా అనుమతి లేకుండా, మీరు వారసులు జోడించడానికి QR కోడ్ స్కాన్ చేయలేరు. మీరు ఈ లక్షణాన్ని నిషేధించాలనుకుంటున్నారా? - మీరు తమరాను ఉపయోగించడానికి అనుమతిని తిరస్కరించారు, మీరు ఈ అనుమతి లేకుండా QR కోడ్ ఉపయోగించి వారసులను జోడించలేరు. సెట్టింగ్ల్లో దాన్ని ప్రారంభించండి - మెమరీ నుండి చదవడానికి అనుమతి లేకుండా, మీరు వారసుడిని జోడించడానికి QR కోడ్ను పంపలేరు. మీరు ఈ లక్షణాన్ని నిషేధించాలనుకుంటున్నారా? - మీరు పరికరం మెమరీ నుండి చదవడానికి అనుమతిని తిరస్కరించారు, మీరు ఈ అనుమతి లేకుండా QR కోడ్ ఉపయోగించి వారసులను జోడించలేరు. సెట్టింగ్ల్లో దాన్ని ప్రారంభించండి - మీరు పరికరం యొక్క మెమరీకి వ్రాయడానికి నిరాకరించారు, మీరు ఈ అనుమతి లేకుండా QR కోడ్ను ఉపయోగించి వారసులను జోడించలేరు. సెట్టింగ్ల్లో దాన్ని ప్రారంభించండి - దేశంపై ఆధారపడి కరెన్సీని చూపడానికి ఈ అనుమతి అవసరం. మీరు ఈ లక్షణాన్ని నిషేధించాలనుకుంటున్నారా? - ఈ అనుమతి లేకుండా, కరెన్సీ సరైన స్థితిలో ప్రదర్శించబడకపోవచ్చు, పరికరం స్థితిని చదవడానికి అనుమతిని మీరు తిరస్కరించారు. సెట్టింగ్ల్లో దాన్ని ప్రారంభించండి - సెట్టింగ్ల్లో కార్యాచరణ కోసం శోధిస్తున్నప్పుడు ఏదో తప్పు జరిగింది. \\ n \\ \'సెట్టింగులుకు వెళ్ళండి\' మరియు మానవీయంగా అనుమతులను నమోదు చేయండి. - నిల్వకు నిల్వ అనుమతి లేదు - మీరు ఖచ్చితంగా%1$s కావాలనుకుంటున్నారా? - - - హలో,%1$s - చెల్లని మొత్తం - నిష్క్రమించడానికి మళ్లీ మళ్లీ నొక్కండి - - కెమెరాను ఉపయోగించడానికి అనుమతి తిరస్కరించబడింది - - తరచుగా అడుగు ప్రశ్నలు - యూజర్ ప్రశ్న - ఇప్పుడు కాల్ చేయండి - ఒక ఇమెయిల్ను వదిలేయండి - స్థానాలను కనుగొనండి - ఉపసంహరణలు లేవు - ఫిల్టర్లను క్లియర్ చేయండి - ఖాతాలను నిర్వహించండి - మరింత - సెట్టింగ్ - భాషా - మీ భాషను ఎంచుకోండి - ప్రకటనలను - బేస్ url - కౌలుదారు - - - కొత్త క్రెడిట్ ఖాతా కోసం ఎలా దరఖాస్తు చేయాలి? - నేను నా ప్రొఫైల్ గురించి సమాచారాన్ని ఎక్కడ పొందగలను? - నేను నా పొదుపు ఖాతా లావాదేవీలను ఎక్కడ కనుగొనగలను? - QR కోడ్ ఉపయోగం ఏమిటి? - QR కోడ్ ఉపయోగించి లబ్ధిదారులను ఎలా సృష్టించాలి? - క్రెడిట్ ఖాతా కోసం ఎలా చెల్లించాలి? - - - - క్రెడిట్ ఖాతా కోసం దరఖాస్తు చేయడానికి, హోమ్ స్క్రీన్పై \ "రిపోర్ట్ లోన్ అప్లికేషన్ \" పై క్లిక్ చేయండి. - ప్రధాన ప్రొఫైల్ పేజీలోని ప్రొఫైల్ చిత్రంపై క్లిక్ చేయడం ద్వారా మీరు మీ ప్రొఫైల్ సమాచారాన్ని చూడవచ్చు. - మీ పొదుపు ఖాతాలో వ్యాపారాలను వీక్షించడానికి, అకౌంట్స్ విభాగానికి వెళ్లి, అవసరమైన పొదుపు ఖాతాను క్లిక్ చేసి, ఎగువ కుడి మూలలో మూడు చుక్కలను క్లిక్ చేసి, ట్రేడింగ్ ఎంపికను ఎంచుకోండి. - అన్ని క్రెడిట్ లేదా పొదుపు ఖాతాలకు QR కోడ్ను ఇతర వినియోగదారులతో భాగస్వామ్యం చేయవచ్చు, వాటిని వారసులుగా సృష్టించడానికి వీలు కల్పిస్తుంది - హోమ్ అప్లికేషన్ కు వారసుని సృష్టించిన తరువాత, కుడి దిగువ మూలలో ఉన్న బటన్పై క్లిక్ చేయండి, ఆపై కెమెరాను తెరిచే స్కాన్, అవసరమైన డేటాను ఎంపిక చేసిన తర్వాత, QR కోడ్ మీరు వారసునిగా సృష్టించాలనుకునే వ్యక్తిని స్కాన్ చేయడానికి QR కోడ్ ఉపయోగించి వారసులను సృష్టిస్తుంది - క్రెడిట్ ఖాతాకు చెల్లింపు చేయడానికి, అకౌంట్స్ విభాగానికి వెళ్లి, రుణ ఎంపికను ఎంచుకోండి, ఆపై లక్ష్య క్రెడిట్ ఖాతాను తెరిచి చెల్లింపు ఎంపికను క్లిక్ చేయండి. - - - - మొత్తం సేవింగ్స్ సంతులనం - మొత్తం రుణ సంతులనం - బ్యాంకు ఖాతా మరియు పొదుపు ఖాతా నిల్వలు అన్ని పొదుపు మరియు రుణ ఖాతాల ఆధారంగా లెక్కించబడతాయి - మీరు ఖచ్చితంగా బదిలీని రద్దు చేయాలనుకుంటున్నారా? - అవును - పాస్వర్డ్ను నిర్ధారించండి - పాస్వర్డ్ సరిపోలడం లేదు. - అన్ని హక్కులూ ప్రత్యేకించుకోవడమైనది. - లైసెన్సుల - బదిలీని పూర్తి చేయడం సాధ్యం కాదు, దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి - దయచేసి వేచి ఉండండి ... - సందేశం - నో నోటిఫికేషన్ - - ముగింపు స్థాన నవీకరణ - తుది స్థాన కాన్ఫిగరేషన్లను మార్చడానికి ఇక్కడ క్లిక్ చేయండి - బేస్ URL ను నమోదు చేయండి - అద్దెదారు నమోదు చేయండి - యాప్ సమాచారం - లాగిన్ విఫలమైంది, దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి. - \ No newline at end of file diff --git a/androidApp/src/main/res/values-ur/strings.xml b/androidApp/src/main/res/values-ur/strings.xml deleted file mode 100644 index 0ddd267dd..000000000 --- a/androidApp/src/main/res/values-ur/strings.xml +++ /dev/null @@ -1,455 +0,0 @@ - - - - Mifos موبائل - لاگ ان کریں - خوش آمدید %1$s - انٹرنیٹ سے منسلک نہیں - بنیادی - صارف کا نام - لاگ ان ہو رہا ہے - لوڈ کر رہا ہے - پاس ورڈ - ای میل - اکاؤنٹس - کلائنٹ - فنڈز ٹرانسفر - حالیہ ٹرانزیکشنز - چارجز - سوالنامہ - ہمارے بارے میں - اکاؤنٹ کی تفصیلات ذخیرہ کر رہے ہیں - بچت اکاونٹ - قرض اکاؤنٹس کی تفصیلات لوڈ کرنے میں خرابی - نامیاتی سود کی شرح - اکاؤنٹ نمبر - اکاؤنٹ کا توازن - کل جمع - ڈرار خلیے - ڈرار بند کریں - گھر - درمیانی متن - چھوٹے متن - کلائنٹ اکاؤنٹس - سپلیش - بچت - قرض - قرض کااکاؤنٹ - اشتراک کریں - اکاؤنٹ کا اشتراک کریں - کسٹمر چیز - کام کر رہے ہیں - موجودہ حالت کی تصویر - قرض کی ادائیگی کی شیڈول - پچھلا ٹرانزیکشن - بنایا - منتقلی بنائیں - قرض کی مصنوعات منتخب کریں * - قرض کا مقصد * - اصل رقم* - رقم - تبصرہ - متوقع معاوضہ کی تاریخ - جمع کروانے کی تازیخ - پیش کردی گی - ادائیگی - منتقلی کی تاریخ - قرض کے لئے درخواست کریں - قرضہ اپ ڈیٹ کریں - قرض واپس - قرض واپسی کی وجہ - قرض اکاؤنٹ کامیابی سے واپس لے لیاگیا - قرض جمع کرو - نیا قرض درخواست - قرض کے لئے درخواست اپ ڈیٹ کریں - سود کی قسم - تخرکشک - دلچسپی کا حساب کی مدت - واپسی کی حکمت عملی - ادایگی لینے والے ہیں - ادایگی دینے والے ہیں - منسوخ کریں - منتقلی کا جائزہ لیں - کو منتقلی - سے منتقلی - منتقلی کی جا رہی ہے - جمع - رقم درج کریں - تبصرہ ضروری ہے - منظورشدہ - منتقلی - ادا کیا - توازن - مسترد کردیا گیا - انتظار کر رہا ہے - اضافی رقم دی گئی - بقایاجات - جو چاہے منتخب کریں - بچت کے کھاتے چھانے - قرض کے کھاتے چھانے - اشتراک کے کھاتے چھانے - تلاش کریں - وہ اکاؤنٹ منتخب کریں جس کو ادایگی کرنی ہے - وہ اکاؤنٹ منتخب کریں جس سے ادایگی کرنی ہے - منتقلی کے لئے تبصرے درج کریں - فائدہ مند منتخب کریں - جاری کریں - بند کریں - منتقلی کی قسم منتخب کریں - بچت کی منتقلی - بچت سے منتقلی - قرض چارج - بچت کے چارجز - فعال - بند - واپس لے لیا - منظوری کی ضرورت ہے - منتقلی - متوازن - کھاتا کھولیں - پہلا نام - آخری نام - فون نمبر - رجسٹر کریں - درخواست کی شناخت - توثیقی ٹوکن - تصدیق کریں - توثیقی کر رہے ہیں - سائن اپ - توثیقی ہو گئی - موبائل - ای میل - توثیقی موڈ - - QR درآمد کریں - گارنٹیور دیکھیں - گارنٹیور شامل کریں - گارنٹیور کو حذف کریں - گارنٹیور اپ ڈیٹ کریں - گارنٹیور کی قسم - کوئی گارنٹیور نہیں - گارنٹیور شامل کرنے کیلئے تھپتھپائیں - گارنٹیور تفصیلات - شامل ہونے کی تاریخ - جمع - - جمع کرنے کے لئے اکاؤنٹ فعال ہونا چاہئے - منتقلی انجام دینے کے لئے اکاؤنٹ ہونا چاہئے - - آپ کے ساتھ منسلک کوئی بچت اکاؤنٹ نہیں ہے - آپ کے ساتھ منسلک کوئی قرض اکاؤنٹ نہیں ہے - آپ کے ساتھ منسلک کوئی شریک اکاؤنٹ نہیں ہے - آپ کے ساتھ کسی منتقلی کا تعلق نہیں ہے - آپ کے ساتھ منسلک کوئی ادائیگی کی شیڈول نہیں ہے - مزید ٹرانزیکشنز دستیاب نہیں ہیں - کوئی منتقلی نہیں - کوئی پیدائش کے اعداد وشمار نہیں ملا. - کسی گروپ کے ساتھ تفویض نہیں - - استعمال کرنے والے کا نام/پاس ورڈ درست نهیں - سرور سے جواب لوڈ کرنے میں خرابی - %1$s اسے خالی نہی چھوڑا جا سکتا - %1$s %2$d حروف سے کم نہیں ہوسکتی - %1$s میں %2$s شامل نہیں ہوسکتا ہے - %1$s کو خالی فاصلے کے ساتھ شرو یہ ختم نہیں کر سکتے - اندرونی سرور میں خرابی، براہ مہربانی دوبارہ کوشش کریں - کلائنٹ کی فہرست کو لوڈ کرنے میں خرابی - قرض اکاؤنٹس کی فہرست میں خرابی - اکاؤنٹس کی فہرست محفوظ کرنے میں خرابی - اکاؤنٹس کی تفصیلات کو بچانے میں لوڈنگ میں خرابی - حالیہ منتقلی کو لوڈ کرنے میں خرابی - کلائنٹ چارجز میں لوڈ کرنے میں خرابی - کوئی محصول نہیں ملا - کلائنٹ نہیں ملا - کلائنٹ حاصل کرنے میں ناکامی - صارف کی پروفائل کو حاصل کرنے میں ناکامی - اکاؤنٹس حاصل کرنے میں ناکامی - ادائیگی کی شیڈول حاصل کرنے میں ناکامی - اسی اکاؤنٹ میں منتقل نہیں کر سکتے ہیں - اکاؤنٹ کی منتقلی حاصل کرنے میں خرابی سانچے - گراؤنڈوں کو حاصل کرنے میں ناکامی - فائدہ مند سانچے کو حاصل کرنے میں ناکامی - ٹیمپلیٹ حاصل کرنے میں ناکامی - فائدہ اٹھانے میں ناکامی - فائدہ مند کو اپ ڈیٹ کرنے میں ناکامی - فائدہ مند کو حذف کرنے میں ناکامی - قرض اکاؤنٹ واپس لینے میں خرابی - تیسرے پارٹی کے منتقلی کو حاصل کرنے میں خرابی سانچے - فی الحال، آپ کو کوئی فائدہ مند نہیں ہے. برائے مہربانی فائدہ مند - - آپ مجاز نہیں ہیں - کیوارکوڈ - کیوارکوڈ کا اشتراک کریں - مانیٹر - اختیار کا انتخاب کریں - منتقلی دیکھیں - چارجز دیکھیں - قرض کا خلاصہ دیکھیں - ادائیگی کی شیڈول دیکھیں - اس اکاؤنٹ کے لئے QR کوڈ دیکھیں - آخری ٹرانزیکشن کی تفصیلات - صارف نام 6 حروف سے زیادہ ہونا چاہئے      - غلط ای میل کی شناخت - سرور نیچے، کچھ وقت کے بعد کوشش کریں - کلائنٹ چارجز -  QR پڑھنے کے دوران خرابی، اس بات کو یقینی بنائیں کہ آپ مناسب علاقہ منتخب کریں      - تصویر نکالنے میں خرابی - کلائنٹ لانے - - خالی جگہیں - کلائنٹ کا نام - اکاؤنٹ کی حیثیت - پروڈکٹ کا نام - کل ہٹانے - منٹ. ضرورت بال. - پروڈکٹ کا نام - قرض مقصد - پرنسپل - پرنسپل منقطع - این. شرح سود - دلچسپی کا شکار - دلچسپی ادا کی - قرض اکاؤنٹ کی تفصیلات - قرض خلاصہ - قرض کا نام - دلچسپی - فیس - سزا - کل متوقع واپسی - مکمل ادائیگی - دلچسپی سے محروم - سزا - فیس معاف - بقایا رقم - اگلے تنصیب - واجب الادا تاریخ - ادائیگی کرنا - قرض کی قسم - کرنسی - ادائیگی کی شیڈول - ٹرانسمیشن - منتقلی - ابھی منظور نہیں ہوا - تباہی کے انتظار میں - کچھ مکلفات کی وجہ سے بند - قرض بند - واجب الادا تاریخ: - کی وجہ سے: - ادا کیا: - پہنچا: - شاندار: - مثال - ویجیٹ شامل کریں - مدد - Mifos ابتدائی - Mifos ابتدائی، سیئٹل، واشنگٹن 98121 - سیٹل - بڑے ٹیک صنعت میں گھر - قرض اکاؤنٹ کی تفصیلات - قرض کی درخواست کامیابی سے پیش کی گئی      - قرض کی درخواست کامیابی سے اپ ڈیٹ کی گئی      - قرض کی درخواست کامیاب ہوگئی      - کوئی بھی نہیں - سب - ۴ ہفتوں - ۳ ماہ - ٦ ماہ - فلٹر - آغاز کی تاریخ - ختم ہونے کی تاریخ - فلٹرڈ - براہ کرم آغاز کی تاریخ اور ختم ہونے کی تاریخ منتخب کریں - ختم ہونے کی تاریخ شروع ہونے کی تاریخ کے مقابلے میں زیادہ ہونا ضروری ہے - اکاؤنٹ ٹرانسمیشن کو اسٹور کر رہے ہیں - کوئی انٹرنیٹ جوڈ نہیں - تسلط کی تاریخ - ادائیگی کی تعداد - تاریخ - قرض بیلنس - تنخواہ - قرض کی ادائیگی - فوری منتقلی - براہ کرم یقینی بنائیں کہ آپ انٹرنیٹ سے منسلک ہیں - فائدہ مند - فائدہ اٹھانے کا انتظام کریں - فائدہ مند - فائدہ مند کی تفصیل - فوائد کا نام - اکاؤنٹ کی اقسام - ٹرانسمیشن کی حد - گراؤنڈ شامل کریں - آفس کا نام - اکاؤنٹ کی قسم منتخب کریں * - گراؤنڈ جمع کریں - گراؤنڈ آفس کا نام درج کریں - فائدہ مند کا نام درج کریں - ٹرانسمیشن کی حد درج کریں - فائدہ مند اکاؤنٹ نمبر درج کریں - ڈراپ ڈاؤن سے اکاؤنٹ کی قسم منتخب کریں - گراؤنڈ کامیابی سے پیدا ہوا - گراؤنڈ کامیابی سے اپ ڈیٹ کیا - فائدہ اٹھاو - فائدہ اٹھانے کے لۓ - کیا آپ واقعی یہ حذف کرنا چاہتے ہیں فائدہ مند - حذف کریں - گراؤنڈ کامیابی سے ختم ہوگیا - تیسری پارٹی کی منتقلی - کل قرض - کل بچت - اکاؤنٹ کا جائزہ - بچت کی کل رقم دکھائیں یا چھپائیں۔ - قرض کی کل رقم دکھائیں یا چھپائیں۔ - ***** - سروے - چالو کرنے کی تاریخ - گروپ - صارف کی تفصیلات - کلائنٹ کی قسم - کلائنٹ کی درجہ بندی - موڈ منتخب کریں - اپنے اکاؤنٹ میں تیسری پارٹی کے مفادات کو شامل کریں.\n یا نہیں دستی طور پر درج کریں یا اکاؤنٹ کیوارکوڈ اسکین کریں - آپ اپنے اکاؤنٹ میں کارروائی نہیں کر سکتے ہیں، براہ مہربانی دوسرے صارف کو اسکین کریں بچت اور قرض اکاؤنٹ کیوارکوڈ - شامل کریں - سکین - ٤ پوائنٹس کا پاس کوڈ درج کریں - پاسپوڈ ٤ پوائنٹس کا ہونا چاہئے - غلط پاسپوڈ - آپ نے غلط پاس کوڈ درج کیا ہے ٣ بار - چھوڑ دو - نیا لکھیں - پاس ورڈ کو لاگ ان کرنے کے لئے مقرر کریں - اپنا پاس کوڈ دوبارہ درج کریں - پاسکوڈ مماثل نہیں ہے - پاس ورڈ کوڈ بھول گئے، دستی طور پر لاگ ان کریں - آگے بڑھو - رقم صفر سے زیادہ ہونا چاہئے - ہمارے تعمیراتی کام کے تحت - تعمیر کے تحت مدد - لاگ آوٹ - خود سروس ایپ ڈاؤن لوڈ کریں: https://play.google.com/store/apps/details؟id= - درخواست منتخب کریں - خالی - کیوارکوڈ اپ لوڈ کریں - کیوارکوڈ کے ساتھ علاقے کا انتخاب کریں - - ہم سے رابطہ کریں - - کامیابی سے منتقلی - - کل: - - اک/ٹ - قرض کی پیداوار - غیر فعال - فعال - غیر فعال - - - کیا آپ واقعی لاگ آؤٹ کرنا چاہتے ہیں؟ - ٹھیک ہے - منسوخ کریں - پیچھے - اجازت نہیں دی گئی - مجھے یقین ہے - دوبارہ کوشش کریں - ایپ کی ترتیبات - کیمرے کی اجازت کے بغیر آپ کریں گے فائدہ اٹھانے کے لئے کیوارکوڈ کو اسکین کرنے میں ناکام ہو .آپ کو یقین ہے کہ آپ اس سے انکار کرنا چاہتے ہیں اجازت؟ - آپ نے اجازت دی ہے اس اجازت کے بغیر کیمرے کا استعمال کریں، آپ کو کیوارکوڈ کا استعمال کرتے ہوئے فائدہ مندوں کو شامل کرنے کے قابل نہیں ہوں گے.براہ مہربانی اسے ترتیبات میں فعال کریں - اسٹوریج کی اجازت کے بغیر آپ کریں گے فائدہ اٹھانے کے لئے کیوارکوڈ اپ لوڈ کرنے کے قابل نہیں ہو .آپ کو یقین ہے کہ آپ اس سے انکار کرنا چاہتے ہیں اجازت؟ - آپ نے اجازت دی ہے اس اجازت کے بغیر اسٹوریج کو پڑھیں، آپ کو کیوارکوڈ کا استعمال کرتے ہوئے فائدہ مندوں کو شامل کرنے کے قابل نہیں ہوں گے.براہ مہربانی اسے ترتیبات میں فعال کریں - آپ نے اجازت دی ہے اس اجازت کے بغیر اسٹوریج میں لکھیں، آپ کو QR کوڈ کا استعمال کرتے ہوئے فائدہ اٹھانے والے افراد کو شامل کرنے کے قابل نہیں ہوں گے.براہ مہربانی اسے ترتیبات میں فعال کریں - اس اجازت کی ضرورت ہے اپنے ملک کے مطابق کرنسی کو دکھانے کے لئے. کیا آپ کو یقین ہے کہ آپ اسے انکار کرنا چاہتے ہیں؟ - آپ نے اجازت سے انکار کردیا ہے فون اسٹیٹ حاصل کرنے کے بغیر، اس اجازت کے بغیر کرنسی مناسب شکل میں نہیں دکھایا جا سکتا ہے.براہ مہربانی اسے ترتیبات میں فعال کریں - کچھ ترتیبات کی سرگرمیوں کو تلاش کرنے میں غلطی ہوئی.\n \'ترتیبات\' کرنے اور دستی طور پر اجازت فراہم کرنے کے لئے. - اسٹوریج سے اجازت سے انکار - کیا آپ واقعی %1$s کرنا چاہتے ہیں؟ - - - %1$s ،خوش آمدید - %1$.2f - %2$s %1$.2f - %2$s %1$s - %2$.2f %1$s - %2$d :%1$s - ناجایز رقم - باہر نکلنے کیلئے دوبارہ دبائیں - - اجازت کیمرے کا استعمال کرنے سے انکار ہے - ١ - ٢ - ٣ - ٤ - ٥ - ٦ - ٧ - ٨ - ٩ - ٠ - - اکثر پوچھے گئے سوالات - صارف کا سوال - اب کال کریں - ای میل چھوڑ دو - مقامات تلاش کریں - کوئی واپسی نہیں - فلٹر صاف کریں - اکاؤنٹس کا نظم کریں - مزید - ترتیبات - زبان - اپنی زبان کا انتخاب کریں - اطلاعات - بیس یو آر ایل - کرایہ دار - - - میں نئے قرض اکاؤنٹ کے لئے درخواست کیسے کروں؟ - میں اپنی پروفائل کی معلومات کہاں سے دیکھ سکتا ہوں؟ - میں اپنے بچت کے اکاؤنٹس کے ٹرانزیکشنز کو کہاں دیکھ سکتا ہوں؟ - QR کوڈ کا استعمال کیا ہے؟ - QR کوڈ کا استعمال کرتے ہوئے فائدہ مند بنانے کا طریقہ - قرض اکاؤنٹ کے لئے ادائیگی کیسے کی جائے؟ - - - - قرض اکاؤنٹ کے لئے درخواست دینے کے لئے، ہوم اسکرین پر دی گئی "قرض کے لئے درخواست کریں" پر کلک کریں. - ہوم پر موجود صارف کی تصویر پر کلک کرکے آپ اپنی پروفائل کی معلومات دیکھ سکتے ہیں اسکرین. - آپ کی بچت کے اکاؤنٹ ٹرانزیکشنز کو دیکھنے کے لئے، اکاؤنٹس حصے پر جائیں، پر کلک کریں ضروری بچت کا اکاؤنٹ، اوپر دائیں پر موجود تین نقطوں پر کلک کریں اور منتخب کریں ٹرانزیکشن اختیار - کسی بھی قرض یا بچت اکاؤنٹس کے لئے کیوارکوڈ دوسرے صارفین کے ساتھ اشتراک کیا جاسکتا ہے انہیں فائدہ مند بنانے کے لئے اجازت دیں. - فائدہ مند بنانے کے لئے، ہوم اسکرین سے تصویر گراؤنڈری اختیار پر کلک کریں پھر کلک کریں             سرکلر بٹن پر نیچے دائیں جانب موجود ہے، جو سکین کرنے کا اختیار منتخب کریں             آپ کا آلہ کیمرے، دوسرے شخص کے QR کوڈ کو اسکین کریں جس کے لئے آپ کو تخلیق کرنا چاہتے ہیں فائدہ مند، دوسرے ضروری تفصیلات میں بھرنے کے بعد آپ کو ایک تخلیق کرنے کے قابل ہو جائے گا کیوارکوڈ کا استعمال کرتے ہوئے فائدہ مند - قرض اکاؤنٹ کے لئے ادائیگی کرنے کے لئے، اکاؤنٹس حصوں میں جائیں، قرض منتخب کریں پھر اپنے مطلوبہ قرض اکاؤنٹ کھولیں اور ادائیگی کا اختیار بنائیں پر کلک کریں. - - - - کل بچت بیلنس - کل قرض بیلنس - اوپر قرض اور بچت اکاؤنٹس اکاؤنٹس ہیں آپ کے تمام بچت اور قرض کے اکاؤنٹس کی طرف سے حساب کیا جاتا ہے - کیا آپ واقعی منتقلی کو منسوخ کرنا چاہتے ہیں؟ - جی ہاں - پاس ورڈ کی توثیق کریں - پاس ورڈ میچ نہیں کرتا. - ورژن٪ 1 $ s - © 2016 - %1$s Mifos نوٹیفیکیشن. - جملہ حقوق محفوظ ہیں. - لائسنس - منتقلی مکمل کرنے میں ناکام، براہ کرم بعد میں دوبارہ کوشش کریں - برائے مہربانی انتظار کریں… - پیغام - کوئی اطلاع نہیں - - اختتام پوائنٹ اپ ڈیٹ کریں - اپنے اختتام پوائنٹ کی ترتیبات کو تبدیل کرنے کے لئے یہاں کلک کریں - بیس یو آر ایل درج کریں - کرایہ درج کریں - ایپ کی معلومات - لاگ ان ناکام ہوگیا، براہ کرم بعد میں دوبارہ کوشش کریں۔ - - diff --git a/androidApp/src/main/res/values/colors.xml b/androidApp/src/main/res/values/colors.xml deleted file mode 100644 index 94394e4c5..000000000 --- a/androidApp/src/main/res/values/colors.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - #ffffffff - #000000 - #eaeaea - #ff14c416 - #ff8bf98a - #fff9ac06 - #FF87DBF9 - #fff9393c - #ffd1d1d1 - #8ad3da44 - #8ada6134 - #ff003fff - #FF0000 - #1C1C1C - - #B2C1C8 - - - #ff33b5e5 - - #33999999 - - #BB666666 - - #ff99cc00 - - #ffff4444 - - #ff0099cc - - #ff669900 - - #ffcc0000 - - #ffaa66cc - - #ffffbb33 - - #ffff8800 - - #ff00ddff - - #33CCCCCC - - - - - - - - #FF325ca8 - #0288D1 - #B3E5FC - #FF4081 - #212121 - #757575 - #FFFFFF - #BDBDBD - #ffffff - @color/blue_light - #EEEEEE - #00000000 - - - - @color/blue_light - @color/green_light - @color/red_light - @color/orange_light - - - \ No newline at end of file diff --git a/androidApp/src/main/res/values/strings.xml b/androidApp/src/main/res/values/strings.xml deleted file mode 100644 index 76b091c42..000000000 --- a/androidApp/src/main/res/values/strings.xml +++ /dev/null @@ -1,658 +0,0 @@ - - - - Mifos Mobile - Login - Welcome %1$s - Not connected to internet - Basic - Username - Logging In - Loading - Password - Email - Accounts - Clients - Funds Transfer - Recent Transactions - Charges - Questionnaire - About Us - Saving Account Details - Savings Account - Error loading in loan accounts detail - Nominal Interest Rate - Account Number - Account Balance - Total Deposits - Open Drawer - Close Drawer - Home - Large Text - Medium Text - Small Text - Client Accounts - Splash - Saving - Loan - Loan Account - Share - Share Account - Chose a client - Working - Status Image - Repayment Schedule - Last Transaction - Made on - Make a Transfer - Select Loan Product* - Purpose of Loan* - Principal Amount* - Amount - Remark - Expected Disbursement Date - Submission Date - Submitted - Disbursement - Transfer Date - Apply for Loan - Update Loan - Withdraw Loan - Reason to Withdraw Loan - Loan account successfully withdrawn - Review - Submit Loan - New Loan Application for - Update Loan Application for - Interest Type - Amortization - Interest calculation period - Repayment Strategy - Pay To - Pay From - Cancel - Review - Transfer To - Transfer From - Making Transfer - Deposit - Enter Amount - Remark is mandatory - Approved - Pending - Paid - Balance - Rejected - Waiting - Overpaid - In Arrears - Select all filters you want to apply - Filter Savings Accounts - Filter Loan Accounts - Filter Share Accounts - Search - Select Account to Pay To - Select Account to Pay From - Enter Remarks for transfer - Select Beneficiary - Continue - Close - Choose Transfer Type - Transfer To Savings - Transfer from Savings - Loan Charges - Savings Charges - Active - Closed - Withdrawn - Need Approval - Pending - Matured - Create an account - First Name - Last Name - Phone Number - Register - Request Id - Authentication Token - Verify - Verifying - Signing up - User has been verified successfully - mobile - email - Verification Mode -   - Import QR - Use Touch Id - - View Guarantor - Add Guarantor - Delete Guarantor - Update Guarantor - Guarantor Type - No Guarantors - Tap to Add Guarantor - Guarantor Details - Joined Date - Submit - Select Product Id - Account Id - New Saving Account Application - Update Savings Account - Withdraw Savings Account - Withdrawal Date - New Saving Account created successfully. - Saving Account Updated Successfully - Savings Account Withdraw Successful - %1$s Savings Account - Apply - Apply Savings Account - Update - Edit - Passcode - Other - Gender - No - foundx - - Password - Change Passcode - Change App Passcode - Change Password - %1$s changed successfully - - Account should to be Active to perform a - deposit - - Account should to be Active to perform a - transfer - - - Request ID cannot be empty - Authentication Token cannot be empty - There is no SavingsAccount associated with you - There is no LoanAccount associated with you - There is no ShareAccount associated with you - There is no transactions associated with you - There is no repayment schedule associated with you - - No more transactions available - No Transaction - No DOB found. - Not Assigned with any group - - Invalid Username/Password - Error loading response from server - %1$s cannot be blank - %1$s cannot be less than %2$d characters - %1$s cannot contain %2$s - %1$s cannot begin or - end with blank space - - Error in internal server, please try again - Error loading client list - Error loading in loan accounts list - Error loading in saving accounts list - Error loading in saving accounts detail - - Error loading in Recent Transactions - Error loading in client charges - No charges found - Client Not Found - Failed to fetch Client - Failed to fetch User Profile - Failed to fetch Accounts - Failed To fetch repayment schedule - Can\'t transfer with in same account - Error to fetching account transfer - template - - Failed to fetch Beneficiaries - Failed to fetch Beneficiary Template - Failed to fetch template - Failed to create Beneficiary - Failed to update Beneficiary - Failed to delete Beneficiary - Error in withdrawing loan account - Error to fetch Third Party Transfer - template - - Currently, you don\'t have any Beneficiary. Please add Beneficiary - - You are not authorized - QR Code - Share QR Code - Monitor - Choose option - View Transactions - View Charges - View Loan summary - View Repayment Schedule - View QR Code for this account - Last Transaction Details - Username should be greater than 6 alphabets - - Invalid email id - Server Down, Try after some time - Client Charges - Error while reading QR, make sure you select proper region - - Error fetching image - Invalid Phone Number - Fetching Client - - Spaces - Client Name - Account Status - Product Name - Total Withdrawals - Min. Required Bal. - Product Name - Loan Purpose - Principal - Principal Disbursed - Ann. Interest Rate - Interest Charged - Interest Paid - Loan Account Details - Loan Summary - Loan Name - Interest - Fees - Penalties - Total Expected Repayment - Total Paid - Interest Waived - Penalties Waived - Fee Waived - Outstanding Balance - Next Installment - Due Date - Make Payment - Loan Type - Currency - Repayment Schedule - Transactions - Transfer - Approval Pending - Waiting for Disburse - Closed because of some Obligations - Loan Closed - Due Date: - Due: - Paid: - Waved: - Outstanding: - EXAMPLE - Add widget - Help - Mifos Initiative - Mifos Initiative , Seattle , Washington 98121 - Seattle - Home to large tech industry - Loan Account Details - Loan Application Submitted Successfully - - Loan Application Updated Successfully - - Loan Application Withdrawn Successfully - - None - All - 4 Weeks - 3 Months - 6 Months - Filter - Start Date - End Date - Filtered - Please select start date and end date - End date must be greater than Start date - Saving Account Transactions - No Internet Connection - Disbursement Date - Number of payments - Date - Loan Balance - Repayment - Loan Repayment - Quick Transfer - Please make sure you are connected to internet - Beneficiary - Manage Beneficiaries - Beneficiaries - Beneficiary Detail - Beneficiary Name - Account Type - Transfer Limit - Add Beneficiary - Office Name - Select Account Type* - Submit Beneficiary - Enter Beneficiary Office Name - Enter Beneficiary Name - Enter Transfer Limit - Enter Beneficiary Account Number - Select Account Type from the dropdown - Beneficiary created successfully - Beneficiary updated successfully - Update Beneficiary - Delete Beneficiary - Are you sure you want to delete this - Beneficiary - - Are you sure you want to login using Password? - - Delete - Beneficiary deleted successfully - Third Party Transfer - Total Loan - Total Savings - Account Overview - Show or hide the total saving amount - Show or hide the total loan amount - ***** - Surveys - Activation Date - Groups - User Details - Client Type - Client Classification - Select Mode - Add Third Party Beneficiaries to your account.\nEither - enter manually or scan account QR code - - Income Generating Loan - Not Applicable - 143.00 - You can\'t make action into your account, please scan other user - Savings and Loans Account QRCode - - Add - Scan - Enter 4 digit Passcode - Passcode should be of 4 digit - Incorrect Passcode - You have entered incorrect Passcode more than - 3 times - - Skip - Save - Setup a passcode to login - Please re-enter your passcode - Passcode does not match. - Forgot passcode, login manually - Proceed - Grant permission - Deny - Dismiss - Amount should be greater than zero - About Us Under Construction - Help Under Construction - Logout - Download Self Service app here: - https://play.google.com/store/apps/details?id= - - Choose application - NA - Upload QR - Select region with QR code - - Contact Us - 8000000000 - support@mifos.org - - Transferred Successfully - - Total: - - A/C - Loan Product - Inactive - ACTIVE - INACTIVE - - - Are you sure you want to logout? - OK - Cancel - Back - Permission Denied - I\'m Sure - Retry - App Settings - Without camera permission you will - not be able to scan QR code to add beneficiary.Are you sure you want to deny this - permission? - - You have denied permission to - use camera, without this permission you will not be able to add beneficiaries using QR Code. - Please enable it in settings - - Without storage permission you will - not be able to upload QR code to add beneficiary.Are you sure you want to deny this - permission? - - Without photos permission you will - not be able to upload QR code to add beneficiary.Are you sure you want to deny this - permission? - - You have denied permission to - read storage, without this permission you will not be able to add beneficiaries using QR Code. - Please enable it in settings. - - Please grant us storage permission in settings. - - - You have denied permission to - write to storage, without this permission you will not be able to add beneficiaries using QR Code. - Are you sure you want to deny this permission? - - This permission is required - to show currency according to your country.Are you sure you want to deny it? - - You have denied permission - to fetch Phone State, without this permission currency might not be shown in proper format. - Please enable it in settings - - Something went wrong finding Settings activity. - \nGo to \'Settings\' and grant permission manually. - - Permission denied to storage - - Are you sure that you want to %1$s? - Error During Login - - - Hello, %1$s - %1$.2f - %1$.2f %2$s - %1$s %2$s - %1$s%2$s - %1$s %2$.2f - %1$s: %2$d - Invalid Amount - Press back again to exit - - package - Permission Denied to use Camera - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 0 - - Frequently Asked Questions - User Query - Call now - Leave an email - Find Locations - No withdrawals - Clear Filters - Manage Accounts - More - Settings - Language - Choose your language - Notifications - Base URL - Tenant - Saving Accounts - Loan Accounts - Sharing Accounts - - Select Loan Product - Sign in using fingerprint - Scan your fingerprint - - - language_type - default_system_language - theme_type - Total Savings Balance - Total Loan Balance - Above Loan and Savings account balance are - calculated on behalf of your all savings and loan accounts. - - Are you sure you want to cancel the transfer? - Yes - Confirm Password - Password does not match. - Version %1$s - ©2016-%1$s Mifos Initiative. - All rights reserved. - Licenses - Privacy Policy - openmf.github.io/privacy_policy_mifos_mobile.html - https://openmf.github.io/privacy_policy_mifos_mobile.html - Unable to complete transfer, please try again later - Please Wait... - message - No image seleted or Something went wrong - Selected QR image - No Notification - - Update Endpoint - Click here to change your Endpoint Configurations - pref_configuration - Enter the Base URL - Enter the Tenant - accountType.loan - Refresh - - - Weak - Medium - Strong - Very Strong - Not Provided - Details - Product - - Dividend Payout - Withdrawal - Interest Posting - Fee Deduction - Withdrawal Transfer - Rejected Transfer - Overdraft Fee - Savings Account Transaction - Transaction Period - Transaction Type - Questions - Logged out successfully - - Do you want to cancel registering New Account ? - Cancel Registration - Source Code - Official Website - App version 1.0 - License: MPL-2.0 - An Android Application built on top of the MifosX Self-Service platform for end-user customers to view/transact on the accounts and loans they hold. - or - There is no application that support this action - Theme - Change theme - - - System Language - English - हिंदी - عربى - اُردُو - বাঙালি - Español - français - bahasa Indonesia - ភាសាខ្មែរ - ಕನ್ನಡ - తెలుగు - မြန်မာ - Polski - Português - русский - Kiswahili - فارسی - - - - System_Language - en - hi - ar - ur - bn - es - fr - in - km - kn - te - my - pl - pt - ru - sw - fa - - - - System Theme - Light Theme - Dark Theme - - App Info - Login Failed, Please Try Again Later. - Password changed successfully - We were unable to register the user. - No Questions Found - Something went wrong - ATM Icon - GuarantorActivity - Screen Guarantor List - Screen Guarantor Details - Screen Guarantor Add - City - Guarantor deleted successfully - Guarantor created successfully - Guarantor updated successfully - Required - S.No - No Transaction Found - ⚠️ You aren’t connected to the internet - AIzaSyBbeT2BaMWLj-lReCgYoNmXs_TIyRLr9qQ - diff --git a/cmp-android/.gitignore b/cmp-android/.gitignore new file mode 100644 index 000000000..f992ceff4 --- /dev/null +++ b/cmp-android/.gitignore @@ -0,0 +1,2 @@ +/build +/prod diff --git a/cmp-android/README.md b/cmp-android/README.md new file mode 100644 index 000000000..f6a8090e5 --- /dev/null +++ b/cmp-android/README.md @@ -0,0 +1,18 @@ +### Module Graph + +```mermaid +%%{ + init: { + 'theme': 'neutral' + } +}%% + +graph LR + subgraph :core + :core:data["data"] + :core:ui["ui"] + end + :mifospay-android --> :mifospay-shared + :mifospay-android --> :core:data + :mifospay-android --> :core:ui +``` \ No newline at end of file diff --git a/androidApp/build.gradle.kts b/cmp-android/build.gradle.kts similarity index 67% rename from androidApp/build.gradle.kts rename to cmp-android/build.gradle.kts index ef9a4850a..9ea145ca1 100644 --- a/androidApp/build.gradle.kts +++ b/cmp-android/build.gradle.kts @@ -15,29 +15,28 @@ plugins { alias(libs.plugins.mifos.android.application.compose) alias(libs.plugins.mifos.android.application.flavors) id("com.google.android.gms.oss-licenses-plugin") + id("com.google.devtools.ksp") } +//val packageNameSpace: String = libs.versions.androidPackageNamespace.get() + android { - namespace = "org.mifos.mobile" + namespace = "cmp.android.app" defaultConfig { - versionName = project.dynamicVersion - versionCode = System.getenv("VERSION_CODE")?.toIntOrNull() ?: 1 applicationId = "org.mifos.mobile" + versionName = System.getenv("VERSION") ?: project.dynamicVersion + versionCode = System.getenv("VERSION_CODE")?.toIntOrNull() ?: 1 vectorDrawables.useSupportLibrary = true testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - multiDexEnabled = true - ndk { - abiFilters.addAll(arrayOf("armeabi-v7a", "x86", "x86_64", "arm64-v8a")) - } } signingConfigs { create("release") { - storeFile = file(System.getenv("KEYSTORE_PATH") ?: "debug_keystore.jks") - storePassword = System.getenv("KEYSTORE_PASSWORD") ?: "mifos1234" - keyAlias = System.getenv("KEYSTORE_ALIAS") ?: "mifos-mobile" - keyPassword = System.getenv("KEYSTORE_ALIAS_PASSWORD") ?: "mifos1234" + storeFile = file(System.getenv("KEYSTORE_PATH") ?: "../keystores/release_keystore.keystore") + storePassword = System.getenv("KEYSTORE_PASSWORD") ?: "Wizard@123" + keyAlias = System.getenv("KEYSTORE_ALIAS") ?: "kmp-project-template" + keyPassword = System.getenv("KEYSTORE_ALIAS_PASSWORD") ?: "Wizard@123" enableV1Signing = true enableV2Signing = true } @@ -48,22 +47,36 @@ android { applicationIdSuffix = MifosBuildType.DEBUG.applicationIdSuffix } + // Disabling proguard for now until + // https://github.com/openMF/mobile-wallet/issues/1815 this issue is resolved release { + isMinifyEnabled = false + applicationIdSuffix = MifosBuildType.RELEASE.applicationIdSuffix + isShrinkResources = false isDebuggable = false - isMinifyEnabled = true - isShrinkResources = true + isJniDebuggable = false signingConfig = signingConfigs.getByName("release") - applicationIdSuffix = MifosBuildType.RELEASE.applicationIdSuffix proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } buildFeatures { - compose = true + dataBinding = true buildConfig = true } -} + packaging { + resources { + excludes.add("/META-INF/{AL2.0,LGPL2.1}") + } + } + + testOptions { + unitTests { + isIncludeAndroidResources = true + } + } +} dependencyGuard { configuration("demoDebugRuntimeClasspath") configuration("demoReleaseRuntimeClasspath") @@ -72,8 +85,7 @@ dependencyGuard { } dependencies { - - implementation (projects.shared) + implementation(projects.cmpShared) implementation(projects.core.logs) implementation(projects.core.common) @@ -100,42 +112,43 @@ dependencies { // implementation(projects.feature.settings) // implementation(projects.feature.updatePassword) // implementation(projects.feature.home) - implementation(projects.feature.auth) +// implementation(projects.feature.auth) // implementation(projects.feature.userProfile) // implementation(projects.libs.mifosPasscode) - // Jetpack Compose + // Compose + implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) - implementation(libs.androidx.activity.ktx) implementation(libs.androidx.activity.compose) - implementation(platform(libs.androidx.compose.bom)) - implementation(libs.androidx.compose.material3) - implementation(libs.androidx.compose.material) - implementation(libs.androidx.compose.foundation) - implementation(libs.androidx.compose.foundation.layout) - implementation(libs.androidx.compose.material.iconsExtended) - implementation(libs.androidx.compose.runtime) - implementation(libs.androidx.compose.ui.tooling.preview) - implementation(libs.androidx.compose.ui.util) - implementation(libs.androidx.lifecycle.runtimeCompose) - + implementation(libs.androidx.activity.ktx) implementation(libs.androidx.core.splashscreen) - implementation(libs.androidx.tracing.ktx) implementation(libs.androidx.profileinstaller) - implementation(libs.google.oss.licenses) - implementation(libs.androidx.multidex) + implementation(libs.androidx.tracing.ktx) + + implementation(libs.koin.core) + implementation(libs.koin.android) + implementation(libs.koin.compose) + implementation(libs.koin.compose.viewmodel) + + runtimeOnly(libs.androidx.compose.runtime) + debugImplementation(libs.androidx.compose.ui.tooling) -// testImplementation(projects.core.testing) -// testImplementation(libs.hilt.android.testing) -// testImplementation(libs.work.testing) + testImplementation(libs.junit) + testImplementation(libs.androidx.compose.ui.test) -// androidTestImplementation(kotlin("test")) -// androidTestImplementation(projects.core.testing) -// androidTestImplementation(libs.androidx.test.espresso.core) -// androidTestImplementation(libs.androidx.navigation.testing) -// androidTestImplementation(libs.hilt.android.testing) + androidTestImplementation(libs.androidx.compose.ui.test) + androidTestImplementation(libs.androidx.test.ext.junit) - debugApi(libs.androidx.compose.ui.tooling) + testImplementation(kotlin("test")) + testImplementation(libs.koin.test) + testImplementation(libs.koin.test.junit4) } + +dependencyGuard { + configuration("prodReleaseRuntimeClasspath") { + modules = true + tree = true + } +} \ No newline at end of file diff --git a/androidApp/dependencies/demoDebugRuntimeClasspath.txt b/cmp-android/dependencies/demoDebugRuntimeClasspath.txt similarity index 97% rename from androidApp/dependencies/demoDebugRuntimeClasspath.txt rename to cmp-android/dependencies/demoDebugRuntimeClasspath.txt index e336f2ce5..40235e143 100644 --- a/androidApp/dependencies/demoDebugRuntimeClasspath.txt +++ b/cmp-android/dependencies/demoDebugRuntimeClasspath.txt @@ -60,6 +60,11 @@ androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.1.0 +androidx.databinding:databinding-adapters:8.7.3 +androidx.databinding:databinding-common:8.7.3 +androidx.databinding:databinding-ktx:8.7.3 +androidx.databinding:databinding-runtime:8.7.3 +androidx.databinding:viewbinding:8.7.3 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 @@ -83,6 +88,7 @@ androidx.lifecycle:lifecycle-runtime-compose:2.8.7 androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.7 androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 androidx.lifecycle:lifecycle-runtime:2.8.7 +androidx.lifecycle:lifecycle-service:2.8.7 androidx.lifecycle:lifecycle-viewmodel-android:2.8.7 androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.7 androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 @@ -92,7 +98,6 @@ androidx.lifecycle:lifecycle-viewmodel:2.8.7 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 androidx.metrics:metrics-performance:1.0.0-beta01 -androidx.multidex:multidex:2.0.1 androidx.navigation:navigation-common-ktx:2.8.4 androidx.navigation:navigation-common:2.8.4 androidx.navigation:navigation-compose:2.8.4 @@ -155,7 +160,6 @@ com.google.android.gms:play-services-measurement-impl:22.1.2 com.google.android.gms:play-services-measurement-sdk-api:22.1.2 com.google.android.gms:play-services-measurement-sdk:22.1.2 com.google.android.gms:play-services-measurement:22.1.2 -com.google.android.gms:play-services-oss-licenses:17.1.0 com.google.android.gms:play-services-stats:17.0.2 com.google.android.gms:play-services-tasks:18.2.0 com.google.code.findbugs:jsr305:3.0.2 @@ -293,15 +297,14 @@ org.jetbrains.compose.runtime:runtime:1.7.3 org.jetbrains.compose.ui:ui-geometry:1.7.0-rc01 org.jetbrains.compose.ui:ui-graphics:1.7.0-rc01 org.jetbrains.compose.ui:ui-text:1.7.0-rc01 -org.jetbrains.compose.ui:ui-tooling-preview:1.7.0-rc01 org.jetbrains.compose.ui:ui-unit:1.7.0-rc01 org.jetbrains.compose.ui:ui-util:1.7.0-rc01 org.jetbrains.compose.ui:ui:1.7.0-rc01 org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-reflect:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20 org.jetbrains.kotlin:kotlin-stdlib:2.1.0 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 org.jetbrains.kotlinx:atomicfu:0.23.2 diff --git a/androidApp/dependencies/demoReleaseRuntimeClasspath.txt b/cmp-android/dependencies/demoReleaseRuntimeClasspath.txt similarity index 97% rename from androidApp/dependencies/demoReleaseRuntimeClasspath.txt rename to cmp-android/dependencies/demoReleaseRuntimeClasspath.txt index bb7db873c..f707f4150 100644 --- a/androidApp/dependencies/demoReleaseRuntimeClasspath.txt +++ b/cmp-android/dependencies/demoReleaseRuntimeClasspath.txt @@ -56,6 +56,11 @@ androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.1.0 +androidx.databinding:databinding-adapters:8.7.3 +androidx.databinding:databinding-common:8.7.3 +androidx.databinding:databinding-ktx:8.7.3 +androidx.databinding:databinding-runtime:8.7.3 +androidx.databinding:viewbinding:8.7.3 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 @@ -79,6 +84,7 @@ androidx.lifecycle:lifecycle-runtime-compose:2.8.7 androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.7 androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 androidx.lifecycle:lifecycle-runtime:2.8.7 +androidx.lifecycle:lifecycle-service:2.8.7 androidx.lifecycle:lifecycle-viewmodel-android:2.8.7 androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.7 androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 @@ -88,7 +94,6 @@ androidx.lifecycle:lifecycle-viewmodel:2.8.7 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 androidx.metrics:metrics-performance:1.0.0-beta01 -androidx.multidex:multidex:2.0.1 androidx.navigation:navigation-common-ktx:2.8.4 androidx.navigation:navigation-common:2.8.4 androidx.navigation:navigation-compose:2.8.4 @@ -151,7 +156,6 @@ com.google.android.gms:play-services-measurement-impl:22.1.2 com.google.android.gms:play-services-measurement-sdk-api:22.1.2 com.google.android.gms:play-services-measurement-sdk:22.1.2 com.google.android.gms:play-services-measurement:22.1.2 -com.google.android.gms:play-services-oss-licenses:17.1.0 com.google.android.gms:play-services-stats:17.0.2 com.google.android.gms:play-services-tasks:18.2.0 com.google.code.findbugs:jsr305:3.0.2 @@ -289,15 +293,14 @@ org.jetbrains.compose.runtime:runtime:1.7.3 org.jetbrains.compose.ui:ui-geometry:1.7.0-rc01 org.jetbrains.compose.ui:ui-graphics:1.7.0-rc01 org.jetbrains.compose.ui:ui-text:1.7.0-rc01 -org.jetbrains.compose.ui:ui-tooling-preview:1.7.0-rc01 org.jetbrains.compose.ui:ui-unit:1.7.0-rc01 org.jetbrains.compose.ui:ui-util:1.7.0-rc01 org.jetbrains.compose.ui:ui:1.7.0-rc01 org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-reflect:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20 org.jetbrains.kotlin:kotlin-stdlib:2.1.0 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 org.jetbrains.kotlinx:atomicfu:0.23.2 diff --git a/androidApp/dependencies/prodDebugRuntimeClasspath.txt b/cmp-android/dependencies/prodDebugRuntimeClasspath.txt similarity index 97% rename from androidApp/dependencies/prodDebugRuntimeClasspath.txt rename to cmp-android/dependencies/prodDebugRuntimeClasspath.txt index e336f2ce5..40235e143 100644 --- a/androidApp/dependencies/prodDebugRuntimeClasspath.txt +++ b/cmp-android/dependencies/prodDebugRuntimeClasspath.txt @@ -60,6 +60,11 @@ androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.1.0 +androidx.databinding:databinding-adapters:8.7.3 +androidx.databinding:databinding-common:8.7.3 +androidx.databinding:databinding-ktx:8.7.3 +androidx.databinding:databinding-runtime:8.7.3 +androidx.databinding:viewbinding:8.7.3 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 @@ -83,6 +88,7 @@ androidx.lifecycle:lifecycle-runtime-compose:2.8.7 androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.7 androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 androidx.lifecycle:lifecycle-runtime:2.8.7 +androidx.lifecycle:lifecycle-service:2.8.7 androidx.lifecycle:lifecycle-viewmodel-android:2.8.7 androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.7 androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 @@ -92,7 +98,6 @@ androidx.lifecycle:lifecycle-viewmodel:2.8.7 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 androidx.metrics:metrics-performance:1.0.0-beta01 -androidx.multidex:multidex:2.0.1 androidx.navigation:navigation-common-ktx:2.8.4 androidx.navigation:navigation-common:2.8.4 androidx.navigation:navigation-compose:2.8.4 @@ -155,7 +160,6 @@ com.google.android.gms:play-services-measurement-impl:22.1.2 com.google.android.gms:play-services-measurement-sdk-api:22.1.2 com.google.android.gms:play-services-measurement-sdk:22.1.2 com.google.android.gms:play-services-measurement:22.1.2 -com.google.android.gms:play-services-oss-licenses:17.1.0 com.google.android.gms:play-services-stats:17.0.2 com.google.android.gms:play-services-tasks:18.2.0 com.google.code.findbugs:jsr305:3.0.2 @@ -293,15 +297,14 @@ org.jetbrains.compose.runtime:runtime:1.7.3 org.jetbrains.compose.ui:ui-geometry:1.7.0-rc01 org.jetbrains.compose.ui:ui-graphics:1.7.0-rc01 org.jetbrains.compose.ui:ui-text:1.7.0-rc01 -org.jetbrains.compose.ui:ui-tooling-preview:1.7.0-rc01 org.jetbrains.compose.ui:ui-unit:1.7.0-rc01 org.jetbrains.compose.ui:ui-util:1.7.0-rc01 org.jetbrains.compose.ui:ui:1.7.0-rc01 org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-reflect:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20 org.jetbrains.kotlin:kotlin-stdlib:2.1.0 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 org.jetbrains.kotlinx:atomicfu:0.23.2 diff --git a/cmp-android/dependencies/prodReleaseRuntimeClasspath.tree.txt b/cmp-android/dependencies/prodReleaseRuntimeClasspath.tree.txt new file mode 100644 index 000000000..e9db331ed --- /dev/null +++ b/cmp-android/dependencies/prodReleaseRuntimeClasspath.tree.txt @@ -0,0 +1,1542 @@ ++--- androidx.databinding:databinding-common:8.7.3 ++--- androidx.databinding:databinding-runtime:8.7.3 +| +--- androidx.collection:collection:1.0.0 -> 1.4.4 +| | \--- androidx.collection:collection-jvm:1.4.4 +| | +--- androidx.annotation:annotation:1.8.1 -> 1.9.1 +| | | \--- androidx.annotation:annotation-jvm:1.9.1 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 +| | | +--- org.jetbrains:annotations:13.0 -> 23.0.0 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 -> 1.9.20 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0 -> 1.9.20 (c) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | +--- androidx.collection:collection-ktx:1.4.4 (c) +| | \--- androidx.collection:collection-ktx:1.3.0 -> 1.4.4 (c) +| +--- androidx.databinding:databinding-common:8.7.3 +| +--- androidx.databinding:viewbinding:8.7.3 +| | \--- androidx.annotation:annotation:1.0.0 -> 1.9.1 (*) +| \--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.7 +| \--- androidx.lifecycle:lifecycle-runtime-android:2.8.7 +| +--- androidx.annotation:annotation:1.8.0 -> 1.9.1 (*) +| +--- androidx.arch.core:core-common:2.2.0 +| | \--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| +--- androidx.arch.core:core-runtime:2.2.0 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | \--- androidx.arch.core:core-common:2.2.0 (*) +| +--- androidx.lifecycle:lifecycle-common:2.8.7 +| | \--- androidx.lifecycle:lifecycle-common-jvm:2.8.7 +| | +--- androidx.annotation:annotation:1.8.1 -> 1.9.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.10.1 +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.1 +| | | +--- org.jetbrains:annotations:23.0.0 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1 (c) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.1 (c) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 (c) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.10.1 (c) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c) +| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c) +| +--- androidx.profileinstaller:profileinstaller:1.3.1 -> 1.4.1 +| | +--- androidx.annotation:annotation:1.8.1 -> 1.9.1 (*) +| | +--- androidx.concurrent:concurrent-futures:1.1.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | \--- com.google.guava:listenablefuture:1.0 +| | +--- androidx.startup:startup-runtime:1.1.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | \--- androidx.tracing:tracing:1.0.0 -> 1.3.0-alpha02 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*) +| | | \--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (c) +| | \--- com.google.guava:listenablefuture:1.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.10.1 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| +--- androidx.lifecycle:lifecycle-common:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-process:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-service:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c) +| \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c) ++--- androidx.databinding:databinding-adapters:8.7.3 +| +--- androidx.databinding:databinding-runtime:8.7.3 (*) +| \--- androidx.databinding:databinding-common:8.7.3 ++--- androidx.databinding:databinding-ktx:8.7.3 +| +--- androidx.databinding:databinding-runtime:8.7.3 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.20 -> 2.1.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.20 -> 2.1.0 (*) +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1 -> 1.10.1 (*) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 -> 2.8.7 +| | \--- androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.7 +| | +--- androidx.annotation:annotation:1.8.0 -> 1.9.1 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.10.1 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c) +| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-livedata:2.6.1 -> 2.8.7 +| | +--- androidx.arch.core:core-common:2.2.0 (*) +| | +--- androidx.arch.core:core-runtime:2.2.0 (*) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 +| | | +--- androidx.arch.core:core-common:2.2.0 (*) +| | | +--- androidx.arch.core:core-runtime:2.2.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.7 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-service:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c) +| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-service:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c) +| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.10.1 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c) +| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-process:2.6.1 -> 2.8.7 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (*) +| | +--- androidx.startup:startup-runtime:1.1.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-service:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c) +| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-service:2.6.1 -> 2.8.7 +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c) +| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c) +| \--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.7 +| \--- androidx.lifecycle:lifecycle-viewmodel-android:2.8.7 +| +--- androidx.annotation:annotation:1.8.0 -> 1.9.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.10.1 (*) +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.10.1 (*) +| +--- androidx.lifecycle:lifecycle-common:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-process:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-service:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c) +| \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c) ++--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) ++--- androidx.compose:compose-bom:2024.12.01 +| +--- androidx.compose.runtime:runtime:1.7.6 (c) +| +--- androidx.compose.ui:ui-tooling-preview:1.7.6 (c) +| +--- androidx.compose.runtime:runtime-saveable:1.7.6 (c) +| +--- androidx.compose.ui:ui:1.7.6 (c) +| +--- androidx.compose.runtime:runtime-android:1.7.6 (c) +| +--- androidx.compose.ui:ui-tooling-preview-android:1.7.6 (c) +| +--- androidx.compose.material3:material3:1.3.1 (c) +| +--- androidx.compose.runtime:runtime-saveable-android:1.7.6 (c) +| +--- androidx.compose.ui:ui-android:1.7.6 (c) +| +--- androidx.compose.foundation:foundation:1.7.6 (c) +| +--- androidx.compose.material:material-icons-extended:1.7.6 (c) +| +--- androidx.compose.ui:ui-util:1.7.6 (c) +| +--- androidx.compose.animation:animation-core:1.7.6 (c) +| +--- androidx.compose.foundation:foundation-layout:1.7.6 (c) +| +--- androidx.compose.material:material-icons-core:1.7.6 (c) +| +--- androidx.compose.material:material-ripple:1.7.6 (c) +| +--- androidx.compose.ui:ui-graphics:1.7.6 (c) +| +--- androidx.compose.ui:ui-text:1.7.6 (c) +| +--- androidx.compose.material3:material3-android:1.3.1 (c) +| +--- androidx.compose.ui:ui-geometry:1.7.6 (c) +| +--- androidx.compose.ui:ui-unit:1.7.6 (c) +| +--- androidx.compose.animation:animation:1.7.6 (c) +| +--- androidx.compose.foundation:foundation-android:1.7.6 (c) +| +--- androidx.compose.material:material-icons-extended-android:1.7.6 (c) +| +--- androidx.compose.ui:ui-util-android:1.7.6 (c) +| +--- androidx.compose.animation:animation-core-android:1.7.6 (c) +| +--- androidx.compose.foundation:foundation-layout-android:1.7.6 (c) +| +--- androidx.compose.material:material-icons-core-android:1.7.6 (c) +| +--- androidx.compose.material:material-ripple-android:1.7.6 (c) +| +--- androidx.compose.ui:ui-graphics-android:1.7.6 (c) +| +--- androidx.compose.ui:ui-text-android:1.7.6 (c) +| +--- androidx.compose.ui:ui-geometry-android:1.7.6 (c) +| +--- androidx.compose.ui:ui-unit-android:1.7.6 (c) +| \--- androidx.compose.animation:animation-android:1.7.6 (c) ++--- androidx.compose.ui:ui-tooling-preview -> 1.7.6 +| \--- androidx.compose.ui:ui-tooling-preview-android:1.7.6 +| +--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*) +| +--- androidx.compose.runtime:runtime:1.7.6 +| | \--- androidx.compose.runtime:runtime-android:1.7.6 +| | +--- androidx.annotation:annotation-experimental:1.4.1 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 2.1.0 (*) +| | +--- androidx.collection:collection:1.4.4 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.10.1 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.10.1 (*) +| | \--- androidx.compose.runtime:runtime-saveable:1.7.6 (c) +| +--- androidx.compose.ui:ui:1.7.6 (c) +| +--- androidx.compose.ui:ui-geometry:1.7.6 (c) +| +--- androidx.compose.ui:ui-graphics:1.7.6 (c) +| +--- androidx.compose.ui:ui-text:1.7.6 (c) +| +--- androidx.compose.ui:ui-unit:1.7.6 (c) +| \--- androidx.compose.ui:ui-util:1.7.6 (c) ++--- project :cmp-shared +| +--- io.insert-koin:koin-bom:4.0.1-RC1 +| | +--- io.insert-koin:koin-core:4.0.1-RC1 (c) +| | +--- io.insert-koin:koin-core-viewmodel:4.0.1-RC1 (c) +| | +--- io.insert-koin:koin-android:4.0.1-RC1 (c) +| | +--- io.insert-koin:koin-androidx-navigation:4.0.1-RC1 (c) +| | +--- io.insert-koin:koin-compose:4.0.1-RC1 (c) +| | +--- io.insert-koin:koin-compose-viewmodel:4.0.1-RC1 (c) +| | \--- io.insert-koin:koin-androidx-compose:4.0.1-RC1 (c) +| +--- io.insert-koin:koin-android:4.0.1-RC1 +| | +--- io.insert-koin:koin-core:4.0.1-RC1 +| | | \--- io.insert-koin:koin-core-jvm:4.0.1-RC1 +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | +--- co.touchlab:stately-concurrency:2.1.0 +| | | | \--- co.touchlab:stately-concurrency-jvm:2.1.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.1.0 (*) +| | | | \--- co.touchlab:stately-strict:2.1.0 +| | | | \--- co.touchlab:stately-strict-jvm:2.1.0 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.1.0 (*) +| | | \--- co.touchlab:stately-concurrent-collections:2.1.0 +| | | \--- co.touchlab:stately-concurrent-collections-jvm:2.1.0 +| | | +--- co.touchlab:stately-concurrency:2.1.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.1.0 (*) +| | +--- io.insert-koin:koin-core-viewmodel:4.0.1-RC1 +| | | \--- io.insert-koin:koin-core-viewmodel-jvm:4.0.1-RC1 +| | | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.3 +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.5 -> 2.8.7 (*) +| | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.6.11 -> 1.7.3 +| | | | | +--- androidx.annotation:annotation:1.8.0 -> 1.9.1 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.10.1 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.3 +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.5 -> 2.8.7 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.9.1 (*) +| | | | | +--- androidx.core:core-ktx:1.2.0 -> 1.15.0 +| | | | | | +--- androidx.annotation:annotation:1.8.1 -> 1.9.1 (*) +| | | | | | +--- androidx.core:core:1.15.0 +| | | | | | | +--- androidx.annotation:annotation:1.8.1 -> 1.9.1 (*) +| | | | | | | +--- androidx.annotation:annotation-experimental:1.4.1 (*) +| | | | | | | +--- androidx.collection:collection:1.4.2 -> 1.4.4 (*) +| | | | | | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*) +| | | | | | | +--- androidx.interpolator:interpolator:1.0.0 +| | | | | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.9.1 (*) +| | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.2 -> 2.8.7 (*) +| | | | | | | +--- androidx.tracing:tracing:1.2.0 -> 1.3.0-alpha02 (*) +| | | | | | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | | | | \--- androidx.collection:collection:1.0.0 -> 1.4.4 (*) +| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | | | \--- androidx.core:core-ktx:1.15.0 (c) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | | \--- androidx.core:core:1.15.0 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (*) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (*) +| | | | | +--- androidx.savedstate:savedstate:1.2.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 -> 2.8.7 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 2.1.0 (*) +| | | | | | \--- androidx.savedstate:savedstate-ktx:1.2.1 (c) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.10.1 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-service:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 (c) +| | | | | \--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c) +| | | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 +| | | | | \--- org.jetbrains.androidx.core:core-bundle-android:1.0.1 +| | | | | +--- androidx.core:core-ktx:1.2.0 -> 1.15.0 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 (*) +| | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.3 +| | | | | +--- androidx.lifecycle:lifecycle-common:2.8.5 -> 2.8.7 (*) +| | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.6.11 -> 1.7.3 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 (*) +| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.10.1 (*) +| | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.3 (*) +| | | | +--- org.jetbrains.androidx.savedstate:savedstate:1.2.2 +| | | | | +--- androidx.arch.core:core-common:2.2.0 (*) +| | | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) +| | | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.2 -> 2.8.3 (*) +| | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.6.11 -> 1.7.3 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 (*) +| | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.6.11 -> 1.7.3 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 (*) +| | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) +| | | +--- org.jetbrains.androidx.savedstate:savedstate:1.2.2 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | +--- androidx.appcompat:appcompat:1.7.0 +| | | +--- androidx.activity:activity:1.7.0 -> 1.9.3 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.4.4 (*) +| | | | +--- androidx.core:core:1.13.0 -> 1.15.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.7 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.7 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 -> 2.8.7 (*) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.1 -> 1.4.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | +--- androidx.tracing:tracing:1.0.0 -> 1.3.0-alpha02 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | +--- androidx.activity:activity-compose:1.9.3 (c) +| | | | \--- androidx.activity:activity-ktx:1.9.3 (c) +| | | +--- androidx.annotation:annotation:1.3.0 -> 1.9.1 (*) +| | | +--- androidx.appcompat:appcompat-resources:1.7.0 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.4.4 (*) +| | | | +--- androidx.core:core:1.6.0 -> 1.15.0 (*) +| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | +--- androidx.core:core:1.1.0 -> 1.15.0 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.4.4 (*) +| | | | +--- androidx.vectordrawable:vectordrawable-animated:1.1.0 +| | | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| | | | | +--- androidx.interpolator:interpolator:1.0.0 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.4.4 (*) +| | | | \--- androidx.appcompat:appcompat:1.7.0 (c) +| | | +--- androidx.collection:collection:1.0.0 -> 1.4.4 (*) +| | | +--- androidx.core:core:1.13.0 -> 1.15.0 (*) +| | | +--- androidx.core:core-ktx:1.13.0 -> 1.15.0 (*) +| | | +--- androidx.cursoradapter:cursoradapter:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.9.1 (*) +| | | +--- androidx.drawerlayout:drawerlayout:1.0.0 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.9.1 (*) +| | | | +--- androidx.core:core:1.0.0 -> 1.15.0 (*) +| | | | \--- androidx.customview:customview:1.0.0 -> 1.1.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | +--- androidx.core:core:1.3.0 -> 1.15.0 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.4.4 (*) +| | | +--- androidx.emoji2:emoji2:1.3.0 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.4.4 (*) +| | | | +--- androidx.core:core:1.3.0 -> 1.15.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-process:2.4.1 -> 2.8.7 (*) +| | | | +--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) +| | | | \--- androidx.emoji2:emoji2-views-helper:1.3.0 (c) +| | | +--- androidx.emoji2:emoji2-views-helper:1.2.0 -> 1.3.0 +| | | | +--- androidx.collection:collection:1.1.0 -> 1.4.4 (*) +| | | | +--- androidx.core:core:1.3.0 -> 1.15.0 (*) +| | | | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | | | \--- androidx.emoji2:emoji2:1.3.0 (c) +| | | +--- androidx.fragment:fragment:1.5.4 -> 1.8.5 +| | | | +--- androidx.activity:activity:1.8.1 -> 1.9.3 (*) +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.4.4 (*) +| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.15.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 -> 2.8.7 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.7 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.7 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 -> 2.8.7 (*) +| | | | +--- androidx.loader:loader:1.0.0 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.9.1 (*) +| | | | | +--- androidx.core:core:1.0.0 -> 1.15.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.0.0 -> 2.8.7 (*) +| | | | | \--- androidx.lifecycle:lifecycle-viewmodel:2.0.0 -> 2.8.7 (*) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.1 -> 1.4.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | +--- androidx.viewpager:viewpager:1.0.0 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.9.1 (*) +| | | | | +--- androidx.core:core:1.0.0 -> 1.15.0 (*) +| | | | | \--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | \--- androidx.fragment:fragment-ktx:1.8.5 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.7 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.7 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.1 -> 1.4.1 (*) +| | | +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 +| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | \--- androidx.appcompat:appcompat-resources:1.7.0 (c) +| | +--- androidx.activity:activity-ktx:1.9.3 +| | | +--- androidx.activity:activity:1.9.3 (*) +| | | +--- androidx.core:core-ktx:1.13.0 -> 1.15.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 -> 2.8.7 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 -> 2.8.7 +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.10.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.8.7 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.8.7 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c) +| | | | +--- androidx.lifecycle:lifecycle-service:2.8.7 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c) +| | | | \--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 +| | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 2.1.0 (*) +| | | | \--- androidx.savedstate:savedstate:1.2.1 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | +--- androidx.activity:activity:1.9.3 (c) +| | | \--- androidx.activity:activity-compose:1.9.3 (c) +| | +--- androidx.fragment:fragment-ktx:1.8.5 +| | | +--- androidx.activity:activity-ktx:1.8.1 -> 1.9.3 (*) +| | | +--- androidx.collection:collection-ktx:1.1.0 -> 1.4.4 +| | | | +--- androidx.collection:collection:1.4.4 (*) +| | | | \--- androidx.collection:collection:1.4.4 (c) +| | | +--- androidx.core:core-ktx:1.2.0 -> 1.15.0 (*) +| | | +--- androidx.fragment:fragment:1.8.5 (*) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 -> 2.8.7 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 -> 2.8.7 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | \--- androidx.fragment:fragment:1.8.5 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.7 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-service:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c) +| | | \--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| +--- io.insert-koin:koin-androidx-compose:4.0.1-RC1 +| | +--- io.insert-koin:koin-android:4.0.1-RC1 (*) +| | +--- io.insert-koin:koin-compose:4.0.1-RC1 +| | | \--- io.insert-koin:koin-compose-jvm:4.0.1-RC1 +| | | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | | +--- org.jetbrains.compose.runtime:runtime:1.6.11 -> 1.7.3 +| | | | +--- androidx.compose.runtime:runtime:1.7.6 (*) +| | | | +--- org.jetbrains.compose.collection-internal:collection:1.7.3 +| | | | | +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*) +| | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.7.3 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 (*) +| | | | | \--- org.jetbrains.kotlinx:atomicfu:0.23.2 +| | | | | \--- org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:{prefer 1.9.21} -> 2.1.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.24 -> 2.1.0 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | | | +--- org.jetbrains.kotlinx:atomicfu:0.23.2 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.10.1 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.8 -> 1.7.6 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 +| | | \--- androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.7 +| | | +--- androidx.annotation:annotation:1.8.0 -> 1.9.1 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0 -> 1.7.6 (*) +| | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.6 +| | | | \--- androidx.compose.ui:ui-android:1.7.6 +| | | | +--- androidx.activity:activity-ktx:1.7.0 -> 1.9.3 (*) +| | | | +--- androidx.annotation:annotation:1.8.0 -> 1.9.1 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | +--- androidx.autofill:autofill:1.0.0 +| | | | | \--- androidx.core:core:1.1.0 -> 1.15.0 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.4.4 (*) +| | | | +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*) +| | | | +--- androidx.compose.runtime:runtime:1.7.6 (*) +| | | | +--- androidx.compose.runtime:runtime-saveable:1.7.6 +| | | | | \--- androidx.compose.runtime:runtime-saveable-android:1.7.6 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*) +| | | | | +--- androidx.compose.runtime:runtime:1.7.6 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | \--- androidx.compose.runtime:runtime:1.7.6 (c) +| | | | +--- androidx.compose.ui:ui-geometry:1.7.6 +| | | | | \--- androidx.compose.ui:ui-geometry-android:1.7.6 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | +--- androidx.compose.runtime:runtime:1.7.6 (*) +| | | | | +--- androidx.compose.ui:ui-util:1.7.6 +| | | | | | \--- androidx.compose.ui:ui-util-android:1.7.6 +| | | | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | | +--- androidx.compose.ui:ui:1.7.6 (c) +| | | | | | +--- androidx.compose.ui:ui-geometry:1.7.6 (c) +| | | | | | +--- androidx.compose.ui:ui-graphics:1.7.6 (c) +| | | | | | +--- androidx.compose.ui:ui-text:1.7.6 (c) +| | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.6 (c) +| | | | | | \--- androidx.compose.ui:ui-unit:1.7.6 (c) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | +--- androidx.compose.ui:ui:1.7.6 (c) +| | | | | +--- androidx.compose.ui:ui-graphics:1.7.6 (c) +| | | | | +--- androidx.compose.ui:ui-text:1.7.6 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.6 (c) +| | | | | +--- androidx.compose.ui:ui-unit:1.7.6 (c) +| | | | | \--- androidx.compose.ui:ui-util:1.7.6 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.7.6 +| | | | | \--- androidx.compose.ui:ui-graphics-android:1.7.6 +| | | | | +--- androidx.annotation:annotation:1.7.0 -> 1.9.1 (*) +| | | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | | +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*) +| | | | | +--- androidx.compose.runtime:runtime:1.7.6 (*) +| | | | | +--- androidx.compose.ui:ui-unit:1.7.6 +| | | | | | \--- androidx.compose.ui:ui-unit-android:1.7.6 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | | +--- androidx.annotation:annotation:1.8.0 -> 1.9.1 (*) +| | | | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | | | +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*) +| | | | | | +--- androidx.collection:collection-ktx:1.2.0 -> 1.4.4 (*) +| | | | | | +--- androidx.compose.runtime:runtime:1.7.6 (*) +| | | | | | +--- androidx.compose.ui:ui-geometry:1.7.6 (*) +| | | | | | +--- androidx.compose.ui:ui-util:1.7.6 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | | +--- androidx.compose.ui:ui:1.7.6 (c) +| | | | | | +--- androidx.compose.ui:ui-geometry:1.7.6 (c) +| | | | | | +--- androidx.compose.ui:ui-graphics:1.7.6 (c) +| | | | | | +--- androidx.compose.ui:ui-text:1.7.6 (c) +| | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.6 (c) +| | | | | | \--- androidx.compose.ui:ui-util:1.7.6 (c) +| | | | | +--- androidx.compose.ui:ui-util:1.7.6 (*) +| | | | | +--- androidx.core:core:1.12.0 -> 1.15.0 (*) +| | | | | +--- androidx.graphics:graphics-path:1.0.1 +| | | | | | +--- androidx.core:core:1.12.0 -> 1.15.0 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | +--- androidx.compose.ui:ui:1.7.6 (c) +| | | | | +--- androidx.compose.ui:ui-geometry:1.7.6 (c) +| | | | | +--- androidx.compose.ui:ui-text:1.7.6 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.6 (c) +| | | | | +--- androidx.compose.ui:ui-unit:1.7.6 (c) +| | | | | \--- androidx.compose.ui:ui-util:1.7.6 (c) +| | | | +--- androidx.compose.ui:ui-text:1.7.6 +| | | | | \--- androidx.compose.ui:ui-text-android:1.7.6 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | | +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*) +| | | | | +--- androidx.compose.runtime:runtime:1.7.6 (*) +| | | | | +--- androidx.compose.runtime:runtime-saveable:1.7.6 (*) +| | | | | +--- androidx.compose.ui:ui-graphics:1.7.6 (*) +| | | | | +--- androidx.compose.ui:ui-unit:1.7.6 (*) +| | | | | +--- androidx.compose.ui:ui-util:1.7.6 (*) +| | | | | +--- androidx.core:core:1.7.0 -> 1.15.0 (*) +| | | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.10.1 (*) +| | | | | +--- androidx.compose.ui:ui:1.7.6 (c) +| | | | | +--- androidx.compose.ui:ui-geometry:1.7.6 (c) +| | | | | +--- androidx.compose.ui:ui-graphics:1.7.6 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.6 (c) +| | | | | +--- androidx.compose.ui:ui-unit:1.7.6 (c) +| | | | | \--- androidx.compose.ui:ui-util:1.7.6 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.7.6 (*) +| | | | +--- androidx.compose.ui:ui-util:1.7.6 (*) +| | | | +--- androidx.core:core:1.12.0 -> 1.15.0 (*) +| | | | +--- androidx.customview:customview-poolingcontainer:1.0.0 +| | | | | +--- androidx.core:core-ktx:1.5.0 -> 1.15.0 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 2.1.0 (*) +| | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.3 -> 2.8.7 +| | | | | \--- androidx.lifecycle:lifecycle-runtime-compose-android:2.8.7 +| | | | | +--- androidx.annotation:annotation:1.8.1 -> 1.9.1 (*) +| | | | | +--- androidx.compose.runtime:runtime:1.7.1 -> 1.7.6 (*) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (*) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-service:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c) +| | | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.7 (*) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.1 -> 1.4.1 (*) +| | | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.10.1 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.10.1 (*) +| | | | +--- androidx.compose.ui:ui-geometry:1.7.6 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.7.6 (c) +| | | | +--- androidx.compose.ui:ui-text:1.7.6 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.7.6 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.7.6 (c) +| | | | +--- androidx.compose.ui:ui-util:1.7.6 (c) +| | | | \--- androidx.compose.foundation:foundation:1.7.6 (c) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.7 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-service:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.7 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 (c) +| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 (c) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| +--- io.insert-koin:koin-androidx-navigation:4.0.1-RC1 +| | +--- io.insert-koin:koin-android:4.0.1-RC1 (*) +| | +--- androidx.navigation:navigation-fragment-ktx:2.8.4 +| | | +--- androidx.navigation:navigation-fragment:2.8.4 +| | | | +--- androidx.fragment:fragment-ktx:1.6.2 -> 1.8.5 (*) +| | | | +--- androidx.navigation:navigation-runtime:2.8.4 +| | | | | +--- androidx.activity:activity-ktx:1.7.1 -> 1.9.3 (*) +| | | | | +--- androidx.annotation:annotation-experimental:1.4.1 (*) +| | | | | +--- androidx.collection:collection:1.4.2 -> 1.4.4 (*) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 -> 2.8.7 (*) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 -> 2.8.7 (*) +| | | | | +--- androidx.navigation:navigation-common:2.8.4 +| | | | | | +--- androidx.annotation:annotation:1.8.1 -> 1.9.1 (*) +| | | | | | +--- androidx.collection:collection-ktx:1.4.2 -> 1.4.4 (*) +| | | | | | +--- androidx.core:core-ktx:1.1.0 -> 1.15.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.2 -> 2.8.7 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.2 -> 2.8.7 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 -> 2.8.7 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2 -> 2.8.7 (*) +| | | | | | +--- androidx.profileinstaller:profileinstaller:1.3.1 -> 1.4.1 (*) +| | | | | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 -> 1.7.3 +| | | | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3 +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3 +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3 (c) +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 (c) +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 (c) +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 (c) +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-io:1.7.3 (c) +| | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-json-io-jvm:1.7.3 (c) +| | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 -> 2.1.0 (*) +| | | | | | +--- androidx.navigation:navigation-common-ktx:2.8.4 (c) +| | | | | | +--- androidx.navigation:navigation-compose:2.8.4 (c) +| | | | | | +--- androidx.navigation:navigation-fragment:2.8.4 (c) +| | | | | | +--- androidx.navigation:navigation-fragment-ktx:2.8.4 (c) +| | | | | | +--- androidx.navigation:navigation-runtime:2.8.4 (c) +| | | | | | \--- androidx.navigation:navigation-runtime-ktx:2.8.4 (c) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 -> 1.7.3 (*) +| | | | | +--- androidx.navigation:navigation-common:2.8.4 (c) +| | | | | +--- androidx.navigation:navigation-common-ktx:2.8.4 (c) +| | | | | +--- androidx.navigation:navigation-compose:2.8.4 (c) +| | | | | +--- androidx.navigation:navigation-fragment:2.8.4 (c) +| | | | | +--- androidx.navigation:navigation-fragment-ktx:2.8.4 (c) +| | | | | \--- androidx.navigation:navigation-runtime-ktx:2.8.4 (c) +| | | | +--- androidx.slidingpanelayout:slidingpanelayout:1.2.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | +--- androidx.customview:customview:1.1.0 (*) +| | | | | +--- androidx.core:core:1.1.0 -> 1.15.0 (*) +| | | | | +--- androidx.window:window:1.0.0 -> 1.2.0 +| | | | | | +--- androidx.annotation:annotation:1.3.0 -> 1.9.1 (*) +| | | | | | +--- androidx.collection:collection:1.1.0 -> 1.4.4 (*) +| | | | | | +--- androidx.core:core:1.8.0 -> 1.15.0 (*) +| | | | | | +--- androidx.window.extensions.core:core:1.0.0 +| | | | | | | +--- androidx.annotation:annotation:1.6.0 -> 1.9.1 (*) +| | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 2.1.0 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.10.1 (*) +| | | | | \--- androidx.transition:transition:1.4.1 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | +--- androidx.core:core:1.1.0 -> 1.15.0 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.4.4 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 -> 1.7.3 (*) +| | | | +--- androidx.navigation:navigation-common:2.8.4 (c) +| | | | +--- androidx.navigation:navigation-compose:2.8.4 (c) +| | | | +--- androidx.navigation:navigation-fragment-ktx:2.8.4 (c) +| | | | +--- androidx.navigation:navigation-runtime:2.8.4 (c) +| | | | +--- androidx.navigation:navigation-runtime-ktx:2.8.4 (c) +| | | | \--- androidx.navigation:navigation-common-ktx:2.8.4 (c) +| | | +--- androidx.navigation:navigation-runtime-ktx:2.8.4 +| | | | +--- androidx.navigation:navigation-common-ktx:2.8.4 +| | | | | +--- androidx.navigation:navigation-common:2.8.4 (*) +| | | | | +--- androidx.navigation:navigation-common:2.8.4 (c) +| | | | | +--- androidx.navigation:navigation-compose:2.8.4 (c) +| | | | | +--- androidx.navigation:navigation-fragment:2.8.4 (c) +| | | | | +--- androidx.navigation:navigation-fragment-ktx:2.8.4 (c) +| | | | | +--- androidx.navigation:navigation-runtime:2.8.4 (c) +| | | | | \--- androidx.navigation:navigation-runtime-ktx:2.8.4 (c) +| | | | +--- androidx.navigation:navigation-runtime:2.8.4 (*) +| | | | +--- androidx.navigation:navigation-common:2.8.4 (c) +| | | | +--- androidx.navigation:navigation-common-ktx:2.8.4 (c) +| | | | +--- androidx.navigation:navigation-compose:2.8.4 (c) +| | | | +--- androidx.navigation:navigation-fragment:2.8.4 (c) +| | | | +--- androidx.navigation:navigation-fragment-ktx:2.8.4 (c) +| | | | \--- androidx.navigation:navigation-runtime:2.8.4 (c) +| | | +--- androidx.navigation:navigation-compose:2.8.4 (c) +| | | +--- androidx.navigation:navigation-fragment:2.8.4 (c) +| | | +--- androidx.navigation:navigation-runtime-ktx:2.8.4 (c) +| | | +--- androidx.navigation:navigation-common:2.8.4 (c) +| | | +--- androidx.navigation:navigation-runtime:2.8.4 (c) +| | | \--- androidx.navigation:navigation-common-ktx:2.8.4 (c) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| +--- io.insert-koin:koin-core-viewmodel:4.0.1-RC1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| +--- io.insert-koin:koin-annotations:1.4.0-RC4 +| | \--- io.insert-koin:koin-annotations-jvm:1.4.0-RC4 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 (*) +| +--- project :core:ui +| | +--- androidx.metrics:metrics-performance:1.0.0-beta01 +| | | +--- androidx.collection:collection:1.1.0 -> 1.4.4 (*) +| | | +--- androidx.core:core:1.5.0 -> 1.15.0 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | +--- androidx.browser:browser:1.8.0 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*) +| | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | +--- androidx.collection:collection:1.1.0 -> 1.4.4 (*) +| | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.15.0 (*) +| | | +--- androidx.interpolator:interpolator:1.0.0 (*) +| | | \--- com.google.guava:listenablefuture:1.0 +| | +--- androidx.compose.runtime:runtime -> 1.7.6 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | +--- io.insert-koin:koin-bom:4.0.1-RC1 (*) +| | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | +--- io.insert-koin:koin-annotations:1.4.0-RC4 (*) +| | +--- project :core:analytics +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | | +--- io.insert-koin:koin-bom:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-annotations:1.4.0-RC4 (*) +| | | \--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | +--- project :core:designsystem +| | | +--- androidx.compose.ui:ui-tooling-preview -> 1.7.6 (*) +| | | +--- androidx.activity:activity-compose:1.9.3 +| | | | +--- androidx.activity:activity-ktx:1.9.3 (*) +| | | | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.7.6 (*) +| | | | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.7.6 (*) +| | | | +--- androidx.compose.ui:ui:1.0.1 -> 1.7.6 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.7 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | +--- androidx.activity:activity:1.9.3 (c) +| | | | \--- androidx.activity:activity-ktx:1.9.3 (c) +| | | +--- project :core:model +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | | | +--- io.insert-koin:koin-bom:4.0.1-RC1 (*) +| | | | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | | | +--- io.insert-koin:koin-annotations:1.4.0-RC4 (*) +| | | | +--- project :core:common +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1 (*) +| | | | | +--- co.touchlab:kermit:2.0.4 +| | | | | | \--- co.touchlab:kermit-android:2.0.4 +| | | | | | +--- co.touchlab:kermit-core:2.0.4 +| | | | | | | \--- co.touchlab:kermit-core-android:2.0.4 +| | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.1.0 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.1.0 (*) +| | | | | +--- com.squareup.okio:okio:3.9.1 +| | | | | | \--- com.squareup.okio:okio-jvm:3.9.1 +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.25 -> 2.1.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-datetime:0.6.1 +| | | | | | \--- org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.1 +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.1.0 (*) +| | | | | +--- io.insert-koin:koin-bom:4.0.1-RC1 (*) +| | | | | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | | | | +--- io.insert-koin:koin-annotations:1.4.0-RC4 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 +| | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 -> 2.1.0 (*) +| | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 (*) +| | | +--- com.arkivanov.essenty:back-handler:2.1.0 +| | | | \--- com.arkivanov.essenty:back-handler-android:2.1.0 +| | | | +--- androidx.activity:activity-ktx:1.8.1 -> 1.9.3 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.1.0 (*) +| | | | \--- com.arkivanov.essenty:utils-internal:2.1.0 +| | | | \--- com.arkivanov.essenty:utils-internal-android:2.1.0 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.1.0 (*) +| | | +--- dev.chrisbanes.material3:material3-window-size-class-multiplatform:0.5.0 +| | | | \--- dev.chrisbanes.material3:material3-window-size-class-multiplatform-android:0.5.0 +| | | | +--- androidx.window:window:1.2.0 (*) +| | | | +--- org.jetbrains.compose.ui:ui:1.6.0 -> 1.7.0-rc01 +| | | | | +--- androidx.compose.ui:ui:1.7.1 -> 1.7.6 (*) +| | | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.3-rc01 -> 2.8.3 (*) +| | | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.3-rc01 +| | | | | | +--- androidx.arch.core:core-common:2.2.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.5 -> 2.8.7 (*) +| | | | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.3-rc01 -> 2.8.3 (*) +| | | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.6.11 -> 1.7.3 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 (*) +| | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.10.1 (*) +| | | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.3-rc01 +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-compose:2.8.5 -> 2.8.7 (*) +| | | | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.3-rc01 -> 2.8.3 (*) +| | | | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.3-rc01 (*) +| | | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.6.11 -> 1.7.3 (*) +| | | | | | +--- org.jetbrains.compose.runtime:runtime:1.6.11 -> 1.7.3 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 (*) +| | | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.3-rc01 -> 2.8.3 (*) +| | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.7.0-rc01 -> 1.7.3 (*) +| | | | | +--- org.jetbrains.compose.collection-internal:collection:1.7.0-rc01 -> 1.7.3 (*) +| | | | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | | | +--- org.jetbrains.compose.runtime:runtime-saveable:1.7.0-rc01 +| | | | | | +--- androidx.compose.runtime:runtime-saveable:1.7.1 -> 1.7.6 (*) +| | | | | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.24 -> 2.1.0 (*) +| | | | | +--- org.jetbrains.compose.ui:ui-geometry:1.7.0-rc01 +| | | | | | +--- androidx.compose.ui:ui-geometry:1.7.1 -> 1.7.6 (*) +| | | | | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | \--- org.jetbrains.compose.ui:ui-util:1.7.0-rc01 +| | | | | | \--- androidx.compose.ui:ui-util:1.7.1 -> 1.7.6 (*) +| | | | | +--- org.jetbrains.compose.ui:ui-graphics:1.7.0-rc01 +| | | | | | +--- androidx.compose.ui:ui-graphics:1.7.1 -> 1.7.6 (*) +| | | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | +--- org.jetbrains.compose.collection-internal:collection:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | +--- org.jetbrains.compose.ui:ui-geometry:1.7.0-rc01 (*) +| | | | | | +--- org.jetbrains.compose.ui:ui-unit:1.7.0-rc01 +| | | | | | | +--- androidx.compose.ui:ui-unit:1.7.1 -> 1.7.6 (*) +| | | | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | | +--- org.jetbrains.compose.ui:ui-geometry:1.7.0-rc01 (*) +| | | | | | | \--- org.jetbrains.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | | | \--- org.jetbrains.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | | +--- org.jetbrains.compose.ui:ui-text:1.7.0-rc01 +| | | | | | +--- androidx.compose.ui:ui-text:1.7.1 -> 1.7.6 (*) +| | | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | +--- org.jetbrains.compose.runtime:runtime-saveable:1.7.0-rc01 (*) +| | | | | | +--- org.jetbrains.compose.ui:ui-geometry:1.7.0-rc01 (*) +| | | | | | +--- org.jetbrains.compose.ui:ui-graphics:1.7.0-rc01 (*) +| | | | | | +--- org.jetbrains.compose.ui:ui-unit:1.7.0-rc01 (*) +| | | | | | +--- org.jetbrains.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | | | +--- org.jetbrains.kotlinx:atomicfu:0.23.2 (*) +| | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.10.1 (*) +| | | | | +--- org.jetbrains.compose.ui:ui-unit:1.7.0-rc01 (*) +| | | | | +--- org.jetbrains.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.24 -> 2.1.0 (*) +| | | | | +--- org.jetbrains.kotlinx:atomicfu:0.23.2 (*) +| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.10.1 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.1.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | | +--- io.insert-koin:koin-bom:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-annotations:1.4.0-RC4 (*) +| | | +--- io.coil-kt.coil3:coil-compose-core:3.0.4 +| | | | \--- io.coil-kt.coil3:coil-compose-core-android:3.0.4 +| | | | +--- com.google.accompanist:accompanist-drawablepainter:0.36.0 +| | | | | +--- androidx.compose.ui:ui:1.7.0 -> 1.7.6 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.10.1 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.1.0 (*) +| | | | +--- io.coil-kt.coil3:coil-core:3.0.4 +| | | | | \--- io.coil-kt.coil3:coil-core-android:3.0.4 +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.7 (*) +| | | | | +--- androidx.annotation:annotation:1.9.1 (*) +| | | | | +--- androidx.appcompat:appcompat-resources:1.7.0 (*) +| | | | | +--- androidx.core:core-ktx:1.13.1 -> 1.15.0 (*) +| | | | | +--- androidx.exifinterface:exifinterface:1.3.7 +| | | | | | \--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*) +| | | | | +--- androidx.profileinstaller:profileinstaller:1.4.1 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 -> 1.10.1 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib -> 2.1.0 (*) +| | | | | +--- com.squareup.okio:okio:3.9.1 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (c) +| | | | +--- org.jetbrains.compose.foundation:foundation:1.6.11 -> 1.7.0-rc01 +| | | | | +--- androidx.compose.foundation:foundation:1.7.1 -> 1.7.6 +| | | | | | \--- androidx.compose.foundation:foundation-android:1.7.6 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | | | +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*) +| | | | | | +--- androidx.compose.animation:animation:1.7.6 +| | | | | | | \--- androidx.compose.animation:animation-android:1.7.6 +| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | | | | +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*) +| | | | | | | +--- androidx.compose.animation:animation-core:1.7.6 +| | | | | | | | \--- androidx.compose.animation:animation-core-android:1.7.6 +| | | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | | | | +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*) +| | | | | | | | +--- androidx.compose.runtime:runtime:1.7.6 (*) +| | | | | | | | +--- androidx.compose.ui:ui:1.7.6 (*) +| | | | | | | | +--- androidx.compose.ui:ui-graphics:1.7.6 (*) +| | | | | | | | +--- androidx.compose.ui:ui-unit:1.7.6 (*) +| | | | | | | | +--- androidx.compose.ui:ui-util:1.7.6 (*) +| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.10.1 (*) +| | | | | | | | \--- androidx.compose.animation:animation:1.7.6 (c) +| | | | | | | +--- androidx.compose.foundation:foundation-layout:1.7.6 +| | | | | | | | \--- androidx.compose.foundation:foundation-layout-android:1.7.6 +| | | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | | | | | +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*) +| | | | | | | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.7.6 (*) +| | | | | | | | +--- androidx.compose.runtime:runtime:1.7.6 (*) +| | | | | | | | +--- androidx.compose.ui:ui:1.7.6 (*) +| | | | | | | | +--- androidx.compose.ui:ui-unit:1.7.6 (*) +| | | | | | | | +--- androidx.compose.ui:ui-util:1.7.6 (*) +| | | | | | | | +--- androidx.core:core:1.7.0 -> 1.15.0 (*) +| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | | | | \--- androidx.compose.foundation:foundation:1.7.6 (c) +| | | | | | | +--- androidx.compose.runtime:runtime:1.7.6 (*) +| | | | | | | +--- androidx.compose.ui:ui:1.7.6 (*) +| | | | | | | +--- androidx.compose.ui:ui-geometry:1.7.6 (*) +| | | | | | | +--- androidx.compose.ui:ui-graphics:1.7.6 (*) +| | | | | | | +--- androidx.compose.ui:ui-util:1.7.6 (*) +| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | | | \--- androidx.compose.animation:animation-core:1.7.6 (c) +| | | | | | +--- androidx.compose.foundation:foundation-layout:1.7.6 (*) +| | | | | | +--- androidx.compose.runtime:runtime:1.7.6 (*) +| | | | | | +--- androidx.compose.ui:ui:1.7.6 (*) +| | | | | | +--- androidx.compose.ui:ui-text:1.7.6 (*) +| | | | | | +--- androidx.compose.ui:ui-util:1.7.6 (*) +| | | | | | +--- androidx.core:core:1.13.1 -> 1.15.0 (*) +| | | | | | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | | \--- androidx.compose.foundation:foundation-layout:1.7.6 (c) +| | | | | +--- org.jetbrains.compose.animation:animation:1.7.0-rc01 +| | | | | | +--- androidx.compose.animation:animation:1.7.1 -> 1.7.6 (*) +| | | | | | +--- org.jetbrains.compose.animation:animation-core:1.7.0-rc01 +| | | | | | | +--- androidx.compose.animation:animation-core:1.7.1 -> 1.7.6 (*) +| | | | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | | +--- org.jetbrains.compose.collection-internal:collection:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | | +--- org.jetbrains.compose.ui:ui:1.7.0-rc01 (*) +| | | | | | | +--- org.jetbrains.compose.ui:ui-unit:1.7.0-rc01 (*) +| | | | | | | +--- org.jetbrains.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.10.1 (*) +| | | | | | +--- org.jetbrains.compose.collection-internal:collection:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | +--- org.jetbrains.compose.foundation:foundation-layout:1.7.0-rc01 +| | | | | | | +--- androidx.compose.foundation:foundation-layout:1.7.1 -> 1.7.6 (*) +| | | | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | | +--- org.jetbrains.compose.collection-internal:collection:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | | +--- org.jetbrains.compose.ui:ui:1.7.0-rc01 (*) +| | | | | | | \--- org.jetbrains.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | | | | +--- org.jetbrains.compose.ui:ui:1.7.0-rc01 (*) +| | | | | | +--- org.jetbrains.compose.ui:ui-geometry:1.7.0-rc01 (*) +| | | | | | \--- org.jetbrains.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.7.0-rc01 -> 1.7.3 (*) +| | | | | +--- org.jetbrains.compose.collection-internal:collection:1.7.0-rc01 -> 1.7.3 (*) +| | | | | +--- org.jetbrains.compose.foundation:foundation-layout:1.7.0-rc01 (*) +| | | | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | | | +--- org.jetbrains.compose.ui:ui:1.7.0-rc01 (*) +| | | | | +--- org.jetbrains.compose.ui:ui-text:1.7.0-rc01 (*) +| | | | | \--- org.jetbrains.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | +--- org.jetbrains.compose.foundation:foundation:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.material3:material3:1.7.0-rc01 +| | | | +--- androidx.compose.material3:material3:1.3.0 -> 1.3.1 +| | | | | \--- androidx.compose.material3:material3-android:1.3.1 +| | | | | +--- androidx.activity:activity-compose:1.8.2 -> 1.9.3 (*) +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.9.1 (*) +| | | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*) +| | | | | +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*) +| | | | | +--- androidx.compose.animation:animation-core:1.6.0 -> 1.7.6 (*) +| | | | | +--- androidx.compose.foundation:foundation:1.7.0 -> 1.7.6 (*) +| | | | | +--- androidx.compose.foundation:foundation-layout:1.7.0 -> 1.7.6 (*) +| | | | | +--- androidx.compose.material:material-icons-core:1.6.0 -> 1.7.6 +| | | | | | \--- androidx.compose.material:material-icons-core-android:1.7.6 +| | | | | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.6 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | +--- androidx.compose.material:material-ripple:1.7.0 -> 1.7.6 +| | | | | | \--- androidx.compose.material:material-ripple-android:1.7.6 +| | | | | | +--- androidx.collection:collection:1.4.0 -> 1.4.4 (*) +| | | | | | +--- androidx.compose.animation:animation:1.7.6 (*) +| | | | | | +--- androidx.compose.foundation:foundation:1.7.6 (*) +| | | | | | +--- androidx.compose.runtime:runtime:1.7.6 (*) +| | | | | | +--- androidx.compose.ui:ui-util:1.7.6 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | | +--- androidx.compose.runtime:runtime:1.7.0 -> 1.7.6 (*) +| | | | | +--- androidx.compose.ui:ui:1.6.0 -> 1.7.6 (*) +| | | | | +--- androidx.compose.ui:ui-text:1.6.0 -> 1.7.6 (*) +| | | | | +--- androidx.compose.ui:ui-util:1.6.0 -> 1.7.6 (*) +| | | | | \--- androidx.lifecycle:lifecycle-common-java8:2.6.1 -> 2.8.7 (*) +| | | | +--- org.jetbrains.compose.animation:animation-core:1.7.0-rc01 (*) +| | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.7.0-rc01 -> 1.7.3 (*) +| | | | +--- org.jetbrains.compose.collection-internal:collection:1.7.0-rc01 -> 1.7.3 (*) +| | | | +--- org.jetbrains.compose.foundation:foundation:1.7.0-rc01 (*) +| | | | +--- org.jetbrains.compose.foundation:foundation-layout:1.7.0-rc01 (*) +| | | | +--- org.jetbrains.compose.material:material-icons-core:1.7.0-rc01 +| | | | | +--- androidx.compose.material:material-icons-core:1.7.1 -> 1.7.6 (*) +| | | | | +--- org.jetbrains.compose.ui:ui:1.7.0-rc01 (*) +| | | | | +--- org.jetbrains.compose.ui:ui-graphics:1.7.0-rc01 (*) +| | | | | \--- org.jetbrains.compose.ui:ui-unit:1.7.0-rc01 (*) +| | | | +--- org.jetbrains.compose.material:material-ripple:1.7.0-rc01 +| | | | | +--- androidx.compose.material:material-ripple:1.7.1 -> 1.7.6 (*) +| | | | | +--- org.jetbrains.compose.animation:animation:1.7.0-rc01 (*) +| | | | | +--- org.jetbrains.compose.collection-internal:collection:1.7.0-rc01 -> 1.7.3 (*) +| | | | | +--- org.jetbrains.compose.foundation:foundation:1.7.0-rc01 (*) +| | | | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | | | \--- org.jetbrains.compose.ui:ui-util:1.7.0-rc01 (*) +| | | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | | +--- org.jetbrains.compose.ui:ui-graphics:1.7.0-rc01 (*) +| | | | +--- org.jetbrains.compose.ui:ui-text:1.7.0-rc01 (*) +| | | | \--- org.jetbrains.compose.ui:ui-util:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.material:material-icons-extended:1.7.0-rc01 +| | | | +--- androidx.compose.material:material-icons-extended:1.7.1 -> 1.7.6 +| | | | | \--- androidx.compose.material:material-icons-extended-android:1.7.6 +| | | | | \--- androidx.compose.material:material-icons-core:1.7.6 (*) +| | | | +--- org.jetbrains.compose.material:material-icons-core:1.7.0-rc01 (*) +| | | | +--- org.jetbrains.compose.ui:ui:1.7.0-rc01 (*) +| | | | \--- org.jetbrains.compose.ui:ui-graphics:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.ui:ui:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.ui:ui-util:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.components:components-resources:1.7.0-rc01 +| | | | \--- org.jetbrains.compose.components:components-resources-android:1.7.0-rc01 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.1.0 (*) +| | | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-rc01 -> 1.7.3 (*) +| | | | +--- org.jetbrains.compose.foundation:foundation:1.7.0-rc01 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.10.1 (*) +| | | \--- org.jetbrains.compose.components:components-ui-tooling-preview:1.7.0-rc01 +| | | \--- org.jetbrains.compose.components:components-ui-tooling-preview-android:1.7.0-rc01 +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.1.0 (*) +| | +--- project :core:model (*) +| | +--- project :core:common (*) +| | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.3 +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.5 -> 2.8.7 (*) +| | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.3 (*) +| | | +--- org.jetbrains.androidx.savedstate:savedstate:1.2.2 (*) +| | | +--- org.jetbrains.compose.runtime:runtime:1.6.11 -> 1.7.3 (*) +| | | +--- org.jetbrains.compose.runtime:runtime-saveable:1.6.11 -> 1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.ui:ui:1.6.11 -> 1.7.0-rc01 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 (*) +| | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.3 (*) +| | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.3 (*) +| | +--- io.coil-kt.coil3:coil:3.0.4 +| | | \--- io.coil-kt.coil3:coil-android:3.0.4 +| | | +--- io.coil-kt.coil3:coil-core:3.0.4 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | +--- io.coil-kt.coil3:coil-compose-core:3.0.4 (*) +| | +--- org.jetbrains.compose.material3:material3:1.7.0-rc01 (*) +| | +--- org.jetbrains.compose.components:components-resources:1.7.0-rc01 (*) +| | +--- org.jetbrains.compose.components:components-ui-tooling-preview:1.7.0-rc01 (*) +| | +--- org.jetbrains.androidx.navigation:navigation-compose:2.8.0-alpha10 +| | | +--- androidx.activity:activity-compose:1.8.0 -> 1.9.3 (*) +| | | +--- androidx.navigation:navigation-compose:2.8.0-rc01 -> 2.8.4 +| | | | +--- androidx.activity:activity-compose:1.8.0 -> 1.9.3 (*) +| | | | +--- androidx.compose.animation:animation:1.7.2 -> 1.7.6 (*) +| | | | +--- androidx.compose.foundation:foundation-layout:1.7.2 -> 1.7.6 (*) +| | | | +--- androidx.compose.runtime:runtime:1.7.2 -> 1.7.6 (*) +| | | | +--- androidx.compose.runtime:runtime-saveable:1.7.2 -> 1.7.6 (*) +| | | | +--- androidx.compose.ui:ui:1.7.2 -> 1.7.6 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2 -> 2.8.7 (*) +| | | | +--- androidx.navigation:navigation-runtime-ktx:2.8.4 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 -> 1.7.3 (*) +| | | | +--- androidx.navigation:navigation-common:2.8.4 (c) +| | | | +--- androidx.navigation:navigation-fragment:2.8.4 (c) +| | | | +--- androidx.navigation:navigation-fragment-ktx:2.8.4 (c) +| | | | +--- androidx.navigation:navigation-runtime:2.8.4 (c) +| | | | +--- androidx.navigation:navigation-runtime-ktx:2.8.4 (c) +| | | | \--- androidx.navigation:navigation-common-ktx:2.8.4 (c) +| | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.2 -> 2.8.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.2 -> 2.8.3-rc01 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.2 -> 2.8.3-rc01 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.2 -> 2.8.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.2 -> 2.8.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.2 -> 2.8.3 (*) +| | | +--- org.jetbrains.androidx.navigation:navigation-common:2.8.0-alpha10 +| | | | +--- androidx.core:core-ktx:1.1.0 -> 1.15.0 (*) +| | | | +--- androidx.navigation:navigation-common:2.8.0-rc01 -> 2.8.4 (*) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.4.1 (*) +| | | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) +| | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.2 -> 2.8.3 (*) +| | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.2 -> 2.8.3-rc01 (*) +| | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.2 -> 2.8.3 (*) +| | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.2 -> 2.8.3 (*) +| | | | +--- org.jetbrains.androidx.savedstate:savedstate:1.2.2 (*) +| | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.7.0-beta02 -> 1.7.3 (*) +| | | | +--- org.jetbrains.compose.collection-internal:collection:1.7.0-beta02 -> 1.7.3 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.2 -> 1.7.3 (*) +| | | +--- org.jetbrains.androidx.navigation:navigation-runtime:2.8.0-alpha10 +| | | | +--- androidx.activity:activity-ktx:1.7.1 -> 1.9.3 (*) +| | | | +--- androidx.navigation:navigation-runtime:2.8.0-rc01 -> 2.8.4 (*) +| | | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) +| | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.2 -> 2.8.3 (*) +| | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.2 -> 2.8.3-rc01 (*) +| | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.2 -> 2.8.3 (*) +| | | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.2 -> 2.8.3 (*) +| | | | +--- org.jetbrains.androidx.navigation:navigation-common:2.8.0-alpha10 (*) +| | | | +--- org.jetbrains.androidx.savedstate:savedstate:1.2.2 (*) +| | | | +--- org.jetbrains.compose.annotation-internal:annotation:1.7.0-beta02 -> 1.7.3 (*) +| | | | +--- org.jetbrains.compose.collection-internal:collection:1.7.0-beta02 -> 1.7.3 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.24 -> 2.1.0 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.2 -> 1.7.3 (*) +| | | +--- org.jetbrains.androidx.savedstate:savedstate:1.2.2 (*) +| | | +--- org.jetbrains.compose.animation:animation:1.7.0-beta02 -> 1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.animation:animation-core:1.7.0-beta02 -> 1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.foundation:foundation-layout:1.7.0-beta02 -> 1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.runtime:runtime:1.7.0-beta02 -> 1.7.3 (*) +| | | +--- org.jetbrains.compose.runtime:runtime-saveable:1.7.0-beta02 -> 1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.ui:ui:1.7.0-beta02 -> 1.7.0-rc01 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.2 -> 1.7.3 (*) +| | +--- io.github.vinceglb:filekit-compose:0.8.7 +| | | \--- io.github.vinceglb:filekit-compose-android:0.8.7 +| | | +--- androidx.activity:activity-compose:1.9.2 -> 1.9.3 (*) +| | | +--- io.github.vinceglb:filekit-core:0.8.7 +| | | | \--- io.github.vinceglb:filekit-core-android:0.8.7 +| | | | +--- androidx.activity:activity-ktx:1.9.2 -> 1.9.3 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 -> 2.1.0 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 -> 2.1.0 (*) +| | | +--- org.jetbrains.compose.runtime:runtime:1.6.11 -> 1.7.3 (*) +| | | +--- org.jetbrains.compose.ui:ui:1.6.11 -> 1.7.0-rc01 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | \--- io.github.vinceglb:filekit-core:0.8.7 (*) +| +--- project :core:designsystem (*) +| +--- project :core:data +| | +--- androidx.core:core-ktx:1.15.0 (*) +| | +--- androidx.tracing:tracing-ktx:1.3.0-alpha02 +| | | +--- androidx.tracing:tracing:1.3.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.1.0 (*) +| | | \--- androidx.tracing:tracing:1.3.0-alpha02 (c) +| | +--- io.insert-koin:koin-android:4.0.1-RC1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | +--- io.insert-koin:koin-bom:4.0.1-RC1 (*) +| | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | +--- io.insert-koin:koin-annotations:1.4.0-RC4 (*) +| | +--- project :core:common (*) +| | +--- project :core:datastore +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | | +--- io.insert-koin:koin-bom:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-annotations:1.4.0-RC4 (*) +| | | +--- com.russhwolf:multiplatform-settings-no-arg:1.2.0 +| | | | \--- com.russhwolf:multiplatform-settings-no-arg-android:1.2.0 +| | | | +--- androidx.startup:startup-runtime:1.1.1 (*) +| | | | +--- com.russhwolf:multiplatform-settings:1.2.0 +| | | | | \--- com.russhwolf:multiplatform-settings-android:1.2.0 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.1.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.1.0 (*) +| | | +--- com.russhwolf:multiplatform-settings-serialization:1.2.0 +| | | | \--- com.russhwolf:multiplatform-settings-serialization-android:1.2.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.1.0 (*) +| | | | +--- com.russhwolf:multiplatform-settings:1.2.0 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3 -> 1.7.3 (*) +| | | +--- com.russhwolf:multiplatform-settings-coroutines:1.2.0 +| | | | \--- com.russhwolf:multiplatform-settings-coroutines-android:1.2.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.1.0 (*) +| | | | +--- com.russhwolf:multiplatform-settings:1.2.0 (*) +| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 -> 1.10.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 (*) +| | | +--- project :core:model (*) +| | | \--- project :core:common (*) +| | +--- project :core:model (*) +| | +--- project :core:network +| | | +--- io.ktor:ktor-client-okhttp:3.0.3 +| | | | \--- io.ktor:ktor-client-okhttp-jvm:3.0.3 +| | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | +--- io.ktor:ktor-client-core:3.0.3 +| | | | | \--- io.ktor:ktor-client-core-jvm:3.0.3 +| | | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | | +--- io.ktor:ktor-http:3.0.3 +| | | | | | \--- io.ktor:ktor-http-jvm:3.0.3 +| | | | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | | | +--- io.ktor:ktor-utils:3.0.3 +| | | | | | | \--- io.ktor:ktor-utils-jvm:3.0.3 +| | | | | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | | | | +--- io.ktor:ktor-io:3.0.3 +| | | | | | | | \--- io.ktor:ktor-io-jvm:3.0.3 +| | | | | | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-io-core:0.5.4 +| | | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-io-core-jvm:0.5.4 +| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-io-bytestring:0.5.4 +| | | | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-io-bytestring-jvm:0.5.4 +| | | | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.1.0 (*) +| | | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.1.0 (*) +| | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 (*) +| | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | | | +--- io.ktor:ktor-events:3.0.3 +| | | | | | \--- io.ktor:ktor-events-jvm:3.0.3 +| | | | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | | | +--- io.ktor:ktor-http:3.0.3 (*) +| | | | | | +--- io.ktor:ktor-utils:3.0.3 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | | | +--- io.ktor:ktor-websocket-serialization:3.0.3 +| | | | | | \--- io.ktor:ktor-websocket-serialization-jvm:3.0.3 +| | | | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | | | +--- io.ktor:ktor-http:3.0.3 (*) +| | | | | | +--- io.ktor:ktor-serialization:3.0.3 +| | | | | | | \--- io.ktor:ktor-serialization-jvm:3.0.3 +| | | | | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | | | | +--- io.ktor:ktor-http:3.0.3 (*) +| | | | | | | +--- io.ktor:ktor-websockets:3.0.3 +| | | | | | | | \--- io.ktor:ktor-websockets-jvm:3.0.3 +| | | | | | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | | | | | +--- io.ktor:ktor-http:3.0.3 (*) +| | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | | | +--- io.ktor:ktor-sse:3.0.3 +| | | | | | \--- io.ktor:ktor-sse-jvm:3.0.3 +| | | | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | | | +--- io.ktor:ktor-http:3.0.3 (*) +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.9.0 -> 1.10.1 +| | | | | +--- org.slf4j:slf4j-api:1.7.32 -> 2.0.16 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | | | +--- com.squareup.okhttp3:okhttp:4.12.0 +| | | | | +--- com.squareup.okio:okio:3.6.0 -> 3.9.1 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.20 (*) +| | | | +--- com.squareup.okhttp3:okhttp-sse:4.12.0 +| | | | | +--- com.squareup.okhttp3:okhttp:4.12.0 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.20 (*) +| | | | +--- com.squareup.okio:okio:3.9.1 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | +--- io.insert-koin:koin-android:4.0.1-RC1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | | +--- io.insert-koin:koin-bom:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-annotations:1.4.0-RC4 (*) +| | | +--- project :core:common (*) +| | | +--- project :core:model (*) +| | | +--- project :core:datastore (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 (*) +| | | +--- io.ktor:ktor-client-core:3.0.3 (*) +| | | +--- io.ktor:ktor-client-json:3.0.3 +| | | | \--- io.ktor:ktor-client-json-jvm:3.0.3 +| | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | +--- io.ktor:ktor-client-core:3.0.3 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | +--- io.ktor:ktor-client-logging:3.0.3 +| | | | \--- io.ktor:ktor-client-logging-jvm:3.0.3 +| | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.9.0 -> 1.10.1 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | +--- io.ktor:ktor-client-core:3.0.3 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | +--- io.ktor:ktor-client-serialization:3.0.3 +| | | | \--- io.ktor:ktor-client-serialization-jvm:3.0.3 +| | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | +--- io.ktor:ktor-client-core:3.0.3 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 (*) +| | | | +--- io.ktor:ktor-client-json:3.0.3 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | +--- io.ktor:ktor-client-content-negotiation:3.0.3 +| | | | \--- io.ktor:ktor-client-content-negotiation-jvm:3.0.3 +| | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | +--- io.ktor:ktor-client-core:3.0.3 (*) +| | | | +--- io.ktor:ktor-serialization:3.0.3 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | +--- io.ktor:ktor-client-auth:3.0.3 +| | | | \--- io.ktor:ktor-client-auth-jvm:3.0.3 +| | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | +--- io.ktor:ktor-client-core:3.0.3 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | +--- io.ktor:ktor-serialization-kotlinx-json:3.0.3 +| | | | \--- io.ktor:ktor-serialization-kotlinx-json-jvm:3.0.3 +| | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | +--- io.ktor:ktor-http:3.0.3 (*) +| | | | +--- io.ktor:ktor-serialization-kotlinx:3.0.3 +| | | | | \--- io.ktor:ktor-serialization-kotlinx-jvm:3.0.3 +| | | | | +--- org.slf4j:slf4j-api:2.0.16 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.1 (*) +| | | | | +--- io.ktor:ktor-http:3.0.3 (*) +| | | | | +--- io.ktor:ktor-serialization:3.0.3 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-io:1.7.3 +| | | | | \--- org.jetbrains.kotlinx:kotlinx-serialization-json-io-jvm:1.7.3 +| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.20 -> 2.1.0 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 (*) +| | | | | \--- org.jetbrains.kotlinx:kotlinx-io-core:0.4.0 -> 0.5.4 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | +--- de.jensklingenberg.ktorfit:ktorfit-lib:2.2.0 +| | | | \--- de.jensklingenberg.ktorfit:ktorfit-lib-android:2.2.0 +| | | | +--- io.ktor:ktor-client-okhttp:3.0.1 -> 3.0.3 (*) +| | | | +--- de.jensklingenberg.ktorfit:ktorfit-lib-light:2.2.0 +| | | | | \--- de.jensklingenberg.ktorfit:ktorfit-lib-light-android:2.2.0 +| | | | | +--- de.jensklingenberg.ktorfit:ktorfit-annotations:2.2.0 +| | | | | | \--- de.jensklingenberg.ktorfit:ktorfit-annotations-android:2.2.0 +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | | | +--- io.ktor:ktor-client-core:3.0.1 -> 3.0.3 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| | | \--- com.squareup.okio:okio:3.9.1 (*) +| | +--- project :core:analytics (*) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 (*) +| | \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 (*) +| +--- io.insert-koin:koin-compose:4.0.1-RC1 (*) +| +--- io.insert-koin:koin-compose-viewmodel:4.0.1-RC1 +| | \--- io.insert-koin:koin-compose-viewmodel-jvm:4.0.1-RC1 +| | +--- io.insert-koin:koin-compose:4.0.1-RC1 (*) +| | +--- io.insert-koin:koin-core-viewmodel:4.0.1-RC1 (*) +| | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.3 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -> 2.1.0 (*) +| +--- org.jetbrains.compose.runtime:runtime:1.7.3 (*) +| +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.3 (*) +| +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.3 (*) +| +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.3 (*) +| +--- org.jetbrains.androidx.savedstate:savedstate:1.2.2 (*) +| +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) +| +--- org.jetbrains.androidx.navigation:navigation-compose:2.8.0-alpha10 (*) +| +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 +| | \--- org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.8 +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.1.0 (*) +| +--- project :cmp-navigation +| | +--- io.insert-koin:koin-bom:4.0.1-RC1 (*) +| | +--- io.insert-koin:koin-android:4.0.1-RC1 (*) +| | +--- io.insert-koin:koin-androidx-compose:4.0.1-RC1 (*) +| | +--- io.insert-koin:koin-androidx-navigation:4.0.1-RC1 (*) +| | +--- io.insert-koin:koin-core-viewmodel:4.0.1-RC1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | +--- io.insert-koin:koin-annotations:1.4.0-RC4 (*) +| | +--- project :core:ui (*) +| | +--- project :core:designsystem (*) +| | +--- project :core:data (*) +| | +--- io.insert-koin:koin-compose:4.0.1-RC1 (*) +| | +--- io.insert-koin:koin-compose-viewmodel:4.0.1-RC1 (*) +| | +--- org.jetbrains.compose.runtime:runtime:1.7.3 (*) +| | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.3 (*) +| | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.3 (*) +| | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.3 (*) +| | +--- org.jetbrains.androidx.savedstate:savedstate:1.2.2 (*) +| | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) +| | +--- org.jetbrains.androidx.navigation:navigation-compose:2.8.0-alpha10 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) +| | +--- project :core:common (*) +| | +--- project :feature:home +| | | +--- io.insert-koin:koin-bom:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-android:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-androidx-compose:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-androidx-navigation:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-core-viewmodel:4.0.1-RC1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-annotations:1.4.0-RC4 (*) +| | | +--- project :core:ui (*) +| | | +--- project :core:designsystem (*) +| | | +--- project :core:data (*) +| | | +--- io.insert-koin:koin-compose:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-compose-viewmodel:4.0.1-RC1 (*) +| | | +--- org.jetbrains.compose.runtime:runtime:1.7.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.3 (*) +| | | +--- org.jetbrains.androidx.savedstate:savedstate:1.2.2 (*) +| | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) +| | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.8.0-alpha10 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) +| | | +--- org.jetbrains.compose.ui:ui:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.foundation:foundation:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.material3:material3:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.components:components-resources:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.components:components-ui-tooling-preview:1.7.0-rc01 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 (*) +| | | \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 (*) +| | +--- project :feature:profile +| | | +--- io.insert-koin:koin-bom:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-android:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-androidx-compose:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-androidx-navigation:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-core-viewmodel:4.0.1-RC1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-annotations:1.4.0-RC4 (*) +| | | +--- project :core:ui (*) +| | | +--- project :core:designsystem (*) +| | | +--- project :core:data (*) +| | | +--- io.insert-koin:koin-compose:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-compose-viewmodel:4.0.1-RC1 (*) +| | | +--- org.jetbrains.compose.runtime:runtime:1.7.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.3 (*) +| | | +--- org.jetbrains.androidx.savedstate:savedstate:1.2.2 (*) +| | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) +| | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.8.0-alpha10 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) +| | | +--- org.jetbrains.compose.ui:ui:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.foundation:foundation:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.material3:material3:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.components:components-resources:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.components:components-ui-tooling-preview:1.7.0-rc01 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 (*) +| | | \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 (*) +| | +--- project :feature:settings +| | | +--- io.insert-koin:koin-bom:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-android:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-androidx-compose:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-androidx-navigation:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-core-viewmodel:4.0.1-RC1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 (*) +| | | +--- io.insert-koin:koin-core:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-annotations:1.4.0-RC4 (*) +| | | +--- project :core:ui (*) +| | | +--- project :core:designsystem (*) +| | | +--- project :core:data (*) +| | | +--- io.insert-koin:koin-compose:4.0.1-RC1 (*) +| | | +--- io.insert-koin:koin-compose-viewmodel:4.0.1-RC1 (*) +| | | +--- org.jetbrains.compose.runtime:runtime:1.7.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.8.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.3 (*) +| | | +--- org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.3 (*) +| | | +--- org.jetbrains.androidx.savedstate:savedstate:1.2.2 (*) +| | | +--- org.jetbrains.androidx.core:core-bundle:1.0.1 (*) +| | | +--- org.jetbrains.androidx.navigation:navigation-compose:2.8.0-alpha10 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 (*) +| | | +--- org.jetbrains.compose.ui:ui:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.foundation:foundation:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.material3:material3:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.components:components-resources:1.7.0-rc01 (*) +| | | +--- org.jetbrains.compose.components:components-ui-tooling-preview:1.7.0-rc01 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 (*) +| | | \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 (*) +| | +--- org.jetbrains.compose.material3:material3:1.7.0-rc01 (*) +| | +--- org.jetbrains.compose.foundation:foundation:1.7.0-rc01 (*) +| | +--- org.jetbrains.compose.ui:ui:1.7.0-rc01 (*) +| | +--- org.jetbrains.compose.components:components-ui-tooling-preview:1.7.0-rc01 (*) +| | +--- org.jetbrains.compose.components:components-resources:1.7.0-rc01 (*) +| | \--- dev.chrisbanes.material3:material3-window-size-class-multiplatform:0.5.0 (*) +| \--- org.jetbrains.compose.components:components-resources:1.7.0-rc01 (*) ++--- project :core:ui (*) ++--- androidx.core:core-ktx:1.15.0 (*) ++--- androidx.appcompat:appcompat:1.7.0 (*) ++--- androidx.activity:activity-compose:1.9.3 (*) ++--- androidx.activity:activity-ktx:1.9.3 (*) ++--- androidx.core:core-splashscreen:1.0.1 +| +--- androidx.annotation:annotation:1.2.0 -> 1.9.1 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 2.1.0 (*) ++--- androidx.profileinstaller:profileinstaller:1.4.1 (*) ++--- androidx.tracing:tracing-ktx:1.3.0-alpha02 (*) ++--- io.insert-koin:koin-core:4.0.1-RC1 (*) ++--- io.insert-koin:koin-android:4.0.1-RC1 (*) ++--- io.insert-koin:koin-compose:4.0.1-RC1 (*) ++--- io.insert-koin:koin-compose-viewmodel:4.0.1-RC1 (*) +\--- androidx.compose.runtime:runtime -> 1.7.6 (*) diff --git a/androidApp/dependencies/prodReleaseRuntimeClasspath.txt b/cmp-android/dependencies/prodReleaseRuntimeClasspath.txt similarity index 97% rename from androidApp/dependencies/prodReleaseRuntimeClasspath.txt rename to cmp-android/dependencies/prodReleaseRuntimeClasspath.txt index bb7db873c..f707f4150 100644 --- a/androidApp/dependencies/prodReleaseRuntimeClasspath.txt +++ b/cmp-android/dependencies/prodReleaseRuntimeClasspath.txt @@ -56,6 +56,11 @@ androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.1.0 +androidx.databinding:databinding-adapters:8.7.3 +androidx.databinding:databinding-common:8.7.3 +androidx.databinding:databinding-ktx:8.7.3 +androidx.databinding:databinding-runtime:8.7.3 +androidx.databinding:viewbinding:8.7.3 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 @@ -79,6 +84,7 @@ androidx.lifecycle:lifecycle-runtime-compose:2.8.7 androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.7 androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 androidx.lifecycle:lifecycle-runtime:2.8.7 +androidx.lifecycle:lifecycle-service:2.8.7 androidx.lifecycle:lifecycle-viewmodel-android:2.8.7 androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.7 androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 @@ -88,7 +94,6 @@ androidx.lifecycle:lifecycle-viewmodel:2.8.7 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 androidx.metrics:metrics-performance:1.0.0-beta01 -androidx.multidex:multidex:2.0.1 androidx.navigation:navigation-common-ktx:2.8.4 androidx.navigation:navigation-common:2.8.4 androidx.navigation:navigation-compose:2.8.4 @@ -151,7 +156,6 @@ com.google.android.gms:play-services-measurement-impl:22.1.2 com.google.android.gms:play-services-measurement-sdk-api:22.1.2 com.google.android.gms:play-services-measurement-sdk:22.1.2 com.google.android.gms:play-services-measurement:22.1.2 -com.google.android.gms:play-services-oss-licenses:17.1.0 com.google.android.gms:play-services-stats:17.0.2 com.google.android.gms:play-services-tasks:18.2.0 com.google.code.findbugs:jsr305:3.0.2 @@ -289,15 +293,14 @@ org.jetbrains.compose.runtime:runtime:1.7.3 org.jetbrains.compose.ui:ui-geometry:1.7.0-rc01 org.jetbrains.compose.ui:ui-graphics:1.7.0-rc01 org.jetbrains.compose.ui:ui-text:1.7.0-rc01 -org.jetbrains.compose.ui:ui-tooling-preview:1.7.0-rc01 org.jetbrains.compose.ui:ui-unit:1.7.0-rc01 org.jetbrains.compose.ui:ui-util:1.7.0-rc01 org.jetbrains.compose.ui:ui:1.7.0-rc01 org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-reflect:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20 org.jetbrains.kotlin:kotlin-stdlib:2.1.0 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 org.jetbrains.kotlinx:atomicfu:0.23.2 diff --git a/cmp-android/google-services.json b/cmp-android/google-services.json new file mode 100644 index 000000000..dd0af17c6 --- /dev/null +++ b/cmp-android/google-services.json @@ -0,0 +1,63 @@ +{ + "project_info": { + "project_number": "project_number", + "firebase_url": "firebase_url", + "project_id": "project_id", + "storage_bucket": "storage_bucket" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "mobilesdk_app_id", + "android_client_info": { + "package_name": "org.mifos" + } + }, + "api_key": [ + { + "current_key": "current_key" + } + ] + }, + { + "client_info": { + "mobilesdk_app_id": "mobilesdk_app_id", + "android_client_info": { + "package_name": "org.mifos.demo.debug" + } + }, + "api_key": [ + { + "current_key": "current_key" + } + ] + }, + { + "client_info": { + "mobilesdk_app_id": "mobilesdk_app_id", + "android_client_info": { + "package_name": "org.mifos.demo" + } + }, + "api_key": [ + { + "current_key": "current_key" + } + ] + }, + { + "client_info": { + "mobilesdk_app_id": "mobilesdk_app_id", + "android_client_info": { + "package_name": "org.mifos.debug" + } + }, + "api_key": [ + { + "current_key": "current_key" + } + ] + } + ], + "configuration_version": "1" +} diff --git a/cmp-android/lint-baseline.xml b/cmp-android/lint-baseline.xml new file mode 100644 index 000000000..729cb6985 --- /dev/null +++ b/cmp-android/lint-baseline.xml @@ -0,0 +1,1510 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cmp-android/prodRelease-badging.txt b/cmp-android/prodRelease-badging.txt new file mode 100644 index 000000000..bd8109b92 --- /dev/null +++ b/cmp-android/prodRelease-badging.txt @@ -0,0 +1,129 @@ +package: name='org.mifospay' versionCode='1' versionName='2024.12.4-beta.0.4' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15' +sdkVersion:'26' +targetSdkVersion:'34' +uses-permission: name='android.permission.INTERNET' +uses-permission: name='android.permission.CAMERA' +uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' maxSdkVersion='32' +uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' maxSdkVersion='32' +uses-permission: name='android.permission.VIBRATE' +uses-permission: name='android.permission.FLASHLIGHT' +uses-permission: name='android.permission.ACCESS_NETWORK_STATE' +uses-permission: name='android.permission.WAKE_LOCK' +uses-permission: name='com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE' +uses-permission: name='android.permission.ACCESS_ADSERVICES_ATTRIBUTION' +uses-permission: name='android.permission.ACCESS_ADSERVICES_AD_ID' +uses-permission: name='org.mifospay.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION' +application-label:'Mifos Pay' +application-label-af:'Mifos Pay' +application-label-am:'Mifos Pay' +application-label-ar:'Mifos Pay' +application-label-as:'Mifos Pay' +application-label-az:'Mifos Pay' +application-label-be:'Mifos Pay' +application-label-bg:'Mifos Pay' +application-label-bn:'Mifos Pay' +application-label-bs:'Mifos Pay' +application-label-ca:'Mifos Pay' +application-label-cs:'Mifos Pay' +application-label-da:'Mifos Pay' +application-label-de:'Mifos Pay' +application-label-el:'Mifos Pay' +application-label-en-AU:'Mifos Pay' +application-label-en-CA:'Mifos Pay' +application-label-en-GB:'Mifos Pay' +application-label-en-IN:'Mifos Pay' +application-label-en-XC:'Mifos Pay' +application-label-es:'Mifos Pay' +application-label-es-US:'Mifos Pay' +application-label-et:'Mifos Pay' +application-label-eu:'Mifos Pay' +application-label-fa:'Mifos Pay' +application-label-fi:'Mifos Pay' +application-label-fr:'Mifos Pay' +application-label-fr-CA:'Mifos Pay' +application-label-gl:'Mifos Pay' +application-label-gu:'Mifos Pay' +application-label-hi:'Mifos Pay' +application-label-hr:'Mifos Pay' +application-label-hu:'Mifos Pay' +application-label-hy:'Mifos Pay' +application-label-in:'Mifos Pay' +application-label-is:'Mifos Pay' +application-label-it:'Mifos Pay' +application-label-iw:'Mifos Pay' +application-label-ja:'Mifos Pay' +application-label-ka:'Mifos Pay' +application-label-kk:'Mifos Pay' +application-label-km:'Mifos Pay' +application-label-kn:'Mifos Pay' +application-label-ko:'Mifos Pay' +application-label-ky:'Mifos Pay' +application-label-lo:'Mifos Pay' +application-label-lt:'Mifos Pay' +application-label-lv:'Mifos Pay' +application-label-mk:'Mifos Pay' +application-label-ml:'Mifos Pay' +application-label-mn:'Mifos Pay' +application-label-mr:'Mifos Pay' +application-label-ms:'Mifos Pay' +application-label-my:'Mifos Pay' +application-label-nb:'Mifos Pay' +application-label-ne:'Mifos Pay' +application-label-nl:'Mifos Pay' +application-label-or:'Mifos Pay' +application-label-pa:'Mifos Pay' +application-label-pl:'Mifos Pay' +application-label-pt:'Mifos Pay' +application-label-pt-BR:'Mifos Pay' +application-label-pt-PT:'Mifos Pay' +application-label-ro:'Mifos Pay' +application-label-ru:'Mifos Pay' +application-label-si:'Mifos Pay' +application-label-sk:'Mifos Pay' +application-label-sl:'Mifos Pay' +application-label-sq:'Mifos Pay' +application-label-sr:'Mifos Pay' +application-label-sr-Latn:'Mifos Pay' +application-label-sv:'Mifos Pay' +application-label-sw:'Mifos Pay' +application-label-ta:'Mifos Pay' +application-label-te:'Mifos Pay' +application-label-th:'Mifos Pay' +application-label-tl:'Mifos Pay' +application-label-tr:'Mifos Pay' +application-label-uk:'Mifos Pay' +application-label-ur:'Mifos Pay' +application-label-uz:'Mifos Pay' +application-label-vi:'Mifos Pay' +application-label-zh-CN:'Mifos Pay' +application-label-zh-HK:'Mifos Pay' +application-label-zh-TW:'Mifos Pay' +application-label-zu:'Mifos Pay' +application-icon-160:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-240:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-320:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-480:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-640:'res/mipmap-anydpi-v26/ic_launcher.xml' +application-icon-65534:'res/mipmap-anydpi-v26/ic_launcher.xml' +application: label='Mifos Pay' icon='res/mipmap-anydpi-v26/ic_launcher.xml' +launchable-activity: name='org.mifospay.MainActivity' label='' icon='' +property: name='android.adservices.AD_SERVICES_CONFIG' resource='res/xml/ga_ad_services_config.xml' +uses-library-not-required:'androidx.window.extensions' +uses-library-not-required:'androidx.window.sidecar' +uses-library-not-required:'android.ext.adservices' +feature-group: label='' + uses-feature: name='android.hardware.camera' + uses-feature: name='android.hardware.camera.autofocus' + uses-feature: name='android.hardware.faketouch' + uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' + uses-feature: name='android.hardware.screen.portrait' + uses-implied-feature: name='android.hardware.screen.portrait' reason='one or more activities have specified a portrait orientation' +main +other-activities +other-receivers +other-services +supports-screens: 'small' 'normal' 'large' 'xlarge' +supports-any-density: 'true' +locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-CA' 'en-GB' 'en-IN' 'en-XC' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' +densities: '160' '240' '320' '480' '640' '65534' +native-code: 'arm64-v8a' 'armeabi-v7a' 'x86' 'x86_64' diff --git a/cmp-android/proguard-rules.pro b/cmp-android/proguard-rules.pro new file mode 100644 index 000000000..fe8b865e0 --- /dev/null +++ b/cmp-android/proguard-rules.pro @@ -0,0 +1,135 @@ +-ignorewarnings + +# Rules for: uCrop - Image Cropping Library for Android +-dontwarn com.yalantis.ucrop** +-dontwarn java.lang.management.ManagementFactory +-keep class com.yalantis.ucrop** { *; } +-keep interface com.yalantis.ucrop** { *; } + +# Proguard Kotlin Example https://github.com/Guardsquare/proguard/blob/master/examples/application-kotlin/proguard.pro + +-keepattributes *Annotation* + +-keep class kotlin.Metadata { *; } + +# Kotlin + +-keep class kotlin.reflect.jvm.internal.** { *; } +-keep class kotlin.text.RegexOption { *; } + +-keep class kotlin.** { *; } +-keep class org.jetbrains.skia.** { *; } +-keep class org.jetbrains.skiko.** { *; } + +-assumenosideeffects public class androidx.compose.runtime.ComposerKt { + void sourceInformation(androidx.compose.runtime.Composer,java.lang.String); + void sourceInformationMarkerStart(androidx.compose.runtime.Composer,int,java.lang.String); + void sourceInformationMarkerEnd(androidx.compose.runtime.Composer); + boolean isTraceInProgress(); + void traceEventEnd(); +} + +# Kotlinx Coroutines Rules +# https://github.com/Kotlin/kotlinx.coroutines/blob/master/kotlinx-coroutines-core/jvm/resources/META-INF/proguard/coroutines.pro + +-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} +-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} +-keepclassmembers class kotlinx.coroutines.** { + volatile ; +} +-keepclassmembers class kotlin.coroutines.SafeContinuation { + volatile ; +} +-dontwarn java.lang.instrument.ClassFileTransformer +-dontwarn sun.misc.SignalHandler +-dontwarn java.lang.instrument.Instrumentation +-dontwarn sun.misc.Signal +-dontwarn java.lang.ClassValue +-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement + +# https://github.com/Kotlin/kotlinx.coroutines/issues/2046 +-dontwarn android.annotation.SuppressLint + +# https://github.com/JetBrains/compose-jb/issues/2393 +-dontnote kotlin.coroutines.jvm.internal.** +-dontnote kotlin.internal.** +-dontnote kotlin.jvm.internal.** +-dontnote kotlin.reflect.** +-dontnote kotlinx.coroutines.debug.internal.** +-dontnote kotlinx.coroutines.internal.** +-keep class kotlin.coroutines.Continuation +-keep class kotlinx.coroutines.CancellableContinuation +-keep class kotlinx.coroutines.channels.Channel +-keep class kotlinx.coroutines.CoroutineDispatcher +-keep class kotlinx.coroutines.CoroutineScope +# this is a weird one, but breaks build on some combinations of OS and JDK (reproduced on Windows 10 + Corretto 16) +-dontwarn org.graalvm.compiler.core.aarch64.AArch64NodeMatchRules_MatchStatementSet* + +### kotlinx.serialization rules + +# Keep `Companion` object fields of serializable classes. +# This avoids serializer lookup through `getDeclaredClasses` as done for named companion objects. +-if @kotlinx.serialization.Serializable class ** +-keepclassmembers class <1> { + static <1>$Companion Companion; +} + +# Keep `serializer()` on companion objects (both default and named) of serializable classes. +-if @kotlinx.serialization.Serializable class ** { + static **$* *; +} +-keepclassmembers class <2>$<3> { + kotlinx.serialization.KSerializer serializer(...); +} + +# Keep `INSTANCE.serializer()` of serializable objects. +-if @kotlinx.serialization.Serializable class ** { + public static ** INSTANCE; +} +-keepclassmembers class <1> { + public static <1> INSTANCE; + kotlinx.serialization.KSerializer serializer(...); +} + +# @Serializable and @Polymorphic are used at runtime for polymorphic serialization. +-keepattributes RuntimeVisibleAnnotations,AnnotationDefault + +# Don't print notes about potential mistakes or omissions in the configuration for kotlinx-serialization classes +# See also https://github.com/Kotlin/kotlinx.serialization/issues/1900 +-dontnote kotlinx.serialization.** + +# Serialization core uses `java.lang.ClassValue` for caching inside these specified classes. +# If there is no `java.lang.ClassValue` (for example, in Android), then R8/ProGuard will print a warning. +# However, since in this case they will not be used, we can disable these warnings +-dontwarn kotlinx.serialization.internal.ClassValueReferences + +# JSR 305 annotations are for embedding nullability information. +-dontwarn javax.annotation.** + +# A resource is loaded with a relative path so the package of this class must be preserved. +-keeppackagenames okhttp3.internal.publicsuffix.* +-adaptresourcefilenames okhttp3/internal/publicsuffix/PublicSuffixDatabase.gz + +# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java. +-dontwarn org.codehaus.mojo.animal_sniffer.* + +# OkHttp platform used only on JVM and when Conscrypt and other security providers are available. +-dontwarn okhttp3.internal.platform.** +-dontwarn org.conscrypt.** +-dontwarn org.bouncycastle.** +-dontwarn org.openjsse.** + +-keep class io.ktor.** { *; } +-keep class kotlinx.serialization.** { *; } +-keep class io.ktor.client.network.sockets.** { *; } +-keep class io.ktor.client.plugins.* { *; } +-keep class io.ktor.util.* { *; } +-keep class io.ktor.utils.io.* { *; } +-keep class java.lang.management.* { *; } +-dontwarn io.ktor.client.network.sockets.SocketTimeoutException +-dontwarn java.lang.management.RuntimeMXBean + +-keep class org.mifospay.core.network.services.* { *;} +-keep class de.jensklingenberg.ktorfit.converter.** { *; } +-keep class de.jensklingenberg.ktorfit.** { *; } +-keeppackagenames de.jensklingenberg.ktorfit.* \ No newline at end of file diff --git a/cmp-android/src/main/AndroidManifest.xml b/cmp-android/src/main/AndroidManifest.xml new file mode 100644 index 000000000..91eaaded5 --- /dev/null +++ b/cmp-android/src/main/AndroidManifest.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cmp-android/src/main/ic_launcher-playstore.png b/cmp-android/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..05c7788edf9424944e75550ebed3366415a404d7 GIT binary patch literal 16896 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 literal 0 HcmV?d00001 diff --git a/cmp-android/src/main/kotlin/cmp/android/app/AndroidApp.kt b/cmp-android/src/main/kotlin/cmp/android/app/AndroidApp.kt new file mode 100644 index 000000000..cbbff9b09 --- /dev/null +++ b/cmp-android/src/main/kotlin/cmp/android/app/AndroidApp.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package cmp.android.app + +import android.app.Application +import cmp.shared.utils.initKoin +import org.koin.android.ext.koin.androidContext +import org.koin.android.ext.koin.androidLogger +import org.koin.core.logger.Level + +/** + * Android application class. + * This class is used to initialize Koin modules for dependency injection in the Android application. + * It sets up the Koin framework, providing the necessary dependencies for the app. + * + * @constructor Create empty Android app + * @see Application + */ +class AndroidApp : Application() { + override fun onCreate() { + super.onCreate() + initKoin { + androidContext(this@AndroidApp) // Provides the Android app context + androidLogger(Level.DEBUG) // Enables Koin's logging for debugging + } + } +} diff --git a/cmp-android/src/main/kotlin/cmp/android/app/MainActivity.kt b/cmp-android/src/main/kotlin/cmp/android/app/MainActivity.kt new file mode 100644 index 000000000..1beb76b20 --- /dev/null +++ b/cmp-android/src/main/kotlin/cmp/android/app/MainActivity.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2024 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md + */ +package cmp.android.app + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen +import androidx.core.view.WindowCompat +import cmp.shared.SharedApp + +/** + * Main activity class. + * This class is used to set the content view of the activity. + * + * @constructor Create empty Main activity + * @see ComponentActivity + */ +class MainActivity : ComponentActivity() { + /** + * Called when the activity is starting. + * This is where most initialization should go: calling [setContentView(int)] to inflate the activity's UI, + */ + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + installSplashScreen() + + WindowCompat.setDecorFitsSystemWindows(window, false) + enableEdgeToEdge() + + /** + * Set the content view of the activity. + * @see setContent + */ + setContent { + SharedApp() + } + } +} diff --git a/cmp-android/src/main/res/drawable/ic_launcher_background.xml b/cmp-android/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..d0c877a9d --- /dev/null +++ b/cmp-android/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/cmp-android/src/main/res/drawable/ic_launcher_foreground.xml b/cmp-android/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 000000000..ef4a7932e --- /dev/null +++ b/cmp-android/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + diff --git a/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/cmp-android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 70% rename from androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to cmp-android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index b68a884e0..af47c185a 100644 --- a/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/cmp-android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,6 @@ - - + + \ No newline at end of file diff --git a/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/cmp-android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 70% rename from androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to cmp-android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index b68a884e0..af47c185a 100644 --- a/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/cmp-android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,6 +1,6 @@ - - + + \ No newline at end of file diff --git a/cmp-android/src/main/res/mipmap-hdpi/ic_launcher.webp b/cmp-android/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..56b3023f3a9a2563687c5f800fc737e5a342f4c8 GIT binary patch literal 1300 zcmV+v1?&1!Nk&Et1pok7MM6+kP&iEg1ONapN5Byf6$e4KP3JHE8$?8!ihfiExV5z@ zQ2s7faS0uAnjohE8gO^X+?| z3MgU=aNJ0eBBcRKKi)m&;hFCJo)c%!x$ZcUZB;q@uRH%h2=4aX{oi{jq9Jvs)wV6m z@9u_Hl5b#iz)^o`J{Tx&hfm$dH)RDC7U9n8>Zp9CDYk+@&d1`ckAT^xHG) z{%3y&U$@+me~wG|EL6Zk80N97(77YG4zlK$rSL_lKot6r;FdJr08qU{tGeShrAqJK zA|Zu8tz|(;D673gD+55bl(|KfEcEFRLYb>ZZ|cq((=^^9>b64}Wwu(KsRO{&#bH9# z>v72^Uwe^i(>SH8*c2PAnl#MlDl)}(bgjj4zIvtvN3$OSN}8{wvzrO_5zO7*o&U8t zX%b8le_M5#Y740KQ5)z}tK(1NcU_``j=Hc}3?(nNB# zJxZLk)MT%3=_rd`cnBj8;h=t48q?M)>GIU$CQ1EmOW1sdf_!N8(0=9ujLeA;i#A6s zkMBp@Yy{V;gxyNl*X}3}9%}JHt2W1>7wP+e1evOZ)I~U}g$Dab-++-Rp{X;QHP`T_ z^>zf%j;*CHdSBw)4h_)qiOSINf0?r$4(W%i&o=0T?fwyRs@&E zTV^2^h_RhhnT7h*Isfm~K?>Knx(6wN{~WI3CgFHrI#(a&>YVQaAo=R{(+`oehjVh* zq4r5xlvg?Q!gZj%lqmWC^}|a;@USb`UP4Uluce*iH>=HW&V`+Td$I+TujX~2&1=Mv zj%O!#nbn4VN>}kG-(c0nVMcdfE4Jkpt0whBy8B~}NoQDDCarC~&QLTXg+EPYM&j*S z_f~UYRm}mQ0Yu7eeLucO~~APOLtaNIVM9?xU?D>|jVLO<;p1%1+hB| z{tW&9nZKh&=NgEN1c0=UjszeKAORo=AZ6Ug9)OUgx8yfQMFTbh(+EX#f>1o;cE1l< K%Nqe6M_~X^)Pb!4 literal 0 HcmV?d00001 diff --git a/cmp-android/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/cmp-android/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..457e1737c8075cde1e97005ff91de15a8ebea959 GIT binary patch literal 3080 zcmV+j4EOU=Nk&Eh3;+OEMM6+kP&iEU3jhEwN5ByfHHU(>ZJ2~V?Cvs%hzVe<77AAR z!6{v9`xi;dA9r_mcXxMpcXxMRcZbzk-<__iK|)e4&APg)yXFRd|FmuZms{9#Ci~;= zE?MCn^&jVV&fEi`TjmnFYed8$cF5ccuSF`wsf@G^x!nb+lQJ=q(zrVz*Wg6%&V*z{ z?rwz>Nw94V&v6=Q5Xe{TS=9W~iHfakNN97E7^Sr2d__?-M`6${q@wHfY!D7Y7({DWh|!p% zmWwKMEfk_LS5#>U;ego?O$ColEmWz6qVuc(83J~I!XN|_I5Jc%L&1sso+m>%AYl;I z261GlVn#hAqEZ?L;Q-iB_`6{-HZoK-qtWipGBdLQTTznhfC)vTBPCLER0z_d6Dnu4 zu-W<4MJNlFGJ$+WMROF&_U&>~rV&0rBuU$_Wa$Q{F99vgr`cNqFqGIJsI8)+ISS=7 z_bPbAMN`A(gSKZ2)@JrnK*<~x?GCxhpaE>Z91v2bBT^^m%Jj|XmC;OZigiFbpRib+ z5f+QZ>ca|XM`UZ*rp%l4y_%QH3t4`W?pQSh$3MY&pIRu(k=KN6K`qQ9C{yp-@x*H? zabJ%+Jx(I?JyYH9V1OewOTDIu+_*e51m zor^j-2W20l~Lk^jiJw-Rc zma!mz@)d>9778Ka>qVi0M!}@VJmJTH6cr&vcs?`R{cK+~!1A)8P&Rq=9`ya+{G)!Y zDN2tGYL*|bsh~iSqGplqTrCIN%ZU_q_lz=sj&XnK?iUkwKzyVgoovAu~5oN#=&`Z=$}t5!Ulg{60N5lgVV> zZd3)vLMF-dUNojV55`zTYd;807TZYg^GRu{xfo;bNfI=B75*gvSJ!o@ezC`ob~lOlC{b4L1E`8~ zH$Eyn+#Z2f3Hx?Yn5v?wgLOLr0BDKE=7~LG?3F^hhv$-Hy5jbtB(%{$U}0NhY6}gC0jW#$H1lzKjIt37Sf&tivTrh-$|IffTSlqkFTt}2Hk%eD@)oZZxZu9^*o8(Tujt) zH^6|c?D+_&KMajAqMLTZXCY38Bb!*ir~rd&V{bX_NasG#M)kSX}btKHQQL#%=;YlO7b zFkoNO`~3!`STFY_8lzbY|33kwbR8T52%;ppt!(BFKrKgzX$jo8eF%%r;dvyqH0SE0 ziyZ)ak1U1PK^55yx^j>jS0%IrEGCYoa>8aBlSw>z=-v0w9yWkO0QQi(pKyvwgvFxV z``zxWq1=r#%rhmdrGSMWJ*VnotZIKn1))oz@iyKwy~qRQX8&)iuCpaRNwozkEzA>JHSDi^wFDVvB$rD z(Di#y5wj3Ov`pW>(&F`I)%>m;+UCD~EUii3&=67EzknL_xp*GFz7uQ-z;6ODYU?aX z5b3X9DQQNBo252q0VjTX;wFvS`LjZKk}3fA;4#q>mg>+78x*1W<0Kdk~&m z(gV)C)XVtrRe0EBdpr8?!$Emtts^M{Xmmch&WqBFaHb~4b4pA)99$F=K=Xr003!7_ z_GAd4)BWVOGEYtkzeZDwX7QX7lg_8twFJ@2omib!>{=)7@u9kj~O9_d%Y|kM+ji~$^8)sW~9pDy0GH6NmT+E)mK{x9%ldZ zDk`TqgeQgq6-wmV6GQL5U)NPz4w+z%c_I*G0j!;5awwvHX4J6}Uu^ z#L#C-J`1rM_%SoD(pLW@|CU)N`3`~~nWxgXN#!^KShdtU${2kA^B`Lpt`$^+Lpa|* zk=^4VNhlNw{eKTj+@JG93R;fW&uFoCnE6v&v3Vk($|Y)UFG|f3cT088Q@%aU?>mP( z6yIkpgQacPN1#npA z*s}%_$1Q`G%Fw8^% literal 0 HcmV?d00001 diff --git a/cmp-android/src/main/res/mipmap-mdpi/ic_launcher.webp b/cmp-android/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..ffbbe98badc424f5d2cf4b2a8a31099c814466e5 GIT binary patch literal 928 zcmV;R17G}7Nk&GP0{{S5MM6+kP&iDC0{{RoFTe{BX9hX4ZPm&;?|t__{5UBPHd&C5 z&HUcIupr>pwyj!O=e{p!L_{AH;Qi<14h1|rd%0~R$&qUJ?zQr?`|*7K_IaOx-tBT# z+qSCAdvUicWFQL-Gyxgt#iz@cyHf`M5P%4zfB-}w0W|J)KKY^>6 zg$j_i_z@#W0a8?zEmaa#{D(2TOlgiq$e?3Fjr42qwK0yQu!ra$`PvDhFxCVJkN^Qv zs8kA&0@e0Lph^T%sZ@xbh=D-0?%LJ}Ob8Gvl`0)kNf?1t5g>&IA_+wjUt0%KAq0pd zL{;b=M!mZzRNK4W0aBm@AcO!Fg-VA?fKUlQM5=$sA0a}3q(CK7fm8yNLZw28KIR`# z??^(WYI~p$1s?7%3I(X5z%VKbMNy+DKote3 zqW5=n`+sOZJn~aWyKUQ)oEI1RR@-sXwrxAM?Y!8wZKJK&Nu}e$zj~;9YNWs4^G-zn zCqNo3O)hYgKDR(G6henUG>;tvYzPV68UiijM*D(`@fOLgHNl5@qjQLw2`Bn7e_J51 zjeI7(kxU8~eu`j$1TK6gzm!~RuOq#rUx(o(eg6e}lIIBGSaA915l@XP3mpK9n#zg> zYC@{BnC`~K{Os51(c$T>E%$fpqnls3C7q?bj6Wq|g^3=VOX2tM1mDN0{4RdyD^mEK zVSLX({4OL)|3^ewEUi%UCrHba)pvJPJl$~ZG~3wv{LcFQ4~S-g%v{E*HdU^t3U{C8@kQpcb&fi{n$zFGX$*Tg0h#a?JO4cDx%|XO@OwJhLM$N7{)KQ z*{-$(rs3Y&)ym@sm|Uw8v=yd#O#oA7oMQ4-yQ1Pb(7xhaBFdj~j>)Z;8cNG%KWc?3 zIJt8R5p6rNl+8Jb$9C;S#4-@Z7bK*-!gE0oXMfD$NdVt&5Z_zz+-OMym-@wwpJT0YJ{`>_TrNI(> Cf4q?Z literal 0 HcmV?d00001 diff --git a/cmp-android/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/cmp-android/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..d944a7e839512a2c09f004eae121d184cbc05778 GIT binary patch literal 1994 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 literal 0 HcmV?d00001 diff --git a/cmp-android/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/cmp-android/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..ed0c6a084affb196c5e978c51277830cbe19ccb3 GIT binary patch literal 4146 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 literal 0 HcmV?d00001 diff --git a/cmp-android/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/cmp-android/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..0d5f4978782379d2b176e893bf7273eb9fef25c0 GIT binary patch literal 6516 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 a48b^w%4Lt~TPjsfD_=^qCt$PbI#&W-QMgI~ literal 0 HcmV?d00001 diff --git a/cmp-android/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/cmp-android/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..f27eeb6a14afc5fd1b49631528776ff80129c411 GIT binary patch literal 3222 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 literal 0 HcmV?d00001 diff --git a/cmp-android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/cmp-android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..c607494bb995d1922bcd4d6f6b09446d42d9448c GIT binary patch literal 9136 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 literal 0 HcmV?d00001 diff --git a/androidApp/src/main/res/values/ic_launcher_background.xml b/cmp-android/src/main/res/values/ic_launcher_background.xml similarity index 87% rename from androidApp/src/main/res/values/ic_launcher_background.xml rename to cmp-android/src/main/res/values/ic_launcher_background.xml index 2c7f96d2a..1692997f7 100644 --- a/androidApp/src/main/res/values/ic_launcher_background.xml +++ b/cmp-android/src/main/res/values/ic_launcher_background.xml @@ -9,5 +9,5 @@ See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md --> - #F6F8F7 + #087EDB \ No newline at end of file diff --git a/androidApp/src/main/res/values/splash.xml b/cmp-android/src/main/res/values/splash.xml similarity index 66% rename from androidApp/src/main/res/values/splash.xml rename to cmp-android/src/main/res/values/splash.xml index 9ee17867e..4fe5e397b 100644 --- a/androidApp/src/main/res/values/splash.xml +++ b/cmp-android/src/main/res/values/splash.xml @@ -9,15 +9,16 @@ See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md --> - -

lY3eLT!zHBXz3-YVMh5-g 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