From b6d0eb35655890bd4a8eb4eff297fb1ed6e78e89 Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Sat, 21 Feb 2026 13:39:50 -0800 Subject: [PATCH] fully fixed markers --- .../Accessory Manager/AccessoryManager.swift | 2 +- .../Helpers/TAK/TAKMeshtasticBridge.swift | 748 +++++++++++++----- 2 files changed, 564 insertions(+), 186 deletions(-) diff --git a/Meshtastic/Accessory/Accessory Manager/AccessoryManager.swift b/Meshtastic/Accessory/Accessory Manager/AccessoryManager.swift index fa1211ae..0e1c5a84 100644 --- a/Meshtastic/Accessory/Accessory Manager/AccessoryManager.swift +++ b/Meshtastic/Accessory/Accessory Manager/AccessoryManager.swift @@ -526,7 +526,7 @@ class AccessoryManager: ObservableObject, MqttClientProxyManagerDelegate { bridge.context = AccessoryManager.shared.context server.bridge = bridge } - await server.bridge?.broadcastMeshTextMessageToTAK(text: text, from: packet.from, channel: packet.channel) + await server.bridge?.broadcastMeshTextMessageToTAK(text: text, from: packet.from, channel: packet.channel, to: packet.to) } } case .remoteHardwareApp: diff --git a/Meshtastic/Helpers/TAK/TAKMeshtasticBridge.swift b/Meshtastic/Helpers/TAK/TAKMeshtasticBridge.swift index a38b43e0..e455f1cf 100644 --- a/Meshtastic/Helpers/TAK/TAKMeshtasticBridge.swift +++ b/Meshtastic/Helpers/TAK/TAKMeshtasticBridge.swift @@ -610,7 +610,12 @@ final class TAKMeshtasticBridge { /// Broadcast a Meshtastic text message to connected TAK clients /// Called when a text message is received from the mesh - func broadcastMeshTextMessageToTAK(text: String, from nodeNum: UInt32, channel: UInt32) async { + /// - Parameters: + /// - text: The message text + /// - from: The sender node number + /// - channel: The channel index + /// - to: The destination node number (UInt32.max for broadcast) + func broadcastMeshTextMessageToTAK(text: String, from nodeNum: UInt32, channel: UInt32, to destination: UInt32) async { // Lazy initialization of bridge if needed if TAKServerManager.shared.bridge == nil { Logger.tak.info("Initializing bridge lazily for text message broadcast") @@ -632,8 +637,21 @@ final class TAKMeshtasticBridge { let senderName = user.longName ?? user.shortName ?? "Unknown" let uid = "MSG-\(nodeNum)-\(Int(Date().timeIntervalSince1970))" + // Determine if this is a DM or broadcast + let isDirectMessage = destination != UInt32.max + + // For now, send all messages to general chat but mark DMs in the message + let chatroom = "All Chat Rooms" + + Logger.tak.info("Text message: isDM=\(isDirectMessage), chatroom=\(chatroom), from=\(senderName)") + + let senderUid = "MESHTASTIC-\(String(format: "%08X", nodeNum))" + + // Prefix DM messages with "DM:" so users know it's a direct message + let messageText = isDirectMessage ? "DM: \(text)" : text + let cotMessage = CoTMessage( - uid: "GeoChat.MESHTASTIC-\(String(format: "%08X", nodeNum)).Channel\(channel).\(uid)", + uid: "GeoChat.\(senderUid).\(chatroom.replacingOccurrences(of: " ", with: "_")).\(uid)", type: "b-t-f", time: Date(), start: Date(), @@ -644,16 +662,17 @@ final class TAKMeshtasticBridge { hae: 9999999.0, ce: 9999999.0, le: 9999999.0, + contact: CoTContact(callsign: senderName, endpoint: "0.0.0.0:4242:tcp"), chat: CoTChat( - message: text, + message: messageText, senderCallsign: senderName, - chatroom: "All Chat Rooms" + chatroom: chatroom ), - remarks: text + remarks: messageText ) await server.broadcast(cotMessage) - Logger.tak.info("Broadcast mesh text message to TAK: \(senderName)") + Logger.tak.info("Broadcast mesh text message to TAK: \(senderName) to \(chatroom)") } /// Broadcast a Meshtastic waypoint to connected TAK clients @@ -701,7 +720,6 @@ final class TAKMeshtasticBridge { // Map Meshtastic emoji icon to appropriate TAK icon let (cotType, iconPath, colorArgb) = getTakIconForWaypoint(waypoint: waypoint) let userIconXML = "" - let colorXML = "" Logger.tak.info("Waypoint icon: emoji=0x\(String(format: "%08X", waypoint.icon)) -> \(iconPath)") // Handle expiry - if expire is 0, never expire. Otherwise use the expire time @@ -722,8 +740,8 @@ final class TAKMeshtasticBridge { } } - // Include the usericon and color in the detail - let rawDetail = "\(userIconXML)\(colorXML)" + // Include the usericon in the detail (no color to avoid background in TAKware) + let rawDetail = "\(userIconXML)" let cotMessage = CoTMessage( uid: uid, @@ -746,296 +764,656 @@ final class TAKMeshtasticBridge { Logger.tak.info("Broadcast mesh waypoint to TAK: \(name) from \(senderName)") } - /// Map Meshtastic waypoint emoji to TAK icon using Google markers + /// Map Meshtastic waypoint emoji to TAK icon /// Returns (cotType, iconPath, colorArgb) - /// Google markers are the only reliable icon type across all TAK clients (ATAK, iTAK, WinTAK) - /// Icons sourced from iconsets.sqlite database - Google iconset (UUID: f7f71666-8b28-4b57-9fbb-e38e61d33b79) + /// Icon paths use format: UUID/Category/icon.png + /// Priority: Google > Generic Icons (fallback) private func getTakIconForWaypoint(waypoint: Waypoint) -> (String, String, String) { let icon = waypoint.icon - // Google marker base UUID - let googleBase = "f7f71666-8b28-4b57-9fbb-e38e61d33b79/Google" + // Icon set UUIDs + let googleUUID = "f7f71666-8b28-4b57-9fbb-e38e61d33b79" + let genericUUID = "ad78aafb-83a6-4c07-b2b9-a897a8b6a38f" switch icon { // 📍 📌 Pushpin - RED pushpin (default) case 0x1F4CD, 0x1F4CC, 1: // 📍 📌 - return ("a-u-G", "\(googleBase)/red-pushpin.png", "-16776961") + return ("a-u-G", "\(genericUUID)/Tacks/red-pushpin.png", "-16776961") // === EMERGENCY === - // đŸ”Ĩ Fire - firedept + // đŸ”Ĩ Fire - Google firedept case 0x1F525, 10: // đŸ”Ĩ - return ("a-u-G", "\(googleBase)/firedept.png", "-16776961") - // 🚨 Siren - caution + return ("a-u-G", "\(googleUUID)/Google/firedept.png", "-16776961") + // 🚨 Siren - Google caution case 0x1F6A8, 6: // 🚨 - return ("a-u-G", "\(googleBase)/caution.png", "-256") - // đŸĨ Hospital - hospitals + return ("a-u-G", "\(googleUUID)/Google/caution.png", "-256") + // đŸĨ Hospital - Google hospitals case 0x1F3E5, 0x2695, 9: // đŸĨ ➕ - return ("a-u-G", "\(googleBase)/hospitals.png", "-16776961") - // 🚑 Ambulance - use hospitals + return ("a-u-G", "\(googleUUID)/Google/hospitals.png", "-16776961") + // 🚑 Ambulance - Google hospitals (no ambulance in Google) case 0x1F691: // 🚑 - return ("a-u-G", "\(googleBase)/hospitals.png", "-16776961") - // âš ī¸ Warning - caution + return ("a-u-G", "\(googleUUID)/Google/hospitals.png", "-16776961") + // âš ī¸ Warning - Google caution case 0x26A0: // âš ī¸ - return ("a-u-G", "\(googleBase)/caution.png", "-256") - // 🚓 Police - police + return ("a-u-G", "\(googleUUID)/Google/caution.png", "-256") + // 🚓 Police - Google police case 0x1F693: // 🚓 - return ("a-u-G", "\(googleBase)/police.png", "-16776961") + return ("a-u-G", "\(googleUUID)/Google/police.png", "-16776961") + // 🏃 Runner - Google man + case 0x1F3C3: // 🏃 + return ("a-u-G", "\(googleUUID)/Google/man.png", "-16711936") + // 💀 Skull - Google caution + case 0x1F480: // 💀 + return ("a-u-G", "\(googleUUID)/Google/caution.png", "-1") + // đŸ’Ŗ Bomb - Google caution + case 0x1F4A3: // đŸ’Ŗ + return ("a-u-G", "\(googleUUID)/Google/caution.png", "-16776961") // === TRANSPORT === - // 🚗 Car - bus (closest available) + // 🚗 Car - Google bus (closest) case 0x1F697, 0x1F695, 2: // 🚗 🚕 - return ("a-u-G", "\(googleBase)/bus.png", "-256") - // 🚁 Helicopter - heliport + return ("a-u-G", "\(googleUUID)/Google/bus.png", "-256") + // 🚁 Helicopter - Google heliport case 0x1F681, 11: // 🚁 - return ("a-u-G", "\(googleBase)/heliport.png", "-16776961") - // â›ĩ Boat - marina + return ("a-u-G", "\(googleUUID)/Google/heliport.png", "-16776961") + // â›ĩ Boat - Google marina case 0x1F6B5, 12: // â›ĩ - return ("a-u-G", "\(googleBase)/marina.png", "-16776961") - // đŸšĸ Ship - use marina + return ("a-u-G", "\(googleUUID)/Google/marina.png", "-16776961") + // đŸšĸ Ship - Google marina case 0x1F6A2: // đŸšĸ - return ("a-u-G", "\(googleBase)/marina.png", "-16776961") - // 🚀 Rocket - use target + return ("a-u-G", "\(googleUUID)/Google/marina.png", "-16776961") + // 🚀 Rocket - Google target case 0x1F680: // 🚀 - return ("a-u-G", "\(googleBase)/target.png", "-16776961") - // 🛸 UFO - use purple pushpin + return ("a-u-G", "\(googleUUID)/Google/target.png", "-16776961") + // 🛸 UFO - Generic purple pushpin case 0x1F6B5, 13: // 🛸 - return ("a-u-G", "\(googleBase)/purple-pushpin.png", "-65281") - // 🚲 Bicycle - cycling + return ("a-u-G", "\(genericUUID)/Tacks/purple-pushpin.png", "-65281") + // 🚲 Bicycle - Google cycling case 0x1F6B2: // 🚲 - return ("a-u-G", "\(googleBase)/cycling.png", "-16711936") - // 🚆 Train - rail + return ("a-u-G", "\(googleUUID)/Google/cycling.png", "-16711936") + // 🚆 Train - Google rail case 0x1F686: // 🚆 - return ("a-u-G", "\(googleBase)/rail.png", "-16711936") - // âœˆī¸ Plane - airports + return ("a-u-G", "\(googleUUID)/Google/rail.png", "-16711936") + // âœˆī¸ Plane - Google airports case 0x2708: // âœˆī¸ - return ("a-u-G", "\(googleBase)/airports.png", "-16776961") + return ("a-u-G", "\(googleUUID)/Google/airports.png", "-16776961") + // 🚛 Truck - Google bus + case 0x1F69A: // 🚛 + return ("a-u-G", "\(googleUUID)/Google/bus.png", "-16711936") + // 🚌 Bus - Google bus + case 0x1F68C: // 🚌 + return ("a-u-G", "\(googleUUID)/Google/bus.png", "-256") // === PLACES === - // 🏨 Hotel - lodging + // 🏨 Hotel - Google lodging case 0x1F3E8: // 🏨 - return ("a-u-G", "\(googleBase)/lodging.png", "-16776961") - // đŸĒ Store - convenience + return ("a-u-G", "\(googleUUID)/Google/lodging.png", "-16776961") + // đŸĒ Store - Google convenience case 0x1F3EA: // đŸĒ - return ("a-u-G", "\(googleBase)/convenience.png", "-16711936") - // â›Ŋ Gas - gas_stations + return ("a-u-G", "\(googleUUID)/Google/convenience.png", "-16711936") + // â›Ŋ Gas - Google gas_stations case 0x1F6FD: // â›Ŋ - return ("a-u-G", "\(googleBase)/gas_stations.png", "-16776961") + return ("a-u-G", "\(googleUUID)/Google/gas_stations.png", "-16776961") + // 🏰 Castle - Google info + case 0x1F3F0: // 🏰 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸ›ī¸ Government - Google info + case 0x1F3DB: // đŸ›ī¸ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // ⛲ Fountain - Generic fountain (use info) + case 0x1F6F1: // ⛲ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸžī¸ Park - Google parks + case 0x1F3DE: // đŸžī¸ + return ("a-u-G", "\(googleUUID)/Google/parks.png", "-16711936") // === PEOPLE === - // đŸšļ Person - hiker + // đŸšļ Person - Google hiker case 0x1F464, 0x1F465, 3: // 👤 đŸ‘Ĩ - return ("a-u-G", "\(googleBase)/hiker.png", "-16711936") - // 🏃 Runner - use man - case 0x1F3C3: // 🏃 - return ("a-u-G", "\(googleBase)/man.png", "-16711936") + return ("a-u-G", "\(googleUUID)/Google/hiker.png", "-16711936") // === STRUCTURES === - // 🏠 House - use homegardenbusiness + // 🏠 House - Google homegardenbusiness case 0x1F3E0, 0x1F3E1, 4: // 🏠 🏡 - return ("a-u-G", "\(googleBase)/homegardenbusiness.png", "-16711936") - // â›ē Tent - campground + return ("a-u-G", "\(googleUUID)/Google/homegardenbusiness.png", "-16711936") + // â›ē Tent - Google campground case 0x26FA, 0x1F3D5, 5: // â›ē 🏕 - return ("a-u-G", "\(googleBase)/campground.png", "-256") - // 🏰 Castle - use info - case 0x1F3F0: // 🏰 - return ("a-u-G", "\(googleBase)/info.png", "-16776961") + return ("a-u-G", "\(googleUUID)/Google/campground.png", "-256") + // đŸšī¸ Abandoned - Google info + case 0x1F6DA: // đŸšī¸ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸ—ī¸ Construction - Google caution + case 0x1F6D7: // đŸ—ī¸ + return ("a-u-G", "\(googleUUID)/Google/caution.png", "-16776961") + // 🏭 Factory - Google info + case 0x1F3ED: // 🏭 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") - // === NATURE === - // 🌲 Tree - parks + // === NATURE / TERRAIN === + // 🌲 Tree - Google parks case 0x1F332: // 🌲 - return ("a-u-G", "\(googleBase)/parks.png", "-16711936") - // đŸŒŗ Tree - parks + return ("a-u-G", "\(googleUUID)/Google/parks.png", "-16711936") + // đŸŒŗ Tree - Google parks case 0x1F333: // đŸŒŗ - return ("a-u-G", "\(googleBase)/parks.png", "-16711936") - // đŸ”ī¸ Mountain - use cross-hairs + return ("a-u-G", "\(googleUUID)/Google/parks.png", "-16711936") + // đŸ”ī¸ Mountain - Google cross-hairs case 0x1F3D4: // đŸ”ī¸ - return ("a-u-G", "\(googleBase)/cross-hairs.png", "-1") - // â›°ī¸ Mountain - use cross-hairs + return ("a-u-G", "\(googleUUID)/Google/cross-hairs.png", "-1") + // â›°ī¸ Mountain - Google cross-hairs case 0x26F0: // â›°ī¸ - return ("a-u-G", "\(googleBase)/cross-hairs.png", "-1") - // 💧 Water - water + return ("a-u-G", "\(googleUUID)/Google/cross-hairs.png", "-1") + // 💧 Water - Google water case 0x1F4A7: // 💧 - return ("a-u-G", "\(googleBase)/water.png", "-16776961") - // 🌊 Wave - water + return ("a-u-G", "\(googleUUID)/Google/water.png", "-16776961") + // 🌊 Wave - Google water case 0x1F30A: // 🌊 - return ("a-u-G", "\(googleBase)/water.png", "-16776961") - // â˜ī¸ Cloud - partly_cloudy + return ("a-u-G", "\(googleUUID)/Google/water.png", "-16776961") + // â˜ī¸ Cloud - Google partly_cloudy case 0x2601, 0x2602: // ☁ ☂ - return ("a-u-G", "\(googleBase)/partly_cloudy.png", "-1") - // 🌙 Moon - use star + return ("a-u-G", "\(googleUUID)/Google/partly_cloudy.png", "-1") + // 🌙 Moon - Google star case 0x1F319: // 🌙 - return ("a-u-G", "\(googleBase)/star.png", "-16776961") - // ⚓ Anchor - use marina + return ("a-u-G", "\(googleUUID)/Google/star.png", "-16776961") + // ⚓ Anchor - Google marina case 0x2693: // ⚓ - return ("a-u-G", "\(googleBase)/marina.png", "-16776961") - // ⭐ Star - star + return ("a-u-G", "\(googleUUID)/Google/marina.png", "-16776961") + // ⭐ Star - Google star case 0x2B50, 0x1F31F: // ⭐ 🌟 - return ("a-u-G", "\(googleBase)/star.png", "-256") + return ("a-u-G", "\(googleUUID)/Google/star.png", "-256") + // 🌞 Sun - Google sunny + case 0x1F31E: // 🌞 + return ("a-u-G", "\(googleUUID)/Google/sunny.png", "-256") // === FLAGS/MARKERS === - // 🚩 Flag - flag + // 🚩 Flag - Google flag case 0x1F6A9: // 🚩 - return ("a-u-G", "\(googleBase)/flag.png", "-16776961") - // 🏁 Checkered flag - use flag + return ("a-u-G", "\(googleUUID)/Google/flag.png", "-16776961") + // 🏁 Checkered flag - Google flag case 0x1F3C1, 7: // 🏁 - return ("a-u-G", "\(googleBase)/flag.png", "-1") + return ("a-u-G", "\(googleUUID)/Google/flag.png", "-1") + // 🎌 Flags - Google flag + case 0x1F38C: // 🎌 + return ("a-u-G", "\(googleUUID)/Google/flag.png", "-16776961") // === OBJECTS === - // 📷 Camera + // 📷 Camera - Google camera case 0x1F4F7: // 📷 - return ("a-u-G", "\(googleBase)/camera.png", "-16711936") - // 🔒 Lock - use info + return ("a-u-G", "\(googleUUID)/Google/camera.png", "-16711936") + // 🔒 Lock - Google info case 0x1F512: // 🔒 - return ("a-u-G", "\(googleBase)/info.png", "-16711936") - // 🔑 Key - use info + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16711936") + // 🔑 Key - Google info case 0x1F511: // 🔑 - return ("a-u-G", "\(googleBase)/info.png", "-16711936") - // đŸ“Ļ Package - use shopping + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16711936") + // đŸ“Ļ Package - Google shopping case 0x1F4E6: // đŸ“Ļ - return ("a-u-G", "\(googleBase)/shopping.png", "-16711936") - // 🚧 Construction - caution + return ("a-u-G", "\(googleUUID)/Google/shopping.png", "-16711936") + // 🚧 Construction - Google caution case 0x1F6A7: // 🚧 - return ("a-u-G", "\(googleBase)/caution.png", "-256") - // đŸŽ¯ Target - target + return ("a-u-G", "\(googleUUID)/Google/caution.png", "-256") + // đŸŽ¯ Target - Google target case 0x1F3AF: // đŸŽ¯ - return ("a-u-G", "\(googleBase)/target.png", "-16776961") - // 🏹 Sports bow - use target + return ("a-u-G", "\(googleUUID)/Google/target.png", "-16776961") + // 🏹 Sports bow - Google target case 0x1F3F9: // 🏹 - return ("a-u-G", "\(googleBase)/target.png", "-16776961") - // đŸ’Ŗ Bomb - use caution - case 0x1F4A3: // đŸ’Ŗ - return ("a-u-G", "\(googleBase)/caution.png", "-16776961") - // 🔧 Wrench - use mechanic + return ("a-u-G", "\(googleUUID)/Google/target.png", "-16776961") + // 🔧 Wrench - Google mechanic case 0x1F527: // 🔧 - return ("a-u-G", "\(googleBase)/mechanic.png", "-16711936") - // đŸ› ī¸ Tools - use mechanic + return ("a-u-G", "\(googleUUID)/Google/mechanic.png", "-16711936") + // đŸ› ī¸ Tools - Google mechanic case 0x1F6E0: // đŸ› ī¸ - return ("a-u-G", "\(googleBase)/mechanic.png", "-16711936") - // 📮 Post box - post_office + return ("a-u-G", "\(googleUUID)/Google/mechanic.png", "-16711936") + // 📮 Post box - Google post_office case 0x1F4EE: // 📮 - return ("a-u-G", "\(googleBase)/post_office.png", "-16776961") - // 💎 Gem - use star + return ("a-u-G", "\(googleUUID)/Google/post_office.png", "-16776961") + // 💎 Gem - Google star case 0x1F48E: // 💎 - return ("a-u-G", "\(googleBase)/star.png", "-16776961") - // 🔔 Bell - use info + return ("a-u-G", "\(googleUUID)/Google/star.png", "-16776961") + // 🔔 Bell - Google info case 0x1F514: // 🔔 - return ("a-u-G", "\(googleBase)/info.png", "-256") - // đŸ—ē Map - use marker + return ("a-u-G", "\(googleUUID)/Google/info.png", "-256") + // đŸ—ē Map - Generic placemark_circle case 0x1F5FA: // đŸ—ē - return ("a-u-G", "\(googleBase)/placemark_circle.png", "-1") - // 🎁 Gift - use shopping + return ("a-u-G", "\(genericUUID)/Shapes/placemark_circle.png", "-1") + // 🎁 Gift - Google shopping case 0x1F381: // 🎁 - return ("a-u-G", "\(googleBase)/shopping.png", "-16776961") - // 💀 Skull - use caution - case 0x1F480: // 💀 - return ("a-u-G", "\(googleBase)/caution.png", "-1") - // â„ī¸ Snowflake - snowflake_simple + return ("a-u-G", "\(googleUUID)/Google/shopping.png", "-16776961") + // â„ī¸ Snowflake - Google snowflake_simple case 0x2744: // ❄ - return ("a-u-G", "\(googleBase)/snowflake_simple.png", "-1") - // â˜‚ī¸ Umbrella - use sunny + return ("a-u-G", "\(googleUUID)/Google/snowflake_simple.png", "-1") + // â˜‚ī¸ Umbrella - Google sunny case 0x26F1: // ⛱ - return ("a-u-G", "\(googleBase)/sunny.png", "-16776961") - // 💡 Light - use info + return ("a-u-G", "\(googleUUID)/Google/sunny.png", "-16776961") + // 💡 Light - Google info-i case 0x1F4A1: // 💡 - return ("a-u-G", "\(googleBase)/info-i.png", "-256") - // 🔋 Battery - use bars + return ("a-u-G", "\(googleUUID)/Google/info-i.png", "-256") + // 🔋 Battery - Google bars case 0x1F50B: // 🔋 - return ("a-u-G", "\(googleBase)/bars.png", "-16711936") - // đŸ“ģ Radio - radio + return ("a-u-G", "\(googleUUID)/Google/bars.png", "-16711936") + // đŸ“ģ Radio - Google radio case 0x1F4FB: // đŸ“ģ - return ("a-u-G", "\(googleBase)/radio.png", "-16711936") - // 📞 Phone - phone + return ("a-u-G", "\(googleUUID)/Google/radio.png", "-16711936") + // 📞 Phone - Google phone case 0x1F4DE, 0x1F4F1: // 📞 📱 - return ("a-u-G", "\(googleBase)/phone.png", "-16711936") - // đŸ’Ĩ Collision - caution + return ("a-u-G", "\(googleUUID)/Google/phone.png", "-16711936") + // đŸ’Ĩ Collision - Google caution case 0x1F4A5: // đŸ’Ĩ - return ("a-u-G", "\(googleBase)/caution.png", "-16776961") + return ("a-u-G", "\(googleUUID)/Google/caution.png", "-16776961") + // đŸ”Ļ Flashlight - Google sunny + case 0x1F526: // đŸ”Ļ + return ("a-u-G", "\(googleUUID)/Google/sunny.png", "-16711936") + // đŸ•¯ī¸ Candle - Google sunny + case 0x1F56F: // đŸ•¯ī¸ + return ("a-u-G", "\(googleUUID)/Google/sunny.png", "-16776961") + // đŸ“ē TV - Google camera + case 0x1F4FA: // đŸ“ē + return ("a-u-G", "\(googleUUID)/Google/camera.png", "-16711936") + // 💾 Disk - Google info + case 0x1F4BE: // 💾 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16711936") + // 📀 DVD - Google info + case 0x1F4C0: // 📀 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸ–Ĩī¸ Computer - Google info + case 0x1F5A5: // đŸ–Ĩī¸ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16711936") + // âŒ¨ī¸ Keyboard - Google info + case 0x1F5A8: // âŒ¨ī¸ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16711936") + // đŸ–ąī¸ Mouse - Google info + case 0x1F5B1: // đŸ–ąī¸ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16711936") // === SYMBOLS === - // â¤ī¸ Heart - use flag + // â¤ī¸ Heart - Google flag case 0x2764, 0x1F493, 0x1F49A, 0x1F499: // â¤ī¸ 💓 💚 💙 - return ("a-u-G", "\(googleBase)/flag.png", "-16776961") - // ✅ Check - use star + return ("a-u-G", "\(googleUUID)/Google/flag.png", "-16776961") + // ✅ Check - Google star case 0x2705, 0x1F7E2: // ✅ đŸŸĸ - return ("a-u-G", "\(googleBase)/star.png", "-16711936") - // ❌ X - use caution + return ("a-u-G", "\(googleUUID)/Google/star.png", "-16711936") + // ❌ X - Google caution case 0x274C, 0x1F6AB: // ❌ đŸšĢ - return ("a-u-G", "\(googleBase)/caution.png", "-16776961") + return ("a-u-G", "\(googleUUID)/Google/caution.png", "-16776961") + // ➰ Curly loop - Google trail + case 0x1F0: // ➰ + return ("a-u-G", "\(googleUUID)/Google/trail.png", "-16776961") + // âžŋ Double curly loop - Google trail + case 0x1F1F: // âžŋ + return ("a-u-G", "\(googleUUID)/Google/trail.png", "-16776961") // === WEATHER === - // đŸŒ¤ī¸ Sun behind cloud - partlycloudy + // đŸŒ¤ī¸ Sun behind cloud - Google partly_cloudy case 0x1F324: // đŸŒ¤ī¸ - return ("a-u-G", "\(googleBase)/partly_cloudy.png", "-256") - // đŸŒ§ī¸ Rain - rainy + return ("a-u-G", "\(googleUUID)/Google/partly_cloudy.png", "-256") + // đŸŒ§ī¸ Rain - Google rainy case 0x1F327: // đŸŒ§ī¸ - return ("a-u-G", "\(googleBase)/rainy.png", "-16776961") - // đŸŒ¨ī¸ Snow - use snowflake + return ("a-u-G", "\(googleUUID)/Google/rainy.png", "-16776961") + // đŸŒ¨ī¸ Snow - Google snowflake_simple case 0x1F328: // đŸŒ¨ī¸ - return ("a-u-G", "\(googleBase)/snowflake_simple.png", "-1") - // đŸŒŠī¸ Lightning - use caution + return ("a-u-G", "\(googleUUID)/Google/snowflake_simple.png", "-1") + // đŸŒŠī¸ Lightning - Google caution case 0x1F329: // 🌩 - return ("a-u-G", "\(googleBase)/caution.png", "-256") - // 🌀 Cyclone - use windy + return ("a-u-G", "\(googleUUID)/Google/caution.png", "-256") + // 🌀 Cyclone - Google sunny case 0x1F300: // 🌀 - return ("a-u-G", "\(googleBase)/sunny.png", "-16776961") - // 🌈 Rainbow - use star + return ("a-u-G", "\(googleUUID)/Google/sunny.png", "-16776961") + // 🌈 Rainbow - Google star case 0x1F308: // 🌈 - return ("a-u-G", "\(googleBase)/star.png", "-16776961") - // đŸŒĒī¸ Tornado - use caution + return ("a-u-G", "\(googleUUID)/Google/star.png", "-16776961") + // đŸŒĒī¸ Tornado - Google caution case 0x1F32A: // đŸŒĒī¸ - return ("a-u-G", "\(googleBase)/caution.png", "-1") + return ("a-u-G", "\(googleUUID)/Google/caution.png", "-1") + // 🌋 Volcano - Google volcano + case 0x1F30B: // 🌋 + return ("a-u-G", "\(googleUUID)/Google/volcano.png", "-16776961") + // đŸœī¸ Desert - Google parks + case 0x1F3DC: // đŸœī¸ + return ("a-u-G", "\(googleUUID)/Google/parks.png", "-16776961") + // đŸŒĢī¸ Fog - Google partly_cloudy + case 0x1F32B: // đŸŒĢī¸ + return ("a-u-G", "\(googleUUID)/Google/partly_cloudy.png", "-16776961") + // đŸŒŦī¸ Wind - Google partly_cloudy + case 0x1F32C: // đŸŒŦī¸ + return ("a-u-G", "\(googleUUID)/Google/partly_cloudy.png", "-16711936") // === GLOBE === - // 🌍 Globe - use marker + // 🌍 Globe - Generic placemark_circle case 0x1F30D, 0x1F30E, 0x1F30F, 0x1F310: // 🌍 🌎 🌏 🌐 - return ("a-u-G", "\(googleBase)/placemark_circle.png", "-16776961") + return ("a-u-G", "\(genericUUID)/Shapes/placemark_circle.png", "-16776961") + // đŸ—ēī¸ Map - Generic placemark_square + case 0x1F5FA: // đŸ—ē + return ("a-u-G", "\(genericUUID)/Shapes/placemark_square.png", "-16776961") + // 🧭 Compass - Generic compass (use trail) + case 0x1F6AD: // 🧭 + return ("a-u-G", "\(googleUUID)/Google/trail.png", "-16776961") // === FOOD === - // 🍔 Burger - dining + // 🍔 Burger - Google dining case 0x1F354: // 🍔 - return ("a-u-G", "\(googleBase)/dining.png", "-256") - // 🍕 Pizza - dining + return ("a-u-G", "\(googleUUID)/Google/dining.png", "-256") + // 🍕 Pizza - Google dining case 0x1F355: // 🍕 - return ("a-u-G", "\(googleBase)/dining.png", "-256") - // ☕ Coffee - coffee + return ("a-u-G", "\(googleUUID)/Google/dining.png", "-256") + // ☕ Coffee - Google coffee case 0x2615: // ☕ - return ("a-u-G", "\(googleBase)/coffee.png", "-256") - // đŸē Beer - bars + return ("a-u-G", "\(googleUUID)/Google/coffee.png", "-256") + // đŸē Beer - Google bars case 0x1F37A: // đŸē - return ("a-u-G", "\(googleBase)/bars.png", "-256") - // 🍷 Wine - use bar + return ("a-u-G", "\(googleUUID)/Google/bars.png", "-256") + // 🍷 Wine - Google bars case 0x1F377: // 🍷 - return ("a-u-G", "\(googleBase)/bars.png", "-65281") + return ("a-u-G", "\(googleUUID)/Google/bars.png", "-65281") + // đŸĨ— Salad - Google dining + case 0x1F957: // đŸĨ— + return ("a-u-G", "\(googleUUID)/Google/dining.png", "-16711936") + // đŸŋ Popcorn - Google movies + case 0x1F37F: // đŸŋ + return ("a-u-G", "\(googleUUID)/Google/movies.png", "-16776961") + // 🍩 Donut - Google donut + case 0x1F369: // 🍩 + return ("a-u-G", "\(googleUUID)/Google/donut.png", "-16776961") + // đŸĒ Cookie - Google donut + case 0x1F36A: // đŸĒ + return ("a-u-G", "\(googleUUID)/Google/donut.png", "-16776961") + // đŸĢ Chocolate - Google donut + case 0x1F36B: // đŸĢ + return ("a-u-G", "\(googleUUID)/Google/donut.png", "-16776961") + // đŸŦ Candy - Google donut + case 0x1F36C: // đŸŦ + return ("a-u-G", "\(googleUUID)/Google/donut.png", "-16776961") + // 🍭 Lollipop - Google donut + case 0x1F36D: // 🍭 + return ("a-u-G", "\(googleUUID)/Google/donut.png", "-16776961") + // đŸĻ Ice Cream - Google donut + case 0x1F368: // đŸĻ + return ("a-u-G", "\(googleUUID)/Google/donut.png", "-16776961") + // đŸĨ¤ Cup - Google coffee + case 0x1F964: // đŸĨ¤ + return ("a-u-G", "\(googleUUID)/Google/coffee.png", "-16776961") + // đŸĩ Tea - Google coffee + case 0x1F375: // đŸĩ + return ("a-u-G", "\(googleUUID)/Google/coffee.png", "-16711936") + // đŸĨƒ Whiskey - Google bars + case 0x1F943: // đŸĨƒ + return ("a-u-G", "\(googleUUID)/Google/bars.png", "-16776961") + // đŸĨ‚ Cheers - Google bars + case 0x1F942: // đŸĨ‚ + return ("a-u-G", "\(googleUUID)/Google/bars.png", "-16776961") + // 🍾 Bottle - Google bars + case 0x1F37E: // 🍾 + return ("a-u-G", "\(googleUUID)/Google/bars.png", "-16776961") // === RECREATION === - // đŸŽŖ Fishing + // đŸŽŖ Fishing - Google fishing case 0x1F3A3: // đŸŽŖ - return ("a-u-G", "\(googleBase)/fishing.png", "-16776961") - // â›ŗ Golf + return ("a-u-G", "\(googleUUID)/Google/fishing.png", "-16776961") + // â›ŗ Golf - Google golf case 0x1F3CC: // â›ŗ - return ("a-u-G", "\(googleBase)/golf.png", "-16711936") - // â›ˇī¸ Ski + return ("a-u-G", "\(googleUUID)/Google/golf.png", "-16711936") + // â›ˇī¸ Ski - Google ski case 0x1F3BF: // â›ˇī¸ - return ("a-u-G", "\(googleBase)/ski.png", "-16711936") - // 🏊 Swimming + return ("a-u-G", "\(googleUUID)/Google/ski.png", "-16711936") + // 🏊 Swimming - Google swimming case 0x1F3CA: // 🏊 - return ("a-u-G", "\(googleBase)/swimming.png", "-16776961") - // 🏄 Surfing + return ("a-u-G", "\(googleUUID)/Google/swimming.png", "-16776961") + // 🏄 Surfing - Google swimming case 0x1F3C4: // 🏄 - return ("a-u-G", "\(googleBase)/swimming.png", "-16776961") - // đŸŽŖ Fish - fishing + return ("a-u-G", "\(googleUUID)/Google/swimming.png", "-16776961") + // 🐟 Fish - Google fishing case 0x1F41F: // 🐟 - return ("a-u-G", "\(googleBase)/fishing.png", "-16776961") - // 🌾 Rice - farm + return ("a-u-G", "\(googleUUID)/Google/fishing.png", "-16776961") + // 🌾 Farm - Google parks case 0x1F33E: // 🌾 - return ("a-u-G", "\(googleBase)/golf.png", "-16711936") - // 🐄 Farm animal - use golf + return ("a-u-G", "\(googleUUID)/Google/parks.png", "-16711936") + // 🐄 Farm Animal - Google parks case 0x1F404: // 🐄 - return ("a-u-G", "\(googleBase)/golf.png", "-16711936") + return ("a-u-G", "\(googleUUID)/Google/parks.png", "-16711936") + // 🐕 Dog - Google hiker + case 0x1F415: // 🐕 + return ("a-u-G", "\(googleUUID)/Google/hiker.png", "-16711936") + // 🐈 Cat - Google hiker + case 0x1F431: // 🐈 + return ("a-u-G", "\(googleUUID)/Google/hiker.png", "-16711936") + // 🐓 Rooster - Google info + case 0x1F413: // 🐓 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻ… Eagle - Google info + case 0x1F425: // đŸĻ… + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻ‹ Butterfly - Google info + case 0x1F98B: // đŸĻ‹ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐝 Bee - Google info + case 0x1F41D: // 🐝 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐞 Beetle - Google info + case 0x1F41E: // 🐞 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻ€ Crab - Google fishing + case 0x1F980: // đŸĻ€ + return ("a-u-G", "\(googleUUID)/Google/fishing.png", "-16776961") + // đŸĻž Lobster - Google fishing + case 0x1F99E: // đŸĻž + return ("a-u-G", "\(googleUUID)/Google/fishing.png", "-16776961") + // 🐚 Shell - Google fishing + case 0x1F41A: // 🐚 + return ("a-u-G", "\(googleUUID)/Google/fishing.png", "-16776961") + // 🐙 Octopus - Google fishing + case 0x1F419: // 🐙 + return ("a-u-G", "\(googleUUID)/Google/fishing.png", "-16776961") + // đŸĻ‘ Squid - Google fishing + case 0x1F991: // đŸĻ‘ + return ("a-u-G", "\(googleUUID)/Google/fishing.png", "-16776961") + // 🐌 Snail - Google info + case 0x1F98C: // 🐌 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻŽ Lizard - Google info + case 0x1F98E: // đŸĻŽ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐍 Snake - Google info + case 0x1F40D: // 🐍 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻ– T-Rex - Google info + case 0x1F996: // đŸĻ– + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻ• Sauropod - Google info + case 0x1F995: // đŸĻ• + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻˆ Shark - Google fishing + case 0x1F988: // đŸĻˆ + return ("a-u-G", "\(googleUUID)/Google/fishing.png", "-16776961") + // đŸŗ Whale - Google water + case 0x1F433: // đŸŗ + return ("a-u-G", "\(googleUUID)/Google/water.png", "-16776961") + // đŸŦ Dolphin - Google water + case 0x1F42C: // đŸŦ + return ("a-u-G", "\(googleUUID)/Google/water.png", "-16776961") + // 🐊 Crocodile - Google water + case 0x1F40A: // 🐊 + return ("a-u-G", "\(googleUUID)/Google/water.png", "-16776961") + // 🐆 Leopard - Google info + case 0x1F406: // 🐆 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐅 Tiger - Google info + case 0x1F405: // 🐅 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐃 Buffalo - Google info + case 0x1F403: // 🐃 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐂 Ox - Google info + case 0x1F402: // 🐂 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐎 Horse - Google info + case 0x1F434: // 🐎 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐏 Ram - Google info + case 0x1F40F: // 🐏 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐑 Sheep - Google info + case 0x1F411: // 🐑 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐐 Goat - Google info + case 0x1F410: // 🐐 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻ™ Llama - Google info + case 0x1F999: // đŸĻ™ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐕‍đŸĻē Service Dog - Google hiker + case 0x1F9BA: // 🐕‍đŸĻē + return ("a-u-G", "\(googleUUID)/Google/hiker.png", "-16776961") + // 🐩 Poodle - Google hiker + case 0x1F429: // 🐩 + return ("a-u-G", "\(googleUUID)/Google/hiker.png", "-16776961") + // 🐈‍âŦ› Black Cat - Google hiker + case 0x1F408: // 🐈‍âŦ› + return ("a-u-G", "\(googleUUID)/Google/hiker.png", "-16776961") + // đŸĻ Raccoon - Google info + case 0x1F99D: // đŸĻ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻŠ Fox - Google info + case 0x1F98A: // đŸĻŠ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸģ Bear - Google info + case 0x1F43B: // đŸģ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸŧ Panda - Google info + case 0x1F43C: // đŸŧ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐨 Koala - Google info + case 0x1F428: // 🐨 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸ¯ Tiger - Google info + case 0x1F42F: // đŸ¯ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻ Lion - Google info + case 0x1F981: // đŸĻ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐮 Cow - Google info + case 0x1F42E: // 🐮 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐷 Pig - Google info + case 0x1F437: // 🐷 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐖 Pig (big) - Google info + case 0x1F416: // 🐖 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐗 Boar - Google info + case 0x1F417: // 🐗 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🐘 Elephant - Google info + case 0x1F418: // 🐘 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻ Rhino - Google info + case 0x1F98F: // đŸĻ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻ› Hippo - Google info + case 0x1F99B: // đŸĻ› + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻ’ Giraffe - Google info + case 0x1F992: // đŸĻ’ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻŦ Bison - Google info + case 0x1F9AC: // đŸĻŦ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻŖ Mammoth - Google info + case 0x1F9A3: // đŸĻŖ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻŒ Deer - Google info + case 0x1F98C: // đŸĻŒ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĻŒ Moose - Google info + case 0x1F98D: // đŸĻŒ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + + // === INFRASTRUCTURE === + // 🚩 Checkpoint - Google flag + case 0x1F6A6: // 🚩 + return ("a-u-G", "\(googleUUID)/Google/flag.png", "-16776961") + // ⛔ No Entry - Google caution + case 0x1F6D1: // ⛔ + return ("a-u-G", "\(googleUUID)/Google/caution.png", "-16776961") + // 🛑 Stop - Google caution + case 0x1F6D1: // 🛑 + return ("a-u-G", "\(googleUUID)/Google/caution.png", "-16776961") + // đŸ•ī¸ Base Camp - Google campground + case 0x1F6D1: // đŸ•ī¸ + return ("a-u-G", "\(googleUUID)/Google/campground.png", "-16776961") + // đŸĸ Office Building - Google homegardenbusiness + case 0x1F3E2: // đŸĸ + return ("a-u-G", "\(googleUUID)/Google/homegardenbusiness.png", "-16776961") + // đŸŦ Bank - Google info + case 0x1F3E6: // đŸŦ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸĨ Hospital - Google hospitals + case 0x1F3E5: // đŸĨ + return ("a-u-G", "\(googleUUID)/Google/hospitals.png", "-16776961") + // 🏨 Hotel - Google lodging + case 0x1F3E8: // 🏨 + return ("a-u-G", "\(googleUUID)/Google/lodging.png", "-16776961") + // 🏩 Love Hotel - Google lodging + case 0x1F3E9: // 🏩 + return ("a-u-G", "\(googleUUID)/Google/lodging.png", "-16776961") + // đŸ›¤ī¸ Railway - Google rail + case 0x1F6E2: // đŸ›¤ī¸ + return ("a-u-G", "\(googleUUID)/Google/rail.png", "-16711936") + // đŸ›Ŗī¸ Motorway - Google info + case 0x1F6E3: // đŸ›Ŗī¸ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // â›Ŋ Fuel Pump - Google gas_stations + case 0x1F6FD: // â›Ŋ + return ("a-u-G", "\(googleUUID)/Google/gas_stations.png", "-16776961") + // 🚎 Trolleybus - Google bus + case 0x1F68E: // 🚎 + return ("a-u-G", "\(googleUUID)/Google/bus.png", "-16776961") + // 🚈 Metro - Google rail + case 0x1F688: // 🚈 + return ("a-u-G", "\(googleUUID)/Google/rail.png", "-16711936") + // 🚊 Tram - Google tram + case 0x1F68A: // 🚊 + return ("a-u-G", "\(googleUUID)/Google/tram.png", "-16776961") + // 🚉 Station - Google rail + case 0x1F689: // 🚉 + return ("a-u-G", "\(googleUUID)/Google/rail.png", "-16776961") + // 🛃 Custom - Google info + case 0x1F6C3: // 🛃 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🛂 Passport control - Google info + case 0x1F6C2: // 🛂 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🚮 Litter - Google info + case 0x1F6AE: // 🚮 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16711936") + // 🚰 Water - Google water + case 0x1F6B0: // 🚰 + return ("a-u-G", "\(googleUUID)/Google/water.png", "-16776961") + // 🚱 Non-potable - Google caution + case 0x1F6B1: // 🚱 + return ("a-u-G", "\(googleUUID)/Google/caution.png", "-16776961") + // â™ŋ Wheelchair - Google wheel_chair_accessible + case 0x267F: // â™ŋ + return ("a-u-G", "\(googleUUID)/Google/wheel_chair_accessible.png", "-16711936") + // đŸšģ Bathroom - Google info + case 0x1F6BB: // đŸšģ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16711936") + // 🚹 Men's - Google info + case 0x1F6B9: // 🚹 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸšē Women's - Google info + case 0x1F6BA: // đŸšē + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸšŧ Baby - Google info + case 0x1F6BC: // đŸšŧ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // 🚾 Loo - Google info + case 0x1F6BE: // 🚾 + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16776961") + // đŸ…ŋī¸ Parking - Google info + case 0x1F17F: // đŸ…ŋī¸ + return ("a-u-G", "\(googleUUID)/Google/info.png", "-16711936") // === Default - RED pushpin === default: - return ("a-u-G", "\(googleBase)/red-pushpin.png", "-16776961") + return ("a-u-G", "\(genericUUID)/Tacks/red-pushpin.png", "-16776961") } } } \ No newline at end of file