Skip to content
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ import de.westnordost.streetcomplete.quests.charging_station_bicycles.AddChargin
import de.westnordost.streetcomplete.quests.charging_station_capacity.AddChargingStationBicycleCapacity
import de.westnordost.streetcomplete.quests.charging_station_capacity.AddChargingStationCapacity
import de.westnordost.streetcomplete.quests.charging_station_operator.AddChargingStationOperator
import de.westnordost.streetcomplete.quests.charging_station_socket.AddChargingStationSocket
import de.westnordost.streetcomplete.quests.clothing_bin_operator.AddClothingBinOperator
import de.westnordost.streetcomplete.quests.construction.MarkCompletedBuildingConstruction
import de.westnordost.streetcomplete.quests.construction.MarkCompletedHighwayConstruction
Expand Down Expand Up @@ -429,6 +430,7 @@ fun questTypeRegistry(
87 to AddChargingStationCapacity(), // after question for bicycles because user has possibility to answer that it is only for bicycles
179 to AddChargingStationBicycleCapacity(),
88 to AddChargingStationOperator(),
197 to AddChargingStationSocket(),

// postboxes (collection times are further up, see comment)
89 to AddPostboxRoyalCypher(), // can be glanced across the road (if postbox facing the right way)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package de.westnordost.streetcomplete.quests.charging_station_socket

import de.westnordost.streetcomplete.R
import de.westnordost.streetcomplete.data.elementfilter.toElementFilterExpression
import de.westnordost.streetcomplete.data.osm.geometry.ElementGeometry
import de.westnordost.streetcomplete.data.osm.mapdata.Element
import de.westnordost.streetcomplete.data.osm.mapdata.MapDataWithGeometry
import de.westnordost.streetcomplete.data.osm.osmquests.OsmElementQuestType
import de.westnordost.streetcomplete.data.quest.AndroidQuest
import de.westnordost.streetcomplete.data.quest.NoCountriesExcept
import de.westnordost.streetcomplete.data.user.achievements.EditTypeAchievement.CAR
import de.westnordost.streetcomplete.osm.Tags

class AddChargingStationSocket :
OsmElementQuestType<List<SocketCount>>,
AndroidQuest {

private val filter by lazy {
"""
nodes, ways with
amenity = charging_station
and bicycle != yes
and motorcar != no
Comment on lines +22 to +25
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to ask for man_made=charge_point as well, and exclude all amenity=charging_station areas that contain a man_made=charge_point? Or is that too difficult or not worth the effort?

My thinking is that for bigger charging stations that are mapped as areas with separate charge points, it is much easier to answer the quest for the charge points individually than having to sum up all sockets from all charge points to answer the quest once for the whole charging station.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, should be possible like this:

val hasChargePointsInside = mapData
                    .filter("nodes with man_made = charge_point")
                    .any { cp ->
                        val cpGeom =
                            mapData.getGeometry(cp.type, cp.id) ?: return@any false
                        bounds.contains(cpGeom.center)
                    }

                if (hasChargePointsInside) return@filter false

https://github.com/Helium314/SCEE/pull/889/changes#diff-659bd9b32ad4bc8e3781b27b07e58d6923a9eb7d4109f4c832587a65ad60b8baR55

""".toElementFilterExpression()
}

override val enabledInCountries = NoCountriesExcept(
"AT","BE","BG","HR","CY","CZ","DE","DK","EE","ES","FI","FR","GB",
"GR","HU","IE","IS","IT","LI","LT","LU","LV","MT","NL","NO",
"PL","PT","RO","SE","SI","SK"
)

override val changesetComment = "Specify charging station sockets"
override val wikiLink = "Key:socket"
override val icon = R.drawable.quest_charger_socket
override val achievements = listOf(CAR)

override fun getTitle(tags: Map<String, String>) =
R.string.quest_charging_station_socket_title

override fun createForm() = AddChargingStationSocketForm()

override fun applyAnswerTo(
answer: List<SocketCount>,
tags: Tags,
geometry: ElementGeometry,
timestampEdited: Long
) {
answer.forEach { it.applyTo(tags) }
}

override fun getApplicableElements(mapData: MapDataWithGeometry): Iterable<Element> =
mapData.filter { isApplicableTo(it) }

override fun isApplicableTo(element: Element): Boolean {
if (!filter.matches(element)) return false
return true
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package de.westnordost.streetcomplete.quests.charging_station_socket

import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AlertDialog
import androidx.compose.material.Surface
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.snapshotFlow
import androidx.lifecycle.lifecycleScope
import de.westnordost.streetcomplete.R
import de.westnordost.streetcomplete.databinding.ComposeViewBinding
import de.westnordost.streetcomplete.quests.AbstractOsmQuestForm
import de.westnordost.streetcomplete.ui.util.content
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach

class AddChargingStationSocketForm :
AbstractOsmQuestForm<List<SocketCount>>() {

override val contentLayoutResId = R.layout.compose_view
private val binding by contentViewBinding(ComposeViewBinding::bind)

private var selectedTypes = mutableStateListOf<SocketType>()
private var socketCounts = mutableStateListOf<SocketCount>()

private val maxSockets = 50

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

snapshotFlow { socketCounts.toList() }
.onEach { checkIsFormComplete() }
.launchIn(lifecycleScope)

binding.composeViewBase.content {
Surface {
ChargingSocketMultiStepForm(
selectedTypes = selectedTypes,
socketCounts = socketCounts,
onTypeSelected = { type ->
if (!selectedTypes.contains(type)) {
selectedTypes.add(type)
}
},
onTypeDeselected = { type ->
selectedTypes.remove(type)
socketCounts.removeAll { it.type == type }
},
onCountChanged = { type, count ->
socketCounts.removeAll { it.type == type }
socketCounts.add(SocketCount(type, count))
}
)
}
}
}

override fun onClickOk() {
if (socketCounts.any { it.count <= 0 || it.count > maxSockets }) {
confirmUnusualInput {
applyAnswer(socketCounts)
}
} else {
applyAnswer(socketCounts)
}
}

override fun isFormComplete(): Boolean =
socketCounts.isNotEmpty() &&
socketCounts.all { it.count > 0 }

private fun confirmUnusualInput(callback: () -> Unit) {
activity?.let {
AlertDialog.Builder(it)
.setTitle(R.string.quest_generic_confirmation_title)
.setMessage(R.string.quest_maxweight_unusualInput_confirmation_description)
.setPositiveButton(R.string.quest_generic_confirmation_yes) { _, _ -> callback() }
.setNegativeButton(R.string.quest_generic_confirmation_no, null)
.show()
}
}
}
41 changes: 41 additions & 0 deletions app/src/androidMain/res/drawable/quest_charger_socket.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="128dp"
android:height="128dp"
android:viewportWidth="128"
android:viewportHeight="128">
<path
android:pathData="M128,64c0,35.3-28.7,64-64,64S0,99.3,0,64,28.7,0,64,0s64,28.7,64,64"
android:fillColor="#FFDD55"/>
<path
android:pathData="M67.4,122.1c-.8,2.8.6,6.4,7.5,4.9,6.2-15,6.4-27.1,7.2-42.6,3.9-1,6.8-4.6,6.8-8.8v-3.6c2.7-1.6,4.5-4.5,4.5-7.9v-16c2.5,0,4.5-2.1,4.5-4.6,0-2.5-2.1-4.6-4.6-4.6h-2.3v-25.1c0-1.3-1-2.3-2.3-2.3s-2.3,1-2.3,2.3v25.1H68.1V14c0-1.3-1-2.3-2.3-2.3s-2.3,1-2.3,2.3v25.1h-2.2c-2.5,0-4.6,2.1-4.5,4.6,0,2.5,2.1,4.6,4.6,4.5v16c0,3.4,1.9,6.3,4.7,7.8v3.6c0,4.3,3,7.8,6.9,8.8,0,3.5-.1,15.2-3.4,29.3"
android:fillColor="#000000"
android:fillAlpha="0.2"/>
<path
android:pathData="M68.2,37.4c0,1.3-1,2.3-2.3,2.3s-2.3-1-2.3-2.3V10c0-1.3,1-2.3,2.3-2.3s2.3,1,2.3,2.3v27.4Z"
android:fillColor="#9AAAB4"/>
<path
android:pathData="M91.1,37.3c0,1.3-1,2.3-2.3,2.3s-2.3-1-2.3-2.3V9.9c0-1.3,1-2.3,2.3-2.3s2.3,1,2.3,2.3v27.4Z"
android:fillColor="#9AAAB4"/>
<path
android:pathData="M82.1,80.4c3.9-1,6.8-4.6,6.8-8.8v-3.6c2.7-1.6,4.5-4.5,4.5-7.9v-16c2.5,0,4.5-2.1,4.5-4.6,0-2.5-2.1-4.6-4.6-4.6h-32c-2.5,0.1-4.6,2.2-4.5,4.7,0,2.5,2.1,4.6,4.6,4.5v16c0,3.4,1.9,6.3,4.7,7.8v3.6c0,4.3,3,7.8,6.9,8.8,0,4.9-.2,26.3-9.2,47.5,2.2,0.2,8.4-.5,9.2-.6,6.9-11.5,8.3-31.4,9.1-46.9Z"
android:fillColor="#444444"/>
<path
android:pathData="M74.1,45.9l-4.1,11.8,4.9-.9-2.1,10.8,14.9-15.6-9.9,1.9,6-9.8-9.9,1.9Z"
android:fillColor="#FFDD55"/>
<path
android:pathData="M56.4,91.6l7.3-7.3-24.7-24.7-1.5,1.5-11.8-12.2c-.7-.8-2-.8-2.7,0-.8.7-.8,2,0,2.7l11.8,12.2-10.8,10.8-12-12.4c-.7-.8-2-.8-2.7,0-.8.7-.8,2,0,2.7l12,12.4-2.3,2.3,24.7,24.7,7.4-7.4c3.2,3.5,15.9,16.4,15.8,23.1,1-2.9,2-7,3.3-7.2-1.9-9.5-7.9-14.1-13.7-21.3Z"
android:fillColor="#000000"
android:fillAlpha="0.2"/>
<path
android:pathData="M27.9,74.7c.7.8.7,2,0,2.7s-2,.7-2.7,0l-16-16.5c-.7-.8-.7-2,0-2.7.8-.7,2-.7,2.7,0l16,16.5Z"
android:fillColor="#9AAAB4"/>
<path
android:pathData="M41.6,61.4c.7.8.7,2,0,2.7s-2,.7-2.7,0l-16-16.5c-.7-.8-.7-2,0-2.7.8-.7,2-.7,2.7,0l16,16.5Z"
android:fillColor="#9AAAB4"/>
<path
android:pathData="M73.3,118.2c-1.9-9.5-11.1-23.4-16.9-30.6l7.3-7.3-24.7-24.7-20,20,24.7,24.7,7.4-7.4c3.2,3.5,16.4,19,16.3,25.8,2.4,0,4.8-.4,6-.5Z"
android:fillColor="#444444"/>
<path
android:pathData="M33.2,73.6l4.4,9.5,2.4-3.4,5,7.7V69.3l-4.9,6.9-2.1-9.4-4.9,6.9Z"
android:fillColor="#FFDD55"/>
</vector>
7 changes: 7 additions & 0 deletions app/src/androidMain/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1056,6 +1056,13 @@ A level counts as a roof level when its windows are in the roof. Subsequently, r

<string name="quest_charging_station_operator_title">Who is the operator of this charging station?</string>

<string name="quest_charging_station_socket_title">Which sockets does this charging station have?</string>
<string name="quest_charging_station_socket_type2">Type 2 (Mennekes)</string>
<string name="quest_charging_station_socket_type2_cable">Type 2 (Mennekes) Cable</string>
<string name="quest_charging_station_socket_type2_combo">Type 2 Combo (CCS)</string>
<string name="quest_charging_station_socket_chademo">CHAdeMO</string>
<string name="quest_charging_station_socket_domestic">Household-plug</string>

<string name="quest_clothes_container_operator_title">Who accepts donations for this clothing bin?</string>

<string name="quest_construction_building_title">Is this building completed?</string>
Expand Down
39 changes: 39 additions & 0 deletions app/src/commonMain/composeResources/drawable/socket_chademo.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="106dp"
android:height="100dp"
android:viewportWidth="106"
android:viewportHeight="100">
<path
android:fillColor="#FF000000"
android:pathData="M30.1,99.5l-7.4,-12.9l7.4,-12.9l14.9,0l7.4,12.9l-7.4,12.9l-14.9,0z"/>
<path
android:fillColor="#FF000000"
android:pathData="M44.7,74.2l7.1,12.4 -7.1,12.4h-14.3l-7.1,-12.4 7.1,-12.4h14.3M45.3,73.2h-15.4l-7.7,13.4 7.7,13.4h15.4l7.7,-13.4 -7.7,-13.4h0Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M61,99.5l-7.4,-12.9l7.4,-12.9l14.9,0l7.4,12.9l-7.4,12.9l-14.9,0z"/>
<path
android:fillColor="#FF000000"
android:pathData="M75.6,74.2l7.1,12.4 -7.1,12.4h-14.3l-7.1,-12.4 7.1,-12.4h14.3M76.2,73.2h-15.4l-7.7,13.4 7.7,13.4h15.4l7.7,-13.4 -7.7,-13.4h0Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M80.9,27.9c0,13.5 -9.6,25 -22.8,27.4 -14.9,2.8 -29.6,-7.1 -32.4,-22 -1.3,-6.9 -0.3,-13.4 3.2,-19.5 0.1,-0.3 0.2,-0.6 0.1,-0.9 -0.3,-1.3 -0.6,-2.6 -0.9,-3.9 -0.1,-0.4 0,-0.7 0.3,-1 1.6,-1.6 3.2,-3.2 4.8,-4.8 0.3,-0.3 0.5,-0.4 0.9,-0.2 0.9,0.4 1.8,0.7 2.6,1.1 0.7,0.3 1.3,0.3 2,-0.1C43.6,1.1 48.9,-0.3 54.6,0c4.6,0.2 9.1,1.7 13.1,4.2 0.4,0.3 0.8,0.3 1.2,0 1,-0.4 2.1,-0.8 3.1,-1.3 0.4,-0.2 0.6,-0.1 0.9,0.2 1.6,1.7 3.3,3.3 4.9,4.9 0.2,0.3 0.3,0.6 0.2,0.9 -0.3,1.3 -0.7,2.7 -0.9,4 0,0.3 0,0.7 0.1,1 2.4,4.3 3.7,8.9 3.6,13.9ZM53.1,4.1c-12.7,-0.2 -23.9,10.2 -24,23.7 0,13.2 10.7,23.9 23.8,24 12.8,0.1 24,-10.3 24,-23.8 0,-13.7 -11.2,-24.1 -23.9,-24Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M33.8,27.6c0,-4.5 3.5,-8.1 8,-8.1 0,0 0.1,0 0.2,0 4.5,0 8.1,3.7 8.1,8.1 0,4.5 -3.7,8.1 -8.3,8.1 -4.5,0 -8.1,-3.8 -8,-8.1ZM36.8,27.6c0,2.9 2.3,5.2 5.1,5.2 2.8,0 5.2,-2.4 5.2,-5.2s-2.4,-5.1 -5.2,-5.1c-2.8,0 -5.2,2.3 -5.2,5.2 0,0 0,0 0,0h0Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M72.2,27.6c0,4.6 -3.6,8.1 -8.2,8.1 -4.1,0 -8,-3.2 -8,-8.1 0,-5 4.1,-8.2 8.2,-8.1 4.5,0 8.1,3.6 8.1,8.1 0,0 0,0 0,0ZM69.2,27.6c0,-2.9 -2.3,-5.2 -5.1,-5.2 0,0 0,0 0,0 -2.8,0 -5.2,2.4 -5.2,5.2 0,2.8 2.4,5.2 5.1,5.2 2.9,0 5.2,-2.3 5.2,-5.1Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M52.9,36.7c3.1,0 5.7,2.5 5.7,5.6 0,0 0,0 0,0 0,3 -2.4,5.7 -5.7,5.7 -3.2,0 -5.7,-2.6 -5.7,-5.8s2.6,-5.7 5.8,-5.7ZM52.9,37.7c-2.6,0 -4.7,2.1 -4.7,4.7s2.1,4.7 4.7,4.7 4.7,-2.2 4.7,-4.7 -2.1,-4.7 -4.7,-4.7h0Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M55.6,39.7l-0.6,-0.4l-2.1,2.6l-2,-2.6l-0.5,0.3l2.1,2.9l-2.2,2.8l0.5,0.4l2.1,-2.7l2.1,2.8l0.5,-0.4l-2.2,-2.9l2.3,-2.8z"/>
<path
android:fillColor="#FF000000"
android:pathData="M52.9,7.7c3.1,0 5.7,2.5 5.7,5.6 0,0 0,0 0,0 0,3 -2.4,5.7 -5.7,5.7 -3.2,0 -5.7,-2.6 -5.7,-5.8s2.6,-5.7 5.8,-5.7ZM52.9,8.7c-2.6,0 -4.7,2.1 -4.7,4.7s2.1,4.7 4.7,4.7 4.7,-2.2 4.7,-4.7 -2.1,-4.7 -4.7,-4.7h0Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M55.6,10.7l-0.6,-0.4l-2.1,2.7l-2,-2.7l-0.5,0.4l2.1,2.8l-2.2,2.9l0.5,0.4l2.1,-2.7l2.1,2.7l0.5,-0.4l-2.2,-2.9l2.3,-2.8z"/>
</vector>
15 changes: 15 additions & 0 deletions app/src/commonMain/composeResources/drawable/socket_domestic.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="106dp"
android:height="100dp"
android:viewportWidth="106"
android:viewportHeight="100">
<path
android:fillColor="#FF000000"
android:pathData="M78.7,17.1C72.7,2.9 56.4,-3.8 42.2,2.2c-14.2,6 -20.9,22.3 -14.9,36.5s22.3,20.9 36.5,14.9c10.3,-4.4 17.1,-14.5 17.1,-25.7 0,-3.7 -0.7,-7.4 -2.2,-10.8ZM56.7,50.6v-3.9c0,-0.3 -0.2,-0.5 -0.5,-0.5h-6.2c-0.3,0 -0.5,0.2 -0.5,0.5v3.9c-11,-1.8 -19.4,-11.3 -19.4,-22.7S38.5,6.9 49.4,5.2v3.9c0,0.3 0.2,0.5 0.5,0.5h6.2c0.3,0 0.5,-0.2 0.5,-0.5 0,0 0,0 0,0v-3.9c11,1.8 19.4,11.3 19.4,22.7s-8.4,21 -19.4,22.7Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M41.2,27.9m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"/>
<path
android:fillColor="#FF000000"
android:pathData="M65,27.9m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"/>
</vector>
33 changes: 33 additions & 0 deletions app/src/commonMain/composeResources/drawable/socket_type2.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="106dp"
android:height="100dp"
android:viewportWidth="106"
android:viewportHeight="100">
<path
android:fillColor="#FF000000"
android:pathData="M60.1,74.2l7.1,12.4 -7.1,12.4h-14.3l-7.1,-12.4 7.1,-12.4h14.3M60.7,73.2h-15.4l-7.7,13.4 7.7,13.4h15.4l7.7,-13.4 -7.7,-13.4h0Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M53,0h14c1.6,0 3.1,0.3 4.6,0.9 1.8,0.7 3,2.1 4.1,3.6 3,4.1 4.7,9 5.1,14.1 1.2,13.6 -8.1,26.3 -21.4,29.3 -14.7,3.3 -29.1,-5.1 -33.1,-19.6 -2.6,-9.5 -0.7,-18.1 5.6,-25.7 1.2,-1.4 2.9,-2.1 4.7,-2.4 1,-0.2 2,-0.3 3.1,-0.3 4.5,0 8.9,0 13.4,0ZM39.6,4.1c-2,0.3 -3.9,1 -5.2,2.7 -4.4,5.9 -5.9,12.5 -4.3,19.6 2.8,12.4 15,20.2 27.5,17.8 10.4,-2 18.3,-11 18.9,-21.5 0.3,-5.3 -1,-10.3 -4,-14.7 -1.8,-2.7 -4.3,-3.9 -7.5,-3.9 -4,0 -8,0 -12,0h-13.5Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M39.8,27.9c-2.9,0 -5.3,-2.5 -5.2,-5.4 0,-2.9 2.4,-5.2 5.2,-5.2 2.9,0 5.3,2.3 5.4,5.2s-2.3,5.3 -5.2,5.4c0,0 -0.1,0 -0.2,0ZM39.8,19.2c-1.9,0 -3.4,1.5 -3.4,3.3 0,0 0,0 0,0 0,1.8 1.5,3.3 3.4,3.4 1.9,0 3.4,-1.5 3.4,-3.4 0,0 0,0 0,0 0,-1.8 -1.4,-3.3 -3.2,-3.4 0,0 0,0 -0.1,0h0Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M58.3,22.6c0,2.9 -2.3,5.2 -5.2,5.3 0,0 0,0 -0.1,0 -2.9,0 -5.3,-2.4 -5.3,-5.3 0,-2.9 2.4,-5.3 5.3,-5.3 2.9,0 5.3,2.4 5.3,5.3 0,0 0,0 0,0ZM53,19.2c-1.9,0 -3.4,1.5 -3.4,3.4 0,1.9 1.5,3.4 3.4,3.4 0,0 0,0 0,0 1.9,0 3.4,-1.5 3.4,-3.4 0,-1.9 -1.5,-3.3 -3.4,-3.3h0Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M66.2,27.9c-2.9,0 -5.3,-2.3 -5.3,-5.2 0,0 0,0 0,0 0,-3 2.3,-5.4 5.2,-5.4 2.9,0 5.3,2.3 5.4,5.2 0,0 0,0 0,0 0,3 -2.3,5.4 -5.3,5.4ZM66.2,19.2c-1.9,0 -3.4,1.5 -3.4,3.4 0,1.8 1.6,3.4 3.4,3.4 1.8,0 3.4,-1.6 3.4,-3.4 0,-1.8 -1.5,-3.4 -3.4,-3.4Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M46.4,39.7c-2.8,0 -5.1,-2.2 -5.1,-5 0,0 0,-0.1 0,-0.2 0,-2.8 2.3,-5.2 5.2,-5.2 2.8,0 5.2,2.4 5.2,5.2 0,2.8 -2.3,5.1 -5.2,5.1 0,0 0,0 0,0ZM49.7,34.5c0,-1.8 -1.4,-3.2 -3.2,-3.2 0,0 0,0 0,0 -1.8,0 -3.2,1.5 -3.3,3.3 0,1.8 1.5,3.2 3.3,3.3 1.8,0 3.3,-1.5 3.3,-3.3 0,0 0,0 0,0Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M59.6,39.7c-2.8,0 -5.1,-2.2 -5.2,-5 0,0 0,-0.1 0,-0.2 0,-2.9 2.3,-5.2 5.2,-5.2s5.2,2.3 5.2,5.2c0,2.8 -2.2,5.1 -5,5.2 0,0 0,0 -0.1,0ZM59.6,31.2c-1.8,0 -3.3,1.4 -3.3,3.2 0,1.7 1.5,3.3 3.3,3.3 1.8,0 3.2,-1.5 3.3,-3.3 0,-1.8 -1.5,-3.2 -3.3,-3.3Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M50.2,12.8c0,2.1 -1.7,3.8 -3.8,3.8 -2.1,0 -3.8,-1.7 -3.8,-3.8h0c0,-2.1 1.8,-3.8 3.8,-3.8 2.1,0 3.7,1.7 3.8,3.8ZM49.1,12.9c0,-1.5 -1.1,-2.7 -2.6,-2.8 -1.5,0 -2.7,1.1 -2.8,2.6s1.1,2.7 2.6,2.8c0,0 0,0 0,0 1.5,0 2.7,-1.1 2.7,-2.6Z"/>
<path
android:fillColor="#FF000000"
android:pathData="M55.8,12.8c0,-2.1 1.7,-3.7 3.8,-3.7 2.1,0 3.7,1.7 3.7,3.8 0,2 -1.7,3.7 -3.7,3.7 -2.1,0 -3.8,-1.7 -3.8,-3.8ZM59.5,15.5c1.5,0 2.7,-1.2 2.7,-2.6 0,-1.4 -1.2,-2.7 -2.6,-2.7 -1.5,0 -2.7,1.1 -2.7,2.6 0,1.5 1.1,2.7 2.6,2.7h0Z"/>
</vector>
Loading