From b048b90332a52be37a4f541192a2edce7df49601 Mon Sep 17 00:00:00 2001 From: joaomanaia Date: Fri, 28 Jun 2024 15:17:02 +0100 Subject: [PATCH 01/13] Update dependencies --- gradle/libs.versions.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 41aa51c..dd66fbb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,16 +3,16 @@ androidGradlePlugin = "8.5.0" androidxCoreKtx = "1.13.1" androidxDataStore = "1.1.1" -androidxNavigation = "2.8.0-beta03" -androidxSplashscreen = "1.0.0" +androidxNavigation = "2.8.0-beta04" +androidxSplashscreen = "1.0.1" activityCompose = "1.9.0" assertk = "0.28.1" composeBom = "2024.06.00" constraintlayoutCompose = "1.0.1" lifecycleRuntimeKtx = "2.6.1" kotlin = "2.0.0" -kotlinxSerializationJson = "1.6.3" -ksp = "2.0.0-1.0.21" +kotlinxSerializationJson = "1.7.0" +ksp = "2.0.0-1.0.22" googleMaterial = "1.12.0" hilt = "2.51.1" hiltAndroidx = "1.2.0" From 2c792900ac02048905291ab6b19eafd031bf1845 Mon Sep 17 00:00:00 2001 From: joaomanaia Date: Fri, 28 Jun 2024 16:13:37 +0100 Subject: [PATCH 02/13] Start migrating to multiplatform --- app/build.gradle.kts | 14 +-- build.gradle.kts | 2 + composeApp/build.gradle.kts | 108 ++++++++++++++++++ .../composeapp/generated/resources/Res.kt | 49 ++++++++ gradle.properties | 2 +- gradle/libs.versions.toml | 21 ++-- lint.xml | 6 - settings.gradle.kts | 1 + 8 files changed, 182 insertions(+), 21 deletions(-) create mode 100644 composeApp/build.gradle.kts create mode 100644 composeApp/build/generated/compose/resourceGenerator/kotlin/commonResClass/game2048/composeapp/generated/resources/Res.kt delete mode 100644 lint.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c55b82b..ed278ac 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -64,16 +64,16 @@ dependencies { implementation(libs.androidx.activity.compose) implementation(platform(libs.androidx.compose.bom)) - implementation(libs.androidx.ui) - implementation(libs.androidx.ui.graphics) - implementation(libs.androidx.ui.tooling.preview) - implementation(libs.androidx.material3) - implementation(libs.androidx.material.iconsExtended) + implementation(libs.androidx.compose.ui) + implementation(libs.androidx.compose.ui.graphics) + implementation(libs.androidx.compose.ui.tooling.preview) + implementation(libs.androidx.compose.material3) + implementation(libs.androidx.compose.material.iconsExtended) implementation(libs.androidx.navigation.compose) - debugImplementation(libs.androidx.ui.tooling) - debugImplementation(libs.androidx.ui.test.manifest) + debugImplementation(libs.androidx.compose.ui.tooling) + debugImplementation(libs.androidx.compose.ui.test.manifest) implementation(libs.google.material) diff --git a/build.gradle.kts b/build.gradle.kts index a59a997..03ad0b7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,10 @@ plugins { alias(libs.plugins.android.application) apply false + alias(libs.plugins.kotlin.multiplatform) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.serialization) apply false alias(libs.plugins.compose.compiler) apply false + alias(libs.plugins.jetbrainsCompose) apply false alias(libs.plugins.ksp) apply false alias(libs.plugins.hilt) apply false } diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts new file mode 100644 index 0000000..5fd6bc9 --- /dev/null +++ b/composeApp/build.gradle.kts @@ -0,0 +1,108 @@ +import org.jetbrains.compose.desktop.application.dsl.TargetFormat +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + alias(libs.plugins.kotlin.multiplatform) + alias(libs.plugins.android.application) + alias(libs.plugins.jetbrainsCompose) + alias(libs.plugins.compose.compiler) +} + +kotlin { + androidTarget { + @OptIn(ExperimentalKotlinGradlePluginApi::class) + compilerOptions { + jvmTarget.set(JvmTarget.JVM_17) + freeCompilerArgs.add("-opt-in=kotlin.RequiresOptIn") + } + } + + jvm("desktop") + + jvmToolchain(17) + + sourceSets { + val desktopMain by getting + + commonMain.dependencies { + implementation(compose.runtime) + implementation(compose.foundation) + implementation(compose.material3) + implementation(compose.ui) + implementation(compose.components.resources) + + implementation(libs.kotlinx.coroutines.core) + } + + androidMain.dependencies { + implementation(libs.androidx.compose.ui.tooling.preview) + implementation(libs.androidx.activity.compose) + + + implementation(libs.kotlinx.coroutines.android) + } + + desktopMain.dependencies { + implementation(compose.desktop.currentOs) + + implementation(libs.kotlinx.coroutines.swing) + } + } +} + +composeCompiler { + enableStrongSkippingMode = true +} + +android { + namespace = "com.joaomanaia.game2048" + compileSdk = 34 + + defaultConfig { + applicationId = "com.joaomanaia.game2048" + minSdk = 21 + targetSdk = 34 + versionCode = 2 + versionName = "2.0.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + + vectorDrawables { + useSupportLibrary = true + } + } + + buildTypes { + release { + isMinifyEnabled = true + isShrinkResources = true + isDebuggable = false + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + buildFeatures { + compose = true + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +compose.desktop { + application { + mainClass = "MainKt" + + nativeDistributions { + targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) + packageName = "Game 2048" + packageVersion = "2.0.0" + } + } +} diff --git a/composeApp/build/generated/compose/resourceGenerator/kotlin/commonResClass/game2048/composeapp/generated/resources/Res.kt b/composeApp/build/generated/compose/resourceGenerator/kotlin/commonResClass/game2048/composeapp/generated/resources/Res.kt new file mode 100644 index 0000000..dd15e92 --- /dev/null +++ b/composeApp/build/generated/compose/resourceGenerator/kotlin/commonResClass/game2048/composeapp/generated/resources/Res.kt @@ -0,0 +1,49 @@ +@file:OptIn( + org.jetbrains.compose.resources.InternalResourceApi::class, + org.jetbrains.compose.resources.ExperimentalResourceApi::class, +) + +package game2048.composeapp.generated.resources + +import kotlin.ByteArray +import kotlin.OptIn +import kotlin.String +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.getResourceUri +import org.jetbrains.compose.resources.readResourceBytes + +internal object Res { + /** + * Reads the content of the resource file at the specified path and returns it as a byte array. + * + * Example: `val bytes = Res.readBytes("files/key.bin")` + * + * @param path The path of the file to read in the compose resource's directory. + * @return The content of the file as a byte array. + */ + @ExperimentalResourceApi + public suspend fun readBytes(path: String): ByteArray = + readResourceBytes("composeResources/game2048.composeapp.generated.resources/" + path) + + /** + * Returns the URI string of the resource file at the specified path. + * + * Example: `val uri = Res.getUri("files/key.bin")` + * + * @param path The path of the file in the compose resource's directory. + * @return The URI string of the file. + */ + @ExperimentalResourceApi + public fun getUri(path: String): String = + getResourceUri("composeResources/game2048.composeapp.generated.resources/" + path) + + public object drawable + + public object string + + public object array + + public object plurals + + public object font +} diff --git a/gradle.properties b/gradle.properties index ab47632..44890be 100644 --- a/gradle.properties +++ b/gradle.properties @@ -36,4 +36,4 @@ org.gradle.parallel=true kotlin.incremental=true org.gradle.unsafe.configuration-cache=true -android.nonFinalResIds=false \ No newline at end of file +android.nonFinalResIds=false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dd66fbb..2c565f3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,11 +7,13 @@ androidxNavigation = "2.8.0-beta04" androidxSplashscreen = "1.0.1" activityCompose = "1.9.0" assertk = "0.28.1" +compose-plugin = "1.6.11" composeBom = "2024.06.00" constraintlayoutCompose = "1.0.1" lifecycleRuntimeKtx = "2.6.1" kotlin = "2.0.0" kotlinxSerializationJson = "1.7.0" +kotlinxCoroutines = "1.9.0-RC" ksp = "2.0.0-1.0.22" googleMaterial = "1.12.0" hilt = "2.51.1" @@ -28,19 +30,22 @@ androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecyc androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } androidx-constraintlayout-compose = { module = "androidx.constraintlayout:constraintlayout-compose", version.ref = "constraintlayoutCompose" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } -androidx-ui = { group = "androidx.compose.ui", name = "ui" } -androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } -androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } -androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } -androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } -androidx-material3 = { group = "androidx.compose.material3", name = "material3" } -androidx-material-iconsExtended = { group = "androidx.compose.material", name = "material-icons-extended" } +androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" } +androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-compose-material-iconsExtended = { group = "androidx.compose.material", name = "material-icons-extended" } androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "androidxNavigation" } assertk = { module = "com.willowtreeapps.assertk:assertk", version.ref = "assertk" } hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" } hilt-android-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt" } hilt-navigationCompose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "hiltAndroidx" } kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } +kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" } +kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinxCoroutines" } +kotlinx-coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinxCoroutines" } google-material = { group = "com.google.android.material", name = "material", version.ref = "googleMaterial" } junit-jupiter-params = { group = "org.junit.jupiter", name = "junit-jupiter-params", version.ref = "junitJupiter" } materialKolor = { module = "com.materialkolor:material-kolor", version.ref = "materialKolor" } @@ -49,7 +54,9 @@ materialKolor = { module = "com.materialkolor:material-kolor", version.ref = "ma android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } diff --git a/lint.xml b/lint.xml deleted file mode 100644 index 9b1f16a..0000000 --- a/lint.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index d906dca..e8040f7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -14,4 +14,5 @@ dependencyResolutionManagement { } rootProject.name = "Game2048" +include(":composeApp") include(":app") From a1a18d712a904f6009b67077fe3c496b01815059 Mon Sep 17 00:00:00 2001 From: joaomanaia Date: Fri, 28 Jun 2024 18:48:58 +0100 Subject: [PATCH 03/13] Moved theme to commonMain --- .gitignore | 23 +++ .idea/deploymentTargetSelector.xml | 3 + .idea/gradle.xml | 2 +- composeApp/build.gradle.kts | 34 +++- .../src/androidMain/AndroidManifest.xml | 22 +++ .../com/joaomanaia/game2048/Game2048App.kt | 5 + .../com/joaomanaia/game2048/MainActivity.kt | 5 + .../core/presentation/theme/Theme.android.kt | 66 +++++++ .../theme/WallpaperColors.android.kt | 73 ++++++++ .../drawable-v24/ic_launcher_foreground.xml | 30 ++++ .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++++ .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1815 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 2987 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3822 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1229 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 1728 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2363 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2558 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 4373 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5566 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4048 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 7479 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 8890 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5881 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 11795 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 13073 bytes .../src/androidMain/res/values-es/strings.xml | 16 ++ .../src/androidMain/res/values-fr/strings.xml | 16 ++ .../androidMain/res/values-night/themes.xml | 8 + .../src/androidMain/res/values-pt/strings.xml | 16 ++ .../src/androidMain/res/values/colors.xml | 58 ++++++ .../res/values/ic_launcher_background.xml | 4 + .../src/androidMain/res/values/strings.xml | 16 ++ .../src/androidMain/res/values/themes.xml | 15 ++ .../game2048/core/navigation/Screen.kt | 3 + .../game2048/core/presentation/theme/Color.kt | 62 +++++++ .../presentation/theme/DarkThemeConfig.kt | 19 ++ .../core/presentation/theme/Spacing.kt | 36 ++++ .../game2048/core/presentation/theme/Theme.kt | 74 ++++++++ .../presentation/theme/TileColorsGenerator.kt | 67 +++++++ .../game2048/core/presentation/theme/Type.kt | 5 + .../presentation/theme/WallpaperColors.kt | 15 ++ .../com/joaomanaia/game2048/model/Cell.kt | 12 ++ .../joaomanaia/game2048/model/Direction.kt | 11 ++ .../com/joaomanaia/game2048/model/Grid.kt | 3 + .../com/joaomanaia/game2048/model/GridTile.kt | 12 ++ .../game2048/model/GridTileMovement.kt | 35 ++++ .../com/joaomanaia/game2048/model/HslColor.kt | 66 +++++++ .../com/joaomanaia/game2048/model/Tile.kt | 34 ++++ .../core/presentation/theme/Theme.desktop.kt | 38 ++++ .../theme/WallpaperColors.desktop.kt | 9 + gradle/libs.versions.toml | 5 + settings.gradle.kts | 1 - 53 files changed, 1086 insertions(+), 3 deletions(-) create mode 100644 composeApp/src/androidMain/AndroidManifest.xml create mode 100644 composeApp/src/androidMain/kotlin/com/joaomanaia/game2048/Game2048App.kt create mode 100644 composeApp/src/androidMain/kotlin/com/joaomanaia/game2048/MainActivity.kt create mode 100644 composeApp/src/androidMain/kotlin/com/joaomanaia/game2048/core/presentation/theme/Theme.android.kt create mode 100644 composeApp/src/androidMain/kotlin/com/joaomanaia/game2048/core/presentation/theme/WallpaperColors.android.kt create mode 100644 composeApp/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 composeApp/src/androidMain/res/drawable/ic_launcher_background.xml create mode 100644 composeApp/src/androidMain/res/mipmap-hdpi/ic_launcher.png create mode 100644 composeApp/src/androidMain/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 composeApp/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 composeApp/src/androidMain/res/mipmap-mdpi/ic_launcher.png create mode 100644 composeApp/src/androidMain/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 composeApp/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 composeApp/src/androidMain/res/mipmap-xhdpi/ic_launcher.png create mode 100644 composeApp/src/androidMain/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 composeApp/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 composeApp/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 composeApp/src/androidMain/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 composeApp/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 composeApp/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 composeApp/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 composeApp/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 composeApp/src/androidMain/res/values-es/strings.xml create mode 100644 composeApp/src/androidMain/res/values-fr/strings.xml create mode 100644 composeApp/src/androidMain/res/values-night/themes.xml create mode 100644 composeApp/src/androidMain/res/values-pt/strings.xml create mode 100644 composeApp/src/androidMain/res/values/colors.xml create mode 100644 composeApp/src/androidMain/res/values/ic_launcher_background.xml create mode 100644 composeApp/src/androidMain/res/values/strings.xml create mode 100644 composeApp/src/androidMain/res/values/themes.xml create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/core/navigation/Screen.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/core/presentation/theme/Color.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/core/presentation/theme/DarkThemeConfig.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/core/presentation/theme/Spacing.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/core/presentation/theme/Theme.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/core/presentation/theme/TileColorsGenerator.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/core/presentation/theme/Type.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/core/presentation/theme/WallpaperColors.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/model/Cell.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/model/Direction.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/model/Grid.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/model/GridTile.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/model/GridTileMovement.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/model/HslColor.kt create mode 100644 composeApp/src/commonMain/kotlin/com/joaomanaia/game2048/model/Tile.kt create mode 100644 composeApp/src/desktopMain/kotlin/com/joaomanaia/game2048/core/presentation/theme/Theme.desktop.kt create mode 100644 composeApp/src/desktopMain/kotlin/com/joaomanaia/game2048/core/presentation/theme/WallpaperColors.desktop.kt diff --git a/.gitignore b/.gitignore index 364e35f..40c2ed2 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,26 @@ local.properties /app/release .kotlin + +**/build/ +xcuserdata +!src/**/build/ +.idea +captures +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcodeproj/project.xcworkspace/ +!*.xcworkspace/contents.xcworkspacedata +**/xcshareddata/WorkspaceSettings.xcsettings + +.idea/* +!.idea/copyright +# Keep the code styles. +!/.idea/codeStyles +/.idea/codeStyles/* +!/.idea/codeStyles/Project.xml +!/.idea/codeStyles/codeStyleConfig.xml +!.idea/runConfigurations/ + +kotlin-js-store diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index b268ef3..81fffd6 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -5,6 +5,9 @@ + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 0897082..48d84a0 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -9,7 +9,7 @@