diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 2769a83b7c1e2a933a69af0b62625f46ddd7f45d..334cbf113bc1c42348ed76a582f1ddacf28ddb5e 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -126,6 +126,7 @@ <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" /> <option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" /> <option name="KEEP_BLANK_LINES_IN_CODE" value="1" /> + <option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0" /> <option name="FIELD_ANNOTATION_WRAP" value="1" /> <indentOptions> <option name="CONTINUATION_INDENT_SIZE" value="4" /> diff --git a/Corona-Warn-App/build.gradle b/Corona-Warn-App/build.gradle index 15d0f48bccf5ba84267936952c88d5d50db8018e..63c99edc3af68ee60b7955e94f4c8376e34b8a96 100644 --- a/Corona-Warn-App/build.gradle +++ b/Corona-Warn-App/build.gradle @@ -291,6 +291,8 @@ dependencies { testImplementation "io.kotest:kotest-runner-junit5:4.2.0" testImplementation "io.kotest:kotest-assertions-core-jvm:4.2.0" testImplementation "io.kotest:kotest-property-jvm:4.2.0" + androidTestImplementation "io.kotest:kotest-assertions-core-jvm:4.2.0" + androidTestImplementation "io.kotest:kotest-property-jvm:4.2.0" // Testing - Instrumentation androidTestImplementation 'androidx.test:runner:1.2.0' diff --git a/Corona-Warn-App/schemas/de.rki.coronawarnapp.diagnosiskeys.storage.KeyCacheDatabase/1.json b/Corona-Warn-App/schemas/de.rki.coronawarnapp.diagnosiskeys.storage.KeyCacheDatabase/1.json new file mode 100644 index 0000000000000000000000000000000000000000..72e78dde4ed14af776eb7965dd3234b4da1db874 --- /dev/null +++ b/Corona-Warn-App/schemas/de.rki.coronawarnapp.diagnosiskeys.storage.KeyCacheDatabase/1.json @@ -0,0 +1,76 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "c4ef5f7d4d9672d11c8eb97a63d4a3c5", + "entities": [ + { + "tableName": "keyfiles", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` TEXT NOT NULL, `location` TEXT NOT NULL, `day` TEXT NOT NULL, `hour` TEXT, `createdAt` TEXT NOT NULL, `checksumMD5` TEXT, `completed` INTEGER NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "location", + "columnName": "location", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "day", + "columnName": "day", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hour", + "columnName": "hour", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "createdAt", + "columnName": "createdAt", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "checksumMD5", + "columnName": "checksumMD5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isDownloadComplete", + "columnName": "completed", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c4ef5f7d4d9672d11c8eb97a63d4a3c5')" + ] + } +} \ No newline at end of file diff --git a/Corona-Warn-App/schemas/de.rki.coronawarnapp.storage.keycache.KeyCacheDatabase/1.json b/Corona-Warn-App/schemas/de.rki.coronawarnapp.storage.keycache.KeyCacheDatabase/1.json new file mode 100644 index 0000000000000000000000000000000000000000..9d856a5a015c0bef5716d2c808ee37e5f6b95d8e --- /dev/null +++ b/Corona-Warn-App/schemas/de.rki.coronawarnapp.storage.keycache.KeyCacheDatabase/1.json @@ -0,0 +1,82 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "03f6e8cba631c8ef60e506006913a1ad", + "entities": [ + { + "tableName": "keyfiles", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` TEXT NOT NULL, `location` TEXT NOT NULL, `day` TEXT NOT NULL, `hour` TEXT, `sourceUrl` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `checksumMD5` TEXT, `completed` INTEGER NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "location", + "columnName": "location", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "day", + "columnName": "day", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hour", + "columnName": "hour", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "sourceUrl", + "columnName": "sourceUrl", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "createdAt", + "columnName": "createdAt", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "checksumMD5", + "columnName": "checksumMD5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isDownloadComplete", + "columnName": "completed", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '03f6e8cba631c8ef60e506006913a1ad')" + ] + } +} \ No newline at end of file diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/diagnosiskeys/storage/KeyCacheDatabaseTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/diagnosiskeys/storage/KeyCacheDatabaseTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..ac0ccdefe87983cc638001ef67e900c75810b44a --- /dev/null +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/diagnosiskeys/storage/KeyCacheDatabaseTest.kt @@ -0,0 +1,79 @@ +package de.rki.coronawarnapp.diagnosiskeys.storage + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import io.kotest.matchers.shouldBe +import kotlinx.coroutines.runBlocking +import org.joda.time.Instant +import org.joda.time.LocalDate +import org.joda.time.LocalTime +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class KeyCacheDatabaseTest { + private val database = KeyCacheDatabase.Factory( + ApplicationProvider.getApplicationContext<Context>() + ).create() + private val dao = database.cachedKeyFiles() + + @Test + fun crud() { + val keyDay = CachedKeyInfo( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("DE"), + day = LocalDate.now(), + hour = null, + createdAt = Instant.now() + ) + val keyHour = CachedKeyInfo( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("DE"), + day = LocalDate.now(), + hour = LocalTime.now(), + createdAt = Instant.now() + ) + runBlocking { + dao.clear() + + dao.insertEntry(keyDay) + dao.insertEntry(keyHour) + dao.getAllEntries() shouldBe listOf(keyDay, keyHour) + dao.getEntriesForType(CachedKeyInfo.Type.COUNTRY_DAY.typeValue) shouldBe listOf(keyDay) + dao.getEntriesForType(CachedKeyInfo.Type.COUNTRY_HOUR.typeValue) shouldBe listOf(keyHour) + + dao.updateDownloadState(keyDay.toDownloadUpdate("coffee")) + dao.getEntriesForType(CachedKeyInfo.Type.COUNTRY_DAY.typeValue).single().apply { + isDownloadComplete shouldBe true + checksumMD5 shouldBe "coffee" + } + dao.getEntriesForType(CachedKeyInfo.Type.COUNTRY_HOUR.typeValue).single().apply { + isDownloadComplete shouldBe false + checksumMD5 shouldBe null + } + + dao.updateDownloadState(keyHour.toDownloadUpdate("with milk")) + dao.getEntriesForType(CachedKeyInfo.Type.COUNTRY_DAY.typeValue).single().apply { + isDownloadComplete shouldBe true + checksumMD5 shouldBe "coffee" + } + dao.getEntriesForType(CachedKeyInfo.Type.COUNTRY_HOUR.typeValue).single().apply { + isDownloadComplete shouldBe true + checksumMD5 shouldBe "with milk" + } + + dao.deleteEntry(keyDay) + dao.getAllEntries() shouldBe listOf( + keyHour.copy( + isDownloadComplete = true, + checksumMD5 = "with milk" + ) + ) + + dao.clear() + dao.getAllEntries() shouldBe emptyList() + } + } +} diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/storage/keycache/KeyCacheDaoTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/storage/keycache/KeyCacheDaoTest.kt deleted file mode 100644 index 31f173f6c73eeed0e6be923f245476d8854b608e..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/storage/keycache/KeyCacheDaoTest.kt +++ /dev/null @@ -1,88 +0,0 @@ -package de.rki.coronawarnapp.storage.keycache - -import android.content.Context -import androidx.room.Room -import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.google.common.truth.Truth.assertThat -import de.rki.coronawarnapp.storage.AppDatabase -import kotlinx.coroutines.runBlocking -import org.junit.After -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith - -/** - * KeyCacheDao test. - */ -@RunWith(AndroidJUnit4::class) -class KeyCacheDaoTest { - private lateinit var keyCacheDao: KeyCacheDao - private lateinit var db: AppDatabase - - @Before - fun setUp() { - val context = ApplicationProvider.getApplicationContext<Context>() - db = Room.inMemoryDatabaseBuilder( - context, AppDatabase::class.java - ).build() - keyCacheDao = db.dateDao() - } - - /** - * Test Create / Read / Delete DB operations. - */ - @Test - fun testCRDOperations() { - runBlocking { - val dates = KeyCacheEntity().apply { - this.id = "0" - this.path = "0" - this.type = 0 - } - val hours = KeyCacheEntity().apply { - this.id = "1" - this.path = "1" - this.type = 1 - } - - assertThat(keyCacheDao.getAllEntries().isEmpty()).isTrue() - - keyCacheDao.insertEntry(dates) - keyCacheDao.insertEntry(hours) - - var all = keyCacheDao.getAllEntries() - - assertThat(all.size).isEqualTo(2) - - val selectedDates = keyCacheDao.getDates() - assertThat(selectedDates.size).isEqualTo(1) - assertThat(selectedDates[0].type).isEqualTo(0) - assertThat(selectedDates[0].id).isEqualTo(dates.id) - - val selectedHours = keyCacheDao.getHours() - assertThat(selectedHours.size).isEqualTo(1) - assertThat(selectedHours[0].type).isEqualTo(1) - assertThat(selectedHours[0].id).isEqualTo(hours.id) - - keyCacheDao.clearHours() - - all = keyCacheDao.getAllEntries() - assertThat(all.size).isEqualTo(1) - assertThat(all[0].type).isEqualTo(0) - - keyCacheDao.insertEntry(hours) - - assertThat(keyCacheDao.getAllEntries().size).isEqualTo(2) - - keyCacheDao.clear() - - assertThat(keyCacheDao.getAllEntries().isEmpty()).isTrue() - } - } - - @After - fun closeDb() { - db.close() - } -} diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/util/security/DBPasswordTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/util/security/DBPasswordTest.kt index 5f1267524ea5ac46b4214d3eab5b483c1c0e12c2..efbab6568042db7b60157a13dcf0005d6b5e4b3d 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/util/security/DBPasswordTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/util/security/DBPasswordTest.kt @@ -22,7 +22,8 @@ package de.rki.coronawarnapp.util.security import android.content.Context import androidx.test.core.app.ApplicationProvider import de.rki.coronawarnapp.storage.AppDatabase -import de.rki.coronawarnapp.storage.keycache.KeyCacheEntity +import de.rki.coronawarnapp.storage.tracing.TracingIntervalEntity +import io.kotest.matchers.shouldBe import kotlinx.coroutines.runBlocking import net.sqlcipher.database.SQLiteException import org.hamcrest.Matchers.equalTo @@ -33,8 +34,6 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.JUnit4 -import java.util.UUID -import kotlin.random.Random @RunWith(JUnit4::class) class DBPasswordTest { @@ -70,16 +69,14 @@ class DBPasswordTest { @Test fun canLoadDataFromEncryptedDatabase() { runBlocking { - val id = UUID.randomUUID().toString() - val path = UUID.randomUUID().toString() - val type = Random.nextInt(1000) - - insertFakeEntity(id, path, type) - val keyCacheEntity = loadFakeEntity() - - assertThat(keyCacheEntity.id, equalTo(id)) - assertThat(keyCacheEntity.path, equalTo(path)) - assertThat(keyCacheEntity.type, equalTo(type)) + val from = 123L + val to = 456L + insertFakeEntity(from, to) + + loadFakeEntity().apply { + this.from shouldBe from + this.to shouldBe to + } } } @@ -95,34 +92,32 @@ class DBPasswordTest { @Test(expected = SQLiteException::class) fun loadingDataFromDatabaseWillFailWhenPassphraseIsIncorrect() { runBlocking { - val id = UUID.randomUUID().toString() - val path = UUID.randomUUID().toString() - val type = Random.nextInt(1000) - insertFakeEntity(id, path, type) + val from = 123L + val to = 456L + insertFakeEntity(from, to) clearSharedPreferences() AppDatabase.resetInstance() - val keyCacheEntity = loadFakeEntity() - assertThat(keyCacheEntity.id, equalTo(id)) - assertThat(keyCacheEntity.path, equalTo(path)) - assertThat(keyCacheEntity.type, equalTo(type)) + loadFakeEntity().apply { + this.from shouldBe from + this.to shouldBe to + } } } private suspend fun insertFakeEntity( - id: String, - path: String, - type: Int + from: Long, + to: Long ) { - db.dateDao().insertEntry(KeyCacheEntity().apply { - this.id = id - this.path = path - this.type = type + db.tracingIntervalDao().insertInterval(TracingIntervalEntity().apply { + this.from = from + this.to = to }) } - private suspend fun loadFakeEntity(): KeyCacheEntity = db.dateDao().getAllEntries().first() + private suspend fun loadFakeEntity(): TracingIntervalEntity = + db.tracingIntervalDao().getAllIntervals().first() private fun clearSharedPreferences() = SecurityHelper.globalEncryptedSharedPreferencesInstance.edit().clear().commit() diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/util/security/VerificationKeysTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/util/security/VerificationKeysTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..f43f22095c6f73287777f015b9dea17a8f3719a9 --- /dev/null +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/util/security/VerificationKeysTest.kt @@ -0,0 +1,71 @@ +package de.rki.coronawarnapp.util.security + +import de.rki.coronawarnapp.exception.CwaSecurityException +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.matchers.shouldBe +import okio.ByteString.Companion.decodeHex +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 + +@RunWith(JUnit4::class) +class VerificationKeysTest { + + private fun createTool() = VerificationKeys() + + @Test + fun goodBinaryAndSignature() { + val tool = createTool() + tool.hasInvalidSignature( + GOOD_BINARY.decodeHex().toByteArray(), + GOOD_SIGNATURE.decodeHex().toByteArray() + ) shouldBe false + } + + @Test + fun badBinaryGoodSignature() { + val tool = createTool() + tool.hasInvalidSignature( + "123ABC".decodeHex().toByteArray(), + GOOD_SIGNATURE.decodeHex().toByteArray() + ) shouldBe true + } + + @Test + fun goodBinaryBadSignature() { + val tool = createTool() + shouldThrow<CwaSecurityException> { + tool.hasInvalidSignature( + GOOD_BINARY.decodeHex().toByteArray(), + "123ABC".decodeHex().toByteArray() + ) + } + } + + @Test + fun badEverything() { + val tool = createTool() + shouldThrow<CwaSecurityException> { + tool.hasInvalidSignature( + "123ABC".decodeHex().toByteArray(), + "123ABC".decodeHex().toByteArray() + ) + } + } + + companion object { + private const val GOOD_BINARY = + "080b124d0a230a034c4f57180f221a68747470733a2f2f7777772e636f726f6e617761726e2e6170700a26" + + "0a0448494748100f1848221a68747470733a2f2f7777772e636f726f6e617761726e2e6170701a" + + "640a10080110021803200428053006380740081100000000000049401a0a200128013001380140" + + "012100000000000049402a10080510051805200528053005380540053100000000000034403a0e" + + "1001180120012801300138014001410000000000004940221c0a040837103f1212090000000000" + + "00f03f11000000000000e03f20192a1a0a0a0a041008180212021005120c0a0408011804120408" + + "011804" + private const val GOOD_SIGNATURE = + "0a87010a380a1864652e726b692e636f726f6e617761726e6170702d6465761a02763122033236322a1331" + + "2e322e3834302e31303034352e342e332e321001180122473045022100cf32ff24ea18a1ffcc7f" + + "f4c9fe8d1808cecbc5a37e3e1d4c9ce682120450958c022064bf124b6973a9b510a43d479ff93e" + + "0ef97a5b893c7af4abc4a8d399969cd8a0" + } +} diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/RiskLevelAndKeyRetrievalBenchmark.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/RiskLevelAndKeyRetrievalBenchmark.kt new file mode 100644 index 0000000000000000000000000000000000000000..e92c287573feaf421a6913cfd9eb95298ddaa549 --- /dev/null +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/RiskLevelAndKeyRetrievalBenchmark.kt @@ -0,0 +1,151 @@ +package de.rki.coronawarnapp + +import android.content.Context +import android.text.format.Formatter +import de.rki.coronawarnapp.exception.ExceptionCategory +import de.rki.coronawarnapp.exception.TransactionException +import de.rki.coronawarnapp.exception.reporting.report +import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction +import de.rki.coronawarnapp.transaction.RiskLevelTransaction +import de.rki.coronawarnapp.util.di.AppInjector +import timber.log.Timber +import kotlin.system.measureTimeMillis + +class RiskLevelAndKeyRetrievalBenchmark( + private val context: Context, + private val countries: List<String> +) { + + /** + * the key cache instance used to store queried dates and hours + */ + private val keyCache = AppInjector.component.keyCacheRepository + + /** + * Calls the RetrieveDiagnosisKeysTransaction and RiskLevelTransaction and measures them. + * Results are displayed using a label + * @param callCount defines how often the transactions should be called (each call will be + * measured separately) + */ + suspend fun start( + callCount: Int, + callback: (resultInfo: String) -> Unit + ) { + + var resultInfo = StringBuilder() + .append( + "MEASUREMENT Running for Countries:\n " + + "${countries.joinToString(", ")}\n\n" + ) + .append("Result: \n\n") + .append("#\t Combined \t Download \t Sub \t Risk \t File # \t F. size\n") + + callback(resultInfo.toString()) + + repeat(callCount) { index -> + + keyCache.clear() + + var keyRetrievalError = "" + var keyFileCount: Int = -1 + var keyFileDownloadDuration: Long = -1 + var keyFilesSize: Long = -1 + var apiSubmissionDuration: Long = -1 + + try { + measureDiagnosticKeyRetrieval( + label = "#$index", + countries = countries, + downloadFinished = { duration, keyCount, totalFileSize -> + keyFileCount = keyCount + keyFileDownloadDuration = duration + keyFilesSize = totalFileSize + }, apiSubmissionFinished = { duration -> + apiSubmissionDuration = duration + }) + } catch (e: TransactionException) { + keyRetrievalError = e.message.toString() + } + + var calculationDuration: Long = -1 + var calculationError = "" + + try { + calculationDuration = measureKeyCalculation("#$index") + } catch (e: TransactionException) { + calculationError = e.message.toString() + } + + // build result entry for current iteration with all gathered data + resultInfo.append( + "${index + 1}. \t ${calculationDuration + keyFileDownloadDuration + apiSubmissionDuration} ms \t " + + "$keyFileDownloadDuration ms " + "\t $apiSubmissionDuration ms" + + "\t $calculationDuration ms \t $keyFileCount \t " + + "${Formatter.formatFileSize(context, keyFilesSize)}\n" + ) + + if (keyRetrievalError.isNotEmpty()) { + resultInfo.append("Key Retrieval Error: $keyRetrievalError\n") + } + + if (calculationError.isNotEmpty()) { + resultInfo.append("Calculation Error: $calculationError\n") + } + + callback(resultInfo.toString()) + } + } + + private suspend fun measureKeyCalculation(label: String): Long { + try { + Timber.v("MEASURE [Risk Level Calculation] $label started") + // start risk level calculation and get duration + return measureTimeMillis { + RiskLevelTransaction.start() + }.also { + Timber.v("MEASURE [Risk Level Calculation] $label finished") + } + } catch (e: TransactionException) { + e.report(ExceptionCategory.INTERNAL) + throw e + } + } + + private suspend fun measureDiagnosticKeyRetrieval( + label: String, + countries: List<String>, + downloadFinished: (duration: Long, keyCount: Int, fileSize: Long) -> Unit, + apiSubmissionFinished: (duration: Long) -> Unit + ) { + var keyFileDownloadStart: Long = -1 + var apiSubmissionStarted: Long = -1 + + try { + RetrieveDiagnosisKeysTransaction.onKeyFilesDownloadStarted = { + Timber.v("MEASURE [Diagnostic Key Files] $label started") + keyFileDownloadStart = System.currentTimeMillis() + } + + RetrieveDiagnosisKeysTransaction.onKeyFilesDownloadFinished = { count, size -> + Timber.v("MEASURE [Diagnostic Key Files] $label finished") + val duration = System.currentTimeMillis() - keyFileDownloadStart + downloadFinished(duration, count, size) + } + + RetrieveDiagnosisKeysTransaction.onApiSubmissionStarted = { + apiSubmissionStarted = System.currentTimeMillis() + } + + RetrieveDiagnosisKeysTransaction.onApiSubmissionFinished = { + val duration = System.currentTimeMillis() - apiSubmissionStarted + apiSubmissionFinished(duration) + } + + // start diagnostic key transaction + RetrieveDiagnosisKeysTransaction.start(countries) + } catch (e: TransactionException) { + e.report(ExceptionCategory.INTERNAL) + throw e + } + } +} diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt index 2ac5da6032b028b474d4cb73bb407179f71a1711..f7094337bcd777cb4f52ec1e89e2fface92cbe1c 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt @@ -1,5 +1,6 @@ package de.rki.coronawarnapp.test.api.ui +import android.content.Context import android.content.Intent import android.graphics.Bitmap import android.graphics.Color @@ -8,6 +9,8 @@ import android.util.Base64 import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.inputmethod.EditorInfo +import android.view.inputmethod.InputMethodManager import android.widget.ImageView import android.widget.Toast import androidx.core.content.pm.PackageInfoCompat @@ -30,7 +33,9 @@ import com.google.zxing.integration.android.IntentIntegrator import com.google.zxing.integration.android.IntentResult import com.google.zxing.qrcode.QRCodeWriter import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.RiskLevelAndKeyRetrievalBenchmark import de.rki.coronawarnapp.databinding.FragmentTestForAPIBinding +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode import de.rki.coronawarnapp.exception.ExceptionCategory import de.rki.coronawarnapp.exception.ExceptionCategory.INTERNAL import de.rki.coronawarnapp.exception.TransactionException @@ -49,6 +54,7 @@ import de.rki.coronawarnapp.storage.tracing.TracingIntervalRepository import de.rki.coronawarnapp.transaction.RiskLevelTransaction import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel import de.rki.coronawarnapp.util.KeyFileHelper +import de.rki.coronawarnapp.util.di.AppInjector import de.rki.coronawarnapp.util.ui.viewBindingLazy import de.rki.coronawarnapp.util.di.AutoInject import de.rki.coronawarnapp.util.ui.observe2 @@ -104,6 +110,8 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), // Data and View binding private val binding: FragmentTestForAPIBinding by viewBindingLazy() + private var lastSetCountries: List<String>? = null + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -129,6 +137,21 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), qrPagerAdapter = QRPagerAdapter() qrPager.adapter = qrPagerAdapter + // Load countries from App config and update Country UI element states + lifecycleScope.launch { + lastSetCountries = + ApplicationConfigurationService.asyncRetrieveApplicationConfiguration() + .supportedCountriesList + + binding.inputCountryCodesEditText.setText( + lastSetCountries?.joinToString( + "," + ) + ) + + updateCountryStatusLabel() + } + binding.buttonApiTestStart.setOnClickListener { start() } @@ -240,6 +263,21 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), showToast(TimeVariables.getActiveTracingDaysInRetentionPeriod().toString()) } } + + binding.buttonFilterCountryCodes.setOnClickListener { + filterCountryCodes() + } + + binding.buttonRetrieveDiagnosisKeysAndCalcRiskLevel.setOnClickListener { + startKeyRetrievalAndRiskCalcBenchmark() + } + + binding.inputMeasureRiskKeyRepeatCount.setOnEditorActionListener { v, actionCode, event -> + if (actionCode == EditorInfo.IME_ACTION_DONE) { + startKeyRetrievalAndRiskCalcBenchmark() + } + false + } } override fun onResume() { @@ -248,6 +286,56 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), updateExposureSummaryDisplay(null) } + private fun startKeyRetrievalAndRiskCalcBenchmark() { + hideKeyboard() + lifecycleScope.launch { + val repeatCount = + binding.inputMeasureRiskKeyRepeatCount.text.toString().toInt() + context?.let { + RiskLevelAndKeyRetrievalBenchmark( + it, + lastSetCountries ?: listOf("DE") + ).start(repeatCount) { status -> + binding.labelTestApiMeasureCalcKeyStatus.text = status + } + } + } + } + + private fun filterCountryCodes() { + hideKeyboard() + // Get user input country codes + val rawCountryCodes = binding.inputCountryCodesEditText.text.toString() + + // Country codes can be separated by space or , + var countryCodes = rawCountryCodes.split(',', ' ').filter { it.isNotEmpty() } + + lastSetCountries = countryCodes + + // Trigger asyncFetchFiles which will use all Countries passed as parameter + lifecycleScope.launch { + val locationCodes = countryCodes.map { LocationCode(it) } + AppInjector.component.keyFileDownloader.asyncFetchKeyFiles(locationCodes) + updateCountryStatusLabel() + } + } + + private fun hideKeyboard() { + activity?.currentFocus.let { + val inputManager = + context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + inputManager.hideSoftInputFromWindow(it?.windowToken, 0) + } + } + + /** + * Updates the Label for country filter + */ + private fun updateCountryStatusLabel() { + binding.labelCountryCodeFilterStatus.text = "Country filter applied for: \n " + + "${lastSetCountries?.joinToString(",")}" + } + private val prettyKey = { key: AppleLegacyKeyExchange.Key -> StringBuilder() .append("\nKey data: ${key.keyData}") @@ -333,7 +421,10 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), ) val dir = - File(File(requireContext().getExternalFilesDir(null), "key-export"), token ?: "") + File( + File(requireContext().getExternalFilesDir(null), "key-export"), + token ?: "" + ) dir.mkdirs() var googleFileList: List<File> diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragment.kt index 8ebc02b50fbf2cc2bf940af6938a7b42c3ba21eb..710555ae5067a96f872f02cdb7ff3caaad3477dc 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragment.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragment.kt @@ -53,6 +53,7 @@ class TestRiskLevelCalculationFragment : Fragment(R.layout.fragment_test_risk_le binding.buttonRetrieveDiagnosisKeys.setOnClickListener { vm.retrieveDiagnosisKeys() } binding.buttonProvideKeyViaQr.setOnClickListener { vm.scanLocalQRCodeAndProvide() } binding.buttonCalculateRiskLevel.setOnClickListener { vm.calculateRiskLevel() } + binding.buttonClearDiagnosisKeyCache.setOnClickListener { vm.clearKeyCache() } binding.buttonResetRiskLevel.setOnClickListener { vm.resetRiskLevel() } vm.riskLevelResetEvent.observe2(this) { diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragmentCWAViewModel.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragmentCWAViewModel.kt index 0638f651bb91636ee7eb0bdcb449e6d44abae20f..5628d6c968e6d6870818ee6cca169335f89d306f 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragmentCWAViewModel.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragmentCWAViewModel.kt @@ -8,6 +8,7 @@ import com.google.android.gms.nearby.exposurenotification.ExposureInformation import com.google.android.gms.nearby.exposurenotification.ExposureNotificationClient import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject +import de.rki.coronawarnapp.diagnosiskeys.storage.KeyCacheRepository import de.rki.coronawarnapp.exception.ExceptionCategory import de.rki.coronawarnapp.exception.TransactionException import de.rki.coronawarnapp.exception.reporting.report @@ -18,7 +19,6 @@ import de.rki.coronawarnapp.risk.TimeVariables import de.rki.coronawarnapp.server.protocols.AppleLegacyKeyExchange import de.rki.coronawarnapp.service.applicationconfiguration.ApplicationConfigurationService import de.rki.coronawarnapp.storage.AppDatabase -import de.rki.coronawarnapp.storage.FileStorageHelper import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.storage.RiskLevelRepository import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction @@ -43,7 +43,8 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor( @Assisted private val handle: SavedStateHandle, @Assisted private val exampleArg: String?, private val context: Context, // App context - private val exposureNotificationClient: ExposureNotificationClient + private val exposureNotificationClient: ExposureNotificationClient, + private val keyCacheRepository: KeyCacheRepository ) : CWAViewModel() { val startLocalQRCodeScanEvent = SingleLiveEvent<Unit>() @@ -87,7 +88,7 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor( // Database Reset AppDatabase.reset(context) // Export File Reset - FileStorageHelper.getAllFilesInKeyExportDirectory().forEach { it.delete() } + keyCacheRepository.clear() LocalData.lastCalculatedRiskLevel(RiskLevel.UNDETERMINED.raw) LocalData.lastSuccessfullyCalculatedRiskLevel(RiskLevel.UNDETERMINED.raw) @@ -281,6 +282,10 @@ class TestRiskLevelCalculationFragmentCWAViewModel @AssistedInject constructor( startLocalQRCodeScanEvent.postValue(Unit) } + fun clearKeyCache() { + viewModelScope.launch { keyCacheRepository.clear() } + } + @AssistedInject.Factory interface Factory : CWAViewModelFactory<TestRiskLevelCalculationFragmentCWAViewModel> { fun create( diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml index 9b13b7db1d6fb3c4b5c076eb131be1adab5da2ba..09ac74915257e9d58fbf690dc376ebd8e419ac2a 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml @@ -1,5 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> -<layout xmlns:android="http://schemas.android.com/apk/res/android"> +<layout xmlns:tools="http://schemas.android.com/tools" + xmlns:android="http://schemas.android.com/apk/res/android" + tools:ignore="HardcodedText"> <data> @@ -44,9 +46,9 @@ <TextView android:id="@+id/label_exposure_summary" style="@style/headline6" - android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" + android:accessibilityHeading="true" android:text="@string/test_api_exposure_summary_headline" /> <TextView @@ -106,10 +108,10 @@ <TextView android:id="@+id/label_my_keys" style="@style/headline6" - android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_normal" + android:accessibilityHeading="true" android:text="@string/test_api_body_my_keys" /> <TextView @@ -134,9 +136,9 @@ <TextView android:id="@+id/label_other_keys" style="@style/headline6" - android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" + android:accessibilityHeading="true" android:text="@string/test_api_body_other_keys" /> <TextView @@ -225,24 +227,101 @@ android:text="Get Active Tracing Duration in Retention Period" /> <TextView - style="@style/headline4" + android:id="@+id/label_country_filter" + style="@style/headline6" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" + android:accessibilityHeading="true" + android:text="Country Settings" /> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <EditText + android:id="@+id/input_country_codes_editText" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" /> + + <Button + android:id="@+id/button_filter_country_codes" + style="@style/buttonPrimary" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Apply" /> + </LinearLayout> + + <TextView + android:id="@+id/label_country_code_filter_status" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Country filter applied for:"> + + </TextView> + + <TextView + android:id="@+id/label_test_api_measure" + style="@style/headline6" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" android:accessibilityHeading="true" + android:text="Statistics" /> + + <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" + android:gravity="center_vertical" + android:orientation="horizontal"> + + <EditText + android:id="@+id/input_measure_risk_key_repeat_count" + android:layout_width="98dp" + android:layout_height="wrap_content" + android:inputType="number" + android:text="1" /> + + <Button + android:id="@+id/button_retrieve_diagnosis_keys_and_calc_risk_level" + style="@style/buttonPrimary" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginBottom="@dimen/spacing_normal" + android:layout_weight="1" + android:imeOptions="actionDone" + android:text="Measure: Calculate Risk Level / Key Retrieval" /> + + + </LinearLayout> + + <TextView + android:id="@+id/label_test_api_measure_calc_key_status" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Result: " /> + + <TextView + style="@style/headline4" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:accessibilityHeading="true" android:text="headline4" /> <TextView style="@style/headline5" - android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" + android:accessibilityHeading="true" android:text="headline5" /> <TextView style="@style/headline6" - android:accessibilityHeading="true" android:layout_width="match_parent" android:layout_height="wrap_content" + android:accessibilityHeading="true" android:text="headline6" /> <TextView diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml index a2fe370331b0ad99655b6481a915145af3763125..83c27d3f815fa0441cc67307e55cfe81f2e91c5e 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_risk_level_calculation.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:ignore="HardcodedText"> <data> @@ -103,6 +105,14 @@ android:layout_marginTop="@dimen/spacing_normal" android:text="Reset Risk Level" /> + <Button + android:id="@+id/button_clear_diagnosis_key_cache" + style="@style/buttonPrimary" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" + android:text="Clear Diagnosis-Key cache" /> + <TextView android:id="@+id/label_exposure_summary_title" style="@style/headline6" diff --git a/Corona-Warn-App/src/deviceForTesters/res/navigation/nav_graph.xml b/Corona-Warn-App/src/deviceForTesters/res/navigation/nav_graph.xml index 57f900c394c37d8cb52e1ba05dc5e1cbd06104fb..43fb6ab2caa3ce823f5a146236074240695ab3f8 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/navigation/nav_graph.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/navigation/nav_graph.xml @@ -190,7 +190,7 @@ <fragment android:id="@+id/submissionDispatcherFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionDispatcherFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionDispatcherFragment" android:label="fragment_submission_dispatcher" tools:layout="@layout/fragment_submission_dispatcher"> <action @@ -205,7 +205,7 @@ </fragment> <fragment android:id="@+id/submissionResultPositiveOtherWarningFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionResultPositiveOtherWarningFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionResultPositiveOtherWarningFragment" android:label="fragment_submission_result_positive_other_warning" tools:layout="@layout/fragment_submission_positive_other_warning"> <action @@ -221,7 +221,7 @@ </fragment> <fragment android:id="@+id/submissionResultFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionTestResultFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionTestResultFragment" android:label="fragment_submission_result" tools:layout="@layout/fragment_submission_test_result"> <argument @@ -240,7 +240,7 @@ <fragment android:id="@+id/submissionTanFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionTanFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionTanFragment" android:label="fragment_submission_tan" tools:layout="@layout/fragment_submission_tan"> <action @@ -257,7 +257,7 @@ <fragment android:id="@+id/submissionIntroFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionIntroFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionIntroFragment" android:label="SubmissionIntroFragment"> <action android:id="@+id/action_submissionIntroFragment_to_mainFragment" @@ -278,7 +278,7 @@ </activity> <fragment android:id="@+id/submissionQRCodeScanFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionQRCodeScanFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionQRCodeScanFragment" android:label="SubmissionQRCodeScanFragment"> <action android:id="@+id/action_submissionQRCodeScanFragment_to_submissionDispatcherFragment" @@ -297,7 +297,7 @@ </fragment> <fragment android:id="@+id/submissionDoneFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionDoneFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionDoneFragment" android:label="SubmissionDoneFragment"> <action android:id="@+id/action_submissionDoneFragment_to_mainFragment" @@ -307,7 +307,7 @@ </fragment> <fragment android:id="@+id/submissionContactFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionContactFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionContactFragment" android:label="SubmissionContactFragment"> <action android:id="@+id/action_submissionContactFragment_to_submissionTanFragment" diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/DiagnosisKeysModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/DiagnosisKeysModule.kt new file mode 100644 index 0000000000000000000000000000000000000000..88be7abab6208a69f2ee52f1339f1f7382aa2dbf --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/DiagnosisKeysModule.kt @@ -0,0 +1,101 @@ +package de.rki.coronawarnapp.diagnosiskeys + +import android.content.Context +import dagger.Module +import dagger.Provides +import dagger.Reusable +import de.rki.coronawarnapp.BuildConfig +import de.rki.coronawarnapp.diagnosiskeys.server.AppConfigApiV1 +import de.rki.coronawarnapp.diagnosiskeys.server.DiagnosisKeyApiV1 +import de.rki.coronawarnapp.diagnosiskeys.server.DownloadHomeCountry +import de.rki.coronawarnapp.diagnosiskeys.server.DownloadHttpClient +import de.rki.coronawarnapp.diagnosiskeys.server.DownloadServerUrl +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import de.rki.coronawarnapp.diagnosiskeys.storage.legacy.KeyCacheLegacyDao +import de.rki.coronawarnapp.http.HttpClientDefault +import de.rki.coronawarnapp.storage.AppDatabase +import okhttp3.Cache +import okhttp3.ConnectionSpec +import okhttp3.OkHttpClient +import okhttp3.TlsVersion +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import java.io.File +import javax.inject.Singleton + +@Module +class DiagnosisKeysModule { + + @Singleton + @DownloadHomeCountry + @Provides + fun provideDiagnosisHomeCountry(): LocationCode = LocationCode("DE") + + @Reusable + @DownloadHttpClient + @Provides + fun cdnHttpClient(@HttpClientDefault defaultHttpClient: OkHttpClient): OkHttpClient = + defaultHttpClient.newBuilder().connectionSpecs(CDN_CONNECTION_SPECS).build() + + @Singleton + @Provides + fun provideDiagnosisKeyApi( + @DownloadHttpClient client: OkHttpClient, + @DownloadServerUrl url: String, + gsonConverterFactory: GsonConverterFactory + ): DiagnosisKeyApiV1 = Retrofit.Builder() + .client(client) + .baseUrl(url) + .addConverterFactory(gsonConverterFactory) + .build() + .create(DiagnosisKeyApiV1::class.java) + + @Singleton + @Provides + fun provideAppConfigApi( + context: Context, + @DownloadHttpClient client: OkHttpClient, + @DownloadServerUrl url: String, + gsonConverterFactory: GsonConverterFactory + ): AppConfigApiV1 { + val cacheSize = 1 * 1024 * 1024L // 1MB + val cacheDir = File(context.cacheDir, "http_app-config") + val cache = Cache(cacheDir, cacheSize) + val cachingClient = client.newBuilder().cache(cache).build() + return Retrofit.Builder() + .client(cachingClient) + .baseUrl(url) + .addConverterFactory(gsonConverterFactory) + .build() + .create(AppConfigApiV1::class.java) + } + + @Singleton + @DownloadServerUrl + @Provides + fun provideDownloadServerUrl(): String { + val url = BuildConfig.DOWNLOAD_CDN_URL + if (!url.startsWith("https://")) throw IllegalStateException("Innvalid: $url") + return url + } + + @Singleton + @Provides + fun legacyKeyCacheDao(context: Context): KeyCacheLegacyDao { + return AppDatabase.getInstance(context).dateDao() + } + + companion object { + private val CDN_CONNECTION_SPECS = listOf( + ConnectionSpec.Builder(ConnectionSpec.COMPATIBLE_TLS) + .tlsVersions( + TlsVersion.TLS_1_0, + TlsVersion.TLS_1_1, + TlsVersion.TLS_1_2, + TlsVersion.TLS_1_3 + ) + .allEnabledCipherSuites() + .build() + ) + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/CountryData.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/CountryData.kt new file mode 100644 index 0000000000000000000000000000000000000000..f9b4abd9485fff1521ba2ff18fcd9c005acbf4f2 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/CountryData.kt @@ -0,0 +1,66 @@ +package de.rki.coronawarnapp.diagnosiskeys.download + +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import de.rki.coronawarnapp.diagnosiskeys.storage.CachedKeyInfo +import org.joda.time.LocalDate +import org.joda.time.LocalTime + +sealed class CountryData { + + abstract val country: LocationCode +} + +internal data class CountryDays( + override val country: LocationCode, + val dayData: Collection<LocalDate> +) : CountryData() { + + /** + * Return a filtered list that contains all dates which are part of this wrapper, but not in the parameter. + */ + fun getMissingDays(cachedKeys: List<CachedKeyInfo>): Collection<LocalDate>? { + val cachedCountryDates = cachedKeys + .filter { it.location == country } + .map { it.day } + + return dayData.filter { date -> + !cachedCountryDates.contains(date) + } + } + + /** + * Create a new country object that only contains those elements, + * that are part of this wrapper, but not in the cache. + */ + fun toMissingDays(cachedKeys: List<CachedKeyInfo>): CountryDays? { + val missingDays = this.getMissingDays(cachedKeys) + if (missingDays == null || missingDays.isEmpty()) return null + + return CountryDays(this.country, missingDays) + } +} + +internal data class CountryHours( + override val country: LocationCode, + val hourData: Map<LocalDate, List<LocalTime>> +) : CountryData() { + + fun getMissingHours(cachedKeys: List<CachedKeyInfo>): Map<LocalDate, List<LocalTime>>? { + val cachedHours = cachedKeys + .filter { it.location == country } + + return hourData.mapNotNull { (day, dayHours) -> + val missingHours = dayHours.filter { hour -> + cachedHours.none { it.day == day && it.hour == hour } + } + if (missingHours.isEmpty()) null else day to missingHours + }.toMap() + } + + fun toMissingHours(cachedKeys: List<CachedKeyInfo>): CountryHours? { + val missingHours = this.getMissingHours(cachedKeys) + if (missingHours == null || missingHours.isEmpty()) return null + + return CountryHours(this.country, missingHours) + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/KeyFileDownloader.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/KeyFileDownloader.kt new file mode 100644 index 0000000000000000000000000000000000000000..4cf842ea9291f4a09f2c37309dc2f2d0f1cb379a --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/KeyFileDownloader.kt @@ -0,0 +1,341 @@ +package de.rki.coronawarnapp.diagnosiskeys.download + +import dagger.Reusable +import de.rki.coronawarnapp.diagnosiskeys.server.DiagnosisKeyServer +import de.rki.coronawarnapp.diagnosiskeys.server.KeyFileHeaderHook +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import de.rki.coronawarnapp.diagnosiskeys.storage.CachedKeyInfo +import de.rki.coronawarnapp.diagnosiskeys.storage.KeyCacheRepository +import de.rki.coronawarnapp.diagnosiskeys.storage.legacy.LegacyKeyCacheMigration +import de.rki.coronawarnapp.risk.TimeVariables +import de.rki.coronawarnapp.storage.AppSettings +import de.rki.coronawarnapp.storage.DeviceStorage +import de.rki.coronawarnapp.storage.InsufficientStorageException +import de.rki.coronawarnapp.util.CWADebug +import de.rki.coronawarnapp.util.HashExtensions.hashToMD5 +import de.rki.coronawarnapp.util.debug.measureTimeMillisWithResult +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.withContext +import org.joda.time.LocalTime +import timber.log.Timber +import java.io.File +import javax.inject.Inject + +/** + * Downloads new or missing key files from the CDN + */ +@Reusable +class KeyFileDownloader @Inject constructor( + private val deviceStorage: DeviceStorage, + private val keyServer: DiagnosisKeyServer, + private val keyCache: KeyCacheRepository, + private val legacyKeyCache: LegacyKeyCacheMigration, + private val settings: AppSettings +) { + + private suspend fun checkStorageSpace(countries: List<LocationCode>): DeviceStorage.CheckResult { + val storageResult = deviceStorage.checkSpacePrivateStorage( + // 512KB per day file, for 15 days, for each country ~ 65MB for 9 countries + requiredBytes = countries.size * EXPECTED_STORAGE_PER_COUNTRY + ) + Timber.tag(TAG).d("Storage check result: %s", storageResult) + return storageResult + } + + private suspend fun getCompletedKeyFiles(type: CachedKeyInfo.Type): List<CachedKeyInfo> { + return keyCache + .getEntriesForType(type) + .filter { (keyInfo, file) -> + val complete = keyInfo.isDownloadComplete + val exists = file.exists() + if (complete && !exists) { + Timber.tag(TAG).v("Incomplete download, will overwrite: %s", keyInfo) + } + // We overwrite not completed ones + complete && exists + } + .map { it.first } + } + + /** + * Fetches all necessary Files from the Cached KeyFile Entries out of the [KeyCacheRepository] and + * adds to that all open Files currently available from the Server. + * + * Assumptions made about the implementation: + * - the app initializes with an empty cache and draws in every available data set in the beginning + * - the difference can only work properly if the date from the device is synchronized through the net + * - the difference in timezone is taken into account by using UTC in the Conversion from the Date to Server format + * + * @return list of all files from both the cache and the diff query + */ + suspend fun asyncFetchKeyFiles(wantedCountries: List<LocationCode>): List<File> = + withContext(Dispatchers.IO) { + val availableCountries = keyServer.getCountryIndex() + val filteredCountries = availableCountries.filter { wantedCountries.contains(it) } + Timber.tag(TAG).v( + "Available=%s; Wanted=%s; Intersect=%s", + availableCountries, wantedCountries, filteredCountries + ) + + val storageResult = checkStorageSpace(filteredCountries) + if (!storageResult.isSpaceAvailable) throw InsufficientStorageException(storageResult) + + val availableKeys = + if (CWADebug.isDebugBuildOrMode && settings.isLast3HourModeEnabled) { + syncMissing3Hours(filteredCountries, DEBUG_HOUR_LIMIT) + keyCache.getEntriesForType(CachedKeyInfo.Type.COUNTRY_HOUR) + } else { + syncMissingDays(filteredCountries) + keyCache.getEntriesForType(CachedKeyInfo.Type.COUNTRY_DAY) + } + + return@withContext availableKeys + .filter { it.first.isDownloadComplete && it.second.exists() } + .mapNotNull { (keyInfo, path) -> + if (!path.exists()) { + Timber.tag(TAG).w("Missing keyfile for : %s", keyInfo) + null + } else { + path + } + } + .also { Timber.tag(TAG).d("Returning %d available keyfiles", it.size) } + } + + private suspend fun determineMissingDays(availableCountries: List<LocationCode>): List<CountryDays> { + val availableDays = availableCountries.map { + val days = keyServer.getDayIndex(it) + CountryDays(it, days) + } + + val cachedDays = getCompletedKeyFiles(CachedKeyInfo.Type.COUNTRY_DAY) + + val staleDays = getStale(cachedDays, availableDays) + + if (staleDays.isNotEmpty()) { + Timber.tag(TAG).v("Deleting stale days: %s", staleDays) + keyCache.delete(staleDays) + } + + val nonStaleDays = cachedDays.minus(staleDays) + + // The missing days + return availableDays.mapNotNull { it.toMissingDays(nonStaleDays) } + } + + /** + * Fetches files given by serverDates by respecting countries + * @param availableCountries pair of dates per country code + */ + private suspend fun syncMissingDays( + availableCountries: List<LocationCode> + ) = withContext(Dispatchers.IO) { + val countriesWithMissingDays = determineMissingDays(availableCountries) + + Timber.tag(TAG).d("Downloading missing days: %s", countriesWithMissingDays) + val batchDownloadStart = System.currentTimeMillis() + val dayDownloads = countriesWithMissingDays + .flatMap { country -> + country.dayData.map { dayDate -> country to dayDate } + } + .map { (countryWrapper, dayDate) -> + async { + val (keyInfo, path) = keyCache.createCacheEntry( + location = countryWrapper.country, + dayIdentifier = dayDate, + hourIdentifier = null, + type = CachedKeyInfo.Type.COUNTRY_DAY + ) + + return@async downloadKeyFile(keyInfo, path) + } + } + + Timber.tag(TAG).d("Waiting for %d missing day downloads.", dayDownloads.size) + // execute the query plan + val downloadedDays = dayDownloads.awaitAll().filterNotNull() + + Timber.tag(TAG).d( + "Batch download (%d files) finished in %dms", + dayDownloads.size, + (System.currentTimeMillis() - batchDownloadStart) + ) + + downloadedDays.map { (keyInfo, path) -> + Timber.tag(TAG).v("Downloaded keyfile: %s to %s", keyInfo, path) + path + } + + return@withContext + } + + private suspend fun determineMissingHours( + availableCountries: List<LocationCode>, + itemLimit: Int + ): List<CountryHours> { + + val availableHours = availableCountries.flatMap { location -> + var remainingItems = itemLimit + // Descending because we go backwards newest -> oldest + keyServer.getDayIndex(location).sortedDescending().mapNotNull { day -> + // Limit reached, return null (filtered out) instead of new CountryHours object + if (remainingItems <= 0) return@mapNotNull null + + val hoursForDate = mutableListOf<LocalTime>() + for (hour in keyServer.getHourIndex(location, day).sortedDescending()) { + if (remainingItems <= 0) break + remainingItems-- + hoursForDate.add(hour) + } + + CountryHours(location, mapOf(day to hoursForDate)) + } + } + + val cachedHours = getCompletedKeyFiles(CachedKeyInfo.Type.COUNTRY_HOUR) + + val staleHours = getStale(cachedHours, availableHours) + + if (staleHours.isNotEmpty()) { + Timber.tag(TAG).v("Deleting stale hours: %s", staleHours) + keyCache.delete(staleHours) + } + + val nonStaleHours = cachedHours.minus(staleHours) + + // The missing hours + return availableHours.mapNotNull { it.toMissingHours(nonStaleHours) } + } + + // All cached files that are no longer on the server are considered stale + private fun getStale( + cachedKeys: List<CachedKeyInfo>, + availableData: List<CountryData> + ): List<CachedKeyInfo> = cachedKeys.filter { cachedKey -> + val availableCountry = availableData + .filter { it.country == cachedKey.location } + .singleOrNull { + when (cachedKey.type) { + CachedKeyInfo.Type.COUNTRY_DAY -> true + CachedKeyInfo.Type.COUNTRY_HOUR -> { + it as CountryHours + it.hourData.containsKey(cachedKey.day) + } + } + } + if (availableCountry == null) { + Timber.w("Unknown location %s, assuming stale hour.", cachedKey.location) + return@filter true // It's stale + } + + when (cachedKey.type) { + CachedKeyInfo.Type.COUNTRY_DAY -> { + availableCountry as CountryDays + availableCountry.dayData.none { date -> + cachedKey.day == date + } + } + CachedKeyInfo.Type.COUNTRY_HOUR -> { + availableCountry as CountryHours + val availableDay = availableCountry.hourData[cachedKey.day] + if (availableDay == null) { + Timber.d("Unknown day %s, assuming stale hour.", cachedKey.location) + return@filter true // It's stale + } + + availableDay.none { time -> + cachedKey.hour == time + } + } + } + } + + /** + * Fetches files given by serverDates by respecting countries + * @param availableCountries pair of dates per country code + * @param hourItemLimit how many hours to go back + */ + private suspend fun syncMissing3Hours( + availableCountries: List<LocationCode>, + hourItemLimit: Int + ) = withContext(Dispatchers.IO) { + Timber.tag(TAG).v( + "asyncHandleLast3HoursFilesFetch(availableCountries=%s, hourLimit=%d)", + availableCountries, hourItemLimit + ) + val missingHours = determineMissingHours(availableCountries, hourItemLimit) + Timber.tag(TAG).d("Downloading missing hours: %s", missingHours) + + val hourDownloads = missingHours.flatMap { country -> + country.hourData.flatMap { (day, missingHours) -> + missingHours.map { missingHour -> + async { + val (keyInfo, path) = keyCache.createCacheEntry( + location = country.country, + dayIdentifier = day, + hourIdentifier = missingHour, + type = CachedKeyInfo.Type.COUNTRY_HOUR + ) + + return@async downloadKeyFile(keyInfo, path) + } + } + } + } + + Timber.tag(TAG).d("Waiting for %d missing hour downloads.", hourDownloads.size) + val downloadedHours = hourDownloads.awaitAll().filterNotNull() + + downloadedHours.map { (keyInfo, path) -> + Timber.tag(TAG).d("Downloaded keyfile: %s to %s", keyInfo, path) + path + } + + return@withContext + } + + private suspend fun downloadKeyFile( + keyInfo: CachedKeyInfo, + saveTo: File + ): Pair<CachedKeyInfo, File>? = try { + val validation = KeyFileHeaderHook { headers -> + // tryMigration returns true when a file was migrated, meaning, no download necessary + return@KeyFileHeaderHook !legacyKeyCache.tryMigration( + headers.getPayloadChecksumMD5(), + saveTo + ) + } + + keyServer.downloadKeyFile( + locationCode = keyInfo.location, + day = keyInfo.day, + hour = keyInfo.hour, + saveTo = saveTo, + headerHook = validation + ) + + Timber.tag(TAG).v("Dowwnload finished: %s -> %s", keyInfo, saveTo) + + val (downloadedMD5, duration) = measureTimeMillisWithResult { saveTo.hashToMD5() } + Timber.tag(TAG).v("Hashed to MD5 in %dms: %s", duration, saveTo) + + keyCache.markKeyComplete(keyInfo, downloadedMD5) + keyInfo to saveTo + } catch (e: Exception) { + Timber.tag(TAG).e(e, "Download failed: %s", keyInfo) + keyCache.delete(listOf(keyInfo)) + null + } + + companion object { + private val TAG: String? = KeyFileDownloader::class.simpleName + private const val DEBUG_HOUR_LIMIT = 3 + + // Daymode: ~512KB per day, ~14 days + // Hourmode: ~20KB per hour, 24 hours, also ~512KB + private val EXPECTED_STORAGE_PER_COUNTRY = + TimeVariables.getDefaultRetentionPeriodInDays() * 512 * 1024L + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/AppConfigApiV1.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/AppConfigApiV1.kt new file mode 100644 index 0000000000000000000000000000000000000000..95a99141304f48927d2d8fe0ea8b2c6a6f9f7011 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/AppConfigApiV1.kt @@ -0,0 +1,13 @@ +package de.rki.coronawarnapp.diagnosiskeys.server + +import okhttp3.ResponseBody +import retrofit2.http.GET +import retrofit2.http.Path + +interface AppConfigApiV1 { + + @GET("/version/v1/configuration/country/{country}/app_config") + suspend fun getApplicationConfiguration( + @Path("country") country: String + ): ResponseBody +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/AppConfigServer.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/AppConfigServer.kt new file mode 100644 index 0000000000000000000000000000000000000000..f5bee9979a896ee2a202263e065816fe74389914 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/AppConfigServer.kt @@ -0,0 +1,61 @@ +package de.rki.coronawarnapp.diagnosiskeys.server + +import com.google.protobuf.InvalidProtocolBufferException +import dagger.Lazy +import de.rki.coronawarnapp.exception.ApplicationConfigurationCorruptException +import de.rki.coronawarnapp.exception.ApplicationConfigurationInvalidException +import de.rki.coronawarnapp.server.protocols.ApplicationConfigurationOuterClass +import de.rki.coronawarnapp.util.ZipHelper.unzip +import de.rki.coronawarnapp.util.security.VerificationKeys +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import timber.log.Timber +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class AppConfigServer @Inject constructor( + private val appConfigAPI: Lazy<AppConfigApiV1>, + private val verificationKeys: VerificationKeys, + @DownloadHomeCountry private val homeCountry: LocationCode +) { + + private val configApi: AppConfigApiV1 + get() = appConfigAPI.get() + + suspend fun downloadAppConfig(): ApplicationConfigurationOuterClass.ApplicationConfiguration = + withContext(Dispatchers.IO) { + Timber.tag(TAG).d("Fetching app config.") + var exportBinary: ByteArray? = null + var exportSignature: ByteArray? = null + configApi.getApplicationConfiguration(homeCountry.identifier).byteStream() + .unzip { entry, entryContent -> + if (entry.name == EXPORT_BINARY_FILE_NAME) exportBinary = + entryContent.copyOf() + if (entry.name == EXPORT_SIGNATURE_FILE_NAME) exportSignature = + entryContent.copyOf() + } + if (exportBinary == null || exportSignature == null) { + throw ApplicationConfigurationInvalidException() + } + + if (verificationKeys.hasInvalidSignature(exportBinary, exportSignature)) { + throw ApplicationConfigurationCorruptException() + } + + try { + return@withContext ApplicationConfigurationOuterClass.ApplicationConfiguration.parseFrom( + exportBinary + ) + } catch (e: InvalidProtocolBufferException) { + throw ApplicationConfigurationInvalidException() + } + } + + companion object { + private val TAG = AppConfigServer::class.java.simpleName + + private const val EXPORT_BINARY_FILE_NAME = "export.bin" + private const val EXPORT_SIGNATURE_FILE_NAME = "export.sig" + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DiagnosisKeyApiV1.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DiagnosisKeyApiV1.kt new file mode 100644 index 0000000000000000000000000000000000000000..258321c44c01b54b1c139d2c56700bc94942f2ec --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DiagnosisKeyApiV1.kt @@ -0,0 +1,41 @@ +package de.rki.coronawarnapp.diagnosiskeys.server + +import okhttp3.ResponseBody +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Path +import retrofit2.http.Streaming + +interface DiagnosisKeyApiV1 { + // TODO Let retrofit format this to CountryCode + @GET("/version/v1/diagnosis-keys/country") + suspend fun getCountryIndex(): List<String> + + // TODO Let retrofit format this to LocalDate + @GET("/version/v1/diagnosis-keys/country/{country}/date") + suspend fun getDayIndex( + @Path("country") country: String + ): List<String> + + // TODO Let retrofit format this to LocalTime + @GET("/version/v1/diagnosis-keys/country/{country}/date/{day}/hour") + suspend fun getHourIndex( + @Path("country") country: String, + @Path("day") day: String + ): List<String> + + @Streaming + @GET("/version/v1/diagnosis-keys/country/{country}/date/{day}") + suspend fun downloadKeyFileForDay( + @Path("country") country: String, + @Path("day") day: String + ): Response<ResponseBody> + + @Streaming + @GET("/version/v1/diagnosis-keys/country/{country}/date/{day}/hour/{hour}") + suspend fun downloadKeyFileForHour( + @Path("country") country: String, + @Path("day") day: String, + @Path("hour") hour: String + ): Response<ResponseBody> +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DiagnosisKeyServer.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DiagnosisKeyServer.kt new file mode 100644 index 0000000000000000000000000000000000000000..8995751a9eeb31770d4bdc2444b947361d9b967d --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DiagnosisKeyServer.kt @@ -0,0 +1,108 @@ +package de.rki.coronawarnapp.diagnosiskeys.server + +import dagger.Lazy +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import okhttp3.Headers +import org.joda.time.LocalDate +import org.joda.time.LocalTime +import org.joda.time.format.DateTimeFormat +import retrofit2.HttpException +import timber.log.Timber +import java.io.File +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class DiagnosisKeyServer @Inject constructor( + private val diagnosisKeyAPI: Lazy<DiagnosisKeyApiV1>, + @DownloadHomeCountry private val homeCountry: LocationCode +) { + + private val keyApi: DiagnosisKeyApiV1 + get() = diagnosisKeyAPI.get() + + suspend fun getCountryIndex(): List<LocationCode> = withContext(Dispatchers.IO) { + keyApi + .getCountryIndex() + .map { LocationCode(it) } + } + + suspend fun getDayIndex(location: LocationCode): List<LocalDate> = withContext(Dispatchers.IO) { + keyApi + .getDayIndex(location.identifier) + .map { dayString -> + // 2020-08-19 + LocalDate.parse(dayString, DAY_FORMATTER) + } + } + + suspend fun getHourIndex(location: LocationCode, day: LocalDate): List<LocalTime> = + withContext(Dispatchers.IO) { + keyApi + .getHourIndex(location.identifier, day.toString(DAY_FORMATTER)) + .map { hourString -> LocalTime.parse(hourString, HOUR_FORMATTER) } + } + + interface HeaderHook { + suspend fun validate(headers: Headers): Boolean = true + } + + /** + * Retrieves Key Files from the Server + * Leave **[hour]** null to download a day package + */ + suspend fun downloadKeyFile( + locationCode: LocationCode, + day: LocalDate, + hour: LocalTime? = null, + saveTo: File, + headerHook: HeaderHook = object : HeaderHook {} + ) = withContext(Dispatchers.IO) { + Timber.tag(TAG).v( + "Starting download: country=%s, day=%s, hour=%s -> %s.", + locationCode, day, hour, saveTo + ) + + if (saveTo.exists()) { + Timber.tag(TAG).w("File existed, overwriting: %s", saveTo) + if (saveTo.delete()) { + Timber.tag(TAG).e("%s exists, but can't be deleted.", saveTo) + } + } + + val response = if (hour != null) { + keyApi.downloadKeyFileForHour( + locationCode.identifier, + day.toString(DAY_FORMATTER), + hour.toString(HOUR_FORMATTER) + ) + } else { + keyApi.downloadKeyFileForDay( + locationCode.identifier, + day.toString(DAY_FORMATTER) + ) + } + + if (!headerHook.validate(response.headers())) { + Timber.tag(TAG).d("validateHeaders() told us to abort.") + return@withContext + } + if (response.isSuccessful) { + saveTo.outputStream().use { target -> + response.body()!!.byteStream().use { source -> + source.copyTo(target, DEFAULT_BUFFER_SIZE) + } + } + Timber.tag(TAG).v("Key file download successful: %s", saveTo) + } else { + throw HttpException(response) + } + } + + companion object { + private val TAG = DiagnosisKeyServer::class.java.simpleName + private val DAY_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd") + private val HOUR_FORMATTER = DateTimeFormat.forPattern("HH") + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DownloadHomeCountry.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DownloadHomeCountry.kt new file mode 100644 index 0000000000000000000000000000000000000000..69aa0f792cbf2744f2a63f93b3cb36a5cc2c4b72 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DownloadHomeCountry.kt @@ -0,0 +1,8 @@ +package de.rki.coronawarnapp.diagnosiskeys.server + +import javax.inject.Qualifier + +@Qualifier +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +annotation class DownloadHomeCountry diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DownloadHttpClient.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DownloadHttpClient.kt new file mode 100644 index 0000000000000000000000000000000000000000..f9536135c9758e78f3196d16207ea6ea862eff67 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DownloadHttpClient.kt @@ -0,0 +1,8 @@ +package de.rki.coronawarnapp.diagnosiskeys.server + +import javax.inject.Qualifier + +@Qualifier +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +annotation class DownloadHttpClient diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DownloadServerUrl.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DownloadServerUrl.kt new file mode 100644 index 0000000000000000000000000000000000000000..f347e5333163965230e1af17ae9731ad7ade88eb --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/DownloadServerUrl.kt @@ -0,0 +1,8 @@ +package de.rki.coronawarnapp.diagnosiskeys.server + +import javax.inject.Qualifier + +@Qualifier +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +annotation class DownloadServerUrl diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/KeyFileHeaderHook.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/KeyFileHeaderHook.kt new file mode 100644 index 0000000000000000000000000000000000000000..51b89d5f891f21cb2f6210f978eed21f522a2a68 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/KeyFileHeaderHook.kt @@ -0,0 +1,24 @@ +package de.rki.coronawarnapp.diagnosiskeys.server + +import okhttp3.Headers + +class KeyFileHeaderHook( + private val onEval: suspend KeyFileHeaderHook.(Headers) -> Boolean +) : DiagnosisKeyServer.HeaderHook { + + override suspend fun validate(headers: Headers): Boolean = onEval(headers) + + fun Headers.getPayloadChecksumMD5(): String? { + // TODO Ping backend regarding alternative checksum sources + var fileMD5 = values("ETag").singleOrNull() + // The hash from these headers doesn't match, TODO EXPOSUREBACK-178 +// var fileMD5 = headers.values("x-amz-meta-cwa-hash-md5").singleOrNull() +// if (fileMD5 == null) { +// headers.values("x-amz-meta-cwa-hash").singleOrNull() +// } +// if (fileMD5 == null) { // Fallback +// fileMD5 = headers.values("ETag").singleOrNull() +// } + return fileMD5?.removePrefix("\"")?.removeSuffix("\"") + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/LocationCode.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/LocationCode.kt new file mode 100644 index 0000000000000000000000000000000000000000..8201571a46b14ca53b35d2146dae940a663014e0 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/server/LocationCode.kt @@ -0,0 +1,10 @@ +package de.rki.coronawarnapp.diagnosiskeys.server + +import java.util.Locale + +data class LocationCode( + private val rawIdentifier: String +) { + @Transient + val identifier: String = rawIdentifier.toUpperCase(Locale.ROOT) +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/CachedKeyInfo.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/CachedKeyInfo.kt new file mode 100644 index 0000000000000000000000000000000000000000..b77f11c7be3f1f58959c1c7b19ba50414ea19724 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/CachedKeyInfo.kt @@ -0,0 +1,84 @@ +package de.rki.coronawarnapp.diagnosiskeys.storage + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import androidx.room.TypeConverter +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import de.rki.coronawarnapp.util.HashExtensions.toSHA1 +import org.joda.time.Instant +import org.joda.time.LocalDate +import org.joda.time.LocalTime + +@Entity(tableName = "keyfiles") +data class CachedKeyInfo( + @PrimaryKey @ColumnInfo(name = "id") val id: String, + @ColumnInfo(name = "type") val type: Type, + @ColumnInfo(name = "location") val location: LocationCode, // i.e. "DE" + @ColumnInfo(name = "day") val day: LocalDate, // i.e. 2020-08-23 + @ColumnInfo(name = "hour") val hour: LocalTime?, // i.e. 23 + @ColumnInfo(name = "createdAt") val createdAt: Instant, + @ColumnInfo(name = "checksumMD5") val checksumMD5: String?, + @ColumnInfo(name = "completed") val isDownloadComplete: Boolean +) { + + constructor( + type: Type, + location: LocationCode, + day: LocalDate, + hour: LocalTime?, + createdAt: Instant + ) : this( + id = calcluateId(location, day, hour, type), + location = location, + day = day, + hour = hour, + type = type, + createdAt = createdAt, + checksumMD5 = null, + isDownloadComplete = false + ) + + @Transient + val fileName: String = "$id.zip" + + fun toDownloadUpdate(checksumMD5: String?): DownloadUpdate = DownloadUpdate( + id = id, + checksumMD5 = checksumMD5, + isDownloadComplete = checksumMD5 != null + ) + + companion object { + fun calcluateId( + location: LocationCode, + day: LocalDate, + hour: LocalTime?, + type: Type + ): String { + var rawId = "${location.identifier}.${type.typeValue}.$day" + hour?.let { rawId += ".$hour" } + return rawId.toSHA1() + } + } + + enum class Type constructor(internal val typeValue: String) { + COUNTRY_DAY("country_day"), + COUNTRY_HOUR("country_hour"); + + class Converter { + @TypeConverter + fun toType(value: String?): Type? = + value?.let { values().single { it.typeValue == value } } + + @TypeConverter + fun fromType(type: Type?): String? = type?.typeValue + } + } + + @Entity + data class DownloadUpdate( + @PrimaryKey @ColumnInfo(name = "id") val id: String, + @ColumnInfo(name = "checksumMD5") val checksumMD5: String?, + @ColumnInfo(name = "completed") val isDownloadComplete: Boolean + ) +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/KeyCacheDatabase.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/KeyCacheDatabase.kt new file mode 100644 index 0000000000000000000000000000000000000000..e4be6ba47007ae858c1065509d49f6469bd71e11 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/KeyCacheDatabase.kt @@ -0,0 +1,62 @@ +package de.rki.coronawarnapp.diagnosiskeys.storage + +import android.content.Context +import androidx.room.Dao +import androidx.room.Database +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Room +import androidx.room.RoomDatabase +import androidx.room.TypeConverters +import androidx.room.Update +import de.rki.coronawarnapp.util.database.CommonConverters +import javax.inject.Inject + +@Database( + entities = [CachedKeyInfo::class], + version = 1, + exportSchema = true +) +@TypeConverters(CommonConverters::class, CachedKeyInfo.Type.Converter::class) +abstract class KeyCacheDatabase : RoomDatabase() { + + abstract fun cachedKeyFiles(): CachedKeyFileDao + + @Dao + interface CachedKeyFileDao { + @Query("SELECT * FROM keyfiles") + suspend fun getAllEntries(): List<CachedKeyInfo> + + @Query("SELECT * FROM keyfiles WHERE type = :type") + suspend fun getEntriesForType(type: String): List<CachedKeyInfo> + + @Query("DELETE FROM keyfiles") + suspend fun clear() + + @Insert(onConflict = OnConflictStrategy.ABORT) + suspend fun insertEntry(cachedKeyInfo: CachedKeyInfo) + + @Delete + suspend fun deleteEntry(cachedKeyInfo: CachedKeyInfo) + + @Update(entity = CachedKeyInfo::class) + suspend fun updateDownloadState(update: CachedKeyInfo.DownloadUpdate) + } + + class Factory @Inject constructor(private val context: Context) { + /** + * The fallback behavior is to reset the app as we only store exposure summaries + * and cached references that are non-critical to app operation. + */ + fun create(): KeyCacheDatabase = Room + .databaseBuilder(context, KeyCacheDatabase::class.java, DATABASE_NAME) + .fallbackToDestructiveMigrationFrom() + .build() + } + + companion object { + private const val DATABASE_NAME = "keycache.db" + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/KeyCacheRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/KeyCacheRepository.kt new file mode 100644 index 0000000000000000000000000000000000000000..4336c7ac87ff9de1ee0ef0052e0150a673a83f69 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/KeyCacheRepository.kt @@ -0,0 +1,153 @@ +/****************************************************************************** + * Corona-Warn-App * + * * + * SAP SE and all other contributors / * + * copyright owners license this file to you under the Apache * + * License, Version 2.0 (the "License"); you may not use this * + * file except in compliance with the License. * + * You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ******************************************************************************/ + +package de.rki.coronawarnapp.diagnosiskeys.storage + +import android.content.Context +import android.database.sqlite.SQLiteConstraintException +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import de.rki.coronawarnapp.util.TimeStamper +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import org.joda.time.LocalDate +import org.joda.time.LocalTime +import timber.log.Timber +import java.io.File +import java.io.IOException +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class KeyCacheRepository @Inject constructor( + private val context: Context, + private val databaseFactory: KeyCacheDatabase.Factory, + private val timeStamper: TimeStamper +) { + + private val storageDir by lazy { + File(context.cacheDir, "diagnosis_keys").apply { + if (!exists()) { + if (mkdirs()) { + Timber.d("KeyCache directory created: %s", this) + } else { + throw IOException("KeyCache directory creation failed: $this") + } + } + } + } + + private val database by lazy { databaseFactory.create() } + + private var isInitDone = false + private val initMutex = Mutex() + + private suspend fun getDao(): KeyCacheDatabase.CachedKeyFileDao { + val dao = database.cachedKeyFiles() + + if (!isInitDone) { + initMutex.withLock { + if (isInitDone) return@withLock + isInitDone = true + + doHouseKeeping() + } + } + + return dao + } + + private suspend fun doHouseKeeping() { + val dirtyInfos = getDao().getAllEntries().filter { + it.isDownloadComplete && !getPathForKey(it).exists() + } + Timber.v("HouseKeeping, deleting: %s", dirtyInfos) + delete(dirtyInfos) + } + + fun getPathForKey(cachedKeyInfo: CachedKeyInfo): File { + return File(storageDir, cachedKeyInfo.fileName) + } + + suspend fun getAllCachedKeys(): List<Pair<CachedKeyInfo, File>> { + return getDao().getAllEntries().map { it to getPathForKey(it) } + } + + suspend fun getEntriesForType(type: CachedKeyInfo.Type): List<Pair<CachedKeyInfo, File>> { + return getDao().getEntriesForType(type.typeValue).map { it to getPathForKey(it) } + } + + suspend fun createCacheEntry( + type: CachedKeyInfo.Type, + location: LocationCode, + dayIdentifier: LocalDate, + hourIdentifier: LocalTime? + ): Pair<CachedKeyInfo, File> { + val newKeyFile = CachedKeyInfo( + type = type, + location = location, + day = dayIdentifier, + hour = hourIdentifier, + createdAt = timeStamper.nowUTC + ) + + val targetFile = getPathForKey(newKeyFile) + + try { + getDao().insertEntry(newKeyFile) + if (targetFile.exists()) { + Timber.w("Target path despite no collision exists, deleting: %s", targetFile) + } + } catch (e: SQLiteConstraintException) { + Timber.e(e, "Insertion collision? Overwriting for %s", newKeyFile) + delete(listOf(newKeyFile)) + + Timber.d(e, "Retrying insertion for %s", newKeyFile) + getDao().insertEntry(newKeyFile) + } + + // This can't be null unless our cache dir is root `/` + val targetParent = targetFile.parentFile!! + if (!targetParent.exists()) { + Timber.w("Parent folder doesn't exist, cache cleared? %s", targetParent) + targetParent.mkdirs() + } + + return newKeyFile to targetFile + } + + suspend fun markKeyComplete(cachedKeyInfo: CachedKeyInfo, checksumMD5: String) { + val update = cachedKeyInfo.toDownloadUpdate(checksumMD5) + getDao().updateDownloadState(update) + } + + suspend fun delete(keyInfos: Collection<CachedKeyInfo>) { + Timber.d("delete(keyFiles=%s)", keyInfos) + keyInfos.forEach { key -> + getDao().deleteEntry(key) + Timber.v("Deleted %s", key) + val path = getPathForKey(key) + if (path.delete()) Timber.v("Deleted cache key file at %s", path) + } + } + + suspend fun clear() { + Timber.i("clear()") + delete(getDao().getAllEntries()) + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/Converters.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/KeyCacheLegacyDao.kt similarity index 75% rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/Converters.kt rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/KeyCacheLegacyDao.kt index 7b5c36d39378e073345839cee683ab40bd7a7d77..3418ebd0cbeb0c4b81fd43ed1be1cd1c97595fa3 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/Converters.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/KeyCacheLegacyDao.kt @@ -17,23 +17,13 @@ * under the License. * ******************************************************************************/ -package de.rki.coronawarnapp.util +package de.rki.coronawarnapp.diagnosiskeys.storage.legacy -import androidx.room.TypeConverter -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken +import androidx.room.Dao +import androidx.room.Query -class Converters { - private val gson = Gson() - - @TypeConverter - fun fromString(value: String?): List<Int> { - val listType = object : TypeToken<List<Int?>?>() {}.type - return gson.fromJson(value, listType) - } - - @TypeConverter - fun fromArrayList(list: List<Int?>?): String { - return gson.toJson(list) - } +@Dao +interface KeyCacheLegacyDao { + @Query("DELETE FROM date") + suspend fun clear() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/keycache/KeyCacheEntity.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/KeyCacheLegacyEntity.kt similarity index 95% rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/keycache/KeyCacheEntity.kt rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/KeyCacheLegacyEntity.kt index 8bd2ac55df388512c458b045f3f44c1194524ed6..0a8593c004eaa9d9475f57cef05aed5f11745346 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/keycache/KeyCacheEntity.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/KeyCacheLegacyEntity.kt @@ -17,7 +17,7 @@ * under the License. * ******************************************************************************/ -package de.rki.coronawarnapp.storage.keycache +package de.rki.coronawarnapp.diagnosiskeys.storage.legacy import androidx.room.Entity import androidx.room.Index @@ -27,7 +27,7 @@ import androidx.room.PrimaryKey tableName = "date", indices = [Index("id")] ) -class KeyCacheEntity { +class KeyCacheLegacyEntity { @PrimaryKey var id: String = "" diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/LegacyKeyCacheMigration.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/LegacyKeyCacheMigration.kt new file mode 100644 index 0000000000000000000000000000000000000000..ca2cf95867b371a37bf8875325410289009ed0bd --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/LegacyKeyCacheMigration.kt @@ -0,0 +1,103 @@ +package de.rki.coronawarnapp.diagnosiskeys.storage.legacy + +import android.content.Context +import dagger.Lazy +import de.rki.coronawarnapp.risk.TimeVariables +import de.rki.coronawarnapp.util.HashExtensions.hashToMD5 +import de.rki.coronawarnapp.util.TimeStamper +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import org.joda.time.Duration +import org.joda.time.Instant +import timber.log.Timber +import java.io.File +import javax.inject.Inject + +class LegacyKeyCacheMigration @Inject constructor( + private val context: Context, + private val legacyDao: Lazy<KeyCacheLegacyDao>, + private val timeStamper: TimeStamper +) { + + private val cacheDir by lazy { + File(context.cacheDir, "key-export") + } + + private val workMutex = Mutex() + private var isInit = false + private val legacyCacheMap = mutableMapOf<String, File>() + + private suspend fun tryInit() { + if (isInit) return + isInit = true + + if (!cacheDir.exists()) { + Timber.tag(TAG).v("Legacy cache dir doesn't exist, we are done.") + return + } + + try { + legacyDao.get().clear() + } catch (e: Exception) { + // Not good, but not a problem, we don't need the actual entities for migration. + Timber.tag(TAG).w(e, "Failed to clear legacy key cache from db.") + } + + try { + cacheDir.listFiles()?.forEach { file -> + val isExpired = Duration( + Instant.ofEpochMilli(file.lastModified()), + timeStamper.nowUTC + ).standardDays > TimeVariables.getDefaultRetentionPeriodInDays() + + if (isExpired) { + Timber.tag(TAG).d("Deleting expired file: %s", file) + file.delete() + } else { + val md5 = file.hashToMD5() + Timber.tag(TAG).v("MD5 %s for %s", md5, file) + legacyCacheMap[md5] = file + } + } + } catch (e: Exception) { + Timber.tag(TAG).e(e, "Reading legacy cached failed. Clearing.") + cacheDir.deleteRecursively() + } + + if (cacheDir.exists() && cacheDir.listFiles()?.isNullOrEmpty() == true) { + Timber.tag(TAG).v("Legacy cache dir is empty, deleting.") + cacheDir.delete() + } + } + + suspend fun tryMigration(fileMD5: String?, targetPath: File): Boolean = workMutex.withLock { + if (fileMD5 == null) return false + tryInit() + + val legacyFile = legacyCacheMap[fileMD5] ?: return false + Timber.tag(TAG).i("Migrating legacy file for %s to %s", fileMD5, targetPath) + + return try { + legacyFile.inputStream().use { from -> + targetPath.outputStream().use { to -> + from.copyTo(to, DEFAULT_BUFFER_SIZE) + } + } + true + } catch (e: Exception) { + Timber.tag(TAG).e(e, "Failed to migrate %s", legacyFile) + false + } finally { + try { + val removedFile = legacyCacheMap.remove(fileMD5) + if (removedFile?.delete() == true) Timber.tag(TAG).d("Deleted %s", removedFile) + } catch (e: Exception) { + Timber.tag(TAG).e(e, "Failed to delete %s", legacyFile) + } + } + } + + companion object { + private val TAG = this::class.java.simpleName + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpClientDefault.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpClientDefault.kt new file mode 100644 index 0000000000000000000000000000000000000000..dca6b3f7826139d902b63c41a4fe71a7492502dc --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpClientDefault.kt @@ -0,0 +1,8 @@ +package de.rki.coronawarnapp.http + +import javax.inject.Qualifier + +@Qualifier +@MustBeDocumented +@Retention(AnnotationRetention.RUNTIME) +annotation class HttpClientDefault diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpModule.kt new file mode 100644 index 0000000000000000000000000000000000000000..a8c68ad05ffbdfa4555d2d91188bc72235dc7d04 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/HttpModule.kt @@ -0,0 +1,56 @@ +package de.rki.coronawarnapp.http + +import dagger.Module +import dagger.Provides +import dagger.Reusable +import de.rki.coronawarnapp.BuildConfig +import de.rki.coronawarnapp.http.config.HTTPVariables +import de.rki.coronawarnapp.http.interceptor.RetryInterceptor +import de.rki.coronawarnapp.http.interceptor.WebSecurityVerificationInterceptor +import de.rki.coronawarnapp.risk.TimeVariables +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.converter.protobuf.ProtoConverterFactory +import timber.log.Timber +import java.util.concurrent.TimeUnit + +@Module +class HttpModule { + + @Reusable + @HttpClientDefault + @Provides + fun defaultHttpClient(): OkHttpClient { + val interceptors: List<Interceptor> = listOf( + WebSecurityVerificationInterceptor(), + HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger { + override fun log(message: String) { + Timber.tag("OkHttp").v(message) + } + }).apply { + if (BuildConfig.DEBUG) setLevel(HttpLoggingInterceptor.Level.BODY) + }, + RetryInterceptor(), + HttpErrorParser() + ) + + return OkHttpClient.Builder().apply { + connectTimeout(HTTPVariables.getHTTPConnectionTimeout(), TimeUnit.MILLISECONDS) + readTimeout(HTTPVariables.getHTTPReadTimeout(), TimeUnit.MILLISECONDS) + writeTimeout(HTTPVariables.getHTTPWriteTimeout(), TimeUnit.MILLISECONDS) + callTimeout(TimeVariables.getTransactionTimeout(), TimeUnit.MILLISECONDS) + + interceptors.forEach { addInterceptor(it) } + }.build() + } + + @Reusable + @Provides + fun provideGSONConverter(): GsonConverterFactory = GsonConverterFactory.create() + + @Reusable + @Provides + fun provideProtoonverter(): ProtoConverterFactory = ProtoConverterFactory.create() +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/ServiceFactory.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/ServiceFactory.kt index 9e383ff44cfa7798456964a344c10b4cc840a2a2..7e9712436e25608c088496dcabbdf3246c404ecf 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/ServiceFactory.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/ServiceFactory.kt @@ -4,172 +4,37 @@ import android.webkit.URLUtil import de.rki.coronawarnapp.BuildConfig import de.rki.coronawarnapp.CoronaWarnApplication import de.rki.coronawarnapp.exception.http.ServiceFactoryException -import de.rki.coronawarnapp.http.config.HTTPVariables -import de.rki.coronawarnapp.http.interceptor.RetryInterceptor -import de.rki.coronawarnapp.http.interceptor.WebSecurityVerificationInterceptor -import de.rki.coronawarnapp.http.service.DistributionService import de.rki.coronawarnapp.http.service.SubmissionService import de.rki.coronawarnapp.http.service.VerificationService -import de.rki.coronawarnapp.risk.TimeVariables import okhttp3.Cache import okhttp3.CipherSuite -import okhttp3.ConnectionPool import okhttp3.ConnectionSpec -import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.TlsVersion -import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import retrofit2.converter.protobuf.ProtoConverterFactory -import timber.log.Timber import java.io.File -import java.util.concurrent.TimeUnit - -class ServiceFactory { - companion object { - /** - * 10 MiB - */ - private const val HTTP_CACHE_SIZE = 10L * 1024L * 1024L - - /** - * Cache file name - */ - private const val HTTP_CACHE_NAME = "http_cache" - } - - /** - * List of interceptors, e.g. logging - */ - private val mInterceptors: List<Interceptor> = listOf( - WebSecurityVerificationInterceptor(), - HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger { - override fun log(message: String) { - Timber.tag("OkHttp").v(message) - } - }).apply { - if (BuildConfig.DEBUG) setLevel(HttpLoggingInterceptor.Level.BODY) - }, - RetryInterceptor(), - HttpErrorParser() - ) - - /** - * connection pool held in-memory, especially useful for key retrieval - */ - private val conPool = ConnectionPool() - - /** - * Basic disk cache backed by LRU - */ - private val cache = Cache( - directory = File(CoronaWarnApplication.getAppContext().cacheDir, HTTP_CACHE_NAME), - maxSize = HTTP_CACHE_SIZE - ) - - private val gsonConverterFactory = GsonConverterFactory.create() - private val protoConverterFactory = ProtoConverterFactory.create() - - private val okHttpClient by lazy { - val clientBuilder = OkHttpClient.Builder() - - clientBuilder.connectTimeout( - HTTPVariables.getHTTPConnectionTimeout(), - TimeUnit.MILLISECONDS +import javax.inject.Inject + +class ServiceFactory @Inject constructor( + private val gsonConverterFactory: GsonConverterFactory, + private val protoConverterFactory: ProtoConverterFactory, + @HttpClientDefault private val defaultHttpClient: OkHttpClient +) { + + private val cache by lazy { + Cache( + directory = File(CoronaWarnApplication.getAppContext().cacheDir, HTTP_CACHE_FOLDER), + maxSize = HTTP_CACHE_SIZE ) - clientBuilder.readTimeout( - HTTPVariables.getHTTPReadTimeout(), - TimeUnit.MILLISECONDS - ) - clientBuilder.writeTimeout( - HTTPVariables.getHTTPWriteTimeout(), - TimeUnit.MILLISECONDS - ) - clientBuilder.callTimeout( - TimeVariables.getTransactionTimeout(), - TimeUnit.MILLISECONDS - ) - - clientBuilder.connectionPool(conPool) - - cache.evictAll() - clientBuilder.cache(cache) - - mInterceptors.forEach { clientBuilder.addInterceptor(it) } - - clientBuilder.build() } - - /** - * For the CDN we want to ensure maximum Compatibility. - */ - private fun getCDNSpecs(): List<ConnectionSpec> = listOf( - ConnectionSpec.Builder(ConnectionSpec.COMPATIBLE_TLS) - .tlsVersions( - TlsVersion.TLS_1_0, - TlsVersion.TLS_1_1, - TlsVersion.TLS_1_2, - TlsVersion.TLS_1_3 - ) - .allEnabledCipherSuites() - .build() - ) - - /** - * For Submission and Verification we want to limit our specifications for TLS. - */ - private fun getRestrictedSpecs(): List<ConnectionSpec> = listOf( - ConnectionSpec.Builder(ConnectionSpec.RESTRICTED_TLS) - .tlsVersions( - TlsVersion.TLS_1_2, - TlsVersion.TLS_1_3 - ) - .cipherSuites( - // TLS 1.2 with Perfect Forward Secrecy (BSI TR-02102-2) - CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, - CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, - CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, - CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, - CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, - CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, - CipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, - CipherSuite.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, - CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, - CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, - CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, - CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, - // TLS 1.3 (BSI TR-02102-2) - CipherSuite.TLS_AES_128_GCM_SHA256, - CipherSuite.TLS_AES_256_GCM_SHA384, - CipherSuite.TLS_AES_128_CCM_SHA256 - ) - .build() - ) - - /** - * Helper function to create a new client from an existent Client with New Specs. - * - * @param specs - */ - private fun OkHttpClient.buildClientWithNewSpecs(specs: List<ConnectionSpec>) = - this.newBuilder().connectionSpecs(specs).build() - - private val downloadCdnUrl - get() = getValidUrl(BuildConfig.DOWNLOAD_CDN_URL) - - fun distributionService(): DistributionService = distributionService - private val distributionService by lazy { - Retrofit.Builder() - .client(okHttpClient.buildClientWithNewSpecs(getCDNSpecs())) - .baseUrl(downloadCdnUrl) - .addConverterFactory(gsonConverterFactory) + private val okHttpClient by lazy { + defaultHttpClient + .newBuilder() + .connectionSpecs(getRestrictedSpecs()) + .cache(cache) .build() - .create(DistributionService::class.java) } private val verificationCdnUrl @@ -178,7 +43,7 @@ class ServiceFactory { fun verificationService(): VerificationService = verificationService private val verificationService by lazy { Retrofit.Builder() - .client(okHttpClient.buildClientWithNewSpecs(getRestrictedSpecs())) + .client(okHttpClient) .baseUrl(verificationCdnUrl) .addConverterFactory(gsonConverterFactory) .build() @@ -191,7 +56,7 @@ class ServiceFactory { fun submissionService(): SubmissionService = submissionService private val submissionService by lazy { Retrofit.Builder() - .client(okHttpClient.buildClientWithNewSpecs(getRestrictedSpecs())) + .client(okHttpClient) .baseUrl(submissionCdnUrl) .addConverterFactory(protoConverterFactory) .addConverterFactory(gsonConverterFactory) @@ -205,4 +70,44 @@ class ServiceFactory { } return url } + + companion object { + private const val HTTP_CACHE_SIZE = 10L * 1024L * 1024L // 10 MiB + private const val HTTP_CACHE_FOLDER = "http_cache" // <pkg>/cache/http_cache + + /** + * For Submission and Verification we want to limit our specifications for TLS. + */ + private fun getRestrictedSpecs(): List<ConnectionSpec> = listOf( + ConnectionSpec.Builder(ConnectionSpec.RESTRICTED_TLS) + .tlsVersions( + TlsVersion.TLS_1_2, + TlsVersion.TLS_1_3 + ) + .cipherSuites( + // TLS 1.2 with Perfect Forward Secrecy (BSI TR-02102-2) + CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, + CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, + CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, + CipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, + CipherSuite.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, + CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, + CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, + // TLS 1.3 (BSI TR-02102-2) + CipherSuite.TLS_AES_128_GCM_SHA256, + CipherSuite.TLS_AES_256_GCM_SHA384, + CipherSuite.TLS_AES_128_CCM_SHA256 + ) + .build() + ) + } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt index 906b6b44c1dc7bbaa96e76d87349e68fd9e67411..d0bee06128aef56f255f3da69fdf383a135d8db6 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/WebRequestBuilder.kt @@ -21,42 +21,27 @@ package de.rki.coronawarnapp.http import KeyExportFormat import com.google.protobuf.ByteString -import com.google.protobuf.InvalidProtocolBufferException -import de.rki.coronawarnapp.exception.ApplicationConfigurationCorruptException -import de.rki.coronawarnapp.exception.ApplicationConfigurationInvalidException import de.rki.coronawarnapp.http.requests.RegistrationRequest import de.rki.coronawarnapp.http.requests.RegistrationTokenRequest import de.rki.coronawarnapp.http.requests.TanRequestBody -import de.rki.coronawarnapp.http.service.DistributionService import de.rki.coronawarnapp.http.service.SubmissionService import de.rki.coronawarnapp.http.service.VerificationService -import de.rki.coronawarnapp.server.protocols.ApplicationConfigurationOuterClass.ApplicationConfiguration import de.rki.coronawarnapp.service.diagnosiskey.DiagnosisKeyConstants import de.rki.coronawarnapp.service.submission.KeyType import de.rki.coronawarnapp.service.submission.SubmissionConstants -import de.rki.coronawarnapp.storage.FileStorageHelper -import de.rki.coronawarnapp.util.TimeAndDateExtensions.toServerFormat -import de.rki.coronawarnapp.util.ZipHelper.unzip +import de.rki.coronawarnapp.util.di.AppInjector import de.rki.coronawarnapp.util.security.HashHelper -import de.rki.coronawarnapp.util.security.VerificationKeys import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import timber.log.Timber -import java.io.File -import java.util.Date -import java.util.UUID import kotlin.math.max class WebRequestBuilder( - private val distributionService: DistributionService, private val verificationService: VerificationService, - private val submissionService: SubmissionService, - private val verificationKeys: VerificationKeys + private val submissionService: SubmissionService ) { companion object { private val TAG: String? = WebRequestBuilder::class.simpleName - private const val EXPORT_BINARY_FILE_NAME = "export.bin" - private const val EXPORT_SIGNATURE_FILE_NAME = "export.sig" @Volatile private var instance: WebRequestBuilder? = null @@ -68,78 +53,14 @@ class WebRequestBuilder( } private fun buildWebRequestBuilder(): WebRequestBuilder { - val serviceFactory = ServiceFactory() + val serviceFactory = AppInjector.component.serviceFactory return WebRequestBuilder( - serviceFactory.distributionService(), serviceFactory.verificationService(), - serviceFactory.submissionService(), - VerificationKeys() + serviceFactory.submissionService() ) } } - suspend fun asyncGetDateIndex(): List<String> = withContext(Dispatchers.IO) { - return@withContext distributionService - .getDateIndex(DiagnosisKeyConstants.AVAILABLE_DATES_URL).toList() - } - - suspend fun asyncGetHourIndex(day: Date): List<String> = withContext(Dispatchers.IO) { - return@withContext distributionService - .getHourIndex( - DiagnosisKeyConstants.AVAILABLE_DATES_URL + - "/${day.toServerFormat()}/${DiagnosisKeyConstants.HOUR}" - ) - .toList() - } - - /** - * Retrieves Key Files from the Server based on a URL - * - * @param url the given URL - */ - suspend fun asyncGetKeyFilesFromServer( - url: String - ): File = withContext(Dispatchers.IO) { - val fileName = "${UUID.nameUUIDFromBytes(url.toByteArray())}.zip" - val file = File(FileStorageHelper.keyExportDirectory, fileName) - if (file.exists()) file.delete() - file.outputStream().use { fos -> - Timber.v("Added $url to queue.") - distributionService.getKeyFiles(url).byteStream().use { - it.copyTo(fos, DEFAULT_BUFFER_SIZE) - } - Timber.v("key file request successful.") - } - return@withContext file - } - - suspend fun asyncGetApplicationConfigurationFromServer(): ApplicationConfiguration = - withContext(Dispatchers.IO) { - var exportBinary: ByteArray? = null - var exportSignature: ByteArray? = null - - distributionService.getApplicationConfiguration( - DiagnosisKeyConstants.COUNTRY_APPCONFIG_DOWNLOAD_URL - ).byteStream().unzip { entry, entryContent -> - if (entry.name == EXPORT_BINARY_FILE_NAME) exportBinary = entryContent.copyOf() - if (entry.name == EXPORT_SIGNATURE_FILE_NAME) exportSignature = - entryContent.copyOf() - } - if (exportBinary == null || exportSignature == null) { - throw ApplicationConfigurationInvalidException() - } - - if (verificationKeys.hasInvalidSignature(exportBinary, exportSignature)) { - throw ApplicationConfigurationCorruptException() - } - - try { - return@withContext ApplicationConfiguration.parseFrom(exportBinary) - } catch (e: InvalidProtocolBufferException) { - throw ApplicationConfigurationInvalidException() - } - } - suspend fun asyncGetRegistrationToken( key: String, keyType: KeyType diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/service/DistributionService.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/service/DistributionService.kt deleted file mode 100644 index 1571fc4b66c822f47299fbc97347429dc4af9c4e..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/service/DistributionService.kt +++ /dev/null @@ -1,22 +0,0 @@ -package de.rki.coronawarnapp.http.service - -import okhttp3.ResponseBody -import retrofit2.http.GET -import retrofit2.http.Streaming -import retrofit2.http.Url - -interface DistributionService { - - @GET - suspend fun getDateIndex(@Url url: String): List<String> - - @GET - suspend fun getHourIndex(@Url url: String): List<String> - - @Streaming - @GET - suspend fun getKeyFiles(@Url url: String): ResponseBody - - @GET - suspend fun getApplicationConfiguration(@Url url: String): ResponseBody -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/applicationconfiguration/ApplicationConfigurationService.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/applicationconfiguration/ApplicationConfigurationService.kt index 790beb9c0da5aed08d6478f66b9b245d83a278cf..e9e3a09a8f8e9e0325da9b0802ad9ce71fe9d814 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/applicationconfiguration/ApplicationConfigurationService.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/applicationconfiguration/ApplicationConfigurationService.kt @@ -1,12 +1,29 @@ package de.rki.coronawarnapp.service.applicationconfiguration import com.google.android.gms.nearby.exposurenotification.ExposureConfiguration -import de.rki.coronawarnapp.http.WebRequestBuilder import de.rki.coronawarnapp.server.protocols.ApplicationConfigurationOuterClass.ApplicationConfiguration +import de.rki.coronawarnapp.util.CWADebug +import de.rki.coronawarnapp.util.di.AppInjector object ApplicationConfigurationService { suspend fun asyncRetrieveApplicationConfiguration(): ApplicationConfiguration { - return WebRequestBuilder.getInstance().asyncGetApplicationConfigurationFromServer() + return AppInjector.component.appConfigServer.downloadAppConfig().let { + if (CWADebug.isDebugBuildOrMode) { + // TODO: THIS IS A MOCK -> Remove after Backend is providing this information. + it.toBuilder() + .clearSupportedCountries() + .addAllSupportedCountries( + listOf( + "DE", "UK", "FR", "IT", "SP", "PL", "RO", "NL", + "BE", "CZ", "EL", "SE", "PT", "HU", "AT", "CH", "BG", "DK", "FI", "SK", + "NO", "IE", "HR", "SI", "LT", "LV", "EE", "CY", "LU", "MT", "IS" + ) + ) + .build() + } else { + it + } + } } suspend fun asyncRetrieveExposureConfiguration(): ExposureConfiguration = diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstants.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstants.kt index c9010f1086dd00ee23a1f129b09ec083e5d242fa..8acfd1c5ef294aa6c840e679d4cbf1864b22b51c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstants.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstants.kt @@ -26,56 +26,17 @@ object DiagnosisKeyConstants { /** version resource variable for REST-like Service Calls */ private const val VERSION = "version" - /** parameter resource variable for REST-like Service Calls */ - private const val PARAMETERS = "parameters" - private const val APPCONFIG = "configuration" - /** diagnosis keys resource variable for REST-like Service Calls */ private const val DIAGNOSIS_KEYS = "diagnosis-keys" - /** country resource variable for REST-like Service Calls */ - private const val COUNTRY = "country" - - /** date resource variable for REST-like Service Calls */ - private const val DATE = "date" - - /** hour resource variable for REST-like Service Calls */ - const val HOUR = "hour" - - private const val INDEX_FILE_NAME = "index.txt" - /** resource variables but non-static context */ private var CURRENT_VERSION = "v1" - private var CURRENT_COUNTRY = "DE" - - /** Distribution URL built from CDN URL's and REST resources */ - private var VERSIONED_DISTRIBUTION_CDN_URL = "$VERSION/$CURRENT_VERSION" /** Submission URL built from CDN URL's and REST resources */ private var VERSIONED_SUBMISSION_CDN_URL = "$VERSION/$CURRENT_VERSION" - /** Parameter Download URL built from CDN URL's and REST resources */ - private val PARAMETERS_DOWNLOAD_URL = "$VERSIONED_DISTRIBUTION_CDN_URL/$PARAMETERS" - private val APPCONFIG_DOWNLOAD_URL = "$VERSIONED_DISTRIBUTION_CDN_URL/$APPCONFIG" - - /** Index Download URL built from CDN URL's and REST resources */ - val INDEX_DOWNLOAD_URL = "$VERSIONED_DISTRIBUTION_CDN_URL/$INDEX_FILE_NAME" - - /** Diagnosis key Download URL built from CDN URL's and REST resources */ - val DIAGNOSIS_KEYS_DOWNLOAD_URL = "$VERSIONED_DISTRIBUTION_CDN_URL/$DIAGNOSIS_KEYS" - /** Diagnosis key Submission URL built from CDN URL's and REST resources */ val DIAGNOSIS_KEYS_SUBMISSION_URL = "$VERSIONED_SUBMISSION_CDN_URL/$DIAGNOSIS_KEYS" - /** Country-Specific Parameter URL built from CDN URL's and REST resources */ - val PARAMETERS_COUNTRY_DOWNLOAD_URL = "$PARAMETERS_DOWNLOAD_URL/$COUNTRY" - val APPCONFIG_COUNTRY_DOWNLOAD_URL = "$APPCONFIG_DOWNLOAD_URL/$COUNTRY" - - val COUNTRY_APPCONFIG_DOWNLOAD_URL = - "$APPCONFIG_COUNTRY_DOWNLOAD_URL/$CURRENT_COUNTRY/app_config" - - /** Available Dates URL built from CDN URL's and REST resources */ - val AVAILABLE_DATES_URL = "$DIAGNOSIS_KEYS_DOWNLOAD_URL/$COUNTRY/$CURRENT_COUNTRY/$DATE" - const val SERVER_ERROR_CODE_403 = 403 } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppDatabase.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppDatabase.kt index ce4640c15db065cd1bde1485ebaf723f3c43ab3d..454055162dc1c14c57945c1ae1b3e3b97f177631 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppDatabase.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppDatabase.kt @@ -7,27 +7,28 @@ import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.TypeConverters -import de.rki.coronawarnapp.storage.keycache.KeyCacheDao -import de.rki.coronawarnapp.storage.keycache.KeyCacheEntity -import de.rki.coronawarnapp.storage.keycache.KeyCacheRepository +import de.rki.coronawarnapp.diagnosiskeys.storage.legacy.KeyCacheLegacyDao +import de.rki.coronawarnapp.diagnosiskeys.storage.legacy.KeyCacheLegacyEntity import de.rki.coronawarnapp.storage.tracing.TracingIntervalDao import de.rki.coronawarnapp.storage.tracing.TracingIntervalEntity import de.rki.coronawarnapp.storage.tracing.TracingIntervalRepository -import de.rki.coronawarnapp.util.Converters +import de.rki.coronawarnapp.util.database.CommonConverters +import de.rki.coronawarnapp.util.di.AppInjector import de.rki.coronawarnapp.util.security.SecurityHelper +import kotlinx.coroutines.runBlocking import net.sqlcipher.database.SupportFactory import java.io.File @Database( - entities = [ExposureSummaryEntity::class, KeyCacheEntity::class, TracingIntervalEntity::class], + entities = [ExposureSummaryEntity::class, KeyCacheLegacyEntity::class, TracingIntervalEntity::class], version = 1, exportSchema = true ) -@TypeConverters(Converters::class) +@TypeConverters(CommonConverters::class) abstract class AppDatabase : RoomDatabase() { abstract fun exposureSummaryDao(): ExposureSummaryDao - abstract fun dateDao(): KeyCacheDao + abstract fun dateDao(): KeyCacheLegacyDao abstract fun tracingIntervalDao(): TracingIntervalDao companion object { @@ -54,7 +55,8 @@ abstract class AppDatabase : RoomDatabase() { resetInstance() // reset also the repo instances - KeyCacheRepository.resetInstance() + val keyRepository = AppInjector.component.keyCacheRepository + runBlocking { keyRepository.clear() } // TODO this is not nice TracingIntervalRepository.resetInstance() ExposureSummaryRepository.resetInstance() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppSettings.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppSettings.kt new file mode 100644 index 0000000000000000000000000000000000000000..f687e24adf587300bfb131d4bc42d1d9b6bffde6 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/AppSettings.kt @@ -0,0 +1,11 @@ +package de.rki.coronawarnapp.storage + +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class AppSettings @Inject constructor() { + + val isLast3HourModeEnabled: Boolean + get() = LocalData.last3HoursMode() +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/DeviceStorage.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/DeviceStorage.kt index 40bb35e9cbdbcc561e9c6a0f8f0f84b4895a6803..75caa3780c90ee9cabf8ef7a61433d3ffe35e87f 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/DeviceStorage.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/DeviceStorage.kt @@ -6,10 +6,11 @@ import android.content.Context import android.os.Build import android.os.storage.StorageManager import android.text.format.Formatter -import androidx.annotation.WorkerThread import dagger.Reusable import de.rki.coronawarnapp.util.ApiLevel import de.rki.coronawarnapp.util.storage.StatsFsProvider +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import timber.log.Timber import java.io.File import java.io.IOException @@ -55,6 +56,7 @@ class DeviceStorage @Inject constructor( return CheckResult( path = targetPath, isSpaceAvailable = availableBytes >= requiredBytes || requiredBytes == -1L, + requiredBytes = requiredBytes, freeBytes = availableBytes, totalBytes = totalBytes ) @@ -70,14 +72,16 @@ class DeviceStorage @Inject constructor( return CheckResult( path = targetPath, isSpaceAvailable = stats.availableBytes >= requiredBytes || requiredBytes == -1L, + requiredBytes = requiredBytes, freeBytes = stats.availableBytes, totalBytes = stats.totalBytes ) } - @WorkerThread - @Throws(IOException::class) - private fun checkSpace(path: File, requiredBytes: Long = -1L): CheckResult { + private suspend fun checkSpace( + path: File, + requiredBytes: Long = -1L + ): CheckResult = withContext(Dispatchers.IO) { try { Timber.tag(TAG).v("checkSpace(path=%s, requiredBytes=%d)", path, requiredBytes) val result: CheckResult = if (apiLevel.hasAPILevel(Build.VERSION_CODES.O)) { @@ -92,7 +96,7 @@ class DeviceStorage @Inject constructor( } Timber.tag(TAG).d("Requested %d from %s: %s", requiredBytes, path, result) - return result + return@withContext result } catch (e: Exception) { throw IOException("checkSpace(path=$path, requiredBytes=$requiredBytes) FAILED", e) .also { Timber.tag(TAG).e(it) } @@ -108,14 +112,13 @@ class DeviceStorage @Inject constructor( * * @throws IOException if storage check or allocation fails. */ - @WorkerThread - @Throws(IOException::class) - fun checkSpacePrivateStorage(requiredBytes: Long = -1L): CheckResult = + suspend fun checkSpacePrivateStorage(requiredBytes: Long = -1L): CheckResult = checkSpace(privateStorage, requiredBytes) data class CheckResult( val path: File, val isSpaceAvailable: Boolean, + val requiredBytes: Long = -1L, val freeBytes: Long, val totalBytes: Long ) { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/FileStorageConstants.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/FileStorageConstants.kt deleted file mode 100644 index 9571157bb5f46f21dc511ebe3f7d96ad0a779fec..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/FileStorageConstants.kt +++ /dev/null @@ -1,18 +0,0 @@ -package de.rki.coronawarnapp.storage - -/** - * The File Storage constants are used inside the FileStorageHelper - * - * @see FileStorageHelper - */ -object FileStorageConstants { - - /** Days to keep data in internal storage */ - const val DAYS_TO_KEEP: Long = 14 - - /** Size (Mb) threshold for free space check */ - const val FREE_SPACE_THRESHOLD = 15 - - /** Key export directory name in internal storage */ - const val KEY_EXPORT_DIRECTORY_NAME = "key-export" -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/FileStorageHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/FileStorageHelper.kt deleted file mode 100644 index 44442e9e61db22babad2aeb451523e1d5e897292..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/FileStorageHelper.kt +++ /dev/null @@ -1,90 +0,0 @@ -package de.rki.coronawarnapp.storage - -import android.content.Context -import android.os.Build -import android.os.storage.StorageManager -import de.rki.coronawarnapp.CoronaWarnApplication -import de.rki.coronawarnapp.exception.NotEnoughSpaceOnDiskException -import timber.log.Timber -import java.io.File -import java.util.UUID -import java.util.concurrent.TimeUnit - -/** - * A helper class for file storage manipulation - * The helper uses externalised constants for readability. - * - * @see FileStorageConstants - */ -object FileStorageHelper { - - private val TAG: String? = FileStorageHelper::class.simpleName - private val TIME_TO_KEEP = TimeUnit.DAYS.toMillis(FileStorageConstants.DAYS_TO_KEEP) - private const val BYTES = 1048576 - - /** - * create the needed key export directory (recursively) - * - */ - fun initializeExportSubDirectory() = keyExportDirectory.mkdirs() - - /** - * Get key files export directory used to store all export files for the transaction - * Uses FileStorageConstants.KEY_EXPORT_DIRECTORY_NAME constant - * - * @return File of key export directory - */ - val keyExportDirectory = File( - CoronaWarnApplication.getAppContext().cacheDir, - FileStorageConstants.KEY_EXPORT_DIRECTORY_NAME - ) - - /** - * Checks if internal store has free memory. - * Threshold: FileStorageConstants.FREE_SPACE_THRESHOLD - * Bound to .usableSpace due to API level restrictions (minimum required level - 23) - */ - fun checkFileStorageFreeSpace() { - val availableSpace = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val storageManager = CoronaWarnApplication.getAppContext() - .getSystemService(Context.STORAGE_SERVICE) as StorageManager - val storageVolume = storageManager.primaryStorageVolume - val storageUUID = - UUID.fromString(storageVolume.uuid ?: StorageManager.UUID_DEFAULT.toString()) - storageManager.getAllocatableBytes(storageUUID) / BYTES - } else { - keyExportDirectory.usableSpace / BYTES - } - if (availableSpace < FileStorageConstants.FREE_SPACE_THRESHOLD) { - throw NotEnoughSpaceOnDiskException() - } - } - - fun getAllFilesInKeyExportDirectory(): List<File> { - return keyExportDirectory - .walk(FileWalkDirection.BOTTOM_UP) - .filter(File::isFile) - .toList() - } - - fun File.isOutdated(): Boolean = - (System.currentTimeMillis() - lastModified() > TIME_TO_KEEP) - - private fun File.checkAndRemove(): Boolean { - return if (exists() && isDirectory) { - deleteRecursively() - } else { - false - } - } - - // LOGGING - private fun logFileRemovalResult(fileName: String, result: Boolean) = - Timber.d("File $fileName was deleted: $result") - - private fun logAvailableSpace(availableSpace: Long) = - Timber.d("Available space: $availableSpace") - - private fun logInsufficientSpace(availableSpace: Long) = - Timber.e("Not enough free space! Required: ${FileStorageConstants.FREE_SPACE_THRESHOLD} Has: $availableSpace") -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/InsufficientStorageException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/InsufficientStorageException.kt new file mode 100644 index 0000000000000000000000000000000000000000..32d18cb7c2784b112e909947dcc80a9cbe57fb91 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/InsufficientStorageException.kt @@ -0,0 +1,7 @@ +package de.rki.coronawarnapp.storage + +import java.io.IOException + +class InsufficientStorageException( + val result: DeviceStorage.CheckResult +) : IOException("Not enough free space (Want:${result.requiredBytes}; Have:${result.freeBytes}") diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/keycache/KeyCacheDao.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/keycache/KeyCacheDao.kt deleted file mode 100644 index 0e6cbeadb1b6f5e2f6b5c06b6668ad3a80fab963..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/keycache/KeyCacheDao.kt +++ /dev/null @@ -1,55 +0,0 @@ -/****************************************************************************** - * Corona-Warn-App * - * * - * SAP SE and all other contributors / * - * copyright owners license this file to you under the Apache * - * License, Version 2.0 (the "License"); you may not use this * - * file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ******************************************************************************/ - -package de.rki.coronawarnapp.storage.keycache - -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.Query - -@Dao -interface KeyCacheDao { - @Query("SELECT * FROM date WHERE type=0") - suspend fun getDates(): List<KeyCacheEntity> - - @Query("SELECT * FROM date WHERE type=1") - suspend fun getHours(): List<KeyCacheEntity> - - @Query("SELECT * FROM date") - suspend fun getAllEntries(): List<KeyCacheEntity> - - @Query("SELECT * FROM date WHERE id IN (:idList)") - suspend fun getAllEntries(idList: List<String>): List<KeyCacheEntity> - - @Query("DELETE FROM date") - suspend fun clear() - - @Query("DELETE FROM date WHERE type=1") - suspend fun clearHours() - - @Delete - suspend fun deleteEntry(entity: KeyCacheEntity) - - @Delete - suspend fun deleteEntries(entities: List<KeyCacheEntity>) - - @Insert - suspend fun insertEntry(keyCacheEntity: KeyCacheEntity): Long -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/keycache/KeyCacheRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/keycache/KeyCacheRepository.kt deleted file mode 100644 index dd6b6425d39da8b125aac2b520d3e9f5f3ee7d5b..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/keycache/KeyCacheRepository.kt +++ /dev/null @@ -1,103 +0,0 @@ -/****************************************************************************** - * Corona-Warn-App * - * * - * SAP SE and all other contributors / * - * copyright owners license this file to you under the Apache * - * License, Version 2.0 (the "License"); you may not use this * - * file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ******************************************************************************/ - -package de.rki.coronawarnapp.storage.keycache - -import android.content.Context -import de.rki.coronawarnapp.storage.AppDatabase -import timber.log.Timber -import java.io.File -import java.net.URI - -class KeyCacheRepository(private val keyCacheDao: KeyCacheDao) { - companion object { - @Volatile - private var instance: KeyCacheRepository? = null - - private fun getInstance(keyCacheDao: KeyCacheDao) = - instance ?: synchronized(this) { - instance - ?: KeyCacheRepository(keyCacheDao) - .also { instance = it } - } - - fun resetInstance() = synchronized(this) { - instance = null - } - - fun getDateRepository(context: Context): KeyCacheRepository { - return getInstance( - AppDatabase.getInstance(context.applicationContext) - .dateDao() - ) - } - } - - enum class DateEntryType { - DAY, - HOUR - } - - suspend fun createEntry(key: String, uri: URI, type: DateEntryType) = keyCacheDao.insertEntry( - KeyCacheEntity().apply { - this.id = key - this.path = uri.rawPath - this.type = type.ordinal - } - ) - - suspend fun deleteOutdatedEntries(validEntries: List<String>) = - keyCacheDao.getAllEntries().forEach { - Timber.v("valid entries for cache from server: $validEntries") - val file = File(it.path) - if (!validEntries.contains(it.id) || !file.exists()) { - Timber.w("${it.id} will be deleted from the cache") - deleteFileForEntry(it) - keyCacheDao.deleteEntry(it) - } - } - - private fun deleteFileForEntry(entry: KeyCacheEntity) = File(entry.path).delete() - - suspend fun getDates() = keyCacheDao.getDates() - suspend fun getHours() = keyCacheDao.getHours() - - suspend fun clearHours() { - getHours().forEach { deleteFileForEntry(it) } - keyCacheDao.clearHours() - } - - suspend fun clear() { - keyCacheDao.getAllEntries().forEach { deleteFileForEntry(it) } - keyCacheDao.clear() - } - - suspend fun clear(idList: List<String>) { - if (idList.isNotEmpty()) { - val entries = keyCacheDao.getAllEntries(idList) - entries.forEach { deleteFileForEntry(it) } - keyCacheDao.deleteEntries(entries) - } - } - - suspend fun getFilesFromEntries() = keyCacheDao - .getAllEntries() - .map { File(it.path) } - .filter { it.exists() } -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RetrieveDiagnosisKeysTransaction.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RetrieveDiagnosisKeysTransaction.kt index c37880ad279709bc4ac3d773539980be85ef7db1..ff77253438bce970b14a08837aadc11fcf1f5460 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RetrieveDiagnosisKeysTransaction.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RetrieveDiagnosisKeysTransaction.kt @@ -20,9 +20,11 @@ package de.rki.coronawarnapp.transaction import com.google.android.gms.nearby.exposurenotification.ExposureConfiguration +import de.rki.coronawarnapp.diagnosiskeys.download.KeyFileDownloader +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import de.rki.coronawarnapp.diagnosiskeys.storage.KeyCacheRepository import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient import de.rki.coronawarnapp.service.applicationconfiguration.ApplicationConfigurationService -import de.rki.coronawarnapp.storage.FileStorageHelper import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction.RetrieveDiagnosisKeysTransactionState.API_SUBMISSION import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction.RetrieveDiagnosisKeysTransactionState.CLOSE @@ -34,7 +36,7 @@ import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction.Retriev import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction.RetrieveDiagnosisKeysTransactionState.TOKEN import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction.rollback import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction.start -import de.rki.coronawarnapp.util.CachedKeyFileHolder +import de.rki.coronawarnapp.util.CWADebug import de.rki.coronawarnapp.util.GoogleAPIVersion import de.rki.coronawarnapp.util.GoogleQuotaCalculator import de.rki.coronawarnapp.util.QuotaCalculator @@ -131,6 +133,18 @@ object RetrieveDiagnosisKeysTransaction : Transaction() { private val transactionScope: TransactionCoroutineScope by lazy { AppInjector.component.transRetrieveKeysInjection.transactionScope } + private val keyCacheRepository: KeyCacheRepository by lazy { + AppInjector.component.keyCacheRepository + } + private val keyFileDownloader: KeyFileDownloader by lazy { + AppInjector.component.keyFileDownloader + } + + var onApiSubmissionStarted: (() -> Unit)? = null + var onApiSubmissionFinished: (() -> Unit)? = null + + var onKeyFilesDownloadStarted: (() -> Unit)? = null + var onKeyFilesDownloadFinished: ((keyCount: Int, fileSize: Long) -> Unit)? = null private const val QUOTA_RESET_PERIOD_IN_HOURS = 24 @@ -164,8 +178,14 @@ object RetrieveDiagnosisKeysTransaction : Transaction() { } } - /** initiates the transaction. This suspend function guarantees a successful transaction once completed. */ - suspend fun start() = lockAndExecute(unique = true, scope = transactionScope) { + /** initiates the transaction. This suspend function guarantees a successful transaction once completed. + * @param requestedCountries defines which countries (country codes) should be used. If not filled the + * country codes will be loaded from the ApplicationConfigurationService + */ + suspend fun start( + requestedCountries: List<String>? = null + ) = lockAndExecute(unique = true, scope = transactionScope) { + /** * Handles the case when the ENClient got disabled but the Transaction is still scheduled * in a background job. Also it acts as a failure catch in case the orchestration code did @@ -206,7 +226,30 @@ object RetrieveDiagnosisKeysTransaction : Transaction() { /**************************************************** * FILES FROM WEB REQUESTS ****************************************************/ - val keyFiles = executeFetchKeyFilesFromServer(currentDate) + val countries = requestedCountries ?: ApplicationConfigurationService + .asyncRetrieveApplicationConfiguration() + .supportedCountriesList + + if (CWADebug.isDebugBuildOrMode) { + onKeyFilesDownloadStarted?.invoke() + onKeyFilesDownloadStarted = null + } + + val keyFiles = executeFetchKeyFilesFromServer(countries) + + if (CWADebug.isDebugBuildOrMode) { + val totalFileSize = keyFiles.fold(0L, { acc, file -> + file.length() + acc + }) + + onKeyFilesDownloadFinished?.invoke(keyFiles.size, totalFileSize) + onKeyFilesDownloadFinished = null + } + + if (CWADebug.isDebugBuildOrMode) { + onApiSubmissionStarted?.invoke() + onApiSubmissionStarted = null + } if (keyFiles.isNotEmpty()) { /**************************************************** @@ -216,10 +259,17 @@ object RetrieveDiagnosisKeysTransaction : Transaction() { } else { Timber.tag(TAG).w("no key files, skipping submission to internal API.") } + + if (CWADebug.isDebugBuildOrMode) { + onApiSubmissionFinished?.invoke() + onApiSubmissionFinished = null + } + /**************************************************** * Fetch Date Update ****************************************************/ executeFetchDateUpdate(currentDate) + /**************************************************** * CLOSE TRANSACTION ****************************************************/ @@ -303,10 +353,10 @@ object RetrieveDiagnosisKeysTransaction : Transaction() { * Executes the WEB_REQUESTS Transaction State */ private suspend fun executeFetchKeyFilesFromServer( - currentDate: Date + countries: List<String> ) = executeState(FILES_FROM_WEB_REQUESTS) { - FileStorageHelper.initializeExportSubDirectory() - CachedKeyFileHolder.asyncFetchFiles(currentDate) + val locationCodes = countries.map { LocationCode(it) } + keyFileDownloader.asyncFetchKeyFiles(locationCodes) } /** diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionCountry.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionCountry.kt new file mode 100644 index 0000000000000000000000000000000000000000..b4d661288920edd94ffb8c76c7949cc3849fcdb7 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionCountry.kt @@ -0,0 +1,3 @@ +package de.rki.coronawarnapp.ui.submission + +data class SubmissionCountry(val countryCode: String, var selected: Boolean = false) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/adapter/SubmissionCountrySelectionAdapter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/adapter/SubmissionCountrySelectionAdapter.kt new file mode 100644 index 0000000000000000000000000000000000000000..8ad1c4eef9f482eeb04b697e483b99d90b19ebe1 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/adapter/SubmissionCountrySelectionAdapter.kt @@ -0,0 +1,55 @@ +package de.rki.coronawarnapp.ui.submission.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import de.rki.coronawarnapp.databinding.IncludeSubmissionCountryItemBinding +import de.rki.coronawarnapp.ui.submission.SubmissionCountry + +class SubmissionCountrySelectionAdapter(private val onCountrySelectionListener: (SubmissionCountry) -> Unit) : + RecyclerView.Adapter<SubmissionCountrySelectionAdapter.SubmissionCountryHolder>() { + private var _countries = emptyList<SubmissionCountry>() + + fun setCountries(countries: List<SubmissionCountry>) { + _countries = countries + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SubmissionCountryHolder { + val inflater = LayoutInflater.from(parent.context) + return SubmissionCountryHolder( + IncludeSubmissionCountryItemBinding.inflate( + inflater, + parent, + false + ) + ) + } + + override fun getItemCount() = _countries.size + + override fun onBindViewHolder(holder: SubmissionCountryHolder, position: Int) { + holder.bind(_countries[position], onCountrySelectionListener) + } + + class SubmissionCountryHolder(private val viewDataBinding: IncludeSubmissionCountryItemBinding) : + RecyclerView.ViewHolder(viewDataBinding.root) { + fun bind( + country: SubmissionCountry, + onCountrySelectionListener: (SubmissionCountry) -> Unit + ) { + viewDataBinding.submissionCountry = country + viewDataBinding.executePendingBindings() + + viewDataBinding.submissionCountrySelectorCountryBody.setOnClickListener { + country.selected = !country.selected + onCountrySelectionListener(country) + } + + viewDataBinding.submissionCountrySelectorCountryRadiobutton.setOnCheckedChangeListener { _, isChecked -> + country.selected = isChecked + onCountrySelectionListener(country) + } + } + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionContactFragment.kt similarity index 97% rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionContactFragment.kt index fbe556bd8386b1aa2caa6241b9ddb3eadf59ad2a..85b74e67c5c4b6010dc4e37002fed6e21c7f1e74 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionContactFragment.kt @@ -1,4 +1,4 @@ -package de.rki.coronawarnapp.ui.submission +package de.rki.coronawarnapp.ui.submission.fragment import android.os.Bundle import android.view.View diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionCountrySelectionFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionCountrySelectionFragment.kt new file mode 100644 index 0000000000000000000000000000000000000000..c3a9a3130e34369ebae1e1ad2bb48881bcf2bc9c --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionCountrySelectionFragment.kt @@ -0,0 +1,63 @@ +package de.rki.coronawarnapp.ui.submission.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import de.rki.coronawarnapp.databinding.FragmentSubmissionCountrySelectionBinding +import de.rki.coronawarnapp.ui.submission.adapter.SubmissionCountrySelectionAdapter +import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionCountrySelectViewModel + +class SubmissionCountrySelectionFragment : Fragment() { + + companion object { + private val TAG: String? = SubmissionCountrySelectionFragment::class.simpleName + } + + private val viewModel: SubmissionCountrySelectViewModel by viewModels() + private var _binding: FragmentSubmissionCountrySelectionBinding? = null + private val binding: FragmentSubmissionCountrySelectionBinding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentSubmissionCountrySelectionBinding.inflate(inflater) + binding.submissionCountrySelectViewModel = viewModel + binding.lifecycleOwner = this + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val adapter = SubmissionCountrySelectionAdapter { + viewModel.updateCountryCheckedState(it) + } + + viewModel.countries.observe(viewLifecycleOwner, Observer { + adapter.setCountries(it) + }) + + binding.submissionCountrySelectionSelector.submissionCountrySelectorRecyclerview.adapter = + adapter + + binding.submissionCountrySelectionSelector.submissionCountrySelectorRecyclerview.layoutManager = + LinearLayoutManager(context) + + binding.submissionCountrySelectionNoSelection.submissionCountryNoSelectionContainer.setOnClickListener { + viewModel.noInfoClick() + } + + viewModel.fetchCountries() + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionDispatcherFragment.kt similarity index 84% rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragment.kt rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionDispatcherFragment.kt index 88a36ec175467f01258e585b82dcaac5d2ec8337..128285d437cf68c4bb4fa31752120117d040fcec 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionDispatcherFragment.kt @@ -1,4 +1,4 @@ -package de.rki.coronawarnapp.ui.submission +package de.rki.coronawarnapp.ui.submission.fragment import android.os.Bundle import android.view.View @@ -35,14 +35,12 @@ class SubmissionDispatcherFragment : Fragment(R.layout.fragment_submission_dispa } binding.submissionDispatcherContent.submissionDispatcherTanCode.dispatcherCard.setOnClickListener { findNavController().doNavigate( - SubmissionDispatcherFragmentDirections - .actionSubmissionDispatcherFragmentToSubmissionTanFragment() + SubmissionDispatcherFragmentDirections.actionSubmissionDispatcherFragmentToSubmissionTanFragment() ) } binding.submissionDispatcherContent.submissionDispatcherTanTele.dispatcherCard.setOnClickListener { findNavController().doNavigate( - SubmissionDispatcherFragmentDirections - .actionSubmissionDispatcherFragmentToSubmissionContactFragment() + SubmissionDispatcherFragmentDirections.actionSubmissionDispatcherFragmentToSubmissionContactFragment() ) } } @@ -65,8 +63,7 @@ class SubmissionDispatcherFragment : Fragment(R.layout.fragment_submission_dispa private fun privacyPermissionIsGranted() { findNavController().doNavigate( - SubmissionDispatcherFragmentDirections - .actionSubmissionDispatcherFragmentToSubmissionQRCodeScanFragment() + SubmissionDispatcherFragmentDirections.actionSubmissionDispatcherFragmentToSubmissionQRCodeScanFragment() ) } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDoneFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionDoneFragment.kt similarity index 96% rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDoneFragment.kt rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionDoneFragment.kt index 1dd63dc668176ff421bdc3e0423de98f2186f481..c8ebbb8a02ebd71d66e335427000101c60fb6184 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionDoneFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionDoneFragment.kt @@ -1,4 +1,4 @@ -package de.rki.coronawarnapp.ui.submission +package de.rki.coronawarnapp.ui.submission.fragment import android.os.Bundle import android.view.View diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionIntroFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionIntroFragment.kt similarity index 96% rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionIntroFragment.kt rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionIntroFragment.kt index 23542b53d7a5e2829c17a2e944d62c528cbd7d01..cf00793bd02a96a8d4449a7a8df96af0a69a040d 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionIntroFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionIntroFragment.kt @@ -1,4 +1,4 @@ -package de.rki.coronawarnapp.ui.submission +package de.rki.coronawarnapp.ui.submission.fragment import android.os.Bundle import android.view.View diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionQRCodeScanFragment.kt similarity index 98% rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionQRCodeScanFragment.kt index 1e2afb6a6f1b9179a9323570350ac65ea558c893..395769997db4c0b9672fd3d83ecb0b1b684a1add 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionQRCodeScanFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionQRCodeScanFragment.kt @@ -1,4 +1,4 @@ -package de.rki.coronawarnapp.ui.submission +package de.rki.coronawarnapp.ui.submission.fragment import android.Manifest import android.content.pm.PackageManager @@ -19,6 +19,8 @@ import de.rki.coronawarnapp.exception.http.CwaServerError import de.rki.coronawarnapp.exception.http.CwaWebException import de.rki.coronawarnapp.ui.doNavigate import de.rki.coronawarnapp.ui.main.MainActivity +import de.rki.coronawarnapp.ui.submission.ApiRequestState +import de.rki.coronawarnapp.ui.submission.ScanStatus import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel import de.rki.coronawarnapp.util.CameraPermissionHelper import de.rki.coronawarnapp.util.DialogHelper diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionResultPositiveOtherWarningFragment.kt similarity index 98% rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionResultPositiveOtherWarningFragment.kt index e00cc42d758335770e1561b5ad86d3ebd422629a..5f3595ba3f003ad215c284aeb5174998ed3cbbf7 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionResultPositiveOtherWarningFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionResultPositiveOtherWarningFragment.kt @@ -1,4 +1,4 @@ -package de.rki.coronawarnapp.ui.submission +package de.rki.coronawarnapp.ui.submission.fragment import android.content.Intent import android.os.Bundle @@ -18,6 +18,7 @@ import de.rki.coronawarnapp.exception.http.CwaServerError import de.rki.coronawarnapp.exception.http.ForbiddenException import de.rki.coronawarnapp.nearby.InternalExposureNotificationPermissionHelper import de.rki.coronawarnapp.ui.doNavigate +import de.rki.coronawarnapp.ui.submission.ApiRequestState import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel import de.rki.coronawarnapp.ui.viewmodel.TracingViewModel import de.rki.coronawarnapp.util.DialogHelper diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionTanFragment.kt similarity index 95% rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionTanFragment.kt index 22abfc8ac798dd1c7d9e7aa3335d5d4c60fb3abd..b078ad1f964985625e333fdeae8b0166fe800a09 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionTanFragment.kt @@ -1,4 +1,4 @@ -package de.rki.coronawarnapp.ui.submission +package de.rki.coronawarnapp.ui.submission.fragment import android.os.Bundle import android.view.View @@ -15,6 +15,9 @@ import de.rki.coronawarnapp.exception.http.CwaServerError import de.rki.coronawarnapp.exception.http.CwaWebException import de.rki.coronawarnapp.ui.doNavigate import de.rki.coronawarnapp.ui.main.MainActivity +import de.rki.coronawarnapp.ui.submission.ApiRequestState +import de.rki.coronawarnapp.ui.submission.TanConstants +import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionTanViewModel import de.rki.coronawarnapp.ui.viewmodel.SubmissionViewModel import de.rki.coronawarnapp.util.DialogHelper import de.rki.coronawarnapp.util.TanHelper diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionTestResultFragment.kt similarity index 99% rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragment.kt rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionTestResultFragment.kt index 3971848bed301ac87f7a11a9ba43709e6c721651..cc109856925f49d24993b308bafea5a2bbe672a8 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/fragment/SubmissionTestResultFragment.kt @@ -1,4 +1,4 @@ -package de.rki.coronawarnapp.ui.submission +package de.rki.coronawarnapp.ui.submission.fragment import android.app.AlertDialog import android.os.Bundle diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/viewmodel/SubmissionCountrySelectViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/viewmodel/SubmissionCountrySelectViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..72bf21e7d243f014fa9b423e809afbbfe4917542 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/viewmodel/SubmissionCountrySelectViewModel.kt @@ -0,0 +1,73 @@ +package de.rki.coronawarnapp.ui.submission.viewmodel + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MediatorLiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import de.rki.coronawarnapp.ui.submission.SubmissionCountry + +class SubmissionCountrySelectViewModel : ViewModel() { + private val _countries = MutableLiveData<List<SubmissionCountry>>(listOf()) + private val _countriesActive = MediatorLiveData<Boolean>() + private val _noInfoActive = MediatorLiveData<Boolean>() + private val _nextActive = MediatorLiveData<Boolean>() + + val countries: LiveData<List<SubmissionCountry>> = _countries + val countriesActive: LiveData<Boolean> = _countriesActive + val noInfoActive: LiveData<Boolean> = _noInfoActive + val nextActive: LiveData<Boolean> = _nextActive + + init { + _countriesActive.addSource(countries) { countries -> + _countriesActive.value = countries.any { it.selected } + } + + _noInfoActive.addSource(countriesActive) { + if (it) { + _noInfoActive.value = false + } + } + + _nextActive.addSource(countriesActive) { + if (it) { + _nextActive.value = true + } + if (!it && noInfoActive.value == false) { + _nextActive.value = false + } + } + _nextActive.addSource(noInfoActive) { + if (it) { + _nextActive.value = true + } + } + } + + fun noInfoClick() { + _countries.value?.let { currentCountries -> + _countries.postValue(currentCountries.map { it.apply { selected = false } }) + } + + _noInfoActive.postValue(true) + } + + fun fetchCountries() { + _countries.postValue( + listOf( + SubmissionCountry("IT"), + SubmissionCountry("ES") + ) + ) + } + + fun updateCountryCheckedState(country: SubmissionCountry) { + val newCountries = _countries.value?.map { + if (it.countryCode == country.countryCode) it.apply { + selected = country.selected + } else it + } + if (newCountries != null) { + _countries.postValue(newCountries) + } + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/viewmodel/SubmissionTanViewModel.kt similarity index 88% rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModel.kt rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/viewmodel/SubmissionTanViewModel.kt index 849aebddf36ed17417e72c4ad8c73c1506ca0fc0..44cf0d79752998da10f5812a48af0a51437425f2 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/viewmodel/SubmissionTanViewModel.kt @@ -1,9 +1,10 @@ -package de.rki.coronawarnapp.ui.submission +package de.rki.coronawarnapp.ui.submission.viewmodel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Transformations import androidx.lifecycle.ViewModel import de.rki.coronawarnapp.storage.SubmissionRepository +import de.rki.coronawarnapp.ui.submission.TanConstants import de.rki.coronawarnapp.util.TanHelper import timber.log.Timber diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CachedKeyFileHolder.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CachedKeyFileHolder.kt deleted file mode 100644 index bd7a7158e751f49f5711566856405186c1617b80..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CachedKeyFileHolder.kt +++ /dev/null @@ -1,224 +0,0 @@ -/****************************************************************************** - * Corona-Warn-App * - * * - * SAP SE and all other contributors / * - * copyright owners license this file to you under the Apache * - * License, Version 2.0 (the "License"); you may not use this * - * file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ******************************************************************************/ - -package de.rki.coronawarnapp.util - -import de.rki.coronawarnapp.BuildConfig -import de.rki.coronawarnapp.CoronaWarnApplication -import de.rki.coronawarnapp.http.WebRequestBuilder -import de.rki.coronawarnapp.service.diagnosiskey.DiagnosisKeyConstants -import de.rki.coronawarnapp.storage.FileStorageHelper -import de.rki.coronawarnapp.storage.LocalData -import de.rki.coronawarnapp.storage.keycache.KeyCacheEntity -import de.rki.coronawarnapp.storage.keycache.KeyCacheRepository -import de.rki.coronawarnapp.storage.keycache.KeyCacheRepository.DateEntryType.DAY -import de.rki.coronawarnapp.util.CachedKeyFileHolder.asyncFetchFiles -import de.rki.coronawarnapp.util.TimeAndDateExtensions.toServerFormat -import kotlinx.coroutines.Deferred -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.async -import kotlinx.coroutines.awaitAll -import kotlinx.coroutines.withContext -import timber.log.Timber -import java.io.File -import java.io.IOException -import java.util.Collections -import java.util.Date -import java.util.UUID - -/** - * Singleton used for accessing key files via combining cached entries from existing files and new requests. - * made explicitly with [asyncFetchFiles] in mind - */ -object CachedKeyFileHolder { - private val TAG: String? = CachedKeyFileHolder::class.simpleName - - /** - * the key cache instance used to store queried dates and hours - */ - private val keyCache = - KeyCacheRepository.getDateRepository(CoronaWarnApplication.getAppContext()) - - /** - * Fetches all necessary Files from the Cached KeyFile Entries out of the [KeyCacheRepository] and - * adds to that all open Files currently available from the Server. - * - * Assumptions made about the implementation: - * - the app initializes with an empty cache and draws in every available data set in the beginning - * - the difference can only work properly if the date from the device is synchronized through the net - * - the difference in timezone is taken into account by using UTC in the Conversion from the Date to Server format - * - the missing days and hours are stored in one table as the actual stored data amount is low - * - the underlying repository from the database has no error and is reliable as source of truth - * - * @param currentDate the current date - if this is adjusted by the calendar, the cache is affected. - * @return list of all files from both the cache and the diff query - */ - suspend fun asyncFetchFiles(currentDate: Date): List<File> = withContext(Dispatchers.IO) { - checkForFreeSpace() - val serverDates = getDatesFromServer() - // TODO remove last3HourFetch before Release - if (BuildConfig.FLAVOR != "device" && isLast3HourFetchEnabled()) { - Timber.v("Last 3 Hours will be Fetched. Only use for Debugging!") - val currentDateServerFormat = currentDate.toServerFormat() - // just fetch the hours if the date is available - if (serverDates.contains(currentDateServerFormat)) { - return@withContext getLast3Hours(currentDate) - .map { getURLForHour(currentDate.toServerFormat(), it) } - .map { url -> - async { - return@async WebRequestBuilder.getInstance() - .asyncGetKeyFilesFromServer(url) - } - }.awaitAll() - } else { - throw IllegalStateException( - "you cannot use the last 3 hour mode if the date index " + - "does not contain any data for today" - ) - } - } else { - val uuidListFromServer = serverDates - .map { getURLForDay(it).generateCacheKeyFromString() } - // queries will be executed after the "query plan" was set - val deferredQueries: MutableCollection<Deferred<Any>> = mutableListOf() - keyCache.deleteOutdatedEntries(uuidListFromServer) - val missingDays = getMissingDaysFromDiff(serverDates) - val failedEntryCacheKeys = Collections.synchronizedList(mutableListOf<String>()) - if (missingDays.isNotEmpty()) { - // we have a date difference - deferredQueries.addAll( - missingDays - .map { getURLForDay(it) } - .map { url -> - val cacheKey = url.generateCacheKeyFromString() - async { - try { - url.createDayEntryForUrl(cacheKey) - } catch (e: Exception) { - Timber.v("failed entry: $cacheKey") - failedEntryCacheKeys.add(cacheKey) - } - } - } - ) - } - // execute the query plan - deferredQueries.awaitAll() - Timber.v("${failedEntryCacheKeys.size} failed entries ") - // For an error we clear the cache to try again - if (failedEntryCacheKeys.isNotEmpty()) { - keyCache.clear(failedEntryCacheKeys) - throw IOException("failed to download all key files, at least one failing request.") - } - keyCache.getFilesFromEntries() - .also { it.forEach { file -> Timber.v("cached file:${file.path}") } } - } - } - - private fun checkForFreeSpace() = FileStorageHelper.checkFileStorageFreeSpace() - - /** - * Calculates the missing days based on current missing entries in the cache - */ - private suspend fun getMissingDaysFromDiff(datesFromServer: Collection<String>): List<String> { - val cacheEntries = keyCache.getDates() - return datesFromServer - .also { Timber.d("${it.size} days from server") } - .filter { it.dateEntryCacheMiss(cacheEntries) } - .toList() - .also { Timber.d("${it.size} missing days") } - } - - /** - * TODO remove before Release - */ - private const val LATEST_HOURS_NEEDED = 3 - - /** - * Calculates the last 3 hours - * TODO remove before Release - */ - private suspend fun getLast3Hours(day: Date): List<String> = getHoursFromServer(day) - .also { Timber.v("${it.size} hours from server, but only latest 3 hours needed") } - .filter { TimeAndDateExtensions.getCurrentHourUTC() - LATEST_HOURS_NEEDED <= it.toInt() } - .toList() - .also { Timber.d("${it.size} missing hours") } - - /** - * Determines whether a given String has an existing date cache entry under a unique name - * given from the URL that is based on this String - * - * @param cache the given cache entries - */ - private fun String.dateEntryCacheMiss(cache: List<KeyCacheEntity>) = !cache - .map { date -> date.id } - .contains(getURLForDay(this).generateCacheKeyFromString()) - - /** - * Creates a date entry in the Key Cache for a given String with a unique Key Name derived from the URL - * and the URI of the downloaded File for that given key - */ - private suspend fun String.createDayEntryForUrl(cacheKey: String) = keyCache.createEntry( - cacheKey, - WebRequestBuilder.getInstance().asyncGetKeyFilesFromServer(this).toURI(), - DAY - ) - - /** - * Generates a unique key name (UUIDv3) for the cache entry based out of a string (e.g. an url) - */ - private fun String.generateCacheKeyFromString() = - "${UUID.nameUUIDFromBytes(this.toByteArray())}".also { - Timber.v("$this mapped to cache entry $it") - } - - /** - * Gets the correct URL String for querying an hour bucket - * - * @param formattedDate the formatted date for the hour bucket request - * @param formattedHour the formatted hour - */ - private fun getURLForHour(formattedDate: String, formattedHour: String) = - "${getURLForDay(formattedDate)}/${DiagnosisKeyConstants.HOUR}/$formattedHour" - - /** - * Gets the correct URL String for querying a day bucket - * - * @param formattedDate the formatted date - */ - private fun getURLForDay(formattedDate: String) = - "${DiagnosisKeyConstants.AVAILABLE_DATES_URL}/$formattedDate" - - /** - * Get all dates from server based as formatted dates - */ - private suspend fun getDatesFromServer() = - WebRequestBuilder.getInstance().asyncGetDateIndex() - - /** - * Get all hours from server based as formatted dates - */ - private suspend fun getHoursFromServer(day: Date) = - WebRequestBuilder.getInstance().asyncGetHourIndex(day) - - /** - * TODO remove before release - */ - private fun isLast3HourFetchEnabled(): Boolean = LocalData.last3HoursMode() -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DataRetentionHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DataRetentionHelper.kt index 46343586783c5c9f28c5b71d5bb6825aa0d14ef4..1ce93fc10fafda64feb5c1adc377f8eaa848e38a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DataRetentionHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/DataRetentionHelper.kt @@ -22,9 +22,10 @@ package de.rki.coronawarnapp.util import android.annotation.SuppressLint import android.content.Context import de.rki.coronawarnapp.storage.AppDatabase -import de.rki.coronawarnapp.storage.FileStorageHelper import de.rki.coronawarnapp.storage.RiskLevelRepository +import de.rki.coronawarnapp.util.di.AppInjector import de.rki.coronawarnapp.util.security.SecurityHelper +import kotlinx.coroutines.runBlocking import timber.log.Timber /** @@ -47,7 +48,8 @@ object DataRetentionHelper { // Reset the current risk level stored in LiveData RiskLevelRepository.reset() // Export File Reset - FileStorageHelper.getAllFilesInKeyExportDirectory().forEach { it.delete() } + // TODO runBlocking, but also all of the above is BLOCKING and should be called more nicely + runBlocking { AppInjector.component.keyCacheRepository.clear() } Timber.w("CWA LOCAL DATA DELETION COMPLETED.") } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/HashExtensions.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/HashExtensions.kt new file mode 100644 index 0000000000000000000000000000000000000000..b99b9f2ccd8768f361e697298f185bb96511e5dc --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/HashExtensions.kt @@ -0,0 +1,39 @@ +package de.rki.coronawarnapp.util + +import java.io.File +import java.security.MessageDigest +import java.util.Locale + +internal object HashExtensions { + + fun String.toSHA256() = this.hashString("SHA-256") + + fun String.toSHA1() = this.hashString("SHA-1") + + fun String.toMD5() = this.hashString("MD5") + + private fun ByteArray.formatHash(): String = this + .joinToString(separator = "") { String.format("%02X", it) } + .toLowerCase(Locale.ROOT) + + private fun String.hashString(type: String): String = MessageDigest + .getInstance(type) + .digest(this.toByteArray()) + .formatHash() + + fun File.hashToMD5(): String = this.hashTo("MD5") + + private fun File.hashTo(type: String): String = MessageDigest + .getInstance(type) + .let { md -> + inputStream().use { stream -> + val buffer = ByteArray(8192) + var read: Int + while (stream.read(buffer).also { read = it } > 0) { + md.update(buffer, 0, read) + } + } + md.digest() + } + .formatHash() +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TimeStamper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TimeStamper.kt new file mode 100644 index 0000000000000000000000000000000000000000..fcbfc75d6000520c026cb3db85f3f7ba7389386d --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/TimeStamper.kt @@ -0,0 +1,12 @@ +package de.rki.coronawarnapp.util + +import org.joda.time.Instant +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class TimeStamper @Inject constructor() { + + val nowUTC: Instant + get() = Instant.now() +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/database/CommonConverters.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/database/CommonConverters.kt new file mode 100644 index 0000000000000000000000000000000000000000..cbbf8366f3d47ce6b05c2917b8a471ab7e685d91 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/database/CommonConverters.kt @@ -0,0 +1,81 @@ +/****************************************************************************** + * Corona-Warn-App * + * * + * SAP SE and all other contributors / * + * copyright owners license this file to you under the Apache * + * License, Version 2.0 (the "License"); you may not use this * + * file except in compliance with the License. * + * You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ******************************************************************************/ + +package de.rki.coronawarnapp.util.database + +import androidx.room.TypeConverter +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import org.joda.time.Instant +import org.joda.time.LocalDate +import org.joda.time.LocalTime +import java.io.File +import java.util.UUID + +class CommonConverters { + private val gson = Gson() + + @TypeConverter + fun toIntList(value: String?): List<Int> { + val listType = object : TypeToken<List<Int?>?>() {}.type + return gson.fromJson(value, listType) + } + + @TypeConverter + fun fromIntList(list: List<Int?>?): String { + return gson.toJson(list) + } + + @TypeConverter + fun toUUID(value: String?): UUID? = value?.let { UUID.fromString(it) } + + @TypeConverter + fun fromUUID(uuid: UUID?): String? = uuid?.toString() + + @TypeConverter + fun toPath(value: String?): File? = value?.let { File(it) } + + @TypeConverter + fun fromPath(path: File?): String? = path?.path + + @TypeConverter + fun toLocalDate(value: String?): LocalDate? = value?.let { LocalDate.parse(it) } + + @TypeConverter + fun fromLocalDate(date: LocalDate?): String? = date?.toString() + + @TypeConverter + fun toLocalTime(value: String?): LocalTime? = value?.let { LocalTime.parse(it) } + + @TypeConverter + fun fromLocalTime(date: LocalTime?): String? = date?.toString() + + @TypeConverter + fun toInstant(value: String?): Instant? = value?.let { Instant.parse(it) } + + @TypeConverter + fun fromInstant(date: Instant?): String? = date?.toString() + + @TypeConverter + fun toLocationCode(value: String?): LocationCode? = value?.let { LocationCode(it) } + + @TypeConverter + fun fromLocationCode(code: LocationCode?): String? = code?.identifier +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/debug/TimeMeasurement.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/debug/TimeMeasurement.kt new file mode 100644 index 0000000000000000000000000000000000000000..58c06b520ba0b45fca3b1c93f53b1bc966b73111 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/debug/TimeMeasurement.kt @@ -0,0 +1,7 @@ +package de.rki.coronawarnapp.util.debug + +inline fun <T> measureTimeMillisWithResult(block: () -> T): Pair<T, Long> { + val start = System.currentTimeMillis() + val result = block() + return result to (System.currentTimeMillis() - start) +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt index 101e26be670eedf14eb9271ce3067b1fb0eb7928..03340dbfbb1ba4e43a4da4ed8f984fde8755b4c5 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt @@ -6,6 +6,12 @@ import dagger.android.AndroidInjector import dagger.android.support.AndroidSupportInjectionModule import de.rki.coronawarnapp.CoronaWarnApplication import de.rki.coronawarnapp.nearby.NearbyModule +import de.rki.coronawarnapp.diagnosiskeys.DiagnosisKeysModule +import de.rki.coronawarnapp.diagnosiskeys.download.KeyFileDownloader +import de.rki.coronawarnapp.diagnosiskeys.server.AppConfigServer +import de.rki.coronawarnapp.diagnosiskeys.storage.KeyCacheRepository +import de.rki.coronawarnapp.http.HttpModule +import de.rki.coronawarnapp.http.ServiceFactory import de.rki.coronawarnapp.receiver.ReceiverBinder import de.rki.coronawarnapp.risk.RiskModule import de.rki.coronawarnapp.service.ServiceBinder @@ -31,6 +37,8 @@ import javax.inject.Singleton RiskModule::class, UtilModule::class, DeviceModule::class, + HttpModule::class, + DiagnosisKeysModule::class, NearbyModule::class ] ) @@ -45,6 +53,12 @@ interface ApplicationComponent : AndroidInjector<CoronaWarnApplication> { val settingsRepository: SettingsRepository + val keyCacheRepository: KeyCacheRepository + val keyFileDownloader: KeyFileDownloader + val serviceFactory: ServiceFactory + + val appConfigServer: AppConfigServer + @Component.Factory interface Factory { fun create(@BindsInstance app: CoronaWarnApplication): ApplicationComponent diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt index fb6de1ec97bf660e2481d4512f269fd44966a962..59965289788a0a3ffe127833ea18dcfec897d450 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/formatter/FormatterSubmissionHelper.kt @@ -2,6 +2,7 @@ package de.rki.coronawarnapp.util.formatter +import android.content.Context import android.graphics.drawable.Drawable import android.text.Spannable import android.text.SpannableString @@ -14,6 +15,7 @@ import de.rki.coronawarnapp.ui.submission.ApiRequestState import de.rki.coronawarnapp.util.DeviceUIState import de.rki.coronawarnapp.util.TimeAndDateExtensions.toUIFormat import java.util.Date +import java.util.Locale fun formatTestResultSpinnerVisible(uiStateState: ApiRequestState?): Int = formatVisibility(uiStateState != ApiRequestState.SUCCESS) @@ -207,3 +209,36 @@ fun formatShowRiskStatusCard(deviceUiState: DeviceUIState?): Int = deviceUiState != DeviceUIState.PAIRED_POSITIVE_TELETAN && deviceUiState != DeviceUIState.SUBMITTED_FINAL ) + +fun formatCountryIsoTagToLocalizedName(isoTag: String?): String { + val country = if (isoTag != null) Locale("", isoTag).displayCountry else "" + return country +} + +private fun resolveNameToDrawableId(drawableName: String, ctx: Context): Int? { + val drawableId = + ctx.resources.getIdentifier(drawableName, "drawable", ctx.packageName) + return if (drawableId == 0) null else drawableId +} + +fun formatCountryIsoTagToFlagDrawable(isoTag: String?): Drawable? { + val appContext = CoronaWarnApplication.getAppContext() + + val countryName = isoTag?.let { + Locale("", it).getDisplayCountry(Locale.ENGLISH).toLowerCase(Locale.ENGLISH) + } + + val countryId = + countryName?.let { resolveNameToDrawableId("ic_submission_country_flag_$it", appContext) } + + return if (countryId != null) + appContext.getDrawable(countryId) + else + appContext.getDrawable(R.drawable.ic_submission_country_flag_ireland) +} + +fun formatCountrySelectCardColor(isActive: Boolean?): Int = + formatColor(isActive == true, R.color.colorTextSemanticNeutral, R.color.card_dark) + +fun formatCountrySelectCardTextColor(isActive: Boolean?): Int = + formatColor(isActive == true, R.color.colorTextEmphasizedButton, R.color.colorTextPrimary1) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/VerificationKeys.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/VerificationKeys.kt index b70af82ba6d6a329d41de23d4bddc5778e4ffaa5..03ec87d302f5243e8f56eb1bc381bfe5a79fed0c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/VerificationKeys.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/VerificationKeys.kt @@ -8,8 +8,11 @@ import timber.log.Timber import java.security.KeyFactory import java.security.Signature import java.security.spec.X509EncodedKeySpec +import javax.inject.Inject +import javax.inject.Singleton -class VerificationKeys { +@Singleton +class VerificationKeys @Inject constructor() { companion object { private const val KEY_DELIMITER = "," } diff --git a/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_austria.xml b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_austria.xml new file mode 100644 index 0000000000000000000000000000000000000000..c482c612083bdd250fca67780986c4f2484fb41b --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_austria.xml @@ -0,0 +1,21 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <group> + <clip-path android:pathData="M0,0h24v24h-24z" /> + <path + android:fillColor="#FF3D00" + android:fillType="nonZero" + android:pathData="M0,4l24,0l0,16.3636l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#ECEFF1" + android:fillType="nonZero" + android:pathData="M0,9.4545l24,0l0,5.4545l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + </group> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_czech.xml b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_czech.xml new file mode 100644 index 0000000000000000000000000000000000000000..217ac4302e07ee2c5cee4045f6cdc41392c72ea1 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_czech.xml @@ -0,0 +1,27 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <group> + <clip-path android:pathData="M0,0h24v24h-24z" /> + <path + android:fillColor="#FF3D00" + android:fillType="nonZero" + android:pathData="M0,12.1818l24,0l0,8.1818l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#D7DFE2" + android:fillType="nonZero" + android:pathData="M0,4l24,0l0,8.1818l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#3F51B5" + android:fillType="nonZero" + android:pathData="M0,4l0,16.3636l12.5455,-8.1807z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + </group> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_denmark.xml b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_denmark.xml new file mode 100644 index 0000000000000000000000000000000000000000..e5ef321061e8849f24d77660e1761735bd8f99d6 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_denmark.xml @@ -0,0 +1,27 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <group> + <clip-path android:pathData="M0,0h24v24h-24z" /> + <path + android:fillColor="#FF3D00" + android:fillType="nonZero" + android:pathData="M0,4l24,0l0,16.3636l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#ECEFF1" + android:fillType="nonZero" + android:pathData="M0,10.5455l24,0l0,3.2727l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#ECEFF1" + android:fillType="nonZero" + android:pathData="M7.6364,4l3.2727,0l0,16.3636l-3.2727,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + </group> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_estonia.xml b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_estonia.xml new file mode 100644 index 0000000000000000000000000000000000000000..8a2e44085873bbac059522f6bb995f91e199fa81 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_estonia.xml @@ -0,0 +1,27 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <group> + <clip-path android:pathData="M0,0h24v24h-24z" /> + <path + android:fillColor="#E0E1E2" + android:fillType="nonZero" + android:pathData="M0,14.9091l24,0l0,5.4545l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#424242" + android:fillType="nonZero" + android:pathData="M0,9.4545l24,0l0,5.4545l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#2196F3" + android:fillType="nonZero" + android:pathData="M0,4l24,0l0,5.4545l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + </group> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_ireland.xml b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_ireland.xml new file mode 100644 index 0000000000000000000000000000000000000000..be665a5c47b4d34e9feab27c485f6d15ae2ee419 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_ireland.xml @@ -0,0 +1,27 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <group> + <clip-path android:pathData="M0,0h24v24h-24z" /> + <path + android:fillColor="#ECEFF1" + android:fillType="nonZero" + android:pathData="M7.6364,4l8.7273,0l0,16.3636l-8.7273,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FF9800" + android:fillType="nonZero" + android:pathData="M16.3636,4l7.6364,0l0,16.3636l-7.6364,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#689F38" + android:fillType="nonZero" + android:pathData="M0,4l7.6364,0l0,16.3636l-7.6364,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + </group> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_italy.xml b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_italy.xml new file mode 100644 index 0000000000000000000000000000000000000000..1796ae7b2bd69509438fcc68219bcb1c21b6563e --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_italy.xml @@ -0,0 +1,27 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <group> + <clip-path android:pathData="M0,0h24v24h-24z" /> + <path + android:fillColor="#ECEFF1" + android:fillType="nonZero" + android:pathData="M7.6364,4l8.7273,0l0,16.3636l-8.7273,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FF3D00" + android:fillType="nonZero" + android:pathData="M16.3636,4l7.6364,0l0,16.3636l-7.6364,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#689F38" + android:fillType="nonZero" + android:pathData="M0,4l7.6364,0l0,16.3636l-7.6364,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + </group> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_latvia.xml b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_latvia.xml new file mode 100644 index 0000000000000000000000000000000000000000..8ababc21154290e55af96cc63b05ee649b645b41 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_latvia.xml @@ -0,0 +1,21 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <group> + <clip-path android:pathData="M0,0h24v24h-24z" /> + <path + android:fillColor="#B71C1C" + android:fillType="nonZero" + android:pathData="M0,4l24,0l0,16.3636l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#ECEFF1" + android:fillType="nonZero" + android:pathData="M0,10l24,0l0,4.3636l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + </group> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_netherlands.xml b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_netherlands.xml new file mode 100644 index 0000000000000000000000000000000000000000..51d206f57adce6e8c8f334cced0fa5ebb7402d70 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_netherlands.xml @@ -0,0 +1,27 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <group> + <clip-path android:pathData="M0,0h24v24h-24z" /> + <path + android:fillColor="#3F51B5" + android:fillType="nonZero" + android:pathData="M0,14.9091l24,0l0,5.4545l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#ECEFF1" + android:fillType="nonZero" + android:pathData="M0,9.4545l24,0l0,5.4545l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FF3D00" + android:fillType="nonZero" + android:pathData="M0,4l24,0l0,5.4545l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + </group> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_poland.xml b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_poland.xml new file mode 100644 index 0000000000000000000000000000000000000000..6815a430b6d75c3e0f5ff365a0b732e99c4b2077 --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_poland.xml @@ -0,0 +1,21 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <group> + <clip-path android:pathData="M0,0h24v24h-24z" /> + <path + android:fillColor="#F44336" + android:fillType="nonZero" + android:pathData="M0,12.1818l24,0l0,8.1818l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#ECEFF1" + android:fillType="nonZero" + android:pathData="M0,4l24,0l0,8.1818l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + </group> +</vector> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_spain.xml b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_spain.xml new file mode 100644 index 0000000000000000000000000000000000000000..b6fc02d1bf3f785294b7c816a72ea723f8355a8d --- /dev/null +++ b/Corona-Warn-App/src/main/res/drawable/ic_submission_country_flag_spain.xml @@ -0,0 +1,3411 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <group> + <clip-path android:pathData="M0,0h24v24h-24z" /> + <path + android:fillColor="#DD2C00" + android:fillType="nonZero" + android:pathData="M0,4l24,0l0,16.3636l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFC107" + android:fillType="nonZero" + android:pathData="M0,8.3636l24,0l0,7.6364l-24,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M4.2436,11.2207C4.2436,11.2207 4.2256,11.2207 4.2164,11.2158C4.2065,11.2098 4.1782,11.1815 4.1782,11.1815L4.1536,11.1656L4.1324,11.1367C4.1324,11.1367 4.1078,11.0964 4.1182,11.0631C4.1296,11.0331 4.1487,11.0216 4.1678,11.0118C4.1842,11.0009 4.2224,10.9905 4.2224,10.9905C4.2224,10.9905 4.2507,10.978 4.2605,10.9747C4.2698,10.9747 4.3053,10.9649 4.3053,10.9649C4.3053,10.9649 4.3151,10.96 4.3244,10.9573C4.3347,10.9518 4.3484,10.9518 4.3565,10.9485C4.3642,10.9485 4.3844,10.9431 4.3953,10.942C4.4144,10.9409 4.4427,10.9442 4.4525,10.9442C4.4618,10.9442 4.4956,10.9469 4.5098,10.9469C4.5224,10.9469 4.5709,10.9442 4.5856,10.9442C4.5993,10.9442 4.6085,10.9409 4.6249,10.9442C4.6407,10.9442 4.6669,10.954 4.6762,10.9567C4.6827,10.9611 4.7302,10.9769 4.7476,10.9824C4.7656,10.9867 4.8082,10.9949 4.8278,11.0058C4.8475,11.0135 4.8589,11.0304 4.8687,11.044C4.8791,11.0565 4.8807,11.0718 4.884,11.0789C4.8878,11.0887 4.8884,11.11 4.884,11.1171C4.8802,11.1269 4.8676,11.1471 4.8676,11.1471L4.8447,11.1804L4.8175,11.2027C4.8175,11.2027 4.7973,11.2218 4.7825,11.2196C4.7667,11.2164 4.6085,11.1896 4.506,11.1896C4.4051,11.1913 4.2431,11.2207 4.2436,11.2207" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.9723,11.4685C4.9723,11.4685 4.9709,11.4685 4.9688,11.4685C4.9654,11.4685 4.9563,11.4665 4.9403,11.4605C4.8747,11.4445 4.7227,11.4115 4.6168,11.4115C4.4941,11.4115 4.2947,11.4645 4.2821,11.4685C4.2821,11.4685 4.2814,11.4685 4.2807,11.4685L4.2807,11.4685C4.28,11.4685 4.2793,11.4685 4.2793,11.4685C4.2723,11.4685 4.2542,11.4685 4.2424,11.4525C4.2298,11.4445 4.1929,11.3975 4.1929,11.3955L4.1622,11.3615C4.1615,11.3615 4.1608,11.3595 4.1601,11.3595L4.1336,11.3075C4.1315,11.3045 4.0987,11.2305 4.1148,11.1685C4.1308,11.1085 4.1559,11.0875 4.1803,11.0695C4.2033,11.0505 4.2493,11.0305 4.2514,11.0305C4.2528,11.0285 4.2898,11.0055 4.303,11.0025C4.3135,10.9995 4.3518,10.9835 4.3588,10.9815C4.3609,10.9805 4.372,10.9735 4.3839,10.9635C4.393,10.9595 4.4013,10.9595 4.4104,10.9575C4.4167,10.9565 4.4215,10.9565 4.425,10.9545C4.4264,10.9515 4.4299,10.9515 4.4341,10.9515C4.4459,10.9455 4.4634,10.9355 4.4752,10.9355C4.4913,10.9355 4.5115,10.9355 4.5268,10.9395C4.5359,10.9415 4.5442,10.9435 4.5484,10.9435C4.554,10.9435 4.5659,10.9445 4.5798,10.9455C4.5944,10.9475 4.6112,10.9495 4.6223,10.9495C4.6307,10.9495 4.6509,10.9455 4.6697,10.9435C4.6907,10.9395 4.7095,10.9375 4.7192,10.9375C4.7241,10.9375 4.7297,10.9375 4.7353,10.9355C4.7464,10.9355 4.7569,10.9355 4.7694,10.9375C4.7897,10.9435 4.8266,10.9585 4.8357,10.9685C4.8468,10.9745 4.9047,11.0035 4.9284,11.0155C4.9361,11.0215 4.9472,11.0215 4.9605,11.0275C4.9856,11.0335 5.0149,11.0455 5.0309,11.0525C5.0588,11.0735 5.0748,11.1035 5.086,11.1265C5.0964,11.1465 5.0999,11.1645 5.1027,11.1815C5.1041,11.1855 5.1041,11.1915 5.1062,11.1935C5.1118,11.2145 5.1118,11.2565 5.1062,11.2735C5.0999,11.2875 5.0825,11.3265 5.0825,11.3265L5.0539,11.3905C5.0539,11.3925 5.0539,11.3945 5.0539,11.3945L5.0176,11.4315C5.0169,11.4355 4.9946,11.4685 4.9723,11.4685L4.9723,11.4685ZM4.6168,11.3985C4.7227,11.3985 4.8775,11.4295 4.943,11.4455C4.957,11.4485 4.9674,11.4515 4.9709,11.4515C4.9723,11.4515 4.9723,11.4515 4.9723,11.4515C4.987,11.4515 5.0051,11.4305 5.0107,11.4225L5.0455,11.3835L5.0727,11.3195C5.0734,11.3195 5.0902,11.2855 5.095,11.2665C5.0985,11.2565 5.0985,11.2195 5.095,11.2055C5.0936,11.1975 5.0915,11.1935 5.0909,11.1875C5.0874,11.1715 5.0832,11.1545 5.0755,11.1405C5.0637,11.1175 5.0504,11.0915 5.026,11.0735C5.01,11.0625 4.9814,11.0525 4.957,11.0475C4.9444,11.0415 4.9326,11.0355 4.9242,11.0315C4.9033,11.0235 4.8426,10.9925 4.8301,10.9845C4.8217,10.9765 4.7862,10.9615 4.768,10.9595C4.7562,10.9565 4.7457,10.9585 4.7353,10.9585C4.7297,10.9585 4.7234,10.9595 4.7185,10.9595C4.7095,10.9595 4.6893,10.9615 4.6697,10.9615C4.6495,10.9615 4.63,10.9635 4.6216,10.9635C4.6105,10.9635 4.5938,10.9615 4.5784,10.9615C4.5652,10.9615 4.5533,10.9615 4.5477,10.9615C4.5436,10.9615 4.5352,10.9615 4.524,10.9595C4.5094,10.9585 4.4906,10.9535 4.4745,10.9565C4.4655,10.9565 4.448,10.9615 4.4369,10.9675C4.4334,10.9705 4.4285,10.9715 4.4257,10.9735C4.4215,10.9755 4.4167,10.9775 4.4118,10.9775C4.4034,10.9775 4.3937,10.9775 4.3874,10.9835C4.3755,10.9875 4.363,11.0015 4.363,11.0015C4.363,11.0015 4.3623,11.0015 4.3616,11.0015C4.3595,11.0015 4.3156,11.0175 4.303,11.0225C4.294,11.0245 4.2654,11.0405 4.2542,11.0475C4.2535,11.0475 4.2082,11.0685 4.1845,11.0825C4.1594,11.1025 4.1385,11.1225 4.1259,11.1725C4.1113,11.2275 4.142,11.2995 4.142,11.2995L4.1685,11.3525L4.1977,11.3815C4.2082,11.3995 4.2368,11.4325 4.2472,11.4455C4.2563,11.4505 4.2709,11.4515 4.2786,11.4515C4.287,11.4495 4.4892,11.3985 4.6168,11.3985Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.4613,10.9949C4.4613,10.9464 4.482,10.9065 4.5087,10.9065C4.5355,10.9065 4.5562,10.9464 4.5562,10.9949C4.5562,11.0407 4.5355,11.08 4.5087,11.08C4.482,11.08 4.4613,11.0407 4.4613,10.9949" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.5528,11.2373C4.4978,11.2373 4.4558,11.1653 4.4558,11.0713C4.4558,10.9793 4.4978,10.9033 4.5528,10.9033C4.6078,10.9033 4.6488,10.9793 4.6488,11.0713C4.6488,11.1653 4.6078,11.2373 4.5528,11.2373ZM4.5528,10.9173C4.5088,10.9173 4.4728,10.9873 4.4728,11.0713C4.4728,11.1513 4.5078,11.2193 4.5528,11.2193C4.5958,11.2193 4.6308,11.1513 4.6308,11.0713C4.6308,10.9873 4.5958,10.9173 4.5528,10.9173Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.4875,10.9949C4.4875,10.9491 4.4973,10.9142 4.5104,10.9142C4.5224,10.9142 4.5322,10.9491 4.5322,10.9949C4.5322,11.0375 4.5224,11.0729 4.5104,11.0729C4.4973,11.0729 4.4875,11.0375 4.4875,10.9949" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.5326,11.2164C4.4996,11.2164 4.4836,11.1414 4.4836,11.0664C4.4836,10.9864 4.4996,10.9104 4.5326,10.9104C4.5646,10.9104 4.5796,10.9904 4.5796,11.0664C4.5786,11.1404 4.5616,11.2164 4.5326,11.2164ZM4.5326,10.9274C4.5206,10.9274 4.4986,10.9744 4.4986,11.0664C4.4986,11.1524 4.5206,11.2024 4.5326,11.2024C4.5426,11.2024 4.5626,11.1524 4.5626,11.0664C4.5616,10.9734 4.5426,10.9274 4.5326,10.9274Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.4782,10.9033C4.4782,10.8853 4.4907,10.8722 4.5104,10.8722C4.5267,10.8722 4.5425,10.8847 4.5425,10.9033C4.5425,10.9191 4.5267,10.9322 4.5104,10.9322C4.4907,10.9322 4.4782,10.9196 4.4782,10.9033" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.5322,10.894l0,0.0169l-0.0502,0l0,-0.0169l0.0164,0l0,-0.0469l-0.0213,0l0,-0.0191l0.0213,0l0,-0.0207l0.0213,0l0,0.0202l0.0218,0l0,0.0191l-0.0218,0l0,0.0469l0.0125,0" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.5911,11.0149L4.4821,11.0149L4.4821,10.9539L4.5121,10.9539L4.5121,10.8929L4.4711,10.8929L4.4711,10.8359L4.5121,10.8359L4.5121,10.8029L4.5691,10.8029L4.5691,10.8359L4.6071,10.8359L4.6071,10.8929L4.5691,10.8929L4.5691,10.9539L4.5901,10.9539L4.5901,11.0149L4.5911,11.0149ZM4.5011,10.9929L4.5711,10.9929L4.5711,10.9749L4.5501,10.9749L4.5501,10.8749L4.5901,10.8749L4.5901,10.8559L4.5501,10.8559L4.5501,10.8179L4.5311,10.8179L4.5311,10.8559L4.4911,10.8559L4.4911,10.8749L4.5311,10.8749L4.5311,10.9749L4.5011,10.9749L4.5011,10.9929Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.554,10.894l0,0.0169l-0.0884,0l0,-0.0169l0.0327,0l0,-0.0469l-0.0213,0l0,-0.0191l0.0213,0l0,-0.0207l0.0213,0l0,0.0202l0.0218,0l0,0.0191l-0.0218,0l0,0.0469l0.0344,0" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.6393,11.0149L4.4613,11.0149L4.4613,10.9539L4.5213,10.9539L4.5213,10.8929L4.4803,10.8929L4.4803,10.8359L4.5213,10.8359L4.5213,10.8029L4.5783,10.8029L4.5783,10.8359L4.6163,10.8359L4.6163,10.8929L4.5783,10.8929L4.5783,10.9539L4.6403,10.9539L4.6403,11.0149L4.6393,11.0149ZM4.4803,10.9929L4.6213,10.9929L4.6213,10.9749L4.5583,10.9749L4.5583,10.8749L4.5983,10.8749L4.5983,10.8559L4.5583,10.8559L4.5583,10.8179L4.5393,10.8179L4.5393,10.8559L4.4993,10.8559L4.4993,10.8749L4.5393,10.8749L4.5393,10.9749L4.4803,10.9749L4.4803,10.9929Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.5104,10.9365C4.4891,10.9365 4.4727,10.9224 4.4727,10.9033C4.4727,10.8853 4.4847,10.8722 4.5005,10.8684L4.5022,10.8793C4.4913,10.8815 4.4815,10.8918 4.4815,10.9038C4.4815,10.9185 4.494,10.9295 4.5104,10.9295C4.5245,10.9295 4.5365,10.9185 4.5365,10.9038C4.5365,10.8929 4.5295,10.8815 4.5169,10.8793L4.5196,10.87C4.536,10.8727 4.5453,10.8864 4.5453,10.9038C4.5453,10.9218 4.5295,10.9365 4.5104,10.9365Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.5104,11.2158L4.344,11.2158L4.3396,11.1749L4.3309,11.1324L4.3227,11.0778C4.2764,11.0195 4.2349,10.9785 4.2207,10.9873C4.224,10.9747 4.2284,10.9682 4.2371,10.9616C4.2769,10.9371 4.362,10.996 4.4247,11.0904C4.4296,11.1007 4.4362,11.1105 4.4405,11.1171L4.5775,11.1171C4.5824,11.1105 4.5884,11.1013 4.5938,11.0904C4.6565,10.9955 4.7411,10.9371 4.7809,10.9616C4.7907,10.9682 4.794,10.9742 4.7978,10.9873C4.7842,10.9785 4.7422,11.0195 4.6953,11.0778L4.6882,11.1324L4.6789,11.1749L4.6751,11.2158L4.5104,11.2158" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.9997,11.4408L4.4254,11.4408L4.4171,11.3608L4.4061,11.2848L4.3905,11.1868C4.3116,11.0758 4.2557,11.0228 4.2346,11.0228C4.2336,11.0228 4.2318,11.0228 4.23,11.0228L4.2125,11.0358L4.2181,11.0148C4.2245,10.9918 4.2336,10.9738 4.2502,10.9648C4.2612,10.9578 4.2749,10.9518 4.2887,10.9518C4.3676,10.9518 4.4859,11.0558 4.5758,11.2038C4.5859,11.2198 4.5942,11.2348 4.5997,11.2488L4.8236,11.2488C4.8309,11.2348 4.8382,11.2198 4.8474,11.2038C4.9382,11.0558 5.0566,10.9518 5.1346,10.9518C5.1492,10.9518 5.1648,10.9578 5.1749,10.9648C5.1905,10.9738 5.1988,10.9908 5.2061,11.0148L5.2125,11.0358L5.1951,11.0228C5.1942,11.0228 5.1914,11.0228 5.1914,11.0228C5.1703,11.0228 5.1144,11.0758 5.0346,11.1888L5.019,11.2838L5.008,11.3608L4.9997,11.4408ZM4.4382,11.4298L4.9869,11.4298L4.9924,11.3618L5.0043,11.2798L5.019,11.1798C5.0474,11.1408 5.1392,11.0148 5.1859,11.0098C5.1823,10.9938 5.1758,10.9868 5.1667,10.9798C5.1584,10.9708 5.1474,10.9708 5.1336,10.9708C5.0612,10.9708 4.9483,11.0708 4.8612,11.2148C4.8502,11.2308 4.8419,11.2468 4.8346,11.2618L4.8309,11.2678L4.5924,11.2678L4.5887,11.2618C4.5832,11.2468 4.574,11.2308 4.5621,11.2148C4.4758,11.0698 4.3621,10.9708 4.2887,10.9708C4.2758,10.9708 4.2658,10.9708 4.2566,10.9798C4.2474,10.9868 4.241,10.9948 4.2373,11.0098C4.2841,11.0148 4.3758,11.1408 4.4043,11.1798L4.4052,11.1818L4.419,11.2818L4.4327,11.3618L4.4382,11.4298Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.9387,11.2311L4.9262,11.2241C5.0335,11.0551 5.1638,10.9481 5.2251,10.9871L5.2155,10.9971C5.1705,10.9711 5.0498,11.0571 4.9387,11.2311ZM4.5124,11.2311C4.4004,11.0571 4.2797,10.9711 4.2347,10.9971L4.2251,10.9871C4.2854,10.9481 4.4157,11.0551 4.523,11.2241L4.5124,11.2311Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.2638,11.29C4.2573,11.2687 4.2442,11.2535 4.2442,11.2535C4.3113,11.2327 4.4045,11.2196 4.5093,11.2196C4.6129,11.2196 4.7084,11.2322 4.7749,11.2535C4.7749,11.2535 4.7673,11.266 4.7564,11.284C4.7509,11.2949 4.7427,11.314 4.7433,11.314C4.6822,11.2949 4.6047,11.284 4.5082,11.284C4.4116,11.284 4.3189,11.2949 4.2704,11.3162C4.272,11.3156 4.2676,11.3031 4.2638,11.29L4.2638,11.29" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.3055,11.4038L4.2995,11.3988L4.2935,11.3988C4.2935,11.3948 4.2875,11.3758 4.2785,11.3568L4.2755,11.3438L4.2755,11.3438C4.2635,11.3128 4.2445,11.2888 4.2435,11.2888L4.2355,11.2808L4.2465,11.2768C4.3765,11.2368 4.5505,11.2158 4.7365,11.2158C4.9225,11.2158 5.0955,11.2368 5.2255,11.2768L5.2355,11.2808L5.2305,11.2868C5.2305,11.2868 5.2185,11.3118 5.1985,11.3478C5.1885,11.3618 5.1775,11.3918 5.1755,11.3968L5.1685,11.3948L5.1655,11.4018C5.0545,11.3678 4.9085,11.3518 4.7355,11.3518C4.6615,11.3518 4.5875,11.3518 4.5205,11.3598C4.5205,11.3598 4.5185,11.3598 4.5165,11.3598C4.4295,11.3718 4.3535,11.3828 4.3055,11.4038ZM4.2995,11.3598C4.3035,11.3738 4.3055,11.3808 4.3075,11.3828C4.3995,11.3518 4.5665,11.3338 4.7375,11.3338C4.9095,11.3338 5.0515,11.3518 5.1635,11.3828C5.1675,11.3748 5.1735,11.3598 5.1855,11.3358C5.1975,11.3148 5.2085,11.2988 5.2145,11.2888C5.0885,11.2558 4.9165,11.2338 4.7385,11.2338C4.5585,11.2338 4.3925,11.2538 4.2645,11.2888C4.2725,11.3028 4.2875,11.3258 4.2945,11.3518L4.2995,11.3598L4.2995,11.3598Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.5093,11.3762C4.5933,11.3762 4.6855,11.3636 4.7204,11.3538C4.7433,11.3462 4.7558,11.338 4.7536,11.326C4.7531,11.3195 4.7476,11.3151 4.7411,11.3124C4.6915,11.2944 4.6004,11.2835 4.5098,11.2835C4.4176,11.2835 4.3276,11.2944 4.2769,11.3124C4.2704,11.3156 4.2655,11.32 4.2644,11.326C4.2616,11.3375 4.2753,11.3462 4.2987,11.3538C4.3315,11.3636 4.4247,11.3762 4.5093,11.3762" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.7176,11.4622L4.7176,11.4622C4.5636,11.4622 4.3906,11.4392 4.3266,11.4232C4.2626,11.4032 4.2556,11.3762 4.2606,11.3622C4.2626,11.3492 4.2746,11.3372 4.2876,11.3292C4.3846,11.2982 4.5536,11.2802 4.7176,11.2802C4.8816,11.2802 5.0486,11.2982 5.1466,11.3292C5.1606,11.3372 5.1706,11.3502 5.1746,11.3622C5.1756,11.3762 5.1726,11.4032 5.1056,11.4232C5.0406,11.4392 4.8716,11.4622 4.7176,11.4622ZM4.7176,11.2982C4.5546,11.2982 4.3886,11.3182 4.2936,11.3452C4.2856,11.3512 4.2776,11.3552 4.2756,11.3662C4.2746,11.3782 4.2936,11.3972 4.3326,11.4082C4.3966,11.4232 4.5656,11.4462 4.7176,11.4462C4.8696,11.4462 5.0386,11.4232 5.1016,11.4082C5.1416,11.3972 5.1616,11.3782 5.1586,11.3662C5.1576,11.3542 5.1496,11.3502 5.1416,11.3452C5.0456,11.3182 4.8786,11.2982 4.7176,11.2982Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.7787,11.2158L4.7591,11.1973C4.7591,11.1973 4.7389,11.2087 4.7144,11.2049C4.6898,11.2005 4.6822,11.1727 4.6822,11.1727C4.6822,11.1727 4.6544,11.194 4.632,11.1918C4.6091,11.1907 4.596,11.1727 4.596,11.1727C4.596,11.1727 4.5704,11.1891 4.5491,11.1875C4.5284,11.1864 4.5065,11.1585 4.5065,11.1585C4.5065,11.1585 4.4853,11.1875 4.4651,11.1875C4.4422,11.1907 4.4247,11.1695 4.4247,11.1695C4.4247,11.1695 4.4149,11.1907 4.3882,11.194C4.3598,11.2005 4.3369,11.1749 4.3369,11.1749C4.3369,11.1749 4.3205,11.2005 4.3025,11.2049C4.2845,11.2136 4.2605,11.1951 4.2605,11.1951C4.2605,11.1951 4.2562,11.2049 4.2535,11.2109C4.2507,11.2164 4.242,11.2175 4.242,11.2175L4.248,11.2333C4.3151,11.2131 4.4067,11.2016 4.5098,11.2016C4.6124,11.2016 4.7045,11.2131 4.7716,11.2333L4.7787,11.2158" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.2186,11.3115L5.2137,11.3115C5.0853,11.2725 4.9161,11.2505 4.736,11.2485C4.555,11.2505 4.3878,11.2715 4.2624,11.3115L4.2535,11.3115L4.2365,11.2645L4.2465,11.2645C4.2505,11.2645 4.2584,11.2625 4.2604,11.2545C4.2644,11.2465 4.2724,11.2275 4.2724,11.2275L4.2744,11.2205L4.2843,11.2255C4.2843,11.2255 4.3132,11.2445 4.339,11.2445C4.344,11.2445 4.351,11.2445 4.3559,11.2415C4.3858,11.2295 4.4147,11.1885 4.4147,11.1885L4.4206,11.1785L4.4256,11.1865C4.4256,11.1865 4.4674,11.2295 4.5112,11.2235C4.555,11.2175 4.5719,11.1805 4.5719,11.1785L4.5768,11.1705L4.5868,11.1785C4.5868,11.1785 4.6137,11.2115 4.6475,11.2115C4.6475,11.2115 4.6495,11.2115 4.6525,11.2115C4.6873,11.2055 4.7241,11.1585 4.7241,11.1565L4.7301,11.1515L4.737,11.1565C4.738,11.1585 4.7739,11.2035 4.8087,11.2095C4.8107,11.2095 4.8107,11.2095 4.8127,11.2095C4.8475,11.2095 4.8873,11.1785 4.8873,11.1785L4.8923,11.1765L4.8982,11.1825C4.8982,11.1825 4.9211,11.2175 4.9589,11.2175C4.9609,11.2175 4.9619,11.2175 4.9619,11.2175C4.9987,11.2175 5.0435,11.1805 5.0435,11.1805L5.0555,11.1735L5.0564,11.1865C5.0564,11.1875 5.0714,11.2375 5.1082,11.2415C5.15,11.2475 5.1828,11.2255 5.1828,11.2255L5.1888,11.2235L5.2296,11.2625L5.2365,11.2625L5.2346,11.2705L5.2186,11.3115ZM4.736,11.2375C4.9142,11.2375 5.0823,11.2575 5.2097,11.2935L5.2186,11.2715L5.1888,11.2455C5.1788,11.2505 5.1559,11.2625 5.1261,11.2625C5.1211,11.2625 5.1142,11.2625 5.1092,11.2605C5.0724,11.2505 5.0535,11.2225 5.0455,11.2035C5.0286,11.2195 4.9928,11.2425 4.9579,11.2385C4.9241,11.2345 4.8992,11.2125 4.8903,11.2015C4.8763,11.2095 4.8415,11.2265 4.8067,11.2265C4.7758,11.2245 4.744,11.1955 4.7301,11.1795C4.7181,11.1955 4.6863,11.2245 4.6545,11.2265C4.6525,11.2265 4.6495,11.2265 4.6485,11.2265C4.6196,11.2265 4.5967,11.2085 4.5848,11.2005C4.5729,11.2135 4.553,11.2325 4.5152,11.2425C4.4734,11.2485 4.4385,11.2195 4.4216,11.2035C4.4117,11.2195 4.3888,11.2485 4.3629,11.2595C4.3559,11.2625 4.348,11.2645 4.34,11.2645C4.3181,11.2645 4.2962,11.2505 4.2843,11.2455C4.2823,11.2505 4.2783,11.2605 4.2754,11.2665C4.2694,11.2705 4.2624,11.2725 4.2574,11.2765L4.2624,11.2935C4.3908,11.2575 4.5579,11.2375 4.736,11.2375Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.5104,11.1264L4.5196,11.128C4.518,11.1313 4.5175,11.1367 4.5175,11.1405C4.5175,11.1618 4.5355,11.1771 4.5562,11.1771C4.5742,11.1771 4.5873,11.1656 4.5933,11.1515C4.5933,11.152 4.596,11.1378 4.5982,11.1389C4.5998,11.1389 4.5998,11.152 4.5998,11.152C4.6025,11.17 4.6189,11.1831 4.638,11.1831C4.6593,11.1831 4.6762,11.1662 4.6762,11.1482C4.6762,11.1455 4.6762,11.1427 4.6762,11.1405L4.6882,11.1291L4.6953,11.146C4.692,11.1493 4.6909,11.1547 4.6909,11.1618C4.6909,11.1787 4.7078,11.1962 4.7269,11.1962C4.7395,11.1962 4.7515,11.1902 4.758,11.1787L4.7651,11.1711L4.7651,11.1825C4.7651,11.194 4.7705,11.2038 4.782,11.2071C4.782,11.2071 4.7956,11.2082 4.8131,11.1935C4.8316,11.1787 4.8415,11.1667 4.8415,11.1667L4.842,11.1825C4.842,11.1825 4.8251,11.2125 4.8093,11.2207C4.7995,11.2251 4.7864,11.2295 4.7755,11.2295C4.7645,11.2278 4.7564,11.218 4.752,11.2082C4.7449,11.2125 4.7356,11.2158 4.7253,11.2158C4.704,11.2158 4.6838,11.2044 4.6756,11.1869C4.6658,11.1978 4.6527,11.2027 4.6364,11.2027C4.6184,11.2027 4.602,11.1951 4.5927,11.1836C4.5829,11.1913 4.5698,11.1995 4.5545,11.1995C4.5355,11.1995 4.5191,11.188 4.5098,11.1738C4.5,11.188 4.482,11.1995 4.4629,11.1995C4.4493,11.1995 4.4351,11.1907 4.4253,11.1836C4.4149,11.1951 4.3991,11.2027 4.3822,11.2027C4.3658,11.2027 4.3516,11.1973 4.3413,11.1869C4.3342,11.2049 4.3151,11.2164 4.2927,11.2164C4.2829,11.2164 4.2736,11.2131 4.2649,11.2087C4.2611,11.2185 4.2535,11.2284 4.242,11.23C4.2322,11.23 4.2185,11.2256 4.2098,11.2213C4.1935,11.2125 4.1744,11.1831 4.1744,11.1831L4.1765,11.1673C4.1765,11.1673 4.1875,11.1787 4.2038,11.194C4.2229,11.2087 4.2355,11.2076 4.2355,11.2076C4.248,11.2044 4.2529,11.1951 4.2529,11.1831L4.2529,11.1716L4.2616,11.1793C4.2682,11.1907 4.2785,11.1967 4.2916,11.1967C4.3129,11.1967 4.3287,11.1793 4.3287,11.1624C4.3287,11.1547 4.3282,11.1498 4.326,11.1465L4.3309,11.1291L4.3424,11.1405C4.3424,11.1427 4.3418,11.1455 4.3418,11.1482C4.3418,11.1662 4.3593,11.1831 4.3805,11.1831C4.3996,11.1831 4.4165,11.1705 4.4187,11.152C4.4193,11.152 4.4193,11.1389 4.4204,11.1389C4.422,11.1378 4.4253,11.152 4.4258,11.1515C4.4302,11.1656 4.446,11.1771 4.4613,11.1771C4.4842,11.1771 4.5,11.1618 4.5,11.1405C4.5,11.1362 4.4995,11.1307 4.4989,11.128L4.5104,11.1264" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.0658,11.3301C5.0626,11.3301 5.0618,11.3301 5.057,11.3281C5.0426,11.3241 5.0291,11.3121 5.0219,11.2941C5.0099,11.2971 4.9971,11.3031 4.9851,11.3031C4.9539,11.3031 4.9259,11.2851 4.9124,11.2521C4.8956,11.2721 4.8748,11.2811 4.8548,11.2811C4.83,11.2811 4.806,11.2681 4.7908,11.2481C4.7749,11.2661 4.7557,11.2711 4.7349,11.2711C4.7101,11.2711 4.6837,11.2551 4.6693,11.2321C4.651,11.2551 4.627,11.2711 4.6006,11.2711C4.5806,11.2711 4.5614,11.2651 4.5462,11.2481C4.5295,11.2691 4.5055,11.2811 4.4823,11.2811C4.4599,11.2811 4.4399,11.2711 4.4247,11.2521C4.4104,11.2851 4.3816,11.3031 4.3512,11.3031C4.3368,11.3031 4.3248,11.2971 4.3136,11.2941C4.3048,11.3131 4.292,11.3241 4.2769,11.3281C4.2769,11.3301 4.2721,11.3301 4.2705,11.3301C4.2529,11.3301 4.2337,11.3171 4.2249,11.3121C4.2017,11.2941 4.1737,11.2421 4.1729,11.2421L4.1705,11.2361L4.1785,11.1891L4.1873,11.2031C4.1881,11.2031 4.2025,11.2241 4.2257,11.2481C4.2497,11.2701 4.2641,11.2711 4.2681,11.2711C4.2865,11.2681 4.2865,11.2421 4.2865,11.2341L4.2865,11.1871L4.3096,11.2241C4.3192,11.2421 4.3336,11.2491 4.3488,11.2491C4.3752,11.2491 4.3968,11.2241 4.3968,11.1941C4.3968,11.1801 4.3944,11.1751 4.3928,11.1711L4.3904,11.1651L4.4056,11.1241L4.4319,11.1551L4.4319,11.1571C4.4319,11.1611 4.4319,11.1651 4.4319,11.1691C4.4319,11.1991 4.4543,11.2261 4.4823,11.2261C4.5071,11.2261 4.5287,11.2031 4.5311,11.1771L4.5311,11.1711C4.5311,11.1711 4.5311,11.1711 4.5311,11.1711C4.5319,11.1521 4.5327,11.1461 4.5399,11.1461L4.5399,11.1461C4.5446,11.1461 4.5478,11.1511 4.551,11.1621L4.551,11.1621L4.5534,11.1721C4.5606,11.1981 4.5798,11.2171 4.6006,11.2171C4.6286,11.2171 4.6526,11.1881 4.6526,11.1561C4.6526,11.1481 4.6526,11.1401 4.6486,11.1331L4.647,11.1251L4.6717,11.1231L4.6949,11.1251L4.6909,11.1331C4.6909,11.1411 4.6901,11.1491 4.6901,11.1561C4.6901,11.1871 4.7125,11.2171 4.7397,11.2171C4.7613,11.2171 4.7797,11.1981 4.7877,11.1721L4.7893,11.1641L4.7893,11.1641C4.794,11.1511 4.794,11.1461 4.8012,11.1461C4.8076,11.1461 4.8076,11.1531 4.8084,11.1691C4.8084,11.1711 4.8084,11.1711 4.8084,11.1711L4.8092,11.1771C4.8124,11.2021 4.834,11.2261 4.8596,11.2261C4.8876,11.2261 4.9092,11.2001 4.9092,11.1691C4.9092,11.1651 4.9092,11.1611 4.9092,11.1571L4.9084,11.1551L4.9347,11.1241L4.9499,11.1651L4.9491,11.1711C4.9459,11.1761 4.9451,11.1811 4.9451,11.1941C4.9451,11.2231 4.9667,11.2491 4.9923,11.2491C5.0083,11.2491 5.0235,11.2411 5.0323,11.2241L5.0562,11.1871L5.0554,11.2341C5.0554,11.2421 5.0578,11.2681 5.0754,11.2711C5.077,11.2711 5.0946,11.2701 5.1162,11.2481C5.1426,11.2251 5.1562,11.2031 5.1562,11.2031L5.1657,11.1871L5.1705,11.2361L5.1681,11.2401C5.1665,11.2421 5.1426,11.2951 5.1162,11.3121C5.1042,11.3151 5.085,11.3301 5.0658,11.3301ZM5.0283,11.2701L5.0307,11.2771C5.0331,11.2891 5.0426,11.3101 5.0602,11.3121C5.061,11.3121 5.0634,11.3121 5.0658,11.3121C5.0786,11.3121 5.0938,11.3041 5.1034,11.2961C5.1218,11.2841 5.1458,11.2411 5.1506,11.2301L5.1506,11.2261C5.1418,11.2361 5.1322,11.2471 5.1178,11.2631C5.0938,11.2881 5.0754,11.2881 5.069,11.2881L5.0658,11.2881C5.0482,11.2841 5.0379,11.2651 5.0371,11.2351C5.0243,11.2531 5.0059,11.2641 4.9867,11.2641C4.9531,11.2641 4.9259,11.2331 4.9259,11.1941C4.9259,11.1781 4.9283,11.1711 4.9307,11.1651L4.9259,11.1501L4.9179,11.1611C4.9179,11.1631 4.9179,11.1651 4.9179,11.1691C4.9179,11.2061 4.89,11.2411 4.8556,11.2411C4.8252,11.2411 4.7996,11.2181 4.794,11.1821C4.7845,11.2111 4.7613,11.2271 4.7349,11.2271C4.7005,11.2271 4.6717,11.1941 4.6717,11.1551C4.6717,11.1471 4.6717,11.1451 4.6717,11.1351L4.6677,11.1331L4.6598,11.1351C4.6614,11.1451 4.6614,11.1471 4.6614,11.1551C4.6614,11.1941 4.6326,11.2271 4.5966,11.2271C4.5726,11.2271 4.5494,11.2111 4.5406,11.1821C4.5335,11.2171 4.5079,11.2411 4.4783,11.2411C4.4431,11.2411 4.4144,11.2061 4.4144,11.1691C4.4144,11.1651 4.4144,11.1631 4.4144,11.1611L4.4064,11.1501L4.4016,11.1651C4.4048,11.1711 4.4056,11.1791 4.4056,11.1941C4.4056,11.2331 4.3792,11.2641 4.3456,11.2641C4.3256,11.2641 4.3072,11.2521 4.2968,11.2351C4.2968,11.2641 4.2841,11.2841 4.2657,11.2881L4.2657,11.2881C4.2609,11.2881 4.2409,11.2881 4.2153,11.2631C4.2009,11.2471 4.1905,11.2341 4.1833,11.2261L4.1817,11.2301C4.1881,11.2421 4.2105,11.2851 4.2297,11.2961C4.2465,11.3101 4.2617,11.3151 4.2745,11.3121C4.2912,11.3101 4.2992,11.2891 4.3024,11.2771L4.3056,11.2701L4.3112,11.2731C4.3224,11.2831 4.3344,11.2891 4.3488,11.2891C4.3768,11.2891 4.4048,11.2661 4.4144,11.2381L4.4183,11.2261L4.4247,11.2351C4.4391,11.2521 4.4575,11.2651 4.4799,11.2651C4.5031,11.2651 4.5239,11.2491 4.5375,11.2281L4.5414,11.2241L4.547,11.2261C4.5606,11.2451 4.5782,11.2511 4.5974,11.2511C4.623,11.2511 4.647,11.2411 4.6598,11.2161L4.6661,11.2021L4.6701,11.2161C4.6845,11.2411 4.7077,11.2511 4.7317,11.2511C4.7509,11.2511 4.7693,11.2441 4.7829,11.2261L4.7877,11.2241L4.7916,11.2281C4.806,11.2491 4.8292,11.2651 4.8516,11.2651C4.8716,11.2651 4.8908,11.2511 4.9044,11.2351L4.9124,11.2261L4.9155,11.2381C4.9267,11.2651 4.9523,11.2891 4.9819,11.2891C4.9947,11.2891 5.0067,11.2831 5.0187,11.2731L5.0283,11.2701Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.5093,11.2196C4.4045,11.2196 4.3113,11.2322 4.2447,11.2535C4.2387,11.2551 4.2338,11.2518 4.2322,11.2475C4.2316,11.2431 4.2349,11.2387 4.2387,11.2365C4.3064,11.2158 4.4024,11.2022 4.5098,11.2022C4.6156,11.2022 4.7127,11.2158 4.7804,11.2365C4.7853,11.2387 4.7885,11.2431 4.7864,11.2475C4.7853,11.2518 4.7787,11.2551 4.7755,11.2535C4.7084,11.2327 4.6129,11.2196 4.5093,11.2196" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.2013,11.3068C5.1984,11.3068 5.1984,11.3048 5.1945,11.3048C5.0718,11.2718 4.9036,11.2498 4.7267,11.2498C4.5479,11.2498 4.3826,11.2708 4.2579,11.3048C4.2473,11.3108 4.2328,11.3028 4.2299,11.2928C4.227,11.2828 4.227,11.2788 4.2299,11.2728C4.2328,11.2668 4.2386,11.2588 4.2453,11.2568C4.371,11.2198 4.5411,11.1978 4.7277,11.1978C4.9103,11.1978 5.0853,11.2208 5.21,11.2568C5.2216,11.2628 5.2293,11.2778 5.2274,11.2918C5.2206,11.3018 5.211,11.3068 5.2013,11.3068ZM4.7267,11.2318C4.9055,11.2318 5.0727,11.2528 5.1984,11.2928L5.2003,11.2928C5.2032,11.2928 5.2081,11.2888 5.2081,11.2828C5.209,11.2808 5.2071,11.2778 5.2032,11.2758C5.0795,11.2338 4.9065,11.2128 4.7257,11.2108C4.5459,11.2128 4.37,11.2338 4.2482,11.2758C4.2453,11.2758 4.2453,11.2788 4.2434,11.2808C4.2424,11.2808 4.2424,11.2808 4.2424,11.2828C4.2434,11.2888 4.2473,11.2928 4.2521,11.2928C4.3787,11.2528 4.5469,11.2318 4.7267,11.2318Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M4.4078,11.2562C4.4078,11.2518 4.4144,11.2436 4.4236,11.2436C4.4318,11.2436 4.4384,11.2524 4.4384,11.2562C4.4384,11.2665 4.4313,11.2709 4.4236,11.2709C4.4144,11.2709 4.4078,11.266 4.4078,11.2562" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M4.5104,11.2644L4.4771,11.2644C4.4711,11.2644 4.4656,11.2578 4.4656,11.2529C4.4656,11.2469 4.4711,11.2415 4.4771,11.2415L4.5453,11.2415C4.5518,11.2415 4.5556,11.2469 4.5556,11.2529C4.5556,11.2578 4.5518,11.2644 4.5453,11.2644L4.5104,11.2644" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.6153,11.2933L4.4903,11.2933C4.4743,11.2933 4.4613,11.2813 4.4613,11.2653C4.4613,11.2463 4.4743,11.2393 4.4893,11.2393L4.6143,11.2393C4.6293,11.2393 4.6423,11.2473 4.6423,11.2653C4.6433,11.2813 4.6293,11.2933 4.6153,11.2933ZM4.4893,11.2523C4.4823,11.2523 4.4773,11.2603 4.4773,11.2653C4.4773,11.2703 4.4823,11.2763 4.4903,11.2763L4.6153,11.2763C4.6213,11.2763 4.6273,11.2703 4.6273,11.2653C4.6273,11.2603 4.6223,11.2523 4.6153,11.2523L4.4893,11.2523Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#058E6E" + android:fillType="nonZero" + android:pathData="M4.3424,11.2775L4.3184,11.2791C4.3118,11.2802 4.3058,11.2775 4.3058,11.2687C4.3053,11.2644 4.3085,11.2578 4.3151,11.2573L4.3385,11.2551L4.3631,11.2518C4.3696,11.2518 4.3756,11.2535 4.3756,11.2595C4.3762,11.2649 4.3724,11.2693 4.3658,11.2709L4.3424,11.2775" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.3297,11.3143C4.3147,11.3143 4.3037,11.3043 4.3017,11.2893C4.2997,11.2863 4.3027,11.2813 4.3057,11.2713C4.3097,11.2653 4.3167,11.2623 4.3257,11.2603L4.4147,11.2453C4.4147,11.2453 4.4157,11.2453 4.4187,11.2453C4.4317,11.2453 4.4437,11.2573 4.4467,11.2683C4.4497,11.2863 4.4377,11.3013 4.4217,11.3033L4.3327,11.3123C4.3327,11.3123 4.3317,11.3143 4.3297,11.3143ZM4.4187,11.2633L4.3267,11.2793C4.3247,11.2813 4.3217,11.2813 4.3197,11.2813C4.3167,11.2843 4.3157,11.2873 4.3167,11.2893C4.3177,11.2953 4.3247,11.3033 4.3327,11.3013L4.4197,11.2873C4.4257,11.2863 4.4317,11.2813 4.4317,11.2733C4.4297,11.2653 4.4247,11.2633 4.4187,11.2633Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M4.2447,11.2927l0.0115,-0.0164l0.0229,0.0038l-0.0136,0.0185l-0.0207,-0.006" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M4.5802,11.2562C4.5802,11.2518 4.5867,11.2436 4.5949,11.2436C4.6025,11.2436 4.6091,11.2524 4.6091,11.2562C4.6091,11.2665 4.602,11.2709 4.5949,11.2709C4.5867,11.2709 4.5802,11.266 4.5802,11.2562" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#058E6E" + android:fillType="nonZero" + android:pathData="M4.6762,11.2775L4.7002,11.2791C4.7062,11.2802 4.7116,11.2775 4.7127,11.2687C4.7144,11.2644 4.71,11.2578 4.7035,11.2573L4.6789,11.2551L4.6544,11.2518C4.6484,11.2518 4.6429,11.2535 4.6418,11.2595C4.6407,11.2649 4.6451,11.2693 4.6511,11.2709L4.6762,11.2775" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.755,11.3146C4.755,11.3146 4.753,11.3126 4.75,11.3126L4.661,11.3046C4.655,11.3046 4.647,11.2966 4.643,11.2886C4.638,11.2836 4.638,11.2786 4.638,11.2686C4.639,11.2566 4.655,11.2416 4.67,11.2456L4.76,11.2606C4.766,11.2626 4.773,11.2656 4.778,11.2716C4.783,11.2816 4.783,11.2866 4.783,11.2896C4.781,11.3046 4.769,11.3146 4.755,11.3146ZM4.667,11.2636C4.662,11.2636 4.655,11.2656 4.655,11.2736C4.654,11.2776 4.655,11.2816 4.655,11.2816C4.657,11.2846 4.661,11.2866 4.664,11.2876L4.755,11.3016C4.76,11.3016 4.767,11.2956 4.767,11.2896C4.767,11.2876 4.767,11.2846 4.767,11.2816C4.764,11.2816 4.761,11.2816 4.757,11.2796L4.667,11.2636L4.667,11.2636Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M4.7716,11.2933l-0.0093,-0.0169l-0.0229,0.0011l0.0104,0.0191l0.0218,-0.0033" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M4.5093,11.3571C4.4247,11.3565 4.3489,11.3484 4.2905,11.3325C4.3484,11.3189 4.4247,11.3091 4.5093,11.3091C4.5933,11.3091 4.6702,11.3189 4.7275,11.3325C4.6702,11.3489 4.5933,11.3565 4.5093,11.3571" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.6947,11.4063L4.6947,11.4063C4.5347,11.4063 4.3977,11.3943 4.2917,11.3673C4.2877,11.3653 4.2867,11.3613 4.2867,11.3553C4.2867,11.3533 4.2877,11.3503 4.2917,11.3503C4.4037,11.3243 4.5447,11.3063 4.6947,11.3053C4.8427,11.3053 4.9857,11.3243 5.0967,11.3503C5.0997,11.3503 5.1027,11.3533 5.1027,11.3553C5.1027,11.3613 5.0997,11.3653 5.0967,11.3673C4.9927,11.3943 4.8537,11.4063 4.6947,11.4063ZM4.3287,11.3553C4.4267,11.3783 4.5527,11.3923 4.6937,11.3943C4.8367,11.3923 4.9587,11.3783 5.0587,11.3553C4.9537,11.3323 4.8247,11.3243 4.6937,11.3243C4.5607,11.3243 4.4327,11.3323 4.3287,11.3553Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.7749,11.1749C4.776,11.1662 4.7749,11.1624 4.7695,11.1602C4.7656,11.158 4.7591,11.1624 4.7569,11.1678C4.7553,11.1755 4.7564,11.1804 4.7624,11.1836C4.7656,11.1847 4.7722,11.1793 4.7749,11.1749" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.6064,11.1411C4.6075,11.1367 4.6047,11.1285 4.5998,11.1285C4.5944,11.1285 4.59,11.1335 4.59,11.14C4.5884,11.1476 4.5916,11.1525 4.5965,11.1525C4.6015,11.1536 4.6058,11.1493 4.6064,11.1411" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.4116,11.1411C4.4105,11.1367 4.4138,11.1285 4.4198,11.1285C4.4236,11.1285 4.4296,11.1335 4.4302,11.14C4.4302,11.1476 4.4275,11.1525 4.4231,11.1525C4.4171,11.1536 4.4133,11.1493 4.4116,11.1411" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.2447,11.1749C4.242,11.1662 4.2447,11.1624 4.2485,11.1602C4.2545,11.158 4.2595,11.1624 4.2611,11.1678C4.2638,11.1755 4.2616,11.1804 4.2573,11.1836C4.2518,11.1847 4.2469,11.1793 4.2447,11.1749" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.5093,11.0462l-0.0305,0.0169l0.0224,0.048l0.0082,0.0044l0.0076,-0.0044l0.0224,-0.048l-0.03,-0.0169" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.5388,11.1915L4.5178,11.1765L4.4738,11.0775L4.5388,11.0385L4.6048,11.0775L4.5578,11.1765L4.5388,11.1915ZM4.5298,11.1655L4.5378,11.1715L4.5448,11.1655L4.5798,11.0855L4.5378,11.0605L4.4928,11.0855L4.5298,11.1655Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.4433,11.1155l0.0142,0.0213l0.0464,-0.0125l0.0049,-0.0087l-0.0049,-0.0044l-0.0464,-0.0147l-0.0142,0.0191" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.4694,11.1838L4.4384,11.1368L4.4694,11.0898L4.5634,11.1168L4.5764,11.1368L4.5634,11.1578L4.4694,11.1838ZM4.4584,11.1368L4.4764,11.1658L4.5524,11.1408L4.5584,11.1368L4.5524,11.1338L4.4764,11.1118L4.4584,11.1368Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.5742,11.1155l-0.0125,0.0213l-0.0475,-0.0125l-0.0038,-0.0087l0.0038,-0.0044l0.0469,-0.0147l0.0131,0.0191" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.6118,11.1838l-0.094,-0.026l-0.014,-0.021l0.015,-0.02l0.094,-0.027l0.032,0.047z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.3151,11.0642l-0.0224,0.024l0.0289,0.0387l0.0093,0.0022l0.0049,-0.0055l0.0109,-0.0469l-0.0316,-0.0125" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.3682,11.2008l-0.022,-0.012l-0.06,-0.077l0.052,-0.052l0.067,0.026l-0.021,0.097z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.2671,11.1455l0.0169,0.0169l0.0425,-0.024l0.0033,-0.0082l-0.0055,-0.0049l-0.0491,-0.0027l-0.0082,0.0229" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.3011,11.2095l-0.04,-0.037l0.021,-0.057l0.097,0.012l0.018,0.012l-0.009,0.023z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.3953,11.1187l-0.0098,0.0224l-0.0475,-0.0044l-0.0071,-0.0065l0.0027,-0.0065l0.042,-0.0224l0.0196,0.0175" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.4424,11.1884l-0.099,-0.01l-0.019,-0.016l0.012,-0.021l0.085,-0.045l0.041,0.039z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.2196,11.1509l-0.0038,0.024l-0.048,0.0044l-0.0071,-0.0044l0.0005,-0.0087l0.0371,-0.03l0.0213,0.0147" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.1773,11.2277l-0.022,-0.011l0.006,-0.023l0.073,-0.063l0.05,0.035l-0.01,0.053z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.314,11.1302C4.314,11.1236 4.3216,11.1155 4.3315,11.1155C4.3407,11.1155 4.3473,11.1242 4.3473,11.1302C4.3473,11.14 4.3407,11.1482 4.3315,11.1482C4.3211,11.1482 4.314,11.14 4.314,11.1302" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.7024,11.0642l0.024,0.024l-0.0305,0.0387l-0.0065,0.0022l-0.0065,-0.0055l-0.0098,-0.0469l0.0295,-0.0125" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.7034,11.2008l-0.014,-0.018l-0.023,-0.097l0.069,-0.026l0.051,0.052l-0.062,0.077z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.7515,11.1455l-0.018,0.0169l-0.042,-0.024l-0.0027,-0.0082l0.0065,-0.0049l0.0475,-0.0027l0.0087,0.0229" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.7777,11.2095l-0.083,-0.047l-0.012,-0.023l0.018,-0.012l0.1,-0.012l0.018,0.057z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.6244,11.1187l0.0087,0.0224l0.0485,-0.0044l0.0065,-0.0065l-0.0038,-0.0065l-0.0431,-0.0224l-0.0169,0.0175" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.6399,11.1884l-0.021,-0.053l0.041,-0.039l0.085,0.045l0.01,0.021l-0.019,0.016z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.7913,11.1509l0.0038,0.024l0.0485,0.0044l0.0076,-0.0044l-0.0027,-0.0087l-0.0355,-0.03l-0.0218,0.0147" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.8939,11.2282l-0.099,-0.01l-0.008,-0.053l0.049,-0.035l0.074,0.063l0.004,0.023z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.4918,11.1155C4.4918,11.1067 4.5,11.1002 4.5093,11.1002C4.5191,11.1002 4.5256,11.1073 4.5256,11.1155C4.5256,11.1236 4.5185,11.1324 4.5093,11.1324C4.5,11.1324 4.4918,11.1242 4.4918,11.1155" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.6713,11.1302C4.6713,11.1236 4.6795,11.1155 4.6893,11.1155C4.6985,11.1155 4.7051,11.1242 4.7051,11.1302C4.7051,11.14 4.6985,11.1482 4.6893,11.1482C4.6795,11.1482 4.6713,11.14 4.6713,11.1302" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.1553,11.1782C4.1553,11.1782 4.1427,11.1624 4.1329,11.1525C4.1253,11.1471 4.1089,11.1411 4.1089,11.1411C4.1089,11.1384 4.1187,11.1313 4.1296,11.1313C4.1356,11.1313 4.1411,11.1345 4.1444,11.1384L4.1455,11.1313C4.1455,11.1313 4.1542,11.1335 4.158,11.1411C4.1607,11.1525 4.1585,11.1667 4.1585,11.1667C4.1585,11.1667 4.1585,11.1749 4.1553,11.1782" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.198,11.2269C4.193,11.2269 4.193,11.2249 4.182,11.2149C4.174,11.2049 4.161,11.1919 4.151,11.1779C4.14,11.1729 4.118,11.1659 4.11,11.1619L4.104,11.1579L4.104,11.1519C4.104,11.1419 4.127,11.1269 4.151,11.1269C4.157,11.1269 4.166,11.1289 4.173,11.1309L4.174,11.1269L4.181,11.1269C4.182,11.1269 4.202,11.1289 4.209,11.1519C4.218,11.1729 4.215,11.1989 4.214,11.1989C4.214,11.2029 4.209,11.2179 4.204,11.2219L4.201,11.2259L4.198,11.2259L4.198,11.2269Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.1553,11.1689C4.1591,11.1656 4.1678,11.1667 4.1744,11.1722C4.1809,11.1771 4.182,11.1847 4.1776,11.188C4.1744,11.1924 4.1651,11.1924 4.1591,11.188C4.1531,11.1804 4.152,11.1749 4.1553,11.1689" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.8573,11.1782C4.8578,11.1782 4.8709,11.1624 4.8802,11.1525C4.8873,11.1471 4.9031,11.1411 4.9031,11.1411C4.9031,11.1384 4.8938,11.1313 4.8835,11.1313C4.8775,11.1313 4.8715,11.1345 4.8682,11.1384L4.866,11.1313C4.866,11.1313 4.8584,11.1335 4.854,11.1411C4.8496,11.1525 4.8518,11.1667 4.8518,11.1667C4.8518,11.1667 4.854,11.1749 4.8573,11.1782" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.8654,11.2265L4.8654,11.2265L4.8614,11.2265L4.8594,11.2225C4.8514,11.2175 4.8504,11.2025 4.8504,11.1995C4.8494,11.1995 4.8444,11.1745 4.8504,11.1525C4.8614,11.1295 4.8784,11.1275 4.8784,11.1275L4.8874,11.1275L4.8894,11.1315C4.8954,11.1295 4.9024,11.1275 4.9114,11.1275C4.9314,11.1275 4.9554,11.1435 4.9554,11.1525L4.9554,11.1585L4.9494,11.1625C4.9414,11.1665 4.9184,11.1735 4.9104,11.1785C4.8994,11.1925 4.8844,11.2075 4.8764,11.2155C4.8704,11.2245 4.8694,11.2265 4.8654,11.2265Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.8584,11.1689C4.8535,11.1656 4.8458,11.1667 4.8393,11.1722C4.8327,11.1771 4.8311,11.1847 4.8355,11.188C4.8393,11.1924 4.8475,11.1924 4.8535,11.188C4.8595,11.1804 4.8616,11.1749 4.8584,11.1689" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.1258,11.5715l0.7707,0l0,-0.2018l-0.7707,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.1187,11.7555L4.1187,11.7555L4.1187,11.3625L5.1187,11.3625L5.1187,11.7555ZM4.1368,11.7295L5.102,11.7295L5.102,11.3875L4.1368,11.3875L4.1368,11.7295Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.206,11.7045C4.2109,11.7035 4.2147,11.7035 4.2202,11.7035L4.7978,11.7035C4.8044,11.7035 4.8093,11.7035 4.8136,11.7056C4.7945,11.6991 4.7793,11.6822 4.7793,11.6609C4.7793,11.6396 4.7945,11.6227 4.8147,11.614C4.8104,11.6151 4.8038,11.6173 4.7973,11.6173L4.2202,11.6173C4.2147,11.6173 4.2093,11.6162 4.2038,11.614L4.2071,11.6151C4.2289,11.6227 4.2398,11.6396 4.2398,11.6609C4.2398,11.6789 4.2267,11.6991 4.206,11.7045" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.1833,11.8014C5.1833,11.8014 5.1816,11.8014 5.1798,11.7984L5.1772,11.7984C5.1711,11.7984 5.1641,11.7984 5.158,11.7984L4.234,11.7984C4.227,11.7984 4.2235,11.7984 4.22,11.7984C4.2165,11.7984 4.2165,11.7984 4.2148,11.7984C4.2087,11.8014 4.2026,11.7984 4.2008,11.7914C4.1999,11.7824 4.2008,11.7774 4.206,11.7744C4.2087,11.7744 4.2104,11.7744 4.2113,11.7744C4.2366,11.7584 4.2532,11.7334 4.2532,11.7044C4.2532,11.6734 4.2375,11.6434 4.2139,11.6344C4.2113,11.6344 4.2069,11.6344 4.2052,11.6344C4.1999,11.6344 4.1965,11.6244 4.1973,11.6184C4.1991,11.6104 4.2043,11.6104 4.2113,11.6104L4.2191,11.6104C4.2235,11.6104 4.2287,11.6104 4.234,11.6104L5.158,11.6104C5.1667,11.6104 5.1763,11.6104 5.1833,11.6104C5.1886,11.6064 5.1938,11.6104 5.1964,11.6164C5.199,11.6184 5.1947,11.6304 5.1894,11.6344C5.1606,11.6424 5.1406,11.6734 5.1406,11.7044C5.1406,11.7354 5.1589,11.7614 5.1833,11.7744C5.1842,11.7744 5.1868,11.7744 5.1886,11.7744C5.1929,11.7794 5.1947,11.7824 5.1929,11.7944C5.192,11.7984 5.1886,11.8014 5.1833,11.8014ZM4.2523,11.7724L5.1414,11.7724C5.1275,11.7514 5.1179,11.7274 5.1179,11.7044C5.1179,11.6814 5.1275,11.6574 5.1423,11.6374L4.2532,11.6374C4.2689,11.6584 4.2767,11.6814 4.2767,11.7044C4.2767,11.7274 4.268,11.7514 4.2523,11.7724Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.2202,11.7035L4.7978,11.7035C4.8169,11.7035 4.8327,11.716 4.8327,11.7291C4.8327,11.746 4.8169,11.758 4.7978,11.758L4.2202,11.758C4.2005,11.758 4.1847,11.7465 4.1847,11.7291C4.1847,11.716 4.2005,11.7035 4.2202,11.7035" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.1142,11.82L4.2419,11.82C4.2065,11.82 4.1776,11.794 4.1776,11.755C4.1776,11.724 4.2065,11.698 4.2419,11.698L5.1142,11.698C5.1488,11.698 5.1776,11.723 5.1776,11.755C5.1776,11.794 5.1488,11.82 5.1142,11.82ZM4.2419,11.724C4.2188,11.724 4.1991,11.738 4.1991,11.755C4.1991,11.778 4.2188,11.794 4.2419,11.794L5.1142,11.794C5.1381,11.794 5.157,11.778 5.157,11.755C5.157,11.737 5.1381,11.724 5.1142,11.724L4.2419,11.724Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.2202,11.5715L4.7978,11.5715C4.8175,11.5715 4.8333,11.5829 4.8333,11.5949C4.8333,11.6075 4.8175,11.6173 4.7978,11.6173L4.2202,11.6173C4.2005,11.6173 4.1847,11.6075 4.1847,11.5949C4.1847,11.5829 4.2005,11.5715 4.2202,11.5715" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.1134,11.6757L4.2418,11.6757C4.2064,11.6757 4.1776,11.6527 4.1776,11.6217C4.1776,11.5887 4.2064,11.5627 4.2418,11.5627L5.1134,11.5627C5.1505,11.5627 5.1776,11.5877 5.1776,11.6217C5.1776,11.6517 5.1505,11.6757 5.1134,11.6757ZM4.2418,11.5887C4.2163,11.5887 4.199,11.6077 4.199,11.6217C4.199,11.6337 4.2163,11.6487 4.2418,11.6487L5.1134,11.6487C5.1398,11.6487 5.1571,11.6327 5.1571,11.6217C5.1571,11.6067 5.1398,11.5887 5.1134,11.5887L4.2418,11.5887Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#005BBF" + android:fillType="nonZero" + android:pathData="M5.0498,14.9718C4.9958,14.9718 4.9478,14.9615 4.9129,14.9429C4.8785,14.9249 4.8316,14.9129 4.7793,14.9129C4.7275,14.9129 4.6789,14.9244 4.644,14.9429C4.6085,14.9615 4.5611,14.9718 4.5082,14.9718C4.4547,14.9718 4.4073,14.9593 4.3718,14.9407C4.3375,14.9249 4.2922,14.9129 4.2409,14.9129C4.1885,14.9129 4.1416,14.9238 4.1067,14.9418C4.0718,14.9604 4.0238,14.9718 3.9704,14.9718L3.9704,15.0558C4.0238,15.0558 4.0718,15.0444 4.1067,15.0253C4.1416,15.0078 4.1885,14.9969 4.2409,14.9969C4.2922,14.9969 4.3369,15.0084 4.3718,15.0253C4.4073,15.0427 4.4547,15.0558 4.5082,15.0558C4.5605,15.0558 4.6085,15.0444 4.644,15.0258C4.6789,15.01 4.7269,14.9969 4.7793,14.9969C4.8316,14.9969 4.878,15.0095 4.9129,15.0258C4.9478,15.0449 4.9958,15.0558 5.0487,15.0558L5.0498,14.9718" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.0558,15.1925L5.0487,15.1925C4.9958,15.1925 4.9478,15.1715 4.9096,15.1365C4.8747,15.1035 4.8295,15.0815 4.7798,15.0815C4.7307,15.0815 4.6833,15.1025 4.6478,15.1365C4.6096,15.1715 4.5616,15.1925 4.5093,15.1925C4.4585,15.1925 4.4084,15.1715 4.3702,15.1325C4.3347,15.1015 4.29,15.0815 4.2425,15.0815C4.1913,15.0815 4.1465,15.1015 4.1111,15.1345C4.0729,15.1715 4.0238,15.1925 3.972,15.1925L3.9644,15.1925L3.9644,15.0115L3.9709,15.0115C4.0205,15.0115 4.0691,14.9955 4.104,14.9605C4.1411,14.9255 4.188,14.9075 4.2415,14.9075C4.2916,14.9075 4.3391,14.9255 4.3756,14.9595C4.4122,14.9935 4.4591,15.0115 4.5087,15.0115C4.5578,15.0115 4.6058,14.9955 4.6407,14.9605C4.6778,14.9295 4.728,14.9075 4.7793,14.9075C4.8305,14.9075 4.8796,14.9275 4.9156,14.9605C4.9511,14.9955 4.9991,15.0115 5.0498,15.0115L5.0569,15.0115L5.0558,15.1925ZM4.2415,15.0565C4.2911,15.0565 4.3385,15.0775 4.3756,15.1115C4.4127,15.1485 4.4591,15.1665 4.5087,15.1665C4.5578,15.1665 4.6058,15.1485 4.6407,15.1155C4.6784,15.0805 4.7275,15.0565 4.7793,15.0565C4.83,15.0565 4.8791,15.0795 4.9156,15.1155C4.9511,15.1485 4.9936,15.1665 5.0416,15.1665L5.0427,15.0375C4.9925,15.0355 4.9451,15.0175 4.9091,14.9835C4.8742,14.9515 4.8289,14.9315 4.7793,14.9315C4.7302,14.9315 4.6827,14.9525 4.6473,14.9845C4.6102,15.0195 4.5611,15.0375 4.5087,15.0375C4.4575,15.0375 4.4078,15.0185 4.3696,14.9815C4.3347,14.9515 4.2895,14.9315 4.242,14.9315C4.1907,14.9315 4.146,14.9515 4.1105,14.9815C4.0756,15.0175 4.0276,15.0355 3.978,15.0375L3.978,15.1665C4.0244,15.1665 4.0702,15.1455 4.104,15.1135C4.1416,15.0785 4.1885,15.0565 4.2415,15.0565Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CCCCCC" + android:fillType="nonZero" + android:pathData="M5.0498,15.0564C4.9958,15.0564 4.9478,15.0455 4.9129,15.0264C4.8785,15.0105 4.8316,14.9975 4.7793,14.9975C4.7275,14.9975 4.6789,15.01 4.644,15.0264C4.6085,15.0444 4.5611,15.0564 4.5082,15.0564C4.4547,15.0564 4.4073,15.0438 4.3718,15.0258C4.3375,15.0095 4.2922,14.9975 4.2409,14.9975C4.1885,14.9975 4.1416,15.0084 4.1067,15.0258C4.0718,15.0444 4.0238,15.0564 3.9704,15.0564L3.9704,15.1398C4.0238,15.1398 4.0718,15.1284 4.1067,15.1093C4.1416,15.0913 4.1885,15.0793 4.2409,15.0793C4.2922,15.0793 4.3369,15.0907 4.3718,15.1082C4.4073,15.1267 4.4547,15.1398 4.5082,15.1398C4.5605,15.1398 4.6085,15.1284 4.644,15.1104C4.6789,15.0913 4.7269,15.0793 4.7793,15.0793C4.8316,15.0793 4.878,15.0907 4.9129,15.1104C4.9478,15.1284 4.9958,15.1398 5.0487,15.1398L5.0498,15.0564" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.0558,15.2767L5.0487,15.2767C4.9958,15.2767 4.9478,15.2607 4.9096,15.2217C4.8747,15.1907 4.8295,15.1687 4.7798,15.1687C4.7307,15.1687 4.6833,15.1917 4.6478,15.2217C4.6096,15.2587 4.5616,15.2767 4.5093,15.2767C4.4585,15.2767 4.4084,15.2567 4.3702,15.2187C4.3347,15.1887 4.29,15.1687 4.2425,15.1687C4.1913,15.1687 4.1465,15.1887 4.1111,15.2207C4.0735,15.2587 4.0244,15.2767 3.972,15.2767L3.9644,15.2767L3.9644,15.0987L3.9709,15.0987C4.0205,15.0987 4.0691,15.0807 4.104,15.0457C4.1416,15.0107 4.1885,14.9887 4.2415,14.9887C4.2916,14.9887 4.3391,15.0097 4.3756,15.0437C4.4127,15.0807 4.4596,15.0987 4.5087,15.0987C4.5578,15.0987 4.6058,15.0807 4.6407,15.0477C4.6784,15.0127 4.7275,14.9887 4.7793,14.9887C4.83,14.9887 4.8791,15.0117 4.9156,15.0477C4.9511,15.0807 4.9991,15.0987 5.0498,15.0987L5.0569,15.0987L5.0558,15.2767ZM4.2415,15.1457C4.2911,15.1457 4.3385,15.1657 4.3756,15.1987C4.4122,15.2337 4.4591,15.2517 4.5087,15.2517C4.5578,15.2517 4.6058,15.2357 4.6407,15.2007C4.6784,15.1677 4.7275,15.1457 4.7793,15.1457C4.83,15.1457 4.8791,15.1667 4.9156,15.2007C4.9511,15.2337 4.9936,15.2497 5.0416,15.2517L5.0427,15.1257C4.9925,15.1227 4.9451,15.1047 4.9091,15.0697C4.8742,15.0367 4.8289,15.0147 4.7793,15.0147C4.7302,15.0147 4.6827,15.0357 4.6473,15.0697C4.6091,15.1047 4.5611,15.1257 4.5087,15.1257C4.458,15.1257 4.4078,15.1047 4.3696,15.0657C4.3347,15.0347 4.2895,15.0147 4.242,15.0147C4.1907,15.0147 4.146,15.0347 4.1105,15.0677C4.0751,15.1037 4.0276,15.1227 3.978,15.1257L3.978,15.2517C4.0244,15.2497 4.0707,15.2317 4.104,15.1987C4.1411,15.1647 4.188,15.1457 4.2415,15.1457Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#005BBF" + android:fillType="nonZero" + android:pathData="M5.0498,15.1398C4.9958,15.1398 4.9478,15.1284 4.9129,15.1104C4.8785,15.0913 4.8316,15.0793 4.7793,15.0793C4.7275,15.0793 4.6789,15.0907 4.644,15.1104C4.6085,15.1284 4.5611,15.1398 4.5082,15.1398C4.4547,15.1398 4.4073,15.1273 4.3718,15.1082C4.3375,15.0913 4.2922,15.0793 4.2409,15.0793C4.1885,15.0793 4.1416,15.0907 4.1067,15.1093C4.0718,15.1278 4.0238,15.1398 3.9704,15.1398L3.9704,15.2222C4.0238,15.2222 4.0718,15.2107 4.1067,15.1922C4.1416,15.1753 4.1885,15.1633 4.2409,15.1633C4.2922,15.1633 4.3369,15.1758 4.3718,15.1916C4.4073,15.2102 4.4547,15.2222 4.5082,15.2222C4.5605,15.2222 4.6085,15.2113 4.644,15.1933C4.6789,15.1764 4.7269,15.1633 4.7793,15.1633C4.8316,15.1633 4.878,15.1758 4.9129,15.1933C4.9478,15.2124 4.9958,15.2222 5.0487,15.2222L5.0498,15.1398" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.0558,15.3588L5.0487,15.3588C4.9958,15.3588 4.9478,15.3398 4.9096,15.3048C4.8753,15.2698 4.83,15.2498 4.7798,15.2498C4.7307,15.2498 4.6833,15.2698 4.6478,15.3048C4.6102,15.3398 4.5616,15.3588 4.5093,15.3588C4.458,15.3588 4.4084,15.3378 4.3702,15.3008C4.3347,15.2698 4.29,15.2498 4.2425,15.2498C4.1913,15.2498 4.1465,15.2698 4.1111,15.3028C4.0735,15.3378 4.0249,15.3588 3.972,15.3588L3.9644,15.3588L3.9644,15.1798L3.9709,15.1798C4.0205,15.1798 4.0691,15.1618 4.104,15.1268C4.1411,15.0938 4.188,15.0738 4.2415,15.0738C4.2916,15.0738 4.3391,15.0938 4.3756,15.1268C4.4127,15.1618 4.4591,15.1798 4.5087,15.1798C4.5578,15.1798 4.6058,15.1638 4.6407,15.1288C4.6784,15.0958 4.7275,15.0738 4.7793,15.0738C4.83,15.0738 4.8791,15.0948 4.9156,15.1288C4.9516,15.1638 4.9991,15.1798 5.0498,15.1798L5.0569,15.1798L5.0558,15.3588ZM4.2415,15.2248C4.2905,15.2248 4.3385,15.2458 4.3756,15.2798C4.4122,15.3148 4.4585,15.3358 4.5087,15.3358C4.5578,15.3358 4.6058,15.3168 4.6407,15.2838C4.6784,15.2468 4.7275,15.2248 4.7793,15.2248C4.8305,15.2248 4.8796,15.2458 4.9156,15.2838C4.9511,15.3148 4.9931,15.3328 5.0416,15.3328L5.0427,15.2058C4.9925,15.2038 4.9456,15.1858 4.9091,15.1508C4.8742,15.1198 4.8289,15.0978 4.7793,15.0978C4.7302,15.0978 4.6827,15.1208 4.6473,15.1508C4.6091,15.1878 4.5611,15.2058 4.5087,15.2058C4.458,15.2058 4.4078,15.1858 4.3696,15.1478C4.3347,15.1178 4.2895,15.0978 4.242,15.0978C4.1907,15.0978 4.146,15.1178 4.1105,15.1498C4.0756,15.1858 4.0276,15.2038 3.978,15.2058L3.978,15.3328C4.0244,15.3328 4.0707,15.3138 4.104,15.2818C4.1416,15.2468 4.1885,15.2248 4.2415,15.2248Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CCCCCC" + android:fillType="nonZero" + android:pathData="M5.0487,15.3062C4.9958,15.3062 4.9478,15.2947 4.9129,15.2778C4.8785,15.2576 4.8316,15.2467 4.7793,15.2467C4.7275,15.2467 4.6789,15.2576 4.644,15.2778C4.6085,15.2947 4.5611,15.3062 4.5082,15.3062C4.4547,15.3062 4.4073,15.2947 4.3718,15.2756C4.3375,15.2576 4.2922,15.2467 4.2409,15.2467C4.1885,15.2467 4.1416,15.2576 4.1067,15.2767C4.0718,15.2947 4.0238,15.3062 3.9704,15.3062L3.9704,15.2238C4.0238,15.2238 4.0718,15.2113 4.1067,15.1927C4.1416,15.1758 4.1885,15.1638 4.2409,15.1638C4.2922,15.1638 4.3369,15.1764 4.3718,15.1922C4.4073,15.2107 4.4547,15.2227 4.5082,15.2227C4.5605,15.2227 4.6085,15.2118 4.644,15.1938C4.6789,15.1769 4.7269,15.1638 4.7793,15.1638C4.8316,15.1638 4.878,15.1764 4.9129,15.1938C4.9478,15.2129 4.9958,15.2227 5.0498,15.2227L5.0487,15.3062" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.0558,15.4436L5.0487,15.4436C4.9958,15.4436 4.9478,15.4256 4.9096,15.3866C4.8747,15.3576 4.8295,15.3366 4.7798,15.3366C4.7307,15.3366 4.6833,15.3576 4.6478,15.3886C4.6102,15.4256 4.5616,15.4436 4.5093,15.4436C4.4585,15.4436 4.4084,15.4236 4.3702,15.3856C4.3353,15.3556 4.29,15.3366 4.2425,15.3366C4.1913,15.3366 4.1465,15.3556 4.1111,15.3866C4.0729,15.4266 4.0244,15.4436 3.9709,15.4436L3.9644,15.4436L3.9644,15.2666L3.9709,15.2666C4.02,15.2666 4.0691,15.2456 4.104,15.2126C4.1416,15.1776 4.188,15.1556 4.2415,15.1556C4.2905,15.1556 4.3385,15.1766 4.3756,15.2106C4.4122,15.2456 4.4585,15.2666 4.5087,15.2666C4.5578,15.2666 4.6058,15.2476 4.6407,15.2146C4.6784,15.1776 4.7275,15.1556 4.7793,15.1556C4.8305,15.1556 4.8796,15.1766 4.9156,15.2146C4.9511,15.2456 4.9991,15.2666 5.0498,15.2666L5.0569,15.2666L5.0558,15.4436ZM4.2415,15.3106C4.2911,15.3106 4.3391,15.3316 4.3756,15.3636C4.4127,15.4006 4.4591,15.4186 4.5087,15.4186C4.5578,15.4186 4.6058,15.4026 4.6407,15.3656C4.6784,15.3346 4.7275,15.3106 4.7793,15.3106C4.83,15.3106 4.8791,15.3336 4.9156,15.3656C4.9511,15.4006 4.9936,15.4166 5.0416,15.4186L5.0427,15.2906C4.9925,15.2876 4.9445,15.2696 4.9091,15.2366C4.8747,15.2016 4.8295,15.1816 4.7793,15.1816C4.7302,15.1816 4.6827,15.2016 4.6473,15.2366C4.6096,15.2716 4.5611,15.2906 4.5087,15.2906C4.4575,15.2906 4.4078,15.2696 4.3696,15.2326C4.3342,15.2016 4.2895,15.1816 4.242,15.1816C4.1907,15.1816 4.146,15.2016 4.1105,15.2346C4.0745,15.2696 4.0276,15.2906 3.978,15.2926L3.978,15.4186C4.0255,15.4166 4.0702,15.3986 4.104,15.3656C4.1416,15.3326 4.1885,15.3106 4.2415,15.3106Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#005BBF" + android:fillType="nonZero" + android:pathData="M5.0487,15.3896C4.9958,15.3896 4.9478,15.3787 4.9129,15.3596C4.8785,15.3427 4.8316,15.3296 4.7793,15.3296C4.7275,15.3296 4.6789,15.3422 4.644,15.3596C4.6085,15.3787 4.5611,15.3896 4.5082,15.3896C4.4547,15.3896 4.4073,15.3771 4.3718,15.3585C4.3375,15.3427 4.2922,15.3296 4.2409,15.3296C4.1885,15.3296 4.1416,15.3422 4.1067,15.3596C4.0718,15.3776 4.0238,15.3896 3.9704,15.3896L3.9704,15.3078C4.0238,15.3078 4.0718,15.2953 4.1067,15.2767C4.1416,15.2576 4.1885,15.2467 4.2409,15.2467C4.2922,15.2467 4.3369,15.2576 4.3718,15.2756C4.4073,15.2942 4.4547,15.3062 4.5082,15.3062C4.5605,15.3062 4.6085,15.2947 4.644,15.2778C4.6789,15.2576 4.7269,15.2467 4.7793,15.2467C4.8316,15.2467 4.878,15.2576 4.9129,15.2778C4.9478,15.2947 4.9958,15.3062 5.0493,15.3062L5.0487,15.3896" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.0558,15.5282L5.0487,15.5282C4.9958,15.5282 4.9478,15.5072 4.9096,15.4732C4.8747,15.4362 4.8289,15.4182 4.7793,15.4182C4.7302,15.4182 4.6827,15.4362 4.6473,15.4732C4.6091,15.5062 4.5611,15.5282 4.5087,15.5282C4.458,15.5282 4.4078,15.5072 4.3696,15.4682C4.3342,15.4362 4.2895,15.4182 4.242,15.4182C4.1907,15.4182 4.146,15.4362 4.1105,15.4712C4.0724,15.5062 4.0238,15.5282 3.9715,15.5282L3.9644,15.5282L3.9644,15.3502L3.9709,15.3502C4.0195,15.3502 4.0691,15.3322 4.104,15.2952C4.1411,15.2622 4.188,15.2402 4.2415,15.2402C4.2911,15.2402 4.3385,15.2612 4.3756,15.2932C4.4127,15.3302 4.4591,15.3482 4.5087,15.3482C4.5578,15.3482 4.6058,15.3322 4.6407,15.2952C4.6778,15.2642 4.7275,15.2402 4.7793,15.2402C4.8305,15.2402 4.8796,15.2632 4.9156,15.2952C4.9511,15.3322 4.9991,15.3482 5.0493,15.3482L5.0569,15.3482L5.0558,15.5282ZM4.2415,15.3932C4.2911,15.3932 4.3385,15.4132 4.3756,15.4482C4.4133,15.4832 4.4596,15.5022 4.5087,15.5022C4.5578,15.5022 4.6058,15.4832 4.6407,15.4522C4.6784,15.4132 4.7275,15.3932 4.7793,15.3932C4.8305,15.3932 4.8796,15.4132 4.9156,15.4522C4.9511,15.4832 4.9942,15.4992 5.0416,15.5022L5.0422,15.3742C4.9925,15.3722 4.9456,15.3542 4.9091,15.3172C4.8747,15.2882 4.8295,15.2672 4.7793,15.2672C4.7302,15.2672 4.6827,15.2882 4.6473,15.3192C4.6096,15.3562 4.5611,15.3742 4.5087,15.3742C4.458,15.3742 4.4078,15.3542 4.3696,15.3162C4.3342,15.2862 4.2895,15.2672 4.242,15.2672C4.1907,15.2672 4.146,15.2862 4.1105,15.3172C4.0745,15.3542 4.0276,15.3742 3.978,15.3762L3.978,15.5022C4.0244,15.4992 4.0707,15.4812 4.104,15.4502C4.1416,15.4122 4.1885,15.3932 4.2415,15.3932Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.206,14.6298C4.2082,14.6385 4.2104,14.6435 4.2104,14.6522C4.2104,14.7035 4.1673,14.7416 4.1138,14.7416L4.9069,14.7416C4.854,14.7416 4.8109,14.7035 4.8109,14.6522C4.8109,14.6435 4.8109,14.6385 4.8136,14.6298C4.8087,14.6309 4.8033,14.6309 4.7978,14.6309L4.2202,14.6309C4.2158,14.6309 4.2098,14.6309 4.206,14.6298" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.0985,14.8537L4.1154,14.8537C4.1113,14.8537 4.1073,14.8477 4.1073,14.8397C4.1073,14.8357 4.1107,14.8257 4.1154,14.8257C4.1769,14.8257 4.2269,14.7577 4.2269,14.6757C4.2269,14.6637 4.2269,14.6567 4.2236,14.6487L4.2222,14.6367C4.2222,14.6347 4.2222,14.6287 4.2242,14.6287C4.2263,14.6247 4.2297,14.6227 4.233,14.6247C4.2364,14.6287 4.2425,14.6287 4.2472,14.6287L4.9633,14.6287C4.9687,14.6287 4.9748,14.6287 4.9788,14.6247C4.9822,14.6227 4.9856,14.6247 4.9869,14.6287C4.9903,14.6287 4.9903,14.6347 4.9903,14.6367C4.9883,14.6527 4.9869,14.6597 4.9869,14.6757C4.9869,14.7577 5.0376,14.8257 5.0985,14.8257C5.1032,14.8257 5.1073,14.8357 5.1073,14.8397C5.1066,14.8477 5.1032,14.8537 5.0985,14.8537ZM4.1803,14.8267L5.0349,14.8267C4.995,14.7997 4.9707,14.7427 4.9707,14.6767C4.9707,14.6667 4.9714,14.6587 4.9714,14.6537C4.9687,14.6537 4.9673,14.6537 4.9633,14.6537L4.2472,14.6537C4.2459,14.6537 4.2439,14.6537 4.2418,14.6537C4.2418,14.6597 4.2432,14.6677 4.2432,14.6767C4.2439,14.7427 4.2182,14.7987 4.1803,14.8267Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.2202,14.5785L4.7978,14.5785C4.8169,14.5785 4.8327,14.59 4.8327,14.6058C4.8327,14.6184 4.8169,14.6315 4.7978,14.6315L4.2202,14.6315C4.2005,14.6315 4.1847,14.6189 4.1847,14.6058C4.1847,14.59 4.2005,14.5785 4.2202,14.5785" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.1142,14.6969L4.2419,14.6969C4.2065,14.6969 4.1776,14.6699 4.1776,14.6339C4.1776,14.6009 4.2065,14.5709 4.2419,14.5709L5.1142,14.5709C5.1488,14.5709 5.1776,14.5999 5.1776,14.6339C5.1776,14.6699 5.1488,14.6969 5.1142,14.6969ZM4.2419,14.5969C4.2188,14.5969 4.1991,14.6109 4.1991,14.6339C4.1991,14.6549 4.2188,14.6729 4.2419,14.6729L5.1142,14.6729C5.1381,14.6729 5.157,14.6539 5.157,14.6339C5.157,14.6109 5.1381,14.5969 5.1142,14.5969L4.2419,14.5969Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.1138,14.9462l0.7925,0l0,-0.2045l-0.7925,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.1073,15.1305L4.1073,15.1305L4.1073,14.7345L5.1073,14.7345L5.1073,15.1305ZM4.1242,15.1075L5.091,15.1075L5.091,14.7615L4.1242,14.7615L4.1242,15.1075Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M4.0527,13.864C3.9742,13.9098 3.9218,13.9535 3.9295,13.978C3.9344,14.0004 3.9589,14.0156 3.9949,14.0385C4.0495,14.0767 4.0844,14.146 4.0576,14.1793C4.1035,14.1411 4.1329,14.0865 4.1329,14.026C4.1329,13.96 4.1029,13.9011 4.0527,13.864" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.1795,14.4573L4.1614,14.4413C4.1765,14.4253 4.1765,14.4023 4.1734,14.3813C4.1665,14.3193 4.1144,14.2453 4.0484,14.1983L4.0415,14.1973C3.9795,14.1523 3.9345,14.1263 3.9245,14.0823C3.8995,14.0123 4.0954,13.8943 4.1565,13.8613L4.1614,13.8553L4.1674,13.8633C4.2664,13.9333 4.3205,14.0453 4.3205,14.1683C4.3215,14.2793 4.2695,14.3853 4.1795,14.4573ZM4.1614,13.8873C4.0075,13.9753 3.9385,14.0513 3.9475,14.0753C3.9555,14.1103 3.9975,14.1393 4.0554,14.1773L4.0615,14.1813C4.1335,14.2343 4.1905,14.3133 4.1975,14.3803C4.1995,14.3883 4.1995,14.4003 4.1985,14.4063C4.2605,14.3413 4.2955,14.2563 4.2955,14.1693C4.2965,14.0563 4.2485,13.9553 4.1614,13.8873Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CCCCCC" + android:fillType="nonZero" + android:pathData="M4.2289,14.5447l0.5618,0l0,-2.7545l-0.5618,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.7622,14.5415L4.7382,14.5415L4.7382,11.7929L4.7612,11.7929L4.7612,14.5415L4.7622,14.5415ZM4.6462,14.5415L4.6222,14.5415L4.6222,11.7929L4.6462,11.7929L4.6462,14.5415Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.2218,14.5529L4.2218,14.5529L4.2218,11.7825L5.2218,11.7825L5.2218,14.5529ZM4.2455,14.5387L5.1981,14.5387L5.1981,11.7962L4.2455,11.7962L4.2455,14.5387Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M5.3651,12.8211C5.2418,12.7698 5.0345,12.7338 4.7945,12.7245C4.7116,12.7251 4.6195,12.7338 4.5251,12.7491C4.188,12.8031 3.9316,12.9395 3.9529,13.0469C3.9535,13.0513 3.954,13.0562 3.954,13.0578C3.954,13.0578 3.8285,12.7736 3.8264,12.7633C3.8035,12.6411 4.0882,12.4922 4.4624,12.43C4.5785,12.4104 4.6925,12.4027 4.7918,12.4044C5.0313,12.4044 5.2391,12.4338 5.364,12.4813L5.3651,12.8211" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M3.954,13.3948C3.9513,13.3948 3.9491,13.3916 3.9475,13.385C3.9267,13.3166 3.8215,12.9608 3.8198,12.9445C3.8144,12.9079 3.8225,12.8679 3.8416,12.8272C3.9164,12.6676 4.1651,12.5064 4.4602,12.4355C4.5638,12.4103 4.6735,12.3956 4.7755,12.3956L4.7918,12.3956C5.0215,12.3956 5.2358,12.4421 5.3667,12.5121C5.3689,12.5153 5.3705,12.5202 5.3705,12.5227L5.3727,13.0308C5.3727,13.0357 5.3705,13.0357 5.3695,13.0398C5.3673,13.0406 5.3645,13.0406 5.3629,13.0406C5.2364,12.9616 5.0236,12.9087 4.7945,12.8973C4.7089,12.8989 4.6162,12.9087 4.5262,12.9323C4.2644,12.9974 4.0429,13.1359 3.9764,13.2759C3.9611,13.3093 3.9556,13.3411 3.9595,13.3663C3.9595,13.3712 3.9605,13.3793 3.9605,13.3818C3.9611,13.3859 3.9605,13.3924 3.9573,13.3956C3.9556,13.3948 3.9545,13.3948 3.954,13.3948ZM4.7749,12.4168C4.6724,12.4168 4.5638,12.4315 4.4618,12.4567C4.1711,12.5267 3.9251,12.6807 3.8515,12.8403C3.8351,12.8753 3.8285,12.9087 3.8324,12.9404C3.8351,12.9567 3.8962,13.1693 3.9458,13.3289C3.948,13.3101 3.9545,13.289 3.9655,13.2653C4.0336,13.1188 4.2573,12.9787 4.5229,12.9119C4.6151,12.8899 4.7084,12.8785 4.7945,12.8769C5.0198,12.8883 5.2293,12.9404 5.358,13.017L5.3575,12.5284C5.2271,12.4616 5.0165,12.4168 4.7918,12.4168L4.7749,12.4168Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M4.2273,13.1675C4.0718,13.1565 3.9649,13.1129 3.9529,13.0469C3.9431,12.9945 3.9955,12.9395 4.0898,12.8882C4.1324,12.8915 4.1793,12.8975 4.2289,12.8975L4.2273,13.1675" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.4749,13.4189L4.4609,13.4189C4.1569,13.3959 3.9689,13.3149 3.9469,13.1899C3.9279,13.0899 4.0209,12.9849 4.2049,12.8789L4.2079,12.8789L4.2369,12.8789C4.3069,12.8909 4.3839,12.8999 4.4659,12.8999L4.4779,12.8999L4.4749,13.4189ZM4.2129,12.9039C4.0409,12.9999 3.9549,13.1029 3.9709,13.1849C3.9899,13.2939 4.1689,13.3709 4.4489,13.3939L4.4509,12.9249C4.3739,12.9239 4.3009,12.9169 4.2329,12.9049L4.2129,12.9039Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M4.7913,12.9564C4.8889,12.9689 4.962,12.9945 4.9991,13.0245L5.0024,13.0305C5.0187,13.0671 4.9336,13.144 4.7913,13.2247L4.7913,12.9564" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M4.7842,13.4792L4.7862,12.9482L4.7992,12.9522C4.9792,12.9792 5.1182,13.0262 5.1842,13.0792L5.1892,13.0812L5.1952,13.0972C5.2432,13.1962 4.9372,13.3902 4.8032,13.4722L4.7842,13.4792ZM4.8092,12.9792L4.8092,13.4362C5.1082,13.2602 5.1922,13.1462 5.1722,13.1042L5.1662,13.0962C5.1032,13.0492 4.9782,13.0022 4.8092,12.9792Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M3.8771,13.6976C3.8629,13.6551 4.014,13.5656 4.2295,13.4855C4.3276,13.4505 4.4089,13.4135 4.5098,13.3693C4.8076,13.2373 5.028,13.084 5.0018,13.0311L4.9985,13.0251C5.0144,13.0376 5.0389,13.3093 5.0389,13.3093C5.0656,13.3605 4.8638,13.5095 4.5889,13.6415C4.5005,13.6829 4.3151,13.7511 4.2278,13.7822C4.0707,13.8367 3.9147,13.9387 3.9289,13.9769L3.8771,13.6976" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M3.93,14.0176C3.9278,14.0176 3.9251,14.0153 3.924,14.0108C3.9229,14.0108 3.9224,14.008 3.9224,14.0063L3.8711,13.7201C3.8525,13.6654 4.0375,13.5674 4.2278,13.4947C4.3173,13.4614 4.3925,13.4271 4.4809,13.3859L4.5065,13.3752C4.7656,13.2569 4.9702,13.1217 4.9958,13.0524C4.998,13.045 4.998,13.0394 4.9958,13.0338L4.9925,13.0293C4.9915,13.0259 4.9925,13.0202 4.9947,13.0202C4.9964,13.0174 5.0007,13.0174 5.0024,13.0202C5.0045,13.0202 5.0056,13.0214 5.0067,13.027L5.0084,13.0293C5.0089,13.031 5.01,13.0338 5.0111,13.0372C5.0247,13.0912 5.0405,13.2451 5.0465,13.32C5.0504,13.3245 5.0504,13.333 5.0471,13.3454C5.0247,13.4124 4.8333,13.5488 4.5933,13.6677C4.5076,13.7094 4.3249,13.782 4.2305,13.8142C4.0784,13.8694 3.936,13.9669 3.9349,14.0057L3.936,14.0097C3.9371,14.0114 3.9344,14.0164 3.9305,14.0181C3.9316,14.0176 3.9311,14.0176 3.93,14.0176ZM5.0035,13.0687C4.9642,13.1414 4.7662,13.271 4.5131,13.3871L4.4864,13.3989C4.398,13.4383 4.3216,13.475 4.2322,13.5076C3.9927,13.5984 3.8744,13.684 3.8842,13.7184C3.8842,13.7189 3.8842,13.7201 3.8842,13.7201L3.9316,13.9798C3.9676,13.9269 4.1073,13.8446 4.2256,13.8006C4.3216,13.7685 4.5033,13.697 4.5873,13.6541C4.8213,13.5398 5.0133,13.4034 5.0345,13.338C5.0356,13.3324 5.0356,13.3262 5.034,13.3228C5.0335,13.3223 5.0329,13.3211 5.0329,13.3194C5.0247,13.2259 5.0122,13.1217 5.0035,13.0687Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M4.1938,12.8807C4.2646,12.8337 4.3111,12.7817 4.2884,12.6857C4.2748,12.6207 4.238,12.6077 4.1818,12.6437L4.0849,12.7067L4.1722,13.0887C4.1818,13.0817 4.1915,13.0697 4.2017,13.0667C4.2113,13.0607 4.2215,13.0567 4.2317,13.0467L4.1938,12.8807L4.1938,12.8807ZM4.1512,12.6947L4.175,12.6827C4.196,12.6667 4.2193,12.6847 4.2295,12.7317C4.2374,12.7627 4.2346,12.8017 4.2108,12.8307C4.204,12.8357 4.1943,12.8457 4.1864,12.8497L4.1512,12.6947M4.4216,12.5367C4.4114,12.5447 4.4007,12.5477 4.3905,12.5507C4.3808,12.5527 4.3706,12.5547 4.3593,12.5587L4.4103,12.9547L4.5668,12.9017C4.5656,12.8957 4.5628,12.8817 4.5628,12.8777C4.5605,12.8707 4.5611,12.8567 4.5605,12.8497C4.5333,12.8657 4.5033,12.8807 4.467,12.8947L4.4216,12.5367M4.7374,12.8807C4.7669,12.7367 4.8026,12.5977 4.8394,12.4567C4.8326,12.4587 4.8264,12.4587 4.8196,12.4587C4.8128,12.4587 4.8066,12.4587 4.7998,12.4587C4.7811,12.5637 4.7578,12.6647 4.7334,12.7637C4.7034,12.6697 4.6699,12.5757 4.6461,12.4807C4.6337,12.4827 4.6206,12.4827 4.6087,12.4867C4.5968,12.4887 4.5838,12.4887 4.5707,12.4887C4.6172,12.6207 4.6603,12.7507 4.7023,12.8817C4.7074,12.8817 4.7136,12.8817 4.7198,12.8797C4.7261,12.8787 4.7317,12.8787 4.7374,12.8807M5.0673,12.5737C5.0724,12.5527 5.0787,12.5347 5.0849,12.5187C5.0753,12.5027 5.0492,12.4817 5.0186,12.4767C4.9557,12.4657 4.9188,12.5167 4.9137,12.5847C4.9046,12.7297 5.0322,12.7157 5.0277,12.8097C5.0254,12.8517 4.9999,12.8707 4.9738,12.8627C4.9449,12.8567 4.9228,12.8307 4.9188,12.7867L4.9114,12.7867C4.9069,12.8097 4.9012,12.8337 4.8944,12.8567C4.9126,12.8797 4.9381,12.8957 4.9613,12.8957C5.0265,12.9077 5.0764,12.8607 5.0821,12.7867C5.09,12.6477 4.9602,12.6427 4.9659,12.5637C4.9681,12.5287 4.9823,12.5047 5.0157,12.5107C5.0396,12.5187 5.0554,12.5397 5.0617,12.5727L5.0673,12.5737" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M9.6709,11.158C9.6709,11.158 9.6458,11.1858 9.6273,11.188C9.6082,11.1924 9.5853,11.1733 9.5853,11.1733C9.5853,11.1733 9.5684,11.1896 9.5476,11.1935C9.5275,11.2011 9.4996,11.1711 9.4996,11.1711C9.4996,11.1711 9.4795,11.2011 9.4615,11.2055C9.4445,11.2142 9.4233,11.1978 9.4233,11.1978C9.4233,11.1978 9.4151,11.2115 9.4009,11.218C9.3944,11.2213 9.384,11.2169 9.384,11.2169L9.3622,11.2044L9.3393,11.1787L9.3169,11.17C9.3169,11.17 9.3071,11.1384 9.3071,11.134C9.306,11.1275 9.3044,11.1144 9.3044,11.1144C9.2995,11.0904 9.3338,11.0647 9.384,11.0533C9.4124,11.0478 9.4364,11.0478 9.4544,11.0522C9.474,11.038 9.516,11.0255 9.5667,11.0255C9.6109,11.0255 9.6496,11.0353 9.6709,11.0495C9.6916,11.0353 9.7309,11.0255 9.7756,11.0255C9.8253,11.0255 9.8667,11.0375 9.8864,11.0522C9.9049,11.0478 9.9289,11.0478 9.9573,11.0533C10.0075,11.0647 10.0418,11.0904 10.0369,11.1144C10.0369,11.1144 10.0358,11.1275 10.0342,11.134C10.0336,11.1389 10.0233,11.17 10.0233,11.17L10.0015,11.1787L9.9785,11.2044L9.9578,11.2169C9.9578,11.2169 9.9469,11.2213 9.9409,11.218C9.9273,11.2115 9.918,11.1978 9.918,11.1978C9.918,11.1978 9.8967,11.2136 9.8793,11.2055C9.8618,11.2011 9.8422,11.1711 9.8422,11.1711C9.8422,11.1711 9.8144,11.2011 9.7931,11.1935C9.7735,11.1896 9.7565,11.1733 9.7565,11.1733C9.7565,11.1733 9.7331,11.1924 9.7145,11.188C9.696,11.1858 9.6709,11.158 9.6709,11.158" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.1701,11.3946C10.1664,11.3946 10.1627,11.3926 10.1613,11.3906C10.1452,11.3786 10.1356,11.3636 10.1312,11.3556C10.1224,11.3576 10.1085,11.3736 10.0924,11.3736C10.0887,11.3736 10.0828,11.3716 10.0777,11.3676C10.0579,11.3556 10.0367,11.3266 10.0286,11.3086C10.0191,11.3226 9.9941,11.3496 9.9714,11.3496C9.9685,11.3496 9.9656,11.3496 9.9641,11.3476C9.9414,11.3376 9.9216,11.3186 9.9142,11.3086C9.904,11.3196 9.8783,11.3416 9.8571,11.3336C9.8351,11.3306 9.8094,11.2986 9.7999,11.2836C9.7882,11.2986 9.7625,11.3306 9.7405,11.3336C9.7193,11.3416 9.6936,11.3186 9.6848,11.3086C9.676,11.3186 9.6569,11.3376 9.6342,11.3476C9.6335,11.3496 9.6284,11.3496 9.6262,11.3496C9.6034,11.3496 9.5785,11.3226 9.5682,11.3086C9.5595,11.3266 9.5382,11.3556 9.5199,11.3676C9.5147,11.3716 9.5089,11.3736 9.5045,11.3736C9.4891,11.3736 9.4737,11.3576 9.4664,11.3556C9.4612,11.3636 9.4524,11.3786 9.4378,11.3906C9.4268,11.3966 9.4106,11.3866 9.4099,11.3846L9.3791,11.3576L9.3491,11.3146L9.3183,11.3026L9.3183,11.2966C9.3161,11.2866 9.3044,11.2376 9.3022,11.2286C9.3014,11.2166 9.2985,11.1916 9.2985,11.1916C9.2926,11.1446 9.3403,11.0916 9.4106,11.0736C9.4473,11.0606 9.481,11.0606 9.5074,11.0686C9.5367,11.0396 9.5932,11.0216 9.6584,11.0216C9.7141,11.0216 9.7662,11.0336 9.7984,11.0616C9.8299,11.0336 9.8813,11.0216 9.9392,11.0216C10.0015,11.0216 10.0594,11.0396 10.0887,11.0686C10.1151,11.0606 10.1488,11.0606 10.1855,11.0736C10.2551,11.0926 10.3028,11.1446 10.2976,11.1916L10.294,11.2286C10.2918,11.2386 10.2808,11.2876 10.2778,11.2966L10.2771,11.3026L10.2463,11.3146L10.2155,11.3596L10.1869,11.3826C10.1869,11.3846 10.1789,11.3946 10.1701,11.3946ZM10.1356,11.3316L10.1378,11.3366C10.1378,11.3386 10.1488,11.3596 10.1657,11.3736C10.1657,11.3736 10.1671,11.3766 10.1693,11.3766C10.1737,11.3766 10.1803,11.3736 10.1825,11.3736L10.2082,11.3506L10.2412,11.3036L10.2683,11.2876C10.272,11.2676 10.28,11.2326 10.2808,11.2246L10.2852,11.1886C10.2888,11.1506 10.2434,11.1076 10.1818,11.0916C10.1474,11.0756 10.1129,11.0756 10.0887,11.0896L10.0865,11.0916L10.0828,11.0876C10.0572,11.0526 10.0015,11.0346 9.9392,11.0346C9.8813,11.0346 9.8299,11.0526 9.8014,11.0756L9.7984,11.0796L9.7955,11.0756C9.7647,11.0526 9.7134,11.0346 9.6577,11.0346C9.5946,11.0346 9.5375,11.0526 9.5118,11.0876L9.5096,11.0916L9.5067,11.0896C9.4817,11.0756 9.448,11.0756 9.4128,11.0916C9.3527,11.1076 9.3058,11.1506 9.3102,11.1886C9.3102,11.1886 9.3139,11.2146 9.3139,11.2246C9.3153,11.2326 9.3234,11.2676 9.3278,11.2876L9.3571,11.3036L9.3872,11.3506L9.415,11.3736C9.4172,11.3736 9.4268,11.3786 9.4304,11.3736C9.448,11.3596 9.459,11.3386 9.459,11.3366L9.462,11.3316L9.4678,11.3346C9.4686,11.3346 9.4861,11.3536 9.503,11.3536C9.5067,11.3536 9.5118,11.3536 9.514,11.3506C9.5353,11.3386 9.5602,11.2896 9.5609,11.2876L9.5646,11.2826L9.5704,11.2876C9.5712,11.2876 9.6012,11.3316 9.6247,11.3316C9.6269,11.3316 9.6276,11.3316 9.6306,11.3296C9.6555,11.3226 9.6767,11.2896 9.6775,11.2896L9.6811,11.2856L9.6855,11.2876C9.6863,11.2896 9.7149,11.3266 9.7361,11.3206C9.7552,11.3106 9.7823,11.2796 9.7918,11.2636L9.794,11.2636L9.7984,11.2636L9.8014,11.2636C9.8021,11.2636 9.8329,11.3106 9.8571,11.3206C9.8798,11.3266 9.9076,11.2896 9.9076,11.2876L9.912,11.2856L9.9157,11.2896C9.9157,11.2896 9.937,11.3226 9.9619,11.3296C9.9648,11.3316 9.9648,11.3316 9.9678,11.3316C9.9905,11.3316 10.0213,11.2876 10.022,11.2876L10.0279,11.2826L10.0323,11.2876C10.0323,11.2896 10.0572,11.3386 10.0792,11.3506C10.0814,11.3536 10.085,11.3536 10.0894,11.3536C10.107,11.3536 10.1254,11.3346 10.1261,11.3346L10.1356,11.3316Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.6224,11.0118C9.6224,10.9747 9.6436,10.9447 9.6693,10.9447C9.696,10.9447 9.7167,10.9747 9.7167,11.0118C9.7167,11.0495 9.696,11.0789 9.6693,11.0789C9.6436,11.0795 9.6224,11.05 9.6224,11.0118" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.713,11.2082C9.66,11.2082 9.618,11.1452 9.618,11.0732C9.618,11.0002 9.66,10.9382 9.713,10.9382C9.766,10.9382 9.81,11.0002 9.81,11.0732C9.81,11.1462 9.766,11.2082 9.713,11.2082ZM9.713,10.9562C9.671,10.9562 9.635,11.0072 9.635,11.0732C9.635,11.1372 9.67,11.1902 9.713,11.1902C9.759,11.1902 9.794,11.1372 9.794,11.0732C9.794,11.0072 9.758,10.9562 9.713,10.9562Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.6496,11.0118C9.6496,10.9769 9.6589,10.9491 9.6709,10.9491C9.6824,10.9491 9.6927,10.9769 9.6927,11.0118C9.6927,11.0467 9.6829,11.074 9.6709,11.074C9.6589,11.0745 9.6496,11.0473 9.6496,11.0118" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.6932,11.1873C9.6602,11.1873 9.6442,11.1283 9.6442,11.0683C9.6442,11.0093 9.6612,10.9453 9.6932,10.9453C9.7242,10.9453 9.7412,11.0063 9.7412,11.0683C9.7412,11.1303 9.7252,11.1873 9.6932,11.1873ZM9.6932,10.9623C9.6792,10.9623 9.6592,10.9993 9.6592,11.0673C9.6592,11.1313 9.6792,11.1743 9.6932,11.1743C9.7062,11.1743 9.7242,11.1313 9.7242,11.0673C9.7252,10.9993 9.7072,10.9623 9.6932,10.9623Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.4255,11.29C9.4184,11.2687 9.4047,11.2535 9.4047,11.2535C9.4724,11.2327 9.5667,11.2196 9.6704,11.2196C9.774,11.2196 9.8695,11.2322 9.9376,11.2535C9.9376,11.2535 9.9289,11.266 9.9185,11.284C9.9125,11.2949 9.906,11.314 9.906,11.314C9.8449,11.2949 9.7669,11.284 9.6704,11.284C9.5738,11.284 9.4811,11.2949 9.4331,11.3162C9.4331,11.3156 9.4293,11.3031 9.4255,11.29L9.4255,11.29" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.4619,11.4048L9.4619,11.3988L9.4619,11.3988L9.4559,11.3988C9.4549,11.3948 9.4509,11.3798 9.439,11.3568L9.436,11.3438L9.437,11.3438C9.424,11.3128 9.4051,11.2888 9.4041,11.2888L9.3971,11.2808L9.4091,11.2768C9.5377,11.2368 9.7131,11.2158 9.8966,11.2158C10.082,11.2158 10.2565,11.2368 10.3851,11.2768L10.3971,11.2808L10.3572,11.3468C10.3492,11.3588 10.3363,11.3898 10.3353,11.3958L10.3283,11.3938L10.3253,11.4008C10.2146,11.3668 10.0701,11.3508 9.8966,11.3508C9.7251,11.3508 9.5566,11.3718 9.4679,11.4028L9.4669,11.4038L9.4619,11.4038L9.4619,11.4048ZM9.4599,11.3598C9.4629,11.3738 9.4669,11.3808 9.4669,11.3828C9.5606,11.3518 9.7251,11.3338 9.8956,11.3338C10.0671,11.3338 10.2097,11.3518 10.3203,11.3828C10.3243,11.3748 10.3323,11.3598 10.3433,11.3358L10.3712,11.2888C10.2445,11.2538 10.0741,11.2338 9.8956,11.2338C9.7181,11.2338 9.5506,11.2538 9.424,11.2888C9.431,11.3028 9.4459,11.3258 9.4539,11.3518L9.4599,11.3598L9.4599,11.3598Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.6704,11.3762C9.7549,11.3762 9.8482,11.3636 9.882,11.3538C9.9049,11.3462 9.9185,11.338 9.9153,11.326C9.9153,11.3195 9.9087,11.3151 9.9027,11.3124C9.8525,11.2944 9.762,11.2835 9.6709,11.2835C9.5798,11.2835 9.4893,11.2944 9.4396,11.3124C9.4325,11.3156 9.4271,11.32 9.4271,11.326C9.4238,11.3375 9.4369,11.3462 9.4598,11.3538C9.4931,11.3636 9.5858,11.3762 9.6704,11.3762" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.8783,11.4622L9.8783,11.4622C9.7233,11.4622 9.5533,11.4392 9.4893,11.4232C9.4233,11.4032 9.4193,11.3762 9.4213,11.3622C9.4243,11.3492 9.4353,11.3372 9.4483,11.3292C9.5483,11.2982 9.7153,11.2802 9.8793,11.2802C10.0433,11.2802 10.2103,11.2982 10.3073,11.3292C10.3223,11.3372 10.3333,11.3502 10.3363,11.3622C10.3393,11.3762 10.3343,11.4032 10.2693,11.4232C10.2043,11.4392 10.0323,11.4622 9.8783,11.4622ZM9.8783,11.2982C9.7173,11.2982 9.5493,11.3182 9.4543,11.3452C9.4463,11.3512 9.4383,11.3552 9.4363,11.3662C9.4353,11.3782 9.4543,11.3972 9.4953,11.4082C9.5583,11.4232 9.7263,11.4462 9.8793,11.4462C10.0313,11.4462 10.2003,11.4232 10.2633,11.4082C10.3043,11.3972 10.3223,11.3782 10.3203,11.3662C10.3183,11.3542 10.3103,11.3502 10.3013,11.3452C10.2073,11.3182 10.0403,11.2982 9.8783,11.2982Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M9.8744,11.0418C9.8744,11.0342 9.882,11.026 9.8896,11.026C9.8995,11.026 9.9055,11.0347 9.9055,11.0418C9.9055,11.0505 9.8989,11.0576 9.8896,11.0576C9.882,11.0576 9.8744,11.0505 9.8744,11.0418" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.293,11.3C10.291,11.3 10.289,11.3 10.288,11.3C10.285,11.296 10.282,11.288 10.284,11.286C10.293,11.263 10.298,11.241 10.298,11.22C10.298,11.122 10.221,11.047 10.127,11.047C10.098,11.047 10.07,11.052 10.043,11.068C10.041,11.073 10.036,11.071 10.032,11.068C10.03,11.064 10.031,11.056 10.035,11.052C10.063,11.04 10.094,11.029 10.126,11.029C10.229,11.029 10.314,11.115 10.314,11.22C10.314,11.245 10.31,11.269 10.299,11.292C10.3,11.299 10.294,11.3 10.293,11.3ZM9.98,11.167L9.965,11.16C9.975,11.141 9.981,11.123 9.981,11.107C9.981,11.039 9.909,10.982 9.821,10.982C9.784,10.982 9.749,10.994 9.721,11.009L9.714,10.997C9.743,10.976 9.782,10.966 9.821,10.966C9.919,10.966 9.997,11.029 9.997,11.107C9.996,11.123 9.99,11.146 9.98,11.167Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.9404,11.2158L9.9202,11.1973C9.9202,11.1973 9.9005,11.2087 9.876,11.2049C9.8509,11.2005 9.8438,11.1727 9.8438,11.1727C9.8438,11.1727 9.8155,11.194 9.7925,11.1918C9.7702,11.1907 9.7565,11.1727 9.7565,11.1727C9.7565,11.1727 9.7325,11.1891 9.7096,11.1875C9.6884,11.1864 9.6682,11.1585 9.6682,11.1585C9.6682,11.1585 9.6458,11.1875 9.6251,11.1875C9.6044,11.1907 9.5858,11.1695 9.5858,11.1695C9.5858,11.1695 9.5755,11.1907 9.5493,11.194C9.5215,11.2005 9.4985,11.1749 9.4985,11.1749C9.4985,11.1749 9.4827,11.2005 9.4636,11.2049C9.4445,11.2136 9.4211,11.1951 9.4211,11.1951C9.4211,11.1951 9.4167,11.2049 9.414,11.2109C9.4113,11.2164 9.4025,11.2175 9.4025,11.2175L9.4091,11.2333C9.4767,11.2131 9.5673,11.2016 9.6704,11.2016C9.7735,11.2016 9.8667,11.2131 9.9333,11.2333L9.9404,11.2158" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.3832,11.3115L10.3742,11.3115C10.2488,11.2725 10.0797,11.2505 9.8966,11.2485C9.7185,11.2505 9.5483,11.2715 9.423,11.3115L9.415,11.3115L9.3971,11.2645L9.409,11.2645C9.411,11.2645 9.421,11.2625 9.422,11.2545C9.4269,11.2465 9.4349,11.2275 9.4349,11.2275L9.4389,11.2205L9.4468,11.2255C9.4468,11.2255 9.4757,11.2445 9.5026,11.2445C9.5085,11.2445 9.5145,11.2445 9.5185,11.2415C9.5493,11.2295 9.5762,11.1885 9.5762,11.1885L9.5812,11.1785L9.5901,11.1865C9.5901,11.1865 9.6309,11.2275 9.6737,11.2235C9.7185,11.2175 9.7354,11.1785 9.7354,11.1785L9.7414,11.1705L9.7483,11.1785C9.7483,11.1785 9.7782,11.2155 9.813,11.2115C9.8488,11.2055 9.8866,11.1585 9.8866,11.1565L9.8926,11.1515L9.8976,11.1565C9.8976,11.1585 9.9334,11.2035 9.9682,11.2095C9.9712,11.2095 9.9732,11.2095 9.9732,11.2095C10.008,11.2095 10.0478,11.1785 10.0488,11.1785L10.0548,11.1765L10.0588,11.1825C10.0598,11.1825 10.0827,11.2175 10.1195,11.2175C10.1205,11.2175 10.1225,11.2175 10.1245,11.2175C10.1593,11.2175 10.206,11.1805 10.206,11.1805L10.215,11.1735L10.217,11.1865C10.217,11.1875 10.2309,11.2375 10.2687,11.2415C10.3105,11.2475 10.3453,11.2255 10.3453,11.2255L10.3503,11.2235L10.3891,11.2625L10.3971,11.2625L10.3832,11.3115ZM9.8966,11.2375C10.0757,11.2375 10.2439,11.2575 10.3712,11.2935L10.3792,11.2715L10.3503,11.2455C10.3414,11.2505 10.3185,11.2625 10.2896,11.2625C10.2837,11.2625 10.2767,11.2625 10.2697,11.2605C10.2329,11.2505 10.214,11.2225 10.207,11.2035C10.1891,11.2195 10.1543,11.2425 10.1195,11.2385C10.0856,11.2345 10.0608,11.2125 10.0508,11.2015C10.0379,11.2095 10.0021,11.2265 9.9682,11.2265C9.9354,11.2245 9.9046,11.1955 9.8926,11.1795C9.8797,11.1955 9.8468,11.2245 9.815,11.2265C9.812,11.2265 9.811,11.2265 9.809,11.2265C9.7812,11.2265 9.7553,11.2085 9.7444,11.2005C9.7344,11.2135 9.7135,11.2325 9.6767,11.2425C9.6359,11.2475 9.5991,11.2195 9.5832,11.2035C9.5722,11.2195 9.5493,11.2485 9.5225,11.2595C9.5165,11.2625 9.5085,11.2645 9.5016,11.2645C9.4787,11.2645 9.4568,11.2505 9.4449,11.2455C9.4439,11.2505 9.4389,11.2605 9.4369,11.2665C9.4319,11.2725 9.4269,11.2745 9.42,11.2785L9.4259,11.2955C9.5553,11.2575 9.7195,11.2375 9.8966,11.2375Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M9.4325,11.0418C9.4325,11.0342 9.4396,11.026 9.4484,11.026C9.4582,11.026 9.4647,11.0347 9.4647,11.0418C9.4647,11.0505 9.4582,11.0576 9.4484,11.0576C9.4396,11.0576 9.4325,11.0505 9.4325,11.0418" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.3194,11.3C9.3154,11.3 9.3134,11.298 9.3104,11.292C9.3024,11.269 9.2984,11.243 9.2984,11.22C9.2984,11.115 9.3804,11.029 9.4864,11.029C9.5154,11.029 9.5494,11.041 9.5764,11.052C9.5804,11.056 9.5814,11.064 9.5804,11.068C9.5784,11.071 9.5734,11.073 9.5684,11.068C9.5434,11.052 9.5154,11.047 9.4864,11.047C9.3914,11.047 9.3144,11.122 9.3144,11.22C9.3144,11.241 9.3184,11.263 9.3274,11.286C9.3274,11.29 9.3274,11.296 9.3224,11.3C9.3214,11.3 9.3214,11.3 9.3194,11.3ZM9.6324,11.165C9.6234,11.146 9.6144,11.125 9.6144,11.107C9.6144,11.029 9.6924,10.966 9.7904,10.966C9.8304,10.966 9.8664,10.977 9.8984,10.997L9.8894,11.009C9.8604,10.993 9.8254,10.982 9.7904,10.982C9.7024,10.982 9.6314,11.039 9.6314,11.107C9.6314,11.123 9.6374,11.138 9.6484,11.156L9.6324,11.165Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.6715,11.1264L9.6813,11.128C9.6791,11.1313 9.6785,11.1367 9.6785,11.1405C9.6785,11.1618 9.6965,11.1771 9.7167,11.1771C9.7347,11.1771 9.7489,11.1656 9.7544,11.1515C9.7549,11.152 9.7582,11.1378 9.7587,11.1389C9.7609,11.1389 9.7604,11.152 9.7609,11.152C9.7631,11.17 9.78,11.1831 9.7991,11.1831C9.8198,11.1831 9.8373,11.1662 9.8373,11.1482C9.8373,11.1455 9.8373,11.1427 9.8373,11.1405L9.8487,11.1291L9.8553,11.146C9.8531,11.1493 9.8515,11.1547 9.8515,11.1618C9.8515,11.1787 9.8684,11.1962 9.8885,11.1962C9.9011,11.1962 9.9125,11.1902 9.9191,11.1787L9.9273,11.1711L9.9273,11.1825C9.9273,11.194 9.9322,11.2038 9.9436,11.2071C9.9436,11.2071 9.9573,11.2082 9.9758,11.1935C9.9944,11.1787 10.0042,11.1667 10.0042,11.1667L10.0042,11.1825C10.0042,11.1825 9.9873,11.2125 9.9709,11.2207C9.9627,11.2251 9.9485,11.2295 9.9376,11.2295C9.9273,11.2278 9.9185,11.218 9.9147,11.2082C9.9065,11.2125 9.8973,11.2158 9.8869,11.2158C9.8656,11.2158 9.8455,11.2044 9.8378,11.1869C9.8285,11.1978 9.8144,11.2027 9.7975,11.2027C9.7805,11.2027 9.7647,11.1951 9.7549,11.1836C9.7456,11.1913 9.7315,11.1995 9.7167,11.1995C9.6976,11.1995 9.6807,11.188 9.6709,11.1738C9.6611,11.188 9.6436,11.1995 9.6245,11.1995C9.6104,11.1995 9.5967,11.1907 9.5864,11.1836C9.576,11.1951 9.5607,11.2027 9.5444,11.2027C9.5275,11.2027 9.5127,11.1973 9.5029,11.1869C9.4958,11.2038 9.4762,11.2158 9.4549,11.2158C9.4445,11.2158 9.4358,11.2125 9.4265,11.2082C9.4233,11.218 9.4145,11.2278 9.4036,11.2295C9.3927,11.2295 9.3791,11.2251 9.3709,11.2207C9.3545,11.212 9.336,11.1825 9.336,11.1825L9.3376,11.1667C9.3376,11.1667 9.348,11.1782 9.3655,11.1935C9.3845,11.2082 9.3976,11.2071 9.3976,11.2071C9.4096,11.2038 9.414,11.1945 9.414,11.1825L9.414,11.1711L9.4227,11.1787C9.4298,11.1902 9.4396,11.1962 9.4522,11.1962C9.4735,11.1962 9.4904,11.1787 9.4904,11.1618C9.4904,11.1542 9.4882,11.1493 9.486,11.146L9.4925,11.1291L9.504,11.1405C9.5035,11.1427 9.5035,11.1455 9.5035,11.1482C9.5035,11.1662 9.5215,11.1831 9.5416,11.1831C9.5607,11.1831 9.5776,11.1705 9.5798,11.152C9.5809,11.152 9.5804,11.1389 9.5825,11.1389C9.5836,11.1378 9.5864,11.152 9.5875,11.1515C9.5924,11.1656 9.6076,11.1771 9.6245,11.1771C9.6458,11.1771 9.6627,11.1618 9.6627,11.1405C9.6627,11.1362 9.6627,11.1307 9.6611,11.128L9.6715,11.1264" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.2323,11.3301C10.2283,11.3301 10.2275,11.3301 10.2243,11.3281C10.2098,11.3241 10.1962,11.3121 10.1881,11.2941C10.1777,11.2971 10.1632,11.3031 10.1504,11.3031C10.1206,11.3031 10.0917,11.2851 10.0773,11.2521C10.0604,11.2721 10.0411,11.2811 10.0186,11.2811C9.9937,11.2811 9.9704,11.2681 9.956,11.2481C9.9391,11.2661 9.9198,11.2711 9.8998,11.2711C9.8733,11.2711 9.8484,11.2551 9.8323,11.2321C9.8154,11.2551 9.7921,11.2711 9.764,11.2711C9.7455,11.2711 9.7255,11.2651 9.7094,11.2481C9.6933,11.2691 9.67,11.2811 9.646,11.2811C9.6227,11.2811 9.6042,11.2711 9.5873,11.2521C9.5721,11.2851 9.5439,11.3031 9.5142,11.3031C9.5006,11.3031 9.4869,11.2971 9.4765,11.2941C9.4668,11.3131 9.454,11.3241 9.4387,11.3281C9.4371,11.3301 9.4347,11.3301 9.4315,11.3301C9.413,11.3301 9.3937,11.3171 9.3873,11.3121C9.3624,11.2941 9.3343,11.2421 9.3327,11.2421L9.3311,11.2361L9.3383,11.1891L9.3472,11.2031C9.3472,11.2031 9.3616,11.2241 9.3873,11.2481C9.409,11.2701 9.4251,11.2711 9.4291,11.2711C9.4451,11.2681 9.4476,11.2421 9.4476,11.2341L9.4476,11.1871L9.4717,11.2241C9.4797,11.2421 9.4949,11.2491 9.5094,11.2491C9.5375,11.2491 9.5576,11.2241 9.5576,11.1941C9.5576,11.1801 9.5568,11.1751 9.5528,11.1711L9.5512,11.1651L9.5656,11.1241L9.5937,11.1551L9.5937,11.1571C9.5929,11.1611 9.5937,11.1651 9.5937,11.1691C9.5937,11.1991 9.6146,11.2261 9.6419,11.2261C9.6692,11.2261 9.6885,11.2031 9.6925,11.1771L9.6925,11.1711L9.6925,11.1711C9.6925,11.1521 9.6925,11.1461 9.7022,11.1461L9.7022,11.1461C9.707,11.1461 9.7102,11.1511 9.7126,11.1641L9.7166,11.1721C9.7215,11.1981 9.7407,11.2171 9.764,11.2171C9.7921,11.2171 9.8146,11.1881 9.8146,11.1561C9.8146,11.1481 9.8138,11.1401 9.8114,11.1331L9.8074,11.1251L9.8331,11.1231L9.8556,11.1251L9.8524,11.1331C9.8516,11.1421 9.8508,11.1491 9.8508,11.1561C9.8508,11.1871 9.8725,11.2171 9.8998,11.2171C9.9239,11.2171 9.9423,11.1981 9.948,11.1721L9.952,11.1641L9.952,11.1641C9.9544,11.1511 9.956,11.1461 9.9616,11.1461C9.9704,11.1461 9.9704,11.1541 9.9704,11.1711L9.9704,11.1741L9.9704,11.1771C9.9745,11.2021 9.9945,11.2261 10.0219,11.2261C10.0492,11.2261 10.0709,11.2001 10.0709,11.1691C10.0709,11.1651 10.0709,11.1611 10.07,11.1571L10.0692,11.1551L10.0974,11.1241L10.1118,11.1651L10.1118,11.1711C10.107,11.1761 10.107,11.1811 10.107,11.1941C10.107,11.2231 10.1271,11.2491 10.1544,11.2491C10.1696,11.2491 10.1849,11.2411 10.1929,11.2241L10.217,11.1871L10.2162,11.2341C10.2162,11.2421 10.2186,11.2651 10.2363,11.2711C10.2387,11.2711 10.2564,11.2701 10.2765,11.2481C10.3038,11.2251 10.3182,11.2031 10.3182,11.2031L10.3287,11.1851L10.3311,11.2381L10.3295,11.2401C10.3295,11.2421 10.303,11.2951 10.2781,11.3121C10.27,11.3171 10.2508,11.3301 10.2323,11.3301ZM10.1945,11.2701L10.1962,11.2771C10.1994,11.2891 10.209,11.3101 10.2259,11.3121C10.2275,11.3121 10.2291,11.3121 10.2315,11.3121C10.2419,11.3121 10.2556,11.3081 10.27,11.2961C10.2885,11.2841 10.3102,11.2411 10.3158,11.2301L10.3158,11.2261C10.3078,11.2361 10.299,11.2471 10.2837,11.2631C10.2596,11.2881 10.2395,11.2881 10.2331,11.2881L10.2331,11.2881C10.2146,11.2841 10.2026,11.2651 10.2018,11.2351C10.1897,11.2531 10.1713,11.2641 10.152,11.2641C10.119,11.2641 10.0909,11.2331 10.0909,11.1941C10.0909,11.1781 10.0917,11.1711 10.0949,11.1651L10.0909,11.1501L10.0813,11.1611C10.0813,11.1631 10.0813,11.1651 10.0813,11.1691C10.0813,11.2061 10.0532,11.2411 10.0194,11.2411C9.9873,11.2411 9.9632,11.2181 9.9568,11.1821C9.9472,11.2111 9.9247,11.2271 9.8974,11.2271C9.8644,11.2271 9.8355,11.1941 9.8355,11.1551C9.8355,11.1471 9.8363,11.1451 9.8363,11.1351L9.8315,11.1341L9.8235,11.1361C9.8243,11.1461 9.8251,11.1481 9.8251,11.1561C9.8251,11.1951 9.7962,11.2281 9.7624,11.2281C9.7359,11.2281 9.7134,11.2121 9.7038,11.1831C9.6974,11.2181 9.6725,11.2421 9.6411,11.2421C9.6074,11.2421 9.5785,11.2071 9.5785,11.1701C9.5785,11.1661 9.5785,11.1641 9.5785,11.1621L9.5688,11.1511L9.5648,11.1661C9.5688,11.1721 9.5688,11.1801 9.5688,11.1951C9.5688,11.2341 9.5423,11.2651 9.5078,11.2651C9.4893,11.2651 9.47,11.2531 9.4596,11.2361C9.4588,11.2651 9.446,11.2851 9.4275,11.2891L9.4275,11.2891C9.4219,11.2891 9.4018,11.2891 9.3761,11.2641C9.3616,11.2481 9.352,11.2351 9.3431,11.2271L9.3423,11.2311C9.3488,11.2431 9.3713,11.2861 9.3905,11.2971C9.4074,11.3111 9.4227,11.3161 9.4355,11.3131C9.4524,11.3111 9.4604,11.2901 9.4644,11.2781L9.4668,11.2711L9.4741,11.2741C9.4845,11.2841 9.4982,11.2901 9.5118,11.2901C9.5399,11.2901 9.5672,11.2671 9.5777,11.2391L9.5817,11.2271L9.5873,11.2361C9.6018,11.2531 9.6211,11.2661 9.6435,11.2661C9.6652,11.2661 9.6869,11.2501 9.6998,11.2291L9.7046,11.2251L9.7094,11.2271C9.7239,11.2461 9.7423,11.2521 9.7608,11.2521C9.7865,11.2521 9.8098,11.2421 9.8235,11.2171L9.8291,11.2031L9.8347,11.2171C9.8484,11.2421 9.8725,11.2521 9.8966,11.2521C9.915,11.2521 9.9343,11.2451 9.9488,11.2271L9.9528,11.2251L9.9576,11.2291C9.9713,11.2501 9.9929,11.2661 10.0154,11.2661C10.0371,11.2661 10.0564,11.2521 10.0709,11.2361L10.0773,11.2271L10.0805,11.2391C10.0917,11.2661 10.1174,11.2901 10.1472,11.2901C10.16,11.2901 10.1745,11.2841 10.1841,11.2741L10.1945,11.2701Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.6704,11.2196C9.5667,11.2196 9.4729,11.2322 9.4053,11.2535C9.4009,11.2551 9.3949,11.2518 9.3944,11.2475C9.3922,11.2431 9.3955,11.2387 9.4009,11.2365C9.468,11.2158 9.5635,11.2022 9.6709,11.2022C9.7784,11.2022 9.8744,11.2158 9.9415,11.2365C9.9469,11.2387 9.9502,11.2431 9.9475,11.2475C9.9475,11.2518 9.9409,11.2551 9.9365,11.2535C9.8689,11.2327 9.774,11.2196 9.6704,11.2196" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.3632,11.3064C10.3622,11.3064 10.3603,11.3044 10.3564,11.3044C10.2335,11.2714 10.0679,11.2494 9.8889,11.2494C9.7098,11.2494 9.5462,11.2704 9.4213,11.3044C9.4097,11.3104 9.3942,11.3024 9.3904,11.2924C9.3875,11.2784 9.3923,11.2634 9.4058,11.2574C9.5346,11.2204 9.7049,11.1984 9.8889,11.1984C10.0718,11.1984 10.248,11.2214 10.3728,11.2574C10.3787,11.2594 10.3835,11.2674 10.3854,11.2734C10.3903,11.2794 10.3903,11.2834 10.3883,11.2934C10.3845,11.3014 10.3728,11.3064 10.3632,11.3064ZM9.8879,11.2314C10.067,11.2314 10.2373,11.2524 10.3622,11.2924L10.3632,11.2924C10.367,11.2924 10.3738,11.2884 10.3738,11.2824C10.3738,11.2804 10.3738,11.2804 10.3728,11.2804C10.3719,11.2784 10.368,11.2754 10.368,11.2754C10.2431,11.2334 10.0689,11.2124 9.8889,11.2104C9.7059,11.2124 9.5356,11.2334 9.4097,11.2754C9.4078,11.2774 9.4039,11.2804 9.4039,11.2824C9.4049,11.2884 9.4097,11.2924 9.4146,11.2924C9.5404,11.2524 9.7088,11.2314 9.8879,11.2314Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M9.5695,11.2562C9.5695,11.2518 9.576,11.2436 9.5847,11.2436C9.5924,11.2436 9.5989,11.2524 9.5989,11.2562C9.5989,11.2665 9.5918,11.2709 9.5847,11.2709C9.576,11.2709 9.5695,11.266 9.5695,11.2562" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M9.672,11.2644L9.6382,11.2644C9.6316,11.2644 9.6273,11.2578 9.6273,11.2529C9.6273,11.2469 9.6316,11.2415 9.6382,11.2415L9.7064,11.2415C9.7124,11.2415 9.7173,11.2469 9.7173,11.2529C9.7173,11.2578 9.7124,11.2644 9.7064,11.2644L9.672,11.2644" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.7754,11.2933L9.6514,11.2933C9.6354,11.2933 9.6224,11.2813 9.6224,11.2653C9.6224,11.2463 9.6364,11.2393 9.6514,11.2393L9.7764,11.2393C9.7914,11.2393 9.8044,11.2473 9.8044,11.2653C9.8044,11.2813 9.7904,11.2933 9.7754,11.2933ZM9.6504,11.2523C9.6424,11.2523 9.6374,11.2603 9.6374,11.2653C9.6374,11.2703 9.6434,11.2763 9.6514,11.2763L9.7764,11.2763C9.7834,11.2763 9.7894,11.2703 9.7894,11.2653C9.7894,11.2603 9.7844,11.2523 9.7764,11.2523L9.6504,11.2523Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#058E6E" + android:fillType="nonZero" + android:pathData="M9.5035,11.2775L9.4805,11.2791C9.474,11.2802 9.468,11.2775 9.468,11.2687C9.4664,11.2644 9.4707,11.2578 9.4773,11.2573L9.5002,11.2551L9.5258,11.2518C9.5324,11.2518 9.5378,11.2535 9.5384,11.2595C9.5384,11.2649 9.5356,11.2693 9.5291,11.2709L9.5035,11.2775" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.4903,11.3143C9.4783,11.3143 9.4663,11.3043 9.4623,11.2893C9.4603,11.2863 9.4633,11.2813 9.4663,11.2713C9.4713,11.2653 9.4783,11.2623 9.4863,11.2603L9.5763,11.2453C9.5773,11.2453 9.5773,11.2453 9.5793,11.2453C9.5953,11.2453 9.6073,11.2573 9.6083,11.2683C9.6103,11.2803 9.6073,11.2853 9.6043,11.2883C9.6003,11.2963 9.5923,11.3043 9.5843,11.3043L9.4953,11.3123C9.4953,11.3123 9.4933,11.3143 9.4903,11.3143ZM9.5793,11.2633L9.4903,11.2793C9.4853,11.2813 9.4843,11.2813 9.4813,11.2813C9.4793,11.2843 9.4793,11.2873 9.4793,11.2893C9.4803,11.2953 9.4873,11.3033 9.4943,11.3013L9.5843,11.2873C9.5853,11.2863 9.5893,11.2843 9.5893,11.2813C9.5923,11.2813 9.5933,11.2773 9.5933,11.2733C9.5913,11.2653 9.5863,11.2633 9.5793,11.2633Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M9.4069,11.2927l0.0104,-0.0164l0.0229,0.0038l-0.0136,0.0185l-0.0196,-0.006" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M9.7418,11.2562C9.7418,11.2518 9.7489,11.2436 9.7565,11.2436C9.7653,11.2436 9.7713,11.2524 9.7713,11.2562C9.7713,11.2665 9.7647,11.2709 9.7565,11.2709C9.7489,11.2709 9.7418,11.266 9.7418,11.2562" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#058E6E" + android:fillType="nonZero" + android:pathData="M9.8384,11.2775L9.8613,11.2791C9.8673,11.2802 9.8733,11.2775 9.8738,11.2687C9.8749,11.2644 9.8705,11.2578 9.8645,11.2573L9.8411,11.2551L9.8155,11.2518C9.8089,11.2518 9.804,11.2535 9.8029,11.2595C9.8029,11.2649 9.8062,11.2693 9.8122,11.2709L9.8384,11.2775" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.917,11.3146C9.915,11.3146 9.913,11.3126 9.912,11.3126L9.824,11.3046C9.816,11.3046 9.808,11.2966 9.804,11.2886C9.8,11.2836 9.798,11.2786 9.8,11.2686C9.8,11.2566 9.816,11.2416 9.831,11.2456L9.922,11.2606C9.929,11.2626 9.935,11.2656 9.941,11.2716C9.945,11.2816 9.947,11.2866 9.946,11.2896C9.942,11.3046 9.93,11.3146 9.917,11.3146ZM9.83,11.2636C9.822,11.2636 9.817,11.2656 9.815,11.2736C9.815,11.2776 9.815,11.2816 9.818,11.2816C9.818,11.2846 9.823,11.2866 9.825,11.2876L9.917,11.3016C9.923,11.3016 9.929,11.2956 9.929,11.2896C9.929,11.2876 9.929,11.2846 9.927,11.2816C9.924,11.2816 9.924,11.2816 9.918,11.2796L9.83,11.2636L9.83,11.2636Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M9.9322,11.2933l-0.0076,-0.0169l-0.024,0.0011l0.0115,0.0191l0.0202,-0.0033" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M9.6704,11.3571C9.5858,11.3565 9.5095,11.3484 9.4516,11.3325C9.5095,11.3189 9.5858,11.3091 9.6704,11.3091C9.7549,11.3091 9.8318,11.3189 9.8891,11.3325C9.8318,11.3489 9.7549,11.3565 9.6704,11.3571" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.8554,11.4063L9.8554,11.4063C9.6954,11.4063 9.5574,11.3943 9.4544,11.3673C9.4484,11.3653 9.4484,11.3613 9.4484,11.3553C9.4484,11.3533 9.4484,11.3503 9.4544,11.3503C9.5654,11.3243 9.7054,11.3063 9.8554,11.3053C10.0054,11.3053 10.1464,11.3243 10.2564,11.3503C10.2624,11.3503 10.2634,11.3533 10.2634,11.3553C10.2634,11.3613 10.2634,11.3653 10.2564,11.3673C10.1544,11.3943 10.0154,11.4063 9.8554,11.4063ZM9.4894,11.3553C9.5884,11.3783 9.7134,11.3923 9.8554,11.3943C9.9974,11.3923 10.1224,11.3783 10.2214,11.3553C10.1164,11.3323 9.9874,11.3243 9.8554,11.3243C9.7244,11.3243 9.5954,11.3323 9.4894,11.3553Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.936,11.1749C9.9376,11.1662 9.936,11.1624 9.9311,11.1602C9.9267,11.158 9.9213,11.1624 9.9185,11.1678C9.9169,11.1755 9.9185,11.1804 9.9235,11.1836C9.9278,11.1847 9.9338,11.1793 9.936,11.1749" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.768,11.1411C9.7691,11.1367 9.7653,11.1285 9.7615,11.1285C9.7555,11.1285 9.7511,11.1335 9.7505,11.14C9.7489,11.1476 9.7522,11.1525 9.7587,11.1525C9.762,11.1536 9.768,11.1493 9.768,11.1411" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.5733,11.1411C9.5733,11.1367 9.576,11.1285 9.5809,11.1285C9.5858,11.1285 9.5907,11.1335 9.5918,11.14C9.5924,11.1476 9.5891,11.1525 9.5842,11.1525C9.5798,11.1536 9.5744,11.1493 9.5733,11.1411" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.4064,11.1749C9.4036,11.1662 9.4064,11.1624 9.4102,11.1602C9.4156,11.158 9.4211,11.1624 9.4227,11.1678C9.4255,11.1755 9.4227,11.1804 9.4189,11.1836C9.4135,11.1847 9.408,11.1793 9.4064,11.1749" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.6704,11.0462l-0.0305,0.0169l0.0229,0.048l0.0076,0.0044l0.0082,-0.0044l0.0229,-0.048l-0.0311,-0.0169" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.7004,11.1915L9.6794,11.1765L9.6344,11.0775L9.6994,11.0385L9.7644,11.0775L9.7204,11.1765L9.7004,11.1915ZM9.6914,11.1655L9.7004,11.1715L9.7084,11.1655L9.7454,11.0855L9.7014,11.0605L9.6574,11.0855L9.6914,11.1655Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.6049,11.1155l0.0131,0.0213l0.0469,-0.0125l0.0038,-0.0087l-0.0038,-0.0044l-0.0469,-0.0147l-0.0131,0.0191" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.6315,11.1838l-0.032,-0.047l0.032,-0.047l0.094,0.027l0.013,0.02l-0.014,0.021z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.7358,11.1155l-0.0131,0.0213l-0.0469,-0.0125l-0.0044,-0.0087l0.0044,-0.0044l0.0469,-0.0147l0.0131,0.0191" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.7715,11.1838L9.6785,11.1578L9.6655,11.1368L9.6785,11.1168L9.7715,11.0898L9.8045,11.1368L9.7715,11.1838ZM9.6895,11.1408L9.7665,11.1658L9.7845,11.1368L9.7655,11.1118L9.6885,11.1338L9.6845,11.1368L9.6895,11.1408Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.4773,11.0642l-0.0229,0.024l0.0289,0.0387l0.0082,0.0022l0.0055,-0.0055l0.0109,-0.0469l-0.0305,-0.0125" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.5304,11.2008l-0.023,-0.012l-0.059,-0.077l0.052,-0.052l0.066,0.026l-0.02,0.097z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.4293,11.1455l0.0164,0.0169l0.0425,-0.024l0.0033,-0.0082l-0.0055,-0.0049l-0.0485,-0.0027l-0.0082,0.0229" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.4642,11.2095l-0.042,-0.037l0.021,-0.057l0.097,0.012l0.018,0.012l-0.009,0.023z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.5564,11.1187l-0.0087,0.0224l-0.048,-0.0044l-0.0065,-0.0065l0.0033,-0.0065l0.0415,-0.0224l0.0185,0.0175" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.6035,11.1884l-0.099,-0.01l-0.018,-0.016l0.011,-0.021l0.084,-0.045l0.041,0.039z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.3813,11.1509l-0.0033,0.024l-0.0485,0.0044l-0.0076,-0.0044l0.0022,-0.0087l0.036,-0.03l0.0213,0.0147" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.3375,11.2277l-0.02,-0.011l0.005,-0.023l0.072,-0.063l0.05,0.035l-0.01,0.053z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.4745,11.1302C9.4745,11.1236 9.4827,11.1155 9.4925,11.1155C9.5018,11.1155 9.5095,11.1242 9.5095,11.1302C9.5095,11.14 9.5018,11.1482 9.4925,11.1482C9.4827,11.1482 9.4745,11.14 9.4745,11.1302" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.8635,11.0642l0.0235,0.024l-0.03,0.0387l-0.0076,0.0022l-0.0055,-0.0055l-0.0115,-0.0469l0.0311,-0.0125" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.8641,11.2008l-0.015,-0.018l-0.02,-0.097l0.066,-0.026l0.051,0.052l-0.059,0.077z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.9131,11.1455l-0.0175,0.0169l-0.042,-0.024l-0.0033,-0.0082l0.006,-0.0049l0.0485,-0.0027l0.0082,0.0229" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.9379,11.2095l-0.083,-0.047l-0.01,-0.023l0.018,-0.012l0.098,-0.012l0.019,0.057z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.7855,11.1187l0.0087,0.0224l0.0485,-0.0044l0.006,-0.0065l-0.0033,-0.0065l-0.0425,-0.0224l-0.0175,0.0175" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.8005,11.1884l-0.02,-0.053l0.042,-0.039l0.084,0.045l0.01,0.021l-0.018,0.016z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.9535,11.1509l0.0033,0.024l0.048,0.0044l0.0082,-0.0044l-0.0022,-0.0087l-0.036,-0.03l-0.0213,0.0147" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.0555,11.2282l-0.098,-0.01l-0.01,-0.053l0.05,-0.035l0.072,0.063l0.005,0.023z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.6529,11.1155C9.6529,11.1067 9.6611,11.1002 9.6704,11.1002C9.6796,11.1002 9.6878,11.1073 9.6878,11.1155C9.6878,11.1236 9.6796,11.1324 9.6704,11.1324C9.6611,11.1324 9.6529,11.1242 9.6529,11.1155" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.8318,11.1302C9.8318,11.1236 9.8405,11.1155 9.8498,11.1155C9.8591,11.1155 9.8673,11.1242 9.8673,11.1302C9.8673,11.14 9.8591,11.1482 9.8498,11.1482C9.8405,11.1482 9.8318,11.14 9.8318,11.1302" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.6387,10.9349C9.6387,10.9196 9.6524,10.9055 9.6704,10.9055C9.6878,10.9055 9.7025,10.9191 9.7025,10.9349C9.7025,10.9491 9.6878,10.9633 9.6704,10.9633C9.6529,10.9633 9.6387,10.9491 9.6387,10.9349" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.6933,10.9235l0,0.0213l-0.0496,0l0,-0.0213l0.0158,0l0,-0.0447l-0.0207,0l0,-0.0202l0.0207,0l0,-0.0202l0.0224,0l0,0.0202l0.0202,0l0,0.0202l-0.0202,0l0,0.0447l0.0115,0" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.7513,11.0459L9.6433,11.0459L9.6433,10.9909L9.6723,10.9909L9.6723,10.9259L9.6333,10.9259L9.6333,10.8719L9.6723,10.8719L9.6723,10.8329L9.7303,10.8329L9.7303,10.8719L9.7693,10.8719L9.7693,10.9259L9.7303,10.9259L9.7303,10.9909L9.7513,10.9909L9.7513,11.0459ZM9.6633,11.0249L9.7333,11.0249L9.7333,11.0089L9.7103,11.0089L9.7103,10.9059L9.7513,10.9059L9.7513,10.8879L9.7103,10.8879L9.7103,10.8509L9.6923,10.8509L9.6923,10.8879L9.6523,10.8879L9.6523,10.9059L9.6933,10.9059L9.6933,11.0099L9.6643,11.0099L9.6643,11.0249L9.6633,11.0249Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.7156,10.9235l0,0.0213l-0.0884,0l0,-0.0213l0.0322,0l0,-0.0447l-0.0207,0l0,-0.0202l0.0207,0l0,-0.0202l0.0224,0l0,0.0202l0.0202,0l0,0.0202l-0.0202,0l0,0.0447l0.0338,0" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.6704,10.9704C9.6496,10.9704 9.6333,10.9535 9.6333,10.9349C9.6333,10.9196 9.6453,10.9065 9.6611,10.8995L9.6627,10.9104C9.6513,10.9115 9.6431,10.9229 9.6431,10.9355C9.6431,10.9485 9.6556,10.9611 9.6704,10.9611C9.6851,10.9611 9.6971,10.9491 9.6971,10.9355C9.6971,10.9235 9.69,10.9115 9.678,10.9104L9.6813,10.9005C9.696,10.9071 9.7069,10.9196 9.7069,10.9349C9.7075,10.9535 9.6911,10.9704 9.6704,10.9704Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.3169,11.1782C9.3164,11.1782 9.3033,11.1624 9.294,11.1525C9.2869,11.1471 9.27,11.1411 9.27,11.1411C9.27,11.1384 9.2798,11.1313 9.2907,11.1313C9.2967,11.1313 9.3022,11.1345 9.3055,11.1384L9.3076,11.1313C9.3076,11.1313 9.3158,11.1335 9.3196,11.1411C9.324,11.1525 9.3202,11.1667 9.3202,11.1667C9.3202,11.1667 9.3191,11.1749 9.3169,11.1782" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.3592,11.2269C9.3542,11.2269 9.3542,11.2249 9.3432,11.2149C9.3372,11.2069 9.3222,11.1919 9.3112,11.1779C9.3012,11.1729 9.2782,11.1659 9.2712,11.1619L9.2662,11.1579L9.2662,11.1519C9.2662,11.1419 9.2892,11.1269 9.3102,11.1269C9.3182,11.1269 9.3252,11.1289 9.3322,11.1289L9.3342,11.1269L9.3412,11.1269C9.3412,11.1269 9.3622,11.1289 9.3712,11.1519C9.3772,11.1729 9.3732,11.1989 9.3732,11.1989C9.3722,11.2029 9.3712,11.2179 9.3642,11.2219L9.3592,11.2259L9.3592,11.2259L9.3592,11.2269Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.3175,11.1689C9.3202,11.1656 9.3295,11.1667 9.3355,11.1722C9.3415,11.1771 9.3431,11.1847 9.3393,11.188C9.3355,11.1924 9.3267,11.1924 9.3202,11.188C9.3142,11.1804 9.3131,11.1749 9.3175,11.1689" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M10.0184,11.1782C10.0195,11.1782 10.0315,11.1624 10.0413,11.1525C10.0478,11.1471 10.0653,11.1411 10.0653,11.1411C10.0653,11.1384 10.0555,11.1313 10.044,11.1313C10.038,11.1313 10.0325,11.1345 10.0293,11.1384L10.0271,11.1313C10.0271,11.1313 10.0189,11.1335 10.0151,11.1411C10.0107,11.1525 10.0145,11.1667 10.0145,11.1667C10.0145,11.1667 10.0151,11.1749 10.0184,11.1782" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.0266,11.2265L10.0266,11.2265L10.0246,11.2265L10.0206,11.2225C10.0126,11.2175 10.0116,11.2025 10.0106,11.2015C10.0096,11.2005 10.0056,11.1745 10.0126,11.1525C10.0216,11.1295 10.0426,11.1275 10.0426,11.1275L10.0496,11.1275L10.0516,11.1315C10.0596,11.1295 10.0656,11.1275 10.0736,11.1275C10.0946,11.1275 10.1176,11.1435 10.1176,11.1525L10.1176,11.1585L10.1116,11.1625C10.1056,11.1665 10.0816,11.1735 10.0726,11.1785C10.0626,11.1925 10.0476,11.2055 10.0416,11.2155C10.0316,11.2245 10.0306,11.2265 10.0266,11.2265Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M10.0189,11.1689C10.0145,11.1656 10.0069,11.1667 10.0004,11.1722C9.9949,11.1771 9.9916,11.1847 9.996,11.188C10.0004,11.1924 10.008,11.1924 10.014,11.188C10.0205,11.1804 10.0233,11.1749 10.0189,11.1689" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.2853,11.5715l0.7707,0l0,-0.2018l-0.7707,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.2787,11.7555L9.2787,11.7555L9.2787,11.3625L10.2787,11.3625L10.2787,11.7555ZM9.2954,11.7295L10.2613,11.7295L10.2613,11.3875L9.2954,11.3875L9.2954,11.7295Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.9758,11.7045C9.9709,11.7035 9.9671,11.7035 9.9616,11.7035L9.384,11.7035C9.3775,11.7035 9.3725,11.7035 9.3682,11.7056C9.3873,11.6991 9.402,11.6822 9.402,11.6609C9.402,11.6396 9.3867,11.6227 9.366,11.614C9.3709,11.6151 9.3775,11.6173 9.384,11.6173L9.9616,11.6173C9.9671,11.6173 9.9725,11.6162 9.978,11.614L9.9747,11.6151C9.9529,11.6227 9.942,11.6396 9.942,11.6609C9.942,11.6789 9.9551,11.6991 9.9758,11.7045" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.3742,11.8014C9.369,11.8014 9.3638,11.7984 9.3638,11.7924C9.3612,11.7824 9.3638,11.7794 9.3681,11.7744L9.3725,11.7744C9.3986,11.7604 9.4169,11.7354 9.4169,11.7044C9.4169,11.6734 9.3969,11.6414 9.3681,11.6344C9.362,11.6304 9.3577,11.6184 9.3603,11.6164C9.3638,11.6104 9.3681,11.6064 9.3742,11.6104C9.3829,11.6104 9.3916,11.6104 9.3995,11.6104L10.3219,11.6104C10.3263,11.6104 10.3315,11.6104 10.3359,11.6104L10.3454,11.6104C10.3524,11.6104 10.3568,11.6104 10.3594,11.6184C10.3603,11.6244 10.3568,11.6344 10.3507,11.6344C10.3489,11.6344 10.3454,11.6344 10.342,11.6344C10.3176,11.6444 10.3028,11.6734 10.3028,11.7044C10.3028,11.7334 10.3202,11.7594 10.3446,11.7744C10.3454,11.7744 10.3472,11.7744 10.3507,11.7744C10.3559,11.7774 10.3576,11.7824 10.3559,11.7914C10.3542,11.7984 10.3481,11.8014 10.342,11.7984C10.3402,11.7984 10.3402,11.7984 10.3367,11.7984C10.3333,11.7984 10.3298,11.7984 10.3228,11.7984L9.4004,11.7984C9.3934,11.7984 9.3855,11.7984 9.3803,11.7984L9.3786,11.7984C9.3751,11.8014 9.3742,11.8014 9.3742,11.8014ZM9.4152,11.7724L10.3028,11.7724C10.2871,11.7514 10.2784,11.7274 10.2784,11.7044C10.2784,11.6814 10.2871,11.6574 10.3019,11.6374L9.4152,11.6374C9.43,11.6584 9.4396,11.6814 9.4396,11.7044C9.4396,11.7274 9.43,11.7514 9.4152,11.7724Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.3845,11.7035L9.9622,11.7035C9.9818,11.7035 9.9971,11.716 9.9971,11.7291C9.9971,11.746 9.9813,11.758 9.9622,11.758L9.3845,11.758C9.3655,11.758 9.3496,11.7465 9.3496,11.7291C9.3496,11.716 9.3649,11.7035 9.3845,11.7035" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.2785,11.82L9.4055,11.82C9.37,11.82 9.342,11.794 9.342,11.755C9.342,11.724 9.37,11.698 9.4055,11.698L10.2785,11.698C10.314,11.698 10.342,11.723 10.342,11.755C10.342,11.794 10.314,11.82 10.2785,11.82ZM9.4063,11.724C9.3824,11.724 9.3634,11.738 9.3634,11.755C9.3634,11.778 9.3824,11.794 9.4063,11.794L10.2793,11.794C10.3016,11.794 10.3222,11.778 10.3222,11.755C10.3222,11.737 10.3024,11.724 10.2793,11.724L9.4063,11.724Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.3845,11.5715L9.9622,11.5715C9.9818,11.5715 9.9971,11.5829 9.9971,11.5949C9.9971,11.6075 9.9813,11.6173 9.9622,11.6173L9.3845,11.6173C9.3644,11.6173 9.3491,11.6075 9.3491,11.5949C9.3485,11.5829 9.3644,11.5715 9.3845,11.5715" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.278,11.6757L9.4057,11.6757C9.3686,11.6757 9.3415,11.6527 9.3415,11.6217C9.3415,11.5887 9.3686,11.5627 9.4057,11.5627L10.278,11.5627C10.3134,11.5627 10.3415,11.5877 10.3415,11.6217C10.3415,11.6517 10.3134,11.6757 10.278,11.6757ZM9.4065,11.5887C9.3802,11.5887 9.3637,11.6077 9.3637,11.6217C9.3637,11.6337 9.3802,11.6487 9.4065,11.6487L10.2789,11.6487C10.3011,11.6487 10.3217,11.6327 10.3217,11.6217C10.3217,11.6067 10.3044,11.5887 10.2789,11.5887L9.4065,11.5887Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#005BBF" + android:fillType="nonZero" + android:pathData="M9.1325,14.9718C9.1865,14.9718 9.2345,14.9615 9.2695,14.9429C9.3038,14.9249 9.3507,14.9129 9.4031,14.9129C9.4549,14.9129 9.5035,14.9244 9.5384,14.9429C9.5738,14.9615 9.6213,14.9718 9.6736,14.9718C9.7271,14.9718 9.7751,14.9593 9.81,14.9407C9.8449,14.9249 9.8896,14.9129 9.9409,14.9129C9.9933,14.9129 10.0402,14.9238 10.0751,14.9418C10.1095,14.9604 10.158,14.9718 10.2115,14.9718L10.2115,15.0558C10.158,15.0558 10.1095,15.0444 10.0751,15.0253C10.0402,15.0078 9.9933,14.9969 9.9409,14.9969C9.8896,14.9969 9.8449,15.0084 9.81,15.0253C9.7745,15.0427 9.7271,15.0558 9.6736,15.0558C9.6213,15.0558 9.5738,15.0444 9.5384,15.0258C9.5035,15.01 9.4555,14.9969 9.4031,14.9969C9.3507,14.9969 9.3044,15.0095 9.2695,15.0258C9.2345,15.0449 9.1865,15.0558 9.1336,15.0558L9.1325,14.9718" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.218,15.1925L10.2109,15.1925C10.1596,15.1925 10.1084,15.1715 10.0718,15.1345C10.0364,15.1015 9.9916,15.0815 9.9404,15.0815C9.8929,15.0815 9.8482,15.1015 9.8127,15.1325C9.7745,15.1715 9.7238,15.1925 9.6731,15.1925C9.6207,15.1925 9.5733,15.1715 9.5351,15.1365C9.4996,15.1035 9.4522,15.0815 9.4031,15.0815C9.3535,15.0815 9.3082,15.1025 9.2722,15.1365C9.2345,15.1715 9.1865,15.1925 9.1342,15.1925L9.1271,15.1925L9.126,15.0115L9.1325,15.0115C9.1833,15.0115 9.2313,14.9955 9.2667,14.9605C9.3033,14.9275 9.3524,14.9075 9.4031,14.9075C9.4544,14.9075 9.5045,14.9285 9.5416,14.9605C9.5765,14.9955 9.624,15.0115 9.6736,15.0115C9.7238,15.0115 9.7702,14.9935 9.8067,14.9595C9.8433,14.9255 9.8907,14.9075 9.9409,14.9075C9.9944,14.9075 10.0413,14.9255 10.0778,14.9605C10.1133,14.9935 10.1618,15.0115 10.2115,15.0115L10.2185,15.0115L10.2185,15.1925L10.218,15.1925ZM9.4025,15.0565C9.4544,15.0565 9.5035,15.0795 9.5411,15.1155C9.576,15.1485 9.624,15.1665 9.6731,15.1665C9.7227,15.1665 9.7691,15.1485 9.8062,15.1115C9.8427,15.0785 9.8902,15.0565 9.9404,15.0565C9.9933,15.0565 10.0402,15.0775 10.0773,15.1135C10.1116,15.1455 10.1575,15.1665 10.2038,15.1665L10.2038,15.0375C10.1547,15.0355 10.1062,15.0175 10.0713,14.9815C10.0358,14.9515 9.9911,14.9315 9.9398,14.9315C9.8924,14.9315 9.8476,14.9515 9.8122,14.9815C9.774,15.0185 9.7238,15.0375 9.6725,15.0375C9.6202,15.0375 9.5711,15.0195 9.5345,14.9845C9.4991,14.9535 9.4516,14.9315 9.4025,14.9315C9.3529,14.9315 9.3076,14.9515 9.2716,14.9835C9.2367,15.0175 9.1893,15.0355 9.1391,15.0375L9.1402,15.1665C9.1871,15.1665 9.2313,15.1475 9.2662,15.1155C9.3027,15.0805 9.3518,15.0565 9.4025,15.0565Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CCCCCC" + android:fillType="nonZero" + android:pathData="M9.1325,15.0564C9.1865,15.0564 9.2345,15.0455 9.2695,15.0264C9.3038,15.0105 9.3507,14.9975 9.4031,14.9975C9.4549,14.9975 9.5035,15.01 9.5384,15.0264C9.5738,15.0444 9.6213,15.0564 9.6736,15.0564C9.7271,15.0564 9.7751,15.0438 9.81,15.0258C9.8449,15.0095 9.8896,14.9975 9.9409,14.9975C9.9933,14.9975 10.0402,15.0084 10.0751,15.0258C10.1095,15.0444 10.158,15.0564 10.2115,15.0564L10.2115,15.1398C10.158,15.1398 10.1095,15.1284 10.0751,15.1093C10.0402,15.0913 9.9933,15.0793 9.9409,15.0793C9.8896,15.0793 9.8449,15.0907 9.81,15.1082C9.7745,15.1267 9.7271,15.1398 9.6736,15.1398C9.6213,15.1398 9.5738,15.1284 9.5384,15.1104C9.5035,15.0913 9.4555,15.0793 9.4031,15.0793C9.3507,15.0793 9.3044,15.0907 9.2695,15.1104C9.2345,15.1284 9.1865,15.1398 9.1336,15.1398L9.1325,15.0564" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.218,15.2767L10.2109,15.2767C10.1591,15.2767 10.1084,15.2567 10.0718,15.2207C10.0364,15.1887 9.9916,15.1687 9.9404,15.1687C9.8929,15.1687 9.8482,15.1887 9.8127,15.2187C9.7745,15.2567 9.7244,15.2767 9.6731,15.2767C9.6207,15.2767 9.5733,15.2587 9.5351,15.2217C9.4996,15.1927 9.4522,15.1687 9.4031,15.1687C9.3535,15.1687 9.3082,15.1897 9.2722,15.2217C9.2345,15.2607 9.1865,15.2767 9.1342,15.2767L9.1271,15.2767L9.126,15.0987L9.1325,15.0987C9.1833,15.0987 9.2313,15.0807 9.2667,15.0477C9.3033,15.0127 9.3524,14.9887 9.4031,14.9887C9.4549,14.9887 9.5051,15.0117 9.5416,15.0477C9.5765,15.0807 9.6245,15.0987 9.6736,15.0987C9.7227,15.0987 9.7696,15.0807 9.8067,15.0437C9.8433,15.0107 9.8907,14.9887 9.9409,14.9887C9.9938,14.9887 10.0407,15.0097 10.0778,15.0457C10.1133,15.0807 10.1618,15.0987 10.2115,15.0987L10.2185,15.0987L10.2185,15.2767L10.218,15.2767ZM9.4025,15.1457C9.4544,15.1457 9.5035,15.1667 9.5411,15.2007C9.576,15.2357 9.624,15.2517 9.6731,15.2517C9.7227,15.2517 9.7696,15.2337 9.8062,15.1987C9.8427,15.1657 9.8902,15.1457 9.9404,15.1457C9.9938,15.1457 10.0407,15.1657 10.0778,15.1987C10.1105,15.2317 10.1575,15.2497 10.2038,15.2517L10.2038,15.1257C10.1547,15.1227 10.1062,15.1047 10.0713,15.0677C10.0358,15.0347 9.9911,15.0147 9.9398,15.0147C9.8924,15.0147 9.8476,15.0347 9.8122,15.0657C9.774,15.1047 9.7233,15.1257 9.6725,15.1257C9.6202,15.1257 9.5716,15.1047 9.5345,15.0697C9.4991,15.0367 9.4516,15.0147 9.4025,15.0147C9.3529,15.0147 9.3076,15.0357 9.2716,15.0697C9.2362,15.1037 9.1893,15.1227 9.1391,15.1257L9.1402,15.2517C9.1871,15.2497 9.2313,15.2337 9.2662,15.2007C9.3027,15.1667 9.3518,15.1457 9.4025,15.1457Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#005BBF" + android:fillType="nonZero" + android:pathData="M9.1325,15.1398C9.1865,15.1398 9.2345,15.1284 9.2695,15.1104C9.3038,15.0913 9.3507,15.0793 9.4031,15.0793C9.4549,15.0793 9.5035,15.0907 9.5384,15.1104C9.5738,15.1284 9.6213,15.1398 9.6736,15.1398C9.7271,15.1398 9.7751,15.1273 9.81,15.1082C9.8449,15.0913 9.8896,15.0793 9.9409,15.0793C9.9933,15.0793 10.0402,15.0907 10.0751,15.1093C10.1095,15.1278 10.158,15.1398 10.2115,15.1398L10.2115,15.2222C10.158,15.2222 10.1095,15.2107 10.0751,15.1922C10.0402,15.1753 9.9933,15.1633 9.9409,15.1633C9.8896,15.1633 9.8449,15.1758 9.81,15.1916C9.7745,15.2102 9.7271,15.2222 9.6736,15.2222C9.6213,15.2222 9.5738,15.2113 9.5384,15.1933C9.5035,15.1764 9.4555,15.1633 9.4031,15.1633C9.3507,15.1633 9.3044,15.1758 9.2695,15.1933C9.2345,15.2124 9.1865,15.2222 9.1336,15.2222L9.1325,15.1398" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.218,15.3588L10.2109,15.3588C10.1591,15.3588 10.1084,15.3378 10.0718,15.3028C10.0364,15.2698 9.9916,15.2498 9.9404,15.2498C9.8929,15.2498 9.8482,15.2698 9.8127,15.3008C9.7745,15.3378 9.7249,15.3588 9.6731,15.3588C9.6207,15.3588 9.5722,15.3398 9.5351,15.3048C9.4996,15.2698 9.4522,15.2498 9.4031,15.2498C9.3529,15.2498 9.3082,15.2698 9.2722,15.3048C9.2345,15.3398 9.1865,15.3588 9.1342,15.3588L9.1271,15.3588L9.126,15.1798L9.1325,15.1798C9.1833,15.1798 9.2313,15.1638 9.2667,15.1288C9.3033,15.0958 9.3524,15.0738 9.4031,15.0738C9.4549,15.0738 9.5045,15.0948 9.5416,15.1288C9.5765,15.1638 9.6245,15.1798 9.6736,15.1798C9.7233,15.1798 9.7696,15.1618 9.8067,15.1268C9.8433,15.0938 9.8907,15.0738 9.9409,15.0738C9.9944,15.0738 10.0413,15.0938 10.0784,15.1268C10.1133,15.1618 10.1613,15.1798 10.2115,15.1798L10.2185,15.1798L10.2185,15.3588L10.218,15.3588ZM9.4025,15.2248C9.4544,15.2248 9.5035,15.2458 9.5411,15.2838C9.576,15.3148 9.624,15.3358 9.6731,15.3358C9.7233,15.3358 9.7696,15.3148 9.8062,15.2798C9.8433,15.2468 9.8907,15.2248 9.9404,15.2248C9.9933,15.2248 10.0402,15.2458 10.0773,15.2818C10.1111,15.3138 10.1575,15.3328 10.2038,15.3328L10.2038,15.2058C10.1547,15.2038 10.1062,15.1848 10.0713,15.1498C10.0358,15.1178 9.9911,15.0978 9.9398,15.0978C9.8924,15.0978 9.8476,15.1178 9.8122,15.1478C9.774,15.1858 9.7233,15.2058 9.6725,15.2058C9.6202,15.2058 9.5716,15.1878 9.5345,15.1508C9.4991,15.1218 9.4516,15.0978 9.4025,15.0978C9.3529,15.0978 9.3076,15.1188 9.2716,15.1508C9.2362,15.1858 9.1893,15.2038 9.1391,15.2058L9.1402,15.3328C9.1887,15.3328 9.2307,15.3148 9.2662,15.2838C9.3022,15.2468 9.3513,15.2248 9.4025,15.2248Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CCCCCC" + android:fillType="nonZero" + android:pathData="M9.1336,15.3062C9.186,15.3062 9.2345,15.2947 9.2695,15.2778C9.3038,15.2576 9.3507,15.2467 9.4031,15.2467C9.4549,15.2467 9.5035,15.2576 9.5384,15.2778C9.5738,15.2947 9.6213,15.3062 9.6736,15.3062C9.7271,15.3062 9.7751,15.2947 9.81,15.2756C9.8449,15.2576 9.8896,15.2467 9.9409,15.2467C9.9933,15.2467 10.0402,15.2576 10.0751,15.2767C10.1095,15.2947 10.158,15.3062 10.2115,15.3062L10.2115,15.2238C10.158,15.2238 10.1095,15.2113 10.0751,15.1927C10.0402,15.1758 9.9933,15.1638 9.9409,15.1638C9.8896,15.1638 9.8449,15.1764 9.81,15.1922C9.7745,15.2107 9.7271,15.2227 9.6736,15.2227C9.6213,15.2227 9.5738,15.2118 9.5384,15.1938C9.5035,15.1769 9.4555,15.1638 9.4031,15.1638C9.3507,15.1638 9.3044,15.1764 9.2695,15.1938C9.2345,15.2129 9.1865,15.2227 9.1325,15.2227L9.1336,15.3062" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.218,15.4436L10.2109,15.4436C10.1591,15.4436 10.1078,15.4236 10.0718,15.3866C10.0364,15.3556 9.9916,15.3366 9.9404,15.3366C9.8929,15.3366 9.8482,15.3556 9.8127,15.3856C9.7745,15.4236 9.7244,15.4436 9.6731,15.4436C9.6207,15.4436 9.5722,15.4256 9.5351,15.3886C9.4996,15.3576 9.4522,15.3366 9.4031,15.3366C9.3535,15.3366 9.3082,15.3576 9.2722,15.3866C9.2345,15.4256 9.1865,15.4436 9.1342,15.4436L9.1271,15.4436L9.126,15.2666L9.1325,15.2666C9.1833,15.2666 9.2313,15.2456 9.2667,15.2146C9.3027,15.1776 9.3518,15.1556 9.4031,15.1556C9.4549,15.1556 9.504,15.1766 9.5416,15.2146C9.5765,15.2456 9.6245,15.2666 9.6736,15.2666C9.7238,15.2666 9.7702,15.2456 9.8067,15.2106C9.8438,15.1776 9.8913,15.1556 9.9409,15.1556C9.9938,15.1556 10.0407,15.1766 10.0778,15.2126C10.1133,15.2456 10.1624,15.2666 10.2115,15.2666L10.2185,15.2666L10.2185,15.4436L10.218,15.4436ZM9.4025,15.3106C9.4544,15.3106 9.5045,15.3336 9.5411,15.3656C9.576,15.4006 9.624,15.4186 9.6731,15.4186C9.7227,15.4186 9.7691,15.4006 9.8062,15.3636C9.8427,15.3326 9.8907,15.3106 9.9404,15.3106C9.9933,15.3106 10.0402,15.3316 10.0773,15.3656C10.1105,15.3986 10.1569,15.4166 10.2038,15.4186L10.2038,15.2926C10.1547,15.2906 10.1062,15.2706 10.0713,15.2346C10.0358,15.2016 9.9911,15.1816 9.9398,15.1816C9.8924,15.1816 9.8476,15.2016 9.8122,15.2326C9.774,15.2696 9.7244,15.2906 9.6725,15.2906C9.6202,15.2906 9.5716,15.2716 9.5345,15.2366C9.4991,15.2016 9.4516,15.1816 9.4025,15.1816C9.3524,15.1816 9.3076,15.2016 9.2716,15.2366C9.2373,15.2696 9.1893,15.2876 9.1391,15.2906L9.1402,15.4186C9.1871,15.4166 9.2313,15.3986 9.2662,15.3656C9.3027,15.3346 9.3518,15.3106 9.4025,15.3106Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#005BBF" + android:fillType="nonZero" + android:pathData="M9.1336,15.3896C9.186,15.3896 9.2345,15.3787 9.2695,15.3596C9.3038,15.3427 9.3507,15.3296 9.4031,15.3296C9.4549,15.3296 9.5035,15.3422 9.5384,15.3596C9.5738,15.3787 9.6213,15.3896 9.6736,15.3896C9.7271,15.3896 9.7751,15.3771 9.81,15.3585C9.8449,15.3427 9.8896,15.3296 9.9409,15.3296C9.9933,15.3296 10.0402,15.3422 10.0751,15.3596C10.1095,15.3776 10.158,15.3896 10.2115,15.3896L10.2115,15.3078C10.158,15.3078 10.1095,15.2953 10.0751,15.2767C10.0402,15.2576 9.9933,15.2467 9.9409,15.2467C9.8896,15.2467 9.8449,15.2576 9.81,15.2756C9.7745,15.2942 9.7271,15.3062 9.6736,15.3062C9.6213,15.3062 9.5738,15.2947 9.5384,15.2778C9.5035,15.2576 9.4555,15.2467 9.4031,15.2467C9.3507,15.2467 9.3044,15.2576 9.2695,15.2778C9.2345,15.2947 9.1865,15.3062 9.1331,15.3062L9.1336,15.3896" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.218,15.5282L10.2109,15.5282C10.1596,15.5282 10.1084,15.5072 10.0718,15.4712C10.0364,15.4362 9.9916,15.4182 9.9404,15.4182C9.8929,15.4182 9.8482,15.4362 9.8127,15.4692C9.774,15.5062 9.7238,15.5282 9.6731,15.5282C9.6207,15.5282 9.5722,15.5072 9.5351,15.4732C9.4996,15.4362 9.4522,15.4182 9.4031,15.4182C9.3535,15.4182 9.3082,15.4362 9.2733,15.4732C9.2351,15.5062 9.1865,15.5282 9.1342,15.5282L9.1271,15.5282L9.126,15.3482L9.1331,15.3482C9.1838,15.3482 9.2313,15.3322 9.2667,15.2952C9.3027,15.2642 9.3518,15.2402 9.4031,15.2402C9.4549,15.2402 9.5045,15.2632 9.5416,15.2952C9.5765,15.3302 9.6245,15.3482 9.6736,15.3482C9.7233,15.3482 9.7696,15.3302 9.8067,15.2932C9.8433,15.2622 9.8907,15.2402 9.9409,15.2402C9.9938,15.2402 10.0407,15.2612 10.0778,15.2952C10.1133,15.3322 10.1624,15.3502 10.2115,15.3502L10.2185,15.3502L10.2185,15.5282L10.218,15.5282ZM9.4025,15.3932C9.4538,15.3932 9.504,15.4132 9.5411,15.4522C9.576,15.4832 9.624,15.5022 9.6731,15.5022C9.7222,15.5022 9.7685,15.4832 9.8062,15.4482C9.8427,15.4132 9.8907,15.3932 9.9404,15.3932C9.9933,15.3932 10.0402,15.4132 10.0773,15.4502C10.1111,15.4812 10.1575,15.4992 10.2038,15.5022L10.2038,15.3762C10.1547,15.3742 10.1067,15.3532 10.0713,15.3172C10.0358,15.2862 9.9911,15.2672 9.9398,15.2672C9.8924,15.2672 9.8476,15.2862 9.8122,15.3162C9.774,15.3542 9.7238,15.3742 9.6725,15.3742C9.6202,15.3742 9.5716,15.3562 9.5345,15.3192C9.4996,15.2882 9.4516,15.2672 9.4025,15.2672C9.3524,15.2672 9.3076,15.2882 9.2716,15.3172C9.2362,15.3542 9.1893,15.3722 9.1396,15.3742L9.1402,15.5022C9.1865,15.4992 9.2307,15.4812 9.2656,15.4522C9.3027,15.4122 9.3518,15.3932 9.4025,15.3932Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.9758,14.6298C9.9736,14.6385 9.9715,14.6435 9.9715,14.6522C9.9715,14.7035 10.0145,14.7416 10.068,14.7416L9.2755,14.7416C9.3278,14.7416 9.3715,14.7035 9.3715,14.6522C9.3715,14.6435 9.3709,14.6385 9.3687,14.6298C9.3731,14.6309 9.378,14.6309 9.3845,14.6309L9.9616,14.6309C9.966,14.6309 9.972,14.6309 9.9758,14.6298" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.2602,14.8537L9.2772,14.8537C9.2717,14.8537 9.2684,14.8477 9.2684,14.8397C9.2684,14.8357 9.2717,14.8257 9.2772,14.8257C9.3374,14.8257 9.3881,14.7577 9.3881,14.6757C9.3881,14.6597 9.3868,14.6527 9.3847,14.6367C9.3847,14.6347 9.3847,14.6287 9.3881,14.6287C9.3888,14.6247 9.3922,14.6227 9.3962,14.6247C9.4003,14.6287 9.4064,14.6287 9.4118,14.6287L10.1276,14.6287C10.133,14.6287 10.1385,14.6287 10.1418,14.6247C10.1452,14.6227 10.1493,14.6247 10.152,14.6287C10.1533,14.6287 10.1533,14.6347 10.1533,14.6367L10.152,14.6487C10.1493,14.6577 10.1493,14.6647 10.1493,14.6757C10.1493,14.7577 10.1987,14.8257 10.2602,14.8257C10.2643,14.8257 10.2684,14.8357 10.2684,14.8397C10.2684,14.8477 10.265,14.8537 10.2602,14.8537ZM9.3408,14.8267L10.1953,14.8267C10.1574,14.7997 10.1317,14.7427 10.1317,14.6767C10.1317,14.6667 10.133,14.6587 10.133,14.6537C10.131,14.6537 10.1297,14.6537 10.1276,14.6537L9.4118,14.6537C9.4084,14.6537 9.4057,14.6537 9.4037,14.6537C9.4037,14.6597 9.4037,14.6677 9.4037,14.6767C9.4044,14.7427 9.3807,14.7987 9.3408,14.8267Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.3845,14.5785L9.9622,14.5785C9.9818,14.5785 9.9971,14.59 9.9971,14.6058C9.9971,14.6184 9.9813,14.6315 9.9622,14.6315L9.3845,14.6315C9.3655,14.6315 9.3496,14.6189 9.3496,14.6058C9.3496,14.59 9.3649,14.5785 9.3845,14.5785" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.2785,14.6969L9.4055,14.6969C9.37,14.6969 9.342,14.6699 9.342,14.6339C9.342,14.6009 9.37,14.5709 9.4055,14.5709L10.2785,14.5709C10.314,14.5709 10.342,14.5999 10.342,14.6339C10.342,14.6699 10.314,14.6969 10.2785,14.6969ZM9.4063,14.5969C9.3824,14.5969 9.3634,14.6109 9.3634,14.6339C9.3634,14.6549 9.3824,14.6729 9.4063,14.6729L10.2793,14.6729C10.3016,14.6729 10.3222,14.6539 10.3222,14.6339C10.3222,14.6109 10.3024,14.5969 10.2793,14.5969L9.4063,14.5969Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.2755,14.9462l0.792,0l0,-0.2045l-0.792,0l0,0.2045z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.2689,15.1305L9.2689,15.1305L9.2689,14.7345L10.2689,14.7345L10.2689,15.1305ZM9.2852,15.1075L10.252,15.1075L10.252,14.7615L9.2852,14.7615L9.2852,15.1075Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M10.1291,13.864C10.2076,13.9098 10.26,13.9535 10.2524,13.978C10.2475,14.0004 10.2229,14.0156 10.1869,14.0385C10.1318,14.0767 10.0969,14.146 10.1236,14.1793C10.0778,14.1411 10.0489,14.0865 10.0489,14.026C10.0489,13.96 10.0795,13.9011 10.1291,13.864" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.1834,14.4573C10.0934,14.3853 10.0424,14.2793 10.0424,14.1683C10.0424,14.0453 10.0954,13.9343 10.1944,13.8633L10.2004,13.8553L10.2054,13.8613C10.2834,13.9063 10.4634,14.0133 10.4364,14.0823C10.4274,14.1263 10.3824,14.1523 10.3204,14.1973L10.3124,14.1993C10.2464,14.2463 10.1934,14.3203 10.1874,14.3823C10.1834,14.4033 10.1844,14.4263 10.1994,14.4423L10.1834,14.4573ZM10.2014,13.8873C10.1154,13.9553 10.0664,14.0563 10.0664,14.1683C10.0664,14.2553 10.1014,14.3403 10.1634,14.4053C10.1624,14.3983 10.1634,14.3863 10.1644,14.3793C10.1714,14.3123 10.2284,14.2333 10.3004,14.1803L10.3074,14.1763C10.3654,14.1393 10.4074,14.1103 10.4144,14.0793C10.4244,14.0513 10.3554,13.9753 10.2014,13.8873Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CCCCCC" + android:fillType="nonZero" + android:pathData="M9.3911,14.5447l0.5624,0l0,-2.7545l-0.5624,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.9336,14.5371L9.9076,14.5371L9.9076,11.7885L9.9336,11.7885L9.9336,14.5371ZM9.8166,14.5371L9.7936,14.5371L9.7936,11.7885L9.8166,11.7885L9.8166,14.5371Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.3845,14.5529L9.3845,14.5529L9.3845,11.7825L10.3845,11.7825L10.3845,14.5529ZM9.4082,14.5387L10.3609,14.5387L10.3609,11.7962L9.4082,11.7962L9.4082,14.5387Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M8.8173,12.8211C8.9405,12.7698 9.1478,12.7338 9.3878,12.7245C9.4707,12.7251 9.5629,12.7338 9.6573,12.7491C9.9944,12.8031 10.2507,12.9395 10.2295,13.0469C10.2289,13.0513 10.2284,13.0562 10.2284,13.0578C10.2284,13.0578 10.3538,12.7736 10.356,12.7633C10.3789,12.6411 10.0942,12.4922 9.7205,12.43C9.6044,12.4104 9.4904,12.4027 9.3911,12.4044C9.1516,12.4044 8.9433,12.4338 8.8195,12.4813L8.8173,12.8211" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.2278,13.3951C10.2273,13.3951 10.2256,13.3951 10.2251,13.3935C10.2218,13.3918 10.2202,13.3853 10.2218,13.3812C10.2218,13.3788 10.2218,13.3755 10.2218,13.3707L10.2224,13.3658C10.2262,13.3405 10.2207,13.3088 10.206,13.2754C10.1389,13.1353 9.9185,12.9969 9.6562,12.9317C9.5656,12.9081 9.4735,12.8983 9.3878,12.8967C9.1593,12.9081 8.9465,12.9611 8.8195,13.04C8.8178,13.04 8.8151,13.04 8.8129,13.0392C8.8113,13.0352 8.8096,13.0352 8.8096,13.0303L8.8124,12.5221C8.8124,12.5197 8.8135,12.5148 8.8156,12.5115C8.9465,12.4415 9.1609,12.3951 9.3905,12.3951L9.4069,12.3951C9.5095,12.3951 9.6185,12.4097 9.7222,12.435C10.0173,12.5067 10.2665,12.6671 10.3402,12.8267C10.3593,12.8674 10.3669,12.9073 10.3625,12.944C10.3609,12.9611 10.2551,13.3161 10.2349,13.3845C10.2327,13.3918 10.2305,13.3951 10.2278,13.3951ZM9.3878,12.8764C9.474,12.878 9.5667,12.8894 9.6595,12.9114C9.9251,12.9782 10.1487,13.1182 10.2164,13.2648C10.2273,13.2884 10.2338,13.3096 10.236,13.3283C10.2856,13.1695 10.3467,12.9578 10.3495,12.9399C10.3527,12.9081 10.3467,12.8747 10.3304,12.8397C10.2573,12.6809 10.0107,12.5262 9.72,12.4562C9.6175,12.4309 9.5089,12.4163 9.4069,12.4163L9.3905,12.4163C9.1653,12.4163 8.9553,12.4611 8.8249,12.5278L8.8238,13.0164C8.9531,12.9407 9.1625,12.8878 9.3878,12.8764Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M9.9551,13.1675C10.1105,13.1565 10.2175,13.1129 10.2295,13.0469C10.2393,12.9945 10.1869,12.9395 10.0925,12.8882C10.05,12.8915 10.0031,12.8975 9.9535,12.8975L9.9551,13.1675" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.9489,13.4185L9.9469,12.9005L9.9589,12.9005C10.0409,12.9005 10.1179,12.8935 10.1879,12.8795L10.2169,12.8795L10.2199,12.8795C10.4039,12.9845 10.4959,13.0905 10.4769,13.1905C10.4549,13.3155 10.2679,13.3955 9.9629,13.4195L9.9489,13.4195L9.9489,13.4185ZM9.9719,12.9245L9.9749,13.3935C10.2549,13.3705 10.4339,13.2935 10.4529,13.1845C10.4699,13.1025 10.3839,12.9985 10.2119,12.9035L10.1909,12.9055C10.1229,12.9165 10.0479,12.9235 9.9719,12.9245Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M9.3905,12.9564C9.2929,12.9689 9.2198,12.9945 9.1833,13.0245L9.18,13.0305C9.1631,13.0671 9.2487,13.144 9.3911,13.2247L9.3911,12.9564" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.5871,13.4796L9.5681,13.4716C9.4331,13.3896 9.1281,13.1956 9.1751,13.0966L9.1861,13.0786C9.2551,13.0256 9.3871,12.9786 9.5711,12.9516L9.5841,12.9476L9.5871,13.4796ZM9.2061,13.0966L9.2001,13.1046C9.1801,13.1466 9.2651,13.2606 9.5631,13.4366L9.5631,12.9796C9.3941,13.0026 9.2691,13.0476 9.2061,13.0966Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M10.3047,13.6976C10.3184,13.6551 10.1678,13.5656 9.9524,13.4855C9.8547,13.4505 9.7729,13.4135 9.672,13.3693C9.3742,13.2373 9.1533,13.084 9.18,13.0311L9.1833,13.0251C9.1669,13.0376 9.1429,13.3093 9.1429,13.3093C9.1162,13.3605 9.3175,13.5095 9.5924,13.6415C9.6802,13.6829 9.8662,13.7511 9.9535,13.7822C10.1105,13.8367 10.2665,13.9387 10.2524,13.9769L10.3047,13.6976" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M10.2524,14.0176C10.2513,14.0176 10.2507,14.0176 10.2507,14.0176C10.2475,14.0159 10.2442,14.0108 10.2453,14.0091L10.2464,14.0052C10.2458,13.9669 10.1035,13.8688 9.9507,13.8136C9.8825,13.7894 9.684,13.7156 9.588,13.6671C9.348,13.5482 9.1565,13.4119 9.1347,13.3448C9.1315,13.333 9.132,13.324 9.1353,13.3195C9.1418,13.2445 9.1571,13.0907 9.1702,13.0366C9.1707,13.0332 9.1724,13.0304 9.1729,13.0287L9.174,13.0265C9.1756,13.022 9.1762,13.0197 9.1784,13.0197C9.18,13.0169 9.1838,13.0169 9.186,13.0197C9.1882,13.0197 9.1893,13.0253 9.1882,13.0287L9.1849,13.0332C9.1827,13.0389 9.1827,13.0451 9.1849,13.0529C9.2105,13.1211 9.4151,13.2564 9.6742,13.3747L9.6998,13.3854C9.7882,13.4265 9.8635,13.4615 9.9529,13.4941C10.1438,13.5668 10.3282,13.6654 10.3102,13.7206L10.3102,13.7206L10.2589,14.0058C10.2589,14.0074 10.2589,14.0103 10.2573,14.0103C10.2573,14.0153 10.2545,14.0176 10.2524,14.0176ZM9.1789,13.0687C9.1702,13.1217 9.1576,13.2248 9.1495,13.3195C9.1495,13.3212 9.1489,13.3223 9.1484,13.3228C9.1473,13.3262 9.1473,13.333 9.1484,13.3381C9.1696,13.4029 9.3611,13.5392 9.5951,13.6542C9.6785,13.697 9.8607,13.7685 9.9567,13.8007C10.0745,13.8446 10.2142,13.9274 10.2507,13.9798L10.2982,13.719C10.308,13.6835 10.1896,13.5984 9.9502,13.5077C9.8607,13.4744 9.7838,13.4384 9.6955,13.3989L9.6687,13.3871C9.4156,13.271 9.2182,13.1414 9.1789,13.0687Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M9.1669,12.8976C9.1898,12.7516 9.216,12.6106 9.2438,12.4616C9.2373,12.4676 9.2313,12.4696 9.2247,12.4696C9.2187,12.4696 9.2122,12.4726 9.2056,12.4726C9.1931,12.5756 9.1767,12.6806 9.1576,12.7826C9.1238,12.6926 9.0873,12.6066 9.0584,12.5146C9.0475,12.5166 9.036,12.5226 9.0235,12.5246C9.0125,12.5266 9.0005,12.5286 8.988,12.5326C9.0387,12.6576 9.0873,12.7796 9.1331,12.9076C9.1385,12.9036 9.1445,12.8996 9.1511,12.8996C9.156,12.8976 9.1615,12.8996 9.1669,12.8976M9.3813,12.4686C9.3715,12.4686 9.3611,12.4706 9.3502,12.4706C9.3398,12.4706 9.33,12.4666 9.3202,12.4646L9.3164,12.8686L9.4713,12.8746C9.4713,12.8686 9.4696,12.8566 9.4702,12.8506C9.4702,12.8436 9.4713,12.8296 9.4713,12.8256C9.444,12.8286 9.414,12.8306 9.3785,12.8306L9.3813,12.4686M9.6245,12.5326C9.6496,12.5386 9.6736,12.5456 9.6976,12.5506C9.6976,12.5436 9.6971,12.5366 9.6976,12.5256C9.6976,12.5176 9.6987,12.5096 9.7009,12.5026L9.4898,12.4716C9.4898,12.4796 9.4909,12.4876 9.4904,12.4946C9.4898,12.5026 9.4893,12.5146 9.4871,12.5206C9.5095,12.5176 9.5345,12.5176 9.5635,12.5236L9.5455,12.8916C9.5564,12.8916 9.5667,12.8916 9.576,12.8916C9.5858,12.8916 9.5962,12.8966 9.6065,12.8976L9.6245,12.5326M9.7102,12.9346C9.7205,12.9386 9.7315,12.9386 9.7418,12.9436C9.7522,12.9466 9.7615,12.9506 9.7713,12.9586L9.7958,12.7726L9.798,12.7746C9.8035,12.7976 9.8122,12.8296 9.8155,12.8446L9.8465,12.9886C9.858,12.9916 9.87,12.9936 9.882,12.9976C9.8945,13.0056 9.9065,13.0096 9.9175,13.0176L9.9071,12.9726C9.8907,12.9116 9.8722,12.8456 9.858,12.7836C9.8967,12.7836 9.9262,12.7606 9.9338,12.7056C9.9387,12.6646 9.9305,12.6356 9.9104,12.6076C9.8951,12.5876 9.8656,12.5746 9.8471,12.5696L9.7636,12.5356L9.7102,12.9346M9.8187,12.5876C9.8444,12.5976 9.8744,12.6086 9.8744,12.6576C9.8744,12.6676 9.8738,12.6806 9.8727,12.6866C9.864,12.7496 9.84,12.7676 9.7991,12.7456L9.8187,12.5876M10.1105,13.0556C10.1095,13.1006 10.1045,13.1416 10.1002,13.1886C10.1105,13.1966 10.1215,13.2046 10.1324,13.2176C10.1422,13.2256 10.1515,13.2386 10.1613,13.2486L10.182,12.7896C10.1771,12.7836 10.1727,12.7816 10.1678,12.7786C10.164,12.7736 10.1591,12.7696 10.1553,12.7596L9.9344,13.0176C9.9409,13.0256 9.9469,13.0316 9.9524,13.0366C9.9578,13.0396 9.9638,13.0476 9.9687,13.0556C9.9867,13.0266 10.0064,13.0026 10.0287,12.9696L10.1105,13.0556L10.1105,13.0556ZM10.0489,12.9486L10.1225,12.8646L10.1127,13.0146L10.0489,12.9486" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.36,10.6589C6.283,10.6589 6.222,10.5999 6.222,10.5259C6.222,10.4519 6.283,10.3949 6.36,10.3949C6.437,10.3949 6.499,10.4519 6.499,10.5259C6.499,10.5999 6.438,10.6589 6.36,10.6589ZM6.36,10.3989C6.286,10.3989 6.224,10.4549 6.224,10.5269C6.224,10.5989 6.286,10.6569 6.36,10.6569C6.435,10.6569 6.497,10.5989 6.497,10.5269C6.497,10.4549 6.436,10.3989 6.36,10.3989Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M7.0691,9.8538C7.2987,9.8538 7.5033,9.8882 7.6364,9.9389C7.7133,9.9744 7.8153,10 7.9271,10.0158C8.0138,10.0273 8.0935,10.0284 8.1644,10.0245C8.2598,10.0235 8.3956,10.0502 8.532,10.1096C8.6455,10.1587 8.7393,10.2204 8.8025,10.2804L8.748,10.3284L8.7327,10.4636L8.5833,10.636L8.5091,10.6987L8.3335,10.8395L8.244,10.8471L8.2156,10.924L7.0773,10.792L5.9345,10.924L5.9073,10.8471L5.8178,10.8395L5.6416,10.6987L5.5669,10.636L5.4191,10.4636L5.4027,10.3284L5.3482,10.2804C5.4115,10.2209 5.5053,10.1587 5.6182,10.1096C5.754,10.0502 5.8915,10.0235 5.9853,10.0245C6.0562,10.0289 6.1375,10.0273 6.2225,10.0158C6.3349,10.0005 6.4375,9.9749 6.5133,9.9389C6.6453,9.8882 6.8395,9.8538 7.0691,9.8538Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.2178,10.93L8.2145,10.9289L7.0767,10.7958L5.9313,10.93L5.904,10.8509L5.8145,10.8422L5.8145,10.8422L5.6384,10.7015L5.5631,10.6376L5.4131,10.4664L5.4131,10.4642L5.3984,10.3311L5.3416,10.2798L5.3449,10.2765C5.4115,10.216 5.508,10.1533 5.6171,10.1053C5.7393,10.0513 5.874,10.018 5.9771,10.018C5.9798,10.018 5.9831,10.0191 5.9858,10.0191C6.0589,10.0245 6.1407,10.0235 6.2225,10.0115C6.3387,9.9956 6.4385,9.97 6.5127,9.9362C6.654,9.88 6.8525,9.8495 7.0707,9.8495C7.2927,9.8495 7.5,9.8816 7.6402,9.9362C7.7144,9.97 7.8131,9.9951 7.9293,10.0115C8.0116,10.0229 8.0935,10.024 8.1649,10.0191C8.1682,10.0191 8.1715,10.018 8.1747,10.018C8.2773,10.018 8.412,10.0518 8.5358,10.1053C8.6444,10.1538 8.7404,10.216 8.8069,10.2765L8.8107,10.2798L8.7535,10.3311L8.7382,10.4664L8.5887,10.6376L8.5145,10.7015L8.3367,10.8422L8.3356,10.8422L8.2489,10.8509L8.2178,10.93ZM5.8178,10.834L5.91,10.8427L5.9367,10.9196L7.0762,10.7865L8.2113,10.9196L8.2396,10.8427L8.3302,10.834L8.5053,10.6933L8.5795,10.6305L8.7273,10.4636L8.7425,10.3251L8.7949,10.2804C8.73,10.2198 8.6362,10.1609 8.5304,10.114C8.4082,10.0605 8.2756,10.0289 8.1731,10.0289C8.1698,10.0289 8.1665,10.0289 8.1638,10.0289C8.1409,10.0289 8.1153,10.03 8.0896,10.03C8.0362,10.03 7.9811,10.0278 7.9265,10.0202C7.8098,10.0033 7.7095,9.9776 7.6347,9.9455C7.4956,9.8882 7.29,9.8582 7.0691,9.8582C6.8531,9.8582 6.6545,9.8882 6.5138,9.9455C6.4407,9.9776 6.3387,10.0027 6.2225,10.0202C6.1402,10.03 6.0573,10.0338 5.9836,10.0289C5.9815,10.0289 5.9787,10.0289 5.9755,10.0289C5.874,10.0289 5.7398,10.0611 5.6187,10.114C5.5135,10.1609 5.4185,10.2193 5.3536,10.2804L5.406,10.3251L5.4065,10.3284L5.4213,10.4636L5.5696,10.6322L5.6438,10.6938L5.8178,10.834Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.0865,11.3571C6.6616,11.3571 6.2815,11.3058 6.0109,11.2262C5.9907,11.2175 5.9809,11.2005 5.9814,11.1804C5.9809,11.164 5.9918,11.1471 6.0109,11.1411C6.282,11.0604 6.6616,11.0091 7.0865,11.0091C7.5115,11.0091 7.8911,11.0604 8.1616,11.1411C8.1807,11.1476 8.1911,11.164 8.1905,11.1804C8.1922,11.2005 8.1818,11.2175 8.1616,11.2262C7.8905,11.3064 7.5115,11.3571 7.0865,11.3571" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.0865,11.6684L7.0865,11.6684C6.6742,11.6664 6.2907,11.5784 6.0093,11.4224C5.9869,11.4144 5.9744,11.3754 5.9749,11.3284C5.9749,11.2934 5.9875,11.2584 6.0093,11.2484C6.2913,11.0914 6.6742,11.0024 7.0865,11.0004C7.4984,11.0024 7.8818,11.0914 8.1633,11.2484C8.1851,11.2584 8.1987,11.2934 8.1976,11.3304C8.1987,11.3754 8.1862,11.4144 8.1633,11.4224C7.8818,11.5784 7.4984,11.6664 7.0865,11.6684ZM7.0865,11.0254C6.6753,11.0274 6.294,11.1154 6.0125,11.2714C5.9967,11.2794 5.988,11.3024 5.9885,11.3304C5.9875,11.3674 5.9967,11.3914 6.0125,11.3984C6.294,11.5544 6.6747,11.6404 7.0865,11.6424C7.4978,11.6404 7.8791,11.5544 8.1605,11.3984C8.1764,11.3904 8.1851,11.3674 8.184,11.3324C8.1845,11.3034 8.1753,11.2794 8.1605,11.2714C7.8791,11.1154 7.4973,11.0274 7.0865,11.0254Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M7.0855,11.3031C6.7025,11.3031 6.3562,11.2562 6.0922,11.188C6.3562,11.1209 6.7031,11.0773 7.0855,11.0773C7.4678,11.0773 7.8158,11.1209 8.0798,11.188C7.8158,11.2562 7.4678,11.3031 7.0855,11.3031" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.1211,11.1782l0.0322,0l0,0.0224l-0.0322,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.0827,11.0091C6.6545,11.0091 6.2678,11.0636 5.9967,11.1476C6.0196,11.1367 6.018,11.1095 5.9896,11.0364C5.9553,10.9485 5.9035,10.9518 5.9035,10.9518C6.2029,10.8645 6.6196,10.8089 7.0855,10.8078C7.5496,10.8089 7.9713,10.8645 8.2707,10.9518C8.2707,10.9518 8.2173,10.9485 8.184,11.0364C8.1567,11.1095 8.1535,11.1373 8.1758,11.1476C7.9047,11.0631 7.5125,11.0091 7.0827,11.0091" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.1747,11.4457C7.8922,11.2837 7.4956,11.1937 7.0833,11.1897C6.6775,11.1937 6.2815,11.2837 6,11.4457L5.9945,11.4227C6.0093,11.4107 6.0131,11.3757 5.9836,11.2367C5.9542,11.0937 5.9095,11.0907 5.904,11.0907L5.9007,11.0647C6.216,10.8967 6.6355,10.8027 7.0855,10.8007C7.5365,10.8027 7.9587,10.8967 8.2718,11.0647L8.2702,11.0907L8.2702,11.0907C8.2653,11.0907 8.2205,11.0937 8.1905,11.2367C8.1605,11.3757 8.1638,11.4107 8.1796,11.4227L8.1747,11.4457ZM7.0827,11.1667C7.4853,11.1667 7.8753,11.2587 8.1567,11.4107C8.1502,11.3747 8.16,11.3127 8.178,11.2287C8.1987,11.1347 8.2244,11.0937 8.244,11.0747C7.9331,10.9147 7.524,10.8287 7.0855,10.8267C6.648,10.8287 6.2389,10.9147 5.9291,11.0747C5.9493,11.0947 5.976,11.1357 5.9962,11.2287C6.0147,11.3127 6.024,11.3747 6.018,11.4107C6.2995,11.2587 6.6862,11.1667 7.0827,11.1667Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.0855,10.8073C6.6196,10.8084 6.2035,10.864 5.9035,10.9513C5.8827,10.9578 5.8615,10.9491 5.8555,10.9322C5.8489,10.9109 5.8593,10.8918 5.8795,10.8853C6.1811,10.7915 6.6093,10.7342 7.0849,10.732C7.5611,10.7331 7.9898,10.7915 8.2915,10.8853C8.3122,10.8918 8.322,10.9109 8.3155,10.9322C8.3089,10.9491 8.2876,10.9578 8.268,10.9513C7.9685,10.864 7.5496,10.8084 7.0855,10.8073" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.2822,11.1552C8.2778,11.1552 8.2718,11.1552 8.2675,11.1522C7.9549,10.9852 7.5349,10.8912 7.0855,10.8872C6.636,10.8912 6.2171,10.9852 5.9045,11.1522C5.9002,11.1552 5.8942,11.1552 5.8898,11.1552C5.8707,11.1552 5.8549,11.1342 5.8489,11.1052C5.8462,11.0842 5.8462,11.0632 5.8516,11.0422C5.8565,11.0242 5.8658,11.0092 5.8778,11.0052C6.1936,10.8272 6.6224,10.7282 7.0849,10.7282C7.542,10.7282 7.9827,10.8302 8.2936,11.0052C8.3051,11.0092 8.3144,11.0252 8.3193,11.0422C8.3258,11.0632 8.3258,11.0852 8.322,11.1052C8.3171,11.1332 8.3013,11.1552 8.2822,11.1552ZM7.0855,10.8622C7.5365,10.8642 7.9576,10.9602 8.2718,11.1262C8.2882,11.1342 8.3056,11.1262 8.31,11.0992C8.3133,11.0852 8.3122,11.0682 8.3084,11.0562C8.304,11.0402 8.2975,11.0332 8.2909,11.0312C7.9805,10.8532 7.5404,10.7522 7.0855,10.7522C6.6229,10.7522 6.1964,10.8522 5.8811,11.0312C5.874,11.0332 5.868,11.0412 5.8636,11.0562C5.8598,11.0682 5.8593,11.0852 5.862,11.0992C5.8669,11.1262 5.8849,11.1342 5.9007,11.1262C6.2149,10.9592 6.6355,10.8642 7.0855,10.8622Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.7538,10.912C6.7538,10.894 6.7702,10.8776 6.792,10.8776C6.8122,10.8776 6.8296,10.8935 6.8296,10.912C6.8296,10.9322 6.8122,10.9491 6.792,10.9491C6.7702,10.9491 6.7538,10.9322 6.7538,10.912" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.8298,11.0301C6.7828,11.0301 6.7478,10.9911 6.7478,10.9461C6.7478,10.9051 6.7828,10.8711 6.8298,10.8711C6.8738,10.8711 6.9118,10.9051 6.9118,10.9461C6.9118,10.9911 6.8738,11.0301 6.8298,11.0301ZM6.8298,10.8951C6.7968,10.8951 6.7708,10.9181 6.7708,10.9461C6.7708,10.9791 6.7968,11.0051 6.8298,11.0051C6.8588,11.0051 6.8868,10.9801 6.8868,10.9461C6.8858,10.9191 6.8588,10.8951 6.8298,10.8951Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M7.0865,10.942L6.9725,10.942C6.9524,10.942 6.9344,10.924 6.9344,10.9071C6.9344,10.8858 6.9518,10.8705 6.972,10.8705L7.2022,10.8705C7.224,10.8705 7.2404,10.8858 7.2404,10.9071C7.2404,10.924 7.2229,10.942 7.2022,10.942L7.0865,10.942" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.4303,11.0198L7.0103,11.0198C6.9653,11.0198 6.9273,10.9868 6.9273,10.9438C6.9273,10.8968 6.9653,10.8618 7.0093,10.8618L7.4313,10.8618C7.4783,10.8618 7.5133,10.8968 7.5133,10.9438C7.5123,10.9868 7.4773,11.0198 7.4303,11.0198ZM7.0083,10.8888C6.9783,10.8888 6.9523,10.9118 6.9523,10.9438C6.9523,10.9718 6.9783,10.9968 7.0103,10.9968L7.4303,10.9968C7.4623,10.9968 7.4893,10.9728 7.4893,10.9438C7.4893,10.9128 7.4633,10.8888 7.4303,10.8888L7.0083,10.8888Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#058E6E" + android:fillType="nonZero" + android:pathData="M6.5144,10.9731L6.4336,10.9835C6.4118,10.9851 6.3927,10.9709 6.39,10.9502C6.3878,10.9322 6.4025,10.9131 6.4238,10.9109L6.5056,10.9011L6.5896,10.8935C6.6104,10.8891 6.6295,10.9033 6.6327,10.9235C6.6344,10.9436 6.6202,10.9605 6.5978,10.9616L6.5144,10.9731" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.4655,11.0731C6.4235,11.0731 6.3885,11.0481 6.3835,11.0071C6.3825,10.9881 6.3875,10.9701 6.4005,10.9511C6.4125,10.9321 6.4335,10.9251 6.4555,10.9231L6.7595,10.8861C6.8055,10.8811 6.8465,10.9091 6.8525,10.9541C6.8525,10.9721 6.8475,10.9951 6.8345,11.0091C6.8225,11.0271 6.8005,11.0401 6.7795,11.0421L6.4775,11.0731C6.4725,11.0731 6.4705,11.0731 6.4655,11.0731ZM6.7695,10.9081C6.7675,10.9081 6.7635,10.9081 6.7635,10.9081L6.4585,10.9471C6.4415,10.9471 6.4295,10.9531 6.4175,10.9671C6.4105,10.9771 6.4055,10.9921 6.4075,11.0021C6.4115,11.0331 6.4415,11.0531 6.4715,11.0491L6.7745,11.0181C6.7915,11.0161 6.8045,11.0021 6.8165,10.9951C6.8225,10.9811 6.8285,10.9721 6.8265,10.9561C6.8225,10.9301 6.7985,10.9081 6.7695,10.9081Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.1822,10.9802C6.1822,10.9605 6.1996,10.9453 6.2198,10.9453C6.2416,10.9453 6.258,10.9605 6.258,10.9802C6.258,11.0004 6.2416,11.0151 6.2198,11.0151C6.1996,11.0151 6.1822,11.0004 6.1822,10.9802" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.2571,11.0925C6.2131,11.0925 6.1751,11.0575 6.1751,11.0165C6.1751,10.9755 6.2131,10.9365 6.2571,10.9365C6.3041,10.9365 6.3391,10.9755 6.3391,11.0165C6.3391,11.0575 6.3041,11.0925 6.2571,11.0925ZM6.2571,10.9595C6.2271,10.9595 6.2001,10.9825 6.2001,11.0165C6.2001,11.0455 6.2261,11.0695 6.2571,11.0695C6.2891,11.0695 6.3161,11.0465 6.3161,11.0165C6.3161,10.9835 6.2901,10.9595 6.2571,10.9595Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M5.9296,11.0473l0.042,-0.0584l0.1178,0.0164l-0.0938,0.0676l-0.066,-0.0256" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.0603,11.1609L5.9193,11.0999L6.0093,10.9829L6.2603,11.0139L6.0603,11.1609ZM5.9583,11.0909L6.0573,11.1319L6.1973,11.0299L6.0213,11.0089L5.9583,11.0909Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#058E6E" + android:fillType="nonZero" + android:pathData="M7.6582,10.9731L7.7384,10.9835C7.7602,10.9851 7.7793,10.9709 7.782,10.9502C7.7836,10.9322 7.77,10.9131 7.7482,10.9109L7.6664,10.9011L7.5824,10.8935C7.5616,10.8891 7.5425,10.9033 7.5398,10.9235C7.5376,10.9436 7.5524,10.9605 7.5742,10.9616L7.6582,10.9731" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.921,11.0731L7.921,11.0731C7.915,11.0731 7.913,11.0731 7.909,11.0731L7.606,11.0421C7.584,11.0401 7.563,11.0261 7.551,11.0091C7.537,10.9951 7.532,10.9721 7.534,10.9541C7.539,10.9091 7.581,10.8811 7.626,10.8861L7.93,10.9231C7.951,10.9251 7.972,10.9331 7.985,10.9511C7.997,10.9701 8.003,10.9871 8.003,11.0071C7.996,11.0471 7.961,11.0731 7.921,11.0731ZM7.616,10.9081C7.586,10.9081 7.563,10.9291 7.558,10.9551C7.558,10.9711 7.561,10.9801 7.569,10.9941C7.579,11.0021 7.592,11.0151 7.61,11.0171L7.912,11.0481C7.944,11.0521 7.973,11.0301 7.977,11.0011C7.979,10.9911 7.973,10.9761 7.966,10.9661C7.956,10.9521 7.943,10.9461 7.926,10.9461L7.621,10.9071C7.621,10.9081 7.617,10.9081 7.616,10.9081Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.3418,10.912C7.3418,10.894 7.3598,10.8776 7.38,10.8776C7.4018,10.8776 7.4182,10.8935 7.4182,10.912C7.4182,10.9322 7.4013,10.9491 7.38,10.9491C7.3598,10.9491 7.3418,10.9322 7.3418,10.912" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.4178,11.0301C7.3728,11.0301 7.3358,10.9911 7.3358,10.9461C7.3358,10.9051 7.3728,10.8711 7.4178,10.8711C7.4648,10.8711 7.4998,10.9051 7.4998,10.9461C7.4998,10.9911 7.4648,11.0301 7.4178,11.0301ZM7.4178,10.8951C7.3878,10.8951 7.3598,10.9181 7.3598,10.9461C7.3598,10.9791 7.3878,11.0051 7.4178,11.0051C7.4498,11.0051 7.4768,10.9801 7.4768,10.9461C7.4758,10.9191 7.4498,10.8951 7.4178,10.8951Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.914,10.9802C7.914,10.9605 7.9304,10.9453 7.9522,10.9453C7.9724,10.9453 7.9904,10.9605 7.9904,10.9802C7.9904,11.0004 7.9724,11.0151 7.9522,11.0151C7.9304,11.0151 7.914,11.0004 7.914,10.9802" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.9895,11.0925C7.9425,11.0925 7.9075,11.0575 7.9075,11.0165C7.9075,10.9755 7.9425,10.9365 7.9895,10.9365C8.0335,10.9365 8.0715,10.9755 8.0715,11.0165C8.0715,11.0575 8.0345,11.0925 7.9895,11.0925ZM7.9895,10.9595C7.9565,10.9595 7.9305,10.9825 7.9305,11.0165C7.9305,11.0455 7.9565,11.0695 7.9895,11.0695C8.0195,11.0695 8.0465,11.0465 8.0465,11.0165C8.0465,10.9835 8.0195,10.9595 7.9895,10.9595Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M8.2435,11.0473l-0.0425,-0.0584l-0.1173,0.0164l0.0933,0.0676l0.0665,-0.0256" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.1758,11.1605L8.0662,11.0145L8.2031,10.9835L8.2522,11.1005L8.1758,11.1605ZM8.1022,11.0305L8.1785,11.1325L8.2325,11.0915L8.1982,11.0105L8.1022,11.0305ZM8.124,11.3915C7.8447,11.2485 7.4765,11.1705 7.086,11.1705C6.6971,11.1705 6.3284,11.2485 6.0491,11.3915L6.0453,11.3685C6.3262,11.2255 6.6949,11.1475 7.086,11.1475C7.4771,11.1475 7.8475,11.2255 8.1278,11.3685L8.124,11.3915Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.2275,10.1549L6.2755,10.1931L6.348,10.0753C6.2695,10.0273 6.2165,9.9455 6.2165,9.8495C6.2165,9.838 6.2171,9.8293 6.2176,9.8195C6.2258,9.6689 6.4091,9.5424 6.6404,9.5424C6.7604,9.5424 6.8689,9.5767 6.9458,9.6302C6.9485,9.6062 6.9502,9.5882 6.9535,9.5653C6.8695,9.5167 6.7604,9.4867 6.6404,9.4867C6.3736,9.4867 6.1653,9.6389 6.1549,9.8189C6.1533,9.8287 6.1533,9.8369 6.1533,9.8489C6.1533,9.946 6.1975,10.0311 6.2656,10.0905L6.2275,10.1549" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.3074,10.4791L6.2358,10.4143L6.2826,10.3262C6.1956,10.2381 6.1467,10.1161 6.1467,9.9911C6.1467,9.9753 6.1467,9.9618 6.1481,9.9482C6.1621,9.6847 6.4265,9.4791 6.7525,9.4791C6.8957,9.4791 7.0329,9.5205 7.1407,9.5913L7.1467,9.5966L7.1454,9.6011C7.142,9.6259 7.1394,9.6515 7.1353,9.6892L7.1353,9.705L7.1233,9.6952C7.0276,9.6199 6.8924,9.5792 6.7525,9.5792C6.476,9.5792 6.2525,9.7419 6.2424,9.9497C6.2411,9.9633 6.2411,9.9746 6.2411,9.9911C6.2411,10.1131 6.2993,10.2268 6.3977,10.2938L6.4058,10.3014L6.3074,10.4791ZM6.2565,10.4083L6.3034,10.4497L6.3817,10.3067C6.2826,10.2344 6.2237,10.1146 6.2237,9.9911C6.2237,9.9738 6.225,9.9618 6.225,9.9482C6.2358,9.7291 6.4673,9.5612 6.7525,9.5612C6.8917,9.5612 7.0216,9.6003 7.12,9.6711C7.1226,9.6448 7.1246,9.6229 7.1273,9.6018C7.0222,9.5356 6.8897,9.4972 6.7525,9.4972C6.4359,9.4972 6.1782,9.696 6.1655,9.949C6.1635,9.9625 6.1628,9.9753 6.1628,9.9904C6.1628,10.1139 6.2137,10.2336 6.3,10.3202L6.304,10.324L6.2565,10.4083Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.2302,10.1555C6.1402,10.0884 6.0824,9.9956 6.0824,9.8942C6.0824,9.7758 6.1593,9.6705 6.276,9.6024C6.204,9.6591 6.1604,9.7344 6.1544,9.8195C6.1527,9.8293 6.1527,9.8375 6.1527,9.8495C6.1527,9.9465 6.1969,10.0316 6.2651,10.0911L6.2302,10.1555" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.3634,10.5964L6.3514,10.5906C6.1754,10.4612 6.0764,10.2943 6.0764,10.1208C6.0764,9.9204 6.2074,9.7277 6.4364,9.5964L6.4514,9.6155C6.3184,9.72 6.2434,9.8476 6.2324,9.9904C6.2294,10.0077 6.2284,10.024 6.2284,10.0432C6.2284,10.2004 6.3044,10.3528 6.4334,10.4631L6.4394,10.4679L6.3634,10.5964ZM6.3284,9.6999C6.1824,9.8169 6.1004,9.9664 6.1004,10.1199C6.1004,10.2838 6.1924,10.441 6.3564,10.5599L6.4094,10.4679C6.2794,10.3557 6.2054,10.2004 6.2054,10.0412C6.2054,10.0211 6.2054,10.0038 6.2074,9.9866C6.2174,9.883 6.2574,9.7872 6.3284,9.6999Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M5.4273,10.2738C5.376,10.2176 5.3449,10.144 5.3449,10.0627C5.3449,10.0147 5.3569,9.9667 5.3765,9.9264C5.4502,9.7731 5.682,9.6651 5.9564,9.6651C6.0316,9.6651 6.1025,9.6705 6.1691,9.6875C6.1544,9.7044 6.1435,9.7207 6.1315,9.7387C6.0764,9.7289 6.018,9.7218 5.9564,9.7218C5.706,9.7218 5.4949,9.82 5.4338,9.952C5.418,9.9864 5.4082,10.0245 5.4082,10.0627C5.4082,10.1435 5.4464,10.216 5.5042,10.2651L5.4142,10.4124L5.3645,10.3742L5.4273,10.2738" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.4289,10.6575L5.3591,10.5941L5.4334,10.463C5.3714,10.3868 5.3378,10.2864 5.3378,10.1859C5.3378,10.1226 5.3514,10.0592 5.3766,10.0022C5.4683,9.7963 5.7467,9.6575 6.0704,9.6575C6.1589,9.6575 6.2429,9.6688 6.3243,9.6874L6.3378,9.6909L6.3288,9.7023C6.3113,9.723 6.2991,9.7443 6.2848,9.7693L6.2823,9.7736L6.2777,9.7728C6.2112,9.7579 6.1414,9.7529 6.0717,9.7529C5.7842,9.7529 5.5329,9.8733 5.4606,10.0449C5.4412,10.0905 5.4302,10.1368 5.4302,10.1867C5.4302,10.2871 5.4722,10.3761 5.542,10.4424L5.5478,10.4481L5.4289,10.6575ZM5.3798,10.5919L5.425,10.6311L5.5245,10.4545C5.4535,10.3847 5.4134,10.2878 5.4134,10.1874C5.4134,10.1375 5.4237,10.0869 5.4438,10.0392C5.5193,9.859 5.7771,9.7351 6.0704,9.7351C6.1401,9.7351 6.2086,9.7408 6.2739,9.7529C6.2842,9.7365 6.2958,9.7194 6.3068,9.703C6.2312,9.6867 6.1518,9.6753 6.0704,9.6753C5.7584,9.6753 5.478,9.8141 5.3908,10.0122C5.3669,10.0691 5.354,10.1261 5.354,10.1874C5.354,10.2878 5.3876,10.3818 5.4496,10.4587L5.4509,10.4602L5.4509,10.4673L5.4509,10.4716L5.3798,10.5919Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M5.5205,9.7753C5.4545,9.8189 5.4055,9.8702 5.3765,9.9264C5.3575,9.9667 5.3449,10.0147 5.3449,10.0627C5.3449,10.1435 5.3765,10.2176 5.4273,10.2738L5.3722,10.3633C5.3182,10.2962 5.2882,10.216 5.2882,10.1309C5.2882,9.988 5.3809,9.8609 5.5205,9.7753" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.4496,10.7704L5.4376,10.7613C5.3356,10.6414 5.2816,10.508 5.2816,10.3664C5.2816,10.1356 5.4376,9.92 5.7136,9.7704L5.7266,9.7893C5.6066,9.8578 5.5166,9.9426 5.4676,10.0328C5.4306,10.1049 5.4106,10.177 5.4106,10.2546C5.4106,10.3817 5.4626,10.5008 5.5586,10.5981L5.5646,10.6017L5.4496,10.7704ZM5.4646,9.9877C5.3606,10.1058 5.3066,10.232 5.3066,10.3664C5.3066,10.4935 5.3556,10.6198 5.4466,10.7325L5.5336,10.6035C5.4376,10.5071 5.3856,10.3799 5.3856,10.2528C5.3856,10.1725 5.4066,10.0923 5.4456,10.0201C5.4506,10.0111 5.4566,10.0003 5.4646,9.9877Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.0827,9.4578C7.1438,9.4578 7.1951,9.4982 7.2076,9.5516C7.2169,9.6007 7.2207,9.6542 7.2229,9.7115C7.2229,9.718 7.2224,9.7224 7.2224,9.7305C7.2224,9.7349 7.2235,9.7431 7.2235,9.7507C7.2262,9.8729 7.2425,9.9787 7.2682,10.0458L7.0827,10.2225L6.8945,10.0458C6.9202,9.9787 6.936,9.8729 6.9393,9.7507C6.9393,9.7431 6.9398,9.7349 6.9398,9.7305C6.9398,9.7218 6.9393,9.718 6.9393,9.7115C6.9409,9.6542 6.9453,9.6007 6.9545,9.5516C6.9671,9.4982 7.0216,9.4578 7.0827,9.4578" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.2464,10.4496L6.8864,10.2144L6.8894,10.2047C6.9364,10.1219 6.9654,9.9827 6.9714,9.8338C6.9714,9.8296 6.9714,9.824 6.9714,9.8212C6.9714,9.8143 6.9714,9.8115 6.9714,9.8073C6.9714,9.8045 6.9714,9.799 6.9714,9.7962C6.9714,9.7927 6.9714,9.7892 6.9714,9.7823C6.9734,9.7106 6.9834,9.6438 6.9994,9.5784C7.0234,9.5025 7.1294,9.4496 7.2464,9.4496C7.3624,9.4496 7.4634,9.5018 7.4874,9.5784C7.5044,9.6424 7.5124,9.7092 7.5164,9.7823C7.5164,9.7892 7.5164,9.7906 7.5154,9.7962C7.5154,9.799 7.5154,9.8032 7.5154,9.8073C7.5154,9.8108 7.5164,9.8129 7.5164,9.8192C7.5164,9.824 7.5164,9.8296 7.5164,9.8338C7.5224,9.9806 7.5514,10.1212 7.5984,10.2047L7.5994,10.2144L7.2464,10.4496ZM6.9154,10.2061L7.2464,10.426L7.5704,10.2061C7.5254,10.1198 7.4954,9.9792 7.4924,9.8338C7.4924,9.8296 7.4924,9.824 7.4914,9.8212C7.4904,9.8143 7.4894,9.8115 7.4894,9.8073C7.4894,9.8032 7.4894,9.7976 7.4894,9.7962C7.4894,9.7906 7.4904,9.7892 7.4894,9.7823C7.4864,9.7106 7.4794,9.6438 7.4634,9.5805C7.4414,9.5151 7.3504,9.4677 7.2464,9.4677C7.1414,9.4677 7.0434,9.5164 7.0234,9.5805C7.0064,9.6438 6.9994,9.7127 6.9964,9.7823C6.9964,9.7892 6.9964,9.7927 6.9964,9.7962C6.9964,9.799 6.9964,9.8032 6.9964,9.8073C6.9964,9.8115 6.9954,9.8157 6.9944,9.8233C6.9944,9.8254 6.9944,9.8289 6.9944,9.8331C6.9904,9.9806 6.9604,10.1212 6.9154,10.2061Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.0827,9.5156C7.1144,9.5156 7.14,9.5353 7.1465,9.5642C7.1547,9.6067 7.1591,9.6591 7.1602,9.7153C7.1602,9.7207 7.1596,9.7262 7.1596,9.73C7.1596,9.7376 7.1618,9.7442 7.1618,9.7513C7.1629,9.8664 7.1798,9.9667 7.2038,10.0284L7.0805,10.1445L6.9578,10.0284C6.9813,9.9678 6.9982,9.8664 6.9998,9.7513C6.9998,9.7442 7.002,9.7376 7.002,9.73C7.002,9.7256 7.0015,9.7202 7.0015,9.7153C7.0025,9.6585 7.0069,9.6067 7.0156,9.5642C7.0227,9.5353 7.0511,9.5156 7.0827,9.5156" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.1893,10.508L6.9513,10.3168L6.9523,10.31C6.9973,10.2115 7.0253,10.0531 7.0283,9.8837C7.0283,9.877 7.0293,9.8728 7.0303,9.8686C7.0313,9.8601 7.0323,9.8568 7.0323,9.8509C7.0323,9.8509 7.0323,9.8441 7.0323,9.8374C7.0323,9.8357 7.0323,9.8307 7.0323,9.8273C7.0353,9.743 7.0423,9.6613 7.0593,9.5922C7.0713,9.5409 7.1293,9.508 7.1933,9.508C7.2563,9.508 7.3103,9.5409 7.3223,9.5922C7.3383,9.6613 7.3453,9.7456 7.3483,9.8273C7.3483,9.8307 7.3483,9.8357 7.3483,9.8374C7.3483,9.8441 7.3483,9.8509 7.3483,9.8509C7.3483,9.8576 7.3493,9.8627 7.3503,9.8703C7.3503,9.8728 7.3513,9.877 7.3523,9.8837C7.3533,10.0531 7.3813,10.2115 7.4283,10.31L7.4293,10.3168L7.1893,10.508ZM6.9793,10.3125L7.1893,10.4819L7.3983,10.3125C7.3563,10.2115 7.3273,10.0531 7.3243,9.8854C7.3243,9.8778 7.3233,9.8762 7.3223,9.8711C7.3213,9.8644 7.3213,9.8576 7.3213,9.8517C7.3213,9.8517 7.3213,9.845 7.3213,9.8382C7.3213,9.8366 7.3213,9.8315 7.3213,9.8281C7.3213,9.7473 7.3113,9.6672 7.2973,9.5948C7.2853,9.5552 7.2433,9.5299 7.1923,9.5299C7.1403,9.5299 7.0913,9.5577 7.0813,9.5948C7.0663,9.6655 7.0583,9.7473 7.0563,9.8281C7.0563,9.8315 7.0563,9.8366 7.0573,9.8382C7.0573,9.845 7.0573,9.8517 7.0573,9.8517C7.0573,9.8585 7.0563,9.8652 7.0553,9.8711C7.0543,9.8753 7.0533,9.8778 7.0533,9.8854C7.0523,10.0531 7.0233,10.2123 6.9793,10.3125Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.9358,10.1549L7.8884,10.1931L7.8153,10.0753C7.8944,10.0273 7.9473,9.9455 7.9473,9.8495C7.9473,9.838 7.9462,9.8293 7.9462,9.8195C7.938,9.6689 7.7542,9.5424 7.524,9.5424C7.4029,9.5424 7.2944,9.5767 7.2175,9.6302C7.2153,9.6062 7.2136,9.5882 7.2104,9.5653C7.2944,9.5167 7.4035,9.4867 7.524,9.4867C7.7902,9.4867 7.9991,9.6389 8.0095,9.8189C8.01,9.8287 8.01,9.8369 8.01,9.8489C8.01,9.946 7.9664,10.0311 7.8982,10.0905L7.9358,10.1549" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.042,10.4791L7.9441,10.3014L7.9515,10.2938C8.05,10.2268 8.109,10.1131 8.109,9.9911C8.109,9.9753 8.1083,9.9633 8.1077,9.9497C8.0976,9.7419 7.8731,9.5792 7.597,9.5792C7.4542,9.5792 7.3228,9.6207 7.225,9.6952L7.2129,9.705L7.2129,9.6892C7.2096,9.6553 7.2082,9.632 7.2035,9.6011L7.2022,9.5966L7.2075,9.5913C7.3148,9.5198 7.4535,9.4791 7.597,9.4791C7.9227,9.4791 8.1881,9.6847 8.2022,9.9497C8.2022,9.9633 8.2022,9.9761 8.2022,9.9911C8.2022,10.1161 8.1539,10.2381 8.0668,10.3262L8.1144,10.4143L8.042,10.4791ZM7.9669,10.3067L8.046,10.4497L8.0923,10.4083L8.0453,10.324L8.0507,10.3202C8.1372,10.2344 8.1868,10.1146 8.1868,9.9904C8.1868,9.9768 8.1868,9.964 8.1854,9.949C8.172,9.696 7.914,9.4972 7.5976,9.4972C7.4596,9.4972 7.3268,9.5356 7.2209,9.6018C7.225,9.6259 7.2256,9.6493 7.229,9.6711C7.3275,9.5996 7.4569,9.5612 7.5976,9.5612C7.8831,9.5612 8.1144,9.7291 8.1244,9.9497C8.1251,9.9618 8.1264,9.9731 8.1264,9.9911C8.1258,10.1146 8.0668,10.2321 7.9669,10.3067Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.9331,10.1555C8.0231,10.0884 8.0804,9.9956 8.0804,9.8942C8.0804,9.7758 8.0035,9.6705 7.8873,9.6024C7.9587,9.6591 8.0024,9.7344 8.0089,9.8195C8.0095,9.8293 8.0095,9.8375 8.0095,9.8495C8.0095,9.9465 7.9658,10.0316 7.8976,10.0911L7.9331,10.1555" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.9704,10.5953L7.8934,10.4651L7.9014,10.4603C8.0304,10.3513 8.1044,10.1991 8.1044,10.0412C8.1044,10.024 8.1044,10.0077 8.1024,9.9886C8.0914,9.8469 8.0164,9.7197 7.8824,9.6144L7.8984,9.5953C8.1274,9.7264 8.2574,9.9187 8.2574,10.1187C8.2574,10.2929 8.1594,10.4584 7.9824,10.5876L7.9704,10.5953ZM7.9254,10.468L7.9784,10.5599C8.1434,10.4412 8.2334,10.2843 8.2334,10.1206C8.2334,9.9675 8.1514,9.8182 8.0054,9.7015C8.0754,9.7886 8.1174,9.8833 8.1284,9.9886C8.1284,10.0077 8.1284,10.024 8.1284,10.0431C8.1274,10.201 8.0554,10.356 7.9254,10.468Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.736,10.2738C8.7873,10.2176 8.8189,10.144 8.8189,10.0627C8.8189,10.0147 8.8069,9.9667 8.7867,9.9264C8.7125,9.7731 8.4813,9.6651 8.2069,9.6651C8.1311,9.6651 8.0607,9.6705 7.9942,9.6875C8.01,9.7044 8.0198,9.7207 8.0324,9.7387C8.0864,9.7289 8.1458,9.7218 8.2069,9.7218C8.4578,9.7218 8.6684,9.82 8.7295,9.952C8.7453,9.9864 8.7551,10.0245 8.7551,10.0627C8.7551,10.1435 8.7175,10.216 8.6591,10.2651L8.7491,10.4124L8.7987,10.3742L8.736,10.2738" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.8905,10.6575L8.7722,10.4481L8.7787,10.4424C8.8485,10.3754 8.8905,10.2864 8.8905,10.1867C8.8905,10.1368 8.8795,10.0905 8.8601,10.0449C8.7877,9.8733 8.5369,9.7529 8.2486,9.7529C8.1781,9.7529 8.1083,9.7586 8.0418,9.7728L8.0379,9.7736L8.0346,9.7693C8.0198,9.7415 8.0075,9.723 7.9913,9.7023L7.9816,9.6909L7.9952,9.6874C8.076,9.6688 8.1607,9.6575 8.2486,9.6575C8.5718,9.6575 8.8517,9.7963 8.9435,10.0022C8.9681,10.0592 8.9816,10.1226 8.9816,10.1859C8.9816,10.2864 8.9467,10.3861 8.8866,10.463L8.9603,10.5941L8.8905,10.6575ZM8.7948,10.4538L8.8937,10.6304L8.939,10.5912L8.8659,10.4616L8.8692,10.4573C8.9319,10.3811 8.9648,10.2864 8.9648,10.1859C8.9648,10.1247 8.9525,10.0677 8.928,10.0107C8.8401,9.8134 8.5602,9.6738 8.248,9.6738C8.1659,9.6738 8.0864,9.6852 8.0107,9.7016C8.0224,9.718 8.0333,9.7351 8.0443,9.7515C8.109,9.7387 8.1775,9.7337 8.2473,9.7337C8.5408,9.7337 8.7987,9.8576 8.8743,10.0378C8.8944,10.0855 8.9047,10.1361 8.9047,10.1859C8.906,10.2871 8.8653,10.3847 8.7948,10.4538Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.6427,9.7753C8.7093,9.8189 8.7589,9.8702 8.7873,9.9264C8.8064,9.9667 8.8195,10.0147 8.8195,10.0627C8.8195,10.1435 8.7873,10.2176 8.7365,10.2738L8.7922,10.3633C8.8456,10.2962 8.8756,10.216 8.8756,10.1309C8.8751,9.988 8.7829,9.8609 8.6427,9.7753" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.9155,10.7698L8.8015,10.6004L8.8075,10.5968C8.9035,10.5004 8.9545,10.3806 8.9545,10.2536C8.9545,10.1761 8.9355,10.1041 8.8975,10.032C8.8505,9.9419 8.7585,9.8581 8.6395,9.7887L8.6515,9.7698C8.9255,9.9194 9.0835,10.1347 9.0835,10.3653C9.0835,10.5059 9.0285,10.6401 8.9265,10.7599L8.9155,10.7698ZM8.8325,10.6041L8.9195,10.7329C9.0095,10.6203 9.0585,10.4932 9.0585,10.3671C9.0585,10.2356 9.0035,10.1068 8.9035,9.9923C8.9105,10.0014 8.9155,10.0113 8.9225,10.0221C8.9605,10.0941 8.9815,10.1752 8.9815,10.2545C8.9805,10.3806 8.9265,10.5068 8.8325,10.6041Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.0162,10.0671C7.0162,10.0349 7.0456,10.0065 7.0833,10.0065C7.1187,10.0065 7.1482,10.0355 7.1482,10.0671C7.1482,10.1036 7.1187,10.1309 7.0833,10.1309C7.0456,10.1309 7.0162,10.1036 7.0162,10.0671" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.1436,10.2569C7.0676,10.2569 7.0096,10.1939 7.0096,10.1239C7.0096,10.0539 7.0686,9.9989 7.1436,9.9989C7.2146,9.9989 7.2756,10.0539 7.2756,10.1239C7.2756,10.1939 7.2156,10.2569 7.1436,10.2569ZM7.1436,10.0249C7.0826,10.0249 7.0326,10.0689 7.0326,10.1239C7.0326,10.1869 7.0826,10.2309 7.1436,10.2309C7.2026,10.2309 7.2496,10.1859 7.2496,10.1239C7.2506,10.0689 7.2026,10.0249 7.1436,10.0249Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.0162,9.9476C7.0162,9.9127 7.0456,9.8838 7.0833,9.8838C7.1187,9.8838 7.1482,9.9127 7.1482,9.9476C7.1482,9.9798 7.1187,10.0093 7.0833,10.0093C7.0456,10.0098 7.0162,9.9798 7.0162,9.9476" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.1436,10.1311C7.0676,10.1311 7.0096,10.0781 7.0096,10.0081C7.0096,9.9381 7.0686,9.8751 7.1436,9.8751C7.2146,9.8751 7.2756,9.9381 7.2756,10.0081C7.2756,10.0781 7.2156,10.1311 7.1436,10.1311ZM7.1436,9.9011C7.0826,9.9011 7.0326,9.9481 7.0326,10.0081C7.0326,10.0611 7.0826,10.1081 7.1436,10.1081C7.2026,10.1081 7.2496,10.0611 7.2496,10.0081C7.2506,9.9481 7.2026,9.9011 7.1436,9.9011Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.0293,9.8145C7.0293,9.7856 7.0538,9.7655 7.0833,9.7655C7.1122,9.7655 7.1345,9.7856 7.1345,9.8145C7.1345,9.8435 7.1122,9.8636 7.0833,9.8636C7.0538,9.8636 7.0293,9.8435 7.0293,9.8145" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.1332,9.9654C7.0712,9.9654 7.0222,9.9184 7.0222,9.8614C7.0222,9.8054 7.0712,9.7584 7.1332,9.7584C7.1922,9.7584 7.2392,9.8054 7.2392,9.8614C7.2402,9.9184 7.1922,9.9654 7.1332,9.9654ZM7.1332,9.7834C7.0862,9.7834 7.0472,9.8184 7.0472,9.8614C7.0472,9.9024 7.0862,9.9414 7.1332,9.9414C7.1782,9.9414 7.2152,9.9024 7.2152,9.8614C7.2152,9.8184 7.1792,9.7834 7.1332,9.7834Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.0445,9.6962C7.0445,9.6771 7.0609,9.6591 7.0827,9.6591C7.1029,9.6591 7.1198,9.6771 7.1198,9.6962C7.1198,9.7175 7.1024,9.7327 7.0827,9.7327C7.0609,9.7333 7.0445,9.7175 7.0445,9.6962" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.12,9.8096C7.073,9.8096 7.038,9.7756 7.038,9.7316C7.038,9.6866 7.073,9.6536 7.12,9.6536C7.163,9.6536 7.201,9.6866 7.201,9.7316C7.201,9.7756 7.164,9.8096 7.12,9.8096ZM7.12,9.6776C7.087,9.6776 7.061,9.7006 7.061,9.7326C7.061,9.7616 7.086,9.7856 7.12,9.7856C7.15,9.7856 7.176,9.7626 7.176,9.7326C7.176,9.7006 7.15,9.6776 7.12,9.6776Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.0511,9.5931C7.0511,9.5773 7.0653,9.5642 7.0827,9.5642C7.0991,9.5642 7.1116,9.5767 7.1116,9.5931C7.1116,9.6067 7.0991,9.6198 7.0827,9.6198C7.0653,9.6198 7.0511,9.6067 7.0511,9.5931" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.1145,9.688C7.0745,9.688 7.0445,9.661 7.0445,9.624C7.0445,9.588 7.0755,9.556 7.1145,9.556C7.1495,9.556 7.1805,9.588 7.1805,9.624C7.1815,9.661 7.1505,9.688 7.1145,9.688Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.0876,10.444L7.1313,10.4505C7.1242,10.4696 7.122,10.4876 7.122,10.5089C7.122,10.5973 7.1984,10.6676 7.2927,10.6676C7.368,10.6676 7.4318,10.6229 7.4536,10.558C7.4569,10.5602 7.47,10.5002 7.4771,10.5007C7.4825,10.5007 7.4825,10.5613 7.4853,10.5613C7.4951,10.642 7.5693,10.6976 7.6533,10.6976C7.7471,10.6976 7.8235,10.6251 7.8235,10.5356C7.8235,10.5291 7.8229,10.5231 7.8213,10.5155L7.8753,10.4631L7.9042,10.5313C7.8922,10.5525 7.8878,10.5765 7.8878,10.6022C7.8878,10.6878 7.9609,10.7555 8.0504,10.7555C8.106,10.7555 8.1562,10.7271 8.1856,10.6878L8.22,10.642L8.22,10.6965C8.22,10.7511 8.2429,10.7969 8.2947,10.8067C8.2947,10.8067 8.3547,10.8084 8.4333,10.7478C8.5129,10.6862 8.5571,10.6344 8.5571,10.6344L8.5636,10.6955C8.5636,10.6955 8.4976,10.798 8.4256,10.8405C8.3875,10.8618 8.3269,10.8853 8.2795,10.8809C8.2298,10.8711 8.1944,10.8296 8.1764,10.7827C8.1404,10.8056 8.0978,10.8171 8.0525,10.8171C7.956,10.8171 7.8693,10.7658 7.8349,10.684C7.7902,10.732 7.7275,10.7631 7.6549,10.7631C7.5769,10.7631 7.5055,10.7282 7.4613,10.6747C7.4182,10.7151 7.3587,10.7396 7.2933,10.7396C7.2076,10.7396 7.1318,10.6949 7.0871,10.6322C7.0445,10.6949 6.9687,10.7396 6.8825,10.7396C6.8165,10.7396 6.7576,10.7151 6.7129,10.6747C6.6687,10.7282 6.5978,10.7631 6.5209,10.7631C6.4478,10.7631 6.3851,10.732 6.3409,10.684C6.3071,10.7658 6.2187,10.8171 6.1216,10.8171C6.0769,10.8171 6.0349,10.8056 5.9995,10.7827C5.9809,10.8296 5.9455,10.8711 5.8947,10.8809C5.8473,10.8853 5.7889,10.8618 5.7485,10.8405C5.6771,10.798 5.6111,10.6955 5.6111,10.6955L5.6182,10.6344C5.6182,10.6344 5.6618,10.6862 5.7415,10.7478C5.8216,10.8084 5.8805,10.8067 5.8805,10.8067C5.9329,10.7964 5.9558,10.7505 5.9558,10.6965L5.9558,10.642L5.9891,10.6878C6.0185,10.7271 6.0676,10.7555 6.1249,10.7555C6.2144,10.7555 6.2864,10.6878 6.2864,10.6022C6.2864,10.5765 6.2815,10.5525 6.2705,10.5313L6.2989,10.4631L6.3518,10.5155C6.3518,10.5231 6.3518,10.5291 6.3518,10.5356C6.3518,10.6251 6.4271,10.6976 6.5209,10.6976C6.6038,10.6976 6.678,10.642 6.69,10.5613C6.6916,10.5613 6.6905,10.5007 6.6971,10.5007C6.7036,10.5002 6.7184,10.5602 6.72,10.558C6.7424,10.6229 6.8062,10.6676 6.8825,10.6676C6.9758,10.6676 7.0516,10.5973 7.0516,10.5089C7.0516,10.4876 7.0516,10.4696 7.044,10.4505L7.0876,10.444" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.2985,11.2614C8.2909,11.2614 8.2849,11.2594 8.2784,11.2594C8.2336,11.2474 8.1955,11.1864 8.1731,11.0934C8.1355,11.1304 8.0945,11.1464 8.052,11.1464C7.9571,11.1464 7.8693,11.0524 7.8311,10.9124C7.7847,11.0004 7.722,11.0474 7.6544,11.0474C7.5791,11.0474 7.5082,10.9884 7.4602,10.8894C7.4149,10.9634 7.3549,11.0024 7.2927,11.0024C7.2109,11.0024 7.134,10.9324 7.0865,10.8164C7.0402,10.9314 6.9644,11.0024 6.882,11.0024C6.8187,11.0024 6.7604,10.9634 6.7129,10.8894C6.6665,10.9894 6.594,11.0474 6.5204,11.0474C6.4522,11.0474 6.3895,11.0004 6.3415,10.9124C6.3038,11.0534 6.2171,11.1464 6.1211,11.1464C6.0791,11.1464 6.0382,11.1304 6.0027,11.0934C5.9798,11.1864 5.9411,11.2474 5.8953,11.2594C5.8887,11.2594 5.8822,11.2614 5.8745,11.2614C5.8216,11.2614 5.766,11.2104 5.7442,11.1874C5.6727,11.1114 5.6073,10.9284 5.6051,10.9234L5.6035,10.9174L5.6127,10.7674L5.6225,10.7904C5.6225,10.7904 5.6673,10.8844 5.7442,10.9984C5.814,11.0954 5.8685,11.1024 5.8784,11.1024C5.9225,11.0894 5.9487,11.0194 5.9487,10.9134L5.9482,10.7824L5.9935,10.8864C6.0224,10.9644 6.0715,11.0094 6.1244,11.0094C6.2095,11.0094 6.2793,10.8864 6.2793,10.7404C6.2793,10.6914 6.2749,10.6494 6.2645,10.6184L6.2624,10.6104L6.2973,10.4624L6.3589,10.5794L6.3584,10.5854C6.3584,10.5984 6.3584,10.6084 6.3584,10.6184C6.3584,10.7764 6.4315,10.9024 6.5209,10.9024C6.6038,10.9024 6.6725,10.8034 6.6829,10.6654L6.684,10.6474L6.684,10.6474C6.684,10.6414 6.684,10.6334 6.684,10.6264C6.6867,10.5564 6.6867,10.5444 6.6965,10.5414L6.6965,10.5414C6.7053,10.5414 6.7091,10.5564 6.7189,10.6214C6.7205,10.6264 6.7222,10.6344 6.7222,10.6424L6.7227,10.6424L6.7255,10.6524C6.7473,10.7694 6.8105,10.8534 6.8815,10.8534C6.9709,10.8534 7.044,10.7204 7.044,10.5704C7.044,10.5334 7.044,10.5024 7.0369,10.4684L7.0342,10.4544L7.0876,10.4364L7.1405,10.4544L7.1378,10.4684C7.1307,10.5014 7.1291,10.5344 7.1291,10.5704C7.1291,10.7204 7.2022,10.8534 7.2927,10.8534C7.3642,10.8534 7.4258,10.7694 7.4476,10.6544L7.4509,10.6424L7.4509,10.6424C7.4525,10.6344 7.4536,10.6264 7.4542,10.6194C7.4656,10.5564 7.47,10.5414 7.4771,10.5414C7.4864,10.5454 7.4885,10.5574 7.4896,10.6274C7.4896,10.6374 7.4902,10.6434 7.4902,10.6484L7.4918,10.6664C7.5016,10.8054 7.5698,10.9034 7.6533,10.9034C7.7438,10.9034 7.8164,10.7774 7.8164,10.6194C7.8164,10.6074 7.8158,10.5964 7.8147,10.5864L7.8147,10.5804L7.878,10.4634L7.9107,10.6114L7.9107,10.6194C7.8998,10.6504 7.8944,10.6924 7.8944,10.7414C7.8944,10.8874 7.9647,11.0104 8.0504,11.0104C8.1022,11.0104 8.1502,10.9654 8.1791,10.8874L8.2265,10.7834L8.226,10.9144C8.226,11.0204 8.2522,11.0914 8.2942,11.1034C8.3056,11.1034 8.3591,11.0954 8.4284,10.9994C8.5069,10.8854 8.55,10.7914 8.5505,10.7914L8.5615,10.7684L8.5702,10.9184L8.5696,10.9244C8.5658,10.9294 8.502,11.1124 8.4289,11.1884C8.4076,11.2104 8.352,11.2614 8.2985,11.2614ZM8.1796,11.0564L8.1824,11.0704C8.2015,11.1644 8.2375,11.2244 8.2811,11.2364C8.2865,11.2364 8.2925,11.2364 8.2985,11.2364C8.3504,11.2364 8.406,11.1814 8.4224,11.1664C8.4862,11.0964 8.5467,10.9364 8.5571,10.9084L8.5516,10.8304C8.5342,10.8614 8.4955,10.9344 8.4382,11.0184C8.3651,11.1224 8.3073,11.1294 8.2964,11.1294L8.2947,11.1294C8.2435,11.1114 8.2129,11.0334 8.2129,10.9144L8.2129,10.8534L8.1911,10.9054C8.16,10.9844 8.1065,11.0354 8.0509,11.0354C7.9576,11.0354 7.8818,10.9004 7.8818,10.7414C7.8818,10.6894 7.8862,10.6484 7.8965,10.6114L7.8725,10.5094L7.8289,10.5894C7.83,10.5984 7.8305,10.6094 7.8305,10.6184C7.8305,10.7904 7.7509,10.9284 7.6533,10.9284C7.5627,10.9284 7.4896,10.8184 7.4787,10.6704C7.4765,10.6654 7.476,10.6494 7.476,10.6284C7.476,10.6184 7.476,10.6014 7.4749,10.5854C7.4727,10.6014 7.4695,10.6184 7.4667,10.6264C7.4629,10.6494 7.4618,10.6634 7.4596,10.6654C7.4345,10.7904 7.368,10.8764 7.2922,10.8764C7.1945,10.8764 7.1144,10.7354 7.1144,10.5694C7.1144,10.5364 7.1155,10.5064 7.1209,10.4754L7.0871,10.4614L7.0516,10.4754C7.0565,10.5034 7.0571,10.5344 7.0571,10.5694C7.0571,10.7354 6.978,10.8764 6.8809,10.8764C6.804,10.8764 6.7369,10.7904 6.7135,10.6654C6.7113,10.6634 6.7091,10.6494 6.7047,10.6264C6.7042,10.6184 6.7009,10.6014 6.6982,10.5854C6.6976,10.6014 6.6965,10.6184 6.696,10.6264C6.6955,10.6494 6.6955,10.6654 6.6944,10.6714C6.6824,10.8174 6.6087,10.9284 6.5193,10.9284C6.4216,10.9284 6.3431,10.7904 6.3431,10.6184C6.3431,10.6104 6.3436,10.5994 6.3436,10.5894L6.2989,10.5094L6.276,10.6114C6.2858,10.6484 6.2913,10.6894 6.2913,10.7414C6.2913,10.9004 6.2155,11.0354 6.1227,11.0354C6.0655,11.0354 6.0131,10.9844 5.982,10.9034L5.9596,10.8534L5.9596,10.9144C5.9596,11.0334 5.9296,11.1114 5.8795,11.1294L5.8767,11.1294C5.8653,11.1294 5.8075,11.1214 5.7355,11.0184C5.6787,10.9344 5.6384,10.8624 5.6215,10.8304L5.6165,10.9084C5.6264,10.9354 5.6864,11.0964 5.7507,11.1664C5.8009,11.2194 5.8549,11.2484 5.8931,11.2364C5.9351,11.2244 5.9711,11.1644 5.9918,11.0704L5.9945,11.0564L6.0016,11.0644C6.0371,11.1034 6.0785,11.1214 6.12,11.1214C6.2138,11.1214 6.2989,11.0254 6.3333,10.8854L6.3376,10.8694L6.3442,10.8834C6.3889,10.9714 6.4522,11.0234 6.5198,11.0234C6.5924,11.0234 6.6627,10.9634 6.7069,10.8624L6.7118,10.8544L6.7173,10.8624C6.7615,10.9364 6.8198,10.9794 6.8815,10.9794C6.9622,10.9794 7.038,10.9094 7.0811,10.7904L7.086,10.7764L7.0925,10.7904C7.1367,10.9094 7.2104,10.9794 7.2922,10.9794C7.3544,10.9794 7.4122,10.9364 7.4569,10.8624L7.4618,10.8544L7.4662,10.8624C7.5109,10.9644 7.5813,11.0234 7.6544,11.0234C7.722,11.0234 7.7831,10.9714 7.8284,10.8834L7.836,10.8694L7.8409,10.8854C7.8731,11.0264 7.9587,11.1214 8.0525,11.1214C8.0951,11.1214 8.1365,11.1034 8.1725,11.0644L8.1796,11.0564Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.256,10.6551C8.2653,10.6278 8.256,10.5995 8.2369,10.5913C8.2145,10.5869 8.1905,10.6038 8.1802,10.6327C8.1698,10.6627 8.1791,10.6895 8.2004,10.6955C8.2205,10.702 8.2462,10.6851 8.256,10.6551" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.2404,10.8046L8.2404,10.8046C8.2344,10.8046 8.2284,10.8046 8.2224,10.7996C8.2044,10.7976 8.1894,10.7836 8.1804,10.7626C8.1664,10.7376 8.1654,10.7056 8.1774,10.6666C8.1984,10.6116 8.2514,10.5726 8.2944,10.5886C8.3114,10.5936 8.3274,10.6046 8.3354,10.6196C8.3494,10.6466 8.3514,10.6846 8.3394,10.7176C8.3224,10.7706 8.2814,10.8046 8.2404,10.8046ZM8.2754,10.6126C8.2464,10.6126 8.2164,10.6356 8.2014,10.6786C8.1934,10.7056 8.1934,10.7346 8.2034,10.7526C8.2094,10.7646 8.2174,10.7756 8.2284,10.7756C8.2344,10.7786 8.2374,10.7786 8.2404,10.7786C8.2704,10.7786 8.3034,10.7526 8.3164,10.7116C8.3254,10.6826 8.3244,10.6566 8.3154,10.6356C8.3104,10.6236 8.3024,10.6146 8.2874,10.6126C8.2844,10.6126 8.2814,10.6126 8.2754,10.6126Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.5164,10.5133C7.5207,10.4833 7.5049,10.4565 7.4836,10.4538C7.4624,10.4511 7.4405,10.4735 7.4378,10.5018C7.4345,10.5351 7.4476,10.5613 7.47,10.5629C7.4924,10.5645 7.512,10.5422 7.5164,10.5133" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.5079,10.6712L7.5079,10.6712C7.5069,10.6712 7.5029,10.6712 7.5029,10.6712C7.4829,10.6672 7.4679,10.6602 7.4539,10.6422C7.4349,10.6192 7.4259,10.5872 7.4329,10.5482C7.4389,10.4892 7.4839,10.4442 7.5319,10.4462C7.5499,10.4512 7.5669,10.4582 7.5789,10.4752C7.5969,10.4982 7.6049,10.5342 7.6009,10.5692C7.5919,10.6302 7.5539,10.6712 7.5079,10.6712ZM7.5219,10.4732C7.4909,10.4732 7.4609,10.5072 7.4559,10.5522C7.4529,10.5832 7.4589,10.6112 7.4729,10.6302C7.4809,10.6402 7.4919,10.6442 7.5039,10.6462C7.5369,10.6522 7.5689,10.6162 7.5759,10.5672C7.5789,10.5412 7.5739,10.5112 7.5589,10.4942C7.5499,10.4782 7.5379,10.4752 7.5259,10.4732C7.5259,10.4732 7.5249,10.4732 7.5219,10.4732Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.6584,10.5133C6.6545,10.4833 6.6682,10.4565 6.6905,10.4538C6.7129,10.4505 6.732,10.4735 6.7364,10.5018C6.7402,10.5351 6.7249,10.5613 6.7036,10.5629C6.6824,10.5645 6.6611,10.5422 6.6584,10.5133" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.7418,10.6712C6.6998,10.6712 6.6578,10.6302 6.6528,10.5692C6.6468,10.5342 6.6538,10.5012 6.6738,10.4752C6.6868,10.4572 6.7028,10.4512 6.7218,10.4462C6.7688,10.4462 6.8108,10.4892 6.8198,10.5482C6.8238,10.5872 6.8168,10.6182 6.7988,10.6422C6.7848,10.6612 6.7698,10.6672 6.7508,10.6712C6.7468,10.6712 6.7468,10.6712 6.7418,10.6712ZM6.7288,10.4732C6.7288,10.4732 6.7258,10.4732 6.7238,10.4732C6.7118,10.4752 6.7018,10.4782 6.6938,10.4942C6.6788,10.5122 6.6718,10.5412 6.6768,10.5672C6.6818,10.6162 6.7148,10.6522 6.7468,10.6462C6.7588,10.6442 6.7698,10.6402 6.7778,10.6302C6.7938,10.6102 6.7988,10.5832 6.7948,10.5522C6.7888,10.5072 6.7598,10.4732 6.7288,10.4732Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M5.9182,10.6551C5.9078,10.6278 5.9165,10.5995 5.9384,10.5913C5.958,10.5869 5.9836,10.6038 5.9935,10.6327C6.0027,10.6627 5.994,10.6895 5.9744,10.6955C5.9525,10.702 5.9285,10.6851 5.9182,10.6551" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.0117,10.8047C5.9717,10.8047 5.9327,10.7707 5.9157,10.7177C5.9037,10.6857 5.9067,10.6477 5.9177,10.6197C5.9277,10.6037 5.9407,10.5937 5.9597,10.5887C5.9647,10.5867 5.9717,10.5847 5.9797,10.5847C6.0197,10.5847 6.0597,10.6197 6.0777,10.6667C6.0897,10.7057 6.0897,10.7367 6.0747,10.7627C6.0667,10.7837 6.0517,10.7977 6.0337,10.7997C6.0257,10.8047 6.0187,10.8047 6.0117,10.8047ZM5.9787,10.6127C5.9767,10.6127 5.9707,10.6127 5.9657,10.6127C5.9527,10.6157 5.9447,10.6247 5.9407,10.6357C5.9287,10.6567 5.9287,10.6827 5.9387,10.7117C5.9527,10.7577 5.9947,10.7837 6.0237,10.7757C6.0347,10.7757 6.0447,10.7637 6.0507,10.7527C6.0607,10.7337 6.0617,10.7057 6.0517,10.6787C6.0397,10.6357 6.0077,10.6127 5.9787,10.6127Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.2389,10.1642C6.276,10.1855 6.3076,10.2236 6.3191,10.2673C6.3191,10.2673 6.3229,10.2585 6.3436,10.246C6.3638,10.2345 6.3807,10.2351 6.3807,10.2351C6.3807,10.2351 6.3753,10.2695 6.3725,10.2815C6.3698,10.2929 6.3687,10.33 6.3605,10.3611C6.3535,10.3955 6.3387,10.4205 6.3387,10.4205C6.3251,10.408 6.3055,10.4015 6.2842,10.4069C6.264,10.4096 6.2482,10.4205 6.2384,10.4369C6.2384,10.4369 6.216,10.4178 6.1969,10.3878C6.1778,10.3611 6.1647,10.3284 6.1576,10.3185C6.15,10.3071 6.1331,10.2782 6.1331,10.2782C6.1331,10.2782 6.1489,10.2716 6.1718,10.276C6.1953,10.2804 6.2035,10.2858 6.2035,10.2858C6.198,10.2416 6.2138,10.1947 6.2389,10.1642" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.3384,10.6898L6.3274,10.6818C6.3244,10.6778 6.2834,10.6428 6.2474,10.5938C6.2264,10.5568 6.2084,10.5258 6.1954,10.4978C6.1884,10.4808 6.1824,10.4648 6.1764,10.4608C6.1634,10.4398 6.1314,10.3878 6.1294,10.3848L6.1244,10.3718L6.1364,10.3678C6.1374,10.3678 6.1554,10.3618 6.1824,10.3618C6.1944,10.3618 6.2054,10.3618 6.2164,10.3648C6.2334,10.3678 6.2474,10.3698 6.2554,10.3758C6.2524,10.2998 6.2774,10.2218 6.3244,10.1588L6.3314,10.1538L6.3404,10.1588C6.4104,10.2028 6.4634,10.2678 6.4864,10.3388C6.4924,10.3308 6.5044,10.3228 6.5204,10.3158C6.5574,10.2928 6.5884,10.2928 6.5944,10.2928L6.6104,10.2928L6.6074,10.3068C6.6074,10.3108 6.5974,10.3698 6.5924,10.3928C6.5894,10.3988 6.5874,10.4148 6.5874,10.4338C6.5844,10.4618 6.5814,10.5038 6.5714,10.5378C6.5574,10.5988 6.5314,10.6478 6.5294,10.6498L6.5224,10.6648L6.5104,10.6528C6.4874,10.6318 6.4534,10.6248 6.4214,10.6298C6.3884,10.6338 6.3614,10.6528 6.3464,10.6788L6.3384,10.6898ZM6.1604,10.3888C6.1714,10.4098 6.1894,10.4328 6.1974,10.4468C6.2034,10.4568 6.2104,10.4678 6.2184,10.4878C6.2324,10.5128 6.2484,10.5508 6.2704,10.5798C6.2934,10.6128 6.3184,10.6438 6.3344,10.6518C6.3534,10.6288 6.3824,10.6088 6.4174,10.6048C6.4524,10.5968 6.4874,10.6048 6.5164,10.6258C6.5234,10.6048 6.5394,10.5738 6.5474,10.5328C6.5584,10.4978 6.5594,10.4568 6.5644,10.4308C6.5644,10.4098 6.5654,10.3938 6.5684,10.3858C6.5704,10.3698 6.5764,10.3388 6.5814,10.3188C6.5694,10.3218 6.5524,10.3238 6.5344,10.3398C6.5004,10.3558 6.4934,10.3688 6.4934,10.3688L6.4764,10.3938L6.4694,10.3658C6.4514,10.2988 6.4034,10.2298 6.3374,10.1848C6.2934,10.2478 6.2734,10.3238 6.2814,10.3938L6.2844,10.4328L6.2594,10.4098L6.2594,10.4098C6.2594,10.4098 6.2464,10.3938 6.2114,10.3908C6.1944,10.3858 6.1724,10.3858 6.1604,10.3888Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.2553,10.5144C6.2427,10.5067 6.234,10.4942 6.2318,10.4773C6.2291,10.4636 6.2329,10.4489 6.2395,10.4364C6.2395,10.4364 6.2095,10.4211 6.1762,10.4124C6.1516,10.4069 6.1085,10.4058 6.0949,10.4058C6.0813,10.4047 6.054,10.4042 6.054,10.4042C6.054,10.4042 6.0573,10.4107 6.0638,10.4233C6.0731,10.4375 6.0818,10.4495 6.0818,10.4495C6.0382,10.4593 6,10.4876 5.9776,10.5231C6.0115,10.5455 6.0578,10.5602 6.102,10.5531C6.102,10.5531 6.0982,10.5656 6.0955,10.5864C6.0927,10.6 6.0927,10.6044 6.0927,10.6044C6.0927,10.6044 6.1178,10.5978 6.1298,10.5918C6.1418,10.5875 6.1827,10.5749 6.2051,10.5607C6.2313,10.54 6.2553,10.5144 6.2553,10.5144" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.1838,10.799L6.1838,10.779C6.1838,10.777 6.1838,10.769 6.1878,10.742C6.1898,10.722 6.1928,10.707 6.1958,10.699C6.1198,10.705 6.0428,10.681 5.9768,10.636L5.9678,10.628L5.9728,10.616C6.0198,10.555 6.0848,10.507 6.1548,10.487C6.1488,10.473 6.1428,10.464 6.1328,10.448C6.1198,10.425 6.1138,10.417 6.1138,10.417L6.1078,10.396L6.1258,10.398C6.1258,10.398 6.1758,10.399 6.2008,10.399L6.2058,10.399C6.2378,10.399 6.3088,10.401 6.3548,10.415C6.4138,10.425 6.4708,10.456 6.4718,10.458L6.4838,10.464L6.4778,10.472C6.4648,10.495 6.4608,10.519 6.4648,10.542C6.4678,10.565 6.4828,10.589 6.5018,10.605L6.4958,10.613L6.5038,10.627C6.5018,10.629 6.4608,10.672 6.4078,10.705C6.3728,10.73 6.3088,10.754 6.2778,10.766L6.1838,10.799ZM6.2308,10.676L6.2258,10.692C6.2248,10.692 6.2178,10.712 6.2128,10.747C6.2118,10.753 6.2098,10.755 6.2098,10.764L6.2668,10.743C6.2968,10.731 6.3608,10.708 6.3948,10.684C6.4308,10.661 6.4608,10.629 6.4778,10.614C6.4578,10.598 6.4438,10.575 6.4398,10.55C6.4358,10.523 6.4378,10.497 6.4488,10.474C6.4308,10.466 6.3898,10.451 6.3488,10.441C6.3068,10.427 6.2318,10.427 6.2058,10.427L6.2008,10.427C6.1848,10.425 6.1628,10.425 6.1478,10.425C6.1498,10.427 6.1528,10.435 6.1558,10.443C6.1728,10.469 6.1848,10.49 6.1848,10.49L6.1978,10.5L6.1788,10.508C6.1108,10.522 6.0468,10.566 6.0028,10.625C6.0658,10.662 6.1398,10.684 6.2108,10.678L6.2308,10.678L6.2308,10.676Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.3535,10.4991C6.3605,10.4876 6.3638,10.4718 6.3611,10.4582C6.3584,10.4413 6.3507,10.4282 6.3382,10.4211C6.3382,10.4211 6.3611,10.3955 6.3895,10.3753C6.4107,10.3616 6.4516,10.3475 6.4636,10.3442C6.4756,10.3376 6.5007,10.3316 6.5007,10.3316C6.5007,10.3316 6.5007,10.336 6.498,10.3496C6.4958,10.3698 6.4915,10.3818 6.4915,10.3818C6.5362,10.3742 6.582,10.3916 6.6158,10.414C6.5935,10.4484 6.5553,10.4767 6.5111,10.4871C6.5111,10.4871 6.5198,10.4985 6.5291,10.5127C6.5362,10.5264 6.5395,10.5324 6.5395,10.5324C6.5395,10.5324 6.5122,10.5313 6.4985,10.5302C6.4855,10.5302 6.4418,10.5302 6.4173,10.5236C6.384,10.5149 6.3535,10.5007 6.3535,10.5007" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.7338,10.7211L6.7148,10.7211C6.7148,10.7211 6.6648,10.7191 6.6408,10.7191L6.6338,10.7191C6.6048,10.7161 6.5318,10.7161 6.4878,10.7041C6.4288,10.6901 6.3708,10.6611 6.3688,10.6591L6.3748,10.6481L6.3638,10.6451C6.3758,10.6221 6.3818,10.5981 6.3758,10.5751C6.3728,10.5521 6.3588,10.5281 6.3398,10.5121L6.3278,10.5041L6.3378,10.4901C6.3388,10.4881 6.3808,10.4451 6.4328,10.4101C6.4708,10.3871 6.5418,10.3631 6.5678,10.3471C6.5938,10.3391 6.6378,10.3241 6.6378,10.3241L6.6548,10.3191L6.6548,10.3381C6.6548,10.3401 6.6548,10.3481 6.6508,10.3771C6.6498,10.3931 6.6458,10.4081 6.6438,10.4161C6.7208,10.4131 6.7958,10.4371 6.8628,10.4801L6.8728,10.4881L6.8668,10.5021C6.8198,10.5611 6.7558,10.6091 6.6858,10.6291C6.6908,10.6411 6.6978,10.6501 6.7058,10.6681C6.7208,10.6911 6.7258,10.6991 6.7258,10.6991L6.7338,10.7211ZM6.3918,10.6461C6.4118,10.6521 6.4528,10.6691 6.4938,10.6791C6.5358,10.6931 6.6058,10.6931 6.6348,10.6931L6.6418,10.6931C6.6578,10.6931 6.6798,10.6931 6.6948,10.6961C6.6938,10.6931 6.6898,10.6851 6.6878,10.6771C6.6698,10.6521 6.6568,10.6301 6.6568,10.6301L6.6438,10.6201L6.6638,10.6121C6.7308,10.5981 6.7948,10.5541 6.8398,10.4971C6.7748,10.4581 6.6998,10.4341 6.6298,10.4421L6.6108,10.4421L6.6168,10.4261C6.6168,10.4261 6.6238,10.4061 6.6288,10.3711C6.6298,10.3661 6.6308,10.3631 6.6318,10.3551C6.6168,10.3631 6.5948,10.3691 6.5818,10.3711L6.5798,10.3711C6.5568,10.3851 6.4838,10.4101 6.4478,10.4341C6.4118,10.4571 6.3838,10.4871 6.3658,10.5041C6.3858,10.5201 6.3988,10.5431 6.4028,10.5681C6.4058,10.5951 6.4038,10.6231 6.3918,10.6461Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M6.2236,10.4664C6.2236,10.4271 6.2564,10.3949 6.2978,10.3949C6.3387,10.3949 6.3736,10.4271 6.3736,10.4664C6.3736,10.5056 6.3393,10.5384 6.2978,10.5384C6.2564,10.5384 6.2236,10.5062 6.2236,10.4664" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.3641,10.6763C6.2811,10.6763 6.2171,10.6133 6.2171,10.5323C6.2171,10.4543 6.2811,10.3873 6.3641,10.3873C6.4471,10.3873 6.5151,10.4533 6.5151,10.5323C6.5151,10.6133 6.4471,10.6763 6.3641,10.6763ZM6.3641,10.4133C6.2961,10.4133 6.2401,10.4703 6.2401,10.5323C6.2401,10.5963 6.2961,10.6513 6.3641,10.6513C6.4331,10.6513 6.4901,10.5963 6.4901,10.5323C6.4911,10.4703 6.4331,10.4133 6.3641,10.4133Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.0849,10.0502C7.1209,10.0802 7.1487,10.1309 7.1525,10.1811C7.1525,10.1811 7.1591,10.1702 7.1836,10.1642C7.2082,10.1538 7.2278,10.1565 7.2278,10.1565C7.2278,10.1565 7.2142,10.1936 7.2087,10.2067C7.2033,10.2198 7.1951,10.2591 7.1793,10.2929C7.1651,10.3289 7.1438,10.3556 7.1438,10.3556C7.1302,10.3387 7.1084,10.3289 7.0865,10.3289C7.0631,10.3289 7.0418,10.3387 7.0293,10.3556C7.0293,10.3556 7.0064,10.3289 6.9916,10.2929C6.9764,10.2585 6.9682,10.2193 6.9627,10.2067C6.9573,10.1942 6.9431,10.1565 6.9431,10.1565C6.9431,10.1565 6.9627,10.1538 6.9873,10.1642C7.0129,10.1707 7.0195,10.1811 7.0195,10.1811C7.0227,10.1309 7.0489,10.0796 7.0849,10.0502" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.3179,10.6364L7.3079,10.6254C7.2829,10.5974 7.2479,10.5814 7.2129,10.5814C7.1739,10.5814 7.1389,10.5974 7.1149,10.6254L7.1059,10.6364L7.0959,10.6254C7.0959,10.6204 7.0549,10.5734 7.0279,10.5094C7.0099,10.4684 6.9969,10.4254 6.9889,10.3924C6.9839,10.3714 6.9789,10.3594 6.9749,10.3474C6.9649,10.3244 6.9399,10.2614 6.9389,10.2574L6.9349,10.2454L6.9499,10.2454C6.9499,10.2454 6.9859,10.2314 7.0379,10.2534C7.0559,10.2594 7.0719,10.2694 7.0799,10.2744C7.0919,10.1884 7.1369,10.1044 7.2019,10.0444L7.2109,10.0404L7.2189,10.0444C7.2859,10.1074 7.3309,10.1904 7.3439,10.2734C7.3549,10.2684 7.3679,10.2584 7.3899,10.2524C7.4389,10.2314 7.4769,10.2424 7.4769,10.2444L7.4889,10.2444L7.4849,10.2564C7.4839,10.2604 7.4609,10.3224 7.4489,10.3464C7.4469,10.3584 7.4419,10.3694 7.4369,10.3914C7.4269,10.4244 7.4149,10.4674 7.3959,10.5084C7.3689,10.5724 7.3319,10.6194 7.3289,10.6244L7.3179,10.6364ZM6.9669,10.2674C6.9759,10.2874 6.9899,10.3244 6.9959,10.3394C7.0009,10.3474 7.0069,10.3654 7.0129,10.3864C7.0189,10.4174 7.0319,10.4614 7.0489,10.5014C7.0699,10.5444 7.0949,10.5794 7.1069,10.5974C7.1359,10.5744 7.1709,10.5564 7.2119,10.5564C7.2509,10.5564 7.2879,10.5744 7.3159,10.5974C7.3289,10.5794 7.3529,10.5444 7.3719,10.5014C7.3889,10.4624 7.4009,10.4174 7.4119,10.3864C7.4169,10.3654 7.4219,10.3474 7.4259,10.3394C7.4339,10.3234 7.4469,10.2864 7.4549,10.2674C7.4409,10.2694 7.4199,10.2694 7.3949,10.2774C7.3539,10.2934 7.3429,10.3024 7.3429,10.3044L7.3229,10.3294L7.3209,10.2984C7.3149,10.2204 7.2739,10.1344 7.2099,10.0734C7.1469,10.1344 7.1069,10.2184 7.1009,10.2984L7.1009,10.3324L7.0799,10.3024L7.0799,10.3024C7.0799,10.3024 7.0679,10.2924 7.0279,10.2774C7.0019,10.2694 6.9829,10.2674 6.9669,10.2674Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.0287,10.4462C7.0178,10.4336 7.0102,10.4173 7.0102,10.3993C7.0102,10.3824 7.0173,10.366 7.0287,10.3545C7.0287,10.3545 6.9971,10.3311 6.9622,10.3153C6.9355,10.3038 6.888,10.2945 6.8722,10.2929C6.858,10.2896 6.8285,10.2831 6.8285,10.2831C6.8285,10.2831 6.8302,10.2918 6.8356,10.3055C6.8433,10.3256 6.8493,10.3387 6.8493,10.3387C6.798,10.3431 6.75,10.3687 6.7173,10.3993C6.75,10.4336 6.798,10.4587 6.8493,10.4604C6.8493,10.4604 6.8427,10.4729 6.8356,10.492C6.8302,10.51 6.8285,10.5144 6.8285,10.5144C6.8285,10.5144 6.858,10.51 6.8722,10.5078C6.888,10.5035 6.9355,10.4969 6.9622,10.4844C6.9971,10.4685 7.0287,10.4462 7.0287,10.4462" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.9145,10.7304L6.9165,10.7144C6.9165,10.7144 6.9205,10.7004 6.9305,10.6674C6.9375,10.6514 6.9445,10.6364 6.9485,10.6244C6.8625,10.6154 6.7805,10.5734 6.7155,10.5154L6.7085,10.5034L6.7155,10.4954C6.7805,10.4324 6.8635,10.3904 6.9485,10.3814C6.9445,10.3704 6.9375,10.3554 6.9305,10.3374C6.9205,10.3084 6.9165,10.2924 6.9165,10.2924L6.9145,10.2744L7.0195,10.2924C7.0545,10.3024 7.1335,10.3154 7.1785,10.3374C7.2425,10.3644 7.3005,10.4074 7.3005,10.4094L7.3125,10.4194L7.3035,10.4284C7.2835,10.4494 7.2745,10.4774 7.2745,10.5034C7.2745,10.5284 7.2845,10.5584 7.3055,10.5794L7.2955,10.5894L7.3025,10.5974C7.3015,10.5974 7.2425,10.6424 7.1785,10.6674C7.1365,10.6904 7.0605,10.7064 7.0255,10.7114L6.9145,10.7304ZM6.7435,10.5034C6.8055,10.5644 6.8865,10.5974 6.9675,10.6034L6.9865,10.6054L6.9795,10.6214C6.9795,10.6214 6.9665,10.6444 6.9545,10.6824C6.9505,10.6894 6.9485,10.6944 6.9455,10.7034L7.0215,10.6884C7.0565,10.6834 7.1305,10.6664 7.1705,10.6444C7.2155,10.6264 7.2595,10.5974 7.2785,10.5874C7.2615,10.5644 7.2505,10.5304 7.2505,10.5034C7.2505,10.4754 7.2615,10.4484 7.2785,10.4254C7.2595,10.4094 7.2155,10.3814 7.1705,10.3614C7.1265,10.3404 7.0505,10.3284 7.0155,10.3184L6.9465,10.3084C6.9495,10.3144 6.9505,10.3184 6.9555,10.3314C6.9675,10.3624 6.9805,10.3864 6.9805,10.3864L6.9875,10.4024L6.9685,10.4054C6.8895,10.4104 6.8055,10.4494 6.7435,10.5034Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.1422,10.4462C7.1536,10.4336 7.1596,10.4173 7.1596,10.3993C7.1596,10.3824 7.1531,10.366 7.1427,10.3545C7.1427,10.3545 7.1727,10.3311 7.2076,10.3153C7.2344,10.3038 7.2835,10.2945 7.2976,10.2929C7.3129,10.2896 7.3418,10.2831 7.3418,10.2831C7.3418,10.2831 7.3413,10.2918 7.3353,10.3055C7.3282,10.3256 7.3216,10.3387 7.3216,10.3387C7.3724,10.3431 7.4204,10.3687 7.4536,10.3993C7.4204,10.4336 7.3729,10.4587 7.3216,10.4604C7.3216,10.4604 7.3282,10.4729 7.3353,10.492C7.3407,10.51 7.3418,10.5144 7.3418,10.5144C7.3418,10.5144 7.3129,10.51 7.2976,10.5078C7.2835,10.5035 7.2344,10.4969 7.2076,10.4844C7.1727,10.4685 7.1422,10.4462 7.1422,10.4462" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.5324,10.7304L7.4204,10.7114C7.3834,10.7064 7.3104,10.6904 7.2654,10.6674C7.2014,10.6424 7.1454,10.5974 7.1414,10.5974L7.1494,10.5894L7.1414,10.5794C7.1594,10.5584 7.1704,10.5284 7.1704,10.5034C7.1704,10.4774 7.1594,10.4484 7.1414,10.4284L7.1324,10.4194L7.1434,10.4094C7.1474,10.4074 7.2014,10.3644 7.2654,10.3374C7.3114,10.3164 7.3934,10.3024 7.4274,10.2924L7.5314,10.2744L7.5284,10.2924C7.5284,10.2924 7.5274,10.3084 7.5164,10.3374C7.5104,10.3554 7.5034,10.3714 7.4984,10.3814C7.5804,10.3904 7.6654,10.4334 7.7284,10.4954L7.7394,10.5034L7.7284,10.5154C7.6654,10.5744 7.5814,10.6164 7.4984,10.6244C7.5034,10.6364 7.5104,10.6514 7.5164,10.6674C7.5264,10.7004 7.5284,10.7144 7.5284,10.7144L7.5324,10.7304ZM7.1684,10.5874C7.1894,10.5974 7.2294,10.6264 7.2764,10.6444C7.3184,10.6654 7.3894,10.6834 7.4234,10.6884L7.4984,10.7034C7.4984,10.6934 7.4954,10.6884 7.4934,10.6824C7.4814,10.6454 7.4704,10.6214 7.4704,10.6214L7.4584,10.6054L7.4784,10.6034C7.5584,10.5974 7.6394,10.5644 7.7044,10.5034C7.6394,10.4484 7.5574,10.4094 7.4784,10.4044L7.4584,10.4014L7.4704,10.3854C7.4704,10.3854 7.4824,10.3624 7.4934,10.3304C7.4954,10.3164 7.4984,10.3124 7.4984,10.3074L7.4304,10.3174C7.3974,10.3274 7.3194,10.3384 7.2754,10.3604C7.2284,10.3814 7.1884,10.4094 7.1694,10.4244C7.1874,10.4474 7.1944,10.4744 7.1944,10.5024C7.1954,10.5334 7.1864,10.5644 7.1684,10.5874Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.9342,10.1642C7.8982,10.1855 7.866,10.2236 7.8545,10.2673C7.8545,10.2673 7.8496,10.2585 7.8305,10.246C7.8093,10.2345 7.7924,10.2351 7.7924,10.2351C7.7924,10.2351 7.7989,10.2695 7.8016,10.2815C7.8049,10.2929 7.8055,10.33 7.812,10.3611C7.8207,10.3955 7.8349,10.4205 7.8349,10.4205C7.8491,10.408 7.8698,10.4015 7.8889,10.4069C7.9091,10.4096 7.9255,10.4205 7.9353,10.4369C7.9353,10.4369 7.9582,10.4178 7.9767,10.3878C7.9953,10.3611 8.0089,10.3284 8.016,10.3185C8.0231,10.3071 8.0405,10.2782 8.0405,10.2782C8.0405,10.2782 8.0242,10.2716 8.0007,10.276C7.9778,10.2804 7.9707,10.2858 7.9707,10.2858C7.9751,10.2416 7.9609,10.1947 7.9342,10.1642" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.0572,10.6912L8.0502,10.6772C8.0342,10.6522 8.0052,10.6322 7.9742,10.6282C7.9402,10.6232 7.9092,10.6302 7.8832,10.6512L7.8712,10.6632L7.8642,10.6482C7.8642,10.6462 7.8382,10.5962 7.8222,10.5362C7.8142,10.5032 7.8102,10.4622 7.8082,10.4322C7.8052,10.4142 7.8052,10.3972 7.8042,10.3912C7.7992,10.3682 7.7872,10.3092 7.7872,10.3052L7.7842,10.2912L7.7992,10.2912L7.7992,10.2912C7.8052,10.2912 7.8372,10.2912 7.8762,10.3142C7.8892,10.3222 7.8992,10.3302 7.9082,10.3372C7.9332,10.2672 7.9862,10.2012 8.0522,10.1572L8.0632,10.1522L8.0682,10.1572C8.1152,10.2202 8.1412,10.2982 8.1382,10.3742C8.1482,10.3682 8.1612,10.3662 8.1782,10.3632C8.1892,10.3602 8.1992,10.3602 8.2102,10.3602C8.2382,10.3602 8.2552,10.3662 8.2552,10.3662L8.2712,10.3702L8.2622,10.3842C8.2622,10.3872 8.2312,10.4392 8.2172,10.4602C8.2142,10.4622 8.2072,10.4782 8.1982,10.4952C8.1852,10.5242 8.1682,10.5562 8.1452,10.5932C8.1102,10.6422 8.0682,10.6772 8.0682,10.6812L8.0572,10.6912ZM7.9552,10.6032C7.9632,10.6032 7.9702,10.6032 7.9772,10.6052C8.0102,10.6092 8.0412,10.6282 8.0632,10.6522C8.0752,10.6442 8.1042,10.6132 8.1272,10.5802C8.1462,10.5512 8.1632,10.5122 8.1772,10.4862C8.1862,10.4662 8.1922,10.4572 8.1982,10.4472C8.2062,10.4332 8.2232,10.4102 8.2332,10.3892C8.2212,10.3862 8.2022,10.3862 8.1832,10.3912C8.1452,10.3942 8.1342,10.4102 8.1342,10.4102L8.1112,10.4312L8.1132,10.3942C8.1222,10.3242 8.1002,10.2482 8.0572,10.1852C7.9932,10.2302 7.9432,10.2982 7.9252,10.3662L7.9162,10.3962L7.9022,10.3692L7.9022,10.3692C7.9022,10.3692 7.8922,10.3552 7.8622,10.3402C7.8422,10.3242 7.8252,10.3222 7.8142,10.3192C7.8172,10.3402 7.8222,10.3712 7.8292,10.3862C7.8292,10.3942 7.8312,10.4092 7.8342,10.4332C7.8342,10.4612 7.8392,10.4972 7.8462,10.5332C7.8582,10.5742 7.8712,10.6052 7.8812,10.6262C7.9022,10.6092 7.9282,10.6032 7.9552,10.6032Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.9195,10.5144C7.9304,10.5067 7.9396,10.4942 7.9429,10.4773C7.9456,10.4636 7.9429,10.4489 7.9342,10.4364C7.9342,10.4364 7.9653,10.4211 7.9969,10.4124C8.0225,10.4069 8.0673,10.4058 8.0798,10.4058C8.0924,10.4047 8.1185,10.4042 8.1185,10.4042C8.1185,10.4042 8.1169,10.4107 8.1087,10.4233C8.1,10.4375 8.0924,10.4495 8.0924,10.4495C8.136,10.4593 8.1725,10.4876 8.1971,10.5231C8.1627,10.5455 8.1175,10.5602 8.0722,10.5531C8.0722,10.5531 8.076,10.5656 8.0793,10.5864C8.0809,10.6 8.0804,10.6044 8.0804,10.6044C8.0804,10.6044 8.0564,10.5978 8.0444,10.5918C8.0318,10.5875 7.9898,10.5749 7.9696,10.5607C7.9429,10.54 7.9195,10.5144 7.9195,10.5144" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.233,10.799L8.143,10.766C8.111,10.754 8.047,10.731 8.01,10.705C7.961,10.672 7.916,10.629 7.914,10.627L7.924,10.613L7.915,10.605C7.937,10.589 7.949,10.566 7.956,10.542C7.959,10.519 7.956,10.495 7.942,10.472L7.934,10.464L7.946,10.458C7.949,10.456 8.003,10.425 8.065,10.415C8.108,10.401 8.181,10.399 8.213,10.399L8.218,10.399C8.241,10.399 8.288,10.398 8.288,10.398L8.306,10.396L8.3,10.417C8.3,10.417 8.297,10.425 8.282,10.448C8.275,10.464 8.266,10.473 8.26,10.487C8.331,10.507 8.397,10.555 8.442,10.616L8.45,10.628L8.44,10.636C8.376,10.681 8.294,10.703 8.221,10.699C8.224,10.709 8.226,10.722 8.229,10.742C8.233,10.769 8.233,10.777 8.232,10.779L8.233,10.799ZM7.942,10.613C7.955,10.629 7.989,10.66 8.025,10.683C8.057,10.706 8.122,10.73 8.149,10.742L8.207,10.763C8.207,10.754 8.207,10.752 8.207,10.746C8.202,10.711 8.194,10.691 8.194,10.691L8.188,10.675L8.207,10.675C8.277,10.681 8.354,10.659 8.416,10.622C8.371,10.563 8.307,10.518 8.238,10.505L8.218,10.497L8.23,10.487C8.23,10.487 8.246,10.466 8.261,10.44C8.265,10.432 8.268,10.424 8.271,10.422C8.253,10.422 8.231,10.422 8.218,10.424L8.213,10.424C8.183,10.424 8.113,10.424 8.071,10.438C8.028,10.448 7.988,10.463 7.967,10.471C7.978,10.494 7.984,10.52 7.978,10.547C7.972,10.574 7.961,10.598 7.942,10.613Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.8213,10.4991C7.8125,10.4876 7.8087,10.4718 7.8115,10.4582C7.8147,10.4413 7.8235,10.4282 7.8344,10.4211C7.8344,10.4211 7.8115,10.3955 7.7836,10.3753C7.7635,10.3616 7.7215,10.3475 7.7089,10.3442C7.6964,10.3376 7.6724,10.3316 7.6724,10.3316C7.6724,10.3316 7.6724,10.336 7.674,10.3496C7.6767,10.3698 7.6805,10.3818 7.6805,10.3818C7.6358,10.3742 7.5905,10.3916 7.5562,10.414C7.5807,10.4484 7.6178,10.4767 7.6609,10.4871C7.6609,10.4871 7.6538,10.4985 7.6445,10.5127C7.6369,10.5258 7.6364,10.5318 7.6364,10.5318C7.6364,10.5318 7.662,10.5307 7.6745,10.5296C7.6876,10.5296 7.7318,10.5296 7.7575,10.5231C7.7896,10.5144 7.8207,10.5002 7.8207,10.5002" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.6919,10.7206L7.6979,10.6996C7.6979,10.6996 7.7009,10.6916 7.7149,10.6686C7.7219,10.6506 7.7309,10.6416 7.7369,10.6296C7.6649,10.6096 7.5989,10.5616 7.5549,10.5026L7.5469,10.4886L7.5569,10.4806C7.6219,10.4366 7.7029,10.4136 7.7759,10.4166C7.7729,10.4086 7.7709,10.3936 7.7679,10.3776C7.7639,10.3486 7.7639,10.3406 7.7639,10.3386L7.7639,10.3196L7.7799,10.3246C7.7799,10.3246 7.8259,10.3406 7.8499,10.3476L7.8509,10.3476C7.8779,10.3636 7.9489,10.3866 7.9879,10.4106C8.0379,10.4456 8.0809,10.4886 8.0839,10.4906L8.0919,10.5046L8.0819,10.5126C8.0609,10.5286 8.0489,10.5516 8.0419,10.5756C8.0389,10.5986 8.0429,10.6226 8.0579,10.6456L8.0469,10.6486L8.0529,10.6596C8.0489,10.6616 7.9939,10.6906 7.9319,10.7046C7.8899,10.7166 7.8179,10.7166 7.7859,10.7196L7.7809,10.7196C7.7579,10.7196 7.7109,10.7216 7.7109,10.7216L7.6919,10.7216L7.6919,10.7206ZM7.5829,10.4976C7.6289,10.5556 7.6929,10.5996 7.7619,10.6126L7.7819,10.6206L7.7699,10.6306C7.7699,10.6306 7.7539,10.6516 7.7389,10.6776C7.7349,10.6856 7.7319,10.6936 7.7289,10.6966C7.7469,10.6936 7.7689,10.6936 7.7819,10.6936L7.7889,10.6936C7.8189,10.6936 7.8889,10.6936 7.9289,10.6796C7.9719,10.6696 8.0129,10.6526 8.0329,10.6466C8.0209,10.6236 8.0159,10.5976 8.0209,10.5706C8.0269,10.5456 8.0389,10.5216 8.0569,10.5066C8.0439,10.4886 8.0109,10.4596 7.9749,10.4366C7.9389,10.4136 7.8709,10.3896 7.8459,10.3736L7.8409,10.3736C7.8279,10.3716 7.8069,10.3656 7.7929,10.3576C7.7929,10.3656 7.7929,10.3686 7.7939,10.3736C7.7979,10.4086 7.8049,10.4286 7.8059,10.4286L7.8119,10.4446L7.7929,10.4446C7.7219,10.4346 7.6459,10.4586 7.5829,10.4976Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M7.8016,10.4664C7.8016,10.4271 7.8344,10.3949 7.8758,10.3949C7.9178,10.3949 7.9516,10.4271 7.9516,10.4664C7.9516,10.5056 7.9173,10.5384 7.8758,10.5384C7.8344,10.5384 7.8016,10.5062 7.8016,10.4664" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.943,10.6763C7.861,10.6763 7.794,10.6133 7.794,10.5323C7.794,10.4543 7.861,10.3873 7.943,10.3873C8.026,10.3873 8.095,10.4533 8.095,10.5323C8.096,10.6133 8.026,10.6763 7.943,10.6763ZM7.943,10.4133C7.874,10.4133 7.82,10.4703 7.82,10.5323C7.82,10.5963 7.874,10.6513 7.943,10.6513C8.013,10.6513 8.069,10.5963 8.069,10.5323C8.069,10.4703 8.014,10.4133 7.943,10.4133Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M8.64,10.6251C8.6225,10.6049 8.5849,10.6115 8.5587,10.6327C8.5315,10.6551 8.5233,10.6905 8.5407,10.7085C8.5587,10.7276 8.5958,10.7244 8.6225,10.702C8.6487,10.6764 8.6575,10.6425 8.64,10.6251" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.6099,10.8299L8.6099,10.8299C8.5839,10.8299 8.5599,10.8199 8.5449,10.8069C8.5299,10.7889 8.5249,10.7679 8.5249,10.7439C8.5249,10.7129 8.5459,10.6739 8.5769,10.6479C8.6069,10.6219 8.6449,10.6049 8.6799,10.6049C8.7059,10.6049 8.7299,10.6189 8.7449,10.6319C8.7599,10.6479 8.7659,10.6679 8.7649,10.6919C8.7649,10.7239 8.7439,10.7619 8.7129,10.7909C8.6819,10.8139 8.6439,10.8299 8.6099,10.8299ZM8.6789,10.6309C8.6509,10.6309 8.6179,10.6459 8.5949,10.6659C8.5669,10.6889 8.5499,10.7189 8.5479,10.7439C8.5479,10.7649 8.5529,10.7789 8.5629,10.7889C8.5879,10.8139 8.6519,10.8069 8.6939,10.7689C8.7239,10.7459 8.7399,10.7179 8.7409,10.6889C8.7409,10.6729 8.7359,10.6619 8.7269,10.6499C8.7159,10.6409 8.7009,10.6309 8.6789,10.6309Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.5342,10.6693C8.538,10.6567 8.5456,10.6425 8.5587,10.6333C8.5855,10.612 8.6225,10.6055 8.64,10.6256C8.6427,10.6284 8.6449,10.63 8.6465,10.6333C8.6465,10.6333 8.6847,10.5618 8.7295,10.5378C8.7742,10.5138 8.8511,10.5204 8.8511,10.5204C8.8511,10.4636 8.8053,10.4211 8.7469,10.4211C8.7131,10.4211 8.6804,10.4336 8.6613,10.4593L8.6531,10.4211C8.6531,10.4211 8.6062,10.4309 8.5849,10.4849C8.5636,10.5378 8.586,10.6158 8.586,10.6158C8.586,10.6158 8.5751,10.5815 8.5571,10.5613C8.5402,10.5373 8.4949,10.5133 8.4704,10.5018C8.448,10.4904 8.4235,10.4751 8.4235,10.4751C8.4235,10.4751 8.4229,10.4811 8.4229,10.4975C8.4213,10.5133 8.4229,10.5247 8.4229,10.5247C8.3793,10.5187 8.3302,10.5264 8.2898,10.54C8.3067,10.5744 8.3389,10.6038 8.3809,10.6207C8.3809,10.6207 8.3651,10.6322 8.3515,10.6464C8.3395,10.6573 8.3362,10.6633 8.3362,10.6633C8.3362,10.6633 8.3656,10.6676 8.3809,10.6687C8.3951,10.672 8.4447,10.6796 8.4736,10.678C8.4949,10.6764 8.5184,10.6731 8.5342,10.6693" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.5965,10.9128L8.5965,10.9128C8.5512,10.9128 8.4917,10.9028 8.4624,10.8968L8.3566,10.8808L8.3661,10.8668C8.367,10.8648 8.3746,10.8548 8.3935,10.8338C8.4076,10.8198 8.4208,10.8078 8.4322,10.7988C8.368,10.7658 8.316,10.7168 8.2868,10.6538L8.2811,10.6408L8.2934,10.6378C8.3595,10.6108 8.4435,10.5968 8.5143,10.6008C8.5134,10.5938 8.5134,10.5778 8.5143,10.5658C8.5162,10.5368 8.5162,10.5258 8.5162,10.5238L8.5209,10.5048L8.536,10.5168C8.536,10.5188 8.5767,10.5438 8.6154,10.5678C8.6352,10.5758 8.7315,10.6228 8.7712,10.6718C8.775,10.6818 8.7787,10.6858 8.7825,10.6928C8.7778,10.6458 8.7778,10.5888 8.7986,10.5388C8.8382,10.4348 8.9204,10.4138 8.9251,10.4118L8.9383,10.4118L8.9496,10.4708C8.9827,10.4338 9.0356,10.4118 9.0894,10.4118C9.197,10.4118 9.2811,10.4978 9.2811,10.6088L9.2811,10.6208L9.2679,10.6208C9.2679,10.6208 9.2518,10.6198 9.2301,10.6198C9.1904,10.6198 9.1149,10.6228 9.0639,10.6518C8.9903,10.6928 8.926,10.8238 8.926,10.8258L8.9147,10.8468L8.9024,10.8268C8.9024,10.8208 8.8958,10.8128 8.893,10.8108C8.8835,10.8008 8.8694,10.7908 8.8486,10.7908C8.8222,10.7908 8.791,10.8058 8.7693,10.8258C8.7485,10.8458 8.7362,10.8668 8.7296,10.8888L8.7259,10.8968L8.7183,10.8968C8.6937,10.9028 8.6522,10.9068 8.6135,10.9108C8.6078,10.9128 8.6031,10.9128 8.5965,10.9128ZM8.3982,10.8638L8.4643,10.8738C8.4926,10.8798 8.553,10.8878 8.5965,10.8878L8.5965,10.8878C8.6031,10.8878 8.6088,10.8878 8.6144,10.8858C8.6465,10.8818 8.6843,10.8798 8.7079,10.8738C8.7183,10.8508 8.7325,10.8268 8.7523,10.8098C8.7674,10.7978 8.7806,10.7888 8.7967,10.7808C8.7901,10.7628 8.7731,10.7178 8.7495,10.6918C8.7259,10.6568 8.655,10.6168 8.604,10.5908C8.5795,10.5768 8.553,10.5598 8.537,10.5488C8.537,10.5538 8.537,10.5598 8.537,10.5698C8.5351,10.5988 8.537,10.6168 8.537,10.6168L8.5379,10.6348L8.5238,10.6308C8.4596,10.6228 8.3765,10.6328 8.3123,10.6558C8.3425,10.7138 8.3972,10.7598 8.4567,10.7838L8.4756,10.7888L8.4596,10.8048C8.4596,10.8048 8.4341,10.8278 8.4095,10.8518C8.4048,10.8558 8.4029,10.8578 8.3982,10.8638ZM8.8486,10.7658C8.8732,10.7658 8.8958,10.7798 8.91,10.7928C8.9109,10.7928 8.9109,10.7928 8.9128,10.7948C8.9326,10.7558 8.9865,10.6668 9.0507,10.6308C9.1026,10.5998 9.1772,10.5948 9.2282,10.5948C9.2395,10.5948 9.248,10.5948 9.2547,10.5948C9.248,10.5058 9.1772,10.4358 9.0866,10.4358C9.029,10.4358 8.9799,10.4588 8.9468,10.5038L8.9317,10.5248L8.9157,10.4438C8.8939,10.4518 8.8429,10.4778 8.8174,10.5478C8.7863,10.6248 8.8108,10.7398 8.8184,10.7718C8.8297,10.7678 8.8392,10.7658 8.8486,10.7658Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M5.6411,10.6693C5.6373,10.6567 5.6291,10.6425 5.6165,10.6333C5.5887,10.612 5.5527,10.6055 5.5342,10.6256C5.5325,10.6284 5.5298,10.63 5.5282,10.6333C5.5282,10.6333 5.49,10.5618 5.4453,10.5378C5.4005,10.5138 5.3242,10.5204 5.3242,10.5204C5.3242,10.4636 5.37,10.4211 5.4273,10.4211C5.4627,10.4211 5.4949,10.4336 5.514,10.4593L5.5211,10.4211C5.5211,10.4211 5.568,10.4309 5.5909,10.4849C5.6116,10.5378 5.5876,10.6158 5.5876,10.6158C5.5876,10.6158 5.6002,10.5815 5.6171,10.5613C5.6356,10.5373 5.6804,10.5133 5.7033,10.5018C5.7273,10.4904 5.7507,10.4751 5.7507,10.4751C5.7507,10.4751 5.7518,10.4811 5.7529,10.4975C5.7535,10.5133 5.7524,10.5247 5.7524,10.5247C5.7955,10.5187 5.8456,10.5264 5.8849,10.54C5.8685,10.5744 5.8369,10.6038 5.7944,10.6207C5.7944,10.6207 5.8085,10.6322 5.8233,10.6464C5.8342,10.6573 5.838,10.6633 5.838,10.6633C5.838,10.6633 5.808,10.6676 5.7944,10.6687C5.7791,10.672 5.7305,10.6796 5.7016,10.678C5.6804,10.6764 5.6547,10.6731 5.6411,10.6693" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.0016,10.9128C5.9941,10.9128 5.9875,10.9128 5.9818,10.9108C5.942,10.9068 5.9014,10.9028 5.8758,10.8968L5.8692,10.8968L5.8683,10.8888C5.8616,10.8678 5.8474,10.8458 5.8285,10.8258C5.7869,10.7868 5.7282,10.7818 5.7036,10.8098C5.6989,10.8098 5.698,10.8188 5.6942,10.8258L5.6847,10.8468L5.6743,10.8258C5.6734,10.8238 5.609,10.6928 5.5343,10.6518C5.4832,10.6228 5.4094,10.6198 5.3668,10.6198C5.3451,10.6198 5.3318,10.6208 5.3318,10.6208L5.3176,10.6208L5.3176,10.6088C5.3176,10.4978 5.4018,10.4118 5.5087,10.4118C5.5646,10.4118 5.6147,10.4328 5.6516,10.4708L5.663,10.4118L5.6753,10.4118C5.6771,10.4138 5.7623,10.4348 5.802,10.5388C5.82,10.5898 5.82,10.6458 5.8143,10.6928C5.8191,10.6848 5.8257,10.6808 5.8295,10.6718C5.8654,10.6228 5.9638,10.5758 5.9818,10.5678C6.0215,10.5448 6.0631,10.5188 6.0631,10.5168L6.0792,10.5048L6.0802,10.5238C6.0802,10.5238 6.0821,10.5348 6.0849,10.5658C6.0849,10.5778 6.0849,10.5938 6.0849,10.6008C6.1549,10.5968 6.2401,10.6108 6.3063,10.6378L6.3176,10.6408L6.312,10.6548C6.2807,10.7178 6.2287,10.7658 6.1663,10.7998C6.1748,10.8088 6.1899,10.8208 6.2013,10.8348C6.223,10.8558 6.2287,10.8658 6.2287,10.8678L6.2401,10.8818L6.135,10.9008C6.1019,10.9028 6.0461,10.9128 6.0016,10.9128ZM5.8862,10.8738C5.9127,10.8798 5.9515,10.8818 5.9846,10.8858C6.0262,10.8918 6.0953,10.8798 6.1284,10.8738L6.1965,10.8638C6.1946,10.8578 6.1899,10.8558 6.1833,10.8498C6.1615,10.8268 6.135,10.8028 6.135,10.8028L6.1199,10.7868L6.1388,10.7818C6.2003,10.7588 6.2514,10.7118 6.2826,10.6538C6.2164,10.6308 6.136,10.6208 6.0717,10.6288L6.0556,10.6328L6.0575,10.6148C6.0575,10.6148 6.0603,10.5968 6.0584,10.5678C6.0584,10.5578 6.0575,10.5518 6.0565,10.5468C6.0404,10.5578 6.0158,10.5748 5.9884,10.5888C5.9383,10.6138 5.8711,10.6538 5.8446,10.6898C5.8228,10.7158 5.8049,10.7608 5.7992,10.7788C5.8124,10.7868 5.8276,10.7968 5.8399,10.8078C5.8626,10.8268 5.8796,10.8498 5.8862,10.8738ZM5.3659,10.5948C5.4198,10.5948 5.4917,10.5998 5.5437,10.6308C5.6071,10.6668 5.663,10.7558 5.6838,10.7948C5.6847,10.7928 5.6847,10.7928 5.6847,10.7928C5.7055,10.7698 5.7405,10.7618 5.7765,10.7718C5.7841,10.7408 5.8068,10.6258 5.7793,10.5478C5.7509,10.4778 5.7017,10.4508 5.68,10.4438L5.663,10.5248L5.6469,10.5038C5.6175,10.4588 5.5636,10.4358 5.5078,10.4358C5.4189,10.4358 5.347,10.5058 5.3413,10.5948C5.347,10.5948 5.3555,10.5948 5.3659,10.5948Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M5.5342,10.6251C5.5527,10.6049 5.5887,10.6115 5.6165,10.6327C5.6438,10.6551 5.6515,10.6905 5.6335,10.7085C5.6165,10.7276 5.5795,10.7244 5.5527,10.702C5.5238,10.6764 5.5167,10.6425 5.5342,10.6251" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.675,10.8283C5.64,10.8283 5.603,10.8123 5.572,10.7893C5.539,10.7613 5.52,10.7233 5.518,10.6903C5.516,10.6673 5.524,10.6463 5.539,10.6303C5.574,10.5933 5.651,10.6013 5.704,10.6463C5.738,10.6713 5.756,10.7103 5.759,10.7423C5.761,10.7653 5.753,10.7873 5.738,10.8053C5.723,10.8183 5.7,10.8283 5.675,10.8283ZM5.605,10.6293C5.585,10.6293 5.57,10.6393 5.558,10.6493C5.546,10.6613 5.542,10.6723 5.544,10.6883C5.546,10.7173 5.563,10.7453 5.588,10.7683C5.634,10.8053 5.694,10.8133 5.722,10.7883C5.731,10.7783 5.736,10.7643 5.734,10.7433C5.734,10.7183 5.715,10.6883 5.69,10.6653C5.663,10.6433 5.633,10.6293 5.605,10.6293Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M7.0107,10.3993C7.0107,10.36 7.0451,10.3289 7.0865,10.3289C7.128,10.3289 7.1607,10.36 7.1607,10.3993C7.1607,10.4375 7.128,10.4718 7.0865,10.4718C7.0445,10.4718 7.0107,10.438 7.0107,10.3993" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.1556,10.6053C7.0726,10.6053 7.0036,10.5443 7.0036,10.4643C7.0036,10.3863 7.0716,10.3213 7.1556,10.3213C7.2376,10.3213 7.3036,10.3853 7.3036,10.4643C7.3036,10.5453 7.2376,10.6053 7.1556,10.6053ZM7.1556,10.3473C7.0856,10.3473 7.0296,10.3983 7.0296,10.4643C7.0296,10.5293 7.0856,10.5813 7.1556,10.5813C7.2236,10.5813 7.2786,10.5293 7.2786,10.4643C7.2786,10.3983 7.2236,10.3473 7.1556,10.3473Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#005BBF" + android:fillType="nonZero" + android:pathData="M6.9295,9.3215C6.9295,9.2396 6.9982,9.1742 7.0827,9.1742C7.1673,9.1742 7.236,9.2391 7.236,9.3215C7.236,9.4011 7.1673,9.4655 7.0827,9.4655C6.9982,9.4655 6.9295,9.4005 6.9295,9.3215" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.2141,9.7179C7.0551,9.7179 6.9251,9.5949 6.9251,9.4469C6.9251,9.2909 7.0551,9.1709 7.2141,9.1709C7.3731,9.1709 7.5021,9.2909 7.5021,9.4469C7.5021,9.5949 7.3731,9.7179 7.2141,9.7179ZM7.2141,9.1889C7.0631,9.1889 6.9411,9.3039 6.9411,9.4469C6.9411,9.5879 7.0631,9.7049 7.2141,9.7049C7.3641,9.7049 7.4861,9.5879 7.4861,9.4469C7.4871,9.3039 7.3651,9.1889 7.2141,9.1889Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.0424,8.9124L7.0424,8.992L6.9584,8.992L6.9584,9.0705L7.0424,9.0705L7.0424,9.1813L7.0424,9.3007L6.9365,9.3007C6.936,9.3095 6.9295,9.3133 6.9295,9.322C6.9295,9.3389 6.9333,9.3602 6.942,9.3776L6.942,9.3776L7.2235,9.3776C7.2235,9.3776 7.2235,9.3776 7.224,9.3776C7.2327,9.3607 7.236,9.3395 7.236,9.322C7.236,9.3133 7.2295,9.3095 7.2289,9.3007L7.1264,9.3007L7.1264,9.1813L7.1264,9.0705L7.2104,9.0705L7.2104,8.992L7.1264,8.992L7.1264,8.9124L7.0424,8.9124Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.4786,9.7781L6.9516,9.7781L6.9516,9.7741C6.9506,9.7721 6.9486,9.7701 6.9476,9.7681C6.9336,9.7351 6.9256,9.6981 6.9256,9.6641C6.9256,9.6501 6.9286,9.6451 6.9336,9.6411C6.9356,9.6331 6.9396,9.6251 6.9396,9.6231L6.9396,9.6171L7.1326,9.6171L7.1326,9.2151L6.9806,9.2151L6.9806,9.0531L7.1326,9.0531L7.1326,8.9091L7.3026,8.9091L7.3026,9.0541L7.4556,9.0541L7.4556,9.2161L7.3026,9.2161L7.3026,9.6181L7.4906,9.6181L7.4906,9.6241C7.4906,9.6261 7.4936,9.6341 7.4956,9.6421C7.5006,9.6471 7.5036,9.6521 7.5036,9.6651C7.5036,9.6981 7.4956,9.7351 7.4816,9.7691L7.4786,9.7781ZM6.9626,9.7591L7.4666,9.7591C7.4806,9.7321 7.4876,9.6961 7.4876,9.6651C7.4876,9.6571 7.4836,9.6491 7.4816,9.6461C7.4786,9.6411 7.4786,9.6391 7.4756,9.6331L7.2846,9.6331L7.2846,9.1951L7.4386,9.1951L7.4386,9.0661L7.2846,9.0661L7.2846,8.9211L7.1496,8.9211L7.1496,9.0661L6.9946,9.0661L6.9946,9.1951L7.1496,9.1951L7.1496,9.6331L6.9526,9.6331C6.9506,9.6391 6.9506,9.6411 6.9466,9.6461C6.9446,9.6491 6.9406,9.6571 6.9406,9.6651C6.9406,9.6961 6.9476,9.7311 6.9626,9.7591Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CCCCCC" + android:fillType="nonZero" + android:pathData="M7.0985,15.4447C6.6453,15.4447 6.1975,15.334 5.82,15.1507C5.5424,15.0116 5.3569,14.7329 5.3569,14.4155L5.3569,13.2629L8.8315,13.2629L8.8315,14.4155C8.8315,14.7329 8.6476,15.0116 8.3695,15.1507C7.9925,15.334 7.5502,15.4447 7.0985,15.4447" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.0985,15.4545C6.6611,15.4545 6.2067,15.3471 5.8156,15.1562C5.5271,15.0144 5.3482,14.7318 5.3482,14.416L5.3482,13.2558L8.8407,13.2558L8.8407,14.416C8.8407,14.7318 8.6618,15.0149 8.3744,15.1562C7.9778,15.3525 7.5365,15.4545 7.0985,15.4545ZM5.3667,13.2733L5.3667,14.416C5.3667,14.7236 5.5418,15.0018 5.8238,15.1415C6.2116,15.3318 6.6649,15.4365 7.0985,15.4365C7.5338,15.4365 7.9718,15.334 8.3651,15.1415C8.6482,15.0018 8.8227,14.7236 8.8227,14.416L8.8227,13.2733L5.3667,13.2733L5.3667,13.2733Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#CCCCCC" + android:fillType="nonZero" + android:pathData="M7.0904,13.2618l1.7411,0l0,-1.9282l-1.7411,0l0,1.9282z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.8407,13.2716L7.0816,13.2716L7.0816,11.3276L8.8407,11.3276L8.8407,13.2716ZM7.0991,13.2525L8.8227,13.2525L8.8227,11.3445L7.0991,11.3445L7.0991,13.2525Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M7.0925,14.4138C7.0925,14.8698 6.7058,15.2407 6.2258,15.2407C5.7442,15.2407 5.3542,14.8698 5.3542,14.4138L5.3542,13.2618L7.0925,13.2618L7.0925,14.4138" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M5.7344,15.0956C5.7889,15.1256 5.8631,15.1725 5.9427,15.1922L5.9384,13.2209L5.7344,13.2209L5.7344,15.0956Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.1401,15.202L6.1211,15.202C6.0001,15.184 5.8891,15.1507 5.7971,15.1229C5.7761,15.1153 5.7541,15.1093 5.7351,15.1038L5.7251,15.1011L5.7251,13.2116L6.1321,13.2116L6.1321,13.2204L6.1401,15.202ZM5.7601,15.0902C5.7771,15.0956 5.7951,15.1 5.8121,15.1049C5.8971,15.1305 6.0001,15.1633 6.1081,15.1796L6.1001,13.2302L5.7601,13.2302L5.7601,15.0902Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M5.352,14.3996C5.3575,14.6424 5.454,14.8224 5.5505,14.9418L5.5505,13.2307L5.3542,13.2307L5.352,14.3996Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.7224,14.9505C5.7184,14.9505 5.7144,14.9495 5.7094,14.9478C5.5494,14.8387 5.3534,14.6565 5.3444,14.3996L5.3474,13.2307C5.3474,13.2242 5.3564,13.2215 5.3624,13.2215L5.7224,13.2215C5.7314,13.2215 5.7374,13.2242 5.7374,13.2307L5.7374,14.9418C5.7374,14.9462 5.7344,14.9495 5.7274,14.9505C5.7254,14.9505 5.7254,14.9505 5.7224,14.9505ZM5.3794,13.2378L5.3734,14.4002C5.3854,14.6369 5.5554,14.8093 5.7074,14.9178L5.7074,13.2378L5.3794,13.2378Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C7B500" + android:fillType="nonZero" + android:pathData="M6.1211,15.2342C6.2007,15.2435 6.2607,15.2407 6.3256,15.2342L6.3256,13.2209L6.1211,13.2209L6.1211,15.2342Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.3164,15.2489L6.3164,15.2489C6.2574,15.2489 6.1954,15.2467 6.1284,15.2435L6.1124,15.2429L6.1124,13.2116L6.5194,13.2116L6.5194,15.2429L6.5034,15.2435C6.4354,15.2467 6.3754,15.2489 6.3164,15.2489ZM6.1454,15.2276C6.2054,15.2304 6.2624,15.2309 6.3154,15.2309L6.3154,15.2309C6.3694,15.2309 6.4244,15.2304 6.4844,15.2276L6.4844,13.2302L6.1444,13.2302L6.1444,15.2276L6.1454,15.2276Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.5045,15.1922C6.5842,15.1769 6.6736,15.1256 6.7118,15.1L6.7118,13.2209L6.5084,13.2209L6.5045,15.1922Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.4947,15.202L6.5047,13.2122L6.9107,13.2122L6.9107,15.1044L6.9027,15.1076C6.8287,15.1355 6.6617,15.1845 6.5137,15.2025L6.4947,15.2025L6.4947,15.202ZM6.5367,13.2302L6.5287,15.1807C6.6597,15.1638 6.8057,15.1213 6.8767,15.0956L6.8767,13.2302L6.5367,13.2302L6.5367,13.2302Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M5.3547,13.2618l1.7367,0l0,-1.9282l-1.7367,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.1002,13.2716L5.3465,13.2716L5.3465,11.3276L7.1002,11.3276L7.1002,13.2716ZM5.3635,13.2525L7.0827,13.2525L7.0827,11.3445L5.3635,11.3445L5.3635,13.2525L5.3635,13.2525Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.9011,14.9233C6.9873,14.8469 7.0664,14.6778 7.0953,14.4804L7.0996,13.2198L6.8967,13.2198L6.9011,14.9233Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.896,14.9435L6.888,13.2122L7.292,13.2122L7.292,13.2209L7.283,14.4815C7.231,14.6745 7.09,14.8491 6.923,14.9298L6.896,14.9435ZM6.92,13.2302L6.929,14.9009C7.076,14.8191 7.205,14.6527 7.252,14.4793L7.26,13.2302L6.92,13.2302Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.2258,15.2489C5.7404,15.2489 5.346,14.8736 5.346,14.4138L5.346,13.2515L7.1013,13.2515L7.1013,14.4138C7.1013,14.8742 6.7085,15.2489 6.2258,15.2489ZM5.3635,13.2716L5.3635,14.4138C5.3635,14.8644 5.7502,15.2309 6.2258,15.2309C6.6987,15.2309 7.0827,14.8644 7.0827,14.4138L7.0827,13.2716L5.3635,13.2716Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M8.8336,13.2613L8.8336,14.4133C8.8336,14.8693 8.4431,15.2402 7.962,15.2402C7.4825,15.2402 7.0925,14.8693 7.0925,14.4133L7.0925,13.2613L8.8336,13.2613" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.962,15.2489C7.4771,15.2489 7.0827,14.8736 7.0827,14.4138L7.0827,13.2515L8.8424,13.2515L8.8424,14.4138C8.8424,14.8742 8.448,15.2489 7.962,15.2489ZM7.1013,13.2716L7.1013,14.4138C7.1013,14.8644 7.4875,15.2309 7.9625,15.2309C8.4387,15.2309 8.826,14.8644 8.826,14.4138L8.826,13.2716L7.1013,13.2716Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.4089,14.1324C7.4122,14.1395 7.4127,14.1448 7.4127,14.1519C7.4127,14.1738 7.3953,14.1932 7.3729,14.1932C7.3505,14.1932 7.3325,14.1738 7.3325,14.1519C7.3325,14.1448 7.3336,14.1395 7.3364,14.1324L7.2802,14.1324C7.2785,14.1395 7.2785,14.1448 7.2785,14.1519C7.2785,14.1968 7.3064,14.2305 7.3445,14.2429L7.3445,14.3941L7.4029,14.3953L7.4029,14.2429C7.4318,14.2334 7.4531,14.2104 7.4624,14.1826L7.6211,14.1826L7.6211,14.1318L7.4089,14.1318M8.1895,14.1324L8.1895,14.1832L8.0465,14.1832C8.0449,14.1891 8.0416,14.1968 8.0373,14.2015L8.2036,14.4077L8.1589,14.4461L7.9936,14.2417C7.9904,14.2417 7.9887,14.2429 7.9855,14.2429L7.9849,14.5843L7.9265,14.5843L7.9265,14.2429C7.9238,14.2429 7.9222,14.2411 7.92,14.2399L7.7476,14.4461L7.7029,14.4077L7.8753,14.2003C7.8725,14.1968 7.8693,14.1879 7.8676,14.1832L7.7193,14.1832L7.7193,14.1324L8.1895,14.1324L8.1895,14.1324ZM8.2844,14.1324L8.2844,14.1832L8.4442,14.1832C8.454,14.211 8.4764,14.234 8.5025,14.2435L8.5025,14.3958L8.5625,14.3947L8.5625,14.2435C8.6007,14.2311 8.628,14.1974 8.628,14.1525C8.628,14.1454 8.6269,14.1401 8.6264,14.133L8.5691,14.133C8.5718,14.1401 8.574,14.1454 8.574,14.1525C8.574,14.1743 8.5565,14.1938 8.5336,14.1938C8.5118,14.1938 8.4927,14.1743 8.4927,14.1525C8.4927,14.1454 8.4949,14.1401 8.4976,14.133L8.2844,14.133M8.0455,14.9954C8.0907,14.9877 8.1349,14.9741 8.1764,14.9552L8.2053,15.0072C8.1573,15.0314 8.1044,15.0462 8.0498,15.0556C8.0411,15.0999 8.004,15.1318 7.9582,15.1318C7.9124,15.1318 7.8753,15.1005 7.866,15.0556C7.8082,15.0462 7.7531,15.0326 7.7018,15.0072L7.7313,14.9552C7.7755,14.9753 7.8224,14.9895 7.8731,14.996C7.8824,14.9723 7.9015,14.9517 7.9271,14.9446L7.9271,14.6817L7.9849,14.6817L7.986,14.9446C8.0116,14.9493 8.0335,14.9723 8.0455,14.9954L8.0455,14.9954ZM7.6467,14.908L7.6178,14.9623C7.5687,14.9298 7.524,14.8885 7.4864,14.84C7.4569,14.8518 7.422,14.8459 7.3964,14.8235C7.3576,14.788 7.3516,14.7272 7.3865,14.687L7.3909,14.6823C7.3675,14.6221 7.3511,14.5595 7.3445,14.4933L7.4045,14.4933C7.4084,14.5488 7.4209,14.6044 7.4422,14.6546C7.4596,14.651 7.476,14.6546 7.4918,14.6593L7.6402,14.4815L7.6849,14.5205L7.5376,14.6989C7.5578,14.7296 7.5567,14.7721 7.5338,14.807C7.5682,14.8442 7.6047,14.879 7.6467,14.908ZM7.428,14.7231C7.4416,14.7036 7.4673,14.7 7.4847,14.716C7.5016,14.7308 7.5038,14.7562 7.4891,14.7762C7.4749,14.7922 7.4493,14.7951 7.4318,14.7804C7.4155,14.7644 7.4127,14.739 7.428,14.7231ZM7.3527,14.5465L7.2922,14.5323L7.284,14.3651L7.3445,14.3427L7.3445,14.4372C7.344,14.4756 7.3473,14.511 7.3527,14.5465ZM7.4029,14.3391L7.4635,14.3539C7.4635,14.3539 7.4662,14.462 7.4662,14.4372C7.4635,14.4094 7.4727,14.5205 7.4727,14.5205L7.4116,14.5435C7.4062,14.5087 7.4024,14.4744 7.4024,14.4372L7.4029,14.3391L7.4029,14.3391ZM7.6031,14.8743C7.6544,14.9168 7.7127,14.9493 7.7765,14.9723L7.7907,14.9091C7.7378,14.8926 7.6898,14.8666 7.6456,14.8329L7.6031,14.8743M7.5742,14.9286C7.6265,14.9712 7.6844,15.0036 7.7476,15.0279L7.7029,15.0728C7.6516,15.0544 7.6042,15.0279 7.56,14.993L7.5742,14.9286M7.6522,14.5606L7.71,14.5878L7.8164,14.4602L7.782,14.4047L7.6522,14.5606M7.6075,14.5199L7.5731,14.4644L7.6795,14.3386L7.7373,14.3663L7.6075,14.5199M8.2593,14.908L8.2882,14.9623C8.3384,14.9298 8.382,14.8885 8.4196,14.84C8.4507,14.8518 8.484,14.8459 8.5096,14.8235C8.5505,14.788 8.5538,14.7272 8.5211,14.687L8.5151,14.6823C8.5396,14.6221 8.556,14.5595 8.5609,14.4933L8.5025,14.4933C8.4976,14.5488 8.4845,14.6044 8.4644,14.6546C8.4485,14.651 8.43,14.6546 8.4136,14.6593L8.2658,14.4815L8.2211,14.5205L8.3684,14.6989C8.3493,14.7296 8.3493,14.7721 8.3716,14.807C8.3395,14.8442 8.3007,14.879 8.2593,14.908ZM8.4796,14.7231C8.4638,14.7036 8.4382,14.7 8.4224,14.716C8.4055,14.7308 8.4033,14.7562 8.4175,14.7762C8.4316,14.7922 8.4573,14.7951 8.4742,14.7804C8.4916,14.7644 8.4933,14.739 8.4796,14.7231ZM8.5533,14.5465L8.6144,14.5323L8.6236,14.3651L8.5636,14.3427L8.5636,14.4372C8.5631,14.4756 8.5593,14.511 8.5533,14.5465ZM8.5031,14.3391L8.4425,14.3539C8.4425,14.3539 8.4393,14.462 8.4415,14.4372C8.442,14.4094 8.4344,14.5205 8.4344,14.5205L8.4955,14.5435C8.502,14.5087 8.5031,14.4744 8.5031,14.4372L8.5031,14.3391M8.304,14.8743C8.2527,14.9168 8.1927,14.9493 8.1289,14.9723L8.1158,14.9091C8.1687,14.8926 8.2184,14.8666 8.2598,14.8329L8.304,14.8743M8.3329,14.9286C8.2816,14.9712 8.2216,15.0036 8.1584,15.0279L8.2036,15.0728C8.2544,15.0544 8.3024,15.0279 8.3455,14.993L8.3329,14.9286M8.2533,14.5606L8.1955,14.5878L8.0902,14.4602L8.1251,14.4047L8.2533,14.5606M8.298,14.5199L8.3324,14.4644L8.2265,14.3386L8.1693,14.3663L8.298,14.5199M7.5742,14.1832L7.5911,14.2446L7.7536,14.2446L7.7722,14.1832L7.5742,14.1832M8.3356,14.1832L8.3176,14.2446L8.1545,14.2446L8.1376,14.1832L8.3356,14.1832M7.9173,15.0349C7.9173,15.0143 7.9353,14.9936 7.9576,14.9936C7.98,14.9936 7.9969,15.0143 7.9969,15.0349C7.9969,15.0592 7.9795,15.0763 7.9576,15.0763C7.9353,15.0763 7.9173,15.0592 7.9173,15.0349ZM7.9855,14.7337L8.046,14.7142L8.046,14.5482L7.9855,14.5299L7.9855,14.7337M7.9265,14.7337L7.866,14.7142L7.866,14.5482L7.9265,14.5299L7.9265,14.7337" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.2802,14.422C7.2878,14.3797 7.3129,14.3436 7.3451,14.3283L7.3445,14.0602L7.4029,14.0602L7.4029,14.3298C7.4318,14.3444 7.4542,14.3713 7.464,14.4112L7.6216,14.4127L7.6216,14.422L7.4095,14.422C7.4029,14.4058 7.3887,14.3966 7.3735,14.3966C7.3582,14.3966 7.3435,14.4058 7.3369,14.422L7.2802,14.422M7.7193,14.422L7.7193,14.4127L7.8665,14.4127C7.8693,14.4035 7.8709,14.3974 7.8731,14.392L7.692,14.1101L7.7367,14.0564L7.9162,14.3352C7.9189,14.3321 7.9222,14.3321 7.9255,14.3306L7.9255,13.9573L7.9844,13.9573L7.9844,14.3283C7.9871,14.3306 7.9909,14.3306 7.9936,14.3321L8.1682,14.0518L8.2135,14.1001L8.0378,14.3805C8.0422,14.3897 8.0455,14.4005 8.0487,14.4135L8.19,14.4135L8.19,14.4227L7.7193,14.4227L7.7193,14.422ZM8.4982,14.422C8.5053,14.4058 8.5184,14.3966 8.5336,14.3966C8.55,14.3966 8.5631,14.4058 8.5691,14.422L8.6264,14.422C8.6187,14.3797 8.5942,14.3436 8.5625,14.3283L8.5625,14.0602L8.5036,14.0602L8.5036,14.3306C8.4747,14.3444 8.4524,14.3713 8.4442,14.4112L8.2844,14.4127L8.2844,14.422L8.4982,14.422M7.4122,13.6662L7.6293,14.0095L7.674,13.9604L7.4553,13.617C7.4596,13.6086 7.4629,13.5978 7.4662,13.5886L7.6255,13.5886L7.6255,13.5087L7.4656,13.5087C7.4536,13.4596 7.4176,13.4235 7.3751,13.4235C7.3227,13.4235 7.2807,13.4803 7.2807,13.5495C7.2807,13.6048 7.3064,13.6485 7.3445,13.6662L7.344,13.9342L7.4018,13.9342L7.4018,13.6677C7.4062,13.6662 7.4089,13.6662 7.4122,13.6662ZM8.5631,13.6662L8.5631,13.9342L8.5042,13.9342L8.5042,13.6662C8.4993,13.6662 8.4955,13.6639 8.4911,13.6601L8.2745,14.0057L8.2298,13.9542L8.4513,13.6048C8.4485,13.5971 8.4469,13.5925 8.4447,13.5886L8.2849,13.5886L8.2849,13.5087L8.4447,13.5087C8.4573,13.4596 8.4927,13.4235 8.5342,13.4235C8.5871,13.4235 8.6296,13.4803 8.6296,13.5495C8.6291,13.6063 8.6018,13.6508 8.5631,13.6662ZM7.9844,13.6662L7.9844,13.8283L7.9255,13.8283L7.9255,13.6677C7.896,13.6585 7.8725,13.6263 7.8633,13.5879L7.7204,13.5879L7.7204,13.508L7.8633,13.508C7.8753,13.4588 7.9107,13.4227 7.9527,13.4227C7.9953,13.4227 8.0313,13.4588 8.0433,13.508L8.1889,13.508L8.1889,13.5879L8.0427,13.5879C8.0335,13.624 8.0133,13.6554 7.9844,13.6662ZM7.3451,13.8644L7.2845,13.8897L7.2845,14.1086L7.3451,14.1301L7.3451,13.8644M7.4035,13.8644L7.464,13.8897L7.464,14.1086L7.4035,14.1301L7.4035,13.8644M8.5031,13.8644L8.4425,13.8897L8.4425,14.1086L8.5031,14.1301L8.5031,13.8644M8.5631,13.8644L8.6231,13.8897L8.6231,14.1086L8.5631,14.1301L8.5631,13.8644M7.6424,13.9089L7.6996,13.8759L7.8049,14.0379L7.77,14.1101L7.6424,13.9089M7.5976,13.9588L7.5622,14.0295L7.668,14.1977L7.7253,14.1631L7.5976,13.9588M8.2625,13.8997L8.2042,13.8667L8.0995,14.0364L8.1349,14.1055L8.2625,13.8997M8.3073,13.9527L8.3422,14.0241L8.2369,14.1885L8.1796,14.1539L8.3073,13.9527M7.5742,14.412L7.5911,14.3313L7.7536,14.3313L7.7722,14.412L7.5742,14.412M7.3358,13.5487C7.3358,13.518 7.3533,13.4949 7.3756,13.4949C7.398,13.4949 7.4155,13.518 7.4155,13.5487C7.4155,13.5756 7.398,13.6025 7.3756,13.6025C7.3533,13.6025 7.3358,13.5763 7.3358,13.5487ZM7.7705,13.5879L7.7536,13.6677L7.5905,13.6677L7.572,13.5879L7.7705,13.5879M7.7705,13.5072L7.7536,13.4266L7.5905,13.4266L7.572,13.5072L7.7705,13.5072M8.3356,14.412L8.3176,14.3313L8.1545,14.3313L8.1376,14.412L8.3356,14.412M8.4938,13.5487C8.4938,13.518 8.5124,13.4949 8.5342,13.4949C8.5571,13.4949 8.5751,13.518 8.5751,13.5487C8.5751,13.5756 8.5571,13.6025 8.5342,13.6025C8.5118,13.6032 8.4938,13.5763 8.4938,13.5487ZM7.9129,13.5487C7.9129,13.518 7.9304,13.4949 7.9527,13.4949C7.9751,13.4949 7.9942,13.518 7.9942,13.5487C7.9942,13.5756 7.9751,13.6025 7.9527,13.6025C7.9309,13.6032 7.9129,13.5763 7.9129,13.5487ZM8.1382,13.5879L8.1567,13.6677L8.3198,13.6677L8.3367,13.5879L8.1382,13.5879M8.1382,13.5072L8.1567,13.4266L8.3198,13.4266L8.3367,13.5072L8.1382,13.5072M7.926,13.7637L7.8655,13.786L7.8655,14.0041L7.926,14.0256L7.926,13.7637M7.9844,13.7637L8.0455,13.786L8.0455,14.0041L7.9844,14.0256L7.9844,13.7637" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.9968,15.0613C7.949,15.0613 7.9069,15.0302 7.8953,14.9887C7.8544,14.9844 7.8146,14.9762 7.7765,14.9631L7.7287,15.0062L7.7263,15.0045C7.6739,14.9871 7.6225,14.962 7.5747,14.9331L7.5724,14.9298L7.5856,14.8693C7.5545,14.8464 7.5251,14.8196 7.498,14.7924C7.4639,14.7989 7.427,14.7924 7.4011,14.7711C7.3803,14.7558 7.3665,14.7329 7.3648,14.7073C7.363,14.6816 7.3717,14.6571 7.3901,14.6391L7.3936,14.638C7.3746,14.5987 7.3619,14.5584 7.3532,14.5164L7.2886,14.5027L7.2788,14.3451L7.3428,14.3238L7.3428,14.2387C7.3019,14.2262 7.2736,14.1907 7.2736,14.1504C7.2736,14.11 7.3019,14.0745 7.3434,14.062L7.3428,13.8711L7.4149,13.8711L7.4149,14.0631C7.4443,14.0718 7.468,14.0931 7.4778,14.1187L7.6468,14.1198L7.6468,14.1836L7.4766,14.1836C7.4657,14.2093 7.4443,14.2305 7.4161,14.2382L7.4161,14.32L7.4801,14.3342L7.4801,14.3369C7.4801,14.3369 7.4812,14.4007 7.4818,14.4138C7.4847,14.4329 7.4882,14.4907 7.4882,14.4907L7.4887,14.4962L7.4247,14.5153C7.4311,14.5475 7.4415,14.5785 7.4553,14.608C7.4709,14.6058 7.4887,14.608 7.5049,14.6145L7.6618,14.4482L7.7165,14.4907L7.5597,14.6555C7.5793,14.686 7.5787,14.7231 7.5562,14.7553C7.5764,14.7733 7.5995,14.7935 7.6225,14.8109L7.6681,14.7727L7.671,14.7749C7.716,14.8071 7.7667,14.8322 7.8227,14.848L7.8261,14.8485L7.8129,14.908C7.8417,14.9135 7.8728,14.9216 7.904,14.926C7.9155,14.9036 7.9345,14.8878 7.9593,14.8791L7.9599,14.6353L8.0314,14.6353L8.032,14.878C8.0591,14.8867 8.0793,14.9036 8.092,14.926C8.137,14.9184 8.1808,14.9069 8.2263,14.8878L8.2304,14.8867L8.2656,14.9451L8.2615,14.9473C8.2096,14.9664 8.1543,14.9816 8.0989,14.9898C8.0856,15.0307 8.0447,15.0613 7.9968,15.0613ZM7.7852,14.9582C7.8215,14.9685 7.8596,14.9762 7.8999,14.9816L7.9028,14.9827L7.9028,14.9849C7.9132,15.0231 7.9513,15.052 7.9962,15.052C8.0406,15.052 8.0793,15.0231 8.0891,14.9849L8.0891,14.9816L8.092,14.9805C8.1479,14.9718 8.2004,14.9593 8.2511,14.938L8.2252,14.8982C8.1796,14.9145 8.1364,14.9255 8.0891,14.9336L8.0856,14.9336L8.0845,14.9325C8.0729,14.9096 8.0516,14.8933 8.0245,14.8856L8.0216,14.884L8.0216,14.644L7.9686,14.644L7.968,14.8851L7.9651,14.8856C7.9409,14.8955 7.9207,14.9096 7.9103,14.9325L7.9092,14.9336L7.9057,14.9336C7.8734,14.9304 7.84,14.9233 7.8094,14.9135L7.8094,14.9135L7.8054,14.9124C7.795,14.9107 7.7869,14.908 7.7782,14.9047C7.7713,14.9015 7.765,14.8993 7.7581,14.8976L7.7327,14.9375C7.7477,14.9451 7.7609,14.9489 7.7771,14.9544L7.7852,14.9582L7.7852,14.9582ZM7.5827,14.9249C7.6277,14.9549 7.6768,14.9762 7.7269,14.9975L7.7661,14.9609C7.7517,14.9571 7.7379,14.9505 7.7246,14.9467L7.7188,14.9445L7.7188,14.9435C7.6912,14.9325 7.6646,14.92 7.6393,14.9042L7.6393,14.9042L7.6352,14.9009C7.6208,14.8955 7.607,14.8856 7.5931,14.8742L7.5827,14.9249ZM7.6445,14.8955C7.6704,14.9107 7.6975,14.9244 7.7246,14.9353L7.75,14.8955C7.7223,14.8829 7.6958,14.8698 7.6704,14.8551L7.6445,14.8955ZM7.63,14.8175C7.6768,14.8485 7.7275,14.8758 7.7817,14.8955C7.7886,14.8987 7.795,14.8998 7.8025,14.9031L7.8152,14.854C7.7609,14.836 7.7114,14.8136 7.6681,14.7836L7.63,14.8175ZM7.5891,14.86L7.5937,14.8622C7.6075,14.8731 7.622,14.8824 7.6364,14.8911L7.6618,14.8485C7.6191,14.8229 7.5804,14.7929 7.5458,14.7564L7.5435,14.7547L7.5453,14.7504C7.5689,14.7215 7.5695,14.6855 7.5493,14.6565L7.5487,14.6538L7.7027,14.4902L7.6641,14.4602L7.5078,14.6244L7.5049,14.6227C7.4882,14.6167 7.4703,14.6151 7.4536,14.6167L7.4501,14.6178L7.4478,14.6135C7.4345,14.5824 7.4236,14.5496 7.4167,14.5153L7.4167,14.5153L7.4149,14.5125C7.4144,14.5022 7.412,14.4951 7.4109,14.4853C7.4109,14.4787 7.4097,14.4738 7.4092,14.4695L7.3573,14.4689C7.3578,14.4842 7.3607,14.4984 7.3642,14.5136L7.3642,14.5196L7.3642,14.5196C7.3734,14.5589 7.3867,14.5987 7.4045,14.6358L7.4045,14.6391L7.3976,14.6445C7.3809,14.6647 7.374,14.6838 7.3746,14.7073C7.3769,14.7302 7.3878,14.7509 7.408,14.7667C7.4322,14.7836 7.468,14.7924 7.4991,14.782L7.5026,14.7809L7.5032,14.7825C7.5285,14.8098 7.5585,14.8355 7.5891,14.86ZM7.2984,14.4989L7.3509,14.5098C7.3486,14.494 7.3457,14.4787 7.3457,14.4651L7.3446,14.4607L7.3457,14.4607C7.3434,14.4471 7.3423,14.4307 7.3423,14.4138L7.3423,14.3745L7.3423,14.3456L7.3423,14.3331L7.2881,14.35L7.2984,14.4989ZM7.4201,14.4864C7.4201,14.4907 7.4213,14.4989 7.423,14.5055L7.4778,14.4896C7.4772,14.4771 7.4738,14.4378 7.4726,14.4204C7.472,14.4182 7.4714,14.416 7.4714,14.4138C7.4709,14.4111 7.4709,14.4095 7.4714,14.4095C7.4709,14.3893 7.4703,14.3522 7.4703,14.3413L7.4149,14.3298L7.4149,14.4138C7.4155,14.4395 7.4167,14.464 7.4201,14.4864L7.4201,14.4864L7.4201,14.4864ZM7.355,14.4607L7.4069,14.4607C7.4069,14.4482 7.4069,14.4318 7.4069,14.4138L7.4069,14.3795L7.3526,14.3784L7.3526,14.4133C7.3526,14.4307 7.3526,14.4465 7.355,14.4607ZM7.3526,14.3713L7.4069,14.3713L7.4069,14.2322L7.4097,14.2305C7.4368,14.2218 7.4582,14.2038 7.4674,14.1793L7.4691,14.1749L7.6364,14.1749L7.6364,14.128L7.4703,14.128L7.4691,14.1247C7.4605,14.0985 7.4374,14.0784 7.4092,14.068L7.4057,14.068L7.4057,13.8771L7.3532,13.8771L7.3532,14.0669L7.3498,14.068C7.3111,14.0795 7.2834,14.1149 7.2834,14.1498C7.2834,14.1858 7.3111,14.2202 7.3498,14.2295L7.3532,14.2322L7.3532,14.3713L7.3526,14.3713ZM7.4686,14.7444C7.457,14.7444 7.4472,14.7416 7.4374,14.7329C7.4276,14.7264 7.4224,14.716 7.4207,14.7029C7.4201,14.6925 7.4236,14.6816 7.4328,14.6729C7.442,14.6642 7.4547,14.656 7.4686,14.656C7.4807,14.656 7.4911,14.6625 7.4997,14.6675C7.5095,14.6773 7.5147,14.686 7.5164,14.6975C7.5182,14.7073 7.5135,14.7198 7.5043,14.7285C7.4957,14.7395 7.483,14.7444 7.4686,14.7444ZM7.4686,14.668C7.457,14.668 7.4472,14.6707 7.4403,14.6795C7.4334,14.6865 7.4299,14.6947 7.4299,14.7035C7.4311,14.7133 7.4368,14.7204 7.4432,14.728C7.4501,14.7324 7.4593,14.7335 7.468,14.7335C7.4795,14.7335 7.4905,14.7307 7.4968,14.7225C7.5037,14.716 7.5072,14.7078 7.5066,14.6991C7.5055,14.6904 7.5009,14.6822 7.4939,14.6767C7.487,14.6696 7.4772,14.668 7.4686,14.668ZM8.0314,14.5535L7.9593,14.5535L7.9593,14.2382C7.9588,14.2371 7.9576,14.2371 7.9576,14.2371L7.7754,14.428L7.7212,14.3876L7.9034,14.1951C7.9022,14.1924 7.9005,14.188 7.8988,14.1836L7.7413,14.1836L7.7413,14.1198L7.8976,14.1198C7.8999,14.1155 7.9005,14.1144 7.9022,14.11L7.709,13.9076L7.7638,13.864L7.9547,14.0642C7.9547,14.0642 7.957,14.0642 7.9576,14.0642L7.9576,13.7975L8.0291,13.7975L8.0291,14.062C8.0291,14.062 8.0291,14.062 8.0297,14.062C8.0314,14.062 8.032,14.0631 8.0326,14.0631L8.2183,13.8624L8.2736,13.9022L8.0868,14.1024C8.0897,14.1067 8.0926,14.1133 8.0954,14.1193L8.2477,14.1193L8.2477,14.1831L8.0943,14.1831C8.0926,14.1885 8.0897,14.1918 8.0868,14.1956L8.2644,14.3865L8.2096,14.4269L8.0337,14.2371L8.0337,14.2371C8.0326,14.2382 8.032,14.2382 8.032,14.2393L8.032,14.5535L8.0314,14.5535ZM7.9686,14.5436L8.0216,14.5436L8.0216,14.2333L8.0245,14.2322C8.0268,14.2305 8.028,14.2305 8.0285,14.2305C8.0303,14.2305 8.0308,14.2305 8.0326,14.2305L8.0355,14.2284L8.0378,14.2305L8.2102,14.4149L8.25,14.3855L8.0753,14.1962L8.0764,14.1951C8.0804,14.1896 8.0839,14.1836 8.0851,14.1793L8.0868,14.1749L8.2373,14.1749L8.2373,14.128L8.0879,14.128L8.0862,14.1258C8.0839,14.1149 8.0804,14.1089 8.0764,14.104L8.0753,14.1024L8.077,14.0991L8.2592,13.9033L8.2194,13.8749L8.0349,14.0713L8.032,14.0702C8.0314,14.0691 8.0285,14.0691 8.0274,14.068C8.0251,14.068 8.0245,14.068 8.0228,14.068L8.0193,14.068L8.0193,13.8073L7.9674,13.8073L7.9674,14.0685L7.9639,14.0696C7.9611,14.0718 7.957,14.0729 7.9541,14.0751L7.9507,14.0773L7.7621,13.8771L7.7229,13.9104L7.9144,14.1084L7.9126,14.1127C7.9109,14.116 7.908,14.1204 7.9063,14.1264L7.9045,14.1285L7.7511,14.1285L7.7511,14.1755L7.9063,14.1755L7.9074,14.1798C7.9092,14.1842 7.9109,14.1896 7.9144,14.1924L7.9161,14.1956L7.735,14.3871L7.7754,14.4155L7.9559,14.2267L7.9616,14.2311C7.9628,14.2311 7.9645,14.2311 7.9657,14.2311L7.9691,14.2327L7.9686,14.5436ZM7.6502,13.8471L7.6468,13.8427L7.4184,13.6011C7.4167,13.6011 7.4167,13.6022 7.4155,13.6022C7.4155,13.6022 7.4149,13.6022 7.4149,13.6022L7.4149,13.7876L7.3428,13.7876L7.3434,13.5989C7.303,13.5853 7.2765,13.552 7.2765,13.5127C7.2765,13.4604 7.3232,13.4167 7.3815,13.4167C7.4265,13.4167 7.4651,13.4424 7.4807,13.4795L7.6502,13.4795L7.6502,13.5433L7.4807,13.5433C7.4778,13.5509 7.4749,13.5553 7.472,13.5591L7.7044,13.804L7.6502,13.8471ZM7.4213,13.5913L7.4236,13.5929L7.6514,13.834L7.6912,13.8018L7.4616,13.5602L7.4622,13.5569C7.4668,13.5525 7.4697,13.5444 7.4726,13.5389L7.4743,13.5335L7.641,13.5335L7.641,13.4887L7.4743,13.4887L7.4726,13.4855C7.4605,13.4505 7.4242,13.4265 7.3821,13.4265C7.3296,13.4265 7.2863,13.4647 7.2863,13.5122C7.2863,13.5471 7.3129,13.5798 7.3503,13.5913L7.3538,13.5929L7.3538,13.5956L7.3538,13.7811L7.4069,13.7811L7.4069,13.5945L7.4103,13.5929C7.4109,13.5929 7.4138,13.5913 7.4149,13.5913C7.4172,13.5913 7.4184,13.5913 7.4195,13.5913L7.4213,13.5913Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.2025,15.0067L8.1507,14.9582L8.1573,14.9549C8.202,14.938 8.244,14.9205 8.2822,14.8955L8.2576,14.8545C8.2178,14.8791 8.1742,14.8993 8.1311,14.9118L8.1251,14.9129L8.1098,14.8469L8.1142,14.8464C8.166,14.8311 8.2145,14.8055 8.2565,14.7733L8.2593,14.7711L8.3035,14.8093C8.3264,14.7924 8.346,14.7722 8.3651,14.7536C8.3455,14.7215 8.3433,14.6844 8.3618,14.6538L8.214,14.4891L8.2653,14.4465L8.4147,14.6129C8.4289,14.6064 8.4453,14.6042 8.46,14.6064C8.4725,14.5769 8.4824,14.5458 8.4889,14.5136L8.4284,14.4945L8.4289,14.4891C8.4289,14.4891 8.4349,14.4335 8.4349,14.4122C8.4349,14.3996 8.4376,14.3375 8.4376,14.3353L8.4376,14.3325L8.4987,14.3184L8.4987,14.2365C8.4725,14.2289 8.4513,14.2076 8.4415,14.182L8.2816,14.182L8.2816,14.1182L8.4409,14.1171C8.4513,14.0915 8.4715,14.0702 8.4993,14.0615L8.4993,13.9262L8.4382,13.9109L8.4382,13.7489L8.4993,13.732L8.4993,13.6C8.4971,13.5978 8.4949,13.5967 8.4927,13.5956L8.2756,13.8405L8.2227,13.8002L8.226,13.7958L8.4447,13.5509C8.4447,13.5476 8.4431,13.5444 8.442,13.5433L8.2811,13.5433L8.2811,13.4795L8.442,13.4795C8.4562,13.4424 8.4933,13.4167 8.5342,13.4167C8.5893,13.4167 8.634,13.4604 8.634,13.5127C8.634,13.5531 8.6084,13.5875 8.5685,13.6011L8.5675,13.7876L8.5091,13.7876L8.5091,13.8716L8.5675,13.8716L8.5669,14.0625C8.6067,14.0762 8.634,14.1105 8.634,14.1509C8.634,14.1924 8.6084,14.2267 8.5675,14.2393L8.5675,14.3233L8.6275,14.3456L8.6187,14.5033L8.5582,14.5169C8.5505,14.5573 8.538,14.5987 8.5216,14.6385L8.5244,14.6396C8.5407,14.6587 8.55,14.6822 8.5473,14.7078C8.5456,14.7335 8.5342,14.7564 8.5129,14.7716C8.4889,14.7929 8.454,14.7995 8.4229,14.7929C8.3973,14.8202 8.3684,14.8469 8.3389,14.8698L8.3525,14.9304L8.3493,14.9336C8.3045,14.9625 8.2571,14.9876 8.2058,15.0051L8.2025,15.0067ZM8.1665,14.9609L8.2047,14.9975C8.2522,14.9762 8.2975,14.9549 8.3411,14.9249L8.3291,14.8736C8.3165,14.8851 8.3035,14.8949 8.2909,14.9004L8.2871,14.9047L8.2865,14.9036C8.25,14.9249 8.208,14.9462 8.1665,14.9609ZM8.1213,14.8535L8.1322,14.9025C8.19,14.884 8.2462,14.8545 8.2969,14.8175L8.2593,14.7831C8.2178,14.8131 8.172,14.8355 8.1213,14.8535ZM8.2653,14.8485L8.2898,14.8911C8.3035,14.8824 8.3165,14.8731 8.3291,14.8622L8.3356,14.8595L8.3356,14.86C8.3645,14.8355 8.3918,14.8098 8.4158,14.7831L8.4185,14.7815L8.4213,14.7825C8.4507,14.7929 8.4829,14.7842 8.5064,14.7673C8.5244,14.7515 8.5364,14.7307 8.5375,14.7078C8.5402,14.6844 8.532,14.6653 8.5173,14.6451L8.5096,14.6396L8.5118,14.6364C8.5271,14.5982 8.5402,14.5584 8.5478,14.5191L8.5489,14.5142C8.5516,14.4989 8.5533,14.4847 8.5555,14.4695L8.5053,14.47C8.5015,14.5191 8.4884,14.5671 8.4676,14.614L8.4671,14.6184L8.4638,14.6173C8.448,14.6156 8.4305,14.6173 8.4164,14.6233L8.4131,14.6249L8.2658,14.4607L8.2276,14.4907L8.3749,14.6544L8.3722,14.6571C8.3531,14.686 8.3553,14.722 8.3755,14.7509L8.3782,14.7553L8.3749,14.7569C8.3422,14.7929 8.3056,14.8229 8.2653,14.8485ZM8.5658,14.4607L8.5658,14.4651C8.5636,14.4787 8.5631,14.494 8.5593,14.5098L8.6105,14.4989L8.6182,14.35L8.5669,14.3331L8.5669,14.3456L8.5669,14.3789L8.5669,14.3789L8.5669,14.4138C8.5669,14.4307 8.5658,14.4465 8.5658,14.4607L8.5658,14.4607L8.5658,14.4607ZM8.4382,14.4891L8.4927,14.5049C8.496,14.4771 8.4993,14.4498 8.4993,14.4133L8.4993,14.3293L8.448,14.3407C8.4475,14.3516 8.4453,14.3887 8.4447,14.4089C8.4453,14.4089 8.4453,14.4105 8.4447,14.4133C8.4447,14.4155 8.4447,14.4176 8.4447,14.4198C8.4431,14.4378 8.4398,14.4765 8.4382,14.4891ZM8.5085,14.3795L8.5085,14.4138C8.5085,14.4318 8.508,14.4482 8.5064,14.4607L8.5571,14.4607C8.5576,14.4471 8.5587,14.4307 8.5587,14.4138L8.5587,14.3789L8.5085,14.3795ZM8.2898,14.1749L8.448,14.1749L8.4485,14.1793C8.4573,14.2049 8.4785,14.2218 8.5053,14.2305L8.508,14.2322L8.508,14.3713L8.5582,14.3713L8.5582,14.3456L8.5582,14.2333L8.5615,14.2305C8.598,14.2207 8.6231,14.188 8.6231,14.1509C8.6231,14.116 8.5975,14.0805 8.5609,14.0691L8.5576,14.068L8.5576,14.0647L8.5582,13.8782L8.508,13.8782L8.508,14.0691L8.5053,14.0691C8.4764,14.0795 8.4573,14.0996 8.448,14.1258L8.4475,14.1291L8.2904,14.1291L8.2904,14.1749L8.2898,14.1749ZM8.448,13.9033L8.4993,13.918L8.4993,13.7435L8.448,13.7571L8.448,13.9033ZM8.2358,13.7991L8.2729,13.8291L8.4889,13.5842L8.4922,13.5875C8.4965,13.5907 8.5015,13.5918 8.5047,13.5918L8.5075,13.5935L8.5075,13.7816L8.5576,13.7816L8.5587,13.5945L8.5615,13.5935C8.5985,13.582 8.6231,13.5493 8.6231,13.5133C8.6231,13.4658 8.5838,13.4276 8.5331,13.4276C8.4949,13.4276 8.46,13.4516 8.448,13.4865L8.4475,13.4898L8.2882,13.4898L8.2882,13.5345L8.4475,13.5345L8.4485,13.54C8.4502,13.5411 8.4513,13.5455 8.4535,13.5476L8.4545,13.5509L8.4545,13.5531L8.2358,13.7991ZM8.448,14.7444C8.4355,14.7444 8.4224,14.7395 8.4142,14.7291C8.406,14.7204 8.4033,14.7078 8.4033,14.698C8.4044,14.6865 8.4098,14.6778 8.4191,14.668C8.4278,14.6625 8.4382,14.6565 8.448,14.6565C8.4611,14.6565 8.4736,14.6653 8.4829,14.6735C8.49,14.6822 8.4944,14.6931 8.4927,14.7035C8.4927,14.716 8.4862,14.7269 8.4769,14.7335C8.4698,14.7416 8.4589,14.7444 8.448,14.7444ZM8.448,14.668C8.4398,14.668 8.4316,14.6696 8.4251,14.6773C8.4175,14.6827 8.4125,14.6909 8.4125,14.6996C8.4125,14.7084 8.4153,14.7165 8.4213,14.7231C8.4333,14.7367 8.4573,14.74 8.472,14.7285C8.4802,14.7209 8.4835,14.7138 8.484,14.704C8.4851,14.6953 8.4824,14.6871 8.4764,14.68C8.4687,14.6707 8.4589,14.668 8.448,14.668ZM7.7127,14.5567L7.6451,14.5289L7.7825,14.3756L7.8213,14.4351L7.7127,14.5567ZM7.6609,14.5262L7.7095,14.5469L7.812,14.4351L7.7815,14.3915L7.6609,14.5262ZM7.6069,14.4989L7.5676,14.4395L7.6773,14.32L7.7449,14.3456L7.6069,14.4989ZM7.5785,14.4405L7.6085,14.4853L7.7291,14.35L7.6811,14.3293L7.5785,14.4405ZM7.3729,14.1924C7.3489,14.1924 7.3276,14.1733 7.3276,14.1509C7.3276,14.1285 7.3484,14.1073 7.3729,14.1073C7.3975,14.1073 7.4182,14.1285 7.4182,14.1509C7.4182,14.1733 7.3969,14.1924 7.3729,14.1924ZM7.3729,14.1155C7.3527,14.1155 7.3364,14.1313 7.3364,14.1504C7.3364,14.1689 7.3527,14.1836 7.3729,14.1836C7.3936,14.1836 7.4089,14.1695 7.4089,14.1504C7.4089,14.1313 7.3931,14.1155 7.3729,14.1155ZM7.3996,13.9289L7.3996,13.732L7.4689,13.7489L7.4689,13.9109L7.3996,13.9289ZM7.4089,13.7435L7.4089,13.918L7.4602,13.9033L7.4602,13.7571L7.4089,13.7435ZM7.3489,13.9289L7.2796,13.9109L7.2796,13.7489L7.3489,13.732L7.3489,13.9289ZM7.2878,13.9022L7.3402,13.918L7.3402,13.7435L7.2878,13.7571L7.2878,13.9022ZM7.9882,13.7167L7.9205,13.7167L7.9205,13.6005C7.8933,13.5907 7.8709,13.5695 7.8605,13.5433L7.716,13.5433L7.716,13.4795L7.8605,13.4795C7.8758,13.4424 7.9113,13.4167 7.9533,13.4167C7.9953,13.4167 8.0329,13.4424 8.0465,13.4795L8.1938,13.4795L8.1938,13.5433L8.0455,13.5433C8.0351,13.57 8.016,13.5913 7.9887,13.5989L7.9882,13.7167ZM7.9304,13.7064L7.9795,13.7064L7.98,13.5929L7.9833,13.5913C8.0095,13.5825 8.0285,13.5645 8.0389,13.5389L8.0395,13.5335L8.1851,13.5335L8.1851,13.4887L8.04,13.4887L8.0389,13.4855C8.0269,13.4505 7.9931,13.4265 7.9527,13.4265C7.914,13.4265 7.8796,13.4505 7.8682,13.4855L7.8665,13.4887L7.7258,13.4887L7.7258,13.5335L7.8665,13.5335L7.8682,13.5389C7.8769,13.5656 7.8987,13.5825 7.9265,13.5929L7.9298,13.5945L7.9298,13.7064L7.9304,13.7064Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.9576,15.0105C7.9331,15.0105 7.9124,14.9893 7.9124,14.9658C7.9124,14.9435 7.9331,14.9244 7.9576,14.9244C7.9816,14.9244 8.0024,14.9435 8.0024,14.9658C8.0024,14.9887 7.9816,15.0105 7.9576,15.0105ZM7.9576,14.9336C7.9375,14.9336 7.9211,14.9478 7.9211,14.9658C7.9211,14.9849 7.9375,15.0007 7.9576,15.0007C7.9778,15.0007 7.9942,14.9849 7.9942,14.9658C7.9942,14.9478 7.9778,14.9336 7.9576,14.9336ZM7.9309,14.6931L7.8616,14.6735L7.8616,14.5115L7.9309,14.4924L7.9309,14.6931ZM7.8698,14.6669L7.9216,14.6811L7.9216,14.5033L7.8698,14.518L7.8698,14.6669ZM7.9811,14.6931L7.9811,14.4924L8.0515,14.5115L8.0515,14.6735L7.9811,14.6931ZM7.9904,14.5033L7.9904,14.6811L8.0416,14.6669L8.0416,14.5185L7.9904,14.5033ZM8.1949,14.5567L8.1922,14.5545L8.0836,14.4351L8.1245,14.3756L8.2615,14.5289L8.1949,14.5567ZM8.0962,14.4351L8.1971,14.5469L8.2462,14.5262L8.1245,14.3915L8.0962,14.4351ZM8.2991,14.4989L8.1627,14.3456L8.2287,14.32L8.3395,14.4395L8.2991,14.4989ZM8.1769,14.35L8.2975,14.4853L8.3275,14.4405L8.2265,14.3293L8.1769,14.35ZM8.3209,14.2431L8.1513,14.2431L8.1311,14.1749L8.3422,14.1749L8.3209,14.2431ZM8.1584,14.2333L8.3144,14.2333L8.3296,14.1836L8.1442,14.1836L8.1584,14.2333ZM7.7575,14.2431L7.5878,14.2431L7.5687,14.1749L7.7787,14.1749L7.7575,14.2431ZM7.5944,14.2333L7.7509,14.2333L7.7667,14.1836L7.5802,14.1836L7.5944,14.2333ZM8.5342,14.1924C8.5091,14.1924 8.4895,14.1733 8.4895,14.1509C8.4895,14.1285 8.5091,14.1073 8.5342,14.1073C8.5598,14.1073 8.5789,14.1285 8.5789,14.1509C8.5789,14.1733 8.5593,14.1924 8.5342,14.1924ZM8.5342,14.1155C8.5151,14.1155 8.4987,14.1313 8.4987,14.1504C8.4987,14.1689 8.5151,14.1836 8.5342,14.1836C8.5538,14.1836 8.5696,14.17 8.5696,14.1504C8.5696,14.1307 8.5533,14.1155 8.5342,14.1155ZM8.3422,14.128L8.1311,14.128L8.1513,14.062L8.3209,14.062L8.3422,14.128ZM8.1442,14.1198L8.3296,14.1198L8.3144,14.0685L8.1584,14.0685L8.1442,14.1198ZM7.7787,14.128L7.5687,14.128L7.5878,14.062L7.7575,14.062L7.7787,14.128ZM7.5802,14.1198L7.7667,14.1198L7.7509,14.0685L7.5944,14.0685L7.5802,14.1198ZM7.6675,13.9764L7.5562,13.8531L7.5971,13.7958L7.7335,13.9491L7.6675,13.9764ZM7.5687,13.8515L7.6696,13.9655L7.7193,13.9442L7.5976,13.8105L7.5687,13.8515ZM8.2385,13.9725L8.1725,13.9436L8.3078,13.7904L8.3487,13.8482L8.2385,13.9725ZM8.1867,13.9409L8.2364,13.9622L8.3362,13.8471L8.3078,13.8067L8.1867,13.9409ZM8.5576,13.9289L8.5576,13.732L8.6275,13.7489L8.6275,13.9109L8.5576,13.9289ZM8.5669,13.7435L8.5669,13.918L8.6193,13.9022L8.6193,13.7571L8.5669,13.7435ZM7.7711,13.9153L7.6347,13.7653L7.7013,13.7364L7.7035,13.7385L7.812,13.8602L7.7711,13.9153ZM7.6489,13.7702L7.7705,13.9022L7.7995,13.8596L7.6985,13.7478L7.6489,13.7702ZM8.1338,13.9142L8.0929,13.8569L8.202,13.732L8.2691,13.7609L8.2658,13.7653L8.1338,13.9142ZM8.1049,13.8575L8.1349,13.8978L8.2544,13.7625L8.2053,13.7445L8.1049,13.8575ZM8.3231,13.6027L8.154,13.6027L8.1322,13.5345L8.3427,13.5345L8.3231,13.6027ZM8.16,13.5929L8.3165,13.5929L8.3307,13.5444L8.1436,13.5444L8.16,13.5929ZM7.7569,13.6027L7.5873,13.6027L7.566,13.5345L7.7765,13.5345L7.7569,13.6027ZM7.5944,13.5929L7.7504,13.5929L7.7651,13.5444L7.5791,13.5444L7.5944,13.5929ZM8.5342,13.5547C8.5096,13.5547 8.4895,13.5351 8.4895,13.5127C8.4895,13.4893 8.5096,13.468 8.5342,13.468C8.5598,13.468 8.5789,13.4893 8.5789,13.5127C8.5789,13.5345 8.5593,13.5547 8.5342,13.5547ZM8.5342,13.4778C8.5151,13.4778 8.4993,13.4931 8.4993,13.5122C8.4993,13.5302 8.5151,13.5444 8.5342,13.5444C8.5538,13.5444 8.5702,13.5307 8.5702,13.5122C8.5702,13.4931 8.5538,13.4778 8.5342,13.4778ZM7.9527,13.5547C7.9287,13.5547 7.9075,13.5351 7.9075,13.5127C7.9075,13.4893 7.9282,13.468 7.9527,13.468C7.9778,13.468 7.998,13.4893 7.998,13.5127C7.998,13.5345 7.9778,13.5547 7.9527,13.5547ZM7.9527,13.4778C7.9331,13.4778 7.9173,13.4931 7.9173,13.5122C7.9173,13.5302 7.9331,13.5444 7.9527,13.5444C7.9729,13.5444 7.9893,13.5307 7.9893,13.5122C7.9893,13.4931 7.9729,13.4778 7.9527,13.4778ZM7.3751,13.5547C7.3511,13.5547 7.3298,13.5351 7.3298,13.5127C7.3298,13.4893 7.3511,13.468 7.3751,13.468C7.3991,13.468 7.4204,13.4893 7.4204,13.5127C7.4204,13.5345 7.3996,13.5547 7.3751,13.5547ZM7.3751,13.4778C7.3549,13.4778 7.3385,13.4931 7.3385,13.5122C7.3385,13.5302 7.3549,13.5444 7.3751,13.5444C7.3953,13.5444 7.4111,13.5307 7.4111,13.5122C7.4116,13.4931 7.3958,13.4778 7.3751,13.4778ZM8.3427,13.4887L8.1322,13.4887L8.154,13.4216L8.3231,13.4216L8.3427,13.4887ZM8.1442,13.4795L8.3307,13.4795L8.3165,13.4293L8.16,13.4293L8.1442,13.4795ZM7.7765,13.4887L7.566,13.4887L7.5873,13.4216L7.7569,13.4216L7.7765,13.4887ZM7.5785,13.4795L7.7645,13.4795L7.7498,13.4293L7.5938,13.4293L7.5785,13.4795ZM7.98,13.8585L7.98,13.6584L8.0493,13.6775L8.0493,13.8384L7.98,13.8585ZM7.9887,13.6698L7.9887,13.8471L8.0405,13.8335L8.0405,13.6845L7.9887,13.6698ZM7.9304,13.8585L7.8605,13.8384L7.8605,13.6775L7.9304,13.6584L7.9304,13.8585ZM7.8693,13.8329L7.9211,13.8465L7.9211,13.6693L7.8693,13.6835L7.8693,13.8329Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#058E6E" + android:fillType="nonZero" + android:pathData="M7.8627,14.1525C7.8627,14.1024 7.9047,14.062 7.9576,14.062C8.01,14.062 8.0515,14.1024 8.0515,14.1525C8.0515,14.2005 8.0095,14.242 7.9576,14.242C7.9047,14.242 7.8627,14.2005 7.8627,14.1525" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#DB4446" + android:fillType="nonZero" + android:pathData="M7.9778,11.8098L7.9805,11.7885L7.9833,11.776C7.9833,11.776 7.9265,11.7804 7.8982,11.7738C7.8693,11.7645 7.842,11.7531 7.8153,11.7291C7.7875,11.7056 7.7771,11.6909 7.758,11.6893C7.71,11.6811 7.6751,11.7024 7.6751,11.7024C7.6751,11.7024 7.71,11.7149 7.7356,11.7493C7.7624,11.7804 7.7913,11.7962 7.8033,11.8016C7.8251,11.806 7.8955,11.8016 7.9145,11.8033C7.9336,11.8049 7.9778,11.8098 7.9778,11.8098" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.2557,11.9334L8.2437,11.9324C8.2427,11.9324 8.1617,11.9214 8.1267,11.9194C8.1167,11.9194 8.0977,11.9194 8.0747,11.9204C8.0557,11.9214 8.0327,11.9214 8.0097,11.9214C7.9627,11.9214 7.9347,11.9194 7.9207,11.9114C7.8987,11.9064 7.8407,11.8804 7.7907,11.8124C7.7467,11.7584 7.6827,11.7354 7.6817,11.7354L7.6587,11.7234L7.6817,11.7134C7.6817,11.7114 7.7327,11.6784 7.8027,11.6784C7.8177,11.6784 7.8287,11.6804 7.8407,11.6844C7.8727,11.6924 7.8927,11.7054 7.9227,11.7354C7.9317,11.7424 7.9407,11.7494 7.9527,11.7624C7.9977,11.7974 8.0417,11.8194 8.1007,11.8384C8.1217,11.8424 8.1507,11.8464 8.1917,11.8464C8.2247,11.8464 8.2517,11.8424 8.2527,11.8424L8.2697,11.8404L8.2617,11.8824L8.2557,11.9334ZM8.1157,11.8944C8.1207,11.8944 8.1257,11.8944 8.1267,11.8944C8.1557,11.8964 8.2087,11.9044 8.2317,11.9044L8.2377,11.8714C8.2257,11.8734 8.2077,11.8734 8.1907,11.8734C8.1487,11.8734 8.1147,11.8694 8.0927,11.8634C8.0317,11.8434 7.9827,11.8184 7.9367,11.7834C7.9237,11.7714 7.9147,11.7634 7.9037,11.7524C7.8757,11.7254 7.8607,11.7174 7.8377,11.7114C7.8257,11.7074 7.8147,11.7054 7.8017,11.7054C7.7657,11.7054 7.7347,11.7174 7.7167,11.7234C7.7397,11.7394 7.7787,11.7624 7.8107,11.7954C7.8537,11.8564 7.9047,11.8844 7.9277,11.8894C7.9397,11.8954 7.9677,11.8974 8.0097,11.8974C8.0317,11.8974 8.0557,11.8974 8.0747,11.8974C8.0917,11.8944 8.1047,11.8944 8.1157,11.8944Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#ED72AA" + android:fillType="nonZero" + android:pathData="M8.2385,11.7302C8.2385,11.7302 8.2385,11.7547 8.2407,11.7804C8.2429,11.8033 8.2331,11.8235 8.2369,11.836C8.2407,11.8485 8.2429,11.8573 8.2478,11.8687C8.2522,11.8791 8.256,11.9015 8.256,11.9015C8.256,11.9015 8.2424,11.8916 8.2304,11.8824C8.2178,11.8725 8.208,11.8682 8.208,11.8682C8.208,11.8682 8.2113,11.8922 8.2118,11.9047C8.214,11.9145 8.2205,11.9347 8.2304,11.9462C8.2396,11.9576 8.2593,11.9773 8.2653,11.9931C8.2718,12.0067 8.2718,12.0422 8.2718,12.0422C8.2718,12.0422 8.2555,12.016 8.2407,12.0111C8.2271,12.0067 8.1976,11.9898 8.1976,11.9898C8.1976,11.9898 8.2244,12.0176 8.2244,12.0444C8.2244,12.0711 8.214,12.0995 8.214,12.0995C8.214,12.0995 8.2015,12.0755 8.1856,12.0602C8.1687,12.046 8.1464,12.0296 8.1464,12.0296C8.1464,12.0296 8.1633,12.0711 8.1633,12.0967C8.1633,12.124 8.1589,12.1818 8.1589,12.1818C8.1589,12.1818 8.1447,12.1605 8.1311,12.1475C8.118,12.1376 8.1011,12.1273 8.0962,12.1218C8.0913,12.1131 8.112,12.1436 8.1153,12.1616C8.1169,12.1769 8.1251,12.2413 8.1813,12.3242C8.214,12.37 8.2636,12.454 8.3711,12.4284C8.4796,12.3995 8.4387,12.2538 8.4158,12.1873C8.3929,12.1218 8.3831,12.0449 8.3836,12.0193C8.3847,11.9936 8.4033,11.9167 8.4011,11.902C8.3995,11.8873 8.3929,11.8316 8.4055,11.7891C8.4196,11.7411 8.4311,11.7253 8.4382,11.704C8.4464,11.6871 8.4524,11.674 8.4545,11.6593C8.4567,11.6402 8.4567,11.6102 8.4567,11.6102C8.4567,11.6102 8.4769,11.6484 8.4824,11.6615C8.4873,11.674 8.4873,11.7127 8.4873,11.7127C8.4873,11.7127 8.4916,11.6745 8.5211,11.6544C8.5522,11.6364 8.5865,11.6151 8.5953,11.6053C8.6045,11.5955 8.6067,11.5884 8.6067,11.5884C8.6067,11.5884 8.604,11.6533 8.5849,11.6789C8.5724,11.698 8.5249,11.7531 8.5249,11.7531C8.5249,11.7531 8.5495,11.7427 8.5658,11.7416C8.5844,11.7411 8.5969,11.7416 8.5969,11.7416C8.5969,11.7416 8.5762,11.7575 8.5478,11.7989C8.5211,11.8404 8.5315,11.8431 8.5124,11.8758C8.4922,11.9091 8.4758,11.9091 8.4513,11.9304C8.4131,11.9604 8.4327,12.0815 8.4387,12.0995C8.4431,12.1158 8.5091,12.2631 8.5091,12.3002C8.5113,12.3345 8.5178,12.4153 8.4551,12.4665C8.4142,12.4976 8.3487,12.4976 8.3335,12.5085C8.3176,12.5189 8.2887,12.5473 8.2887,12.6084C8.2887,12.6722 8.3111,12.6798 8.328,12.6967C8.3465,12.7104 8.3684,12.7022 8.3733,12.7147C8.3782,12.7262 8.3815,12.7338 8.3875,12.7404C8.3962,12.7491 8.4,12.7551 8.3978,12.7682C8.3962,12.7807 8.3667,12.8129 8.3569,12.832C8.346,12.8544 8.3269,12.91 8.3269,12.9182C8.3269,12.928 8.3242,12.9531 8.3335,12.9662C8.3335,12.9662 8.3645,13.0033 8.3427,13.0087C8.3302,13.0142 8.316,13.0011 8.3095,13.0033C8.2909,13.0076 8.2811,13.0185 8.2756,13.0169C8.2631,13.0169 8.2631,13.0082 8.262,12.9913C8.2604,12.9733 8.2615,12.9656 8.256,12.9656C8.2478,12.9656 8.244,12.9711 8.244,12.9815C8.2418,12.9913 8.2418,13.0125 8.2336,13.0125C8.2249,13.0125 8.2118,12.9956 8.2047,12.994C8.1965,12.9913 8.1758,12.9858 8.1742,12.9787C8.1742,12.9684 8.1867,12.9465 8.2009,12.9444C8.2151,12.94 8.2276,12.9318 8.2189,12.9275C8.2091,12.9187 8.2009,12.9187 8.1927,12.9275C8.1835,12.9318 8.1644,12.9275 8.1665,12.9171C8.1682,12.9056 8.1704,12.8931 8.1682,12.8876C8.1682,12.88 8.1518,12.8675 8.172,12.8576C8.1922,12.8478 8.2009,12.8675 8.2211,12.8647C8.2407,12.862 8.2505,12.8533 8.2582,12.8418C8.2664,12.8293 8.2642,12.8036 8.2505,12.7895C8.238,12.7736 8.2233,12.7736 8.2184,12.7622C8.2124,12.7518 8.2058,12.7295 8.2058,12.7295C8.2058,12.7295 8.2085,12.7731 8.2064,12.7775C8.2042,12.784 8.2058,12.8085 8.2058,12.8085C8.2058,12.8085 8.1922,12.7916 8.1802,12.7807C8.1698,12.7693 8.1573,12.7349 8.1573,12.7349C8.1573,12.7349 8.1573,12.766 8.1573,12.7785C8.1573,12.7911 8.1715,12.8031 8.1671,12.8107C8.1611,12.8145 8.1382,12.7862 8.1316,12.7785C8.1251,12.7747 8.106,12.7605 8.0967,12.7425C8.0869,12.7267 8.0809,12.7022 8.0787,12.6956C8.0765,12.6864 8.0722,12.6498 8.0765,12.6389C8.0825,12.6242 8.0929,12.5996 8.0929,12.5996C8.0929,12.5996 8.07,12.5996 8.0438,12.5996C8.0171,12.5996 7.9985,12.5942 7.9882,12.6105C7.9778,12.6275 7.9844,12.6629 7.9964,12.7098C8.0089,12.7567 8.0165,12.778 8.0127,12.7867C8.0089,12.7965 7.9925,12.8151 7.9865,12.8167C7.98,12.8233 7.9625,12.8211 7.9555,12.8167C7.9473,12.814 7.9353,12.808 7.9113,12.808C7.8873,12.808 7.8731,12.8091 7.8633,12.8058C7.8551,12.8036 7.8349,12.7922 7.824,12.796C7.8136,12.7993 7.7967,12.8069 7.8011,12.8205C7.8093,12.8418 7.7929,12.8473 7.7836,12.8451C7.7738,12.8429 7.7645,12.8407 7.752,12.8375C7.74,12.8331 7.7209,12.8375 7.7231,12.8238C7.7258,12.8091 7.7313,12.808 7.7373,12.7982C7.7433,12.7867 7.7455,12.778 7.7384,12.778C7.7291,12.778 7.7209,12.7769 7.7138,12.7824C7.7067,12.7884 7.6964,12.7993 7.6871,12.7955C7.6784,12.7905 7.6713,12.7791 7.6713,12.7589C7.6713,12.7355 7.6484,12.7153 7.6702,12.7175C7.6915,12.7185 7.7187,12.7355 7.7236,12.7229C7.728,12.7104 7.7253,12.7049 7.7138,12.6973C7.7024,12.6858 7.6871,12.6815 7.7024,12.6695C7.7187,12.658 7.722,12.658 7.728,12.6504C7.7345,12.6449 7.7427,12.6231 7.7536,12.6269C7.7755,12.6378 7.7542,12.6525 7.7765,12.676C7.7989,12.7016 7.8115,12.7104 7.8475,12.706C7.8845,12.7016 7.8944,12.6973 7.8944,12.688C7.8944,12.6765 7.8916,12.6591 7.8895,12.6509C7.8878,12.6455 7.8944,12.6176 7.8944,12.6176C7.8944,12.6176 7.8785,12.6264 7.8725,12.6378C7.8687,12.6482 7.8589,12.6635 7.8589,12.6635C7.8589,12.6635 7.8545,12.6455 7.8562,12.6264C7.8562,12.6176 7.8595,12.5996 7.8595,12.5969C7.8589,12.5865 7.8518,12.5631 7.8518,12.5631C7.8518,12.5631 7.8469,12.5876 7.842,12.5969C7.8376,12.604 7.8365,12.6335 7.8365,12.6335C7.8365,12.6335 7.8131,12.6122 7.8191,12.5811C7.8235,12.5544 7.8147,12.52 7.8235,12.5085C7.83,12.4971 7.8491,12.4529 7.8938,12.4502C7.9385,12.4475 7.974,12.4535 7.9898,12.4513C8.0062,12.4502 8.0613,12.4415 8.0613,12.4415C8.0613,12.4415 7.9582,12.3869 7.9358,12.37C7.9124,12.3564 7.8753,12.3149 7.8638,12.2964C7.8524,12.2778 7.8415,12.2407 7.8415,12.2407C7.8415,12.2407 7.8235,12.2407 7.8065,12.2522C7.7896,12.2625 7.7727,12.2751 7.7635,12.2865C7.7536,12.2975 7.7378,12.3215 7.7378,12.3215C7.7378,12.3215 7.7405,12.2887 7.7405,12.2789C7.7405,12.268 7.7389,12.2489 7.7389,12.2489C7.7389,12.2489 7.728,12.2925 7.704,12.3105C7.6805,12.3269 7.6533,12.3509 7.6533,12.3509C7.6533,12.3509 7.656,12.3253 7.656,12.3176C7.656,12.3138 7.6615,12.2855 7.6615,12.2855C7.6615,12.2855 7.6451,12.31 7.6195,12.3149C7.5938,12.3176 7.5573,12.3165 7.5545,12.334C7.5518,12.3504 7.5622,12.3695 7.5556,12.3804C7.5491,12.3929 7.5365,12.4016 7.5365,12.4016C7.5365,12.4016 7.5224,12.3891 7.5098,12.3891C7.4973,12.388 7.4858,12.3935 7.4858,12.3935C7.4858,12.3935 7.4744,12.3798 7.4787,12.3689C7.4825,12.3613 7.5016,12.3471 7.4973,12.3411C7.4924,12.3367 7.4765,12.3422 7.4667,12.3487C7.4575,12.3525 7.4367,12.3553 7.4384,12.3411C7.4411,12.3253 7.4449,12.3165 7.4411,12.304C7.4351,12.2931 7.4384,12.2871 7.4465,12.2849C7.4536,12.2805 7.4858,12.286 7.4891,12.2773C7.4913,12.2702 7.4798,12.2615 7.4602,12.256C7.4395,12.2516 7.4291,12.2402 7.4411,12.2282C7.4509,12.2195 7.4536,12.2156 7.4591,12.208C7.4635,12.1971 7.4667,12.1813 7.4847,12.1889C7.5027,12.1976 7.4984,12.2178 7.5185,12.2244C7.5382,12.2315 7.5845,12.2227 7.5949,12.2151C7.6047,12.2096 7.6358,12.1873 7.6462,12.1829C7.6571,12.1753 7.7018,12.1436 7.7018,12.1436C7.7018,12.1436 7.6751,12.1245 7.6653,12.1147C7.656,12.1071 7.6385,12.0831 7.6304,12.0798C7.6205,12.0733 7.578,12.058 7.5627,12.0564C7.5485,12.0564 7.5033,12.0405 7.5033,12.0405C7.5033,12.0405 7.5245,12.034 7.5311,12.0291C7.5376,12.0225 7.554,12.0089 7.5611,12.01C7.5693,12.01 7.5709,12.01 7.5709,12.01C7.5709,12.01 7.5289,12.0089 7.5207,12.0056C7.512,12.0045 7.4864,11.9876 7.4771,11.9876C7.4673,11.9876 7.4471,11.9931 7.4471,11.9931C7.4471,11.9931 7.4733,11.9751 7.4951,11.9718C7.5158,11.9675 7.5333,11.9675 7.5333,11.9675C7.5333,11.9675 7.4989,11.9587 7.4924,11.9473C7.4836,11.9364 7.4771,11.9205 7.4705,11.9129C7.464,11.9058 7.4607,11.8938 7.4498,11.8933C7.4384,11.8905 7.4198,11.9058 7.4095,11.9047C7.3991,11.9031 7.3904,11.8955 7.3904,11.8807C7.3898,11.8649 7.3904,11.8693 7.3865,11.8638C7.3822,11.8545 7.3669,11.8349 7.3811,11.8305C7.3969,11.8262 7.4275,11.8316 7.4302,11.8262C7.4329,11.8218 7.4133,11.8049 7.4007,11.7995C7.3882,11.7918 7.3685,11.7793 7.3778,11.7716C7.3893,11.7618 7.4002,11.7591 7.4067,11.7493C7.4122,11.7405 7.4193,11.7182 7.4324,11.7264C7.4444,11.7345 7.4613,11.7695 7.4711,11.7662C7.4809,11.7645 7.4825,11.7378 7.4798,11.7269C7.4782,11.7155 7.4798,11.698 7.4896,11.698C7.4989,11.7007 7.5076,11.7133 7.5235,11.7138C7.5387,11.7149 7.5633,11.7105 7.56,11.7225C7.5584,11.7329 7.5502,11.7471 7.5382,11.7585C7.5278,11.77 7.5229,11.7935 7.53,11.8109C7.5371,11.8256 7.5535,11.8513 7.5687,11.8622C7.5851,11.8709 7.614,11.8785 7.6325,11.89C7.6516,11.9025 7.6942,11.9375 7.7095,11.9413C7.7242,11.9445 7.7384,11.9538 7.7384,11.9538C7.7384,11.9538 7.7547,11.944 7.7776,11.944C7.8005,11.944 7.8524,11.9473 7.872,11.9407C7.8922,11.9309 7.9173,11.9178 7.9085,11.9004C7.9009,11.8813 7.8578,11.8665 7.8622,11.8529C7.866,11.8387 7.8818,11.8387 7.9075,11.8387C7.9336,11.8376 7.9707,11.842 7.9778,11.8044C7.9844,11.7662 7.986,11.7471 7.9495,11.7378C7.9113,11.7275 7.8845,11.7275 7.878,11.7024C7.8709,11.6756 7.8638,11.6691 7.872,11.6615C7.8791,11.6533 7.8933,11.65 7.9205,11.6489C7.9484,11.6473 7.9789,11.6473 7.9882,11.6385C7.9975,11.6342 7.9991,11.6151 8.0105,11.6085C8.0204,11.5998 8.0629,11.596 8.0629,11.596C8.0629,11.596 8.1131,11.6205 8.1605,11.6527C8.2025,11.686 8.2402,11.7307 8.2402,11.7307" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.2751,13.0224C8.2751,13.0224 8.2751,13.0224 8.274,13.0224C8.256,13.0202 8.256,13.0076 8.2549,12.9929L8.2538,12.9815C8.2538,12.9787 8.2533,12.976 8.2527,12.9716C8.2522,12.9727 8.25,12.976 8.25,12.9815C8.25,12.9815 8.2495,12.9847 8.2495,12.9891C8.2473,13.0016 8.2467,13.0185 8.2336,13.0185C8.2249,13.0185 8.2184,13.0115 8.2107,13.006C8.2075,13.0033 8.2036,13 8.2025,12.9989C8.1998,12.9978 8.1971,12.9956 8.1944,12.9945C8.1835,12.9929 8.1698,12.9891 8.1676,12.9776C8.1665,12.9651 8.1824,12.9411 8.1998,12.9373C8.2075,12.934 8.2124,12.9307 8.214,12.9307C8.2075,12.9264 8.2025,12.9264 8.1965,12.9307C8.1889,12.9384 8.1775,12.9362 8.1693,12.9307C8.1622,12.928 8.1578,12.9209 8.1595,12.9155L8.1605,12.9051C8.1611,12.9007 8.1622,12.8915 8.1611,12.8882C8.1611,12.8882 8.1611,12.8871 8.1605,12.8849C8.1578,12.8795 8.154,12.8751 8.1551,12.8658C8.1578,12.8615 8.1611,12.8544 8.1682,12.8527C8.1829,12.8435 8.1927,12.85 8.202,12.8533C8.2075,12.8544 8.2124,12.8587 8.2189,12.8565C8.2385,12.8544 8.2473,12.8478 8.2533,12.8375C8.2593,12.8287 8.2571,12.8064 8.2462,12.7938C8.2396,12.7862 8.2336,12.7829 8.2282,12.778C8.2222,12.7764 8.2189,12.7736 8.2156,12.7682C8.2151,12.7736 8.2145,12.778 8.2135,12.7791C8.2129,12.7845 8.2129,12.7982 8.2129,12.8085L8.214,12.8276L8.2015,12.8124C8.2015,12.8124 8.1878,12.7998 8.1769,12.7867C8.172,12.7813 8.1682,12.7742 8.1649,12.7655C8.1649,12.7742 8.1649,12.7769 8.1649,12.7791C8.1649,12.7867 8.1682,12.79 8.1715,12.7938C8.1747,12.8009 8.1785,12.8085 8.1725,12.8151C8.1649,12.8238 8.1524,12.8118 8.1382,12.7938C8.1344,12.7905 8.1305,12.7862 8.1295,12.7862C8.1175,12.7764 8.1005,12.7622 8.0918,12.748C8.0831,12.73 8.0771,12.7087 8.0744,12.6984C8.0716,12.688 8.0662,12.6498 8.0716,12.6373C8.0755,12.6285 8.0809,12.6165 8.0842,12.6073L8.0455,12.6073C8.0378,12.6073 8.0313,12.6073 8.0253,12.6073C8.0084,12.6062 8.0013,12.6062 7.9958,12.6127C7.9887,12.6275 7.9909,12.6585 8.0045,12.7098L8.0095,12.7267C8.0204,12.7649 8.0242,12.7802 8.0209,12.7895C8.0165,12.7993 7.9991,12.8184 7.9915,12.8244C7.9833,12.8287 7.962,12.8271 7.9544,12.8244C7.9473,12.8189 7.9353,12.814 7.9129,12.814C7.9064,12.814 7.9004,12.814 7.8944,12.814C7.8807,12.814 7.8709,12.8145 7.8638,12.8113C7.8616,12.8113 7.8573,12.8113 7.8524,12.8091C7.8453,12.8036 7.8322,12.7998 7.8262,12.8015C7.8196,12.8025 7.812,12.8075 7.8098,12.8113C7.8082,12.8145 7.8076,12.8156 7.8093,12.8167C7.8136,12.8304 7.8109,12.8396 7.8076,12.8424C7.8011,12.85 7.7918,12.8533 7.7853,12.8516C7.7771,12.85 7.7711,12.85 7.7629,12.8467C7.7596,12.8456 7.7558,12.8435 7.752,12.8413C7.7487,12.8413 7.7449,12.8413 7.7411,12.8413C7.7335,12.8402 7.7247,12.8402 7.7209,12.8336C7.7176,12.8282 7.7176,12.8255 7.7176,12.8222C7.7209,12.8113 7.7242,12.8042 7.7275,12.8004C7.7296,12.7987 7.7302,12.7976 7.7329,12.7922C7.7351,12.7889 7.7367,12.7856 7.7367,12.7856C7.7302,12.7845 7.7242,12.7845 7.7209,12.7873L7.7176,12.79C7.7095,12.7976 7.6985,12.8058 7.686,12.8015C7.6729,12.7933 7.6664,12.7785 7.6664,12.7584C7.6664,12.7502 7.6636,12.7425 7.6598,12.7349C7.6571,12.7262 7.6533,12.7224 7.6571,12.7136C7.6609,12.7093 7.6675,12.7093 7.6724,12.7093C7.6811,12.7109 7.6904,12.7136 7.698,12.7147C7.7051,12.718 7.7171,12.7224 7.7193,12.7202C7.7225,12.7109 7.722,12.7093 7.7105,12.7C7.7095,12.6995 7.7078,12.6967 7.7051,12.6967C7.698,12.6902 7.6915,12.6864 7.6915,12.6776C7.6915,12.6727 7.6947,12.6678 7.7013,12.6629C7.7078,12.6585 7.7133,12.6542 7.7171,12.6504C7.7204,12.6493 7.7236,12.6487 7.7253,12.646C7.7269,12.6449 7.7275,12.6416 7.7296,12.6373C7.7356,12.6307 7.7449,12.6149 7.7585,12.622C7.7722,12.6291 7.7727,12.6373 7.7733,12.646C7.7738,12.6547 7.7744,12.6618 7.7831,12.6716C7.8038,12.6973 7.8164,12.7016 7.8485,12.6989C7.8835,12.6973 7.8889,12.6896 7.8889,12.6875C7.8889,12.6776 7.8867,12.6629 7.8856,12.6575L7.8845,12.6498C7.884,12.6471 7.8851,12.6389 7.8867,12.6329C7.8835,12.6356 7.8818,12.6373 7.8802,12.6384C7.8769,12.6498 7.8665,12.6673 7.866,12.6684L7.8573,12.6842L7.8535,12.6651C7.8535,12.664 7.8485,12.646 7.8507,12.6247C7.8507,12.6204 7.8507,12.6138 7.8524,12.6078C7.8535,12.6045 7.854,12.598 7.854,12.5975C7.854,12.5947 7.8535,12.5936 7.8529,12.5893C7.8507,12.5947 7.8507,12.5975 7.8491,12.5991C7.848,12.6035 7.8447,12.6204 7.8447,12.6335L7.8436,12.6476L7.8327,12.6373C7.8322,12.6373 7.8071,12.6149 7.8142,12.5789C7.8158,12.568 7.8158,12.5544 7.8153,12.544C7.8142,12.5249 7.8131,12.5118 7.8191,12.5058C7.8196,12.5047 7.8218,12.5015 7.8224,12.4971C7.8322,12.4802 7.8535,12.4447 7.8955,12.4431C7.9233,12.4415 7.9467,12.4431 7.9658,12.4442C7.9762,12.4447 7.9849,12.4447 7.9915,12.4447C8.0013,12.4442 8.0247,12.4415 8.0427,12.436C8.0111,12.4202 7.9505,12.3902 7.9342,12.3776C7.9085,12.3613 7.8725,12.3182 7.8611,12.3007C7.8513,12.286 7.842,12.2615 7.8382,12.2495C7.8316,12.2495 7.8218,12.2522 7.8115,12.2571C7.7935,12.2669 7.7776,12.2795 7.7705,12.2909C7.7613,12.3013 7.746,12.3264 7.746,12.3264L7.7335,12.3209C7.7335,12.3209 7.7362,12.292 7.7362,12.2805C7.7296,12.2931 7.7204,12.3073 7.71,12.3165C7.6865,12.3313 7.6598,12.3558 7.6598,12.3558L7.6473,12.3673L7.6484,12.3509C7.6505,12.3395 7.6511,12.3253 7.6511,12.3187C7.6511,12.3176 7.6522,12.3133 7.6533,12.3062C7.6451,12.3138 7.6347,12.3187 7.6227,12.322C7.6162,12.3242 7.6085,12.3253 7.602,12.3264C7.5862,12.3264 7.5638,12.3296 7.5627,12.3373C7.5611,12.3427 7.5627,12.352 7.5633,12.3564C7.5655,12.3678 7.5665,12.3776 7.5633,12.3869C7.5562,12.3989 7.5415,12.4076 7.5409,12.4076L7.5376,12.4098L7.5338,12.4076C7.5305,12.4033 7.5185,12.3951 7.5098,12.3951C7.4989,12.3951 7.4896,12.4016 7.4896,12.4016L7.4836,12.4038L7.4798,12.3995C7.4798,12.3962 7.4673,12.3815 7.4733,12.3695C7.4744,12.3651 7.4798,12.3585 7.4831,12.3553C7.4858,12.3525 7.488,12.3504 7.4896,12.3471C7.4847,12.3493 7.4744,12.3525 7.4705,12.3558C7.4629,12.358 7.4476,12.3656 7.4384,12.3569C7.4351,12.3558 7.4313,12.3525 7.4318,12.3427C7.4318,12.3389 7.4335,12.3313 7.4345,12.3302C7.4351,12.3198 7.4373,12.3165 7.4345,12.3105C7.4302,12.3018 7.4318,12.2936 7.4324,12.2893C7.4345,12.2855 7.4384,12.2805 7.4444,12.2795C7.4471,12.2789 7.4536,12.2789 7.4618,12.2778C7.4667,12.2778 7.4771,12.2778 7.482,12.2762C7.4793,12.274 7.4727,12.2675 7.4585,12.2647C7.4433,12.2631 7.4324,12.2533 7.4302,12.2429C7.4285,12.2375 7.4307,12.2304 7.4356,12.2265C7.4471,12.2162 7.4487,12.2151 7.4542,12.2047C7.4542,12.2036 7.4542,12.2025 7.4553,12.2009C7.4575,12.1938 7.4607,12.1867 7.4695,12.1845C7.4738,12.1813 7.4798,12.1824 7.4875,12.1867C7.4989,12.1911 7.5022,12.1993 7.5071,12.2047C7.5109,12.2124 7.5136,12.2162 7.5218,12.2195C7.5382,12.2265 7.5824,12.2162 7.5911,12.2118C7.5949,12.2107 7.6036,12.2031 7.6129,12.1993C7.6244,12.1895 7.6369,12.1813 7.6435,12.178C7.65,12.1736 7.6756,12.1567 7.6909,12.1458C7.6816,12.1382 7.6685,12.1267 7.6615,12.1224C7.6576,12.1191 7.6522,12.1136 7.6484,12.1098C7.6407,12.1 7.6309,12.0885 7.6271,12.0875C7.6178,12.0842 7.5758,12.0662 7.5633,12.0651C7.5475,12.0629 7.506,12.0504 7.5022,12.0493L7.4831,12.0427L7.5022,12.0362C7.5093,12.0329 7.5224,12.0285 7.5273,12.0247L7.5305,12.0231C7.5316,12.0204 7.5349,12.0204 7.5371,12.0182C7.5284,12.0171 7.5224,12.016 7.5185,12.0138C7.5158,12.0116 7.5093,12.0105 7.5027,12.0073C7.4951,12.0029 7.4804,11.9958 7.4771,11.9958C7.4689,11.9958 7.4542,11.9985 7.4482,11.9985L7.4438,11.986C7.4455,11.986 7.4711,11.9691 7.4935,11.9669C7.4962,11.9658 7.4995,11.9658 7.5016,11.9653C7.4956,11.9604 7.4902,11.9576 7.4864,11.9549C7.4836,11.9473 7.4787,11.9424 7.4749,11.9347C7.4711,11.9293 7.4673,11.9222 7.4645,11.9178C7.4645,11.9178 7.4613,11.9145 7.4607,11.9102C7.4564,11.9047 7.4536,11.9015 7.4493,11.9004C7.4455,11.9004 7.4389,11.9047 7.4324,11.9064C7.4242,11.9091 7.416,11.9135 7.4095,11.9124C7.3936,11.9102 7.3838,11.9009 7.3838,11.8835L7.3833,11.8791C7.3833,11.8747 7.3827,11.8715 7.3827,11.8704C7.3811,11.8704 7.3811,11.8693 7.3811,11.866C7.38,11.866 7.3778,11.8638 7.3778,11.8605C7.3718,11.8529 7.3664,11.8431 7.3696,11.8316C7.3713,11.8305 7.3735,11.8273 7.38,11.8251C7.3882,11.8218 7.4007,11.8229 7.4105,11.8229C7.4144,11.824 7.4193,11.824 7.422,11.824C7.4165,11.8185 7.4073,11.8104 7.398,11.806C7.3816,11.7973 7.3707,11.7891 7.3685,11.7804C7.3685,11.776 7.3685,11.7716 7.3751,11.7678C7.3789,11.7635 7.3844,11.7613 7.3876,11.7569C7.3942,11.7536 7.3975,11.7504 7.4002,11.7482C7.4013,11.7449 7.4029,11.7416 7.4035,11.7405C7.4089,11.7307 7.4133,11.7225 7.422,11.7193C7.4253,11.7171 7.4285,11.7171 7.4345,11.7215C7.4411,11.7247 7.4471,11.734 7.4542,11.7416C7.4596,11.7504 7.4667,11.7607 7.47,11.7629C7.4727,11.7596 7.4755,11.7416 7.4727,11.7285C7.4711,11.7187 7.4716,11.7029 7.4793,11.6964C7.4825,11.6909 7.4858,11.6898 7.4907,11.6909C7.4956,11.692 7.5016,11.6975 7.5049,11.7002C7.5115,11.7029 7.5158,11.7078 7.5235,11.7084C7.5273,11.7084 7.5305,11.7084 7.5355,11.7084C7.5475,11.7078 7.5589,11.7073 7.5633,11.7133C7.5655,11.716 7.5665,11.7193 7.5655,11.7247C7.5627,11.7389 7.5496,11.7547 7.5425,11.7629C7.5338,11.7744 7.53,11.7929 7.5349,11.8076C7.542,11.8245 7.5584,11.8469 7.572,11.8567C7.5796,11.8611 7.5905,11.8655 7.6004,11.8693C7.6124,11.8747 7.6255,11.8796 7.6353,11.8851C7.6418,11.8905 7.6489,11.8949 7.6576,11.902C7.6767,11.9156 7.7018,11.9331 7.7105,11.9331C7.722,11.9385 7.7335,11.9435 7.7378,11.9445C7.7444,11.9429 7.7596,11.9391 7.7771,11.9391C7.7825,11.9391 7.7885,11.9391 7.7956,11.9391C7.818,11.9402 7.8545,11.9413 7.8687,11.9325C7.8878,11.926 7.8998,11.9173 7.9025,11.9091C7.9042,11.9069 7.9042,11.9058 7.9025,11.9025C7.9004,11.8949 7.8889,11.89 7.8796,11.8813C7.8665,11.8725 7.8524,11.8644 7.8562,11.8513C7.8605,11.83 7.8824,11.83 7.908,11.83C7.9113,11.83 7.9145,11.83 7.9189,11.83C7.9473,11.83 7.9658,11.8284 7.9718,11.8033C7.9789,11.7651 7.9789,11.7515 7.9484,11.7449C7.9429,11.7427 7.9375,11.7405 7.9315,11.7405C7.902,11.7362 7.8785,11.7291 7.872,11.7024C7.8704,11.6958 7.8671,11.6898 7.8665,11.6855C7.8622,11.6729 7.86,11.6642 7.8676,11.6565C7.8775,11.6467 7.8927,11.644 7.9216,11.6407C7.9282,11.6407 7.9336,11.6396 7.9396,11.6396C7.9571,11.6385 7.9795,11.6385 7.9855,11.6342C7.9887,11.6342 7.9904,11.6255 7.992,11.6227C7.9953,11.6145 7.9991,11.6085 8.0067,11.602C8.0176,11.5955 8.058,11.5873 8.0618,11.5873L8.0645,11.5873L8.0656,11.5873C8.0662,11.5873 8.1169,11.6129 8.1638,11.6484C8.2058,11.6789 8.2435,11.7236 8.244,11.7269L8.2407,11.7291L8.2473,11.7291C8.2473,11.7302 8.2473,11.7536 8.2489,11.7782C8.2505,11.7907 8.2478,11.8033 8.2473,11.8131C8.2445,11.8207 8.2445,11.8284 8.2445,11.8311C8.2462,11.8365 8.2473,11.8387 8.2473,11.842C8.2505,11.8518 8.2511,11.8556 8.2549,11.8644C8.2604,11.8742 8.2636,11.8944 8.2636,11.8987L8.2647,11.9156L8.2527,11.9053C8.2527,11.9053 8.2391,11.8938 8.2265,11.8862C8.2233,11.8824 8.2205,11.8813 8.2189,11.8796C8.2189,11.8878 8.2189,11.8938 8.22,11.9015C8.2216,11.9091 8.2276,11.9282 8.2364,11.9407C8.238,11.9424 8.2413,11.9451 8.2445,11.9473C8.2549,11.9587 8.2685,11.974 8.2729,11.9876C8.28,12.0045 8.2795,12.0378 8.2795,12.04L8.2789,12.0602L8.2669,12.0433C8.2604,12.0335 8.2484,12.0176 8.2407,12.0165C8.2347,12.0138 8.2287,12.0089 8.2222,12.0078C8.2287,12.0176 8.2331,12.0302 8.2331,12.0422C8.2331,12.0689 8.2222,12.0978 8.2222,12.0989L8.2156,12.1115L8.2091,12.0989C8.2091,12.0989 8.1965,12.0776 8.1813,12.0618C8.1753,12.0564 8.1682,12.0509 8.1616,12.0471C8.1671,12.0607 8.1715,12.0804 8.1715,12.0951C8.1715,12.1224 8.1682,12.1769 8.1676,12.1813L8.1649,12.2015L8.1556,12.1845C8.1556,12.1845 8.142,12.1622 8.1295,12.1502C8.1262,12.1491 8.1229,12.1475 8.1191,12.1458C8.1207,12.1502 8.1235,12.1567 8.1235,12.1584C8.13,12.2129 8.1518,12.2647 8.1884,12.3171L8.1938,12.3247C8.226,12.3727 8.2735,12.4442 8.3716,12.4185C8.3951,12.4142 8.4142,12.4005 8.424,12.3804C8.4464,12.3411 8.4415,12.2773 8.4115,12.1884C8.3885,12.1202 8.3776,12.0433 8.3793,12.0176C8.3793,12.0051 8.3836,11.9827 8.3885,11.9582C8.3918,11.9358 8.3984,11.9069 8.3967,11.9025C8.3935,11.8824 8.3885,11.8289 8.4016,11.7842C8.4115,11.7515 8.4207,11.7329 8.4273,11.7171C8.4305,11.7105 8.4333,11.7062 8.4344,11.7013C8.4371,11.6958 8.4387,11.6898 8.4398,11.6871C8.4453,11.6756 8.4491,11.6664 8.4502,11.656C8.4529,11.6385 8.4529,11.6085 8.4529,11.6085L8.4655,11.6075C8.4655,11.6085 8.4856,11.6435 8.4911,11.6576C8.4922,11.6615 8.4944,11.6675 8.4944,11.6751C8.5009,11.6636 8.5075,11.6555 8.52,11.6467C8.5265,11.6429 8.5342,11.638 8.5418,11.6342C8.5636,11.6216 8.5865,11.6075 8.592,11.5993C8.5996,11.5884 8.6035,11.5835 8.6035,11.5835L8.616,11.5867C8.616,11.5878 8.6122,11.6549 8.5931,11.6838C8.5838,11.6936 8.5615,11.7198 8.5467,11.7373C8.5544,11.7373 8.5609,11.7351 8.5675,11.7351C8.586,11.7329 8.5991,11.7351 8.5996,11.7351L8.616,11.7373L8.6035,11.7465C8.6035,11.7471 8.5816,11.7629 8.5549,11.8016C8.5407,11.824 8.5375,11.8327 8.5342,11.8442C8.5315,11.8529 8.5287,11.8644 8.5205,11.8785C8.5042,11.9042 8.4911,11.9107 8.4769,11.9211C8.4704,11.9244 8.4638,11.9298 8.4562,11.9336C8.4235,11.9604 8.4398,12.0744 8.4464,12.0956C8.4469,12.1 8.454,12.118 8.4627,12.1371C8.4845,12.1895 8.5167,12.2724 8.5173,12.2991L8.5178,12.3035C8.5205,12.3411 8.5227,12.4185 8.46,12.4698C8.4322,12.4922 8.3935,12.4998 8.3656,12.5047C8.3542,12.508 8.3422,12.5091 8.3378,12.5124C8.3313,12.5178 8.2964,12.5435 8.2964,12.6073C8.2964,12.6585 8.3122,12.6711 8.3269,12.6842C8.3285,12.6858 8.3313,12.6875 8.3345,12.6885C8.3411,12.6973 8.3504,12.6973 8.358,12.7C8.3667,12.7005 8.376,12.7016 8.3804,12.7115L8.382,12.7142C8.3853,12.7245 8.3885,12.7289 8.394,12.7355C8.4011,12.7398 8.4093,12.7513 8.4055,12.7698C8.4049,12.7785 8.3945,12.79 8.3853,12.8031C8.3765,12.8145 8.3689,12.8255 8.3635,12.8375C8.3531,12.8565 8.334,12.9122 8.334,12.9182L8.334,12.9225C8.334,12.9324 8.334,12.9536 8.3395,12.9618C8.3433,12.9662 8.3618,12.9896 8.3564,13.0044C8.3558,13.0087 8.3531,13.0131 8.3455,13.0169C8.334,13.0196 8.3236,13.0158 8.3171,13.0104C8.3144,13.0082 8.3105,13.0082 8.3105,13.0082C8.3013,13.0093 8.2947,13.0169 8.2882,13.0185C8.2844,13.0202 8.28,13.0224 8.2751,13.0224ZM8.2555,12.9575C8.2658,12.9575 8.2669,12.9689 8.2675,12.982L8.2685,12.9924C8.2685,13.0076 8.2685,13.0076 8.2756,13.0087C8.2756,13.0087 8.2784,13.0076 8.2816,13.0065C8.2882,13.0033 8.2953,12.9967 8.3073,12.9951C8.3122,12.994 8.3165,12.9951 8.322,12.9973C8.3275,13.0016 8.3345,13.0038 8.34,13.0038C8.3422,13.0027 8.3422,13.0005 8.3422,13.0005C8.3455,12.994 8.3356,12.9782 8.3269,12.9695C8.3182,12.9558 8.3193,12.9324 8.3198,12.9215L8.3198,12.9171C8.3198,12.9056 8.3405,12.85 8.3504,12.8287C8.3547,12.8173 8.3645,12.8053 8.3733,12.7944C8.3804,12.7845 8.3902,12.7731 8.3902,12.7644C8.3929,12.7578 8.3902,12.7507 8.3836,12.7442C8.3744,12.7371 8.3716,12.7295 8.3673,12.7207L8.3662,12.7142C8.3645,12.7131 8.3613,12.712 8.3547,12.7115C8.3455,12.7104 8.3329,12.7087 8.3225,12.6995C8.3198,12.6962 8.3187,12.6962 8.316,12.694C8.2996,12.6804 8.2811,12.6629 8.2811,12.6067C8.2811,12.5342 8.3198,12.5058 8.3285,12.5015C8.3351,12.496 8.3449,12.4949 8.3607,12.4916C8.3864,12.4862 8.424,12.4791 8.4491,12.4573C8.5058,12.4125 8.5036,12.3411 8.5015,12.304L8.5015,12.2996C8.5015,12.274 8.4671,12.19 8.4475,12.1409C8.4382,12.1207 8.4322,12.1049 8.4311,12.0995C8.4311,12.0984 8.3995,11.9587 8.4453,11.9238C8.454,11.9178 8.46,11.9129 8.4665,11.908C8.4813,11.9004 8.4922,11.8938 8.5047,11.8698C8.514,11.8573 8.5162,11.8496 8.5189,11.8398C8.5227,11.8295 8.5265,11.8175 8.5418,11.7929C8.5565,11.7716 8.5707,11.7558 8.5795,11.7482C8.5751,11.7482 8.5713,11.7482 8.5664,11.7493C8.55,11.7504 8.5265,11.758 8.5265,11.758L8.5178,11.7482C8.5189,11.7471 8.5675,11.6909 8.5789,11.6751C8.5898,11.6609 8.5942,11.6342 8.5969,11.6124C8.5876,11.6227 8.5685,11.6342 8.5456,11.6478C8.5391,11.6511 8.5315,11.6555 8.5238,11.6604C8.4982,11.6762 8.4938,11.7116 8.4933,11.7116L8.4796,11.7116C8.4796,11.7018 8.4791,11.6735 8.4753,11.662C8.4725,11.6571 8.4682,11.6478 8.4627,11.6364C8.4627,11.6445 8.4627,11.6516 8.4611,11.6604C8.46,11.6729 8.4551,11.6805 8.4502,11.6915C8.4485,11.698 8.4475,11.7018 8.4442,11.7051C8.4425,11.7116 8.4398,11.7165 8.4371,11.7242C8.4305,11.7384 8.4213,11.7564 8.4115,11.788C8.3989,11.8305 8.4049,11.8818 8.4076,11.8987C8.4087,11.9075 8.4055,11.9287 8.3989,11.9615C8.3951,11.9838 8.3902,12.0051 8.3896,12.0182C8.3896,12.0438 8.3989,12.1164 8.4218,12.1845C8.4535,12.2773 8.4567,12.3422 8.4344,12.3869C8.4218,12.4093 8.4005,12.4262 8.3727,12.4316C8.2647,12.4584 8.2113,12.3804 8.1791,12.3324L8.1753,12.3264C8.1371,12.2724 8.1147,12.2151 8.1082,12.1611C8.1055,12.1491 8.094,12.1295 8.0896,12.1235L8.0896,12.1235L8.0869,12.1202L8.0891,12.1136L8.0918,12.1104L8.0956,12.1115C8.0973,12.1115 8.0984,12.1115 8.1,12.1147L8.1,12.1136C8.1033,12.1202 8.1109,12.1245 8.1202,12.1316C8.124,12.1327 8.1305,12.1371 8.1338,12.1415C8.1404,12.1458 8.1469,12.1529 8.1529,12.1611C8.154,12.1415 8.1556,12.1115 8.1556,12.0945C8.1556,12.0689 8.1393,12.0307 8.1393,12.0307L8.13,12.0084L8.1491,12.0209C8.1491,12.022 8.172,12.0356 8.1878,12.0531C8.1976,12.0607 8.2053,12.0722 8.2102,12.082C8.2129,12.0695 8.2167,12.0564 8.2167,12.0427C8.2167,12.0182 8.1911,11.9925 8.1911,11.9925L8.1998,11.9822C8.2004,11.9822 8.2293,11.9964 8.2424,12.004C8.2495,12.0051 8.2582,12.0116 8.2636,12.0193C8.2631,12.0089 8.262,11.9975 8.2587,11.992C8.2555,11.9816 8.2429,11.968 8.2331,11.9576C8.2304,11.9533 8.2265,11.9511 8.2238,11.9467C8.2129,11.9331 8.2069,11.9124 8.2047,11.902C8.2047,11.8905 8.2009,11.8655 8.2009,11.8655L8.2004,11.8513L8.2118,11.86C8.2118,11.86 8.2205,11.866 8.2331,11.8769C8.2375,11.8785 8.2424,11.8813 8.2456,11.8835C8.2445,11.8785 8.2429,11.8725 8.2418,11.8687C8.2375,11.8633 8.2358,11.8551 8.2331,11.8442C8.2331,11.8431 8.232,11.8387 8.2304,11.8376C8.2287,11.8289 8.2304,11.8196 8.232,11.8109C8.2331,11.8 8.2358,11.7907 8.2336,11.7787C8.2325,11.7618 8.2315,11.7405 8.2315,11.734C8.2233,11.7231 8.1905,11.6849 8.1545,11.6593C8.1147,11.6282 8.07,11.6069 8.0602,11.5998C8.0444,11.6042 8.0187,11.6085 8.0127,11.6124C8.0095,11.6167 8.0062,11.6227 8.0029,11.6271C8.0002,11.6336 7.9964,11.6396 7.9915,11.6462C7.9838,11.6505 7.9664,11.6505 7.9391,11.6527C7.9325,11.6527 7.9265,11.6538 7.92,11.6549C7.896,11.6571 7.8824,11.6593 7.8753,11.6647C7.8742,11.6669 7.8736,11.668 7.878,11.6784C7.8791,11.6849 7.8818,11.6898 7.884,11.7002C7.8878,11.7165 7.9036,11.7231 7.9325,11.7275C7.9391,11.7275 7.944,11.7285 7.9495,11.7307C7.9947,11.7405 7.9898,11.7733 7.9838,11.8044C7.9767,11.8425 7.9424,11.8425 7.9178,11.8425C7.914,11.8425 7.9107,11.8425 7.9069,11.8425C7.8813,11.8425 7.8704,11.8447 7.8687,11.854C7.8687,11.8562 7.8802,11.866 7.8873,11.8698C7.8976,11.8791 7.9102,11.8878 7.914,11.8955C7.9167,11.902 7.9167,11.9069 7.9145,11.9145C7.9102,11.926 7.8976,11.9347 7.8736,11.9445C7.8562,11.9533 7.8207,11.9533 7.794,11.9522C7.7875,11.9522 7.782,11.9522 7.7765,11.9522C7.7564,11.9522 7.7405,11.9576 7.7405,11.9576L7.7378,11.9576L7.7345,11.9576C7.7345,11.9576 7.722,11.9511 7.7073,11.9462C7.6964,11.944 7.6767,11.9309 7.6505,11.9118C7.6424,11.9058 7.6347,11.9004 7.6293,11.8955C7.6195,11.89 7.6075,11.8862 7.5965,11.8818C7.5845,11.8775 7.5736,11.872 7.5655,11.8676C7.5491,11.8562 7.53,11.8311 7.5235,11.8136C7.5147,11.7956 7.5207,11.7678 7.5333,11.7542C7.5425,11.7416 7.5502,11.7296 7.5524,11.7231C7.5491,11.7209 7.5404,11.722 7.5355,11.722C7.5295,11.722 7.5256,11.722 7.5213,11.722C7.5104,11.7209 7.5027,11.7155 7.4967,11.7111C7.4929,11.7078 7.4902,11.7045 7.4875,11.7035C7.4853,11.7067 7.4842,11.7149 7.4847,11.7264C7.4869,11.7356 7.488,11.7673 7.4722,11.7749C7.4618,11.7765 7.4531,11.7651 7.4438,11.7509C7.4373,11.7416 7.4313,11.7356 7.4275,11.7324C7.4253,11.7313 7.4247,11.7313 7.4247,11.7313C7.4215,11.7324 7.4182,11.7411 7.4149,11.746C7.4138,11.7493 7.4122,11.7525 7.4105,11.7536C7.4056,11.7613 7.4002,11.764 7.3942,11.7662C7.3898,11.7705 7.3865,11.7749 7.3827,11.7765C7.3822,11.7782 7.3833,11.7825 7.4029,11.7918C7.4133,11.7984 7.4329,11.8131 7.4362,11.8229C7.4378,11.8262 7.4367,11.8295 7.4351,11.8305C7.4318,11.8382 7.4231,11.8382 7.4089,11.836C7.3996,11.836 7.3898,11.8349 7.3833,11.8382C7.3805,11.8393 7.3865,11.8507 7.3882,11.8535C7.3898,11.8562 7.3904,11.8562 7.392,11.8595C7.3931,11.8616 7.3931,11.8638 7.3931,11.8649C7.3958,11.8676 7.3958,11.8682 7.3958,11.8775L7.3958,11.8807C7.3964,11.8944 7.404,11.8955 7.4084,11.8965C7.4127,11.8976 7.4198,11.8944 7.4253,11.8916C7.434,11.8889 7.4416,11.8835 7.4493,11.8845C7.4602,11.8862 7.4656,11.8944 7.47,11.9025C7.4722,11.9042 7.4722,11.9058 7.4744,11.9069C7.4782,11.9135 7.482,11.9184 7.4853,11.9271C7.4885,11.9325 7.4924,11.9385 7.4962,11.9435C7.5016,11.9495 7.5207,11.9576 7.5333,11.9598L7.5316,11.9735C7.5311,11.9735 7.5153,11.9724 7.4951,11.9778C7.4902,11.9789 7.4853,11.9789 7.4809,11.9805C7.488,11.9822 7.4967,11.9865 7.5082,11.992C7.5147,11.9953 7.5185,11.9975 7.5207,11.9985C7.5256,12.0007 7.5425,12.0029 7.5556,12.004C7.5578,12.004 7.5589,12.0029 7.5611,12.004C7.5649,12.0051 7.5682,12.0051 7.5687,12.0051C7.5693,12.0051 7.5693,12.0051 7.5698,12.0051L7.5693,12.0176C7.5693,12.0176 7.5693,12.0176 7.5682,12.0176C7.5671,12.0176 7.5616,12.0176 7.5573,12.0176C7.5535,12.0176 7.5464,12.022 7.5371,12.0302L7.5338,12.0335C7.5311,12.0345 7.5273,12.0367 7.5229,12.04C7.5365,12.0433 7.5556,12.0476 7.5616,12.0487C7.578,12.0509 7.6227,12.0689 7.632,12.0733C7.6385,12.0755 7.6451,12.0847 7.6576,12.0973C7.6609,12.1011 7.6658,12.1076 7.6691,12.1104C7.6784,12.1202 7.704,12.1371 7.7045,12.1371L7.7122,12.1436L7.7051,12.1485C7.6996,12.1502 7.6587,12.1829 7.6484,12.1873C7.6418,12.1895 7.6298,12.1993 7.6195,12.2075C7.6102,12.2129 7.6009,12.2189 7.5971,12.2222C7.5851,12.2265 7.5371,12.238 7.5158,12.2309C7.5033,12.2265 7.4978,12.2162 7.4945,12.2096C7.4913,12.202 7.488,12.1982 7.4809,12.1971C7.4776,12.1938 7.4744,12.1938 7.4722,12.1949C7.4705,12.196 7.4689,12.2004 7.4662,12.2025C7.4656,12.2064 7.4656,12.2102 7.464,12.2102C7.4591,12.2216 7.4553,12.2227 7.4444,12.2347C7.4411,12.2375 7.4416,12.2391 7.4416,12.2391C7.4433,12.2413 7.4498,12.2489 7.4602,12.2505C7.4771,12.2533 7.488,12.262 7.4929,12.2669C7.4945,12.2735 7.4945,12.2773 7.4945,12.2784C7.4902,12.2887 7.4765,12.2898 7.4613,12.2898C7.4564,12.2898 7.4498,12.2898 7.4471,12.2898C7.4449,12.2909 7.4438,12.2909 7.4438,12.2909C7.4438,12.2953 7.4438,12.2996 7.4465,12.3024C7.4498,12.3122 7.4482,12.3204 7.4465,12.3291C7.446,12.3335 7.4449,12.3378 7.4438,12.3416C7.4438,12.3416 7.4438,12.3427 7.4438,12.3427C7.446,12.346 7.4558,12.3438 7.4624,12.3416C7.4765,12.3351 7.4929,12.3275 7.5005,12.3373C7.5071,12.3427 7.4995,12.3531 7.4913,12.3629C7.488,12.3656 7.4842,12.3684 7.4836,12.3727C7.482,12.376 7.4842,12.3804 7.4869,12.3842C7.4913,12.3809 7.5005,12.3798 7.5098,12.3798C7.5202,12.3798 7.5305,12.3885 7.536,12.3913C7.5398,12.388 7.5458,12.3836 7.5485,12.3782C7.5513,12.3755 7.5491,12.3662 7.5485,12.3575C7.5469,12.3498 7.5458,12.3405 7.5469,12.3318C7.5502,12.3149 7.5742,12.3116 7.5976,12.3116C7.6047,12.3095 7.6124,12.3084 7.6189,12.3073C7.6407,12.3029 7.6555,12.2795 7.6555,12.2795L7.6675,12.286C7.6647,12.2985 7.662,12.316 7.662,12.3171C7.662,12.3215 7.6615,12.3275 7.6604,12.3329C7.6707,12.3242 7.686,12.3133 7.6985,12.3029C7.7209,12.2887 7.7313,12.2473 7.7313,12.2473L7.7449,12.2473C7.7449,12.2473 7.746,12.2664 7.746,12.2773C7.746,12.2805 7.746,12.2876 7.746,12.2942C7.7493,12.2887 7.7536,12.2833 7.7575,12.2773C7.7662,12.2696 7.7836,12.2527 7.8022,12.244C7.8202,12.2342 7.8393,12.2342 7.8404,12.2331L7.8458,12.2331L7.8475,12.2375C7.8475,12.2375 7.8589,12.2724 7.8687,12.2898C7.8807,12.3089 7.9162,12.3493 7.938,12.3624C7.9609,12.3782 8.0629,12.4305 8.0635,12.4305L8.082,12.4409L8.0618,12.4436C8.0591,12.4436 8.0051,12.4551 7.9887,12.4551C7.9822,12.4562 7.9729,12.4551 7.962,12.4551C7.944,12.4545 7.9205,12.4535 7.8927,12.4545C7.8584,12.4562 7.8415,12.4862 7.8322,12.5031C7.8295,12.5058 7.8289,12.5075 7.8273,12.5085C7.8245,12.5162 7.8262,12.5287 7.8262,12.5407C7.8262,12.5533 7.8267,12.5675 7.8251,12.58C7.8229,12.5925 7.8262,12.6056 7.8289,12.6133C7.8305,12.6056 7.8322,12.5964 7.8349,12.5931C7.8371,12.5855 7.842,12.5702 7.8436,12.5587L7.8491,12.5342L7.8567,12.5587C7.8567,12.5598 7.8644,12.5844 7.8644,12.5931C7.8644,12.5964 7.8644,12.5996 7.8633,12.6089C7.8622,12.6144 7.8611,12.6209 7.8611,12.6247C7.8611,12.6313 7.8611,12.6356 7.8611,12.6416C7.8627,12.6362 7.8644,12.634 7.8655,12.6307C7.8709,12.6204 7.8878,12.6095 7.89,12.6084L7.9025,12.5996L7.8993,12.6165C7.8965,12.6291 7.8944,12.6433 7.8949,12.6476L7.896,12.652C7.896,12.6607 7.8987,12.6744 7.8987,12.6853C7.8987,12.7011 7.8818,12.7076 7.8464,12.7104C7.8071,12.7131 7.7913,12.7044 7.7689,12.6798C7.7569,12.6656 7.7564,12.6542 7.7558,12.6455C7.7553,12.6367 7.7553,12.6351 7.7487,12.6313C7.7455,12.6313 7.7395,12.6411 7.7373,12.6438C7.7362,12.6482 7.7329,12.6493 7.7318,12.6525C7.7275,12.6569 7.7247,12.6596 7.7198,12.6613C7.7171,12.6624 7.7122,12.6678 7.7051,12.6727C7.7007,12.6744 7.7007,12.6755 7.7007,12.6755C7.7007,12.6776 7.7073,12.6831 7.7105,12.6831C7.7116,12.6858 7.7133,12.6875 7.7171,12.6875C7.7296,12.6989 7.7345,12.7087 7.728,12.724C7.7236,12.7365 7.7073,12.7333 7.6915,12.7267C7.6833,12.7256 7.6751,12.724 7.668,12.7229C7.6675,12.7229 7.6664,12.7229 7.6664,12.7229C7.6669,12.7245 7.6685,12.7256 7.6691,12.7289C7.6724,12.7376 7.6767,12.7469 7.6767,12.7578C7.6767,12.7824 7.6855,12.7873 7.6882,12.7889C7.6915,12.79 7.7002,12.7845 7.7045,12.778C7.7051,12.7769 7.7073,12.7769 7.7073,12.7758C7.7171,12.7687 7.7269,12.7704 7.7362,12.7725C7.7427,12.7725 7.7455,12.7753 7.7455,12.7769C7.7487,12.7835 7.7455,12.7895 7.74,12.7998C7.7384,12.8025 7.7362,12.8058 7.734,12.8091C7.7307,12.8129 7.7296,12.8156 7.7269,12.8238C7.7269,12.8238 7.7269,12.8255 7.7269,12.8255C7.7285,12.8271 7.7362,12.8271 7.7389,12.8282C7.7422,12.8282 7.7476,12.8282 7.7515,12.8282C7.7547,12.8304 7.7591,12.8325 7.7629,12.8336C7.77,12.8369 7.7749,12.8369 7.7809,12.8385C7.7853,12.8385 7.7902,12.8369 7.7924,12.8369C7.7935,12.8325 7.7935,12.8282 7.7918,12.8233C7.7902,12.8156 7.7902,12.8118 7.7935,12.8053C7.7984,12.7976 7.8098,12.7905 7.8191,12.7895C7.8284,12.7862 7.8393,12.7905 7.854,12.7971C7.8573,12.7993 7.8605,12.7993 7.8633,12.7993C7.8682,12.802 7.8769,12.8009 7.89,12.8009C7.896,12.8009 7.902,12.8009 7.9085,12.8009C7.9342,12.8009 7.9473,12.8069 7.9555,12.8124C7.962,12.814 7.9762,12.8151 7.98,12.8124C7.9849,12.8113 8.0007,12.7911 8.004,12.7856C8.0051,12.778 7.9996,12.76 7.992,12.7322L7.9871,12.7125C7.9724,12.6585 7.9696,12.6247 7.98,12.6078C7.9893,12.5909 8.0051,12.5931 8.0236,12.5953C8.0285,12.5953 8.0345,12.5953 8.0411,12.5953L8.1,12.5953L8.0967,12.6051C8.0967,12.6051 8.0858,12.6296 8.0798,12.6444C8.0771,12.6509 8.0798,12.6847 8.082,12.6935L8.0825,12.6967C8.0847,12.7033 8.0907,12.7267 8.0995,12.7404C8.1044,12.7518 8.1153,12.7644 8.1316,12.7758C8.1344,12.7775 8.1382,12.7785 8.1431,12.7873C8.1447,12.7873 8.1475,12.7905 8.1491,12.7916C8.1475,12.7889 8.1469,12.7862 8.1469,12.7802C8.1469,12.7665 8.1475,12.7365 8.1475,12.7365L8.16,12.7333C8.1633,12.7409 8.1725,12.7682 8.1818,12.778C8.1856,12.7824 8.1905,12.7878 8.1955,12.7916C8.1955,12.7862 8.1955,12.7791 8.1965,12.7764C8.1982,12.7736 8.1965,12.7507 8.1955,12.7322L8.208,12.7278C8.208,12.7278 8.2145,12.7518 8.2205,12.7622C8.2205,12.7638 8.2249,12.7665 8.2298,12.7687C8.2364,12.7753 8.2429,12.7785 8.2516,12.7878C8.2675,12.8047 8.268,12.8315 8.2587,12.8462C8.2495,12.8609 8.2369,12.8685 8.2167,12.8718C8.2058,12.8751 8.1976,12.8685 8.1911,12.8675C8.1835,12.8642 8.1785,12.8609 8.1698,12.8642C8.166,12.8675 8.1644,12.8685 8.1633,12.8707C8.1627,12.874 8.1655,12.8773 8.166,12.88C8.1687,12.8816 8.1687,12.8838 8.1693,12.8871C8.1715,12.8931 8.1693,12.9029 8.1687,12.9105L8.1676,12.9193C8.1676,12.9204 8.1693,12.9204 8.1704,12.9215C8.1753,12.9247 8.1802,12.9247 8.1824,12.9215C8.1938,12.9138 8.2058,12.9138 8.2167,12.9215C8.2227,12.9291 8.2227,12.9324 8.2227,12.9329C8.22,12.9444 8.2069,12.9487 8.1971,12.9531C8.1862,12.9542 8.1747,12.9711 8.1753,12.9787C8.1769,12.9798 8.1889,12.9842 8.1933,12.9842C8.1971,12.9864 8.2004,12.9875 8.202,12.9896C8.2058,12.9918 8.2096,12.9945 8.2135,12.9973C8.2184,13.0016 8.2249,13.0076 8.2282,13.0076C8.2287,13.006 8.2293,12.9951 8.2304,12.9902C8.2304,12.9858 8.2309,12.9847 8.2315,12.9831C8.2385,12.9618 8.25,12.9575 8.2555,12.9575Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.8791,11.7035C7.8791,11.7035 7.8725,11.6893 7.872,11.6855C7.8709,11.6778 7.8676,11.674 7.8676,11.674C7.8676,11.674 7.8982,11.674 7.8976,11.6838C7.896,11.6915 7.8873,11.6915 7.8856,11.6964C7.8829,11.6991 7.8791,11.7035 7.8791,11.7035" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.018,11.6708L8.016,11.6418C8.016,11.6418 8.064,11.6418 8.087,11.6598C8.122,11.6848 8.146,11.7238 8.145,11.7268C8.139,11.7318 8.111,11.7078 8.091,11.7008C8.091,11.7008 8.076,11.7068 8.063,11.7068C8.047,11.7068 8.041,11.7008 8.04,11.6928C8.038,11.6848 8.041,11.6768 8.041,11.6768L8.018,11.6708" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.1414,11.7321C8.1364,11.7321 8.1284,11.7261 8.1184,11.7201C8.1084,11.7121 8.1004,11.7081 8.0924,11.7071C8.0894,11.7071 8.0774,11.7101 8.0644,11.7101C8.0484,11.7101 8.0424,11.7021 8.0384,11.6941C8.0374,11.6861 8.0394,11.6781 8.0404,11.6781L8.0184,11.6741L8.0184,11.6721L8.0144,11.6391L8.0174,11.6391C8.0184,11.6391 8.0654,11.6411 8.0884,11.6601C8.1234,11.6831 8.1474,11.7231 8.1474,11.7241C8.1474,11.7271 8.1474,11.7271 8.1474,11.7271C8.1464,11.7311 8.1434,11.7321 8.1414,11.7321ZM8.0914,11.7021L8.0914,11.7021C8.0994,11.7051 8.1104,11.7101 8.1174,11.7161C8.1294,11.7241 8.1374,11.7261 8.1404,11.7261C8.1404,11.7261 8.1414,11.7261 8.1424,11.7261C8.1404,11.7241 8.1184,11.6871 8.0874,11.6631C8.0654,11.6491 8.0264,11.6451 8.0174,11.6451L8.0214,11.6701L8.0424,11.6741L8.0414,11.6781C8.0414,11.6781 8.0394,11.6861 8.0414,11.6921C8.0414,11.7021 8.0484,11.7071 8.0634,11.7071C8.0764,11.7071 8.0904,11.7021 8.0914,11.7021L8.0914,11.7021Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#DB4446" + android:fillType="nonZero" + android:pathData="M7.4918,11.6991C7.4918,11.6991 7.5082,11.7116 7.5207,11.7133C7.5333,11.7149 7.5475,11.7149 7.5491,11.7149C7.5513,11.7149 7.5556,11.698 7.5524,11.6849C7.5458,11.6413 7.5076,11.6336 7.5076,11.6336C7.5076,11.6336 7.5196,11.6593 7.5142,11.6696C7.5071,11.6865 7.4918,11.6991 7.4918,11.6991" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.6065,11.8082C7.5985,11.8082 7.5755,11.8062 7.5545,11.8022C7.5265,11.7942 7.4955,11.7732 7.4945,11.7712L7.4815,11.7662L7.4935,11.7552C7.4935,11.7552 7.5195,11.7322 7.5315,11.7022C7.5365,11.6922 7.5285,11.6632 7.5195,11.6452L7.5105,11.6222L7.5355,11.6302C7.5365,11.6302 7.6135,11.6512 7.6255,11.7342C7.6295,11.7552 7.6245,11.7932 7.6185,11.8002L7.6135,11.8062L7.6065,11.8082ZM7.5195,11.7632C7.5305,11.7692 7.5455,11.7732 7.5565,11.7772C7.5715,11.7812 7.5895,11.7812 7.5995,11.7812C7.6005,11.7712 7.6045,11.7502 7.6005,11.7402C7.5945,11.6982 7.5705,11.6762 7.5535,11.6662C7.5565,11.6802 7.5585,11.7012 7.5535,11.7172C7.5435,11.7362 7.5305,11.7502 7.5195,11.7632Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#DB4446" + android:fillType="nonZero" + android:pathData="M7.4122,11.7378C7.4122,11.7378 7.398,11.71 7.3675,11.7122C7.3353,11.7165 7.3151,11.7411 7.3151,11.7411C7.3151,11.7411 7.3495,11.7395 7.3576,11.7455C7.3702,11.7542 7.374,11.7765 7.374,11.7765C7.374,11.7765 7.3931,11.764 7.3996,11.7553C7.4051,11.7504 7.4122,11.7378 7.4122,11.7378" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.4289,11.8556L7.4239,11.8356C7.4239,11.8256 7.4149,11.7966 7.4009,11.7886C7.3949,11.7886 7.3799,11.7846 7.3409,11.7846C7.3329,11.7846 7.3289,11.7846 7.3289,11.7846L7.3009,11.7846L7.3189,11.7646C7.3189,11.7626 7.3599,11.7156 7.4219,11.7036C7.4869,11.6996 7.5179,11.7506 7.5179,11.7546L7.5209,11.7646L7.5179,11.7676C7.5179,11.7696 7.5019,11.7926 7.4919,11.8076C7.4799,11.8196 7.4479,11.8406 7.4429,11.8426L7.4289,11.8556ZM7.3579,11.7606C7.3999,11.7626 7.4089,11.7666 7.4109,11.7696C7.4279,11.7806 7.4389,11.7976 7.4429,11.8166C7.4539,11.8096 7.4659,11.7976 7.4699,11.7936C7.4769,11.7866 7.4869,11.7726 7.4919,11.7676C7.4819,11.7516 7.4599,11.7286 7.4229,11.7326C7.3959,11.7366 7.3749,11.7486 7.3579,11.7606Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#DB4446" + android:fillType="nonZero" + android:pathData="M7.374,11.8442C7.374,11.8442 7.3484,11.8475 7.3331,11.8655C7.3195,11.8813 7.3205,11.9135 7.3205,11.9135C7.3205,11.9135 7.3385,11.8944 7.3549,11.8944C7.3707,11.8944 7.3942,11.9004 7.3942,11.9004C7.3942,11.9004 7.3871,11.8813 7.3871,11.8709C7.3865,11.8655 7.374,11.8442 7.374,11.8442" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.317,12.0056L7.314,11.9766C7.314,11.9726 7.312,11.9126 7.342,11.8786C7.371,11.8466 7.422,11.8396 7.424,11.8396L7.431,11.8376L7.436,11.8416C7.441,11.8496 7.459,11.8846 7.459,11.8986C7.459,11.9126 7.467,11.9356 7.472,11.9456L7.483,11.9666L7.46,11.9646C7.46,11.9646 7.415,11.9546 7.39,11.9546C7.369,11.9546 7.343,11.9756 7.337,11.9816L7.317,12.0056Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.8709,11.8442l0.0207,-0.03l0.0191,0.0289z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.9075,11.8398l0.0136,-0.0191l0.0153,0.018l-0.0289,0.0011" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.8949,11.7547l-0.0055,-0.0365l0.0453,0.0185z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.9293,11.7367l0.0256,0.0055l-0.0213,0.0136l-0.0044,-0.0191" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.9803,12.4987L7.9693,12.4777C7.9703,12.4777 8.0363,12.4387 8.0593,12.4307C8.0913,12.4077 8.1183,12.3737 8.1243,12.3637C8.1243,12.3407 8.1183,12.2907 8.1123,12.2667C8.1063,12.2507 8.1063,12.2317 8.1063,12.2157C8.0953,12.2277 8.0833,12.2407 8.0733,12.2477C8.0583,12.2607 8.0133,12.2897 7.9583,12.2977C7.9143,12.3137 7.8953,12.3207 7.8953,12.3207L7.8783,12.3027C7.8783,12.3027 7.9113,12.2497 7.9133,12.2047C7.9133,12.1977 7.9133,12.1867 7.9093,12.1717L7.9093,12.1717C7.8953,12.1797 7.8663,12.1947 7.8593,12.1977C7.8553,12.1997 7.8373,12.2107 7.8253,12.2187C7.8113,12.2267 7.7963,12.2417 7.7833,12.2477C7.7623,12.2617 7.7363,12.2967 7.7273,12.3117L7.7073,12.2957C7.7083,12.2957 7.7383,12.2437 7.7703,12.2257C7.7843,12.2177 7.7973,12.2057 7.8123,12.1997C7.8333,12.1807 7.8443,12.1767 7.8523,12.1747C7.8583,12.1717 7.8873,12.1557 7.9073,12.1487C7.9063,12.1447 7.9063,12.1407 7.9053,12.1347C7.9043,12.1117 7.9163,12.0857 7.9273,12.0647C7.9093,12.0727 7.8923,12.0787 7.8803,12.0787C7.8603,12.0787 7.8503,12.0787 7.8273,12.0687C7.8193,12.0647 7.8073,12.0627 7.7923,12.0597C7.7423,12.0447 7.7053,12.0787 7.7053,12.0787L7.6853,12.0927L7.6833,12.0677C7.6833,12.0657 7.6823,12.0327 7.7063,11.9937C7.7283,11.9627 7.7803,11.9467 7.7833,11.9467L7.7913,11.9697C7.7773,11.9717 7.7403,11.9887 7.7283,12.0087C7.7173,12.0187 7.7133,12.0317 7.7103,12.0417C7.7303,12.0347 7.7623,12.0257 7.7983,12.0347C7.8143,12.0397 7.8273,12.0417 7.8353,12.0457C7.8573,12.0557 7.8623,12.0557 7.8783,12.0557C7.8963,12.0557 7.9393,12.0377 7.9563,12.0327L7.9983,12.0167L7.9683,12.0557C7.9563,12.0637 7.9273,12.1087 7.9303,12.1337C7.9323,12.1497 7.9333,12.1567 7.9363,12.1707C7.9383,12.1827 7.9413,12.1957 7.9403,12.2097C7.9393,12.2367 7.9273,12.2667 7.9173,12.2897C7.9273,12.2837 7.9393,12.2777 7.9553,12.2737C8.0063,12.2657 8.0453,12.2407 8.0613,12.2267C8.0843,12.2087 8.1143,12.1657 8.1143,12.1657L8.1373,12.1747C8.1343,12.1937 8.1293,12.2397 8.1373,12.2577C8.1423,12.2757 8.1493,12.3177 8.1493,12.3437C8.1613,12.3357 8.1743,12.3227 8.1873,12.3187C8.2023,12.3127 8.2313,12.2957 8.2403,12.2757C8.2453,12.2687 8.2553,12.2347 8.2593,12.2167L8.2843,12.2187C8.2843,12.2187 8.2903,12.2707 8.3073,12.2947C8.3183,12.3127 8.3303,12.3477 8.3413,12.3767C8.3483,12.3587 8.3583,12.3387 8.3683,12.3257C8.4003,12.2887 8.4093,12.2727 8.4103,12.2647C8.4123,12.2507 8.4073,12.2257 8.4053,12.2177L8.4283,12.2057L8.4533,12.2647L8.4353,12.2707C8.4303,12.2887 8.4163,12.3117 8.3873,12.3427C8.3713,12.3587 8.3553,12.4037 8.3513,12.4127L8.3393,12.4517L8.3283,12.4127C8.3203,12.3897 8.2993,12.3287 8.2833,12.3087C8.2783,12.2947 8.2713,12.2857 8.2683,12.2697C8.2663,12.2777 8.2633,12.2877 8.2593,12.2877C8.2473,12.3107 8.2143,12.3307 8.2003,12.3377C8.1763,12.3507 8.1483,12.3757 8.1463,12.3777L8.1443,12.3797C8.1353,12.3897 8.1063,12.4287 8.0713,12.4477C8.0493,12.4617 7.9833,12.4967 7.9803,12.4987Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#DB4446" + android:fillType="nonZero" + android:pathData="M7.4635,12.1944C7.4635,12.1944 7.4487,12.1775 7.4236,12.1845C7.3985,12.1878 7.3811,12.2145 7.3811,12.2145C7.3811,12.2145 7.4024,12.2102 7.4155,12.2135C7.428,12.2145 7.4384,12.2271 7.4384,12.2271C7.4384,12.2271 7.4493,12.2184 7.4542,12.2135C7.4569,12.2096 7.4635,12.1944 7.4635,12.1944" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.493,12.2915L7.485,12.2815C7.485,12.2815 7.472,12.2615 7.454,12.2585C7.437,12.2525 7.397,12.2625 7.397,12.2625L7.368,12.2705L7.383,12.2455C7.385,12.2425 7.416,12.1865 7.467,12.1775C7.52,12.1695 7.551,12.2005 7.553,12.2005L7.573,12.2215L7.55,12.2215C7.547,12.2295 7.538,12.2445 7.533,12.2505C7.525,12.2625 7.506,12.2815 7.502,12.2855L7.493,12.2915ZM7.44,12.2315C7.447,12.2315 7.454,12.2315 7.459,12.2335C7.475,12.2395 7.489,12.2475 7.497,12.2565C7.502,12.2465 7.511,12.2415 7.514,12.2385C7.518,12.2325 7.525,12.2205 7.528,12.2155C7.52,12.2035 7.5,12.1965 7.473,12.1995C7.451,12.2035 7.433,12.2205 7.421,12.2325C7.427,12.2315 7.434,12.2315 7.44,12.2315Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#DB4446" + android:fillType="nonZero" + android:pathData="M7.4345,12.298C7.4345,12.298 7.4122,12.2915 7.3942,12.3089C7.3762,12.3247 7.374,12.3515 7.374,12.3515C7.374,12.3515 7.3931,12.3389 7.4062,12.3389C7.4193,12.3416 7.4367,12.3498 7.4367,12.3498C7.4367,12.3498 7.4395,12.3307 7.4411,12.3264C7.4433,12.3127 7.4345,12.298 7.4345,12.298" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.3675,12.4309L7.3675,12.4019C7.3675,12.4019 7.3705,12.3409 7.4085,12.3139C7.4345,12.2929 7.4635,12.2909 7.4785,12.2909C7.4865,12.2909 7.4905,12.2909 7.4905,12.2909L7.4965,12.2929L7.5015,12.2949C7.5015,12.3009 7.5195,12.3319 7.5135,12.3579C7.5115,12.3629 7.5055,12.3999 7.5055,12.3999L7.5015,12.4119L7.4885,12.4079C7.4875,12.4079 7.4595,12.3939 7.4375,12.3899L7.4315,12.3899C7.4165,12.3899 7.3955,12.4069 7.3885,12.4099L7.3675,12.4309Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#DB4446" + android:fillType="nonZero" + android:pathData="M7.4842,12.3924C7.4842,12.3924 7.4825,12.4196 7.4956,12.4355C7.5098,12.4535 7.5349,12.4567 7.5349,12.4567C7.5349,12.4567 7.5273,12.4387 7.5251,12.4278C7.524,12.4153 7.5365,12.4022 7.5365,12.4022C7.5365,12.4022 7.524,12.3896 7.5109,12.3896C7.4978,12.3896 7.4842,12.3924 7.4842,12.3924" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.582,12.5365L7.563,12.5325C7.563,12.5325 7.5199,12.5225 7.4976,12.4895C7.4761,12.4525 7.4769,12.4015 7.4777,12.3985L7.4777,12.3895L7.486,12.3875C7.4877,12.3875 7.5092,12.3815 7.5291,12.3815C7.5539,12.3815 7.5729,12.4065 7.5754,12.4105L7.5828,12.4185L7.5746,12.4265C7.5704,12.4345 7.558,12.4495 7.5597,12.4655C7.5613,12.4755 7.5713,12.5025 7.5737,12.5125L7.582,12.5365ZM8.4162,12.7945L8.3996,12.7765C8.4004,12.7755 8.4551,12.6905 8.4559,12.6305C8.4592,12.5835 8.3872,12.5165 8.3574,12.4955L8.3673,12.4745C8.3798,12.4835 8.4791,12.5605 8.4774,12.6305C8.4749,12.7015 8.4178,12.7885 8.4162,12.7945Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#DB4446" + android:fillType="nonZero" + android:pathData="M7.7384,12.6356C7.7384,12.6356 7.7209,12.6111 7.6964,12.6133C7.6713,12.6144 7.6456,12.6367 7.6456,12.6367C7.6456,12.6367 7.6773,12.6356 7.6838,12.6455C7.6925,12.6569 7.6996,12.67 7.6996,12.67C7.6996,12.67 7.7133,12.6613 7.7193,12.6585C7.7258,12.6504 7.7384,12.6356 7.7384,12.6356" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.7565,12.7337L7.7505,12.7267C7.7505,12.7237 7.7375,12.7037 7.7235,12.6847C7.7195,12.6797 7.7065,12.6767 7.6795,12.6767C7.6705,12.6767 7.6645,12.6767 7.6645,12.6767L7.6265,12.6767L7.6555,12.6537C7.6555,12.6537 7.7045,12.6097 7.7545,12.6067L7.7545,12.6067C7.8065,12.6067 7.8395,12.6517 7.8415,12.6537L7.8485,12.6597L7.8435,12.6657C7.8385,12.6697 7.8175,12.7007 7.8055,12.7087C7.7935,12.7177 7.7675,12.7297 7.7665,12.7297L7.7565,12.7337ZM7.7015,12.6537C7.7205,12.6537 7.7365,12.6597 7.7435,12.6707C7.7515,12.6827 7.7615,12.6947 7.7665,12.7037C7.7735,12.7007 7.7845,12.6927 7.7895,12.6847C7.7955,12.6847 7.8075,12.6707 7.8145,12.6597C7.8045,12.6517 7.7845,12.6307 7.7565,12.6307C7.7375,12.6337 7.7155,12.6407 7.7015,12.6537Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#DB4446" + android:fillType="nonZero" + android:pathData="M7.6631,12.7338C7.6631,12.7338 7.6304,12.7262 7.6151,12.7453C7.5998,12.76 7.6004,12.79 7.6004,12.79C7.6004,12.79 7.6195,12.7709 7.6375,12.7731C7.6549,12.7731 7.674,12.7845 7.674,12.7845C7.674,12.7845 7.6713,12.7644 7.6696,12.7567C7.668,12.7475 7.6631,12.7338 7.6631,12.7338" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.5944,12.8791L7.5944,12.8441C7.5944,12.8441 7.5924,12.7871 7.6244,12.7501C7.6454,12.7271 7.6774,12.7251 7.7014,12.7251C7.7134,12.7251 7.7234,12.7271 7.7234,12.7271L7.7294,12.7271L7.7324,12.7351C7.7324,12.7351 7.7414,12.7661 7.7454,12.7801C7.7474,12.7961 7.7534,12.8311 7.7534,12.8311L7.7584,12.8541L7.7364,12.8441C7.7364,12.8421 7.7024,12.8261 7.6724,12.8211L7.6724,12.8211C7.6494,12.8211 7.6254,12.8441 7.6154,12.8581L7.5944,12.8791ZM7.7014,12.7501C7.6874,12.7501 7.6594,12.7501 7.6414,12.7691C7.6294,12.7821 7.6244,12.7991 7.6204,12.8191C7.6354,12.8091 7.6554,12.7981 7.6764,12.7981C7.6944,12.8001 7.7114,12.8081 7.7264,12.8141C7.7234,12.8021 7.7234,12.7931 7.7214,12.7891C7.7184,12.7751 7.7134,12.7621 7.7114,12.7521C7.7084,12.7501 7.7064,12.7501 7.7014,12.7501Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#DB4446" + android:fillType="nonZero" + android:pathData="M7.7324,12.8369C7.7324,12.8369 7.7165,12.8571 7.7285,12.8751C7.7405,12.892 7.7645,12.9007 7.7645,12.9007C7.7645,12.9007 7.7564,12.8882 7.7607,12.874C7.764,12.8625 7.7836,12.8451 7.7836,12.8451L7.7324,12.8369" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.8348,12.9965L7.8008,12.9825C7.7978,12.9825 7.7508,12.9685 7.7268,12.9315C7.7028,12.8925 7.7328,12.8475 7.7348,12.8435L7.7568,12.8145L7.7568,12.8395L7.8658,12.8625L7.8448,12.8785C7.8308,12.8885 7.8088,12.9095 7.8068,12.9255C7.8018,12.9485 7.8128,12.9665 7.8128,12.9665L7.8348,12.9965Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#DB4446" + android:fillType="nonZero" + android:pathData="M8.1622,12.8767C8.1622,12.8767 8.1338,12.8696 8.1185,12.8795C8.1027,12.8882 8.0902,12.928 8.0902,12.928C8.0902,12.928 8.1158,12.9051 8.1344,12.9095C8.1529,12.9138 8.1671,12.9182 8.1671,12.9182C8.1671,12.9182 8.1698,12.9045 8.1671,12.8925C8.166,12.8871 8.1622,12.8767 8.1622,12.8767" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.0765,13.0164L8.0895,12.9764C8.0905,12.9664 8.1135,12.8994 8.1465,12.8824C8.1595,12.8704 8.1745,12.8664 8.1945,12.8664C8.2165,12.8664 8.2355,12.8724 8.2355,12.8724L8.2415,12.8744L8.2445,12.8824C8.2445,12.8824 8.2535,12.9004 8.2535,12.9114C8.2585,12.9344 8.2535,12.9624 8.2535,12.9644L8.2495,12.9824L8.2355,12.9764C8.2355,12.9764 8.2125,12.9604 8.1785,12.9574C8.1765,12.9574 8.1765,12.9574 8.1765,12.9574C8.1525,12.9574 8.1175,12.9784 8.1075,12.9854L8.0765,13.0164ZM8.1945,12.8904C8.1785,12.8904 8.1655,12.8964 8.1595,12.9044C8.1475,12.9064 8.1365,12.9294 8.1265,12.9474C8.1435,12.9374 8.1655,12.9294 8.1835,12.9324C8.2025,12.9354 8.2185,12.9394 8.2305,12.9464C8.2305,12.9374 8.2305,12.9274 8.2305,12.9144C8.2305,12.9114 8.2265,12.9044 8.2245,12.8964C8.2185,12.8944 8.2065,12.8904 8.1945,12.8904Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#DB4446" + android:fillType="nonZero" + android:pathData="M8.1758,12.9809C8.1758,12.9809 8.1535,13.0033 8.1622,13.0202C8.1698,13.0415 8.1835,13.0584 8.1835,13.0584C8.1835,13.0584 8.1829,13.0316 8.1927,13.024C8.2047,13.0131 8.2276,13.0104 8.2276,13.0104C8.2276,13.0104 8.2091,12.9945 8.2031,12.9929C8.1976,12.9902 8.1758,12.9809 8.1758,12.9809" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.2225,13.1722L8.1985,13.1402C8.1965,13.1382 8.1715,13.1022 8.1575,13.0662C8.1405,13.0292 8.1825,12.9822 8.1845,12.9822L8.1905,12.9722L8.2005,12.9782C8.2105,12.9822 8.2415,12.9942 8.2475,12.9992C8.2595,13.0042 8.2865,13.0272 8.2965,13.0352L8.3175,13.0532L8.2885,13.0582C8.2885,13.0582 8.2505,13.0612 8.2295,13.0772C8.2245,13.0852 8.2195,13.1122 8.2205,13.1322L8.2225,13.1722Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#DB4446" + android:fillType="nonZero" + android:pathData="M8.2833,13.0136C8.2833,13.0136 8.2718,13.0415 8.2931,13.0573C8.3138,13.0742 8.3313,13.0775 8.3313,13.0775C8.3313,13.0775 8.316,13.0485 8.3198,13.0327C8.3264,13.0191 8.3389,13.0082 8.3389,13.0082C8.3389,13.0082 8.3133,13.0016 8.31,13.0027C8.3062,13.0033 8.2833,13.0136 8.2833,13.0136" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.4012,13.1585L8.3772,13.1585C8.3762,13.1585 8.3402,13.1535 8.3002,13.1195C8.2582,13.0805 8.2782,13.0255 8.2802,13.0235L8.2822,13.0175L8.2862,13.0175C8.3002,13.0095 8.3282,12.9945 8.3362,12.9945L8.3402,12.9945C8.3522,12.9945 8.3872,13.0105 8.3972,13.0105L8.4192,13.0185L8.3982,13.0345C8.3982,13.0345 8.3782,13.0485 8.3692,13.0715C8.3632,13.0895 8.3812,13.1285 8.3882,13.1375L8.4012,13.1585ZM8.3002,13.0385C8.2992,13.0495 8.2942,13.0805 8.3172,13.1035C8.3312,13.1115 8.3452,13.1215 8.3562,13.1265C8.3482,13.1055 8.3402,13.0795 8.3472,13.0625C8.3522,13.0465 8.3622,13.0365 8.3702,13.0275C8.3562,13.0215 8.3452,13.0175 8.3402,13.0175C8.3382,13.0185 8.3182,13.0315 8.3002,13.0385Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFD691" + android:fillType="nonZero" + android:pathData="M7.182,14.9336C7.2535,14.956 7.2905,15.0105 7.2905,15.0744C7.2905,15.1551 7.2104,15.2178 7.1073,15.2178C7.0031,15.2178 6.9196,15.1556 6.9196,15.0744C6.9196,15.0105 6.9545,14.9402 7.0255,14.9364C7.0255,14.9364 7.0238,14.9293 7.0178,14.92C7.0096,14.9113 6.9955,14.8955 6.9955,14.8955C6.9955,14.8955 7.0222,14.8911 7.038,14.8971C7.0538,14.9031 7.0647,14.9124 7.0647,14.9124C7.0647,14.9124 7.0729,14.8987 7.0822,14.8867C7.0936,14.8742 7.1078,14.8698 7.1078,14.8698C7.1078,14.8698 7.1242,14.8824 7.1285,14.8911C7.1335,14.8998 7.1373,14.9113 7.1373,14.9113C7.1373,14.9113 7.1525,14.8987 7.1651,14.8955C7.1776,14.8878 7.1945,14.8851 7.1945,14.8851C7.1945,14.8851 7.1885,14.8993 7.1853,14.908C7.1831,14.9167 7.182,14.9336 7.182,14.9336" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.2724,15.5367C7.0694,15.5367 6.9104,15.4097 6.9104,15.2557C6.9104,15.1367 6.9754,15.0097 7.0984,14.9877C7.0984,14.9817 7.0964,14.9817 7.0934,14.9787C7.0824,14.9667 7.0564,14.9387 7.0564,14.9387L7.0344,14.9177L7.0634,14.9117C7.0654,14.9117 7.0864,14.9087 7.1104,14.9087C7.1284,14.9087 7.1414,14.9097 7.1524,14.9117C7.1694,14.9217 7.1804,14.9277 7.1924,14.9347C7.1984,14.9267 7.2054,14.9117 7.2154,14.9037C7.2384,14.8807 7.2634,14.8647 7.2654,14.8627L7.2734,14.8567L7.2834,14.8647C7.2844,14.8647 7.3144,14.8897 7.3264,14.9097C7.3284,14.9157 7.3314,14.9257 7.3344,14.9307C7.3444,14.9237 7.3584,14.9117 7.3724,14.9097C7.3974,14.9017 7.4264,14.8897 7.4264,14.8897L7.4564,14.8857L7.4474,14.9107C7.4474,14.9107 7.4384,14.9417 7.4334,14.9577C7.4304,14.9617 7.4274,14.9737 7.4274,14.9827C7.5514,15.0277 7.6264,15.1237 7.6264,15.2537C7.6254,15.4137 7.4724,15.5367 7.2724,15.5367ZM7.1044,14.9407C7.1094,14.9507 7.1164,14.9537 7.1214,14.9587C7.1334,14.9817 7.1394,14.9977 7.1394,14.9977L7.1444,15.0187L7.1234,15.0207C7.0044,15.0267 6.9444,15.1427 6.9444,15.2547C6.9444,15.3937 7.0864,15.4967 7.2714,15.4967C7.4534,15.4967 7.5894,15.3947 7.5894,15.2547C7.5894,15.1377 7.5214,15.0497 7.4014,15.0127L7.3894,15.0067L7.3894,14.9967C7.3894,14.9927 7.3934,14.9597 7.4014,14.9477C7.4014,14.9397 7.4024,14.9337 7.4044,14.9317C7.3964,14.9337 7.3894,14.9337 7.3824,14.9377C7.3604,14.9497 7.3374,14.9667 7.3374,14.9687L7.3184,14.9807L7.3104,14.9577C7.3104,14.9577 7.3044,14.9397 7.2964,14.9267C7.2914,14.9187 7.2794,14.9057 7.2704,14.8997C7.2614,14.9037 7.2494,14.9117 7.2384,14.9247C7.2214,14.9407 7.2094,14.9657 7.2094,14.9667L7.1984,14.9837L7.1834,14.9737C7.1834,14.9737 7.1664,14.9547 7.1394,14.9467C7.1334,14.9407 7.1174,14.9387 7.1044,14.9407Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#058E6E" + android:fillType="nonZero" + android:pathData="M7.0925,15.3067C7.0925,15.3067 6.9551,15.2145 6.8945,15.202C6.8176,15.1851 6.7325,15.1976 6.6965,15.1944C6.6965,15.1965 6.7407,15.2276 6.7598,15.2456C6.7789,15.2658 6.8422,15.304 6.8787,15.3138C6.9895,15.3427 7.0925,15.3067 7.0925,15.3067" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.2142,15.4579L7.2142,15.4579C7.1542,15.4579 7.0962,15.4519 7.0432,15.4369C6.9782,15.4209 6.8562,15.3509 6.8192,15.3119C6.7912,15.2889 6.7342,15.2419 6.7142,15.2259C6.7072,15.2229 6.7042,15.2179 6.7042,15.2179L6.6742,15.1889L6.7162,15.1929C6.7352,15.1949 6.7632,15.1929 6.7982,15.1889C6.8332,15.1869 6.8712,15.1829 6.9132,15.1829C6.9792,15.1829 7.0332,15.1909 7.0832,15.2009C7.1942,15.2239 7.4402,15.3889 7.4492,15.3939L7.4772,15.4139L7.4472,15.4279C7.4412,15.4289 7.3462,15.4579 7.2142,15.4579ZM6.7622,15.2239C6.7892,15.2419 6.8212,15.2699 6.8432,15.2879C6.8732,15.3189 6.9882,15.3899 7.0522,15.4049C7.1022,15.4169 7.1582,15.4279 7.2152,15.4279C7.2962,15.4279 7.3642,15.4119 7.4012,15.4049C7.3312,15.3579 7.1602,15.2489 7.0762,15.2309C7.0302,15.2219 6.9762,15.2169 6.9132,15.2169C6.8722,15.2169 6.8332,15.2169 6.7982,15.2199C6.7852,15.2229 6.7732,15.2229 6.7622,15.2239Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#058E6E" + android:fillType="nonZero" + android:pathData="M7.1313,15.3149C7.1313,15.3149 7.2202,15.2222 7.3124,15.2096C7.422,15.1938 7.4924,15.2195 7.5344,15.2304C7.536,15.2304 7.4995,15.2456 7.4804,15.2598C7.4613,15.2724 7.4122,15.3155 7.3375,15.3171C7.2622,15.3171 7.1787,15.3073 7.1662,15.3084C7.1515,15.3105 7.1313,15.3149 7.1313,15.3149" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.1062,15.44L7.1402,15.403C7.1462,15.395 7.3082,15.231 7.4802,15.208C7.5242,15.2 7.5672,15.196 7.6092,15.196C7.7262,15.196 7.8142,15.219 7.8722,15.237L7.9062,15.245L7.9072,15.255C7.9112,15.267 7.9022,15.275 7.8872,15.281C7.8662,15.288 7.8252,15.309 7.8022,15.328L7.7902,15.335C7.7482,15.368 7.6592,15.429 7.5302,15.431L7.5062,15.431C7.4332,15.431 7.3572,15.427 7.3032,15.425C7.2602,15.422 7.2282,15.419 7.2162,15.422C7.1932,15.425 7.1552,15.427 7.1552,15.427L7.1062,15.44ZM7.2272,15.387C7.2432,15.387 7.2692,15.389 7.3042,15.393C7.3582,15.395 7.4332,15.4 7.5062,15.4L7.5292,15.4C7.6492,15.398 7.7312,15.337 7.7712,15.309L7.7852,15.301C7.8022,15.285 7.8262,15.278 7.8472,15.262C7.7892,15.248 7.7112,15.231 7.6092,15.231C7.5672,15.231 7.5272,15.231 7.4852,15.239C7.3712,15.255 7.2582,15.341 7.2022,15.391C7.2042,15.389 7.2102,15.389 7.2112,15.389C7.2162,15.388 7.2212,15.387 7.2272,15.387Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M7.1056,15.202C7.0702,15.1676 7.0484,15.124 7.0484,15.0744C7.0484,15.0231 7.0702,14.9762 7.1056,14.9456C7.14,14.9767 7.1607,15.0236 7.1607,15.0744C7.1607,15.1245 7.1395,15.1682 7.1056,15.202" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.1606,15.4496L7.1486,15.4336C7.0786,15.3726 7.0396,15.2856 7.0396,15.1916C7.0396,15.0976 7.0786,15.0036 7.1486,14.9416L7.1606,14.9336L7.1726,14.9416C7.2396,15.0046 7.2776,15.0976 7.2776,15.1916C7.2776,15.2856 7.2386,15.3736 7.1726,15.4336L7.1606,15.4496ZM7.1606,14.9786C7.1036,15.0336 7.0726,15.1056 7.0726,15.1916C7.0726,15.2696 7.1026,15.3416 7.1606,15.4026C7.2136,15.3416 7.2456,15.2676 7.2456,15.1916C7.2456,15.1056 7.2136,15.0336 7.1606,14.9786Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#058E6E" + android:fillType="nonZero" + android:pathData="M7.0702,15.3885C7.0702,15.3885 7.0915,15.3351 7.0931,15.2915C7.0958,15.2533 7.0882,15.2162 7.0882,15.2162C7.0882,15.2162 7.0996,15.2162 7.1056,15.2162C7.1116,15.2162 7.1149,15.2162 7.1149,15.2162C7.1149,15.2162 7.1291,15.256 7.1291,15.2915C7.1291,15.3269 7.1225,15.3722 7.1225,15.3722C7.1225,15.3722 7.1035,15.3755 7.0975,15.3798C7.0909,15.3809 7.0702,15.3885 7.0702,15.3885" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.0544,15.5694L7.0664,15.5344C7.0664,15.5344 7.1064,15.4404 7.1084,15.3624C7.1124,15.2954 7.1014,15.2274 7.1014,15.2274L7.0954,15.2064L7.1774,15.2064L7.1834,15.2224C7.1834,15.2224 7.2074,15.2974 7.2074,15.3634C7.2074,15.4274 7.1964,15.5114 7.1954,15.5114L7.1954,15.5274L7.1834,15.5274C7.1694,15.5324 7.1484,15.5354 7.1414,15.5354C7.1294,15.5454 7.0924,15.5564 7.0904,15.5584L7.0544,15.5694ZM7.1364,15.2414C7.1384,15.2684 7.1434,15.3154 7.1414,15.3624C7.1394,15.4174 7.1224,15.4794 7.1094,15.5104C7.1174,15.5104 7.1224,15.5084 7.1244,15.5084C7.1354,15.5024 7.1524,15.5024 7.1644,15.4984C7.1674,15.4714 7.1744,15.4084 7.1744,15.3614C7.1744,15.3144 7.1584,15.2634 7.1524,15.2404L7.1364,15.2404L7.1364,15.2414Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.8113,10.4069C8.8113,10.3856 8.8276,10.3698 8.8489,10.3698C8.8696,10.3698 8.886,10.3856 8.886,10.4069C8.886,10.4249 8.8696,10.4413 8.8489,10.4413C8.8282,10.4413 8.8113,10.4249 8.8113,10.4069" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.8867,10.5192C8.8427,10.5192 8.8047,10.4852 8.8047,10.4442C8.8047,10.3992 8.8427,10.3622 8.8867,10.3622C8.9307,10.3622 8.9677,10.3992 8.9677,10.4442C8.9677,10.4852 8.9307,10.5192 8.8867,10.5192ZM8.8867,10.3872C8.8547,10.3872 8.8307,10.4102 8.8307,10.4442C8.8307,10.4692 8.8537,10.4962 8.8867,10.4962C8.9177,10.4962 8.9427,10.4702 8.9427,10.4442C8.9417,10.4112 8.9177,10.3872 8.8867,10.3872Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.8636,10.3131C8.8636,10.2929 8.8789,10.2787 8.9018,10.2787C8.9209,10.2787 8.9389,10.2924 8.9389,10.3131C8.9389,10.3338 8.9209,10.348 8.9018,10.348C8.8789,10.3485 8.8636,10.3338 8.8636,10.3131" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.9391,10.4276C8.8921,10.4276 8.8571,10.3886 8.8571,10.3476C8.8571,10.3066 8.8921,10.2716 8.9391,10.2716C8.9821,10.2716 9.0191,10.3066 9.0191,10.3476C9.0191,10.3886 8.9821,10.4276 8.9391,10.4276ZM8.9391,10.2946C8.9051,10.2946 8.8801,10.3176 8.8801,10.3476C8.8801,10.3806 8.9031,10.4046 8.9391,10.4046C8.9671,10.4046 8.9941,10.3816 8.9941,10.3476C8.9941,10.3186 8.9681,10.2946 8.9391,10.2946Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.898,10.2078C8.898,10.1887 8.9149,10.1707 8.9362,10.1707C8.9558,10.1707 8.9738,10.1887 8.9738,10.2078C8.9738,10.2291 8.9558,10.2433 8.9362,10.2433C8.9149,10.2433 8.898,10.2291 8.898,10.2078" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.9739,10.3213C8.9279,10.3213 8.8909,10.2853 8.8909,10.2433C8.8909,10.1963 8.9279,10.1653 8.9739,10.1653C9.0179,10.1653 9.0559,10.1963 9.0559,10.2433C9.0549,10.2853 9.0179,10.3213 8.9739,10.3213ZM8.9739,10.1883C8.9409,10.1883 8.9159,10.2113 8.9159,10.2433C8.9159,10.2703 8.9399,10.2963 8.9739,10.2963C9.0049,10.2963 9.0299,10.2713 9.0299,10.2433C9.0299,10.2123 9.0049,10.1883 8.9739,10.1883Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.9018,10.0927C8.9018,10.0747 8.9182,10.0567 8.94,10.0567C8.9607,10.0567 8.9782,10.0747 8.9782,10.0927C8.9782,10.114 8.9602,10.1293 8.94,10.1293C8.9187,10.1293 8.9018,10.114 8.9018,10.0927" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.9778,10.2082C8.9308,10.2082 8.8958,10.1732 8.8958,10.1282C8.8958,10.0832 8.9308,10.0502 8.9778,10.0502C9.0228,10.0502 9.0598,10.0832 9.0598,10.1282C9.0598,10.1732 9.0228,10.2082 8.9778,10.2082ZM8.9778,10.0762C8.9458,10.0762 8.9188,10.0992 8.9188,10.1282C8.9188,10.1572 8.9448,10.1832 8.9778,10.1832C9.0068,10.1832 9.0348,10.1582 9.0348,10.1282C9.0348,10.1002 9.0068,10.0762 8.9778,10.0762Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.8735,9.9798C8.8735,9.9607 8.8915,9.9455 8.9111,9.9455C8.9329,9.9455 8.9493,9.9602 8.9493,9.9798C8.9493,10.0005 8.9329,10.0158 8.9111,10.0158C8.8915,10.0158 8.8735,10.0005 8.8735,9.9798" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.9484,10.0964C8.9044,10.0964 8.8664,10.0574 8.8664,10.0144C8.8664,9.9734 8.9044,9.9384 8.9484,9.9384C8.9954,9.9384 9.0304,9.9734 9.0304,10.0144C9.0304,10.0574 8.9954,10.0964 8.9484,10.0964ZM8.9484,9.9634C8.9204,9.9634 8.8914,9.9864 8.8914,10.0144C8.8914,10.0474 8.9194,10.0734 8.9484,10.0734C8.9814,10.0734 9.0074,10.0484 9.0074,10.0144C9.0074,9.9874 8.9814,9.9634 8.9484,9.9634Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.8151,9.8784C8.8151,9.8582 8.832,9.8435 8.8533,9.8435C8.874,9.8435 8.8915,9.8582 8.8915,9.8784C8.8915,9.8991 8.874,9.9133 8.8533,9.9133C8.832,9.9138 8.8151,9.8991 8.8151,9.8784" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.8905,9.9938C8.8435,9.9938 8.8085,9.9548 8.8085,9.9138C8.8085,9.8728 8.8435,9.8358 8.8905,9.8358C8.9355,9.8358 8.9725,9.8728 8.9725,9.9138C8.9725,9.9548 8.9355,9.9938 8.8905,9.9938ZM8.8905,9.8618C8.8585,9.8618 8.8315,9.8848 8.8315,9.9148C8.8315,9.9478 8.8575,9.9718 8.8905,9.9718C8.9205,9.9718 8.9485,9.9488 8.9485,9.9148C8.9485,9.8848 8.9215,9.8618 8.8905,9.8618Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.7382,9.7944C8.7382,9.7742 8.7551,9.7595 8.7758,9.7595C8.796,9.7595 8.8129,9.7742 8.8129,9.7944C8.8129,9.8145 8.796,9.8325 8.7758,9.8325C8.7551,9.8325 8.7382,9.8145 8.7382,9.7944" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.8131,9.9069C8.7681,9.9069 8.7311,9.8759 8.7311,9.8289C8.7311,9.7879 8.7681,9.7529 8.8131,9.7529C8.8571,9.7529 8.8951,9.7879 8.8951,9.8289C8.8951,9.8759 8.8571,9.9069 8.8131,9.9069ZM8.8131,9.7779C8.7801,9.7779 8.7561,9.8009 8.7561,9.8289C8.7561,9.8599 8.7791,9.8839 8.8131,9.8839C8.8451,9.8839 8.8691,9.8609 8.8691,9.8289C8.8691,9.8019 8.8451,9.7779 8.8131,9.7779Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.6471,9.7251C8.6471,9.7049 8.6645,9.6902 8.6847,9.6902C8.7065,9.6902 8.7229,9.7049 8.7229,9.7251C8.7229,9.7447 8.7065,9.76 8.6847,9.76C8.6645,9.7605 8.6471,9.7447 8.6471,9.7251" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.722,9.8405C8.678,9.8405 8.64,9.8015 8.64,9.7605C8.64,9.7195 8.678,9.6825 8.722,9.6825C8.769,9.6825 8.804,9.7195 8.804,9.7605C8.804,9.8015 8.769,9.8405 8.722,9.8405ZM8.722,9.7075C8.692,9.7075 8.665,9.7305 8.665,9.7605C8.665,9.7935 8.691,9.8175 8.722,9.8175C8.755,9.8175 8.781,9.7945 8.781,9.7605C8.78,9.7315 8.755,9.7075 8.722,9.7075Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.5391,9.6684C8.5391,9.6476 8.5565,9.6329 8.5767,9.6329C8.5975,9.6329 8.6144,9.6476 8.6144,9.6684C8.6144,9.6885 8.5975,9.7049 8.5767,9.7049C8.5571,9.7049 8.5391,9.6885 8.5391,9.6684" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.6145,9.7775C8.5705,9.7775 8.5325,9.7465 8.5325,9.7025C8.5325,9.6605 8.5705,9.6275 8.6145,9.6275C8.6595,9.6275 8.6965,9.6605 8.6965,9.7025C8.6965,9.7465 8.6595,9.7775 8.6145,9.7775ZM8.6145,9.6525C8.5825,9.6525 8.5575,9.6755 8.5575,9.7025C8.5575,9.7305 8.5815,9.7545 8.6145,9.7545C8.6475,9.7545 8.6715,9.7315 8.6715,9.7025C8.6705,9.6755 8.6475,9.6525 8.6145,9.6525Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.4267,9.628C8.4267,9.6067 8.4442,9.5925 8.4644,9.5925C8.4862,9.5925 8.502,9.6067 8.502,9.628C8.502,9.646 8.4862,9.664 8.4644,9.664C8.4442,9.6645 8.4267,9.6465 8.4267,9.628" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.5022,9.7424C8.4582,9.7424 8.4202,9.7094 8.4202,9.6644C8.4202,9.6204 8.4582,9.5844 8.5022,9.5844C8.5472,9.5844 8.5842,9.6204 8.5842,9.6644C8.5842,9.7094 8.5462,9.7424 8.5022,9.7424ZM8.5022,9.6104C8.4712,9.6104 8.4452,9.6354 8.4452,9.6654C8.4452,9.6954 8.4712,9.7184 8.5022,9.7184C8.5352,9.7184 8.5592,9.6954 8.5592,9.6654C8.5592,9.6354 8.5352,9.6104 8.5022,9.6104Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.3013,9.6056C8.3013,9.5855 8.3187,9.5685 8.3395,9.5685C8.3618,9.5685 8.3776,9.5855 8.3776,9.6056C8.3776,9.6258 8.3613,9.6405 8.3395,9.6405C8.3187,9.6411 8.3013,9.6258 8.3013,9.6056" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.3767,9.7167C8.3317,9.7167 8.2947,9.6817 8.2947,9.6407C8.2947,9.5957 8.3317,9.5647 8.3767,9.5647C8.4237,9.5647 8.4587,9.5957 8.4587,9.6407C8.4587,9.6807 8.4227,9.7167 8.3767,9.7167ZM8.3767,9.5877C8.3467,9.5877 8.3197,9.6107 8.3197,9.6407C8.3197,9.6657 8.3467,9.6917 8.3767,9.6917C8.4087,9.6917 8.4357,9.6667 8.4357,9.6407C8.4347,9.6107 8.4087,9.5877 8.3767,9.5877Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.1824,9.5996C8.1824,9.58 8.1993,9.5647 8.2205,9.5647C8.2413,9.5647 8.2587,9.58 8.2587,9.5996C8.2587,9.6187 8.2413,9.6345 8.2205,9.6345C8.1993,9.6345 8.1824,9.6187 8.1824,9.5996" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.2578,9.712C8.2118,9.712 8.1758,9.677 8.1758,9.636C8.1758,9.595 8.2118,9.556 8.2578,9.556C8.3038,9.556 8.3398,9.595 8.3398,9.636C8.3398,9.677 8.3038,9.712 8.2578,9.712ZM8.2578,9.579C8.2268,9.579 8.1988,9.602 8.1988,9.636C8.1988,9.665 8.2258,9.689 8.2578,9.689C8.2888,9.689 8.3168,9.666 8.3168,9.636C8.3168,9.602 8.2888,9.579 8.2578,9.579Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.0662,9.6024C8.0662,9.5822 8.0836,9.5675 8.1038,9.5675C8.1251,9.5675 8.1415,9.5822 8.1415,9.6024C8.1415,9.6225 8.1251,9.6405 8.1038,9.6405C8.0836,9.6411 8.0662,9.6231 8.0662,9.6024" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.1411,9.7155C8.0971,9.7155 8.0591,9.6845 8.0591,9.6375C8.0591,9.5965 8.0971,9.5615 8.1411,9.5615C8.1861,9.5615 8.2231,9.5965 8.2231,9.6375C8.2221,9.6835 8.1861,9.7155 8.1411,9.7155ZM8.1411,9.5865C8.1091,9.5865 8.0841,9.6095 8.0841,9.6375C8.0841,9.6685 8.1091,9.6925 8.1411,9.6925C8.1741,9.6925 8.1981,9.6695 8.1981,9.6375C8.1981,9.6095 8.1741,9.5865 8.1411,9.5865Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.9495,9.6024C7.9495,9.5822 7.9664,9.5675 7.9876,9.5675C8.0078,9.5675 8.0253,9.5822 8.0253,9.6024C8.0253,9.6225 8.0078,9.6405 7.9876,9.6405C7.9658,9.6411 7.9495,9.6231 7.9495,9.6024" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.0249,9.7155C7.9779,9.7155 7.9429,9.6845 7.9429,9.6375C7.9429,9.5965 7.9779,9.5615 8.0249,9.5615C8.0689,9.5615 8.1069,9.5965 8.1069,9.6375C8.1069,9.6835 8.0689,9.7155 8.0249,9.7155ZM8.0249,9.5865C7.9929,9.5865 7.9659,9.6095 7.9659,9.6375C7.9659,9.6685 7.9919,9.6925 8.0249,9.6925C8.0549,9.6925 8.0819,9.6695 8.0819,9.6375C8.0819,9.6095 8.0549,9.5865 8.0249,9.5865Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.0073,9.7049C8.0073,9.6836 8.0247,9.6667 8.0449,9.6667C8.0673,9.6667 8.0831,9.6836 8.0831,9.7049C8.0831,9.7218 8.0667,9.7393 8.0449,9.7393C8.0247,9.7387 8.0073,9.7218 8.0073,9.7049" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.0827,9.8191C8.0387,9.8191 8.0007,9.7841 8.0007,9.7431C8.0007,9.6961 8.0387,9.6591 8.0827,9.6591C8.1297,9.6591 8.1647,9.6961 8.1647,9.7431C8.1647,9.7841 8.1287,9.8191 8.0827,9.8191ZM8.0827,9.6841C8.0527,9.6841 8.0257,9.7091 8.0257,9.7431C8.0257,9.7691 8.0527,9.7951 8.0827,9.7951C8.1147,9.7951 8.1417,9.7701 8.1417,9.7431C8.1407,9.7101 8.1147,9.6841 8.0827,9.6841Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.0318,9.8124C8.0318,9.7944 8.0482,9.778 8.0695,9.778C8.0902,9.778 8.1071,9.7938 8.1071,9.8124C8.1071,9.8325 8.0896,9.8495 8.0695,9.8495C8.0482,9.85 8.0318,9.8325 8.0318,9.8124" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.1067,9.9285C8.0627,9.9285 8.0247,9.8915 8.0247,9.8465C8.0247,9.8055 8.0617,9.7715 8.1067,9.7715C8.1517,9.7715 8.1887,9.8055 8.1887,9.8465C8.1887,9.8915 8.1507,9.9285 8.1067,9.9285ZM8.1067,9.7955C8.0737,9.7955 8.0507,9.8185 8.0507,9.8465C8.0507,9.8795 8.0737,9.9035 8.1067,9.9035C8.1377,9.9035 8.1637,9.8805 8.1637,9.8465C8.1637,9.8195 8.1377,9.7955 8.1067,9.7955Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.0351,9.9236C8.0351,9.9029 8.052,9.8882 8.0733,9.8882C8.0945,9.8882 8.1115,9.9029 8.1115,9.9236C8.1115,9.9433 8.094,9.9602 8.0733,9.9602C8.0525,9.9607 8.0351,9.9433 8.0351,9.9236" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.1111,10.0342C8.0651,10.0342 8.0291,10.0032 8.0291,9.9592C8.0291,9.9172 8.0651,9.8822 8.1111,9.8822C8.1571,9.8822 8.1931,9.9172 8.1931,9.9592C8.1931,10.0022 8.1571,10.0342 8.1111,10.0342ZM8.1111,9.9092C8.0801,9.9092 8.0521,9.9322 8.0521,9.9592C8.0521,9.9872 8.0791,10.0112 8.1111,10.0112C8.1421,10.0112 8.1691,9.9882 8.1691,9.9592C8.1681,9.9322 8.1421,9.9092 8.1111,9.9092Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M8.0007,10.0245C8.0007,10.0033 8.0182,9.9891 8.0389,9.9891C8.0607,9.9891 8.0771,10.0033 8.0771,10.0245C8.0771,10.0436 8.0602,10.0605 8.0389,10.0605C8.0182,10.0605 8.0007,10.0436 8.0007,10.0245" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.0762,10.138C8.0312,10.138 7.9942,10.105 7.9942,10.06C7.9942,10.016 8.0312,9.982 8.0762,9.982C8.1232,9.982 8.1582,10.016 8.1582,10.06C8.1582,10.105 8.1232,10.138 8.0762,10.138ZM8.0762,10.006C8.0462,10.006 8.0192,10.03 8.0192,10.06C8.0192,10.09 8.0462,10.113 8.0762,10.113C8.1082,10.113 8.1352,10.09 8.1352,10.06C8.1352,10.03 8.1082,10.006 8.0762,10.006Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.9364,10.1167C7.9364,10.0971 7.9533,10.0802 7.9745,10.0802C7.9953,10.0802 8.0127,10.0971 8.0127,10.1167C8.0127,10.1364 7.9953,10.1522 7.9745,10.1522C7.9538,10.1522 7.9364,10.1364 7.9364,10.1167" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.0124,10.2267C7.9664,10.2267 7.9304,10.1937 7.9304,10.1517C7.9304,10.1077 7.9664,10.0747 8.0124,10.0747C8.0574,10.0747 8.0944,10.1077 8.0944,10.1517C8.0944,10.1937 8.0574,10.2267 8.0124,10.2267ZM8.0124,10.0997C7.9804,10.0997 7.9534,10.1227 7.9534,10.1517C7.9534,10.1777 7.9804,10.2017 8.0124,10.2017C8.0424,10.2017 8.0694,10.1787 8.0694,10.1517C8.0694,10.1237 8.0424,10.0997 8.0124,10.0997Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.8605,9.5336C7.8605,9.5135 7.878,9.4993 7.8982,9.4993C7.92,9.4993 7.9364,9.5129 7.9364,9.5336C7.9364,9.5544 7.92,9.5685 7.8982,9.5685C7.878,9.5685 7.8605,9.5544 7.8605,9.5336" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.9355,9.6491C7.8915,9.6491 7.8535,9.6101 7.8535,9.5691C7.8535,9.5281 7.8915,9.4911 7.9355,9.4911C7.9815,9.4911 8.0175,9.5281 8.0175,9.5691C8.0175,9.6101 7.9825,9.6491 7.9355,9.6491ZM7.9355,9.5161C7.9055,9.5161 7.8795,9.5391 7.8795,9.5691C7.8795,9.6021 7.9055,9.6261 7.9355,9.6261C7.9685,9.6261 7.9935,9.6031 7.9935,9.5691C7.9945,9.5391 7.9695,9.5161 7.9355,9.5161Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.7575,9.4764C7.7575,9.4556 7.7738,9.4409 7.7956,9.4409C7.8158,9.4409 7.8333,9.4556 7.8333,9.4764C7.8333,9.496 7.8158,9.5129 7.7956,9.5129C7.7738,9.5129 7.7575,9.496 7.7575,9.4764" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.8329,9.5864C7.7859,9.5864 7.7509,9.5554 7.7509,9.5114C7.7509,9.4674 7.7859,9.4344 7.8329,9.4344C7.8769,9.4344 7.9149,9.4674 7.9149,9.5114C7.9149,9.5554 7.8769,9.5864 7.8329,9.5864ZM7.8329,9.4594C7.7999,9.4594 7.7739,9.4844 7.7739,9.5114C7.7739,9.5394 7.7989,9.5634 7.8329,9.5634C7.8619,9.5634 7.8889,9.5404 7.8889,9.5114C7.8889,9.4854 7.8619,9.4594 7.8329,9.4594Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.6424,9.4409C7.6424,9.424 7.6598,9.406 7.6805,9.406C7.7018,9.406 7.7187,9.424 7.7187,9.4409C7.7187,9.4622 7.7018,9.478 7.6805,9.478C7.6598,9.478 7.6424,9.4622 7.6424,9.4409" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.7184,9.557C7.6734,9.557 7.6364,9.52 7.6364,9.475C7.6364,9.432 7.6734,9.4 7.7184,9.4C7.7654,9.4 7.8004,9.432 7.8004,9.475C7.8004,9.52 7.7644,9.557 7.7184,9.557ZM7.7184,9.425C7.6884,9.425 7.6604,9.448 7.6604,9.475C7.6604,9.506 7.6884,9.532 7.7184,9.532C7.7504,9.532 7.7774,9.507 7.7774,9.475C7.7764,9.448 7.7494,9.425 7.7184,9.425Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.524,9.4224C7.524,9.4011 7.5409,9.3853 7.5622,9.3853C7.5829,9.3853 7.6004,9.4011 7.6004,9.4224C7.6004,9.4404 7.5829,9.4567 7.5622,9.4567C7.5409,9.4567 7.524,9.4409 7.524,9.4224" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.5995,9.5372C7.5525,9.5372 7.5175,9.5012 7.5175,9.4602C7.5175,9.4152 7.5525,9.3782 7.5995,9.3782C7.6445,9.3782 7.6815,9.4152 7.6815,9.4602C7.6815,9.5002 7.6445,9.5372 7.5995,9.5372ZM7.5995,9.4032C7.5675,9.4032 7.5405,9.4262 7.5405,9.4602C7.5405,9.4852 7.5675,9.5122 7.5995,9.5122C7.6295,9.5122 7.6565,9.4862 7.6565,9.4602C7.6565,9.4262 7.6305,9.4032 7.5995,9.4032Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.4084,9.4235C7.4084,9.4022 7.4253,9.388 7.446,9.388C7.4667,9.388 7.4836,9.4022 7.4836,9.4235C7.4836,9.4425 7.4667,9.4595 7.446,9.4595C7.4253,9.46 7.4084,9.4431 7.4084,9.4235" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.4827,9.5369C7.4387,9.5369 7.4007,9.5039 7.4007,9.4589C7.4007,9.4149 7.4387,9.3809 7.4827,9.3809C7.5267,9.3809 7.5647,9.4149 7.5647,9.4589C7.5647,9.5039 7.5277,9.5369 7.4827,9.5369ZM7.4827,9.4059C7.4507,9.4059 7.4267,9.4299 7.4267,9.4599C7.4267,9.4899 7.4497,9.5129 7.4827,9.5129C7.5157,9.5129 7.5397,9.4899 7.5397,9.4599C7.5397,9.4299 7.5157,9.4059 7.4827,9.4059Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.2873,9.4431C7.2873,9.424 7.3036,9.4087 7.3249,9.4087C7.3451,9.4087 7.3625,9.4235 7.3625,9.4431C7.3625,9.4638 7.3451,9.4791 7.3249,9.4791C7.3036,9.4791 7.2873,9.4638 7.2873,9.4431" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.3622,9.5596C7.3172,9.5596 7.2802,9.5206 7.2802,9.4776C7.2802,9.4366 7.3172,9.4016 7.3622,9.4016C7.4062,9.4016 7.4442,9.4366 7.4442,9.4776C7.4442,9.5196 7.4062,9.5596 7.3622,9.5596ZM7.3622,9.4266C7.3292,9.4266 7.3052,9.4496 7.3052,9.4776C7.3052,9.5106 7.3292,9.5366 7.3622,9.5366C7.3932,9.5366 7.4182,9.5116 7.4182,9.4776C7.4182,9.4496 7.3932,9.4266 7.3622,9.4266Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M7.1749,9.4824C7.1749,9.4622 7.1913,9.4475 7.2125,9.4475C7.2333,9.4475 7.2502,9.4622 7.2502,9.4824C7.2502,9.502 7.2333,9.5173 7.2125,9.5173C7.1918,9.5173 7.1749,9.502 7.1749,9.4824" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.2498,9.5978C7.2058,9.5978 7.1678,9.5588 7.1678,9.5178C7.1678,9.4768 7.2058,9.4398 7.2498,9.4398C7.2938,9.4398 7.3318,9.4768 7.3318,9.5178C7.3318,9.5588 7.2948,9.5978 7.2498,9.5978ZM7.2498,9.4648C7.2178,9.4648 7.1938,9.4878 7.1938,9.5178C7.1938,9.5508 7.2168,9.5748 7.2498,9.5748C7.2818,9.5748 7.3068,9.5518 7.3068,9.5178C7.3068,9.4878 7.2818,9.4648 7.2498,9.4648Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M5.2767,10.4069C5.2767,10.3856 5.2931,10.3698 5.3144,10.3698C5.3345,10.3698 5.3515,10.3856 5.3515,10.4069C5.3515,10.4249 5.3345,10.4413 5.3144,10.4413C5.2931,10.4413 5.2767,10.4249 5.2767,10.4069" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.3516,10.5192C5.3066,10.5192 5.2696,10.4852 5.2696,10.4442C5.2696,10.3992 5.3066,10.3622 5.3516,10.3622C5.3956,10.3622 5.4326,10.3992 5.4326,10.4442C5.4326,10.4852 5.3956,10.5192 5.3516,10.5192ZM5.3516,10.3872C5.3186,10.3872 5.2946,10.4102 5.2946,10.4442C5.2946,10.4692 5.3176,10.4962 5.3516,10.4962C5.3826,10.4962 5.4076,10.4702 5.4076,10.4442C5.4076,10.4112 5.3826,10.3872 5.3516,10.3872Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M5.2244,10.3131C5.2244,10.2929 5.2418,10.2787 5.2615,10.2787C5.2833,10.2787 5.2991,10.2924 5.2991,10.3131C5.2991,10.3338 5.2833,10.348 5.2615,10.348C5.2418,10.3485 5.2244,10.3338 5.2244,10.3131" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.2983,10.4276C5.2543,10.4276 5.2173,10.3886 5.2173,10.3476C5.2173,10.3066 5.2543,10.2716 5.2983,10.2716C5.3443,10.2716 5.3813,10.3066 5.3813,10.3476C5.3813,10.3886 5.3443,10.4276 5.2983,10.4276ZM5.2983,10.2946C5.2683,10.2946 5.2423,10.3176 5.2423,10.3476C5.2423,10.3806 5.2673,10.4046 5.2983,10.4046C5.3323,10.4046 5.3563,10.3816 5.3563,10.3476C5.3563,10.3186 5.3333,10.2946 5.2983,10.2946Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M5.1905,10.2078C5.1905,10.1887 5.2069,10.1707 5.2282,10.1707C5.2484,10.1707 5.2653,10.1887 5.2653,10.2078C5.2653,10.2291 5.2484,10.2433 5.2282,10.2433C5.2069,10.2433 5.1905,10.2291 5.1905,10.2078" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.2659,10.3213C5.2209,10.3213 5.1829,10.2853 5.1829,10.2433C5.1829,10.1963 5.2209,10.1653 5.2659,10.1653C5.3099,10.1653 5.3469,10.1963 5.3469,10.2433C5.3469,10.2853 5.3099,10.3213 5.2659,10.3213ZM5.2659,10.1883C5.2329,10.1883 5.2089,10.2113 5.2089,10.2433C5.2089,10.2703 5.2319,10.2963 5.2659,10.2963C5.2969,10.2963 5.3219,10.2713 5.3219,10.2433C5.3219,10.2123 5.2969,10.1883 5.2659,10.1883Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M5.1851,10.0927C5.1851,10.0747 5.2025,10.0567 5.2227,10.0567C5.2445,10.0567 5.2609,10.0747 5.2609,10.0927C5.2609,10.114 5.2445,10.1293 5.2227,10.1293C5.2025,10.1293 5.1851,10.114 5.1851,10.0927" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.26,10.2082C5.216,10.2082 5.178,10.1732 5.178,10.1282C5.178,10.0832 5.216,10.0502 5.26,10.0502C5.307,10.0502 5.342,10.0832 5.342,10.1282C5.342,10.1732 5.307,10.2082 5.26,10.2082ZM5.26,10.0762C5.231,10.0762 5.203,10.0992 5.203,10.1282C5.203,10.1572 5.23,10.1832 5.26,10.1832C5.293,10.1832 5.319,10.1582 5.319,10.1282C5.319,10.1002 5.293,10.0762 5.26,10.0762Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M5.2135,9.9798C5.2135,9.9607 5.2304,9.9455 5.2516,9.9455C5.2724,9.9455 5.2898,9.9602 5.2898,9.9798C5.2898,10.0005 5.2724,10.0158 5.2516,10.0158C5.2304,10.0158 5.2135,10.0005 5.2135,9.9798" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.2889,10.0964C5.2429,10.0964 5.2069,10.0574 5.2069,10.0144C5.2069,9.9734 5.2429,9.9384 5.2889,9.9384C5.3349,9.9384 5.3709,9.9734 5.3709,10.0144C5.3709,10.0574 5.3349,10.0964 5.2889,10.0964ZM5.2889,9.9634C5.2579,9.9634 5.2299,9.9864 5.2299,10.0144C5.2299,10.0474 5.2569,10.0734 5.2889,10.0734C5.3189,10.0734 5.3469,10.0484 5.3469,10.0144C5.3469,9.9874 5.3189,9.9634 5.2889,9.9634Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M5.2713,9.8784C5.2713,9.8582 5.2893,9.8435 5.3095,9.8435C5.3313,9.8435 5.3471,9.8582 5.3471,9.8784C5.3471,9.8991 5.3313,9.9133 5.3095,9.9133C5.2893,9.9138 5.2713,9.8991 5.2713,9.8784" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.3472,9.9938C5.3022,9.9938 5.2642,9.9548 5.2642,9.9138C5.2642,9.8728 5.3022,9.8358 5.3472,9.8358C5.3932,9.8358 5.4282,9.8728 5.4282,9.9138C5.4282,9.9548 5.3932,9.9938 5.3472,9.9938ZM5.3472,9.8618C5.3172,9.8618 5.2902,9.8848 5.2902,9.9148C5.2902,9.9478 5.3162,9.9718 5.3472,9.9718C5.3792,9.9718 5.4052,9.9488 5.4052,9.9148C5.4052,9.8848 5.3802,9.8618 5.3472,9.8618Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M5.3509,9.7944C5.3509,9.7742 5.3667,9.7595 5.388,9.7595C5.4082,9.7595 5.4256,9.7742 5.4256,9.7944C5.4256,9.8145 5.4082,9.8325 5.388,9.8325C5.3667,9.8325 5.3509,9.8145 5.3509,9.7944" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.4253,9.9069C5.3803,9.9069 5.3433,9.8759 5.3433,9.8289C5.3433,9.7879 5.3803,9.7529 5.4253,9.7529C5.4693,9.7529 5.5073,9.7879 5.5073,9.8289C5.5073,9.8759 5.4693,9.9069 5.4253,9.9069ZM5.4253,9.7779C5.3923,9.7779 5.3683,9.8009 5.3683,9.8289C5.3683,9.8599 5.3913,9.8839 5.4253,9.8839C5.4573,9.8839 5.4813,9.8609 5.4813,9.8289C5.4813,9.8019 5.4573,9.7779 5.4253,9.7779Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M5.4404,9.7251C5.4404,9.7049 5.4573,9.6902 5.4785,9.6902C5.4993,9.6902 5.5167,9.7049 5.5167,9.7251C5.5167,9.7447 5.4987,9.76 5.4785,9.76C5.4567,9.7605 5.4404,9.7447 5.4404,9.7251" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.5158,9.8405C5.4688,9.8405 5.4338,9.8015 5.4338,9.7605C5.4338,9.7195 5.4688,9.6825 5.5158,9.6825C5.5608,9.6825 5.5978,9.7195 5.5978,9.7605C5.5978,9.8015 5.5608,9.8405 5.5158,9.8405ZM5.5158,9.7075C5.4838,9.7075 5.4568,9.7305 5.4568,9.7605C5.4568,9.7935 5.4828,9.8175 5.5158,9.8175C5.5458,9.8175 5.5728,9.7945 5.5728,9.7605C5.5728,9.7315 5.5458,9.7075 5.5158,9.7075Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M5.5489,9.6684C5.5489,9.6476 5.5653,9.6329 5.5865,9.6329C5.6067,9.6329 5.6242,9.6476 5.6242,9.6684C5.6242,9.6885 5.6062,9.7049 5.5865,9.7049C5.5653,9.7049 5.5489,9.6885 5.5489,9.6684" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.6238,9.7775C5.5778,9.7775 5.5418,9.7465 5.5418,9.7025C5.5418,9.6605 5.5778,9.6275 5.6238,9.6275C5.6678,9.6275 5.7058,9.6605 5.7058,9.7025C5.7058,9.7465 5.6678,9.7775 5.6238,9.7775ZM5.6238,9.6525C5.5908,9.6525 5.5658,9.6755 5.5658,9.7025C5.5658,9.7305 5.5908,9.7545 5.6238,9.7545C5.6548,9.7545 5.6798,9.7315 5.6798,9.7025C5.6798,9.6755 5.6548,9.6525 5.6238,9.6525Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M5.6607,9.628C5.6607,9.6067 5.6765,9.5925 5.6984,9.5925C5.7185,9.5925 5.7365,9.6067 5.7365,9.628C5.7365,9.646 5.7185,9.664 5.6984,9.664C5.6765,9.6645 5.6607,9.6465 5.6607,9.628" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.7352,9.7424C5.6902,9.7424 5.6542,9.7094 5.6542,9.6644C5.6542,9.6204 5.6892,9.5844 5.7352,9.5844C5.7802,9.5844 5.8172,9.6204 5.8172,9.6644C5.8172,9.7094 5.7802,9.7424 5.7352,9.7424ZM5.7352,9.6104C5.7032,9.6104 5.6782,9.6354 5.6782,9.6654C5.6782,9.6954 5.7032,9.7184 5.7352,9.7184C5.7652,9.7184 5.7922,9.6954 5.7922,9.6654C5.7922,9.6354 5.7662,9.6104 5.7352,9.6104Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M5.7851,9.6056C5.7851,9.5855 5.8025,9.5685 5.8233,9.5685C5.844,9.5685 5.8615,9.5855 5.8615,9.6056C5.8615,9.6258 5.844,9.6405 5.8233,9.6405C5.8025,9.6405 5.7851,9.6258 5.7851,9.6056" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.8611,9.7167C5.8151,9.7167 5.7791,9.6817 5.7791,9.6407C5.7791,9.5957 5.8151,9.5647 5.8611,9.5647C5.9071,9.5647 5.9431,9.5957 5.9431,9.6407C5.9431,9.6807 5.9071,9.7167 5.8611,9.7167ZM5.8611,9.5877C5.8301,9.5877 5.8031,9.6107 5.8031,9.6407C5.8031,9.6657 5.8301,9.6917 5.8611,9.6917C5.8921,9.6917 5.9201,9.6667 5.9201,9.6407C5.9191,9.6107 5.8921,9.5877 5.8611,9.5877Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M5.9045,9.5996C5.9045,9.58 5.922,9.5647 5.9422,9.5647C5.9645,9.5647 5.9804,9.58 5.9804,9.5996C5.9804,9.6187 5.964,9.6345 5.9422,9.6345C5.922,9.6345 5.9045,9.6187 5.9045,9.5996" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M5.9795,9.712C5.9355,9.712 5.8975,9.677 5.8975,9.636C5.8975,9.595 5.9355,9.556 5.9795,9.556C6.0265,9.556 6.0615,9.595 6.0615,9.636C6.0615,9.677 6.0265,9.712 5.9795,9.712ZM5.9795,9.579C5.9495,9.579 5.9225,9.602 5.9225,9.636C5.9225,9.665 5.9495,9.689 5.9795,9.689C6.0125,9.689 6.0385,9.666 6.0385,9.636C6.0385,9.602 6.0125,9.579 5.9795,9.579Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.0218,9.6024C6.0218,9.5822 6.0382,9.5675 6.0595,9.5675C6.0796,9.5675 6.0971,9.5822 6.0971,9.6024C6.0971,9.6225 6.0796,9.6405 6.0595,9.6405C6.0382,9.6411 6.0218,9.6231 6.0218,9.6024" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.0963,9.7155C6.0503,9.7155 6.0153,9.6845 6.0153,9.6375C6.0153,9.5965 6.0503,9.5615 6.0963,9.5615C6.1403,9.5615 6.1783,9.5965 6.1783,9.6375C6.1783,9.6835 6.1413,9.7155 6.0963,9.7155ZM6.0963,9.5865C6.0633,9.5865 6.0383,9.6095 6.0383,9.6375C6.0383,9.6685 6.0633,9.6925 6.0963,9.6925C6.1273,9.6925 6.1533,9.6695 6.1533,9.6375C6.1533,9.6095 6.1273,9.5865 6.0963,9.5865Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.138,9.6024C6.138,9.5822 6.1555,9.5675 6.1756,9.5675C6.198,9.5675 6.2138,9.5822 6.2138,9.6024C6.2138,9.6225 6.198,9.6405 6.1756,9.6405C6.1555,9.6411 6.138,9.6231 6.138,9.6024" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.2129,9.7155C6.1689,9.7155 6.1309,9.6845 6.1309,9.6375C6.1309,9.5965 6.1689,9.5615 6.2129,9.5615C6.2589,9.5615 6.2949,9.5965 6.2949,9.6375C6.2949,9.6835 6.2589,9.7155 6.2129,9.7155ZM6.2129,9.5865C6.1839,9.5865 6.1569,9.6095 6.1569,9.6375C6.1569,9.6685 6.1839,9.6925 6.2129,9.6925C6.2459,9.6925 6.2709,9.6695 6.2709,9.6375C6.2709,9.6095 6.2459,9.5865 6.2129,9.5865Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.0796,9.7049C6.0796,9.6836 6.0971,9.6667 6.1178,9.6667C6.1385,9.6667 6.156,9.6836 6.156,9.7049C6.156,9.7218 6.1385,9.7393 6.1178,9.7393C6.0971,9.7393 6.0796,9.7218 6.0796,9.7049" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.1551,9.8191C6.1091,9.8191 6.0731,9.7841 6.0731,9.7431C6.0731,9.6961 6.1091,9.6591 6.1551,9.6591C6.2011,9.6591 6.2371,9.6961 6.2371,9.7431C6.2371,9.7841 6.2011,9.8191 6.1551,9.8191ZM6.1551,9.6841C6.1241,9.6841 6.0971,9.7091 6.0971,9.7431C6.0971,9.7691 6.1241,9.7951 6.1551,9.7951C6.1861,9.7951 6.2141,9.7701 6.2141,9.7431C6.2131,9.7101 6.1861,9.6841 6.1551,9.6841Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.0567,9.8124C6.0567,9.7944 6.0731,9.778 6.0944,9.778C6.1151,9.778 6.132,9.7938 6.132,9.8124C6.132,9.8325 6.1151,9.8495 6.0944,9.8495C6.0731,9.85 6.0567,9.8325 6.0567,9.8124" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.1311,9.9285C6.0871,9.9285 6.0491,9.8915 6.0491,9.8465C6.0491,9.8055 6.0871,9.7715 6.1311,9.7715C6.1751,9.7715 6.2131,9.8055 6.2131,9.8465C6.2131,9.8915 6.1751,9.9285 6.1311,9.9285ZM6.1311,9.7955C6.0991,9.7955 6.0751,9.8185 6.0751,9.8465C6.0751,9.8795 6.0981,9.9035 6.1311,9.9035C6.1631,9.9035 6.1871,9.8805 6.1871,9.8465C6.1881,9.8195 6.1631,9.7955 6.1311,9.7955Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.0513,9.9236C6.0513,9.9029 6.0693,9.8882 6.0895,9.8882C6.1118,9.8882 6.1276,9.9029 6.1276,9.9236C6.1276,9.9433 6.1113,9.9602 6.0895,9.9602C6.0687,9.9607 6.0513,9.9433 6.0513,9.9236" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.1267,10.0342C6.0827,10.0342 6.0447,10.0032 6.0447,9.9592C6.0447,9.9172 6.0827,9.8822 6.1267,9.8822C6.1737,9.8822 6.2087,9.9172 6.2087,9.9592C6.2087,10.0022 6.1727,10.0342 6.1267,10.0342ZM6.1267,9.9092C6.0967,9.9092 6.0697,9.9322 6.0697,9.9592C6.0697,9.9872 6.0967,10.0112 6.1267,10.0112C6.1597,10.0112 6.1857,9.9882 6.1857,9.9592C6.1847,9.9322 6.1587,9.9092 6.1267,9.9092Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.0856,10.0245C6.0856,10.0033 6.1031,9.9891 6.1238,9.9891C6.1451,9.9891 6.162,10.0033 6.162,10.0245C6.162,10.0436 6.1451,10.0605 6.1238,10.0605C6.1031,10.0605 6.0856,10.0436 6.0856,10.0245" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.1616,10.138C6.1156,10.138 6.0796,10.105 6.0796,10.06C6.0796,10.016 6.1156,9.982 6.1616,9.982C6.2086,9.982 6.2436,10.016 6.2436,10.06C6.2436,10.105 6.2076,10.138 6.1616,10.138ZM6.1616,10.006C6.1306,10.006 6.1036,10.03 6.1036,10.06C6.1036,10.09 6.1306,10.113 6.1616,10.113C6.1926,10.113 6.2206,10.09 6.2206,10.06C6.2206,10.03 6.1926,10.006 6.1616,10.006Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.15,10.1167C6.15,10.0971 6.168,10.0802 6.1876,10.0802C6.2095,10.0802 6.2258,10.0971 6.2258,10.1167C6.2258,10.1364 6.2095,10.1522 6.1876,10.1522C6.168,10.1522 6.15,10.1364 6.15,10.1167" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.2255,10.2267C6.1815,10.2267 6.1435,10.1937 6.1435,10.1517C6.1435,10.1077 6.1815,10.0747 6.2255,10.0747C6.2725,10.0747 6.3075,10.1077 6.3075,10.1517C6.3075,10.1937 6.2725,10.2267 6.2255,10.2267ZM6.2255,10.0997C6.1965,10.0997 6.1685,10.1227 6.1685,10.1517C6.1685,10.1777 6.1965,10.2017 6.2255,10.2017C6.2585,10.2017 6.2845,10.1787 6.2845,10.1517C6.2835,10.1237 6.2575,10.0997 6.2255,10.0997Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.2264,9.5336C6.2264,9.5135 6.2427,9.4993 6.2645,9.4993C6.2847,9.4993 6.3027,9.5129 6.3027,9.5336C6.3027,9.5544 6.2847,9.5685 6.2645,9.5685C6.2427,9.5685 6.2264,9.5544 6.2264,9.5336" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.3018,9.6491C6.2548,9.6491 6.2198,9.6101 6.2198,9.5691C6.2198,9.5281 6.2548,9.4911 6.3018,9.4911C6.3458,9.4911 6.3838,9.5281 6.3838,9.5691C6.3838,9.6101 6.3468,9.6491 6.3018,9.6491ZM6.3018,9.5161C6.2698,9.5161 6.2428,9.5391 6.2428,9.5691C6.2428,9.6021 6.2688,9.6261 6.3018,9.6261C6.3318,9.6261 6.3588,9.6031 6.3588,9.5691C6.3588,9.5391 6.3318,9.5161 6.3018,9.5161Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.33,9.4764C6.33,9.4556 6.348,9.4409 6.3676,9.4409C6.39,9.4409 6.4053,9.4556 6.4053,9.4764C6.4053,9.496 6.3895,9.5129 6.3676,9.5129C6.348,9.5129 6.33,9.496 6.33,9.4764" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.4049,9.5864C6.3609,9.5864 6.3229,9.5554 6.3229,9.5114C6.3229,9.4674 6.3609,9.4344 6.4049,9.4344C6.4509,9.4344 6.4869,9.4674 6.4869,9.5114C6.4869,9.5554 6.4509,9.5864 6.4049,9.5864ZM6.4049,9.4594C6.3749,9.4594 6.3489,9.4844 6.3489,9.5114C6.3489,9.5394 6.3749,9.5634 6.4049,9.5634C6.4379,9.5634 6.4629,9.5404 6.4629,9.5114C6.4619,9.4854 6.4379,9.4594 6.4049,9.4594Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.4435,9.4409C6.4435,9.424 6.4609,9.406 6.4816,9.406C6.5029,9.406 6.5198,9.424 6.5198,9.4409C6.5198,9.4622 6.5029,9.478 6.4816,9.478C6.4615,9.478 6.4435,9.4622 6.4435,9.4409" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.5195,9.557C6.4745,9.557 6.4375,9.52 6.4375,9.475C6.4375,9.432 6.4745,9.4 6.5195,9.4C6.5665,9.4 6.6015,9.432 6.6015,9.475C6.6015,9.52 6.5665,9.557 6.5195,9.557ZM6.5195,9.425C6.4895,9.425 6.4615,9.448 6.4615,9.475C6.4615,9.506 6.4885,9.532 6.5195,9.532C6.5515,9.532 6.5785,9.507 6.5785,9.475C6.5775,9.448 6.5515,9.425 6.5195,9.425Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.5629,9.4224C6.5629,9.4011 6.5804,9.3853 6.6005,9.3853C6.6229,9.3853 6.6387,9.4011 6.6387,9.4224C6.6387,9.4404 6.6224,9.4567 6.6005,9.4567C6.5804,9.4567 6.5629,9.4409 6.5629,9.4224" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.6378,9.5372C6.5938,9.5372 6.5558,9.5012 6.5558,9.4602C6.5558,9.4152 6.5938,9.3782 6.6378,9.3782C6.6848,9.3782 6.7198,9.4152 6.7198,9.4602C6.7198,9.5002 6.6848,9.5372 6.6378,9.5372ZM6.6378,9.4032C6.6078,9.4032 6.5818,9.4262 6.5818,9.4602C6.5818,9.4852 6.6078,9.5122 6.6378,9.5122C6.6708,9.5122 6.6968,9.4862 6.6968,9.4602C6.6968,9.4262 6.6708,9.4032 6.6378,9.4032Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.6802,9.4235C6.6802,9.4022 6.6965,9.388 6.7178,9.388C6.738,9.388 6.7555,9.4022 6.7555,9.4235C6.7555,9.4425 6.738,9.4595 6.7178,9.4595C6.6965,9.46 6.6802,9.4431 6.6802,9.4235" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.7551,9.5369C6.7101,9.5369 6.6731,9.5039 6.6731,9.4589C6.6731,9.4149 6.7091,9.3809 6.7551,9.3809C6.7991,9.3809 6.8371,9.4149 6.8371,9.4589C6.8361,9.5039 6.7991,9.5369 6.7551,9.5369ZM6.7551,9.4059C6.7221,9.4059 6.6981,9.4299 6.6981,9.4599C6.6981,9.4899 6.7221,9.5129 6.7551,9.5129C6.7861,9.5129 6.8111,9.4899 6.8111,9.4599C6.8111,9.4299 6.7861,9.4059 6.7551,9.4059Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.8013,9.4431C6.8013,9.424 6.8182,9.4087 6.8389,9.4087C6.8596,9.4087 6.8765,9.4235 6.8765,9.4431C6.8765,9.4638 6.8596,9.4791 6.8389,9.4791C6.8182,9.4791 6.8013,9.4638 6.8013,9.4431" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.8762,9.5596C6.8322,9.5596 6.7942,9.5206 6.7942,9.4776C6.7942,9.4366 6.8312,9.4016 6.8762,9.4016C6.9202,9.4016 6.9582,9.4366 6.9582,9.4776C6.9572,9.5196 6.9202,9.5596 6.8762,9.5596ZM6.8762,9.4266C6.8432,9.4266 6.8202,9.4496 6.8202,9.4776C6.8202,9.5106 6.8432,9.5366 6.8762,9.5366C6.9082,9.5366 6.9322,9.5136 6.9322,9.4776C6.9322,9.4496 6.9082,9.4266 6.8762,9.4266Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M6.9131,9.4824C6.9131,9.4622 6.9295,9.4475 6.9507,9.4475C6.9715,9.4475 6.9884,9.4622 6.9884,9.4824C6.9884,9.502 6.9715,9.5173 6.9507,9.5173C6.9295,9.5173 6.9131,9.502 6.9131,9.4824" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.988,9.5978C6.944,9.5978 6.906,9.5588 6.906,9.5178C6.906,9.4768 6.944,9.4398 6.988,9.4398C7.032,9.4398 7.07,9.4768 7.07,9.5178C7.07,9.5588 7.032,9.5978 6.988,9.5978ZM6.988,9.4648C6.955,9.4648 6.932,9.4878 6.932,9.5178C6.932,9.5508 6.955,9.5748 6.988,9.5748C7.019,9.5748 7.044,9.5518 7.044,9.5178C7.044,9.4878 7.019,9.4648 6.988,9.4648Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M5.9515,11.7804L5.9193,11.7804L5.9193,11.7504L5.8625,11.7504L5.8625,11.878L5.9193,11.878L5.9193,11.9642L5.7982,11.9642L5.7982,12.2211L5.862,12.2211L5.862,12.7327L5.7344,12.7327L5.7344,12.9945L6.7184,12.9945L6.7184,12.7327L6.5907,12.7327L6.5907,12.2211L6.6545,12.2211L6.6545,11.9642L6.5345,11.9642L6.5345,11.878L6.5907,11.878L6.5907,11.7504L6.5345,11.7504L6.5345,11.7804L6.5024,11.7804L6.5024,11.7504L6.4473,11.7504L6.4473,11.7804L6.4064,11.7804L6.4064,11.7504L6.3513,11.7504L6.3513,11.878L6.4064,11.878L6.4064,11.9642L6.2875,11.9642L6.2875,11.686L6.3513,11.686L6.3513,11.5573L6.2875,11.5573L6.2875,11.5884L6.2553,11.5884L6.2553,11.5573L6.1985,11.5573L6.1985,11.5884L6.1664,11.5884L6.1664,11.5573L6.102,11.5573L6.102,11.686L6.1664,11.686L6.1664,11.9642L6.0469,11.9642L6.0469,11.878L6.102,11.878L6.102,11.7504L6.0469,11.7504L6.0469,11.7804L6.0147,11.7804L6.0147,11.7504L5.9509,11.7504L5.9509,11.7804L5.9515,11.7804ZM5.7349,12.9945L6.7189,12.9945M5.7349,12.9307L6.7189,12.9307M5.7349,12.8669L6.7189,12.8669M5.7349,12.8031L6.7189,12.8031M5.7349,12.7327L6.7189,12.7327M5.8625,12.6749L6.5907,12.6749M5.8625,12.6111L6.5907,12.6111M5.8625,12.5407L6.5907,12.5407M5.8625,12.4769L6.5907,12.4769M5.8625,12.4131L6.5907,12.4131M5.8625,12.3493L6.5907,12.3493M5.8625,12.2849L6.5907,12.2849M5.7987,12.2211L6.6545,12.2211M5.7987,12.1562L6.6545,12.1562M5.7987,12.0924L6.6545,12.0924M5.7987,12.0285L6.6545,12.0285M5.9198,11.9647L6.5345,11.9647M6.1669,11.9004L6.2875,11.9004M6.1669,11.8365L6.2875,11.8365M6.1669,11.7727L6.2875,11.7727M6.1669,11.7089L6.2875,11.7089M6.1025,11.6265L6.3513,11.6265M5.9198,11.9004L6.0475,11.9004M5.8625,11.8185L6.1025,11.8185M5.8625,12.9945L5.8625,12.9307M5.8625,12.8669L5.8625,12.8031M5.7987,12.8669L5.7987,12.9307M5.9198,12.9307L5.9198,12.8669M5.9836,12.9945L5.9836,12.9307M5.9836,12.8669L5.9836,12.8031M5.9836,12.7327L5.9836,12.6755M5.9836,12.6111L5.9836,12.5407M5.9198,12.8031L5.9198,12.7327M5.7987,12.8031L5.7987,12.7327M6.0475,12.7327L6.0475,12.8031M6.1025,12.7327L6.1025,12.6755M5.9198,12.6111L5.9198,12.6749M6.0475,12.6111L6.0475,12.6749M6.1669,12.6111L6.1669,12.6749M6.1025,12.6111L6.1025,12.5407M6.1669,12.4769L6.1669,12.5407M6.1669,12.3493L6.1669,12.4131M6.1025,12.2849L6.1025,12.3487M6.1669,12.2211L6.1669,12.2849M6.0475,12.2211L6.0475,12.2849M5.9198,12.2211L5.9198,12.2849M5.8625,12.1562L5.8625,12.2211M5.9836,12.1562L5.9836,12.2211M6.1025,12.1562L6.1025,12.2211M6.1669,12.0924L6.1669,12.1562M6.0475,12.0924L6.0475,12.1562M5.9198,12.0924L5.9198,12.1562M5.8625,12.0285L5.8625,12.0924M6.1025,12.0285L6.1025,12.0924M5.9836,11.9004L5.9836,11.9642M6.5345,11.9004L6.4064,11.9004M6.5907,11.8185L6.3513,11.8185M6.5907,12.9945L6.5907,12.9307M6.5907,12.8669L6.5907,12.8031M6.6545,12.8669L6.6545,12.9307M6.5345,12.9307L6.5345,12.8669M6.4702,12.9945L6.4702,12.9307M6.4702,12.8669L6.4702,12.8031M6.4702,12.7327L6.4702,12.6755M6.4702,12.6111L6.4702,12.5407M6.5345,12.8031L6.5345,12.7327M6.6545,12.8031L6.6545,12.7327M6.4064,12.7327L6.4064,12.8031M6.3513,12.7327L6.3513,12.6755M6.5345,12.6111L6.5345,12.6749M6.4064,12.6111L6.4064,12.6749M6.2875,12.6111L6.2875,12.6749M6.3513,12.6111L6.3513,12.5407M6.2875,12.4769L6.2875,12.5407M6.2875,12.3493L6.2875,12.4131M6.3513,12.2849L6.3513,12.3487M6.2875,12.2211L6.2875,12.2849M6.4064,12.2211L6.4064,12.2849M6.5345,12.2211L6.5345,12.2849M6.5907,12.1562L6.5907,12.2211M6.4702,12.1562L6.4702,12.2211M6.3513,12.1562L6.3513,12.2211M6.2875,12.0924L6.2875,12.1562M6.4064,12.0924L6.4064,12.1562M6.5345,12.0924L6.5345,12.1562M6.5907,12.0285L6.5907,12.0924M6.3513,12.0285L6.3513,12.0924M6.4702,11.9004L6.4702,11.9642M6.2236,12.6111L6.2236,12.5407M6.2236,12.3493L6.2236,12.2855M6.2236,12.4769L6.2236,12.4131M6.2236,12.2211L6.2236,12.1562M6.2236,12.0924L6.2236,12.0285M6.2236,11.9004L6.2236,11.8365M6.2236,11.7727L6.2236,11.7089M5.9198,11.878L6.0475,11.878M6.1669,11.6865L6.2875,11.6865M6.4064,11.878L6.5345,11.878" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.7278,13.0033L5.7278,13.0033L5.7278,12.7245L5.8556,12.7245L5.8556,12.2276L5.7917,12.2276L5.7917,11.9565L5.9108,11.9565L5.9108,11.8824L5.8556,11.8824L5.8556,11.7405L5.9266,11.7405L5.9266,11.7727L5.943,11.7727L5.943,11.7405L6.0227,11.7405L6.0227,11.7727L6.0386,11.7727L6.0386,11.7405L6.1112,11.7405L6.1112,11.8824L6.055,11.8824L6.055,11.9565L6.1598,11.9565L6.1598,11.6909L6.0959,11.6909L6.0959,11.5491L6.1757,11.5491L6.1757,11.5813L6.192,11.5813L6.192,11.5491L6.263,11.5491L6.263,11.5813L6.2789,11.5813L6.2789,11.5491L6.3586,11.5491L6.3586,11.6909L6.2953,11.6909L6.2953,11.9565L6.3996,11.9565L6.3996,11.8824L6.3428,11.8824L6.3428,11.7405L6.4154,11.7405L6.4154,11.7727L6.4389,11.7727L6.4389,11.7405L6.5115,11.7405L6.5115,11.7727L6.5274,11.7727L6.5274,11.7405L6.5989,11.7405L6.5989,11.8824L6.5432,11.8824L6.5432,11.9565L6.6628,11.9565L6.6628,12.2276L6.5989,12.2276L6.5989,12.7245L6.7267,12.7245L6.7267,13.0033L6.7278,13.0033ZM6.5995,12.9885L6.712,12.9885L6.712,12.9395L6.5995,12.9395L6.5995,12.9885ZM6.4799,12.9885L6.5831,12.9885L6.5831,12.9395L6.4799,12.9395L6.4799,12.9885ZM5.9911,12.9885L6.464,12.9885L6.464,12.9395L5.9911,12.9395L5.9911,12.9885ZM5.872,12.9885L5.9747,12.9885L5.9747,12.9395L5.872,12.9395L5.872,12.9885ZM5.7442,12.9885L5.8562,12.9885L5.8562,12.9395L5.7442,12.9395L5.7442,12.9885ZM6.5443,12.9242L6.6475,12.9242L6.6475,12.8751L6.5443,12.8751L6.5443,12.9242ZM5.9266,12.9242L6.5279,12.9242L6.5279,12.8751L5.9266,12.8751L5.9266,12.9242L5.9266,12.9242ZM5.8081,12.9242L5.9108,12.9242L5.9108,12.8751L5.8081,12.8751L5.8081,12.9242ZM6.5995,12.8604L6.712,12.8604L6.712,12.8113L6.5995,12.8113L6.5995,12.8604ZM6.4799,12.8604L6.5831,12.8604L6.5831,12.8113L6.4799,12.8113L6.4799,12.8604ZM5.9911,12.8604L6.464,12.8604L6.464,12.8113L5.9911,12.8113L5.9911,12.8604ZM5.872,12.8604L5.9747,12.8604L5.9747,12.8113L5.872,12.8113L5.872,12.8604ZM5.7442,12.8604L5.8562,12.8604L5.8562,12.8113L5.7442,12.8113L5.7442,12.8604ZM6.6634,12.7965L6.7114,12.7965L6.7114,12.7393L6.6634,12.7393L6.6634,12.7965ZM6.5443,12.7965L6.6475,12.7965L6.6475,12.7393L6.5443,12.7393L6.5443,12.7965ZM6.416,12.7965L6.5279,12.7965L6.5279,12.7393L6.416,12.7393L6.416,12.7965ZM6.055,12.7965L6.3996,12.7965L6.3996,12.7393L6.055,12.7393L6.055,12.7965ZM5.9266,12.7965L6.0391,12.7965L6.0391,12.7393L5.9266,12.7393L5.9266,12.7965ZM5.8081,12.7965L5.9108,12.7965L5.9108,12.7393L5.8081,12.7393L5.8081,12.7965ZM5.7442,12.7965L5.7917,12.7965L5.7917,12.7393L5.7442,12.7393L5.7442,12.7965ZM6.4799,12.7245L6.5831,12.7245L6.5831,12.6836L6.4799,12.6836L6.4799,12.7245ZM6.3592,12.7245L6.4635,12.7245L6.4635,12.6836L6.3592,12.6836L6.3592,12.7245ZM6.1118,12.7245L6.3433,12.7245L6.3433,12.6836L6.1118,12.6836L6.1118,12.7245ZM5.9911,12.7245L6.0959,12.7245L6.0959,12.6836L5.9911,12.6836L5.9911,12.7245ZM5.872,12.7245L5.9747,12.7245L5.9747,12.6836L5.872,12.6836L5.872,12.7245ZM6.416,12.6689L6.5279,12.6689L6.5279,12.6198L6.416,12.6198L6.416,12.6689ZM6.2953,12.6689L6.3996,12.6689L6.3996,12.6198L6.2953,12.6198L6.2953,12.6689ZM6.1757,12.6689L6.2789,12.6689L6.2789,12.6198L6.1757,12.6198L6.1757,12.6689ZM6.055,12.6689L6.1598,12.6689L6.1598,12.6198L6.055,12.6198L6.055,12.6689ZM5.9266,12.6689L6.0391,12.6689L6.0391,12.6198L5.9266,12.6198L5.9266,12.6689ZM6.4799,12.6045L6.5831,12.6045L6.5831,12.5473L6.4799,12.5473L6.4799,12.6045ZM6.3592,12.6045L6.4635,12.6045L6.4635,12.5473L6.3592,12.5473L6.3592,12.6045ZM6.2308,12.6045L6.3433,12.6045L6.3433,12.5473L6.2308,12.5473L6.2308,12.6045ZM6.1118,12.6045L6.215,12.6045L6.215,12.5473L6.1118,12.5473L6.1118,12.6045ZM5.9911,12.6045L6.0959,12.6045L6.0959,12.5473L5.9911,12.5473L5.9911,12.6045ZM5.872,12.6045L5.9747,12.6045L5.9747,12.5473L5.872,12.5473L5.872,12.6045ZM6.2953,12.532L6.5836,12.532L6.5836,12.4835L6.2953,12.4835L6.2953,12.532ZM6.1757,12.532L6.2789,12.532L6.2789,12.4835L6.1757,12.4835L6.1757,12.532ZM5.872,12.532L6.1598,12.532L6.1598,12.4835L5.872,12.4835L5.872,12.532ZM6.2308,12.4676L6.5836,12.4676L6.5836,12.4191L6.2308,12.4191L6.2308,12.4676ZM5.872,12.4676L6.215,12.4676L6.215,12.4191L5.872,12.4191L5.872,12.4676ZM6.2953,12.4038L6.5836,12.4038L6.5836,12.3553L6.2953,12.3553L6.2953,12.4038ZM6.1757,12.4038L6.2789,12.4038L6.2789,12.3553L6.1757,12.3553L6.1757,12.4038ZM5.872,12.4038L6.1598,12.4038L6.1598,12.3553L5.872,12.3553L5.872,12.4038ZM6.3592,12.34L6.5836,12.34L6.5836,12.2915L6.3592,12.2915L6.3592,12.34ZM6.2308,12.34L6.3433,12.34L6.3433,12.2915L6.2308,12.2915L6.2308,12.34ZM6.1118,12.34L6.215,12.34L6.215,12.2915L6.1118,12.2915L6.1118,12.34ZM5.872,12.34L6.0959,12.34L6.0959,12.2915L5.872,12.2915L5.872,12.34ZM6.416,12.2762L6.5279,12.2762L6.5279,12.2276L6.416,12.2276L6.416,12.2762ZM6.2953,12.2762L6.3996,12.2762L6.3996,12.2276L6.2953,12.2276L6.2953,12.2762ZM6.1757,12.2762L6.2789,12.2762L6.2789,12.2276L6.1757,12.2276L6.1757,12.2762ZM6.055,12.2762L6.1598,12.2762L6.1598,12.2276L6.055,12.2276L6.055,12.2762ZM5.9266,12.2762L6.0391,12.2762L6.0391,12.2276L5.9266,12.2276L5.9266,12.2762ZM6.4799,12.2124L6.5831,12.2124L6.5831,12.1638L6.4799,12.1638L6.4799,12.2124ZM6.3592,12.2124L6.4635,12.2124L6.4635,12.1638L6.3592,12.1638L6.3592,12.2124ZM6.2308,12.2124L6.3433,12.2124L6.3433,12.1638L6.2308,12.1638L6.2308,12.2124ZM6.1118,12.2124L6.215,12.2124L6.215,12.1638L6.1118,12.1638L6.1118,12.2124ZM5.9911,12.2124L6.0959,12.2124L6.0959,12.1638L5.9911,12.1638L5.9911,12.2124ZM5.872,12.2124L5.9747,12.2124L5.9747,12.1638L5.872,12.1638L5.872,12.2124ZM6.5443,12.148L6.6475,12.148L6.6475,12.1L6.5443,12.1L6.5443,12.148ZM6.416,12.148L6.5279,12.148L6.5279,12.1L6.416,12.1L6.416,12.148ZM6.2953,12.148L6.3996,12.148L6.3996,12.1L6.2953,12.1L6.2953,12.148ZM6.1757,12.148L6.2789,12.148L6.2789,12.1L6.1757,12.1L6.1757,12.148ZM6.055,12.148L6.1598,12.148L6.1598,12.1L6.055,12.1L6.055,12.148ZM5.9266,12.148L6.0391,12.148L6.0391,12.1L5.9266,12.1L5.9266,12.148ZM5.8081,12.148L5.9108,12.148L5.9108,12.1L5.8081,12.1L5.8081,12.148ZM6.3592,12.0842L6.5836,12.0842L6.5836,12.0356L6.3592,12.0356L6.3592,12.0842ZM6.2308,12.0842L6.3433,12.0842L6.3433,12.0356L6.2308,12.0356L6.2308,12.0842ZM6.1118,12.0842L6.215,12.0842L6.215,12.0356L6.1118,12.0356L6.1118,12.0842ZM5.872,12.0842L6.0959,12.0842L6.0959,12.0356L5.872,12.0356L5.872,12.0842ZM5.8081,12.0204L6.6475,12.0204L6.6475,11.9718L5.8081,11.9718L5.8081,12.0204ZM6.1757,11.9565L6.2789,11.9565L6.2789,11.908L6.1757,11.908L6.1757,11.9565ZM6.416,11.8927L6.5279,11.8927L6.5279,11.8824L6.416,11.8824L6.416,11.8927ZM5.9266,11.8927L6.0391,11.8927L6.0391,11.8824L5.9266,11.8824L5.9266,11.8927ZM6.5356,11.8687L6.5836,11.8687L6.5836,11.8289L6.3592,11.8289L6.3592,11.8687L6.5356,11.8687ZM6.0479,11.8687L6.0959,11.8687L6.0959,11.8289L5.872,11.8289L5.872,11.8687L6.0479,11.8687ZM6.1757,11.8289L6.2789,11.8289L6.2789,11.7804L6.1757,11.7804L6.1757,11.8289ZM6.3592,11.8142L6.5836,11.8142L6.5836,11.7547L6.5443,11.7547L6.5443,11.7891L6.4963,11.7891L6.4963,11.7547L6.4558,11.7547L6.4558,11.7891L6.4001,11.7891L6.4001,11.7547L6.3597,11.7547L6.3597,11.8142L6.3592,11.8142ZM5.872,11.8142L6.0959,11.8142L6.0959,11.7547L6.055,11.7547L6.055,11.7891L6.0069,11.7891L6.0069,11.7547L5.9588,11.7547L5.9588,11.7891L5.9113,11.7891L5.9113,11.7547L5.8725,11.7547L5.8725,11.8142L5.872,11.8142ZM6.1757,11.7007L6.2789,11.7007L6.2789,11.6909L6.1757,11.6909L6.1757,11.7007ZM6.2882,11.6767L6.3433,11.6767L6.3433,11.6369L6.1118,11.6369L6.1118,11.6767L6.2882,11.6767ZM6.1118,11.6227L6.3433,11.6227L6.3433,11.5633L6.2953,11.5633L6.2953,11.5976L6.2472,11.5976L6.2472,11.5633L6.2079,11.5633L6.2079,11.5976L6.1604,11.5976L6.1604,11.5633L6.1123,11.5633L6.1123,11.6227L6.1118,11.6227Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.3905,12.9945C6.3905,12.916 6.3905,12.8604 6.3905,12.8271C6.3905,12.796 6.3747,12.6995 6.2236,12.6995C6.0796,12.6995 6.0638,12.7965 6.0638,12.8271C6.0638,12.8604 6.0638,12.916 6.0638,12.9945L6.3905,12.9945Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.6855,13.2624L6.0545,13.2624L6.0545,12.9404C6.0545,12.8974 6.0715,12.6924 6.3645,12.6924C6.6695,12.6924 6.6865,12.8974 6.6865,12.9404L6.6865,13.2624L6.6855,13.2624ZM6.0835,13.2354L6.6565,13.2354L6.6565,12.9404C6.6565,12.9054 6.6415,12.7234 6.3635,12.7234C6.0975,12.7234 6.0835,12.9054 6.0835,12.9404L6.0835,13.2354L6.0835,13.2354Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.1184,12.8369L6.0387,12.8271C6.0387,12.796 6.0475,12.7475 6.0709,12.7322L6.1435,12.7884C6.1347,12.7965 6.1184,12.82 6.1184,12.8369Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.2076,12.9473L6.0316,12.9313L6.0316,12.9153C6.0316,12.8473 6.0486,12.7593 6.0956,12.7273L6.1036,12.7213L6.2576,12.8413L6.2456,12.8523C6.2296,12.8673 6.2066,12.9093 6.2066,12.9323L6.2066,12.9473L6.2076,12.9473ZM6.0606,12.9043L6.1776,12.9163C6.1836,12.8923 6.2006,12.8633 6.2136,12.8463L6.1036,12.7583C6.0766,12.7873 6.0606,12.8473 6.0606,12.9043Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.3349,12.8369L6.4151,12.8271C6.4151,12.796 6.4064,12.7475 6.3829,12.7322L6.3104,12.7884C6.3191,12.7965 6.3349,12.82 6.3349,12.8369Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.3499,12.9468L6.3499,12.9328C6.3499,12.9098 6.3249,12.8678 6.3109,12.8528L6.2989,12.8418L6.4529,12.7218L6.4589,12.7278C6.5079,12.7588 6.5239,12.8468 6.5239,12.9158L6.5239,12.9318L6.3499,12.9468ZM6.3419,12.8448C6.3549,12.8628 6.3719,12.8908 6.3769,12.9148L6.4959,12.9028C6.4939,12.8458 6.4809,12.7858 6.4539,12.7568L6.3419,12.8448Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.2553,12.7562L6.2945,12.6836C6.2787,12.6749 6.2465,12.6689 6.2236,12.6689C6.2073,12.6689 6.1756,12.6755 6.1598,12.6836L6.1991,12.7562C6.2149,12.7562 6.2389,12.7562 6.2553,12.7562Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.3518,12.8496L6.2328,12.8496L6.1478,12.6996L6.1628,12.6876C6.1928,12.6776 6.2538,12.6596 6.2868,12.6596C6.3338,12.6596 6.3928,12.6786 6.4238,12.6876L6.4388,12.6996L6.3518,12.8496ZM6.2518,12.8206L6.3358,12.8206L6.3978,12.7116C6.3688,12.7016 6.3218,12.6886 6.2868,12.6886C6.2638,12.6886 6.2178,12.7026 6.1888,12.7116L6.2518,12.8206Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.1025,12.556C6.1025,12.556 6.1025,12.4284 6.1025,12.3804C6.1025,12.3313 6.0704,12.292 6.0153,12.292C5.9585,12.292 5.9264,12.3313 5.9264,12.3804C5.9264,12.4284 5.9264,12.556 5.9264,12.556L6.1025,12.556Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.2713,12.7969L5.9193,12.7969L5.9193,12.4589C5.9193,12.3569 5.9893,12.2849 6.0953,12.2849C6.1983,12.2849 6.2713,12.3569 6.2713,12.4589L6.2713,12.7969ZM5.9493,12.7659L6.2423,12.7659L6.2423,12.4589C6.2423,12.3859 6.1953,12.3129 6.0953,12.3129C5.9933,12.3129 5.9493,12.3859 5.9493,12.4589L5.9493,12.7659L5.9493,12.7659Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.3513,12.556C6.3513,12.556 6.3513,12.4284 6.3513,12.3804C6.3513,12.3313 6.3835,12.292 6.4385,12.292C6.4953,12.292 6.5269,12.3313 6.5269,12.3804C6.5269,12.4284 6.5269,12.556 6.5269,12.556L6.3513,12.556Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.694,12.7969L6.342,12.7969L6.342,12.4589C6.342,12.3569 6.415,12.2849 6.518,12.2849C6.622,12.2849 6.694,12.3569 6.694,12.4589L6.694,12.7969ZM6.372,12.7659L6.665,12.7659L6.665,12.4589C6.665,12.3859 6.621,12.3129 6.518,12.3129C6.417,12.3129 6.372,12.3859 6.372,12.4589L6.372,12.7659L6.372,12.7659Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.2875,12.1245l0.0158,-0.1598l-0.1522,0l0.0087,0.1598z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.4195,12.2815L6.1585,12.2815L6.1435,11.9565L6.4525,11.9565L6.4195,12.2815ZM6.1845,12.2485L6.3935,12.2485L6.4185,11.9845L6.1725,11.9845L6.1845,12.2485Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.4064,12.1245l-0.0158,-0.1598l0.1598,0l-0.0158,0.1598z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.6758,12.2815L6.4128,12.2815L6.3818,11.9565L6.7058,11.9565L6.6758,12.2815ZM6.4408,12.2485L6.6478,12.2485L6.6758,11.9845L6.4128,11.9845L6.4408,12.2485Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.0475,12.1245l0.0071,-0.1598l-0.1505,0l0.0158,0.1598z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M6.1872,12.2815L5.9272,12.2815L5.8942,11.9565L6.2052,11.9565L6.1872,12.2815ZM5.9522,12.2485L6.1602,12.2485L6.1752,11.9845L5.9272,11.9845L5.9522,12.2485Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#0039F0" + android:fillType="nonZero" + android:pathData="M6.633,13.3078C6.633,13.2149 6.633,13.1339 6.633,13.1005C6.633,13.064 6.6051,12.9599 6.4361,12.9599C6.2795,12.9599 6.2516,13.064 6.2516,13.1005C6.2516,13.1339 6.2516,13.2149 6.2516,13.3078L6.633,13.3078ZM6.1959,12.647C6.1959,12.647 6.1959,12.4826 6.1959,12.427C6.1959,12.3682 6.1556,12.3078 6.071,12.3078C5.9875,12.3078 5.9433,12.3682 5.9433,12.427C5.9433,12.4826 5.9433,12.647 5.9433,12.647L6.1959,12.647ZM6.6897,12.647C6.6897,12.647 6.6897,12.4826 6.6897,12.427C6.6897,12.3682 6.731,12.3078 6.8155,12.3078C6.9,12.3078 6.9433,12.3682 6.9433,12.427C6.9433,12.4826 6.9433,12.647 6.9433,12.647L6.6897,12.647Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#AD1519" + android:fillType="nonZero" + android:pathData="M6.5335,13.2536C6.5335,12.9051 6.786,12.6215 7.0958,12.6215C7.4062,12.6215 7.6582,12.9056 7.6582,13.2536C7.6582,13.6044 7.4062,13.8869 7.0958,13.8869C6.786,13.8869 6.5335,13.6038 6.5335,13.2536" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.0958,13.8978C6.7795,13.8978 6.5231,13.6082 6.5231,13.2531C6.5231,12.9007 6.7795,12.6105 7.0958,12.6105C7.4127,12.6105 7.6685,12.9002 7.6685,13.2531C7.6685,13.6082 7.4122,13.8978 7.0958,13.8978ZM7.0958,12.6324C6.7925,12.6324 6.5438,12.9116 6.5438,13.2536C6.5438,13.5956 6.7925,13.8771 7.0958,13.8771C7.3996,13.8771 7.6484,13.5956 7.6484,13.2536C7.6484,12.9116 7.3996,12.6324 7.0958,12.6324Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#005BBF" + android:fillType="nonZero" + android:pathData="M6.6998,13.2515C6.6998,12.9945 6.8782,12.7889 7.0958,12.7889C7.3145,12.7889 7.4924,12.9945 7.4924,13.2515C7.4924,13.5095 7.3151,13.7178 7.0958,13.7178C6.8776,13.7178 6.6998,13.5095 6.6998,13.2515" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.1897,13.7775C6.9143,13.7775 6.69,13.553 6.69,13.2763C6.69,13.0013 6.9136,12.7775 7.1897,12.7775C7.4657,12.7775 7.69,13.0019 7.69,13.2763C7.6893,13.553 7.465,13.7775 7.1897,13.7775ZM7.1897,12.7998C6.9291,12.7998 6.7162,13.0151 6.7162,13.2763C6.7162,13.5415 6.9291,13.7551 7.1897,13.7551C7.4516,13.7551 7.6645,13.5415 7.6645,13.2763C7.6645,13.0151 7.4516,12.7998 7.1897,12.7998Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.9093,12.9329C6.9093,12.9329 6.8629,12.9842 6.8629,13.0333C6.8629,13.0802 6.882,13.1211 6.882,13.1211C6.8755,13.1015 6.8564,13.0873 6.834,13.0873C6.8056,13.0873 6.7822,13.1096 6.7822,13.1353C6.7822,13.144 6.7865,13.1565 6.7898,13.1631L6.8073,13.198C6.8122,13.1855 6.8258,13.1784 6.8405,13.1784C6.8618,13.1784 6.8787,13.1947 6.8787,13.2122C6.8787,13.2165 6.8782,13.2209 6.8771,13.2225L6.8345,13.2225L6.8345,13.2591L6.8727,13.2591L6.8444,13.3136L6.8825,13.2995L6.9098,13.3311L6.9393,13.2995L6.9753,13.3136L6.948,13.2591L6.9851,13.2591L6.9851,13.2225L6.9431,13.2225C6.9431,13.2209 6.9431,13.2165 6.9431,13.2122C6.9431,13.1953 6.9595,13.1784 6.9785,13.1784C6.9938,13.1784 7.0069,13.1855 7.0129,13.198L7.0293,13.1631C7.0331,13.1565 7.0385,13.144 7.0385,13.1353C7.0385,13.1096 7.0156,13.0873 6.9867,13.0873C6.9638,13.0873 6.9447,13.1009 6.9371,13.1211C6.9371,13.1211 6.9573,13.0802 6.9573,13.0333C6.9573,12.9842 6.9093,12.9329 6.9093,12.9329" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.0206,13.6769L7.0206,13.6769C7.0176,13.6769 7.0146,13.6769 7.0116,13.6769L6.9656,13.6219L6.9056,13.6459C6.9006,13.6489 6.8956,13.6469 6.8936,13.6409C6.8896,13.6369 6.8886,13.6349 6.8916,13.6289L6.9346,13.5429L6.8816,13.5429C6.8756,13.5429 6.8716,13.5399 6.8716,13.5349L6.8716,13.4679C6.8716,13.4649 6.8756,13.4569 6.8816,13.4569L6.9516,13.4569C6.9516,13.4529 6.9516,13.4509 6.9516,13.4489C6.9516,13.4229 6.9256,13.3969 6.8926,13.3969C6.8696,13.3969 6.8496,13.4079 6.8406,13.4249C6.8406,13.4289 6.8356,13.4309 6.8316,13.4329C6.8286,13.4329 6.8226,13.4289 6.8226,13.4249L6.7916,13.3659C6.7866,13.3539 6.7756,13.3289 6.7756,13.3069C6.7756,13.2519 6.8226,13.2099 6.8806,13.2099C6.9006,13.2099 6.9226,13.2129 6.9396,13.2289C6.9296,13.1959 6.9226,13.1589 6.9226,13.1199C6.9226,13.0339 6.9986,12.9479 7.0096,12.9319C7.0136,12.9239 7.0226,12.9239 7.0276,12.9299C7.0376,12.9419 7.1176,13.0319 7.1176,13.1189C7.1176,13.1579 7.1096,13.1949 7.1036,13.2279C7.1196,13.2119 7.1386,13.2089 7.1616,13.2089C7.2196,13.2089 7.2666,13.2509 7.2666,13.3059C7.2666,13.3269 7.2556,13.3509 7.2506,13.3649L7.2196,13.4239C7.2166,13.4279 7.2146,13.4319 7.2096,13.4319C7.2046,13.4329 7.2016,13.4279 7.1986,13.4239C7.1926,13.4059 7.1716,13.3959 7.1456,13.3959C7.1156,13.3959 7.0906,13.4209 7.0906,13.4479C7.0906,13.4499 7.0906,13.4519 7.0906,13.4559L7.1576,13.4559C7.1636,13.4559 7.1686,13.4639 7.1686,13.4669L7.1686,13.5339C7.1686,13.5389 7.1636,13.5419 7.1576,13.5419L7.1076,13.5419L7.1506,13.6279C7.1506,13.6339 7.1506,13.6359 7.1496,13.6399C7.1456,13.6459 7.1406,13.6479 7.1376,13.6449L7.0756,13.6209L7.0286,13.6759C7.0266,13.6769 7.0226,13.6769 7.0206,13.6769ZM6.9706,13.5989C6.9716,13.5989 6.9756,13.6009 6.9766,13.6049L7.0216,13.6539L7.0656,13.6049C7.0696,13.5989 7.0746,13.5969 7.0776,13.6009L7.1196,13.6149L7.0816,13.5399C7.0796,13.5369 7.0806,13.5349 7.0816,13.5289C7.0826,13.5249 7.0876,13.5209 7.0906,13.5209L7.1486,13.5209L7.1486,13.4779L7.0816,13.4779C7.0766,13.4779 7.0736,13.4739 7.0706,13.4719C7.0696,13.4659 7.0696,13.4579 7.0696,13.4509C7.0696,13.4119 7.1046,13.3789 7.1466,13.3789C7.1736,13.3789 7.1936,13.3869 7.2096,13.4039L7.2306,13.3569C7.2386,13.3469 7.2446,13.3259 7.2446,13.3099C7.2446,13.2689 7.2076,13.2319 7.1616,13.2319C7.1276,13.2319 7.0986,13.2529 7.0866,13.2789C7.0826,13.2849 7.0806,13.2869 7.0806,13.2869C7.0796,13.2929 7.0726,13.2949 7.0676,13.2909C7.0636,13.2889 7.0586,13.2849 7.0616,13.2789C7.0626,13.2769 7.0626,13.2709 7.0656,13.2649C7.0746,13.2449 7.0966,13.1899 7.0966,13.1219C7.0966,13.0519 7.0396,12.9809 7.0196,12.9559C6.9986,12.9809 6.9446,13.0519 6.9446,13.1219C6.9446,13.1869 6.9656,13.2449 6.9746,13.2669C6.9756,13.2709 6.9786,13.2769 6.9806,13.2789C6.9806,13.2849 6.9796,13.2889 6.9746,13.2909C6.9696,13.2949 6.9626,13.2929 6.9596,13.2869C6.9596,13.2869 6.9576,13.2849 6.9556,13.2789C6.9396,13.2519 6.9116,13.2319 6.8806,13.2319C6.8336,13.2319 6.7956,13.2689 6.7956,13.3099C6.7956,13.3259 6.8036,13.3449 6.8106,13.3569L6.8336,13.4039C6.8456,13.3859 6.8686,13.3789 6.8926,13.3789C6.9376,13.3789 6.9736,13.4119 6.9736,13.4509C6.9736,13.4609 6.9726,13.4669 6.9696,13.4719C6.9696,13.4739 6.9636,13.4779 6.9596,13.4779L6.8936,13.4779L6.8936,13.5209L6.9526,13.5209C6.9566,13.5209 6.9586,13.5249 6.9616,13.5289C6.9636,13.5349 6.9636,13.5369 6.9626,13.5399L6.9236,13.6149L6.9646,13.6009C6.9656,13.5989 6.9686,13.5989 6.9706,13.5989Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M6.834,13.2591l0.1505,0l0,-0.0365l-0.1505,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.1255,13.302L6.8285,13.302L6.8285,13.216L7.1255,13.216L7.1255,13.302ZM6.8495,13.279L7.1045,13.279L7.1045,13.236L6.8495,13.236L6.8495,13.279Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.2775,12.9329C7.2775,12.9329 7.23,12.9842 7.23,13.0333C7.23,13.0802 7.2491,13.1211 7.2491,13.1211C7.2425,13.1015 7.2235,13.0873 7.2016,13.0873C7.1727,13.0873 7.1498,13.1096 7.1498,13.1353C7.1498,13.144 7.1536,13.1565 7.1575,13.1631L7.1749,13.198C7.1798,13.1855 7.1935,13.1784 7.2082,13.1784C7.2295,13.1784 7.2464,13.1947 7.2464,13.2122C7.2464,13.2165 7.2458,13.2209 7.2447,13.2225L7.2022,13.2225L7.2022,13.2591L7.2404,13.2591L7.212,13.3136L7.2496,13.2995L7.278,13.3311L7.3075,13.2995L7.3435,13.3136L7.3162,13.2591L7.3533,13.2591L7.3533,13.2225L7.3113,13.2225C7.3113,13.2209 7.3113,13.2165 7.3113,13.2122C7.3113,13.1953 7.3271,13.1784 7.3473,13.1784C7.3625,13.1784 7.3756,13.1855 7.3816,13.198L7.398,13.1631C7.4018,13.1565 7.4073,13.144 7.4073,13.1353C7.4073,13.1096 7.3844,13.0873 7.3555,13.0873C7.3331,13.0873 7.314,13.1009 7.3064,13.1211C7.3064,13.1211 7.3265,13.0802 7.3265,13.0333C7.3249,12.9842 7.2769,12.9329 7.2775,12.9329" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.3893,13.6769C7.3853,13.6769 7.3833,13.6769 7.3793,13.6769L7.3333,13.6219L7.2733,13.6459C7.2683,13.6489 7.2633,13.6469 7.2613,13.6409C7.2573,13.6369 7.2563,13.6349 7.2593,13.6289L7.3013,13.5429L7.2493,13.5429C7.2433,13.5429 7.2393,13.5399 7.2393,13.5349L7.2393,13.4679C7.2393,13.4649 7.2433,13.4569 7.2493,13.4569L7.3193,13.4569C7.3193,13.4529 7.3193,13.4509 7.3193,13.4489C7.3193,13.4229 7.2933,13.3969 7.2603,13.3969C7.2373,13.3969 7.2183,13.4079 7.2073,13.4249C7.2073,13.4289 7.2013,13.4349 7.1993,13.4329C7.1953,13.4329 7.1903,13.4289 7.1903,13.4249L7.1593,13.3659C7.1533,13.3539 7.1433,13.3289 7.1433,13.3069C7.1433,13.2519 7.1903,13.2099 7.2483,13.2099C7.2683,13.2099 7.2893,13.2129 7.3073,13.2289C7.2973,13.1959 7.2893,13.1589 7.2893,13.1199C7.2893,13.0339 7.3663,12.9459 7.3773,12.9319C7.3823,12.9239 7.3913,12.9239 7.3943,12.9299C7.4063,12.9419 7.4853,13.0319 7.4853,13.1189C7.4853,13.1579 7.4763,13.1949 7.4713,13.2279C7.4873,13.2119 7.5063,13.2089 7.5283,13.2089C7.5873,13.2089 7.6353,13.2509 7.6353,13.3059C7.6353,13.3269 7.6233,13.3509 7.6173,13.3649L7.5873,13.4239C7.5843,13.4279 7.5803,13.4319 7.5773,13.4319C7.5723,13.4319 7.5693,13.4279 7.5663,13.4239C7.5593,13.4059 7.5393,13.3959 7.5143,13.3959C7.4833,13.3959 7.4583,13.4209 7.4583,13.4479C7.4583,13.4499 7.4583,13.4519 7.4583,13.4559L7.5253,13.4559C7.5313,13.4559 7.5353,13.4639 7.5353,13.4669L7.5353,13.5339C7.5353,13.5389 7.5313,13.5419 7.5253,13.5419L7.4743,13.5419L7.5183,13.6279C7.5193,13.6339 7.5183,13.6359 7.5173,13.6399C7.5123,13.6459 7.5083,13.6479 7.5053,13.6449L7.4423,13.6209L7.3953,13.6759C7.3953,13.6769 7.3903,13.6769 7.3893,13.6769ZM7.3373,13.5989C7.3393,13.5989 7.3433,13.6009 7.3433,13.6049L7.3883,13.6539L7.4323,13.6049C7.4363,13.5989 7.4413,13.5969 7.4443,13.6009L7.4863,13.6149L7.4483,13.5399C7.4463,13.5369 7.4473,13.5349 7.4483,13.5289C7.4493,13.5249 7.4533,13.5209 7.4573,13.5209L7.5153,13.5209L7.5153,13.4779L7.4483,13.4779C7.4433,13.4779 7.4403,13.4739 7.4383,13.4719C7.4373,13.4659 7.4373,13.4599 7.4373,13.4509C7.4373,13.4119 7.4723,13.3789 7.5153,13.3789C7.5413,13.3789 7.5623,13.3869 7.5783,13.4039L7.5993,13.3569C7.6063,13.3469 7.6133,13.3259 7.6133,13.3099C7.6133,13.2689 7.5763,13.2319 7.5303,13.2319C7.4973,13.2319 7.4673,13.2529 7.4553,13.2789C7.4523,13.2849 7.4503,13.2869 7.4503,13.2869C7.4493,13.2929 7.4423,13.2949 7.4373,13.2929C7.4323,13.2889 7.4283,13.2849 7.4323,13.2789C7.4323,13.2769 7.4333,13.2709 7.4363,13.2649C7.4433,13.2449 7.4673,13.1879 7.4673,13.1219C7.4673,13.0519 7.4093,12.9809 7.3903,12.9559C7.3683,12.9809 7.3153,13.0519 7.3153,13.1219C7.3153,13.1869 7.3363,13.2449 7.3453,13.2669C7.3463,13.2709 7.3493,13.2769 7.3503,13.2789C7.3503,13.2849 7.3503,13.2889 7.3453,13.2929C7.3393,13.2949 7.3333,13.2929 7.3303,13.2869C7.3303,13.2869 7.3273,13.2849 7.3263,13.2789C7.3103,13.2519 7.2823,13.2319 7.2513,13.2319C7.2043,13.2319 7.1663,13.2689 7.1663,13.3099C7.1663,13.3259 7.1743,13.3449 7.1813,13.3569L7.2043,13.4039C7.2163,13.3859 7.2393,13.3789 7.2633,13.3789C7.3083,13.3789 7.3433,13.4119 7.3433,13.4509C7.3433,13.4609 7.3423,13.4669 7.3403,13.4719C7.3393,13.4739 7.3353,13.4779 7.3303,13.4779L7.2633,13.4779L7.2633,13.5209L7.3223,13.5209C7.3263,13.5209 7.3283,13.5249 7.3323,13.5289C7.3343,13.5349 7.3343,13.5369 7.3323,13.5399L7.2923,13.6149L7.3343,13.6009C7.3343,13.5989 7.3363,13.5989 7.3373,13.5989Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.2016,13.2591l0.1505,0l0,-0.0365l-0.1505,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.4932,13.302L7.1962,13.302L7.1962,13.216L7.4932,13.216L7.4932,13.302ZM7.2172,13.279L7.4722,13.279L7.4722,13.236L7.2172,13.236L7.2172,13.279Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.0925,13.2504C7.0925,13.2504 7.0456,13.3016 7.0456,13.3485C7.0456,13.3976 7.0658,13.438 7.0658,13.438C7.0582,13.4167 7.0391,13.4036 7.0162,13.4036C6.9878,13.4036 6.9644,13.4249 6.9644,13.4533C6.9644,13.4625 6.9698,13.474 6.9736,13.4805L6.99,13.5149C6.9965,13.5024 7.0091,13.4936 7.0244,13.4936C7.044,13.4936 7.0604,13.5105 7.0604,13.5302C7.0604,13.5318 7.0604,13.5362 7.0604,13.5405L7.0184,13.5405L7.0184,13.5749L7.0555,13.5749L7.0282,13.6305L7.0636,13.618L7.092,13.648L7.1209,13.618L7.1591,13.6305L7.1307,13.5749L7.1689,13.5749L7.1689,13.54L7.1264,13.54C7.1253,13.5356 7.1247,13.5313 7.1247,13.5296C7.1247,13.51 7.1416,13.4931 7.1629,13.4931C7.1776,13.4931 7.1907,13.5018 7.1962,13.5144L7.2142,13.48C7.2169,13.4735 7.2218,13.462 7.2218,13.4527C7.2218,13.4244 7.1984,13.4031 7.1695,13.4031C7.1465,13.4031 7.1275,13.4156 7.1215,13.4375C7.1215,13.4375 7.1405,13.3971 7.1405,13.348C7.1405,13.3016 7.0925,13.2504 7.0925,13.2504" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.2044,13.9958C7.2024,13.9958 7.1984,13.9918 7.1984,13.9898L7.1514,13.9348L7.0894,13.9578C7.0864,13.9598 7.0814,13.9578 7.0774,13.9578C7.0754,13.9548 7.0754,13.9498 7.0754,13.9478L7.1194,13.8588L7.0694,13.8588C7.0624,13.8588 7.0574,13.8558 7.0574,13.8478L7.0574,13.7868C7.0574,13.7768 7.0624,13.7708 7.0694,13.7708L7.1364,13.7708C7.1364,13.7708 7.1364,13.7688 7.1364,13.7678C7.1364,13.7398 7.1104,13.7158 7.0794,13.7158C7.0544,13.7158 7.0334,13.7238 7.0264,13.7438C7.0244,13.7468 7.0204,13.7468 7.0164,13.7468C7.0114,13.7468 7.0094,13.7468 7.0064,13.7438L6.9754,13.6788C6.9704,13.6688 6.9584,13.6458 6.9584,13.6268C6.9584,13.5728 7.0064,13.5278 7.0644,13.5278C7.0864,13.5278 7.1064,13.5328 7.1224,13.5418C7.1154,13.5128 7.1074,13.4778 7.1074,13.4348C7.1074,13.3488 7.1824,13.2608 7.1944,13.2468C7.1974,13.2428 7.2094,13.2428 7.2134,13.2468C7.2224,13.2568 7.3034,13.3488 7.3034,13.4348C7.3034,13.4778 7.2964,13.5128 7.2864,13.5418C7.3034,13.5328 7.3244,13.5278 7.3444,13.5278C7.4034,13.5278 7.4504,13.5728 7.4504,13.6268C7.4504,13.6458 7.4404,13.6688 7.4344,13.6788L7.4034,13.7438C7.4034,13.7468 7.3974,13.7468 7.3944,13.7468L7.3944,13.7468C7.3924,13.7468 7.3854,13.7468 7.3854,13.7438C7.3754,13.7228 7.3564,13.7158 7.3334,13.7158C7.3004,13.7158 7.2744,13.7388 7.2744,13.7678C7.2744,13.7688 7.2744,13.7708 7.2744,13.7708L7.3444,13.7708C7.3494,13.7708 7.3544,13.7768 7.3544,13.7868L7.3544,13.8498C7.3544,13.8578 7.3494,13.8608 7.3444,13.8608L7.2914,13.8608L7.3354,13.9498C7.3384,13.9518 7.3374,13.9568 7.3334,13.9598C7.3324,13.9598 7.3274,13.9618 7.3214,13.9598L7.2614,13.9368L7.2124,13.9918C7.2104,13.9918 7.2084,13.9958 7.2044,13.9958ZM7.1534,13.9118C7.1584,13.9118 7.1594,13.9118 7.1634,13.9158L7.2054,13.9668L7.2524,13.9158C7.2534,13.9118 7.2574,13.9118 7.2644,13.9118L7.3054,13.9308L7.2664,13.8578C7.2654,13.8518 7.2654,13.8458 7.2664,13.8418C7.2694,13.8418 7.2714,13.8398 7.2764,13.8398L7.3354,13.8398L7.3354,13.7948L7.2694,13.7948C7.2654,13.7948 7.2594,13.7918 7.2594,13.7868C7.2574,13.7808 7.2564,13.7708 7.2564,13.7678C7.2564,13.7238 7.2914,13.6928 7.3364,13.6928C7.3594,13.6928 7.3834,13.7008 7.3954,13.7158L7.4184,13.6718C7.4254,13.6548 7.4334,13.6378 7.4334,13.6268C7.4334,13.5828 7.3944,13.5498 7.3484,13.5498C7.3174,13.5498 7.2884,13.5638 7.2724,13.5928C7.2714,13.5988 7.2694,13.6018 7.2694,13.6018C7.2664,13.6068 7.2594,13.6068 7.2544,13.6068C7.2494,13.6048 7.2484,13.5988 7.2484,13.5928C7.2504,13.5888 7.2534,13.5828 7.2544,13.5828C7.2634,13.5598 7.2844,13.5048 7.2844,13.4348C7.2844,13.3698 7.2294,13.2938 7.2074,13.2708C7.1864,13.2938 7.1314,13.3698 7.1314,13.4348C7.1314,13.5048 7.1534,13.5598 7.1634,13.5828C7.1654,13.5828 7.1654,13.5868 7.1674,13.5928C7.1704,13.5988 7.1664,13.6048 7.1614,13.6068C7.1564,13.6068 7.1504,13.6068 7.1484,13.6018C7.1484,13.6018 7.1474,13.5988 7.1424,13.5908C7.1304,13.5638 7.1014,13.5498 7.0674,13.5498C7.0214,13.5498 6.9844,13.5828 6.9844,13.6268C6.9844,13.6388 6.9904,13.6568 6.9974,13.6688L7.0194,13.7158C7.0354,13.6998 7.0554,13.6928 7.0824,13.6928C7.1244,13.6928 7.1604,13.7238 7.1604,13.7678C7.1604,13.7708 7.1604,13.7808 7.1594,13.7868C7.1574,13.7918 7.1544,13.7948 7.1494,13.7948L7.0824,13.7948L7.0824,13.8398L7.1404,13.8398C7.1424,13.8398 7.1494,13.8418 7.1494,13.8418C7.1514,13.8458 7.1514,13.8518 7.1494,13.8578L7.1114,13.9308L7.1534,13.9118C7.1514,13.9118 7.1514,13.9118 7.1534,13.9118Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M7.0189,13.5744l0.1505,0l0,-0.0344l-0.1505,0z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M7.3104,13.6203L7.0124,13.6203L7.0124,13.5313L7.3104,13.5313L7.3104,13.6203ZM7.0344,13.6003L7.2884,13.6003L7.2884,13.5553L7.0344,13.5553L7.0344,13.6003Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.2184,11.584L8.208,11.584C8.208,11.584 8.2042,11.5916 8.1993,11.5965C8.1905,11.6042 8.1769,11.6053 8.1698,11.5982C8.1671,11.5955 8.1638,11.5878 8.1655,11.584C8.16,11.5873 8.154,11.5873 8.148,11.584C8.1382,11.5785 8.1365,11.566 8.1431,11.5573C8.1442,11.554 8.1442,11.5496 8.1469,11.5496L8.1458,11.5371L8.1344,11.5425L8.1305,11.5491C8.1224,11.5589 8.1125,11.5589 8.106,11.5545C8.1033,11.5502 8.1016,11.5458 8.1016,11.5458C8.1016,11.5458 8.0989,11.5485 8.0956,11.5491C8.0771,11.5535 8.0695,11.512 8.0689,11.5011L8.0629,11.5109C8.0629,11.5109 8.0678,11.536 8.0651,11.5567C8.0629,11.5758 8.0547,11.5971 8.0547,11.5971C8.0809,11.6025 8.1196,11.6255 8.1578,11.6538C8.196,11.6849 8.2265,11.7155 8.2391,11.7378C8.2391,11.7378 8.2582,11.7275 8.2795,11.7209C8.3002,11.7138 8.3258,11.7138 8.3258,11.7138L8.334,11.7045C8.322,11.7078 8.2789,11.7111 8.2805,11.6909C8.2805,11.6882 8.2822,11.6865 8.2827,11.6865C8.2827,11.6865 8.2751,11.6865 8.2718,11.6833C8.2658,11.6778 8.2658,11.6675 8.2729,11.6609L8.2789,11.6533L8.2795,11.6418L8.2675,11.6451C8.2669,11.6473 8.2642,11.6484 8.2615,11.6484C8.2527,11.6582 8.2391,11.6582 8.232,11.6511C8.2282,11.6473 8.226,11.6396 8.2293,11.6358C8.2227,11.6358 8.2178,11.6358 8.2129,11.6336C8.2036,11.6271 8.2025,11.6145 8.2102,11.6047C8.2129,11.6004 8.2195,11.5949 8.2195,11.5938L8.2184,11.584" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.3934,11.9555L8.3914,11.9515C8.3684,11.9065 8.3114,11.8515 8.2454,11.8015C8.1764,11.7465 8.1064,11.7115 8.0594,11.6965L8.0504,11.6945L8.0544,11.6885C8.0544,11.6885 8.0664,11.6495 8.0714,11.6125C8.0774,11.5775 8.0664,11.5325 8.0664,11.5325L8.0664,11.5295L8.0954,11.4875L8.0954,11.5125C8.0954,11.5355 8.1084,11.5945 8.1304,11.5945C8.1304,11.5945 8.1304,11.5945 8.1324,11.5945C8.1364,11.5945 8.1364,11.5925 8.1384,11.5905L8.1484,11.5755L8.1534,11.5945L8.1534,11.5945C8.1534,11.5975 8.1574,11.6025 8.1594,11.6025C8.1604,11.6045 8.1644,11.6045 8.1664,11.6045C8.1764,11.6045 8.1844,11.6025 8.1914,11.5945L8.1994,11.5785L8.2344,11.5705L8.2344,11.6035L8.2334,11.6075C8.2314,11.6095 8.2294,11.6135 8.2294,11.6175L8.2294,11.6175C8.2234,11.6255 8.2214,11.6355 8.2234,11.6405C8.2234,11.6485 8.2294,11.6525 8.2344,11.6565C8.2414,11.6645 8.2494,11.6645 8.2584,11.6575L8.2704,11.6485L8.2704,11.6645C8.2704,11.6725 8.2704,11.6805 8.2764,11.6875C8.2864,11.6935 8.3054,11.6925 8.3184,11.6795C8.3264,11.6715 8.3334,11.6635 8.3354,11.6615L8.3354,11.6555L8.3404,11.6535L8.3614,11.6515L8.3674,11.6555L8.3704,11.6615L8.3754,11.6865L8.3704,11.6865C8.3674,11.6895 8.3584,11.6945 8.3524,11.7065C8.3474,11.7135 8.3454,11.7205 8.3474,11.7335C8.3474,11.7365 8.3524,11.7415 8.3574,11.7415C8.3644,11.7475 8.3704,11.7495 8.3784,11.7455L8.3944,11.7415L8.3884,11.7575C8.3884,11.7655 8.3884,11.7735 8.3944,11.7805C8.4064,11.7885 8.4234,11.7885 8.4374,11.7785C8.4384,11.7765 8.4414,11.7745 8.4414,11.7725C8.4424,11.7705 8.4464,11.7665 8.4464,11.7665L8.4464,11.7645L8.4814,11.7615L8.4814,11.7965L8.4684,11.8065C8.4634,11.8115 8.4584,11.8235 8.4604,11.8275C8.4614,11.8335 8.4644,11.8355 8.4644,11.8355C8.4674,11.8355 8.4744,11.8375 8.4764,11.8395L8.4994,11.8395L8.4834,11.8575L8.4794,11.8605C8.4794,11.8625 8.4804,11.8665 8.4844,11.8705C8.4914,11.8765 8.5134,11.8825 8.5424,11.8825C8.5554,11.8825 8.5654,11.8825 8.5704,11.8815L8.5964,11.8765L8.5624,11.9075L8.5574,11.9075C8.5574,11.9075 8.5104,11.9075 8.4744,11.9235C8.4374,11.9315 8.4014,11.9545 8.4014,11.9545L8.3934,11.9555ZM8.0694,11.6845C8.1204,11.6965 8.1864,11.7355 8.2524,11.7885C8.3174,11.8375 8.3744,11.8935 8.3994,11.9345C8.4124,11.9285 8.4394,11.9165 8.4674,11.9075C8.4844,11.9025 8.4994,11.8995 8.5144,11.8995C8.4974,11.8975 8.4794,11.8895 8.4724,11.8815C8.4674,11.8755 8.4634,11.8675 8.4634,11.8605C8.4634,11.8605 8.4634,11.8585 8.4644,11.8575C8.4624,11.8555 8.4554,11.8555 8.4544,11.8525C8.4474,11.8505 8.4444,11.8405 8.4424,11.8335C8.4394,11.8215 8.4434,11.8085 8.4534,11.7955L8.4554,11.7935L8.4614,11.7895L8.4614,11.7815L8.4544,11.7815C8.4524,11.7845 8.4504,11.7865 8.4504,11.7875C8.4494,11.7875 8.4474,11.7895 8.4454,11.7895C8.4264,11.8055 8.3974,11.8085 8.3804,11.7895C8.3744,11.7845 8.3684,11.7755 8.3684,11.7665C8.3624,11.7665 8.3524,11.7645 8.3454,11.7585C8.3374,11.7565 8.3314,11.7425 8.3274,11.7355C8.3274,11.7195 8.3274,11.7125 8.3374,11.6965C8.3404,11.6915 8.3494,11.6845 8.3544,11.6785L8.3514,11.6725L8.3454,11.6725C8.3414,11.6765 8.3344,11.6885 8.3284,11.6935C8.3104,11.7125 8.2804,11.7125 8.2634,11.6965C8.2574,11.6915 8.2534,11.6865 8.2514,11.6755C8.2424,11.6775 8.2334,11.6755 8.2224,11.6735C8.2144,11.6655 8.2074,11.6585 8.2044,11.6485C8.2024,11.6365 8.2044,11.6225 8.2114,11.6115L8.2124,11.6075C8.2144,11.6035 8.2154,11.6035 8.2154,11.6015L8.2154,11.5955L8.2074,11.5955L8.2034,11.6035C8.1854,11.6245 8.1584,11.6265 8.1444,11.6195C8.1424,11.6175 8.1384,11.6115 8.1384,11.6055C8.1364,11.6075 8.1334,11.6075 8.1334,11.6075C8.1314,11.6095 8.1274,11.6095 8.1274,11.6095C8.1064,11.6095 8.0924,11.5915 8.0864,11.5705C8.0864,11.5805 8.0864,11.5985 8.0864,11.6175C8.0814,11.6415 8.0764,11.6695 8.0694,11.6845Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.1409,11.6075C8.142,11.6042 8.1464,11.6042 8.1485,11.6075C8.1507,11.6096 8.1524,11.6129 8.1502,11.614C8.1491,11.6151 8.1453,11.6151 8.1425,11.614C8.1404,11.6124 8.1387,11.6096 8.1409,11.6075" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.2593,11.7122C8.2576,11.7122 8.2565,11.7122 8.2538,11.7122C8.2527,11.7111 8.2511,11.7078 8.2511,11.7056C8.2511,11.7035 8.2516,11.7035 8.2527,11.7024C8.2538,11.6991 8.2587,11.6991 8.262,11.7024C8.2625,11.7035 8.2647,11.7045 8.2647,11.7078C8.2647,11.71 8.2647,11.7122 8.2631,11.7122C8.2625,11.7122 8.2609,11.7122 8.2593,11.7122Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.1671,11.5011l-0.0196,0.0011l-0.0038,0.0311l0.0011,0.0044l0.0055,0l0.0256,-0.0169l-0.0087,-0.0196" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.112,11.5202l0,0.0169l0.0322,0.0044l0.0038,-0.0044l0,-0.0044l-0.0185,-0.024l-0.0175,0.0115" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.178,11.5567l-0.0175,0.0076l-0.0185,-0.0235l-0.0005,-0.0049l0.006,-0.0027l0.0322,0.0044l-0.0016,0.0191" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.1365,11.5333C8.1393,11.5278 8.1453,11.5256 8.1502,11.53C8.1545,11.5333 8.1567,11.5376 8.1535,11.5425C8.1502,11.5458 8.1436,11.5485 8.1398,11.5458C8.1349,11.5436 8.1349,11.5371 8.1365,11.5333" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.1447,11.5502C8.1425,11.5502 8.1404,11.5502 8.1376,11.5502C8.1349,11.5475 8.1311,11.5458 8.1311,11.5404C8.1305,11.5371 8.1311,11.5327 8.1322,11.5305C8.1371,11.5229 8.1458,11.5213 8.1524,11.524C8.1556,11.5262 8.1573,11.5316 8.1589,11.5344C8.1595,11.5371 8.1595,11.5415 8.1562,11.5458C8.1545,11.5491 8.1502,11.5502 8.1447,11.5502Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.0618,11.5011C8.0607,11.5011 8.058,11.4864 8.0531,11.4765C8.0504,11.4705 8.0395,11.4607 8.0395,11.4607C8.0411,11.4607 8.0542,11.4564 8.0705,11.4662C8.0831,11.4749 8.0689,11.4951 8.0689,11.4951C8.0689,11.4951 8.0651,11.4989 8.0618,11.5011" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.0978,11.5115l-0.0142,0.0125l-0.0235,-0.0191l0.0011,-0.0055l0.0011,-0.0038l0.0322,-0.0016l0.0033,0.0175" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.058,11.4989C8.0596,11.4945 8.0645,11.4913 8.0673,11.4935C8.0711,11.4945 8.0738,11.4989 8.0705,11.5044C8.0695,11.5093 8.064,11.512 8.0607,11.5109C8.058,11.5104 8.0564,11.5055 8.058,11.4989" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.0629,11.5158C8.0613,11.5158 8.0613,11.5158 8.0613,11.5147C8.0542,11.5115 8.052,11.5071 8.0542,11.4978C8.0564,11.4913 8.064,11.4864 8.0695,11.4869C8.0755,11.4902 8.0782,11.4978 8.076,11.506C8.0738,11.5115 8.0678,11.5158 8.0629,11.5158Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.2462,11.5502l-0.0207,-0.0011l-0.0076,0.0278l0,0.0076l0.006,0l0.0284,-0.0136l-0.006,-0.0207" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.1889,11.56l-0.0027,0.0175l0.03,0.0093l0.0049,-0.0027l0,-0.0044l-0.0136,-0.0278l-0.0185,0.0082" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.2484,11.6053l-0.0175,0.0076l-0.0158,-0.0273l0.0005,-0.0049l0.0055,-0.0022l0.0311,0.0087l-0.0038,0.018" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.2113,11.5758C8.214,11.5731 8.2205,11.5731 8.2238,11.5758C8.2287,11.5791 8.2293,11.5845 8.226,11.5884C8.2222,11.5938 8.2162,11.5938 8.2113,11.5895C8.208,11.5873 8.208,11.5818 8.2113,11.5758" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.2178,11.5971C8.2145,11.5971 8.2113,11.5971 8.2091,11.5949C8.2064,11.5916 8.2047,11.5884 8.2042,11.584C8.2042,11.5807 8.2047,11.5753 8.208,11.5742C8.2113,11.5698 8.2205,11.5676 8.2271,11.5709C8.2304,11.5742 8.2325,11.5764 8.2336,11.5818C8.2336,11.584 8.2325,11.5884 8.2309,11.5916C8.2271,11.5971 8.2227,11.5971 8.2178,11.5971Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.3138,11.614l0.0038,0.0213l-0.0295,0.0087l-0.006,-0.0022l0,-0.0038l0.0125,-0.0284l0.0191,0.0044" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.3089,11.6696l-0.0196,0.0044l-0.0115,-0.0278l0.0016,-0.0065l0.0044,0l0.03,0.0115l-0.0049,0.0185" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.256,11.6151l-0.0065,0.0202l0.0295,0.0115l0.0055,-0.0011l0.0011,-0.0065l-0.0104,-0.0284l-0.0191,0.0044" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.2887,11.6495C8.2931,11.6467 8.2931,11.6391 8.2893,11.6353C8.2849,11.6331 8.2784,11.6331 8.2751,11.6353C8.2718,11.6396 8.2718,11.6462 8.2751,11.6478C8.2784,11.6522 8.2844,11.6522 8.2887,11.6495" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.3356,11.7122C8.3356,11.7122 8.3536,11.7122 8.364,11.7155C8.3711,11.7165 8.382,11.7253 8.382,11.7253C8.3842,11.7253 8.3864,11.7116 8.3722,11.6985C8.3585,11.6871 8.3422,11.704 8.3422,11.704C8.3422,11.704 8.3373,11.7089 8.3356,11.7122" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M8.4234,11.7623L8.4194,11.7603C8.4144,11.7573 8.3984,11.7463 8.3884,11.7423C8.3784,11.7383 8.3624,11.7383 8.3504,11.7383C8.3384,11.7383 8.3364,11.7383 8.3334,11.7363L8.3324,11.7303L8.3334,11.7303C8.3334,11.7183 8.3424,11.7123 8.3454,11.7113C8.3454,11.7093 8.3654,11.6893 8.3884,11.6893C8.3974,11.6893 8.4034,11.6913 8.4094,11.6953C8.4324,11.7153 8.4344,11.7383 8.4334,11.7463C8.4334,11.7523 8.4334,11.7573 8.4284,11.7603L8.4234,11.7623Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.3176,11.68l-0.0104,0.018l0.0267,0.0169l0.0033,-0.0033l0.0049,0l-0.0044,-0.0333l-0.0202,0.0016" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#C8B100" + android:fillType="nonZero" + android:pathData="M8.3395,11.7155C8.3444,11.7122 8.3465,11.7078 8.3449,11.704C8.3422,11.7024 8.3367,11.7024 8.3329,11.704C8.3269,11.7073 8.3253,11.7127 8.3264,11.7155C8.3296,11.716 8.3345,11.716 8.3395,11.7155" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + <path + android:fillColor="#000000" + android:fillType="nonZero" + android:pathData="M9.8014,11.0459L9.6224,11.0459L9.6224,10.9909L9.6824,10.9909L9.6824,10.9259L9.6434,10.9259L9.6434,10.8719L9.6824,10.8719L9.6824,10.8329L9.7404,10.8329L9.7404,10.8719L9.7794,10.8719L9.7794,10.9259L9.7404,10.9259L9.7404,10.9909L9.8024,10.9909L9.8024,11.0459L9.8014,11.0459ZM9.6424,11.0249L9.7844,11.0249L9.7844,11.0089L9.7204,11.0089L9.7204,10.9059L9.7614,10.9059L9.7614,10.8879L9.7204,10.8879L9.7204,10.8509L9.7014,10.8509L9.7014,10.8879L9.6614,10.8879L9.6614,10.9059L9.7024,10.9059L9.7024,11.0099L9.6424,11.0099L9.6424,11.0249Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + </group> +</vector> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_contact.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_contact.xml index 40f68a4c8b468262bd4417ec7b0536945359a9d4..2478f71213c07611d8b2c3111d920a3939fa619a 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_contact.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_contact.xml @@ -9,7 +9,7 @@ android:layout_height="match_parent" android:contentDescription="@string/submission_contact_accessibility_title" android:fillViewport="true" - tools:context=".ui.submission.SubmissionContactFragment"> + tools:context=".ui.submission.fragment.SubmissionContactFragment"> <include android:id="@+id/submission_contact_header" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_country_selection.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_country_selection.xml new file mode 100644 index 0000000000000000000000000000000000000000..59f1983446911113c3fea962ea5593f1ce40f985 --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_country_selection.xml @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="utf-8"?> +<layout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + + <data> + + <import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" /> + + <variable + name="submissionCountrySelectViewModel" + type="de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionCountrySelectViewModel" /> + </data> + + <ScrollView + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:fillViewport="true" + android:focusable="true" + tools:context=".ui.submission.fragment.SubmissionIntroFragment"> + + <include + android:id="@+id/submission_country_selection_header" + layout="@layout/include_header" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + app:icon="@{@drawable/ic_back}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:title="@{@string/submission_positive_country_selection_title}" /> + + <TextView + android:id="@+id/submission_country_selection_headline" + style="@style/headline5" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" + android:accessibilityHeading="true" + android:text="@string/submission_positive_country_selection_headline" + app:layout_constraintEnd_toEndOf="@id/guideline_end" + app:layout_constraintStart_toStartOf="@id/guideline_start" + app:layout_constraintTop_toBottomOf="@+id/submission_country_selection_header" /> + + <include + android:id="@+id/submission_country_selection_selector" + layout="@layout/include_submission_country_selector" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginHorizontal="@dimen/spacing_tiny" + android:layout_marginTop="@dimen/spacing_medium" + app:active="@{submissionCountrySelectViewModel.countriesActive}" + app:countries="@{submissionCountrySelectViewModel.countries}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/submission_country_selection_headline" /> + + <include + android:id="@+id/submission_country_selection_no_selection" + layout="@layout/include_submission_country_no_selection" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginHorizontal="@dimen/spacing_tiny" + android:layout_marginTop="@dimen/spacing_small" + app:active="@{submissionCountrySelectViewModel.noInfoActive}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/submission_country_selection_selector" /> + + <TextView + android:id="@+id/submission_country_selection_data_faq" + style="@style/body1" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" + android:accessibilityHeading="true" + android:text="@string/submission_country_selection_data_faq_body" + app:layout_constraintEnd_toEndOf="@id/guideline_end" + app:layout_constraintStart_toStartOf="@id/guideline_start" + app:layout_constraintTop_toBottomOf="@+id/submission_country_selection_no_selection" /> + + <Button + android:id="@+id/submission_country_selection_button" + style="@style/buttonPrimary" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginVertical="@dimen/spacing_normal" + android:enabled="@{submissionCountrySelectViewModel.nextActive}" + android:text="@string/submission_country_selection_button" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="@id/guideline_end" + app:layout_constraintStart_toStartOf="@id/guideline_start" + app:layout_constraintTop_toBottomOf="@+id/submission_country_selection_data_faq" /> + + <include layout="@layout/merge_guidelines_side" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + </ScrollView> + +</layout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_dispatcher.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_dispatcher.xml index 64b3019ba1241bbdbd11f0735451a01f2d5c16d3..bd6ecad1b415a80f45ccf644a904b8037f539bde 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_dispatcher.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_dispatcher.xml @@ -9,7 +9,7 @@ android:layout_height="match_parent" android:contentDescription="@string/submission_dispatcher_accessibility_title" android:fillViewport="true" - tools:context=".ui.submission.SubmissionDispatcherFragment"> + tools:context=".ui.submission.fragment.SubmissionDispatcherFragment"> <include android:id="@+id/submission_dispatcher_header" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_done.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_done.xml index 92e8e11e3971b85aa8221a46be91b9ae2b68dc3d..06a69236b36b6b09bf881402fbb6f8726d5e2365 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_done.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_done.xml @@ -9,7 +9,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" - tools:context=".ui.submission.SubmissionDoneFragment"> + tools:context=".ui.submission.fragment.SubmissionDoneFragment"> <include android:id="@+id/submission_done_header" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_intro.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_intro.xml index cf44b0a02802ae9206f0ded2eb34f726173278e8..dec923dd8f0af95a4934f334b230bbc14a1b6aac 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_intro.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_intro.xml @@ -10,7 +10,7 @@ android:contentDescription="@string/submission_intro_accessibility_title" android:fillViewport="true" android:focusable="true" - tools:context=".ui.submission.SubmissionIntroFragment"> + tools:context=".ui.submission.fragment.SubmissionIntroFragment"> <include android:id="@+id/submission_intro_header" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml index 92dd63fe970143b79ed2d6532880d1dece9b2fa8..527854758de3ae78e2e622aab8549de2ba711afc 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_positive_other_warning.xml @@ -20,7 +20,7 @@ android:layout_height="match_parent" android:contentDescription="@string/submission_positive_other_warning_title" android:fillViewport="true" - tools:context=".ui.submission.SubmissionResultPositiveOtherWarningFragment"> + tools:context=".ui.submission.fragment.SubmissionResultPositiveOtherWarningFragment"> <include android:id="@+id/submission_positive_other_warning_header" diff --git a/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml b/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml index 0806273fc493d4ada0889377129427bf640400e5..3ef4b9f79ef0c89881003cd9e7f1ec963a4416c4 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_submission_tan.xml @@ -7,7 +7,7 @@ <variable name="viewmodel" - type="de.rki.coronawarnapp.ui.submission.SubmissionTanViewModel" /> + type="de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionTanViewModel" /> </data> <androidx.constraintlayout.widget.ConstraintLayout @@ -16,7 +16,7 @@ android:layout_height="match_parent" android:contentDescription="@string/submission_tan_accessibility_title" android:fillViewport="true" - tools:context=".ui.submission.SubmissionTanFragment"> + tools:context=".ui.submission.fragment.SubmissionTanFragment"> <include android:id="@+id/submission_tan_header" diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_country_item.xml b/Corona-Warn-App/src/main/res/layout/include_submission_country_item.xml new file mode 100644 index 0000000000000000000000000000000000000000..c630f0f7d21e6b252d0b4598e27c6bc522567bad --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/include_submission_country_item.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<layout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <data> + + <import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" /> + + <variable + name="submissionCountry" + type="de.rki.coronawarnapp.ui.submission.SubmissionCountry" /> + </data> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/submission_country_selector_country_body" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:focusable="true"> + + <ImageView + android:id="@+id/submission_country_selector_country_icon" + android:layout_width="@dimen/submission_country_selection_country_icon_size" + android:layout_height="@dimen/submission_country_selection_country_icon_size" + android:layout_marginVertical="@dimen/spacing_tiny" + android:layout_marginStart="@dimen/spacing_small" + android:importantForAccessibility="no" + android:scaleType="centerInside" + android:src="@{FormatterSubmissionHelper.formatCountryIsoTagToFlagDrawable(submissionCountry.countryCode), default=@drawable/ic_submission_country_flag_ireland}" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/submission_country_selector_country_name" + style="@style/body1" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/spacing_small" + android:focusable="true" + android:text="@{FormatterSubmissionHelper.formatCountryIsoTagToLocalizedName(submissionCountry.countryCode), default=Ireland}" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@+id/submission_country_selector_country_icon" + app:layout_constraintTop_toTopOf="parent" /> + + <CheckBox + android:id="@+id/submission_country_selector_country_radiobutton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/spacing_small" + android:checked="@{submissionCountry.selected}" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + </androidx.constraintlayout.widget.ConstraintLayout> +</layout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_country_no_selection.xml b/Corona-Warn-App/src/main/res/layout/include_submission_country_no_selection.xml new file mode 100644 index 0000000000000000000000000000000000000000..239b2ef6f95f59219a6062bcb20f1cb679e58a6a --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/include_submission_country_no_selection.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<layout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <data> + + <import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" /> + + <variable + name="active" + type="Boolean" /> + </data> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/submission_country_no_selection_container" + style="@style/cardGrey" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:backgroundTint="@{FormatterSubmissionHelper.formatCountrySelectCardColor(active)}" + android:focusable="true"> + + <TextView + android:id="@+id/submission_country_no_selection_header" + style="@style/headline5" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginVertical="@dimen/spacing_normal" + android:focusable="true" + android:text="@string/submission_country_no_selection_headline" + android:textColor="@{FormatterSubmissionHelper.formatCountrySelectCardTextColor(active)}" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@+id/guideline_end" + app:layout_constraintStart_toStartOf="@+id/guideline_start" + app:layout_constraintTop_toTopOf="parent" /> + + <include layout="@layout/merge_guidelines_side" /> + + </androidx.constraintlayout.widget.ConstraintLayout> +</layout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_country_selector.xml b/Corona-Warn-App/src/main/res/layout/include_submission_country_selector.xml new file mode 100644 index 0000000000000000000000000000000000000000..78c77635574e9cd51fa806f587adc47a4f65cbae --- /dev/null +++ b/Corona-Warn-App/src/main/res/layout/include_submission_country_selector.xml @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="utf-8"?> +<layout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + + <data> + + <import type="java.util.List" /> + + <import type="de.rki.coronawarnapp.util.formatter.FormatterSubmissionHelper" /> + + <import type="de.rki.coronawarnapp.ui.submission.SubmissionCountry" /> + + <variable + name="active" + type="Boolean" /> + + <variable + name="countries" + type="List<SubmissionCountry>" /> + </data> + + <androidx.constraintlayout.widget.ConstraintLayout + style="@style/cardGrey" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:backgroundTint="@{FormatterSubmissionHelper.formatCountrySelectCardColor(active)}" + android:focusable="true"> + + <TextView + android:id="@+id/submission_country_selector_header" + style="@style/headline5" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/spacing_normal" + android:focusable="true" + android:text="@string/submission_country_selector_headline" + android:textColor="@{FormatterSubmissionHelper.formatCountrySelectCardTextColor(active)}" + app:layout_constraintEnd_toStartOf="@+id/guideline_end" + app:layout_constraintStart_toStartOf="@+id/guideline_start" + app:layout_constraintTop_toTopOf="parent" /> + + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/submission_country_selector_recyclerview" + android:layout_width="@dimen/match_constraint" + android:layout_height="wrap_content" + android:layout_marginHorizontal="@dimen/spacing_mega_tiny" + android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginBottom="@dimen/spacing_mega_tiny" + android:background="@color/colorSurface1" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/submission_country_selector_header" + tools:listitem="@layout/include_submission_country_item" /> + + <include layout="@layout/merge_guidelines_side" /> + + </androidx.constraintlayout.widget.ConstraintLayout> +</layout> \ No newline at end of file diff --git a/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml b/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml index c4d3a8243d0c1005b0c8069bfaeb76f382473c91..aeb76381c1855966593e8a09f145aeb2aaef3e82 100644 --- a/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml +++ b/Corona-Warn-App/src/main/res/layout/include_submission_tan.xml @@ -11,7 +11,7 @@ <variable name="viewmodel" - type="de.rki.coronawarnapp.ui.submission.SubmissionTanViewModel" /> + type="de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionTanViewModel" /> </data> <ScrollView diff --git a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml index fd01e1e11aa92855423a6467126766543cf9e0d7..61b00b60017520df908020800160fe9c24967683 100644 --- a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml +++ b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml @@ -177,7 +177,7 @@ <!-- Submission --> <fragment android:id="@+id/submissionDispatcherFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionDispatcherFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionDispatcherFragment" android:label="fragment_submission_dispatcher" tools:layout="@layout/fragment_submission_dispatcher"> <action @@ -192,7 +192,7 @@ </fragment> <fragment android:id="@+id/submissionResultPositiveOtherWarningFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionResultPositiveOtherWarningFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionResultPositiveOtherWarningFragment" android:label="fragment_submission_result_positive_other_warning" tools:layout="@layout/fragment_submission_positive_other_warning"> <action @@ -208,7 +208,7 @@ </fragment> <fragment android:id="@+id/submissionResultFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionTestResultFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionTestResultFragment" android:label="fragment_submission_result" tools:layout="@layout/fragment_submission_test_result"> <argument @@ -227,7 +227,7 @@ <fragment android:id="@+id/submissionTanFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionTanFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionTanFragment" android:label="fragment_submission_tan" tools:layout="@layout/fragment_submission_tan"> <action @@ -244,7 +244,7 @@ <fragment android:id="@+id/submissionIntroFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionIntroFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionIntroFragment" android:label="SubmissionIntroFragment"> <action android:id="@+id/action_submissionIntroFragment_to_mainFragment" @@ -265,7 +265,7 @@ </activity> <fragment android:id="@+id/submissionQRCodeScanFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionQRCodeScanFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionQRCodeScanFragment" android:label="SubmissionQRCodeScanFragment"> <action android:id="@+id/action_submissionQRCodeScanFragment_to_submissionDispatcherFragment" @@ -284,7 +284,7 @@ </fragment> <fragment android:id="@+id/submissionDoneFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionDoneFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionDoneFragment" android:label="SubmissionDoneFragment"> <action android:id="@+id/action_submissionDoneFragment_to_mainFragment" @@ -294,7 +294,7 @@ </fragment> <fragment android:id="@+id/submissionContactFragment" - android:name="de.rki.coronawarnapp.ui.submission.SubmissionContactFragment" + android:name="de.rki.coronawarnapp.ui.submission.fragment.SubmissionContactFragment" android:label="SubmissionContactFragment"> <action android:id="@+id/action_submissionContactFragment_to_submissionTanFragment" diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index fd94f6991bad6e7fb96b2cd9163e6eb24e2d7711..025aae05313214dc9e21d1be6f25c8ad75feb407 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -952,6 +952,19 @@ <!-- XACT: other warning - illustration description, explanation image --> <string name="submission_positive_other_illustration_description">"Ein Smartphone übermittelt einen positiven Testbefund verschlüsselt ins System."</string> + <!-- Submission Country Selector --> + <!-- XHED: Page title for the submission country selection page --> + <string name="submission_positive_country_selection_title">"Europaweit warnen"</string> + <!-- XHED: Page headline for the submission country selection page --> + <string name="submission_positive_country_selection_headline">"In welchen Ländern haben Sie sich in den letzten 14 Tagen aufgehalten?"</string> + <!-- XHED: Country selector headline for the submission country selection page --> + <string name="submission_country_selector_headline">"Ich war in den folgenden Ländern"</string> + <!-- XHED: Country no selection headline for the submission country selection page --> + <string name="submission_country_no_selection_headline">"Keine Angabe"</string> + <!-- YTXT: Data FAQ for the submission country selection page --> + <string name="submission_country_selection_data_faq_body">"Ihre Angabe dient lediglich der Optimierung des Datenvolumens.\n\nDie Auflistung enthält alle aktuell teilnehmenden Länder und wird stetig erweitert."</string> + <!-- XBUT: submission country selection continue button --> + <string name="submission_country_selection_button">"Weiter"</string> <!-- Submission Done --> <!-- XHED: Page title for completed submission page --> @@ -1165,5 +1178,4 @@ <string name="test_api_body_other_keys">"Other key"</string> <!-- NOTR --> <string name="test_api_calculate_risk_level">"Calculate Risk Level"</string> - </resources> diff --git a/Corona-Warn-App/src/main/res/values/dimens.xml b/Corona-Warn-App/src/main/res/values/dimens.xml index 148cc90bfe4039d4bb5340e43b778f6ed1aad71d..fb5edbf545e15f2e88acb152e7ad9c9c0967d61c 100644 --- a/Corona-Warn-App/src/main/res/values/dimens.xml +++ b/Corona-Warn-App/src/main/res/values/dimens.xml @@ -111,6 +111,9 @@ <dimen name="submission_scan_qr_code_viewfinder_size">240dp</dimen> <dimen name="submission_scan_qr_code_viewfinder_center_offset">120dp</dimen> + <!-- Submission Country Select --> + <dimen name="submission_country_selection_country_icon_size">40dp</dimen> + <!-- Bullet Points --> <dimen name="bullet_point_size">4dp</dimen> <dimen name="bullet_point_baseline_offset">8sp</dimen> diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index c9c97e9bcec6096c30899429bab5894bb5a3be28..8ac46316b8176e0b3bbb9f6fc6d5c097cbc7bf9f 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -954,6 +954,19 @@ <!-- XACT: other warning - illustration description, explanation image --> <string name="submission_positive_other_illustration_description">"A device transmits an encrypted positive test diagnosis to the system."</string> + <!-- Submission Country Selector --> + <!-- XHED: Page title for the submission country selection page --> + <string name="submission_positive_country_selection_title"></string> + <!-- XHED: Page headline for the submission country selection page --> + <string name="submission_positive_country_selection_headline"></string> + <!-- XHED: Country selector headline for the submission country selection page --> + <string name="submission_country_selector_headline"></string> + <!-- XHED: Country no selection headline for the submission country selection page --> + <string name="submission_country_no_selection_headline"></string> + <!-- YTXT: Data FAQ for the submission country selection page --> + <string name="submission_country_selection_data_faq_body"></string> + <!-- XBUT: submission country selection continue button --> + <string name="submission_country_selection_button"></string> <!-- Submission Done --> <!-- XHED: Page title for completed submission page --> @@ -1169,5 +1182,4 @@ <string name="test_api_calculate_risk_level">"Calculate Risk Level"</string> <!-- NOTR --> <string name="test_api_switch_background_notifications">"Background Notifications"</string> - </resources> \ No newline at end of file diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/DiagnosisKeysModuleTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/DiagnosisKeysModuleTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..35331290907173c69cf5dca029e1e381722ffaa5 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/DiagnosisKeysModuleTest.kt @@ -0,0 +1,23 @@ +package de.rki.coronawarnapp.diagnosiskeys + +import de.rki.coronawarnapp.BuildConfig +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.Test +import testhelpers.BaseIOTest + +class DiagnosisKeysModuleTest : BaseIOTest() { + + private val module = DiagnosisKeysModule() + + @Test + fun `home country should be DE`() { + module.provideDiagnosisHomeCountry() shouldBe LocationCode("DE") + } + + @Test + fun `download URL comes from BuildConfig`() { + module.provideDownloadServerUrl() shouldBe BuildConfig.DOWNLOAD_CDN_URL + } + +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/download/CountryDataTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/download/CountryDataTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..199ddb20c55a3145745ab326d143fa7685138dde --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/download/CountryDataTest.kt @@ -0,0 +1,241 @@ +package de.rki.coronawarnapp.diagnosiskeys.download + +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import de.rki.coronawarnapp.diagnosiskeys.storage.CachedKeyInfo +import io.kotest.matchers.shouldBe +import io.mockk.every +import io.mockk.mockk +import org.joda.time.LocalDate +import org.joda.time.LocalTime +import org.junit.jupiter.api.Test +import testhelpers.BaseTest + +class CountryDataTest : BaseTest() { + private val locationCode = LocationCode("DE") + + private fun createCachedKey(dayString: String, hourString: String? = null): CachedKeyInfo { + return mockk<CachedKeyInfo>().apply { + every { location } returns locationCode + every { day } returns LocalDate.parse(dayString) + every { hour } returns hourString?.let { LocalTime.parse(it) } + } + } + + @Test + fun `missing days default`() { + val availableDates = listOf( + "2222-12-30", "2222-12-31" + ).map { LocalDate.parse(it) } + val cd = CountryDays(locationCode, availableDates) + + cd.dayData shouldBe availableDates + + val cachedDays = listOf( + createCachedKey("2222-12-30") + ) + + cd.getMissingDays(cachedDays) shouldBe listOf(availableDates[1]) + cd.toMissingDays(cachedDays) shouldBe cd.copy( + dayData = listOf(availableDates[1]) + ) + } + + @Test + fun `missing days empty day data`() { + val availableDates = emptyList<LocalDate>() + val cd = CountryDays(locationCode, availableDates) + + cd.dayData shouldBe availableDates + + val cachedDays = listOf( + createCachedKey("2222-12-30"), + createCachedKey("2222-12-31") + ) + + cd.getMissingDays(cachedDays) shouldBe emptyList() + cd.toMissingDays(cachedDays) shouldBe null + } + + @Test + fun `missing days empty cache`() { + val availableDates = listOf( + "2222-11-28", "2222-11-29" + ).map { LocalDate.parse(it) } + val cd = CountryDays(locationCode, availableDates) + + cd.dayData shouldBe availableDates + + val cachedDays = emptyList<CachedKeyInfo>() + + cd.getMissingDays(cachedDays) shouldBe availableDates + cd.toMissingDays(cachedDays) shouldBe cd + } + + @Test + fun `missing days disjunct`() { + val availableDates = listOf( + "2222-11-28", "2222-11-29" + ).map { LocalDate.parse(it) } + val cd = CountryDays(locationCode, availableDates) + + cd.dayData shouldBe availableDates + + val cachedDays = listOf( + createCachedKey("2222-12-28"), + createCachedKey("2222-12-29") + ) + + cd.getMissingDays(cachedDays) shouldBe availableDates + cd.toMissingDays(cachedDays) shouldBe cd + } + + @Test + fun `missing days none missing`() { + val availableDates = listOf( + "2222-12-30", "2222-12-31" + ).map { LocalDate.parse(it) } + val cd = CountryDays(locationCode, availableDates) + + cd.dayData shouldBe availableDates + + val cachedDays = listOf( + createCachedKey("2222-12-30"), + createCachedKey("2222-12-31") + ) + + cd.getMissingDays(cachedDays) shouldBe emptyList() + cd.toMissingDays(cachedDays) shouldBe null + } + + @Test + fun `missing hours default`() { + val availableHours = mapOf( + LocalDate.parse("2222-12-30") to listOf( + LocalTime.parse("19:00"), LocalTime.parse("20:00") + ), + LocalDate.parse("2222-12-31") to listOf( + LocalTime.parse("22:00"), LocalTime.parse("23:00") + ) + ) + val cd = CountryHours(locationCode, availableHours) + + cd.hourData shouldBe availableHours + + val cachedHours = listOf( + createCachedKey("2222-12-30", "19:00"), + createCachedKey("2222-12-31", "23:00") + ) + + val missingHours = mapOf( + LocalDate.parse("2222-12-30") to listOf(LocalTime.parse("20:00")), + LocalDate.parse("2222-12-31") to listOf(LocalTime.parse("22:00")) + ) + + cd.getMissingHours(cachedHours) shouldBe missingHours + cd.toMissingHours(cachedHours) shouldBe cd.copy(hourData = missingHours) + } + + @Test + fun `missing hours empty available hour data`() { + val availableHours: Map<LocalDate, List<LocalTime>> = emptyMap() + val cd = CountryHours(locationCode, availableHours) + + cd.hourData shouldBe availableHours + + val cachedHours = listOf( + createCachedKey("2222-12-30", "19:00"), + createCachedKey("2222-12-31", "23:00") + ) + + cd.getMissingHours(cachedHours) shouldBe emptyMap() + cd.toMissingHours(cachedHours) shouldBe null + } + + @Test + fun `missing hours faulty hour map`() { + val availableHours = mapOf( + LocalDate.parse("2222-12-30") to emptyList<LocalTime>() + ) + val cd = CountryHours(locationCode, availableHours) + + cd.hourData shouldBe availableHours + + val cachedHours = listOf( + createCachedKey("2222-12-30", "19:00"), + createCachedKey("2222-12-31", "23:00") + ) + + cd.getMissingHours(cachedHours) shouldBe emptyMap() + cd.toMissingHours(cachedHours) shouldBe null + } + + @Test + fun `missing hours empty cache`() { + val availableHours = mapOf( + LocalDate.parse("2222-12-30") to listOf( + LocalTime.parse("19:00"), LocalTime.parse("20:00") + ), + LocalDate.parse("2222-12-31") to listOf( + LocalTime.parse("22:00"), LocalTime.parse("23:00") + ) + ) + val cd = CountryHours(locationCode, availableHours) + + cd.hourData shouldBe availableHours + + val cachedHours = emptyList<CachedKeyInfo>() + + cd.getMissingHours(cachedHours) shouldBe availableHours + cd.toMissingHours(cachedHours) shouldBe cd.copy(hourData = availableHours) + } + + @Test + fun `missing hours disjunct`() { + val availableHours = mapOf( + LocalDate.parse("2222-12-30") to listOf( + LocalTime.parse("19:00"), LocalTime.parse("20:00") + ), + LocalDate.parse("2222-12-31") to listOf( + LocalTime.parse("22:00"), LocalTime.parse("23:00") + ) + ) + val cd = CountryHours(locationCode, availableHours) + + cd.hourData shouldBe availableHours + + val cachedHours = listOf( + createCachedKey("2022-12-30", "19:00"), + createCachedKey("2022-12-31", "23:00") + ) + + cd.getMissingHours(cachedHours) shouldBe availableHours + cd.toMissingHours(cachedHours) shouldBe cd.copy(hourData = availableHours) + } + + @Test + fun `missing hours none missing`() { + val availableHours = mapOf( + LocalDate.parse("2222-12-30") to listOf( + LocalTime.parse("19:00"), LocalTime.parse("20:00") + ), + LocalDate.parse("2222-12-31") to listOf( + LocalTime.parse("22:00"), LocalTime.parse("23:00") + ) + ) + val cd = CountryHours(locationCode, availableHours) + + cd.hourData shouldBe availableHours + + val cachedHours = listOf( + createCachedKey("2222-12-30", "19:00"), + createCachedKey("2222-12-30", "20:00"), + createCachedKey("2222-12-31", "22:00"), + createCachedKey("2222-12-31", "23:00") + ) + + + cd.getMissingHours(cachedHours) shouldBe emptyMap() + cd.toMissingHours(cachedHours) shouldBe null + } + +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/download/KeyFileDownloaderTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/download/KeyFileDownloaderTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..4557883674743c15d6c6545486aefce57a5d90b4 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/download/KeyFileDownloaderTest.kt @@ -0,0 +1,683 @@ +package de.rki.coronawarnapp.diagnosiskeys.download + +import android.database.SQLException +import de.rki.coronawarnapp.diagnosiskeys.server.DiagnosisKeyServer +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import de.rki.coronawarnapp.diagnosiskeys.storage.CachedKeyInfo +import de.rki.coronawarnapp.diagnosiskeys.storage.KeyCacheRepository +import de.rki.coronawarnapp.diagnosiskeys.storage.legacy.LegacyKeyCacheMigration +import de.rki.coronawarnapp.storage.AppSettings +import de.rki.coronawarnapp.storage.DeviceStorage +import de.rki.coronawarnapp.storage.InsufficientStorageException +import de.rki.coronawarnapp.util.CWADebug +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.matchers.shouldBe +import io.mockk.MockKAnnotations +import io.mockk.clearAllMocks +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.mockk +import io.mockk.mockkObject +import kotlinx.coroutines.runBlocking +import org.joda.time.Instant +import org.joda.time.LocalDate +import org.joda.time.LocalTime +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseIOTest +import timber.log.Timber +import java.io.File +import java.io.IOException + +/** + * CachedKeyFileHolder test. + */ +class KeyFileDownloaderTest : BaseIOTest() { + + @MockK + private lateinit var keyCache: KeyCacheRepository + + @MockK + private lateinit var legacyMigration: LegacyKeyCacheMigration + + @MockK + private lateinit var diagnosisKeyServer: DiagnosisKeyServer + + @MockK + private lateinit var deviceStorage: DeviceStorage + + @MockK + private lateinit var settings: AppSettings + + private val testDir = File(IO_TEST_BASEDIR, this::class.simpleName!!) + private val keyRepoData = mutableMapOf<String, CachedKeyInfo>() + + @BeforeEach + fun setup() { + MockKAnnotations.init(this) + testDir.mkdirs() + testDir.exists() shouldBe true + + mockkObject(CWADebug) + every { CWADebug.isDebugBuildOrMode } returns false + every { settings.isLast3HourModeEnabled } returns false + + coEvery { diagnosisKeyServer.getCountryIndex() } returns listOf( + LocationCode("DE"), + LocationCode("NL") + ) + coEvery { deviceStorage.checkSpacePrivateStorage(any()) } returns mockk<DeviceStorage.CheckResult>().apply { + every { isSpaceAvailable } returns true + } + + coEvery { diagnosisKeyServer.getCountryIndex() } returns listOf( + LocationCode("DE"), LocationCode("NL") + ) + coEvery { diagnosisKeyServer.getDayIndex(LocationCode("DE")) } returns listOf( + LocalDate.parse("2020-09-01"), LocalDate.parse("2020-09-02") + ) + coEvery { + diagnosisKeyServer.getHourIndex(LocationCode("DE"), LocalDate.parse("2020-09-01")) + } returns listOf( + LocalTime.parse("18"), LocalTime.parse("19"), LocalTime.parse("20") + ) + coEvery { + diagnosisKeyServer.getHourIndex(LocationCode("DE"), LocalDate.parse("2020-09-02")) + } returns listOf( + LocalTime.parse("20"), LocalTime.parse("21") + ) + coEvery { diagnosisKeyServer.getDayIndex(LocationCode("NL")) } returns listOf( + LocalDate.parse("2020-09-02"), LocalDate.parse("2020-09-03") + ) + coEvery { + diagnosisKeyServer.getHourIndex(LocationCode("NL"), LocalDate.parse("2020-09-02")) + } returns listOf( + LocalTime.parse("20"), LocalTime.parse("21"), LocalTime.parse("22") + ) + coEvery { + diagnosisKeyServer.getHourIndex(LocationCode("NL"), LocalDate.parse("2020-09-03")) + } returns listOf( + LocalTime.parse("22"), LocalTime.parse("23") + ) + coEvery { diagnosisKeyServer.downloadKeyFile(any(), any(), any(), any(), any()) } answers { + mockDownloadServerDownload(arg(0), arg(1), arg(2), arg(3), arg(4)) + } + + coEvery { keyCache.createCacheEntry(any(), any(), any(), any()) } answers { + mockKeyCacheCreateEntry(arg(0), arg(1), arg(2), arg(3)) + } + coEvery { keyCache.markKeyComplete(any(), any()) } answers { + mockKeyCacheUpdateComplete(arg(0), arg(1)) + } + coEvery { keyCache.getEntriesForType(any()) } answers { + val type = arg<CachedKeyInfo.Type>(0) + keyRepoData.values.filter { it.type == type }.map { it to File(testDir, it.id) } + } + coEvery { keyCache.getAllCachedKeys() } returns keyRepoData.values.map { + it to File( + testDir, + it.id + ) + } + coEvery { keyCache.delete(any()) } answers { + val keyInfos = arg<List<CachedKeyInfo>>(0) + keyInfos.forEach { + keyRepoData.remove(it.id) + } + } + } + + @AfterEach + fun teardown() { + clearAllMocks() + keyRepoData.clear() + testDir.deleteRecursively() + } + + private fun mockKeyCacheCreateEntry( + type: CachedKeyInfo.Type, + location: LocationCode, + dayIdentifier: LocalDate, + hourIdentifier: LocalTime? + ): Pair<CachedKeyInfo, File> { + val keyInfo = CachedKeyInfo( + type = type, + location = location, + day = dayIdentifier, + hour = hourIdentifier, + createdAt = Instant.now() + ) + Timber.i("mockKeyCacheCreateEntry(...): %s", keyInfo) + val file = File(testDir, keyInfo.id) + keyRepoData[keyInfo.id] = keyInfo + return keyInfo to file + } + + private fun mockKeyCacheUpdateComplete( + keyInfo: CachedKeyInfo, checksum: String + ) { + keyRepoData[keyInfo.id] = keyInfo.copy( + isDownloadComplete = checksum != null, checksumMD5 = checksum + ) + } + + private fun mockDownloadServerDownload( + locationCode: LocationCode, + day: LocalDate, + hour: LocalTime? = null, + saveTo: File, + validator: DiagnosisKeyServer.HeaderHook = object : + DiagnosisKeyServer.HeaderHook {} + ) { + saveTo.writeText("$locationCode.$day.$hour") + } + + private fun mockAddData( + type: CachedKeyInfo.Type, + location: LocationCode, + day: LocalDate, + hour: LocalTime?, + isCompleted: Boolean + ): Pair<CachedKeyInfo, File> { + val (keyInfo, file) = mockKeyCacheCreateEntry(type, location, day, hour) + if (isCompleted) { + mockDownloadServerDownload(location, day, hour, file) + mockKeyCacheUpdateComplete(keyInfo, "checksum") + } + return keyRepoData[keyInfo.id]!! to file + } + + private fun createDownloader(): KeyFileDownloader { + val downloader = KeyFileDownloader( + deviceStorage = deviceStorage, + keyServer = diagnosisKeyServer, + keyCache = keyCache, + legacyKeyCache = legacyMigration, + settings = settings + ) + Timber.i("createDownloader(): %s", downloader) + return downloader + } + + @Test + fun `storage is checked before fetching`() { + val downloader = createDownloader() + runBlocking { + downloader.asyncFetchKeyFiles(emptyList()) shouldBe emptyList() + } + } + + @Test + fun `fetching is aborted if not enough free storage`() { + coEvery { deviceStorage.checkSpacePrivateStorage(any()) } returns mockk<DeviceStorage.CheckResult>().apply { + every { isSpaceAvailable } returns false + every { freeBytes } returns 1337L + every { requiredBytes } returns 5000L + } + + val downloader = createDownloader() + + runBlocking { + shouldThrow<InsufficientStorageException> { + downloader.asyncFetchKeyFiles(listOf(LocationCode("DE"))) + } + } + } + + @Test + fun `error during country index fetch`() { + coEvery { diagnosisKeyServer.getCountryIndex() } throws IOException() + + val downloader = createDownloader() + + runBlocking { + shouldThrow<IOException> { + downloader.asyncFetchKeyFiles(listOf(LocationCode("DE"))) + } + } + } + + @Test + fun `day fetch without prior data`() { + val downloader = createDownloader() + + runBlocking { + downloader.asyncFetchKeyFiles( + listOf(LocationCode("DE"), LocationCode("NL")) + ).size shouldBe 4 + } + + coVerify { + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("DE"), + dayIdentifier = LocalDate.parse("2020-09-01"), + hourIdentifier = null + ) + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("DE"), + dayIdentifier = LocalDate.parse("2020-09-02"), + hourIdentifier = null + ) + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-02"), + hourIdentifier = null + ) + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-03"), + hourIdentifier = null + ) + } + keyRepoData.size shouldBe 4 + keyRepoData.values.forEach { it.isDownloadComplete shouldBe true } + } + + @Test + fun `day fetch with existing data`() { + mockAddData( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("DE"), + day = LocalDate.parse("2020-09-01"), + hour = null, + isCompleted = true + ) + + mockAddData( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("NL"), + day = LocalDate.parse("2020-09-02"), + hour = null, + isCompleted = true + ) + + val downloader = createDownloader() + + runBlocking { + downloader.asyncFetchKeyFiles( + listOf(LocationCode("DE"), LocationCode("NL")) + ).size shouldBe 4 + } + + coVerify { + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("DE"), + dayIdentifier = LocalDate.parse("2020-09-02"), + hourIdentifier = null + ) + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-03"), + hourIdentifier = null + ) + } + + coVerify(exactly = 2) { keyCache.createCacheEntry(any(), any(), any(), any()) } + coVerify(exactly = 2) { keyCache.markKeyComplete(any(), any()) } + } + + @Test + fun `day fetch deletes stale data`() { + coEvery { diagnosisKeyServer.getDayIndex(LocationCode("DE")) } returns listOf( + LocalDate.parse("2020-09-02") + ) + val (staleKeyInfo, _) = mockAddData( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("DE"), + day = LocalDate.parse("2020-09-01"), + hour = null, + isCompleted = true + ) + + mockAddData( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("NL"), + day = LocalDate.parse("2020-09-02"), + hour = null, + isCompleted = true + ) + + val downloader = createDownloader() + + runBlocking { + downloader.asyncFetchKeyFiles( + listOf(LocationCode("DE"), LocationCode("NL")) + ).size shouldBe 3 + } + + coVerify { + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("DE"), + dayIdentifier = LocalDate.parse("2020-09-02"), + hourIdentifier = null + ) + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-03"), + hourIdentifier = null + ) + } + coVerify(exactly = 1) { keyCache.delete(listOf(staleKeyInfo)) } + coVerify(exactly = 2) { keyCache.createCacheEntry(any(), any(), any(), any()) } + coVerify(exactly = 2) { keyCache.markKeyComplete(any(), any()) } + } + + @Test + fun `day fetch skips single download failures`() { + var dlCounter = 0 + coEvery { diagnosisKeyServer.downloadKeyFile(any(), any(), any(), any(), any()) } answers { + dlCounter++ + if (dlCounter == 2) throw IOException("Timeout") + mockDownloadServerDownload(arg(0), arg(1), arg(2), arg(3), arg(4)) + } + + val downloader = createDownloader() + + runBlocking { + downloader.asyncFetchKeyFiles( + listOf(LocationCode("DE"), LocationCode("NL")) + ).size shouldBe 3 + } + + // We delete the entry for the failed download + coVerify(exactly = 1) { keyCache.delete(any()) } + } + + @Test + fun `last3Hours fetch without prior data`() { + every { CWADebug.isDebugBuildOrMode } returns true + every { settings.isLast3HourModeEnabled } returns true + + val downloader = createDownloader() + + runBlocking { + downloader.asyncFetchKeyFiles( + listOf(LocationCode("DE"), LocationCode("NL")) + ).size shouldBe 6 + } + + coVerify { + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("DE"), + dayIdentifier = LocalDate.parse("2020-09-02"), + hourIdentifier = LocalTime.parse("21") + ) + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("DE"), + dayIdentifier = LocalDate.parse("2020-09-02"), + hourIdentifier = LocalTime.parse("20") + ) + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("DE"), + dayIdentifier = LocalDate.parse("2020-09-01"), + hourIdentifier = LocalTime.parse("20") + ) + + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-03"), + hourIdentifier = LocalTime.parse("23") + ) + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-03"), + hourIdentifier = LocalTime.parse("22") + ) + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-02"), + hourIdentifier = LocalTime.parse("22") + ) + } + coVerify(exactly = 6) { keyCache.markKeyComplete(any(), any()) } + + keyRepoData.size shouldBe 6 + keyRepoData.values.forEach { it.isDownloadComplete shouldBe true } + } + + @Test + fun `last3Hours fetch with prior data`() { + every { CWADebug.isDebugBuildOrMode } returns true + every { settings.isLast3HourModeEnabled } returns true + + mockAddData( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("DE"), + day = LocalDate.parse("2020-09-01"), + hour = LocalTime.parse("20"), + isCompleted = true + ) + mockAddData( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("NL"), + day = LocalDate.parse("2020-09-02"), + hour = LocalTime.parse("22"), + isCompleted = true + ) + + val downloader = createDownloader() + + runBlocking { + downloader.asyncFetchKeyFiles( + listOf(LocationCode("DE"), LocationCode("NL")) + ).size shouldBe 6 + } + + coVerify { + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("DE"), + dayIdentifier = LocalDate.parse("2020-09-02"), + hourIdentifier = LocalTime.parse("21") + ) + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("DE"), + dayIdentifier = LocalDate.parse("2020-09-02"), + hourIdentifier = LocalTime.parse("20") + ) + + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-03"), + hourIdentifier = LocalTime.parse("23") + ) + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-03"), + hourIdentifier = LocalTime.parse("22") + ) + } + coVerify(exactly = 4) { + diagnosisKeyServer.downloadKeyFile( + any(), + any(), + any(), + any(), + any() + ) + } + } + + @Test + fun `last3Hours fetch deletes stale data`() { + every { CWADebug.isDebugBuildOrMode } returns true + every { settings.isLast3HourModeEnabled } returns true + + val (staleKey1, _) = mockAddData( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("NL"), + day = LocalDate.parse("2020-09-02"), + hour = LocalTime.parse("12"), // Stale hour + isCompleted = true + ) + + val (staleKey2, _) = mockAddData( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("NL"), + day = LocalDate.parse("2020-09-01"), // Stale day + hour = LocalTime.parse("22"), + isCompleted = true + ) + + mockAddData( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("DE"), + day = LocalDate.parse("2020-09-01"), + hour = LocalTime.parse("20"), + isCompleted = true + ) + mockAddData( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("NL"), + day = LocalDate.parse("2020-09-02"), + hour = LocalTime.parse("22"), + isCompleted = true + ) + + val downloader = createDownloader() + + runBlocking { + downloader.asyncFetchKeyFiles( + listOf(LocationCode("DE"), LocationCode("NL")) + ).size shouldBe 6 + } + + coVerify { + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("DE"), + dayIdentifier = LocalDate.parse("2020-09-02"), + hourIdentifier = LocalTime.parse("21") + ) + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("DE"), + dayIdentifier = LocalDate.parse("2020-09-02"), + hourIdentifier = LocalTime.parse("20") + ) + + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-03"), + hourIdentifier = LocalTime.parse("23") + ) + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_HOUR, + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-03"), + hourIdentifier = LocalTime.parse("22") + ) + } + coVerify(exactly = 4) { + diagnosisKeyServer.downloadKeyFile( + any(), + any(), + any(), + any(), + any() + ) + } + coVerify(exactly = 1) { keyCache.delete(listOf(staleKey1, staleKey2)) } + } + + @Test + fun `last3Hours fetch skips single download failures`() { + every { CWADebug.isDebugBuildOrMode } returns true + every { settings.isLast3HourModeEnabled } returns true + + var dlCounter = 0 + coEvery { diagnosisKeyServer.downloadKeyFile(any(), any(), any(), any(), any()) } answers { + dlCounter++ + if (dlCounter == 2) throw IOException("Timeout") + mockDownloadServerDownload(arg(0), arg(1), arg(2), arg(3), arg(4)) + } + + val downloader = createDownloader() + + runBlocking { + downloader.asyncFetchKeyFiles( + listOf(LocationCode("DE"), LocationCode("NL")) + ).size shouldBe 5 + } + + // We delete the entry for the failed download + coVerify(exactly = 1) { keyCache.delete(any()) } + } + + @Test + fun `not completed cache entries are overwritten`() { + mockAddData( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("DE"), + day = LocalDate.parse("2020-09-01"), + hour = null, + isCompleted = false + ) + + val downloader = createDownloader() + + runBlocking { + downloader.asyncFetchKeyFiles( + listOf(LocationCode("DE"), LocationCode("NL")) + ).size shouldBe 4 + } + + coVerify { + keyCache.createCacheEntry( + type = CachedKeyInfo.Type.COUNTRY_DAY, + location = LocationCode("DE"), + dayIdentifier = LocalDate.parse("2020-09-01"), + hourIdentifier = null + ) + } + } + + @Test + fun `database errors do not abort the whole process`() { + var completionCounter = 0 + coEvery { keyCache.markKeyComplete(any(), any()) } answers { + completionCounter++ + if (completionCounter == 2) throw SQLException(":)") + mockKeyCacheUpdateComplete(arg(0), arg(1)) + } + + val downloader = createDownloader() + + runBlocking { + downloader.asyncFetchKeyFiles( + listOf(LocationCode("DE"), LocationCode("NL")) + ).size shouldBe 3 + } + + coVerify(exactly = 4) { + diagnosisKeyServer.downloadKeyFile( + any(), + any(), + any(), + any(), + any() + ) + } + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/server/AppConfigApiTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/server/AppConfigApiTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..4db01f22b51a4c94000846db671dae5fbdc13692 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/server/AppConfigApiTest.kt @@ -0,0 +1,157 @@ +package de.rki.coronawarnapp.diagnosiskeys.server + +import android.content.Context +import de.rki.coronawarnapp.diagnosiskeys.DiagnosisKeysModule +import de.rki.coronawarnapp.http.HttpModule +import io.kotest.matchers.shouldBe +import io.mockk.MockKAnnotations +import io.mockk.clearAllMocks +import io.mockk.every +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.runBlocking +import okhttp3.ConnectionSpec +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import okhttp3.mockwebserver.SocketPolicy +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseIOTest +import java.io.File +import java.util.concurrent.TimeUnit + +class AppConfigApiTest : BaseIOTest() { + + @MockK + private lateinit var context: Context + + private lateinit var webServer: MockWebServer + private lateinit var serverAddress: String + + private val testDir = File(IO_TEST_BASEDIR, this::class.java.simpleName) + private val appConfigCacheDir = File(testDir, "http_app-config") + + @BeforeEach + fun setup() { + MockKAnnotations.init(this) + every { context.cacheDir } returns testDir + + webServer = MockWebServer() + webServer.start() + serverAddress = "http://${webServer.hostName}:${webServer.port}" + } + + @AfterEach + fun teardown() { + clearAllMocks() + webServer.shutdown() + testDir.deleteRecursively() + } + + private fun createAPI(): AppConfigApiV1 { + val httpModule = HttpModule() + val defaultHttpClient = httpModule.defaultHttpClient() + val gsonConverterFactory = httpModule.provideGSONConverter() + + return DiagnosisKeysModule().let { + val downloadHttpClient = it.cdnHttpClient(defaultHttpClient) + .newBuilder() + .connectionSpecs(listOf(ConnectionSpec.CLEARTEXT, ConnectionSpec.MODERN_TLS)) + .build() + it.provideAppConfigApi( + context = context, + client = downloadHttpClient, + url = serverAddress, + gsonConverterFactory = gsonConverterFactory + ) + } + } + + @Test + fun `application config download`() { + val api = createAPI() + + webServer.enqueue(MockResponse().setBody("~appconfig")) + + runBlocking { + api.getApplicationConfiguration("DE").string() shouldBe "~appconfig" + } + + val request = webServer.takeRequest(5, TimeUnit.SECONDS)!! + request.method shouldBe "GET" + request.path shouldBe "/version/v1/configuration/country/DE/app_config" + } + + @Test + fun `application config download uses cache`() { + appConfigCacheDir.exists() shouldBe false + + val api = createAPI() + + val configResponse = + MockResponse().setBody("~appconfig").addHeader("Cache-Control: max-age=2") + + webServer.enqueue(configResponse) + runBlocking { + api.getApplicationConfiguration("DE").string() shouldBe "~appconfig" + } + appConfigCacheDir.exists() shouldBe true + appConfigCacheDir.listFiles()!!.size shouldBe 3 + + webServer.takeRequest(5, TimeUnit.SECONDS)!!.apply { + method shouldBe "GET" + path shouldBe "/version/v1/configuration/country/DE/app_config" + } + + webServer.enqueue(configResponse) + runBlocking { + api.getApplicationConfiguration("DE").string() shouldBe "~appconfig" + } + appConfigCacheDir.exists() shouldBe true + appConfigCacheDir.listFiles()!!.size shouldBe 3 + + webServer.takeRequest(2, TimeUnit.SECONDS) shouldBe null + + Thread.sleep(4000) // Let the cache expire + + webServer.enqueue(configResponse) + runBlocking { + api.getApplicationConfiguration("DE").string() shouldBe "~appconfig" + } + appConfigCacheDir.exists() shouldBe true + appConfigCacheDir.listFiles()!!.size shouldBe 3 + + webServer.takeRequest(5, TimeUnit.SECONDS)!!.apply { + method shouldBe "GET" + path shouldBe "/version/v1/configuration/country/DE/app_config" + } + } + + @Test + fun `cache is used when connection is flaky`() { + appConfigCacheDir.exists() shouldBe false + + val api = createAPI() + + val configResponse = + MockResponse().setBody("~appconfig").addHeader("Cache-Control: max-age=300") + + webServer.enqueue(configResponse) + runBlocking { + api.getApplicationConfiguration("DE").string() shouldBe "~appconfig" + } + appConfigCacheDir.exists() shouldBe true + appConfigCacheDir.listFiles()!!.size shouldBe 3 + + webServer.takeRequest(5, TimeUnit.SECONDS)!!.apply { + method shouldBe "GET" + path shouldBe "/version/v1/configuration/country/DE/app_config" + } + + webServer.enqueue(MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_DURING_REQUEST_BODY)) + + runBlocking { + api.getApplicationConfiguration("DE").string() shouldBe "~appconfig" + } + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/server/AppConfigServerTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/server/AppConfigServerTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..0fbd9e4c8f8854763dfcf0454d7a055e7dfb72af --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/server/AppConfigServerTest.kt @@ -0,0 +1,131 @@ +package de.rki.coronawarnapp.diagnosiskeys.server + +import dagger.Lazy +import de.rki.coronawarnapp.exception.ApplicationConfigurationCorruptException +import de.rki.coronawarnapp.exception.ApplicationConfigurationInvalidException +import de.rki.coronawarnapp.util.security.VerificationKeys +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.matchers.shouldBe +import io.mockk.MockKAnnotations +import io.mockk.clearAllMocks +import io.mockk.coEvery +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.verify +import kotlinx.coroutines.runBlocking +import okhttp3.ResponseBody.Companion.toResponseBody +import okio.ByteString.Companion.decodeHex +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseIOTest +import java.io.File + +class AppConfigServerTest : BaseIOTest() { + + @MockK + lateinit var api: AppConfigApiV1 + + @MockK + lateinit var verificationKeys: VerificationKeys + + private val testDir = File(IO_TEST_BASEDIR, this::class.simpleName!!) + + private val defaultHomeCountry = LocationCode("DE") + + @BeforeEach + fun setup() { + MockKAnnotations.init(this) + testDir.mkdirs() + testDir.exists() shouldBe true + } + + @AfterEach + fun teardown() { + clearAllMocks() + testDir.deleteRecursively() + } + + private fun createDownloadServer( + homeCountry: LocationCode = defaultHomeCountry + ) = AppConfigServer( + appConfigAPI = Lazy { api }, + verificationKeys = verificationKeys, + homeCountry = homeCountry + ) + + @Test + fun `application config download`() { + coEvery { api.getApplicationConfiguration("DE") } returns APPCONFIG_HEX.decodeHex() + .toResponseBody() + + every { verificationKeys.hasInvalidSignature(any(), any()) } returns false + + val downloadServer = createDownloadServer() + + runBlocking { + val config = downloadServer.downloadAppConfig() + config.apply { + // We just care here that it's non default values, i.e. conversion worked + minRiskScore shouldBe 11 + appVersion.android.latest.major shouldBe 1 + appVersion.android.latest.minor shouldBe 0 + appVersion.android.latest.patch shouldBe 4 + + } + } + + verify(exactly = 1) { verificationKeys.hasInvalidSignature(any(), any()) } + } + + @Test + fun `application config data is faulty`() { + coEvery { api.getApplicationConfiguration("DE") } returns "123ABC".decodeHex() + .toResponseBody() + + every { verificationKeys.hasInvalidSignature(any(), any()) } returns false + + val downloadServer = createDownloadServer() + + runBlocking { + shouldThrow<ApplicationConfigurationInvalidException> { + downloadServer.downloadAppConfig() + } + } + } + + @Test + fun `application config verification fails`() { + coEvery { api.getApplicationConfiguration("DE") } returns APPCONFIG_HEX.decodeHex() + .toResponseBody() + + every { verificationKeys.hasInvalidSignature(any(), any()) } returns true + + val downloadServer = createDownloadServer() + + runBlocking { + shouldThrow<ApplicationConfigurationCorruptException> { + downloadServer.downloadAppConfig() + } + } + } + + companion object { + private const val APPCONFIG_HEX = + "504b0304140008080800856b22510000000000000000000000000a0000006578706f72742e62696ee3e016" + + "f2e552e662f6f10f97e05792ca28292928b6d2d72f2f2fd74bce2fcacf4b2c4f2ccad34b2c28e0" + + "52e362f1f074f710e097f0c0a74e2a854b80835180498259814583d580cd82dd814390010c3c1d" + + "a4b8141835180d182d181d181561825a021cac02ac12ac0aac40f5ac16ac0eac86102913072b3e" + + "01460946841e47981e25192e160e73017b21214e88d0077ba8250fec1524b5a4b8b8b858043824" + + "98849804588578806a19255884c02400504b0708df2c788daf000000f1000000504b0304140008" + + "080800856b22510000000000000000000000000a0000006578706f72742e736967018a0075ff0a" + + "87010a380a1864652e726b692e636f726f6e617761726e6170702d6465761a0276312203323632" + + "2a13312e322e3834302e31303034352e342e332e321001180122473045022100cf32ff24ea18a1" + + "ffcc7ff4c9fe8d1808cecbc5a37e3e1d4c9ce682120450958c022064bf124b6973a9b510a43d47" + + "9ff93e0ef97a5b893c7af4abc4a8d399969cd8a0504b070813c517c68f0000008a000000504b01" + + "021400140008080800856b2251df2c788daf000000f10000000a00000000000000000000000000" + + "000000006578706f72742e62696e504b01021400140008080800856b225113c517c68f0000008a" + + "0000000a00000000000000000000000000e70000006578706f72742e736967504b050600000000" + + "0200020070000000ae0100000000" + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/server/DiagnosisKeyApiTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/server/DiagnosisKeyApiTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..2c6c522ed40a88978b7c0af3cdbb13d5201b6ec3 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/server/DiagnosisKeyApiTest.kt @@ -0,0 +1,127 @@ +package de.rki.coronawarnapp.diagnosiskeys.server + +import de.rki.coronawarnapp.diagnosiskeys.DiagnosisKeysModule +import de.rki.coronawarnapp.http.HttpModule +import io.kotest.matchers.shouldBe +import kotlinx.coroutines.runBlocking +import okhttp3.ConnectionSpec +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseIOTest +import java.util.concurrent.TimeUnit + +class DiagnosisKeyApiTest : BaseIOTest() { + + lateinit var webServer: MockWebServer + lateinit var serverAddress: String + + @BeforeEach + fun setup() { + webServer = MockWebServer() + webServer.start() + serverAddress = "http://${webServer.hostName}:${webServer.port}" + } + + @AfterEach + fun teardown() { + webServer.shutdown() + } + + private fun createAPI(): DiagnosisKeyApiV1 { + val httpModule = HttpModule() + val defaultHttpClient = httpModule.defaultHttpClient() + val gsonConverterFactory = httpModule.provideGSONConverter() + + return DiagnosisKeysModule().let { + val downloadHttpClient = it.cdnHttpClient(defaultHttpClient) + .newBuilder() + .connectionSpecs(listOf(ConnectionSpec.CLEARTEXT, ConnectionSpec.MODERN_TLS)) + .build() + it.provideDiagnosisKeyApi( + client = downloadHttpClient, + url = serverAddress, + gsonConverterFactory = gsonConverterFactory + ) + } + } + + @Test + fun `download country index`() { + val api = createAPI() + + webServer.enqueue(MockResponse().setBody("[\"DE\",\"NL\"]")) + + runBlocking { + api.getCountryIndex() shouldBe listOf("DE", "NL") + } + + val request = webServer.takeRequest(5, TimeUnit.SECONDS)!! + request.method shouldBe "GET" + request.path shouldBe "/version/v1/diagnosis-keys/country" + } + + @Test + fun `download day index for country`() { + val api = createAPI() + + webServer.enqueue(MockResponse().setBody("[\"2020-08-19\",\"2020-08-20\"]")) + + runBlocking { + api.getDayIndex("DE") shouldBe listOf("2020-08-19", "2020-08-20") + } + + val request = webServer.takeRequest(5, TimeUnit.SECONDS)!! + request.method shouldBe "GET" + request.path shouldBe "/version/v1/diagnosis-keys/country/DE/date" + } + + @Test + fun `download hour index for country and day`() { + val api = createAPI() + + webServer.enqueue(MockResponse().setBody("[22,23]")) + + runBlocking { + api.getHourIndex("DE", "2020-08-19") shouldBe listOf("22", "23") + } + + val request = webServer.takeRequest(5, TimeUnit.SECONDS)!! + request.method shouldBe "GET" + request.path shouldBe "/version/v1/diagnosis-keys/country/DE/date/2020-08-19/hour" + } + + @Test + fun `download key files for day`() { + val api = createAPI() + + webServer.enqueue(MockResponse().setBody("~daykeyfile")) + + runBlocking { + api.downloadKeyFileForDay("DE", "2020-09-09").body()!!.string() shouldBe "~daykeyfile" + } + + val request = webServer.takeRequest(5, TimeUnit.SECONDS)!! + request.method shouldBe "GET" + request.path shouldBe "/version/v1/diagnosis-keys/country/DE/date/2020-09-09" + } + + @Test + fun `download key files for hour`() { + val api = createAPI() + + webServer.enqueue(MockResponse().setBody("~hourkeyfile")) + + runBlocking { + api.downloadKeyFileForHour("DE", "2020-09-09", "23").body()!! + .string() shouldBe "~hourkeyfile" + } + + val request = webServer.takeRequest(5, TimeUnit.SECONDS)!! + request.method shouldBe "GET" + request.path shouldBe "/version/v1/diagnosis-keys/country/DE/date/2020-09-09/hour/23" + } + +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/server/DiagnosisKeyServerTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/server/DiagnosisKeyServerTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..16edc6a932c04f4204830a92f05974db2f54bf21 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/server/DiagnosisKeyServerTest.kt @@ -0,0 +1,150 @@ +package de.rki.coronawarnapp.diagnosiskeys.server + +import dagger.Lazy +import io.kotest.matchers.shouldBe +import io.mockk.MockKAnnotations +import io.mockk.clearAllMocks +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.runBlocking +import okhttp3.ResponseBody.Companion.toResponseBody +import org.joda.time.LocalDate +import org.joda.time.LocalTime +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import retrofit2.Response +import testhelpers.BaseIOTest +import java.io.File + +class DiagnosisKeyServerTest : BaseIOTest() { + + @MockK + lateinit var api: DiagnosisKeyApiV1 + + private val testDir = File(IO_TEST_BASEDIR, this::class.simpleName!!) + + private val defaultHomeCountry = LocationCode("DE") + + @BeforeEach + fun setup() { + MockKAnnotations.init(this) + testDir.mkdirs() + testDir.exists() shouldBe true + } + + @AfterEach + fun teardown() { + clearAllMocks() + testDir.deleteRecursively() + } + + private fun createDownloadServer( + homeCountry: LocationCode = defaultHomeCountry + ) = DiagnosisKeyServer( + diagnosisKeyAPI = Lazy { api }, + homeCountry = homeCountry + ) + + @Test + fun `download country index`() { + val downloadServer = createDownloadServer() + coEvery { api.getCountryIndex() } returns listOf("DE", "NL") + + runBlocking { + downloadServer.getCountryIndex() shouldBe listOf( + LocationCode("DE"), LocationCode("NL") + ) + } + + coVerify { api.getCountryIndex() } + } + + @Test + fun `download day index for country`() { + val downloadServer = createDownloadServer() + coEvery { api.getDayIndex("DE") } returns listOf( + "2000-01-01", "2000-01-02" + ) + + runBlocking { + downloadServer.getDayIndex(LocationCode("DE")) shouldBe listOf( + "2000-01-01", "2000-01-02" + ).map { LocalDate.parse(it) } + } + + coVerify { api.getDayIndex("DE") } + } + + @Test + fun `download hour index for country and day`() { + val downloadServer = createDownloadServer() + coEvery { api.getHourIndex("DE", "2000-01-01") } returns listOf( + "20", "21" + ) + + runBlocking { + downloadServer.getHourIndex( + LocationCode("DE"), + LocalDate.parse("2000-01-01") + ) shouldBe listOf( + "20:00", "21:00" + ).map { LocalTime.parse(it) } + } + + coVerify { api.getHourIndex("DE", "2000-01-01") } + } + + + @Test + fun `download key files for day`() { + val downloadServer = createDownloadServer() + coEvery { + api.downloadKeyFileForDay( + "DE", + "2000-01-01" + ) + } returns Response.success("testdata-day".toResponseBody()) + + val targetFile = File(testDir, "day-keys") + + runBlocking { + downloadServer.downloadKeyFile( + locationCode = LocationCode("DE"), + day = LocalDate.parse("2000-01-01"), + hour = null, + saveTo = targetFile + ) + } + + targetFile.exists() shouldBe true + targetFile.readText() shouldBe "testdata-day" + } + + @Test + fun `download key files for hour`() { + val downloadServer = createDownloadServer() + coEvery { + api.downloadKeyFileForHour( + "DE", + "2000-01-01", + "01" + ) + } returns Response.success("testdata-hour".toResponseBody()) + + val targetFile = File(testDir, "hour-keys") + + runBlocking { + downloadServer.downloadKeyFile( + locationCode = LocationCode("DE"), + day = LocalDate.parse("2000-01-01"), + hour = LocalTime.parse("01:00"), + saveTo = targetFile + ) + } + + targetFile.exists() shouldBe true + targetFile.readText() shouldBe "testdata-hour" + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/storage/CachedKeyFileTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/storage/CachedKeyFileTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..cf1d1ebe08debced8dc4ccda7b90eed1e5d0da18 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/storage/CachedKeyFileTest.kt @@ -0,0 +1,62 @@ +package de.rki.coronawarnapp.diagnosiskeys.storage + +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import io.kotest.matchers.shouldBe +import org.joda.time.Instant +import org.joda.time.LocalDate +import org.joda.time.LocalTime +import org.junit.jupiter.api.Test +import testhelpers.BaseTest + +class CachedKeyFileTest : BaseTest() { + private val type = CachedKeyInfo.Type.COUNTRY_DAY + private val location = LocationCode("DE") + private val day = LocalDate.parse("2222-12-31") + private val hour = LocalTime.parse("23:59") + private val now = Instant.EPOCH + + @Test + fun `secondary constructor`() { + val key = CachedKeyInfo(type, location, day, hour, now) + + key.id shouldBe CachedKeyInfo.calcluateId(location, day, hour, type) + key.checksumMD5 shouldBe null + key.isDownloadComplete shouldBe false + } + + @Test + fun `keyfile id calculation`() { + val calculatedId1 = CachedKeyInfo.calcluateId(location, day, hour, type) + val calculatedId2 = CachedKeyInfo.calcluateId(location, day, hour, type) + calculatedId1 shouldBe calculatedId2 + + calculatedId1 shouldBe "550b64773e052b9ddf232998a92846833ed3f907" + } + + @Test + fun `to completion`() { + val key = CachedKeyInfo(type, location, day, hour, now) + val testChecksum = "testchecksum" + val downloadCompleteUpdate = key.toDownloadUpdate(testChecksum) + + downloadCompleteUpdate shouldBe CachedKeyInfo.DownloadUpdate( + id = downloadCompleteUpdate.id, + isDownloadComplete = true, + checksumMD5 = testChecksum + ) + + val resetDownloadUpdate = key.toDownloadUpdate(null) + + resetDownloadUpdate shouldBe CachedKeyInfo.DownloadUpdate( + id = downloadCompleteUpdate.id, + isDownloadComplete = false, + checksumMD5 = null + ) + } + + @Test + fun `trip changed typing`() { + CachedKeyInfo.Type.COUNTRY_DAY.typeValue shouldBe "country_day" + CachedKeyInfo.Type.COUNTRY_HOUR.typeValue shouldBe "country_hour" + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/storage/KeyCacheRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/storage/KeyCacheRepositoryTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..a45a79487ab097347213f338325bfda2530dd072 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/storage/KeyCacheRepositoryTest.kt @@ -0,0 +1,207 @@ +package de.rki.coronawarnapp.diagnosiskeys.storage + +import android.content.Context +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import de.rki.coronawarnapp.util.TimeStamper +import io.kotest.matchers.shouldBe +import io.mockk.MockKAnnotations +import io.mockk.clearAllMocks +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.runBlocking +import org.joda.time.Instant +import org.joda.time.LocalDate +import org.joda.time.LocalTime +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseIOTest +import java.io.File + +class KeyCacheRepositoryTest : BaseIOTest() { + @MockK + lateinit var context: Context + + @MockK + lateinit var timeStamper: TimeStamper + + @MockK + lateinit var databaseFactory: KeyCacheDatabase.Factory + + @MockK + lateinit var database: KeyCacheDatabase + + @MockK + lateinit var keyfileDAO: KeyCacheDatabase.CachedKeyFileDao + + private val testDir = File(IO_TEST_BASEDIR, this::class.simpleName!!) + + @BeforeEach + fun setup() { + MockKAnnotations.init(this) + testDir.mkdirs() + testDir.exists() shouldBe true + + every { timeStamper.nowUTC } returns Instant.EPOCH + every { context.cacheDir } returns File(testDir, "cache") + + every { databaseFactory.create() } returns database + every { database.cachedKeyFiles() } returns keyfileDAO + + coEvery { keyfileDAO.getAllEntries() } returns emptyList() + } + + @AfterEach + fun teardown() { + clearAllMocks() + testDir.deleteRecursively() + } + + private fun createRepo(): KeyCacheRepository = KeyCacheRepository( + context = context, + databaseFactory = databaseFactory, + timeStamper = timeStamper + ) + + @Test + fun `housekeeping runs before data access`() { + val lostKey = CachedKeyInfo( + location = LocationCode("DE"), + day = LocalDate.now(), + hour = LocalTime.now(), + type = CachedKeyInfo.Type.COUNTRY_HOUR, + createdAt = Instant.now() + ).copy( + isDownloadComplete = true, + checksumMD5 = "checksum" + ) + + val existingKey = CachedKeyInfo( + location = LocationCode("NL"), + day = LocalDate.now(), + hour = LocalTime.now(), + type = CachedKeyInfo.Type.COUNTRY_HOUR, + createdAt = Instant.now() + ) + + File(testDir, "diagnosis_keys/${existingKey.id}.zip").apply { + parentFile!!.mkdirs() + createNewFile() + } + + coEvery { keyfileDAO.getAllEntries() } returns listOf(lostKey, existingKey) + coEvery { keyfileDAO.updateDownloadState(any()) } returns Unit + coEvery { keyfileDAO.deleteEntry(lostKey) } returns Unit + + val repo = createRepo() + + coVerify(exactly = 0) { keyfileDAO.updateDownloadState(any()) } + + runBlocking { + repo.getAllCachedKeys() + coVerify(exactly = 2) { keyfileDAO.getAllEntries() } + coVerify { keyfileDAO.deleteEntry(lostKey) } + } + } + + @Test + fun `insert and retrieve`() { + val repo = createRepo() + + coEvery { keyfileDAO.insertEntry(any()) } returns Unit + + runBlocking { + val (keyFile, path) = repo.createCacheEntry( + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-09"), + hourIdentifier = LocalTime.parse("23:00"), + type = CachedKeyInfo.Type.COUNTRY_HOUR + ) + + path shouldBe File(context.cacheDir, "diagnosis_keys/${keyFile.id}.zip") + + coVerify { keyfileDAO.insertEntry(keyFile) } + } + } + + @Test + fun `update download state`() { + val repo = createRepo() + + coEvery { keyfileDAO.insertEntry(any()) } returns Unit + coEvery { keyfileDAO.updateDownloadState(any()) } returns Unit + + runBlocking { + val (keyFile, _) = repo.createCacheEntry( + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-09"), + hourIdentifier = LocalTime.parse("23:00"), + type = CachedKeyInfo.Type.COUNTRY_HOUR + ) + + repo.markKeyComplete(keyFile, "checksum") + + coVerify { + keyfileDAO.insertEntry(keyFile) + keyfileDAO.updateDownloadState(keyFile.toDownloadUpdate("checksum")) + } + } + } + + @Test + fun `delete only selected entries`() { + val repo = createRepo() + + coEvery { keyfileDAO.insertEntry(any()) } returns Unit + coEvery { keyfileDAO.deleteEntry(any()) } returns Unit + + runBlocking { + val (keyFile, path) = repo.createCacheEntry( + location = LocationCode("NL"), + dayIdentifier = LocalDate.parse("2020-09-09"), + hourIdentifier = LocalTime.parse("23:00"), + type = CachedKeyInfo.Type.COUNTRY_HOUR + ) + + path.createNewFile() shouldBe true + path.exists() shouldBe true + + repo.delete(listOf(keyFile)) + + coVerify { keyfileDAO.deleteEntry(keyFile) } + + path.exists() shouldBe false + } + } + + @Test + fun `clear all files`() { + val repo = createRepo() + + val keyFileToClear = CachedKeyInfo( + location = LocationCode("DE"), + day = LocalDate.now(), + hour = LocalTime.now(), + type = CachedKeyInfo.Type.COUNTRY_HOUR, + createdAt = Instant.now() + ) + + coEvery { keyfileDAO.getAllEntries() } returns listOf(keyFileToClear) + coEvery { keyfileDAO.deleteEntry(any()) } returns Unit + + val keyFilePath = repo.getPathForKey(keyFileToClear) + keyFilePath.createNewFile() shouldBe true + keyFilePath.exists() shouldBe true + + runBlocking { + repo.clear() + + coVerify { keyfileDAO.deleteEntry(keyFileToClear) } + + keyFilePath.exists() shouldBe false + } + } + +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/KeyCacheEntityTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/KeyCacheEntityTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..311923c1019b7cc973c7a381eae25ad750ac3905 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/KeyCacheEntityTest.kt @@ -0,0 +1,5 @@ +package de.rki.coronawarnapp.diagnosiskeys.storage.legacy + +import testhelpers.BaseTest + +class KeyCacheEntityTest : BaseTest() diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/LegacyKeyCacheMigrationTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/LegacyKeyCacheMigrationTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..e1a33d271802f2e3c2ea47f4999ddb71666a6271 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/storage/legacy/LegacyKeyCacheMigrationTest.kt @@ -0,0 +1,215 @@ +package de.rki.coronawarnapp.diagnosiskeys.storage.legacy + +import android.content.Context +import android.database.SQLException +import dagger.Lazy +import de.rki.coronawarnapp.util.HashExtensions.hashToMD5 +import de.rki.coronawarnapp.util.TimeStamper +import io.kotest.matchers.shouldBe +import io.mockk.MockKAnnotations +import io.mockk.clearAllMocks +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.mockk +import kotlinx.coroutines.runBlocking +import org.joda.time.Duration +import org.joda.time.Instant +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseIOTest +import java.io.File +import java.io.IOException + +class LegacyKeyCacheMigrationTest : BaseIOTest() { + + @MockK + lateinit var context: Context + + @MockK + lateinit var timeStamper: TimeStamper + + @MockK + lateinit var legacyDao: KeyCacheLegacyDao + + private val testDir = File(IO_TEST_BASEDIR, this::class.simpleName!!) + private val legacyDir = File(testDir, "key-export") + + @BeforeEach + fun setup() { + MockKAnnotations.init(this) + testDir.mkdirs() + testDir.exists() shouldBe true + + every { context.cacheDir } returns testDir + every { timeStamper.nowUTC } returns Instant.EPOCH + + coEvery { legacyDao.clear() } returns Unit + } + + @AfterEach + fun teardown() { + clearAllMocks() + testDir.deleteRecursively() + } + + private fun createTool() = LegacyKeyCacheMigration( + context = context, + legacyDao = Lazy { legacyDao }, + timeStamper = timeStamper + ) + + @Test + fun `nothing happens on null checksum`() { + val tool = createTool() + runBlocking { + tool.tryMigration(null, File(testDir, "something")) + } + + coVerify(exactly = 0) { legacyDao.clear() } + } + + @Test + fun `migrate a file successfully`() { + val legacyFile1 = File(legacyDir, "1234.zip") + legacyFile1.parentFile!!.mkdirs() + legacyFile1.writeText("testdata") + legacyFile1.exists() shouldBe true + + val legacyFile1MD5 = legacyFile1.hashToMD5() + legacyFile1MD5.isNotEmpty() shouldBe true + + val migrationTarget = File(testDir, "migratedkey.zip") + + val tool = createTool() + runBlocking { + tool.tryMigration(legacyFile1MD5, migrationTarget) + } + + legacyFile1.exists() shouldBe false + migrationTarget.exists() shouldBe true + migrationTarget.hashToMD5() shouldBe legacyFile1MD5 + + coVerify(exactly = 1) { legacyDao.clear() } + } + + @Test + fun `migrating a single file fails gracefully`() { + val legacyFile1 = File(legacyDir, "1234.zip") + legacyFile1.parentFile!!.mkdirs() + legacyFile1.writeText("testdata") + legacyFile1.exists() shouldBe true + + val legacyFile1MD5 = legacyFile1.hashToMD5() + legacyFile1MD5.isNotEmpty() shouldBe true + + val migrationTarget = mockk<File>() + every { migrationTarget.path } throws IOException() + + val tool = createTool() + runBlocking { + tool.tryMigration(legacyFile1MD5, migrationTarget) + } + + legacyFile1.exists() shouldBe false + + coVerify(exactly = 1) { legacyDao.clear() } + } + + @Test + fun `legacy app database can crash, we don't care`() { + val legacyFile1 = File(legacyDir, "1234.zip") + legacyFile1.parentFile!!.mkdirs() + legacyFile1.writeText("testdata") + legacyFile1.exists() shouldBe true + + val legacyFile1MD5 = legacyFile1.hashToMD5() + legacyFile1MD5.isNotEmpty() shouldBe true + + val migrationTarget = File(testDir, "migratedkey.zip") + + coEvery { legacyDao.clear() } throws SQLException() + + val tool = createTool() + runBlocking { + tool.tryMigration(legacyFile1MD5, migrationTarget) + } + + legacyFile1.exists() shouldBe false + migrationTarget.exists() shouldBe true + migrationTarget.hashToMD5() shouldBe legacyFile1MD5 + + coVerify(exactly = 1) { legacyDao.clear() } + } + + @Test + fun `init failure causes legacy cache to be cleared`() { + val legacyFile1 = File(legacyDir, "1234.zip") + legacyFile1.parentFile!!.mkdirs() + legacyFile1.writeText("testdata") + + val legacyFile1MD5 = legacyFile1.hashToMD5() + legacyFile1MD5.isNotEmpty() shouldBe true + + legacyFile1.setReadable(false) + + val migrationTarget = File(testDir, "migratedkey.zip") + + val tool = createTool() + runBlocking { + tool.tryMigration(legacyFile1MD5, migrationTarget) + } + + legacyFile1.exists() shouldBe false + migrationTarget.exists() shouldBe false + } + + @Test + fun `stale legacy files (older than 15 days) are cleaned up on init`() { + val legacyFile1 = File(legacyDir, "1234.zip") + legacyFile1.parentFile!!.mkdirs() + legacyFile1.writeText("testdata") + + val legacyFile1MD5 = legacyFile1.hashToMD5() + legacyFile1MD5.isNotEmpty() shouldBe true + + every { timeStamper.nowUTC } returns Instant.ofEpochMilli(legacyFile1.lastModified()) + .plus(Duration.standardDays(16)) + + val migrationTarget = File(testDir, "migratedkey.zip") + + coEvery { legacyDao.clear() } throws SQLException() + + val tool = createTool() + runBlocking { + tool.tryMigration(legacyFile1MD5, migrationTarget) + } + + legacyFile1.exists() shouldBe false + migrationTarget.exists() shouldBe false + } + + @Test + fun `init deletes empty cache dir`() { + legacyDir.mkdirs() + legacyDir.exists() shouldBe true + + runBlocking { + val tool = createTool() + tool.tryMigration("doesntmatter", File(testDir, "1")) + } + legacyDir.exists() shouldBe false + legacyDir.parentFile!!.exists() shouldBe true + + runBlocking { + val tool = createTool() + tool.tryMigration("doesntmatter", File(testDir, "1")) + } + legacyDir.exists() shouldBe false + legacyDir.parentFile!!.exists() shouldBe true + + coVerify(exactly = 1) { legacyDao.clear() } + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/WebRequestBuilderTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/WebRequestBuilderTest.kt index 1b931b2dac8eea912dc31f56db3992e0c8f609ae..cb1bb4a51e275f4d1c4e09c43bfd51eecf915985 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/WebRequestBuilderTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/http/WebRequestBuilderTest.kt @@ -1,30 +1,18 @@ package de.rki.coronawarnapp.http -import de.rki.coronawarnapp.http.service.DistributionService import de.rki.coronawarnapp.http.service.SubmissionService import de.rki.coronawarnapp.http.service.VerificationService -import de.rki.coronawarnapp.service.diagnosiskey.DiagnosisKeyConstants -import de.rki.coronawarnapp.util.TimeAndDateExtensions.toServerFormat import de.rki.coronawarnapp.util.security.VerificationKeys import io.mockk.MockKAnnotations -import io.mockk.coEvery -import io.mockk.coVerify import io.mockk.impl.annotations.MockK import io.mockk.unmockkAll -import kotlinx.coroutines.runBlocking import org.junit.After -import org.junit.Assert import org.junit.Before -import org.junit.Test -import java.util.Date class WebRequestBuilderTest { @MockK private lateinit var verificationService: VerificationService - @MockK - private lateinit var distributionService: DistributionService - @MockK private lateinit var submissionService: SubmissionService @@ -37,46 +25,11 @@ class WebRequestBuilderTest { fun setUp() = run { MockKAnnotations.init(this) webRequestBuilder = WebRequestBuilder( - distributionService, verificationService, - submissionService, - verificationKeys + submissionService ) } @After fun tearDown() = unmockkAll() - - @Test - fun retrievingDateIndexIsSuccessful() { - val urlString = DiagnosisKeyConstants.AVAILABLE_DATES_URL - coEvery { distributionService.getDateIndex(urlString) } - .returns(listOf("1900-01-01", "2000-01-01")) - - runBlocking { - val expectedResult = listOf("1900-01-01", "2000-01-01") - Assert.assertEquals(webRequestBuilder.asyncGetDateIndex(), expectedResult) - coVerify { - distributionService.getDateIndex(urlString) - } - } - } - - @Test - fun asyncGetHourIndex() { - val day = Date() - val urlString = DiagnosisKeyConstants.AVAILABLE_DATES_URL + - "/${day.toServerFormat()}/${DiagnosisKeyConstants.HOUR}" - - coEvery { distributionService.getHourIndex(urlString) } - .returns(listOf("1", "2")) - - runBlocking { - val expectedResult = listOf("1", "2") - Assert.assertEquals(webRequestBuilder.asyncGetHourIndex(day), expectedResult) - coVerify { - distributionService.getHourIndex(urlString) - } - } - } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/applicationconfiguration/ApplicationConfigurationServiceTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/applicationconfiguration/ApplicationConfigurationServiceTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..06f4368a048b587e7676b71f1aec35ffb9d70385 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/applicationconfiguration/ApplicationConfigurationServiceTest.kt @@ -0,0 +1,65 @@ +package de.rki.coronawarnapp.service.applicationconfiguration + +import de.rki.coronawarnapp.diagnosiskeys.server.AppConfigServer +import de.rki.coronawarnapp.http.WebRequestBuilder +import de.rki.coronawarnapp.server.protocols.ApplicationConfigurationOuterClass +import de.rki.coronawarnapp.util.CWADebug +import de.rki.coronawarnapp.util.di.AppInjector +import de.rki.coronawarnapp.util.di.ApplicationComponent +import io.kotest.matchers.shouldBe +import io.mockk.coEvery +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkObject +import io.mockk.verify +import kotlinx.coroutines.runBlocking +import org.junit.Test +import testhelpers.BaseTest + +class ApplicationConfigurationServiceTest : BaseTest() { + + @Test + fun `mock country codes only in debug`() { + mockkObject(CWADebug) + every { CWADebug.isDebugBuildOrMode } returns true + + CWADebug.isDebugBuildOrMode shouldBe true + + mockkObject(WebRequestBuilder) + val appConfig = mockk<ApplicationConfigurationOuterClass.ApplicationConfiguration>() + val appConfigBuilder = + mockk<ApplicationConfigurationOuterClass.ApplicationConfiguration.Builder>() + + every { appConfig.toBuilder() } returns appConfigBuilder + + every { appConfigBuilder.addAllSupportedCountries(any()) } returns appConfigBuilder + + every { appConfigBuilder.clearSupportedCountries() } returns appConfigBuilder + + every { appConfigBuilder.build() } returns appConfig + + val downloadServer = mockk<AppConfigServer>() + coEvery { downloadServer.downloadAppConfig() } returns appConfig + + mockkObject(AppInjector) + mockk<ApplicationComponent>().apply { + every { this@apply.appConfigServer } returns downloadServer + every { AppInjector.component } returns this@apply + } + + + runBlocking { + ApplicationConfigurationService.asyncRetrieveApplicationConfiguration() + verify(exactly = 1) { appConfigBuilder.addAllSupportedCountries(any()) } + } + + every { CWADebug.isDebugBuildOrMode } returns false + + CWADebug.isDebugBuildOrMode shouldBe false + + runBlocking { + ApplicationConfigurationService.asyncRetrieveApplicationConfiguration() + verify(exactly = 1) { appConfigBuilder.addAllSupportedCountries(any()) } + } + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstantsTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstantsTest.kt index a7a85c268817a012eb0d012de8aea2703a1935a5..2bb68c7fbbf33e2697e2b5b9cf95b6217be86904 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstantsTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/diagnosiskey/DiagnosisKeyConstantsTest.kt @@ -7,17 +7,7 @@ class DiagnosisKeyConstantsTest { @Test fun allDiagnosisKeyConstants() { - Assert.assertEquals(DiagnosisKeyConstants.HOUR, "hour") Assert.assertEquals(DiagnosisKeyConstants.SERVER_ERROR_CODE_403, 403) - Assert.assertEquals(DiagnosisKeyConstants.INDEX_DOWNLOAD_URL, "version/v1/index.txt") - Assert.assertEquals(DiagnosisKeyConstants.DIAGNOSIS_KEYS_DOWNLOAD_URL, "version/v1/diagnosis-keys") Assert.assertEquals(DiagnosisKeyConstants.DIAGNOSIS_KEYS_SUBMISSION_URL, "version/v1/diagnosis-keys") - Assert.assertEquals(DiagnosisKeyConstants.PARAMETERS_COUNTRY_DOWNLOAD_URL, "version/v1/parameters/country") - Assert.assertEquals(DiagnosisKeyConstants.APPCONFIG_COUNTRY_DOWNLOAD_URL, "version/v1/configuration/country") - Assert.assertEquals( - DiagnosisKeyConstants.COUNTRY_APPCONFIG_DOWNLOAD_URL, - "version/v1/configuration/country/DE/app_config" - ) - Assert.assertEquals(DiagnosisKeyConstants.AVAILABLE_DATES_URL, "version/v1/diagnosis-keys/country/DE/date") } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/DeviceStorageTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/DeviceStorageTest.kt index 84a551dc012c75c4f79d3e1081aa290bcbca0eec..eed7854bfbf17ab0d351ca147085d751fc59883c 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/DeviceStorageTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/DeviceStorageTest.kt @@ -15,6 +15,7 @@ import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.mockk import io.mockk.verify +import kotlinx.coroutines.runBlocking import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -84,14 +85,14 @@ class DeviceStorageTest : BaseIOTest() { @Test fun `check private storage space`() { val deviceStorage = buildInstance() - - deviceStorage.checkSpacePrivateStorage() shouldBe DeviceStorage.CheckResult( - path = privateDataDir, - isSpaceAvailable = true, - freeBytes = defaultFreeSpace, - totalBytes = defaultTotalSpace - ) - + runBlocking { + deviceStorage.checkSpacePrivateStorage() shouldBe DeviceStorage.CheckResult( + path = privateDataDir, + isSpaceAvailable = true, + freeBytes = defaultFreeSpace, + totalBytes = defaultTotalSpace + ) + } verify { storageManager.getUuidForPath(any()) } verify(exactly = 0) { statsFsProvider.createStats(any()) } @@ -101,14 +102,14 @@ class DeviceStorageTest : BaseIOTest() { @Test fun `check private storage space, sub API26`() { val deviceStorage = buildInstance(level = legacyApiLevel) - - deviceStorage.checkSpacePrivateStorage() shouldBe DeviceStorage.CheckResult( - path = privateDataDir, - isSpaceAvailable = true, - freeBytes = defaultFreeSpace, - totalBytes = defaultTotalSpace - ) - + runBlocking { + deviceStorage.checkSpacePrivateStorage() shouldBe DeviceStorage.CheckResult( + path = privateDataDir, + isSpaceAvailable = true, + freeBytes = defaultFreeSpace, + totalBytes = defaultTotalSpace + ) + } verify(exactly = 0) { storageManager.getUuidForPath(any()) } verify { statsFsProvider.createStats(any()) } } @@ -116,40 +117,45 @@ class DeviceStorageTest : BaseIOTest() { @Test fun `request space from private storage successfully`() { val deviceStorage = buildInstance() - - deviceStorage.checkSpacePrivateStorage(requiredBytes = defaultFreeSpace) shouldBe DeviceStorage.CheckResult( - path = privateDataDir, - isSpaceAvailable = true, - freeBytes = defaultFreeSpace, - totalBytes = defaultTotalSpace - ) - + runBlocking { + deviceStorage.checkSpacePrivateStorage(requiredBytes = defaultFreeSpace) shouldBe DeviceStorage.CheckResult( + path = privateDataDir, + isSpaceAvailable = true, + requiredBytes = defaultFreeSpace, + freeBytes = defaultFreeSpace, + totalBytes = defaultTotalSpace + ) + } verify(exactly = 0) { storageManager.allocateBytes(any<UUID>(), any()) } } @Test fun `request space from private storage successfully, sub API26`() { val deviceStorage = buildInstance(level = legacyApiLevel) - - deviceStorage.checkSpacePrivateStorage(requiredBytes = defaultFreeSpace) shouldBe DeviceStorage.CheckResult( - path = privateDataDir, - isSpaceAvailable = true, - freeBytes = defaultFreeSpace, - totalBytes = defaultTotalSpace - ) + runBlocking { + deviceStorage.checkSpacePrivateStorage(requiredBytes = defaultFreeSpace) shouldBe DeviceStorage.CheckResult( + path = privateDataDir, + isSpaceAvailable = true, + requiredBytes = defaultFreeSpace, + freeBytes = defaultFreeSpace, + totalBytes = defaultTotalSpace + ) + } } @Test fun `request space from private storage wth allocation`() { val deviceStorage = buildInstance() - - val targetBytes = defaultFreeSpace + defaultAllocatableBytes - deviceStorage.checkSpacePrivateStorage(requiredBytes = targetBytes) shouldBe DeviceStorage.CheckResult( - path = privateDataDir, - isSpaceAvailable = true, - freeBytes = targetBytes, - totalBytes = defaultTotalSpace - ) + runBlocking { + val targetBytes = defaultFreeSpace + defaultAllocatableBytes + deviceStorage.checkSpacePrivateStorage(requiredBytes = targetBytes) shouldBe DeviceStorage.CheckResult( + path = privateDataDir, + isSpaceAvailable = true, + requiredBytes = targetBytes, + freeBytes = targetBytes, + totalBytes = defaultTotalSpace + ) + } verify { storageManager.allocateBytes(privateDataDirUUID, defaultAllocatableBytes) } } @@ -157,25 +163,29 @@ class DeviceStorageTest : BaseIOTest() { @Test fun `request space from private storage unsuccessfully`() { val deviceStorage = buildInstance() - - deviceStorage.checkSpacePrivateStorage(requiredBytes = Long.MAX_VALUE) shouldBe DeviceStorage.CheckResult( - path = privateDataDir, - isSpaceAvailable = false, - freeBytes = defaultFreeSpace, - totalBytes = defaultTotalSpace - ) + runBlocking { + deviceStorage.checkSpacePrivateStorage(requiredBytes = Long.MAX_VALUE) shouldBe DeviceStorage.CheckResult( + path = privateDataDir, + isSpaceAvailable = false, + freeBytes = defaultFreeSpace, + requiredBytes = Long.MAX_VALUE, + totalBytes = defaultTotalSpace + ) + } } @Test fun `request space from private storage unsuccessfully, sub API26`() { val deviceStorage = buildInstance(level = legacyApiLevel) - - deviceStorage.checkSpacePrivateStorage(requiredBytes = Long.MAX_VALUE) shouldBe DeviceStorage.CheckResult( - path = privateDataDir, - isSpaceAvailable = false, - freeBytes = defaultFreeSpace, - totalBytes = defaultTotalSpace - ) + runBlocking { + deviceStorage.checkSpacePrivateStorage(requiredBytes = Long.MAX_VALUE) shouldBe DeviceStorage.CheckResult( + path = privateDataDir, + isSpaceAvailable = false, + requiredBytes = Long.MAX_VALUE, + freeBytes = defaultFreeSpace, + totalBytes = defaultTotalSpace + ) + } } @Test @@ -183,13 +193,14 @@ class DeviceStorageTest : BaseIOTest() { every { storageManager.getUuidForPath(privateDataDir) } throws IOException("uh oh") val deviceStorage = buildInstance() - - deviceStorage.checkSpacePrivateStorage() shouldBe DeviceStorage.CheckResult( - path = privateDataDir, - isSpaceAvailable = true, - freeBytes = defaultFreeSpace, - totalBytes = defaultTotalSpace - ) + runBlocking { + deviceStorage.checkSpacePrivateStorage() shouldBe DeviceStorage.CheckResult( + path = privateDataDir, + isSpaceAvailable = true, + freeBytes = defaultFreeSpace, + totalBytes = defaultTotalSpace + ) + } verify { statsFsProvider.createStats(privateDataDir) } } @@ -199,7 +210,8 @@ class DeviceStorageTest : BaseIOTest() { every { statsFsProvider.createStats(privateDataDir) } throws IOException("uh oh") val deviceStorage = buildInstance(level = legacyApiLevel) - - shouldThrow<IOException> { deviceStorage.checkSpacePrivateStorage() } + runBlocking { + shouldThrow<IOException> { deviceStorage.checkSpacePrivateStorage() } + } } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/FileStorageConstantsTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/FileStorageConstantsTest.kt deleted file mode 100644 index a9d311996024332510d8f2d819c0957c82e66a7d..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/FileStorageConstantsTest.kt +++ /dev/null @@ -1,14 +0,0 @@ -package de.rki.coronawarnapp.storage - -import org.junit.Assert -import org.junit.Test - -class FileStorageConstantsTest { - - @Test - fun allFileStorageConstants() { - Assert.assertEquals(FileStorageConstants.DAYS_TO_KEEP, 14) - Assert.assertEquals(FileStorageConstants.FREE_SPACE_THRESHOLD, 15) - Assert.assertEquals(FileStorageConstants.KEY_EXPORT_DIRECTORY_NAME, "key-export") - } -} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/keycache/KeyCacheRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/keycache/KeyCacheRepositoryTest.kt deleted file mode 100644 index ea58f3a5f155af7b85c67342e2298870fabae25f..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/keycache/KeyCacheRepositoryTest.kt +++ /dev/null @@ -1,88 +0,0 @@ -package de.rki.coronawarnapp.storage.keycache - -import io.mockk.MockKAnnotations -import io.mockk.Runs -import io.mockk.coEvery -import io.mockk.coVerify -import io.mockk.coVerifyOrder -import io.mockk.impl.annotations.MockK -import io.mockk.just -import io.mockk.unmockkAll -import kotlinx.coroutines.runBlocking -import org.junit.After -import org.junit.Before -import org.junit.Test -import java.net.URI - -/** - * KeyCacheRepository test. - */ -class KeyCacheRepositoryTest { - - @MockK - private lateinit var keyCacheDao: KeyCacheDao - - private lateinit var keyCacheRepository: KeyCacheRepository - - @Before - fun setUp() { - MockKAnnotations.init(this) - keyCacheRepository = KeyCacheRepository(keyCacheDao) - - // DAO tests in another test - coEvery { keyCacheDao.getAllEntries() } returns listOf() - coEvery { keyCacheDao.getHours() } returns listOf() - coEvery { keyCacheDao.clear() } just Runs - coEvery { keyCacheDao.clearHours() } just Runs - coEvery { keyCacheDao.insertEntry(any()) } returns 0 - } - - /** - * Test clear order. - */ - @Test - fun testClear() { - runBlocking { - keyCacheRepository.clear() - - coVerifyOrder { - keyCacheDao.getAllEntries() - - keyCacheDao.clear() - } - } - - runBlocking { - keyCacheRepository.clearHours() - - coVerifyOrder { - keyCacheDao.getHours() - - keyCacheDao.clearHours() - } - } - } - - /** - * Test insert order. - */ - @Test - fun testInsert() { - runBlocking { - keyCacheRepository.createEntry( - key = "1", - type = KeyCacheRepository.DateEntryType.DAY, - uri = URI("1") - ) - - coVerify { - keyCacheDao.insertEntry(any()) - } - } - } - - @After - fun cleanUp() { - unmockkAll() - } -} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/RetrieveDiagnosisKeysTransactionTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/RetrieveDiagnosisKeysTransactionTest.kt index c2029628c093f7f36ab440854d2335c987aa736d..3a7e3e3d4dd2a19ec1b7c52d58454998eba2cd90 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/RetrieveDiagnosisKeysTransactionTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/transaction/RetrieveDiagnosisKeysTransactionTest.kt @@ -7,6 +7,7 @@ import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.util.GoogleAPIVersion import de.rki.coronawarnapp.util.di.AppInjector import de.rki.coronawarnapp.util.di.ApplicationComponent +import io.kotest.matchers.shouldBe import io.mockk.Runs import io.mockk.coEvery import io.mockk.coVerifyOrder @@ -17,6 +18,7 @@ import io.mockk.mockkObject import io.mockk.unmockkAll import kotlinx.coroutines.runBlocking import org.joda.time.Instant +import org.joda.time.LocalDate import org.junit.After import org.junit.Before import org.junit.Test @@ -70,16 +72,23 @@ class RetrieveDiagnosisKeysTransactionTest { @Test fun testTransactionNoFiles() { - coEvery { RetrieveDiagnosisKeysTransaction["executeFetchKeyFilesFromServer"](any<Date>()) } returns listOf<File>() + val requestedCountries = listOf("DE") + coEvery { + RetrieveDiagnosisKeysTransaction["executeFetchKeyFilesFromServer"]( + requestedCountries + ) + } returns listOf<File>() runBlocking { - RetrieveDiagnosisKeysTransaction.start() + RetrieveDiagnosisKeysTransaction.start(requestedCountries) coVerifyOrder { RetrieveDiagnosisKeysTransaction["executeSetup"]() RetrieveDiagnosisKeysTransaction["executeQuotaCalculation"]() RetrieveDiagnosisKeysTransaction["executeRetrieveRiskScoreParams"]() - RetrieveDiagnosisKeysTransaction["executeFetchKeyFilesFromServer"](any<Date>()) + RetrieveDiagnosisKeysTransaction["executeFetchKeyFilesFromServer"]( + requestedCountries + ) RetrieveDiagnosisKeysTransaction["executeFetchDateUpdate"](any<Date>()) } } @@ -88,19 +97,24 @@ class RetrieveDiagnosisKeysTransactionTest { @Test fun testTransactionHasFiles() { val file = Paths.get("src", "test", "resources", "keys.bin").toFile() + val requestedCountries = listOf("DE") - coEvery { RetrieveDiagnosisKeysTransaction["executeFetchKeyFilesFromServer"](any<Date>()) } returns listOf( - file - ) + coEvery { + RetrieveDiagnosisKeysTransaction["executeFetchKeyFilesFromServer"]( + requestedCountries + ) + } returns listOf(file) runBlocking { - RetrieveDiagnosisKeysTransaction.start() + RetrieveDiagnosisKeysTransaction.start(requestedCountries) coVerifyOrder { RetrieveDiagnosisKeysTransaction["executeSetup"]() RetrieveDiagnosisKeysTransaction["executeQuotaCalculation"]() RetrieveDiagnosisKeysTransaction["executeRetrieveRiskScoreParams"]() - RetrieveDiagnosisKeysTransaction["executeFetchKeyFilesFromServer"](any<Date>()) + RetrieveDiagnosisKeysTransaction["executeFetchKeyFilesFromServer"]( + requestedCountries + ) RetrieveDiagnosisKeysTransaction["executeAPISubmission"]( any<String>(), listOf(file), @@ -111,6 +125,11 @@ class RetrieveDiagnosisKeysTransactionTest { } } + @Test + fun `conversion from date to localdate`() { + LocalDate.fromDateFields(Date(0)) shouldBe LocalDate.parse("1970-01-01") + } + @After fun cleanUp() { unmockkAll() diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModelTest.kt index 805e975068920ae3916e0fc6f42bfa0cdfb12eb8..8f49bcb3f001e37e3e3012895d795f3217c9485b 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModelTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/SubmissionTanViewModelTest.kt @@ -1,6 +1,7 @@ package de.rki.coronawarnapp.ui.submission import de.rki.coronawarnapp.storage.SubmissionRepository +import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionTanViewModel import io.mockk.Runs import io.mockk.every import io.mockk.just diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/viewmodel/SubmissionCountrySelectViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/viewmodel/SubmissionCountrySelectViewModelTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..6fc0545edb85f385a0cbafe1fad98b23b3d1ed41 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/viewmodel/SubmissionCountrySelectViewModelTest.kt @@ -0,0 +1,59 @@ +package de.rki.coronawarnapp.ui.submission.viewmodel + +import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import de.rki.coronawarnapp.ui.submission.SubmissionCountry +import io.kotest.inspectors.forAll +import io.kotest.inspectors.forAtLeastOne +import io.kotest.inspectors.forAtMostOne +import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.shouldBe +import org.junit.Rule +import org.junit.Test + +class SubmissionCountrySelectViewModelTest { + @get:Rule + val instantTaskExecRule = InstantTaskExecutorRule() + + @Test + fun testFetchCountries() { + val viewModel = SubmissionCountrySelectViewModel() + + viewModel.fetchCountries() + // TODO: implement proper test one backend is merged + viewModel.countries.value!!.shouldHaveSize(2) + } + + @Test + fun testUpdateCountryCheckedState() { + val viewModel = SubmissionCountrySelectViewModel() + + viewModel.fetchCountries() + + viewModel.updateCountryCheckedState(SubmissionCountry("IT", true)) + viewModel.countries.value!!.forAtMostOne { + it.countryCode shouldBe "IT" + it.selected shouldBe true + } + + viewModel.updateCountryCheckedState(SubmissionCountry("IT", false)) + viewModel.countries.value!!.forAtLeastOne { + it.countryCode shouldBe "IT" + it.selected shouldBe false + } + } + + @Test + fun testNoInfoClickRemovesSelections() { + val viewModel = SubmissionCountrySelectViewModel() + + viewModel.fetchCountries() + + viewModel.updateCountryCheckedState(SubmissionCountry("IT", true)) + viewModel.updateCountryCheckedState(SubmissionCountry("ES", true)) + viewModel.countries.value!!.forAll { it.selected shouldBe true } + + viewModel.noInfoClick() + + viewModel.countries.value!!.forAll { it.selected shouldBe false } + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/CachedKeyFileHolderTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/CachedKeyFileHolderTest.kt deleted file mode 100644 index b03e57dd79478303134648a0bd26d9d8638d2b04..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/CachedKeyFileHolderTest.kt +++ /dev/null @@ -1,75 +0,0 @@ -package de.rki.coronawarnapp.util - -import android.content.Context -import de.rki.coronawarnapp.CoronaWarnApplication -import de.rki.coronawarnapp.storage.keycache.KeyCacheRepository -import io.mockk.MockKAnnotations -import io.mockk.Runs -import io.mockk.coEvery -import io.mockk.coVerifyOrder -import io.mockk.every -import io.mockk.impl.annotations.MockK -import io.mockk.just -import io.mockk.mockkObject -import io.mockk.unmockkAll -import kotlinx.coroutines.runBlocking -import org.junit.After -import org.junit.Before -import org.junit.Test -import java.util.Date - -/** - * CachedKeyFileHolder test. - */ -class CachedKeyFileHolderTest { - - @MockK - private lateinit var keyCacheRepository: KeyCacheRepository - - @MockK - private lateinit var context: Context - - @Before - fun setUp() { - MockKAnnotations.init(this) - mockkObject(CoronaWarnApplication.Companion) - mockkObject(KeyCacheRepository.Companion) - every { CoronaWarnApplication.getAppContext() } returns context - every { KeyCacheRepository.getDateRepository(any()) } returns keyCacheRepository - mockkObject(CachedKeyFileHolder) - coEvery { keyCacheRepository.deleteOutdatedEntries(any()) } just Runs - } - - /** - * Test call order is correct. - */ - @Test - fun testAsyncFetchFiles() { - val date = Date() - - coEvery { keyCacheRepository.getDates() } returns listOf() - coEvery { keyCacheRepository.getFilesFromEntries() } returns listOf() - every { CachedKeyFileHolder["isLast3HourFetchEnabled"]() } returns false - every { CachedKeyFileHolder["checkForFreeSpace"]() } returns Unit - every { CachedKeyFileHolder["getDatesFromServer"]() } returns arrayListOf<String>() - - runBlocking { - - CachedKeyFileHolder.asyncFetchFiles(date) - - coVerifyOrder { - CachedKeyFileHolder.asyncFetchFiles(date) - CachedKeyFileHolder["getDatesFromServer"]() - keyCacheRepository.deleteOutdatedEntries(any()) - CachedKeyFileHolder["getMissingDaysFromDiff"](arrayListOf<String>()) - keyCacheRepository.getDates() - keyCacheRepository.getFilesFromEntries() - } - } - } - - @After - fun cleanUp() { - unmockkAll() - } -} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/HashExtensionsTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/HashExtensionsTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..186d2973e59a9182febc4a7d656b0ad5f717e5a2 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/HashExtensionsTest.kt @@ -0,0 +1,60 @@ +package de.rki.coronawarnapp.util + +import de.rki.coronawarnapp.util.HashExtensions.hashToMD5 +import de.rki.coronawarnapp.util.HashExtensions.toMD5 +import de.rki.coronawarnapp.util.HashExtensions.toSHA1 +import de.rki.coronawarnapp.util.HashExtensions.toSHA256 +import io.kotest.matchers.shouldBe +import io.mockk.clearAllMocks +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseIOTest +import java.io.File + +class HashExtensionsTest : BaseIOTest() { + + private val testInput = "The Cake Is A Lie" + private val testDir = File(IO_TEST_BASEDIR, this::class.simpleName!!) + + @BeforeEach + fun setup() { + testDir.mkdirs() + } + + @AfterEach + fun teardown() { + clearAllMocks() + + testDir.deleteRecursively() + } + + @Test + fun `hash string to MD5`() { + testInput.toMD5() shouldBe "e42997e37d8d70d4927b0b396254c179" + } + + @Test + fun `hash string to SHA256`() { + testInput.toSHA256() shouldBe "3afc82e0c5df81d1733fe0c289538a1a1f7a5038d5c261860a5c83952f4bcb61" + } + + @Test + fun `hash string to SHA1`() { + testInput.toSHA1() shouldBe "4d57f806e5f714ebdb5a74a12fda9523fae21d76" + } + + @Test + fun `hash file to md5`() { + val fileName = "FileToMD5.txt" + val testFile = File(testDir, fileName) + try { + testFile.printWriter().use { out -> + out.println("This is a test") + } + testFile.hashToMD5() shouldBe "ff22941336956098ae9a564289d1bf1b" + } finally { + testFile.delete() + } + } +} diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/MockWebServerUtil.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/MockWebServerUtil.kt index 5a908210db83ae12f96e4b825b10dba3a53667a1..0dd704f73135ef01964264e3e2c9dbf281e69536 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/MockWebServerUtil.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/MockWebServerUtil.kt @@ -3,10 +3,8 @@ package de.rki.coronawarnapp.util import de.rki.coronawarnapp.http.HttpErrorParser import de.rki.coronawarnapp.http.WebRequestBuilder import de.rki.coronawarnapp.http.interceptor.RetryInterceptor -import de.rki.coronawarnapp.http.service.DistributionService import de.rki.coronawarnapp.http.service.SubmissionService import de.rki.coronawarnapp.http.service.VerificationService -import de.rki.coronawarnapp.util.security.VerificationKeys import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import okhttp3.mockwebserver.MockWebServer @@ -29,13 +27,10 @@ fun MockWebServer.newWebRequestBuilder(): WebRequestBuilder { .addConverterFactory(GsonConverterFactory.create()) return WebRequestBuilder( - retrofit.baseUrl(this.url("/distribution/")).build() - .create(DistributionService::class.java), retrofit.baseUrl(this.url("/verification/")).build() .create(VerificationService::class.java), retrofit.baseUrl(this.url("/submission/")).build() - .create(SubmissionService::class.java), - VerificationKeys() + .create(SubmissionService::class.java) ) } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/database/CommonConvertersTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/database/CommonConvertersTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..baddf45d799ea2f4ac86e26f6d0eb5bb48894bca --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/database/CommonConvertersTest.kt @@ -0,0 +1,105 @@ +/****************************************************************************** + * Corona-Warn-App * + * * + * SAP SE and all other contributors / * + * copyright owners license this file to you under the Apache * + * License, Version 2.0 (the "License"); you may not use this * + * file except in compliance with the License. * + * You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ******************************************************************************/ + +package de.rki.coronawarnapp.util.database + +import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode +import io.kotest.matchers.shouldBe +import org.joda.time.Instant +import org.joda.time.LocalDate +import org.joda.time.LocalTime +import org.junit.jupiter.api.Test +import testhelpers.BaseTest +import java.io.File +import java.util.UUID + +class CommonConvertersTest : BaseTest() { + private val converters = CommonConverters() + + @Test + fun `int list conversion`() { + converters.apply { + val orig = listOf(1, 2, 3) + val raw = "[1,2,3]" + fromIntList(orig) shouldBe raw + toIntList(raw) shouldBe orig + } + } + + @Test + fun `UUID conversion`() { + converters.apply { + val orig = UUID.fromString("123e4567-e89b-12d3-a456-426614174000") + val raw = "123e4567-e89b-12d3-a456-426614174000" + fromUUID(orig) shouldBe raw + toUUID(raw) shouldBe orig + } + } + + + @Test + fun `path conversion`() { + converters.apply { + val orig = File("/row/row/row/your/boat") + val raw = "/row/row/row/your/boat" + fromPath(orig) shouldBe raw + toPath(raw) shouldBe orig + } + } + + @Test + fun `local date conversion`() { + converters.apply { + val orig = LocalDate.parse("2222-12-31") + val raw = "2222-12-31" + fromLocalDate(orig) shouldBe raw + toLocalDate(raw) shouldBe orig + } + } + + @Test + fun `local time conversion`() { + converters.apply { + val orig = LocalTime.parse("23:59") + val raw = "23:59:00.000" + fromLocalTime(orig) shouldBe raw + toLocalTime(raw) shouldBe orig + } + } + + @Test + fun `instant conversion`() { + converters.apply { + val orig = Instant.EPOCH + val raw = "1970-01-01T00:00:00.000Z" + fromInstant(orig) shouldBe raw + toInstant(raw) shouldBe orig + } + } + + @Test + fun `LocationCode conversion`() { + converters.apply { + val orig = LocationCode("DE") + val raw = "DE" + fromLocationCode(orig) shouldBe raw + toLocationCode(raw) shouldBe orig + } + } +} diff --git a/Corona-Warn-App/src/testDeviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragmentCWAViewModelTest.kt b/Corona-Warn-App/src/testDeviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragmentCWAViewModelTest.kt index 404208e1bcf76dae9df8a49272dc801b00bfff52..5f04e64c371d04d92ade5ef94b9dbcab8ca59c4a 100644 --- a/Corona-Warn-App/src/testDeviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragmentCWAViewModelTest.kt +++ b/Corona-Warn-App/src/testDeviceForTesters/java/de/rki/coronawarnapp/test/risklevel/ui/TestRiskLevelCalculationFragmentCWAViewModelTest.kt @@ -3,6 +3,7 @@ package de.rki.coronawarnapp.test.risklevel.ui import android.content.Context import androidx.lifecycle.SavedStateHandle import com.google.android.gms.nearby.exposurenotification.ExposureNotificationClient +import de.rki.coronawarnapp.diagnosiskeys.storage.KeyCacheRepository import de.rki.coronawarnapp.transaction.RetrieveDiagnosisKeysTransaction import de.rki.coronawarnapp.transaction.RiskLevelTransaction import io.kotest.matchers.shouldBe @@ -29,6 +30,7 @@ class TestRiskLevelCalculationFragmentCWAViewModelTest : BaseTest() { @MockK lateinit var context: Context @MockK lateinit var savedStateHandle: SavedStateHandle @MockK lateinit var exposureNotificationClient: ExposureNotificationClient + @MockK lateinit var keyCacheRepository: KeyCacheRepository @BeforeEach fun setup() { @@ -38,6 +40,8 @@ class TestRiskLevelCalculationFragmentCWAViewModelTest : BaseTest() { coEvery { RetrieveDiagnosisKeysTransaction.start() } returns Unit mockkObject(RiskLevelTransaction) coEvery { RiskLevelTransaction.start() } returns Unit + + coEvery { keyCacheRepository.clear() } returns Unit } @AfterEach @@ -50,7 +54,8 @@ class TestRiskLevelCalculationFragmentCWAViewModelTest : BaseTest() { handle = savedStateHandle, exampleArg = exampleArgs, context = context, - exposureNotificationClient = exposureNotificationClient + exposureNotificationClient = exposureNotificationClient, + keyCacheRepository = keyCacheRepository ) @Test @@ -75,6 +80,15 @@ class TestRiskLevelCalculationFragmentCWAViewModelTest : BaseTest() { coVerify(exactly = 0) { RetrieveDiagnosisKeysTransaction.start() } } + @Test + fun `action clearDiagnosisKeys calls the keyCacheRepo`() { + val vm = createViewModel() + + vm.clearKeyCache() + + coVerify(exactly = 1) { keyCacheRepository.clear() } + } + @Test fun `action scanLocalQRCodeAndProvide, triggers event`() { val vm = createViewModel() diff --git a/Server-Protocol-Buffer/src/main/proto/applicationConfiguration.proto b/Server-Protocol-Buffer/src/main/proto/applicationConfiguration.proto index a840bcd6aa94bea18886a3eb6f19bb17538a6be0..a686d33cbdddab5dbc94f4ad53a34414a4ae805f 100644 --- a/Server-Protocol-Buffer/src/main/proto/applicationConfiguration.proto +++ b/Server-Protocol-Buffer/src/main/proto/applicationConfiguration.proto @@ -12,6 +12,8 @@ message ApplicationConfiguration { AttenuationDuration attenuationDuration = 4; ApplicationVersionConfiguration appVersion = 5; + + repeated string supportedCountries = 6; } message RiskScoreParameters {