diff --git a/.github/actions/create-release-notes/action.yml b/.github/actions/create-release-notes/action.yml
index 6cc1e7464..be71adca7 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 ./androidApp/build/outputs/
+ mkdir -p ./cmp-android/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" > ./androidApp/build/outputs/changelogGithub
+ printf "$CHANGELOG" > ./cmp-android/build/outputs/changelogGithub
echo "Beta Changelog:"
git log --format="* %s" HEAD^..HEAD
- git log --format="* %s" HEAD^..HEAD > ./androidApp/build/outputs/changelogBeta
+ git log --format="* %s" HEAD^..HEAD > ./cmp-android/build/outputs/changelogBeta
diff --git a/.github/actions/inflate-secrets/action.yml b/.github/actions/inflate-secrets/action.yml
index 5ba553c3a..6462800dd 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 androidApp/google-services.json
+ cp .github/mock-google-services.json cmp-android/google-services.json
- name: Inflate release_keystore.keystore
shell: bash
env:
KEYSTORE: ${{ inputs.keystore }}
run: |
- echo $KEYSTORE | base64 --decode > androidApp/release_keystore.keystore
+ echo $KEYSTORE | base64 --decode > cmp-android/release_keystore.keystore
- name: Inflate google-services.json
shell: bash
env:
GOOGLE_SERVICES: ${{ inputs.google-services }}
run: |
- echo $GOOGLE_SERVICES > androidApp/google-services.json
+ echo $GOOGLE_SERVICES > cmp-android/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 c60d6093c..2dd36e834 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 :mifos-android:dependencyGuard
+ ./gradlew :cmp-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 :mifos-android:testDemoDebug
+ ./gradlew :cmp-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 :mifos-android:assembleDemoDebug
+ run: ./gradlew :cmp-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 36eba8093..3b173133c 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 :androidApp:assembleRelease
+ ./gradlew :cmp-android:assembleRelease
- name: Archive Build
uses: actions/upload-artifact@v4
@@ -89,8 +89,8 @@ jobs:
draft: false
prerelease: true
files: |
- ./androidApp/build/outputs/apk/release/androidApp-release.apk
- ./androidApp/build/outputs/version_code.txt
+ ./cmp-android/build/outputs/apk/release/androidApp-release.apk
+ ./cmp-android/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 :androidApp:bundleRelease
+ ./gradlew :cmp-android: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
new file mode 100644
index 000000000..99179a9e9
--- /dev/null
+++ b/.run/cmp-desktop.run.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+ 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
new file mode 100644
index 000000000..89a8b9653
--- /dev/null
+++ b/.run/cmp-web-js.run.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
new file mode 100644
index 000000000..386b684f3
--- /dev/null
+++ b/.run/cmp-web-wasm.run.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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 186e06fe7..f141851fb 100644
--- a/.run/mifospay-android.run.xml
+++ b/.run/mifospay-android.run.xml
@@ -1,6 +1,6 @@
-
-
+
+
diff --git a/.run/mifospay-desktop.run.xml b/.run/mifospay-desktop.run.xml
deleted file mode 100644
index d49ce6dd5..000000000
--- a/.run/mifospay-desktop.run.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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
deleted file mode 100644
index e2e9526dc..000000000
--- a/.run/mifospay-web-js.run.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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
deleted file mode 100644
index aedd38d67..000000000
--- a/.run/mifospay-web-wasm.run.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
- true
- false
- false
-
-
-
\ No newline at end of file
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/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/ci-prepush.bat b/ci-prepush.bat
index 337cb8b2d..863930a86 100644
--- a/ci-prepush.bat
+++ b/ci-prepush.bat
@@ -13,8 +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"
+call :run_gradle_task ":cmp-android:build"
+call :run_gradle_task ":cmp-android:updateProdReleaseBadging"
echo All checks and tests completed successfully.
exit /b 0
diff --git a/androidApp/.gitignore b/cmp-android/.gitignore
similarity index 100%
rename from androidApp/.gitignore
rename to cmp-android/.gitignore
diff --git a/androidApp/README.md b/cmp-android/README.md
similarity index 100%
rename from androidApp/README.md
rename to cmp-android/README.md
diff --git a/androidApp/build.gradle.kts b/cmp-android/build.gradle.kts
similarity index 95%
rename from androidApp/build.gradle.kts
rename to cmp-android/build.gradle.kts
index ef9a4850a..aff365bc0 100644
--- a/androidApp/build.gradle.kts
+++ b/cmp-android/build.gradle.kts
@@ -73,7 +73,7 @@ dependencyGuard {
dependencies {
- implementation (projects.shared)
+ implementation (projects.cmpShared)
implementation(projects.core.logs)
implementation(projects.core.common)
@@ -83,6 +83,7 @@ dependencies {
implementation(projects.core.ui)
implementation(projects.core.designsystem)
+ implementation(projects.feature.auth)
// implementation(projects.feature.loan)
// implementation(projects.feature.beneficiary)
// implementation(projects.feature.guarantor)
@@ -100,7 +101,6 @@ dependencies {
// implementation(projects.feature.settings)
// implementation(projects.feature.updatePassword)
// implementation(projects.feature.home)
- implementation(projects.feature.auth)
// implementation(projects.feature.userProfile)
// implementation(projects.libs.mifosPasscode)
@@ -125,7 +125,12 @@ dependencies {
implementation(libs.androidx.tracing.ktx)
implementation(libs.androidx.profileinstaller)
implementation(libs.google.oss.licenses)
- implementation(libs.androidx.multidex)
+// implementation(libs.androidx.multidex)
+
+ implementation(libs.koin.core)
+ implementation(libs.koin.android)
+ implementation(libs.koin.compose)
+ implementation(libs.koin.compose.viewmodel)
// testImplementation(projects.core.testing)
// testImplementation(libs.hilt.android.testing)
diff --git a/androidApp/debug_keystore.jks b/cmp-android/debug_keystore.jks
similarity index 100%
rename from androidApp/debug_keystore.jks
rename to cmp-android/debug_keystore.jks
diff --git a/androidApp/dependencies/demoDebugRuntimeClasspath.txt b/cmp-android/dependencies/demoDebugRuntimeClasspath.txt
similarity index 96%
rename from androidApp/dependencies/demoDebugRuntimeClasspath.txt
rename to cmp-android/dependencies/demoDebugRuntimeClasspath.txt
index e336f2ce5..4ae075bfb 100644
--- a/androidApp/dependencies/demoDebugRuntimeClasspath.txt
+++ b/cmp-android/dependencies/demoDebugRuntimeClasspath.txt
@@ -92,7 +92,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
@@ -211,20 +210,20 @@ 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-android:4.0.2
+io.insert-koin:koin-androidx-compose:4.0.2
+io.insert-koin:koin-androidx-navigation:4.0.2
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
-io.insert-koin:koin-compose-jvm:4.0.1-RC1
-io.insert-koin:koin-compose-viewmodel-jvm:4.0.1-RC1
-io.insert-koin:koin-compose-viewmodel:4.0.1-RC1
-io.insert-koin:koin-compose:4.0.1-RC1
-io.insert-koin:koin-core-jvm:4.0.1-RC1
-io.insert-koin:koin-core-viewmodel-jvm:4.0.1-RC1
-io.insert-koin:koin-core-viewmodel:4.0.1-RC1
-io.insert-koin:koin-core:4.0.1-RC1
+io.insert-koin:koin-bom:4.0.2
+io.insert-koin:koin-compose-jvm:4.0.2
+io.insert-koin:koin-compose-viewmodel-jvm:4.0.2
+io.insert-koin:koin-compose-viewmodel:4.0.2
+io.insert-koin:koin-compose:4.0.2
+io.insert-koin:koin-core-jvm:4.0.2
+io.insert-koin:koin-core-viewmodel-jvm:4.0.2
+io.insert-koin:koin-core-viewmodel:4.0.2
+io.insert-koin:koin-core:4.0.2
io.ktor:ktor-client-auth-jvm:3.0.3
io.ktor:ktor-client-auth:3.0.3
io.ktor:ktor-client-content-negotiation-jvm:3.0.3
@@ -293,13 +292,13 @@ 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-common: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
diff --git a/androidApp/dependencies/demoReleaseRuntimeClasspath.txt b/cmp-android/dependencies/demoReleaseRuntimeClasspath.txt
similarity index 95%
rename from androidApp/dependencies/demoReleaseRuntimeClasspath.txt
rename to cmp-android/dependencies/demoReleaseRuntimeClasspath.txt
index bb7db873c..a8a9d3540 100644
--- a/androidApp/dependencies/demoReleaseRuntimeClasspath.txt
+++ b/cmp-android/dependencies/demoReleaseRuntimeClasspath.txt
@@ -88,7 +88,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
@@ -207,20 +206,20 @@ 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-android:4.0.2
+io.insert-koin:koin-androidx-compose:4.0.2
+io.insert-koin:koin-androidx-navigation:4.0.2
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
-io.insert-koin:koin-compose-jvm:4.0.1-RC1
-io.insert-koin:koin-compose-viewmodel-jvm:4.0.1-RC1
-io.insert-koin:koin-compose-viewmodel:4.0.1-RC1
-io.insert-koin:koin-compose:4.0.1-RC1
-io.insert-koin:koin-core-jvm:4.0.1-RC1
-io.insert-koin:koin-core-viewmodel-jvm:4.0.1-RC1
-io.insert-koin:koin-core-viewmodel:4.0.1-RC1
-io.insert-koin:koin-core:4.0.1-RC1
+io.insert-koin:koin-bom:4.0.2
+io.insert-koin:koin-compose-jvm:4.0.2
+io.insert-koin:koin-compose-viewmodel-jvm:4.0.2
+io.insert-koin:koin-compose-viewmodel:4.0.2
+io.insert-koin:koin-compose:4.0.2
+io.insert-koin:koin-core-jvm:4.0.2
+io.insert-koin:koin-core-viewmodel-jvm:4.0.2
+io.insert-koin:koin-core-viewmodel:4.0.2
+io.insert-koin:koin-core:4.0.2
io.ktor:ktor-client-auth-jvm:3.0.3
io.ktor:ktor-client-auth:3.0.3
io.ktor:ktor-client-content-negotiation-jvm:3.0.3
@@ -289,13 +288,13 @@ 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-common: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
diff --git a/androidApp/dependencies/prodDebugRuntimeClasspath.txt b/cmp-android/dependencies/prodDebugRuntimeClasspath.txt
similarity index 96%
rename from androidApp/dependencies/prodDebugRuntimeClasspath.txt
rename to cmp-android/dependencies/prodDebugRuntimeClasspath.txt
index e336f2ce5..4ae075bfb 100644
--- a/androidApp/dependencies/prodDebugRuntimeClasspath.txt
+++ b/cmp-android/dependencies/prodDebugRuntimeClasspath.txt
@@ -92,7 +92,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
@@ -211,20 +210,20 @@ 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-android:4.0.2
+io.insert-koin:koin-androidx-compose:4.0.2
+io.insert-koin:koin-androidx-navigation:4.0.2
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
-io.insert-koin:koin-compose-jvm:4.0.1-RC1
-io.insert-koin:koin-compose-viewmodel-jvm:4.0.1-RC1
-io.insert-koin:koin-compose-viewmodel:4.0.1-RC1
-io.insert-koin:koin-compose:4.0.1-RC1
-io.insert-koin:koin-core-jvm:4.0.1-RC1
-io.insert-koin:koin-core-viewmodel-jvm:4.0.1-RC1
-io.insert-koin:koin-core-viewmodel:4.0.1-RC1
-io.insert-koin:koin-core:4.0.1-RC1
+io.insert-koin:koin-bom:4.0.2
+io.insert-koin:koin-compose-jvm:4.0.2
+io.insert-koin:koin-compose-viewmodel-jvm:4.0.2
+io.insert-koin:koin-compose-viewmodel:4.0.2
+io.insert-koin:koin-compose:4.0.2
+io.insert-koin:koin-core-jvm:4.0.2
+io.insert-koin:koin-core-viewmodel-jvm:4.0.2
+io.insert-koin:koin-core-viewmodel:4.0.2
+io.insert-koin:koin-core:4.0.2
io.ktor:ktor-client-auth-jvm:3.0.3
io.ktor:ktor-client-auth:3.0.3
io.ktor:ktor-client-content-negotiation-jvm:3.0.3
@@ -293,13 +292,13 @@ 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-common: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
diff --git a/androidApp/dependencies/prodReleaseRuntimeClasspath.txt b/cmp-android/dependencies/prodReleaseRuntimeClasspath.txt
similarity index 95%
rename from androidApp/dependencies/prodReleaseRuntimeClasspath.txt
rename to cmp-android/dependencies/prodReleaseRuntimeClasspath.txt
index bb7db873c..a8a9d3540 100644
--- a/androidApp/dependencies/prodReleaseRuntimeClasspath.txt
+++ b/cmp-android/dependencies/prodReleaseRuntimeClasspath.txt
@@ -88,7 +88,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
@@ -207,20 +206,20 @@ 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-android:4.0.2
+io.insert-koin:koin-androidx-compose:4.0.2
+io.insert-koin:koin-androidx-navigation:4.0.2
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
-io.insert-koin:koin-compose-jvm:4.0.1-RC1
-io.insert-koin:koin-compose-viewmodel-jvm:4.0.1-RC1
-io.insert-koin:koin-compose-viewmodel:4.0.1-RC1
-io.insert-koin:koin-compose:4.0.1-RC1
-io.insert-koin:koin-core-jvm:4.0.1-RC1
-io.insert-koin:koin-core-viewmodel-jvm:4.0.1-RC1
-io.insert-koin:koin-core-viewmodel:4.0.1-RC1
-io.insert-koin:koin-core:4.0.1-RC1
+io.insert-koin:koin-bom:4.0.2
+io.insert-koin:koin-compose-jvm:4.0.2
+io.insert-koin:koin-compose-viewmodel-jvm:4.0.2
+io.insert-koin:koin-compose-viewmodel:4.0.2
+io.insert-koin:koin-compose:4.0.2
+io.insert-koin:koin-core-jvm:4.0.2
+io.insert-koin:koin-core-viewmodel-jvm:4.0.2
+io.insert-koin:koin-core-viewmodel:4.0.2
+io.insert-koin:koin-core:4.0.2
io.ktor:ktor-client-auth-jvm:3.0.3
io.ktor:ktor-client-auth:3.0.3
io.ktor:ktor-client-content-negotiation-jvm:3.0.3
@@ -289,13 +288,13 @@ 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-common: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
diff --git a/androidApp/dependencies/releaseRuntimeClasspath.tree.txt b/cmp-android/dependencies/releaseRuntimeClasspath.tree.txt
similarity index 100%
rename from androidApp/dependencies/releaseRuntimeClasspath.tree.txt
rename to cmp-android/dependencies/releaseRuntimeClasspath.tree.txt
diff --git a/androidApp/dependencies/releaseRuntimeClasspath.txt b/cmp-android/dependencies/releaseRuntimeClasspath.txt
similarity index 100%
rename from androidApp/dependencies/releaseRuntimeClasspath.txt
rename to cmp-android/dependencies/releaseRuntimeClasspath.txt
diff --git a/androidApp/fabric.properties b/cmp-android/fabric.properties
similarity index 100%
rename from androidApp/fabric.properties
rename to cmp-android/fabric.properties
diff --git a/androidApp/google-services.json b/cmp-android/google-services.json
similarity index 100%
rename from androidApp/google-services.json
rename to cmp-android/google-services.json
diff --git a/androidApp/lint-baseline.xml b/cmp-android/lint-baseline.xml
similarity index 100%
rename from androidApp/lint-baseline.xml
rename to cmp-android/lint-baseline.xml
diff --git a/androidApp/proguard-rules.pro b/cmp-android/proguard-rules.pro
similarity index 100%
rename from androidApp/proguard-rules.pro
rename to cmp-android/proguard-rules.pro
diff --git a/androidApp/release-badging.txt b/cmp-android/release-badging.txt
similarity index 100%
rename from androidApp/release-badging.txt
rename to cmp-android/release-badging.txt
diff --git a/androidApp/src/androidTest/kotlin/org/mifos/mobile/ApplicationTest.kt b/cmp-android/src/androidTest/kotlin/org/mifos/mobile/ApplicationTest.kt
similarity index 100%
rename from androidApp/src/androidTest/kotlin/org/mifos/mobile/ApplicationTest.kt
rename to cmp-android/src/androidTest/kotlin/org/mifos/mobile/ApplicationTest.kt
diff --git a/androidApp/src/main/AndroidManifest.xml b/cmp-android/src/main/AndroidManifest.xml
similarity index 97%
rename from androidApp/src/main/AndroidManifest.xml
rename to cmp-android/src/main/AndroidManifest.xml
index a7eb8a779..14ca4f5cf 100644
--- a/androidApp/src/main/AndroidManifest.xml
+++ b/cmp-android/src/main/AndroidManifest.xml
@@ -28,7 +28,7 @@
diff --git a/androidApp/src/main/ic_launcher-playstore.png b/cmp-android/src/main/ic_launcher-playstore.png
similarity index 100%
rename from androidApp/src/main/ic_launcher-playstore.png
rename to cmp-android/src/main/ic_launcher-playstore.png
diff --git a/cmp-android/src/main/kotlin/org/mifos/mobile/AndroidApp.kt b/cmp-android/src/main/kotlin/org/mifos/mobile/AndroidApp.kt
new file mode 100644
index 000000000..4cf98aca9
--- /dev/null
+++ b/cmp-android/src/main/kotlin/org/mifos/mobile/AndroidApp.kt
@@ -0,0 +1,29 @@
+/*
+ * 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.app.Application
+import org.koin.android.ext.koin.androidContext
+import org.koin.android.ext.koin.androidLogger
+import org.koin.core.context.GlobalContext.startKoin
+import org.koin.core.logger.Level
+import org.mifos.mobile.shared.di.KoinModules
+
+class AndroidApp : Application() {
+ override fun onCreate() {
+ super.onCreate()
+
+ startKoin {
+ androidContext(this@AndroidApp)
+ androidLogger(Level.DEBUG)
+ modules(KoinModules.allModules)
+ }
+ }
+}
diff --git a/cmp-android/src/main/kotlin/org/mifos/mobile/MainActivity.kt b/cmp-android/src/main/kotlin/org/mifos/mobile/MainActivity.kt
new file mode 100644
index 000000000..58f088b6e
--- /dev/null
+++ b/cmp-android/src/main/kotlin/org/mifos/mobile/MainActivity.kt
@@ -0,0 +1,71 @@
+/*
+ * 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.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.launch
+import org.koin.android.ext.android.inject
+import org.mifos.mobile.core.data.util.NetworkMonitor
+import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme
+import org.mifos.mobile.shared.MainUiState
+import org.mifos.mobile.shared.MifosMobileSharedApp
+import org.mifos.mobile.shared.MifosMobileViewModel
+
+class MainActivity : ComponentActivity() {
+
+ private val networkMonitor: NetworkMonitor by inject()
+
+ private val viewModel: MifosMobileViewModel by inject()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val splashScreen = installSplashScreen()
+ var uiState: MainUiState by mutableStateOf(MainUiState.Loading)
+
+ lifecycleScope.launch {
+ lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
+ viewModel.uiState
+ .onEach { uiState = it }
+ .collect()
+ }
+ }
+
+ splashScreen.setKeepOnScreenCondition {
+ when (uiState) {
+ MainUiState.Loading -> true
+ is MainUiState.Error -> true
+ is MainUiState.Success -> false
+ }
+ }
+
+ enableEdgeToEdge()
+
+ setContent {
+ CompositionLocalProvider {
+ MifosMobileTheme {
+ MifosMobileSharedApp(networkMonitor = networkMonitor)
+ }
+ }
+ }
+ }
+}
diff --git a/androidApp/src/main/res/drawable/mifos_logo.png b/cmp-android/src/main/res/drawable/mifos_logo.png
similarity index 100%
rename from androidApp/src/main/res/drawable/mifos_logo.png
rename to cmp-android/src/main/res/drawable/mifos_logo.png
diff --git a/androidApp/src/main/res/drawable/mifos_splash_screen_logo.png b/cmp-android/src/main/res/drawable/mifos_splash_screen_logo.png
similarity index 100%
rename from androidApp/src/main/res/drawable/mifos_splash_screen_logo.png
rename to cmp-android/src/main/res/drawable/mifos_splash_screen_logo.png
diff --git a/androidApp/src/main/res/drawable/splash_icon.xml b/cmp-android/src/main/res/drawable/splash_icon.xml
similarity index 100%
rename from androidApp/src/main/res/drawable/splash_icon.xml
rename to cmp-android/src/main/res/drawable/splash_icon.xml
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 100%
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
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 100%
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
diff --git a/androidApp/src/main/res/mipmap-hdpi/ic_launcher.webp b/cmp-android/src/main/res/mipmap-hdpi/ic_launcher.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-hdpi/ic_launcher.webp
rename to cmp-android/src/main/res/mipmap-hdpi/ic_launcher.webp
diff --git a/androidApp/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/cmp-android/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
rename to cmp-android/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
diff --git a/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/cmp-android/src/main/res/mipmap-hdpi/ic_launcher_round.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.webp
rename to cmp-android/src/main/res/mipmap-hdpi/ic_launcher_round.webp
diff --git a/androidApp/src/main/res/mipmap-mdpi/ic_launcher.webp b/cmp-android/src/main/res/mipmap-mdpi/ic_launcher.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-mdpi/ic_launcher.webp
rename to cmp-android/src/main/res/mipmap-mdpi/ic_launcher.webp
diff --git a/androidApp/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/cmp-android/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
rename to cmp-android/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
diff --git a/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/cmp-android/src/main/res/mipmap-mdpi/ic_launcher_round.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.webp
rename to cmp-android/src/main/res/mipmap-mdpi/ic_launcher_round.webp
diff --git a/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.webp b/cmp-android/src/main/res/mipmap-xhdpi/ic_launcher.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-xhdpi/ic_launcher.webp
rename to cmp-android/src/main/res/mipmap-xhdpi/ic_launcher.webp
diff --git a/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/cmp-android/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
rename to cmp-android/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
diff --git a/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/cmp-android/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
rename to cmp-android/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
diff --git a/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/cmp-android/src/main/res/mipmap-xxhdpi/ic_launcher.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.webp
rename to cmp-android/src/main/res/mipmap-xxhdpi/ic_launcher.webp
diff --git a/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/cmp-android/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
rename to cmp-android/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
diff --git a/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/cmp-android/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
rename to cmp-android/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
diff --git a/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/cmp-android/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
rename to cmp-android/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
diff --git a/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/cmp-android/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
rename to cmp-android/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
diff --git a/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/cmp-android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
similarity index 100%
rename from androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
rename to cmp-android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
diff --git a/androidApp/src/main/res/values-ar/strings.xml b/cmp-android/src/main/res/values-ar/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-ar/strings.xml
rename to cmp-android/src/main/res/values-ar/strings.xml
diff --git a/androidApp/src/main/res/values-bn/strings.xml b/cmp-android/src/main/res/values-bn/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-bn/strings.xml
rename to cmp-android/src/main/res/values-bn/strings.xml
diff --git a/androidApp/src/main/res/values-es/strings.xml b/cmp-android/src/main/res/values-es/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-es/strings.xml
rename to cmp-android/src/main/res/values-es/strings.xml
diff --git a/androidApp/src/main/res/values-fa-rAF/strings.xml b/cmp-android/src/main/res/values-fa-rAF/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-fa-rAF/strings.xml
rename to cmp-android/src/main/res/values-fa-rAF/strings.xml
diff --git a/androidApp/src/main/res/values-fr/strings.xml b/cmp-android/src/main/res/values-fr/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-fr/strings.xml
rename to cmp-android/src/main/res/values-fr/strings.xml
diff --git a/androidApp/src/main/res/values-hi/strings.xml b/cmp-android/src/main/res/values-hi/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-hi/strings.xml
rename to cmp-android/src/main/res/values-hi/strings.xml
diff --git a/androidApp/src/main/res/values-in/strings.xml b/cmp-android/src/main/res/values-in/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-in/strings.xml
rename to cmp-android/src/main/res/values-in/strings.xml
diff --git a/androidApp/src/main/res/values-km/strings.xml b/cmp-android/src/main/res/values-km/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-km/strings.xml
rename to cmp-android/src/main/res/values-km/strings.xml
diff --git a/androidApp/src/main/res/values-kn/strings.xml b/cmp-android/src/main/res/values-kn/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-kn/strings.xml
rename to cmp-android/src/main/res/values-kn/strings.xml
diff --git a/androidApp/src/main/res/values-my/strings.xml b/cmp-android/src/main/res/values-my/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-my/strings.xml
rename to cmp-android/src/main/res/values-my/strings.xml
diff --git a/androidApp/src/main/res/values-pl/strings.xml b/cmp-android/src/main/res/values-pl/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-pl/strings.xml
rename to cmp-android/src/main/res/values-pl/strings.xml
diff --git a/androidApp/src/main/res/values-pt/strings.xml b/cmp-android/src/main/res/values-pt/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-pt/strings.xml
rename to cmp-android/src/main/res/values-pt/strings.xml
diff --git a/androidApp/src/main/res/values-ru/strings.xml b/cmp-android/src/main/res/values-ru/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-ru/strings.xml
rename to cmp-android/src/main/res/values-ru/strings.xml
diff --git a/androidApp/src/main/res/values-sw/strings.xml b/cmp-android/src/main/res/values-sw/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-sw/strings.xml
rename to cmp-android/src/main/res/values-sw/strings.xml
diff --git a/androidApp/src/main/res/values-te/strings.xml b/cmp-android/src/main/res/values-te/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-te/strings.xml
rename to cmp-android/src/main/res/values-te/strings.xml
diff --git a/androidApp/src/main/res/values-ur/strings.xml b/cmp-android/src/main/res/values-ur/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values-ur/strings.xml
rename to cmp-android/src/main/res/values-ur/strings.xml
diff --git a/androidApp/src/main/res/values/colors.xml b/cmp-android/src/main/res/values/colors.xml
similarity index 100%
rename from androidApp/src/main/res/values/colors.xml
rename to cmp-android/src/main/res/values/colors.xml
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 100%
rename from androidApp/src/main/res/values/ic_launcher_background.xml
rename to cmp-android/src/main/res/values/ic_launcher_background.xml
diff --git a/androidApp/src/main/res/values/splash.xml b/cmp-android/src/main/res/values/splash.xml
similarity index 100%
rename from androidApp/src/main/res/values/splash.xml
rename to cmp-android/src/main/res/values/splash.xml
diff --git a/androidApp/src/main/res/values/strings.xml b/cmp-android/src/main/res/values/strings.xml
similarity index 100%
rename from androidApp/src/main/res/values/strings.xml
rename to cmp-android/src/main/res/values/strings.xml
diff --git a/androidApp/src/main/res/xml/fileproviderpath.xml b/cmp-android/src/main/res/xml/fileproviderpath.xml
similarity index 100%
rename from androidApp/src/main/res/xml/fileproviderpath.xml
rename to cmp-android/src/main/res/xml/fileproviderpath.xml
diff --git a/androidApp/src/release/res/values/api_keys.xml b/cmp-android/src/release/res/values/api_keys.xml
similarity index 100%
rename from androidApp/src/release/res/values/api_keys.xml
rename to cmp-android/src/release/res/values/api_keys.xml
diff --git a/cmp-desktop/.gitignore b/cmp-desktop/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/cmp-desktop/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/cmp-desktop/build.gradle.kts b/cmp-desktop/build.gradle.kts
new file mode 100644
index 000000000..503edb525
--- /dev/null
+++ b/cmp-desktop/build.gradle.kts
@@ -0,0 +1,84 @@
+import org.jetbrains.compose.desktop.application.dsl.TargetFormat
+
+plugins {
+ alias(libs.plugins.kotlinMultiplatform)
+ alias(libs.plugins.compose.compiler)
+ alias(libs.plugins.jetbrainsCompose)
+ alias(libs.plugins.kotlin.serialization)
+}
+
+kotlin {
+ jvm("desktop") {
+ withJava()
+ }
+
+ jvmToolchain(17)
+
+ sourceSets {
+ val desktopMain by getting {
+ dependencies {
+ implementation(projects.core.common)
+ implementation(projects.core.data)
+ implementation(projects.core.model)
+ implementation(projects.core.datastore)
+
+ implementation(projects.cmpShared)
+
+ implementation(libs.kotlinx.coroutines.swing)
+ implementation(compose.desktop.currentOs)
+ implementation(libs.jb.kotlin.stdlib)
+ implementation(libs.kotlin.reflect)
+ }
+ }
+ }
+}
+
+val packageName: String = libs.versions.packageName.get()
+val packageNameSpace: String = libs.versions.packageNamespace.get()
+val packageVersion: String = libs.versions.packageVersion.get()
+
+compose.desktop {
+ application {
+ mainClass = "MainKt"
+ nativeDistributions {
+ targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Exe, TargetFormat.Deb)
+ packageName = this@Build_gradle.packageName
+ packageVersion = this@Build_gradle.packageVersion
+ description = "Mifos Mobile Desktop Application"
+ copyright = "© 2024 Mifos Initiative. All rights reserved."
+ vendor = "Mifos Initiative"
+ licenseFile.set(project.file("../LICENSE"))
+ includeAllModules = true
+
+ macOS {
+ bundleID = packageNameSpace
+ dockName = this@Build_gradle.packageName
+ iconFile.set(project.file("icons/ic_launcher.icns"))
+ notarization {
+ val providers = project.providers
+ appleID.set(providers.environmentVariable("NOTARIZATION_APPLE_ID"))
+ password.set(providers.environmentVariable("NOTARIZATION_PASSWORD"))
+ teamID.set(providers.environmentVariable("NOTARIZATION_TEAM_ID"))
+ }
+ }
+
+ windows {
+ menuGroup = this@Build_gradle.packageName
+ shortcut = true
+ dirChooser = true
+ perUserInstall = true
+ iconFile.set(project.file("icons/ic_launcher.ico"))
+ }
+
+ linux {
+ modules("jdk.security.auth")
+ iconFile.set(project.file("icons/ic_launcher.png"))
+ }
+ }
+ buildTypes.release.proguard {
+ configurationFiles.from(file("compose-desktop.pro"))
+ obfuscate.set(true)
+ optimize.set(true)
+ }
+ }
+}
diff --git a/cmp-desktop/icons/ic_launcher.icns b/cmp-desktop/icons/ic_launcher.icns
new file mode 100644
index 000000000..268dab0ce
Binary files /dev/null and b/cmp-desktop/icons/ic_launcher.icns differ
diff --git a/cmp-desktop/icons/ic_launcher.ico b/cmp-desktop/icons/ic_launcher.ico
new file mode 100644
index 000000000..4c553d438
Binary files /dev/null and b/cmp-desktop/icons/ic_launcher.ico differ
diff --git a/cmp-desktop/icons/ic_launcher.png b/cmp-desktop/icons/ic_launcher.png
new file mode 100644
index 000000000..4a515337a
Binary files /dev/null and b/cmp-desktop/icons/ic_launcher.png differ
diff --git a/cmp-desktop/proguard-rules.pro b/cmp-desktop/proguard-rules.pro
new file mode 100644
index 000000000..481bb4348
--- /dev/null
+++ b/cmp-desktop/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-desktop/src/desktopMain/kotlin/main.kt b/cmp-desktop/src/desktopMain/kotlin/main.kt
new file mode 100644
index 000000000..752ad3177
--- /dev/null
+++ b/cmp-desktop/src/desktopMain/kotlin/main.kt
@@ -0,0 +1,19 @@
+import androidx.compose.ui.window.Window
+import androidx.compose.ui.window.application
+import androidx.compose.ui.window.rememberWindowState
+import org.mifos.mobile.shared.di.initKoin
+import org.mifos.mobile.shared.MifosMobileSharedApp
+
+fun main() {
+ application {
+ initKoin()
+ val windowState = rememberWindowState()
+ Window(
+ onCloseRequest = ::exitApplication,
+ state = windowState,
+ title = "MifosMobile",
+ ) {
+ MifosMobileSharedApp()
+ }
+ }
+}
diff --git a/iosApp/iosApp.xcodeproj/project.pbxproj b/cmp-ios/iosApp.xcodeproj/project.pbxproj
similarity index 100%
rename from iosApp/iosApp.xcodeproj/project.pbxproj
rename to cmp-ios/iosApp.xcodeproj/project.pbxproj
diff --git a/iosApp/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/cmp-ios/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from iosApp/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
rename to cmp-ios/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/cmp-ios/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
similarity index 100%
rename from iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
rename to cmp-ios/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
diff --git a/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate b/cmp-ios/iosApp.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate
similarity index 100%
rename from iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate
rename to cmp-ios/iosApp.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate
diff --git a/iosApp/iosApp.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist b/cmp-ios/iosApp.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist
similarity index 100%
rename from iosApp/iosApp.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist
rename to cmp-ios/iosApp.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist
diff --git a/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json b/cmp-ios/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json
similarity index 100%
rename from iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json
rename to cmp-ios/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json
diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/cmp-ios/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json
similarity index 100%
rename from iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json
rename to cmp-ios/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json
diff --git a/iosApp/iosApp/Assets.xcassets/Contents.json b/cmp-ios/iosApp/Assets.xcassets/Contents.json
similarity index 100%
rename from iosApp/iosApp/Assets.xcassets/Contents.json
rename to cmp-ios/iosApp/Assets.xcassets/Contents.json
diff --git a/iosApp/iosApp/ContentView.swift b/cmp-ios/iosApp/ContentView.swift
similarity index 100%
rename from iosApp/iosApp/ContentView.swift
rename to cmp-ios/iosApp/ContentView.swift
diff --git a/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json b/cmp-ios/iosApp/Preview Content/Preview Assets.xcassets/Contents.json
similarity index 100%
rename from iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json
rename to cmp-ios/iosApp/Preview Content/Preview Assets.xcassets/Contents.json
diff --git a/iosApp/iosApp/iosAppApp.swift b/cmp-ios/iosApp/iosAppApp.swift
similarity index 100%
rename from iosApp/iosApp/iosAppApp.swift
rename to cmp-ios/iosApp/iosAppApp.swift
diff --git a/shared/README.md b/cmp-shared/README.md
similarity index 100%
rename from shared/README.md
rename to cmp-shared/README.md
diff --git a/shared/build.gradle.kts b/cmp-shared/build.gradle.kts
similarity index 56%
rename from shared/build.gradle.kts
rename to cmp-shared/build.gradle.kts
index a7ba5874b..62f1a81fd 100644
--- a/shared/build.gradle.kts
+++ b/cmp-shared/build.gradle.kts
@@ -1,41 +1,49 @@
+/*
+ * 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.kotlinMultiplatform)
+ alias(libs.plugins.mifos.kmp.library)
+ alias(libs.plugins.mifos.cmp.feature)
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 = "shared"
+ baseName = "ComposeApp"
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)
}
- commonTest.dependencies {
+ desktopMain.dependencies {
+ implementation(compose.desktop.currentOs)
+ implementation(compose.desktop.common)
}
}
task("testClasses")
diff --git a/cmp-shared/src/commonMain/composeResources/values/strings.xml b/cmp-shared/src/commonMain/composeResources/values/strings.xml
new file mode 100644
index 000000000..aaf15c154
--- /dev/null
+++ b/cmp-shared/src/commonMain/composeResources/values/strings.xml
@@ -0,0 +1,13 @@
+
+
+
+ ⚠️ 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 000000000..4c553d438
Binary files /dev/null and b/cmp-web/src/jsMain/resources/favicon.ico differ
diff --git a/cmp-web/src/jsMain/resources/index.html b/cmp-web/src/jsMain/resources/index.html
new file mode 100644
index 000000000..61090e6cb
--- /dev/null
+++ b/cmp-web/src/jsMain/resources/index.html
@@ -0,0 +1,43 @@
+
+
+
+
+ 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 000000000..4c553d438
Binary files /dev/null and b/cmp-web/src/wasmJsMain/resources/favicon.ico differ
diff --git a/cmp-web/src/wasmJsMain/resources/index.html b/cmp-web/src/wasmJsMain/resources/index.html
new file mode 100644
index 000000000..b7904f23e
--- /dev/null
+++ b/cmp-web/src/wasmJsMain/resources/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+ 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/data/src/commonMain/kotlin/org/mifos/mobile/core/data/repositoryImpl/ClientChargeRepositoryImp.kt b/core/data/src/commonMain/kotlin/org/mifos/mobile/core/data/repositoryImpl/ClientChargeRepositoryImp.kt
index 2676a0841..71cfc6117 100644
--- a/core/data/src/commonMain/kotlin/org/mifos/mobile/core/data/repositoryImpl/ClientChargeRepositoryImp.kt
+++ b/core/data/src/commonMain/kotlin/org/mifos/mobile/core/data/repositoryImpl/ClientChargeRepositoryImp.kt
@@ -14,8 +14,6 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.withContext
-import org.mifos.mobile.core.common.Dispatcher
-import org.mifos.mobile.core.common.MifosDispatchers
import org.mifos.mobile.core.data.repository.ClientChargeRepository
import org.mifos.mobile.core.model.entity.Charge
import org.mifos.mobile.core.model.entity.Page
@@ -26,7 +24,6 @@ import org.mifospay.core.common.asDataStateFlow
class ClientChargeRepositoryImp(
private val dataManager: DataManager,
// private val chargeDao: ChargeDao,
- @Dispatcher(MifosDispatchers.IO)
private val ioDispatcher: CoroutineDispatcher,
) : ClientChargeRepository {
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